OSCtoCV Library

Dependents:   OSCtoCVConverter

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?

UserRevisionLine numberNew 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