Mercurial > hg > opencollidoscope
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 } |