KIK01 Proto 08

Dependencies:   AverageMCP3008 VoltageMonitor mbed-rtos mbed mcp3008

Fork of KIK01_Proto07 by Ryo Od

Revision:
22:a3bb7594f9bb
Child:
24:e9fbadd15e90
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EnvelopeAR.h	Sun Sep 17 19:11:41 2017 +0000
@@ -0,0 +1,127 @@
+/*
+ * AR Type Envelope Class
+ *
+ * 2017.09.18
+ *
+ */
+
+ #ifndef _ENVELOPE_AR_H_
+ #define _ENVELOPE_AR_H_
+ 
+ class EnvelopeAR
+{
+public:
+    EnvelopeAR(int _attack, int _release, float _v0, float _v1, float _v2, float _attackTauRatio=0.36f, float _releaseTauRatio=0.36f) :
+        amplitude(_v0),
+        v0(_v0),
+        v1(_v1),
+        v2(_v2),
+        vLast(_v0),
+        attackTauRatio(_attackTauRatio),
+        releaseTauRatio(_releaseTauRatio) {
+        setAttack(_attack);
+        setRelease(_release);
+    }
+
+    ~EnvelopeAR() {}
+
+    void setAttack(int _attack) {
+        attack = _attack;
+        tau0 = attack * attackTauRatio;
+    }
+    int getAttack() {
+        return attack;
+    }
+
+    void setRelease(int _release) {
+        release = _release;
+        tau1 = release * releaseTauRatio;
+    }
+    int getRelease() {
+        return release;
+    }
+
+    void setAttackTauRatio(float _attackTauRatio) {
+        attackTauRatio = _attackTauRatio;
+        tau0 = attack * attackTauRatio;
+    }
+    float getAttackTauRatio() {
+        return attackTauRatio;
+    }
+
+    void setReleaseTauRatio(float _releaseTauRatio) {
+        releaseTauRatio = _releaseTauRatio;
+        tau1 = release * releaseTauRatio;
+    }
+    float getReleaseTauRatio() {
+        return releaseTauRatio;
+    }
+
+    float getTau0() {
+        return tau0;
+    }
+    float getTau1() {
+        return tau1;
+    }
+
+    void setV0(float _v0) {
+        v0 = _v0;
+    }
+    float getV0() {
+        return v0;
+    }
+    void setV1(float _v1) {
+        v1 = _v1;
+    }
+    float getV1() {
+        return v1;
+    }
+    void setV2(float _v2) {
+        v2 = _v2;
+    }
+    float getV2() {
+        return v2;
+    }
+
+    float getAmplitude() {
+        return amplitude;
+    }
+    float getAmplitude(int tick) {
+        if (tick < attack) {
+            // attackの処理
+            amplitude = v0 + (v1 - v0) * (1 - expf(-(float)tick / tau0));
+            vLast = amplitude;
+        } else {
+            // releaseの処理
+            amplitude = (vLast - v2) * (expf(-(float)(tick - attack) / tau1)) + v2;
+        }
+        return amplitude;
+    }
+
+private:
+    int attack;
+    int release;
+    float amplitude;
+    float v0;
+    float v1;
+    float v2;
+    float vLast;
+    float tau0;
+    float tau1;
+    float attackTauRatio;
+    float releaseTauRatio;
+};
+
+class EnvelopeParam
+{
+public:
+    int attack;
+    int release;
+    float v0;
+    float v1;
+    float v2;
+    float attackTauRatio;
+    float releaseTauRatio;
+};
+
+#endif //_ENVELOPE_AR_H_