← Back to Guides

Inter-App MIDI-CI Limitations

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.

The Problem

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.

Why It Doesn't Work

The limitation stems from how third-party apps implement MIDI-CI:

  1. BLE MIDI Only - Apps like KORG Module Pro only enable MIDI-CI on BLE MIDI interfaces, not on CoreMIDI Virtual Ports
  2. No Self-Connection - Bluetooth doesn't allow a device to connect to itself, so BLE MIDI within a single device is impossible
  3. Virtual Ports Ignored - Even though CoreMIDI Virtual Ports can technically transmit SysEx messages (including MIDI-CI), most apps don't listen for MIDI-CI on these ports

Tested Scenario

We tested sending MIDI-CI Discovery Inquiry to KORG Module Pro via CoreMIDI Virtual Port:

TestResult
Virtual Port visible in CoreMIDIYes - "Module" destination found
Discovery Inquiry sentYes - SysEx transmitted successfully
Discovery Reply receivedNo - 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.

Technical Background

iOS Inter-App MIDI

iOS supports inter-app MIDI communication via CoreMIDI Virtual Ports:

Why MIDI-CI Is Different

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.

Working Alternatives

Good news: There are reliable alternatives for testing and development.

Option 1: Two-Device Setup (Recommended for Real Devices)

Use two iOS devices connected via BLE MIDI:

Option 2: MockDevice (Recommended for Testing)

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:

Option 3: Two MIDI2Kit Apps (Same Device)

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.

Summary

ScenarioWorks?Notes
MIDI2Kit ↔ KORG Module (Same Device)NoKORG ignores Virtual Port MIDI-CI
MIDI2Kit ↔ KORG Module (BLE MIDI)YesRequires two devices
MIDI2Kit ↔ MockDevice (Same App)YesRecommended for testing
MIDI2Kit ↔ MIDI2Kit App (Same Device)YesBoth apps must use MIDI2Kit

Recommendations

  1. For Development/Testing: Use MockDevice with LoopbackTransport
  2. For Real Device Testing: Use two-device BLE MIDI setup
  3. For Production: Support both BLE MIDI and USB MIDI interfaces for maximum compatibility