Γ-W1-T5 remediation: narrow the rate-bound claim, fix baseline/measurement provenance, correct §2.4 framing

Re-derives the splice-cadence inequality and adds a corner probe that FAILS at
P=500 by design, pending a ruling. Names the baseline commit and harness edit,
fixes measurement methodology, corrects the Trigger-AHD/rate coupling framing.
This commit is contained in:
2026-08-01 20:07:59 -04:00
parent 589a8e078b
commit ae59e9b70d
5 changed files with 196 additions and 49 deletions
+16 -7
View File
@@ -11,13 +11,22 @@
namespace reasampler::instrument::engine {
// The playback rates the Preserve DSP is measured over, and therefore the only ones it
// accepts. Two independent reasons they are here and not wider:
// - the ceiling is what bounds a voice's per-output-frame feed loop (kMaxFeedPerFrame source
// frames), which is the RT-safety argument for feeding a variable count at all;
// - the splice search can only align a period it can see. The tap's delay drifts at
// |rate - shift| per frame, so a wide rate over a deep DOWN-shift splices faster than one
// period of the output tone and the correlation stops holding the pitch: measured at rate
// 4.0 with -24 st, the observed period came out 539 frames against 785 wanted.
// accepts. The ceiling also bounds a voice's per-output-frame feed loop (kMaxFeedPerFrame
// source frames) — the RT-safety argument for feeding a variable count at all.
//
// This range NARROWS the splice-cadence failure onto the source fundamental; it does not
// eliminate it. A splice recurs every `window / |rate - shift|` output frames (the tap's
// delay drifts across one window at that per-frame rate); the shifted tone's own period is
// `sourcePeriod / shift` output frames. Whenever the recurrence interval is shorter than
// that period, a splice lands inside a single perceived cycle and the correlation search
// has less than one period to align against. Measured at rate 4.0, shift 0.25 (-24 st):
// interval 2205/3.75 ~= 588 vs period ~4*P ~= 785 frames (P ~= 196) — matches the originally
// observed 539-vs-785 failure. This range's ceiling (2.0, not 4.0) raises the safe floor, it
// does not remove it: at rate 2.0, shift 0.25, interval = 2205/1.75 = 1260 still fails for
// any source period P > 315 frames (~140 Hz at 44.1k) — inside bass/low-vocal material, and
// -24 st is reachable from the Pitch knob alone. (The pre-stretch rate-1.0 engine's floor by
// the same inequality is P > 735, ~60 Hz — what this range raises the floor from, not what
// it removes.)
inline constexpr double kStretchRateMin = 0.5;
inline constexpr double kStretchRateMax = 2.0;
inline constexpr int kMaxFeedPerFrame = 2; // ceil(kStretchRateMax)