Skip to content
Kira

Audio · Web

OSC ↔ VoiceMeeter bridge: a mixing console on your phone

A Python bridge turns any phone or tablet into a mixing console for VoiceMeeter Potato and a control panel for the PC: per-app audio, monitors, windows and more.

Year
2026
Status
In daily use
Role
Design & development · personal project
Repository
Repository coming soon

01 · Problem

Mixing in VoiceMeeter Potato (5 hardware inputs, 3 virtual inputs and 8 buses) with a mouse is slow, and Windows does not let you send each application to a different virtual input without digging through menus. I wanted to control everything from my phone, in real time.

02 · Approach

I wrote a bidirectional OSC/UDP bridge in Python between Open Stage Control and VoiceMeeter. The UI (9 tabs) is never edited by hand: build scripts generate it, and some parts are generated from the detected hardware. Observer threads push the real state back to the screen.

03 · Result

Full mixing with live stereo VU meters, per-app volume and routing (it even migrates already-open audio sessions in about 2 s), a dashboard with CPU, RAM and temperature, monitor control over DDC/CI, mouse, keyboard, window management and PotPlayer remote. It starts automatically from the system tray.

04 · Stack

  • Python
  • python-osc
  • voicemeeterlib
  • pycaw / COM
  • Open Stage Control
  • DDC/CI
  • C# .NET 9 (diagnostics)

How it fits together

Phone / tablet (Open Stage Control, browser)
│ OSC over UDP
▼
osc_bridge.py ──► VoiceMeeter Potato (mixing, buses, VU meters)
│ ──► Windows audio sessions (per-app volume and routing)
│ ──► Monitors (DDC/CI), mouse and keyboard (SendInput), windows
▲
observer threads push the real state back to the UI

Decisions that mattered

  • The UI is compiled, not hand-drawn. Nine build_*.py scripts generate the Open Stage Control session in order, so design changes are reproducible and never lost between edits.
  • The monitors UI comes from the hardware. At build time the bridge probes what each monitor supports (brightness, contrast, color temperature, inputs). If a monitor supports picture modes but does not declare them, it discovers them by writing and reading back, and caches the result.
  • Audio comes first. Enumerating audio sessions faster than 1 Hz competed with the audio engine and caused dropouts, so the scan runs at 1 Hz.
  • Real per-app routing. Each app’s MUS / PEL / VOZ buttons (music, movies, voice) send it to the matching VoiceMeeter virtual input and reflect the actual routing when the tab opens.

Tabs

VoiceMeeter · Per-app volume · Dashboard · Monitors · Mouse · Keyboard (Latin American QWERTY with labels that react to Shift, Caps and AltGr) · Windows (cards, list or per-program views, with thumbnails) · PotPlayer · Smartbox.