Windows users spend their first hour of MIDI routing downloading a driver. Mac users have had the equivalent sitting in /Applications/Utilities since 2007 and mostly do not know it exists. The IAC Driver — Inter-Application Communication — is a virtual MIDI bus built into Audio MIDI Setup, free, offline, and usable by every CoreMIDI application on the machine. It ships disabled, which is the only reason it has a reputation for being obscure. This guide enables it properly, names it sensibly, and covers the handful of ways it genuinely goes wrong.
- Enable it: Audio MIDI Setup → Window → Show MIDI Studio → double-click IAC Driver → tick Device is online → Apply.
- Greyed out means offline, not broken. That is the default state.
- Name your buses.
UCM DrumsbeatsBus 1at 1am on a stage. - You may not need it if your app already publishes its own CoreMIDI source — IAC is the second hop for multi-host setups.
- It is macOS-only. loopMIDI is the Windows equivalent; ALSA is the Linux one.
What is the IAC Driver on macOS?
IAC stands for Inter-Application Communication, and it is the virtual MIDI bus built into macOS Audio MIDI Setup that lets any two CoreMIDI applications exchange MIDI without hardware or third-party drivers.
Functionally it is identical to a 5-pin MIDI cable between two synths, except both endpoints are software and the cable is a system service. One app selects the bus as its MIDI output, another selects it as its MIDI input, and the bytes flow. Every CoreMIDI client — Logic, Ableton Live, MainStage, GarageBand, Reaper, Bitwig, Max, Pure Data, a browser using Web MIDI — can see the same bus simultaneously.
That simultaneity is IAC's distinguishing feature versus an app's own private port. An application-published source is typically consumed by one host; an IAC bus is a shared public noticeboard every app on the machine can read.
How do I enable the IAC Driver?
Open Audio MIDI Setup, choose Window then Show MIDI Studio, double-click the IAC Driver icon and tick Device is online, then click Apply.
- Press
Command-Space, typeAudio MIDI Setup, press Return. Terminal equivalent:open -a "Audio MIDI Setup". - Choose Window → Show MIDI Studio (
Command-2). You get a window with device icons — your interfaces, plus IAC Driver and Network. - Double-click IAC Driver. The icon is greyed out before this; that means offline, not missing.
- Tick Device is online.
- Under Ports, select
Bus 1and rename it. Use something you will recognise —UCM Bus,Drums Bus,Clock. - Click Apply. The bus is live immediately, system-wide, as both an input and an output.
How many IAC buses should I create?
One per destination application, because a bus is shared by everything listening to it and separate buses keep two hosts from receiving each other's traffic.
Click the + button under Ports for each additional bus. A typical live rig ends up with two or three: one feeding the audio DAW, one feeding the visuals host, and sometimes a dedicated clock bus. You can run everything down one bus and filter by MIDI channel inside each host, but that filtering is work you have to maintain, and it breaks the moment two hosts interpret the same CC differently. Splitting buses is free; splitting your attention during a set is not.
Do I need IAC if my app already creates a port?
No — an app's own CoreMIDI source is enough for a single-DAW workflow, but IAC gives you a second system-wide bus that is useful when two hosts need the same stream.
Universal Controller MIDI publishes its own CoreMIDI source called Universal Controller the moment it launches, so for "gamepad into Ableton" there is nothing to configure in Audio MIDI Setup at all. Switch the output to an IAC bus in Settings → MIDI output when you want the extra hop — recording the controller in one DAW while MainStage listens to the same stream, for example.
| Route | Setup needed | Multiple listeners | Survives app quit | Best for |
|---|---|---|---|---|
| App's own CoreMIDI source | None | Yes, several readers | No — port lives with the app | One DAW, simplest case |
| IAC bus | One-time, Audio MIDI Setup | Yes, unlimited | Yes — the bus is system-level | Two or more hosts on one stream |
| Network MIDI Session | Audio MIDI Setup → Network | Yes | Yes | iPad or a second Mac over LAN |
| loopMIDI | Install (Windows only) | Yes | Yes | The Windows equivalent of IAC |
| Bome MIDI Translator | Install, paid | Yes | Yes | Rewriting messages, not just moving them |
How do I route an app through an IAC bus?
Set the bus as the output in the sending app and as the input in the receiving app — picking it as an output in both is the classic mistake that makes a perfectly healthy bus look dead.
Per-host specifics:
- Ableton Live: Preferences → Link, Tempo & MIDI. Find the IAC row and switch Track to ON. Add Remote if you want to use
Command-MMIDI mapping. Leave Sync off unless the source is driving tempo. - Logic Pro: nothing to enable — Logic receives from all CoreMIDI sources. If nothing arrives, the issue is record-arm or the track's input, not the bus.
- MainStage: same as Logic. Useful as the second listener on a shared bus.
- Reaper: Preferences → MIDI Devices → right-click the IAC entry → Enable input. Reaper also exposes a rescan, which saves a restart.
- Bitwig: Settings → Controllers → add a Generic MIDI controller and pick the bus. Bitwig scans at launch, so start the sender first.
For a controller specifically, the DualSense in Ableton Live walkthrough goes end to end with the preset and mapping table.
How do I verify the bus is actually carrying MIDI?
Check it from the command line rather than trusting a DAW's device list, because a bus can be registered and still be connected to nothing.
# Every CoreMIDI source and destination the system knows about
system_profiler SPMIDIDataType
# With SendMIDI installed — list, then fire a probe note into the bus
sendmidi list
sendmidi dev "UCM Bus" on 60 100
sleep 0.5
sendmidi dev "UCM Bus" off 60 0 If the probe note moves your DAW's MIDI indicator, the bus is fine and any remaining problem is in the sending app. If it does not, the problem is the bus or the DAW's input configuration. That one split removes most of the guesswork.
Why does the IAC Driver stop working?
Three causes account for nearly all of it: the device silently went offline, the DAW cached its device list at launch, or an output-versus-input mix-up in routing.
- "Device is online" will not stay ticked. The IAC driver can disable itself across logout. If it also refuses after re-ticking, check ownership —
ls -la ~/Library/Preferences/ByHost/com.apple.MIDI.*.plist— and fix it withchownif the file belongs to another account. - Bus does not appear in a DAW dropdown. Most hosts enumerate MIDI devices once, at startup. Quit and reopen the DAW, or use its rescan button (Reaper has one, Logic does not).
- Stuck notes or an "All Sound Off" loop. A feedback loop — the sending app's input is set to the same bus it is writing to. Break one side of the loop.
- App sends but the bus shows nothing. Wrong target selected in the sender. Switch back to the app's internal port to confirm the chain works, then re-route to IAC.
- CoreMIDI misbehaving after a config change.
sudo killall coremidiserver— launchd respawns it instantly and the config sticks.
Deeper diagnosis, including duplicated notes and device-busy errors, is in the MIDI port troubleshooting guide, and the docs version lives at virtual MIDI port on macOS.
Scripting IAC for a studio fleet
If you are imaging several Macs, the IAC configuration lives in a per-user plist, so it can be set without clicking through Audio MIDI Setup on each machine.
# Inspect the current CoreMIDI configuration
defaults read com.apple.audio.CoreAudio | grep -i iac
# Toggle the IAC driver online via the CoreMIDI plist
plutil -replace devices.iac.online -bool true \
~/Library/Preferences/ByHost/com.apple.MIDI.*.plist
# Restart CoreMIDI so the change takes effect
sudo killall coremidiserver
Verify afterwards with sendmidi list — if the bus name appears, the image is correct and you can move on to the next machine.
Frequently asked questions
What is the IAC Driver on macOS?
IAC stands for Inter-Application Communication, and it is the virtual MIDI bus built into macOS Audio MIDI Setup that lets any two CoreMIDI applications exchange MIDI without hardware or third-party drivers.
How do I enable the IAC Driver?
Open Audio MIDI Setup, choose Window then Show MIDI Studio, double-click the IAC Driver icon and tick Device is online, then click Apply.
Why is the IAC Driver greyed out?
A greyed-out IAC Driver icon simply means the device is offline — double-click it and tick Device is online, and the icon becomes solid.
Do I need the IAC Driver if my app already creates its own MIDI port?
No, the app's own CoreMIDI source is enough for a single-DAW workflow, but IAC gives you a second system-wide bus that is useful when two hosts need to listen to the same stream.
Why does Device is online keep unticking itself?
The IAC driver can disable itself across logout, and a plist owned by another user account prevents the setting from sticking — check ownership of the ByHost com.apple.MIDI plist and re-tick after login.
Does the IAC Driver add latency?
IAC is a CoreMIDI-level bus rather than a network or userland shim, so for practical purposes the hop is not what limits your setup — your DAW audio buffer dominates the total latency budget.
Next steps
With IAC enabled you have a free, permanent, system-wide MIDI bus on your Mac. The remaining question is what writes to it. If the answer is a game controller you already own, download Universal Controller MIDI — it publishes its own CoreMIDI source out of the box and can target an IAC bus instead with one dropdown change. The free tier covers one controller, one port and three saved presets; Pro at $89 one-time adds the mapping editor, MPE and multi-port fan-out.
From here: routing one controller into two DAWs or latency tuning.