What's Changed
The sample-rate-truth release: the keylock chain is now time-true at every device rate, and downbeat election finds beat one on the kick. Available on crates.io.
The keylock chain is time-true at every sample rate
The chain's frame-domain tuning was fixed at 44.1 kHz values, so on builds at higher device rates every window, trigger, and fade described half (96 kHz) or a quarter (192 kHz) of its designed time. Two audible failures at 96 kHz, both found via a DJ host running its deck engines at the device rate:
- The Stage 21 bass corrector's period search bottomed out at ~74 Hz, so a real bass fundamental was unsearchable and the low end flapped between corrected and pitch-follow under a sustained DJ offset.
- The high-band SOLA corrector's correlation window and search range could not align content below ~300 Hz, so low-mid splices landed at random phase — measured: a 150 Hz tone corrected at purity 1.000 at 44.1 kHz vs 0.005 at 96 kHz (muddled, wobbly, "underwater" mids).
Both correctors now scale their reference constants to the build rate at construction, and the chain's nominal lag scales above 44.1 kHz so the 12.7 ms latency contract — and the trigger corridor it anchors — is time-true at every rate (pipeline_latency_frames reports the scaled figure). The transient cursor's retention/lookahead windows scale the same way — unscaled, a 96 kHz build silently dropped onsets while the correctors' masked windows still addressed them. At and below 44.1 kHz everything is bit-identical to the blind-validated behavior. Regression tests pin sub-band correction at 48/96/192 kHz and 96 kHz low-mid purity.
Downbeat election hears the bassline
Reported as a DJ host's auto-cue parking on a snare. Both downbeat electors ranked the four phase hypotheses by flux/onset features, which structurally tie on four-on-floor material (every beat carries an equal kick) — and the log-difference onset actively favors the snare rotation (~+20%). The discriminating feature is sustained low-band energy measured 30–280 ms after the beat, past the shared kick attack, where the bassline emphasizes the true one (+16% measured):
TransientMapgains a per-frame sub-bass energy track, accumulated inside the existing flux FFT pass (no extra transform).- Both electors (accent scorer, rigid-grid rotation) add the energy accent, self-gated by its own cross-beat contrast — flat or percussion-only profiles contribute nothing, keeping confidence margins undiluted.
PREANALYSIS_VERSION/MIN_COMPATIBLE_VERSIONrise to 13, so cached snare-phase downbeats regenerate. Of 5 sampled house tracks, 2 elections changed — both toward the audio-measured bass phase.
Denser peaks, faster loads
- Waveform peaks are 10x denser:
BASE_BUCKETS_PER_SECrises 150 → 1500, so zoomed deck views (~1000 px/s at 1-bar zoom) get near-per-pixel peak data instead of 6–7 px flat-topped buckets. Compute cost is flat (the crossover biquads dominate); the costs are RAM (~26 MB pyramid per 6-min track) and a ~10x larger.tsaPEAK chunk. No format bump: stale cached peaks faildecode_peaksvalidation and recompute while the beat-grid artifact survives. AudioBuffer::resample/resample_sincprecompute the windowed-sinc kernel as a polyphase row table instead of evaluatingsinper tap per output sample: a 5-minute stereo 44.1→96 kHz conversion drops 6.7 s → 0.90 s (7.5x), same cutoff policy and edge renormalization, all resample quality gates unchanged.
Desktop reference app
- The WIDE fader reaches -100% — a CDJ-style post-engine brake resampler glides pitch down from the keylocked pitch (continuous at the keylock floor, ~100 ms vinyl-brake tau), fades to silence, and freezes the playhead at a full stop for exact-frame resume. Along the way, a doc-truth find: the wide chain's real floor is -50%, not the -75% its comments claimed.
- Zoomed and overview waveforms render as interpolated, anti-aliased envelopes (band peaks lerped between bucket centers with coverage AA) over the new 1500 buckets/s pyramid — continuous CDJ-style silhouettes at every zoom, pixel-exact tile seams.
- The README screenshot pipeline is now a repo-root skill; the refreshed shot shows the deck running at +8% keylock tempo.
QA
- The weekly soak gate derives its source-consumption drift bound per profile instead of a shared 2048-frame constant, and a settled-leak gate distinguishes real frame loss from profile-legal transient drift.
Full Changelog: v0.13.0...v0.14.0