
I have been building the same music library since I was a teenager, and it shows.
There are pub bands on it — actual bands, in actual pubs, recorded by someone’s cousin. There are buskers I liked enough to hunt down. There are CDs I bought off support acts at the merch table, half of whom never troubled a streaming service and never will. There is an almost-complete collection of The KLF, a band so committed to standing alone that they deleted their own back catalogue in 1992 and set fire to a million quid for an encore — music you genuinely cannot find in a tidy, mastered, modern form anywhere, because they made sure of it.
I love all of it. But here is the thing about music assembled over thirty years from every corner of the world: it is recorded at every volume known to engineering. The pub band is a whisper. The remastered pop single is a wall. And when you press shuffle, they come at you one after another, at random, with no warning.
You know the dance. A quiet track comes on, so you nudge the volume up to hear it properly. The next track is a brick-walled banger and it takes the top of your head off. Down goes the dial. Track after that is a demo someone recorded in a shed, so up it goes again. On speakers it’s annoying. On headphones it is genuinely unpleasant — there’s nowhere for the loud one to go but straight into your skull.
For years my thumb never really left the volume control. And when I got tired of that, I did the worse thing: I started skipping. Skipping tracks I actually liked, purely because I couldn’t face the volume lottery of finding out how loud the next one would be. That’s the moment that finally got me — when I realised the fiddling had quietly talked me out of listening to my own music. The volume knob was winning.
So I built Ballast.
The obvious way to get at everything your Mac is playing is to install a virtual audio driver — a fake output device that intercepts the sound, hands it to an app to muck about with, then passes it on to your speakers. It’s how the serious tools do it, and it works. It also means installing a system component you have to approve, possibly reboot for, and then live with forever, squatting in your Sound settings whether the app is running or not.
I did not want to ship that. A free little utility has no business re-plumbing your Mac.
Happily, I didn’t have to. A while back macOS quietly grew Core Audio process taps — Apple’s own, built-in way to read the system audio mix without any of that. Nothing to install, nothing added to your Sound settings, no driver, no router. Ballast puts a (muted) tap on the mix, does its work, and plays the result back through whatever output you were already using. Quit the app and it’s gone without a trace, because there was never anything installed to leave behind. Your chosen output stays chosen. There is nothing to route.
That was the first thing I got right. Most of what followed, I got wrong at least once.
My first instinct was to ride the volume live — hear it get loud, pull it down; hear it go quiet, push it up. A compressor, essentially, or an automatic gain control.
It works, and it sounds dreadful, because it flattens the music. The whole soul of a good recording is the swing from quiet to loud — the hush before the chorus, the drop, the breath. A live gain-rider squashes exactly that, and everything comes out as the same lifeless, even mush. I’d have made my music quieter and worse.
The mistake was aiming at the wrong target. The problem was never the dynamics within a track. It was the mismatch between tracks.
So: don’t compress. Normalise. Work out how loud a whole track actually is — as a human ear perceives it, not as a naive peak meter sees it — and apply one gentle, fixed adjustment across the entire thing, leaving every quiet-to-loud swing completely intact.
Measuring perceived loudness is, thankfully, a solved problem. There’s an international standard for it — EBU R128 / ITU-R BS.1770, the LUFS scale that streaming services and broadcasters use to stop the adverts being louder than the programme. Same maths. Ballast steers every track toward one comfortable target and leaves its insides alone.
Except — and this is the wrinkle that cost me the most sleep — you cannot know a track’s true loudness until you’ve heard it, and the loudest moment might be the final chorus. You can’t normalise the first second correctly until you’ve heard the last.
The answer was to stop pretending I could get it perfect on first listen, and to let Ballast remember instead.
The very first time it meets a track, it does the best it honestly can, live — anchored to the loudest thing it’s heard so far, so nothing suddenly blasts you. But it’s also measuring the whole track properly as it plays, and it files that reading away under the track’s identity. The next time that track comes round, Ballast recognises it and applies one exact, fixed adjustment from the very first sample — no ramp, no guessing, no compromise. The more you listen, the more of your library it simply knows, and it keeps quietly re-checking its own numbers as you go, so a library assembled over thirty years slowly sorts itself out in the background while you get on with enjoying it.
There was one last piece of stubbornness in me — and this is the one I ended up talking myself out of. For a while, whenever Ballast met a new track, it would narrow its listening to only the music app while it took the measurement, walling off any stray notification that might skew the number. Clever. Also, it turned out, needless: measure a whole track and the odd interruption averages away to nothing, and every later play quietly corrects the figure anyway. Worse, the trick had a cost — switching what it listened to left a faint seam you could hear at the edge of every new track. So I pulled it out. The very first measurement of a track is a hair less pristine now, and not one of us will ever hear the difference. Track changes still come from the same public notifications Apple Music and Spotify broadcast, so it stays in step even across a gapless album.
I could tell you it all worked first time. It did not.
The first night I left it running unattended, it decided that a track fading gently to silence was a broken audio tap, and cheerfully rebuilt its whole audio graph eleven times in under a minute — every time a song got quiet. Teaching it the difference between a fade (a slow, graceful sink into silence) and an actual fault (an abrupt cliff to dead zero) was an entire afternoon of its own. That’s the unglamorous reality of something meant to run silently in the background for hours and never once get in your way: most of the work is in the failures nobody will ever see.
A few days ago I wrote about an afternoon I spent failing to animate a dancer, and I signed off by saying she lived “at the quiet edge of a bigger project I’m not ready to talk about yet.”
This is the project. She was hiding in a loudness normaliser the whole time.
Ballast has a real-time music visualiser — six styles, the smoke-and-shadow Dancer among them. Because it rides the same audio tap that does the levelling, it reacts to anything playing, not just your music app. It started life as a debugging toy: a way to actually see the levels moving while I chased bugs. It got completely out of hand, as these things do, and now it’s one of my favourite parts.
Ballast is free, there’s no telemetry, and nothing you play is ever recorded, stored, or sent anywhere — it measures your audio on your Mac, in the moment, and the only thing it ever writes down is a small list of how loud your tracks are.
Set the volume once. Put on the remastered single, then the pub band, then a support-act CD nobody else on earth has a copy of. Let it shuffle.
And take your thumb off the dial.