OSCtoCV Library
OSCtoCV_LFO.cpp
- Committer:
- casiotone401
- Date:
- 2016-01-17
- Revision:
- 0:cd43a974c54c
- Child:
- 1:981b62bb5c87
File content as of revision 0:cd43a974c54c:
/* OSCtoCV_Sequencer.cpp */ #include <math.h> #include <limits.h> #include "OSCtoCV_LFO.h" #include "OSCtoCV_Random.h" #include "OSCtoCV.h" #define M_PI 3.1415926535897932384626433832795 //------------------------------------------------------------- // update LFO float UpdateLFO(float freq) { static float pos; pos += 0.000015259 * freq; if (pos > 1.0f) { pos = 0; } return pos; } //------------------------------------------------------------- // triangle wave calc float TriWave(float pos) { return 1.0f - fabs(pos - 0.5f) * 2.0f; } //------------------------------------------------------------- // saw(ramp) wave calc float SawWave(float pos) { return 1.0f - pos; } //------------------------------------------------------------- // square wave calc float SqrWave(float pos) { return pos < 0.8f ? 1.0f : 0.0f; } //------------------------------------------------------------- // sine wave calc float SinWave(float pos) { return (sin(pos*2 * M_PI) + 1.0f) * 0.5f; } //------------------------------------------------------------- // exponential wave calc float ExpWave(float pos) { return powf((1.0f - fabs(pos - 0.5f) * 2.0f), 2.0); } //------------------------------------------------------------- // exp wave calc float LogWave(float pos) { return powf((1.0f - fabs(pos - 0.5f) * 2.0f), 0.5); } //------------------------------------------------------------- // synthesis wave calc sin float SynthWave1(float pos) { return (SinWave(pos) + SinWave(3 * pos) - SinWave(2 * pos)) * 0.5; } //------------------------------------------------------------- // synthesis wave calc sin float SynthWave2(float pos) { return (SinWave(pos) + SinWave(1 / 3 * pos) - SinWave(2 * pos)) * 0.3; } //------------------------------------------------------------- // invert float value float Invert(float x) { return SCALING_N - x; } //------------------------------------------------------------- // LFO cv generator void SteppedLFO(void) { static uint8_t ch, mcount, qmode, amode; int waveform; static int _waveform = -1; static int steps; static float lfocv[8], glidecv[8]; unsigned int cv; static float qcv; float freq; qmode = (gCtrl[1] * (SCALE_NUM - 1.0f)); // Sequencer Quantize Mode (gCtrl[1]) amode = SCALE_AOUT * qmode; gAOUT.write_u16(amode); // select waveform ArdSW1(gArdSW[0]) waveform = CheckSubMode1(); if (_waveform != waveform) // update LCD { switch (waveform) { case TRIANGLE_WAVE: UpdateSubModeLCD("Tr:::::"); break; case SAW_WAVE: UpdateSubModeLCD("Saw:::::"); break; case SQUARE_WAVE: UpdateSubModeLCD("Sqr:::::"); break; case SINE_WAVE: UpdateSubModeLCD("Sine::::"); break; case EXP_WAVE: UpdateSubModeLCD("Exp:::::"); break; case LOG_WAVE: UpdateSubModeLCD("Log:::::"); break; case SYNTH_WAVE: UpdateSubModeLCD("Syn:::::"); break; case NOISE: UpdateSubModeLCD("Noise:::"); break; default: break; } _waveform = waveform; } // frequency control ArdPot1(gArdPot[0]) freq = gArdPot[0] * 0.10f + 0.001f; switch (waveform) { case TRIANGLE_WAVE: lfocv[0] = TriWave(UpdateLFO(freq)) * SCALING_N; break; case SAW_WAVE: lfocv[0] = SawWave(UpdateLFO(freq)) * SCALING_N; break; case SQUARE_WAVE: lfocv[0] = SqrWave(UpdateLFO(freq)) * SCALING_N; break; case SINE_WAVE: lfocv[0] = SinWave(UpdateLFO(freq)) * SCALING_N; break; case EXP_WAVE: lfocv[0] = ExpWave(UpdateLFO(freq)) * SCALING_N; break; case LOG_WAVE: lfocv[0] = LogWave(UpdateLFO(freq)) * SCALING_N; break; case SYNTH_WAVE: lfocv[0] = SynthWave1(UpdateLFO(freq)) * SCALING_N; break; case NOISE: lfocv[0] = fmodf(Xorshift_32(), SCALING_N); break; default: break; } //lfocv[i + 4] = Invert(lfocv[i]); // ch4 ~ ch8 invert waveform switch (qmode) { case Lin: if (gArdPot[1] > 10) { 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)]; } glidecv[0] = glidecv[0] * gGlide + lfocv[0] * (1.0f - gGlide); break; case Chr: qcv = calibMap1[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES1 - 1))]; glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); break; case Maj: qcv = calibMap2[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES2 - 1))]; glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); break; case M7: qcv = calibMap3[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES3 - 1))]; glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); break; case Min7: qcv = calibMap4[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES4 - 1))]; glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); break; case Dor: qcv = calibMap5[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES5 - 1))]; glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); break; case Min: qcv = calibMap6[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES6 - 1))]; glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); break; case S5th: qcv = calibMap7[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES7 - 1))]; glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); break; case Wht: qcv = calibMap8[(unsigned int)MapFloat(lfocv[0], 0, SCALING_N, 0, (QUAN_RES8 - 1))]; glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); break; } cv = (unsigned int)(glidecv[0]); UpdateCV(WRITE_UPDATE_N, ch, &cv); if (mcount == 0x1F) { UpdateCVMeter(ch, &cv); } ++ch; if (ch &= 0x07) { ++mcount; mcount &= 0x3F; } }