OSCtoCV Library

Dependents:   OSCtoCVConverter

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;
+    }
+
+}
+
+
+