IfritisZandClaude Opus 4.8 68f9bc5fad fix(audio): BackingLeveler = per-song trim, not a running AGC (song dynamics)
The v1 BackingLeveler tracked SHORT-TERM (400 ms) loudness with a ~300 ms
gain follower and +/-24 dB authority. That re-converges on every musical
section: quiet verses got boosted toward -12 LUFS and loud choruses pulled
down, flattening the song's own macro-dynamics, and loud->quiet transitions
left the gain low for a beat (reported as "the song suddenly plays quiet,
then swells back up").

Simulated on a synthetic song (10 s verse -20 / 10 s chorus -9 / 10 s
verse -20, 11 dB of real contrast): the v1 gain swung 11.1 dB between
sections -> the player hears 0.0 dB of verse/chorus contrast. Loudness
normalization should behave like a per-track gain (Spotify-style), not a
compressor.

v2 keeps the K-weighted measurement but accumulates INTEGRATED loudness
(gated < -50 LUFS so silence/count-ins don't dilute it) and slews the
make-up gain with a rate limit: up to 6 dB/s while the measurement is
young (first ~8 s of signal, inaudible at song start) then locked to a
0.25 dB/s creep. Authority reduced +/-24 -> +/-12 dB. The -1 dBFS
brickwall stays for boosted peaks. Same RT-safety (no allocation), same
prepare()/reset-on-load semantics, same call signature - no changes
outside this header.

Same simulation with v2: 7.3 dB of contrast already preserved at the
first chorus, converging to fully static (all 11 dB) as the measurement
matures over the song.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 12:45:28 -04:00
2026-06-16 18:48:12 +02:00
2026-06-16 18:48:12 +02:00
2026-06-16 18:48:12 +02:00
2026-06-16 18:48:12 +02:00
2026-06-16 18:48:12 +02:00
2026-06-16 18:48:12 +02:00
2026-06-16 18:48:12 +02:00
2026-06-16 18:48:12 +02:00
2026-06-16 18:48:12 +02:00
2026-06-16 18:48:12 +02:00
2026-06-16 18:48:12 +02:00
2026-06-16 18:48:12 +02:00
S
Description
No description provided
AGPL-3.0
2.8 MiB
Languages
C++ 52%
TypeScript 18.6%
JavaScript 17.9%
Shell 7.3%
CMake 2.4%
Other 1.8%