OSCtoCV Library
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Tue Jul 12 2022 22:47:49 by 1.7.2