文章目录
前言
新冠疫情期间没事儿,玩起了音乐和电脑。因为正在利用老旧电子琴学弹 “我爱你中国” (简谱的眼睛),手上较为完整的曲谱却是五线谱,无奈!把它翻译成简谱。本来想通过电脑帮我把输入的五线谱转换成指定大调的简谱(转成不同调的简谱,这do re me 就不一样了,手工转换很烧脑的),这不需要MIDI的。可是,后来想让电脑在每转换好一个音后立刻把音发出来,然后就有了下面的文章。
一、Windows系统的 win32 API MIDI函数
在Windows系统中要演奏MIDI音乐,可以通过API函数进行。我们要做的只是调用它们,并通过它们发送MIDI消息给Windows,其余的事都由Windows在后台完成。为了要调用API函数,首先要做的就是获取这些MIDI函数,并了解它们的参数要求及其返回值。基本的MIDI函数有3个:midiOutOpen 、MidiOutShortMsg、MidiOutClose,分别用来打开MIDI设备、操作MIDI设备和关闭MIDI设备。
1、win32 API MIDI函数的获取
Windows的MIDI函数在系统动态链接库winmm.dll中。在Borland C++ builder环境中代码如下:
注:下面的代码结合了多位作者的代码示例才启发了我,并且在时间上也持续了2-3天,特别是函数的转换上。所以这里无法给出具体作者,如有作者向我指出,我会加上其引用。
//在获取函数地址前,先说明其在相应开发环境中的函数原型
int __stdcall (*MidiOutOpen)(int &hMidiOut, int uDeviceID,int dwCallBack,int dwInstance,int dwFlags);
int __stdcall (*MidiOutClose)(int hMidiOut );
int __stdcall (*MidiOutShortMsg)(int hMidiOut, int dwMsg);
HINSTANCE h=NULL;
int MidiOut=0;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
h=::LoadLibrary("winmm.dll"); //载入动态链接库,LoadLibrary函数会自动定位其所在目录
if(NULL != h)
{
MidiOutOpen= (int __stdcall (*)(int &, int,int,int,int)) GetProcAddress(h,"midiOutOpen");