Show HN:适用于 Windows 的完美 Bluetooth MIDI
Source: Hacker News
概述
Hi HN,我是 Erwin。我开发了一个小型免费开源工具,用于将 Bluetooth LE MIDI 键盘桥接到全新的 Windows MIDI Services(WMS)堆栈,使任何 DAW 或 Web MIDI 应用都能像使用有线键盘一样使用它们。
问题描述
我购买了 Roland FP‑90X 钢琴,部分原因是它支持 Bluetooth MIDI。在我的 Windows 11 电脑上,配对成功,但我的 DAW 看不到键盘,且从电脑发送的音符根本没有让钢琴发声。经过多个晚上的调试,我发现了三个相互叠加的独立 bug。
- Windows BLE‑MIDI 暴露 – Windows 只通过 WinRT API 原生暴露 BLE‑MIDI,而几乎没有 DAW 会轮询该 API。因此即使配对成功,MIDI 应用仍看不到设备。
- 方向 2(PC → 钢琴)失败 – Note‑On 写入被 ATT‑ACK,但钢琴仍保持沉默。字节已经到达钢琴,但在 GATT 层之上的某处被丢弃。
- MIDI 通道不匹配 – FP‑90X 有一个面板设置叫 Transmit Channel(默认 1),但实际接收的是通道 4,且无法更改。发送到通道 1 的音符在 GATT 层被 ACK,但随后被合成引擎静默丢弃。
解决方案
全新的 Windows MIDI Services(WMS)堆栈提供了 loopback endpoints:写入一个端点的内容会出现在另一个端点上,任何 WinMM/WinRT/WMS 应用都将其视为普通 MIDI 端口。该工具的工作原理如下:
- BLE‑MIDI 输入 – 使用 WinRT API 接收 BLE‑MIDI 数据。
- WMS loopback 输出 – 将接收到的数据发送到 WMS loopback 端点,使其对所有 MIDI 应用可见。这解决了钢琴 → PC 的方向。
对于 PC → 钢琴的方向,在排除配对、加密、写入模式和专有特征后,剩下的问题是 MIDI 通道。我添加了一个 Detect 按钮,播放一系列在每个通道(1‑16)上递增的测试音符。用户数出实际听到的音符数量;该计数决定该键盘的接收通道。检测到的通道会按 BLE MAC 地址保存(≈ 75 秒检测,针对每台钢琴执行一次)。
技术细节
- 语言 / 运行时:.NET 10
- UI:Avalonia(UI 层可移植;BLE/MIDI 部分仅限 Windows)
- MIDI API:
Microsoft.Windows.Devices.Midi2包用于 WMS,Windows.Devices.Midi(WinRT)直接用于 BLE(而不是 Korg 旧的 WinMM 驱动) - 许可证:MIT
- 发行方式:单个自包含约 21 MB 可执行文件,无安装程序,无遥测,无需账号
链接
- 项目站点(含截图):
- 源代码:
- 长篇技术写作(完整调试过程):
- 来自 Microsoft Windows MIDI Services 团队的 Reddit 评论:
- 评论线程:
本人仅在我的 FP‑90X 上进行过测试。BLE 端是通用的,其他键盘(WIDI Master、CME、Yamaha MD‑BT01、Korg microKey Air、ROLI Seaboard 等)应该也能工作,但我尚未逐一确认。欢迎提交设备测试报告、问题以及 PR。