From edd0b8f04e5c9b1c22f9cab00d2649dedb40de9e Mon Sep 17 00:00:00 2001 From: Paul Fd Date: Sat, 10 Apr 2021 15:48:40 +0200 Subject: [PATCH 1/2] Always "fast-off" voices that have no samples left If anything, it will cut the release time on an ended sample. --- src/sfizz/Voice.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/sfizz/Voice.cpp b/src/sfizz/Voice.cpp index 8a73b80fb..568688c21 100644 --- a/src/sfizz/Voice.cpp +++ b/src/sfizz/Voice.cpp @@ -1154,9 +1154,7 @@ void Voice::Impl::fillWithData(AudioSpan buffer) noexcept continue; } - if (!released()) - off(int(i), true); - + off(int(i), true); fill(indices->subspan(i), sampleEnd); fill(coeffs->subspan(i), 0x1.fffffep-1); break; From b364d199306552de54d48d19a437d84f747a7e07 Mon Sep 17 00:00:00 2001 From: Paul Fd Date: Sat, 10 Apr 2021 15:49:11 +0200 Subject: [PATCH 2/2] Ensure that transition delta is never flushed to 0 --- src/sfizz/ADSREnvelope.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sfizz/ADSREnvelope.cpp b/src/sfizz/ADSREnvelope.cpp index 9a99a412a..daf0872ab 100644 --- a/src/sfizz/ADSREnvelope.cpp +++ b/src/sfizz/ADSREnvelope.cpp @@ -133,7 +133,8 @@ void ADSREnvelope::getBlock(absl::Span output) noexcept if (currentValue <= config::egReleaseThreshold) { currentState = State::Fadeout; currentValue = previousValue; - transitionDelta = -currentValue / (sampleRate * config::egTransitionTime); + transitionDelta = -max(config::egReleaseThreshold, currentValue) + / (sampleRate * config::egTransitionTime); } break; case State::Fadeout: