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

How can I play a specific channel in a CoreMidi track?

我可以使用 MusicPlayer 的 MusicTrackSetProperty(t, kSequenceTrackProperty_MuteStatus...) 方法轻松 mute/unmute midi 音轨。但是,我还没有想好如何 enable/disable 轨道内的特定 MIDI 通道。曲目中的频道是否有 mute/unmute 或 disable/enable 属性?

是否可以在音轨级别完成类似的操作,或者我应该以某种方式操纵 midi 合成器音频单元?

创建端点对我没有好处,因为我只得到发送到合成器的事件副本,而不是我可以看到的用于过滤合成器内容的回调。所以,我想音频单元图中可能有一些可以调整的东西,但具体是什么?

有人可能会建议打开带有 kMusicSequenceLoadSMF_ChannelsToTracks 标志的 midi 文件,然后简单地取消与通道对应的轨道静音并将其余轨道静音。我试过这样做,但实际上在没有 kMusicSequenceLoadSMF_ChannelsToTracks 标志的情况下打开 midi 文件时我得到 /less/ tracks。奇怪的。也许我应该明白为什么会这样,是吧?这是我的 MIDI 文件:16 条轨道,每条轨道包含 6 个 MIDI 通道。没有 kMusicSequenceLoadSMF_ChannelsToTracks,我得到 16 条轨道,带有 kMusicSequenceLoadSMF_ChannelsToTracks 标志,12。它不应该是 16*6 轨道吗?

感谢您的帮助。最好的给你。 /周杰伦

你走在正确的轨道上。据我所知,kMusicSequenceLoadSMF_ChannelsToTracks 将合并公共渠道。因此,如果给定两个音轨,每个音轨包含来自三个通道的音符,假设音轨 1 在通道 1、2 和 3 上有音符。而音轨 2 在通道 3、4 和 5 上有音符。然后使用 kMusicSequenceLoadSMF_ChannelsToTracks 标志将合并使用通道 3 从音轨 1 和音轨 2 到新音轨的音符。使用该方法,轨道总数将为 5。这可能是要走的路,除非你能证明不是这样。否则,如果你真的需要把事情分开,端点是一种有效的方法。您只需要手动发送 MIDI 事件而不是建立连接(将轨道指向合成器)。在您的回调中,您应该解析 midi 并调用 MusicDeviceMIDIEvent 以直接触发合成器。您可以在那里进行过滤。