前言
本人对乐器一窍不通,但是看到别人能够熟练地吹拉弹奏,总有一种羡慕之情。无奈只略懂一些简谱知识, 经过一番学习之后,发现了MIDI这个好东西,可以通过编程来播放自己喜欢的音乐。经过努力写一个编音乐小工具,只要识谱就可以操作,现在拿出来与大家分享一下,欢迎批评指正!文章末尾会附上源码地址,欢迎大家下载修改。
MIDI基础
基本的MIDI函数有3个:midiOutOpen 、MidiOutShortMsg、MidiOutClose,分别用来打开MIDI设备、操作MIDI设备和关闭MIDI设备。我们就是通过程序操作这三个API来实现播放音乐的。
midiOutShortMsg函数说明
主要操作是对调用midiOutShortMsg( HMIDIOUT hmo,DWORD dwMsg ) ,dwMsg是4字节无符号整数,分成4个部分,每个部分1个字节:
字节
作用
最高字节(第3字节)
基本不用
字节2 (第2字节)
音量0-0x7F或不用
字节1 (第1字节)
音阶0-0x7F或音色
最低字节(第0字节)
命令或状态、通道
第0字节16进制高位
命令或状态0x9/0xC、0xB
第0字节16进制低位
通道0-0xF
具体格式如下(16进制):
字节3
字节2
字节1
字节0
功能
00
–
音色值
CN
为通道N指定一个音色值,即选择一个乐器,乐器有128种
00
音量值
音阶值
9N
在通道N上,使用指定音量,演奏一个即定乐器的指定音阶
00
–
0x7B
BN
停止通道N上的演奏
举例说明
- 设置消息(CN):
midiOutShortMsg(hMidi,16<<8 | 0xC0) //设置通道0的乐器为 风琴
midiOutShortMsg(hMidi, 0<<8 | 0xC1) //设置通道1的乐器为 大钢琴 - 演奏消息(9N):
midiOutShortMsg(hMidi,0x7F<<16 | 60<<8| 0x9A) //在通道10上以最高音量(0x7F)弹一个中央C(音高60,音名c1)
midiOutShortMsg(hMidi,0x40<<16 | 72<<8| 0x93) //在通道3上以半高音量(0x40)弹一个高音do(音高72,音名c2) - 停止[演奏]消息(BN):
midiOutShortMsg(hMidi, 0x7BB7) //停止通道7上的演奏
midiOutShortMsg(hMidi, 0x7BB3) //停止通道3上的演奏
程序操作说明
1. 可以设置主旋律和伴奏部分的音调以及乐器音色,设置音乐每分钟的节拍数
2. 两个文本框的内容为音乐的编码,要自己手动输入。
3. ”31,4”中的31为中音duo,41为高音duo,21为低音duo,其它依次类推。
4. ”31,4”的4含义为中音duo播放一拍,也指一个全音符。计算方式为:音符节拍数*4
5. 点击“播放”,电脑就可以播放出美妙的音乐。试试吧!!!
6. 大家猜猜程序里自带的歌曲是什么,欢迎在评论区留言!
源码地址:https://gitee.com/JiuTianYinHe/MIDITools.git。
大家可以自行下载修改,有好的意见建议,欢迎留言!!!
每天一个小知识,每天进步一点点!!![加油][加油][加油]