Mercurial > hg > opencollidoscope
diff CollidoscopeApp/include/EnvASR.h @ 0:02467299402e
First import
CollidoscopeApp for Raspberry Pi
JackDevice
Teensy code for Collidoscope
author | Fiore Martin <f.martin@qmul.ac.uk> |
---|---|
date | Thu, 30 Jun 2016 14:50:06 +0200 |
parents | |
children | dd889fff8423 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CollidoscopeApp/include/EnvASR.h Thu Jun 30 14:50:06 2016 +0200 @@ -0,0 +1,91 @@ +#pragma once + +namespace collidoscope { + +template <typename T> +class EnvASR +{ +public: + + enum class State { + eAttack, + eSustain, + eRelease, + eIdle // before attack after release + }; + + EnvASR( T sustainLevel, T attackTime, T releaseTime, std::size_t sampleRate ) : + mSustainLevel( sustainLevel ), + mState( State::eIdle ), + mValue( 0 ) + + { + if ( attackTime <= 0 ) + attackTime = T( 0.001 ); + + if ( releaseTime <= 0 ) + releaseTime = T( 0.001 ); + + mAttackRate = T( 1.0 ) / (attackTime * sampleRate); + mReleaseRate = T( 1.0 ) / (releaseTime * sampleRate); + } + + T tick() + { + + switch ( mState ) + { + + case State::eIdle: { + mValue = 0; + }; + break; + + case State::eAttack: { + mValue += mAttackRate; + if ( mValue >= mSustainLevel ){ + mValue = mSustainLevel; + mState = State::eSustain; + } + }; + break; + + case State::eRelease: + mValue -= mReleaseRate; + if ( mValue <= 0 ){ + mValue = 0; + mState = State::eIdle; + } + break; + default: + break; + } + + return mValue; + + } + + State getState() const + { + return mState; + } + + void setState( State state ) + { + mState = state; + } + +private: + T mSustainLevel; + T mAttackRate; + T mReleaseRate; + + // output + T mValue; + + State mState; + +}; + + +} \ No newline at end of file