MCP3008 Version

Dependencies:   mbed-rtos mbed mcp3008

Fork of KIK01_Proto01 by Ryo Od

Committer:
ryood
Date:
Tue Jun 06 11:00:12 2017 +0000
Revision:
10:79134dbb339d
Parent:
9:d1e6eae9722b
Child:
11:7e11404adca0
read all params

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ryood 3:f89b400cfe57 1 /*
ryood 3:f89b400cfe57 2 * KIK01
ryood 3:f89b400cfe57 3 * Kick Machine
ryood 3:f89b400cfe57 4 *
ryood 3:f89b400cfe57 5 * 2017.06.04 created.
ryood 3:f89b400cfe57 6 *
ryood 3:f89b400cfe57 7 */
ryood 3:f89b400cfe57 8
ryood 0:2dcec10e9199 9 #include "mbed.h"
ryood 0:2dcec10e9199 10 #include "rtos.h"
ryood 0:2dcec10e9199 11
ryood 10:79134dbb339d 12 #define UART_TRACE (1)
ryood 0:2dcec10e9199 13 #define TITLE_STR1 ("KIK01 Kick Machine")
ryood 10:79134dbb339d 14 #define TITLE_STR2 ("20170606")
ryood 0:2dcec10e9199 15
ryood 0:2dcec10e9199 16 #define PI_F (3.1415926f)
ryood 9:d1e6eae9722b 17 #define SAMPLING_RATE (96000)
ryood 0:2dcec10e9199 18 #define SAMPLING_PERIOD (1.0f/SAMPLING_RATE)
ryood 10:79134dbb339d 19 #define UPDATE_RATE (1000)
ryood 0:2dcec10e9199 20
ryood 3:f89b400cfe57 21 AnalogOut Dac1(PA_5);
ryood 3:f89b400cfe57 22
ryood 5:846772a77d33 23 AnalogIn Ain0(PA_0);
ryood 5:846772a77d33 24 AnalogIn Ain1(PA_1);
ryood 5:846772a77d33 25 AnalogIn Ain2(PA_4);
ryood 5:846772a77d33 26 AnalogIn Ain3(PB_0);
ryood 5:846772a77d33 27 AnalogIn Ain4(PC_1);
ryood 5:846772a77d33 28 AnalogIn Ain5(PC_0);
ryood 5:846772a77d33 29 AnalogIn Ain6(PC_2);
ryood 5:846772a77d33 30 AnalogIn Ain7(PC_3);
ryood 0:2dcec10e9199 31
ryood 8:bb34a4894337 32 AnalogIn Ain8(PC_4);
ryood 8:bb34a4894337 33 AnalogIn Ain9(PB_1);
ryood 8:bb34a4894337 34 AnalogIn Ain10(PC_5);
ryood 10:79134dbb339d 35 AnalogIn Ain11(PA_6);
ryood 8:bb34a4894337 36
ryood 0:2dcec10e9199 37 class EnvelopeAR {
ryood 0:2dcec10e9199 38 public:
ryood 0:2dcec10e9199 39 EnvelopeAR(int _attack, int _release, float _v0, float _v1, float _v2, float _attackTauRatio=0.36f, float _releaseTauRatio=0.36f) :
ryood 0:2dcec10e9199 40 amplitude(_v0),
ryood 0:2dcec10e9199 41 v0(_v0),
ryood 0:2dcec10e9199 42 v1(_v1),
ryood 0:2dcec10e9199 43 v2(_v2),
ryood 0:2dcec10e9199 44 vLast(_v0),
ryood 0:2dcec10e9199 45 attackTauRatio(_attackTauRatio),
ryood 0:2dcec10e9199 46 releaseTauRatio(_releaseTauRatio)
ryood 0:2dcec10e9199 47 {
ryood 0:2dcec10e9199 48 setAttack(_attack);
ryood 0:2dcec10e9199 49 setRelease(_release);
ryood 0:2dcec10e9199 50 }
ryood 0:2dcec10e9199 51
ryood 0:2dcec10e9199 52 ~EnvelopeAR() {}
ryood 0:2dcec10e9199 53
ryood 0:2dcec10e9199 54 void setAttack(int _attack) {
ryood 0:2dcec10e9199 55 attack = _attack;
ryood 0:2dcec10e9199 56 tau0 = attack * attackTauRatio;
ryood 0:2dcec10e9199 57 }
ryood 0:2dcec10e9199 58 int getAttack() { return attack; }
ryood 0:2dcec10e9199 59
ryood 0:2dcec10e9199 60 void setRelease(int _release) {
ryood 0:2dcec10e9199 61 release = _release;
ryood 0:2dcec10e9199 62 tau1 = release * releaseTauRatio;
ryood 0:2dcec10e9199 63 }
ryood 0:2dcec10e9199 64 int getRelease() { return release; }
ryood 0:2dcec10e9199 65
ryood 5:846772a77d33 66 void setAttackTauRatio(float _attackTauRatio) {
ryood 5:846772a77d33 67 attackTauRatio = _attackTauRatio;
ryood 5:846772a77d33 68 tau0 = attack * attackTauRatio;
ryood 5:846772a77d33 69 }
ryood 0:2dcec10e9199 70 float getAttackTauRatio() { return attackTauRatio; }
ryood 0:2dcec10e9199 71
ryood 5:846772a77d33 72 void setReleaseTauRatio(float _releaseTauRatio) {
ryood 5:846772a77d33 73 releaseTauRatio = _releaseTauRatio;
ryood 5:846772a77d33 74 tau1 = release * releaseTauRatio;
ryood 5:846772a77d33 75 }
ryood 0:2dcec10e9199 76 float getReleaseTauRatio() { return releaseTauRatio; }
ryood 5:846772a77d33 77
ryood 5:846772a77d33 78 float getTau0() { return tau0; }
ryood 5:846772a77d33 79 float getTau1() { return tau1; }
ryood 0:2dcec10e9199 80
ryood 0:2dcec10e9199 81 void setV0(float _v0) { v0 = _v0; }
ryood 0:2dcec10e9199 82 float getV0() { return v0; }
ryood 0:2dcec10e9199 83 void setV1(float _v1) { v1 = _v1; }
ryood 0:2dcec10e9199 84 float getV1() { return v1; }
ryood 0:2dcec10e9199 85 void setV2(float _v2) { v2 = _v2; }
ryood 0:2dcec10e9199 86 float getV2() { return v2; }
ryood 0:2dcec10e9199 87
ryood 0:2dcec10e9199 88 float getAmplitude() { return amplitude; }
ryood 0:2dcec10e9199 89 float getAmplitude(int tick) {
ryood 0:2dcec10e9199 90 if (tick < attack) {
ryood 0:2dcec10e9199 91 // attackの処理
ryood 0:2dcec10e9199 92 amplitude = v0 + (v1 - v0) * (1 - expf(-(float)tick / tau0));
ryood 0:2dcec10e9199 93 vLast = amplitude;
ryood 0:2dcec10e9199 94 }
ryood 0:2dcec10e9199 95 else {
ryood 0:2dcec10e9199 96 // releaseの処理
ryood 0:2dcec10e9199 97 amplitude = (vLast - v2) * (expf(-(float)(tick - attack) / tau1)) + v2;
ryood 0:2dcec10e9199 98 }
ryood 0:2dcec10e9199 99 return amplitude;
ryood 0:2dcec10e9199 100 }
ryood 0:2dcec10e9199 101
ryood 0:2dcec10e9199 102 private:
ryood 0:2dcec10e9199 103 int attack;
ryood 0:2dcec10e9199 104 int release;
ryood 0:2dcec10e9199 105 float amplitude;
ryood 0:2dcec10e9199 106 float v0;
ryood 0:2dcec10e9199 107 float v1;
ryood 0:2dcec10e9199 108 float v2;
ryood 0:2dcec10e9199 109 float vLast;
ryood 0:2dcec10e9199 110 float tau0;
ryood 0:2dcec10e9199 111 float tau1;
ryood 0:2dcec10e9199 112 float attackTauRatio;
ryood 0:2dcec10e9199 113 float releaseTauRatio;
ryood 0:2dcec10e9199 114 };
ryood 0:2dcec10e9199 115
ryood 5:846772a77d33 116 class EnvelopeParam {
ryood 5:846772a77d33 117 public:
ryood 5:846772a77d33 118 int attack;
ryood 5:846772a77d33 119 int release;
ryood 5:846772a77d33 120 float v0;
ryood 5:846772a77d33 121 float v1;
ryood 5:846772a77d33 122 float v2;
ryood 5:846772a77d33 123 float attackTauRatio;
ryood 5:846772a77d33 124 float releaseTauRatio;
ryood 5:846772a77d33 125 };
ryood 5:846772a77d33 126
ryood 9:d1e6eae9722b 127 EnvelopeAR envelopeFrequency(5, 300, 880.0f, 120.0f, 40.0f, 0.36f, 0.1f);
ryood 5:846772a77d33 128 EnvelopeAR envelopeAmplitude(50, 200, 0.99f, 1.0f, 0.0f);
ryood 5:846772a77d33 129
ryood 5:846772a77d33 130 volatile EnvelopeParam frequencyParam;
ryood 5:846772a77d33 131 volatile EnvelopeParam amplitudeParam;
ryood 0:2dcec10e9199 132
ryood 3:f89b400cfe57 133 volatile int ticks;
ryood 3:f89b400cfe57 134 volatile int envelopeTicks;
ryood 3:f89b400cfe57 135 volatile float frequency;
ryood 3:f89b400cfe57 136 volatile float phi;
ryood 3:f89b400cfe57 137 volatile float phiDelta;
ryood 3:f89b400cfe57 138 volatile float amplitude;
ryood 3:f89b400cfe57 139
ryood 5:846772a77d33 140 volatile float bpm;
ryood 5:846772a77d33 141 volatile int envelopeLength;
ryood 0:2dcec10e9199 142
ryood 0:2dcec10e9199 143 void generateWave()
ryood 0:2dcec10e9199 144 {
ryood 0:2dcec10e9199 145 phi += phiDelta;
ryood 0:2dcec10e9199 146 if (phi >= 1.0f) {
ryood 0:2dcec10e9199 147 phi -= 2.0f;
ryood 0:2dcec10e9199 148 }
ryood 10:79134dbb339d 149 float level = cosf(PI_F * phi) * amplitude;
ryood 1:f9b967ae26e4 150
ryood 3:f89b400cfe57 151 Dac1.write((level * 0.7f + 1.0f) / 2.0f);
ryood 0:2dcec10e9199 152 }
ryood 0:2dcec10e9199 153
ryood 0:2dcec10e9199 154 void generateEnvelope()
ryood 0:2dcec10e9199 155 {
ryood 0:2dcec10e9199 156 // Frequency Envelope
ryood 0:2dcec10e9199 157 frequency = envelopeFrequency.getAmplitude(envelopeTicks);
ryood 0:2dcec10e9199 158 phiDelta = 2.0f * frequency / SAMPLING_RATE;
ryood 0:2dcec10e9199 159
ryood 0:2dcec10e9199 160 // Amplitude Envelope
ryood 0:2dcec10e9199 161 amplitude = envelopeAmplitude.getAmplitude(envelopeTicks);
ryood 0:2dcec10e9199 162
ryood 0:2dcec10e9199 163 envelopeTicks++;
ryood 7:6735a343780e 164 if (envelopeTicks >= envelopeLength) {
ryood 0:2dcec10e9199 165 envelopeTicks = 0;
ryood 0:2dcec10e9199 166 }
ryood 0:2dcec10e9199 167 }
ryood 0:2dcec10e9199 168
ryood 2:8dff77a1ee4d 169 void update()
ryood 2:8dff77a1ee4d 170 {
ryood 3:f89b400cfe57 171 ticks++;
ryood 10:79134dbb339d 172 if (ticks >= SAMPLING_RATE / UPDATE_RATE) {
ryood 3:f89b400cfe57 173 ticks = 0;
ryood 5:846772a77d33 174
ryood 5:846772a77d33 175 // set envelope parameters
ryood 10:79134dbb339d 176 //envelopeLength = 60 * UPDATE_RATE / bpm;
ryood 5:846772a77d33 177
ryood 5:846772a77d33 178 envelopeAmplitude.setAttack(amplitudeParam.attack);
ryood 5:846772a77d33 179 envelopeAmplitude.setRelease(amplitudeParam.release);
ryood 5:846772a77d33 180 envelopeAmplitude.setV0(amplitudeParam.v0);
ryood 5:846772a77d33 181 envelopeAmplitude.setV1(amplitudeParam.v1);
ryood 5:846772a77d33 182 envelopeAmplitude.setV2(amplitudeParam.v2);
ryood 5:846772a77d33 183 envelopeAmplitude.setAttackTauRatio(amplitudeParam.attackTauRatio);
ryood 5:846772a77d33 184 envelopeAmplitude.setReleaseTauRatio(amplitudeParam.releaseTauRatio);
ryood 5:846772a77d33 185
ryood 6:897d6392b408 186 envelopeFrequency.setAttack(frequencyParam.attack);
ryood 6:897d6392b408 187 envelopeFrequency.setRelease(frequencyParam.release);
ryood 5:846772a77d33 188 envelopeFrequency.setV0(frequencyParam.v0);
ryood 6:897d6392b408 189 envelopeFrequency.setV1(frequencyParam.v1);
ryood 6:897d6392b408 190 envelopeFrequency.setV2(frequencyParam.v2);
ryood 6:897d6392b408 191 envelopeFrequency.setAttackTauRatio(frequencyParam.attackTauRatio);
ryood 6:897d6392b408 192 envelopeFrequency.setReleaseTauRatio(frequencyParam.releaseTauRatio);
ryood 5:846772a77d33 193
ryood 2:8dff77a1ee4d 194 generateEnvelope();
ryood 2:8dff77a1ee4d 195 }
ryood 2:8dff77a1ee4d 196 generateWave();
ryood 2:8dff77a1ee4d 197 }
ryood 2:8dff77a1ee4d 198
ryood 5:846772a77d33 199 void setParams()
ryood 5:846772a77d33 200 {
ryood 5:846772a77d33 201 bpm = Ain0.read() * 180.0f + 60.0f;
ryood 10:79134dbb339d 202 envelopeLength = 60 * UPDATE_RATE / bpm;
ryood 5:846772a77d33 203
ryood 5:846772a77d33 204 amplitudeParam.attack = Ain1.read() * envelopeLength;
ryood 5:846772a77d33 205 amplitudeParam.release = Ain2.read() * envelopeLength;
ryood 5:846772a77d33 206 amplitudeParam.v0 = Ain3.read();
ryood 5:846772a77d33 207 amplitudeParam.v1 = 1.0f;
ryood 5:846772a77d33 208 amplitudeParam.v2 = 0.0f;
ryood 5:846772a77d33 209 amplitudeParam.attackTauRatio = 0.36f;
ryood 9:d1e6eae9722b 210 amplitudeParam.releaseTauRatio = Ain4.read() + 0.01f;
ryood 5:846772a77d33 211
ryood 9:d1e6eae9722b 212 frequencyParam.attack = Ain8.read() * envelopeLength * 0.1f;
ryood 10:79134dbb339d 213 frequencyParam.release = Ain11.read() * envelopeLength + 1;
ryood 6:897d6392b408 214 frequencyParam.v0 = Ain5.read() * 4000.0f;
ryood 6:897d6392b408 215 frequencyParam.v1 = Ain6.read() * 400.0f;
ryood 6:897d6392b408 216 frequencyParam.v2 = Ain7.read() * 400.0f;
ryood 9:d1e6eae9722b 217 frequencyParam.attackTauRatio = Ain9.read() + 0.01f;
ryood 9:d1e6eae9722b 218 frequencyParam.releaseTauRatio = Ain10.read() + 0.01f;
ryood 5:846772a77d33 219 }
ryood 5:846772a77d33 220
ryood 0:2dcec10e9199 221 int main()
ryood 0:2dcec10e9199 222 {
ryood 0:2dcec10e9199 223 printf("%s %s\r\n", TITLE_STR1, TITLE_STR2);
ryood 0:2dcec10e9199 224
ryood 0:2dcec10e9199 225 frequency = 1000.0f;
ryood 0:2dcec10e9199 226 phiDelta = 2.0f * frequency / SAMPLING_RATE;
ryood 0:2dcec10e9199 227 amplitude = 1.0f;
ryood 0:2dcec10e9199 228
ryood 3:f89b400cfe57 229 ticks = 0;
ryood 2:8dff77a1ee4d 230 envelopeTicks = 0;
ryood 1:f9b967ae26e4 231
ryood 5:846772a77d33 232 bpm = 120.0f;
ryood 5:846772a77d33 233 setParams();
ryood 5:846772a77d33 234
ryood 2:8dff77a1ee4d 235 Ticker samplingTicker;
ryood 2:8dff77a1ee4d 236 samplingTicker.attach(&update, SAMPLING_PERIOD);
ryood 2:8dff77a1ee4d 237
ryood 3:f89b400cfe57 238 for (;;) {
ryood 5:846772a77d33 239 setParams();
ryood 10:79134dbb339d 240
ryood 10:79134dbb339d 241 #if UART_TRACE
ryood 6:897d6392b408 242 printf("%.1f\t%d\t", bpm, envelopeLength);
ryood 6:897d6392b408 243
ryood 6:897d6392b408 244 printf("%d\t%d\t", amplitudeParam.attack, amplitudeParam.release);
ryood 6:897d6392b408 245 printf("%.2f\t%.2f\t%.2f\t", amplitudeParam.v0, amplitudeParam.v1, amplitudeParam.v2);
ryood 6:897d6392b408 246 printf("%.2f\t%.2f\t", amplitudeParam.attackTauRatio, amplitudeParam.releaseTauRatio);
ryood 6:897d6392b408 247
ryood 6:897d6392b408 248 printf("%d\t%d\t", frequencyParam.attack, frequencyParam.release);
ryood 6:897d6392b408 249 printf("%.2f\t%.2f\t%.2f\t", frequencyParam.v0, frequencyParam.v1, frequencyParam.v2);
ryood 6:897d6392b408 250 printf("%.2f\t%.2f\r\n", frequencyParam.attackTauRatio, frequencyParam.releaseTauRatio);
ryood 10:79134dbb339d 251 #endif
ryood 6:897d6392b408 252
ryood 9:d1e6eae9722b 253 Thread::wait(100);
ryood 3:f89b400cfe57 254 }
ryood 0:2dcec10e9199 255 }