播放(不是录制/导出)多个 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);

这当然可以,但如果我想让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】:

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

有 16 个通道可供您使用,如果您使用 GM 方案,则其中 10 个通道保留用于打击乐。

在您的第一个代码 sn-p 中,您似乎正在使用 MIDI 通道 1。

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

【讨论】:

谢谢,这当然很有意义。我将一有机会就尝试一下。

以上是关于播放(不是录制/导出)多个 MIDI 轨道的主要内容,如果未能解决你的问题,请参考以下文章

读取 MIDI 文件

如何在 CoreMidi 曲目中播放特定频道?

Soundfonts 播放 MIDI 文件没有衰减

从 MIDI 键盘录制音频文件并使用 android studio 存储

多个midi节目同时播放?

如何在音轨中的特定点触发事件或回调?