81 if (currentState != State::idle)
101 jassert (sampleRate > 0.0);
110 currentState = State::idle;
116 if (attackRate > 0.0f)
118 currentState = State::attack;
120 else if (decayRate > 0.0f)
123 currentState = State::decay;
127 currentState = State::sustain;
134 if (currentState != State::idle)
136 if (currentParameters.
release > 0.0f)
138 releaseRate =
static_cast<float> (envelopeVal / (currentParameters.
release * sr));
139 currentState = State::release;
155 if (currentState == State::idle)
158 if (currentState == State::attack)
160 envelopeVal += attackRate;
162 if (envelopeVal >= 1.0f)
166 if (decayRate > 0.0f)
167 currentState = State::decay;
169 currentState = State::sustain;
172 else if (currentState == State::decay)
174 envelopeVal -= decayRate;
176 if (envelopeVal <= sustainLevel)
178 envelopeVal = sustainLevel;
179 currentState = State::sustain;
182 else if (currentState == State::sustain)
184 envelopeVal = sustainLevel;
186 else if (currentState == State::release)
188 envelopeVal -= releaseRate;
190 if (envelopeVal <= 0.0f)
202 template<
typename FloatType>
205 jassert (startSample + numSamples <= buffer.getNumSamples());
207 auto numChannels = buffer.getNumChannels();
209 while (--numSamples >= 0)
213 for (
int i = 0; i < numChannels; ++i)
214 buffer.getWritePointer (i)[startSample] *=
env;
222 void calculateRates (
const Parameters& parameters)
227 attackRate = (parameters.attack > 0.0f ?
static_cast<float> (1.0f / (parameters.attack * sr)) : -1.0f);
228 decayRate = (parameters.decay > 0.0f ?
static_cast<float> ((1.0f - sustainLevel) / (parameters.decay * sr)) : -1.0f);
231 void checkCurrentState()
233 if (currentState == State::attack && attackRate <= 0.0f) currentState = decayRate > 0.0f ? State::decay : State::sustain;
234 else if (currentState == State::decay && decayRate <= 0.0f) currentState = State::sustain;
235 else if (currentState == State::release && releaseRate <= 0.0f)
reset();
239 enum class State { idle, attack, decay, sustain, release };
241 State currentState = State::idle;
242 Parameters currentParameters;
245 float envelopeVal = 0.0f, sustainLevel = 0.0f, attackRate = 0.0f, decayRate = 0.0f, releaseRate = 0.0f;