Universal Controller MIDI

Getting started

Install on Linux

Install Universal Controller MIDI on Linux using AppImage, .deb, or tarball. Covers udev rules, ALSA MIDI, and PipeWire/JACK routing.

Updated

On Linux, Universal Controller MIDI ships three ways — AppImage, .deb, and a generic tarball — each targeting glibc 2.31+ (Ubuntu 20.04, Debian 11, Fedora 34, or newer). The AppImage is the fastest path: ~600 ms cold start, zero package-manager state, runs identically on X11 and Wayland.

Which format for which distro?

If you're not sure which to grab, here's the cheat sheet. All three contain identical app binaries — only the packaging differs.

Distro Recommended Udev rule Notes
Ubuntu 22.04 / 24.04.debautoCleanest desktop integration.
Debian 12.debautoSame as Ubuntu.
Pop!_OS, Mint.debautoWorks as-is.
Fedora 39+AppImagemanualRPM coming in v1.5.
Arch / ManjaroAppImage or AURmanualAUR package ucm-bin handles udev.
NixOStarballvia flakeFlake at github:aidxn/ucm-nix.
SteamOS 3 / BazziteAppImagemanualRead-only root — install to ~/Apps.

AppImage — the easy path

Download UniversalControllerMIDI-x86_64.AppImage, mark it executable, and run it. No package manager, no root.

chmod +x UniversalControllerMIDI-x86_64.AppImage
./UniversalControllerMIDI-x86_64.AppImage

The AppImage self-contains Python, Qt, and the MIDI bridge. It runs on X11 and Wayland (Qt 6 native). Average cold start: ~600 ms.

.deb package

Debian, Ubuntu, Pop!_OS, Mint — grab the .deb and install with apt:

sudo apt install ./universal-controller-midi_X.Y.Z_amd64.deb

The package writes a desktop entry, a launcher icon, and a udev rule for unprivileged HID access at /etc/udev/rules.d/70-universal-controller.rules. Reload udev after install:

sudo udevadm control --reload-rules && sudo udevadm trigger

Hand-write the udev rule

If you're on AppImage or tarball you need to drop the rule yourself. Same content the .deb ships — copy-paste this verbatim.

sudo tee /etc/udev/rules.d/70-universal-controller.rules <<'EOF'
# Sony DualSense (PS5)
KERNEL=="hidraw*", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="0ce6", MODE="0660", TAG+="uaccess"
# Sony DualShock 4 (PS4) — both revisions
KERNEL=="hidraw*", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="05c4", MODE="0660", TAG+="uaccess"
KERNEL=="hidraw*", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="09cc", MODE="0660", TAG+="uaccess"
# Xbox Wireless Controller (BT)
KERNEL=="hidraw*", ATTRS{idVendor}=="045e", MODE="0660", TAG+="uaccess"
# Nintendo Switch Pro
KERNEL=="hidraw*", ATTRS{idVendor}=="057e", ATTRS{idProduct}=="2009", MODE="0660", TAG+="uaccess"
EOF

sudo udevadm control --reload-rules && sudo udevadm trigger

Tarball — for Arch, Fedora, NixOS, anything else

Extract anywhere and symlink the binary:

tar -xzf universal-controller-midi-X.Y.Z.tar.gz -C ~/.local/share/
ln -sf ~/.local/share/universal-controller-midi/bin/ucm ~/.local/bin/ucm

ALSA, PipeWire, JACK

The bridge exposes itself as a standard ALSA MIDI sequencer client. PipeWire bridges it to JACK automatically — Bitwig, Reaper, Ardour all just see it. List clients with:

# List ALSA seq clients
aconnect -l

# Send a test note to the bridge's input port
aplaymidi -p "Universal Controller:0" /usr/share/sounds/sf2/test.mid

# PipeWire view — see UCM as a JACK-side node
pw-cli list-objects | grep -i "universal"

What if it doesn't work?

Linux installs fail in predictable ways. Five usual suspects:

  • "Permission denied" opening hidraw — udev rule missing or not reloaded. Run the udevadm commands above, then unplug + replug the controller.
  • AppImage exits with "libfuse.so.2 not found" — Ubuntu 24.04 dropped libfuse2 by default. Install with sudo apt install libfuse2t64.
  • App launches, no ALSA client appears — kernel built without CONFIG_SND_SEQUENCER. Rare, but check lsmod | grep snd_seq. Load with sudo modprobe snd_seq.
  • PipeWire shows the client but Bitwig doesn't see it — Bitwig's MIDI scan runs once at startup. Restart Bitwig after launching UCM, or use the "Rescan MIDI" button under Settings → Controllers.
  • Wayland: app window invisible on second monitor — Qt 6 fractional scaling bug on KDE 5.27. Either upgrade to KDE 6.0+, or launch with QT_SCALE_FACTOR=1 ./UniversalControllerMIDI.AppImage.

What's next

Go to first launch + onboarding, then connect a controller over USB.

Edit this page on GitHub Updated
ESC

Type to search.