KIK01 Proto 08
Dependencies: AverageMCP3008 VoltageMonitor mbed-rtos mbed mcp3008
Fork of KIK01_Proto07 by
EnvelopeAR.h
00001 /* 00002 * AR Type Envelope Class 00003 * 00004 * 2017.09.18 00005 * 00006 */ 00007 00008 #ifndef _ENVELOPE_AR_H_ 00009 #define _ENVELOPE_AR_H_ 00010 00011 class EnvelopeParam 00012 { 00013 public: 00014 int attack; 00015 int release; 00016 float v0; 00017 float v1; 00018 float v2; 00019 float attackTauRatio; 00020 float releaseTauRatio; 00021 }; 00022 00023 class EnvelopeAR 00024 { 00025 public: 00026 EnvelopeAR(int _attack, int _release, float _v0, float _v1, float _v2, float _attackTauRatio=0.36f, float _releaseTauRatio=0.36f) : 00027 amplitude(_v0), 00028 v0(_v0), 00029 v1(_v1), 00030 v2(_v2), 00031 attackTauRatio(_attackTauRatio), 00032 releaseTauRatio(_releaseTauRatio) 00033 { 00034 setAttack(_attack); 00035 setRelease(_release); 00036 } 00037 00038 EnvelopeAR(const EnvelopeParam& param) : 00039 amplitude(param.v0), 00040 v0(param.v0), 00041 v1(param.v1), 00042 v2(param.v2), 00043 attackTauRatio(param.attackTauRatio), 00044 releaseTauRatio(param.releaseTauRatio) 00045 { 00046 setAttack(param.attack); 00047 setRelease(param.release); 00048 } 00049 00050 ~EnvelopeAR() {} 00051 00052 void setAttack(int _attack) { 00053 attack = _attack; 00054 tau0 = attack * attackTauRatio; 00055 } 00056 int getAttack() { 00057 return attack; 00058 } 00059 00060 void setRelease(int _release) { 00061 release = _release; 00062 tau1 = release * releaseTauRatio; 00063 } 00064 int getRelease() { 00065 return release; 00066 } 00067 00068 void setAttackTauRatio(float _attackTauRatio) { 00069 attackTauRatio = _attackTauRatio; 00070 tau0 = attack * attackTauRatio; 00071 } 00072 float getAttackTauRatio() { 00073 return attackTauRatio; 00074 } 00075 00076 void setReleaseTauRatio(float _releaseTauRatio) { 00077 releaseTauRatio = _releaseTauRatio; 00078 tau1 = release * releaseTauRatio; 00079 } 00080 float getReleaseTauRatio() { 00081 return releaseTauRatio; 00082 } 00083 00084 float getTau0() { 00085 return tau0; 00086 } 00087 float getTau1() { 00088 return tau1; 00089 } 00090 00091 void setV0(float _v0) { 00092 v0 = _v0; 00093 } 00094 float getV0() { 00095 return v0; 00096 } 00097 void setV1(float _v1) { 00098 v1 = _v1; 00099 } 00100 float getV1() { 00101 return v1; 00102 } 00103 void setV2(float _v2) { 00104 v2 = _v2; 00105 } 00106 float getV2() { 00107 return v2; 00108 } 00109 00110 float getAmplitude() { 00111 return amplitude; 00112 } 00113 00114 void setParam(const EnvelopeParam& param) { 00115 setV0(param.v0); 00116 setV1(param.v1); 00117 setV2(param.v2); 00118 setAttackTauRatio(param.attackTauRatio); 00119 setReleaseTauRatio(param.releaseTauRatio); 00120 setAttack(param.attack); 00121 setRelease(param.release); 00122 } 00123 00124 float getAmplitude(int tick) { 00125 if (tick <= attack) { 00126 // attackの処理 00127 amplitude = v0 + (v1 - v0) * (1 - expf(-(float)tick / tau0)); 00128 } else { 00129 // releaseの処理 00130 float vAttack = v0 + (v1 - v0) * (1 - expf(-attack / tau0)); 00131 amplitude = (vAttack - v2) * (expf(-(float)(tick - attack) / tau1)) + v2; 00132 } 00133 return amplitude; 00134 } 00135 00136 private: 00137 int attack; 00138 int release; 00139 float amplitude; 00140 float v0; 00141 float v1; 00142 float v2; 00143 float tau0; 00144 float tau1; 00145 float attackTauRatio; 00146 float releaseTauRatio; 00147 }; 00148 00149 #endif //_ENVELOPE_AR_H_
Generated on Thu Jul 14 2022 06:35:34 by 1.7.2