Getting started
Virtual MIDI port — Windows
Universal Controller MIDI creates a virtual MIDI port on Windows automatically using a bundled driver. Pick it inside your DAW and you're routed.
Updated
Windows ships zero virtual MIDI drivers out of the box — unlike macOS, which has IAC built into every install since 2007. Universal Controller MIDI patches the gap automatically: the installer bundles a signed kernel driver and creates a port the first time the app launches. No second wizard, no third-party download.
The bundled driver
We use teVirtualMIDI under the hood — the same driver behind loopMIDI and rtpMIDI. It's signed by Tobias Erichsen and accepted by every Windows DAW we've tested (Ableton, FL Studio, Cubase, Bitwig, Reaper, Studio One, Cakewalk).
The driver installs automatically with the app. No separate download, no second installer wizard.
Windows MIDI driver options compared
If you're choosing between virtual MIDI drivers on Windows, this is the lay of the land. UCM's bundled driver covers everything most users need, but loopMIDI is a useful companion if you want extra named ports outside the app.
| Driver | Bundled with UCM | Multi-client | Max ports | Best for |
|---|---|---|---|---|
| teVirtualMIDI | Yes | Yes | Unlimited (named) | Default — every UCM install. |
| loopMIDI | No (free download) | Yes | 16 by default | Extra named buses outside UCM. |
| rtpMIDI | No | Yes | Per session | Network MIDI to a Mac or iPad. |
| MIDI-OX MIDI Yoke | No | Yes | 8 fixed buses | Legacy — avoid on Windows 11. |
| Windows MIDI Services (WinMIDI 2.0) | No (preview) | Yes | Unlimited | Future-proof — not GA yet. |
| copperlan | No | Yes | Unlimited | LAN MIDI across studios. |
Find the port in your DAW
The port name matches whatever you set during onboarding — default: Universal Controller. In your DAW's MIDI preferences, enable it as an input:
- Ableton: Preferences → Link, Tempo & MIDI → Input → toggle Track.
- FL Studio: Options → MIDI Settings → click the port → Enable.
- Reaper: Preferences → MIDI Devices → right-click → Enable input.
- Cubase: Studio → Studio Setup → MIDI Port Setup → tick In 'All MIDI Inputs'.
Check the port at the OS level
Open PowerShell:
Get-PnpDevice -Class MEDIA | Where-Object FriendlyName -like "*Universal Controller*"
# Confirm the teVirtualMIDI driver service is running
Get-Service | Where-Object Name -like "*teVirtualMIDI*"
# Inspect the registered MIDI input devices via the multimedia API
[Reflection.Assembly]::LoadWithPartialName("System.Web") | Out-Null
Get-CimInstance Win32_PnPSignedDriver | Where-Object DeviceName -like "*Universal*" |
Select-Object DeviceName, DriverVersion, IsSigned You should see the driver listed with status OK. If status is Error, the driver install was interrupted — re-run the installer and reboot.
Manual reinstall of the bundled driver
If the driver got wedged — usually after an EDR agent quarantined the install — you can rebuild it without running the full app installer. The driver lives in the program directory and registers via pnputil.
# Run elevated PowerShell — uninstall then reinstall the driver
$drv = "$env:LOCALAPPDATA\Programs\UniversalControllerMIDI\driver\teVirtualMIDI64.inf"
# Remove any existing oem*.inf for the driver
pnputil /enum-drivers | Select-String -Context 0,7 "teVirtualMIDI" |
ForEach-Object { ($_ -split ":")[1].Trim() } |
Where-Object { $_ -like "oem*.inf" } |
ForEach-Object { pnputil /delete-driver $_ /uninstall /force }
# Install fresh
pnputil /add-driver $drv /install Registry knobs for advanced setups
The bundled driver reads a handful of registry values at boot. You shouldn't normally touch these, but they're useful if you're scripting a studio image or chasing a name-collision bug:
# Inspect the driver's per-user config
Get-ItemProperty -Path "HKCU:\Software\Tobias Erichsen\teVirtualMIDI"
# Force-disable the multi-client mode (rare — only for legacy DAWs)
Set-ItemProperty -Path "HKCU:\Software\Tobias Erichsen\teVirtualMIDI" `
-Name "AllowMultipleClients" -Value 0 -Type DWord
# Restart UCM to pick up the new config
Stop-Process -Name ucm -Force; Start-Process "$env:LOCALAPPDATA\Programs\UniversalControllerMIDI\ucm.exe" Multiple ports for multi-controller
Plug in a second controller and the app spins up a second virtual port — Universal Controller 2 — automatically. Each controller gets its own port and its own MIDI channel by default. Full details: multi-controller mode.
What if it doesn't work?
If the bundled driver behaves badly, walk these five before opening a ticket:
- Port doesn't appear in any DAW — driver install was blocked by EDR (CrowdStrike, SentinelOne, Defender ASR). Re-run the installer with admin rights and reboot.
- "Driver signature enforcement" warning on Windows 11 24H2 — Secure Boot rejected the driver because of stale cache. Run
pnputil /scan-deviceselevated, then reboot. - Port appears but the DAW only sees it as output — DAW listed the port under MIDI Output instead of Input. Enable it on the input side too (Ableton needs both Track and Remote toggled).
- Two UCM instances both claim "Universal Controller" — port name collision. Rename one via Settings → MIDI port name. Restart all DAWs after the rename.
- Latency spikes to 40+ ms randomly — DPC latency from a wireless or GPU driver. Run
LatencyMonto confirm, then update the offending driver. Not a UCM bug.
What's next
Test the chain with the verify everything works loopback test.