使用 AudioKit 通过 iOS 内的虚拟端口发送 MIDI 音符
Sending MIDI notes through a virtual port within iOS using AudioKit
所以我觉得自己像个白痴,不得不在此处 post 进行可能是简单修复的操作。我正在编写一个 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 导入我的项目,我按照 "Alternative: include the AudioKit library from source" 部分下的 AudioKit Frameworks 中的说明进行操作。具体来说,这就是我所做的:
- 打开 Xcode
的新实例
- 使用此 link 从 GitHub 克隆:AudioKit
- 保存并关闭Xcode
- 打开我的项目
- 将 iOS.xcodeproj 的 AudioKit 拖到我的项目的子文件夹中
- 选择 project.xcodeproj 的基础后,我进入构建阶段并将 AudioKit(iOS 的 AudioKit)和 AudioKitUI(iOS 的 AudioKit)添加到目标依赖项节
- 仍然在我的项目基础内,我切换到“构建设置”选项卡并搜索 "Linker",这显示了 "Other Linker Flags" 设置。在那里我在那个设置中添加了“-lc++”(减去引号)
- 确保我的项目是选择使用我正在测试的适当设备构建的项目,然后单击“播放”按钮
我已经用物理 iPhone 8+、8+ 模拟器和 X 模拟器全部 运行ning iOS 12 和所有 return 进行了测试同样的错误。我已经通过 MIDI Studio 的网络部分将所有设备连接到 Logic Pro X 实例,并且音符播放得很好,所以我知道代码本身正在运行。我也试过重启我的电脑并硬重置物理设备。
我尝试将打开虚拟输出端口的函数调用保留为其默认值,将 Int32 设置为 1000、1000000 和 2000000,并将名称设置为 "Session 1" 和 "MyApp"。 None 也解决了这个问题。
我尝试按照此处的示例进行操作: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() 函数,但是输入和输出端口都收到了相同的错误。我没有单步执行此部分的代码,因为错误 returned 是相同的(一个用于输入,一个用于输出)。
此时我有点沮丧,完全卡住了。没有多少谷歌搜索让我更接近。任何人愿意提供的任何帮助都将不胜感激。如果您真的做到了这一点,感谢您的阅读:)
OSStatus
对象中返回的错误可能是 -10844 'kMIDINotPermitted'。当您尝试在 'capabilities' 中未启用音频背景模式的情况下调用 MIDISourceCreate
时,您会收到此消息。我将添加一个 PR 以使该错误消息在将来提供更多信息。
虽然没有关于creating/opening虚拟端口的确认消息,但如果您通过发送到其他应用程序来测试它,您应该会发现它正在工作。
所以我觉得自己像个白痴,不得不在此处 post 进行可能是简单修复的操作。我正在编写一个 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 导入我的项目,我按照 "Alternative: include the AudioKit library from source" 部分下的 AudioKit Frameworks 中的说明进行操作。具体来说,这就是我所做的:
- 打开 Xcode 的新实例
- 使用此 link 从 GitHub 克隆:AudioKit
- 保存并关闭Xcode
- 打开我的项目
- 将 iOS.xcodeproj 的 AudioKit 拖到我的项目的子文件夹中
- 选择 project.xcodeproj 的基础后,我进入构建阶段并将 AudioKit(iOS 的 AudioKit)和 AudioKitUI(iOS 的 AudioKit)添加到目标依赖项节
- 仍然在我的项目基础内,我切换到“构建设置”选项卡并搜索 "Linker",这显示了 "Other Linker Flags" 设置。在那里我在那个设置中添加了“-lc++”(减去引号)
- 确保我的项目是选择使用我正在测试的适当设备构建的项目,然后单击“播放”按钮
我已经用物理 iPhone 8+、8+ 模拟器和 X 模拟器全部 运行ning iOS 12 和所有 return 进行了测试同样的错误。我已经通过 MIDI Studio 的网络部分将所有设备连接到 Logic Pro X 实例,并且音符播放得很好,所以我知道代码本身正在运行。我也试过重启我的电脑并硬重置物理设备。
我尝试将打开虚拟输出端口的函数调用保留为其默认值,将 Int32 设置为 1000、1000000 和 2000000,并将名称设置为 "Session 1" 和 "MyApp"。 None 也解决了这个问题。
我尝试按照此处的示例进行操作: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() 函数,但是输入和输出端口都收到了相同的错误。我没有单步执行此部分的代码,因为错误 returned 是相同的(一个用于输入,一个用于输出)。
此时我有点沮丧,完全卡住了。没有多少谷歌搜索让我更接近。任何人愿意提供的任何帮助都将不胜感激。如果您真的做到了这一点,感谢您的阅读:)
OSStatus
对象中返回的错误可能是 -10844 'kMIDINotPermitted'。当您尝试在 'capabilities' 中未启用音频背景模式的情况下调用 MIDISourceCreate
时,您会收到此消息。我将添加一个 PR 以使该错误消息在将来提供更多信息。
虽然没有关于creating/opening虚拟端口的确认消息,但如果您通过发送到其他应用程序来测试它,您应该会发现它正在工作。