功能
功能是一个用于发送和接收MIDI消息到/从虚拟和实际设备的简单库。
功能旨在为Apple的CoreMIDI库提供一个相对透明的Swift接口。
该库由两层组成
/Sources/Core
目录下的文件是围绕CoreMIDI的C APIs的直接、无意见的包装。- 除
/Sources/Core
目录外的文件稍微有些意见,但允许您以最小的设置完成常见任务。
具体来说:有一个全局的MIDI
单例
- 创建一个
MIDIClient
并订阅MIDINotice
事件(例如,MIDI设备的连接和断开)。 - 创建一个
MIDIInput
,将其连接到所有可用的MIDISource
实例并订阅MIDIPacket
事件(例如,MIDI音符或控制更改消息)。 - 创建一个
MIDIOutput
,您可以使用它向设备发送MIDIPackets
。 - 实现观察者模式,以便实现
MIDIObserver
协议的类可以接收MIDINotice
和MIDIPacket
消息。 - 将可能抛出
throw
的任何 CoreMIDI 包装器调用包裹在try ~ catch
块中,并打印抛出的任何异常。
如果您喜欢自己编写这类东西,CoreMIDI包装器可以独立于有意见的代码安装。
提供了一个示例项目,以帮助您入门。
安装
整个库
pod 'Gong', '~> 1.2'
仅CoreMIDI包装器
pod 'Gong/Core', '~> 1.2'
仅CoreMIDI包装器,以及MIDINote
事件
pod 'Gong/Events', '~> 1.2'
虚拟 MIDI 总线
Goong 的一项核心用途是将 MIDI 消息发送到 DAW 软件,如 Ableton Live。
这需要设置一个虚拟 MIDI 总线。Ableton 软件有其教程,讲解如何操作。
核心库架构
类层次结构
MIDIObject <----+--+ MIDIClient
|
+--+ MIDIPort <------+--+ MIDIInput
MIDINotice | |
| +--+ MIDIOutput
MIDIPacket +--+ MIDIDevice
|
+--+ MIDIEntity
MIDIError |
+--+ MIDIEndpoint <--+--+ MIDISource
|
+--+ MIDIDestination
数据流
MIDIClient MIDIDevice
creates owns
+ +
| v
| MIDIEntity
| owns
| +
v receives packets from v
MIDIInput <------------------------------+ MIDISource
and sends packets to and
MIDIOutput +---------------------------> MIDIDestination
常见任务
启动 MIDI 客户端
MIDI.connect()
停止 MIDI 客户端
MIDI.disconnect()
列出设备
for device in MIDIDevice.all {
print(device.name)
}
发送 MIDI 事件
guard let device = MIDIDevice(named: "minilogue"), let output = MIDI.output else {
return
}
let note = MIDINote(pitch: c5)
device.send(note, via: output)
接收 MIDI 数据包
class ViewController: NSViewController {
override func viewWillAppear() {
super.viewWillAppear()
MIDI.addObserver(self)
}
override func viewDidDisappear() {
super.viewDidDisappear()
MIDI.removeObserver(self)
}
}
extension ViewController: MIDIObserver {
func receive(_ notice: MIDINotice) {
print(notice)
}
func receive(_ packet: MIDIPacket, from source: MIDISource) {
switch packet.message {
case .noteOn, .noteOff, .controlChange, .pitchBendChange:
print(packet.message, source)
default:
break
}
}
}