【问题标题】:Sending MIDI notes through a virtual port within iOS using AudioKit使用 AudioKit 通过 iOS 中的虚拟端口发送 MIDI 音符
【发布时间】:2019-03-14 12:36:43
【问题描述】:

所以我觉得自己像个白痴,不得不在这里发布可能是一个简单的解决方案。我正在编写一个将 MIDI 发送到另一个应用程序的 iOS 应用程序。对于我的第一个概念证明,我试图在我的 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:Error Creating Virtual Output Port: MIDI Client -- 0

要将 AudioKit 导入我的项目,我按照“替代方案:从源代码包含 AudioKit 库”部分下的 AudioKit Frameworks 中的说明进行操作。具体来说,这就是我所做的:

  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. 确保我的项目是选择使用我正在测试的适当设备构建的项目,然后单击“播放”按钮

我已经使用我的物理 iPhone 8+、8+ 模拟器和 X 模拟器进行了测试,它们都运行 iOS 12,并且都返回相同的错误。我已经通过 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,这似乎是类型,但我没有看到其中的任何值。根据我的谷歌搜索,这是 MIDISourceCreate 的输出。总的来说,我也是 Xcode 的新手,所以我承认我可能在这里遗漏了一些东西。

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

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

【问题讨论】:

  • 我有一个使用 virtualOutputs 的旧项目,在阅读完这篇文章后,我将我的 AudioKit pod 更新为 4.4,虽然我没有收到您的错误消息,但我不再收到虚拟输出任何一个。这可能是最近出现的错误。
  • 非常感谢。我在错误跟踪器上没有看到任何内容,但我会在那里发布,看看他们怎么说。
  • 我的错误 - 实际上是在创建 virtualOutput(只是没有像以前一起创建 virtualInput 和 virtualOutput 时那样添加destinationNames)

标签: ios swift xcode audiokit


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    相关资源
    最近更新 更多