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