OSC-CV Converter

Dependencies:   Bonjour OSCReceiver TextLCD mbed mbed-rpc BurstSPI DebouncedInterrupt FastIO MIDI OSC OSCtoCV ClockControl

OSC to CV Converter

http://gtbts.tumblr.com/post/125663817741/osc-to-cv-converter-ver2-mbed-osctocv

/media/uploads/casiotone401/tumblr_nsg7y4pkfg1qlle9fo1_540.png

Committer:
casiotone401
Date:
Mon Jan 04 12:45:30 2016 +0000
Revision:
19:467f98c51e2d
Parent:
17:55e5136790a6
Child:
20:a44f4a024902
improvement performance

Who changed what in which revision?

UserRevisionLine numberNew contents of line
casiotone401 0:a4d93cd4c30d 1 //-------------------------------------------------------------
casiotone401 17:55e5136790a6 2 // TI DAC8568 OSCtoCV Converter ver.2
casiotone401 17:55e5136790a6 3 // http://gtbts.tumblr.com/post/125663817741/osc-to-cv-converter-ver2-mbed-osctocv
casiotone401 0:a4d93cd4c30d 4 //
casiotone401 0:a4d93cd4c30d 5 // DAC8568 16bit Octal DAC http://www.ti.com/product/dac8568
casiotone401 0:a4d93cd4c30d 6 //
casiotone401 0:a4d93cd4c30d 7 // referred to
casiotone401 0:a4d93cd4c30d 8 // xshige's OSCReceiver
casiotone401 0:a4d93cd4c30d 9 // http://mbed.org/users/xshige/programs/OSCReceiver/
casiotone401 0:a4d93cd4c30d 10 // radiojunkbox's OSC-CV_Example
casiotone401 0:a4d93cd4c30d 11 // http://mbed.org/users/radiojunkbox/code/KAMUI_OSC-CV_Example/
casiotone401 0:a4d93cd4c30d 12 // Robin Price's Homebrew midi-cv box
casiotone401 0:a4d93cd4c30d 13 // http://crx091081gb.net/?p=69
casiotone401 0:a4d93cd4c30d 14 // Masahiro Hattori's TextLCD Module Functions
casiotone401 0:a4d93cd4c30d 15 // http://www.eleclabo.com/denshi/device/lcd1602/gcram.html
casiotone401 0:a4d93cd4c30d 16 // Dirk-Willem van Gulik's BonjourLib
casiotone401 0:a4d93cd4c30d 17 // http://mbed.org/users/dirkx/code/BonjourLib/file/bb6472f455e8/services/mDNS
casiotone401 0:a4d93cd4c30d 18 //
casiotone401 0:a4d93cd4c30d 19 // Released under the MIT License: http://mbed.org/license/mit
casiotone401 0:a4d93cd4c30d 20 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 21
casiotone401 0:a4d93cd4c30d 22 #pragma O3
casiotone401 0:a4d93cd4c30d 23 #pragma Otime
casiotone401 0:a4d93cd4c30d 24
casiotone401 0:a4d93cd4c30d 25 #include "mbed.h"
casiotone401 15:3e4bc47d6a39 26 #include "FastIO.h"
casiotone401 15:3e4bc47d6a39 27 #include "DebouncedInterrupt.h"
casiotone401 15:3e4bc47d6a39 28 #include "BurstSPI.h"
casiotone401 0:a4d93cd4c30d 29 #include "TextLCD.h" //edit "writeCommand" "writeData" protected -> public
casiotone401 0:a4d93cd4c30d 30 #include "EthernetNetIf.h"
casiotone401 0:a4d93cd4c30d 31 #include "HTTPServer.h"
casiotone401 0:a4d93cd4c30d 32 #include "mDNSResponder.h" // mDNS response to announce oneselve
casiotone401 0:a4d93cd4c30d 33 #include "UDPSocket.h"
casiotone401 0:a4d93cd4c30d 34 #include "OSCReceiver.h"
casiotone401 15:3e4bc47d6a39 35 #include "mbedOSC.h"
casiotone401 15:3e4bc47d6a39 36 #include "MIDI.h"
casiotone401 0:a4d93cd4c30d 37 #include <stdlib.h>
casiotone401 0:a4d93cd4c30d 38 #include <ctype.h>
casiotone401 1:fd4f70088311 39 #include <math.h>
casiotone401 0:a4d93cd4c30d 40
casiotone401 0:a4d93cd4c30d 41 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 42 // Define
casiotone401 0:a4d93cd4c30d 43
casiotone401 14:977f3c5a4b4e 44 #define MODE_Calb 0 // Calibration (for VCO Tuning)
casiotone401 15:3e4bc47d6a39 45 #define MODE_OSC 1 // Mode OSCtoCV
casiotone401 15:3e4bc47d6a39 46 #define MODE_SEQ 2 // Mode Shift Sequencer
casiotone401 15:3e4bc47d6a39 47 #define MODE_185 3 // Mode M185 Sequencer
casiotone401 15:3e4bc47d6a39 48 #define MODE_EUC 4 // Mode Euclidean Sequencer
casiotone401 15:3e4bc47d6a39 49
casiotone401 15:3e4bc47d6a39 50 #define MODE_TOTAL 5 // Modes
casiotone401 0:a4d93cd4c30d 51
casiotone401 14:977f3c5a4b4e 52 #define Lin 0 // Linear LinearCV
casiotone401 14:977f3c5a4b4e 53 #define Chr 1 // Chromatic
casiotone401 14:977f3c5a4b4e 54 #define Maj 2 // Major
casiotone401 14:977f3c5a4b4e 55 #define M7 3 // Major7
casiotone401 14:977f3c5a4b4e 56 #define Min7 4 // Minor7
casiotone401 14:977f3c5a4b4e 57 #define Dor 5 // Dorian
casiotone401 14:977f3c5a4b4e 58 #define Min 6 // Minor
casiotone401 14:977f3c5a4b4e 59 #define S5th 7 // 5th
casiotone401 14:977f3c5a4b4e 60 #define Wht 8 // Wholetone
casiotone401 5:e305509d53f3 61
casiotone401 15:3e4bc47d6a39 62 #define SCALE_NUM 9 // Count Scale
casiotone401 15:3e4bc47d6a39 63 #define SCALE_AOUT (65535 / SCALE_NUM - 1)
casiotone401 15:3e4bc47d6a39 64
casiotone401 15:3e4bc47d6a39 65 #define QUAN_RES1 116 // Quantize voltage Steps
casiotone401 15:3e4bc47d6a39 66 #define QUAN_RES2 68
casiotone401 15:3e4bc47d6a39 67 #define QUAN_RES3 46
casiotone401 15:3e4bc47d6a39 68 #define QUAN_RES4 40
casiotone401 15:3e4bc47d6a39 69 #define QUAN_RES5 68
casiotone401 15:3e4bc47d6a39 70 #define QUAN_RES6 68
casiotone401 15:3e4bc47d6a39 71 #define QUAN_RES7 16
casiotone401 15:3e4bc47d6a39 72 #define QUAN_RES8 58
casiotone401 15:3e4bc47d6a39 73
casiotone401 15:3e4bc47d6a39 74 #define SPI_RATE 20000000 // 10Mbps SPI Clock
casiotone401 15:3e4bc47d6a39 75 #define SCALING_N 32256.0f
casiotone401 3:ca15241dd6b4 76 #define INPUT_PORT 12345 // Input Port Number
casiotone401 0:a4d93cd4c30d 77
casiotone401 17:55e5136790a6 78 #define POLLING_INTERVAL 21 // Polling Interval (us)
casiotone401 0:a4d93cd4c30d 79
casiotone401 0:a4d93cd4c30d 80 //-------------------------------------------------------------
casiotone401 5:e305509d53f3 81 // DAC8568 Control Bits (See datasheet)
casiotone401 0:a4d93cd4c30d 82
casiotone401 0:a4d93cd4c30d 83 #define WRITE 0x00
casiotone401 0:a4d93cd4c30d 84 #define UPDATE 0x01
casiotone401 5:e305509d53f3 85 #define WRITE_UPDATE_ALL 0x02 // LDAC Write to Selected Update All
casiotone401 5:e305509d53f3 86 #define WRITE_UPDATE_N 0x03 // LDAC Write to Selected Update Respective
casiotone401 0:a4d93cd4c30d 87 #define POWER 0x04
casiotone401 5:e305509d53f3 88 #define CLR 0x05 // Clear Code Register
casiotone401 0:a4d93cd4c30d 89 #define WRITE_LDAC_REG 0x06
casiotone401 5:e305509d53f3 90 #define RESET 0x07 // Software Reset DAC8568
casiotone401 0:a4d93cd4c30d 91 #define SETUP_INTERNAL_REF 0x08
casiotone401 0:a4d93cd4c30d 92
casiotone401 0:a4d93cd4c30d 93 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 94 // Gate Sequencer Macros
casiotone401 0:a4d93cd4c30d 95
casiotone401 0:a4d93cd4c30d 96 #define _DISABLE 0
casiotone401 0:a4d93cd4c30d 97 #define _ENABLE 1
casiotone401 0:a4d93cd4c30d 98
casiotone401 5:e305509d53f3 99 #define GATE1 0
casiotone401 5:e305509d53f3 100 #define GATE2 1
casiotone401 5:e305509d53f3 101 #define GATE3 2
casiotone401 5:e305509d53f3 102 #define GATE4 3
casiotone401 15:3e4bc47d6a39 103 #define SUBGATE 4
casiotone401 15:3e4bc47d6a39 104 #define GATE_TOTAL 5
casiotone401 15:3e4bc47d6a39 105
casiotone401 15:3e4bc47d6a39 106 #define INVERT 1
casiotone401 15:3e4bc47d6a39 107 #define NON_INVERT 0
casiotone401 15:3e4bc47d6a39 108
casiotone401 15:3e4bc47d6a39 109 #define GATESOUT_ON 0
casiotone401 15:3e4bc47d6a39 110 #define GATESOUT_OFF 1
casiotone401 15:3e4bc47d6a39 111
casiotone401 15:3e4bc47d6a39 112 #define SYNC_ON 0
casiotone401 15:3e4bc47d6a39 113 #define SYNC_OFF 1
casiotone401 5:e305509d53f3 114
casiotone401 5:e305509d53f3 115 //-------------------------------------------------------------
casiotone401 5:e305509d53f3 116 // Beats (Note values)
casiotone401 5:e305509d53f3 117
casiotone401 5:e305509d53f3 118 #define N1ST 1 // whole
casiotone401 5:e305509d53f3 119 #define N2ND 2 // harf
casiotone401 5:e305509d53f3 120 #define N4TH 4 // quarter
casiotone401 5:e305509d53f3 121 #define N8TH 8
casiotone401 15:3e4bc47d6a39 122 #define N16TH 16
casiotone401 15:3e4bc47d6a39 123 #define N32TH 32
casiotone401 15:3e4bc47d6a39 124 #define N64TH 64
casiotone401 5:e305509d53f3 125 #define NDOT2 3 // dotted
casiotone401 5:e305509d53f3 126 #define NDOT4 7
casiotone401 5:e305509d53f3 127 #define NDOT8 9
casiotone401 15:3e4bc47d6a39 128 #define NDOT16 11
casiotone401 15:3e4bc47d6a39 129 #define NDOT32 13
casiotone401 15:3e4bc47d6a39 130 #define TRIP2 3 // triplets
casiotone401 15:3e4bc47d6a39 131 #define TRIP4 6
casiotone401 15:3e4bc47d6a39 132 #define TRIP8 12
casiotone401 15:3e4bc47d6a39 133 #define TRIP16 24
casiotone401 15:3e4bc47d6a39 134 #define TRIP32 48
casiotone401 15:3e4bc47d6a39 135 #define SYNC24 96
casiotone401 5:e305509d53f3 136 #define NRESET 0 // Gate Reset
casiotone401 5:e305509d53f3 137
casiotone401 15:3e4bc47d6a39 138 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 139 // Sequencer Macros
casiotone401 15:3e4bc47d6a39 140
casiotone401 15:3e4bc47d6a39 141 #define STEP_INDICATOR_ADDRESS "/seqstep/" // touchOSC multi toggle(1x16(8)) for Current Step Indicator
casiotone401 15:3e4bc47d6a39 142 #define RESET_COUNTER_ADDRESS "/reset" // touchOSC label for Sequencer reset count
casiotone401 15:3e4bc47d6a39 143
casiotone401 15:3e4bc47d6a39 144 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 145 // M185 Macros
casiotone401 15:3e4bc47d6a39 146
casiotone401 15:3e4bc47d6a39 147 #define PULSE_COUNT_ADDRESS "/pulse" // /pulse1 ~ pulse8 M185 Pulse Count
casiotone401 15:3e4bc47d6a39 148 #define GATE_MODE_ADDRESS "/gatemode" // /gatemode1 ~ gatemode8 M185 Gate Mode
casiotone401 15:3e4bc47d6a39 149
casiotone401 15:3e4bc47d6a39 150 #define SINGLE 0
casiotone401 15:3e4bc47d6a39 151 #define MUTE 1
casiotone401 15:3e4bc47d6a39 152 #define MULTI 2
casiotone401 15:3e4bc47d6a39 153 #define HOLD 3
casiotone401 15:3e4bc47d6a39 154
casiotone401 15:3e4bc47d6a39 155 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 156 // Euclidean Sequencer Macros
casiotone401 15:3e4bc47d6a39 157
casiotone401 15:3e4bc47d6a39 158 #define READ_DELAY 10 // for debouncing
casiotone401 15:3e4bc47d6a39 159 #define MAXCHANNELS 4
casiotone401 15:3e4bc47d6a39 160 #define MAXSTEPS 16 // max step length
casiotone401 15:3e4bc47d6a39 161 #define TRIGGER_DURATION 2200
casiotone401 15:3e4bc47d6a39 162
casiotone401 15:3e4bc47d6a39 163 #define DISPLAY_UPDATE 2000 // how long active channel display is shown
casiotone401 15:3e4bc47d6a39 164 #define MATRIX_ADDRESS "/matrix/" // touchOSC multi toggle(9x16) OSC address
casiotone401 15:3e4bc47d6a39 165
casiotone401 15:3e4bc47d6a39 166
casiotone401 0:a4d93cd4c30d 167 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 168 // Functions
casiotone401 0:a4d93cd4c30d 169
casiotone401 15:3e4bc47d6a39 170 void InitOSCCV(void);
casiotone401 4:b9f5ae574447 171 inline void NetPoll(void);
casiotone401 15:3e4bc47d6a39 172 inline float MapFloat(float, float, float, float, float);
casiotone401 4:b9f5ae574447 173 inline void UpdateCV(int, int, const unsigned int*);
casiotone401 15:3e4bc47d6a39 174 inline void CalibrationCV(void);
casiotone401 15:3e4bc47d6a39 175 inline void SetCV(void);
casiotone401 15:3e4bc47d6a39 176 inline void ShiftCVSeq(int, bool);
casiotone401 15:3e4bc47d6a39 177 inline void M185Seq(int, bool);
casiotone401 15:3e4bc47d6a39 178 inline void SendCtrlState(uint8_t, uint8_t, uint8_t);
casiotone401 15:3e4bc47d6a39 179 inline int GateSeq(int, int, int, int, bool, bool, bool);
casiotone401 15:3e4bc47d6a39 180 inline int CheckBPM(void);
casiotone401 15:3e4bc47d6a39 181 inline void CheckModeSW(void);
casiotone401 15:3e4bc47d6a39 182 inline void LCD();
casiotone401 15:3e4bc47d6a39 183 inline void UpdateCVMeter(int, const unsigned int*);
casiotone401 0:a4d93cd4c30d 184 void WriteCustomChar(unsigned char, unsigned char*);
casiotone401 0:a4d93cd4c30d 185 int SetupEthNetIf(void);
casiotone401 14:977f3c5a4b4e 186 inline size_t strlength(const char *);
casiotone401 4:b9f5ae574447 187 inline void onUDPSocketEvent(UDPSocketEvent);
casiotone401 15:3e4bc47d6a39 188 void EuclideanSeq(int, bool, bool);
casiotone401 15:3e4bc47d6a39 189 unsigned int Euclid(int, int, int);
casiotone401 15:3e4bc47d6a39 190 inline int BitRead(uint16_t, int);
casiotone401 15:3e4bc47d6a39 191 uint16_t BitReadOffset(int, uint16_t, uint16_t);
casiotone401 15:3e4bc47d6a39 192 unsigned int ConcatBin(unsigned int, unsigned int);
casiotone401 15:3e4bc47d6a39 193 void Sync(int, bool);
casiotone401 15:3e4bc47d6a39 194 int EncodeReadN(int);
casiotone401 15:3e4bc47d6a39 195 int EncodeReadK(int);
casiotone401 15:3e4bc47d6a39 196 int EncodeReadO(int);
casiotone401 15:3e4bc47d6a39 197 inline char * SetMatrixAddress(int, int, bool);
casiotone401 0:a4d93cd4c30d 198
casiotone401 0:a4d93cd4c30d 199 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 200 // Silentway Calibration Data Mapping
casiotone401 0:a4d93cd4c30d 201 // http://www.expert-sleepers.co.uk/silentway.html
casiotone401 0:a4d93cd4c30d 202
casiotone401 15:3e4bc47d6a39 203 // Chromatic Scale
casiotone401 0:a4d93cd4c30d 204 const float calibMap1[QUAN_RES1] = {
casiotone401 15:3e4bc47d6a39 205 0.00076928, 0.00900736, 0.01724544, 0.02548352, 0.03372160,
casiotone401 15:3e4bc47d6a39 206 0.04195968, 0.05019776, 0.05843584, 0.06667392, 0.07491200,
casiotone401 15:3e4bc47d6a39 207 0.08315008, 0.09138816, 0.09962624, 0.10786432, 0.11610240,
casiotone401 15:3e4bc47d6a39 208 0.12434047, 0.13258974, 0.14083999, 0.14909023, 0.15734047,
casiotone401 15:3e4bc47d6a39 209 0.16559070, 0.17384095, 0.18209119, 0.19034143, 0.19859168,
casiotone401 15:3e4bc47d6a39 210 0.20684192, 0.21509215, 0.22334240, 0.23159264, 0.23984288,
casiotone401 15:3e4bc47d6a39 211 0.24809311, 0.25634655, 0.26460093, 0.27285531, 0.28110969,
casiotone401 15:3e4bc47d6a39 212 0.28936407, 0.29761845, 0.30587283, 0.31412721, 0.32238159,
casiotone401 15:3e4bc47d6a39 213 0.33063596, 0.33889034, 0.34714472, 0.35539910, 0.36365348,
casiotone401 15:3e4bc47d6a39 214 0.37190786, 0.38017464, 0.38844886, 0.39672306, 0.40499726,
casiotone401 15:3e4bc47d6a39 215 0.41327149, 0.42154568, 0.42981988, 0.43809411, 0.44636831,
casiotone401 15:3e4bc47d6a39 216 0.45464250, 0.46291673, 0.47119093, 0.47946513, 0.48773935,
casiotone401 15:3e4bc47d6a39 217 0.49601355, 0.50430328, 0.51260746, 0.52091163, 0.52921581,
casiotone401 15:3e4bc47d6a39 218 0.53751999, 0.54582411, 0.55412829, 0.56243247, 0.57073665,
casiotone401 15:3e4bc47d6a39 219 0.57904083, 0.58734500, 0.59564912, 0.60395330, 0.61225748,
casiotone401 15:3e4bc47d6a39 220 0.62056166, 0.62890279, 0.63728637, 0.64566994, 0.65405351,
casiotone401 15:3e4bc47d6a39 221 0.66243708, 0.67082065, 0.67920423, 0.68758780, 0.69597137,
casiotone401 15:3e4bc47d6a39 222 0.70435494, 0.71273851, 0.72112209, 0.72950566, 0.73788923,
casiotone401 15:3e4bc47d6a39 223 0.74627280, 0.75476575, 0.76334614, 0.77192658, 0.78050703,
casiotone401 15:3e4bc47d6a39 224 0.78908741, 0.79766786, 0.80624831, 0.81482869, 0.82340914,
casiotone401 15:3e4bc47d6a39 225 0.83198959, 0.84056997, 0.84915042, 0.85773087, 0.86631125,
casiotone401 15:3e4bc47d6a39 226 0.87489170, 0.88425636, 0.89363104, 0.90300572, 0.91238040,
casiotone401 15:3e4bc47d6a39 227 0.92175508, 0.93112975, 0.94050443, 0.94987911, 0.95925385,
casiotone401 15:3e4bc47d6a39 228 0.96862853
casiotone401 14:977f3c5a4b4e 229 };
casiotone401 14:977f3c5a4b4e 230
casiotone401 14:977f3c5a4b4e 231 // Major Scale
casiotone401 14:977f3c5a4b4e 232 const float calibMap2[QUAN_RES2] = {
casiotone401 15:3e4bc47d6a39 233 calibMap1[0], calibMap1[2], calibMap1[4], calibMap1[5], calibMap1[7],
casiotone401 15:3e4bc47d6a39 234 calibMap1[9], calibMap1[11], calibMap1[12], calibMap1[14], calibMap1[16],
casiotone401 15:3e4bc47d6a39 235 calibMap1[17], calibMap1[19], calibMap1[21], calibMap1[23], calibMap1[24],
casiotone401 15:3e4bc47d6a39 236 calibMap1[26], calibMap1[28], calibMap1[29], calibMap1[31], calibMap1[33],
casiotone401 15:3e4bc47d6a39 237 calibMap1[35], calibMap1[36], calibMap1[38], calibMap1[40], calibMap1[41],
casiotone401 15:3e4bc47d6a39 238 calibMap1[43], calibMap1[45], calibMap1[47], calibMap1[48], calibMap1[50],
casiotone401 15:3e4bc47d6a39 239 calibMap1[52], calibMap1[53], calibMap1[55], calibMap1[57], calibMap1[59],
casiotone401 15:3e4bc47d6a39 240 calibMap1[60], calibMap1[62], calibMap1[64], calibMap1[65], calibMap1[67],
casiotone401 15:3e4bc47d6a39 241 calibMap1[69], calibMap1[71], calibMap1[72], calibMap1[74], calibMap1[76],
casiotone401 15:3e4bc47d6a39 242 calibMap1[77], calibMap1[79], calibMap1[81], calibMap1[83], calibMap1[84],
casiotone401 15:3e4bc47d6a39 243 calibMap1[86], calibMap1[88], calibMap1[89], calibMap1[91], calibMap1[93],
casiotone401 15:3e4bc47d6a39 244 calibMap1[95], calibMap1[96], calibMap1[98], calibMap1[100], calibMap1[101],
casiotone401 15:3e4bc47d6a39 245 calibMap1[103], calibMap1[105], calibMap1[107], calibMap1[108], calibMap1[110],
casiotone401 15:3e4bc47d6a39 246 calibMap1[112], calibMap1[113], calibMap1[115]
casiotone401 14:977f3c5a4b4e 247 };
casiotone401 14:977f3c5a4b4e 248
casiotone401 14:977f3c5a4b4e 249 // M7(9)
casiotone401 14:977f3c5a4b4e 250 const float calibMap3[QUAN_RES3] = {
casiotone401 15:3e4bc47d6a39 251 calibMap1[0], calibMap1[4], calibMap1[7], calibMap1[11], calibMap1[12],
casiotone401 15:3e4bc47d6a39 252 calibMap1[14], calibMap1[16], calibMap1[19], calibMap1[23], calibMap1[24],
casiotone401 15:3e4bc47d6a39 253 calibMap1[26], calibMap1[28], calibMap1[31], calibMap1[35], calibMap1[36],
casiotone401 15:3e4bc47d6a39 254 calibMap1[38], calibMap1[40], calibMap1[43], calibMap1[47], calibMap1[48],
casiotone401 15:3e4bc47d6a39 255 calibMap1[50], calibMap1[52], calibMap1[55], calibMap1[59], calibMap1[60],
casiotone401 15:3e4bc47d6a39 256 calibMap1[62], calibMap1[64], calibMap1[67], calibMap1[71], calibMap1[72],
casiotone401 15:3e4bc47d6a39 257 calibMap1[76], calibMap1[79], calibMap1[83], calibMap1[84], calibMap1[86],
casiotone401 15:3e4bc47d6a39 258 calibMap1[88], calibMap1[91], calibMap1[95], calibMap1[96], calibMap1[100],
casiotone401 15:3e4bc47d6a39 259 calibMap1[103], calibMap1[107], calibMap1[108], calibMap1[110], calibMap1[112],
casiotone401 15:3e4bc47d6a39 260 calibMap1[115]
casiotone401 0:a4d93cd4c30d 261 };
casiotone401 0:a4d93cd4c30d 262
casiotone401 14:977f3c5a4b4e 263 // m7(9)
casiotone401 14:977f3c5a4b4e 264 const float calibMap4[QUAN_RES4] = {
casiotone401 15:3e4bc47d6a39 265 calibMap1[0], calibMap1[3], calibMap1[7], calibMap1[10], calibMap1[12],
casiotone401 15:3e4bc47d6a39 266 calibMap1[15], calibMap1[19], calibMap1[22], calibMap1[26], calibMap1[27],
casiotone401 15:3e4bc47d6a39 267 calibMap1[31], calibMap1[34], calibMap1[36], calibMap1[38], calibMap1[39],
casiotone401 15:3e4bc47d6a39 268 calibMap1[43], calibMap1[46], calibMap1[50], calibMap1[53], calibMap1[55],
casiotone401 15:3e4bc47d6a39 269 calibMap1[58], calibMap1[60], calibMap1[63], calibMap1[67], calibMap1[70],
casiotone401 15:3e4bc47d6a39 270 calibMap1[72], calibMap1[74], calibMap1[75], calibMap1[79], calibMap1[82],
casiotone401 15:3e4bc47d6a39 271 calibMap1[86], calibMap1[89], calibMap1[91], calibMap1[94], calibMap1[96],
casiotone401 15:3e4bc47d6a39 272 calibMap1[99], calibMap1[103], calibMap1[106], calibMap1[110], calibMap1[113]
casiotone401 14:977f3c5a4b4e 273 };
casiotone401 14:977f3c5a4b4e 274
casiotone401 14:977f3c5a4b4e 275 // Dorian Scale
casiotone401 14:977f3c5a4b4e 276 const float calibMap5[QUAN_RES5] = {
casiotone401 15:3e4bc47d6a39 277 calibMap1[0], calibMap1[2], calibMap1[3], calibMap1[5], calibMap1[7],
casiotone401 15:3e4bc47d6a39 278 calibMap1[9], calibMap1[10], calibMap1[12], calibMap1[14], calibMap1[15],
casiotone401 15:3e4bc47d6a39 279 calibMap1[17], calibMap1[19], calibMap1[20], calibMap1[21], calibMap1[24],
casiotone401 15:3e4bc47d6a39 280 calibMap1[26], calibMap1[27], calibMap1[29], calibMap1[31], calibMap1[33],
casiotone401 15:3e4bc47d6a39 281 calibMap1[34], calibMap1[36], calibMap1[38], calibMap1[39], calibMap1[41],
casiotone401 15:3e4bc47d6a39 282 calibMap1[43], calibMap1[45], calibMap1[46], calibMap1[48], calibMap1[50],
casiotone401 15:3e4bc47d6a39 283 calibMap1[51], calibMap1[53], calibMap1[55], calibMap1[57], calibMap1[58],
casiotone401 15:3e4bc47d6a39 284 calibMap1[60], calibMap1[62], calibMap1[63], calibMap1[65], calibMap1[67],
casiotone401 15:3e4bc47d6a39 285 calibMap1[69], calibMap1[70], calibMap1[72], calibMap1[74], calibMap1[75],
casiotone401 15:3e4bc47d6a39 286 calibMap1[77], calibMap1[79], calibMap1[81], calibMap1[82], calibMap1[84],
casiotone401 15:3e4bc47d6a39 287 calibMap1[86], calibMap1[87], calibMap1[89], calibMap1[91], calibMap1[93],
casiotone401 15:3e4bc47d6a39 288 calibMap1[94], calibMap1[96], calibMap1[98], calibMap1[99], calibMap1[101],
casiotone401 15:3e4bc47d6a39 289 calibMap1[103], calibMap1[105], calibMap1[106], calibMap1[108], calibMap1[110],
casiotone401 15:3e4bc47d6a39 290 calibMap1[111], calibMap1[113], calibMap1[115]
casiotone401 0:a4d93cd4c30d 291 };
casiotone401 0:a4d93cd4c30d 292
casiotone401 14:977f3c5a4b4e 293 // Minor Scale
casiotone401 14:977f3c5a4b4e 294 const float calibMap6[QUAN_RES6] = {
casiotone401 15:3e4bc47d6a39 295 calibMap1[0], calibMap1[2], calibMap1[3], calibMap1[5], calibMap1[7],
casiotone401 15:3e4bc47d6a39 296 calibMap1[8], calibMap1[10], calibMap1[12], calibMap1[14], calibMap1[15],
casiotone401 15:3e4bc47d6a39 297 calibMap1[17], calibMap1[19], calibMap1[20], calibMap1[22], calibMap1[24],
casiotone401 15:3e4bc47d6a39 298 calibMap1[26], calibMap1[27], calibMap1[29], calibMap1[31], calibMap1[32],
casiotone401 15:3e4bc47d6a39 299 calibMap1[34], calibMap1[36], calibMap1[38], calibMap1[39], calibMap1[41],
casiotone401 15:3e4bc47d6a39 300 calibMap1[43], calibMap1[44], calibMap1[46], calibMap1[48], calibMap1[50],
casiotone401 15:3e4bc47d6a39 301 calibMap1[51], calibMap1[53], calibMap1[55], calibMap1[56], calibMap1[58],
casiotone401 15:3e4bc47d6a39 302 calibMap1[60], calibMap1[62], calibMap1[63], calibMap1[65], calibMap1[67],
casiotone401 15:3e4bc47d6a39 303 calibMap1[68], calibMap1[70], calibMap1[72], calibMap1[74], calibMap1[75],
casiotone401 15:3e4bc47d6a39 304 calibMap1[77], calibMap1[79], calibMap1[80], calibMap1[82], calibMap1[84],
casiotone401 15:3e4bc47d6a39 305 calibMap1[86], calibMap1[87], calibMap1[89], calibMap1[91], calibMap1[92],
casiotone401 15:3e4bc47d6a39 306 calibMap1[94], calibMap1[96], calibMap1[98], calibMap1[99], calibMap1[101],
casiotone401 15:3e4bc47d6a39 307 calibMap1[103], calibMap1[104], calibMap1[106], calibMap1[108], calibMap1[110],
casiotone401 15:3e4bc47d6a39 308 calibMap1[111], calibMap1[113], calibMap1[115]
casiotone401 0:a4d93cd4c30d 309 };
casiotone401 0:a4d93cd4c30d 310
casiotone401 14:977f3c5a4b4e 311 // 5th
casiotone401 14:977f3c5a4b4e 312 const float calibMap7[QUAN_RES7] = {
casiotone401 15:3e4bc47d6a39 313 calibMap1[0], calibMap1[7], calibMap1[14], calibMap1[21], calibMap1[28],
casiotone401 15:3e4bc47d6a39 314 calibMap1[35], calibMap1[42], calibMap1[49], calibMap1[56], calibMap1[63],
casiotone401 15:3e4bc47d6a39 315 calibMap1[70], calibMap1[77], calibMap1[84], calibMap1[91], calibMap1[98],
casiotone401 15:3e4bc47d6a39 316 calibMap1[105]
casiotone401 3:ca15241dd6b4 317 };
casiotone401 3:ca15241dd6b4 318
casiotone401 14:977f3c5a4b4e 319 // Whole tone
casiotone401 14:977f3c5a4b4e 320 const float calibMap8[QUAN_RES8] = {
casiotone401 15:3e4bc47d6a39 321 calibMap1[0], calibMap1[1], calibMap1[2], calibMap1[6], calibMap1[8],
casiotone401 15:3e4bc47d6a39 322 calibMap1[10], calibMap1[12], calibMap1[14], calibMap1[16], calibMap1[18],
casiotone401 15:3e4bc47d6a39 323 calibMap1[20], calibMap1[22], calibMap1[24], calibMap1[26], calibMap1[28],
casiotone401 15:3e4bc47d6a39 324 calibMap1[30], calibMap1[32], calibMap1[34], calibMap1[36], calibMap1[38],
casiotone401 15:3e4bc47d6a39 325 calibMap1[40], calibMap1[42], calibMap1[44], calibMap1[46], calibMap1[48],
casiotone401 15:3e4bc47d6a39 326 calibMap1[50], calibMap1[52], calibMap1[54], calibMap1[56], calibMap1[58],
casiotone401 15:3e4bc47d6a39 327 calibMap1[60], calibMap1[62], calibMap1[64], calibMap1[66], calibMap1[68],
casiotone401 15:3e4bc47d6a39 328 calibMap1[70], calibMap1[72], calibMap1[74], calibMap1[76], calibMap1[78],
casiotone401 15:3e4bc47d6a39 329 calibMap1[80], calibMap1[82], calibMap1[84], calibMap1[86], calibMap1[88],
casiotone401 15:3e4bc47d6a39 330 calibMap1[90], calibMap1[92], calibMap1[94], calibMap1[96], calibMap1[98],
casiotone401 15:3e4bc47d6a39 331 calibMap1[100], calibMap1[102], calibMap1[104], calibMap1[106], calibMap1[108],
casiotone401 15:3e4bc47d6a39 332 calibMap1[110], calibMap1[112], calibMap1[114]
casiotone401 0:a4d93cd4c30d 333 };
casiotone401 0:a4d93cd4c30d 334
casiotone401 0:a4d93cd4c30d 335 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 336 // CV Meter Custom Character
casiotone401 0:a4d93cd4c30d 337
casiotone401 0:a4d93cd4c30d 338 unsigned char str1[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F};
casiotone401 0:a4d93cd4c30d 339 unsigned char str2[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 340 unsigned char str3[8] = {0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 341 unsigned char str4[8] = {0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 342 unsigned char str5[8] = {0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 343 unsigned char str6[8] = {0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 344 unsigned char str7[8] = {0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 345 unsigned char str8[8] = {0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 346
casiotone401 0:a4d93cd4c30d 347 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 348 // Global Variables
casiotone401 0:a4d93cd4c30d 349
casiotone401 7:a04f8378662e 350 float gOSC_cv[8];
casiotone401 15:3e4bc47d6a39 351 float gSeq_cv[16];
casiotone401 9:1ac3d135d965 352 float gGlide;
casiotone401 14:977f3c5a4b4e 353 int gMode;
casiotone401 0:a4d93cd4c30d 354
casiotone401 5:e305509d53f3 355 // Variables for Control
casiotone401 15:3e4bc47d6a39 356 /*
casiotone401 15:3e4bc47d6a39 357 gCtrl[0] /ctrl1 BPM
casiotone401 15:3e4bc47d6a39 358 gCtrl[1] /ctrl2 Quantize mode
casiotone401 15:3e4bc47d6a39 359 gCtrl[3] /ctrl4 Glide
casiotone401 15:3e4bc47d6a39 360 gCtrl[4] /ctrl5 M185 Reset Count
casiotone401 15:3e4bc47d6a39 361
casiotone401 15:3e4bc47d6a39 362 gCtrlSW[0] /ctrlsw1 Sequencer STOP
casiotone401 15:3e4bc47d6a39 363 gCtrlSW[1] /ctrlsw2 Euclidean Sequencer reset
casiotone401 15:3e4bc47d6a39 364 gCtrlSW[2] /ctrlsw3 Sequencer Loop
casiotone401 15:3e4bc47d6a39 365 gCtrlSW[3] /ctrlsw4 Euclid Seq ON
casiotone401 17:55e5136790a6 366 gCtrlSW[4] /ctrlsw5 ASR Analog Mode
casiotone401 15:3e4bc47d6a39 367
casiotone401 15:3e4bc47d6a39 368 float gPulseCount[8] = {0}; M185 Pulse Count
casiotone401 15:3e4bc47d6a39 369 float gGateMode[8] = {0}; M185 Gate Mode
casiotone401 15:3e4bc47d6a39 370 float gSlide[8]; M185 Slide
casiotone401 15:3e4bc47d6a39 371
casiotone401 15:3e4bc47d6a39 372 gEucA[0] /euca1 Euclidean Pattern length (n) ch1
casiotone401 15:3e4bc47d6a39 373 gEucA[1] /euca2 Euclidean Pattern density (k) ch1
casiotone401 15:3e4bc47d6a39 374 gEucA[2] /euca3 Euclidean Pattern offset (o) ch1
casiotone401 15:3e4bc47d6a39 375 gEucA[3] ~ [5] /euca4 ~ /euca6 Euclidean Pattern nko ch2
casiotone401 15:3e4bc47d6a39 376 gEucB[0] ~ [5] /eucb1 ~ /eucb6 Euclidean Pattern nko ch3 ~ ch4
casiotone401 15:3e4bc47d6a39 377 */
casiotone401 15:3e4bc47d6a39 378
casiotone401 15:3e4bc47d6a39 379 float gCtrl[8];
casiotone401 15:3e4bc47d6a39 380 bool gCtrlSW[8] = {false};
casiotone401 15:3e4bc47d6a39 381
casiotone401 15:3e4bc47d6a39 382 // Variables for Sequencer
casiotone401 15:3e4bc47d6a39 383 float gPulseCount[8] = {0};
casiotone401 15:3e4bc47d6a39 384 float gGateMode[16] = {0};
casiotone401 15:3e4bc47d6a39 385 float gSlide[16];
casiotone401 17:55e5136790a6 386 float gAccent[16] = {0};
casiotone401 15:3e4bc47d6a39 387
casiotone401 15:3e4bc47d6a39 388 // Euclidean SEQ Variables
casiotone401 15:3e4bc47d6a39 389 float gEucA[6], gEucB[6];
casiotone401 15:3e4bc47d6a39 390 int channels = MAXCHANNELS;
casiotone401 15:3e4bc47d6a39 391 unsigned int beat_holder[MAXCHANNELS];
casiotone401 15:3e4bc47d6a39 392 unsigned int channelbeats[MAXCHANNELS][5];
casiotone401 15:3e4bc47d6a39 393
casiotone401 15:3e4bc47d6a39 394 bool pulses_active = false; // is active while a beat pulse is playing
casiotone401 15:3e4bc47d6a39 395 bool lights_active = false;
casiotone401 15:3e4bc47d6a39 396 int pulse_length = TRIGGER_DURATION; //pulse length
casiotone401 15:3e4bc47d6a39 397
casiotone401 15:3e4bc47d6a39 398 unsigned int last_read[MAXCHANNELS];
casiotone401 15:3e4bc47d6a39 399 unsigned int last_changed[MAXCHANNELS];
casiotone401 15:3e4bc47d6a39 400 unsigned int last_sync;
casiotone401 15:3e4bc47d6a39 401
casiotone401 15:3e4bc47d6a39 402 unsigned int euc_time;
casiotone401 15:3e4bc47d6a39 403
casiotone401 15:3e4bc47d6a39 404 // Variables for Arduino
casiotone401 15:3e4bc47d6a39 405 uint16_t gArdCV[4];
casiotone401 15:3e4bc47d6a39 406 uint16_t gArdCtrl[4];
casiotone401 15:3e4bc47d6a39 407 bool gArdSW[4] = {false};
casiotone401 5:e305509d53f3 408
casiotone401 0:a4d93cd4c30d 409 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 410 // mbed Functions
casiotone401 0:a4d93cd4c30d 411
casiotone401 15:3e4bc47d6a39 412 TextLCD gLCD(p9, p10, p11, p12, p13, p14); // rs, e, d4-d7
casiotone401 15:3e4bc47d6a39 413
casiotone401 15:3e4bc47d6a39 414 BurstSPI gSPI(p5,p6,p7); // SPI (p6 unconnected)
casiotone401 15:3e4bc47d6a39 415
casiotone401 15:3e4bc47d6a39 416 FastOut<p15> gSYNCMODE; // SYNC DAC8568
casiotone401 15:3e4bc47d6a39 417 FastOut<p16> gLDAC; // LDAC DAC8568
casiotone401 15:3e4bc47d6a39 418
casiotone401 15:3e4bc47d6a39 419 DigitalOut gGATES[4] = {p21, p22, p23, p24}; // GateOut
casiotone401 15:3e4bc47d6a39 420 FastOut<p19> gSUBGATE; // SubGateOut
casiotone401 15:3e4bc47d6a39 421 FastOut<p25> gCLOCKOUT; // ClockOut
casiotone401 15:3e4bc47d6a39 422
casiotone401 15:3e4bc47d6a39 423 AnalogOut gAOUT(p18);
casiotone401 15:3e4bc47d6a39 424
casiotone401 15:3e4bc47d6a39 425 AnalogIn gAIN(p17);
casiotone401 15:3e4bc47d6a39 426 DebouncedInterrupt gSW(p30); // Mode SW
casiotone401 15:3e4bc47d6a39 427
casiotone401 15:3e4bc47d6a39 428 // Serial for Arduino
casiotone401 17:55e5136790a6 429 //BufferedSoftSerial ardSerial(p25, p26);
casiotone401 15:3e4bc47d6a39 430 MIDI midi(p28, p27);
casiotone401 15:3e4bc47d6a39 431
casiotone401 15:3e4bc47d6a39 432 Timer gTimer; // Timer
casiotone401 15:3e4bc47d6a39 433 Ticker gPoller; // Ticker for Polling
casiotone401 0:a4d93cd4c30d 434
casiotone401 0:a4d93cd4c30d 435 // Ethernet
casiotone401 16:1196b8c87bb7 436 EthernetNetIf gEth;
casiotone401 15:3e4bc47d6a39 437 /* static ip
casiotone401 15:3e4bc47d6a39 438 EthernetNetIf gEth(
casiotone401 15:3e4bc47d6a39 439 IpAddr(192,168,1,2),
casiotone401 15:3e4bc47d6a39 440 IpAddr(255,255,255,0),
casiotone401 15:3e4bc47d6a39 441 IpAddr(192,168,1,1),
casiotone401 15:3e4bc47d6a39 442 IpAddr(192,168,1,1)
casiotone401 15:3e4bc47d6a39 443 );
casiotone401 15:3e4bc47d6a39 444 */
casiotone401 17:55e5136790a6 445
casiotone401 0:a4d93cd4c30d 446 UDPSocket gUdp;
casiotone401 0:a4d93cd4c30d 447
casiotone401 15:3e4bc47d6a39 448 // touchOSC Address
casiotone401 15:3e4bc47d6a39 449 uint8_t touchOSCAddress[] = { 192, 168, 1, 7 };
casiotone401 15:3e4bc47d6a39 450 int touchOSCPort = 9000;
casiotone401 15:3e4bc47d6a39 451
casiotone401 15:3e4bc47d6a39 452 OSCClass osc;
casiotone401 15:3e4bc47d6a39 453 OSCMessage sendMes;
casiotone401 15:3e4bc47d6a39 454
casiotone401 0:a4d93cd4c30d 455 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 456 // main
casiotone401 0:a4d93cd4c30d 457
casiotone401 0:a4d93cd4c30d 458 int main()
casiotone401 0:a4d93cd4c30d 459 {
casiotone401 7:a04f8378662e 460 float pot, _pot;
casiotone401 15:3e4bc47d6a39 461 int bpm;
casiotone401 14:977f3c5a4b4e 462
casiotone401 15:3e4bc47d6a39 463 //Clock Up --------------------------------------------------------------------
casiotone401 14:977f3c5a4b4e 464 LPC_SC->PLL0CON = 0x00; /* PLL0 Disable */
casiotone401 14:977f3c5a4b4e 465 LPC_SC->PLL0FEED = 0xAA;
casiotone401 14:977f3c5a4b4e 466 LPC_SC->PLL0FEED = 0x55;
casiotone401 14:977f3c5a4b4e 467
casiotone401 14:977f3c5a4b4e 468 LPC_SC->CCLKCFG = 0x00000003; /* Select Clock Divisor = 4 */
casiotone401 15:3e4bc47d6a39 469 LPC_SC->PLL0CFG = 0x00020038; /* configure PLL0 */
casiotone401 14:977f3c5a4b4e 470 LPC_SC->PLL0FEED = 0xAA; /* divide by 3 then multiply by 50 */
casiotone401 14:977f3c5a4b4e 471 LPC_SC->PLL0FEED = 0x55; /* PLL0 frequency = 400,000,000 */
casiotone401 14:977f3c5a4b4e 472
casiotone401 14:977f3c5a4b4e 473 LPC_SC->PLL0CON = 0x01; /* PLL0 Enable */
casiotone401 14:977f3c5a4b4e 474 LPC_SC->PLL0FEED = 0xAA;
casiotone401 14:977f3c5a4b4e 475 LPC_SC->PLL0FEED = 0x55;
casiotone401 14:977f3c5a4b4e 476 while (!(LPC_SC->PLL0STAT & (1<<26)));/* Wait for PLOCK0 */
casiotone401 14:977f3c5a4b4e 477
casiotone401 14:977f3c5a4b4e 478 LPC_SC->PLL0CON = 0x03; /* PLL0 Enable & Connect */
casiotone401 14:977f3c5a4b4e 479 LPC_SC->PLL0FEED = 0xAA;
casiotone401 14:977f3c5a4b4e 480 LPC_SC->PLL0FEED = 0x55;
casiotone401 14:977f3c5a4b4e 481 while (!(LPC_SC->PLL0STAT & ((1<<25) | (1<<24))));/* Wait for PLLC0_STAT & PLLE0_STAT */
casiotone401 14:977f3c5a4b4e 482
casiotone401 14:977f3c5a4b4e 483 SystemCoreClockUpdate();
casiotone401 14:977f3c5a4b4e 484 //-----------------------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 485
casiotone401 15:3e4bc47d6a39 486 if (SetupEthNetIf() == -1)
casiotone401 0:a4d93cd4c30d 487 {
casiotone401 15:3e4bc47d6a39 488 for (int i = 0; i < 4; ++i)
casiotone401 0:a4d93cd4c30d 489 {
casiotone401 15:3e4bc47d6a39 490 gGATES[i] = true;
casiotone401 0:a4d93cd4c30d 491 wait(0.25);
casiotone401 0:a4d93cd4c30d 492 }
casiotone401 5:e305509d53f3 493
casiotone401 0:a4d93cd4c30d 494 return -1;
casiotone401 0:a4d93cd4c30d 495 }
casiotone401 0:a4d93cd4c30d 496
casiotone401 15:3e4bc47d6a39 497 InitOSCCV();
casiotone401 15:3e4bc47d6a39 498
casiotone401 15:3e4bc47d6a39 499 gCtrl[3] = _pot = pot = gMode = 0;
casiotone401 15:3e4bc47d6a39 500 gGlide = gAIN.read();
casiotone401 15:3e4bc47d6a39 501
casiotone401 15:3e4bc47d6a39 502 LCD();
casiotone401 15:3e4bc47d6a39 503 gLCD.locate( 0, 1 );
casiotone401 15:3e4bc47d6a39 504 gLCD.printf("12345678 G>>%3.2f", gGlide);
casiotone401 15:3e4bc47d6a39 505
casiotone401 15:3e4bc47d6a39 506 // Main loop
casiotone401 15:3e4bc47d6a39 507 while (1)
casiotone401 15:3e4bc47d6a39 508 {
casiotone401 15:3e4bc47d6a39 509 LCD(); // Check Text LCD
casiotone401 15:3e4bc47d6a39 510
casiotone401 15:3e4bc47d6a39 511 pot = gAIN.read(); // Update glide value
casiotone401 15:3e4bc47d6a39 512
casiotone401 15:3e4bc47d6a39 513 if (!pot) // when glide pot value == 0
casiotone401 15:3e4bc47d6a39 514 { // use gCtrl[3] value
casiotone401 15:3e4bc47d6a39 515 if (abs(gCtrl[3] - _pot) > 0.01f)
casiotone401 15:3e4bc47d6a39 516 {
casiotone401 15:3e4bc47d6a39 517 _pot = gGlide = gCtrl[3];
casiotone401 15:3e4bc47d6a39 518
casiotone401 15:3e4bc47d6a39 519 gLCD.locate( 9, 1 );
casiotone401 15:3e4bc47d6a39 520 gLCD.printf("G>>%3.2f", gGlide);
casiotone401 15:3e4bc47d6a39 521 }
casiotone401 15:3e4bc47d6a39 522
casiotone401 15:3e4bc47d6a39 523 } else if (abs(pot - _pot) > 0.01f) {
casiotone401 15:3e4bc47d6a39 524
casiotone401 15:3e4bc47d6a39 525 _pot = gGlide = gAIN.read();
casiotone401 15:3e4bc47d6a39 526
casiotone401 15:3e4bc47d6a39 527 gLCD.locate( 9, 1 );
casiotone401 15:3e4bc47d6a39 528 gLCD.printf("G>>%3.2f", gGlide);
casiotone401 15:3e4bc47d6a39 529 }
casiotone401 15:3e4bc47d6a39 530
casiotone401 17:55e5136790a6 531 bpm = CheckBPM(); // check current BPM
casiotone401 17:55e5136790a6 532
casiotone401 15:3e4bc47d6a39 533 switch (gMode)
casiotone401 15:3e4bc47d6a39 534 {
casiotone401 15:3e4bc47d6a39 535 case MODE_OSC: // OSCtoCV mode
casiotone401 15:3e4bc47d6a39 536
casiotone401 15:3e4bc47d6a39 537 SetCV();
casiotone401 15:3e4bc47d6a39 538 break;
casiotone401 15:3e4bc47d6a39 539
casiotone401 15:3e4bc47d6a39 540 case MODE_SEQ: // Shift Sequencer mode
casiotone401 15:3e4bc47d6a39 541
casiotone401 15:3e4bc47d6a39 542 ShiftCVSeq(GateSeq(bpm, N16TH, GATE1, 3, NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0]);
casiotone401 15:3e4bc47d6a39 543 GateSeq(bpm, N8TH, GATE2, 3, NON_INVERT, GATESOUT_ON, SYNC_OFF);
casiotone401 15:3e4bc47d6a39 544
casiotone401 15:3e4bc47d6a39 545 if (gCtrlSW[3])
casiotone401 15:3e4bc47d6a39 546 {
casiotone401 15:3e4bc47d6a39 547 EuclideanSeq(GateSeq(bpm, N16TH, SUBGATE, 1, NON_INVERT, GATESOUT_OFF, SYNC_OFF), gCtrlSW[0], GATESOUT_OFF);
casiotone401 15:3e4bc47d6a39 548 }
casiotone401 15:3e4bc47d6a39 549 break;
casiotone401 15:3e4bc47d6a39 550
casiotone401 15:3e4bc47d6a39 551 case MODE_185: // M185 Sequencer mode
casiotone401 15:3e4bc47d6a39 552
casiotone401 15:3e4bc47d6a39 553 M185Seq(GateSeq(bpm, N16TH, GATE1, 3, NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0]);
casiotone401 15:3e4bc47d6a39 554 GateSeq(bpm, N8TH, GATE2, 3, NON_INVERT, GATESOUT_ON, SYNC_OFF);
casiotone401 15:3e4bc47d6a39 555
casiotone401 15:3e4bc47d6a39 556 if (gCtrlSW[3])
casiotone401 15:3e4bc47d6a39 557 {
casiotone401 15:3e4bc47d6a39 558 EuclideanSeq(GateSeq(bpm, N16TH, SUBGATE, 1, NON_INVERT, GATESOUT_OFF, SYNC_OFF), gCtrlSW[0], GATESOUT_OFF);
casiotone401 15:3e4bc47d6a39 559 }
casiotone401 15:3e4bc47d6a39 560 break;
casiotone401 15:3e4bc47d6a39 561
casiotone401 15:3e4bc47d6a39 562 case MODE_EUC: // Euclidean Sequencer mode
casiotone401 15:3e4bc47d6a39 563
casiotone401 15:3e4bc47d6a39 564 ShiftCVSeq(GateSeq(bpm, N1ST, SUBGATE, 3, NON_INVERT, GATESOUT_OFF, SYNC_OFF), gCtrlSW[0]);
casiotone401 15:3e4bc47d6a39 565 EuclideanSeq(GateSeq(bpm, N16TH, GATE1, 1, NON_INVERT, GATESOUT_OFF, SYNC_OFF), gCtrlSW[0], GATESOUT_ON);
casiotone401 15:3e4bc47d6a39 566 break;
casiotone401 15:3e4bc47d6a39 567
casiotone401 15:3e4bc47d6a39 568 default: // CV Calibration mode
casiotone401 15:3e4bc47d6a39 569
casiotone401 15:3e4bc47d6a39 570 CalibrationCV();
casiotone401 15:3e4bc47d6a39 571 break;
casiotone401 15:3e4bc47d6a39 572 }
casiotone401 15:3e4bc47d6a39 573
casiotone401 15:3e4bc47d6a39 574 }
casiotone401 15:3e4bc47d6a39 575 }
casiotone401 15:3e4bc47d6a39 576
casiotone401 15:3e4bc47d6a39 577 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 578 // Initialize OSCtoCV
casiotone401 15:3e4bc47d6a39 579
casiotone401 15:3e4bc47d6a39 580 void InitOSCCV()
casiotone401 15:3e4bc47d6a39 581 {
casiotone401 15:3e4bc47d6a39 582 int i;
casiotone401 15:3e4bc47d6a39 583 // Write custom char LCD CGRAM
casiotone401 15:3e4bc47d6a39 584 WriteCustomChar(0x00, str1);
casiotone401 15:3e4bc47d6a39 585 WriteCustomChar(0x01, str2);
casiotone401 15:3e4bc47d6a39 586 WriteCustomChar(0x02, str3);
casiotone401 15:3e4bc47d6a39 587 WriteCustomChar(0x03, str4);
casiotone401 15:3e4bc47d6a39 588 WriteCustomChar(0x04, str5);
casiotone401 15:3e4bc47d6a39 589 WriteCustomChar(0x05, str6);
casiotone401 15:3e4bc47d6a39 590 WriteCustomChar(0x06, str7);
casiotone401 15:3e4bc47d6a39 591 WriteCustomChar(0x07, str8);
casiotone401 15:3e4bc47d6a39 592
casiotone401 15:3e4bc47d6a39 593 // Init SPI
casiotone401 15:3e4bc47d6a39 594 gLDAC = _ENABLE;
casiotone401 15:3e4bc47d6a39 595 gSPI.format(8,1); // Data word length 8bit, Mode=1
casiotone401 15:3e4bc47d6a39 596 gSPI.frequency(SPI_RATE);
casiotone401 15:3e4bc47d6a39 597
casiotone401 15:3e4bc47d6a39 598 UpdateCV(CLR, 0, 0); // Ignore CLR Pin
casiotone401 15:3e4bc47d6a39 599
casiotone401 15:3e4bc47d6a39 600 // Initialize Euclid Sequencer
casiotone401 15:3e4bc47d6a39 601 channelbeats[0][0] = 16;
casiotone401 15:3e4bc47d6a39 602 channelbeats[0][1] = 8;
casiotone401 15:3e4bc47d6a39 603 channelbeats[0][2] = 0;
casiotone401 15:3e4bc47d6a39 604 channelbeats[0][3] = 0;
casiotone401 15:3e4bc47d6a39 605
casiotone401 15:3e4bc47d6a39 606 channelbeats[1][0] = 16;
casiotone401 15:3e4bc47d6a39 607 channelbeats[1][1] = 9;
casiotone401 15:3e4bc47d6a39 608 channelbeats[1][2] = 0;
casiotone401 15:3e4bc47d6a39 609 channelbeats[1][3] = 0;
casiotone401 15:3e4bc47d6a39 610
casiotone401 15:3e4bc47d6a39 611 channelbeats[2][0] = 16;
casiotone401 15:3e4bc47d6a39 612 channelbeats[2][1] = 7;
casiotone401 15:3e4bc47d6a39 613 channelbeats[2][2] = 0;
casiotone401 15:3e4bc47d6a39 614 channelbeats[2][3] = 0;
casiotone401 15:3e4bc47d6a39 615
casiotone401 15:3e4bc47d6a39 616 channelbeats[3][0] = 16;
casiotone401 15:3e4bc47d6a39 617 channelbeats[3][1] = 9;
casiotone401 15:3e4bc47d6a39 618 channelbeats[3][2] = 0;
casiotone401 15:3e4bc47d6a39 619 channelbeats[3][3] = 0;
casiotone401 15:3e4bc47d6a39 620
casiotone401 15:3e4bc47d6a39 621 for (i = 0; i < channels; ++i)
casiotone401 15:3e4bc47d6a39 622 {
casiotone401 15:3e4bc47d6a39 623 beat_holder[i] = Euclid(channelbeats[i][0], channelbeats[i][1], channelbeats[i][3]);
casiotone401 15:3e4bc47d6a39 624 }
casiotone401 15:3e4bc47d6a39 625
casiotone401 15:3e4bc47d6a39 626 // Init BPM
casiotone401 15:3e4bc47d6a39 627 gCtrl[0] = 0.398f;
casiotone401 15:3e4bc47d6a39 628
casiotone401 15:3e4bc47d6a39 629 // Init Sequence Data
casiotone401 15:3e4bc47d6a39 630 for (i = 0; i < 16; ++i)
casiotone401 15:3e4bc47d6a39 631 {
casiotone401 15:3e4bc47d6a39 632 gSeq_cv[i] = calibMap1[69] * SCALING_N;
casiotone401 15:3e4bc47d6a39 633 }
casiotone401 15:3e4bc47d6a39 634
casiotone401 15:3e4bc47d6a39 635 // Init M185 Reset Count
casiotone401 15:3e4bc47d6a39 636 gCtrl[4] = 1;
casiotone401 15:3e4bc47d6a39 637
casiotone401 5:e305509d53f3 638 // mdns (Bonjour)
casiotone401 0:a4d93cd4c30d 639 HTTPServer svr;
casiotone401 0:a4d93cd4c30d 640 mDNSResponder mdns;
casiotone401 4:b9f5ae574447 641
casiotone401 0:a4d93cd4c30d 642 svr.addHandler<SimpleHandler>("/");
casiotone401 0:a4d93cd4c30d 643 svr.bind(INPUT_PORT);
casiotone401 0:a4d93cd4c30d 644 IpAddr ip = gEth.getIp();
casiotone401 0:a4d93cd4c30d 645 mdns.announce(ip, "OSCtoCV", "_osc._udp", INPUT_PORT, "mbed(OSCtoCV)", (char *[]) {"path=/",NULL});
casiotone401 15:3e4bc47d6a39 646
casiotone401 15:3e4bc47d6a39 647 // Set OSC message for sending
casiotone401 15:3e4bc47d6a39 648 sendMes.setIp(touchOSCAddress);
casiotone401 15:3e4bc47d6a39 649 sendMes.setPort(touchOSCPort);
casiotone401 3:ca15241dd6b4 650
casiotone401 15:3e4bc47d6a39 651 gSW.attach(&CheckModeSW,IRQ_RISE, 30); // InterruptIn rising edge(ModeSW)
casiotone401 17:55e5136790a6 652 wait(0.5);
casiotone401 15:3e4bc47d6a39 653
casiotone401 17:55e5136790a6 654 gPoller.attach_us(&NetPoll, POLLING_INTERVAL); // Ticker Polling
casiotone401 17:55e5136790a6 655 wait(1.5);
casiotone401 15:3e4bc47d6a39 656
casiotone401 15:3e4bc47d6a39 657 // Begin Serial for Arduino
casiotone401 15:3e4bc47d6a39 658 //ardSerial.baud(115200);
casiotone401 0:a4d93cd4c30d 659 }
casiotone401 0:a4d93cd4c30d 660
casiotone401 0:a4d93cd4c30d 661 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 662 // Ethernet Polling
casiotone401 0:a4d93cd4c30d 663
casiotone401 4:b9f5ae574447 664 inline void NetPoll()
casiotone401 0:a4d93cd4c30d 665 {
casiotone401 0:a4d93cd4c30d 666 Net::poll();
casiotone401 0:a4d93cd4c30d 667 }
casiotone401 0:a4d93cd4c30d 668
casiotone401 0:a4d93cd4c30d 669 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 670 // Map Function
casiotone401 15:3e4bc47d6a39 671
casiotone401 15:3e4bc47d6a39 672 inline float MapFloat(float x, float in_min, float in_max, float out_min, float out_max)
casiotone401 0:a4d93cd4c30d 673 {
casiotone401 15:3e4bc47d6a39 674 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
casiotone401 0:a4d93cd4c30d 675 }
casiotone401 0:a4d93cd4c30d 676
casiotone401 0:a4d93cd4c30d 677 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 678 // SPI Transfer
casiotone401 0:a4d93cd4c30d 679 // DAC8568 data word length 32bit (8bit shift out)
casiotone401 0:a4d93cd4c30d 680
casiotone401 4:b9f5ae574447 681 inline void UpdateCV(int control, int address, const unsigned int *data)
casiotone401 0:a4d93cd4c30d 682 {
casiotone401 15:3e4bc47d6a39 683
casiotone401 15:3e4bc47d6a39 684 switch (control)
casiotone401 0:a4d93cd4c30d 685 {
casiotone401 0:a4d93cd4c30d 686 case WRITE_UPDATE_N:
casiotone401 4:b9f5ae574447 687
casiotone401 0:a4d93cd4c30d 688 gSYNCMODE = _DISABLE;
casiotone401 4:b9f5ae574447 689 gSPI.write(00000000|control); // padding at beginning of byte and control bits
casiotone401 4:b9f5ae574447 690 gSPI.write(address << 4 | *data >> 12); // address(ch) bits
casiotone401 4:b9f5ae574447 691 gSPI.write((*data << 4) >> 8); // middle 8 bits of data
casiotone401 4:b9f5ae574447 692 gSPI.write((*data << 12) >> 8 | 00001111);
casiotone401 0:a4d93cd4c30d 693 gSYNCMODE = _ENABLE;
casiotone401 0:a4d93cd4c30d 694 gLDAC = _DISABLE;
casiotone401 0:a4d93cd4c30d 695 gLDAC = _ENABLE;
casiotone401 15:3e4bc47d6a39 696
casiotone401 0:a4d93cd4c30d 697 break;
casiotone401 4:b9f5ae574447 698
casiotone401 0:a4d93cd4c30d 699 case RESET:
casiotone401 4:b9f5ae574447 700
casiotone401 0:a4d93cd4c30d 701 gSYNCMODE = _DISABLE;
casiotone401 4:b9f5ae574447 702 gSPI.write(00000111); // Software RESET
casiotone401 0:a4d93cd4c30d 703 gSPI.write(00000000);
casiotone401 0:a4d93cd4c30d 704 gSPI.write(00000000);
casiotone401 0:a4d93cd4c30d 705 gSPI.write(00000000);
casiotone401 0:a4d93cd4c30d 706 gSYNCMODE = _ENABLE;
casiotone401 15:3e4bc47d6a39 707
casiotone401 0:a4d93cd4c30d 708 break;
casiotone401 4:b9f5ae574447 709
casiotone401 0:a4d93cd4c30d 710 case CLR:
casiotone401 4:b9f5ae574447 711
casiotone401 0:a4d93cd4c30d 712 gSYNCMODE = _DISABLE;
casiotone401 4:b9f5ae574447 713 gSPI.write(00000101); // CLR Register
casiotone401 0:a4d93cd4c30d 714 gSPI.write(00000000);
casiotone401 0:a4d93cd4c30d 715 gSPI.write(00000000);
casiotone401 4:b9f5ae574447 716 gSPI.write(00000011); // Ignore CLR Pin
casiotone401 0:a4d93cd4c30d 717 gSYNCMODE = _ENABLE;
casiotone401 15:3e4bc47d6a39 718
casiotone401 0:a4d93cd4c30d 719 break;
casiotone401 0:a4d93cd4c30d 720 }
casiotone401 0:a4d93cd4c30d 721 }
casiotone401 0:a4d93cd4c30d 722
casiotone401 0:a4d93cd4c30d 723 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 724 // Calibration Mode
casiotone401 15:3e4bc47d6a39 725
casiotone401 15:3e4bc47d6a39 726 inline void CalibrationCV()
casiotone401 14:977f3c5a4b4e 727 {
casiotone401 14:977f3c5a4b4e 728 static int ch;
casiotone401 14:977f3c5a4b4e 729 unsigned int cv;
casiotone401 14:977f3c5a4b4e 730
casiotone401 15:3e4bc47d6a39 731 switch (gMode)
casiotone401 14:977f3c5a4b4e 732 {
casiotone401 14:977f3c5a4b4e 733 case MODE_Calb:
casiotone401 14:977f3c5a4b4e 734
casiotone401 15:3e4bc47d6a39 735 cv = (unsigned int)(calibMap1[69] * SCALING_N); // A880.0Hz
casiotone401 14:977f3c5a4b4e 736
casiotone401 15:3e4bc47d6a39 737 gSUBGATE = gGATES[0] = gGATES[1] = gGATES[2] = gGATES[3] = true;
casiotone401 14:977f3c5a4b4e 738
casiotone401 14:977f3c5a4b4e 739 UpdateCV(WRITE_UPDATE_N, ch, &cv);
casiotone401 15:3e4bc47d6a39 740
casiotone401 14:977f3c5a4b4e 741 break;
casiotone401 14:977f3c5a4b4e 742 }
casiotone401 14:977f3c5a4b4e 743
casiotone401 15:3e4bc47d6a39 744 UpdateCVMeter(ch, &cv);
casiotone401 14:977f3c5a4b4e 745
casiotone401 15:3e4bc47d6a39 746 ++ch;
casiotone401 14:977f3c5a4b4e 747 ch &= 0x07;
casiotone401 14:977f3c5a4b4e 748 }
casiotone401 14:977f3c5a4b4e 749
casiotone401 14:977f3c5a4b4e 750 //-------------------------------------------------------------
casiotone401 14:977f3c5a4b4e 751 // Calculate CV
casiotone401 14:977f3c5a4b4e 752
casiotone401 15:3e4bc47d6a39 753 inline void SetCV()
casiotone401 14:977f3c5a4b4e 754 {
casiotone401 15:3e4bc47d6a39 755 static int ch, qmode, amode, mcount;
casiotone401 14:977f3c5a4b4e 756 static float glidecv[8];
casiotone401 14:977f3c5a4b4e 757 unsigned int cv;
casiotone401 14:977f3c5a4b4e 758 static float qcv;
casiotone401 14:977f3c5a4b4e 759
casiotone401 15:3e4bc47d6a39 760 qmode = (gCtrl[1] * (SCALE_NUM - 1));
casiotone401 15:3e4bc47d6a39 761 amode = SCALE_AOUT * qmode;
casiotone401 15:3e4bc47d6a39 762
casiotone401 15:3e4bc47d6a39 763 gAOUT.write_u16(amode);
casiotone401 15:3e4bc47d6a39 764
casiotone401 15:3e4bc47d6a39 765 switch (qmode)
casiotone401 14:977f3c5a4b4e 766 {
casiotone401 14:977f3c5a4b4e 767 case Lin:
casiotone401 14:977f3c5a4b4e 768
casiotone401 14:977f3c5a4b4e 769 glidecv[ch] = glidecv[ch] * gGlide + gOSC_cv[ch] * (1.0f - gGlide);
casiotone401 14:977f3c5a4b4e 770 break;
casiotone401 14:977f3c5a4b4e 771
casiotone401 14:977f3c5a4b4e 772 case Chr:
casiotone401 15:3e4bc47d6a39 773
casiotone401 15:3e4bc47d6a39 774 qcv = calibMap1[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES1 - 1))];
casiotone401 14:977f3c5a4b4e 775
casiotone401 14:977f3c5a4b4e 776 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 15:3e4bc47d6a39 777
casiotone401 14:977f3c5a4b4e 778 break;
casiotone401 14:977f3c5a4b4e 779
casiotone401 15:3e4bc47d6a39 780 case Maj:
casiotone401 15:3e4bc47d6a39 781
casiotone401 15:3e4bc47d6a39 782 qcv = calibMap2[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES2 - 1))];
casiotone401 15:3e4bc47d6a39 783
casiotone401 14:977f3c5a4b4e 784 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 15:3e4bc47d6a39 785
casiotone401 14:977f3c5a4b4e 786 break;
casiotone401 15:3e4bc47d6a39 787
casiotone401 15:3e4bc47d6a39 788 case M7:
casiotone401 14:977f3c5a4b4e 789
casiotone401 15:3e4bc47d6a39 790 qcv = calibMap3[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES3 - 1))];
casiotone401 14:977f3c5a4b4e 791
casiotone401 14:977f3c5a4b4e 792 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 15:3e4bc47d6a39 793
casiotone401 15:3e4bc47d6a39 794 break;
casiotone401 15:3e4bc47d6a39 795
casiotone401 15:3e4bc47d6a39 796 case Min7:
casiotone401 15:3e4bc47d6a39 797
casiotone401 15:3e4bc47d6a39 798 qcv = calibMap4[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES4 - 1))];
casiotone401 15:3e4bc47d6a39 799
casiotone401 15:3e4bc47d6a39 800 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 15:3e4bc47d6a39 801
casiotone401 15:3e4bc47d6a39 802 break;
casiotone401 15:3e4bc47d6a39 803
casiotone401 15:3e4bc47d6a39 804 case Dor:
casiotone401 15:3e4bc47d6a39 805
casiotone401 15:3e4bc47d6a39 806 qcv = calibMap5[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES5 - 1))];
casiotone401 15:3e4bc47d6a39 807
casiotone401 15:3e4bc47d6a39 808 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 15:3e4bc47d6a39 809
casiotone401 15:3e4bc47d6a39 810 break;
casiotone401 15:3e4bc47d6a39 811
casiotone401 15:3e4bc47d6a39 812 case Min:
casiotone401 15:3e4bc47d6a39 813
casiotone401 15:3e4bc47d6a39 814 qcv = calibMap6[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES6 - 1))];
casiotone401 15:3e4bc47d6a39 815
casiotone401 15:3e4bc47d6a39 816 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 15:3e4bc47d6a39 817
casiotone401 15:3e4bc47d6a39 818 break;
casiotone401 15:3e4bc47d6a39 819
casiotone401 15:3e4bc47d6a39 820 case S5th:
casiotone401 15:3e4bc47d6a39 821
casiotone401 15:3e4bc47d6a39 822 qcv = calibMap7[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES7 - 1))];
casiotone401 15:3e4bc47d6a39 823
casiotone401 15:3e4bc47d6a39 824 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 15:3e4bc47d6a39 825
casiotone401 15:3e4bc47d6a39 826 break;
casiotone401 15:3e4bc47d6a39 827
casiotone401 15:3e4bc47d6a39 828 case Wht:
casiotone401 15:3e4bc47d6a39 829
casiotone401 15:3e4bc47d6a39 830 qcv = calibMap8[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES8 - 1))];
casiotone401 15:3e4bc47d6a39 831
casiotone401 15:3e4bc47d6a39 832 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 17:55e5136790a6 833
casiotone401 14:977f3c5a4b4e 834 break;
casiotone401 14:977f3c5a4b4e 835 }
casiotone401 17:55e5136790a6 836
casiotone401 17:55e5136790a6 837 cv = (unsigned int)glidecv[ch];
casiotone401 17:55e5136790a6 838
casiotone401 17:55e5136790a6 839 UpdateCV(WRITE_UPDATE_N, ch, &cv);
casiotone401 14:977f3c5a4b4e 840
casiotone401 17:55e5136790a6 841 if (mcount == 0x1F)
casiotone401 17:55e5136790a6 842 {
casiotone401 17:55e5136790a6 843 UpdateCVMeter(ch, &cv);
casiotone401 17:55e5136790a6 844 }
casiotone401 17:55e5136790a6 845
casiotone401 17:55e5136790a6 846 ++ch;
casiotone401 17:55e5136790a6 847
casiotone401 17:55e5136790a6 848 if (ch &= 0x07)
casiotone401 17:55e5136790a6 849 {
casiotone401 17:55e5136790a6 850 ++mcount;
casiotone401 17:55e5136790a6 851 mcount &= 0x3F;
casiotone401 17:55e5136790a6 852 }
casiotone401 14:977f3c5a4b4e 853 }
casiotone401 14:977f3c5a4b4e 854
casiotone401 14:977f3c5a4b4e 855 //-------------------------------------------------------------
casiotone401 14:977f3c5a4b4e 856 // Sequence & Shift Out CV
casiotone401 14:977f3c5a4b4e 857
casiotone401 15:3e4bc47d6a39 858 inline void ShiftCVSeq(int trigger, bool reset)
casiotone401 14:977f3c5a4b4e 859 {
casiotone401 14:977f3c5a4b4e 860 int i, j;
casiotone401 15:3e4bc47d6a39 861 static bool triggerState = false;
casiotone401 15:3e4bc47d6a39 862 static bool stepFoward = false;
casiotone401 15:3e4bc47d6a39 863 static bool _reset = false;
casiotone401 15:3e4bc47d6a39 864 static uint8_t currentStep;
casiotone401 15:3e4bc47d6a39 865 static int _resetCount, resetCount;
casiotone401 15:3e4bc47d6a39 866 static uint8_t gateMode;
casiotone401 15:3e4bc47d6a39 867 static uint8_t _gateMode[16];
casiotone401 15:3e4bc47d6a39 868 static uint8_t ch, qmode, amode;
casiotone401 14:977f3c5a4b4e 869 static float glidecv[8], shiftcv[8];
casiotone401 14:977f3c5a4b4e 870 unsigned int cv;
casiotone401 14:977f3c5a4b4e 871 static float qcv;
casiotone401 17:55e5136790a6 872 static int jitterCount;
casiotone401 17:55e5136790a6 873 static int jitter;
casiotone401 14:977f3c5a4b4e 874
casiotone401 15:3e4bc47d6a39 875 qmode = (gCtrl[1] * (SCALE_NUM - 1.0f)); // Sequencer Quantize Mode (gCtrl[1])
casiotone401 15:3e4bc47d6a39 876 amode = SCALE_AOUT * qmode;
casiotone401 14:977f3c5a4b4e 877
casiotone401 15:3e4bc47d6a39 878 gAOUT.write_u16(amode);
casiotone401 15:3e4bc47d6a39 879
casiotone401 15:3e4bc47d6a39 880 switch (qmode)
casiotone401 14:977f3c5a4b4e 881 {
casiotone401 14:977f3c5a4b4e 882 case Lin:
casiotone401 15:3e4bc47d6a39 883
casiotone401 15:3e4bc47d6a39 884 glidecv[0] = glidecv[0] * gSlide[currentStep] + gSeq_cv[currentStep] * (1.0f - gSlide[currentStep]);
casiotone401 17:55e5136790a6 885
casiotone401 15:3e4bc47d6a39 886 break;
casiotone401 15:3e4bc47d6a39 887
casiotone401 15:3e4bc47d6a39 888 case Chr:
casiotone401 15:3e4bc47d6a39 889
casiotone401 15:3e4bc47d6a39 890 qcv = calibMap1[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES1 - 1))];
casiotone401 15:3e4bc47d6a39 891
casiotone401 15:3e4bc47d6a39 892 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
casiotone401 17:55e5136790a6 893
casiotone401 15:3e4bc47d6a39 894 break;
casiotone401 15:3e4bc47d6a39 895
casiotone401 15:3e4bc47d6a39 896 case Maj:
casiotone401 15:3e4bc47d6a39 897
casiotone401 15:3e4bc47d6a39 898 qcv = calibMap2[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES2 - 1))];
casiotone401 15:3e4bc47d6a39 899
casiotone401 15:3e4bc47d6a39 900 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
casiotone401 15:3e4bc47d6a39 901
casiotone401 14:977f3c5a4b4e 902 break;
casiotone401 15:3e4bc47d6a39 903
casiotone401 15:3e4bc47d6a39 904 case M7:
casiotone401 15:3e4bc47d6a39 905
casiotone401 15:3e4bc47d6a39 906 qcv = calibMap3[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES3 - 1))];
casiotone401 15:3e4bc47d6a39 907
casiotone401 15:3e4bc47d6a39 908 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
casiotone401 15:3e4bc47d6a39 909
casiotone401 15:3e4bc47d6a39 910 break;
casiotone401 15:3e4bc47d6a39 911
casiotone401 15:3e4bc47d6a39 912 case Min7:
casiotone401 15:3e4bc47d6a39 913
casiotone401 15:3e4bc47d6a39 914 qcv = calibMap4[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES4 - 1))];
casiotone401 14:977f3c5a4b4e 915
casiotone401 15:3e4bc47d6a39 916 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
casiotone401 15:3e4bc47d6a39 917
casiotone401 14:977f3c5a4b4e 918 break;
casiotone401 14:977f3c5a4b4e 919
casiotone401 15:3e4bc47d6a39 920 case Dor:
casiotone401 15:3e4bc47d6a39 921
casiotone401 15:3e4bc47d6a39 922 qcv = calibMap5[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES5 - 1))];
casiotone401 15:3e4bc47d6a39 923
casiotone401 15:3e4bc47d6a39 924 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
casiotone401 15:3e4bc47d6a39 925
casiotone401 14:977f3c5a4b4e 926 break;
casiotone401 15:3e4bc47d6a39 927
casiotone401 15:3e4bc47d6a39 928 case Min:
casiotone401 15:3e4bc47d6a39 929
casiotone401 15:3e4bc47d6a39 930 qcv = calibMap6[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES6 - 1))];
casiotone401 15:3e4bc47d6a39 931
casiotone401 15:3e4bc47d6a39 932 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
casiotone401 17:55e5136790a6 933
casiotone401 14:977f3c5a4b4e 934 break;
casiotone401 15:3e4bc47d6a39 935
casiotone401 14:977f3c5a4b4e 936 case S5th:
casiotone401 15:3e4bc47d6a39 937
casiotone401 15:3e4bc47d6a39 938 qcv = calibMap7[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES7 - 1))];
casiotone401 15:3e4bc47d6a39 939
casiotone401 15:3e4bc47d6a39 940 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
casiotone401 17:55e5136790a6 941
casiotone401 14:977f3c5a4b4e 942 break;
casiotone401 15:3e4bc47d6a39 943
casiotone401 14:977f3c5a4b4e 944 case Wht:
casiotone401 15:3e4bc47d6a39 945
casiotone401 15:3e4bc47d6a39 946 qcv = calibMap8[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES8 - 1))];
casiotone401 15:3e4bc47d6a39 947
casiotone401 15:3e4bc47d6a39 948 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
casiotone401 15:3e4bc47d6a39 949
casiotone401 14:977f3c5a4b4e 950 break;
casiotone401 14:977f3c5a4b4e 951 }
casiotone401 15:3e4bc47d6a39 952
casiotone401 17:55e5136790a6 953 if (!gCtrlSW[4])
casiotone401 17:55e5136790a6 954 {
casiotone401 17:55e5136790a6 955 jitter = 0;
casiotone401 17:55e5136790a6 956
casiotone401 17:55e5136790a6 957 } else if (gCtrlSW[4] && jitterCount % 64 == 0) { // ASR Analog Mode
casiotone401 17:55e5136790a6 958
casiotone401 17:55e5136790a6 959 jitter = (rand() % 100 - 50);
casiotone401 17:55e5136790a6 960 }
casiotone401 17:55e5136790a6 961
casiotone401 17:55e5136790a6 962 cv = (unsigned int)(glidecv[0] + jitter);
casiotone401 17:55e5136790a6 963
casiotone401 17:55e5136790a6 964 UpdateCV(WRITE_UPDATE_N, 0, &cv);
casiotone401 17:55e5136790a6 965
casiotone401 15:3e4bc47d6a39 966 for (i = 1; i < 8; ++i)
casiotone401 15:3e4bc47d6a39 967 {
casiotone401 15:3e4bc47d6a39 968 glidecv[i] = glidecv[i] * gSlide[currentStep] + shiftcv[i] * (1.0f - gSlide[currentStep]);
casiotone401 17:55e5136790a6 969 cv = (unsigned int)(glidecv[i] + jitter);
casiotone401 15:3e4bc47d6a39 970
casiotone401 15:3e4bc47d6a39 971 UpdateCV(WRITE_UPDATE_N, i, &cv);
casiotone401 15:3e4bc47d6a39 972 }
casiotone401 15:3e4bc47d6a39 973
casiotone401 15:3e4bc47d6a39 974 if (trigger && !triggerState) // trigger ON
casiotone401 15:3e4bc47d6a39 975 {
casiotone401 15:3e4bc47d6a39 976 stepFoward = triggerState = true;
casiotone401 15:3e4bc47d6a39 977
casiotone401 15:3e4bc47d6a39 978 } else if (!trigger) { // trigger OFF
casiotone401 15:3e4bc47d6a39 979
casiotone401 15:3e4bc47d6a39 980 if (gateMode != HOLD)
casiotone401 14:977f3c5a4b4e 981 {
casiotone401 15:3e4bc47d6a39 982 gGATES[0] = false;
casiotone401 14:977f3c5a4b4e 983 }
casiotone401 14:977f3c5a4b4e 984
casiotone401 15:3e4bc47d6a39 985 triggerState = false;
casiotone401 15:3e4bc47d6a39 986 }
casiotone401 15:3e4bc47d6a39 987
casiotone401 15:3e4bc47d6a39 988 // check & update touchOSC ctrl parameter
casiotone401 15:3e4bc47d6a39 989 if (_gateMode[ch] != (gGateMode[ch] * 3))
casiotone401 15:3e4bc47d6a39 990 {
casiotone401 15:3e4bc47d6a39 991 _gateMode[ch] = (gGateMode[ch] * 3);
casiotone401 15:3e4bc47d6a39 992
casiotone401 15:3e4bc47d6a39 993 if (_gateMode[ch] == MULTI)
casiotone401 14:977f3c5a4b4e 994 {
casiotone401 15:3e4bc47d6a39 995 _gateMode[ch] = HOLD;
casiotone401 15:3e4bc47d6a39 996 }
casiotone401 15:3e4bc47d6a39 997
casiotone401 15:3e4bc47d6a39 998 SendCtrlState(ch, _gateMode[ch], 8);
casiotone401 15:3e4bc47d6a39 999 }
casiotone401 15:3e4bc47d6a39 1000
casiotone401 15:3e4bc47d6a39 1001 if (reset && !_reset) // Stop & Reset
casiotone401 15:3e4bc47d6a39 1002 {
casiotone401 15:3e4bc47d6a39 1003 sendMes.setTopAddress(SetMatrixAddress(0, currentStep, false));
casiotone401 15:3e4bc47d6a39 1004 sendMes.setArgs("i", 0);
casiotone401 15:3e4bc47d6a39 1005 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 1006
casiotone401 15:3e4bc47d6a39 1007 currentStep = 0;
casiotone401 15:3e4bc47d6a39 1008
casiotone401 15:3e4bc47d6a39 1009 sendMes.setTopAddress(SetMatrixAddress(0, currentStep, false));
casiotone401 15:3e4bc47d6a39 1010 sendMes.setArgs("i", 1);
casiotone401 15:3e4bc47d6a39 1011 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 1012
casiotone401 15:3e4bc47d6a39 1013 _reset = true;
casiotone401 15:3e4bc47d6a39 1014
casiotone401 15:3e4bc47d6a39 1015 } else if (!reset) {
casiotone401 15:3e4bc47d6a39 1016
casiotone401 15:3e4bc47d6a39 1017 _reset = false;
casiotone401 15:3e4bc47d6a39 1018 }
casiotone401 15:3e4bc47d6a39 1019
casiotone401 15:3e4bc47d6a39 1020 if (stepFoward)
casiotone401 15:3e4bc47d6a39 1021 {
casiotone401 15:3e4bc47d6a39 1022 if (gateMode != HOLD) // shift CV
casiotone401 15:3e4bc47d6a39 1023 {
casiotone401 15:3e4bc47d6a39 1024 for (j = 1; j < 8; ++j)
casiotone401 14:977f3c5a4b4e 1025 {
casiotone401 14:977f3c5a4b4e 1026 shiftcv[j] = glidecv[j-1];
casiotone401 14:977f3c5a4b4e 1027 }
casiotone401 15:3e4bc47d6a39 1028 }
casiotone401 15:3e4bc47d6a39 1029
casiotone401 15:3e4bc47d6a39 1030 sendMes.setTopAddress(SetMatrixAddress(0, currentStep, false));
casiotone401 15:3e4bc47d6a39 1031 sendMes.setArgs("i", 0);
casiotone401 15:3e4bc47d6a39 1032 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 1033
casiotone401 15:3e4bc47d6a39 1034 ++currentStep;
casiotone401 15:3e4bc47d6a39 1035
casiotone401 15:3e4bc47d6a39 1036 if (gCtrlSW[2])
casiotone401 15:3e4bc47d6a39 1037 {
casiotone401 15:3e4bc47d6a39 1038 resetCount = 3;
casiotone401 15:3e4bc47d6a39 1039
casiotone401 15:3e4bc47d6a39 1040 } else {
casiotone401 15:3e4bc47d6a39 1041
casiotone401 15:3e4bc47d6a39 1042 resetCount = gCtrl[4] * 15;
casiotone401 15:3e4bc47d6a39 1043 }
casiotone401 14:977f3c5a4b4e 1044
casiotone401 15:3e4bc47d6a39 1045 if (_resetCount != resetCount)
casiotone401 15:3e4bc47d6a39 1046 {
casiotone401 15:3e4bc47d6a39 1047 sendMes.setTopAddress(RESET_COUNTER_ADDRESS);
casiotone401 15:3e4bc47d6a39 1048 sendMes.setArgs("i", (resetCount + 1));
casiotone401 15:3e4bc47d6a39 1049 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 1050 }
casiotone401 15:3e4bc47d6a39 1051
casiotone401 15:3e4bc47d6a39 1052 if (currentStep > resetCount) // reset
casiotone401 15:3e4bc47d6a39 1053 {
casiotone401 15:3e4bc47d6a39 1054 currentStep = 0;
casiotone401 14:977f3c5a4b4e 1055 }
casiotone401 14:977f3c5a4b4e 1056
casiotone401 15:3e4bc47d6a39 1057 sendMes.setTopAddress(SetMatrixAddress(0, currentStep, false));
casiotone401 15:3e4bc47d6a39 1058 sendMes.setArgs("i", 1);
casiotone401 15:3e4bc47d6a39 1059 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 1060
casiotone401 15:3e4bc47d6a39 1061 if (currentStep < 8)
casiotone401 14:977f3c5a4b4e 1062 {
casiotone401 15:3e4bc47d6a39 1063 UpdateCVMeter(currentStep, &cv);
casiotone401 15:3e4bc47d6a39 1064
casiotone401 14:977f3c5a4b4e 1065 } else {
casiotone401 15:3e4bc47d6a39 1066
casiotone401 15:3e4bc47d6a39 1067 UpdateCVMeter((currentStep - 8), &cv);
casiotone401 15:3e4bc47d6a39 1068 }
casiotone401 15:3e4bc47d6a39 1069
casiotone401 15:3e4bc47d6a39 1070 gateMode = (gGateMode[currentStep] * 3);
casiotone401 15:3e4bc47d6a39 1071
casiotone401 15:3e4bc47d6a39 1072 if (gateMode == MULTI) // omit MULTI mode
casiotone401 15:3e4bc47d6a39 1073 {
casiotone401 15:3e4bc47d6a39 1074 gateMode = HOLD;
casiotone401 14:977f3c5a4b4e 1075 }
casiotone401 15:3e4bc47d6a39 1076
casiotone401 15:3e4bc47d6a39 1077 if (gateMode != MUTE)
casiotone401 15:3e4bc47d6a39 1078 {
casiotone401 15:3e4bc47d6a39 1079 gGATES[0] = true;
casiotone401 15:3e4bc47d6a39 1080 }
casiotone401 15:3e4bc47d6a39 1081
casiotone401 17:55e5136790a6 1082 if (gAccent[currentStep]) // accent
casiotone401 17:55e5136790a6 1083 {
casiotone401 17:55e5136790a6 1084 gGATES[2] = gGATES[3] = true;
casiotone401 17:55e5136790a6 1085
casiotone401 17:55e5136790a6 1086 } else {
casiotone401 17:55e5136790a6 1087
casiotone401 17:55e5136790a6 1088 gGATES[2] = gGATES[3] = false;
casiotone401 17:55e5136790a6 1089 }
casiotone401 17:55e5136790a6 1090
casiotone401 15:3e4bc47d6a39 1091 stepFoward = false;
casiotone401 15:3e4bc47d6a39 1092 }
casiotone401 15:3e4bc47d6a39 1093
casiotone401 15:3e4bc47d6a39 1094 ++ch;
casiotone401 15:3e4bc47d6a39 1095 ch &= 0x0F;
casiotone401 17:55e5136790a6 1096
casiotone401 17:55e5136790a6 1097 ++jitterCount;
casiotone401 17:55e5136790a6 1098 jitterCount &= 0x1FF;
casiotone401 14:977f3c5a4b4e 1099 }
casiotone401 14:977f3c5a4b4e 1100
casiotone401 14:977f3c5a4b4e 1101 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 1102 // M185 Sequencer
casiotone401 15:3e4bc47d6a39 1103
casiotone401 15:3e4bc47d6a39 1104 inline void M185Seq(int trigger, bool reset)
casiotone401 14:977f3c5a4b4e 1105 {
casiotone401 15:3e4bc47d6a39 1106 int i, j;
casiotone401 15:3e4bc47d6a39 1107 static bool triggerState = false;
casiotone401 15:3e4bc47d6a39 1108 static bool stepFoward = false;
casiotone401 15:3e4bc47d6a39 1109 static bool _reset = false;
casiotone401 15:3e4bc47d6a39 1110 static uint8_t currentStep;
casiotone401 15:3e4bc47d6a39 1111 static int stepCount;
casiotone401 15:3e4bc47d6a39 1112 static int _resetCount, resetCount;
casiotone401 15:3e4bc47d6a39 1113 static uint8_t gateMode;
casiotone401 15:3e4bc47d6a39 1114 static uint8_t _gateMode[8];
casiotone401 15:3e4bc47d6a39 1115 static uint8_t _pulseCount[8];
casiotone401 15:3e4bc47d6a39 1116 static uint8_t ch, qmode, amode;
casiotone401 15:3e4bc47d6a39 1117 static float glidecv[8], shiftcv[8];
casiotone401 15:3e4bc47d6a39 1118 unsigned int cv;
casiotone401 15:3e4bc47d6a39 1119 static float qcv;
casiotone401 15:3e4bc47d6a39 1120
casiotone401 15:3e4bc47d6a39 1121 qmode = (gCtrl[1] * (SCALE_NUM - 1)); // Sequencer Quantize Mode (gCtrl[1])
casiotone401 15:3e4bc47d6a39 1122 amode = SCALE_AOUT * qmode;
casiotone401 15:3e4bc47d6a39 1123
casiotone401 15:3e4bc47d6a39 1124 gAOUT.write_u16(amode);
casiotone401 15:3e4bc47d6a39 1125
casiotone401 15:3e4bc47d6a39 1126 switch (qmode)
casiotone401 15:3e4bc47d6a39 1127 {
casiotone401 15:3e4bc47d6a39 1128 case Lin:
casiotone401 15:3e4bc47d6a39 1129
casiotone401 15:3e4bc47d6a39 1130 glidecv[0] = glidecv[0] * gSlide[currentStep] + gSeq_cv[currentStep] * (1.0f - gSlide[currentStep]);
casiotone401 17:55e5136790a6 1131
casiotone401 15:3e4bc47d6a39 1132 break;
casiotone401 15:3e4bc47d6a39 1133
casiotone401 15:3e4bc47d6a39 1134 case Chr:
casiotone401 15:3e4bc47d6a39 1135
casiotone401 15:3e4bc47d6a39 1136 qcv = calibMap1[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES1 - 1))];
casiotone401 15:3e4bc47d6a39 1137
casiotone401 15:3e4bc47d6a39 1138 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
casiotone401 15:3e4bc47d6a39 1139
casiotone401 15:3e4bc47d6a39 1140 break;
casiotone401 15:3e4bc47d6a39 1141
casiotone401 15:3e4bc47d6a39 1142 case Maj:
casiotone401 15:3e4bc47d6a39 1143
casiotone401 15:3e4bc47d6a39 1144 qcv = calibMap2[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES2 - 1))];
casiotone401 15:3e4bc47d6a39 1145
casiotone401 15:3e4bc47d6a39 1146 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
casiotone401 17:55e5136790a6 1147
casiotone401 15:3e4bc47d6a39 1148 break;
casiotone401 15:3e4bc47d6a39 1149
casiotone401 15:3e4bc47d6a39 1150 case M7:
casiotone401 15:3e4bc47d6a39 1151
casiotone401 15:3e4bc47d6a39 1152 qcv = calibMap3[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES3 - 1))];
casiotone401 14:977f3c5a4b4e 1153
casiotone401 15:3e4bc47d6a39 1154 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
casiotone401 17:55e5136790a6 1155
casiotone401 15:3e4bc47d6a39 1156 break;
casiotone401 15:3e4bc47d6a39 1157
casiotone401 15:3e4bc47d6a39 1158 case Min7:
casiotone401 15:3e4bc47d6a39 1159
casiotone401 15:3e4bc47d6a39 1160 qcv = calibMap4[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES4 - 1))];
casiotone401 15:3e4bc47d6a39 1161
casiotone401 15:3e4bc47d6a39 1162 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
casiotone401 17:55e5136790a6 1163
casiotone401 15:3e4bc47d6a39 1164 break;
casiotone401 14:977f3c5a4b4e 1165
casiotone401 15:3e4bc47d6a39 1166 case Dor:
casiotone401 15:3e4bc47d6a39 1167
casiotone401 15:3e4bc47d6a39 1168 qcv = calibMap5[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES5 - 1))];
casiotone401 15:3e4bc47d6a39 1169
casiotone401 15:3e4bc47d6a39 1170 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
casiotone401 15:3e4bc47d6a39 1171
casiotone401 15:3e4bc47d6a39 1172 break;
casiotone401 15:3e4bc47d6a39 1173
casiotone401 15:3e4bc47d6a39 1174 case Min:
casiotone401 15:3e4bc47d6a39 1175
casiotone401 15:3e4bc47d6a39 1176 qcv = calibMap6[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES6 - 1))];
casiotone401 15:3e4bc47d6a39 1177
casiotone401 15:3e4bc47d6a39 1178 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
casiotone401 17:55e5136790a6 1179
casiotone401 15:3e4bc47d6a39 1180 break;
casiotone401 15:3e4bc47d6a39 1181
casiotone401 15:3e4bc47d6a39 1182 case S5th:
casiotone401 15:3e4bc47d6a39 1183
casiotone401 15:3e4bc47d6a39 1184 qcv = calibMap7[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES7 - 1))];
casiotone401 15:3e4bc47d6a39 1185
casiotone401 15:3e4bc47d6a39 1186 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
casiotone401 15:3e4bc47d6a39 1187
casiotone401 15:3e4bc47d6a39 1188 break;
casiotone401 15:3e4bc47d6a39 1189
casiotone401 15:3e4bc47d6a39 1190 case Wht:
casiotone401 15:3e4bc47d6a39 1191
casiotone401 15:3e4bc47d6a39 1192 qcv = calibMap8[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES8 - 1))];
casiotone401 15:3e4bc47d6a39 1193
casiotone401 15:3e4bc47d6a39 1194 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
casiotone401 15:3e4bc47d6a39 1195
casiotone401 15:3e4bc47d6a39 1196 break;
casiotone401 15:3e4bc47d6a39 1197 }
casiotone401 17:55e5136790a6 1198
casiotone401 17:55e5136790a6 1199 cv = (unsigned int)glidecv[0];
casiotone401 17:55e5136790a6 1200
casiotone401 17:55e5136790a6 1201 UpdateCV(WRITE_UPDATE_N, 0, &cv);
casiotone401 17:55e5136790a6 1202
casiotone401 15:3e4bc47d6a39 1203 for (i = 1; i < 8; ++i)
casiotone401 14:977f3c5a4b4e 1204 {
casiotone401 15:3e4bc47d6a39 1205 glidecv[i] = glidecv[i] * gSlide[currentStep] + shiftcv[i] * (1.0f - gSlide[currentStep]);
casiotone401 15:3e4bc47d6a39 1206 cv = (unsigned int)glidecv[i];
casiotone401 15:3e4bc47d6a39 1207
casiotone401 15:3e4bc47d6a39 1208 UpdateCV(WRITE_UPDATE_N, i, &cv);
casiotone401 14:977f3c5a4b4e 1209 }
casiotone401 14:977f3c5a4b4e 1210
casiotone401 15:3e4bc47d6a39 1211 if (trigger && !triggerState) // trigger ON
casiotone401 15:3e4bc47d6a39 1212 {
casiotone401 15:3e4bc47d6a39 1213 if (gateMode == MULTI)
casiotone401 15:3e4bc47d6a39 1214 {
casiotone401 15:3e4bc47d6a39 1215 gGATES[0] = true;
casiotone401 15:3e4bc47d6a39 1216
casiotone401 15:3e4bc47d6a39 1217 sendMes.setTopAddress(SetMatrixAddress(0, currentStep, false));
casiotone401 15:3e4bc47d6a39 1218 sendMes.setArgs("i", 1);
casiotone401 15:3e4bc47d6a39 1219 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 1220 }
casiotone401 15:3e4bc47d6a39 1221
casiotone401 15:3e4bc47d6a39 1222 stepFoward = triggerState = true;
casiotone401 15:3e4bc47d6a39 1223
casiotone401 15:3e4bc47d6a39 1224 } else if (!trigger) { // trigger OFF
casiotone401 15:3e4bc47d6a39 1225
casiotone401 15:3e4bc47d6a39 1226 if (gateMode != HOLD)
casiotone401 15:3e4bc47d6a39 1227 {
casiotone401 15:3e4bc47d6a39 1228 gGATES[0] = false;
casiotone401 15:3e4bc47d6a39 1229 }
casiotone401 15:3e4bc47d6a39 1230
casiotone401 15:3e4bc47d6a39 1231 if (gateMode == MULTI)
casiotone401 15:3e4bc47d6a39 1232 {
casiotone401 15:3e4bc47d6a39 1233 sendMes.setTopAddress(SetMatrixAddress(0, currentStep, false));
casiotone401 15:3e4bc47d6a39 1234 sendMes.setArgs("i", 0);
casiotone401 15:3e4bc47d6a39 1235 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 1236 }
casiotone401 15:3e4bc47d6a39 1237
casiotone401 15:3e4bc47d6a39 1238 triggerState = false;
casiotone401 15:3e4bc47d6a39 1239 }
casiotone401 15:3e4bc47d6a39 1240
casiotone401 15:3e4bc47d6a39 1241 // check & update touchOSC ctrl parameter
casiotone401 15:3e4bc47d6a39 1242 if (_gateMode[ch] != gGateMode[ch] * 3 || _pulseCount[ch] != gPulseCount[ch] * 7)
casiotone401 15:3e4bc47d6a39 1243 {
casiotone401 15:3e4bc47d6a39 1244 _gateMode[ch] = (gGateMode[ch] * 3);
casiotone401 15:3e4bc47d6a39 1245 _pulseCount[ch] = (gPulseCount[ch] * 7);
casiotone401 15:3e4bc47d6a39 1246
casiotone401 15:3e4bc47d6a39 1247 SendCtrlState(ch, _gateMode[ch], _pulseCount[ch]);
casiotone401 15:3e4bc47d6a39 1248 }
casiotone401 15:3e4bc47d6a39 1249
casiotone401 15:3e4bc47d6a39 1250 if (reset && !_reset) // Stop & Reset
casiotone401 15:3e4bc47d6a39 1251 {
casiotone401 15:3e4bc47d6a39 1252 sendMes.setTopAddress(SetMatrixAddress(0, currentStep, false));
casiotone401 15:3e4bc47d6a39 1253 sendMes.setArgs("i", 0);
casiotone401 15:3e4bc47d6a39 1254 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 1255
casiotone401 15:3e4bc47d6a39 1256 currentStep = 0;
casiotone401 15:3e4bc47d6a39 1257
casiotone401 15:3e4bc47d6a39 1258 sendMes.setTopAddress(SetMatrixAddress(0, currentStep, false));
casiotone401 15:3e4bc47d6a39 1259 sendMes.setArgs("i", 1);
casiotone401 15:3e4bc47d6a39 1260 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 1261
casiotone401 15:3e4bc47d6a39 1262 _reset = true;
casiotone401 15:3e4bc47d6a39 1263
casiotone401 15:3e4bc47d6a39 1264 } else if (!reset) {
casiotone401 15:3e4bc47d6a39 1265
casiotone401 15:3e4bc47d6a39 1266 _reset = false;
casiotone401 15:3e4bc47d6a39 1267 }
casiotone401 15:3e4bc47d6a39 1268
casiotone401 15:3e4bc47d6a39 1269 if (stepFoward)
casiotone401 15:3e4bc47d6a39 1270 {
casiotone401 15:3e4bc47d6a39 1271 if (gateMode != HOLD) // shift CV
casiotone401 15:3e4bc47d6a39 1272 {
casiotone401 15:3e4bc47d6a39 1273 for (j = 1; j < 8; ++j)
casiotone401 15:3e4bc47d6a39 1274 {
casiotone401 15:3e4bc47d6a39 1275 shiftcv[j] = glidecv[j-1];
casiotone401 15:3e4bc47d6a39 1276 }
casiotone401 15:3e4bc47d6a39 1277 }
casiotone401 15:3e4bc47d6a39 1278
casiotone401 15:3e4bc47d6a39 1279 --stepCount;
casiotone401 15:3e4bc47d6a39 1280
casiotone401 15:3e4bc47d6a39 1281 if (stepCount == -1)
casiotone401 15:3e4bc47d6a39 1282 {
casiotone401 15:3e4bc47d6a39 1283 sendMes.setTopAddress(SetMatrixAddress(0, currentStep, false));
casiotone401 15:3e4bc47d6a39 1284 sendMes.setArgs("i", 0);
casiotone401 15:3e4bc47d6a39 1285 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 1286
casiotone401 15:3e4bc47d6a39 1287 ++currentStep;
casiotone401 15:3e4bc47d6a39 1288
casiotone401 15:3e4bc47d6a39 1289 if (gCtrlSW[2])
casiotone401 15:3e4bc47d6a39 1290 {
casiotone401 15:3e4bc47d6a39 1291 resetCount = 3;
casiotone401 15:3e4bc47d6a39 1292
casiotone401 15:3e4bc47d6a39 1293 } else {
casiotone401 15:3e4bc47d6a39 1294
casiotone401 15:3e4bc47d6a39 1295 resetCount = gCtrl[4] * 7;
casiotone401 15:3e4bc47d6a39 1296 }
casiotone401 15:3e4bc47d6a39 1297
casiotone401 15:3e4bc47d6a39 1298 if (_resetCount != resetCount)
casiotone401 15:3e4bc47d6a39 1299 {
casiotone401 15:3e4bc47d6a39 1300 sendMes.setTopAddress(RESET_COUNTER_ADDRESS);
casiotone401 15:3e4bc47d6a39 1301 sendMes.setArgs("i", (resetCount + 1));
casiotone401 15:3e4bc47d6a39 1302 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 1303 }
casiotone401 15:3e4bc47d6a39 1304
casiotone401 15:3e4bc47d6a39 1305 if (currentStep > resetCount) // reset
casiotone401 15:3e4bc47d6a39 1306 {
casiotone401 15:3e4bc47d6a39 1307 currentStep = 0;
casiotone401 15:3e4bc47d6a39 1308 }
casiotone401 15:3e4bc47d6a39 1309
casiotone401 15:3e4bc47d6a39 1310 sendMes.setTopAddress(SetMatrixAddress(0, currentStep, false));
casiotone401 15:3e4bc47d6a39 1311 sendMes.setArgs("i", 1);
casiotone401 15:3e4bc47d6a39 1312 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 1313
casiotone401 15:3e4bc47d6a39 1314 UpdateCVMeter(currentStep, &cv);
casiotone401 15:3e4bc47d6a39 1315
casiotone401 15:3e4bc47d6a39 1316 // check Pulse Count & Gate Mode
casiotone401 15:3e4bc47d6a39 1317 stepCount = (gPulseCount[currentStep] * 7);
casiotone401 15:3e4bc47d6a39 1318
casiotone401 15:3e4bc47d6a39 1319 gateMode = (gGateMode[currentStep] * 3);
casiotone401 15:3e4bc47d6a39 1320
casiotone401 15:3e4bc47d6a39 1321 if (gateMode != MUTE)
casiotone401 15:3e4bc47d6a39 1322 {
casiotone401 15:3e4bc47d6a39 1323 gGATES[0] = true;
casiotone401 15:3e4bc47d6a39 1324 }
casiotone401 15:3e4bc47d6a39 1325
casiotone401 15:3e4bc47d6a39 1326 }
casiotone401 15:3e4bc47d6a39 1327
casiotone401 15:3e4bc47d6a39 1328 stepFoward = false;
casiotone401 15:3e4bc47d6a39 1329 }
casiotone401 15:3e4bc47d6a39 1330
casiotone401 15:3e4bc47d6a39 1331 ++ch;
casiotone401 15:3e4bc47d6a39 1332 ch &= 0x07;
casiotone401 14:977f3c5a4b4e 1333 }
casiotone401 14:977f3c5a4b4e 1334
casiotone401 14:977f3c5a4b4e 1335 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 1336 // Send M185 Sequencer Status to touchOSC
casiotone401 15:3e4bc47d6a39 1337
casiotone401 15:3e4bc47d6a39 1338 inline void SendCtrlState(uint8_t step, uint8_t gateMode, uint8_t stepCount)
casiotone401 15:3e4bc47d6a39 1339 {
casiotone401 15:3e4bc47d6a39 1340 char pulseAddress[10] = PULSE_COUNT_ADDRESS;
casiotone401 15:3e4bc47d6a39 1341 char gateModeAddress[10] = GATE_MODE_ADDRESS;
casiotone401 15:3e4bc47d6a39 1342 char currentStep[2];
casiotone401 14:977f3c5a4b4e 1343
casiotone401 15:3e4bc47d6a39 1344 sprintf(currentStep, "%d", step + 1);
casiotone401 15:3e4bc47d6a39 1345
casiotone401 15:3e4bc47d6a39 1346 strcat(gateModeAddress, currentStep);
casiotone401 15:3e4bc47d6a39 1347
casiotone401 15:3e4bc47d6a39 1348 if(stepCount != 8)
casiotone401 15:3e4bc47d6a39 1349 {
casiotone401 15:3e4bc47d6a39 1350 strcat(pulseAddress, currentStep);
casiotone401 15:3e4bc47d6a39 1351 sendMes.setTopAddress(pulseAddress);
casiotone401 15:3e4bc47d6a39 1352 sendMes.setArgs("i", (stepCount + 1));
casiotone401 15:3e4bc47d6a39 1353 osc.sendOsc(&sendMes);
casiotone401 14:977f3c5a4b4e 1354 }
casiotone401 15:3e4bc47d6a39 1355
casiotone401 15:3e4bc47d6a39 1356 sendMes.setTopAddress(gateModeAddress);
casiotone401 14:977f3c5a4b4e 1357
casiotone401 15:3e4bc47d6a39 1358 switch (gateMode)
casiotone401 15:3e4bc47d6a39 1359 {
casiotone401 15:3e4bc47d6a39 1360 case SINGLE:
casiotone401 15:3e4bc47d6a39 1361
casiotone401 15:3e4bc47d6a39 1362 sendMes.setArgs("s", "|");
casiotone401 15:3e4bc47d6a39 1363
casiotone401 15:3e4bc47d6a39 1364 break;
casiotone401 15:3e4bc47d6a39 1365
casiotone401 15:3e4bc47d6a39 1366 case MUTE:
casiotone401 14:977f3c5a4b4e 1367
casiotone401 15:3e4bc47d6a39 1368 sendMes.setArgs("s", "O");
casiotone401 15:3e4bc47d6a39 1369
casiotone401 15:3e4bc47d6a39 1370 break;
casiotone401 15:3e4bc47d6a39 1371
casiotone401 15:3e4bc47d6a39 1372 case MULTI:
casiotone401 15:3e4bc47d6a39 1373
casiotone401 15:3e4bc47d6a39 1374 sendMes.setArgs("s", "||");
casiotone401 15:3e4bc47d6a39 1375
casiotone401 15:3e4bc47d6a39 1376 break;
casiotone401 15:3e4bc47d6a39 1377
casiotone401 15:3e4bc47d6a39 1378 case HOLD:
casiotone401 15:3e4bc47d6a39 1379
casiotone401 15:3e4bc47d6a39 1380 sendMes.setArgs("s", "|-");
casiotone401 15:3e4bc47d6a39 1381
casiotone401 15:3e4bc47d6a39 1382 break;
casiotone401 15:3e4bc47d6a39 1383 }
casiotone401 15:3e4bc47d6a39 1384
casiotone401 17:55e5136790a6 1385 osc.sendOsc(&sendMes);
casiotone401 14:977f3c5a4b4e 1386 }
casiotone401 14:977f3c5a4b4e 1387
casiotone401 14:977f3c5a4b4e 1388 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 1389 // Gate Sequencer beat(Note values) length(Gate time) invert(invert Gate)
casiotone401 15:3e4bc47d6a39 1390
casiotone401 15:3e4bc47d6a39 1391 inline int GateSeq(int bpm, int beat, int ch, int length, bool invert, bool gatesoff, bool syncoff)
casiotone401 5:e305509d53f3 1392 {
casiotone401 10:ccfeb687c3f2 1393 int i;
casiotone401 15:3e4bc47d6a39 1394 static int gatetime[GATE_TOTAL], oldgatetime[GATE_TOTAL];
casiotone401 15:3e4bc47d6a39 1395 static int _bpm, bar, sync24, oldsynctime;
casiotone401 5:e305509d53f3 1396
casiotone401 5:e305509d53f3 1397 int time = gTimer.read_us();
casiotone401 5:e305509d53f3 1398
casiotone401 15:3e4bc47d6a39 1399 if (_bpm != bpm)
casiotone401 15:3e4bc47d6a39 1400 {
casiotone401 15:3e4bc47d6a39 1401 if (!bpm)
casiotone401 15:3e4bc47d6a39 1402 {
casiotone401 15:3e4bc47d6a39 1403 beat = NRESET;
casiotone401 15:3e4bc47d6a39 1404
casiotone401 15:3e4bc47d6a39 1405 } else {
casiotone401 15:3e4bc47d6a39 1406
casiotone401 15:3e4bc47d6a39 1407 bar = (60.0f / bpm) * 4000000;
casiotone401 15:3e4bc47d6a39 1408 //sync24 = (bar / 4) / 24; // sync24 not tested
casiotone401 15:3e4bc47d6a39 1409
casiotone401 15:3e4bc47d6a39 1410 _bpm = bpm;
casiotone401 15:3e4bc47d6a39 1411 }
casiotone401 15:3e4bc47d6a39 1412 }
casiotone401 5:e305509d53f3 1413
casiotone401 15:3e4bc47d6a39 1414 switch (beat) // Calculate Note values
casiotone401 5:e305509d53f3 1415 {
casiotone401 5:e305509d53f3 1416 case NDOT2:
casiotone401 5:e305509d53f3 1417
casiotone401 5:e305509d53f3 1418 gatetime[ch] = (bar / 4) * 3;
casiotone401 5:e305509d53f3 1419 break;
casiotone401 5:e305509d53f3 1420
casiotone401 5:e305509d53f3 1421 case NDOT4:
casiotone401 5:e305509d53f3 1422
casiotone401 5:e305509d53f3 1423 gatetime[ch] = (bar / 8) * 3;
casiotone401 5:e305509d53f3 1424 break;
casiotone401 5:e305509d53f3 1425
casiotone401 5:e305509d53f3 1426 case NDOT8:
casiotone401 5:e305509d53f3 1427
casiotone401 5:e305509d53f3 1428 gatetime[ch] = (bar / 16) * 3;
casiotone401 5:e305509d53f3 1429 break;
casiotone401 5:e305509d53f3 1430
casiotone401 5:e305509d53f3 1431 case NDOT16:
casiotone401 5:e305509d53f3 1432
casiotone401 5:e305509d53f3 1433 gatetime[ch] = (bar / 32) * 3;
casiotone401 5:e305509d53f3 1434 break;
casiotone401 5:e305509d53f3 1435
casiotone401 5:e305509d53f3 1436 case NDOT32:
casiotone401 5:e305509d53f3 1437
casiotone401 5:e305509d53f3 1438 gatetime[ch] = (bar / 64) * 3;
casiotone401 5:e305509d53f3 1439 break;
casiotone401 5:e305509d53f3 1440
casiotone401 5:e305509d53f3 1441 case NRESET:
casiotone401 15:3e4bc47d6a39 1442
casiotone401 15:3e4bc47d6a39 1443 gTimer.reset();
casiotone401 5:e305509d53f3 1444
casiotone401 15:3e4bc47d6a39 1445 for (i = 0; i < GATE_TOTAL; ++i) // Reset
casiotone401 5:e305509d53f3 1446 {
casiotone401 5:e305509d53f3 1447 oldsynctime = oldgatetime[i] = gatetime[i] = NRESET;
casiotone401 5:e305509d53f3 1448 }
casiotone401 15:3e4bc47d6a39 1449
casiotone401 15:3e4bc47d6a39 1450 return 0;
casiotone401 15:3e4bc47d6a39 1451
casiotone401 5:e305509d53f3 1452 default:
casiotone401 5:e305509d53f3 1453
casiotone401 5:e305509d53f3 1454 gatetime[ch] = bar / beat;
casiotone401 15:3e4bc47d6a39 1455 sync24 = bar / 16;
casiotone401 15:3e4bc47d6a39 1456 break;
casiotone401 5:e305509d53f3 1457 }
casiotone401 5:e305509d53f3 1458
casiotone401 15:3e4bc47d6a39 1459 if (time > oldsynctime + sync24) // sync24 not tested
casiotone401 15:3e4bc47d6a39 1460 {
casiotone401 15:3e4bc47d6a39 1461 if (!syncoff)
casiotone401 5:e305509d53f3 1462 {
casiotone401 5:e305509d53f3 1463 oldsynctime = time;
casiotone401 15:3e4bc47d6a39 1464 gCLOCKOUT = true;
casiotone401 5:e305509d53f3 1465
casiotone401 15:3e4bc47d6a39 1466 midi.sendRealTime(Clock); // MIDI Clock
casiotone401 15:3e4bc47d6a39 1467 }
casiotone401 5:e305509d53f3 1468
casiotone401 15:3e4bc47d6a39 1469 } else if (time > oldsynctime - (sync24 - 2)) {
casiotone401 15:3e4bc47d6a39 1470
casiotone401 15:3e4bc47d6a39 1471 if (!syncoff)
casiotone401 15:3e4bc47d6a39 1472 {
casiotone401 15:3e4bc47d6a39 1473 gCLOCKOUT = false;
casiotone401 5:e305509d53f3 1474 }
casiotone401 15:3e4bc47d6a39 1475 }
casiotone401 15:3e4bc47d6a39 1476
casiotone401 15:3e4bc47d6a39 1477 if (ch == GATE_TOTAL)
casiotone401 5:e305509d53f3 1478 {
casiotone401 5:e305509d53f3 1479 return -1;
casiotone401 5:e305509d53f3 1480
casiotone401 10:ccfeb687c3f2 1481 } else if (time > oldgatetime[ch] + gatetime[ch] && !invert) {
casiotone401 5:e305509d53f3 1482
casiotone401 5:e305509d53f3 1483 oldgatetime[ch] = time;
casiotone401 5:e305509d53f3 1484
casiotone401 15:3e4bc47d6a39 1485 if (!gatesoff)
casiotone401 15:3e4bc47d6a39 1486 {
casiotone401 15:3e4bc47d6a39 1487 gGATES[ch] = true;
casiotone401 15:3e4bc47d6a39 1488
casiotone401 15:3e4bc47d6a39 1489 } else if (ch == SUBGATE) {
casiotone401 15:3e4bc47d6a39 1490
casiotone401 15:3e4bc47d6a39 1491 gSUBGATE = true;
casiotone401 15:3e4bc47d6a39 1492 }
casiotone401 15:3e4bc47d6a39 1493
casiotone401 15:3e4bc47d6a39 1494 return 1;
casiotone401 5:e305509d53f3 1495
casiotone401 10:ccfeb687c3f2 1496 } else if (time > oldgatetime[ch] + gatetime[ch] && invert) {
casiotone401 5:e305509d53f3 1497
casiotone401 5:e305509d53f3 1498 oldgatetime[ch] = time;
casiotone401 15:3e4bc47d6a39 1499
casiotone401 15:3e4bc47d6a39 1500 if (!gatesoff)
casiotone401 15:3e4bc47d6a39 1501 {
casiotone401 15:3e4bc47d6a39 1502 gGATES[ch] = false;
casiotone401 15:3e4bc47d6a39 1503
casiotone401 15:3e4bc47d6a39 1504 } else if (ch == SUBGATE) {
casiotone401 15:3e4bc47d6a39 1505
casiotone401 15:3e4bc47d6a39 1506 gSUBGATE = false;
casiotone401 15:3e4bc47d6a39 1507 }
casiotone401 5:e305509d53f3 1508
casiotone401 5:e305509d53f3 1509 return 0;
casiotone401 5:e305509d53f3 1510
casiotone401 10:ccfeb687c3f2 1511 } else if (time > oldgatetime[ch] + (gatetime[ch] - gatetime[ch] / length) && !invert) {
casiotone401 5:e305509d53f3 1512
casiotone401 15:3e4bc47d6a39 1513 if (!gatesoff)
casiotone401 15:3e4bc47d6a39 1514 {
casiotone401 15:3e4bc47d6a39 1515 gGATES[ch] = false;
casiotone401 15:3e4bc47d6a39 1516
casiotone401 15:3e4bc47d6a39 1517 } else if (ch == SUBGATE) {
casiotone401 15:3e4bc47d6a39 1518
casiotone401 15:3e4bc47d6a39 1519 gSUBGATE = false;
casiotone401 15:3e4bc47d6a39 1520 }
casiotone401 5:e305509d53f3 1521
casiotone401 5:e305509d53f3 1522 return 0;
casiotone401 5:e305509d53f3 1523
casiotone401 10:ccfeb687c3f2 1524 } else if (time > oldgatetime[ch] + (gatetime[ch] - gatetime[ch] / length) && invert) {
casiotone401 5:e305509d53f3 1525
casiotone401 15:3e4bc47d6a39 1526 if (!gatesoff)
casiotone401 15:3e4bc47d6a39 1527 {
casiotone401 15:3e4bc47d6a39 1528 gGATES[ch] = true;
casiotone401 15:3e4bc47d6a39 1529
casiotone401 15:3e4bc47d6a39 1530 } else if (ch == SUBGATE) {
casiotone401 15:3e4bc47d6a39 1531
casiotone401 15:3e4bc47d6a39 1532 gSUBGATE = true;
casiotone401 15:3e4bc47d6a39 1533 }
casiotone401 5:e305509d53f3 1534
casiotone401 15:3e4bc47d6a39 1535 return 1;
casiotone401 5:e305509d53f3 1536
casiotone401 5:e305509d53f3 1537 } else {
casiotone401 5:e305509d53f3 1538
casiotone401 5:e305509d53f3 1539 return -1;
casiotone401 5:e305509d53f3 1540 }
casiotone401 5:e305509d53f3 1541 }
casiotone401 5:e305509d53f3 1542
casiotone401 15:3e4bc47d6a39 1543
casiotone401 5:e305509d53f3 1544 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 1545 // Check BPM
casiotone401 15:3e4bc47d6a39 1546
casiotone401 15:3e4bc47d6a39 1547 inline int CheckBPM()
casiotone401 15:3e4bc47d6a39 1548 {
casiotone401 15:3e4bc47d6a39 1549 static int _bpm = -1;
casiotone401 15:3e4bc47d6a39 1550 int bpm;
casiotone401 14:977f3c5a4b4e 1551
casiotone401 15:3e4bc47d6a39 1552 if (gCtrlSW[0])
casiotone401 14:977f3c5a4b4e 1553 {
casiotone401 15:3e4bc47d6a39 1554 bpm = 0;
casiotone401 15:3e4bc47d6a39 1555
casiotone401 15:3e4bc47d6a39 1556 return bpm;
casiotone401 0:a4d93cd4c30d 1557 }
casiotone401 3:ca15241dd6b4 1558
casiotone401 15:3e4bc47d6a39 1559 if (!gCtrl[0])
casiotone401 5:e305509d53f3 1560 {
casiotone401 15:3e4bc47d6a39 1561 bpm = gArdCtrl[0] * 0.25f + 5;
casiotone401 15:3e4bc47d6a39 1562
casiotone401 15:3e4bc47d6a39 1563 if (abs(bpm - _bpm) > 1)
casiotone401 15:3e4bc47d6a39 1564 {
casiotone401 15:3e4bc47d6a39 1565 _bpm = bpm;
casiotone401 15:3e4bc47d6a39 1566
casiotone401 15:3e4bc47d6a39 1567 sendMes.setTopAddress("/bpm");
casiotone401 15:3e4bc47d6a39 1568 sendMes.setArgs("i", bpm);
casiotone401 15:3e4bc47d6a39 1569 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 1570 }
casiotone401 14:977f3c5a4b4e 1571
casiotone401 15:3e4bc47d6a39 1572 } else if (gCtrl[0]) {
casiotone401 15:3e4bc47d6a39 1573
casiotone401 15:3e4bc47d6a39 1574 bpm = (gCtrl[0] * 240 + 5);
casiotone401 15:3e4bc47d6a39 1575
casiotone401 15:3e4bc47d6a39 1576 if (abs(bpm - _bpm) > 1)
casiotone401 15:3e4bc47d6a39 1577 {
casiotone401 15:3e4bc47d6a39 1578 _bpm = bpm;
casiotone401 15:3e4bc47d6a39 1579
casiotone401 15:3e4bc47d6a39 1580 sendMes.setTopAddress("/bpm");
casiotone401 15:3e4bc47d6a39 1581 sendMes.setArgs("i", bpm);
casiotone401 15:3e4bc47d6a39 1582 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 1583 }
casiotone401 15:3e4bc47d6a39 1584 }
casiotone401 15:3e4bc47d6a39 1585
casiotone401 15:3e4bc47d6a39 1586 return bpm;
casiotone401 15:3e4bc47d6a39 1587 }
casiotone401 15:3e4bc47d6a39 1588
casiotone401 15:3e4bc47d6a39 1589 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 1590 // Check Mode SW
casiotone401 15:3e4bc47d6a39 1591
casiotone401 15:3e4bc47d6a39 1592 inline void CheckModeSW()
casiotone401 15:3e4bc47d6a39 1593 {
casiotone401 15:3e4bc47d6a39 1594 if (gMode < MODE_TOTAL - 1)
casiotone401 15:3e4bc47d6a39 1595 {
casiotone401 15:3e4bc47d6a39 1596 ++gMode;
casiotone401 15:3e4bc47d6a39 1597
casiotone401 15:3e4bc47d6a39 1598 } else {
casiotone401 15:3e4bc47d6a39 1599
casiotone401 15:3e4bc47d6a39 1600 gMode = 0;
casiotone401 15:3e4bc47d6a39 1601 }
casiotone401 15:3e4bc47d6a39 1602
casiotone401 15:3e4bc47d6a39 1603 gCLOCKOUT = gGATES[0] = gGATES[1] = gGATES[2] = gGATES[3] = false;
casiotone401 15:3e4bc47d6a39 1604
casiotone401 15:3e4bc47d6a39 1605 if (gMode == MODE_SEQ || gMode == MODE_185 || gMode == MODE_EUC)
casiotone401 15:3e4bc47d6a39 1606 {
casiotone401 15:3e4bc47d6a39 1607 gTimer.start(); // Sequencer Timer Start
casiotone401 15:3e4bc47d6a39 1608 midi.begin(1);
casiotone401 5:e305509d53f3 1609
casiotone401 15:3e4bc47d6a39 1610 } else {
casiotone401 15:3e4bc47d6a39 1611
casiotone401 15:3e4bc47d6a39 1612 gTimer.stop(); // Sequencer Timer Stop
casiotone401 5:e305509d53f3 1613 }
casiotone401 5:e305509d53f3 1614
casiotone401 4:b9f5ae574447 1615 }
casiotone401 4:b9f5ae574447 1616
casiotone401 4:b9f5ae574447 1617 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 1618 // Print LCD Mode Status
casiotone401 15:3e4bc47d6a39 1619
casiotone401 15:3e4bc47d6a39 1620 inline void LCD()
casiotone401 15:3e4bc47d6a39 1621 {
casiotone401 15:3e4bc47d6a39 1622 static int _mode = -1;
casiotone401 15:3e4bc47d6a39 1623 static int _qmode = -1;
casiotone401 15:3e4bc47d6a39 1624 static int qmode;
casiotone401 15:3e4bc47d6a39 1625
casiotone401 15:3e4bc47d6a39 1626 if (_mode != gMode)
casiotone401 15:3e4bc47d6a39 1627 {
casiotone401 15:3e4bc47d6a39 1628 sendMes.setTopAddress("/mode");
casiotone401 15:3e4bc47d6a39 1629
casiotone401 15:3e4bc47d6a39 1630 switch (gMode)
casiotone401 15:3e4bc47d6a39 1631 {
casiotone401 15:3e4bc47d6a39 1632 case MODE_Calb:
casiotone401 15:3e4bc47d6a39 1633 gLCD.locate( 9, 0 );
casiotone401 15:3e4bc47d6a39 1634 gLCD.printf("CLB|880");
casiotone401 15:3e4bc47d6a39 1635
casiotone401 15:3e4bc47d6a39 1636 sendMes.setArgs("s", "Calibration");
casiotone401 15:3e4bc47d6a39 1637 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 1638
casiotone401 15:3e4bc47d6a39 1639 sendMes.setTopAddress("/scale");
casiotone401 15:3e4bc47d6a39 1640 sendMes.setArgs("s", "880Hz");
casiotone401 15:3e4bc47d6a39 1641
casiotone401 15:3e4bc47d6a39 1642 _qmode = -1;
casiotone401 15:3e4bc47d6a39 1643
casiotone401 15:3e4bc47d6a39 1644 break;
casiotone401 15:3e4bc47d6a39 1645
casiotone401 15:3e4bc47d6a39 1646 case MODE_OSC:
casiotone401 15:3e4bc47d6a39 1647 gLCD.locate( 9, 0 );
casiotone401 15:3e4bc47d6a39 1648 gLCD.printf("OSC|");
casiotone401 15:3e4bc47d6a39 1649
casiotone401 15:3e4bc47d6a39 1650 sendMes.setArgs("s", "OSCtoCV");
casiotone401 15:3e4bc47d6a39 1651
casiotone401 15:3e4bc47d6a39 1652 break;
casiotone401 15:3e4bc47d6a39 1653
casiotone401 15:3e4bc47d6a39 1654 case MODE_SEQ:
casiotone401 15:3e4bc47d6a39 1655 gLCD.locate( 9, 0 );
casiotone401 15:3e4bc47d6a39 1656 gLCD.printf("ASR|");
casiotone401 15:3e4bc47d6a39 1657
casiotone401 15:3e4bc47d6a39 1658 sendMes.setArgs("s", "ASR SEQ");
casiotone401 15:3e4bc47d6a39 1659
casiotone401 15:3e4bc47d6a39 1660 break;
casiotone401 15:3e4bc47d6a39 1661
casiotone401 15:3e4bc47d6a39 1662 case MODE_185:
casiotone401 15:3e4bc47d6a39 1663 gLCD.locate( 9, 0 );
casiotone401 15:3e4bc47d6a39 1664 gLCD.printf("185|");
casiotone401 15:3e4bc47d6a39 1665
casiotone401 15:3e4bc47d6a39 1666 sendMes.setArgs("s", "M185 SEQ");
casiotone401 15:3e4bc47d6a39 1667
casiotone401 15:3e4bc47d6a39 1668 break;
casiotone401 15:3e4bc47d6a39 1669
casiotone401 15:3e4bc47d6a39 1670 case MODE_EUC:
casiotone401 15:3e4bc47d6a39 1671 gLCD.locate( 9, 0 );
casiotone401 15:3e4bc47d6a39 1672 gLCD.printf("EUC|");
casiotone401 15:3e4bc47d6a39 1673
casiotone401 15:3e4bc47d6a39 1674 sendMes.setArgs("s", "Euclidean SEQ");
casiotone401 15:3e4bc47d6a39 1675
casiotone401 15:3e4bc47d6a39 1676 break;
casiotone401 15:3e4bc47d6a39 1677
casiotone401 15:3e4bc47d6a39 1678 default:
casiotone401 15:3e4bc47d6a39 1679 break;
casiotone401 15:3e4bc47d6a39 1680 }
casiotone401 15:3e4bc47d6a39 1681
casiotone401 15:3e4bc47d6a39 1682 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 1683 _mode = gMode;
casiotone401 15:3e4bc47d6a39 1684 }
casiotone401 15:3e4bc47d6a39 1685
casiotone401 15:3e4bc47d6a39 1686 qmode = (gCtrl[1] * (SCALE_NUM - 1));
casiotone401 15:3e4bc47d6a39 1687
casiotone401 17:55e5136790a6 1688 if (_qmode != qmode)
casiotone401 15:3e4bc47d6a39 1689 {
casiotone401 15:3e4bc47d6a39 1690 sendMes.setTopAddress("/scale");
casiotone401 15:3e4bc47d6a39 1691
casiotone401 15:3e4bc47d6a39 1692 switch (qmode)
casiotone401 15:3e4bc47d6a39 1693 {
casiotone401 15:3e4bc47d6a39 1694 case Lin:
casiotone401 15:3e4bc47d6a39 1695 gLCD.locate( 13, 0 );
casiotone401 15:3e4bc47d6a39 1696 gLCD.printf("lin");
casiotone401 15:3e4bc47d6a39 1697
casiotone401 15:3e4bc47d6a39 1698 sendMes.setArgs("s", "Linear");
casiotone401 15:3e4bc47d6a39 1699
casiotone401 15:3e4bc47d6a39 1700 break;
casiotone401 15:3e4bc47d6a39 1701
casiotone401 15:3e4bc47d6a39 1702 case Chr:
casiotone401 15:3e4bc47d6a39 1703 gLCD.locate( 13, 0 );
casiotone401 15:3e4bc47d6a39 1704 gLCD.printf("chr");
casiotone401 15:3e4bc47d6a39 1705
casiotone401 15:3e4bc47d6a39 1706 sendMes.setArgs("s", "Chromatic");
casiotone401 15:3e4bc47d6a39 1707
casiotone401 15:3e4bc47d6a39 1708 break;
casiotone401 15:3e4bc47d6a39 1709
casiotone401 15:3e4bc47d6a39 1710 case Maj:
casiotone401 15:3e4bc47d6a39 1711 gLCD.locate( 13, 0 );
casiotone401 15:3e4bc47d6a39 1712 gLCD.printf("maj");
casiotone401 15:3e4bc47d6a39 1713
casiotone401 15:3e4bc47d6a39 1714 sendMes.setArgs("s", "Major");
casiotone401 15:3e4bc47d6a39 1715
casiotone401 15:3e4bc47d6a39 1716 break;
casiotone401 15:3e4bc47d6a39 1717
casiotone401 15:3e4bc47d6a39 1718 case M7:
casiotone401 15:3e4bc47d6a39 1719 gLCD.locate( 13, 0 );
casiotone401 15:3e4bc47d6a39 1720 gLCD.printf("ma7");
casiotone401 15:3e4bc47d6a39 1721
casiotone401 15:3e4bc47d6a39 1722 sendMes.setArgs("s", "Major7");
casiotone401 15:3e4bc47d6a39 1723
casiotone401 15:3e4bc47d6a39 1724 break;
casiotone401 15:3e4bc47d6a39 1725
casiotone401 15:3e4bc47d6a39 1726 case Min7:
casiotone401 15:3e4bc47d6a39 1727 gLCD.locate( 13, 0 );
casiotone401 15:3e4bc47d6a39 1728 gLCD.printf("mi7");
casiotone401 15:3e4bc47d6a39 1729
casiotone401 15:3e4bc47d6a39 1730 sendMes.setArgs("s", "Minor7");
casiotone401 15:3e4bc47d6a39 1731
casiotone401 15:3e4bc47d6a39 1732 break;
casiotone401 15:3e4bc47d6a39 1733
casiotone401 15:3e4bc47d6a39 1734 case Dor:
casiotone401 15:3e4bc47d6a39 1735 gLCD.locate( 13, 0 );
casiotone401 15:3e4bc47d6a39 1736 gLCD.printf("dor");
casiotone401 15:3e4bc47d6a39 1737
casiotone401 15:3e4bc47d6a39 1738 sendMes.setArgs("s", "Dorian");
casiotone401 15:3e4bc47d6a39 1739
casiotone401 15:3e4bc47d6a39 1740 break;
casiotone401 15:3e4bc47d6a39 1741
casiotone401 15:3e4bc47d6a39 1742 case Min:
casiotone401 15:3e4bc47d6a39 1743 gLCD.locate( 13, 0 );
casiotone401 15:3e4bc47d6a39 1744 gLCD.printf("min");
casiotone401 15:3e4bc47d6a39 1745
casiotone401 15:3e4bc47d6a39 1746 sendMes.setTopAddress("/scale");
casiotone401 15:3e4bc47d6a39 1747 sendMes.setArgs("s", "Minor");
casiotone401 15:3e4bc47d6a39 1748
casiotone401 15:3e4bc47d6a39 1749 break;
casiotone401 15:3e4bc47d6a39 1750
casiotone401 15:3e4bc47d6a39 1751 case S5th:
casiotone401 15:3e4bc47d6a39 1752 gLCD.locate( 13, 0 );
casiotone401 15:3e4bc47d6a39 1753 gLCD.printf("5th");
casiotone401 15:3e4bc47d6a39 1754
casiotone401 15:3e4bc47d6a39 1755 sendMes.setArgs("s", "5th");
casiotone401 15:3e4bc47d6a39 1756
casiotone401 15:3e4bc47d6a39 1757 break;
casiotone401 15:3e4bc47d6a39 1758
casiotone401 15:3e4bc47d6a39 1759 case Wht:
casiotone401 15:3e4bc47d6a39 1760 gLCD.locate( 13, 0 );
casiotone401 15:3e4bc47d6a39 1761 gLCD.printf("wht");
casiotone401 15:3e4bc47d6a39 1762
casiotone401 15:3e4bc47d6a39 1763 sendMes.setArgs("s", "Whole Tone");
casiotone401 15:3e4bc47d6a39 1764 break;
casiotone401 15:3e4bc47d6a39 1765
casiotone401 15:3e4bc47d6a39 1766 default:
casiotone401 15:3e4bc47d6a39 1767 break;
casiotone401 15:3e4bc47d6a39 1768 }
casiotone401 15:3e4bc47d6a39 1769
casiotone401 15:3e4bc47d6a39 1770 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 1771 _qmode = qmode;
casiotone401 15:3e4bc47d6a39 1772 }
casiotone401 15:3e4bc47d6a39 1773
casiotone401 4:b9f5ae574447 1774 }
casiotone401 4:b9f5ae574447 1775
casiotone401 4:b9f5ae574447 1776 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 1777 // CV Meter
casiotone401 15:3e4bc47d6a39 1778
casiotone401 15:3e4bc47d6a39 1779 inline void UpdateCVMeter(int ch, const unsigned int *level)
casiotone401 15:3e4bc47d6a39 1780 {
casiotone401 15:3e4bc47d6a39 1781 gLCD.locate ( ch, 0 );
casiotone401 15:3e4bc47d6a39 1782 gLCD.putc(*level * 0.0002192f); // put custom char
casiotone401 0:a4d93cd4c30d 1783 }
casiotone401 0:a4d93cd4c30d 1784
casiotone401 15:3e4bc47d6a39 1785
casiotone401 0:a4d93cd4c30d 1786 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 1787 // Write command Custom Char LCD CGRAM for CV Meter)
casiotone401 0:a4d93cd4c30d 1788
casiotone401 0:a4d93cd4c30d 1789 void WriteCustomChar(unsigned char addr, unsigned char *c)
casiotone401 0:a4d93cd4c30d 1790 {
casiotone401 0:a4d93cd4c30d 1791 char cnt = 0;
casiotone401 0:a4d93cd4c30d 1792 addr = ((addr << 3) | 0x40);
casiotone401 0:a4d93cd4c30d 1793
casiotone401 15:3e4bc47d6a39 1794 while (cnt < 0x08)
casiotone401 0:a4d93cd4c30d 1795 {
casiotone401 0:a4d93cd4c30d 1796 gLCD.writeCommand(addr | cnt);
casiotone401 0:a4d93cd4c30d 1797 gLCD.writeData(*c);
casiotone401 4:b9f5ae574447 1798
casiotone401 15:3e4bc47d6a39 1799 ++cnt;
casiotone401 15:3e4bc47d6a39 1800 ++c;
casiotone401 0:a4d93cd4c30d 1801 }
casiotone401 0:a4d93cd4c30d 1802 }
casiotone401 0:a4d93cd4c30d 1803
casiotone401 0:a4d93cd4c30d 1804 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 1805 // Setup Ethernet port
casiotone401 0:a4d93cd4c30d 1806
casiotone401 0:a4d93cd4c30d 1807 int SetupEthNetIf()
casiotone401 0:a4d93cd4c30d 1808 {
casiotone401 0:a4d93cd4c30d 1809 gLCD.locate( 0, 1 );
casiotone401 0:a4d93cd4c30d 1810 gLCD.printf("Setting up... ");
casiotone401 0:a4d93cd4c30d 1811 // printf("Setting up...\r\n");
casiotone401 0:a4d93cd4c30d 1812 EthernetErr ethErr = gEth.setup();
casiotone401 0:a4d93cd4c30d 1813
casiotone401 15:3e4bc47d6a39 1814 if (ethErr)
casiotone401 0:a4d93cd4c30d 1815 {
casiotone401 0:a4d93cd4c30d 1816 gLCD.locate( 0, 1 );
casiotone401 0:a4d93cd4c30d 1817 gLCD.printf("Error in setup.");
casiotone401 0:a4d93cd4c30d 1818 // printf("Error %d in setup.\r\n", ethErr);
casiotone401 0:a4d93cd4c30d 1819 return -1;
casiotone401 0:a4d93cd4c30d 1820 }
casiotone401 0:a4d93cd4c30d 1821 // printf("Setup OK\r\n");
casiotone401 0:a4d93cd4c30d 1822
casiotone401 0:a4d93cd4c30d 1823 // printf("IP address %d.%d.%d.%d\r\n", gEth.getIp()[0], gEth.getIp()[1], gEth.getIp()[2], gEth.getIp()[3]);
casiotone401 0:a4d93cd4c30d 1824 Host broadcast(IpAddr(gEth.getIp()[0], gEth.getIp()[1], gEth.getIp()[2], 255), INPUT_PORT, NULL);
casiotone401 0:a4d93cd4c30d 1825 gUdp.setOnEvent(&onUDPSocketEvent);
casiotone401 0:a4d93cd4c30d 1826 gUdp.bind(broadcast);
casiotone401 4:b9f5ae574447 1827
casiotone401 0:a4d93cd4c30d 1828 gLCD.locate( 0, 1 );
casiotone401 0:a4d93cd4c30d 1829 gLCD.printf("%03d.%03d.%03d.%03d", gEth.getIp()[0], gEth.getIp()[1], gEth.getIp()[2], gEth.getIp()[3]);
casiotone401 15:3e4bc47d6a39 1830
casiotone401 4:b9f5ae574447 1831 wait(1.0);
casiotone401 0:a4d93cd4c30d 1832
casiotone401 0:a4d93cd4c30d 1833 return 0;
casiotone401 0:a4d93cd4c30d 1834 }
casiotone401 0:a4d93cd4c30d 1835
casiotone401 0:a4d93cd4c30d 1836 //-------------------------------------------------------------
casiotone401 14:977f3c5a4b4e 1837 // Fast strlen function http://www.strchr.com/optimized_strlen_function
casiotone401 14:977f3c5a4b4e 1838
casiotone401 14:977f3c5a4b4e 1839 size_t strlength(const char *s)
casiotone401 14:977f3c5a4b4e 1840 {
casiotone401 14:977f3c5a4b4e 1841 size_t len = 0;
casiotone401 14:977f3c5a4b4e 1842
casiotone401 15:3e4bc47d6a39 1843 for (;;)
casiotone401 14:977f3c5a4b4e 1844 {
casiotone401 14:977f3c5a4b4e 1845 unsigned x = *(unsigned*)s;
casiotone401 15:3e4bc47d6a39 1846 if ((x & 0xFF) == 0) return len;
casiotone401 15:3e4bc47d6a39 1847 if ((x & 0xFF00) == 0) return len + 1;
casiotone401 15:3e4bc47d6a39 1848 if ((x & 0xFF0000) == 0) return len + 2;
casiotone401 15:3e4bc47d6a39 1849 if ((x & 0xFF000000) == 0) return len + 3;
casiotone401 14:977f3c5a4b4e 1850 s += 4, len += 4;
casiotone401 14:977f3c5a4b4e 1851 }
casiotone401 14:977f3c5a4b4e 1852 }
casiotone401 14:977f3c5a4b4e 1853
casiotone401 14:977f3c5a4b4e 1854 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 1855 // Handller receive OSC UDP Packet
casiotone401 0:a4d93cd4c30d 1856
casiotone401 4:b9f5ae574447 1857 inline void onUDPSocketEvent(UDPSocketEvent e)
casiotone401 0:a4d93cd4c30d 1858 {
casiotone401 15:3e4bc47d6a39 1859 static union OSCarg msg[10];
casiotone401 15:3e4bc47d6a39 1860 static char buf[896] = {0};
casiotone401 15:3e4bc47d6a39 1861 static int recvlen;
casiotone401 15:3e4bc47d6a39 1862 static int num, len, offset;
casiotone401 14:977f3c5a4b4e 1863 int messagepos = 0;
casiotone401 14:977f3c5a4b4e 1864 bool bundleflag = false;
casiotone401 10:ccfeb687c3f2 1865
casiotone401 10:ccfeb687c3f2 1866 Host host;
casiotone401 10:ccfeb687c3f2 1867
casiotone401 15:3e4bc47d6a39 1868 switch (e)
casiotone401 0:a4d93cd4c30d 1869 {
casiotone401 4:b9f5ae574447 1870 case UDPSOCKET_READABLE: // The only event for now
casiotone401 15:3e4bc47d6a39 1871
casiotone401 15:3e4bc47d6a39 1872 recvlen = gUdp.recvfrom(buf, 896, &host); // packet length
casiotone401 10:ccfeb687c3f2 1873
casiotone401 15:3e4bc47d6a39 1874 if (recvlen <= 0) break;
casiotone401 15:3e4bc47d6a39 1875
casiotone401 15:3e4bc47d6a39 1876 if (!bundleflag && buf[0] == '#') // #bundle
casiotone401 0:a4d93cd4c30d 1877 {
casiotone401 10:ccfeb687c3f2 1878 messagepos += 16; // skip #bundle & timetag
casiotone401 10:ccfeb687c3f2 1879 recvlen -= 16;
casiotone401 0:a4d93cd4c30d 1880
casiotone401 10:ccfeb687c3f2 1881 bundleflag = true;
casiotone401 10:ccfeb687c3f2 1882 }
casiotone401 10:ccfeb687c3f2 1883
casiotone401 10:ccfeb687c3f2 1884 do {
casiotone401 15:3e4bc47d6a39 1885 if (bundleflag)
casiotone401 10:ccfeb687c3f2 1886 {
casiotone401 10:ccfeb687c3f2 1887 messagepos += 4;
casiotone401 10:ccfeb687c3f2 1888 recvlen -= 4;
casiotone401 15:3e4bc47d6a39 1889
casiotone401 15:3e4bc47d6a39 1890 if (recvlen <= 8)
casiotone401 10:ccfeb687c3f2 1891 {
casiotone401 10:ccfeb687c3f2 1892 bundleflag = false;
casiotone401 10:ccfeb687c3f2 1893 break;
casiotone401 10:ccfeb687c3f2 1894 }
casiotone401 10:ccfeb687c3f2 1895 }
casiotone401 10:ccfeb687c3f2 1896
casiotone401 15:3e4bc47d6a39 1897 if (getOSCmsg(buf + messagepos, msg) == -1) continue;
casiotone401 4:b9f5ae574447 1898
casiotone401 15:3e4bc47d6a39 1899 len = strlength(msg[0].address);
casiotone401 10:ccfeb687c3f2 1900
casiotone401 15:3e4bc47d6a39 1901 if (isdigit(msg[0].address[len-1]))
casiotone401 10:ccfeb687c3f2 1902 {
casiotone401 10:ccfeb687c3f2 1903 num = msg[0].address[len-1] - '0' - 1;
casiotone401 15:3e4bc47d6a39 1904
casiotone401 15:3e4bc47d6a39 1905 offset = 1;
casiotone401 15:3e4bc47d6a39 1906
casiotone401 15:3e4bc47d6a39 1907 if (isdigit(msg[0].address[len-2]))
casiotone401 15:3e4bc47d6a39 1908 {
casiotone401 15:3e4bc47d6a39 1909 offset = 2;
casiotone401 15:3e4bc47d6a39 1910 num += 10;
casiotone401 15:3e4bc47d6a39 1911 }
casiotone401 15:3e4bc47d6a39 1912
casiotone401 10:ccfeb687c3f2 1913 } else {
casiotone401 0:a4d93cd4c30d 1914
casiotone401 10:ccfeb687c3f2 1915 num = -1;
casiotone401 10:ccfeb687c3f2 1916 }
casiotone401 10:ccfeb687c3f2 1917
casiotone401 10:ccfeb687c3f2 1918 // address pattern SYNC & GATE (Type Tag int, float)
casiotone401 17:55e5136790a6 1919 if (!strncmp(msg[0].address + (len - offset) - 4, "sync", 4))
casiotone401 10:ccfeb687c3f2 1920 {
casiotone401 15:3e4bc47d6a39 1921 if (msg[2].i != 0) gCLOCKOUT = true;
casiotone401 15:3e4bc47d6a39 1922 else gCLOCKOUT = false;
casiotone401 10:ccfeb687c3f2 1923 continue;
casiotone401 10:ccfeb687c3f2 1924
casiotone401 17:55e5136790a6 1925 } else if (!strncmp(msg[0].address + (len - offset) - 4, "gate", 4) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 1926 if (num > 3) continue;
casiotone401 15:3e4bc47d6a39 1927 if (msg[2].i != 0) gGATES[num] = true;
casiotone401 15:3e4bc47d6a39 1928 else gGATES[num] = false;
casiotone401 10:ccfeb687c3f2 1929 continue;
casiotone401 10:ccfeb687c3f2 1930 // (touchOSC Control push, toggle)
casiotone401 17:55e5136790a6 1931 } else if (!strncmp(msg[0].address + (len - offset) - 5, "fader", 5) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 1932 if (num > 7) continue;
casiotone401 15:3e4bc47d6a39 1933 gOSC_cv[num] = msg[2].f * (SCALING_N);
casiotone401 10:ccfeb687c3f2 1934 continue;
casiotone401 15:3e4bc47d6a39 1935
casiotone401 17:55e5136790a6 1936 } else if (!strncmp(msg[0].address + (len - offset) - 9, "multixy1/", 9) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 1937 if (num > 7) continue;
casiotone401 15:3e4bc47d6a39 1938 if (msg[1].typeTag[1] == 'f') gOSC_cv[num] = msg[2].f * (SCALING_N);
casiotone401 15:3e4bc47d6a39 1939 if (msg[1].typeTag[1] == 'f') gOSC_cv[++num] = msg[3].f * (SCALING_N);
casiotone401 10:ccfeb687c3f2 1940 continue;
casiotone401 10:ccfeb687c3f2 1941
casiotone401 17:55e5136790a6 1942 } else if (!strncmp(msg[0].address + (len - offset) -12, "multifader1/", 12) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 1943 if (num > 7) continue;
casiotone401 15:3e4bc47d6a39 1944 if (msg[1].typeTag[1] == 'f') gOSC_cv[num] = msg[2].f * (SCALING_N);
casiotone401 10:ccfeb687c3f2 1945 continue;
casiotone401 15:3e4bc47d6a39 1946
casiotone401 17:55e5136790a6 1947 } else if (!strncmp(msg[0].address + (len - offset) -10, "sequencer/", 10) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 1948 if (num > 15) continue;
casiotone401 15:3e4bc47d6a39 1949 gSeq_cv[num] = msg[2].f * (SCALING_N);
casiotone401 10:ccfeb687c3f2 1950 continue;
casiotone401 0:a4d93cd4c30d 1951
casiotone401 17:55e5136790a6 1952 } else if (!strncmp(msg[0].address + (len - offset) - 6, "ctrlsw", 6) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 1953 if (num > 7) continue;
casiotone401 15:3e4bc47d6a39 1954 if (msg[2].i != 0) gCtrlSW[num] = true;
casiotone401 14:977f3c5a4b4e 1955 else gCtrlSW[num] = false;
casiotone401 10:ccfeb687c3f2 1956 continue;
casiotone401 4:b9f5ae574447 1957
casiotone401 17:55e5136790a6 1958 } else if (!strncmp(msg[0].address + (len - offset) - 4, "ctrl", 4) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 1959 if (num > 7) continue;
casiotone401 15:3e4bc47d6a39 1960 gCtrl[num] = msg[2].f;
casiotone401 15:3e4bc47d6a39 1961 continue;
casiotone401 15:3e4bc47d6a39 1962
casiotone401 17:55e5136790a6 1963 } else if (!strncmp(msg[0].address + (len - offset) - 9, "pulsecnt/", 9) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 1964 if (num > 7) continue;
casiotone401 15:3e4bc47d6a39 1965 gPulseCount[num] = msg[2].f;
casiotone401 15:3e4bc47d6a39 1966 continue;
casiotone401 15:3e4bc47d6a39 1967
casiotone401 17:55e5136790a6 1968 } else if (!strncmp(msg[0].address + (len - offset) - 9, "gatemode/", 9) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 1969 if (num > 15) continue;
casiotone401 15:3e4bc47d6a39 1970 gGateMode[num] = msg[2].f;
casiotone401 15:3e4bc47d6a39 1971 continue;
casiotone401 15:3e4bc47d6a39 1972
casiotone401 17:55e5136790a6 1973 } else if (!strncmp(msg[0].address + (len - offset) - 6, "slide/", 6) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 1974 if (num > 15) continue;
casiotone401 15:3e4bc47d6a39 1975 gSlide[num] = msg[2].f;
casiotone401 15:3e4bc47d6a39 1976 continue;
casiotone401 15:3e4bc47d6a39 1977
casiotone401 17:55e5136790a6 1978 } else if (!strncmp(msg[0].address + (len - offset-2) - 7, "accent/", 7) && (num != -1)) {
casiotone401 17:55e5136790a6 1979
casiotone401 17:55e5136790a6 1980 if (isdigit(msg[0].address[len-3]))
casiotone401 17:55e5136790a6 1981 {
casiotone401 17:55e5136790a6 1982 num = msg[0].address[len-3] - '0' - 1;
casiotone401 17:55e5136790a6 1983 }
casiotone401 17:55e5136790a6 1984
casiotone401 17:55e5136790a6 1985 gAccent[num] = msg[2].i;
casiotone401 17:55e5136790a6 1986 continue;
casiotone401 17:55e5136790a6 1987
casiotone401 17:55e5136790a6 1988 } else if (!strncmp(msg[0].address + (len - offset-3) - 7, "accent/", 7) && (num != -1)) {
casiotone401 17:55e5136790a6 1989
casiotone401 17:55e5136790a6 1990 if (isdigit(msg[0].address[len-3]))
casiotone401 17:55e5136790a6 1991 {
casiotone401 17:55e5136790a6 1992 num = msg[0].address[len-3] - '0' - 1;
casiotone401 17:55e5136790a6 1993
casiotone401 17:55e5136790a6 1994 if (isdigit(msg[0].address[len-4]))
casiotone401 17:55e5136790a6 1995 {
casiotone401 17:55e5136790a6 1996 num += 10;
casiotone401 17:55e5136790a6 1997 }
casiotone401 17:55e5136790a6 1998 }
casiotone401 17:55e5136790a6 1999
casiotone401 17:55e5136790a6 2000 gAccent[num] = msg[2].i;
casiotone401 17:55e5136790a6 2001 continue;
casiotone401 17:55e5136790a6 2002
casiotone401 17:55e5136790a6 2003 } else if (!strncmp(msg[0].address + (len - offset) - 4, "euca", 4) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 2004 if (num > 5) continue;
casiotone401 15:3e4bc47d6a39 2005 gEucA[num] = msg[2].f;
casiotone401 15:3e4bc47d6a39 2006 continue;
casiotone401 15:3e4bc47d6a39 2007
casiotone401 17:55e5136790a6 2008 } else if (!strncmp(msg[0].address + (len - offset) - 4, "eucb", 4) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 2009 if (num > 5) continue;
casiotone401 15:3e4bc47d6a39 2010 gEucB[num] = msg[2].f;
casiotone401 15:3e4bc47d6a39 2011 continue;
casiotone401 15:3e4bc47d6a39 2012
casiotone401 15:3e4bc47d6a39 2013 } else {
casiotone401 10:ccfeb687c3f2 2014 continue;
casiotone401 10:ccfeb687c3f2 2015 }
casiotone401 10:ccfeb687c3f2 2016
casiotone401 15:3e4bc47d6a39 2017 } while (bundleflag);
casiotone401 15:3e4bc47d6a39 2018 }
casiotone401 15:3e4bc47d6a39 2019 }
casiotone401 15:3e4bc47d6a39 2020
casiotone401 15:3e4bc47d6a39 2021 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 2022 // Euclidean Sequencer
casiotone401 15:3e4bc47d6a39 2023
casiotone401 15:3e4bc47d6a39 2024 void EuclideanSeq(int trigger, bool reset, bool gatesoff) {
casiotone401 15:3e4bc47d6a39 2025 /*
casiotone401 15:3e4bc47d6a39 2026 What's in the loop:
casiotone401 15:3e4bc47d6a39 2027 Update euc_time variable
casiotone401 15:3e4bc47d6a39 2028 Check to see if it is euc_time go go to sleep
casiotone401 15:3e4bc47d6a39 2029 Changes routine - update beat_holder when channelbeats changes - triggered by changes == true
casiotone401 15:3e4bc47d6a39 2030 Trigger routines - on trigget update displays and pulse
casiotone401 15:3e4bc47d6a39 2031 Read encoders
casiotone401 15:3e4bc47d6a39 2032 Read switches
casiotone401 15:3e4bc47d6a39 2033 */
casiotone401 15:3e4bc47d6a39 2034
casiotone401 15:3e4bc47d6a39 2035 static uint8_t nn, kk, oo;
casiotone401 15:3e4bc47d6a39 2036 static uint8_t changes[MAXCHANNELS] = {0};
casiotone401 15:3e4bc47d6a39 2037 static int nknob, kknob, oknob;
casiotone401 15:3e4bc47d6a39 2038 static int _nknob, _kknob, _oknob;
casiotone401 15:3e4bc47d6a39 2039 static bool triggerState = false;
casiotone401 15:3e4bc47d6a39 2040
casiotone401 15:3e4bc47d6a39 2041 uint8_t i, ch;
casiotone401 15:3e4bc47d6a39 2042 uint8_t maxn = MAXSTEPS; // maximums and minimums for n and k
casiotone401 15:3e4bc47d6a39 2043 uint8_t minn = 1;
casiotone401 15:3e4bc47d6a39 2044 uint8_t mink = 1;
casiotone401 15:3e4bc47d6a39 2045 uint8_t mino = 0;
casiotone401 15:3e4bc47d6a39 2046
casiotone401 15:3e4bc47d6a39 2047 static uint8_t active_channel;
casiotone401 15:3e4bc47d6a39 2048
casiotone401 15:3e4bc47d6a39 2049 euc_time = gTimer.read_ms();
casiotone401 15:3e4bc47d6a39 2050
casiotone401 15:3e4bc47d6a39 2051 nn = channelbeats[active_channel][0];
casiotone401 15:3e4bc47d6a39 2052 kk = channelbeats[active_channel][1];
casiotone401 15:3e4bc47d6a39 2053 oo = channelbeats[active_channel][3];
casiotone401 15:3e4bc47d6a39 2054
casiotone401 15:3e4bc47d6a39 2055 // UPDATE BEAT HOLDER WHEN KNOBS ARE MOVED
casiotone401 15:3e4bc47d6a39 2056 if (changes[active_channel]) {
casiotone401 15:3e4bc47d6a39 2057
casiotone401 15:3e4bc47d6a39 2058 beat_holder[active_channel] = Euclid(nn, kk, oo);
casiotone401 15:3e4bc47d6a39 2059
casiotone401 15:3e4bc47d6a39 2060 switch (changes[active_channel])
casiotone401 15:3e4bc47d6a39 2061 {
casiotone401 15:3e4bc47d6a39 2062 case 1:
casiotone401 15:3e4bc47d6a39 2063 case 3:
casiotone401 15:3e4bc47d6a39 2064 for (int i = 0; i < MAXSTEPS; ++i) {
casiotone401 15:3e4bc47d6a39 2065
casiotone401 15:3e4bc47d6a39 2066 if (BitRead(beat_holder[active_channel], nn - 1 - i) && (i < nn)) {
casiotone401 15:3e4bc47d6a39 2067 sendMes.setTopAddress(SetMatrixAddress(active_channel * 2, i, true));
casiotone401 15:3e4bc47d6a39 2068 sendMes.setArgs("i", 1);
casiotone401 15:3e4bc47d6a39 2069 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 2070
casiotone401 15:3e4bc47d6a39 2071 } else {
casiotone401 15:3e4bc47d6a39 2072
casiotone401 15:3e4bc47d6a39 2073 sendMes.setTopAddress(SetMatrixAddress(active_channel * 2, i, true));
casiotone401 15:3e4bc47d6a39 2074 sendMes.setArgs("i", 0);
casiotone401 15:3e4bc47d6a39 2075 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 2076 }
casiotone401 15:3e4bc47d6a39 2077 }
casiotone401 15:3e4bc47d6a39 2078
casiotone401 15:3e4bc47d6a39 2079 break;
casiotone401 15:3e4bc47d6a39 2080
casiotone401 15:3e4bc47d6a39 2081 case 2:
casiotone401 15:3e4bc47d6a39 2082 for (int i = 0; i < MAXSTEPS; ++i) {
casiotone401 15:3e4bc47d6a39 2083
casiotone401 15:3e4bc47d6a39 2084 if (i < nn) {
casiotone401 15:3e4bc47d6a39 2085 sendMes.setTopAddress(SetMatrixAddress(active_channel * 2, i, true));
casiotone401 15:3e4bc47d6a39 2086 sendMes.setArgs("i", 1);
casiotone401 15:3e4bc47d6a39 2087 osc.sendOsc(&sendMes);
casiotone401 10:ccfeb687c3f2 2088
casiotone401 15:3e4bc47d6a39 2089 } else {
casiotone401 15:3e4bc47d6a39 2090
casiotone401 15:3e4bc47d6a39 2091 sendMes.setTopAddress(SetMatrixAddress(active_channel * 2, i, true));
casiotone401 15:3e4bc47d6a39 2092 sendMes.setArgs("i", 0);
casiotone401 15:3e4bc47d6a39 2093 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 2094 }
casiotone401 15:3e4bc47d6a39 2095 }
casiotone401 15:3e4bc47d6a39 2096
casiotone401 15:3e4bc47d6a39 2097 break;
casiotone401 15:3e4bc47d6a39 2098
casiotone401 15:3e4bc47d6a39 2099 default:
casiotone401 15:3e4bc47d6a39 2100 break;
casiotone401 15:3e4bc47d6a39 2101 }
casiotone401 15:3e4bc47d6a39 2102
casiotone401 15:3e4bc47d6a39 2103 changes[active_channel] = 0;
casiotone401 15:3e4bc47d6a39 2104 last_changed[active_channel] = gTimer.read_ms();
casiotone401 15:3e4bc47d6a39 2105 }
casiotone401 15:3e4bc47d6a39 2106
casiotone401 15:3e4bc47d6a39 2107 // ANALOG PULSE TRIGGER
casiotone401 15:3e4bc47d6a39 2108 if (trigger && !triggerState) {
casiotone401 15:3e4bc47d6a39 2109
casiotone401 15:3e4bc47d6a39 2110 Sync(active_channel, gatesoff);
casiotone401 15:3e4bc47d6a39 2111 triggerState = true;
casiotone401 15:3e4bc47d6a39 2112
casiotone401 15:3e4bc47d6a39 2113 } else if (!trigger) {
casiotone401 15:3e4bc47d6a39 2114
casiotone401 15:3e4bc47d6a39 2115 triggerState = false;
casiotone401 15:3e4bc47d6a39 2116 }
casiotone401 15:3e4bc47d6a39 2117
casiotone401 15:3e4bc47d6a39 2118 // READ K KNOB
casiotone401 15:3e4bc47d6a39 2119 kknob = EncodeReadK(active_channel);
casiotone401 15:3e4bc47d6a39 2120
casiotone401 15:3e4bc47d6a39 2121 if (_kknob != kknob) {
casiotone401 15:3e4bc47d6a39 2122
casiotone401 15:3e4bc47d6a39 2123 _kknob = kknob;
casiotone401 15:3e4bc47d6a39 2124
casiotone401 15:3e4bc47d6a39 2125 if (kknob != 0 && (euc_time - last_read[active_channel] > READ_DELAY)) {
casiotone401 15:3e4bc47d6a39 2126
casiotone401 15:3e4bc47d6a39 2127 if ((kk + kknob) > nn) {
casiotone401 15:3e4bc47d6a39 2128
casiotone401 15:3e4bc47d6a39 2129 kknob = 0;
casiotone401 15:3e4bc47d6a39 2130 kk = nn;
casiotone401 15:3e4bc47d6a39 2131
casiotone401 15:3e4bc47d6a39 2132 } else if ((kk + kknob) < mink) {
casiotone401 15:3e4bc47d6a39 2133
casiotone401 15:3e4bc47d6a39 2134 kknob = 0;
casiotone401 15:3e4bc47d6a39 2135 kk = mink;
casiotone401 15:3e4bc47d6a39 2136 };
casiotone401 15:3e4bc47d6a39 2137
casiotone401 15:3e4bc47d6a39 2138 kk = channelbeats[active_channel][1] = (kk + kknob); // update with encoder reading
casiotone401 15:3e4bc47d6a39 2139
casiotone401 15:3e4bc47d6a39 2140 last_read[active_channel] = gTimer.read_ms();
casiotone401 15:3e4bc47d6a39 2141 changes[active_channel] = 1; // k change = 1
casiotone401 15:3e4bc47d6a39 2142 }
casiotone401 15:3e4bc47d6a39 2143 }
casiotone401 15:3e4bc47d6a39 2144
casiotone401 15:3e4bc47d6a39 2145 // READ N KNOB
casiotone401 15:3e4bc47d6a39 2146 nknob = EncodeReadN(active_channel);
casiotone401 15:3e4bc47d6a39 2147
casiotone401 15:3e4bc47d6a39 2148 if (_nknob != nknob) {
casiotone401 15:3e4bc47d6a39 2149
casiotone401 15:3e4bc47d6a39 2150 _nknob = nknob;
casiotone401 15:3e4bc47d6a39 2151
casiotone401 15:3e4bc47d6a39 2152 if (nknob != 0 && (euc_time - last_read[active_channel] > READ_DELAY)) {
casiotone401 15:3e4bc47d6a39 2153
casiotone401 15:3e4bc47d6a39 2154 if ((nn + nknob) > maxn) {
casiotone401 15:3e4bc47d6a39 2155
casiotone401 15:3e4bc47d6a39 2156 nknob = 0;
casiotone401 15:3e4bc47d6a39 2157 nn = maxn;
casiotone401 15:3e4bc47d6a39 2158
casiotone401 15:3e4bc47d6a39 2159 } else if ((nn + nknob) < minn) {
casiotone401 15:3e4bc47d6a39 2160
casiotone401 15:3e4bc47d6a39 2161 nknob = 0;
casiotone401 15:3e4bc47d6a39 2162 nn = minn;
casiotone401 15:3e4bc47d6a39 2163 };
casiotone401 15:3e4bc47d6a39 2164
casiotone401 15:3e4bc47d6a39 2165 if (kk > (nn + nknob)) {// check if new n is lower than k + reduce K if it is
casiotone401 15:3e4bc47d6a39 2166 channelbeats[active_channel][1] = (nn + nknob);
casiotone401 15:3e4bc47d6a39 2167 };
casiotone401 15:3e4bc47d6a39 2168
casiotone401 15:3e4bc47d6a39 2169 if (oo > (nn + nknob - 1)) {// check if new n is lower than o + reduce o if it is
casiotone401 15:3e4bc47d6a39 2170 channelbeats[active_channel][3] = (nn + nknob - 1);
casiotone401 15:3e4bc47d6a39 2171 };
casiotone401 15:3e4bc47d6a39 2172
casiotone401 15:3e4bc47d6a39 2173 nn = channelbeats[active_channel][0] = (nn + nknob); // update with encoder reading
casiotone401 15:3e4bc47d6a39 2174 oo = channelbeats[active_channel][3];
casiotone401 15:3e4bc47d6a39 2175
casiotone401 15:3e4bc47d6a39 2176 last_read[active_channel] = gTimer.read_ms();
casiotone401 15:3e4bc47d6a39 2177 changes[active_channel] = 2; // n change = 2
casiotone401 15:3e4bc47d6a39 2178 }
casiotone401 15:3e4bc47d6a39 2179
casiotone401 15:3e4bc47d6a39 2180 }
casiotone401 15:3e4bc47d6a39 2181
casiotone401 15:3e4bc47d6a39 2182 // READ O KNOB
casiotone401 15:3e4bc47d6a39 2183 oknob = EncodeReadO(active_channel);
casiotone401 15:3e4bc47d6a39 2184
casiotone401 15:3e4bc47d6a39 2185 if (_oknob != oknob) {
casiotone401 15:3e4bc47d6a39 2186
casiotone401 15:3e4bc47d6a39 2187 _oknob = oknob;
casiotone401 15:3e4bc47d6a39 2188
casiotone401 15:3e4bc47d6a39 2189 if (oknob != 0 && (euc_time - last_read[active_channel] > READ_DELAY)) {
casiotone401 15:3e4bc47d6a39 2190 // Sense check o encoder reading to prevent crashes
casiotone401 15:3e4bc47d6a39 2191
casiotone401 15:3e4bc47d6a39 2192 if ((oo + oknob) > (nn - 1)) {
casiotone401 15:3e4bc47d6a39 2193
casiotone401 15:3e4bc47d6a39 2194 oknob = 0;
casiotone401 15:3e4bc47d6a39 2195 oo = (nn - 1);
casiotone401 15:3e4bc47d6a39 2196
casiotone401 15:3e4bc47d6a39 2197 } else if ((oo + oknob) < mino) {
casiotone401 15:3e4bc47d6a39 2198
casiotone401 15:3e4bc47d6a39 2199 oknob = 0;
casiotone401 15:3e4bc47d6a39 2200 oo = mino;
casiotone401 15:3e4bc47d6a39 2201 }
casiotone401 15:3e4bc47d6a39 2202
casiotone401 15:3e4bc47d6a39 2203 channelbeats[active_channel][3] = (oo + oknob);
casiotone401 15:3e4bc47d6a39 2204
casiotone401 15:3e4bc47d6a39 2205 last_read[active_channel] = gTimer.read_ms();
casiotone401 15:3e4bc47d6a39 2206 changes[active_channel] = 3; // o change = 3
casiotone401 15:3e4bc47d6a39 2207 }
casiotone401 15:3e4bc47d6a39 2208
casiotone401 15:3e4bc47d6a39 2209 }
casiotone401 15:3e4bc47d6a39 2210
casiotone401 15:3e4bc47d6a39 2211 // ENABLE RESET BUTTON ** ADD FLASH RESET HERE ***
casiotone401 15:3e4bc47d6a39 2212 if (gCtrlSW[1] && channelbeats[active_channel][2]) {
casiotone401 15:3e4bc47d6a39 2213
casiotone401 15:3e4bc47d6a39 2214 for (ch = 0; ch < channels; ++ch) {
casiotone401 15:3e4bc47d6a39 2215 channelbeats[ch][2] = 0;
casiotone401 15:3e4bc47d6a39 2216 }
casiotone401 15:3e4bc47d6a39 2217 }
casiotone401 15:3e4bc47d6a39 2218
casiotone401 15:3e4bc47d6a39 2219 // Stop & Reset (gCtrlSW[0])
casiotone401 15:3e4bc47d6a39 2220 if (reset) {
casiotone401 15:3e4bc47d6a39 2221
casiotone401 15:3e4bc47d6a39 2222 for (ch = 0; ch < channels; ++ch) {
casiotone401 15:3e4bc47d6a39 2223
casiotone401 15:3e4bc47d6a39 2224 channelbeats[ch][2] = 0;
casiotone401 15:3e4bc47d6a39 2225
casiotone401 15:3e4bc47d6a39 2226 for (i = 0; i < MAXSTEPS; ++i) {
casiotone401 15:3e4bc47d6a39 2227
casiotone401 15:3e4bc47d6a39 2228 sendMes.setTopAddress(SetMatrixAddress(ch * 2 + 1, i, true));
casiotone401 15:3e4bc47d6a39 2229 sendMes.setArgs("i", 0);
casiotone401 15:3e4bc47d6a39 2230 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 2231 }
casiotone401 15:3e4bc47d6a39 2232
casiotone401 15:3e4bc47d6a39 2233 }
casiotone401 15:3e4bc47d6a39 2234
casiotone401 15:3e4bc47d6a39 2235 }
casiotone401 15:3e4bc47d6a39 2236
casiotone401 15:3e4bc47d6a39 2237 // TURN OFF ANY LIGHTS THAT ARE ON
casiotone401 15:3e4bc47d6a39 2238 if ((euc_time - last_sync) > pulse_length && lights_active) {
casiotone401 15:3e4bc47d6a39 2239
casiotone401 15:3e4bc47d6a39 2240 for (ch = 0; ch < channels; ++ch) {
casiotone401 15:3e4bc47d6a39 2241 sendMes.setTopAddress(SetMatrixAddress((MAXCHANNELS * 2), 3 - ch, true));
casiotone401 15:3e4bc47d6a39 2242 sendMes.setArgs("i", 0);
casiotone401 15:3e4bc47d6a39 2243 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 2244
casiotone401 15:3e4bc47d6a39 2245 sendMes.setTopAddress(SetMatrixAddress((MAXCHANNELS * 2), 5, true));
casiotone401 15:3e4bc47d6a39 2246 sendMes.setArgs("i", 0);
casiotone401 15:3e4bc47d6a39 2247 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 2248
casiotone401 15:3e4bc47d6a39 2249 }
casiotone401 15:3e4bc47d6a39 2250
casiotone401 15:3e4bc47d6a39 2251 lights_active = false;
casiotone401 15:3e4bc47d6a39 2252 }
casiotone401 15:3e4bc47d6a39 2253
casiotone401 15:3e4bc47d6a39 2254 // FINISH ANY PULSES THAT ARE ACTIVE - PULSES LAST 1/4 AS LONG AS LIGHTS
casiotone401 15:3e4bc47d6a39 2255 if (euc_time - last_sync > (pulse_length / 4) && pulses_active) {
casiotone401 15:3e4bc47d6a39 2256
casiotone401 15:3e4bc47d6a39 2257 for (ch = 0; ch < channels; ++ch) {
casiotone401 15:3e4bc47d6a39 2258
casiotone401 15:3e4bc47d6a39 2259 if (!gatesoff)
casiotone401 15:3e4bc47d6a39 2260 {
casiotone401 15:3e4bc47d6a39 2261 gGATES[ch] = false;
casiotone401 15:3e4bc47d6a39 2262 gCLOCKOUT = false;
casiotone401 15:3e4bc47d6a39 2263 //digitalWrite(sparepin, LOW);
casiotone401 15:3e4bc47d6a39 2264 }
casiotone401 15:3e4bc47d6a39 2265 }
casiotone401 15:3e4bc47d6a39 2266
casiotone401 15:3e4bc47d6a39 2267 pulses_active = false;
casiotone401 15:3e4bc47d6a39 2268 }
casiotone401 15:3e4bc47d6a39 2269
casiotone401 15:3e4bc47d6a39 2270 ++active_channel;
casiotone401 15:3e4bc47d6a39 2271 active_channel &= (channels - 1);
casiotone401 15:3e4bc47d6a39 2272 }
casiotone401 15:3e4bc47d6a39 2273
casiotone401 15:3e4bc47d6a39 2274 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 2275 // Euclid calculation function
casiotone401 15:3e4bc47d6a39 2276
casiotone401 15:3e4bc47d6a39 2277 unsigned int Euclid(int n, int k, int o) { // inputs: n=total, k=beats, o = offset
casiotone401 15:3e4bc47d6a39 2278 int pauses = (n - k);
casiotone401 15:3e4bc47d6a39 2279 int pulses = k;
casiotone401 15:3e4bc47d6a39 2280 int offset = o;
casiotone401 15:3e4bc47d6a39 2281 int steps = n;
casiotone401 15:3e4bc47d6a39 2282 int per_pulse = (pauses / k);
casiotone401 15:3e4bc47d6a39 2283 int remainder = (pauses % pulses);
casiotone401 15:3e4bc47d6a39 2284 unsigned int workbeat[n];
casiotone401 15:3e4bc47d6a39 2285 unsigned int outbeat;
casiotone401 15:3e4bc47d6a39 2286 uint16_t outbeat2;
casiotone401 15:3e4bc47d6a39 2287 int workbeat_count = n;
casiotone401 15:3e4bc47d6a39 2288 int a_remainder, b_remainder;
casiotone401 15:3e4bc47d6a39 2289 int groupa, groupb;
casiotone401 15:3e4bc47d6a39 2290 int i, j;
casiotone401 15:3e4bc47d6a39 2291 int trim_count;
casiotone401 15:3e4bc47d6a39 2292
casiotone401 15:3e4bc47d6a39 2293 for (i = 0; i < n; ++i) { // Populate workbeat with unsorted pulses and pauses
casiotone401 15:3e4bc47d6a39 2294
casiotone401 15:3e4bc47d6a39 2295 if (i < pulses) {
casiotone401 15:3e4bc47d6a39 2296
casiotone401 15:3e4bc47d6a39 2297 workbeat[i] = 1;
casiotone401 15:3e4bc47d6a39 2298
casiotone401 15:3e4bc47d6a39 2299 } else {
casiotone401 15:3e4bc47d6a39 2300
casiotone401 15:3e4bc47d6a39 2301 workbeat[i] = 0;
casiotone401 15:3e4bc47d6a39 2302 }
casiotone401 15:3e4bc47d6a39 2303 }
casiotone401 15:3e4bc47d6a39 2304
casiotone401 15:3e4bc47d6a39 2305 if (per_pulse > 0 && remainder < 2) { // Handle easy cases where there is no or only one remainer
casiotone401 15:3e4bc47d6a39 2306
casiotone401 15:3e4bc47d6a39 2307 for (i = 0; i < pulses; ++i) {
casiotone401 15:3e4bc47d6a39 2308
casiotone401 15:3e4bc47d6a39 2309 for (j = (workbeat_count - 1); j > (workbeat_count - per_pulse - 1); --j) {
casiotone401 15:3e4bc47d6a39 2310 workbeat[i] = ConcatBin(workbeat[i], workbeat[j]);
casiotone401 15:3e4bc47d6a39 2311 }
casiotone401 15:3e4bc47d6a39 2312
casiotone401 15:3e4bc47d6a39 2313 workbeat_count = (workbeat_count - per_pulse);
casiotone401 15:3e4bc47d6a39 2314
casiotone401 15:3e4bc47d6a39 2315 }
casiotone401 15:3e4bc47d6a39 2316
casiotone401 15:3e4bc47d6a39 2317 outbeat = 0; // Concatenate workbeat into outbeat - according to workbeat_count
casiotone401 15:3e4bc47d6a39 2318
casiotone401 15:3e4bc47d6a39 2319 for (i = 0; i < workbeat_count; ++i) {
casiotone401 15:3e4bc47d6a39 2320 outbeat = ConcatBin(outbeat, workbeat[i]);
casiotone401 15:3e4bc47d6a39 2321 }
casiotone401 15:3e4bc47d6a39 2322
casiotone401 15:3e4bc47d6a39 2323
casiotone401 15:3e4bc47d6a39 2324 if (offset != 0) {
casiotone401 15:3e4bc47d6a39 2325
casiotone401 15:3e4bc47d6a39 2326 outbeat2 = BitReadOffset(offset, outbeat, steps); // Add offset to the step pattern
casiotone401 15:3e4bc47d6a39 2327
casiotone401 15:3e4bc47d6a39 2328 } else {
casiotone401 15:3e4bc47d6a39 2329
casiotone401 15:3e4bc47d6a39 2330 outbeat2 = outbeat;
casiotone401 15:3e4bc47d6a39 2331 }
casiotone401 15:3e4bc47d6a39 2332
casiotone401 15:3e4bc47d6a39 2333 return outbeat2;
casiotone401 15:3e4bc47d6a39 2334
casiotone401 15:3e4bc47d6a39 2335 } else {
casiotone401 15:3e4bc47d6a39 2336
casiotone401 15:3e4bc47d6a39 2337 groupa = pulses;
casiotone401 15:3e4bc47d6a39 2338 groupb = pauses;
casiotone401 15:3e4bc47d6a39 2339
casiotone401 15:3e4bc47d6a39 2340 while (groupb > 1) { //main recursive loop
casiotone401 15:3e4bc47d6a39 2341
casiotone401 15:3e4bc47d6a39 2342 if (groupa > groupb) { // more Group A than Group B
casiotone401 15:3e4bc47d6a39 2343
casiotone401 15:3e4bc47d6a39 2344 a_remainder = (groupa - groupb); // what will be left of groupa once groupB is interleaved
casiotone401 15:3e4bc47d6a39 2345 trim_count = 0;
casiotone401 15:3e4bc47d6a39 2346
casiotone401 15:3e4bc47d6a39 2347 for (i = 0; i < (groupa - a_remainder); ++i) { //count through the matching sets of A, ignoring remaindered
casiotone401 15:3e4bc47d6a39 2348 workbeat[i] = ConcatBin(workbeat[i], workbeat[workbeat_count - 1 - i]);
casiotone401 15:3e4bc47d6a39 2349 ++trim_count;
casiotone401 15:3e4bc47d6a39 2350 }
casiotone401 15:3e4bc47d6a39 2351
casiotone401 15:3e4bc47d6a39 2352 workbeat_count = (workbeat_count - trim_count);
casiotone401 15:3e4bc47d6a39 2353
casiotone401 15:3e4bc47d6a39 2354 groupa = groupb;
casiotone401 15:3e4bc47d6a39 2355 groupb = a_remainder;
casiotone401 15:3e4bc47d6a39 2356
casiotone401 15:3e4bc47d6a39 2357 } else if (groupb > groupa) { // More Group B than Group A
casiotone401 15:3e4bc47d6a39 2358
casiotone401 15:3e4bc47d6a39 2359 b_remainder = (groupb - groupa); // what will be left of group once group A is interleaved
casiotone401 15:3e4bc47d6a39 2360 trim_count = 0;
casiotone401 15:3e4bc47d6a39 2361
casiotone401 15:3e4bc47d6a39 2362 for (i = workbeat_count-1; i >= (groupa + b_remainder); --i) { //count from right back through the Bs
casiotone401 15:3e4bc47d6a39 2363 workbeat[workbeat_count - i - 1] = ConcatBin(workbeat[workbeat_count - 1 - i], workbeat[i]);
casiotone401 15:3e4bc47d6a39 2364
casiotone401 15:3e4bc47d6a39 2365 ++trim_count;
casiotone401 15:3e4bc47d6a39 2366 }
casiotone401 15:3e4bc47d6a39 2367
casiotone401 15:3e4bc47d6a39 2368 workbeat_count = (workbeat_count - trim_count);
casiotone401 15:3e4bc47d6a39 2369 groupb = b_remainder;
casiotone401 15:3e4bc47d6a39 2370
casiotone401 15:3e4bc47d6a39 2371 } else if (groupa == groupb) { // groupa = groupb
casiotone401 15:3e4bc47d6a39 2372
casiotone401 15:3e4bc47d6a39 2373 trim_count = 0;
casiotone401 15:3e4bc47d6a39 2374
casiotone401 15:3e4bc47d6a39 2375 for (i = 0; i < groupa; ++i) {
casiotone401 15:3e4bc47d6a39 2376 workbeat[i] = ConcatBin(workbeat[i], workbeat[workbeat_count - 1 - i]);
casiotone401 15:3e4bc47d6a39 2377 ++trim_count;
casiotone401 15:3e4bc47d6a39 2378 }
casiotone401 15:3e4bc47d6a39 2379
casiotone401 15:3e4bc47d6a39 2380 workbeat_count = (workbeat_count - trim_count);
casiotone401 15:3e4bc47d6a39 2381 groupb = 0;
casiotone401 15:3e4bc47d6a39 2382
casiotone401 15:3e4bc47d6a39 2383 }
casiotone401 15:3e4bc47d6a39 2384 }
casiotone401 15:3e4bc47d6a39 2385
casiotone401 15:3e4bc47d6a39 2386 outbeat = 0; // Concatenate workbeat into outbeat - according to workbeat_count
casiotone401 15:3e4bc47d6a39 2387
casiotone401 15:3e4bc47d6a39 2388 for (i = 0; i < workbeat_count; ++i) {
casiotone401 15:3e4bc47d6a39 2389
casiotone401 15:3e4bc47d6a39 2390 outbeat = ConcatBin(outbeat, workbeat[i]);
casiotone401 15:3e4bc47d6a39 2391 }
casiotone401 15:3e4bc47d6a39 2392
casiotone401 15:3e4bc47d6a39 2393 if (offset != 0) {
casiotone401 15:3e4bc47d6a39 2394
casiotone401 15:3e4bc47d6a39 2395 outbeat2 = BitReadOffset(offset, outbeat, steps); // Add offset to the step pattern
casiotone401 15:3e4bc47d6a39 2396
casiotone401 15:3e4bc47d6a39 2397 } else {
casiotone401 15:3e4bc47d6a39 2398
casiotone401 15:3e4bc47d6a39 2399 outbeat2 = outbeat;
casiotone401 15:3e4bc47d6a39 2400 }
casiotone401 15:3e4bc47d6a39 2401
casiotone401 15:3e4bc47d6a39 2402 return outbeat2;
casiotone401 10:ccfeb687c3f2 2403 }
casiotone401 10:ccfeb687c3f2 2404 }
casiotone401 15:3e4bc47d6a39 2405
casiotone401 15:3e4bc47d6a39 2406 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 2407 // Reads a bit of a number
casiotone401 15:3e4bc47d6a39 2408
casiotone401 15:3e4bc47d6a39 2409 inline int BitRead(uint16_t b, int bitPos) {
casiotone401 15:3e4bc47d6a39 2410 int x;
casiotone401 15:3e4bc47d6a39 2411
casiotone401 15:3e4bc47d6a39 2412 x = b & (1 << bitPos);
casiotone401 15:3e4bc47d6a39 2413
casiotone401 15:3e4bc47d6a39 2414 return x == 0 ? 0 : 1;
casiotone401 15:3e4bc47d6a39 2415 }
casiotone401 15:3e4bc47d6a39 2416
casiotone401 15:3e4bc47d6a39 2417 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 2418 // Function to right rotate n by d bits
casiotone401 15:3e4bc47d6a39 2419
casiotone401 15:3e4bc47d6a39 2420 uint16_t BitReadOffset(int shift, uint16_t value, uint16_t pattern_length) {
casiotone401 15:3e4bc47d6a39 2421 uint16_t mask = ((1 << pattern_length) - 1);
casiotone401 15:3e4bc47d6a39 2422 value &= mask;
casiotone401 15:3e4bc47d6a39 2423
casiotone401 15:3e4bc47d6a39 2424 return ((value >> shift) | (value << (pattern_length - shift))) & mask;
casiotone401 15:3e4bc47d6a39 2425 }
casiotone401 15:3e4bc47d6a39 2426
casiotone401 15:3e4bc47d6a39 2427 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 2428 // Function to find the binary length of a number by counting bitwise
casiotone401 15:3e4bc47d6a39 2429
casiotone401 15:3e4bc47d6a39 2430 int findlength(unsigned int bnry) {
casiotone401 15:3e4bc47d6a39 2431 bool lengthfound = false;
casiotone401 15:3e4bc47d6a39 2432 int i;
casiotone401 15:3e4bc47d6a39 2433 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 15:3e4bc47d6a39 2434
casiotone401 15:3e4bc47d6a39 2435 for (i = 32; i >= 0; i--) {
casiotone401 15:3e4bc47d6a39 2436
casiotone401 15:3e4bc47d6a39 2437 if ((BitRead(bnry, i)) && !lengthfound) {
casiotone401 15:3e4bc47d6a39 2438 length = (i + 1);
casiotone401 15:3e4bc47d6a39 2439 lengthfound = true;
casiotone401 15:3e4bc47d6a39 2440 }
casiotone401 15:3e4bc47d6a39 2441
casiotone401 15:3e4bc47d6a39 2442 }
casiotone401 15:3e4bc47d6a39 2443
casiotone401 15:3e4bc47d6a39 2444 return length;
casiotone401 15:3e4bc47d6a39 2445 }
casiotone401 15:3e4bc47d6a39 2446
casiotone401 15:3e4bc47d6a39 2447 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 2448 // Function to concatenate two binary numbers bitwise
casiotone401 15:3e4bc47d6a39 2449
casiotone401 15:3e4bc47d6a39 2450 unsigned int ConcatBin(unsigned int bina, unsigned int binb) {
casiotone401 15:3e4bc47d6a39 2451 int binb_len = findlength(binb);
casiotone401 15:3e4bc47d6a39 2452 unsigned int sum = (bina << binb_len);
casiotone401 15:3e4bc47d6a39 2453
casiotone401 15:3e4bc47d6a39 2454 sum = sum | binb;
casiotone401 15:3e4bc47d6a39 2455
casiotone401 15:3e4bc47d6a39 2456 return sum;
casiotone401 15:3e4bc47d6a39 2457 }
casiotone401 15:3e4bc47d6a39 2458
casiotone401 15:3e4bc47d6a39 2459 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 2460 // routine triggered by each beat
casiotone401 15:3e4bc47d6a39 2461
casiotone401 15:3e4bc47d6a39 2462 void Sync(int active_channel, bool gatesoff) {
casiotone401 15:3e4bc47d6a39 2463 int read_head, erase;
casiotone401 15:3e4bc47d6a39 2464 int rand_vel, rand_len;
casiotone401 15:3e4bc47d6a39 2465 int ch, i;
casiotone401 15:3e4bc47d6a39 2466 static int masterclock;
casiotone401 15:3e4bc47d6a39 2467
casiotone401 15:3e4bc47d6a39 2468 if (masterclock % 2 == 0) {
casiotone401 15:3e4bc47d6a39 2469 sendMes.setTopAddress(SetMatrixAddress((MAXCHANNELS * 2), 7, true));
casiotone401 15:3e4bc47d6a39 2470 sendMes.setArgs("i", 1);
casiotone401 15:3e4bc47d6a39 2471 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 2472
casiotone401 15:3e4bc47d6a39 2473 } else {
casiotone401 15:3e4bc47d6a39 2474
casiotone401 15:3e4bc47d6a39 2475 sendMes.setTopAddress(SetMatrixAddress((MAXCHANNELS * 2), 7, true));
casiotone401 15:3e4bc47d6a39 2476 sendMes.setArgs("i", 0);
casiotone401 15:3e4bc47d6a39 2477 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 2478 }
casiotone401 15:3e4bc47d6a39 2479
casiotone401 15:3e4bc47d6a39 2480 // Cycle through channels
casiotone401 15:3e4bc47d6a39 2481 for (ch = 0; ch < channels; ++ch) {
casiotone401 15:3e4bc47d6a39 2482
casiotone401 15:3e4bc47d6a39 2483 read_head = (channelbeats[ch][0] - channelbeats[ch][2] - 1);
casiotone401 15:3e4bc47d6a39 2484
casiotone401 15:3e4bc47d6a39 2485 if (ch != active_channel || (euc_time - last_changed[active_channel]) > DISPLAY_UPDATE) {
casiotone401 15:3e4bc47d6a39 2486
casiotone401 15:3e4bc47d6a39 2487 if (channelbeats[ch][2] < MAXSTEPS) {
casiotone401 15:3e4bc47d6a39 2488
casiotone401 15:3e4bc47d6a39 2489 for (i = 0; i < MAXSTEPS; ++i) {
casiotone401 15:3e4bc47d6a39 2490
casiotone401 15:3e4bc47d6a39 2491 if (BitRead(beat_holder[ch],channelbeats[ch][0] - 1 - i) && i < channelbeats[ch][0]) {
casiotone401 15:3e4bc47d6a39 2492
casiotone401 15:3e4bc47d6a39 2493 sendMes.setTopAddress(SetMatrixAddress(ch * 2, i, true));
casiotone401 15:3e4bc47d6a39 2494 sendMes.setArgs("i", 1);
casiotone401 15:3e4bc47d6a39 2495 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 2496
casiotone401 15:3e4bc47d6a39 2497 } else {
casiotone401 15:3e4bc47d6a39 2498
casiotone401 15:3e4bc47d6a39 2499 sendMes.setTopAddress(SetMatrixAddress(ch * 2, i, true));
casiotone401 15:3e4bc47d6a39 2500 sendMes.setArgs("i", 0);
casiotone401 15:3e4bc47d6a39 2501 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 2502 }
casiotone401 15:3e4bc47d6a39 2503
casiotone401 15:3e4bc47d6a39 2504 }
casiotone401 15:3e4bc47d6a39 2505 }
casiotone401 15:3e4bc47d6a39 2506 }
casiotone401 15:3e4bc47d6a39 2507
casiotone401 15:3e4bc47d6a39 2508 if (channelbeats[ch][2]) {
casiotone401 15:3e4bc47d6a39 2509
casiotone401 15:3e4bc47d6a39 2510 if (!masterclock) {
casiotone401 15:3e4bc47d6a39 2511
casiotone401 15:3e4bc47d6a39 2512 erase = MAXSTEPS - 1;
casiotone401 15:3e4bc47d6a39 2513
casiotone401 15:3e4bc47d6a39 2514 } else {
casiotone401 15:3e4bc47d6a39 2515
casiotone401 15:3e4bc47d6a39 2516 erase = masterclock - 1;
casiotone401 15:3e4bc47d6a39 2517 }
casiotone401 15:3e4bc47d6a39 2518
casiotone401 15:3e4bc47d6a39 2519 sendMes.setTopAddress(SetMatrixAddress((ch * 2) + 1, erase, true));
casiotone401 15:3e4bc47d6a39 2520 sendMes.setArgs("i", 0);
casiotone401 15:3e4bc47d6a39 2521 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 2522
casiotone401 15:3e4bc47d6a39 2523 sendMes.setTopAddress(SetMatrixAddress((ch * 2) + 1, masterclock, true));
casiotone401 15:3e4bc47d6a39 2524 sendMes.setArgs("i", 1);
casiotone401 15:3e4bc47d6a39 2525 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 2526
casiotone401 15:3e4bc47d6a39 2527 }
casiotone401 15:3e4bc47d6a39 2528
casiotone401 15:3e4bc47d6a39 2529 // turn on pulses on channels where a beat is present
casiotone401 15:3e4bc47d6a39 2530 if (BitRead(beat_holder[ch], read_head)) {
casiotone401 15:3e4bc47d6a39 2531
casiotone401 15:3e4bc47d6a39 2532 if (!gatesoff)
casiotone401 15:3e4bc47d6a39 2533 {
casiotone401 15:3e4bc47d6a39 2534 gGATES[ch] = true; // pulse out
casiotone401 15:3e4bc47d6a39 2535 }
casiotone401 15:3e4bc47d6a39 2536
casiotone401 15:3e4bc47d6a39 2537 sendMes.setTopAddress(SetMatrixAddress((MAXCHANNELS * 2), 3 - ch, true));
casiotone401 15:3e4bc47d6a39 2538 sendMes.setArgs("i", 1);
casiotone401 15:3e4bc47d6a39 2539 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 2540
casiotone401 15:3e4bc47d6a39 2541 lights_active = pulses_active = true;
casiotone401 15:3e4bc47d6a39 2542
casiotone401 15:3e4bc47d6a39 2543 if (!ch || (ch == 2)) {
casiotone401 15:3e4bc47d6a39 2544
casiotone401 15:3e4bc47d6a39 2545 rand_vel = 127 - (rand() / (RAND_MAX / 40)); // random velocity ch1, ch3
casiotone401 15:3e4bc47d6a39 2546
casiotone401 15:3e4bc47d6a39 2547 } else {
casiotone401 15:3e4bc47d6a39 2548
casiotone401 15:3e4bc47d6a39 2549 rand_vel = 95 - (rand() / (RAND_MAX / 70)); // random velocity ch2, ch4
casiotone401 15:3e4bc47d6a39 2550 }
casiotone401 15:3e4bc47d6a39 2551
casiotone401 15:3e4bc47d6a39 2552 rand_len = 127 - (rand() / (RAND_MAX / 110)); // random Amp EG Decay
casiotone401 15:3e4bc47d6a39 2553
casiotone401 15:3e4bc47d6a39 2554 midi.sendControlChange(0x07, rand_vel, (ch + 1)); // volca sample Vol
casiotone401 15:3e4bc47d6a39 2555 midi.sendControlChange(0x30, rand_len, (ch + 1)); // volca sample Amp EG Decay
casiotone401 15:3e4bc47d6a39 2556 midi.sendNoteOn(0, 127, (ch + 1)); // volca sample trriger on
casiotone401 15:3e4bc47d6a39 2557 }
casiotone401 15:3e4bc47d6a39 2558
casiotone401 15:3e4bc47d6a39 2559 // send off pulses to spare output for the first channel
casiotone401 15:3e4bc47d6a39 2560 if (!(BitRead(beat_holder[ch], read_head)) && !ch) { // only relates to first channel
casiotone401 15:3e4bc47d6a39 2561
casiotone401 15:3e4bc47d6a39 2562 if (!gatesoff)
casiotone401 15:3e4bc47d6a39 2563 {
casiotone401 15:3e4bc47d6a39 2564 gCLOCKOUT = true;
casiotone401 15:3e4bc47d6a39 2565 }
casiotone401 15:3e4bc47d6a39 2566
casiotone401 15:3e4bc47d6a39 2567 sendMes.setTopAddress(SetMatrixAddress((MAXCHANNELS * 2), 5, true));
casiotone401 15:3e4bc47d6a39 2568 sendMes.setArgs("i", 1);
casiotone401 15:3e4bc47d6a39 2569 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 2570
casiotone401 15:3e4bc47d6a39 2571 lights_active = pulses_active = true;
casiotone401 15:3e4bc47d6a39 2572 }
casiotone401 15:3e4bc47d6a39 2573
casiotone401 15:3e4bc47d6a39 2574 // move counter to next position, ready for next pulse
casiotone401 15:3e4bc47d6a39 2575 ++channelbeats[ch][2];
casiotone401 15:3e4bc47d6a39 2576
casiotone401 15:3e4bc47d6a39 2577 if ((channelbeats[ch][2]) >= (channelbeats[ch][0])) {
casiotone401 15:3e4bc47d6a39 2578 channelbeats[ch][2] = 0;
casiotone401 15:3e4bc47d6a39 2579 }
casiotone401 15:3e4bc47d6a39 2580 }
casiotone401 15:3e4bc47d6a39 2581
casiotone401 15:3e4bc47d6a39 2582 ++masterclock;
casiotone401 15:3e4bc47d6a39 2583 masterclock &= (MAXSTEPS - 1);
casiotone401 15:3e4bc47d6a39 2584
casiotone401 15:3e4bc47d6a39 2585 pulse_length = ((euc_time - last_sync) / 5);
casiotone401 15:3e4bc47d6a39 2586 last_sync = euc_time;
casiotone401 15:3e4bc47d6a39 2587 }
casiotone401 15:3e4bc47d6a39 2588
casiotone401 15:3e4bc47d6a39 2589 /* 3 functions to read each encoder
casiotone401 15:3e4bc47d6a39 2590 returns +1, 0 or -1 dependent on direction
casiotone401 15:3e4bc47d6a39 2591 Contains no internal debounce, so calls should be delayed
casiotone401 15:3e4bc47d6a39 2592 */
casiotone401 15:3e4bc47d6a39 2593
casiotone401 15:3e4bc47d6a39 2594 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 2595 // Check Euclidean Seq N(length) Value
casiotone401 15:3e4bc47d6a39 2596
casiotone401 15:3e4bc47d6a39 2597 int EncodeReadN(int ch) {
casiotone401 15:3e4bc47d6a39 2598 static float _enc[4];
casiotone401 15:3e4bc47d6a39 2599 int result = 0;
casiotone401 15:3e4bc47d6a39 2600
casiotone401 15:3e4bc47d6a39 2601 switch (ch)
casiotone401 15:3e4bc47d6a39 2602 {
casiotone401 15:3e4bc47d6a39 2603 case 0:
casiotone401 15:3e4bc47d6a39 2604
casiotone401 15:3e4bc47d6a39 2605 if (gEucA[0] == 0) {
casiotone401 15:3e4bc47d6a39 2606 _enc[ch] = result = 0;
casiotone401 15:3e4bc47d6a39 2607
casiotone401 15:3e4bc47d6a39 2608 } else if (gEucA[0] < _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2609 result = -1;
casiotone401 15:3e4bc47d6a39 2610 _enc[ch] = gEucA[0];
casiotone401 15:3e4bc47d6a39 2611
casiotone401 15:3e4bc47d6a39 2612 } else if (gEucA[0] > _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2613 result = 1;
casiotone401 15:3e4bc47d6a39 2614 _enc[ch] = gEucA[0];
casiotone401 15:3e4bc47d6a39 2615 }
casiotone401 15:3e4bc47d6a39 2616
casiotone401 15:3e4bc47d6a39 2617 break;
casiotone401 15:3e4bc47d6a39 2618
casiotone401 15:3e4bc47d6a39 2619 case 1:
casiotone401 15:3e4bc47d6a39 2620
casiotone401 15:3e4bc47d6a39 2621 if (gEucA[3] == 0) {
casiotone401 15:3e4bc47d6a39 2622 _enc[ch] = result = 0;
casiotone401 15:3e4bc47d6a39 2623
casiotone401 15:3e4bc47d6a39 2624 } else if (gEucA[3] < _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2625 result = -1;
casiotone401 15:3e4bc47d6a39 2626 _enc[ch] = gEucA[3];
casiotone401 15:3e4bc47d6a39 2627
casiotone401 15:3e4bc47d6a39 2628 } else if (gEucA[3] > _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2629 result = 1;
casiotone401 15:3e4bc47d6a39 2630 _enc[ch] = gEucA[3];
casiotone401 15:3e4bc47d6a39 2631 }
casiotone401 15:3e4bc47d6a39 2632
casiotone401 15:3e4bc47d6a39 2633 break;
casiotone401 15:3e4bc47d6a39 2634
casiotone401 15:3e4bc47d6a39 2635 case 2:
casiotone401 15:3e4bc47d6a39 2636
casiotone401 15:3e4bc47d6a39 2637 if (gEucB[0] == 0) {
casiotone401 15:3e4bc47d6a39 2638 _enc[ch] = result = 0;
casiotone401 15:3e4bc47d6a39 2639
casiotone401 15:3e4bc47d6a39 2640 } else if (gEucB[0] < _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2641 result = -1;
casiotone401 15:3e4bc47d6a39 2642 _enc[ch] = gEucB[0];
casiotone401 15:3e4bc47d6a39 2643
casiotone401 15:3e4bc47d6a39 2644 } else if (gEucB[0] > _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2645 result = 1;
casiotone401 15:3e4bc47d6a39 2646 _enc[ch] = gEucB[0];
casiotone401 15:3e4bc47d6a39 2647 }
casiotone401 15:3e4bc47d6a39 2648
casiotone401 15:3e4bc47d6a39 2649 break;
casiotone401 15:3e4bc47d6a39 2650
casiotone401 15:3e4bc47d6a39 2651 case 3:
casiotone401 15:3e4bc47d6a39 2652
casiotone401 15:3e4bc47d6a39 2653 if (gEucB[3] == 0) {
casiotone401 15:3e4bc47d6a39 2654 _enc[ch] = result = 0;
casiotone401 15:3e4bc47d6a39 2655
casiotone401 15:3e4bc47d6a39 2656 } else if (gEucB[3] < _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2657 result = -1;
casiotone401 15:3e4bc47d6a39 2658 _enc[ch] = gEucB[3];
casiotone401 15:3e4bc47d6a39 2659
casiotone401 15:3e4bc47d6a39 2660 } else if (gEucB[3] > _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2661 result = 1;
casiotone401 15:3e4bc47d6a39 2662 _enc[ch] = gEucB[3];
casiotone401 15:3e4bc47d6a39 2663 }
casiotone401 15:3e4bc47d6a39 2664
casiotone401 15:3e4bc47d6a39 2665 break;
casiotone401 15:3e4bc47d6a39 2666
casiotone401 15:3e4bc47d6a39 2667 default:
casiotone401 15:3e4bc47d6a39 2668 break;
casiotone401 15:3e4bc47d6a39 2669 }
casiotone401 15:3e4bc47d6a39 2670
casiotone401 15:3e4bc47d6a39 2671 return result;
casiotone401 15:3e4bc47d6a39 2672 }
casiotone401 15:3e4bc47d6a39 2673
casiotone401 15:3e4bc47d6a39 2674 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 2675 // Check Euclidean Seq K(Density) Value
casiotone401 15:3e4bc47d6a39 2676
casiotone401 15:3e4bc47d6a39 2677 int EncodeReadK(int ch) {
casiotone401 15:3e4bc47d6a39 2678 static float _enc[4];
casiotone401 15:3e4bc47d6a39 2679 int result = 0;
casiotone401 15:3e4bc47d6a39 2680
casiotone401 15:3e4bc47d6a39 2681 switch (ch)
casiotone401 15:3e4bc47d6a39 2682 {
casiotone401 15:3e4bc47d6a39 2683 case 0:
casiotone401 15:3e4bc47d6a39 2684
casiotone401 15:3e4bc47d6a39 2685 if (gEucA[1] == 0) {
casiotone401 15:3e4bc47d6a39 2686 _enc[ch] = result = 0;
casiotone401 15:3e4bc47d6a39 2687
casiotone401 15:3e4bc47d6a39 2688 } else if (gEucA[1] < _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2689 result = -1;
casiotone401 15:3e4bc47d6a39 2690 _enc[ch] = gEucA[1];
casiotone401 15:3e4bc47d6a39 2691
casiotone401 15:3e4bc47d6a39 2692 } else if (gEucA[1] > _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2693 result = 1;
casiotone401 15:3e4bc47d6a39 2694 _enc[ch] = gEucA[1];
casiotone401 15:3e4bc47d6a39 2695 }
casiotone401 15:3e4bc47d6a39 2696
casiotone401 15:3e4bc47d6a39 2697 break;
casiotone401 15:3e4bc47d6a39 2698
casiotone401 15:3e4bc47d6a39 2699 case 1:
casiotone401 15:3e4bc47d6a39 2700
casiotone401 15:3e4bc47d6a39 2701 if (gEucA[4] == 0) {
casiotone401 15:3e4bc47d6a39 2702 _enc[ch] = result = 0;
casiotone401 15:3e4bc47d6a39 2703
casiotone401 15:3e4bc47d6a39 2704 } else if (gEucA[4] < _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2705 result = -4;
casiotone401 15:3e4bc47d6a39 2706 _enc[ch] = gEucA[4];
casiotone401 15:3e4bc47d6a39 2707
casiotone401 15:3e4bc47d6a39 2708 } else if (gEucA[4] > _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2709 result = 4;
casiotone401 15:3e4bc47d6a39 2710 _enc[ch] = gEucA[4];
casiotone401 15:3e4bc47d6a39 2711 }
casiotone401 15:3e4bc47d6a39 2712
casiotone401 15:3e4bc47d6a39 2713 break;
casiotone401 15:3e4bc47d6a39 2714
casiotone401 15:3e4bc47d6a39 2715 case 2:
casiotone401 15:3e4bc47d6a39 2716
casiotone401 15:3e4bc47d6a39 2717 if (gEucB[1] == 0) {
casiotone401 15:3e4bc47d6a39 2718 _enc[ch] = result = 0;
casiotone401 15:3e4bc47d6a39 2719
casiotone401 15:3e4bc47d6a39 2720 } else if (gEucB[1] < _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2721 result = -1;
casiotone401 15:3e4bc47d6a39 2722 _enc[ch] = gEucB[1];
casiotone401 15:3e4bc47d6a39 2723
casiotone401 15:3e4bc47d6a39 2724 } else if (gEucB[1] > _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2725 result = 1;
casiotone401 15:3e4bc47d6a39 2726 _enc[ch] = gEucB[1];
casiotone401 15:3e4bc47d6a39 2727 }
casiotone401 15:3e4bc47d6a39 2728
casiotone401 15:3e4bc47d6a39 2729 break;
casiotone401 15:3e4bc47d6a39 2730
casiotone401 15:3e4bc47d6a39 2731 case 3:
casiotone401 15:3e4bc47d6a39 2732
casiotone401 15:3e4bc47d6a39 2733 if (gEucB[4] == 0) {
casiotone401 15:3e4bc47d6a39 2734 _enc[ch] = result = 0;
casiotone401 15:3e4bc47d6a39 2735
casiotone401 15:3e4bc47d6a39 2736 } else if (gEucB[4] < _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2737 result = -1;
casiotone401 15:3e4bc47d6a39 2738 _enc[ch] = gEucB[4];
casiotone401 15:3e4bc47d6a39 2739
casiotone401 15:3e4bc47d6a39 2740 } else if (gEucB[4] > _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2741 result = 1;
casiotone401 15:3e4bc47d6a39 2742 _enc[ch] = gEucB[4];
casiotone401 15:3e4bc47d6a39 2743 }
casiotone401 15:3e4bc47d6a39 2744
casiotone401 15:3e4bc47d6a39 2745 break;
casiotone401 15:3e4bc47d6a39 2746
casiotone401 15:3e4bc47d6a39 2747 default:
casiotone401 15:3e4bc47d6a39 2748 break;
casiotone401 15:3e4bc47d6a39 2749 }
casiotone401 15:3e4bc47d6a39 2750
casiotone401 15:3e4bc47d6a39 2751 return result;
casiotone401 15:3e4bc47d6a39 2752 }
casiotone401 15:3e4bc47d6a39 2753
casiotone401 15:3e4bc47d6a39 2754 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 2755 // Check Euclidean Seq O(Offset) Value
casiotone401 15:3e4bc47d6a39 2756
casiotone401 15:3e4bc47d6a39 2757 int EncodeReadO(int ch) {
casiotone401 15:3e4bc47d6a39 2758 static float _enc[4];
casiotone401 15:3e4bc47d6a39 2759 int result = 0;
casiotone401 15:3e4bc47d6a39 2760
casiotone401 15:3e4bc47d6a39 2761 switch (ch)
casiotone401 15:3e4bc47d6a39 2762 {
casiotone401 15:3e4bc47d6a39 2763 case 0:
casiotone401 15:3e4bc47d6a39 2764
casiotone401 15:3e4bc47d6a39 2765 if (gEucA[2] == 0) {
casiotone401 15:3e4bc47d6a39 2766 _enc[ch] = result = 0;
casiotone401 15:3e4bc47d6a39 2767
casiotone401 15:3e4bc47d6a39 2768 } else if (gEucA[2] < _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2769 result = -1;
casiotone401 15:3e4bc47d6a39 2770 _enc[ch] = gEucA[2];
casiotone401 15:3e4bc47d6a39 2771
casiotone401 15:3e4bc47d6a39 2772 } else if (gEucA[2] > _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2773 result = 1;
casiotone401 15:3e4bc47d6a39 2774 _enc[ch] = gEucA[2];
casiotone401 15:3e4bc47d6a39 2775 }
casiotone401 15:3e4bc47d6a39 2776
casiotone401 15:3e4bc47d6a39 2777 break;
casiotone401 15:3e4bc47d6a39 2778
casiotone401 15:3e4bc47d6a39 2779 case 1:
casiotone401 15:3e4bc47d6a39 2780
casiotone401 15:3e4bc47d6a39 2781 if (gEucA[5] == 0) {
casiotone401 15:3e4bc47d6a39 2782 _enc[ch] = result = 0;
casiotone401 15:3e4bc47d6a39 2783
casiotone401 15:3e4bc47d6a39 2784 } else if (gEucA[5] < _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2785 result = -1;
casiotone401 15:3e4bc47d6a39 2786 _enc[ch] = gEucA[5];
casiotone401 15:3e4bc47d6a39 2787
casiotone401 15:3e4bc47d6a39 2788 } else if (gEucA[5] > _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2789 result = 1;
casiotone401 15:3e4bc47d6a39 2790 _enc[ch] = gEucA[5];
casiotone401 15:3e4bc47d6a39 2791 }
casiotone401 15:3e4bc47d6a39 2792
casiotone401 15:3e4bc47d6a39 2793 break;
casiotone401 15:3e4bc47d6a39 2794
casiotone401 15:3e4bc47d6a39 2795 case 2:
casiotone401 15:3e4bc47d6a39 2796
casiotone401 15:3e4bc47d6a39 2797 if (gEucB[2] == 0) {
casiotone401 15:3e4bc47d6a39 2798 _enc[ch] = result = 0;
casiotone401 15:3e4bc47d6a39 2799
casiotone401 15:3e4bc47d6a39 2800 } else if (gEucB[2] < _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2801 result = -1;
casiotone401 15:3e4bc47d6a39 2802 _enc[ch] = gEucB[2];
casiotone401 15:3e4bc47d6a39 2803
casiotone401 15:3e4bc47d6a39 2804 } else if (gEucB[2] > _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2805 result = 1;
casiotone401 15:3e4bc47d6a39 2806 _enc[ch] = gEucB[2];
casiotone401 15:3e4bc47d6a39 2807 }
casiotone401 15:3e4bc47d6a39 2808
casiotone401 15:3e4bc47d6a39 2809 break;
casiotone401 15:3e4bc47d6a39 2810
casiotone401 15:3e4bc47d6a39 2811 case 3:
casiotone401 15:3e4bc47d6a39 2812
casiotone401 15:3e4bc47d6a39 2813 if (gEucB[5] == 0) {
casiotone401 15:3e4bc47d6a39 2814 _enc[ch] = result = 0;
casiotone401 15:3e4bc47d6a39 2815
casiotone401 15:3e4bc47d6a39 2816 } else if (gEucB[5] < _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2817 result = -1;
casiotone401 15:3e4bc47d6a39 2818 _enc[ch] = gEucB[5];
casiotone401 15:3e4bc47d6a39 2819
casiotone401 15:3e4bc47d6a39 2820 } else if (gEucB[5] > _enc[ch]) {
casiotone401 15:3e4bc47d6a39 2821 result = 1;
casiotone401 15:3e4bc47d6a39 2822 _enc[ch] = gEucB[5];
casiotone401 15:3e4bc47d6a39 2823 }
casiotone401 15:3e4bc47d6a39 2824
casiotone401 15:3e4bc47d6a39 2825 break;
casiotone401 15:3e4bc47d6a39 2826
casiotone401 15:3e4bc47d6a39 2827 default:
casiotone401 15:3e4bc47d6a39 2828 break;
casiotone401 15:3e4bc47d6a39 2829 }
casiotone401 15:3e4bc47d6a39 2830
casiotone401 15:3e4bc47d6a39 2831 return result;
casiotone401 15:3e4bc47d6a39 2832 }
casiotone401 15:3e4bc47d6a39 2833
casiotone401 15:3e4bc47d6a39 2834 inline char * SetMatrixAddress(int row, int column, bool euclid) {
casiotone401 19:467f98c51e2d 2835
casiotone401 15:3e4bc47d6a39 2836 static char address[32];
casiotone401 15:3e4bc47d6a39 2837
casiotone401 17:55e5136790a6 2838 if (euclid)
casiotone401 15:3e4bc47d6a39 2839 {
casiotone401 19:467f98c51e2d 2840 sprintf(address, "%s%d/%d", MATRIX_ADDRESS, column + 1, row + 1);
casiotone401 15:3e4bc47d6a39 2841
casiotone401 15:3e4bc47d6a39 2842 } else {
casiotone401 15:3e4bc47d6a39 2843
casiotone401 19:467f98c51e2d 2844 sprintf(address, "%s%d/1", STEP_INDICATOR_ADDRESS, column + 1);
casiotone401 15:3e4bc47d6a39 2845 }
casiotone401 15:3e4bc47d6a39 2846
casiotone401 15:3e4bc47d6a39 2847 return address;
casiotone401 15:3e4bc47d6a39 2848 }
casiotone401 15:3e4bc47d6a39 2849