功能 1.2.1

功能 1.2.1

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布最新发布2020年10月
SPM支持 SPM

Daniel Clelland 维护。



功能 1.2.1

  • 作者
  • Daniel Clelland

功能

功能是一个用于发送和接收MIDI消息到/从虚拟和实际设备的简单库。

功能旨在为Apple的CoreMIDI库提供一个相对透明的Swift接口。

该库由两层组成

  • /Sources/Core 目录下的文件是围绕CoreMIDI的C APIs的直接、无意见的包装。
  • /Sources/Core 目录外的文件稍微有些意见,但允许您以最小的设置完成常见任务。

具体来说:有一个全局的MIDI单例

  • 创建一个 MIDIClient 并订阅 MIDINotice 事件(例如,MIDI设备的连接和断开)。
  • 创建一个 MIDIInput,将其连接到所有可用的 MIDISource 实例并订阅 MIDIPacket 事件(例如,MIDI音符或控制更改消息)。
  • 创建一个 MIDIOutput,您可以使用它向设备发送 MIDIPackets
  • 实现观察者模式,以便实现 MIDIObserver 协议的类可以接收 MIDINoticeMIDIPacket 消息。
  • 将可能抛出 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
        }
    }
    
}