OSCtoCV Library
Diff: OSCtoCV_LFO.cpp
- Revision:
- 1:981b62bb5c87
- Parent:
- 0:cd43a974c54c
- Child:
- 4:fe335dc8d53d
--- a/OSCtoCV_LFO.cpp Sun Jan 17 09:30:32 2016 +0000 +++ b/OSCtoCV_LFO.cpp Thu Jan 28 11:39:47 2016 +0000 @@ -103,9 +103,10 @@ //------------------------------------------------------------- // LFO cv generator -void SteppedLFO(void) +void SteppedLFO(unsigned int channelOffset, bool quantizeOff) { - static uint8_t ch, mcount, qmode, amode; + static uint8_t ch = channelOffset; + static uint8_t mcount, qmode, amode; int waveform; static int _waveform = -1; static int steps; @@ -113,8 +114,10 @@ unsigned int cv; static float qcv; float freq; + static int jitter, jitterCount; qmode = (gCtrl[1] * (SCALE_NUM - 1.0f)); // Sequencer Quantize Mode (gCtrl[1]) + amode = SCALE_AOUT * qmode; gAOUT.write_u16(amode); @@ -128,42 +131,42 @@ { case TRIANGLE_WAVE: - UpdateSubModeLCD("Tr:::::"); + UpdateSubModeLCD("Tri:Wave"); break; case SAW_WAVE: - UpdateSubModeLCD("Saw:::::"); + UpdateSubModeLCD("Saw:Wave"); break; case SQUARE_WAVE: - UpdateSubModeLCD("Sqr:::::"); + UpdateSubModeLCD("Sqr:Wave"); break; case SINE_WAVE: - UpdateSubModeLCD("Sine::::"); + UpdateSubModeLCD("Sin:Wave"); break; case EXP_WAVE: - UpdateSubModeLCD("Exp:::::"); + UpdateSubModeLCD("Exp:Wave"); break; case LOG_WAVE: - UpdateSubModeLCD("Log:::::"); + UpdateSubModeLCD("Log:Wave"); break; case SYNTH_WAVE: - UpdateSubModeLCD("Syn:::::"); + UpdateSubModeLCD("Syn:Wave"); break; case NOISE: - UpdateSubModeLCD("Noise:::"); + UpdateSubModeLCD("XorNoise"); break; default: @@ -180,42 +183,42 @@ { case TRIANGLE_WAVE: - lfocv[0] = TriWave(UpdateLFO(freq)) * SCALING_N; + lfocv[channelOffset] = TriWave(UpdateLFO(freq)) * SCALING_N; break; case SAW_WAVE: - lfocv[0] = SawWave(UpdateLFO(freq)) * SCALING_N; + lfocv[channelOffset] = SawWave(UpdateLFO(freq)) * SCALING_N; break; case SQUARE_WAVE: - lfocv[0] = SqrWave(UpdateLFO(freq)) * SCALING_N; + lfocv[channelOffset] = SqrWave(UpdateLFO(freq)) * SCALING_N; break; case SINE_WAVE: - lfocv[0] = SinWave(UpdateLFO(freq)) * SCALING_N; + lfocv[channelOffset] = SinWave(UpdateLFO(freq)) * SCALING_N; break; case EXP_WAVE: - lfocv[0] = ExpWave(UpdateLFO(freq)) * SCALING_N; + lfocv[channelOffset] = ExpWave(UpdateLFO(freq)) * SCALING_N; break; case LOG_WAVE: - lfocv[0] = LogWave(UpdateLFO(freq)) * SCALING_N; + lfocv[channelOffset] = LogWave(UpdateLFO(freq)) * SCALING_N; break; case SYNTH_WAVE: - lfocv[0] = SynthWave1(UpdateLFO(freq)) * SCALING_N; + lfocv[channelOffset] = SynthWave1(UpdateLFO(freq)) * SCALING_N; break; case NOISE: - lfocv[0] = fmodf(Xorshift_32(), SCALING_N); + lfocv[channelOffset] = fmodf(Xorshift_32(), SCALING_N); break; default: @@ -224,6 +227,11 @@ //lfocv[i + 4] = Invert(lfocv[i]); // ch4 ~ ch8 invert waveform + if (quantizeOff) // quantize Off + { + qmode = Lin; + } + switch (qmode) { case Lin: @@ -232,79 +240,88 @@ { steps = (unsigned int)gArdPot[1] * 0.1; // check LFO Steps(Quantize Resolustion)ArdPot2gArdPot[1] - lfocv[0] = quantizedMap[(unsigned int)(MapFloat(lfocv[0], 0, SCALING_N, 0, steps)) * (1024 / steps)]; + lfocv[channelOffset] = quantizedMap[(unsigned int)(MapFloat(lfocv[channelOffset], 0, SCALING_N, 0, steps)) * (1024 / steps)]; } - glidecv[0] = glidecv[0] * gGlide + lfocv[0] * (1.0f - gGlide); + glidecv[channelOffset] = glidecv[channelOffset] * gGlide + lfocv[channelOffset] * (1.0f - gGlide); break; case Chr: - qcv = calibMap1[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES1 - 1))]; + qcv = calibMap1[(unsigned int)MapFloat(lfocv[channelOffset], 0, SCALING_N, 0, (QUAN_RES1 - 1))]; - glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); + glidecv[channelOffset] = glidecv[channelOffset] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); break; case Maj: - qcv = calibMap2[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES2 - 1))]; + qcv = calibMap2[(unsigned int)MapFloat(lfocv[channelOffset], 0, SCALING_N, 0, (QUAN_RES2 - 1))]; - glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); + glidecv[channelOffset] = glidecv[channelOffset] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); break; case M7: - qcv = calibMap3[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES3 - 1))]; + qcv = calibMap3[(unsigned int)MapFloat(lfocv[channelOffset], 0, SCALING_N, 0, (QUAN_RES3 - 1))]; - glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); + glidecv[channelOffset] = glidecv[channelOffset] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); break; case Min7: - qcv = calibMap4[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES4 - 1))]; + qcv = calibMap4[(unsigned int)MapFloat(lfocv[channelOffset], 0, SCALING_N, 0, (QUAN_RES4 - 1))]; - glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); + glidecv[channelOffset] = glidecv[channelOffset] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); break; case Dor: - qcv = calibMap5[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES5 - 1))]; + qcv = calibMap5[(unsigned int)MapFloat(lfocv[channelOffset], 0, SCALING_N, 0, (QUAN_RES5 - 1))]; - glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); + glidecv[channelOffset] = glidecv[channelOffset] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); break; case Min: - qcv = calibMap6[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES6 - 1))]; + qcv = calibMap6[(unsigned int)MapFloat(lfocv[channelOffset], 0, SCALING_N, 0, (QUAN_RES6 - 1))]; - glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); + glidecv[channelOffset] = glidecv[channelOffset] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); break; case S5th: - qcv = calibMap7[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES7 - 1))]; + qcv = calibMap7[(unsigned int)MapFloat(lfocv[channelOffset], 0, SCALING_N, 0, (QUAN_RES7 - 1))]; - glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); + glidecv[channelOffset] = glidecv[channelOffset] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); break; case Wht: - qcv = calibMap8[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES8 - 1))]; + qcv = calibMap8[(unsigned int)MapFloat(lfocv[channelOffset], 0, SCALING_N, 0, (QUAN_RES8 - 1))]; - glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); + glidecv[channelOffset] = glidecv[channelOffset] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); break; } - cv = (unsigned int)(glidecv[0]); + if (!gCtrlSW[4]) + { + jitter = 0; + } else if (gCtrlSW[4] && jitterCount % 64 == 0) { // ASR Analog Mode + + jitter = ANALOG_JITTER; + } + + cv = (unsigned int)(glidecv[channelOffset] + jitter); + UpdateCV(WRITE_UPDATE_N, ch, &cv); if (mcount == 0x1F) @@ -314,13 +331,16 @@ ++ch; - if (ch &= 0x07) + if (ch == 8) { + ch = channelOffset - 1; //output channelOffset ~ ch8 + ++mcount; mcount &= 0x3F; } + + ++jitterCount; + jitterCount &= 0x1FF; } - -