diff --git a/modules/juce_audio_basics/utilities/juce_ADSR.h b/modules/juce_audio_basics/utilities/juce_ADSR.h index 481782edda..2a0788b885 100644 --- a/modules/juce_audio_basics/utilities/juce_ADSR.h +++ b/modules/juce_audio_basics/utilities/juce_ADSR.h @@ -102,6 +102,12 @@ public: { envelopeVal = 0.0f; currentState = State::idle; + + if (resetReleaseRate) + { + releaseRate = static_cast (sustainLevel / (currentParameters.release * sr)); + resetReleaseRate = false; + } } /** Starts the attack phase of the envelope. */ @@ -120,7 +126,10 @@ public: if (releaseRate > 0.0f) { if (currentState != State::sustain) + { releaseRate = static_cast (envelopeVal / (currentParameters.release * sr)); + resetReleaseRate = true; + } currentState = State::release; } @@ -229,11 +238,8 @@ private: Parameters currentParameters; double sr = 0.0; - - float envelopeVal = 0.0f; - - float sustainLevel = 0.0f; - float attackRate = 0.0f, decayRate = 0.0f, releaseRate = 0.0f; + float envelopeVal = 0.0f, sustainLevel = 0.0f, attackRate = 0.0f, decayRate = 0.0f, releaseRate = 0.0f; + bool resetReleaseRate = false; }; } // namespace juce