Close derived-bake-window review findings: NaN-guard remaining wire doubles, pin Trigger-span agreement, retire dead quantizer
Guards params_payload.cpp's filter-tail seconds and both keyTrack sites against NaN; pins Voice::start's Trigger-span formula against trigger_seam; retires unused shortestDivisionAtLeast.
This commit is contained in:
@@ -1380,6 +1380,34 @@ static void testTriggerEdgeCases() {
|
||||
}
|
||||
}
|
||||
|
||||
// --- Trigger out-of-domain lengthFraction: Voice::start's inline copy of trigger_seam's
|
||||
// formula (map/trigger_seam.h) must clamp the same way the shared formula does — a
|
||||
// frac > 1.0 never plays past the post-start span, and a NaN frees immediately rather than
|
||||
// reaching the round()/static_cast<int64_t> undefined on a non-finite value. Pins the second
|
||||
// implementation directly; test_trigger_seam.cpp pins the first.
|
||||
static void testTriggerFracAboveOneClampsToSpan() {
|
||||
// 150% length on a 200-frame sample -> clamped to the full 200-frame post-start span,
|
||||
// not 300 frames (which would read off the end of the PCM).
|
||||
SampleData km = (triggerSample(200, 1.5, 0, 0));
|
||||
VoiceEngine eng(1, km);
|
||||
eng.noteOn(60, 127);
|
||||
std::vector<AudioSample> out;
|
||||
eng.render(out, 220);
|
||||
for (std::size_t i = 0; i < 200; ++i) CHECK(out[i] > 0.5f);
|
||||
for (std::size_t i = 200; i < 220; ++i) CHECK(approx(out[i], 0.0, 1e-6));
|
||||
CHECK(eng.activeVoiceCount() == 0); // frees exactly at frameCount
|
||||
}
|
||||
|
||||
static void testTriggerFracNaNFreesImmediately() {
|
||||
SampleData km = (triggerSample(200, std::nan(""), 5, 5));
|
||||
VoiceEngine eng(1, km);
|
||||
eng.noteOn(60, 127);
|
||||
std::vector<AudioSample> out;
|
||||
eng.render(out, 50);
|
||||
for (float v : out) CHECK(approx(v, 0.0, 1e-6));
|
||||
CHECK(eng.activeVoiceCount() == 0); // playLen 0 -> frees at start, no sound
|
||||
}
|
||||
|
||||
// --- Trigger ignores note-off (S15): the one-shot plays through regardless. ---
|
||||
static void testTriggerIgnoresNoteOff() {
|
||||
SampleData km = (triggerSample(200, 0.5, 0, 0));
|
||||
@@ -2908,6 +2936,8 @@ int main() {
|
||||
testTriggerLengthWithStart();
|
||||
testTriggerAhdFadeShape();
|
||||
testTriggerEdgeCases();
|
||||
testTriggerFracAboveOneClampsToSpan();
|
||||
testTriggerFracNaNFreesImmediately();
|
||||
testTriggerIgnoresNoteOff();
|
||||
|
||||
// S16 — pitch engine + pitch envelope.
|
||||
|
||||
Reference in New Issue
Block a user