scripts/xa-tempogram.js — Tempogram heatmap of a tempo jump

8 s of 100 BPM clicks then 8 s of 140 BPM clicks (sr 22050, hop 512) through the canonical onset_strengthtempogram() (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…

x: 0 → 16 s · y: tempo (BPM, lag-reciprocal axis) · white dots: per-frame prior-weighted argmax ridge · dashed lines: 100 / 140 BPM