C# / nAudio - 向控制器发送 MIDI 消息

Posted

技术标签:

【中文标题】C# / nAudio - 向控制器发送 MIDI 消息【英文标题】:C# / nAudio - Sending a MIDI message to controller 【发布时间】:2016-03-05 07:16:13 【问题描述】:

我正在构建自己的自定义 midi 映射应用程序,到目前为止一切顺利。我一直在使用 nAudio 来接收 MIDI 消息,它的工作原理非常棒。

但是当我想寄回一些东西时,我遇到了一些麻烦。要在我的控制器上启用灯,我必须发送一条 Note On 消息:例如 90 kk 01,其中 kk 等于相应的键。 (见下图)

但是,它不起作用。我根本没有收到任何错误消息,但也没有任何东西亮起。

我发送的示例:

midiOut = new MidiOut(MIDIInDevice);
 midiOut.Send(MidiMessage.StartNote(56, 1, 0).RawData);

56 是音符,1 是音量,0 是通道。

知道我做错了什么吗?

【问题讨论】:

MIDIInDevice 是输出设备吗? 是的,它与我从中获取输入的设备相同 你说 kk 是按钮编号。那么90 kk 7F是什么意思呢?这条消息是从哪里生成的? 【参考方案1】:

您发布的页面上说灯光是由 Note On 消息控制的。我不熟悉 C# 库,但我猜 StopNote 会发送一条 Note Off 消息。尝试使用发送 Note On 消息的等效项。 (也许是StartNote?)

【讨论】:

监督我简化代码。我已经尝试过 StartNote,但不幸的是无济于事。感谢您指出这一点,我会进行编辑 在这种情况下,您的消息看起来是正确的。接下来我要做的是检查以确保设备正在接收您认为您正在发送的内容。在 OS X 上,我会使用 MIDIMonitor 查看来自我的程序的 MIDI 命令。希望 Windows 也有类似的东西。 只记得我在 21 世纪初使用过MIDI-OX。看起来它自 Vista 以来没有更新,但它可能仍然有效。 知道了,显然 midiOut = new MidiOut(MIDIInDevice);应该是 midiOut = new MidiOut(MIDIInDevice+1); ,现在可以完美运行了【参考方案2】:

选择正确的频道并尝试发送NoteOn事件。

var noteOnEvent = new NoteOnEvent(0L, channel, note, 127, 200);
midi.Send(noteOnEvent.GetAsShortMessage());
midi.Send(noteOnEvent.OffEvent.GetAsShortMessage());

【讨论】:

以上是关于C# / nAudio - 向控制器发送 MIDI 消息的主要内容,如果未能解决你的问题,请参考以下文章

使用 NAudio 在 MIDI 文件中设置 MIDI 速度

使用 NAudio 演奏和弦的最佳方式

NAudio 和 Midi 文件读取

naudio Midi 输入 - 将 e.MidiEvent 过滤为仅 data2 参数?

NAudio 与 MultiplexingSampleProvider 和 WasapiOut

在 C# 中将 MIDI 消息发送到 DAW