OSCtoCV Library
Diff: OSCtoCV_Random.cpp
- 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; + +} + +