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 UIDecisions that mattered
- The UI is compiled, not hand-drawn. Nine
build_*.pyscripts 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.