Every software MIDI setup eventually hits the same wall: one app produces MIDI, another app needs to receive it, and there is no cable between them because they both live inside the same computer. The fix is a virtual MIDI port — a named software endpoint the operating system creates on request. This guide is the hands-on version: the exact clicks on macOS, the exact installer path on Windows 10 and 11, the exact shell commands on Linux, and the specific reasons a port refuses to show up in your DAW.
- macOS: already built in. Audio MIDI Setup → IAC Driver → tick Device is online. No download.
- Windows: nothing built in. Install an app that bundles
teVirtualMIDI, or install loopMIDI and create a named port. - Linux: already built in. The ALSA sequencer handles it;
snd-virmidiadds fixed device nodes if you want them. - The most common failure: the port exists, but it was enabled on the DAW's output side instead of its input side.
What you'll learn
- What a virtual MIDI port actually is, in one paragraph with no hand-waving
- The create-it-now steps for all three desktop operating systems
- Which tool to use for which job — loopMIDI, IAC, ALSA, teVirtualMIDI, Bome
- How to prove, from the command line, that the port is alive
What is a virtual MIDI port?
A virtual MIDI port is a named software endpoint that carries MIDI bytes between two applications on the same computer, exactly as a 5-pin DIN cable would between two pieces of hardware.
Physical MIDI is a serial protocol running at 31,250 baud down a five-pin cable. A virtual port keeps the byte format and the message semantics identical, but replaces the cable with an operating-system pipe: CoreMIDI on macOS, the WinMM MIDI stack on Windows, and the ALSA sequencer on Linux. One process writes a note-on, another process reads a note-on. Your DAW cannot tell whether the bytes came from a $400 keyboard or from a bridge app translating a gamepad — and that indifference is the entire point.
If you want the architectural tour of why each platform implements this differently, the companion piece — virtual MIDI ports on macOS, Windows and Linux, explained — digs into the kernel-versus-userland story. This page stays firmly on the practical side: create one, verify it, use it.
Do I need to create a virtual MIDI port at all?
Only if two separate applications need to exchange MIDI on the same machine, or if an app needs to publish MIDI that other apps can subscribe to.
You need one when you are sending from a bridge or utility into a DAW, driving two DAWs from one source, routing a standalone synth into a recording host, or exposing a controller to something that only accepts MIDI inputs. You do not need one when your controller plugs in over USB and already appears as a hardware MIDI device — that port exists in the driver already.
How do I create a virtual MIDI port on macOS?
Open Audio MIDI Setup, show the MIDI Studio window, double-click IAC Driver and tick Device is online — macOS has shipped this driver since 10.5 and there is nothing to download.
Step by step:
- Press
Command-Space, typeAudio MIDI Setup, press Return. From a terminal:open -a "Audio MIDI Setup". - Choose Window → Show MIDI Studio (
Command-2). - Double-click the IAC Driver icon. It appears greyed out until enabled — that is expected, not a fault.
- Tick Device is online.
- Under Ports, rename the default
Bus 1to something you will recognise in a dropdown —UCM Bus,Drums Bus, whatever matches the job. - Click Apply. The port is now visible system-wide, as both an input and an output, to every CoreMIDI client.
Confirm it exists without opening a DAW:
# Every CoreMIDI source and destination the system knows about
system_profiler SPMIDIDataType
# Or, if you have SendMIDI installed
sendmidi list
# Fire a test note into the bus you just created
sendmidi dev "UCM Bus" on 60 100
sleep 0.5
sendmidi dev "UCM Bus" off 60 0 Full walkthrough with the fleet-imaging shortcuts and the five ways IAC fails: virtual MIDI port on macOS.
How do I create a virtual MIDI port on Windows 10 or 11?
Windows has no built-in virtual MIDI driver, so you install one — either an application that bundles the teVirtualMIDI driver, or the free loopMIDI utility where you type a name and click the plus button.
This is the single biggest difference between the platforms, and it is why so many Windows tutorials start with "first, download loopMIDI". Microsoft's newer Windows MIDI Services stack does introduce a first-party virtual-port API, but it is not generally available across Windows 10 and 11 yet, so third-party drivers remain the working answer today.
Option A — loopMIDI
- Download loopMIDI from tobias-erichsen.de and run the installer.
- Launch it. The window lists existing ports (empty on a fresh install).
- Type a name in the field at the bottom — for example
Universal Controller MIDI. - Click the + button. The port appears in the list immediately and in every DAW that rescans its MIDI devices.
- Leave loopMIDI running (it minimises to the tray). Its ports persist across reboots because the driver recreates them.
Option B — let the app register the driver
Universal Controller MIDI's Windows installer registers a signed teVirtualMIDI port during setup, so for most people there is no second download. The app uses a tiered approach rather than assuming that driver always lands:
- Bundled driver. If the
teVirtualMIDIregistration succeeded, you get a named port your DAW can see. - Immediate-sound fallback. If no routable port is available yet, the app plays through the Microsoft GS Wavetable Synth that ships with Windows, so you can hear the controller working straight away. That is a sanity check, not a DAW route.
- Manual fallback. If an endpoint-security agent blocked the driver install, create a loopMIDI port named
Universal Controller MIDIand restart the app — it routes there automatically.
Verify at the OS level in PowerShell:
Get-PnpDevice -Class MEDIA | Where-Object FriendlyName -like "*Universal Controller*"
# Is the teVirtualMIDI driver service present?
Get-Service | Where-Object Name -like "*teVirtualMIDI*"
The full Windows story, including pnputil reinstall commands when a driver gets wedged: virtual MIDI port on Windows.
How do I create a virtual MIDI port on Linux?
You do not have to create one — the ALSA sequencer is built into the kernel and any ALSA client can publish a port the moment it launches — but snd-virmidi gives you fixed raw-MIDI device nodes if a piece of software insists on them.
# List every ALSA sequencer client and its ports
aconnect -l
# Optional: expose fixed Virtual Raw MIDI device nodes
sudo modprobe snd-virmidi midi_devs=2
# Connect client 128 port 0 to client 129 port 0
aconnect 128:0 129:0
# Watch raw events arriving on a port — the fastest sanity check there is
aseqdump -p "Universal Controller"
If the sequencer itself is missing (rare, but it happens on stripped kernels), lsmod | grep snd_seq comes back empty — load it with sudo modprobe snd_seq. PipeWire users get the ALSA ports bridged to JACK automatically, so Bitwig, Reaper and Ardour all see the same client without extra wiring. More in the Linux install docs.
loopMIDI vs IAC vs ALSA vs teVirtualMIDI vs Bome — which should I use?
Use the one your operating system already provides unless you specifically need message translation or network transport.
| Tool | Platforms | Cost | Creates ports | Translates MIDI | Best for |
|---|---|---|---|---|---|
| IAC Driver | macOS only | Built in | Yes | No | Any Mac app-to-app route |
| ALSA sequencer | Linux only | Built in | Yes | No | Any Linux routing, scriptable |
| loopMIDI | Windows only | Free | Yes | No | Named buses on Windows |
| teVirtualMIDI | Windows only | Bundled by apps | Yes (by the host app) | No | Ports created without a second install |
| Bome MIDI Translator Pro | macOS + Windows | Paid | Yes | Yes — rules engine | Rewriting and filtering messages |
| Universal Controller MIDI | macOS + Windows + Linux | Free tier, $89 Pro | Yes | Gamepad mapping | Turning a gamepad into a MIDI device |
The distinction that trips people up: loopMIDI and IAC create pipes, they do not change messages. If you need a note to become a different note, or a CC to become a keystroke, you need a translator — Bome is the long-standing commercial answer, and we compare the free routes to it here.
How do I point my apps at the new port?
Set the port as the output in the sending app and as the input in the receiving app — getting that backwards is the most common reason a correctly created port appears to do nothing.
- Ableton Live: Preferences → Link, Tempo & MIDI → find the port row → switch Track ON, and Remote ON if you want to MIDI-map controls.
- Logic Pro: no enable step — Logic listens to all CoreMIDI sources. If nothing arrives, check the track's record-arm.
- FL Studio: Options → MIDI Settings → select the port under Input → click Enable. FL caches aggressively; use Rescan MIDI devices after a rename.
- Reaper: Preferences → MIDI Devices → right-click the port → Enable input.
- Cubase / Nuendo: Studio → Studio Setup → MIDI Port Setup → tick In "All MIDI Inputs".
- Bitwig / Ardour: both rescan at launch. Start the sending app first, then the DAW.
How do I check the port is actually working?
Watch the bytes at the operating-system level rather than trusting the DAW's device list, because a port can be registered and still be routed to nothing.
# Linux — live dump of everything hitting the port
aseqdump -p "Universal Controller"
# macOS — confirm registration, then send a probe note
sendmidi list
sendmidi dev "UCM Bus" on 60 100
# Windows (PowerShell) — confirm the device object exists
Get-PnpDevice -Class MEDIA | Where-Object Status -eq "OK" |
Select-Object FriendlyName, Status If the probe shows traffic but your DAW is silent, the problem is downstream — channel filtering, an unarmed track, or input disabled. If the probe shows nothing, the problem is upstream and the sending app is not writing to that port. That single split saves most of a debugging session. Our port-not-appearing troubleshooting guide walks the rest of the tree.
Frequently asked questions
What is a virtual MIDI port?
A virtual MIDI port is a named software endpoint that carries MIDI bytes between two applications on the same computer, exactly as a 5-pin DIN cable would between two pieces of hardware — one app writes to it, another reads from it, and neither can tell the difference from real hardware.
How do I create a virtual MIDI port on Windows 10 or 11?
Windows has no built-in virtual MIDI driver, so you install one: either an application that bundles the teVirtualMIDI driver (Universal Controller MIDI registers one during install) or the free loopMIDI utility, where you type a port name and click the plus button.
Does macOS need extra software for a virtual MIDI port?
No — macOS has shipped the IAC Driver inside Audio MIDI Setup since 10.5, and apps can also publish their own CoreMIDI source directly, so no third-party driver is required.
Do I need loopMIDI if I already use Universal Controller MIDI?
Usually not, because the Windows installer registers a teVirtualMIDI port for you, but loopMIDI remains a useful manual fallback if an endpoint-security agent blocks that driver install.
Why can my DAW see the port but nothing arrives?
Nine times out of ten the port has been enabled as a MIDI output instead of an input, or the receiving track is filtered to a single MIDI channel while the sender is transmitting on another.
Does a virtual MIDI port survive a restart?
A driver-created port such as a loopMIDI or IAC bus persists across restarts, but a port published by a running application exists only while that application is running and reappears when you relaunch it.
Where to go next
If you came here because you want a controller you already own to show up in your DAW, the port is only half the job — something has to write to it. Download Universal Controller MIDI and it handles both halves: it creates the port on all three operating systems and feeds it from a DualSense, Xbox pad, Switch Pro controller or 8BitDo. The free tier covers one port, one controller and three saved presets; Pro ($89 one-time) adds the mapping editor, multi-port fan-out and multi-controller routing.
From here: the concepts page on virtual ports, the one-controller-to-two-DAWs routing guide, or the ALSA deep dive if you are on Linux.