8 s of 100 BPM clicks then 8 s of 140 BPM clicks (sr 22050, hop 512)
through the canonical onset_strength →
tempogram() (win_length 192 ≈ 4.5 s, linear-ramp padding,
per-column inf-norm — the exact math the fixture-gated canonical
tempo() consumes). The per-frame argmax ridge (a
log-normal tempo prior, start 120 BPM) must sit in the lag bin bracketing
100 BPM for t ∈ [1, 6] s and the bin bracketing 140 BPM for t ∈ [10, 15] s;
estimate_tempo on each half must land in the same brackets.
Post-repair regression badge: plain 120 BPM clicks estimate inside the
120 BPM lag bracket — the pre-repair raw argmax returned the 60.09 BPM
subharmonic, and fourier_tempogram collapsed a 690-frame
envelope to a single column (now 257 × 691 at hop=1).
All numeric asserts were node-verified against dist before this page was
written (ridge 99.38 / 143.55, estimate_tempo 99.38 / 143.55, 120-click
regression 117.45). tempogram_ratio is an honest
not-implemented throw and stays off the curated surface.
computing…