您的位置:首页 - HT - 正文
Windows编程之C++播放MIDI
使用VS2019,建立C++空项目,添加源代码:
#include <windows.h>
#include <stdio.h>
int main(void)
{
unsigned long result;
HMIDIOUT handle;
result = midiOutOpen(&handle, 0, 0, 0, CALLBACK_NULL);
if (result)
{
printf("There is an error opening the default MIDI out device!/n");
}
/* Output the C note (ie, sound the note) */
midiOutShortMsg(handle, 0x00403C90);
Sleep(2000);
/* Output the E note */
midiOutShortMsg(handle, 0x00404090);
Sleep(2000);
/* Output the G note */
midiOutShortMsg(handle, 0x00404390);
Sleep(2000);
/* Here you should insert a delay so that you can hear the notes sounding */
/* Now let's turn off those 3 notes */

// You should know this bad way to turn off MIDI, maybe it's wrong, but you don't hear the sound. yes?
midiOutShortMsg(handle, 0x00003C90);
midiOutShortMsg(handle, 0x00004090);
midiOutShortMsg(handle, 0x00004390);
/* Close the MIDI device */
midiOutClose(handle);
return 0;

}


或许,你会为其中的一些16进制数字感到迷惑,那么你应该去了解一下MIDI API函数和MIDI规范。最后给出一个网址,也是网友的博文里引用到的:
//hovertree.com/h/bjag/csljeoj0.htm

如果出现报错:无法解析的外部符号 __imp__midiOutOpen

则需要 Visual Studio中添加库文件WINMM.LIB
如下:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\WinMM.Lib;

运行,可以听到3个音高不同的声音。

补充:
MIDI难吗,我觉得也挺难的。但是它符合我的要求,让你do(C)你就do。MIDI((Musical Instrument Digital Interface)的一些概念性知识,这里就不赘述了。MIDI功能强大,属于系统底层API。MIDI发声的方式是驱动声卡,它能演绎出很多的音色,如果你够强,自己写个交响曲我想也是可以的。下面列出我在网上找的播放MIDI音频的过程:

① 播放MIDI音频前应先查询系统是否具备播放MIDI音频的设备

② 读出RIFF格式的MIDI文件

③ 检查MIDI音频输出设备的性能

④ 打开MIDI输出设备

⑤ 打开音频输出设备,获得设备句柄后,生成MIDI音频信息头结构

⑥ 发送MIDI消息和发送记录为结构MIDIHDR的系统特有消息,即播放MIDI音频

⑦ 播放结束后清除已准备好的MIDI音频数据块结构MIDIHDR,释放分配的资源

⑧ 关闭MIDI音频输出设备

评论: