It Works — Just Not Like That
After getting MIDI-CI Discovery and Property Exchange working reliably in tests, the obvious next step was a real-world check: run the MIDI2Kit demo app (Initiator) and KORG Module Pro (Responder) on the same iPhone, side by side.
I sent a Discovery Inquiry over a CoreMIDI Virtual Port. Waited. Waited some more. Fifteen seconds later, still no Discovery Reply.
The code wasn’t broken. The problem was more fundamental than that.
Why Virtual Ports Don’t Cut It for MIDI-CI
CoreMIDI Virtual Ports are the standard mechanism for inter-app MIDI on iOS. They work great for MIDI 1.0 — notes, CCs, Program Changes all flow between apps on the same device without issue.
But KORG Module Pro’s MIDI-CI implementation only activates on BLE MIDI interfaces. When a Discovery Inquiry arrives through a Virtual Port, Module Pro silently ignores it. This isn’t a bug in MIDI2Kit. It’s a deliberate design choice on KORG’s side — they chose to bind their MIDI-CI stack to the Bluetooth transport layer, not to the virtual MIDI bus.
From a product perspective, it makes sense. KORG KeyStage is a Bluetooth MIDI keyboard. That’s the intended use case. Inter-app MIDI-CI on a single device is probably not something KORG’s dev team was optimizing for.
The Bluetooth Physics Problem
OK, so Module Pro needs a BLE MIDI connection. Can I create a BLE MIDI loopback on a single iPhone? Connect the device to itself over Bluetooth?
No. That’s not how Bluetooth works.
BLE is a protocol for communicating with external devices. The radio has to transmit to something else and receive back. A device cannot be its own BLE peripheral and central simultaneously on the same radio in a meaningful way — and even if it could, the MIDI stack wouldn’t route it as a loopback. BLE MIDI is simply not a local IPC mechanism.
So the situation looks like this:
| Setup | Transport | MIDI-CI Works? |
|---|---|---|
| iPhone A (MIDI2Kit) ↔ iPhone B (KORG Module Pro) | BLE MIDI | Yes |
| iPhone A (MIDI2Kit) ↔ iPhone A (KORG Module Pro) | Virtual Port | No — Module Pro ignores it |
| iPhone A (MIDI2Kit) ↔ iPhone A (KORG Module Pro) | BLE MIDI | No — physically impossible |
There’s no workaround. If you want to run MIDI-CI between MIDI2Kit and KORG Module Pro, you need two separate devices connected over Bluetooth.
MIDI2Kit-to-MIDI2Kit Is a Different Story
Here’s the bright side: when both apps use MIDI2Kit, everything works on a single device.
MIDI2Kit’s CIManager can be configured to watch for MIDI-CI messages on Virtual Ports as well. If both the Initiator app and the Responder app are built on MIDI2Kit, they can negotiate Discovery, run Property Exchange, and complete the full MIDI-CI flow over a Virtual Port — no hardware required.
The limitation is specific to third-party apps (like KORG Module Pro) that don’t implement MIDI-CI on Virtual Ports. That’s an ecosystem gap, not a protocol gap. The MIDI 2.0 specification doesn’t say Virtual Port MIDI-CI is optional — that’s just the choice KORG made for their app.
Where This Gets Workable
On macOS and iPadOS there are more transport options. USB MIDI doesn’t have the same physical limitation as Bluetooth, and macOS 26.4 adds Network MIDI 2.0 over UDP.
I’ve tested MIDI-CI with KORG KeyStage over USB. It works — Discovery comes in from KeyStage, MIDI2Kit responds as the Responder side. The catch is that KeyStage initiates the session, so KeyStage is the Initiator and MIDI2Kit (running on Mac) acts as Responder. If I want to send PE GET requests to KeyStage, I need MIDI2Kit to act as Initiator, which brings me back to the same Initiator-only constraint that appears in other parts of this series.
Still, USB and Network MIDI are real paths forward. BLE’s limitations are specific to the wireless transport. Wired connections don’t have this problem.
What This Means in Practice
If you’re building an app that uses MIDI2Kit to talk MIDI-CI with KORG Module Pro, the user story right now requires two iPhones. That’s a real UX barrier. I’m not going to pretend it isn’t.
The path to fixing it runs through KORG — if they enable Virtual Port MIDI-CI in a Module Pro update, the whole thing works on one device. There’s nothing in the MIDI 2.0 spec that prevents it. It’s purely a product decision.
Until then, the MIDI2Kit demo and integration test suite work fine with two devices. And for developers building hardware-adjacent apps (which is most of the MIDI use case anyway), two-device setups aren’t unusual.
Get Started with MIDI2Kit
The MIDI 2.0 library that handles the messy reality of real-world devices. Open source, MIT licensed.