I’ve been creating DIY music for a long time, since I was in high school. The technology has changed a lot, from first recording music on tapes and the rare .mp3 file with Sonar Mellowship and Carl Consumer and the Red White and Blue Torpedos to gaining experience with Logic Pro with Holistic Wellness. As a non-professional, DIY music maker and mixing/mastering amateur, I’ve had to do a lot of reckoning with quality of a finished product and the essence of punk rock. “Welp, that’s the recording we paid $0 for”, to “Yeah, so what, it sounds like shit, that’s rad!” to “Actually, I’ve made it sound purposefully bad and flat and noisy on purpose.” There’s a lot of sonic latitude here and some of my favorite recordings on earth have some wildass sonic metrology to them.
This past February (2026), I decided to do the RPM challenge again. I have done it before, mostly with my graduate-school-era “Nanopunk” solo band _11:34. There’s a lot of great things about the challenge, which is to create 10 songs or 35 minutes of original music, start to finish, in the month of February. You have to mix and master it yourself, as well as create the design for your album cover. This had been a mainstay of my life in 2008-2012 while living in Albany, NY, and I’ve convinced some of my friends to do it alongside me (or help me with my own project) too. Possibly the best thing about this challenge is that if you finish it, you have something real, tactile, and forever. It might be rushed and suboptimal-sounding on airpods, but it is yours. THe other thing is that it forces you to have some grit. If you don’t know how to do something and you’re under a time crunch, there’s a real force pushing you to figure it out via google or talking to someone, or abandoning it, and those decisions don’t have the luxury of time.
What I had planned to do this year was something I had wanted to do for quite some time: to make a punk album with lyrics entirely in Yiddish. To spoil the ending a bit, life happened, I realized I would rather have this record be actually fucking good instead of rushed, and so I DNF’d the challenge, but I had 10 robust songs with lyrics and instrumentation all recorded by the 28th, including scratch vocals on 8 songs and finished vocals on about 4 (by the way, I was doing a lot of screaming and I had not built enough recovery time into my schedule). Along the way, I used Claude Code to set up an osascript batch bouncer for Logic to bounce all my tracks in a folder (mp3 and wav), free of human intervention. This is most certainly a “work” task rather than a “gym” task I don’t get anything out of it, it’s just clicking buttons over and over and not making any mistakes. There are accessibility tools to automate this, since having to manually bounce umpteen songs is annoying and I’d rather be playing/tweaking my music and plugins or improving my mixes. Improving mixes is a progressive task for a hobbyist. It always involves listening to songs over and over again and tweaking until it sounds just right. There’s no true substitute for the ear. Or is there?
Just kidding, there really isn’t. But still, part of me wondered whether I could accelerate the process; watching loudness metering in Logic Pro while staring at goniometers sure dials you in to a lot of sonic character. But one of the better tests I’ve found through my experience as a DIY producer was a simple one: listen to the track at medium-high volume in a car stereo inbetween other songs that you are “aiming for” as a sound reference. In most of my mixes and masters since 2012, I’ve chosen “Map Ref 41°N 93°W"" by Wire (from 154) or “Alan” by Self Defense Family as references in a DAW, but on the car stereo it can kind of be whatever you want. The fact that I was making an album of 10 songs meant that I had room to play around a little.
I live in Midtown Manhattan and don’t have a car. But my partner Kimia and I were planning to rent one the last week of February so that I could drop her and some folks off in the catskills for a bachelorette party and then travel up to Albany to see my Aunt for a couple days. Kimia ended up getting sick with a horrendous cough, but I still went, and had some time on the way up to Albany to listen to my new project “like the DIY pros do”.
However, on the car stereo, it sounded terrible. Passable for stripped-down DIY glitchy synthy aggresive punk in airpods and studio headphones, next to everything else my mixes were bogus. I knew they weren’t mastered yet, but I could tell that, among many other things: my low-frequency roll off was too aggressive and applied to far too many tracks, the compression on the guitars was too high, especially the leads; everything was getting squashed, there was too much “sparkle” on some of the synths and definitely the vocals, the de-esser wasn’t strong enough, I had noticed a guitar track that sounded out of tune. After listening to the album and some intermixed reference tracks, I had decided to put on Fountains of Wayne, as one of the bachelorette-party-goers had a friend with an interesting theory that FoW was political music for the dreary lives of middle managers commuting to New York from Jersey. I had not approached that band’s work with that particular theoretical angle, not in the slightest, so I was interested to engage with it. But still something deeper lingered: I could not in good conscience release this Yiddish punk album if it sounded this bad. I needed more tools.
After I settled into my Aunt’s house in Albany for the night, I had to know if there was a command line tool that would speedrun through a directory of .wav files- but it didn’t seem so. Maybe I didn’t look hard enough. That would be embarassing. Oh well. I cracked open Claude Code and fired up superpowers. I defined the spec, nitpicked the implementation plan, and several iterations later, I was happy with the result. I’m not sure how I estimated how much usage it required, but my guess would be ~35% of a 5x Max plan weekly limit, with about 3 maxed-out sessions that weekend and a little more when I got back home. Greasing the wheels of course was that I was using Tailscale, an S-tier product in every measure, to connect my laptop back to the mac studio at my desk via ssh.
What I came up with was Bounce House. Simply put, this is a python-based audio analysis tool that tells you what’s wrong with your mix and offers some suggestions on what to do about it. Even on the first iteration I was duly impressed, and I kept adding more metrics and capabilities like plumbing the result to JSON files, adding explanations of various metrics, having a mix vs master setting, and so on. Bounce House is very opinionated, this is for certain, and I tried to strike a balance between “industry standard” and “this is just acoustics and physics, bro”. On release, it measures 26 metrics across 5 analysis modules. It’s considerably faster than playing the track end-to-end, plus, you get a report for each song computing its averages. I originally thought about making it in Rust, but some of the library support just wasn’t quite there yet. I’m open to an eventual re-write once it is.
At its core, Bounce House is a pipeline, much like many other data pipelines I’ve created for work: here, we load a .wav file, run it through a stack of analyzers, apply rules,
check for patterns, and spit out a report. Each analyzer is its own module. Loudness does EBU R128 via pyloudnorm (that’s the ITU-R BS.1770 standard, the same one Spotify and
Apple Music use to normalize a track), spectrum uses librosa to decompose your mix into seven frequency bands from sub-bass to brilliance, stereo does mid/side decomposition and phase
correlation (really important for mono compatibility- if your mix falls apart on a single Bluetooth speaker, this is what catches it) perceptual estimates of brightness and
warmth, and tuning checks if your concert A is actually 440 Hz. The analyzers are stateless in that they take audio in, return a dict of metrics,
and don’t care about each other. That’s exactly what it’s designed to do. It means you can run just bh loudness mix.wav if that’s all you need, or let bh analyze
run the full stack of tools.
The part I’m most proud of is the diagnostic engine. Individual metrics are useful and having a readout of them is quite nice, but mixing problems are rarely one-dimensional: a “muddy mix” isn’t just a low spectral centroid, it’s a low centroid plus high warmth plus low-mid energy buildup (CC offered this in an explanation but I had to look it up, and sure enough, it’s pretty right-on). So Bounce House has nine diagnostic patterns that combine evidence across modules using soft-AND logic: a pattern fires when enough of its conditions match, not all of them. This means a single borderline metric won’t trigger a false alarm, but when two or three things point in the same direction, you get a named diagnosis (“Over-Compressed,” “Mono Incompatible,” “Streaming-Unfriendly”) with specific advice on what to fix. The rules and patterns are data objects and not code, so if you wanted to add a new diagnostic, it’s adding a dict entry instead of writing a new function (well… within some limits).
Bounce House takes about 3 minutes to run on a directory containing ~35 minutes of .wav files. Here’s a sample of what the output looks like for a single track:
Sample output (click to expand)
════════════════════════════════════════════════════════════
BOUNCE HOUSE — Master Analysis Report
/Users/Abe/Music/Bounces/RPM2026-demos/Scrollin Around.wav
(44100 Hz, stereo, 3:39)
════════════════════════════════════════════════════════════
── Loudness & Dynamics ────────────────────────────────────
Integrated LUFS -13.6 PASS
Loudness Range +1.8 FAIL
Sample Peak -0.1
True Peak -0.1 FAIL
RMS Level -17.2
Crest Factor +17.1 PASS
PLR +13.5 PASS
── Spectral Balance ───────────────────────────────────────
Centroid 2,459.3 Hz
Bandwidth 2,638.6 Hz
Rolloff (85%) 4,425.9 Hz
Flatness 0.0022
sub-bass 32.3 dB
bass 29.4 dB
low-mid 23.3 dB
mid 18.5 dB
upper-mid 15.7 dB
presence 9.4 dB
brilliance -8.1 dB
── Stereo & Phase ─────────────────────────────────────────
Phase Correlation 0.5344 PASS
Mid RMS -18.3
Side RMS -23.5
M/S Ratio +5.2
Stereo Width 0.3554
Balance +0.4 PASS
Min Block Corr -0.1881 WARN
Frequency-dependent correlation:
sub-bass +0.978
low-mid +0.727
mid +0.354
upper-mid +0.130
air +0.083
── Perceptual Quality ─────────────────────────────────────
Brightness 0.0394
Warmth 0.1584
── Tuning & Pitch ─────────────────────────────────────────
Tuning Deviation +3.0 cents PASS
Concert Pitch 440.8 Hz
Closest Standard A=441
Pitch Drift (std) +4.0 cents
Pitch Drift (range) +27.0 cents FAIL
Pitch Trend +1.0 cents
Chroma Sharpness 0.0940 FAIL
── Suggestions ────────────────────────────────────────────
FAIL True peak is -0.1 dBTP — risk of inter-sample peaks
on codec conversion, add a limiter ceiling at -1.0 dBTP
FAIL Loudness range is 1.8 LU — extreme dynamics, review
compressor/limiter settings
FAIL Pitch stability: 27.0 cents range — significant drift,
re-record or apply pitch correction
FAIL Chroma definition: 0.09 — very diffuse pitch content,
check intonation
WARN Minimum block correlation is -0.188 — some sections
have near-zero or negative correlation
── Mix Diagnostics ────────────────────────────────────────
WARN Muddy Mix — Low-mid buildup causing muddy mix
Cut 2-4 dB in the 200-500 Hz range. Check for
overlapping bass, guitar body, and vocal chest
resonance. Use a high-pass filter on non-bass
instruments to remove unnecessary low-mid energy.
WARN Detuned Mix — Possible tuning issues — pitch
instability or non-standard tuning
Check instrument tuning against a reference. If
pitch drifts over time, re-record or apply pitch
correction. If the concert pitch is intentionally
non-440, this warning can be ignored.
FAIL Streaming-Unfriendly Master — Master too hot for
streaming platforms
Spotify normalizes to -14 LUFS, Apple Music to -16 LUFS.
Your track will be turned down, and the aggressive
limiting will be audible. Consider mastering to
-9 to -12 LUFS with a -1.0 dBTP ceiling. The
quieter version will actually sound better after
platform normalization because it retains more dynamics.
I think some real go-forwards here would be the ability to differentiate between song sections (verse - chorus - etc) and create sub-analyses for those, I’m not 100% sure I trust the pitch drift here until I do some more experiments with it, and I wonder the extent to which vocals modifies these properties. It might be worth trying it with and without vocals to observe the difference. Also, I’m not really singing, I’m yelping and/or screaming, which makes aggressive genres more challenging to parse. If this all sounds interesting to you, try it out and tell me what you think!
I’m probably going to continue using this and workshopping it a little more as I finish my lil’ Yiddish punk project. I’m excited about trying to figure out how it fits into my mixing and mastering workflow especially as I get closer to the finish line. I still havent corrected my EQ from these demo tracks yet, I still need to hire a translator (for spot checks) and an illustrator to finish the project’s polish, and I still need to figure out the meter of a couple songs left to sing and then actually do them. Recording in an NYC apartment is ass. Maybe I’ll just spring for recording studio time.
A savvy reader might know where to find the demos for this project, but I’m not ready to share it out quite yet. Rest assured I’ll have quite a bit to say about it when I release it.