fix: close round-2 review findings — Critical silent-note bug plus majors/minors
Fixes the 2-point spline-EG early-free bug causing silent fade-ins, the pitch/filter enable-toggle Trigger-forcing hole, the contour-node/marker pixel shadow, missing deck-residue test coverage, and stale comments in knob_deck and spline_edit.
This commit is contained in:
@@ -186,12 +186,18 @@ private:
|
||||
if (ampSplineCur_.active() && playMode_ == PlayMode::Trigger) {
|
||||
// A contour covers the sample end to end, so the head leaving the span IS the end of
|
||||
// the note — the exhaustion path in advanceFrame is what frees the voice. A contour
|
||||
// that flatlines at 0 across its FINAL segment is a permanent terminus (no later
|
||||
// segment to rise out of), so that case frees early too, the spline analogue of a
|
||||
// staged AHD's finished() — mid-contour dips do not, since the spline is deliberately
|
||||
// whose TERMINAL value (the final segment's right endpoint) is 0 reaches a genuine
|
||||
// permanent terminus early, the spline analogue of a staged AHD's finished(). Gating
|
||||
// on the terminal value, not just the segment index, matters because a 2-point
|
||||
// contour IS a single "final" segment from frame 0 — checking onFinalSegment() alone
|
||||
// would call a contour that STARTS at 0 (e.g. a fade-in) over before it ever rises.
|
||||
// Mid-contour dips through 0 still don't free early, since the spline is deliberately
|
||||
// not globally monotone.
|
||||
amp = ampSplineCur_.eval(splinePhase());
|
||||
if (amp == 0.0 && ampSplineCur_.onFinalSegment()) amplitudeDone_ = true;
|
||||
if (amp == 0.0 && ampSplineCur_.onFinalSegment() &&
|
||||
ampSplineCur_.terminalValue() == 0.0) {
|
||||
amplitudeDone_ = true;
|
||||
}
|
||||
} else if (playMode_ == PlayMode::Gate) {
|
||||
amp = env_.tick();
|
||||
if (env_.finished()) amplitudeDone_ = true;
|
||||
|
||||
Reference in New Issue
Block a user