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:
Fri Aug 07 12:47:35 2015 +0000
Revision:
16:1196b8c87bb7
Parent:
15:3e4bc47d6a39
Child:
17:55e5136790a6
minor change

Who changed what in which revision?

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