当前位置: 首页 > 编程语言 > C#

在C#中从MIDI端口获取信号

时间:2023-04-10 10:47:40 C#

在C#中从MIDI端口获取信号我找到了一个程序(MidiPiano),它从MIDI输入获取信号并将其转换为音乐,但我更愿意自己编写一个。在哪里可以找到执行此类任务的文档?MIDI协议有据可查,但MIDI端口却没有。我检查了CodeProject的两个项目(ProjectMIDI和C#MIDIToolkit),但花了很多时间并没有接近我的目标。对该项目的引用会很好,但请只使用C#。您需要包括http://msdn.microsoft.com/en-us/library/dd757277(VS.85).aspx中列出的所有必需功能。如果你只是使用短消息,这并不太难,如果你想做SysEx或输出流,事情会变得有点复杂。基本输入端口所需要做的就是获取有效输入ID(InputCount-1),将有效ID传递给Open,启动输入,通过委托接收消息...停止输入并最终关闭它。这是一个如何执行此操作的非常粗略的示例-您需要进行一些检查并注意在关闭之前不收集端口并且关闭回调,否则您将冻结系统!祝你好运!命名空间MIDI{publicclassInputPort{privateNativeMethods.MidiInProcmidiInProc;私有IntPtr句柄;publicInputPort(){midiInProc=newNativeMethods.MidiInProc(MidiProc);handle=IntPtr.Zero;}publicstaticintInputCount{get{返回NativeMethods。midiInGetNumDevs();}}publicboolclose(){boolresult=NativeMethods.midiInClose(handle)==NativeMethods.MMSYSERR_NOERROR;handle=IntPtr.Zero;返回结果;}publicboolOpen(intid){returnNativeMethods.midiInOpen(Shot,ID,midiInProc,IntPtr.Zero,NativeMethods.CALLBACK_FUNCTION)==NativeMethods.MMSY}publicboolStart(){returnNativeMethods.midiInStart(handle)==NativeMethods.MMSYSERR_NOERROR;}publicboolStop(){returnNativeMethods.midiInStop(handle)==NativeMethods.MMSYSERR_NOERROR;}privatevoidMidihProcintwMsg,IntPtrdwInstance,intdwParam1,intdwParam2){//在这里接收消息}}internalstaticclassNativeMethods{internalconstintMMSYSERR_NOERROR=0;内部常量intCALLBACK_FUNCTION=0x00030000;内部委托voidMidiInProc(IntPtrwMdiIng,,IntPtrdwInstance,intdwParam1,intdwParam2);[DllImport("WINMM.DLL")]innerstaticouterintmidiInGetNumDevs();[DllImport("WINMM.DLL")]内部静态外部intmidiInClose(IntPtrhMidiIn);[DllImport("WINMM.DLL")]internalstaticexternalintmidiInOpen(outIntPtrlphMidiIn,intuDeviceID,MidiInProcdwCallback,IntPtrdwCallbackInstance,intdwFlags);[DllImport("WINMM.DLL")]internalstaticexternintmidiInStart(IntPtrhMidiIn);[DllImport("WINMM.DLL")]内部静态外部intmidiInStop(IntPtrhMidiIn);我正在开发c#midi通信系统Sanford的miditools包很好,但是Leslie的实现有很多改进,使代码的可读性降低。我的代码尽可能简单。如果你愿意,你可以加入我。几天后,我发布了一个完全可用的midi监听器。看看http://puremidi.codeplex.com/我也找不到太多,但就像Josh说的那样,Carl确实做了很多MIDI工作,所以也许给他发电子邮件......他甚至可以回复,但他通常一个VB.Net人,所以除非有人将他的东西移植到C#?对于其他一些看起来很有前途的参考如果您正在寻找纯C#解决方案...请查看Alvas.Audio。它看起来确实有点高端,但你也许能帮上忙。也许projectmidi使用C#MidiToolkit从键盘(连接到声卡的midi输入端口)接收midi信息。要创建音频(音乐或音调),您需要生成连续的数字音频数据流。您可以使用C#SynthToolkit(与midi工具包的作者相同)开始编写您自己的合成器。但您也可以下载免费(开源)音序器程序(例如Audacious)并使用VST乐器插件为您完成这项工作。网上有许多免费插件。我以一种迂回的方式解决了这个问题,方法是编写一个Python脚本,以便在MIDI键盘上每次出现音符开/关时传输一个UDP数据包。使用C#/.NET在Unity3D中通过TCP/IP/UDP接收MIDI,以便包装特定于平台的MIDI内容,我可以编写与平台无关的C#代码来获取UDP数据包。以上就是C#学习教程:C#中从MIDI端口获取信号分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: