Stoatworks Labs

Contourtonist

Equal-loudness EQ that tracks the room

Field testingv0.1.1Plugin & ModuleC++ / JUCE
Contourtonist — Equal-loudness EQ that tracks the room
The standalone tracking a room 12 dB below its reference: the measured level, the loudness level it maps to, and the resulting curve rising to +6.35 dB at 20 Hz and passing through exactly 0 dB at 1 kHz.

What it does

A mix balanced at 100 dB and reproduced at 88 dB has not simply got quieter. Hearing is less sensitive at low frequencies at low levels, and strongly so, which is exactly what the ISO 226:2003 equal-loudness contours describe. Contourtonist takes the contour at the reference level, takes the contour at the measured level, and applies the difference. When a noise limit pulls the show down 8 dB, the bass does not leave with it.

At 1 kHz the contour passes through the loudness level by definition, so the correction is identically zero there. The curve can only ever change tonal balance, never level — that is arithmetic rather than a convention, and it is what keeps a system EQ from quietly becoming a slow automatic fader.

A plugin cannot open the measurement microphone itself, because the host owns the audio device. So the standalone owns the microphone and the calibration and publishes the level over UDP, and plugin instances subscribe — one microphone driving every instance in the rig.

  • 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.1.0, macOS only for now — the Windows guest build failed and was not held for. Seven test suites pass, auval is clean, and the UDP transport is tested over real sockets; the filter bank's accuracy and stability are measured across 6080 fitted sections rather than assumed. It has been loaded and used inside REAPER, but not in a live environment, and the acoustic end of it has still met no hardware: no reference sound level meter, no acoustic calibrator, no XL2, no PA and no show. The calibration path is arithmetic that has never had a calibrator connected to it. Two limits are stated rather than hidden — ISO 226:2003 is only validated from 20 to 90 phon, which excludes live show levels, so the default extrapolates past that range and says so; and the built-in weighting filters lose accuracy above 10 kHz at 44.1 and 48 kHz, which is irrelevant to the compensation and not irrelevant if you are logging dB(A) for compliance.

Watch it running

Contourtonist video thumbnail

Nothing loads from YouTube until you press play.Watch it there instead