OSCtoCV Library

Dependents:   OSCtoCVConverter

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

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