将 CoreMIDI 输入与 AVAudioUnit 一起使用

Posted

技术标签:

【中文标题】将 CoreMIDI 输入与 AVAudioUnit 一起使用【英文标题】:Using CoreMIDI input with AVAudioUnit 【发布时间】:2017-03-20 00:21:15 【问题描述】:

我正在尝试实现看起来应该很简单的事情:在 Mac 应用程序中收听 MIDI 消息,并使用这些消息从现有的 AVAudioUnit 乐器中播放音符。

假设:我需要在与我的 CoreMIDI 客户端关联的 MIDIReadBlock(通过带有 MIDIClientRef 的 MIDIInputPortCreateWithBlock)和我可以从我的 AVAudioUnit 的 AUAudioUnit(通过 scheduleMIDIEventBlock)获得的 AUScheduleMIDIEventBlock 之间编写一个桥梁。这似乎比它应该的要复杂,因为我会处理原始 MIDI 数据——我觉得音频单元必须支持某种易于与 CoreMIDI 一起使用的 MIDI 抽象,但我找不到任何相关示例这个的。也许有一种方法可以将MIDIOutputPortCreate 与 AV/AUAudioUnit 一起使用?

我正在寻找的是一个将 MIDI 输入直接传输到音频单元的工作示例(最好使用 Swift 3),但如果您知道任何相对最新的相关资源,请也分享这些链接。这些 API 的文档稀少令人沮丧。谢谢!

【问题讨论】:

【参考方案1】:

在您的 MIDIReadBlock 循环中接收到的数据包。根据每个数据包的 MIDI 状态,向您的 audioUnit 发送适当的设备事件(例如音符开启)。

例如

osstatus = MusicDeviceMIDIEvent(audioUnit, midiCmd...

【讨论】:

以上是关于将 CoreMIDI 输入与 AVAudioUnit 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

CoreMIDI 制造商预设

使用 Swift 和 CoreMIDI 发送和接收 MIDI

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

使用 Python C API 时 MIDIGetNumberOfDestinations 返回 0

iOS番外-搞点音乐玩玩

iOS番外-搞点音乐玩玩