【发布时间】:2016-03-02 14:09:21
【问题描述】:
我想用 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);
但此时我无法弄清楚如何实际播放曲目,而不是导出它。
【问题讨论】: