OSCtoCV Library

Dependents:   OSCtoCVConverter

Committer:
casiotone401
Date:
Thu Jan 28 11:39:47 2016 +0000
Revision:
1:981b62bb5c87
Parent:
0:cd43a974c54c
Child:
2:9fa7540890c9
added Beats Seq

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 1:981b62bb5c87 32 void 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 1:981b62bb5c87 84 return;
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 0:cd43a974c54c 319 }
casiotone401 0:cd43a974c54c 320
casiotone401 0:cd43a974c54c 321 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 322 // Init Euclidean Sequencer
casiotone401 0:cd43a974c54c 323
casiotone401 0:cd43a974c54c 324 void InitEuclideanSeq(void) {
casiotone401 0:cd43a974c54c 325 // Initialize Euclid Sequencer
casiotone401 0:cd43a974c54c 326 channelbeats[0][0] = 16;
casiotone401 0:cd43a974c54c 327 channelbeats[0][1] = 8;
casiotone401 0:cd43a974c54c 328 channelbeats[0][2] = 0;
casiotone401 0:cd43a974c54c 329 channelbeats[0][3] = 0;
casiotone401 0:cd43a974c54c 330
casiotone401 0:cd43a974c54c 331 channelbeats[1][0] = 16;
casiotone401 0:cd43a974c54c 332 channelbeats[1][1] = 9;
casiotone401 0:cd43a974c54c 333 channelbeats[1][2] = 0;
casiotone401 0:cd43a974c54c 334 channelbeats[1][3] = 0;
casiotone401 0:cd43a974c54c 335
casiotone401 0:cd43a974c54c 336 channelbeats[2][0] = 16;
casiotone401 0:cd43a974c54c 337 channelbeats[2][1] = 7;
casiotone401 0:cd43a974c54c 338 channelbeats[2][2] = 0;
casiotone401 0:cd43a974c54c 339 channelbeats[2][3] = 0;
casiotone401 0:cd43a974c54c 340
casiotone401 0:cd43a974c54c 341 channelbeats[3][0] = 16;
casiotone401 0:cd43a974c54c 342 channelbeats[3][1] = 9;
casiotone401 0:cd43a974c54c 343 channelbeats[3][2] = 0;
casiotone401 0:cd43a974c54c 344 channelbeats[3][3] = 0;
casiotone401 0:cd43a974c54c 345
casiotone401 0:cd43a974c54c 346 for (int i = 0; i < channels; ++i)
casiotone401 0:cd43a974c54c 347 {
casiotone401 0:cd43a974c54c 348 beat_holder[i] = Euclid(channelbeats[i][0], channelbeats[i][1], channelbeats[i][3]);
casiotone401 0:cd43a974c54c 349 }
casiotone401 0:cd43a974c54c 350 }
casiotone401 0:cd43a974c54c 351
casiotone401 0:cd43a974c54c 352
casiotone401 0:cd43a974c54c 353 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 354 // Euclid calculation function
casiotone401 0:cd43a974c54c 355
casiotone401 0:cd43a974c54c 356 unsigned int Euclid(int n, int k, int o) { // inputs: n=total, k=beats, o = offset
casiotone401 0:cd43a974c54c 357 int pauses = (n - k);
casiotone401 0:cd43a974c54c 358 int pulses = k;
casiotone401 0:cd43a974c54c 359 int offset = o;
casiotone401 0:cd43a974c54c 360 int steps = n;
casiotone401 0:cd43a974c54c 361 int per_pulse = (pauses / k);
casiotone401 0:cd43a974c54c 362 int remainder = (pauses % pulses);
casiotone401 0:cd43a974c54c 363 unsigned int workbeat[n];
casiotone401 0:cd43a974c54c 364 unsigned int outbeat;
casiotone401 0:cd43a974c54c 365 uint16_t outbeat2;
casiotone401 0:cd43a974c54c 366 int workbeat_count = n;
casiotone401 0:cd43a974c54c 367 int a_remainder, b_remainder;
casiotone401 0:cd43a974c54c 368 int groupa, groupb;
casiotone401 0:cd43a974c54c 369 int i, j;
casiotone401 0:cd43a974c54c 370 int trim_count;
casiotone401 0:cd43a974c54c 371
casiotone401 0:cd43a974c54c 372 for (i = 0; i < n; ++i) { // Populate workbeat with unsorted pulses and pauses
casiotone401 0:cd43a974c54c 373
casiotone401 0:cd43a974c54c 374 if (i < pulses) {
casiotone401 0:cd43a974c54c 375
casiotone401 0:cd43a974c54c 376 workbeat[i] = 1;
casiotone401 0:cd43a974c54c 377
casiotone401 0:cd43a974c54c 378 } else {
casiotone401 0:cd43a974c54c 379
casiotone401 0:cd43a974c54c 380 workbeat[i] = 0;
casiotone401 0:cd43a974c54c 381 }
casiotone401 0:cd43a974c54c 382 }
casiotone401 0:cd43a974c54c 383
casiotone401 0:cd43a974c54c 384 if (per_pulse > 0 && remainder < 2) { // Handle easy cases where there is no or only one remainer
casiotone401 0:cd43a974c54c 385
casiotone401 0:cd43a974c54c 386 for (i = 0; i < pulses; ++i) {
casiotone401 0:cd43a974c54c 387
casiotone401 0:cd43a974c54c 388 for (j = (workbeat_count - 1); j > (workbeat_count - per_pulse - 1); --j) {
casiotone401 0:cd43a974c54c 389 workbeat[i] = ConcatBin(workbeat[i], workbeat[j]);
casiotone401 0:cd43a974c54c 390 }
casiotone401 0:cd43a974c54c 391
casiotone401 0:cd43a974c54c 392 workbeat_count = (workbeat_count - per_pulse);
casiotone401 0:cd43a974c54c 393
casiotone401 0:cd43a974c54c 394 }
casiotone401 0:cd43a974c54c 395
casiotone401 0:cd43a974c54c 396 outbeat = 0; // Concatenate workbeat into outbeat - according to workbeat_count
casiotone401 0:cd43a974c54c 397
casiotone401 0:cd43a974c54c 398 for (i = 0; i < workbeat_count; ++i) {
casiotone401 0:cd43a974c54c 399 outbeat = ConcatBin(outbeat, workbeat[i]);
casiotone401 0:cd43a974c54c 400 }
casiotone401 0:cd43a974c54c 401
casiotone401 0:cd43a974c54c 402
casiotone401 0:cd43a974c54c 403 if (offset != 0) {
casiotone401 0:cd43a974c54c 404
casiotone401 0:cd43a974c54c 405 outbeat2 = BitReadOffset(offset, outbeat, steps); // Add offset to the step pattern
casiotone401 0:cd43a974c54c 406
casiotone401 0:cd43a974c54c 407 } else {
casiotone401 0:cd43a974c54c 408
casiotone401 0:cd43a974c54c 409 outbeat2 = outbeat;
casiotone401 0:cd43a974c54c 410 }
casiotone401 0:cd43a974c54c 411
casiotone401 0:cd43a974c54c 412 return outbeat2;
casiotone401 0:cd43a974c54c 413
casiotone401 0:cd43a974c54c 414 } else {
casiotone401 0:cd43a974c54c 415
casiotone401 0:cd43a974c54c 416 groupa = pulses;
casiotone401 0:cd43a974c54c 417 groupb = pauses;
casiotone401 0:cd43a974c54c 418
casiotone401 0:cd43a974c54c 419 while (groupb > 1) { //main recursive loop
casiotone401 0:cd43a974c54c 420
casiotone401 0:cd43a974c54c 421 if (groupa > groupb) { // more Group A than Group B
casiotone401 0:cd43a974c54c 422
casiotone401 0:cd43a974c54c 423 a_remainder = (groupa - groupb); // what will be left of groupa once groupB is interleaved
casiotone401 0:cd43a974c54c 424 trim_count = 0;
casiotone401 0:cd43a974c54c 425
casiotone401 0:cd43a974c54c 426 for (i = 0; i < (groupa - a_remainder); ++i) { //count through the matching sets of A, ignoring remaindered
casiotone401 0:cd43a974c54c 427 workbeat[i] = ConcatBin(workbeat[i], workbeat[workbeat_count - 1 - i]);
casiotone401 0:cd43a974c54c 428 ++trim_count;
casiotone401 0:cd43a974c54c 429 }
casiotone401 0:cd43a974c54c 430
casiotone401 0:cd43a974c54c 431 workbeat_count = (workbeat_count - trim_count);
casiotone401 0:cd43a974c54c 432
casiotone401 0:cd43a974c54c 433 groupa = groupb;
casiotone401 0:cd43a974c54c 434 groupb = a_remainder;
casiotone401 0:cd43a974c54c 435
casiotone401 0:cd43a974c54c 436 } else if (groupb > groupa) { // More Group B than Group A
casiotone401 0:cd43a974c54c 437
casiotone401 0:cd43a974c54c 438 b_remainder = (groupb - groupa); // what will be left of group once group A is interleaved
casiotone401 0:cd43a974c54c 439 trim_count = 0;
casiotone401 0:cd43a974c54c 440
casiotone401 0:cd43a974c54c 441 for (i = workbeat_count-1; i >= (groupa + b_remainder); --i) { //count from right back through the Bs
casiotone401 0:cd43a974c54c 442 workbeat[workbeat_count - i - 1] = ConcatBin(workbeat[workbeat_count - 1 - i], workbeat[i]);
casiotone401 0:cd43a974c54c 443 ++trim_count;
casiotone401 0:cd43a974c54c 444 }
casiotone401 0:cd43a974c54c 445
casiotone401 0:cd43a974c54c 446 workbeat_count = (workbeat_count - trim_count);
casiotone401 0:cd43a974c54c 447 groupb = b_remainder;
casiotone401 0:cd43a974c54c 448
casiotone401 0:cd43a974c54c 449 } else if (groupa == groupb) { // groupa = groupb
casiotone401 0:cd43a974c54c 450
casiotone401 0:cd43a974c54c 451 trim_count = 0;
casiotone401 0:cd43a974c54c 452
casiotone401 0:cd43a974c54c 453 for (i = 0; i < groupa; ++i) {
casiotone401 0:cd43a974c54c 454 workbeat[i] = ConcatBin(workbeat[i], workbeat[workbeat_count - 1 - i]);
casiotone401 0:cd43a974c54c 455 ++trim_count;
casiotone401 0:cd43a974c54c 456 }
casiotone401 0:cd43a974c54c 457
casiotone401 0:cd43a974c54c 458 workbeat_count = (workbeat_count - trim_count);
casiotone401 0:cd43a974c54c 459 groupb = 0;
casiotone401 0:cd43a974c54c 460
casiotone401 0:cd43a974c54c 461 }
casiotone401 0:cd43a974c54c 462 }
casiotone401 0:cd43a974c54c 463
casiotone401 0:cd43a974c54c 464 outbeat = 0; // Concatenate workbeat into outbeat - according to workbeat_count
casiotone401 0:cd43a974c54c 465
casiotone401 0:cd43a974c54c 466 for (i = 0; i < workbeat_count; ++i) {
casiotone401 0:cd43a974c54c 467
casiotone401 0:cd43a974c54c 468 outbeat = ConcatBin(outbeat, workbeat[i]);
casiotone401 0:cd43a974c54c 469 }
casiotone401 0:cd43a974c54c 470
casiotone401 0:cd43a974c54c 471 if (offset != 0) {
casiotone401 0:cd43a974c54c 472
casiotone401 0:cd43a974c54c 473 outbeat2 = BitReadOffset(offset, outbeat, steps); // Add offset to the step pattern
casiotone401 0:cd43a974c54c 474
casiotone401 0:cd43a974c54c 475 } else {
casiotone401 0:cd43a974c54c 476
casiotone401 0:cd43a974c54c 477 outbeat2 = outbeat;
casiotone401 0:cd43a974c54c 478 }
casiotone401 0:cd43a974c54c 479
casiotone401 0:cd43a974c54c 480 return outbeat2;
casiotone401 0:cd43a974c54c 481 }
casiotone401 0:cd43a974c54c 482 }
casiotone401 0:cd43a974c54c 483
casiotone401 0:cd43a974c54c 484 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 485 // Reads a bit of a number
casiotone401 0:cd43a974c54c 486
casiotone401 0:cd43a974c54c 487 int BitRead(uint16_t b, int bitPos) {
casiotone401 0:cd43a974c54c 488 int x;
casiotone401 0:cd43a974c54c 489
casiotone401 0:cd43a974c54c 490 x = b & (1 << bitPos);
casiotone401 0:cd43a974c54c 491
casiotone401 0:cd43a974c54c 492 return x == 0 ? 0 : 1;
casiotone401 0:cd43a974c54c 493 }
casiotone401 0:cd43a974c54c 494
casiotone401 0:cd43a974c54c 495 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 496 // Function to right rotate n by d bits
casiotone401 0:cd43a974c54c 497
casiotone401 0:cd43a974c54c 498 uint16_t BitReadOffset(int shift, uint16_t value, uint16_t pattern_length) {
casiotone401 0:cd43a974c54c 499 uint16_t mask = ((1 << pattern_length) - 1);
casiotone401 0:cd43a974c54c 500 value &= mask;
casiotone401 0:cd43a974c54c 501
casiotone401 0:cd43a974c54c 502 return ((value >> shift) | (value << (pattern_length - shift))) & mask;
casiotone401 0:cd43a974c54c 503 }
casiotone401 0:cd43a974c54c 504
casiotone401 0:cd43a974c54c 505 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 506 // Function to find the binary length of a number by counting bitwise
casiotone401 0:cd43a974c54c 507
casiotone401 0:cd43a974c54c 508 int findlength(unsigned int bnry) {
casiotone401 0:cd43a974c54c 509 bool lengthfound = false;
casiotone401 0:cd43a974c54c 510 int i;
casiotone401 0:cd43a974c54c 511 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 512
casiotone401 0:cd43a974c54c 513 for (i = 32; i >= 0; i--) {
casiotone401 0:cd43a974c54c 514
casiotone401 0:cd43a974c54c 515 if ((BitRead(bnry, i)) && !lengthfound) {
casiotone401 0:cd43a974c54c 516 length = (i + 1);
casiotone401 0:cd43a974c54c 517 lengthfound = true;
casiotone401 0:cd43a974c54c 518 }
casiotone401 0:cd43a974c54c 519
casiotone401 0:cd43a974c54c 520 }
casiotone401 0:cd43a974c54c 521
casiotone401 0:cd43a974c54c 522 return length;
casiotone401 0:cd43a974c54c 523 }
casiotone401 0:cd43a974c54c 524
casiotone401 0:cd43a974c54c 525 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 526 // Function to concatenate two binary numbers bitwise
casiotone401 0:cd43a974c54c 527
casiotone401 0:cd43a974c54c 528 unsigned int ConcatBin(unsigned int bina, unsigned int binb) {
casiotone401 0:cd43a974c54c 529 int binb_len = findlength(binb);
casiotone401 0:cd43a974c54c 530 unsigned int sum = (bina << binb_len);
casiotone401 0:cd43a974c54c 531
casiotone401 0:cd43a974c54c 532 sum = sum | binb;
casiotone401 0:cd43a974c54c 533
casiotone401 0:cd43a974c54c 534 return sum;
casiotone401 0:cd43a974c54c 535 }
casiotone401 0:cd43a974c54c 536
casiotone401 0:cd43a974c54c 537 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 538 // routine triggered by each beat
casiotone401 0:cd43a974c54c 539
casiotone401 0:cd43a974c54c 540 void Sync(int active_channel, bool gatesoff) {
casiotone401 0:cd43a974c54c 541 int read_head, erase;
casiotone401 0:cd43a974c54c 542 int rand_vel, rand_len;
casiotone401 0:cd43a974c54c 543 int ch, i;
casiotone401 1:981b62bb5c87 544
casiotone401 0:cd43a974c54c 545 if (masterclock % 2 == 0) {
casiotone401 1:981b62bb5c87 546 sendMes.setTopAddress(SetMatrixAddress((MAXCHANNELS * 2), 7, EUCLID));
casiotone401 0:cd43a974c54c 547 sendMes.setArgs("i", 1);
casiotone401 0:cd43a974c54c 548 osc.sendOsc(&sendMes);
casiotone401 0:cd43a974c54c 549
casiotone401 0:cd43a974c54c 550 } else {
casiotone401 0:cd43a974c54c 551
casiotone401 1:981b62bb5c87 552 sendMes.setTopAddress(SetMatrixAddress((MAXCHANNELS * 2), 7, EUCLID));
casiotone401 0:cd43a974c54c 553 sendMes.setArgs("i", 0);
casiotone401 0:cd43a974c54c 554 osc.sendOsc(&sendMes);
casiotone401 0:cd43a974c54c 555 }
casiotone401 0:cd43a974c54c 556
casiotone401 0:cd43a974c54c 557 // Cycle through channels
casiotone401 0:cd43a974c54c 558 for (ch = 0; ch < channels; ++ch) {
casiotone401 0:cd43a974c54c 559
casiotone401 0:cd43a974c54c 560 read_head = (channelbeats[ch][0] - channelbeats[ch][2] - 1);
casiotone401 0:cd43a974c54c 561
casiotone401 0:cd43a974c54c 562 if (ch != active_channel || (euc_time - last_changed[active_channel]) > DISPLAY_UPDATE) {
casiotone401 0:cd43a974c54c 563
casiotone401 0:cd43a974c54c 564 if (channelbeats[ch][2] < MAXSTEPS) {
casiotone401 0:cd43a974c54c 565
casiotone401 0:cd43a974c54c 566 for (i = 0; i < MAXSTEPS; ++i) {
casiotone401 0:cd43a974c54c 567
casiotone401 0:cd43a974c54c 568 if (BitRead(beat_holder[ch],channelbeats[ch][0] - 1 - i) && i < channelbeats[ch][0]) {
casiotone401 0:cd43a974c54c 569
casiotone401 1:981b62bb5c87 570 sendMes.setTopAddress(SetMatrixAddress(ch * 2, i, EUCLID));
casiotone401 0:cd43a974c54c 571 sendMes.setArgs("i", 1);
casiotone401 0:cd43a974c54c 572 osc.sendOsc(&sendMes);
casiotone401 0:cd43a974c54c 573
casiotone401 0:cd43a974c54c 574 } else {
casiotone401 0:cd43a974c54c 575
casiotone401 1:981b62bb5c87 576 sendMes.setTopAddress(SetMatrixAddress(ch * 2, i, EUCLID));
casiotone401 0:cd43a974c54c 577 sendMes.setArgs("i", 0);
casiotone401 0:cd43a974c54c 578 osc.sendOsc(&sendMes);
casiotone401 0:cd43a974c54c 579 }
casiotone401 0:cd43a974c54c 580
casiotone401 0:cd43a974c54c 581 }
casiotone401 0:cd43a974c54c 582 }
casiotone401 0:cd43a974c54c 583 }
casiotone401 0:cd43a974c54c 584
casiotone401 1:981b62bb5c87 585 if (!masterclock) {
casiotone401 1:981b62bb5c87 586
casiotone401 1:981b62bb5c87 587 erase = MAXSTEPS - 1;
casiotone401 1:981b62bb5c87 588
casiotone401 1:981b62bb5c87 589 } else {
casiotone401 0:cd43a974c54c 590
casiotone401 1:981b62bb5c87 591 erase = masterclock - 1;
casiotone401 1:981b62bb5c87 592 }
casiotone401 1:981b62bb5c87 593
casiotone401 1:981b62bb5c87 594 sendMes.setTopAddress(SetMatrixAddress((ch * 2) + 1, erase, EUCLID));
casiotone401 1:981b62bb5c87 595 sendMes.setArgs("i", 0);
casiotone401 1:981b62bb5c87 596 osc.sendOsc(&sendMes);
casiotone401 0:cd43a974c54c 597
casiotone401 1:981b62bb5c87 598 sendMes.setTopAddress(SetMatrixAddress((ch * 2) + 1, masterclock, EUCLID));
casiotone401 1:981b62bb5c87 599 sendMes.setArgs("i", 1);
casiotone401 1:981b62bb5c87 600 osc.sendOsc(&sendMes);
casiotone401 0:cd43a974c54c 601
casiotone401 0:cd43a974c54c 602 // turn on pulses on channels where a beat is present
casiotone401 0:cd43a974c54c 603 if (BitRead(beat_holder[ch], read_head)) {
casiotone401 0:cd43a974c54c 604
casiotone401 0:cd43a974c54c 605 if (!gatesoff)
casiotone401 0:cd43a974c54c 606 {
casiotone401 0:cd43a974c54c 607 gGATES[ch] = true; // pulse out
casiotone401 0:cd43a974c54c 608 }
casiotone401 1:981b62bb5c87 609
casiotone401 1:981b62bb5c87 610 sendMes.setTopAddress(SetMatrixAddress((MAXCHANNELS * 2), 3 - ch, EUCLID));
casiotone401 0:cd43a974c54c 611 sendMes.setArgs("i", 1);
casiotone401 0:cd43a974c54c 612 osc.sendOsc(&sendMes);
casiotone401 1:981b62bb5c87 613
casiotone401 0:cd43a974c54c 614 lights_active = pulses_active = true;
casiotone401 0:cd43a974c54c 615
casiotone401 0:cd43a974c54c 616 if (!ch || (ch == 2)) {
casiotone401 0:cd43a974c54c 617
casiotone401 1:981b62bb5c87 618 rand_vel = 127 - (rand() % 20); // random velocity ch1, ch3
casiotone401 0:cd43a974c54c 619
casiotone401 0:cd43a974c54c 620 } else {
casiotone401 0:cd43a974c54c 621
casiotone401 1:981b62bb5c87 622 rand_vel = 95 - (rand() % 10); // random velocity ch2, ch4
casiotone401 0:cd43a974c54c 623 }
casiotone401 0:cd43a974c54c 624
casiotone401 1:981b62bb5c87 625 rand_len = 127 - (rand() % 17); // random Amp EG Decay
casiotone401 0:cd43a974c54c 626
casiotone401 0:cd43a974c54c 627 midi.sendControlChange(0x07, rand_vel, (ch + 1)); // volca sample Vol
casiotone401 0:cd43a974c54c 628 midi.sendControlChange(0x30, rand_len, (ch + 1)); // volca sample Amp EG Decay
casiotone401 0:cd43a974c54c 629 midi.sendNoteOn(0, 127, (ch + 1)); // volca sample trriger on
casiotone401 0:cd43a974c54c 630 }
casiotone401 0:cd43a974c54c 631
casiotone401 0:cd43a974c54c 632 // send off pulses to spare output for the first channel
casiotone401 0:cd43a974c54c 633 if (!(BitRead(beat_holder[ch], read_head)) && !ch) { // only relates to first channel
casiotone401 0:cd43a974c54c 634
casiotone401 0:cd43a974c54c 635 if (!gatesoff)
casiotone401 0:cd43a974c54c 636 {
casiotone401 0:cd43a974c54c 637 gCLOCKOUT = true;
casiotone401 0:cd43a974c54c 638 }
casiotone401 0:cd43a974c54c 639
casiotone401 1:981b62bb5c87 640 sendMes.setTopAddress(SetMatrixAddress((MAXCHANNELS * 2), 5, EUCLID));
casiotone401 0:cd43a974c54c 641 sendMes.setArgs("i", 1);
casiotone401 0:cd43a974c54c 642 osc.sendOsc(&sendMes);
casiotone401 0:cd43a974c54c 643
casiotone401 0:cd43a974c54c 644 lights_active = pulses_active = true;
casiotone401 0:cd43a974c54c 645 }
casiotone401 0:cd43a974c54c 646
casiotone401 0:cd43a974c54c 647 // move counter to next position, ready for next pulse
casiotone401 0:cd43a974c54c 648 ++channelbeats[ch][2];
casiotone401 0:cd43a974c54c 649
casiotone401 0:cd43a974c54c 650 if ((channelbeats[ch][2]) >= (channelbeats[ch][0])) {
casiotone401 0:cd43a974c54c 651 channelbeats[ch][2] = 0;
casiotone401 0:cd43a974c54c 652 }
casiotone401 0:cd43a974c54c 653 }
casiotone401 0:cd43a974c54c 654
casiotone401 0:cd43a974c54c 655 ++masterclock;
casiotone401 0:cd43a974c54c 656 masterclock &= (MAXSTEPS - 1);
casiotone401 0:cd43a974c54c 657
casiotone401 0:cd43a974c54c 658 pulse_length = ((euc_time - last_sync) / 5);
casiotone401 0:cd43a974c54c 659 last_sync = euc_time;
casiotone401 0:cd43a974c54c 660 }
casiotone401 0:cd43a974c54c 661
casiotone401 0:cd43a974c54c 662 /* 3 functions to read each encoder
casiotone401 0:cd43a974c54c 663 returns +1, 0 or -1 dependent on direction
casiotone401 0:cd43a974c54c 664 Contains no internal debounce, so calls should be delayed
casiotone401 0:cd43a974c54c 665 */
casiotone401 0:cd43a974c54c 666
casiotone401 0:cd43a974c54c 667 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 668 // Check Euclidean Seq N(length) Value
casiotone401 0:cd43a974c54c 669
casiotone401 0:cd43a974c54c 670 int EncodeReadN(int ch) {
casiotone401 0:cd43a974c54c 671 static float _enc[4];
casiotone401 0:cd43a974c54c 672 int result = 0;
casiotone401 0:cd43a974c54c 673
casiotone401 0:cd43a974c54c 674 switch (ch)
casiotone401 0:cd43a974c54c 675 {
casiotone401 0:cd43a974c54c 676 case 0:
casiotone401 0:cd43a974c54c 677
casiotone401 0:cd43a974c54c 678 if (gEucA[0] == 0) {
casiotone401 0:cd43a974c54c 679 _enc[ch] = result = 0;
casiotone401 0:cd43a974c54c 680
casiotone401 0:cd43a974c54c 681 } else if (gEucA[0] < _enc[ch]) {
casiotone401 0:cd43a974c54c 682 result = -1;
casiotone401 0:cd43a974c54c 683 _enc[ch] = gEucA[0];
casiotone401 0:cd43a974c54c 684
casiotone401 0:cd43a974c54c 685 } else if (gEucA[0] > _enc[ch]) {
casiotone401 0:cd43a974c54c 686 result = 1;
casiotone401 0:cd43a974c54c 687 _enc[ch] = gEucA[0];
casiotone401 0:cd43a974c54c 688 }
casiotone401 0:cd43a974c54c 689
casiotone401 0:cd43a974c54c 690 break;
casiotone401 0:cd43a974c54c 691
casiotone401 0:cd43a974c54c 692 case 1:
casiotone401 0:cd43a974c54c 693
casiotone401 0:cd43a974c54c 694 if (gEucA[3] == 0) {
casiotone401 0:cd43a974c54c 695 _enc[ch] = result = 0;
casiotone401 0:cd43a974c54c 696
casiotone401 0:cd43a974c54c 697 } else if (gEucA[3] < _enc[ch]) {
casiotone401 0:cd43a974c54c 698 result = -1;
casiotone401 0:cd43a974c54c 699 _enc[ch] = gEucA[3];
casiotone401 0:cd43a974c54c 700
casiotone401 0:cd43a974c54c 701 } else if (gEucA[3] > _enc[ch]) {
casiotone401 0:cd43a974c54c 702 result = 1;
casiotone401 0:cd43a974c54c 703 _enc[ch] = gEucA[3];
casiotone401 0:cd43a974c54c 704 }
casiotone401 0:cd43a974c54c 705
casiotone401 0:cd43a974c54c 706 break;
casiotone401 0:cd43a974c54c 707
casiotone401 0:cd43a974c54c 708 case 2:
casiotone401 0:cd43a974c54c 709
casiotone401 0:cd43a974c54c 710 if (gEucB[0] == 0) {
casiotone401 0:cd43a974c54c 711 _enc[ch] = result = 0;
casiotone401 0:cd43a974c54c 712
casiotone401 0:cd43a974c54c 713 } else if (gEucB[0] < _enc[ch]) {
casiotone401 0:cd43a974c54c 714 result = -1;
casiotone401 0:cd43a974c54c 715 _enc[ch] = gEucB[0];
casiotone401 0:cd43a974c54c 716
casiotone401 0:cd43a974c54c 717 } else if (gEucB[0] > _enc[ch]) {
casiotone401 0:cd43a974c54c 718 result = 1;
casiotone401 0:cd43a974c54c 719 _enc[ch] = gEucB[0];
casiotone401 0:cd43a974c54c 720 }
casiotone401 0:cd43a974c54c 721
casiotone401 0:cd43a974c54c 722 break;
casiotone401 0:cd43a974c54c 723
casiotone401 0:cd43a974c54c 724 case 3:
casiotone401 0:cd43a974c54c 725
casiotone401 0:cd43a974c54c 726 if (gEucB[3] == 0) {
casiotone401 0:cd43a974c54c 727 _enc[ch] = result = 0;
casiotone401 0:cd43a974c54c 728
casiotone401 0:cd43a974c54c 729 } else if (gEucB[3] < _enc[ch]) {
casiotone401 0:cd43a974c54c 730 result = -1;
casiotone401 0:cd43a974c54c 731 _enc[ch] = gEucB[3];
casiotone401 0:cd43a974c54c 732
casiotone401 0:cd43a974c54c 733 } else if (gEucB[3] > _enc[ch]) {
casiotone401 0:cd43a974c54c 734 result = 1;
casiotone401 0:cd43a974c54c 735 _enc[ch] = gEucB[3];
casiotone401 0:cd43a974c54c 736 }
casiotone401 0:cd43a974c54c 737
casiotone401 0:cd43a974c54c 738 break;
casiotone401 0:cd43a974c54c 739
casiotone401 0:cd43a974c54c 740 default:
casiotone401 0:cd43a974c54c 741 break;
casiotone401 0:cd43a974c54c 742 }
casiotone401 0:cd43a974c54c 743
casiotone401 0:cd43a974c54c 744 return result;
casiotone401 0:cd43a974c54c 745 }
casiotone401 0:cd43a974c54c 746
casiotone401 0:cd43a974c54c 747 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 748 // Check Euclidean Seq K(Density) Value
casiotone401 0:cd43a974c54c 749
casiotone401 0:cd43a974c54c 750 int EncodeReadK(int ch) {
casiotone401 0:cd43a974c54c 751 static float _enc[4];
casiotone401 0:cd43a974c54c 752 int result = 0;
casiotone401 0:cd43a974c54c 753
casiotone401 0:cd43a974c54c 754 switch (ch)
casiotone401 0:cd43a974c54c 755 {
casiotone401 0:cd43a974c54c 756 case 0:
casiotone401 0:cd43a974c54c 757
casiotone401 0:cd43a974c54c 758 if (gEucA[1] == 0) {
casiotone401 0:cd43a974c54c 759 _enc[ch] = result = 0;
casiotone401 0:cd43a974c54c 760
casiotone401 0:cd43a974c54c 761 } else if (gEucA[1] < _enc[ch]) {
casiotone401 0:cd43a974c54c 762 result = -1;
casiotone401 0:cd43a974c54c 763 _enc[ch] = gEucA[1];
casiotone401 0:cd43a974c54c 764
casiotone401 0:cd43a974c54c 765 } else if (gEucA[1] > _enc[ch]) {
casiotone401 0:cd43a974c54c 766 result = 1;
casiotone401 0:cd43a974c54c 767 _enc[ch] = gEucA[1];
casiotone401 0:cd43a974c54c 768 }
casiotone401 0:cd43a974c54c 769
casiotone401 0:cd43a974c54c 770 break;
casiotone401 0:cd43a974c54c 771
casiotone401 0:cd43a974c54c 772 case 1:
casiotone401 0:cd43a974c54c 773
casiotone401 0:cd43a974c54c 774 if (gEucA[4] == 0) {
casiotone401 0:cd43a974c54c 775 _enc[ch] = result = 0;
casiotone401 0:cd43a974c54c 776
casiotone401 0:cd43a974c54c 777 } else if (gEucA[4] < _enc[ch]) {
casiotone401 0:cd43a974c54c 778 result = -4;
casiotone401 0:cd43a974c54c 779 _enc[ch] = gEucA[4];
casiotone401 0:cd43a974c54c 780
casiotone401 0:cd43a974c54c 781 } else if (gEucA[4] > _enc[ch]) {
casiotone401 0:cd43a974c54c 782 result = 4;
casiotone401 0:cd43a974c54c 783 _enc[ch] = gEucA[4];
casiotone401 0:cd43a974c54c 784 }
casiotone401 0:cd43a974c54c 785
casiotone401 0:cd43a974c54c 786 break;
casiotone401 0:cd43a974c54c 787
casiotone401 0:cd43a974c54c 788 case 2:
casiotone401 0:cd43a974c54c 789
casiotone401 0:cd43a974c54c 790 if (gEucB[1] == 0) {
casiotone401 0:cd43a974c54c 791 _enc[ch] = result = 0;
casiotone401 0:cd43a974c54c 792
casiotone401 0:cd43a974c54c 793 } else if (gEucB[1] < _enc[ch]) {
casiotone401 0:cd43a974c54c 794 result = -1;
casiotone401 0:cd43a974c54c 795 _enc[ch] = gEucB[1];
casiotone401 0:cd43a974c54c 796
casiotone401 0:cd43a974c54c 797 } else if (gEucB[1] > _enc[ch]) {
casiotone401 0:cd43a974c54c 798 result = 1;
casiotone401 0:cd43a974c54c 799 _enc[ch] = gEucB[1];
casiotone401 0:cd43a974c54c 800 }
casiotone401 0:cd43a974c54c 801
casiotone401 0:cd43a974c54c 802 break;
casiotone401 0:cd43a974c54c 803
casiotone401 0:cd43a974c54c 804 case 3:
casiotone401 0:cd43a974c54c 805
casiotone401 0:cd43a974c54c 806 if (gEucB[4] == 0) {
casiotone401 0:cd43a974c54c 807 _enc[ch] = result = 0;
casiotone401 0:cd43a974c54c 808
casiotone401 0:cd43a974c54c 809 } else if (gEucB[4] < _enc[ch]) {
casiotone401 0:cd43a974c54c 810 result = -1;
casiotone401 0:cd43a974c54c 811 _enc[ch] = gEucB[4];
casiotone401 0:cd43a974c54c 812
casiotone401 0:cd43a974c54c 813 } else if (gEucB[4] > _enc[ch]) {
casiotone401 0:cd43a974c54c 814 result = 1;
casiotone401 0:cd43a974c54c 815 _enc[ch] = gEucB[4];
casiotone401 0:cd43a974c54c 816 }
casiotone401 0:cd43a974c54c 817
casiotone401 0:cd43a974c54c 818 break;
casiotone401 0:cd43a974c54c 819
casiotone401 0:cd43a974c54c 820 default:
casiotone401 0:cd43a974c54c 821 break;
casiotone401 0:cd43a974c54c 822 }
casiotone401 0:cd43a974c54c 823
casiotone401 0:cd43a974c54c 824 return result;
casiotone401 0:cd43a974c54c 825 }
casiotone401 0:cd43a974c54c 826
casiotone401 0:cd43a974c54c 827 //-------------------------------------------------------------
casiotone401 0:cd43a974c54c 828 // Check Euclidean Seq O(Offset) Value
casiotone401 0:cd43a974c54c 829
casiotone401 0:cd43a974c54c 830 int EncodeReadO(int ch) {
casiotone401 0:cd43a974c54c 831 static float _enc[4];
casiotone401 0:cd43a974c54c 832 int result = 0;
casiotone401 0:cd43a974c54c 833
casiotone401 0:cd43a974c54c 834 switch (ch)
casiotone401 0:cd43a974c54c 835 {
casiotone401 0:cd43a974c54c 836 case 0:
casiotone401 0:cd43a974c54c 837
casiotone401 0:cd43a974c54c 838 if (gEucA[2] == 0) {
casiotone401 0:cd43a974c54c 839 _enc[ch] = result = 0;
casiotone401 0:cd43a974c54c 840
casiotone401 0:cd43a974c54c 841 } else if (gEucA[2] < _enc[ch]) {
casiotone401 0:cd43a974c54c 842 result = -1;
casiotone401 0:cd43a974c54c 843 _enc[ch] = gEucA[2];
casiotone401 0:cd43a974c54c 844
casiotone401 0:cd43a974c54c 845 } else if (gEucA[2] > _enc[ch]) {
casiotone401 0:cd43a974c54c 846 result = 1;
casiotone401 0:cd43a974c54c 847 _enc[ch] = gEucA[2];
casiotone401 0:cd43a974c54c 848 }
casiotone401 0:cd43a974c54c 849
casiotone401 0:cd43a974c54c 850 break;
casiotone401 0:cd43a974c54c 851
casiotone401 0:cd43a974c54c 852 case 1:
casiotone401 0:cd43a974c54c 853
casiotone401 0:cd43a974c54c 854 if (gEucA[5] == 0) {
casiotone401 0:cd43a974c54c 855 _enc[ch] = result = 0;
casiotone401 0:cd43a974c54c 856
casiotone401 0:cd43a974c54c 857 } else if (gEucA[5] < _enc[ch]) {
casiotone401 0:cd43a974c54c 858 result = -1;
casiotone401 0:cd43a974c54c 859 _enc[ch] = gEucA[5];
casiotone401 0:cd43a974c54c 860
casiotone401 0:cd43a974c54c 861 } else if (gEucA[5] > _enc[ch]) {
casiotone401 0:cd43a974c54c 862 result = 1;
casiotone401 0:cd43a974c54c 863 _enc[ch] = gEucA[5];
casiotone401 0:cd43a974c54c 864 }
casiotone401 0:cd43a974c54c 865
casiotone401 0:cd43a974c54c 866 break;
casiotone401 0:cd43a974c54c 867
casiotone401 0:cd43a974c54c 868 case 2:
casiotone401 0:cd43a974c54c 869
casiotone401 0:cd43a974c54c 870 if (gEucB[2] == 0) {
casiotone401 0:cd43a974c54c 871 _enc[ch] = result = 0;
casiotone401 0:cd43a974c54c 872
casiotone401 0:cd43a974c54c 873 } else if (gEucB[2] < _enc[ch]) {
casiotone401 0:cd43a974c54c 874 result = -1;
casiotone401 0:cd43a974c54c 875 _enc[ch] = gEucB[2];
casiotone401 0:cd43a974c54c 876
casiotone401 0:cd43a974c54c 877 } else if (gEucB[2] > _enc[ch]) {
casiotone401 0:cd43a974c54c 878 result = 1;
casiotone401 0:cd43a974c54c 879 _enc[ch] = gEucB[2];
casiotone401 0:cd43a974c54c 880 }
casiotone401 0:cd43a974c54c 881
casiotone401 0:cd43a974c54c 882 break;
casiotone401 0:cd43a974c54c 883
casiotone401 0:cd43a974c54c 884 case 3:
casiotone401 0:cd43a974c54c 885
casiotone401 0:cd43a974c54c 886 if (gEucB[5] == 0) {
casiotone401 0:cd43a974c54c 887 _enc[ch] = result = 0;
casiotone401 0:cd43a974c54c 888
casiotone401 0:cd43a974c54c 889 } else if (gEucB[5] < _enc[ch]) {
casiotone401 0:cd43a974c54c 890 result = -1;
casiotone401 0:cd43a974c54c 891 _enc[ch] = gEucB[5];
casiotone401 0:cd43a974c54c 892
casiotone401 0:cd43a974c54c 893 } else if (gEucB[5] > _enc[ch]) {
casiotone401 0:cd43a974c54c 894 result = 1;
casiotone401 0:cd43a974c54c 895 _enc[ch] = gEucB[5];
casiotone401 0:cd43a974c54c 896 }
casiotone401 0:cd43a974c54c 897
casiotone401 0:cd43a974c54c 898 break;
casiotone401 0:cd43a974c54c 899
casiotone401 0:cd43a974c54c 900 default:
casiotone401 0:cd43a974c54c 901 break;
casiotone401 0:cd43a974c54c 902 }
casiotone401 0:cd43a974c54c 903
casiotone401 0:cd43a974c54c 904 return result;
casiotone401 0:cd43a974c54c 905 }