CombineMIDI

Build

Swift 包,旨在轻松地将 MIDI 控制器连接到使用 Combine 和 async-await 的 SwiftUI (或 UIKit)。

此包是作为 UIKonf 2020 演讲 Combine:将 MIDI 信号连接到 SwiftUI 的一部分创建的。它的主要目标是从所有 MIDI 源读取消息,并能够在用户界面中呈现这些值。

有关更多指导、演示和历史记录,请参阅演讲材料

安装

将此包添加到您的 Xcode 项目或将以下行添加到您的 Package.swift 文件

.package(url: "https://github.com/mkj-is/CombineMIDI.git", from: "0.3.0")

功能

用法

首先,您需要创建一个 MIDI 客户端,每个应用程序创建一个客户端就足够了(您可以选择将客户端名称作为初始化程序参数传递)

let client = MIDIClient(name: "My app MIDI client")

Async-await

您可能首先要做的是过滤与您相关的消息并获取值。

let stream = client.stream
    .filter { $0.status == .controlChange }
    .compactMap(\.data2)

然后,您可以在一个简单的 for 循环中处理消息。循环将无限期运行,直到包含它的任务被取消。

for await message in stream {
    ...
}

Combine

当使用 Combine 时,您创建一个 publisher,它会自动连接到所有源并在订阅时监听所有消息。

在用户界面上订阅时,不要忘记在主线程上接收这些事件。为了防止过早分发,publisher 在 CoreMIDI 使用的线程上发出,因此您可以快速过滤所有消息。

cancellable = client
    .publisher()
    .filter { $0.status == .controlChange }
    .compactMap(\.data2)
    .receive(on: RunLoop.main)
    .sink { value in
        ...
    }

下一步

这个库刻意做得小巧,并且有很大的改进潜力

贡献

欢迎所有贡献。

项目由 Matěj Kašpar Jirásek 创建。

项目根据 MIT 许可证获得许可。