OSCtoCV Library

Dependents:   OSCtoCVConverter

Committer:
casiotone401
Date:
Thu Feb 25 11:21:37 2016 +0000
Revision:
6:7fb15b1b5459
Parent:
4:fe335dc8d53d
minor change

Who changed what in which revision?

UserRevisionLine numberNew contents of line
casiotone401 0:cd43a974c54c 1 /*
casiotone401 4:fe335dc8d53d 2 OSCtoCV_Random.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 4:fe335dc8d53d 38
casiotone401 0:cd43a974c54c 39 double Rnd(void) /* 0 <= rnd() < 1 */
casiotone401 0:cd43a974c54c 40 {
casiotone401 0:cd43a974c54c 41 return (1.0 / (UINT_MAX + 1.0)) * Xorshift_32();
casiotone401 0:cd43a974c54c 42 }
casiotone401 0:cd43a974c54c 43
casiotone401 0:cd43a974c54c 44 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 45 // beta distribution random generator
casiotone401 0:cd43a974c54c 46
casiotone401 0:cd43a974c54c 47 double RndBeta(double a, double b)
casiotone401 0:cd43a974c54c 48 {
casiotone401 0:cd43a974c54c 49 double x, y;
casiotone401 0:cd43a974c54c 50
casiotone401 0:cd43a974c54c 51 do {
casiotone401 0:cd43a974c54c 52 x = pow(Rnd(), (1 / a));
casiotone401 0:cd43a974c54c 53 y = pow(Rnd(), (1 / b));
casiotone401 0:cd43a974c54c 54
casiotone401 0:cd43a974c54c 55 } while (x + y > 1);
casiotone401 0:cd43a974c54c 56
casiotone401 0:cd43a974c54c 57 return x / (x + y);
casiotone401 0:cd43a974c54c 58 }
casiotone401 0:cd43a974c54c 59
casiotone401 0:cd43a974c54c 60
casiotone401 0:cd43a974c54c 61 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 62 // sequential random cv generator
casiotone401 0:cd43a974c54c 63
casiotone401 0:cd43a974c54c 64 void RandomCVGenerator(int trigger)
casiotone401 0:cd43a974c54c 65 {
casiotone401 0:cd43a974c54c 66 int i, modeState;
casiotone401 0:cd43a974c54c 67 static int _modeState = -1;
casiotone401 0:cd43a974c54c 68 static bool triggerState = false;
casiotone401 4:fe335dc8d53d 69 static uint8_t ch;
casiotone401 0:cd43a974c54c 70 static float randomcv[8], glidecv[8];
casiotone401 0:cd43a974c54c 71 unsigned int cv;
casiotone401 0:cd43a974c54c 72 static float qcv;
casiotone401 1:981b62bb5c87 73 static int jitter, jitterCount;
casiotone401 0:cd43a974c54c 74
casiotone401 4:fe335dc8d53d 75 switch (CheckQuantizeMode())
casiotone401 0:cd43a974c54c 76 {
casiotone401 0:cd43a974c54c 77 case Lin:
casiotone401 0:cd43a974c54c 78
casiotone401 0:cd43a974c54c 79 glidecv[ch] = glidecv[ch] * gGlide + randomcv[ch] * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 80 break;
casiotone401 0:cd43a974c54c 81
casiotone401 0:cd43a974c54c 82 case Chr:
casiotone401 0:cd43a974c54c 83
casiotone401 0:cd43a974c54c 84 qcv = calibMap1[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES1 - 1))];
casiotone401 0:cd43a974c54c 85
casiotone401 0:cd43a974c54c 86 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 87
casiotone401 0:cd43a974c54c 88 break;
casiotone401 0:cd43a974c54c 89
casiotone401 0:cd43a974c54c 90 case Maj:
casiotone401 0:cd43a974c54c 91
casiotone401 0:cd43a974c54c 92 qcv = calibMap2[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES2 - 1))];
casiotone401 0:cd43a974c54c 93
casiotone401 0:cd43a974c54c 94 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 95
casiotone401 0:cd43a974c54c 96 break;
casiotone401 0:cd43a974c54c 97
casiotone401 0:cd43a974c54c 98 case M7:
casiotone401 0:cd43a974c54c 99
casiotone401 0:cd43a974c54c 100 qcv = calibMap3[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES3 - 1))];
casiotone401 0:cd43a974c54c 101
casiotone401 0:cd43a974c54c 102 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 103
casiotone401 0:cd43a974c54c 104 break;
casiotone401 0:cd43a974c54c 105
casiotone401 0:cd43a974c54c 106 case Min7:
casiotone401 0:cd43a974c54c 107
casiotone401 0:cd43a974c54c 108 qcv = calibMap4[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES4 - 1))];
casiotone401 0:cd43a974c54c 109
casiotone401 0:cd43a974c54c 110 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 111
casiotone401 0:cd43a974c54c 112 break;
casiotone401 0:cd43a974c54c 113
casiotone401 0:cd43a974c54c 114 case Dor:
casiotone401 0:cd43a974c54c 115
casiotone401 0:cd43a974c54c 116 qcv = calibMap5[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES5 - 1))];
casiotone401 0:cd43a974c54c 117
casiotone401 0:cd43a974c54c 118 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 119
casiotone401 0:cd43a974c54c 120 break;
casiotone401 0:cd43a974c54c 121
casiotone401 0:cd43a974c54c 122 case Min:
casiotone401 0:cd43a974c54c 123
casiotone401 0:cd43a974c54c 124 qcv = calibMap6[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES6 - 1))];
casiotone401 0:cd43a974c54c 125
casiotone401 0:cd43a974c54c 126 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 127
casiotone401 0:cd43a974c54c 128 break;
casiotone401 0:cd43a974c54c 129
casiotone401 0:cd43a974c54c 130 case S5th:
casiotone401 0:cd43a974c54c 131
casiotone401 0:cd43a974c54c 132 qcv = calibMap7[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES7 - 1))];
casiotone401 0:cd43a974c54c 133
casiotone401 0:cd43a974c54c 134 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 135
casiotone401 0:cd43a974c54c 136 break;
casiotone401 0:cd43a974c54c 137
casiotone401 0:cd43a974c54c 138 case Wht:
casiotone401 0:cd43a974c54c 139
casiotone401 0:cd43a974c54c 140 qcv = calibMap8[(unsigned int)MapFloat(randomcv[ch], 0, SCALING_N, 0, (QUAN_RES8 - 1))];
casiotone401 0:cd43a974c54c 141
casiotone401 0:cd43a974c54c 142 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:cd43a974c54c 143
casiotone401 0:cd43a974c54c 144 break;
casiotone401 0:cd43a974c54c 145 }
casiotone401 0:cd43a974c54c 146
casiotone401 1:981b62bb5c87 147 if (!gCtrlSW[4])
casiotone401 1:981b62bb5c87 148 {
casiotone401 1:981b62bb5c87 149 jitter = 0;
casiotone401 1:981b62bb5c87 150
casiotone401 1:981b62bb5c87 151 } else if (gCtrlSW[4] && jitterCount % 64 == 0) { // ASR Analog Mode
casiotone401 1:981b62bb5c87 152
casiotone401 1:981b62bb5c87 153 jitter = ANALOG_JITTER;
casiotone401 1:981b62bb5c87 154 }
casiotone401 1:981b62bb5c87 155
casiotone401 1:981b62bb5c87 156 cv = (unsigned int)(glidecv[ch] + jitter);
casiotone401 0:cd43a974c54c 157
casiotone401 0:cd43a974c54c 158 UpdateCV(WRITE_UPDATE_N, ch, &cv);
casiotone401 0:cd43a974c54c 159
casiotone401 0:cd43a974c54c 160 if (trigger && !triggerState) // trigger ON
casiotone401 0:cd43a974c54c 161 {
casiotone401 0:cd43a974c54c 162 modeState = CheckSubMode1();
casiotone401 0:cd43a974c54c 163
casiotone401 0:cd43a974c54c 164 for (i = 0; i < 8; ++i)
casiotone401 0:cd43a974c54c 165 {
casiotone401 0:cd43a974c54c 166 if (modeState % 2)
casiotone401 0:cd43a974c54c 167 {
casiotone401 0:cd43a974c54c 168 // xorshift random
casiotone401 0:cd43a974c54c 169 randomcv[i] = fmodf(Xorshift_32(), SCALING_N);
casiotone401 0:cd43a974c54c 170
casiotone401 0:cd43a974c54c 171 if (_modeState != modeState)
casiotone401 0:cd43a974c54c 172 {
casiotone401 0:cd43a974c54c 173 UpdateSubModeLCD("Xorshift");
casiotone401 0:cd43a974c54c 174 }
casiotone401 0:cd43a974c54c 175
casiotone401 0:cd43a974c54c 176 } else {
casiotone401 0:cd43a974c54c 177 // beta dist random
casiotone401 0:cd43a974c54c 178 randomcv[i] = RndBeta(MapFloat(gArdPot[0], 0, 1023.0f, 0, 5), MapFloat(gArdPot[1], 0, 1023.0f, 0, 5)) * SCALING_N;
casiotone401 0:cd43a974c54c 179
casiotone401 0:cd43a974c54c 180 if (_modeState != modeState)
casiotone401 0:cd43a974c54c 181 {
casiotone401 1:981b62bb5c87 182 UpdateSubModeLCD(" -dist");
casiotone401 1:981b62bb5c87 183 gLCD.locate( 0, 1 );
casiotone401 1:981b62bb5c87 184 gLCD.putc(0xE2); // beta
casiotone401 1:981b62bb5c87 185
casiotone401 1:981b62bb5c87 186 sendMes.setTopAddress("/submode");
casiotone401 1:981b62bb5c87 187 sendMes.setArgs("s", "beta-dist");
casiotone401 1:981b62bb5c87 188
casiotone401 1:981b62bb5c87 189 osc.sendOsc(&sendMes);
casiotone401 0:cd43a974c54c 190 }
casiotone401 0:cd43a974c54c 191
casiotone401 0:cd43a974c54c 192 }
casiotone401 0:cd43a974c54c 193
casiotone401 0:cd43a974c54c 194 }
casiotone401 0:cd43a974c54c 195
casiotone401 0:cd43a974c54c 196 _modeState = modeState;
casiotone401 0:cd43a974c54c 197
casiotone401 0:cd43a974c54c 198 UpdateCVMeter(ch, &cv);
casiotone401 0:cd43a974c54c 199
casiotone401 0:cd43a974c54c 200 gGATES[0] = gGATES[1] = true;
casiotone401 0:cd43a974c54c 201
casiotone401 0:cd43a974c54c 202 triggerState = true;
casiotone401 0:cd43a974c54c 203
casiotone401 0:cd43a974c54c 204 } else if (!trigger) { // trigger OFF
casiotone401 0:cd43a974c54c 205
casiotone401 0:cd43a974c54c 206 gGATES[0] = gGATES[1] = false;
casiotone401 0:cd43a974c54c 207
casiotone401 0:cd43a974c54c 208 triggerState = false;
casiotone401 0:cd43a974c54c 209 }
casiotone401 0:cd43a974c54c 210
casiotone401 0:cd43a974c54c 211 ++ch;
casiotone401 0:cd43a974c54c 212 ch &= 0x07;
casiotone401 1:981b62bb5c87 213
casiotone401 1:981b62bb5c87 214 ++jitterCount;
casiotone401 1:981b62bb5c87 215 jitterCount &= 0x1FF;
casiotone401 0:cd43a974c54c 216
casiotone401 0:cd43a974c54c 217 }