fix(pitch_shift): re-anchor fadePos_ on freeze so gNew is continuous at the freeze frame; guard left cast; add step-detector + loop-never-freezes regression
This commit is contained in:
@@ -1318,6 +1318,16 @@ static void testPreserveGateStereoLoopComposes() {
|
||||
}
|
||||
CHECK(maxL > 0.05);
|
||||
CHECK(maxR > 0.02); // R present (half amplitude), distinct from L -> stereo preserved
|
||||
// Loop-never-freezes regression: the Preserve voice must NOT spuriously freeze when the
|
||||
// read tap hits the sample end and the loop wraps it back. A spuriously frozen voice
|
||||
// stops writing to the ring and the looped tail would go silent past the sample end.
|
||||
// Check a block far past the sample end (sample = 400 frames; window = 512; well past
|
||||
// any single-pass tail region) to catch any wrap-before-exhaustion ordering error.
|
||||
double maxLFar = 0.0;
|
||||
for (std::size_t i = 1800; i < 2000; ++i) {
|
||||
if (std::fabs(left[i]) > maxLFar) maxLFar = std::fabs(left[i]);
|
||||
}
|
||||
CHECK(maxLFar > 0.05); // still alive at frame 1800 (4.5× the 400-frame sample length)
|
||||
}
|
||||
|
||||
// --- Preserve voice cap: a Preserve note-on past the cap is dropped; Varispeed unaffected. ---
|
||||
|
||||
Reference in New Issue
Block a user