OSCtoCV Library
OSCtoCV_Euclidean.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_Euclidean.cpp |
casiotone401 | 0:cd43a974c54c | 3 | */ |
casiotone401 | 0:cd43a974c54c | 4 | |
casiotone401 | 0:cd43a974c54c | 5 | #include "mbed.h" |
casiotone401 | 0:cd43a974c54c | 6 | #include "OSCtoCV_Euclidean.h" |
casiotone401 | 0:cd43a974c54c | 7 | #include "OSCtoCV.h" |
casiotone401 | 0:cd43a974c54c | 8 | |
casiotone401 | 0:cd43a974c54c | 9 | |
casiotone401 | 0:cd43a974c54c | 10 | //------------------------------------------------------------- |
casiotone401 | 0:cd43a974c54c | 11 | // Global Variables |
casiotone401 | 0:cd43a974c54c | 12 | |
casiotone401 | 0:cd43a974c54c | 13 | int channels = MAXCHANNELS; |
casiotone401 | 0:cd43a974c54c | 14 | unsigned int beat_holder[MAXCHANNELS]; |
casiotone401 | 0:cd43a974c54c | 15 | unsigned int channelbeats[MAXCHANNELS][5]; |
casiotone401 | 0:cd43a974c54c | 16 | |
casiotone401 | 0:cd43a974c54c | 17 | bool pulses_active = false; // is active while a beat pulse is playing |
casiotone401 | 0:cd43a974c54c | 18 | bool lights_active = false; |
casiotone401 | 0:cd43a974c54c | 19 | int pulse_length = TRIGGER_DURATION; //pulse length |
casiotone401 | 0:cd43a974c54c | 20 | |
casiotone401 | 0:cd43a974c54c | 21 | unsigned int last_read[MAXCHANNELS]; |
casiotone401 | 0:cd43a974c54c | 22 | unsigned int last_changed[MAXCHANNELS]; |
casiotone401 | 0:cd43a974c54c | 23 | unsigned int last_sync; |
casiotone401 | 0:cd43a974c54c | 24 | |
casiotone401 | 0:cd43a974c54c | 25 | unsigned int euc_time; |
casiotone401 | 0:cd43a974c54c | 26 | |
casiotone401 | 0:cd43a974c54c | 27 | //------------------------------------------------------------- |
casiotone401 | 0:cd43a974c54c | 28 | // Euclidean Sequencer |
casiotone401 | 0:cd43a974c54c | 29 | |
casiotone401 | 0:cd43a974c54c | 30 | void EuclideanSeq(int trigger, bool reset, bool gatesoff) { |
casiotone401 | 0:cd43a974c54c | 31 | /* |
casiotone401 | 0:cd43a974c54c | 32 | What's in the loop: |
casiotone401 | 0:cd43a974c54c | 33 | Update euc_time variable |
casiotone401 | 0:cd43a974c54c | 34 | Check to see if it is euc_time go go to sleep |
casiotone401 | 0:cd43a974c54c | 35 | Changes routine - update beat_holder when channelbeats changes - triggered by changes == true |
casiotone401 | 0:cd43a974c54c | 36 | Trigger routines - on trigget update displays and pulse |
casiotone401 | 0:cd43a974c54c | 37 | Read encoders |
casiotone401 | 0:cd43a974c54c | 38 | Read switches |
casiotone401 | 0:cd43a974c54c | 39 | */ |
casiotone401 | 0:cd43a974c54c | 40 | |
casiotone401 | 0:cd43a974c54c | 41 | static uint8_t nn, kk, oo; |
casiotone401 | 0:cd43a974c54c | 42 | static uint8_t changes[MAXCHANNELS] = {0}; |
casiotone401 | 0:cd43a974c54c | 43 | static int nknob, kknob, oknob; |
casiotone401 | 0:cd43a974c54c | 44 | static int _nknob, _kknob, _oknob; |
casiotone401 | 0:cd43a974c54c | 45 | static bool triggerState = false; |
casiotone401 | 0:cd43a974c54c | 46 | |
casiotone401 | 0:cd43a974c54c | 47 | uint8_t i, ch; |
casiotone401 | 0:cd43a974c54c | 48 | uint8_t maxn = MAXSTEPS; // maximums and minimums for n and k |
casiotone401 | 0:cd43a974c54c | 49 | uint8_t minn = 1; |
casiotone401 | 0:cd43a974c54c | 50 | uint8_t mink = 1; |
casiotone401 | 0:cd43a974c54c | 51 | uint8_t mino = 0; |
casiotone401 | 0:cd43a974c54c | 52 | |
casiotone401 | 0:cd43a974c54c | 53 | static uint8_t active_channel; |
casiotone401 | 0:cd43a974c54c | 54 | |
casiotone401 | 0:cd43a974c54c | 55 | euc_time = gTimer.read_ms(); |
casiotone401 | 0:cd43a974c54c | 56 | |
casiotone401 | 0:cd43a974c54c | 57 | nn = channelbeats[active_channel][0]; |
casiotone401 | 0:cd43a974c54c | 58 | kk = channelbeats[active_channel][1]; |
casiotone401 | 0:cd43a974c54c | 59 | oo = channelbeats[active_channel][3]; |
casiotone401 | 0:cd43a974c54c | 60 | |
casiotone401 | 0:cd43a974c54c | 61 | // UPDATE BEAT HOLDER WHEN KNOBS ARE MOVED |
casiotone401 | 0:cd43a974c54c | 62 | if (changes[active_channel]) { |
casiotone401 | 0:cd43a974c54c | 63 | |
casiotone401 | 0:cd43a974c54c | 64 | beat_holder[active_channel] = Euclid(nn, kk, oo); |
casiotone401 | 0:cd43a974c54c | 65 | |
casiotone401 | 0:cd43a974c54c | 66 | switch (changes[active_channel]) |
casiotone401 | 0:cd43a974c54c | 67 | { |
casiotone401 | 0:cd43a974c54c | 68 | case 1: |
casiotone401 | 0:cd43a974c54c | 69 | case 3: |
casiotone401 | 0:cd43a974c54c | 70 | for (int i = 0; i < MAXSTEPS; ++i) { |
casiotone401 | 0:cd43a974c54c | 71 | |
casiotone401 | 0:cd43a974c54c | 72 | if (BitRead(beat_holder[active_channel], nn - 1 - i) && (i < nn)) { |
casiotone401 | 0:cd43a974c54c | 73 | sendMes.setTopAddress(SetMatrixAddress(active_channel * 2, i, true)); |
casiotone401 | 0:cd43a974c54c | 74 | sendMes.setArgs("i", 1); |
casiotone401 | 0:cd43a974c54c | 75 | osc.sendOsc(&sendMes); |
casiotone401 | 0:cd43a974c54c | 76 | |
casiotone401 | 0:cd43a974c54c | 77 | } else { |
casiotone401 | 0:cd43a974c54c | 78 | |
casiotone401 | 0:cd43a974c54c | 79 | sendMes.setTopAddress(SetMatrixAddress(active_channel * 2, i, true)); |
casiotone401 | 0:cd43a974c54c | 80 | sendMes.setArgs("i", 0); |
casiotone401 | 0:cd43a974c54c | 81 | osc.sendOsc(&sendMes); |
casiotone401 | 0:cd43a974c54c | 82 | } |
casiotone401 | 0:cd43a974c54c | 83 | } |
casiotone401 | 0:cd43a974c54c | 84 | |
casiotone401 | 0:cd43a974c54c | 85 | break; |
casiotone401 | 0:cd43a974c54c | 86 | |
casiotone401 | 0:cd43a974c54c | 87 | case 2: |
casiotone401 | 0:cd43a974c54c | 88 | for (int i = 0; i < MAXSTEPS; ++i) { |
casiotone401 | 0:cd43a974c54c | 89 | |
casiotone401 | 0:cd43a974c54c | 90 | if (i < nn) { |
casiotone401 | 0:cd43a974c54c | 91 | sendMes.setTopAddress(SetMatrixAddress(active_channel * 2, i, true)); |
casiotone401 | 0:cd43a974c54c | 92 | sendMes.setArgs("i", 1); |
casiotone401 | 0:cd43a974c54c | 93 | osc.sendOsc(&sendMes); |
casiotone401 | 0:cd43a974c54c | 94 | |
casiotone401 | 0:cd43a974c54c | 95 | } else { |
casiotone401 | 0:cd43a974c54c | 96 | |
casiotone401 | 0:cd43a974c54c | 97 | sendMes.setTopAddress(SetMatrixAddress(active_channel * 2, i, true)); |
casiotone401 | 0:cd43a974c54c | 98 | sendMes.setArgs("i", 0); |
casiotone401 | 0:cd43a974c54c | 99 | osc.sendOsc(&sendMes); |
casiotone401 | 0:cd43a974c54c | 100 | } |
casiotone401 | 0:cd43a974c54c | 101 | } |
casiotone401 | 0:cd43a974c54c | 102 | |
casiotone401 | 0:cd43a974c54c | 103 | break; |
casiotone401 | 0:cd43a974c54c | 104 | |
casiotone401 | 0:cd43a974c54c | 105 | default: |
casiotone401 | 0:cd43a974c54c | 106 | break; |
casiotone401 | 0:cd43a974c54c | 107 | } |
casiotone401 | 0:cd43a974c54c | 108 | |
casiotone401 | 0:cd43a974c54c | 109 | changes[active_channel] = 0; |
casiotone401 | 0:cd43a974c54c | 110 | last_changed[active_channel] = gTimer.read_ms(); |
casiotone401 | 0:cd43a974c54c | 111 | } |
casiotone401 | 0:cd43a974c54c | 112 | |
casiotone401 | 0:cd43a974c54c | 113 | // ANALOG PULSE TRIGGER |
casiotone401 | 0:cd43a974c54c | 114 | if (trigger && !triggerState) { |
casiotone401 | 0:cd43a974c54c | 115 | |
casiotone401 | 0:cd43a974c54c | 116 | Sync(active_channel, gatesoff); |
casiotone401 | 0:cd43a974c54c | 117 | triggerState = true; |
casiotone401 | 0:cd43a974c54c | 118 | |
casiotone401 | 0:cd43a974c54c | 119 | } else if (!trigger) { |
casiotone401 | 0:cd43a974c54c | 120 | |
casiotone401 | 0:cd43a974c54c | 121 | triggerState = false; |
casiotone401 | 0:cd43a974c54c | 122 | } |
casiotone401 | 0:cd43a974c54c | 123 | |
casiotone401 | 0:cd43a974c54c | 124 | // READ K KNOB |
casiotone401 | 0:cd43a974c54c | 125 | kknob = EncodeReadK(active_channel); |
casiotone401 | 0:cd43a974c54c | 126 | |
casiotone401 | 0:cd43a974c54c | 127 | if (_kknob != kknob) { |
casiotone401 | 0:cd43a974c54c | 128 | |
casiotone401 | 0:cd43a974c54c | 129 | _kknob = kknob; |
casiotone401 | 0:cd43a974c54c | 130 | |
casiotone401 | 0:cd43a974c54c | 131 | if (kknob != 0 && (euc_time - last_read[active_channel] > READ_DELAY)) { |
casiotone401 | 0:cd43a974c54c | 132 | |
casiotone401 | 0:cd43a974c54c | 133 | if ((kk + kknob) > nn) { |
casiotone401 | 0:cd43a974c54c | 134 | |
casiotone401 | 0:cd43a974c54c | 135 | kknob = 0; |
casiotone401 | 0:cd43a974c54c | 136 | kk = nn; |
casiotone401 | 0:cd43a974c54c | 137 | |
casiotone401 | 0:cd43a974c54c | 138 | } else if ((kk + kknob) < mink) { |
casiotone401 | 0:cd43a974c54c | 139 | |
casiotone401 | 0:cd43a974c54c | 140 | kknob = 0; |
casiotone401 | 0:cd43a974c54c | 141 | kk = mink; |
casiotone401 | 0:cd43a974c54c | 142 | }; |
casiotone401 | 0:cd43a974c54c | 143 | |
casiotone401 | 0:cd43a974c54c | 144 | kk = channelbeats[active_channel][1] = (kk + kknob); // update with encoder reading |
casiotone401 | 0:cd43a974c54c | 145 | |
casiotone401 | 0:cd43a974c54c | 146 | last_read[active_channel] = gTimer.read_ms(); |
casiotone401 | 0:cd43a974c54c | 147 | changes[active_channel] = 1; // k change = 1 |
casiotone401 | 0:cd43a974c54c | 148 | } |
casiotone401 | 0:cd43a974c54c | 149 | } |
casiotone401 | 0:cd43a974c54c | 150 | |
casiotone401 | 0:cd43a974c54c | 151 | // READ N KNOB |
casiotone401 | 0:cd43a974c54c | 152 | nknob = EncodeReadN(active_channel); |
casiotone401 | 0:cd43a974c54c | 153 | |
casiotone401 | 0:cd43a974c54c | 154 | if (_nknob != nknob) { |
casiotone401 | 0:cd43a974c54c | 155 | |
casiotone401 | 0:cd43a974c54c | 156 | _nknob = nknob; |
casiotone401 | 0:cd43a974c54c | 157 | |
casiotone401 | 0:cd43a974c54c | 158 | if (nknob != 0 && (euc_time - last_read[active_channel] > READ_DELAY)) { |
casiotone401 | 0:cd43a974c54c | 159 | |
casiotone401 | 0:cd43a974c54c | 160 | if ((nn + nknob) > maxn) { |
casiotone401 | 0:cd43a974c54c | 161 | |
casiotone401 | 0:cd43a974c54c | 162 | nknob = 0; |
casiotone401 | 0:cd43a974c54c | 163 | nn = maxn; |
casiotone401 | 0:cd43a974c54c | 164 | |
casiotone401 | 0:cd43a974c54c | 165 | } else if ((nn + nknob) < minn) { |
casiotone401 | 0:cd43a974c54c | 166 | |
casiotone401 | 0:cd43a974c54c | 167 | nknob = 0; |
casiotone401 | 0:cd43a974c54c | 168 | nn = minn; |
casiotone401 | 0:cd43a974c54c | 169 | }; |
casiotone401 | 0:cd43a974c54c | 170 | |
casiotone401 | 0:cd43a974c54c | 171 | if (kk > (nn + nknob)) {// check if new n is lower than k + reduce K if it is |
casiotone401 | 0:cd43a974c54c | 172 | channelbeats[active_channel][1] = (nn + nknob); |
casiotone401 | 0:cd43a974c54c | 173 | }; |
casiotone401 | 0:cd43a974c54c | 174 | |
casiotone401 | 0:cd43a974c54c | 175 | if (oo > (nn + nknob - 1)) {// check if new n is lower than o + reduce o if it is |
casiotone401 | 0:cd43a974c54c | 176 | channelbeats[active_channel][3] = (nn + nknob - 1); |
casiotone401 | 0:cd43a974c54c | 177 | }; |
casiotone401 | 0:cd43a974c54c | 178 | |
casiotone401 | 0:cd43a974c54c | 179 | nn = channelbeats[active_channel][0] = (nn + nknob); // update with encoder reading |
casiotone401 | 0:cd43a974c54c | 180 | oo = channelbeats[active_channel][3]; |
casiotone401 | 0:cd43a974c54c | 181 | |
casiotone401 | 0:cd43a974c54c | 182 | last_read[active_channel] = gTimer.read_ms(); |
casiotone401 | 0:cd43a974c54c | 183 | changes[active_channel] = 2; // n change = 2 |
casiotone401 | 0:cd43a974c54c | 184 | } |
casiotone401 | 0:cd43a974c54c | 185 | |
casiotone401 | 0:cd43a974c54c | 186 | } |
casiotone401 | 0:cd43a974c54c | 187 | |
casiotone401 | 0:cd43a974c54c | 188 | // READ O KNOB |
casiotone401 | 0:cd43a974c54c | 189 | oknob = EncodeReadO(active_channel); |
casiotone401 | 0:cd43a974c54c | 190 | |
casiotone401 | 0:cd43a974c54c | 191 | if (_oknob != oknob) { |
casiotone401 | 0:cd43a974c54c | 192 | |
casiotone401 | 0:cd43a974c54c | 193 | _oknob = oknob; |
casiotone401 | 0:cd43a974c54c | 194 | |
casiotone401 | 0:cd43a974c54c | 195 | if (oknob != 0 && (euc_time - last_read[active_channel] > READ_DELAY)) { |
casiotone401 | 0:cd43a974c54c | 196 | // Sense check o encoder reading to prevent crashes |
casiotone401 | 0:cd43a974c54c | 197 | |
casiotone401 | 0:cd43a974c54c | 198 | if ((oo + oknob) > (nn - 1)) { |
casiotone401 | 0:cd43a974c54c | 199 | |
casiotone401 | 0:cd43a974c54c | 200 | oknob = 0; |
casiotone401 | 0:cd43a974c54c | 201 | oo = (nn - 1); |
casiotone401 | 0:cd43a974c54c | 202 | |
casiotone401 | 0:cd43a974c54c | 203 | } else if ((oo + oknob) < mino) { |
casiotone401 | 0:cd43a974c54c | 204 | |
casiotone401 | 0:cd43a974c54c | 205 | oknob = 0; |
casiotone401 | 0:cd43a974c54c | 206 | oo = mino; |
casiotone401 | 0:cd43a974c54c | 207 | } |
casiotone401 | 0:cd43a974c54c | 208 | |
casiotone401 | 0:cd43a974c54c | 209 | channelbeats[active_channel][3] = (oo + oknob); |
casiotone401 | 0:cd43a974c54c | 210 | |
casiotone401 | 0:cd43a974c54c | 211 | last_read[active_channel] = gTimer.read_ms(); |
casiotone401 | 0:cd43a974c54c | 212 | changes[active_channel] = 3; // o change = 3 |
casiotone401 | 0:cd43a974c54c | 213 | } |
casiotone401 | 0:cd43a974c54c | 214 | |
casiotone401 | 0:cd43a974c54c | 215 | } |
casiotone401 | 0:cd43a974c54c | 216 | |
casiotone401 | 0:cd43a974c54c | 217 | // ENABLE RESET BUTTON ** ADD FLASH RESET HERE *** |
casiotone401 | 0:cd43a974c54c | 218 | if (gCtrlSW[1] && channelbeats[active_channel][2]) { |
casiotone401 | 0:cd43a974c54c | 219 | |
casiotone401 | 0:cd43a974c54c | 220 | for (ch = 0; ch < channels; ++ch) { |
casiotone401 | 0:cd43a974c54c | 221 | channelbeats[ch][2] = 0; |
casiotone401 | 0:cd43a974c54c | 222 | } |
casiotone401 | 0:cd43a974c54c | 223 | } |
casiotone401 | 0:cd43a974c54c | 224 | |
casiotone401 | 0:cd43a974c54c | 225 | // Stop & Reset (gCtrlSW[0]) |
casiotone401 | 0:cd43a974c54c | 226 | if (reset) { |
casiotone401 | 0:cd43a974c54c | 227 | |
casiotone401 | 0:cd43a974c54c | 228 | for (ch = 0; ch < channels; ++ch) { |
casiotone401 | 0:cd43a974c54c | 229 | |
casiotone401 | 0:cd43a974c54c | 230 | channelbeats[ch][2] = 0; |
casiotone401 | 0:cd43a974c54c | 231 | |
casiotone401 | 0:cd43a974c54c | 232 | for (i = 0; i < MAXSTEPS; ++i) { |
casiotone401 | 0:cd43a974c54c | 233 | |
casiotone401 | 0:cd43a974c54c | 234 | sendMes.setTopAddress(SetMatrixAddress(ch * 2 + 1, i, true)); |
casiotone401 | 0:cd43a974c54c | 235 | sendMes.setArgs("i", 0); |
casiotone401 | 0:cd43a974c54c | 236 | osc.sendOsc(&sendMes); |
casiotone401 | 0:cd43a974c54c | 237 | } |
casiotone401 | 0:cd43a974c54c | 238 | |
casiotone401 | 0:cd43a974c54c | 239 | } |
casiotone401 | 0:cd43a974c54c | 240 | |
casiotone401 | 0:cd43a974c54c | 241 | } |
casiotone401 | 0:cd43a974c54c | 242 | |
casiotone401 | 0:cd43a974c54c | 243 | // TURN OFF ANY LIGHTS THAT ARE ON |
casiotone401 | 0:cd43a974c54c | 244 | if ((euc_time - last_sync) > pulse_length && lights_active) { |
casiotone401 | 0:cd43a974c54c | 245 | |
casiotone401 | 0:cd43a974c54c | 246 | for (ch = 0; ch < channels; ++ch) { |
casiotone401 | 0:cd43a974c54c | 247 | sendMes.setTopAddress(SetMatrixAddress((MAXCHANNELS * 2), 3 - ch, true)); |
casiotone401 | 0:cd43a974c54c | 248 | sendMes.setArgs("i", 0); |
casiotone401 | 0:cd43a974c54c | 249 | osc.sendOsc(&sendMes); |
casiotone401 | 0:cd43a974c54c | 250 | |
casiotone401 | 0:cd43a974c54c | 251 | sendMes.setTopAddress(SetMatrixAddress((MAXCHANNELS * 2), 5, true)); |
casiotone401 | 0:cd43a974c54c | 252 | sendMes.setArgs("i", 0); |
casiotone401 | 0:cd43a974c54c | 253 | osc.sendOsc(&sendMes); |
casiotone401 | 0:cd43a974c54c | 254 | |
casiotone401 | 0:cd43a974c54c | 255 | } |
casiotone401 | 0:cd43a974c54c | 256 | |
casiotone401 | 0:cd43a974c54c | 257 | lights_active = false; |
casiotone401 | 0:cd43a974c54c | 258 | } |
casiotone401 | 0:cd43a974c54c | 259 | |
casiotone401 | 0:cd43a974c54c | 260 | // FINISH ANY PULSES THAT ARE ACTIVE - PULSES LAST 1/4 AS LONG AS LIGHTS |
casiotone401 | 0:cd43a974c54c | 261 | if (euc_time - last_sync > (pulse_length / 4) && pulses_active) { |
casiotone401 | 0:cd43a974c54c | 262 | |
casiotone401 | 0:cd43a974c54c | 263 | for (ch = 0; ch < channels; ++ch) { |
casiotone401 | 0:cd43a974c54c | 264 | |
casiotone401 | 0:cd43a974c54c | 265 | if (!gatesoff) |
casiotone401 | 0:cd43a974c54c | 266 | { |
casiotone401 | 0:cd43a974c54c | 267 | gGATES[ch] = false; |
casiotone401 | 0:cd43a974c54c | 268 | gCLOCKOUT = false; |
casiotone401 | 0:cd43a974c54c | 269 | //digitalWrite(sparepin, LOW); |
casiotone401 | 0:cd43a974c54c | 270 | } |
casiotone401 | 0:cd43a974c54c | 271 | } |
casiotone401 | 0:cd43a974c54c | 272 | |
casiotone401 | 0:cd43a974c54c | 273 | pulses_active = false; |
casiotone401 | 0:cd43a974c54c | 274 | } |
casiotone401 | 0:cd43a974c54c | 275 | |
casiotone401 | 0:cd43a974c54c | 276 | ++active_channel; |
casiotone401 | 0:cd43a974c54c | 277 | active_channel &= (channels - 1); |
casiotone401 | 0:cd43a974c54c | 278 | } |
casiotone401 | 0:cd43a974c54c | 279 | |
casiotone401 | 0:cd43a974c54c | 280 | //------------------------------------------------------------- |
casiotone401 | 0:cd43a974c54c | 281 | // Init Euclidean Sequencer |
casiotone401 | 0:cd43a974c54c | 282 | |
casiotone401 | 0:cd43a974c54c | 283 | void InitEuclideanSeq(void) { |
casiotone401 | 0:cd43a974c54c | 284 | // Initialize Euclid Sequencer |
casiotone401 | 0:cd43a974c54c | 285 | channelbeats[0][0] = 16; |
casiotone401 | 0:cd43a974c54c | 286 | channelbeats[0][1] = 8; |
casiotone401 | 0:cd43a974c54c | 287 | channelbeats[0][2] = 0; |
casiotone401 | 0:cd43a974c54c | 288 | channelbeats[0][3] = 0; |
casiotone401 | 0:cd43a974c54c | 289 | |
casiotone401 | 0:cd43a974c54c | 290 | channelbeats[1][0] = 16; |
casiotone401 | 0:cd43a974c54c | 291 | channelbeats[1][1] = 9; |
casiotone401 | 0:cd43a974c54c | 292 | channelbeats[1][2] = 0; |
casiotone401 | 0:cd43a974c54c | 293 | channelbeats[1][3] = 0; |
casiotone401 | 0:cd43a974c54c | 294 | |
casiotone401 | 0:cd43a974c54c | 295 | channelbeats[2][0] = 16; |
casiotone401 | 0:cd43a974c54c | 296 | channelbeats[2][1] = 7; |
casiotone401 | 0:cd43a974c54c | 297 | channelbeats[2][2] = 0; |
casiotone401 | 0:cd43a974c54c | 298 | channelbeats[2][3] = 0; |
casiotone401 | 0:cd43a974c54c | 299 | |
casiotone401 | 0:cd43a974c54c | 300 | channelbeats[3][0] = 16; |
casiotone401 | 0:cd43a974c54c | 301 | channelbeats[3][1] = 9; |
casiotone401 | 0:cd43a974c54c | 302 | channelbeats[3][2] = 0; |
casiotone401 | 0:cd43a974c54c | 303 | channelbeats[3][3] = 0; |
casiotone401 | 0:cd43a974c54c | 304 | |
casiotone401 | 0:cd43a974c54c | 305 | for (int i = 0; i < channels; ++i) |
casiotone401 | 0:cd43a974c54c | 306 | { |
casiotone401 | 0:cd43a974c54c | 307 | beat_holder[i] = Euclid(channelbeats[i][0], channelbeats[i][1], channelbeats[i][3]); |
casiotone401 | 0:cd43a974c54c | 308 | } |
casiotone401 | 0:cd43a974c54c | 309 | } |
casiotone401 | 0:cd43a974c54c | 310 | |
casiotone401 | 0:cd43a974c54c | 311 | |
casiotone401 | 0:cd43a974c54c | 312 | //------------------------------------------------------------- |
casiotone401 | 0:cd43a974c54c | 313 | // Euclid calculation function |
casiotone401 | 0:cd43a974c54c | 314 | |
casiotone401 | 0:cd43a974c54c | 315 | unsigned int Euclid(int n, int k, int o) { // inputs: n=total, k=beats, o = offset |
casiotone401 | 0:cd43a974c54c | 316 | int pauses = (n - k); |
casiotone401 | 0:cd43a974c54c | 317 | int pulses = k; |
casiotone401 | 0:cd43a974c54c | 318 | int offset = o; |
casiotone401 | 0:cd43a974c54c | 319 | int steps = n; |
casiotone401 | 0:cd43a974c54c | 320 | int per_pulse = (pauses / k); |
casiotone401 | 0:cd43a974c54c | 321 | int remainder = (pauses % pulses); |
casiotone401 | 0:cd43a974c54c | 322 | unsigned int workbeat[n]; |
casiotone401 | 0:cd43a974c54c | 323 | unsigned int outbeat; |
casiotone401 | 0:cd43a974c54c | 324 | uint16_t outbeat2; |
casiotone401 | 0:cd43a974c54c | 325 | int workbeat_count = n; |
casiotone401 | 0:cd43a974c54c | 326 | int a_remainder, b_remainder; |
casiotone401 | 0:cd43a974c54c | 327 | int groupa, groupb; |
casiotone401 | 0:cd43a974c54c | 328 | int i, j; |
casiotone401 | 0:cd43a974c54c | 329 | int trim_count; |
casiotone401 | 0:cd43a974c54c | 330 | |
casiotone401 | 0:cd43a974c54c | 331 | for (i = 0; i < n; ++i) { // Populate workbeat with unsorted pulses and pauses |
casiotone401 | 0:cd43a974c54c | 332 | |
casiotone401 | 0:cd43a974c54c | 333 | if (i < pulses) { |
casiotone401 | 0:cd43a974c54c | 334 | |
casiotone401 | 0:cd43a974c54c | 335 | workbeat[i] = 1; |
casiotone401 | 0:cd43a974c54c | 336 | |
casiotone401 | 0:cd43a974c54c | 337 | } else { |
casiotone401 | 0:cd43a974c54c | 338 | |
casiotone401 | 0:cd43a974c54c | 339 | workbeat[i] = 0; |
casiotone401 | 0:cd43a974c54c | 340 | } |
casiotone401 | 0:cd43a974c54c | 341 | } |
casiotone401 | 0:cd43a974c54c | 342 | |
casiotone401 | 0:cd43a974c54c | 343 | if (per_pulse > 0 && remainder < 2) { // Handle easy cases where there is no or only one remainer |
casiotone401 | 0:cd43a974c54c | 344 | |
casiotone401 | 0:cd43a974c54c | 345 | for (i = 0; i < pulses; ++i) { |
casiotone401 | 0:cd43a974c54c | 346 | |
casiotone401 | 0:cd43a974c54c | 347 | for (j = (workbeat_count - 1); j > (workbeat_count - per_pulse - 1); --j) { |
casiotone401 | 0:cd43a974c54c | 348 | workbeat[i] = ConcatBin(workbeat[i], workbeat[j]); |
casiotone401 | 0:cd43a974c54c | 349 | } |
casiotone401 | 0:cd43a974c54c | 350 | |
casiotone401 | 0:cd43a974c54c | 351 | workbeat_count = (workbeat_count - per_pulse); |
casiotone401 | 0:cd43a974c54c | 352 | |
casiotone401 | 0:cd43a974c54c | 353 | } |
casiotone401 | 0:cd43a974c54c | 354 | |
casiotone401 | 0:cd43a974c54c | 355 | outbeat = 0; // Concatenate workbeat into outbeat - according to workbeat_count |
casiotone401 | 0:cd43a974c54c | 356 | |
casiotone401 | 0:cd43a974c54c | 357 | for (i = 0; i < workbeat_count; ++i) { |
casiotone401 | 0:cd43a974c54c | 358 | outbeat = ConcatBin(outbeat, workbeat[i]); |
casiotone401 | 0:cd43a974c54c | 359 | } |
casiotone401 | 0:cd43a974c54c | 360 | |
casiotone401 | 0:cd43a974c54c | 361 | |
casiotone401 | 0:cd43a974c54c | 362 | if (offset != 0) { |
casiotone401 | 0:cd43a974c54c | 363 | |
casiotone401 | 0:cd43a974c54c | 364 | outbeat2 = BitReadOffset(offset, outbeat, steps); // Add offset to the step pattern |
casiotone401 | 0:cd43a974c54c | 365 | |
casiotone401 | 0:cd43a974c54c | 366 | } else { |
casiotone401 | 0:cd43a974c54c | 367 | |
casiotone401 | 0:cd43a974c54c | 368 | outbeat2 = outbeat; |
casiotone401 | 0:cd43a974c54c | 369 | } |
casiotone401 | 0:cd43a974c54c | 370 | |
casiotone401 | 0:cd43a974c54c | 371 | return outbeat2; |
casiotone401 | 0:cd43a974c54c | 372 | |
casiotone401 | 0:cd43a974c54c | 373 | } else { |
casiotone401 | 0:cd43a974c54c | 374 | |
casiotone401 | 0:cd43a974c54c | 375 | groupa = pulses; |
casiotone401 | 0:cd43a974c54c | 376 | groupb = pauses; |
casiotone401 | 0:cd43a974c54c | 377 | |
casiotone401 | 0:cd43a974c54c | 378 | while (groupb > 1) { //main recursive loop |
casiotone401 | 0:cd43a974c54c | 379 | |
casiotone401 | 0:cd43a974c54c | 380 | if (groupa > groupb) { // more Group A than Group B |
casiotone401 | 0:cd43a974c54c | 381 | |
casiotone401 | 0:cd43a974c54c | 382 | a_remainder = (groupa - groupb); // what will be left of groupa once groupB is interleaved |
casiotone401 | 0:cd43a974c54c | 383 | trim_count = 0; |
casiotone401 | 0:cd43a974c54c | 384 | |
casiotone401 | 0:cd43a974c54c | 385 | for (i = 0; i < (groupa - a_remainder); ++i) { //count through the matching sets of A, ignoring remaindered |
casiotone401 | 0:cd43a974c54c | 386 | workbeat[i] = ConcatBin(workbeat[i], workbeat[workbeat_count - 1 - i]); |
casiotone401 | 0:cd43a974c54c | 387 | ++trim_count; |
casiotone401 | 0:cd43a974c54c | 388 | } |
casiotone401 | 0:cd43a974c54c | 389 | |
casiotone401 | 0:cd43a974c54c | 390 | workbeat_count = (workbeat_count - trim_count); |
casiotone401 | 0:cd43a974c54c | 391 | |
casiotone401 | 0:cd43a974c54c | 392 | groupa = groupb; |
casiotone401 | 0:cd43a974c54c | 393 | groupb = a_remainder; |
casiotone401 | 0:cd43a974c54c | 394 | |
casiotone401 | 0:cd43a974c54c | 395 | } else if (groupb > groupa) { // More Group B than Group A |
casiotone401 | 0:cd43a974c54c | 396 | |
casiotone401 | 0:cd43a974c54c | 397 | b_remainder = (groupb - groupa); // what will be left of group once group A is interleaved |
casiotone401 | 0:cd43a974c54c | 398 | trim_count = 0; |
casiotone401 | 0:cd43a974c54c | 399 | |
casiotone401 | 0:cd43a974c54c | 400 | for (i = workbeat_count-1; i >= (groupa + b_remainder); --i) { //count from right back through the Bs |
casiotone401 | 0:cd43a974c54c | 401 | workbeat[workbeat_count - i - 1] = ConcatBin(workbeat[workbeat_count - 1 - i], workbeat[i]); |
casiotone401 | 0:cd43a974c54c | 402 | |
casiotone401 | 0:cd43a974c54c | 403 | ++trim_count; |
casiotone401 | 0:cd43a974c54c | 404 | } |
casiotone401 | 0:cd43a974c54c | 405 | |
casiotone401 | 0:cd43a974c54c | 406 | workbeat_count = (workbeat_count - trim_count); |
casiotone401 | 0:cd43a974c54c | 407 | groupb = b_remainder; |
casiotone401 | 0:cd43a974c54c | 408 | |
casiotone401 | 0:cd43a974c54c | 409 | } else if (groupa == groupb) { // groupa = groupb |
casiotone401 | 0:cd43a974c54c | 410 | |
casiotone401 | 0:cd43a974c54c | 411 | trim_count = 0; |
casiotone401 | 0:cd43a974c54c | 412 | |
casiotone401 | 0:cd43a974c54c | 413 | for (i = 0; i < groupa; ++i) { |
casiotone401 | 0:cd43a974c54c | 414 | workbeat[i] = ConcatBin(workbeat[i], workbeat[workbeat_count - 1 - i]); |
casiotone401 | 0:cd43a974c54c | 415 | ++trim_count; |
casiotone401 | 0:cd43a974c54c | 416 | } |
casiotone401 | 0:cd43a974c54c | 417 | |
casiotone401 | 0:cd43a974c54c | 418 | workbeat_count = (workbeat_count - trim_count); |
casiotone401 | 0:cd43a974c54c | 419 | groupb = 0; |
casiotone401 | 0:cd43a974c54c | 420 | |
casiotone401 | 0:cd43a974c54c | 421 | } |
casiotone401 | 0:cd43a974c54c | 422 | } |
casiotone401 | 0:cd43a974c54c | 423 | |
casiotone401 | 0:cd43a974c54c | 424 | outbeat = 0; // Concatenate workbeat into outbeat - according to workbeat_count |
casiotone401 | 0:cd43a974c54c | 425 | |
casiotone401 | 0:cd43a974c54c | 426 | for (i = 0; i < workbeat_count; ++i) { |
casiotone401 | 0:cd43a974c54c | 427 | |
casiotone401 | 0:cd43a974c54c | 428 | outbeat = ConcatBin(outbeat, workbeat[i]); |
casiotone401 | 0:cd43a974c54c | 429 | } |
casiotone401 | 0:cd43a974c54c | 430 | |
casiotone401 | 0:cd43a974c54c | 431 | if (offset != 0) { |
casiotone401 | 0:cd43a974c54c | 432 | |
casiotone401 | 0:cd43a974c54c | 433 | outbeat2 = BitReadOffset(offset, outbeat, steps); // Add offset to the step pattern |
casiotone401 | 0:cd43a974c54c | 434 | |
casiotone401 | 0:cd43a974c54c | 435 | } else { |
casiotone401 | 0:cd43a974c54c | 436 | |
casiotone401 | 0:cd43a974c54c | 437 | outbeat2 = outbeat; |
casiotone401 | 0:cd43a974c54c | 438 | } |
casiotone401 | 0:cd43a974c54c | 439 | |
casiotone401 | 0:cd43a974c54c | 440 | return outbeat2; |
casiotone401 | 0:cd43a974c54c | 441 | } |
casiotone401 | 0:cd43a974c54c | 442 | } |
casiotone401 | 0:cd43a974c54c | 443 | |
casiotone401 | 0:cd43a974c54c | 444 | //------------------------------------------------------------- |
casiotone401 | 0:cd43a974c54c | 445 | // Reads a bit of a number |
casiotone401 | 0:cd43a974c54c | 446 | |
casiotone401 | 0:cd43a974c54c | 447 | int BitRead(uint16_t b, int bitPos) { |
casiotone401 | 0:cd43a974c54c | 448 | int x; |
casiotone401 | 0:cd43a974c54c | 449 | |
casiotone401 | 0:cd43a974c54c | 450 | x = b & (1 << bitPos); |
casiotone401 | 0:cd43a974c54c | 451 | |
casiotone401 | 0:cd43a974c54c | 452 | return x == 0 ? 0 : 1; |
casiotone401 | 0:cd43a974c54c | 453 | } |
casiotone401 | 0:cd43a974c54c | 454 | |
casiotone401 | 0:cd43a974c54c | 455 | //------------------------------------------------------------- |
casiotone401 | 0:cd43a974c54c | 456 | // Function to right rotate n by d bits |
casiotone401 | 0:cd43a974c54c | 457 | |
casiotone401 | 0:cd43a974c54c | 458 | uint16_t BitReadOffset(int shift, uint16_t value, uint16_t pattern_length) { |
casiotone401 | 0:cd43a974c54c | 459 | uint16_t mask = ((1 << pattern_length) - 1); |
casiotone401 | 0:cd43a974c54c | 460 | value &= mask; |
casiotone401 | 0:cd43a974c54c | 461 | |
casiotone401 | 0:cd43a974c54c | 462 | return ((value >> shift) | (value << (pattern_length - shift))) & mask; |
casiotone401 | 0:cd43a974c54c | 463 | } |
casiotone401 | 0:cd43a974c54c | 464 | |
casiotone401 | 0:cd43a974c54c | 465 | //------------------------------------------------------------- |
casiotone401 | 0:cd43a974c54c | 466 | // Function to find the binary length of a number by counting bitwise |
casiotone401 | 0:cd43a974c54c | 467 | |
casiotone401 | 0:cd43a974c54c | 468 | int findlength(unsigned int bnry) { |
casiotone401 | 0:cd43a974c54c | 469 | bool lengthfound = false; |
casiotone401 | 0:cd43a974c54c | 470 | int i; |
casiotone401 | 0:cd43a974c54c | 471 | int length = 1; // no number can have a length of zero - single 0 has a length of one, but no 1s for the sytem to count |
casiotone401 | 0:cd43a974c54c | 472 | |
casiotone401 | 0:cd43a974c54c | 473 | for (i = 32; i >= 0; i--) { |
casiotone401 | 0:cd43a974c54c | 474 | |
casiotone401 | 0:cd43a974c54c | 475 | if ((BitRead(bnry, i)) && !lengthfound) { |
casiotone401 | 0:cd43a974c54c | 476 | length = (i + 1); |
casiotone401 | 0:cd43a974c54c | 477 | lengthfound = true; |
casiotone401 | 0:cd43a974c54c | 478 | } |
casiotone401 | 0:cd43a974c54c | 479 | |
casiotone401 | 0:cd43a974c54c | 480 | } |
casiotone401 | 0:cd43a974c54c | 481 | |
casiotone401 | 0:cd43a974c54c | 482 | return length; |
casiotone401 | 0:cd43a974c54c | 483 | } |
casiotone401 | 0:cd43a974c54c | 484 | |
casiotone401 | 0:cd43a974c54c | 485 | //------------------------------------------------------------- |
casiotone401 | 0:cd43a974c54c | 486 | // Function to concatenate two binary numbers bitwise |
casiotone401 | 0:cd43a974c54c | 487 | |
casiotone401 | 0:cd43a974c54c | 488 | unsigned int ConcatBin(unsigned int bina, unsigned int binb) { |
casiotone401 | 0:cd43a974c54c | 489 | int binb_len = findlength(binb); |
casiotone401 | 0:cd43a974c54c | 490 | unsigned int sum = (bina << binb_len); |
casiotone401 | 0:cd43a974c54c | 491 | |
casiotone401 | 0:cd43a974c54c | 492 | sum = sum | binb; |
casiotone401 | 0:cd43a974c54c | 493 | |
casiotone401 | 0:cd43a974c54c | 494 | return sum; |
casiotone401 | 0:cd43a974c54c | 495 | } |
casiotone401 | 0:cd43a974c54c | 496 | |
casiotone401 | 0:cd43a974c54c | 497 | //------------------------------------------------------------- |
casiotone401 | 0:cd43a974c54c | 498 | // routine triggered by each beat |
casiotone401 | 0:cd43a974c54c | 499 | |
casiotone401 | 0:cd43a974c54c | 500 | void Sync(int active_channel, bool gatesoff) { |
casiotone401 | 0:cd43a974c54c | 501 | int read_head, erase; |
casiotone401 | 0:cd43a974c54c | 502 | int rand_vel, rand_len; |
casiotone401 | 0:cd43a974c54c | 503 | int ch, i; |
casiotone401 | 0:cd43a974c54c | 504 | static int masterclock; |
casiotone401 | 0:cd43a974c54c | 505 | |
casiotone401 | 0:cd43a974c54c | 506 | if (masterclock % 2 == 0) { |
casiotone401 | 0:cd43a974c54c | 507 | sendMes.setTopAddress(SetMatrixAddress((MAXCHANNELS * 2), 7, true)); |
casiotone401 | 0:cd43a974c54c | 508 | sendMes.setArgs("i", 1); |
casiotone401 | 0:cd43a974c54c | 509 | osc.sendOsc(&sendMes); |
casiotone401 | 0:cd43a974c54c | 510 | |
casiotone401 | 0:cd43a974c54c | 511 | } else { |
casiotone401 | 0:cd43a974c54c | 512 | |
casiotone401 | 0:cd43a974c54c | 513 | sendMes.setTopAddress(SetMatrixAddress((MAXCHANNELS * 2), 7, true)); |
casiotone401 | 0:cd43a974c54c | 514 | sendMes.setArgs("i", 0); |
casiotone401 | 0:cd43a974c54c | 515 | osc.sendOsc(&sendMes); |
casiotone401 | 0:cd43a974c54c | 516 | } |
casiotone401 | 0:cd43a974c54c | 517 | |
casiotone401 | 0:cd43a974c54c | 518 | // Cycle through channels |
casiotone401 | 0:cd43a974c54c | 519 | for (ch = 0; ch < channels; ++ch) { |
casiotone401 | 0:cd43a974c54c | 520 | |
casiotone401 | 0:cd43a974c54c | 521 | read_head = (channelbeats[ch][0] - channelbeats[ch][2] - 1); |
casiotone401 | 0:cd43a974c54c | 522 | |
casiotone401 | 0:cd43a974c54c | 523 | if (ch != active_channel || (euc_time - last_changed[active_channel]) > DISPLAY_UPDATE) { |
casiotone401 | 0:cd43a974c54c | 524 | |
casiotone401 | 0:cd43a974c54c | 525 | if (channelbeats[ch][2] < MAXSTEPS) { |
casiotone401 | 0:cd43a974c54c | 526 | |
casiotone401 | 0:cd43a974c54c | 527 | for (i = 0; i < MAXSTEPS; ++i) { |
casiotone401 | 0:cd43a974c54c | 528 | |
casiotone401 | 0:cd43a974c54c | 529 | if (BitRead(beat_holder[ch],channelbeats[ch][0] - 1 - i) && i < channelbeats[ch][0]) { |
casiotone401 | 0:cd43a974c54c | 530 | |
casiotone401 | 0:cd43a974c54c | 531 | sendMes.setTopAddress(SetMatrixAddress(ch * 2, i, true)); |
casiotone401 | 0:cd43a974c54c | 532 | sendMes.setArgs("i", 1); |
casiotone401 | 0:cd43a974c54c | 533 | osc.sendOsc(&sendMes); |
casiotone401 | 0:cd43a974c54c | 534 | |
casiotone401 | 0:cd43a974c54c | 535 | } else { |
casiotone401 | 0:cd43a974c54c | 536 | |
casiotone401 | 0:cd43a974c54c | 537 | sendMes.setTopAddress(SetMatrixAddress(ch * 2, i, true)); |
casiotone401 | 0:cd43a974c54c | 538 | sendMes.setArgs("i", 0); |
casiotone401 | 0:cd43a974c54c | 539 | osc.sendOsc(&sendMes); |
casiotone401 | 0:cd43a974c54c | 540 | } |
casiotone401 | 0:cd43a974c54c | 541 | |
casiotone401 | 0:cd43a974c54c | 542 | } |
casiotone401 | 0:cd43a974c54c | 543 | } |
casiotone401 | 0:cd43a974c54c | 544 | } |
casiotone401 | 0:cd43a974c54c | 545 | |
casiotone401 | 0:cd43a974c54c | 546 | if (channelbeats[ch][2]) { |
casiotone401 | 0:cd43a974c54c | 547 | |
casiotone401 | 0:cd43a974c54c | 548 | if (!masterclock) { |
casiotone401 | 0:cd43a974c54c | 549 | |
casiotone401 | 0:cd43a974c54c | 550 | erase = MAXSTEPS - 1; |
casiotone401 | 0:cd43a974c54c | 551 | |
casiotone401 | 0:cd43a974c54c | 552 | } else { |
casiotone401 | 0:cd43a974c54c | 553 | |
casiotone401 | 0:cd43a974c54c | 554 | erase = masterclock - 1; |
casiotone401 | 0:cd43a974c54c | 555 | } |
casiotone401 | 0:cd43a974c54c | 556 | |
casiotone401 | 0:cd43a974c54c | 557 | sendMes.setTopAddress(SetMatrixAddress((ch * 2) + 1, erase, true)); |
casiotone401 | 0:cd43a974c54c | 558 | sendMes.setArgs("i", 0); |
casiotone401 | 0:cd43a974c54c | 559 | osc.sendOsc(&sendMes); |
casiotone401 | 0:cd43a974c54c | 560 | |
casiotone401 | 0:cd43a974c54c | 561 | sendMes.setTopAddress(SetMatrixAddress((ch * 2) + 1, masterclock, true)); |
casiotone401 | 0:cd43a974c54c | 562 | sendMes.setArgs("i", 1); |
casiotone401 | 0:cd43a974c54c | 563 | osc.sendOsc(&sendMes); |
casiotone401 | 0:cd43a974c54c | 564 | |
casiotone401 | 0:cd43a974c54c | 565 | } |
casiotone401 | 0:cd43a974c54c | 566 | |
casiotone401 | 0:cd43a974c54c | 567 | // turn on pulses on channels where a beat is present |
casiotone401 | 0:cd43a974c54c | 568 | if (BitRead(beat_holder[ch], read_head)) { |
casiotone401 | 0:cd43a974c54c | 569 | |
casiotone401 | 0:cd43a974c54c | 570 | if (!gatesoff) |
casiotone401 | 0:cd43a974c54c | 571 | { |
casiotone401 | 0:cd43a974c54c | 572 | gGATES[ch] = true; // pulse out |
casiotone401 | 0:cd43a974c54c | 573 | } |
casiotone401 | 0:cd43a974c54c | 574 | |
casiotone401 | 0:cd43a974c54c | 575 | sendMes.setTopAddress(SetMatrixAddress((MAXCHANNELS * 2), 3 - ch, true)); |
casiotone401 | 0:cd43a974c54c | 576 | sendMes.setArgs("i", 1); |
casiotone401 | 0:cd43a974c54c | 577 | osc.sendOsc(&sendMes); |
casiotone401 | 0:cd43a974c54c | 578 | |
casiotone401 | 0:cd43a974c54c | 579 | lights_active = pulses_active = true; |
casiotone401 | 0:cd43a974c54c | 580 | |
casiotone401 | 0:cd43a974c54c | 581 | if (!ch || (ch == 2)) { |
casiotone401 | 0:cd43a974c54c | 582 | |
casiotone401 | 0:cd43a974c54c | 583 | rand_vel = 127 - (rand() / (RAND_MAX / 40)); // random velocity ch1, ch3 |
casiotone401 | 0:cd43a974c54c | 584 | |
casiotone401 | 0:cd43a974c54c | 585 | } else { |
casiotone401 | 0:cd43a974c54c | 586 | |
casiotone401 | 0:cd43a974c54c | 587 | rand_vel = 95 - (rand() / (RAND_MAX / 70)); // random velocity ch2, ch4 |
casiotone401 | 0:cd43a974c54c | 588 | } |
casiotone401 | 0:cd43a974c54c | 589 | |
casiotone401 | 0:cd43a974c54c | 590 | rand_len = 127 - (rand() / (RAND_MAX / 110)); // random Amp EG Decay |
casiotone401 | 0:cd43a974c54c | 591 | |
casiotone401 | 0:cd43a974c54c | 592 | midi.sendControlChange(0x07, rand_vel, (ch + 1)); // volca sample Vol |
casiotone401 | 0:cd43a974c54c | 593 | midi.sendControlChange(0x30, rand_len, (ch + 1)); // volca sample Amp EG Decay |
casiotone401 | 0:cd43a974c54c | 594 | midi.sendNoteOn(0, 127, (ch + 1)); // volca sample trriger on |
casiotone401 | 0:cd43a974c54c | 595 | } |
casiotone401 | 0:cd43a974c54c | 596 | |
casiotone401 | 0:cd43a974c54c | 597 | // send off pulses to spare output for the first channel |
casiotone401 | 0:cd43a974c54c | 598 | if (!(BitRead(beat_holder[ch], read_head)) && !ch) { // only relates to first channel |
casiotone401 | 0:cd43a974c54c | 599 | |
casiotone401 | 0:cd43a974c54c | 600 | if (!gatesoff) |
casiotone401 | 0:cd43a974c54c | 601 | { |
casiotone401 | 0:cd43a974c54c | 602 | gCLOCKOUT = true; |
casiotone401 | 0:cd43a974c54c | 603 | } |
casiotone401 | 0:cd43a974c54c | 604 | |
casiotone401 | 0:cd43a974c54c | 605 | sendMes.setTopAddress(SetMatrixAddress((MAXCHANNELS * 2), 5, true)); |
casiotone401 | 0:cd43a974c54c | 606 | sendMes.setArgs("i", 1); |
casiotone401 | 0:cd43a974c54c | 607 | osc.sendOsc(&sendMes); |
casiotone401 | 0:cd43a974c54c | 608 | |
casiotone401 | 0:cd43a974c54c | 609 | lights_active = pulses_active = true; |
casiotone401 | 0:cd43a974c54c | 610 | } |
casiotone401 | 0:cd43a974c54c | 611 | |
casiotone401 | 0:cd43a974c54c | 612 | // move counter to next position, ready for next pulse |
casiotone401 | 0:cd43a974c54c | 613 | ++channelbeats[ch][2]; |
casiotone401 | 0:cd43a974c54c | 614 | |
casiotone401 | 0:cd43a974c54c | 615 | if ((channelbeats[ch][2]) >= (channelbeats[ch][0])) { |
casiotone401 | 0:cd43a974c54c | 616 | channelbeats[ch][2] = 0; |
casiotone401 | 0:cd43a974c54c | 617 | } |
casiotone401 | 0:cd43a974c54c | 618 | } |
casiotone401 | 0:cd43a974c54c | 619 | |
casiotone401 | 0:cd43a974c54c | 620 | ++masterclock; |
casiotone401 | 0:cd43a974c54c | 621 | masterclock &= (MAXSTEPS - 1); |
casiotone401 | 0:cd43a974c54c | 622 | |
casiotone401 | 0:cd43a974c54c | 623 | pulse_length = ((euc_time - last_sync) / 5); |
casiotone401 | 0:cd43a974c54c | 624 | last_sync = euc_time; |
casiotone401 | 0:cd43a974c54c | 625 | } |
casiotone401 | 0:cd43a974c54c | 626 | |
casiotone401 | 0:cd43a974c54c | 627 | /* 3 functions to read each encoder |
casiotone401 | 0:cd43a974c54c | 628 | returns +1, 0 or -1 dependent on direction |
casiotone401 | 0:cd43a974c54c | 629 | Contains no internal debounce, so calls should be delayed |
casiotone401 | 0:cd43a974c54c | 630 | */ |
casiotone401 | 0:cd43a974c54c | 631 | |
casiotone401 | 0:cd43a974c54c | 632 | //------------------------------------------------------------- |
casiotone401 | 0:cd43a974c54c | 633 | // Check Euclidean Seq N(length) Value |
casiotone401 | 0:cd43a974c54c | 634 | |
casiotone401 | 0:cd43a974c54c | 635 | int EncodeReadN(int ch) { |
casiotone401 | 0:cd43a974c54c | 636 | static float _enc[4]; |
casiotone401 | 0:cd43a974c54c | 637 | int result = 0; |
casiotone401 | 0:cd43a974c54c | 638 | |
casiotone401 | 0:cd43a974c54c | 639 | switch (ch) |
casiotone401 | 0:cd43a974c54c | 640 | { |
casiotone401 | 0:cd43a974c54c | 641 | case 0: |
casiotone401 | 0:cd43a974c54c | 642 | |
casiotone401 | 0:cd43a974c54c | 643 | if (gEucA[0] == 0) { |
casiotone401 | 0:cd43a974c54c | 644 | _enc[ch] = result = 0; |
casiotone401 | 0:cd43a974c54c | 645 | |
casiotone401 | 0:cd43a974c54c | 646 | } else if (gEucA[0] < _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 647 | result = -1; |
casiotone401 | 0:cd43a974c54c | 648 | _enc[ch] = gEucA[0]; |
casiotone401 | 0:cd43a974c54c | 649 | |
casiotone401 | 0:cd43a974c54c | 650 | } else if (gEucA[0] > _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 651 | result = 1; |
casiotone401 | 0:cd43a974c54c | 652 | _enc[ch] = gEucA[0]; |
casiotone401 | 0:cd43a974c54c | 653 | } |
casiotone401 | 0:cd43a974c54c | 654 | |
casiotone401 | 0:cd43a974c54c | 655 | break; |
casiotone401 | 0:cd43a974c54c | 656 | |
casiotone401 | 0:cd43a974c54c | 657 | case 1: |
casiotone401 | 0:cd43a974c54c | 658 | |
casiotone401 | 0:cd43a974c54c | 659 | if (gEucA[3] == 0) { |
casiotone401 | 0:cd43a974c54c | 660 | _enc[ch] = result = 0; |
casiotone401 | 0:cd43a974c54c | 661 | |
casiotone401 | 0:cd43a974c54c | 662 | } else if (gEucA[3] < _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 663 | result = -1; |
casiotone401 | 0:cd43a974c54c | 664 | _enc[ch] = gEucA[3]; |
casiotone401 | 0:cd43a974c54c | 665 | |
casiotone401 | 0:cd43a974c54c | 666 | } else if (gEucA[3] > _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 667 | result = 1; |
casiotone401 | 0:cd43a974c54c | 668 | _enc[ch] = gEucA[3]; |
casiotone401 | 0:cd43a974c54c | 669 | } |
casiotone401 | 0:cd43a974c54c | 670 | |
casiotone401 | 0:cd43a974c54c | 671 | break; |
casiotone401 | 0:cd43a974c54c | 672 | |
casiotone401 | 0:cd43a974c54c | 673 | case 2: |
casiotone401 | 0:cd43a974c54c | 674 | |
casiotone401 | 0:cd43a974c54c | 675 | if (gEucB[0] == 0) { |
casiotone401 | 0:cd43a974c54c | 676 | _enc[ch] = result = 0; |
casiotone401 | 0:cd43a974c54c | 677 | |
casiotone401 | 0:cd43a974c54c | 678 | } else if (gEucB[0] < _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 679 | result = -1; |
casiotone401 | 0:cd43a974c54c | 680 | _enc[ch] = gEucB[0]; |
casiotone401 | 0:cd43a974c54c | 681 | |
casiotone401 | 0:cd43a974c54c | 682 | } else if (gEucB[0] > _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 683 | result = 1; |
casiotone401 | 0:cd43a974c54c | 684 | _enc[ch] = gEucB[0]; |
casiotone401 | 0:cd43a974c54c | 685 | } |
casiotone401 | 0:cd43a974c54c | 686 | |
casiotone401 | 0:cd43a974c54c | 687 | break; |
casiotone401 | 0:cd43a974c54c | 688 | |
casiotone401 | 0:cd43a974c54c | 689 | case 3: |
casiotone401 | 0:cd43a974c54c | 690 | |
casiotone401 | 0:cd43a974c54c | 691 | if (gEucB[3] == 0) { |
casiotone401 | 0:cd43a974c54c | 692 | _enc[ch] = result = 0; |
casiotone401 | 0:cd43a974c54c | 693 | |
casiotone401 | 0:cd43a974c54c | 694 | } else if (gEucB[3] < _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 695 | result = -1; |
casiotone401 | 0:cd43a974c54c | 696 | _enc[ch] = gEucB[3]; |
casiotone401 | 0:cd43a974c54c | 697 | |
casiotone401 | 0:cd43a974c54c | 698 | } else if (gEucB[3] > _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 699 | result = 1; |
casiotone401 | 0:cd43a974c54c | 700 | _enc[ch] = gEucB[3]; |
casiotone401 | 0:cd43a974c54c | 701 | } |
casiotone401 | 0:cd43a974c54c | 702 | |
casiotone401 | 0:cd43a974c54c | 703 | break; |
casiotone401 | 0:cd43a974c54c | 704 | |
casiotone401 | 0:cd43a974c54c | 705 | default: |
casiotone401 | 0:cd43a974c54c | 706 | break; |
casiotone401 | 0:cd43a974c54c | 707 | } |
casiotone401 | 0:cd43a974c54c | 708 | |
casiotone401 | 0:cd43a974c54c | 709 | return result; |
casiotone401 | 0:cd43a974c54c | 710 | } |
casiotone401 | 0:cd43a974c54c | 711 | |
casiotone401 | 0:cd43a974c54c | 712 | //------------------------------------------------------------- |
casiotone401 | 0:cd43a974c54c | 713 | // Check Euclidean Seq K(Density) Value |
casiotone401 | 0:cd43a974c54c | 714 | |
casiotone401 | 0:cd43a974c54c | 715 | int EncodeReadK(int ch) { |
casiotone401 | 0:cd43a974c54c | 716 | static float _enc[4]; |
casiotone401 | 0:cd43a974c54c | 717 | int result = 0; |
casiotone401 | 0:cd43a974c54c | 718 | |
casiotone401 | 0:cd43a974c54c | 719 | switch (ch) |
casiotone401 | 0:cd43a974c54c | 720 | { |
casiotone401 | 0:cd43a974c54c | 721 | case 0: |
casiotone401 | 0:cd43a974c54c | 722 | |
casiotone401 | 0:cd43a974c54c | 723 | if (gEucA[1] == 0) { |
casiotone401 | 0:cd43a974c54c | 724 | _enc[ch] = result = 0; |
casiotone401 | 0:cd43a974c54c | 725 | |
casiotone401 | 0:cd43a974c54c | 726 | } else if (gEucA[1] < _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 727 | result = -1; |
casiotone401 | 0:cd43a974c54c | 728 | _enc[ch] = gEucA[1]; |
casiotone401 | 0:cd43a974c54c | 729 | |
casiotone401 | 0:cd43a974c54c | 730 | } else if (gEucA[1] > _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 731 | result = 1; |
casiotone401 | 0:cd43a974c54c | 732 | _enc[ch] = gEucA[1]; |
casiotone401 | 0:cd43a974c54c | 733 | } |
casiotone401 | 0:cd43a974c54c | 734 | |
casiotone401 | 0:cd43a974c54c | 735 | break; |
casiotone401 | 0:cd43a974c54c | 736 | |
casiotone401 | 0:cd43a974c54c | 737 | case 1: |
casiotone401 | 0:cd43a974c54c | 738 | |
casiotone401 | 0:cd43a974c54c | 739 | if (gEucA[4] == 0) { |
casiotone401 | 0:cd43a974c54c | 740 | _enc[ch] = result = 0; |
casiotone401 | 0:cd43a974c54c | 741 | |
casiotone401 | 0:cd43a974c54c | 742 | } else if (gEucA[4] < _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 743 | result = -4; |
casiotone401 | 0:cd43a974c54c | 744 | _enc[ch] = gEucA[4]; |
casiotone401 | 0:cd43a974c54c | 745 | |
casiotone401 | 0:cd43a974c54c | 746 | } else if (gEucA[4] > _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 747 | result = 4; |
casiotone401 | 0:cd43a974c54c | 748 | _enc[ch] = gEucA[4]; |
casiotone401 | 0:cd43a974c54c | 749 | } |
casiotone401 | 0:cd43a974c54c | 750 | |
casiotone401 | 0:cd43a974c54c | 751 | break; |
casiotone401 | 0:cd43a974c54c | 752 | |
casiotone401 | 0:cd43a974c54c | 753 | case 2: |
casiotone401 | 0:cd43a974c54c | 754 | |
casiotone401 | 0:cd43a974c54c | 755 | if (gEucB[1] == 0) { |
casiotone401 | 0:cd43a974c54c | 756 | _enc[ch] = result = 0; |
casiotone401 | 0:cd43a974c54c | 757 | |
casiotone401 | 0:cd43a974c54c | 758 | } else if (gEucB[1] < _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 759 | result = -1; |
casiotone401 | 0:cd43a974c54c | 760 | _enc[ch] = gEucB[1]; |
casiotone401 | 0:cd43a974c54c | 761 | |
casiotone401 | 0:cd43a974c54c | 762 | } else if (gEucB[1] > _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 763 | result = 1; |
casiotone401 | 0:cd43a974c54c | 764 | _enc[ch] = gEucB[1]; |
casiotone401 | 0:cd43a974c54c | 765 | } |
casiotone401 | 0:cd43a974c54c | 766 | |
casiotone401 | 0:cd43a974c54c | 767 | break; |
casiotone401 | 0:cd43a974c54c | 768 | |
casiotone401 | 0:cd43a974c54c | 769 | case 3: |
casiotone401 | 0:cd43a974c54c | 770 | |
casiotone401 | 0:cd43a974c54c | 771 | if (gEucB[4] == 0) { |
casiotone401 | 0:cd43a974c54c | 772 | _enc[ch] = result = 0; |
casiotone401 | 0:cd43a974c54c | 773 | |
casiotone401 | 0:cd43a974c54c | 774 | } else if (gEucB[4] < _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 775 | result = -1; |
casiotone401 | 0:cd43a974c54c | 776 | _enc[ch] = gEucB[4]; |
casiotone401 | 0:cd43a974c54c | 777 | |
casiotone401 | 0:cd43a974c54c | 778 | } else if (gEucB[4] > _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 779 | result = 1; |
casiotone401 | 0:cd43a974c54c | 780 | _enc[ch] = gEucB[4]; |
casiotone401 | 0:cd43a974c54c | 781 | } |
casiotone401 | 0:cd43a974c54c | 782 | |
casiotone401 | 0:cd43a974c54c | 783 | break; |
casiotone401 | 0:cd43a974c54c | 784 | |
casiotone401 | 0:cd43a974c54c | 785 | default: |
casiotone401 | 0:cd43a974c54c | 786 | break; |
casiotone401 | 0:cd43a974c54c | 787 | } |
casiotone401 | 0:cd43a974c54c | 788 | |
casiotone401 | 0:cd43a974c54c | 789 | return result; |
casiotone401 | 0:cd43a974c54c | 790 | } |
casiotone401 | 0:cd43a974c54c | 791 | |
casiotone401 | 0:cd43a974c54c | 792 | //------------------------------------------------------------- |
casiotone401 | 0:cd43a974c54c | 793 | // Check Euclidean Seq O(Offset) Value |
casiotone401 | 0:cd43a974c54c | 794 | |
casiotone401 | 0:cd43a974c54c | 795 | int EncodeReadO(int ch) { |
casiotone401 | 0:cd43a974c54c | 796 | static float _enc[4]; |
casiotone401 | 0:cd43a974c54c | 797 | int result = 0; |
casiotone401 | 0:cd43a974c54c | 798 | |
casiotone401 | 0:cd43a974c54c | 799 | switch (ch) |
casiotone401 | 0:cd43a974c54c | 800 | { |
casiotone401 | 0:cd43a974c54c | 801 | case 0: |
casiotone401 | 0:cd43a974c54c | 802 | |
casiotone401 | 0:cd43a974c54c | 803 | if (gEucA[2] == 0) { |
casiotone401 | 0:cd43a974c54c | 804 | _enc[ch] = result = 0; |
casiotone401 | 0:cd43a974c54c | 805 | |
casiotone401 | 0:cd43a974c54c | 806 | } else if (gEucA[2] < _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 807 | result = -1; |
casiotone401 | 0:cd43a974c54c | 808 | _enc[ch] = gEucA[2]; |
casiotone401 | 0:cd43a974c54c | 809 | |
casiotone401 | 0:cd43a974c54c | 810 | } else if (gEucA[2] > _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 811 | result = 1; |
casiotone401 | 0:cd43a974c54c | 812 | _enc[ch] = gEucA[2]; |
casiotone401 | 0:cd43a974c54c | 813 | } |
casiotone401 | 0:cd43a974c54c | 814 | |
casiotone401 | 0:cd43a974c54c | 815 | break; |
casiotone401 | 0:cd43a974c54c | 816 | |
casiotone401 | 0:cd43a974c54c | 817 | case 1: |
casiotone401 | 0:cd43a974c54c | 818 | |
casiotone401 | 0:cd43a974c54c | 819 | if (gEucA[5] == 0) { |
casiotone401 | 0:cd43a974c54c | 820 | _enc[ch] = result = 0; |
casiotone401 | 0:cd43a974c54c | 821 | |
casiotone401 | 0:cd43a974c54c | 822 | } else if (gEucA[5] < _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 823 | result = -1; |
casiotone401 | 0:cd43a974c54c | 824 | _enc[ch] = gEucA[5]; |
casiotone401 | 0:cd43a974c54c | 825 | |
casiotone401 | 0:cd43a974c54c | 826 | } else if (gEucA[5] > _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 827 | result = 1; |
casiotone401 | 0:cd43a974c54c | 828 | _enc[ch] = gEucA[5]; |
casiotone401 | 0:cd43a974c54c | 829 | } |
casiotone401 | 0:cd43a974c54c | 830 | |
casiotone401 | 0:cd43a974c54c | 831 | break; |
casiotone401 | 0:cd43a974c54c | 832 | |
casiotone401 | 0:cd43a974c54c | 833 | case 2: |
casiotone401 | 0:cd43a974c54c | 834 | |
casiotone401 | 0:cd43a974c54c | 835 | if (gEucB[2] == 0) { |
casiotone401 | 0:cd43a974c54c | 836 | _enc[ch] = result = 0; |
casiotone401 | 0:cd43a974c54c | 837 | |
casiotone401 | 0:cd43a974c54c | 838 | } else if (gEucB[2] < _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 839 | result = -1; |
casiotone401 | 0:cd43a974c54c | 840 | _enc[ch] = gEucB[2]; |
casiotone401 | 0:cd43a974c54c | 841 | |
casiotone401 | 0:cd43a974c54c | 842 | } else if (gEucB[2] > _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 843 | result = 1; |
casiotone401 | 0:cd43a974c54c | 844 | _enc[ch] = gEucB[2]; |
casiotone401 | 0:cd43a974c54c | 845 | } |
casiotone401 | 0:cd43a974c54c | 846 | |
casiotone401 | 0:cd43a974c54c | 847 | break; |
casiotone401 | 0:cd43a974c54c | 848 | |
casiotone401 | 0:cd43a974c54c | 849 | case 3: |
casiotone401 | 0:cd43a974c54c | 850 | |
casiotone401 | 0:cd43a974c54c | 851 | if (gEucB[5] == 0) { |
casiotone401 | 0:cd43a974c54c | 852 | _enc[ch] = result = 0; |
casiotone401 | 0:cd43a974c54c | 853 | |
casiotone401 | 0:cd43a974c54c | 854 | } else if (gEucB[5] < _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 855 | result = -1; |
casiotone401 | 0:cd43a974c54c | 856 | _enc[ch] = gEucB[5]; |
casiotone401 | 0:cd43a974c54c | 857 | |
casiotone401 | 0:cd43a974c54c | 858 | } else if (gEucB[5] > _enc[ch]) { |
casiotone401 | 0:cd43a974c54c | 859 | result = 1; |
casiotone401 | 0:cd43a974c54c | 860 | _enc[ch] = gEucB[5]; |
casiotone401 | 0:cd43a974c54c | 861 | } |
casiotone401 | 0:cd43a974c54c | 862 | |
casiotone401 | 0:cd43a974c54c | 863 | break; |
casiotone401 | 0:cd43a974c54c | 864 | |
casiotone401 | 0:cd43a974c54c | 865 | default: |
casiotone401 | 0:cd43a974c54c | 866 | break; |
casiotone401 | 0:cd43a974c54c | 867 | } |
casiotone401 | 0:cd43a974c54c | 868 | |
casiotone401 | 0:cd43a974c54c | 869 | return result; |
casiotone401 | 0:cd43a974c54c | 870 | } |