我买了一个MIDI键盘作为生日礼物。我发现了一个程序(midipiano),它可以从midi输入中获取信号并将其转换为音乐,但我更愿意自己编写一个程序。
在哪里可以找到执行此任务的文档?midi协议有很好的文档记录,但是没有midi端口。
我检查了codeproject中的两个项目(project midi和c midi工具包),但是花了很多时间都没有接近我的目标。
引用一个项目是可以的,但是请只引用c。

最佳答案

您需要包装http://msdn.microsoft.com/en-us/library/dd757277(VS.85).aspx
如果您只是使用短消息,这并不太困难,如果您想执行sysex或输出流,事情会变得复杂一些。
基本输入端口只需要获取有效的输入id(inputcount-1)、传递有效的id以打开、启动输入、通过委托接收消息……停止输入,然后最后关闭它。这是一个非常粗略的例子,说明如何实现这一点-您需要做一些检查,并注意在端口关闭和已关闭的回调发生之前,端口没有被收集,否则您将冻结您的系统!
祝你好运!
命名空间MIDI
{
公共类输入端口
{
私有nativemethods.midiinproc midiinproc;
专用intptr句柄;
公共输入端口()
{
midiinproc=新的nativemethods.midiinproc(midiproc);
句柄=intptr.zero;
}
公共静态int inputcount
{
获取{return nativemethods.midiingetnumdevs();}
}
公共布尔关闭()
{
bool result=nativemethods.midiinclose(句柄)
==nativemethods.mmsyerr\u无错误;
句柄=intptr.zero;
返回结果;
}
公共布尔打开(int id)
{
返回nativemethods.midinopen(
失控,
身份证件,
中音程序,
内部零位,
nativemethods.callback_函数)
==nativemethods.mmsyerr\u无错误;
}
公共bool start()
{
返回nativemethods.midiinstart(句柄)
==nativemethods.mmsyerr\u无错误;
}
公共布尔停止()
{
返回nativemethods.midinstop(句柄)
==nativemethods.mmsyerr\u无错误;
}
私有void midiproc(intptr hmidini,
内景WMSG,
在下降过程中,
整数dwparam1,
整数dwparam2)
{
//在此处接收消息
}
}
内部静态类NativeMethods
{
内部常量mmsyerr_noerror=0;
内部const int回调函数=0x00030000;
内部委托void midinproc(
在Hmidiin内,
内景WMSG,
在下降过程中,
整数dwparam1,
整数dwparam2);
[dllimport(“winmm.dll”)]
内部静态外部int midiingetnumdevs();
[dllimport(“winmm.dll”)]
内部静态外部int midiinclose(
intptr-hmidiin);
[dllimport(“winmm.dll”)]
内部静态外部接口(
在lphmidini内,
在udeviceid内,
midinproc dwcallback,
intptr dwcallbackinstance,
内部dwflags);
[dllimport(“winmm.dll”)]
内部静态外部int midiinstart(
intptr-hmidiin);
[dllimport(“winmm.dll”)]
内部静态外部int midinstop(
intptr-hmidiin);
}
}

10-01 19:13