01
The positions were right there
An open-source decoder for a well-known object-based cinema format had just appeared — and with it, something irresistible: the position of every sound object, live, as the stream plays. We wanted to hear what VBAP would do with that on real speakers.
02
First try: an external panner
The first experiment wired those positions into SPARTA's panner over OSC. It worked, and it sounded promising — but decoding and rendering lived in separate processes, and the OSC hop put latency between where a sound was and where you heard it.
03
Rendering moves in-engine
So, with some AI help, we brought the rendering inside the engine, applied just in time: positions and audio stay in one process, sample-aligned. No hop, no drift — the panner reacts the moment the object moves.
04
Beyond the sphere
VBAP renders on a virtual sphere, but objects like to live inside the room. We added alternative renderer backends to experiment with that — and then made backends a public, swappable part of the design, so anyone can bring their own algorithm.
05
The pipe era
The first player integration read audio from a named pipe and played out through PipeWire or ASIO, fed by mpv passthrough over IEC 61937. That meant giving up the player's resampling and owning audio sync ourselves. The mode still exists — it may yet earn its keep for network rendering.
06
A decoder inside mpv
Later we added an audio decoder to mpv itself —
ad_orenderin mpv-omniphony — so spatial rendering rides mpv's normal audio output, resampling, sync and all. That's the playback path most people use today.
Origin story
One itch at a time
Omniphony is a real-time spatial player — format-agnostic, and built to be taken apart. It didn't start as a product; it started as a chain of itches, each one scratched just enough to reveal the next. Here's the short version.