Universal Controller MIDI

Getting started

Virtual MIDI port — macOS IAC

Set up a virtual MIDI port on macOS using the built-in IAC Driver so Universal Controller MIDI can talk to Logic, Ableton, MainStage and any other DAW.

Updated

macOS has shipped a free virtual MIDI driver since 2007 — the IAC (Inter-Application Communication) bus inside Audio MIDI Setup. Universal Controller MIDI creates its own CoreMIDI source automatically, but enabling IAC gives you a second, system-wide route that any legacy DAW or standalone synth can subscribe to.

Open Audio MIDI Setup

Spotlight: ⌘ Space, type "Audio MIDI Setup", hit return. Or from the terminal:

open -a "Audio MIDI Setup"

Show the MIDI Studio window: Window → Show MIDI Studio (or ⌘ 2).

Enable the IAC Driver

Double-click the IAC Driver icon. In the panel that opens, tick Device is online. Under Ports, you'll see a default port named Bus 1. Rename it to something obvious — UCM Bus works.

Click Apply. The port is now live system-wide. Every CoreMIDI client (Logic, Ableton, MainStage, GarageBand, Reaper) will see it as both an input and an output.

macOS MIDI driver options compared

You have three native choices on macOS for routing UCM into a DAW, plus two third-party options for cross-host work. Most users only ever need the app's internal port; IAC is the escape hatch for multi-host setups.

Driver Bundled with Multi-client Network MIDI Best for
UCM internal CoreMIDI sourceThe appYes (8 readers)NoSingle-DAW workflows.
IAC Driver (built-in)macOS 10.5+Yes (unlimited)NoTwo DAWs listening at once.
Network MIDI SessionmacOS Audio MIDI SetupYesYesiPad / second Mac over LAN.
rtpMIDI (third-party)tobias-erichsen.deYesYesCross-OS network MIDI to Windows.
Bome MIDI Translatorbome.comYesYesHeavy filtering / rewriting.

Route the app to IAC

In Universal Controller MIDI → Settings → MIDI output, switch the output target from Universal Controller (internal) to IAC: UCM Bus. The internal port still exists; you're just choosing which one receives the stream.

Scripted IAC setup

If you're imaging a fleet of studio Macs, you don't want to click through Audio MIDI Setup on each one. The IAC driver is configured by a plist; enable + rename in a single shell command:

# Inspect current IAC config
defaults read com.apple.audio.CoreAudio | grep -i iac

# Toggle the IAC driver online via the CoreMIDI plist
# (path is fixed; values are user-scoped)
plutil -replace devices.iac.online -bool true \
  ~/Library/Preferences/ByHost/com.apple.MIDI.*.plist

# Restart CoreMIDI to pick up the change
sudo killall coremidiserver

Verify with sendmidi

If you have sendmidi installed, list ports:

# List every CoreMIDI source + destination
sendmidi list

# Send a test note-on into the IAC bus and listen for it elsewhere
sendmidi dev "UCM Bus" on 60 100
sleep 0.5
sendmidi dev "UCM Bus" off 60 0

You should see both Universal Controller and UCM Bus in the output list.

What if it doesn't work?

IAC is rock-solid 99% of the time, but here are the failure modes that show up in our inbox:

  • "Device is online" won't stay ticked — IAC plist owned by another user. Run ls -la ~/Library/Preferences/ByHost/com.apple.MIDI.*.plist and fix the ownership with chown.
  • IAC port doesn't appear in DAW dropdown — DAW caches the MIDI list at launch. Quit and re-open the DAW after enabling IAC, or hit "Rescan MIDI" if your DAW exposes one (Reaper does, Logic doesn't).
  • Stuck "All Sound Off" loop — IAC feedback loop. Make sure UCM's input source isn't set to the same IAC bus it's outputting to. The app prevents this in the UI but custom CLI configs can still cause it.
  • UCM sends notes but IAC monitor shows nothing — wrong port selected in Settings → MIDI output. Switch back to Universal Controller (internal) first to confirm the chain, then re-route to IAC.
  • CoreMIDI crashed after enabling IAC — rare but real on macOS 12. Run sudo killall coremidiserver — launchd respawns it immediately and the IAC config sticks.

What's next

Test the chain in verify everything works, or learn how virtual MIDI ports work under the hood.

Edit this page on GitHub Updated
ESC

Type to search.