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

时间:2018-10-09 17:01:11

标签: ios swift xcode audiokit

所以我觉得自己很愚蠢,不得不在这里发布可能很简单的解决方案。我正在编写一个iOS应用程序,它将MIDI发送到另一个应用程序。对于我的第一个概念证明,我尝试在iPhone上向GarageBand发送注释。我正在尝试使用AudioKit完成此操作。

我创建的代码如下:

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 Frameworks中“替代:从源包括AudioKit库”部分中的说明。具体来说,这就是我所做的:

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

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

我尝试离开函数调用以将虚拟输出端口打开为其默认值,将Int32设置为1000、1000000和2000000,并将名称分别设置为“ Session 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,这似乎是类型,但是我没有看到其中的任何值。根据我的Google搜索,这是MIDISourceCreate的输出。一般来说,我也是Xcode的新手,所以我承认我可能在这里错过了一些事情。

我也尝试运行createVirtualPorts()函数,但是在输入和输出端口上都收到相同的错误。由于返回的错误是相同的(一个用于输入,一个用于输出),因此我没有一步一步地执行代码。

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

1 个答案:

答案 0 :(得分:1)

OSStatus对象中返回的错误很可能是-10844'kMIDINotPermitted'。当您尝试致电MIDISourceCreate而未在“功能”中启用音频背景模式时,会得到此信息。我将添加PR,以使该错误消息在将来更加有用。

尽管没有关于创建/打开虚拟端口的确认消息,但如果通过发送到其他应用程序对其进行测试,您应该会发现它正在运行。