播放(不是录制/导出)多个 MIDI 轨道
Posted
技术标签:
【中文标题】播放(不是录制/导出)多个 MIDI 轨道【英文标题】:Playing (not recording/exporting) multiple MIDI tracks 【发布时间】: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);
但此时我无法弄清楚如何实际播放曲目,而不是导出它。
【问题讨论】:
【参考方案1】:如果您想同时播放两个不同的 Patch,这就是 MIDI 通道的用途。
有 16 个通道可供您使用,如果您使用 GM 方案,则其中 10 个通道保留用于打击乐。
在您的第一个代码 sn-p 中,您似乎正在使用 MIDI 通道 1。
如何使用多个通道并为每个通道加载不同的补丁?
【讨论】:
谢谢,这当然很有意义。我将一有机会就尝试一下。以上是关于播放(不是录制/导出)多个 MIDI 轨道的主要内容,如果未能解决你的问题,请参考以下文章