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_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 }