Show HN: Perfect Bluetooth MIDI for Windows
Source: Hacker News
Overview
Hi HN, I’m Erwin. I built a small free open‑source utility that bridges Bluetooth LE MIDI keyboards into the new Windows MIDI Services stack so any DAW or Web MIDI app can use them as if they were wired.
Problem Description
I bought a Roland FP‑90X piano partly because it had Bluetooth MIDI. On my Windows 11 PC, pairing succeeded, but my DAW couldn’t see the keyboard, and notes I sent from the PC never made the piano sing. After a number of evenings of debugging, I discovered three independent bugs stacked on top of each other.
- Windows BLE‑MIDI exposure – Windows only natively exposes BLE‑MIDI through the WinRT API, which almost no DAW polls. So even when pairing succeeds, MIDI apps still don’t see the device.
- Direction 2 (PC → piano) failure – Note‑On writes were getting ATT‑acked, but the piano stayed silent. The bytes reached the piano, but something above the GATT layer discarded them.
- MIDI channel mismatch – The FP‑90X has a panel setting called Transmit Channel (default 1), but the instrument actually receives on channel 4 and this cannot be changed. Notes sent on channel 1 were ACKed at the GATT level and then silently dropped by the synth engine.
Solution
The new Windows MIDI Services (WMS) stack ships with loopback endpoints: anything written to one endpoint appears on the other, and any WinMM/WinRT/WMS app sees them as normal MIDI ports. The utility works as follows:
- BLE‑MIDI input – Uses the WinRT API to receive BLE‑MIDI data.
- WMS loopback output – Sends the received data to a WMS loopback endpoint, making it visible to all MIDI applications. This solves the piano → PC direction.
For the PC → piano direction, after ruling out pairing, encryption, write mode, and proprietary characteristics, the remaining issue was the MIDI channel. I added a Detect button that plays a series of test notes ascending on each channel (1‑16). The user counts the notes they actually hear; that count determines the receive channel for the specific keyboard. The detected channel is saved per BLE MAC address (≈ 75 seconds of detection, performed once per piano).
Technical Details
- Language / Runtime: .NET 10
- UI: Avalonia (UI layer is portable; BLE/MIDI side is Windows‑only)
- MIDI APIs:
Microsoft.Windows.Devices.Midi2packages for WMS,Windows.Devices.Midi(WinRT) directly for BLE (instead of Korg’s older WinMM driver) - License: MIT
- Distribution: Single self‑contained ~21 MB executable, no installer, no telemetry, no account required
Links
- Project site (with screenshots):
- Source code:
- Long‑form technical write‑up (full debugging story):
- Reddit comment from Microsoft Windows MIDI Services team:
- Comments thread:
Personally tested with my FP‑90X only. The BLE side is generic, so other keyboards (WIDI Master, CME, Yamaha MD‑BT01, Korg microKey Air, ROLI Seaboard, etc.) should work, but I haven’t confirmed each individually. Device test reports, issues, and PRs are very welcome.