我想和NAudio一起播放多个MIDI乐器。我已经找到了如何播放单个MIDI乐器的说明,并且我找到了如何将单个MidiEventCollection
中的多个音轨导出到文件的说明。但是,我似乎无法将这些想法放在一起。
这是一些愚蠢的示例代码,我循环使用我的所有MIDI乐器,为每个乐器演奏一个重要的第三和谐:
var midiOut = new MidiOut(0);
for (var i = 0; i <= 127; i++)
{
midiOut.Send(MidiMessage.ChangePatch(i, 1).RawData);
midiOut.Send(MidiMessage.StartNote(60, 127, 1).RawData);
midiOut.Send(MidiMessage.StartNote(64, 127, 1).RawData);
Thread.Sleep(500);
}
当然这很好用,但如果我想让C
和E
由不同的乐器演奏,我就不走运了。我只有一台MIDI设备,我一次只能连接一台,MidiOut
似乎不支持添加多首曲目。
另一方面,MidiEventController
代码看起来或多或少是我想要的,但我只看到将其导出到文件的示例,而不是实际播放事件。我把这样的东西放在一起:
var events = new MidiEventCollection(1, 120);
var track = events.AddTrack();
var setInstrument = new PatchChangeEvent(0, 1, 66);
var play = new NoteOnEvent(0, 1, 60, 127, 1000);
track.Add(setInstrument);
track.Add(play);
但是在这一点上我无法弄清楚如何实际播放曲目,而不是将其导出。
答案 0 :(得分:1)
如果你想同时播放两个不同的音色,这就是MIDI通道的用途。
如果您正在使用GM方案,则可以使用16个频道,其中频道10保留用于打击乐。
在您的第一个代码段中,您似乎只使用 MIDI通道1.
如何使用多个频道并为每个频道加载不同的补丁?