KIK01 Release

Dependencies:   mcp3008 mbed mbed-rtos AverageMCP3008 VoltageMonitor

Committer:
ryood
Date:
Fri Mar 01 01:02:38 2019 +0000
Revision:
43:e5e2d1761156
Parent:
25:b4977c7e0db7
EnvelopeAR: Range check (attack, release)

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 43:e5e2d1761156 53 if (_attack > 0) {
ryood 43:e5e2d1761156 54 attack = _attack;
ryood 43:e5e2d1761156 55 } else {
ryood 43:e5e2d1761156 56 attack = 1;
ryood 43:e5e2d1761156 57 }
ryood 22:a3bb7594f9bb 58 tau0 = attack * attackTauRatio;
ryood 22:a3bb7594f9bb 59 }
ryood 22:a3bb7594f9bb 60 int getAttack() {
ryood 22:a3bb7594f9bb 61 return attack;
ryood 22:a3bb7594f9bb 62 }
ryood 22:a3bb7594f9bb 63
ryood 22:a3bb7594f9bb 64 void setRelease(int _release) {
ryood 43:e5e2d1761156 65 if (_release > 0) {
ryood 43:e5e2d1761156 66 release = _release;
ryood 43:e5e2d1761156 67 } else {
ryood 43:e5e2d1761156 68 release = 1;
ryood 43:e5e2d1761156 69 }
ryood 22:a3bb7594f9bb 70 tau1 = release * releaseTauRatio;
ryood 22:a3bb7594f9bb 71 }
ryood 22:a3bb7594f9bb 72 int getRelease() {
ryood 22:a3bb7594f9bb 73 return release;
ryood 22:a3bb7594f9bb 74 }
ryood 22:a3bb7594f9bb 75
ryood 22:a3bb7594f9bb 76 void setAttackTauRatio(float _attackTauRatio) {
ryood 22:a3bb7594f9bb 77 attackTauRatio = _attackTauRatio;
ryood 22:a3bb7594f9bb 78 tau0 = attack * attackTauRatio;
ryood 22:a3bb7594f9bb 79 }
ryood 22:a3bb7594f9bb 80 float getAttackTauRatio() {
ryood 22:a3bb7594f9bb 81 return attackTauRatio;
ryood 22:a3bb7594f9bb 82 }
ryood 22:a3bb7594f9bb 83
ryood 22:a3bb7594f9bb 84 void setReleaseTauRatio(float _releaseTauRatio) {
ryood 22:a3bb7594f9bb 85 releaseTauRatio = _releaseTauRatio;
ryood 22:a3bb7594f9bb 86 tau1 = release * releaseTauRatio;
ryood 22:a3bb7594f9bb 87 }
ryood 22:a3bb7594f9bb 88 float getReleaseTauRatio() {
ryood 22:a3bb7594f9bb 89 return releaseTauRatio;
ryood 22:a3bb7594f9bb 90 }
ryood 22:a3bb7594f9bb 91
ryood 22:a3bb7594f9bb 92 float getTau0() {
ryood 22:a3bb7594f9bb 93 return tau0;
ryood 22:a3bb7594f9bb 94 }
ryood 22:a3bb7594f9bb 95 float getTau1() {
ryood 22:a3bb7594f9bb 96 return tau1;
ryood 22:a3bb7594f9bb 97 }
ryood 22:a3bb7594f9bb 98
ryood 22:a3bb7594f9bb 99 void setV0(float _v0) {
ryood 22:a3bb7594f9bb 100 v0 = _v0;
ryood 22:a3bb7594f9bb 101 }
ryood 22:a3bb7594f9bb 102 float getV0() {
ryood 22:a3bb7594f9bb 103 return v0;
ryood 22:a3bb7594f9bb 104 }
ryood 22:a3bb7594f9bb 105 void setV1(float _v1) {
ryood 22:a3bb7594f9bb 106 v1 = _v1;
ryood 22:a3bb7594f9bb 107 }
ryood 22:a3bb7594f9bb 108 float getV1() {
ryood 22:a3bb7594f9bb 109 return v1;
ryood 22:a3bb7594f9bb 110 }
ryood 22:a3bb7594f9bb 111 void setV2(float _v2) {
ryood 22:a3bb7594f9bb 112 v2 = _v2;
ryood 22:a3bb7594f9bb 113 }
ryood 22:a3bb7594f9bb 114 float getV2() {
ryood 22:a3bb7594f9bb 115 return v2;
ryood 22:a3bb7594f9bb 116 }
ryood 22:a3bb7594f9bb 117
ryood 22:a3bb7594f9bb 118 float getAmplitude() {
ryood 22:a3bb7594f9bb 119 return amplitude;
ryood 22:a3bb7594f9bb 120 }
ryood 24:e9fbadd15e90 121
ryood 25:b4977c7e0db7 122 void setParam(const EnvelopeParam& param) {
ryood 25:b4977c7e0db7 123 setV0(param.v0);
ryood 25:b4977c7e0db7 124 setV1(param.v1);
ryood 25:b4977c7e0db7 125 setV2(param.v2);
ryood 25:b4977c7e0db7 126 setAttackTauRatio(param.attackTauRatio);
ryood 25:b4977c7e0db7 127 setReleaseTauRatio(param.releaseTauRatio);
ryood 25:b4977c7e0db7 128 setAttack(param.attack);
ryood 25:b4977c7e0db7 129 setRelease(param.release);
ryood 25:b4977c7e0db7 130 }
ryood 25:b4977c7e0db7 131
ryood 22:a3bb7594f9bb 132 float getAmplitude(int tick) {
ryood 24:e9fbadd15e90 133 if (tick <= attack) {
ryood 22:a3bb7594f9bb 134 // attackの処理
ryood 22:a3bb7594f9bb 135 amplitude = v0 + (v1 - v0) * (1 - expf(-(float)tick / tau0));
ryood 22:a3bb7594f9bb 136 } else {
ryood 22:a3bb7594f9bb 137 // releaseの処理
ryood 24:e9fbadd15e90 138 float vAttack = v0 + (v1 - v0) * (1 - expf(-attack / tau0));
ryood 24:e9fbadd15e90 139 amplitude = (vAttack - v2) * (expf(-(float)(tick - attack) / tau1)) + v2;
ryood 22:a3bb7594f9bb 140 }
ryood 22:a3bb7594f9bb 141 return amplitude;
ryood 22:a3bb7594f9bb 142 }
ryood 22:a3bb7594f9bb 143
ryood 22:a3bb7594f9bb 144 private:
ryood 22:a3bb7594f9bb 145 int attack;
ryood 22:a3bb7594f9bb 146 int release;
ryood 22:a3bb7594f9bb 147 float amplitude;
ryood 22:a3bb7594f9bb 148 float v0;
ryood 22:a3bb7594f9bb 149 float v1;
ryood 22:a3bb7594f9bb 150 float v2;
ryood 22:a3bb7594f9bb 151 float tau0;
ryood 22:a3bb7594f9bb 152 float tau1;
ryood 22:a3bb7594f9bb 153 float attackTauRatio;
ryood 22:a3bb7594f9bb 154 float releaseTauRatio;
ryood 22:a3bb7594f9bb 155 };
ryood 22:a3bb7594f9bb 156
ryood 22:a3bb7594f9bb 157 #endif //_ENVELOPE_AR_H_