Periphony 8D
I write to music with no words in it.
That isn't a preference, it's a requirement. I've been vibe coding for about two years now, and the thing that keeps me in the zone is instrumental — usually EDM, sometimes not — running the entire time. The second somebody starts singing, my brain locks onto the voice and the session is over. I have ADHD. The noise is the default state, and music without lyrics is one of the few things that reliably turns it down.
So I spend real time hunting for streams. A while back, somewhere down that rabbit hole — past a lot of livestreamed EDM channels that were genuinely decent — I found 8D audio.
If you haven't heard it: put headphones on and the sound stops sitting between your ears. It circles your head. Not panning left to right. Around. Like someone is physically carrying a speaker in a slow lap around you.
My brain exploded.
Then something better happened. It didn't just sound cool — it worked. The noise shut off. I could hyperfocus on a project in a way I usually have to fight for, and it turned into a genuine catalyst for actually finishing things. I've since read that this does something for people who struggle with ADHD. I can't tell you the mechanism. I can tell you what it did for my output.
Which is where the problem started. The 8D tracks I could find were somebody else's taste, and most of them had vocals. One voice and the spell breaks. I wanted my genres, no lyrics, in this format — and that combination essentially did not exist.
So I did the thing I always do, and asked Claude what this actually was and how it worked. These models are built to be eager to get you to your destination, so "what is this" became "how does it work" became "let's build the app" faster than I can honestly account for.
I need to get this out of the way: I think "8D" is a dumb name.
There is no eighth dimension. There aren't eight channels. It's binaural stereo — two channels, same as always — that has been processed so your brain reconstructs a position in space. The actual word for reproducing sound all the way around a listener is periphony. That's a real term with real history.
I tried to resist. I lost. "8D" is what everybody searches for, it's what the format is called now, and pretending otherwise just means nobody finds the thing.
You can watch me lose that fight in the repo's own history. It shipped as "8D Audio Converter," got renamed to "Periphony," and finally landed on "Periphony 8D" — the correct word and the dumb one, stapled together, because I wanted to be right and found anyway.
Version 1.0.0 went in on March 30th. It was wrong.
It sounded fine in the sense that audio came out. But with headphones on, the sound just slid left to right — a stereo pan with extra steps. Not the thing I'd heard on YouTube. Nothing ever went behind me.
The bug turned out to be a lookup. The MIT KEMAR measurements index positions by angle, and I was finding the nearest one with plain linear distance instead of circular distance. Angles wrap; 359° and 1° are two degrees apart, not three hundred and fifty-eight. So a source at 270° — hard right — was snapping to 180°, which is directly behind. The entire right-hand side of the circle folded onto the back of my head, and what survived was left-versus-right. Panning.
I want to be accurate about how it got fixed, because it says something. I'd been stuck on that math. What broke it loose was a model upgrade: a newer Claude landed, I put the problem back in front of it, and it solved in minutes what I had been circling for days. The fix went in on April 1st — circular azimuth lookup, energy normalization across positions, and a post-EQ pass.
That was the first time it actually went around my head.
The premise is that your head is a filter. A sound arriving from behind and to the left reaches your left ear slightly sooner, slightly louder, and differently colored, because your skull shadows it and the folds of your ears notch certain frequencies depending on the angle. Your brain reads those differences and reports a direction. That whole transformation is a head-related impulse response — an HRIR — and it's different for every angle.
You can fake this with an equation. I didn't want to. Periphony uses real measured HRIRs from the KEMAR mannequin head at MIT — an actual dummy with microphones in its ear canals that had sound played at it from a lot of directions. The rotation is built from recorded human hearing rather than a model of it.
The pipeline, roughly:
The track is loaded and taken down to mono, and its tempo is detected. Then it's split at 150 Hz. Bass below that stays dead center and untouched — low frequencies carry almost no directional information anyway, and spinning them just makes the mix feel like it's falling over. Only the band above 150 Hz gets spatialized.
That split has a trap in it. Filtering the same signal twice, once low-pass and once high-pass, leaves a measured +2.85 dB bump right at the crossover, because the two halves come out phase-offset and don't sum back to what you started with. So the low band is taken with a zero-phase filter and the high band is defined as simply the original minus the low. They sum to the input exactly, by construction.
The high band is then convolved against KEMAR at 36 positions — one every 10° around the circle — all of them, up front. Playback walks the rotation angle and crossfades between the two neighboring pre-convolved versions sample by sample, equal-power, so the source glides continuously instead of clicking between 36 fixed seats.
That ordering matters more than it looks. An earlier version convolved block by block at whatever the current angle was, which is technically the correct way to do it and sounded worse. The reason is that KEMAR's front (0°) and back (180°) responses are both symmetric — identical in both ears, no timing difference between them. Front and back are literally the same signal. Your brain has nothing to work with and gives up, collapsing the whole effect back into left-right panning.
What breaks the tie is the room. The engine adds reverb that varies with position: tight early reflections when the source is in front of you, a longer and more diffuse tail when it's behind. That's the cue your brain actually uses to tell front from back, and adding it is what made a sound convincingly pass behind my head instead of vanishing into ambiguity.
The rotation itself is locked to the music. Tempo is detected per track and the orbit is tied to it — eight beats per revolution by default, adjustable from four to sixty-four — so the movement lands with the rhythm instead of drifting against it. Per track you can pick clockwise, counter-clockwise, a figure-eight that adds elevation, or random.
Then there's the part that took the longest and that nobody would ever list as a feature: making the output not sound worse. Early renders came back quieter and flatter than what went in — measured on one of my own tracks, 5.7 LUFS down, with the center image gutted by nearly 8 dB. That's fatal, because if the 8D version sounds smaller you'll just play the original. So the final stage measures the source and matches it: third-octave spectral matching to restore the original tonal balance, gated loudness matching, then a true-peak limiter. On my reference track the source and the render now sit at −13.3 and −13.4 LUFS. What's left different is what should be different — channel correlation drops from +0.91 to +0.57, stereo width comes up nearly 8 dB. The movement is the only thing that changed.
One more trap worth writing down, because it cost me a real amount of time. To cut a frequency hump by subtracting a filtered band, the filter has to be zero-phase. A normal causal filter hands the band back phase-shifted, so subtracting it doesn't notch — it combs. Measured on noise, the original version produced +2.7 dB at 1.5 kHz, −9.3 dB at 3 kHz, and +2.7 dB again at 5.5 kHz. A hole with boosted shoulders. It sounded like the whole mix was being played through cupped hands, and it took a measurement to see it, because by ear it just registered as "off."
It's a single Python file. Drop MP3s on it, pick a direction, press convert, get 320 kbps MP3s back. It runs entirely on your machine — no account, no telemetry, nothing uploaded.
After April 1st the repo goes silent until August 9th. Four months, zero commits.
That's not a dramatic story. That's just how I work. I have a lot of projects going, I hyperfocus on whichever one is interesting right now, and the rest go on a shelf until the time or the interest comes back around. The tool worked. It did what I needed. So I stopped touching it and used it.
Which is the joke I didn't plan: this is an application whose entire purpose is producing hyperfocus, and its own development history is shaped by hyperfocus deciding what I was allowed to care about that month.
What brought it back off the shelf was Infinite Volumes. I started upgrading that, and upgrading it meant this tool needed to be more than a personal script — so in one week in August the engine got its output stage rebuilt, the convolution got parallelized, it got drag and drop, it got a real .app bundle, it got renamed twice, and it got a landing page.
Periphony isn't a standalone product in my life. It's a part in a pipeline.
Infinite Volumes is both a YouTube channel and the streaming software behind it, which I built. I generate the assets — the music, the thumbnail, and a seamlessly looping animation out of a custom ComfyUI workflow — and load them onto the server in batches I call eras. An era is a four-hour video, usually around a hundred songs, and it streams for two weeks. Meanwhile a separate system called Poster works the same assets into social posts across that fortnight.
Periphony is the stage between "I have a hundred tracks" and "the era is 8D." The thing I originally went looking for and couldn't find — my genres, no lyrics, circling your head, running continuously — I ended up having to build the entire supply chain for.
Infinite Volumes and Poster each deserve their own write-up, and they'll get one. This one is about the converter.
I wrote about RE:play a little while ago, and the whole spine of that piece was open source: BSD-3, handed to the world, source and issues and releases all public, right down to admitting I'd forgotten the license file.
This one isn't that. Periphony's repo is private and I'm not planning to open source it as of now. The app will be free — that part isn't changing — but the code stays mine for the moment.
I'm not going to dress that up as a principled stand. It's simply where this one is.
And the honest status, since a piece like this usually implies you can go get the thing: you can't yet. The page is up, the app is at version 1.2.0, it runs every day on my machine and it's producing the audio for a live stream right now. But the signed build and the download flow behind that page aren't wired up. Publishing a landing page for software nobody can download is, I'm aware, an extremely on-brand move for someone who built a marketing site for RE:play and then never marketed it.
It's coming. This is a project write-up, not a launch.
visit website
periphony8d.cyburdine.com
periphony8d.cyburdine.com — what it is, and an A/B demo you can hear in the browser. Headphones required; the effect does not exist on speakers.
Infinite Volumes — where the output ends up. macOS app, free, download coming.