OSCtoCV Library

Dependents:   OSCtoCVConverter

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