an open spatial-audio playground
Omniphony
Throw sounds anywhere in the room, in real time. Watch them fly around a live 3D scene. Then rip out the panner and drop in your own — object-based spatial audio, built to be taken apart.
It puts sound in space. You get to mess with how.
Omniphony decodes object-based audio, works out where every sound should come from, and drives your real speakers with VBAP — live, with a 3D scene showing each object move and everything streamed over OSC. Nothing's a black box: formats load as runtime bridges, and the part that decides which speaker gets what is a backend you can rewrite in a single file.
- No formats baked in — decoders load at runtime as bridges.
- PipeWire on Linux, ASIO on Windows, or raw float straight to a file or pipe.
- Write your own panner in one file — it shows up in the UI on its own.
Headphones on
Hear it fly around you
One 12-channel master, two renders. Flat stereo is what a normal player gives you — everything collapses between your ears. Omniphony binaural folds the whole 7.1.4 scene around your head: the source circles the room while a height pad hangs above and in front. Flip between them mid-play.
Wear headphones — the binaural render only makes sense on two ears. Rendered by the stock engine: KEMAR HRTF, early reflections on.
The pieces
omniphony-renderer
The real-time decoding and spatial-rendering core.
- Loads a format bridge at runtime and decodes the stream
- Renders objects to speaker feeds with VBAP
- PipeWire / ASIO outputs, or file / pipe
- Emits metadata and metering over OSC
omniphony-studio
Supervision, 3D visualization, and live control.
- Visualizes objects and sources in a 3D scene
- Registers with the engine and keeps alive over OSC
- Controls gain, layout, spread, and render backend live
- Monitors metering and runtime state
mpv-omniphony is the mpv media player patched with ad_orender — an opt-in spatial audio decoder that hands raw access units to the renderer for VBAP object rendering instead of letting FFmpeg downmix.
- Opt in with
--ad=orender; plain streams keep their normal path. - Reads the same shared config as the CLI and Studio.
- Windows builds ship the Steinberg ASIO output driver.
This is the fun part. Copy the example backend, compute a per-speaker gain vector however you feel like — VBAP, DBAP, or something you made up at 2 a.m. — and the engine wires it into the render loop and the Studio UI for you. No central files to edit, no build system to fight.
Panic in the audio thread? A build-time smoke test catches a misbehaving backend before it ever reaches your ears. So go on: experiment, measure, break it, and tell us what you found.
Docs & guides
Get it set up, get it running, and figure out how it works.
Getting started
From zero to sound flying around your room. Build it, run it, hear the demo — then point it at your own stuff.
Using Studio
Your window into the engine — watch every object move in 3D, then grab the knobs and mess with the mix live.
Speaker layout
Tell the engine where your speakers actually are — a few lines of YAML, and VBAP figures out the rest. Stock rigs included, weird ones welcome.
Binaural for headphones
No speakers? Fold the whole scene into a stereo pair with HRTFs, room reflections, and live head tracking — the room, on your head.
Playback via mpv-omniphony
Point a real film at your speaker rig — mpv hands the audio to Omniphony instead of letting FFmpeg flatten it.
OSC protocol
Everything the engine does, it does over OSC — drive it and watch it from a script, a controller, or whatever you feel like wiring up.
Custom render backends
Compute a per-speaker gain however you like. Prototype it in Lua and edit it live, or compile a native Rust backend — either way it shows up in the UI on its own.
Keep the tinkering going
Omniphony is free and open source under GPL-3.0 — a nights-and-weekends project, not a product. If it scratched an itch or saved you an afternoon, a sponsorship helps keep the experiments coming.
Curious how it got here? Read the origin story →