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:
Sun Aug 02 10:01:07 2015 +0000
Revision:
15:3e4bc47d6a39
Parent:
14:977f3c5a4b4e
Child:
16:1196b8c87bb7
ver. 2

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