KIK01 Prototype 04

Dependencies:   mbed-rtos mbed mcp3008

Fork of KIK01_Proto03 by Ryo Od

Committer:
ryood
Date:
Sun Sep 17 23:24:49 2017 +0000
Revision:
23:da7c5f7feff1
Parent:
22:a3bb7594f9bb
Impl. Amplitude Envelope.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ryood 22:a3bb7594f9bb 1 /*
ryood 22:a3bb7594f9bb 2 * AR Type Envelope Class
ryood 22:a3bb7594f9bb 3 *
ryood 22:a3bb7594f9bb 4 * 2017.09.18
ryood 22:a3bb7594f9bb 5 *
ryood 22:a3bb7594f9bb 6 */
ryood 22:a3bb7594f9bb 7
ryood 22:a3bb7594f9bb 8 #ifndef _ENVELOPE_AR_H_
ryood 22:a3bb7594f9bb 9 #define _ENVELOPE_AR_H_
ryood 22:a3bb7594f9bb 10
ryood 22:a3bb7594f9bb 11 class EnvelopeAR
ryood 22:a3bb7594f9bb 12 {
ryood 22:a3bb7594f9bb 13 public:
ryood 22:a3bb7594f9bb 14 EnvelopeAR(int _attack, int _release, float _v0, float _v1, float _v2, float _attackTauRatio=0.36f, float _releaseTauRatio=0.36f) :
ryood 22:a3bb7594f9bb 15 amplitude(_v0),
ryood 22:a3bb7594f9bb 16 v0(_v0),
ryood 22:a3bb7594f9bb 17 v1(_v1),
ryood 22:a3bb7594f9bb 18 v2(_v2),
ryood 22:a3bb7594f9bb 19 vLast(_v0),
ryood 22:a3bb7594f9bb 20 attackTauRatio(_attackTauRatio),
ryood 22:a3bb7594f9bb 21 releaseTauRatio(_releaseTauRatio) {
ryood 22:a3bb7594f9bb 22 setAttack(_attack);
ryood 22:a3bb7594f9bb 23 setRelease(_release);
ryood 22:a3bb7594f9bb 24 }
ryood 22:a3bb7594f9bb 25
ryood 22:a3bb7594f9bb 26 ~EnvelopeAR() {}
ryood 22:a3bb7594f9bb 27
ryood 22:a3bb7594f9bb 28 void setAttack(int _attack) {
ryood 22:a3bb7594f9bb 29 attack = _attack;
ryood 22:a3bb7594f9bb 30 tau0 = attack * attackTauRatio;
ryood 22:a3bb7594f9bb 31 }
ryood 22:a3bb7594f9bb 32 int getAttack() {
ryood 22:a3bb7594f9bb 33 return attack;
ryood 22:a3bb7594f9bb 34 }
ryood 22:a3bb7594f9bb 35
ryood 22:a3bb7594f9bb 36 void setRelease(int _release) {
ryood 22:a3bb7594f9bb 37 release = _release;
ryood 22:a3bb7594f9bb 38 tau1 = release * releaseTauRatio;
ryood 22:a3bb7594f9bb 39 }
ryood 22:a3bb7594f9bb 40 int getRelease() {
ryood 22:a3bb7594f9bb 41 return release;
ryood 22:a3bb7594f9bb 42 }
ryood 22:a3bb7594f9bb 43
ryood 22:a3bb7594f9bb 44 void setAttackTauRatio(float _attackTauRatio) {
ryood 22:a3bb7594f9bb 45 attackTauRatio = _attackTauRatio;
ryood 22:a3bb7594f9bb 46 tau0 = attack * attackTauRatio;
ryood 22:a3bb7594f9bb 47 }
ryood 22:a3bb7594f9bb 48 float getAttackTauRatio() {
ryood 22:a3bb7594f9bb 49 return attackTauRatio;
ryood 22:a3bb7594f9bb 50 }
ryood 22:a3bb7594f9bb 51
ryood 22:a3bb7594f9bb 52 void setReleaseTauRatio(float _releaseTauRatio) {
ryood 22:a3bb7594f9bb 53 releaseTauRatio = _releaseTauRatio;
ryood 22:a3bb7594f9bb 54 tau1 = release * releaseTauRatio;
ryood 22:a3bb7594f9bb 55 }
ryood 22:a3bb7594f9bb 56 float getReleaseTauRatio() {
ryood 22:a3bb7594f9bb 57 return releaseTauRatio;
ryood 22:a3bb7594f9bb 58 }
ryood 22:a3bb7594f9bb 59
ryood 22:a3bb7594f9bb 60 float getTau0() {
ryood 22:a3bb7594f9bb 61 return tau0;
ryood 22:a3bb7594f9bb 62 }
ryood 22:a3bb7594f9bb 63 float getTau1() {
ryood 22:a3bb7594f9bb 64 return tau1;
ryood 22:a3bb7594f9bb 65 }
ryood 22:a3bb7594f9bb 66
ryood 22:a3bb7594f9bb 67 void setV0(float _v0) {
ryood 22:a3bb7594f9bb 68 v0 = _v0;
ryood 22:a3bb7594f9bb 69 }
ryood 22:a3bb7594f9bb 70 float getV0() {
ryood 22:a3bb7594f9bb 71 return v0;
ryood 22:a3bb7594f9bb 72 }
ryood 22:a3bb7594f9bb 73 void setV1(float _v1) {
ryood 22:a3bb7594f9bb 74 v1 = _v1;
ryood 22:a3bb7594f9bb 75 }
ryood 22:a3bb7594f9bb 76 float getV1() {
ryood 22:a3bb7594f9bb 77 return v1;
ryood 22:a3bb7594f9bb 78 }
ryood 22:a3bb7594f9bb 79 void setV2(float _v2) {
ryood 22:a3bb7594f9bb 80 v2 = _v2;
ryood 22:a3bb7594f9bb 81 }
ryood 22:a3bb7594f9bb 82 float getV2() {
ryood 22:a3bb7594f9bb 83 return v2;
ryood 22:a3bb7594f9bb 84 }
ryood 22:a3bb7594f9bb 85
ryood 22:a3bb7594f9bb 86 float getAmplitude() {
ryood 22:a3bb7594f9bb 87 return amplitude;
ryood 22:a3bb7594f9bb 88 }
ryood 22:a3bb7594f9bb 89 float getAmplitude(int tick) {
ryood 22:a3bb7594f9bb 90 if (tick < attack) {
ryood 22:a3bb7594f9bb 91 // attackの処理
ryood 22:a3bb7594f9bb 92 amplitude = v0 + (v1 - v0) * (1 - expf(-(float)tick / tau0));
ryood 22:a3bb7594f9bb 93 vLast = amplitude;
ryood 22:a3bb7594f9bb 94 } else {
ryood 22:a3bb7594f9bb 95 // releaseの処理
ryood 22:a3bb7594f9bb 96 amplitude = (vLast - v2) * (expf(-(float)(tick - attack) / tau1)) + v2;
ryood 22:a3bb7594f9bb 97 }
ryood 22:a3bb7594f9bb 98 return amplitude;
ryood 22:a3bb7594f9bb 99 }
ryood 22:a3bb7594f9bb 100
ryood 22:a3bb7594f9bb 101 private:
ryood 22:a3bb7594f9bb 102 int attack;
ryood 22:a3bb7594f9bb 103 int release;
ryood 22:a3bb7594f9bb 104 float amplitude;
ryood 22:a3bb7594f9bb 105 float v0;
ryood 22:a3bb7594f9bb 106 float v1;
ryood 22:a3bb7594f9bb 107 float v2;
ryood 22:a3bb7594f9bb 108 float vLast;
ryood 22:a3bb7594f9bb 109 float tau0;
ryood 22:a3bb7594f9bb 110 float tau1;
ryood 22:a3bb7594f9bb 111 float attackTauRatio;
ryood 22:a3bb7594f9bb 112 float releaseTauRatio;
ryood 22:a3bb7594f9bb 113 };
ryood 22:a3bb7594f9bb 114
ryood 22:a3bb7594f9bb 115 class EnvelopeParam
ryood 22:a3bb7594f9bb 116 {
ryood 22:a3bb7594f9bb 117 public:
ryood 22:a3bb7594f9bb 118 int attack;
ryood 22:a3bb7594f9bb 119 int release;
ryood 22:a3bb7594f9bb 120 float v0;
ryood 22:a3bb7594f9bb 121 float v1;
ryood 22:a3bb7594f9bb 122 float v2;
ryood 22:a3bb7594f9bb 123 float attackTauRatio;
ryood 22:a3bb7594f9bb 124 float releaseTauRatio;
ryood 22:a3bb7594f9bb 125 };
ryood 22:a3bb7594f9bb 126
ryood 22:a3bb7594f9bb 127 #endif //_ENVELOPE_AR_H_