annotate 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
rev   line source
f@0 1 #pragma once
f@0 2
f@0 3 namespace collidoscope {
f@0 4
f@0 5 template <typename T>
f@0 6 class EnvASR
f@0 7 {
f@0 8 public:
f@0 9
f@0 10 enum class State {
f@0 11 eAttack,
f@0 12 eSustain,
f@0 13 eRelease,
f@0 14 eIdle // before attack after release
f@0 15 };
f@0 16
f@0 17 EnvASR( T sustainLevel, T attackTime, T releaseTime, std::size_t sampleRate ) :
f@0 18 mSustainLevel( sustainLevel ),
f@0 19 mState( State::eIdle ),
f@0 20 mValue( 0 )
f@0 21
f@0 22 {
f@0 23 if ( attackTime <= 0 )
f@0 24 attackTime = T( 0.001 );
f@0 25
f@0 26 if ( releaseTime <= 0 )
f@0 27 releaseTime = T( 0.001 );
f@0 28
f@0 29 mAttackRate = T( 1.0 ) / (attackTime * sampleRate);
f@0 30 mReleaseRate = T( 1.0 ) / (releaseTime * sampleRate);
f@0 31 }
f@0 32
f@0 33 T tick()
f@0 34 {
f@0 35
f@0 36 switch ( mState )
f@0 37 {
f@0 38
f@0 39 case State::eIdle: {
f@0 40 mValue = 0;
f@0 41 };
f@0 42 break;
f@0 43
f@0 44 case State::eAttack: {
f@0 45 mValue += mAttackRate;
f@0 46 if ( mValue >= mSustainLevel ){
f@0 47 mValue = mSustainLevel;
f@0 48 mState = State::eSustain;
f@0 49 }
f@0 50 };
f@0 51 break;
f@0 52
f@0 53 case State::eRelease:
f@0 54 mValue -= mReleaseRate;
f@0 55 if ( mValue <= 0 ){
f@0 56 mValue = 0;
f@0 57 mState = State::eIdle;
f@0 58 }
f@0 59 break;
f@0 60 default:
f@0 61 break;
f@0 62 }
f@0 63
f@0 64 return mValue;
f@0 65
f@0 66 }
f@0 67
f@0 68 State getState() const
f@0 69 {
f@0 70 return mState;
f@0 71 }
f@0 72
f@0 73 void setState( State state )
f@0 74 {
f@0 75 mState = state;
f@0 76 }
f@0 77
f@0 78 private:
f@0 79 T mSustainLevel;
f@0 80 T mAttackRate;
f@0 81 T mReleaseRate;
f@0 82
f@0 83 // output
f@0 84 T mValue;
f@0 85
f@0 86 State mState;
f@0 87
f@0 88 };
f@0 89
f@0 90
f@0 91 }