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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 06

    A decoder inside mpv

    Later we added an audio decoder to mpv itself — ad_orender in mpv-omniphony — so spatial rendering rides mpv's normal audio output, resampling, sync and all. That's the playback path most people use today.

There's a lot more in here than this story covers — that's what the docs are for. And if the next itch is yours, the source is on GitHub.

Grab a buildWrite a backend