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

Posted

技术标签:

【中文标题】如何在 CoreMidi 曲目中播放特定频道?【英文标题】:How can I play a specific channel in a CoreMidi track? 【发布时间】:2015-09-25 04:08:50 【问题描述】:

我可以使用 MusicPlayer 的 MusicTrackSetProperty(t, kSequenceTrackProperty_MuteStatus...) 方法轻松地将 midi 音轨静音/取消静音。但是,我还没有思考如何启用/禁用轨道中的特定 MIDI 通道。轨道中的通道是否有静音/取消静音或禁用/启用属性?

这样的事情会在轨道级别完成,还是我应该以某种方式操纵 midi 合成器音频单元?

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

我将不得不走过滤路线,因为我们将每个通道发送到一个设备并听取结果,该设备预计每个轨道有 6 个通道。很高兴知道合并,但我一直想知道那里发生了什么。

以上是关于如何在 CoreMidi 曲目中播放特定频道?的主要内容,如果未能解决你的问题,请参考以下文章

使用 NAudio 在特定频道上播放声音

分析当前播放音乐曲目的波形数据

如何在 Spotify 中自动播放热门曲目?

Spotify App API:播放专辑中的特定曲目

如何阻止音乐曲目在 Libgdx 中循环播放

如何将曲目添加到 Spotify 中的“已加星标”播放列表?