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:
Sat Jan 02 23:45:04 2016 +0000
Revision:
17:55e5136790a6
Parent:
16:1196b8c87bb7
Child:
19:467f98c51e2d
improved performance & minor change

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