Γ-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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user