OSCtoCV Library

Dependents:   OSCtoCVConverter

Committer:
casiotone401
Date:
Thu Jan 28 11:39:47 2016 +0000
Revision:
1:981b62bb5c87
Parent:
0:cd43a974c54c
Child:
4:fe335dc8d53d
added Beats Seq

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