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.

Born one itch at a time — read the origin story →

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.
orender engineinputfile · pipe · mpvbridgeruntime decoderbackendposition → gains← swap in yoursoutputsPipeWire · ASIO · filestreamPCM + objectsfeeds

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.

0:00 / 0:16

Integration

Spatial playback in mpv

Playback guide

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.

Come break things

Bring your own algorithm

Write a backend

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.

A toy pairwise panner, live: drag the source and watch each speaker's gain follow. Your backend replaces exactly this decision — one function from position to gains.

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 →