OSCtoCV Library

Dependents:   OSCtoCVConverter

Committer:
casiotone401
Date:
Thu Feb 25 11:21:37 2016 +0000
Revision:
6:7fb15b1b5459
Parent:
4:fe335dc8d53d
minor change

Who changed what in which revision?

UserRevisionLine numberNew contents of line
casiotone401 0:cd43a974c54c 1 /*
casiotone401 0:cd43a974c54c 2 OSCtoCV_Sequencer.cpp
casiotone401 0:cd43a974c54c 3 */
casiotone401 0:cd43a974c54c 4
casiotone401 0:cd43a974c54c 5 #include <math.h>
casiotone401 0:cd43a974c54c 6 #include <limits.h>
casiotone401 0:cd43a974c54c 7
casiotone401 0:cd43a974c54c 8 #include "OSCtoCV_LFO.h"
casiotone401 0:cd43a974c54c 9 #include "OSCtoCV_Random.h"
casiotone401 0:cd43a974c54c 10 #include "OSCtoCV.h"
casiotone401 0:cd43a974c54c 11
casiotone401 0:cd43a974c54c 12 #define M_PI 3.1415926535897932384626433832795
casiotone401 0:cd43a974c54c 13
casiotone401 0:cd43a974c54c 14 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 15 // update LFO
casiotone401 0:cd43a974c54c 16
casiotone401 0:cd43a974c54c 17 float UpdateLFO(float freq)
casiotone401 0:cd43a974c54c 18 {
casiotone401 0:cd43a974c54c 19 static float pos;
casiotone401 0:cd43a974c54c 20
casiotone401 0:cd43a974c54c 21 pos += 0.000015259 * freq;
casiotone401 0:cd43a974c54c 22
casiotone401 0:cd43a974c54c 23 if (pos > 1.0f)
casiotone401 0:cd43a974c54c 24 {
casiotone401 0:cd43a974c54c 25 pos = 0;
casiotone401 0:cd43a974c54c 26 }
casiotone401 0:cd43a974c54c 27
casiotone401 0:cd43a974c54c 28 return pos;
casiotone401 0:cd43a974c54c 29 }
casiotone401 0:cd43a974c54c 30
casiotone401 0:cd43a974c54c 31 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 32 // triangle wave calc
casiotone401 0:cd43a974c54c 33
casiotone401 0:cd43a974c54c 34 float TriWave(float pos)
casiotone401 0:cd43a974c54c 35 {
casiotone401 0:cd43a974c54c 36 return 1.0f - fabs(pos - 0.5f) * 2.0f;
casiotone401 0:cd43a974c54c 37 }
casiotone401 0:cd43a974c54c 38
casiotone401 0:cd43a974c54c 39 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 40 // saw(ramp) wave calc
casiotone401 0:cd43a974c54c 41
casiotone401 0:cd43a974c54c 42 float SawWave(float pos)
casiotone401 0:cd43a974c54c 43 {
casiotone401 0:cd43a974c54c 44 return 1.0f - pos;
casiotone401 0:cd43a974c54c 45 }
casiotone401 0:cd43a974c54c 46
casiotone401 0:cd43a974c54c 47 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 48 // square wave calc
casiotone401 0:cd43a974c54c 49
casiotone401 0:cd43a974c54c 50 float SqrWave(float pos)
casiotone401 0:cd43a974c54c 51 {
casiotone401 0:cd43a974c54c 52 return pos < 0.8f ? 1.0f : 0.0f;
casiotone401 0:cd43a974c54c 53 }
casiotone401 0:cd43a974c54c 54
casiotone401 0:cd43a974c54c 55 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 56 // sine wave calc
casiotone401 0:cd43a974c54c 57
casiotone401 0:cd43a974c54c 58 float SinWave(float pos)
casiotone401 0:cd43a974c54c 59 {
casiotone401 0:cd43a974c54c 60 return (sin(pos*2 * M_PI) + 1.0f) * 0.5f;
casiotone401 0:cd43a974c54c 61 }
casiotone401 0:cd43a974c54c 62
casiotone401 0:cd43a974c54c 63 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 64 // exponential wave calc
casiotone401 0:cd43a974c54c 65
casiotone401 0:cd43a974c54c 66 float ExpWave(float pos)
casiotone401 0:cd43a974c54c 67 {
casiotone401 0:cd43a974c54c 68 return powf((1.0f - fabs(pos - 0.5f) * 2.0f), 2.0);
casiotone401 0:cd43a974c54c 69 }
casiotone401 0:cd43a974c54c 70
casiotone401 0:cd43a974c54c 71 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 72 // exp wave calc
casiotone401 0:cd43a974c54c 73
casiotone401 0:cd43a974c54c 74 float LogWave(float pos)
casiotone401 0:cd43a974c54c 75 {
casiotone401 0:cd43a974c54c 76 return powf((1.0f - fabs(pos - 0.5f) * 2.0f), 0.5);
casiotone401 0:cd43a974c54c 77 }
casiotone401 0:cd43a974c54c 78
casiotone401 0:cd43a974c54c 79 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 80 // synthesis wave calc sin
casiotone401 0:cd43a974c54c 81
casiotone401 0:cd43a974c54c 82 float SynthWave1(float pos)
casiotone401 0:cd43a974c54c 83 {
casiotone401 0:cd43a974c54c 84 return (SinWave(pos) + SinWave(3 * pos) - SinWave(2 * pos)) * 0.5;
casiotone401 0:cd43a974c54c 85 }
casiotone401 0:cd43a974c54c 86
casiotone401 0:cd43a974c54c 87 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 88 // synthesis wave calc sin
casiotone401 0:cd43a974c54c 89
casiotone401 0:cd43a974c54c 90 float SynthWave2(float pos)
casiotone401 0:cd43a974c54c 91 {
casiotone401 0:cd43a974c54c 92 return (SinWave(pos) + SinWave(1 / 3 * pos) - SinWave(2 * pos)) * 0.3;
casiotone401 0:cd43a974c54c 93 }
casiotone401 0:cd43a974c54c 94
casiotone401 0:cd43a974c54c 95 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 96 // invert float value
casiotone401 0:cd43a974c54c 97
casiotone401 0:cd43a974c54c 98 float Invert(float x)
casiotone401 0:cd43a974c54c 99 {
casiotone401 0:cd43a974c54c 100 return SCALING_N - x;
casiotone401 0:cd43a974c54c 101 }
casiotone401 0:cd43a974c54c 102
casiotone401 0:cd43a974c54c 103 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 104 // LFO cv generator
casiotone401 0:cd43a974c54c 105
casiotone401 6:7fb15b1b5459 106 void SteppedLFO(uint8_t channelOffset, bool quantizeOff)
casiotone401 0:cd43a974c54c 107 {
casiotone401 1:981b62bb5c87 108 static uint8_t ch = channelOffset;
casiotone401 4:fe335dc8d53d 109 static uint8_t mcount;
casiotone401 0:cd43a974c54c 110 int waveform;
casiotone401 0:cd43a974c54c 111 static int _waveform = -1;
casiotone401 0:cd43a974c54c 112 static int steps;
casiotone401 4:fe335dc8d53d 113 uint8_t qmode;
casiotone401 0:cd43a974c54c 114 static float lfocv[8], glidecv[8];
casiotone401 0:cd43a974c54c 115 unsigned int cv;
casiotone401 0:cd43a974c54c 116 static float qcv;
casiotone401 0:cd43a974c54c 117 float freq;
casiotone401 1:981b62bb5c87 118 static int jitter, jitterCount;
casiotone401 4:fe335dc8d53d 119
casiotone401 0:cd43a974c54c 120 // select waveform ArdSW1(gArdSW[0])
casiotone401 0:cd43a974c54c 121 waveform = CheckSubMode1();
casiotone401 0:cd43a974c54c 122
casiotone401 0:cd43a974c54c 123 if (_waveform != waveform) // update LCD
casiotone401 0:cd43a974c54c 124 {
casiotone401 0:cd43a974c54c 125 switch (waveform)
casiotone401 0:cd43a974c54c 126 {
casiotone401 0:cd43a974c54c 127 case TRIANGLE_WAVE:
casiotone401 0:cd43a974c54c 128
casiotone401 1:981b62bb5c87 129 UpdateSubModeLCD("Tri:Wave");
casiotone401 0:cd43a974c54c 130 break;
casiotone401 0:cd43a974c54c 131
casiotone401 0:cd43a974c54c 132 case SAW_WAVE:
casiotone401 0:cd43a974c54c 133
casiotone401 1:981b62bb5c87 134 UpdateSubModeLCD("Saw:Wave");
casiotone401 0:cd43a974c54c 135 break;
casiotone401 0:cd43a974c54c 136
casiotone401 0:cd43a974c54c 137 case SQUARE_WAVE:
casiotone401 0:cd43a974c54c 138
casiotone401 1:981b62bb5c87 139 UpdateSubModeLCD("Sqr:Wave");
casiotone401 0:cd43a974c54c 140 break;
casiotone401 0:cd43a974c54c 141
casiotone401 0:cd43a974c54c 142 case SINE_WAVE:
casiotone401 0:cd43a974c54c 143
casiotone401 1:981b62bb5c87 144 UpdateSubModeLCD("Sin:Wave");
casiotone401 0:cd43a974c54c 145 break;
casiotone401 0:cd43a974c54c 146
casiotone401 0:cd43a974c54c 147 case EXP_WAVE:
casiotone401 0:cd43a974c54c 148
casiotone401 1:981b62bb5c87 149 UpdateSubModeLCD("Exp:Wave");
casiotone401 0:cd43a974c54c 150 break;
casiotone401 0:cd43a974c54c 151
casiotone401 0:cd43a974c54c 152 case LOG_WAVE:
casiotone401 0:cd43a974c54c 153
casiotone401 1:981b62bb5c87 154 UpdateSubModeLCD("Log:Wave");
casiotone401 0:cd43a974c54c 155 break;
casiotone401 0:cd43a974c54c 156
casiotone401 0:cd43a974c54c 157 case SYNTH_WAVE:
casiotone401 0:cd43a974c54c 158
casiotone401 1:981b62bb5c87 159 UpdateSubModeLCD("Syn:Wave");
casiotone401 0:cd43a974c54c 160 break;
casiotone401 0:cd43a974c54c 161
casiotone401 0:cd43a974c54c 162 case NOISE:
casiotone401 0:cd43a974c54c 163
casiotone401 1:981b62bb5c87 164 UpdateSubModeLCD("XorNoise");
casiotone401 0:cd43a974c54c 165 break;
casiotone401 0:cd43a974c54c 166
casiotone401 0:cd43a974c54c 167 default:
casiotone401 0:cd43a974c54c 168 break;
casiotone401 0:cd43a974c54c 169 }
casiotone401 0:cd43a974c54c 170
casiotone401 0:cd43a974c54c 171 _waveform = waveform;
casiotone401 0:cd43a974c54c 172 }
casiotone401 0:cd43a974c54c 173
casiotone401 0:cd43a974c54c 174 // frequency control ArdPot1(gArdPot[0])
casiotone401 0:cd43a974c54c 175 freq = gArdPot[0] * 0.10f + 0.001f;
casiotone401 0:cd43a974c54c 176
casiotone401 0:cd43a974c54c 177 switch (waveform)
casiotone401 0:cd43a974c54c 178 {
casiotone401 0:cd43a974c54c 179 case TRIANGLE_WAVE:
casiotone401 0:cd43a974c54c 180
casiotone401 1:981b62bb5c87 181 lfocv[channelOffset] = TriWave(UpdateLFO(freq)) * SCALING_N;
casiotone401 0:cd43a974c54c 182 break;
casiotone401 0:cd43a974c54c 183
casiotone401 0:cd43a974c54c 184 case SAW_WAVE:
casiotone401 0:cd43a974c54c 185
casiotone401 1:981b62bb5c87 186 lfocv[channelOffset] = SawWave(UpdateLFO(freq)) * SCALING_N;
casiotone401 0:cd43a974c54c 187 break;
casiotone401 0:cd43a974c54c 188
casiotone401 0:cd43a974c54c 189 case SQUARE_WAVE:
casiotone401 0:cd43a974c54c 190
casiotone401 1:981b62bb5c87 191 lfocv[channelOffset] = SqrWave(UpdateLFO(freq)) * SCALING_N;
casiotone401 0:cd43a974c54c 192 break;
casiotone401 0:cd43a974c54c 193
casiotone401 0:cd43a974c54c 194 case SINE_WAVE:
casiotone401 0:cd43a974c54c 195
casiotone401 1:981b62bb5c87 196 lfocv[channelOffset] = SinWave(UpdateLFO(freq)) * SCALING_N;
casiotone401 0:cd43a974c54c 197 break;
casiotone401 0:cd43a974c54c 198
casiotone401 0:cd43a974c54c 199 case EXP_WAVE:
casiotone401 0:cd43a974c54c 200
casiotone401 1:981b62bb5c87 201 lfocv[channelOffset] = ExpWave(UpdateLFO(freq)) * SCALING_N;
casiotone401 0:cd43a974c54c 202 break;
casiotone401 0:cd43a974c54c 203
casiotone401 0:cd43a974c54c 204 case LOG_WAVE:
casiotone401 0:cd43a974c54c 205
casiotone401 1:981b62bb5c87 206 lfocv[channelOffset] = LogWave(UpdateLFO(freq)) * SCALING_N;
casiotone401 0:cd43a974c54c 207 break;
casiotone401 0:cd43a974c54c 208
casiotone401 0:cd43a974c54c 209 case SYNTH_WAVE:
casiotone401 0:cd43a974c54c 210
casiotone401 1:981b62bb5c87 211 lfocv[channelOffset] = SynthWave1(UpdateLFO(freq)) * SCALING_N;
casiotone401 0:cd43a974c54c 212 break;
casiotone401 0:cd43a974c54c 213
casiotone401 0:cd43a974c54c 214 case NOISE:
casiotone401 0:cd43a974c54c 215
casiotone401 1:981b62bb5c87 216 lfocv[channelOffset] = fmodf(Xorshift_32(), SCALING_N);
casiotone401 0:cd43a974c54c 217 break;
casiotone401 0:cd43a974c54c 218
casiotone401 0:cd43a974c54c 219 default:
casiotone401 0:cd43a974c54c 220 break;
casiotone401 0:cd43a974c54c 221 }
casiotone401 0:cd43a974c54c 222
casiotone401 0:cd43a974c54c 223 //lfocv[i + 4] = Invert(lfocv[i]); // ch4 ~ ch8 invert waveform
casiotone401 0:cd43a974c54c 224
casiotone401 1:981b62bb5c87 225 if (quantizeOff) // quantize Off
casiotone401 1:981b62bb5c87 226 {
casiotone401 1:981b62bb5c87 227 qmode = Lin;
casiotone401 4:fe335dc8d53d 228
casiotone401 4:fe335dc8d53d 229 } else {
casiotone401 4:fe335dc8d53d 230
casiotone401 4:fe335dc8d53d 231 qmode = CheckQuantizeMode();
casiotone401 1:981b62bb5c87 232 }
casiotone401 1:981b62bb5c87 233
casiotone401 0:cd43a974c54c 234 switch (qmode)
casiotone401 0:cd43a974c54c 235 {
casiotone401 0:cd43a974c54c 236 case Lin:
casiotone401 0:cd43a974c54c 237
casiotone401 0:cd43a974c54c 238 if (gArdPot[1] > 10)
casiotone401 0:cd43a974c54c 239 {
casiotone401 0:cd43a974c54c 240 steps = (unsigned int)gArdPot[1] * 0.1; // check LFO Steps(Quantize Resolustion)ArdPot2gArdPot[1]
casiotone401 0:cd43a974c54c 241
casiotone401 1:981b62bb5c87 242 lfocv[channelOffset] = quantizedMap[(unsigned int)(MapFloat(lfocv[channelOffset], 0, SCALING_N, 0, steps)) * (1024 / steps)];
casiotone401 0:cd43a974c54c 243 }
casiotone401 0:cd43a974c54c 244
casiotone401 1:981b62bb5c87 245 glidecv[channelOffset] = glidecv[channelOffset] * gGlide + lfocv[channelOffset] * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 246 break;
casiotone401 0:cd43a974c54c 247
casiotone401 0:cd43a974c54c 248 case Chr:
casiotone401 0:cd43a974c54c 249
casiotone401 1:981b62bb5c87 250 qcv = calibMap1[(unsigned int)MapFloat(lfocv[channelOffset], 0, SCALING_N, 0, (QUAN_RES1 - 1))];
casiotone401 0:cd43a974c54c 251
casiotone401 1:981b62bb5c87 252 glidecv[channelOffset] = glidecv[channelOffset] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 253
casiotone401 0:cd43a974c54c 254 break;
casiotone401 0:cd43a974c54c 255
casiotone401 0:cd43a974c54c 256 case Maj:
casiotone401 0:cd43a974c54c 257
casiotone401 1:981b62bb5c87 258 qcv = calibMap2[(unsigned int)MapFloat(lfocv[channelOffset], 0, SCALING_N, 0, (QUAN_RES2 - 1))];
casiotone401 0:cd43a974c54c 259
casiotone401 1:981b62bb5c87 260 glidecv[channelOffset] = glidecv[channelOffset] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 261
casiotone401 0:cd43a974c54c 262 break;
casiotone401 0:cd43a974c54c 263
casiotone401 0:cd43a974c54c 264 case M7:
casiotone401 0:cd43a974c54c 265
casiotone401 1:981b62bb5c87 266 qcv = calibMap3[(unsigned int)MapFloat(lfocv[channelOffset], 0, SCALING_N, 0, (QUAN_RES3 - 1))];
casiotone401 0:cd43a974c54c 267
casiotone401 1:981b62bb5c87 268 glidecv[channelOffset] = glidecv[channelOffset] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 269
casiotone401 0:cd43a974c54c 270 break;
casiotone401 0:cd43a974c54c 271
casiotone401 0:cd43a974c54c 272 case Min7:
casiotone401 0:cd43a974c54c 273
casiotone401 1:981b62bb5c87 274 qcv = calibMap4[(unsigned int)MapFloat(lfocv[channelOffset], 0, SCALING_N, 0, (QUAN_RES4 - 1))];
casiotone401 0:cd43a974c54c 275
casiotone401 1:981b62bb5c87 276 glidecv[channelOffset] = glidecv[channelOffset] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 277
casiotone401 0:cd43a974c54c 278 break;
casiotone401 0:cd43a974c54c 279
casiotone401 0:cd43a974c54c 280 case Dor:
casiotone401 0:cd43a974c54c 281
casiotone401 1:981b62bb5c87 282 qcv = calibMap5[(unsigned int)MapFloat(lfocv[channelOffset], 0, SCALING_N, 0, (QUAN_RES5 - 1))];
casiotone401 0:cd43a974c54c 283
casiotone401 1:981b62bb5c87 284 glidecv[channelOffset] = glidecv[channelOffset] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 285
casiotone401 0:cd43a974c54c 286 break;
casiotone401 0:cd43a974c54c 287
casiotone401 0:cd43a974c54c 288 case Min:
casiotone401 0:cd43a974c54c 289
casiotone401 1:981b62bb5c87 290 qcv = calibMap6[(unsigned int)MapFloat(lfocv[channelOffset], 0, SCALING_N, 0, (QUAN_RES6 - 1))];
casiotone401 0:cd43a974c54c 291
casiotone401 1:981b62bb5c87 292 glidecv[channelOffset] = glidecv[channelOffset] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 293
casiotone401 0:cd43a974c54c 294 break;
casiotone401 0:cd43a974c54c 295
casiotone401 0:cd43a974c54c 296 case S5th:
casiotone401 0:cd43a974c54c 297
casiotone401 1:981b62bb5c87 298 qcv = calibMap7[(unsigned int)MapFloat(lfocv[channelOffset], 0, SCALING_N, 0, (QUAN_RES7 - 1))];
casiotone401 0:cd43a974c54c 299
casiotone401 1:981b62bb5c87 300 glidecv[channelOffset] = glidecv[channelOffset] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 301
casiotone401 0:cd43a974c54c 302 break;
casiotone401 0:cd43a974c54c 303
casiotone401 0:cd43a974c54c 304 case Wht:
casiotone401 0:cd43a974c54c 305
casiotone401 1:981b62bb5c87 306 qcv = calibMap8[(unsigned int)MapFloat(lfocv[channelOffset], 0, SCALING_N, 0, (QUAN_RES8 - 1))];
casiotone401 0:cd43a974c54c 307
casiotone401 1:981b62bb5c87 308 glidecv[channelOffset] = glidecv[channelOffset] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 309
casiotone401 0:cd43a974c54c 310 break;
casiotone401 0:cd43a974c54c 311 }
casiotone401 0:cd43a974c54c 312
casiotone401 1:981b62bb5c87 313 if (!gCtrlSW[4])
casiotone401 1:981b62bb5c87 314 {
casiotone401 1:981b62bb5c87 315 jitter = 0;
casiotone401 0:cd43a974c54c 316
casiotone401 1:981b62bb5c87 317 } else if (gCtrlSW[4] && jitterCount % 64 == 0) { // ASR Analog Mode
casiotone401 1:981b62bb5c87 318
casiotone401 1:981b62bb5c87 319 jitter = ANALOG_JITTER;
casiotone401 1:981b62bb5c87 320 }
casiotone401 1:981b62bb5c87 321
casiotone401 1:981b62bb5c87 322 cv = (unsigned int)(glidecv[channelOffset] + jitter);
casiotone401 1:981b62bb5c87 323
casiotone401 0:cd43a974c54c 324 UpdateCV(WRITE_UPDATE_N, ch, &cv);
casiotone401 0:cd43a974c54c 325
casiotone401 0:cd43a974c54c 326 if (mcount == 0x1F)
casiotone401 0:cd43a974c54c 327 {
casiotone401 0:cd43a974c54c 328 UpdateCVMeter(ch, &cv);
casiotone401 0:cd43a974c54c 329 }
casiotone401 0:cd43a974c54c 330
casiotone401 0:cd43a974c54c 331 ++ch;
casiotone401 0:cd43a974c54c 332
casiotone401 1:981b62bb5c87 333 if (ch == 8)
casiotone401 0:cd43a974c54c 334 {
casiotone401 1:981b62bb5c87 335 ch = channelOffset - 1; //output channelOffset ~ ch8
casiotone401 1:981b62bb5c87 336
casiotone401 0:cd43a974c54c 337 ++mcount;
casiotone401 0:cd43a974c54c 338 mcount &= 0x3F;
casiotone401 0:cd43a974c54c 339 }
casiotone401 1:981b62bb5c87 340
casiotone401 1:981b62bb5c87 341 ++jitterCount;
casiotone401 1:981b62bb5c87 342 jitterCount &= 0x1FF;
casiotone401 0:cd43a974c54c 343
casiotone401 0:cd43a974c54c 344 }
casiotone401 0:cd43a974c54c 345