KIK01 Proto 08

Dependencies:   AverageMCP3008 VoltageMonitor mbed-rtos mbed mcp3008

Fork of KIK01_Proto07 by Ryo Od

Committer:
ryood
Date:
Wed Jan 17 08:23:23 2018 +0000
Revision:
39:3c73531d13a2
Parent:
25:b4977c7e0db7
Delete wait_us(1) from AD8402Write()

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 25:b4977c7e0db7 8 #ifndef _ENVELOPE_AR_H_
ryood 25:b4977c7e0db7 9 #define _ENVELOPE_AR_H_
ryood 25:b4977c7e0db7 10
ryood 25:b4977c7e0db7 11 class EnvelopeParam
ryood 25:b4977c7e0db7 12 {
ryood 25:b4977c7e0db7 13 public:
ryood 25:b4977c7e0db7 14 int attack;
ryood 25:b4977c7e0db7 15 int release;
ryood 25:b4977c7e0db7 16 float v0;
ryood 25:b4977c7e0db7 17 float v1;
ryood 25:b4977c7e0db7 18 float v2;
ryood 25:b4977c7e0db7 19 float attackTauRatio;
ryood 25:b4977c7e0db7 20 float releaseTauRatio;
ryood 25:b4977c7e0db7 21 };
ryood 25:b4977c7e0db7 22
ryood 25:b4977c7e0db7 23 class EnvelopeAR
ryood 22:a3bb7594f9bb 24 {
ryood 22:a3bb7594f9bb 25 public:
ryood 22:a3bb7594f9bb 26 EnvelopeAR(int _attack, int _release, float _v0, float _v1, float _v2, float _attackTauRatio=0.36f, float _releaseTauRatio=0.36f) :
ryood 22:a3bb7594f9bb 27 amplitude(_v0),
ryood 22:a3bb7594f9bb 28 v0(_v0),
ryood 22:a3bb7594f9bb 29 v1(_v1),
ryood 22:a3bb7594f9bb 30 v2(_v2),
ryood 22:a3bb7594f9bb 31 attackTauRatio(_attackTauRatio),
ryood 25:b4977c7e0db7 32 releaseTauRatio(_releaseTauRatio)
ryood 25:b4977c7e0db7 33 {
ryood 22:a3bb7594f9bb 34 setAttack(_attack);
ryood 22:a3bb7594f9bb 35 setRelease(_release);
ryood 22:a3bb7594f9bb 36 }
ryood 22:a3bb7594f9bb 37
ryood 25:b4977c7e0db7 38 EnvelopeAR(const EnvelopeParam& param) :
ryood 25:b4977c7e0db7 39 amplitude(param.v0),
ryood 25:b4977c7e0db7 40 v0(param.v0),
ryood 25:b4977c7e0db7 41 v1(param.v1),
ryood 25:b4977c7e0db7 42 v2(param.v2),
ryood 25:b4977c7e0db7 43 attackTauRatio(param.attackTauRatio),
ryood 25:b4977c7e0db7 44 releaseTauRatio(param.releaseTauRatio)
ryood 25:b4977c7e0db7 45 {
ryood 25:b4977c7e0db7 46 setAttack(param.attack);
ryood 25:b4977c7e0db7 47 setRelease(param.release);
ryood 25:b4977c7e0db7 48 }
ryood 25:b4977c7e0db7 49
ryood 22:a3bb7594f9bb 50 ~EnvelopeAR() {}
ryood 22:a3bb7594f9bb 51
ryood 22:a3bb7594f9bb 52 void setAttack(int _attack) {
ryood 22:a3bb7594f9bb 53 attack = _attack;
ryood 22:a3bb7594f9bb 54 tau0 = attack * attackTauRatio;
ryood 22:a3bb7594f9bb 55 }
ryood 22:a3bb7594f9bb 56 int getAttack() {
ryood 22:a3bb7594f9bb 57 return attack;
ryood 22:a3bb7594f9bb 58 }
ryood 22:a3bb7594f9bb 59
ryood 22:a3bb7594f9bb 60 void setRelease(int _release) {
ryood 22:a3bb7594f9bb 61 release = _release;
ryood 22:a3bb7594f9bb 62 tau1 = release * releaseTauRatio;
ryood 22:a3bb7594f9bb 63 }
ryood 22:a3bb7594f9bb 64 int getRelease() {
ryood 22:a3bb7594f9bb 65 return release;
ryood 22:a3bb7594f9bb 66 }
ryood 22:a3bb7594f9bb 67
ryood 22:a3bb7594f9bb 68 void setAttackTauRatio(float _attackTauRatio) {
ryood 22:a3bb7594f9bb 69 attackTauRatio = _attackTauRatio;
ryood 22:a3bb7594f9bb 70 tau0 = attack * attackTauRatio;
ryood 22:a3bb7594f9bb 71 }
ryood 22:a3bb7594f9bb 72 float getAttackTauRatio() {
ryood 22:a3bb7594f9bb 73 return attackTauRatio;
ryood 22:a3bb7594f9bb 74 }
ryood 22:a3bb7594f9bb 75
ryood 22:a3bb7594f9bb 76 void setReleaseTauRatio(float _releaseTauRatio) {
ryood 22:a3bb7594f9bb 77 releaseTauRatio = _releaseTauRatio;
ryood 22:a3bb7594f9bb 78 tau1 = release * releaseTauRatio;
ryood 22:a3bb7594f9bb 79 }
ryood 22:a3bb7594f9bb 80 float getReleaseTauRatio() {
ryood 22:a3bb7594f9bb 81 return releaseTauRatio;
ryood 22:a3bb7594f9bb 82 }
ryood 22:a3bb7594f9bb 83
ryood 22:a3bb7594f9bb 84 float getTau0() {
ryood 22:a3bb7594f9bb 85 return tau0;
ryood 22:a3bb7594f9bb 86 }
ryood 22:a3bb7594f9bb 87 float getTau1() {
ryood 22:a3bb7594f9bb 88 return tau1;
ryood 22:a3bb7594f9bb 89 }
ryood 22:a3bb7594f9bb 90
ryood 22:a3bb7594f9bb 91 void setV0(float _v0) {
ryood 22:a3bb7594f9bb 92 v0 = _v0;
ryood 22:a3bb7594f9bb 93 }
ryood 22:a3bb7594f9bb 94 float getV0() {
ryood 22:a3bb7594f9bb 95 return v0;
ryood 22:a3bb7594f9bb 96 }
ryood 22:a3bb7594f9bb 97 void setV1(float _v1) {
ryood 22:a3bb7594f9bb 98 v1 = _v1;
ryood 22:a3bb7594f9bb 99 }
ryood 22:a3bb7594f9bb 100 float getV1() {
ryood 22:a3bb7594f9bb 101 return v1;
ryood 22:a3bb7594f9bb 102 }
ryood 22:a3bb7594f9bb 103 void setV2(float _v2) {
ryood 22:a3bb7594f9bb 104 v2 = _v2;
ryood 22:a3bb7594f9bb 105 }
ryood 22:a3bb7594f9bb 106 float getV2() {
ryood 22:a3bb7594f9bb 107 return v2;
ryood 22:a3bb7594f9bb 108 }
ryood 22:a3bb7594f9bb 109
ryood 22:a3bb7594f9bb 110 float getAmplitude() {
ryood 22:a3bb7594f9bb 111 return amplitude;
ryood 22:a3bb7594f9bb 112 }
ryood 24:e9fbadd15e90 113
ryood 25:b4977c7e0db7 114 void setParam(const EnvelopeParam& param) {
ryood 25:b4977c7e0db7 115 setV0(param.v0);
ryood 25:b4977c7e0db7 116 setV1(param.v1);
ryood 25:b4977c7e0db7 117 setV2(param.v2);
ryood 25:b4977c7e0db7 118 setAttackTauRatio(param.attackTauRatio);
ryood 25:b4977c7e0db7 119 setReleaseTauRatio(param.releaseTauRatio);
ryood 25:b4977c7e0db7 120 setAttack(param.attack);
ryood 25:b4977c7e0db7 121 setRelease(param.release);
ryood 25:b4977c7e0db7 122 }
ryood 25:b4977c7e0db7 123
ryood 22:a3bb7594f9bb 124 float getAmplitude(int tick) {
ryood 24:e9fbadd15e90 125 if (tick <= attack) {
ryood 22:a3bb7594f9bb 126 // attackの処理
ryood 22:a3bb7594f9bb 127 amplitude = v0 + (v1 - v0) * (1 - expf(-(float)tick / tau0));
ryood 22:a3bb7594f9bb 128 } else {
ryood 22:a3bb7594f9bb 129 // releaseの処理
ryood 24:e9fbadd15e90 130 float vAttack = v0 + (v1 - v0) * (1 - expf(-attack / tau0));
ryood 24:e9fbadd15e90 131 amplitude = (vAttack - v2) * (expf(-(float)(tick - attack) / tau1)) + v2;
ryood 22:a3bb7594f9bb 132 }
ryood 22:a3bb7594f9bb 133 return amplitude;
ryood 22:a3bb7594f9bb 134 }
ryood 22:a3bb7594f9bb 135
ryood 22:a3bb7594f9bb 136 private:
ryood 22:a3bb7594f9bb 137 int attack;
ryood 22:a3bb7594f9bb 138 int release;
ryood 22:a3bb7594f9bb 139 float amplitude;
ryood 22:a3bb7594f9bb 140 float v0;
ryood 22:a3bb7594f9bb 141 float v1;
ryood 22:a3bb7594f9bb 142 float v2;
ryood 22:a3bb7594f9bb 143 float tau0;
ryood 22:a3bb7594f9bb 144 float tau1;
ryood 22:a3bb7594f9bb 145 float attackTauRatio;
ryood 22:a3bb7594f9bb 146 float releaseTauRatio;
ryood 22:a3bb7594f9bb 147 };
ryood 22:a3bb7594f9bb 148
ryood 22:a3bb7594f9bb 149 #endif //_ENVELOPE_AR_H_