OSCtoCV Library

Dependents:   OSCtoCVConverter

Revision:
0:cd43a974c54c
Child:
1:981b62bb5c87
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCtoCV_Random.cpp	Sun Jan 17 09:30:32 2016 +0000
@@ -0,0 +1,203 @@
+/*
+ OSCtoCV_Sequencer.cpp 
+*/
+
+#include <math.h>
+#include <limits.h>
+
+#include "OSCtoCV_Random.h"
+#include "OSCtoCV.h"
+
+unsigned long seed = 1; // lcg seed
+    
+//-------------------------------------------------------------
+// Linear congruential generator
+
+double Lcg(void)  /* 0 <= rnd() < 1 */ 
+{
+    seed = seed * 69069 + 1;
+           
+    return (1.0 / (ULONG_MAX + 1.0)) * seed;
+}
+
+//-------------------------------------------------------------
+// xorshift random generator
+
+uint32_t Xorshift_32(void)
+{
+  static uint32_t y = 35342; // seed
+
+  y = y ^ (y << 13);
+  y = y ^ (y >> 17);
+
+  return y = y ^ (y << 5);
+}
+
+//-------------------------------------------------------------
+// generate random number from 0 to 1
+double Rnd(void)  /* 0 <= rnd() < 1 */
+{       
+    return (1.0 / (UINT_MAX + 1.0)) * Xorshift_32();
+}
+
+//-------------------------------------------------------------
+// beta distribution random generator
+
+double RndBeta(double a, double b)
+{
+    double x, y;
+
+    do {
+        x = pow(Rnd(), (1 / a));
+        y = pow(Rnd(), (1 / b));
+
+    } while (x + y > 1);
+    
+    return x / (x + y);
+}
+
+
+//-------------------------------------------------------------
+// sequential random cv generator
+
+void RandomCVGenerator(int trigger)
+{
+    int i, modeState;
+    static int _modeState = -1;
+    static bool triggerState = false;
+    static uint8_t ch, qmode, amode;
+    static float randomcv[8], glidecv[8];
+    unsigned int cv;
+    static float qcv;
+        
+    qmode = (gCtrl[1] * (SCALE_NUM - 1.0f));  // Sequencer Quantize Mode (gCtrl[1])
+    amode = SCALE_AOUT * qmode;
+    
+    gAOUT.write_u16(amode);
+    
+    switch (qmode) 
+    {
+        case Lin:
+            
+            glidecv[ch] = glidecv[ch] * gGlide + randomcv[ch] * (1.0f - gGlide);
+            break;
+                
+        case Chr:
+
+            qcv = calibMap1[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES1 - 1))];
+                
+            glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+
+            break;
+            
+        case Maj:
+
+            qcv = calibMap2[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES2 - 1))];
+
+            glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+
+            break;
+        
+        case M7:
+            
+            qcv = calibMap3[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES3 - 1))];
+                
+            glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+
+            break;
+            
+        case Min7:
+
+            qcv = calibMap4[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES4 - 1))];
+
+            glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+
+            break;
+                
+        case Dor:
+            
+            qcv = calibMap5[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES5 - 1))];
+
+            glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+
+            break;
+    
+        case Min:
+            
+            qcv = calibMap6[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES6 - 1))];
+
+            glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+
+            break;
+            
+        case S5th:
+
+            qcv = calibMap7[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES7 - 1))];
+
+            glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+
+            break;
+            
+        case Wht:
+            
+            qcv = calibMap8[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES8 - 1))];
+
+            glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+            
+            break;
+    }     
+
+    cv = (unsigned int)(glidecv[ch]);
+    
+    UpdateCV(WRITE_UPDATE_N, ch, &cv);
+    
+    if (trigger && !triggerState) // trigger ON
+    { 
+        modeState = CheckSubMode1();
+          
+        for (i = 0; i < 8; ++i)
+        {
+            if (modeState % 2)
+            {
+                // xorshift random
+                randomcv[i] = fmodf(Xorshift_32(), SCALING_N);
+                
+                if (_modeState != modeState)
+                {
+                    UpdateSubModeLCD("Xorshift");
+                }
+                
+            } else {
+                // beta dist random
+                randomcv[i] = RndBeta(MapFloat(gArdPot[0], 0, 1023.0f, 0, 5), MapFloat(gArdPot[1], 0, 1023.0f, 0, 5)) * SCALING_N; 
+            
+                if (_modeState != modeState)
+                {
+                    UpdateSubModeLCD("BetaDist");
+                }
+                
+            }
+            
+        }
+        
+        _modeState = modeState;    
+        
+        UpdateCVMeter(ch, &cv);        
+
+        gGATES[0] = gGATES[1] = true;
+        
+        triggerState = true;
+        
+    } else if (!trigger) {        // trigger OFF
+        
+        gGATES[0] = gGATES[1] = false;
+        
+        triggerState = false;
+    }
+    
+    ++ch;
+    ch &= 0x07;
+
+}
+
+