|
- /*
- ==============================================================================
-
- This file is part of the JUCETICE project - Copyright 2008 by Lucio Asnaghi.
-
- JUCETICE is based around the JUCE library - "Jules' Utility Class Extensions"
- Copyright 2008 by Julian Storer.
-
- ------------------------------------------------------------------------------
-
- JUCE and JUCETICE can be redistributed and/or modified under the terms of
- the GNU Lesser General Public License, as published by the Free Software
- Foundation; either version 2 of the License, or (at your option) any later
- version.
-
- JUCE and JUCETICE are distributed in the hope that they will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with JUCE and JUCETICE; if not, visit www.gnu.org/licenses or write to
- Free Software Foundation, Inc., 59 Temple Place, Suite 330,
- Boston, MA 02111-1307 USA
-
- ==============================================================================
-
- @author rockhardbuns
- @tweaker Lucio Asnaghi
- @tweaker falkTX
-
- ==============================================================================
- */
-
- #ifndef DISTRHO_VEX_ADSR_HEADER_INCLUDED
- #define DISTRHO_VEX_ADSR_HEADER_INCLUDED
-
- #ifndef CARLA_EXPORT
- #define CARLA_EXPORT
- #endif
-
- #ifdef CARLA_EXPORT
- #include "juce_audio_basics.h"
- #else
- #include "../StandardHeader.h"
- #endif
-
- //Process every sample in a buffer
- class VexADSR
- {
- public:
- enum State {
- kStateDone = 0,
- kStateAttack,
- kStateDecay,
- kStateSustain,
- kStateRelease,
- kStateQRelease,
- kStateCount
- };
- typedef void (VexADSR::*StateFunc)();
-
- VexADSR()
- : state(kStateAttack),
- attackRate(0.1f),
- decayRate(0.3f),
- sustainLevel(0.5f),
- releaseRate(0.1f),
- preCount(0),
- postCount(0),
- value(0.0f)
- {
- stateFn[kStateDone] = &VexADSR::fn_done;
- stateFn[kStateAttack] = &VexADSR::fn_attack;
- stateFn[kStateDecay] = &VexADSR::fn_decay;
- stateFn[kStateSustain] = &VexADSR::fn_sustain;
- stateFn[kStateRelease] = &VexADSR::fn_release;
- stateFn[kStateQRelease] = &VexADSR::fn_qrelease;
- }
-
- // Process a buffer
- void doProcess(float* BufferL, float* BufferR, int bSize)
- {
- for(int i = 0; i < bSize; i++)
- {
- (this->*stateFn[state])();
-
- BufferL[i] *= value * value;
- BufferR[i] *= value * value;
- }
- }
-
- // Process a Sample
- float getSample()
- {
- (this->*stateFn[state])();
- return value * value;
- }
-
- void reset(int p)
- {
- preCount = p;
- state = kStateAttack;
- value = 0.0f;
- }
-
- void release(int p)
- {
- postCount = p;
- state = kStateRelease;
- }
-
- void quickRelease()
- {
- state = kStateQRelease;
- }
-
- bool getState()
- {
- return (state != kStateDone);
- }
-
- void kill()
- {
- state = kStateDone;
- }
-
- void setADSR(double a, double d, double s, double r, double sr)
- {
- double rate = sr * 5.0;
-
- attackRate = float(1.0f / (rate * jmax(a * a, 0.001)));
- decayRate = float(1.0f / (rate * jmax(d * d, 0.005)));
- releaseRate = float(1.0f / (rate * jmax(r * r, 0.0002)));
- sustainLevel = (float)s;
- }
-
- private:
- void fn_done()
- {
- }
-
- void fn_attack()
- {
- --preCount;
- value += attackRate * float(preCount < 1);
-
- if (value >= 1.0f)
- {
- state = kStateDecay;
- value = 1.0f;
- }
- }
-
- void fn_decay()
- {
- value -= decayRate;
-
- if (value <= sustainLevel)
- state = kStateSustain;
- }
-
- void fn_sustain()
- {
- }
-
- void fn_release()
- {
- --postCount;
- value -= releaseRate * bool(postCount < 1);
- postCount -= int(postCount > 0);
-
- if (value <= 0.0f)
- {
- state = kStateDone;
- value = 0.0f;
- }
- }
-
- void fn_qrelease()
- {
- value -= 0.006f;
-
- if (value <= 0.0f)
- {
- state = kStateDone;
- value = 0.0f;
- }
- }
-
- State state;
- StateFunc stateFn[kStateCount]; //Function pointer array for the state functions
-
- float attackRate, decayRate, sustainLevel, releaseRate;
- int preCount, postCount; //counter to delay release to sync with the sampleframe
- float value; //this is the current value of the envelope
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(VexADSR)
- };
-
- #endif // DISTRHO_VEX_ADSR_HEADER_INCLUDED
|