OSCtoCV Library

Dependents:   OSCtoCVConverter

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers OSCtoCV_Random.cpp Source File

OSCtoCV_Random.cpp

00001 /*
00002  OSCtoCV_Random.cpp 
00003 */
00004 
00005 #include <math.h>
00006 #include <limits.h>
00007 
00008 #include "OSCtoCV_Random.h"
00009 #include "OSCtoCV.h"
00010 
00011 unsigned long seed = 1; // lcg seed
00012     
00013 //-------------------------------------------------------------
00014 // Linear congruential generator
00015 
00016 double Lcg(void)  /* 0 <= rnd() < 1 */ 
00017 {
00018     seed = seed * 69069 + 1;
00019            
00020     return (1.0 / (ULONG_MAX + 1.0)) * seed;
00021 }
00022 
00023 //-------------------------------------------------------------
00024 // xorshift random generator
00025 
00026 uint32_t Xorshift_32(void)
00027 {
00028   static uint32_t y = 35342; // seed
00029 
00030   y = y ^ (y << 13);
00031   y = y ^ (y >> 17);
00032 
00033   return y = y ^ (y << 5);
00034 }
00035 
00036 //-------------------------------------------------------------
00037 // generate random number from 0 to 1
00038 
00039 double Rnd(void)  /* 0 <= rnd() < 1 */
00040 {       
00041     return (1.0 / (UINT_MAX + 1.0)) * Xorshift_32();
00042 }
00043 
00044 //-------------------------------------------------------------
00045 // beta distribution random generator
00046 
00047 double RndBeta(double a, double b)
00048 {
00049     double x, y;
00050 
00051     do {
00052         x = pow(Rnd(), (1 / a));
00053         y = pow(Rnd(), (1 / b));
00054 
00055     } while (x + y > 1);
00056     
00057     return x / (x + y);
00058 }
00059 
00060 
00061 //-------------------------------------------------------------
00062 // sequential random cv generator
00063 
00064 void RandomCVGenerator(int trigger)
00065 {
00066     int i, modeState;
00067     static int _modeState = -1;
00068     static bool triggerState = false;
00069     static uint8_t ch;
00070     static float randomcv[8], glidecv[8];
00071     unsigned int cv;
00072     static float qcv;
00073     static int jitter, jitterCount;
00074     
00075     switch (CheckQuantizeMode()) 
00076     {
00077         case Lin:
00078             
00079             glidecv[ch] = glidecv[ch] * gGlide + randomcv[ch] * (1.0f - gGlide);
00080             break;
00081                 
00082         case Chr:
00083 
00084             qcv = calibMap1[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES1 - 1))];
00085                 
00086             glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
00087 
00088             break;
00089             
00090         case Maj:
00091 
00092             qcv = calibMap2[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES2 - 1))];
00093 
00094             glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
00095 
00096             break;
00097         
00098         case M7:
00099             
00100             qcv = calibMap3[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES3 - 1))];
00101                 
00102             glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
00103 
00104             break;
00105             
00106         case Min7:
00107 
00108             qcv = calibMap4[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES4 - 1))];
00109 
00110             glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
00111 
00112             break;
00113                 
00114         case Dor:
00115             
00116             qcv = calibMap5[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES5 - 1))];
00117 
00118             glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
00119 
00120             break;
00121     
00122         case Min:
00123             
00124             qcv = calibMap6[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES6 - 1))];
00125 
00126             glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
00127 
00128             break;
00129             
00130         case S5th:
00131 
00132             qcv = calibMap7[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES7 - 1))];
00133 
00134             glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
00135 
00136             break;
00137             
00138         case Wht:
00139             
00140             qcv = calibMap8[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES8 - 1))];
00141 
00142             glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
00143             
00144             break;
00145     }     
00146 
00147     if (!gCtrlSW[4]) 
00148     { 
00149         jitter = 0;
00150     
00151     } else if (gCtrlSW[4] && jitterCount % 64 == 0) { // ASR Analog Mode
00152         
00153         jitter = ANALOG_JITTER; 
00154     }
00155     
00156     cv = (unsigned int)(glidecv[ch] + jitter);
00157     
00158     UpdateCV(WRITE_UPDATE_N, ch, &cv);
00159     
00160     if (trigger && !triggerState) // trigger ON
00161     { 
00162         modeState = CheckSubMode1();
00163           
00164         for (i = 0; i < 8; ++i)
00165         {
00166             if (modeState % 2)
00167             {
00168                 // xorshift random
00169                 randomcv[i] = fmodf(Xorshift_32(), SCALING_N);
00170                 
00171                 if (_modeState != modeState)
00172                 {
00173                     UpdateSubModeLCD("Xorshift");
00174                 }
00175                 
00176             } else {
00177                 // beta dist random
00178                 randomcv[i] = RndBeta(MapFloat(gArdPot[0], 0, 1023.0f, 0, 5), MapFloat(gArdPot[1], 0, 1023.0f, 0, 5)) * SCALING_N; 
00179             
00180                 if (_modeState != modeState)
00181                 {
00182                     UpdateSubModeLCD(" -dist");
00183                     gLCD.locate( 0, 1 );
00184                     gLCD.putc(0xE2); // beta
00185                     
00186                     sendMes.setTopAddress("/submode");
00187                     sendMes.setArgs("s", "beta-dist");
00188                     
00189                     osc.sendOsc(&sendMes);
00190                 }
00191                 
00192             }
00193             
00194         }
00195         
00196         _modeState = modeState;    
00197         
00198         UpdateCVMeter(ch, &cv);        
00199 
00200         gGATES[0] = gGATES[1] = true;
00201         
00202         triggerState = true;
00203         
00204     } else if (!trigger) {        // trigger OFF
00205         
00206         gGATES[0] = gGATES[1] = false;
00207         
00208         triggerState = false;
00209     }
00210     
00211     ++ch;
00212     ch &= 0x07;
00213     
00214     ++jitterCount;
00215     jitterCount &= 0x1FF;
00216 
00217 }