Author’s note: this post was drafted by Claude (Anthropic) from my project notes and source code, then reviewed and edited by me before publishing. The voice and judgments are mine; the typing isn’t.
The problem is one every movie watcher knows: dialogue is mixed for a cinema, so at home you ride the remote — up for the whispering, down fast for the explosion. The fix is also decades old: it’s called dynamic range compression, and every live sound desk does it on every channel, all the time. Audio Console is that fix as a small Windows app: capture the movie’s audio, run it through an EQ → compressor → limiter channel strip in real time, and play it out the speakers.
Built like one channel of a mixing desk
The design is borrowed deliberately from a live console — Allen & Heath’s Avantis — and two ideas from that desk shaped the whole app.
One channel strip does the job. Every channel on the desk runs the same chain: gain → high-pass filter → gate → EQ → compressor → limiter → fader. Taming a movie needs exactly that chain on one stereo feed — not 42 buses, not a surround processor, one good strip. The app’s signal path is that chain, plus a couple of macros:
movie/app audio → [capture] → input gain → 10-band graphic EQ
→ tone macros (bass / clarity) → compressor → ambience → stereo width
→ limiter → output gain → speakers
Separate the engine from the surface. The desk’s “mini” sibling is the same DSP engine with a smaller control surface, and the app copies that split: the DSP (biquad EQ, compressor, limiter) and the audio plumbing are their own modules; the Tkinter control panel is just one view bolted onto them. A web UI could replace it without touching the audio path.
The console runs its chain on an FPGA for a fixed ~0.7 ms of latency, and charges accordingly. This app accepts software buffer latency in exchange for being free and fully hackable — and compensates at the player instead (more below).
The capture trick
Windows doesn’t let an app casually sit between another app and the speakers, so the routing goes through a free virtual audio device (VB-CABLE). The movie player’s output is pointed at the cable’s input; the app captures the cable’s output, processes, and plays to the real speakers. Capture and playback are different devices by construction, which is also what prevents a feedback loop.
The per-app version of this is the genuinely useful one: Windows’ volume mixer can route just the movie player into the cable while Discord and system sounds stay on the normal output. Only the film gets the treatment.
The controls that matter
The headline control is Dynamic Boost — a 0–100 macro that drives the compressor, pulling loud peaks down and lifting quiet dialogue up. That single knob is the actual fix for jumpy movie dynamics. Around it: Clarity (a presence + air shelf for dialogue intelligibility), Bass Boost, mid/side stereo widening, a light Ambience, a 10-band graphic EQ with a live response curve and a high-pass that kills explosion rumble, and a brickwall limiter as the safety net so no transient can ever blow past the ceiling.
Presets cover the obvious cases (Night - gentle, Dialogue boost, Cinema, Heavy - late night, Off), and there’s one design touch I’m pleased with: the moment you move any control, the preset flips to Personal and your settings autosave to disk. Next launch picks up exactly where you left off, and auditioning a built-in preset never overwrites yours. Set-and-forget is completed by a start-with-Windows toggle and auto-run on launch.
The honest limits
This is a prototype, and three trade-offs are worth stating plainly.
Latency. The audio takes a detour through a Python process, so it lags the video by a few tens of milliseconds. In practice you nudge the player’s A/V offset once (VLC does this in ~50 ms steps from the keyboard) and forget about it; a smaller block size buys less latency for more CPU.
Drift. The virtual cable and the speakers run on different clocks, so a tiny, rare click is possible over very long playback. A future version could resample to correct it; movie-length sessions haven’t needed it yet.
One band. It’s a single-band compressor, not multiband. For movies that’s plenty; mastering engineers may avert their eyes.
The principled alternative to all three is an in-pipeline driver like Equalizer APO, which processes inside the Windows audio stack with no added loopback latency. If lip-sync ever bugs me more than the dynamics did, that’s the fallback. The trade as built buys me a UI I completely control and DSP I can read and modify — which, for a project that exists partly to be understood, is the point.
— Luke Simmons, Auckland