From c3e7556261ff3beb4757930798733c58eb044e27 Mon Sep 17 00:00:00 2001 From: daniel-c-harvey Date: Fri, 25 Sep 2026 14:31:27 -0400 Subject: [PATCH] Docs: record cross-rate playback; finish SEPT_VERIFY sample-rate checks --- docs/COMPLETED.md | 22 ++++++++++++++++++++++ docs/SEPT_VERIFY.md | 10 ++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/docs/COMPLETED.md b/docs/COMPLETED.md index 5537745..2b3dbf7 100644 --- a/docs/COMPLETED.md +++ b/docs/COMPLETED.md @@ -1811,3 +1811,25 @@ Windows window class, so side-by-side installs could run the wrong channel's cod each channel now registers its own class. Mechanism detail: `src/core/ui/CLAUDE.md` (`window_origin`) and `src/shell/actions/drag_out_win.h`. Not DAW-verified — checks are tracked in `docs/SEPT_VERIFY.md` §4. + +### Cross-rate playback: ReaSampler 9000 plays any file rate at its own pitch and length + +ReaSampler 9000 now plays a sample whose file rate differs from the project rate at its +correct pitch and wall-clock length — previously, e.g., a 44.1 kHz file in a 48 kHz project +played about 1.47 semitones sharp and short. The fix folds a file-rate/host-rate factor +into the read once per note rather than resampling at load; envelope stage times, the +filter, the loop crossfade, the Preserve (time-stretch) engine, and the bake all follow the +same factor (`SampleData::sourceRateRatio`, `play_params.h`; mechanism detail lives in +`src/core/instrument/CLAUDE.md`'s "Two frame domains" section, not restated here). +Same-rate playback at Rate 100% is unchanged, pinned by hashes of pre-change renders. + +Landed in the same merge: a Preserve splice-crossfade fix that also changes output at +matched rate for high Rate settings (~200%+) — a down-splice previously read audio a prior +splice had already overwritten; Daniel approved the change. A file more than 32x the +project rate (`kMaxSourceRateRatio`, `play_params.h`) is refused: the ReaSampler 9000 +editor title shows "... -- , not played" (clearing once another sample loads +or the project rate makes it supported), and a bake refuses with "cannot render: ...". A +project sample-rate change while the plugin is inactive re-stamps in place rather than +reloading from disk. + +Not DAW-verified — checks are tracked in `docs/SEPT_VERIFY.md` §6. diff --git a/docs/SEPT_VERIFY.md b/docs/SEPT_VERIFY.md index 806f0ae..2de9f60 100644 --- a/docs/SEPT_VERIFY.md +++ b/docs/SEPT_VERIFY.md @@ -74,7 +74,7 @@ project rate 48000, unless a check says otherwise. - [ ] Run stable and beta ReaSampler 9000 side by side and open both editors — each works normally, no crash -## 5. Live spline-envelope drags (in progress, Sept 2026) +## 5. Live spline-envelope drags (landed Sept 2026) - [ ] Set the amp envelope to Spline, hold a note, and drag a knot — the sound audibly follows the shape change during the drag itself @@ -90,7 +90,7 @@ project rate 48000, unless a check says otherwise. - [ ] With a note held, add a new point to the spline — audible immediately - [ ] With a note held, delete a point from the spline — audible immediately -## 6. Sample-rate playback (in progress, Sept 2026) +## 6. Sample-rate playback (landed Sept 2026) - [ ] In a 48 kHz project, import a 44.1 kHz file via the Media Explorer into ReaSampler 9000; play its root note — same pitch and length as the file auditioned in the Media Explorer. Repeat in @@ -105,3 +105,9 @@ project rate 48000, unless a check says otherwise. - [ ] Existing projects that used mismatched-rate samples WILL sound different now (correct pitch) — reopen one and confirm it's the expected change - [ ] Same-rate samples sound exactly as before +- [ ] In Preserve mode at matched rate, set Rate to ~200% — sounds clean (this changed with the + splice-crossfade fix; confirm it's an improvement, not a regression) +- [ ] Load a file more than 32x the project rate (e.g. a 384 kHz file in an 11.025 kHz project, if + one is available) — the editor title shows the refusal message, the sample plays silent, the + message clears when another sample is loaded, and a bake shows "cannot render" +- [ ] The refusal text is not truncated at the default editor width