使用 AudioKit 通过 iOS 中的虚拟端口发送 MIDI 音符



所以我觉得自己像个白痴,不得不在这里发帖,这可能是一个简单的修复。我正在编写一个 iOS 应用程序,该应用程序将 MIDI 发送到另一个应用程序。对于我的第一个概念验证,我正在尝试向iPhone上的GarageBand发送便笺。我正在尝试使用音频套件来完成此操作。

我创建的代码如下:

import UIKit
import AudioKit
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
let midi = AudioKit.midi
...
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
midi.createVirtualOutputPort()
midi.openOutput()
}
...
func SomeFunc()
{
midi.sendNoteOnMessage(noteNumber: UInt8(note + (octave * 12)), velocity: 90, channel: 0)
usleep(UInt32(delay * second))
midi.sendNoteOffMessage(noteNumber: UInt8(note + (octave * 12)), velocity: 0, channel: 0)
}
}

这是我收到的错误:

AKMIDI.swift:init((:63:初始化 MIDI AKMIDI.swift:createVirtualOutputPort(_:name:(:129:创建虚拟输出端口时出错:MIDI 客户端 -- 0

为了将 AudioKit 导入到我的项目中,我按照 AudioKit 框架中的"替代方法:从源代码包含 AudioKit 库"部分下的说明进行操作。具体来说,这就是我所做的:

  1. 打开 Xcode 的新实例
  2. 使用此链接从 GitHub 克隆:AudioKit
  3. 保存并关闭 Xcode
  4. 打开我的项目
  5. 将适用于 iOS.xcodeproj 的音频套件拖到我的项目的子文件夹中
  6. 选择项目的基础.xcodeproj后,我进入构建阶段,并将AudioKit(iOS版AudioKit(和AudioKitUI(iOS版AudioKit(添加到"目标依赖项"部分
  7. 仍然在我的项目基础中,我切换到"构建设置"选项卡并搜索"链接器",它显示了"其他链接器标志"设置。在那里,我在该设置中添加了"-lc++"(减去引号(
  8. 确保我的项目是选择使用我正在测试的适当设备构建的项目,然后单击"播放"按钮

我已经用我的物理iPhone 8 +,8 +模拟器和X模拟器都运行iOS 12对此进行了测试,并且都返回了相同的错误。我已经通过 MIDI Studio 的网络部分将所有设备连接到 Logic Pro X 的实例,并且音符播放得很好,所以我知道代码本身正在工作。我还尝试重新启动计算机并硬重置物理设备。

我尝试将函数调用保留为默认值以打开虚拟输出端口,将 Int32 设置为 1000、1000000 和 2000000,并将名称设置为"会话 1"和"MyApp"。这些都不能解决问题。

我尝试按照这里的例子:MIDISequencer 但它没有帮助。我添加(并执行(的代码部分如下:

func enableBackgroundMIDIPlaying() {
AudioKit.output = AKWhiteNoise()
AudioKit.start()
try? AKSettings.setSession(
category: .playback,
with: .mixWithOthers)
}

这确实通过我的物理设备播放了白噪声,但完全不影响 midi 音符。

当单步执行代码以查找错误发生的位置时,代码一直很好,直到它到达 AKMIDI.swift 文件的第 125 行,该文件位于 createVirtualOutputPort 函数中。该行代码是:

let result = MIDISourceCreate(client, virtualPortname as CFString, &virtualOutput)

从这里开始,它进入了我根本不认识的代码(我是iOS开发的新手,但不是一般的编程(。一旦退出该函数,它就会与 noErr 进行比较并失败。结果变量显示为 OSStatus,它似乎是类型,但我在其中没有看到任何值。根据我的谷歌搜索,这是MIDISourceCreate的输出。总的来说,我也是Xcode的新手,所以我承认我可能在这里错过了一些东西。

我还尝试运行 createVirtualPorts(( 函数,但输入和输出端口都收到相同的错误。我没有逐步完成本节的代码,因为返回的错误是相同的(一个用于输入,一个用于输出(。

在这一点上,我有点沮丧,完全陷入困境。再多的谷歌搜索也没有让我更接近。任何人愿意提供的任何帮助将不胜感激。如果你真的做到了这一步,谢谢你的阅读:)

OSStatus对象中返回的错误可能是 -10844 'kMIDINotAllowedted'。当您尝试在"功能"中未启用音频背景模式的情况下调用MIDISourceCreate时,您将获得此信息。 我将添加一个 PR,以使该错误消息在将来更具信息性。

虽然没有关于创建/打开虚拟端口的确认消息,但如果您通过发送到其他应用程序来测试它,您应该会发现它正在工作。

最新更新