OSCtoCV Library
OSCtoCV_Random.cpp@0:cd43a974c54c, 2016-01-17 (annotated)
- Committer:
- casiotone401
- Date:
- Sun Jan 17 09:30:32 2016 +0000
- Revision:
- 0:cd43a974c54c
- Child:
- 1:981b62bb5c87
added random, lfo mode
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
casiotone401 | 0:cd43a974c54c | 1 | /* |
casiotone401 | 0:cd43a974c54c | 2 | OSCtoCV_Sequencer.cpp |
casiotone401 | 0:cd43a974c54c | 3 | */ |
casiotone401 | 0:cd43a974c54c | 4 | |
casiotone401 | 0:cd43a974c54c | 5 | #include <math.h> |
casiotone401 | 0:cd43a974c54c | 6 | #include <limits.h> |
casiotone401 | 0:cd43a974c54c | 7 | |
casiotone401 | 0:cd43a974c54c | 8 | #include "OSCtoCV_Random.h" |
casiotone401 | 0:cd43a974c54c | 9 | #include "OSCtoCV.h" |
casiotone401 | 0:cd43a974c54c | 10 | |
casiotone401 | 0:cd43a974c54c | 11 | unsigned long seed = 1; // lcg seed |
casiotone401 | 0:cd43a974c54c | 12 | |
casiotone401 | 0:cd43a974c54c | 13 | //------------------------------------------------------------- |
casiotone401 | 0:cd43a974c54c | 14 | // Linear congruential generator |
casiotone401 | 0:cd43a974c54c | 15 | |
casiotone401 | 0:cd43a974c54c | 16 | double Lcg(void) /* 0 <= rnd() < 1 */ |
casiotone401 | 0:cd43a974c54c | 17 | { |
casiotone401 | 0:cd43a974c54c | 18 | seed = seed * 69069 + 1; |
casiotone401 | 0:cd43a974c54c | 19 | |
casiotone401 | 0:cd43a974c54c | 20 | return (1.0 / (ULONG_MAX + 1.0)) * seed; |
casiotone401 | 0:cd43a974c54c | 21 | } |
casiotone401 | 0:cd43a974c54c | 22 | |
casiotone401 | 0:cd43a974c54c | 23 | //------------------------------------------------------------- |
casiotone401 | 0:cd43a974c54c | 24 | // xorshift random generator |
casiotone401 | 0:cd43a974c54c | 25 | |
casiotone401 | 0:cd43a974c54c | 26 | uint32_t Xorshift_32(void) |
casiotone401 | 0:cd43a974c54c | 27 | { |
casiotone401 | 0:cd43a974c54c | 28 | static uint32_t y = 35342; // seed |
casiotone401 | 0:cd43a974c54c | 29 | |
casiotone401 | 0:cd43a974c54c | 30 | y = y ^ (y << 13); |
casiotone401 | 0:cd43a974c54c | 31 | y = y ^ (y >> 17); |
casiotone401 | 0:cd43a974c54c | 32 | |
casiotone401 | 0:cd43a974c54c | 33 | return y = y ^ (y << 5); |
casiotone401 | 0:cd43a974c54c | 34 | } |
casiotone401 | 0:cd43a974c54c | 35 | |
casiotone401 | 0:cd43a974c54c | 36 | //------------------------------------------------------------- |
casiotone401 | 0:cd43a974c54c | 37 | // generate random number from 0 to 1 |
casiotone401 | 0:cd43a974c54c | 38 | double Rnd(void) /* 0 <= rnd() < 1 */ |
casiotone401 | 0:cd43a974c54c | 39 | { |
casiotone401 | 0:cd43a974c54c | 40 | return (1.0 / (UINT_MAX + 1.0)) * Xorshift_32(); |
casiotone401 | 0:cd43a974c54c | 41 | } |
casiotone401 | 0:cd43a974c54c | 42 | |
casiotone401 | 0:cd43a974c54c | 43 | //------------------------------------------------------------- |
casiotone401 | 0:cd43a974c54c | 44 | // beta distribution random generator |
casiotone401 | 0:cd43a974c54c | 45 | |
casiotone401 | 0:cd43a974c54c | 46 | double RndBeta(double a, double b) |
casiotone401 | 0:cd43a974c54c | 47 | { |
casiotone401 | 0:cd43a974c54c | 48 | double x, y; |
casiotone401 | 0:cd43a974c54c | 49 | |
casiotone401 | 0:cd43a974c54c | 50 | do { |
casiotone401 | 0:cd43a974c54c | 51 | x = pow(Rnd(), (1 / a)); |
casiotone401 | 0:cd43a974c54c | 52 | y = pow(Rnd(), (1 / b)); |
casiotone401 | 0:cd43a974c54c | 53 | |
casiotone401 | 0:cd43a974c54c | 54 | } while (x + y > 1); |
casiotone401 | 0:cd43a974c54c | 55 | |
casiotone401 | 0:cd43a974c54c | 56 | return x / (x + y); |
casiotone401 | 0:cd43a974c54c | 57 | } |
casiotone401 | 0:cd43a974c54c | 58 | |
casiotone401 | 0:cd43a974c54c | 59 | |
casiotone401 | 0:cd43a974c54c | 60 | //------------------------------------------------------------- |
casiotone401 | 0:cd43a974c54c | 61 | // sequential random cv generator |
casiotone401 | 0:cd43a974c54c | 62 | |
casiotone401 | 0:cd43a974c54c | 63 | void RandomCVGenerator(int trigger) |
casiotone401 | 0:cd43a974c54c | 64 | { |
casiotone401 | 0:cd43a974c54c | 65 | int i, modeState; |
casiotone401 | 0:cd43a974c54c | 66 | static int _modeState = -1; |
casiotone401 | 0:cd43a974c54c | 67 | static bool triggerState = false; |
casiotone401 | 0:cd43a974c54c | 68 | static uint8_t ch, qmode, amode; |
casiotone401 | 0:cd43a974c54c | 69 | static float randomcv[8], glidecv[8]; |
casiotone401 | 0:cd43a974c54c | 70 | unsigned int cv; |
casiotone401 | 0:cd43a974c54c | 71 | static float qcv; |
casiotone401 | 0:cd43a974c54c | 72 | |
casiotone401 | 0:cd43a974c54c | 73 | qmode = (gCtrl[1] * (SCALE_NUM - 1.0f)); // Sequencer Quantize Mode (gCtrl[1]) |
casiotone401 | 0:cd43a974c54c | 74 | amode = SCALE_AOUT * qmode; |
casiotone401 | 0:cd43a974c54c | 75 | |
casiotone401 | 0:cd43a974c54c | 76 | gAOUT.write_u16(amode); |
casiotone401 | 0:cd43a974c54c | 77 | |
casiotone401 | 0:cd43a974c54c | 78 | switch (qmode) |
casiotone401 | 0:cd43a974c54c | 79 | { |
casiotone401 | 0:cd43a974c54c | 80 | case Lin: |
casiotone401 | 0:cd43a974c54c | 81 | |
casiotone401 | 0:cd43a974c54c | 82 | glidecv[ch] = glidecv[ch] * gGlide + randomcv[ch] * (1.0f - gGlide); |
casiotone401 | 0:cd43a974c54c | 83 | break; |
casiotone401 | 0:cd43a974c54c | 84 | |
casiotone401 | 0:cd43a974c54c | 85 | case Chr: |
casiotone401 | 0:cd43a974c54c | 86 | |
casiotone401 | 0:cd43a974c54c | 87 | qcv = calibMap1[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES1 - 1))]; |
casiotone401 | 0:cd43a974c54c | 88 | |
casiotone401 | 0:cd43a974c54c | 89 | glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); |
casiotone401 | 0:cd43a974c54c | 90 | |
casiotone401 | 0:cd43a974c54c | 91 | break; |
casiotone401 | 0:cd43a974c54c | 92 | |
casiotone401 | 0:cd43a974c54c | 93 | case Maj: |
casiotone401 | 0:cd43a974c54c | 94 | |
casiotone401 | 0:cd43a974c54c | 95 | qcv = calibMap2[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES2 - 1))]; |
casiotone401 | 0:cd43a974c54c | 96 | |
casiotone401 | 0:cd43a974c54c | 97 | glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); |
casiotone401 | 0:cd43a974c54c | 98 | |
casiotone401 | 0:cd43a974c54c | 99 | break; |
casiotone401 | 0:cd43a974c54c | 100 | |
casiotone401 | 0:cd43a974c54c | 101 | case M7: |
casiotone401 | 0:cd43a974c54c | 102 | |
casiotone401 | 0:cd43a974c54c | 103 | qcv = calibMap3[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES3 - 1))]; |
casiotone401 | 0:cd43a974c54c | 104 | |
casiotone401 | 0:cd43a974c54c | 105 | glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); |
casiotone401 | 0:cd43a974c54c | 106 | |
casiotone401 | 0:cd43a974c54c | 107 | break; |
casiotone401 | 0:cd43a974c54c | 108 | |
casiotone401 | 0:cd43a974c54c | 109 | case Min7: |
casiotone401 | 0:cd43a974c54c | 110 | |
casiotone401 | 0:cd43a974c54c | 111 | qcv = calibMap4[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES4 - 1))]; |
casiotone401 | 0:cd43a974c54c | 112 | |
casiotone401 | 0:cd43a974c54c | 113 | glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); |
casiotone401 | 0:cd43a974c54c | 114 | |
casiotone401 | 0:cd43a974c54c | 115 | break; |
casiotone401 | 0:cd43a974c54c | 116 | |
casiotone401 | 0:cd43a974c54c | 117 | case Dor: |
casiotone401 | 0:cd43a974c54c | 118 | |
casiotone401 | 0:cd43a974c54c | 119 | qcv = calibMap5[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES5 - 1))]; |
casiotone401 | 0:cd43a974c54c | 120 | |
casiotone401 | 0:cd43a974c54c | 121 | glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); |
casiotone401 | 0:cd43a974c54c | 122 | |
casiotone401 | 0:cd43a974c54c | 123 | break; |
casiotone401 | 0:cd43a974c54c | 124 | |
casiotone401 | 0:cd43a974c54c | 125 | case Min: |
casiotone401 | 0:cd43a974c54c | 126 | |
casiotone401 | 0:cd43a974c54c | 127 | qcv = calibMap6[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES6 - 1))]; |
casiotone401 | 0:cd43a974c54c | 128 | |
casiotone401 | 0:cd43a974c54c | 129 | glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); |
casiotone401 | 0:cd43a974c54c | 130 | |
casiotone401 | 0:cd43a974c54c | 131 | break; |
casiotone401 | 0:cd43a974c54c | 132 | |
casiotone401 | 0:cd43a974c54c | 133 | case S5th: |
casiotone401 | 0:cd43a974c54c | 134 | |
casiotone401 | 0:cd43a974c54c | 135 | qcv = calibMap7[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES7 - 1))]; |
casiotone401 | 0:cd43a974c54c | 136 | |
casiotone401 | 0:cd43a974c54c | 137 | glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); |
casiotone401 | 0:cd43a974c54c | 138 | |
casiotone401 | 0:cd43a974c54c | 139 | break; |
casiotone401 | 0:cd43a974c54c | 140 | |
casiotone401 | 0:cd43a974c54c | 141 | case Wht: |
casiotone401 | 0:cd43a974c54c | 142 | |
casiotone401 | 0:cd43a974c54c | 143 | qcv = calibMap8[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES8 - 1))]; |
casiotone401 | 0:cd43a974c54c | 144 | |
casiotone401 | 0:cd43a974c54c | 145 | glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide); |
casiotone401 | 0:cd43a974c54c | 146 | |
casiotone401 | 0:cd43a974c54c | 147 | break; |
casiotone401 | 0:cd43a974c54c | 148 | } |
casiotone401 | 0:cd43a974c54c | 149 | |
casiotone401 | 0:cd43a974c54c | 150 | cv = (unsigned int)(glidecv[ch]); |
casiotone401 | 0:cd43a974c54c | 151 | |
casiotone401 | 0:cd43a974c54c | 152 | UpdateCV(WRITE_UPDATE_N, ch, &cv); |
casiotone401 | 0:cd43a974c54c | 153 | |
casiotone401 | 0:cd43a974c54c | 154 | if (trigger && !triggerState) // trigger ON |
casiotone401 | 0:cd43a974c54c | 155 | { |
casiotone401 | 0:cd43a974c54c | 156 | modeState = CheckSubMode1(); |
casiotone401 | 0:cd43a974c54c | 157 | |
casiotone401 | 0:cd43a974c54c | 158 | for (i = 0; i < 8; ++i) |
casiotone401 | 0:cd43a974c54c | 159 | { |
casiotone401 | 0:cd43a974c54c | 160 | if (modeState % 2) |
casiotone401 | 0:cd43a974c54c | 161 | { |
casiotone401 | 0:cd43a974c54c | 162 | // xorshift random |
casiotone401 | 0:cd43a974c54c | 163 | randomcv[i] = fmodf(Xorshift_32(), SCALING_N); |
casiotone401 | 0:cd43a974c54c | 164 | |
casiotone401 | 0:cd43a974c54c | 165 | if (_modeState != modeState) |
casiotone401 | 0:cd43a974c54c | 166 | { |
casiotone401 | 0:cd43a974c54c | 167 | UpdateSubModeLCD("Xorshift"); |
casiotone401 | 0:cd43a974c54c | 168 | } |
casiotone401 | 0:cd43a974c54c | 169 | |
casiotone401 | 0:cd43a974c54c | 170 | } else { |
casiotone401 | 0:cd43a974c54c | 171 | // beta dist random |
casiotone401 | 0:cd43a974c54c | 172 | randomcv[i] = RndBeta(MapFloat(gArdPot[0], 0, 1023.0f, 0, 5), MapFloat(gArdPot[1], 0, 1023.0f, 0, 5)) * SCALING_N; |
casiotone401 | 0:cd43a974c54c | 173 | |
casiotone401 | 0:cd43a974c54c | 174 | if (_modeState != modeState) |
casiotone401 | 0:cd43a974c54c | 175 | { |
casiotone401 | 0:cd43a974c54c | 176 | UpdateSubModeLCD("BetaDist"); |
casiotone401 | 0:cd43a974c54c | 177 | } |
casiotone401 | 0:cd43a974c54c | 178 | |
casiotone401 | 0:cd43a974c54c | 179 | } |
casiotone401 | 0:cd43a974c54c | 180 | |
casiotone401 | 0:cd43a974c54c | 181 | } |
casiotone401 | 0:cd43a974c54c | 182 | |
casiotone401 | 0:cd43a974c54c | 183 | _modeState = modeState; |
casiotone401 | 0:cd43a974c54c | 184 | |
casiotone401 | 0:cd43a974c54c | 185 | UpdateCVMeter(ch, &cv); |
casiotone401 | 0:cd43a974c54c | 186 | |
casiotone401 | 0:cd43a974c54c | 187 | gGATES[0] = gGATES[1] = true; |
casiotone401 | 0:cd43a974c54c | 188 | |
casiotone401 | 0:cd43a974c54c | 189 | triggerState = true; |
casiotone401 | 0:cd43a974c54c | 190 | |
casiotone401 | 0:cd43a974c54c | 191 | } else if (!trigger) { // trigger OFF |
casiotone401 | 0:cd43a974c54c | 192 | |
casiotone401 | 0:cd43a974c54c | 193 | gGATES[0] = gGATES[1] = false; |
casiotone401 | 0:cd43a974c54c | 194 | |
casiotone401 | 0:cd43a974c54c | 195 | triggerState = false; |
casiotone401 | 0:cd43a974c54c | 196 | } |
casiotone401 | 0:cd43a974c54c | 197 | |
casiotone401 | 0:cd43a974c54c | 198 | ++ch; |
casiotone401 | 0:cd43a974c54c | 199 | ch &= 0x07; |
casiotone401 | 0:cd43a974c54c | 200 | |
casiotone401 | 0:cd43a974c54c | 201 | } |
casiotone401 | 0:cd43a974c54c | 202 | |
casiotone401 | 0:cd43a974c54c | 203 |