OSCtoCV Library
Diff: OSCtoCV_LFO.cpp
- Revision:
- 0:cd43a974c54c
- Child:
- 1:981b62bb5c87
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OSCtoCV_LFO.cpp Sun Jan 17 09:30:32 2016 +0000 @@ -0,0 +1,326 @@ +/* + 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; + } + +} + + +