diff --git a/src/sfizz/ADSREnvelope.cpp b/src/sfizz/ADSREnvelope.cpp index 472c9fd7..b17bce09 100644 --- a/src/sfizz/ADSREnvelope.cpp +++ b/src/sfizz/ADSREnvelope.cpp @@ -96,7 +96,7 @@ Type ADSREnvelope::getNextValue() noexcept return currentValue; case State::Release: currentValue *= releaseRate; - if (currentValue > config::virtuallyZero) + if (currentValue > config::egReleaseThreshold) return currentValue; currentState = State::Done; @@ -169,9 +169,9 @@ void ADSREnvelope::getBlock(absl::Span output) noexcept sfz::fill(output.first(count), currentValue); break; case State::Release: - while (count < size && (currentValue *= releaseRate) > config::virtuallyZero) + while (count < size && (currentValue *= releaseRate) > config::egReleaseThreshold) output[count++] = currentValue; - if (currentValue <= config::virtuallyZero) { + if (currentValue <= config::egReleaseThreshold) { currentValue = 0; currentState = State::Done; } diff --git a/src/sfizz/Config.h b/src/sfizz/Config.h index 3ec5f1a8..c13707ef 100644 --- a/src/sfizz/Config.h +++ b/src/sfizz/Config.h @@ -86,6 +86,11 @@ namespace config { modulated filter. The lower, the more CPU resources are consumed. */ constexpr int filterControlInterval { 16 }; + /** + Amplitude below which an exponential releasing envelope is considered as + finished. + */ + constexpr float egReleaseThreshold = 1e-4; /** Default metadata for MIDIName documents */