OSCtoCV Library

Dependents:   OSCtoCVConverter

Committer:
casiotone401
Date:
Sun Jan 17 09:30:32 2016 +0000
Revision:
0:cd43a974c54c
Child:
1:981b62bb5c87
added random, lfo mode

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 0:cd43a974c54c 106 void SteppedLFO(void)
casiotone401 0:cd43a974c54c 107 {
casiotone401 0:cd43a974c54c 108 static uint8_t ch, mcount, qmode, amode;
casiotone401 0:cd43a974c54c 109 int waveform;
casiotone401 0:cd43a974c54c 110 static int _waveform = -1;
casiotone401 0:cd43a974c54c 111 static int steps;
casiotone401 0:cd43a974c54c 112 static float lfocv[8], glidecv[8];
casiotone401 0:cd43a974c54c 113 unsigned int cv;
casiotone401 0:cd43a974c54c 114 static float qcv;
casiotone401 0:cd43a974c54c 115 float freq;
casiotone401 0:cd43a974c54c 116
casiotone401 0:cd43a974c54c 117 qmode = (gCtrl[1] * (SCALE_NUM - 1.0f)); // Sequencer Quantize Mode (gCtrl[1])
casiotone401 0:cd43a974c54c 118 amode = SCALE_AOUT * qmode;
casiotone401 0:cd43a974c54c 119
casiotone401 0:cd43a974c54c 120 gAOUT.write_u16(amode);
casiotone401 0:cd43a974c54c 121
casiotone401 0:cd43a974c54c 122 // select waveform ArdSW1(gArdSW[0])
casiotone401 0:cd43a974c54c 123 waveform = CheckSubMode1();
casiotone401 0:cd43a974c54c 124
casiotone401 0:cd43a974c54c 125 if (_waveform != waveform) // update LCD
casiotone401 0:cd43a974c54c 126 {
casiotone401 0:cd43a974c54c 127 switch (waveform)
casiotone401 0:cd43a974c54c 128 {
casiotone401 0:cd43a974c54c 129 case TRIANGLE_WAVE:
casiotone401 0:cd43a974c54c 130
casiotone401 0:cd43a974c54c 131 UpdateSubModeLCD("Tr:::::");
casiotone401 0:cd43a974c54c 132 break;
casiotone401 0:cd43a974c54c 133
casiotone401 0:cd43a974c54c 134 case SAW_WAVE:
casiotone401 0:cd43a974c54c 135
casiotone401 0:cd43a974c54c 136 UpdateSubModeLCD("Saw:::::");
casiotone401 0:cd43a974c54c 137 break;
casiotone401 0:cd43a974c54c 138
casiotone401 0:cd43a974c54c 139 case SQUARE_WAVE:
casiotone401 0:cd43a974c54c 140
casiotone401 0:cd43a974c54c 141 UpdateSubModeLCD("Sqr:::::");
casiotone401 0:cd43a974c54c 142 break;
casiotone401 0:cd43a974c54c 143
casiotone401 0:cd43a974c54c 144 case SINE_WAVE:
casiotone401 0:cd43a974c54c 145
casiotone401 0:cd43a974c54c 146 UpdateSubModeLCD("Sine::::");
casiotone401 0:cd43a974c54c 147 break;
casiotone401 0:cd43a974c54c 148
casiotone401 0:cd43a974c54c 149 case EXP_WAVE:
casiotone401 0:cd43a974c54c 150
casiotone401 0:cd43a974c54c 151 UpdateSubModeLCD("Exp:::::");
casiotone401 0:cd43a974c54c 152 break;
casiotone401 0:cd43a974c54c 153
casiotone401 0:cd43a974c54c 154 case LOG_WAVE:
casiotone401 0:cd43a974c54c 155
casiotone401 0:cd43a974c54c 156 UpdateSubModeLCD("Log:::::");
casiotone401 0:cd43a974c54c 157 break;
casiotone401 0:cd43a974c54c 158
casiotone401 0:cd43a974c54c 159 case SYNTH_WAVE:
casiotone401 0:cd43a974c54c 160
casiotone401 0:cd43a974c54c 161 UpdateSubModeLCD("Syn:::::");
casiotone401 0:cd43a974c54c 162 break;
casiotone401 0:cd43a974c54c 163
casiotone401 0:cd43a974c54c 164 case NOISE:
casiotone401 0:cd43a974c54c 165
casiotone401 0:cd43a974c54c 166 UpdateSubModeLCD("Noise:::");
casiotone401 0:cd43a974c54c 167 break;
casiotone401 0:cd43a974c54c 168
casiotone401 0:cd43a974c54c 169 default:
casiotone401 0:cd43a974c54c 170 break;
casiotone401 0:cd43a974c54c 171 }
casiotone401 0:cd43a974c54c 172
casiotone401 0:cd43a974c54c 173 _waveform = waveform;
casiotone401 0:cd43a974c54c 174 }
casiotone401 0:cd43a974c54c 175
casiotone401 0:cd43a974c54c 176 // frequency control ArdPot1(gArdPot[0])
casiotone401 0:cd43a974c54c 177 freq = gArdPot[0] * 0.10f + 0.001f;
casiotone401 0:cd43a974c54c 178
casiotone401 0:cd43a974c54c 179 switch (waveform)
casiotone401 0:cd43a974c54c 180 {
casiotone401 0:cd43a974c54c 181 case TRIANGLE_WAVE:
casiotone401 0:cd43a974c54c 182
casiotone401 0:cd43a974c54c 183 lfocv[0] = TriWave(UpdateLFO(freq)) * SCALING_N;
casiotone401 0:cd43a974c54c 184 break;
casiotone401 0:cd43a974c54c 185
casiotone401 0:cd43a974c54c 186 case SAW_WAVE:
casiotone401 0:cd43a974c54c 187
casiotone401 0:cd43a974c54c 188 lfocv[0] = SawWave(UpdateLFO(freq)) * SCALING_N;
casiotone401 0:cd43a974c54c 189 break;
casiotone401 0:cd43a974c54c 190
casiotone401 0:cd43a974c54c 191 case SQUARE_WAVE:
casiotone401 0:cd43a974c54c 192
casiotone401 0:cd43a974c54c 193 lfocv[0] = SqrWave(UpdateLFO(freq)) * SCALING_N;
casiotone401 0:cd43a974c54c 194 break;
casiotone401 0:cd43a974c54c 195
casiotone401 0:cd43a974c54c 196 case SINE_WAVE:
casiotone401 0:cd43a974c54c 197
casiotone401 0:cd43a974c54c 198 lfocv[0] = SinWave(UpdateLFO(freq)) * SCALING_N;
casiotone401 0:cd43a974c54c 199 break;
casiotone401 0:cd43a974c54c 200
casiotone401 0:cd43a974c54c 201 case EXP_WAVE:
casiotone401 0:cd43a974c54c 202
casiotone401 0:cd43a974c54c 203 lfocv[0] = ExpWave(UpdateLFO(freq)) * SCALING_N;
casiotone401 0:cd43a974c54c 204 break;
casiotone401 0:cd43a974c54c 205
casiotone401 0:cd43a974c54c 206 case LOG_WAVE:
casiotone401 0:cd43a974c54c 207
casiotone401 0:cd43a974c54c 208 lfocv[0] = LogWave(UpdateLFO(freq)) * SCALING_N;
casiotone401 0:cd43a974c54c 209 break;
casiotone401 0:cd43a974c54c 210
casiotone401 0:cd43a974c54c 211 case SYNTH_WAVE:
casiotone401 0:cd43a974c54c 212
casiotone401 0:cd43a974c54c 213 lfocv[0] = SynthWave1(UpdateLFO(freq)) * SCALING_N;
casiotone401 0:cd43a974c54c 214 break;
casiotone401 0:cd43a974c54c 215
casiotone401 0:cd43a974c54c 216 case NOISE:
casiotone401 0:cd43a974c54c 217
casiotone401 0:cd43a974c54c 218 lfocv[0] = fmodf(Xorshift_32(), SCALING_N);
casiotone401 0:cd43a974c54c 219 break;
casiotone401 0:cd43a974c54c 220
casiotone401 0:cd43a974c54c 221 default:
casiotone401 0:cd43a974c54c 222 break;
casiotone401 0:cd43a974c54c 223 }
casiotone401 0:cd43a974c54c 224
casiotone401 0:cd43a974c54c 225 //lfocv[i + 4] = Invert(lfocv[i]); // ch4 ~ ch8 invert waveform
casiotone401 0:cd43a974c54c 226
casiotone401 0:cd43a974c54c 227 switch (qmode)
casiotone401 0:cd43a974c54c 228 {
casiotone401 0:cd43a974c54c 229 case Lin:
casiotone401 0:cd43a974c54c 230
casiotone401 0:cd43a974c54c 231 if (gArdPot[1] > 10)
casiotone401 0:cd43a974c54c 232 {
casiotone401 0:cd43a974c54c 233 steps = (unsigned int)gArdPot[1] * 0.1; // check LFO Steps(Quantize Resolustion)ArdPot2gArdPot[1]
casiotone401 0:cd43a974c54c 234
casiotone401 0:cd43a974c54c 235 lfocv[0] = quantizedMap[(unsigned int)(MapFloat(lfocv[0], 0, SCALING_N, 0, steps)) * (1024 / steps)];
casiotone401 0:cd43a974c54c 236 }
casiotone401 0:cd43a974c54c 237
casiotone401 0:cd43a974c54c 238 glidecv[0] = glidecv[0] * gGlide + lfocv[0] * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 239 break;
casiotone401 0:cd43a974c54c 240
casiotone401 0:cd43a974c54c 241 case Chr:
casiotone401 0:cd43a974c54c 242
casiotone401 0:cd43a974c54c 243 qcv = calibMap1[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES1 - 1))];
casiotone401 0:cd43a974c54c 244
casiotone401 0:cd43a974c54c 245 glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 246
casiotone401 0:cd43a974c54c 247 break;
casiotone401 0:cd43a974c54c 248
casiotone401 0:cd43a974c54c 249 case Maj:
casiotone401 0:cd43a974c54c 250
casiotone401 0:cd43a974c54c 251 qcv = calibMap2[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES2 - 1))];
casiotone401 0:cd43a974c54c 252
casiotone401 0:cd43a974c54c 253 glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 254
casiotone401 0:cd43a974c54c 255 break;
casiotone401 0:cd43a974c54c 256
casiotone401 0:cd43a974c54c 257 case M7:
casiotone401 0:cd43a974c54c 258
casiotone401 0:cd43a974c54c 259 qcv = calibMap3[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES3 - 1))];
casiotone401 0:cd43a974c54c 260
casiotone401 0:cd43a974c54c 261 glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 262
casiotone401 0:cd43a974c54c 263 break;
casiotone401 0:cd43a974c54c 264
casiotone401 0:cd43a974c54c 265 case Min7:
casiotone401 0:cd43a974c54c 266
casiotone401 0:cd43a974c54c 267 qcv = calibMap4[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES4 - 1))];
casiotone401 0:cd43a974c54c 268
casiotone401 0:cd43a974c54c 269 glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 270
casiotone401 0:cd43a974c54c 271 break;
casiotone401 0:cd43a974c54c 272
casiotone401 0:cd43a974c54c 273 case Dor:
casiotone401 0:cd43a974c54c 274
casiotone401 0:cd43a974c54c 275 qcv = calibMap5[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES5 - 1))];
casiotone401 0:cd43a974c54c 276
casiotone401 0:cd43a974c54c 277 glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 278
casiotone401 0:cd43a974c54c 279 break;
casiotone401 0:cd43a974c54c 280
casiotone401 0:cd43a974c54c 281 case Min:
casiotone401 0:cd43a974c54c 282
casiotone401 0:cd43a974c54c 283 qcv = calibMap6[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES6 - 1))];
casiotone401 0:cd43a974c54c 284
casiotone401 0:cd43a974c54c 285 glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 286
casiotone401 0:cd43a974c54c 287 break;
casiotone401 0:cd43a974c54c 288
casiotone401 0:cd43a974c54c 289 case S5th:
casiotone401 0:cd43a974c54c 290
casiotone401 0:cd43a974c54c 291 qcv = calibMap7[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES7 - 1))];
casiotone401 0:cd43a974c54c 292
casiotone401 0:cd43a974c54c 293 glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 294
casiotone401 0:cd43a974c54c 295 break;
casiotone401 0:cd43a974c54c 296
casiotone401 0:cd43a974c54c 297 case Wht:
casiotone401 0:cd43a974c54c 298
casiotone401 0:cd43a974c54c 299 qcv = calibMap8[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES8 - 1))];
casiotone401 0:cd43a974c54c 300
casiotone401 0:cd43a974c54c 301 glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 302
casiotone401 0:cd43a974c54c 303 break;
casiotone401 0:cd43a974c54c 304 }
casiotone401 0:cd43a974c54c 305
casiotone401 0:cd43a974c54c 306 cv = (unsigned int)(glidecv[0]);
casiotone401 0:cd43a974c54c 307
casiotone401 0:cd43a974c54c 308 UpdateCV(WRITE_UPDATE_N, ch, &cv);
casiotone401 0:cd43a974c54c 309
casiotone401 0:cd43a974c54c 310 if (mcount == 0x1F)
casiotone401 0:cd43a974c54c 311 {
casiotone401 0:cd43a974c54c 312 UpdateCVMeter(ch, &cv);
casiotone401 0:cd43a974c54c 313 }
casiotone401 0:cd43a974c54c 314
casiotone401 0:cd43a974c54c 315 ++ch;
casiotone401 0:cd43a974c54c 316
casiotone401 0:cd43a974c54c 317 if (ch &= 0x07)
casiotone401 0:cd43a974c54c 318 {
casiotone401 0:cd43a974c54c 319 ++mcount;
casiotone401 0:cd43a974c54c 320 mcount &= 0x3F;
casiotone401 0:cd43a974c54c 321 }
casiotone401 0:cd43a974c54c 322
casiotone401 0:cd43a974c54c 323 }
casiotone401 0:cd43a974c54c 324
casiotone401 0:cd43a974c54c 325
casiotone401 0:cd43a974c54c 326