播放(不录制/导出)多个MIDI曲目

时间:2016-03-02 14:09:22

标签: c# midi naudio

我想和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);
}

当然这很好用,但如果我想让CE由不同的乐器演奏,我就不走运了。我只有一台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);

但是在这一点上我无法弄清楚如何实际播放曲目,而不是将其导出。

1 个答案:

答案 0 :(得分:1)

如果你想同时播放两个不同的音色,这就是MIDI通道的用途。

如果您正在使用GM方案,则可以使用16个频道,其中频道10保留用于打击乐。

在您的第一个代码段中,您似乎只使用 MIDI通道1.

如何使用多个频道并为每个频道加载不同的补丁?