Understanding the technical limitations of MIDI-CI communication between apps on the same iOS device, and the alternatives available.
Key Finding: MIDI-CI and Property Exchange between apps on the same iOS device is generally not possible due to how third-party apps implement MIDI-CI support.
Many developers want to use MIDI-CI to communicate between their MIDI2Kit-powered app and other apps (like KORG Module Pro) on the same iOS device. Unfortunately, this doesn't work in most cases.
The limitation stems from how third-party apps implement MIDI-CI:
We tested sending MIDI-CI Discovery Inquiry to KORG Module Pro via CoreMIDI Virtual Port:
| Test | Result |
|---|---|
| Virtual Port visible in CoreMIDI | Yes - "Module" destination found |
| Discovery Inquiry sent | Yes - SysEx transmitted successfully |
| Discovery Reply received | No - 15 second timeout, no response |
Conclusion: KORG Module Pro ignores MIDI-CI messages from Virtual Ports. Its MIDI-CI implementation is tied to the BLE MIDI interface layer only.
iOS supports inter-app MIDI communication via CoreMIDI Virtual Ports:
While MIDI-CI technically uses SysEx messages (which can be sent via Virtual Ports), MIDI-CI requires:
Most third-party apps only implement this on hardware interfaces (USB, BLE MIDI), not on software Virtual Ports.
Good news: There are reliable alternatives for testing and development.
Use two iOS devices connected via BLE MIDI:
Use MIDI2Kit's built-in MockDevice for testing without hardware:
import MIDI2Kit
// Create loopback transport
let (initiator, responder) = LoopbackTransport.createPair()
// Create MockDevice simulating KORG Module Pro
let mockDevice = MockDevice(
transport: responder,
preset: .korgModulePro
)
try await mockDevice.start()
// Your app uses initiator transport
let ciManager = CIManager(transport: initiator, ...)
let peManager = PEManager(transport: initiator, ...)
// Full MIDI-CI/PE testing without hardware
await ciManager.startDiscovery()
let response = try await peManager.get("DeviceInfo", from: mockDevice.handle)
Benefits of MockDevice:
If you control both apps, you can implement MIDI-CI on Virtual Ports:
This only works when both apps are designed to support MIDI-CI on Virtual Ports.
| Scenario | Works? | Notes |
|---|---|---|
| MIDI2Kit ↔ KORG Module (Same Device) | No | KORG ignores Virtual Port MIDI-CI |
| MIDI2Kit ↔ KORG Module (BLE MIDI) | Yes | Requires two devices |
| MIDI2Kit ↔ MockDevice (Same App) | Yes | Recommended for testing |
| MIDI2Kit ↔ MIDI2Kit App (Same Device) | Yes | Both apps must use MIDI2Kit |