The original idea was simple. Turn my iPhone into a MIDI controller. Sliders to send CC values. A bank of buttons for program changes. An XY pad for expressive playing. That’s it. Nothing groundbreaking — just a utility I wanted for my own workflow.
I had the app basically working in a weekend. SwiftUI for the UI, CoreMIDI for sending bytes, done. MIDI 1.0: you push [0xB0 | channel, cc, value] down the wire and something on the other end responds. Elegant in its simplicity.
Then I thought: “I should add MIDI 2.0 support. How hard can it be?”
The Problem with “Modern” MIDI
MIDI 1.0 is from 1983. Forty years old. And for forty years it has done exactly one thing: send bytes between devices. No frills, no negotiation, no handshake. Just bytes.
MIDI 2.0 is a complete rethink. Property Exchange (PE) lets devices exchange JSON-formatted data about their capabilities — sound names, parameter lists, bank structures. MIDI-CI (Capability Inquiry) is the handshake protocol that makes two devices discover and negotiate with each other before any of that works. And MIDI 2.0 messages themselves use 32-bit values instead of 7-bit, so you get vastly more resolution on everything from velocity to pitch bend.
On paper it’s beautiful. A self-describing, negotiated protocol that finally drags MIDI into the modern era.
In practice, implementing it from scratch is something else entirely.
What This Series Is About
This is a 10-part series documenting the full journey: from that naive first attempt at MIDI 2.0 support, through every bug and dead end and reverse-engineering session, to the eventual creation of MIDI2Kit — an open-source Swift library that wraps all of it.
Fair warning up front: my test hardware was limited to a KORG KeyStage and KORG Module Pro. Everything I discovered about real-world MIDI 2.0 behavior is filtered through that lens. When I say “this is how it works,” I mean “this is how KORG implements it.” Other manufacturers might do things completely differently — I genuinely don’t know.
The spec reads cleanly. Real devices are messier. Here’s what I found.
Where It Ends Up
The app is called SimpleMidiController. What started as about 200 lines of CoreMIDI glue code eventually accumulated 2,800 lines of hand-written MIDI-CI and Property Exchange implementation before I finally extracted it all into a library.
That extraction — and everything I learned during it — is what MIDI2Kit is built from.
Follow the Journey
10 posts documenting the real-world experience of building with MIDI 2.0 on iOS. Open source library available now.