Contourtonist
Equal-loudness EQ that tracks the room

What it does
A mix balanced at 100 dB and played back at 88 dB hasn't just got quieter. Hearing is a lot less sensitive to low frequencies at low levels, which is what the ISO 226:2003 equal-loudness contours describe. Contourtonist takes the contour at the reference level and the contour at the measured level, and applies the difference. So when the noise limit pulls the show down 8 dB, the bass doesn't go home with it.
At 1 kHz the contour passes through the loudness level by definition, so the correction there is zero. The curve can only ever change the tonal balance, never the level. That follows from the arithmetic, and it's what stops a system EQ turning into a slow automatic fader behind your back.
A plugin can't open the measurement mic itself, because the host owns the audio device. So the standalone app owns the mic and the calibration and publishes the level over UDP, and the plugin instances subscribe to it, which means one mic drives every instance in the rig.
There's also a browser demo running the plugin's own DSP compiled to WebAssembly: the same ISO 226 model, controller and filter bank, checked against a native build of the same sources. It doesn't have a microphone, so an on-screen system fader stands in for the room. The rate limit, hysteresis and gain ceiling you see are how the plugin behaves, and the acoustic feedback loop is the one thing it can't show you.
- ISO 226:2003 contour difference, with the coefficients transcribed from the standard and checked against it by the test suite
- Zero added latency — the curve is fitted onto 16 minimum-phase biquads, to a measured 0.44 dB worst case at the 12 dB ceiling
- Level over UDP from the standalone, or from any meter at all via a deliberately trivial text protocol that nc can speak
- Parsers for NTi XL2 responses and datalogger CSV, including European semicolon and decimal-comma exports
- A control loop built to be safe across a live output: rate limiting with no exceptions, hysteresis, a gain ceiling that scales rather than clips the curve, and a bounded tracking range so an unplugged microphone cannot demand maximum boost
- Fails to flat — on signal loss the curve holds, then releases to the sound the system was tuned for
Where it stands
Released at v0.2.2, which rate-limits the Reference control as well as the measurement, so dragging the reference level can't step the whole curve in one go any more. v0.2.1 only changed the Windows installer, which no longer touches the system PATH (the earlier one could overwrite it). There are installers for macOS, Windows and Linux; the Windows and Linux builds, which the first release couldn't produce, arrived in v0.1.1. Seven test suites pass, auval is clean, the UDP transport is tested over real sockets, and the filter bank's accuracy and stability are measured across 6080 fitted sections. It's been loaded and used in REAPER, but not live, and the acoustic end of it still hasn't met any hardware: no reference sound level meter, no acoustic calibrator, no XL2, no PA and no show. The calibration path is arithmetic that's never had a calibrator plugged into it. Two limits worth knowing about. ISO 226:2003 is only validated from 20 to 90 phon, which doesn't reach live show levels, so the default extrapolates past that and says so. And the built-in weighting filters lose accuracy above 10 kHz at 44.1 and 48 kHz, which doesn't matter for the compensation and matters a lot if you're logging dB(A) for compliance.
Watch it running
Nothing loads from YouTube until you press play.Watch it there instead