所以我觉得自己很愚蠢,不得不在这里发布可能很简单的解决方案。我正在编写一个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库”部分中的说明。具体来说,这就是我所做的:
我已经在运行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()函数,但是在输入和输出端口上都收到相同的错误。由于返回的错误是相同的(一个用于输入,一个用于输出),因此我没有一步一步地执行代码。
在这一点上,我有点沮丧,完全陷入困境。没有什么可以让我更接近谷歌搜索了。任何人愿意提供的任何帮助将不胜感激。如果您真的走到了这一步,谢谢您的阅读:)
答案 0 :(得分:1)
OSStatus
对象中返回的错误很可能是-10844'kMIDINotPermitted'。当您尝试致电MIDISourceCreate
而未在“功能”中启用音频背景模式时,会得到此信息。我将添加PR,以使该错误消息在将来更加有用。
尽管没有关于创建/打开虚拟端口的确认消息,但如果通过发送到其他应用程序对其进行测试,您应该会发现它正在运行。