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:
Thu Jan 28 14:12:25 2016 +0000
Revision:
25:6b29d7e631cb
Parent:
24:99045b0f7c4a
Child:
26:8673d5254f7d
minor change

Who changed what in which revision?

UserRevisionLine numberNew contents of line
casiotone401 0:a4d93cd4c30d 1 //-------------------------------------------------------------
casiotone401 20:a44f4a024902 2 // TI DAC8568 OSCtoCV Converter
casiotone401 0:a4d93cd4c30d 3 //
casiotone401 0:a4d93cd4c30d 4 // DAC8568 16bit Octal DAC http://www.ti.com/product/dac8568
casiotone401 0:a4d93cd4c30d 5 //
casiotone401 0:a4d93cd4c30d 6 // referred to
casiotone401 0:a4d93cd4c30d 7 // xshige's OSCReceiver
casiotone401 0:a4d93cd4c30d 8 // http://mbed.org/users/xshige/programs/OSCReceiver/
casiotone401 0:a4d93cd4c30d 9 // radiojunkbox's OSC-CV_Example
casiotone401 0:a4d93cd4c30d 10 // http://mbed.org/users/radiojunkbox/code/KAMUI_OSC-CV_Example/
casiotone401 0:a4d93cd4c30d 11 // Robin Price's Homebrew midi-cv box
casiotone401 0:a4d93cd4c30d 12 // http://crx091081gb.net/?p=69
casiotone401 0:a4d93cd4c30d 13 // Masahiro Hattori's TextLCD Module Functions
casiotone401 0:a4d93cd4c30d 14 // http://www.eleclabo.com/denshi/device/lcd1602/gcram.html
casiotone401 0:a4d93cd4c30d 15 // Dirk-Willem van Gulik's BonjourLib
casiotone401 0:a4d93cd4c30d 16 // http://mbed.org/users/dirkx/code/BonjourLib/file/bb6472f455e8/services/mDNS
casiotone401 0:a4d93cd4c30d 17 //
casiotone401 0:a4d93cd4c30d 18 // Released under the MIT License: http://mbed.org/license/mit
casiotone401 0:a4d93cd4c30d 19 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 20
casiotone401 0:a4d93cd4c30d 21 #pragma O3
casiotone401 0:a4d93cd4c30d 22 #pragma Otime
casiotone401 0:a4d93cd4c30d 23
casiotone401 0:a4d93cd4c30d 24 #include "mbed.h"
casiotone401 15:3e4bc47d6a39 25 #include "FastIO.h"
casiotone401 20:a44f4a024902 26 //#include "FastAnalogIn.h"
casiotone401 15:3e4bc47d6a39 27 #include "DebouncedInterrupt.h"
casiotone401 0:a4d93cd4c30d 28 #include "TextLCD.h" //edit "writeCommand" "writeData" protected -> public
casiotone401 0:a4d93cd4c30d 29 #include "EthernetNetIf.h"
casiotone401 0:a4d93cd4c30d 30 #include "HTTPServer.h"
casiotone401 0:a4d93cd4c30d 31 #include "mDNSResponder.h" // mDNS response to announce oneselve
casiotone401 0:a4d93cd4c30d 32 #include "UDPSocket.h"
casiotone401 0:a4d93cd4c30d 33 #include "OSCReceiver.h"
casiotone401 15:3e4bc47d6a39 34 #include "mbedOSC.h"
casiotone401 15:3e4bc47d6a39 35 #include "MIDI.h"
casiotone401 24:99045b0f7c4a 36 #include "ClockControl.h" // https://developer.mbed.org/users/JST2011/code/ClockControl/
casiotone401 20:a44f4a024902 37 #include "OSCtoCV.h"
casiotone401 20:a44f4a024902 38 #include "OSCtoCV_Sequencer.h"
casiotone401 20:a44f4a024902 39 #include "OSCtoCV_GateSequencer.h"
casiotone401 20:a44f4a024902 40 #include "OSCtoCV_Euclidean.h"
casiotone401 21:2273c3676f1b 41 #include "OSCtoCV_Random.h"
casiotone401 21:2273c3676f1b 42 #include "OSCtoCV_LFO.h"
casiotone401 20:a44f4a024902 43
casiotone401 24:99045b0f7c4a 44
casiotone401 0:a4d93cd4c30d 45 #include <stdlib.h>
casiotone401 0:a4d93cd4c30d 46 #include <ctype.h>
casiotone401 1:fd4f70088311 47 #include <math.h>
casiotone401 0:a4d93cd4c30d 48
casiotone401 0:a4d93cd4c30d 49 //-------------------------------------------------------------
casiotone401 20:a44f4a024902 50 // Macros
casiotone401 0:a4d93cd4c30d 51
casiotone401 25:6b29d7e631cb 52 #define MODE_CLB 0 // Calibration (for VCO Tuning)
casiotone401 15:3e4bc47d6a39 53 #define MODE_OSC 1 // Mode OSCtoCV
casiotone401 15:3e4bc47d6a39 54 #define MODE_SEQ 2 // Mode Shift Sequencer
casiotone401 15:3e4bc47d6a39 55 #define MODE_185 3 // Mode M185 Sequencer
casiotone401 24:99045b0f7c4a 56 #define MODE_437 4 // Mode 437 Sequencer
casiotone401 24:99045b0f7c4a 57 #define MODE_EUC 5 // Mode Euclidean Sequencer
casiotone401 24:99045b0f7c4a 58 #define MODE_RND 6 // Mode xshift Random Generator
casiotone401 24:99045b0f7c4a 59 #define MODE_LFO 7 // Mode Stepped LFO
casiotone401 15:3e4bc47d6a39 60
casiotone401 24:99045b0f7c4a 61 #define MODE_TOTAL 8 // Modes
casiotone401 0:a4d93cd4c30d 62
casiotone401 0:a4d93cd4c30d 63 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 64 // Functions
casiotone401 0:a4d93cd4c30d 65
casiotone401 15:3e4bc47d6a39 66 void InitOSCCV(void);
casiotone401 4:b9f5ae574447 67 inline void NetPoll(void);
casiotone401 20:a44f4a024902 68 void CalibrationCV(void);
casiotone401 15:3e4bc47d6a39 69 inline void SetCV(void);
casiotone401 15:3e4bc47d6a39 70 inline int CheckBPM(void);
casiotone401 20:a44f4a024902 71 void CheckModeSW(void);
casiotone401 15:3e4bc47d6a39 72 inline void LCD();
casiotone401 0:a4d93cd4c30d 73 void WriteCustomChar(unsigned char, unsigned char*);
casiotone401 0:a4d93cd4c30d 74 int SetupEthNetIf(void);
casiotone401 4:b9f5ae574447 75 inline void onUDPSocketEvent(UDPSocketEvent);
casiotone401 20:a44f4a024902 76
casiotone401 0:a4d93cd4c30d 77
casiotone401 0:a4d93cd4c30d 78 //-------------------------------------------------------------
casiotone401 20:a44f4a024902 79 // Global Variables
casiotone401 0:a4d93cd4c30d 80
casiotone401 0:a4d93cd4c30d 81 // CV Meter Custom Character
casiotone401 0:a4d93cd4c30d 82 unsigned char str1[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F};
casiotone401 0:a4d93cd4c30d 83 unsigned char str2[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 84 unsigned char str3[8] = {0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 85 unsigned char str4[8] = {0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 86 unsigned char str5[8] = {0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 87 unsigned char str6[8] = {0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 88 unsigned char str7[8] = {0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 89 unsigned char str8[8] = {0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 90
casiotone401 20:a44f4a024902 91 // OSCtoCV Converter Mode
casiotone401 20:a44f4a024902 92 int gMode;
casiotone401 15:3e4bc47d6a39 93
casiotone401 20:a44f4a024902 94 // UDP Socket
casiotone401 20:a44f4a024902 95 UDPSocket gUdp;
casiotone401 15:3e4bc47d6a39 96
casiotone401 0:a4d93cd4c30d 97 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 98 // main
casiotone401 0:a4d93cd4c30d 99
casiotone401 0:a4d93cd4c30d 100 int main()
casiotone401 0:a4d93cd4c30d 101 {
casiotone401 7:a04f8378662e 102 float pot, _pot;
casiotone401 15:3e4bc47d6a39 103 int bpm;
casiotone401 20:a44f4a024902 104
casiotone401 24:99045b0f7c4a 105 InitOSCCV();
casiotone401 15:3e4bc47d6a39 106
casiotone401 15:3e4bc47d6a39 107 gCtrl[3] = _pot = pot = gMode = 0;
casiotone401 24:99045b0f7c4a 108
casiotone401 24:99045b0f7c4a 109
casiotone401 24:99045b0f7c4a 110 // Init LCD
casiotone401 15:3e4bc47d6a39 111 LCD();
casiotone401 24:99045b0f7c4a 112
casiotone401 15:3e4bc47d6a39 113 gLCD.locate( 0, 1 );
casiotone401 15:3e4bc47d6a39 114 gLCD.printf("12345678 G>>%3.2f", gGlide);
casiotone401 24:99045b0f7c4a 115
casiotone401 15:3e4bc47d6a39 116 // Main loop
casiotone401 15:3e4bc47d6a39 117 while (1)
casiotone401 24:99045b0f7c4a 118 {
casiotone401 24:99045b0f7c4a 119 LCD(); // Check Text LCD Mode Status
casiotone401 15:3e4bc47d6a39 120
casiotone401 15:3e4bc47d6a39 121 pot = gAIN.read(); // Update glide value
casiotone401 15:3e4bc47d6a39 122
casiotone401 15:3e4bc47d6a39 123 if (!pot) // when glide pot value == 0
casiotone401 24:99045b0f7c4a 124 { // use gCtrl[3] value (MODE_OSC)
casiotone401 15:3e4bc47d6a39 125 if (abs(gCtrl[3] - _pot) > 0.01f)
casiotone401 15:3e4bc47d6a39 126 {
casiotone401 15:3e4bc47d6a39 127 _pot = gGlide = gCtrl[3];
casiotone401 15:3e4bc47d6a39 128
casiotone401 15:3e4bc47d6a39 129 gLCD.locate( 9, 1 );
casiotone401 15:3e4bc47d6a39 130 gLCD.printf("G>>%3.2f", gGlide);
casiotone401 15:3e4bc47d6a39 131 }
casiotone401 15:3e4bc47d6a39 132
casiotone401 15:3e4bc47d6a39 133 } else if (abs(pot - _pot) > 0.01f) {
casiotone401 15:3e4bc47d6a39 134
casiotone401 15:3e4bc47d6a39 135 _pot = gGlide = gAIN.read();
casiotone401 15:3e4bc47d6a39 136
casiotone401 15:3e4bc47d6a39 137 gLCD.locate( 9, 1 );
casiotone401 15:3e4bc47d6a39 138 gLCD.printf("G>>%3.2f", gGlide);
casiotone401 15:3e4bc47d6a39 139 }
casiotone401 15:3e4bc47d6a39 140
casiotone401 17:55e5136790a6 141 bpm = CheckBPM(); // check current BPM
casiotone401 17:55e5136790a6 142
casiotone401 15:3e4bc47d6a39 143 switch (gMode)
casiotone401 15:3e4bc47d6a39 144 {
casiotone401 15:3e4bc47d6a39 145 case MODE_OSC: // OSCtoCV mode
casiotone401 15:3e4bc47d6a39 146
casiotone401 15:3e4bc47d6a39 147 SetCV();
casiotone401 15:3e4bc47d6a39 148 break;
casiotone401 15:3e4bc47d6a39 149
casiotone401 15:3e4bc47d6a39 150 case MODE_SEQ: // Shift Sequencer mode
casiotone401 15:3e4bc47d6a39 151
casiotone401 15:3e4bc47d6a39 152 GateSeq(bpm, N8TH, GATE2, 3, NON_INVERT, GATESOUT_ON, SYNC_OFF);
casiotone401 15:3e4bc47d6a39 153
casiotone401 15:3e4bc47d6a39 154 if (gCtrlSW[3])
casiotone401 24:99045b0f7c4a 155 { // euclid sequencer auto offset
casiotone401 25:6b29d7e631cb 156 ShiftCVSeq(EuclideanSeq(GateSeq(bpm, N16TH, SUBGATE, (gCtrl[6] * 5), NON_INVERT, GATESOUT_OFF, SYNC_OFF), gCtrlSW[0], GATESOUT_OFF, true), gCtrlSW[0], CV_CHANNEL8);
casiotone401 24:99045b0f7c4a 157
casiotone401 24:99045b0f7c4a 158 } else {
casiotone401 25:6b29d7e631cb 159
casiotone401 25:6b29d7e631cb 160 ShiftCVSeq(GateSeq(bpm, N16TH, GATE1, (gCtrl[6] * 5), NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0], CV_CHANNEL8);
casiotone401 24:99045b0f7c4a 161 // beats sequencer
casiotone401 24:99045b0f7c4a 162 BeatsSeq(GateSeq(bpm, N16TH, SUBGATE, 3, NON_INVERT, GATESOUT_OFF, SYNC_OFF), gCtrlSW[0], GATESOUT_OFF);
casiotone401 15:3e4bc47d6a39 163 }
casiotone401 15:3e4bc47d6a39 164 break;
casiotone401 15:3e4bc47d6a39 165
casiotone401 15:3e4bc47d6a39 166 case MODE_185: // M185 Sequencer mode
casiotone401 15:3e4bc47d6a39 167
casiotone401 25:6b29d7e631cb 168
casiotone401 24:99045b0f7c4a 169 GateSeq(bpm, N8TH, GATE2, 3, NON_INVERT, GATESOUT_ON, SYNC_OFF);
casiotone401 24:99045b0f7c4a 170
casiotone401 24:99045b0f7c4a 171 if (gCtrlSW[3])
casiotone401 24:99045b0f7c4a 172 { // euclid sequencer auto offset
casiotone401 25:6b29d7e631cb 173 M185Seq(EuclideanSeq(GateSeq(bpm, N16TH, SUBGATE, (gCtrl[6] * 5), NON_INVERT, GATESOUT_OFF, SYNC_OFF), gCtrlSW[0], GATESOUT_OFF, true), gCtrlSW[0], CV_CHANNEL8);
casiotone401 25:6b29d7e631cb 174
casiotone401 24:99045b0f7c4a 175 } else {
casiotone401 25:6b29d7e631cb 176
casiotone401 25:6b29d7e631cb 177 M185Seq(GateSeq(bpm, N16TH, GATE1, (gCtrl[6] * 5), NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0], CV_CHANNEL8);
casiotone401 24:99045b0f7c4a 178 // beats sequencer
casiotone401 24:99045b0f7c4a 179 BeatsSeq(GateSeq(bpm, N16TH, SUBGATE, 3, NON_INVERT, GATESOUT_OFF, SYNC_OFF), gCtrlSW[0], GATESOUT_OFF);
casiotone401 24:99045b0f7c4a 180 }
casiotone401 24:99045b0f7c4a 181 break;
casiotone401 24:99045b0f7c4a 182
casiotone401 24:99045b0f7c4a 183 case MODE_437: // F437 sequencer
casiotone401 25:6b29d7e631cb 184
casiotone401 15:3e4bc47d6a39 185 GateSeq(bpm, N8TH, GATE2, 3, NON_INVERT, GATESOUT_ON, SYNC_OFF);
casiotone401 15:3e4bc47d6a39 186
casiotone401 15:3e4bc47d6a39 187 if (gCtrlSW[3])
casiotone401 24:99045b0f7c4a 188 { // euclid sequencer auto offset
casiotone401 25:6b29d7e631cb 189 PolyCVSeq(EuclideanSeq(GateSeq(bpm, N16TH, SUBGATE, (gCtrl[6] * 5), NON_INVERT, GATESOUT_OFF, SYNC_OFF), gCtrlSW[0], GATESOUT_OFF, true), gCtrlSW[0]);
casiotone401 25:6b29d7e631cb 190
casiotone401 24:99045b0f7c4a 191 } else {
casiotone401 25:6b29d7e631cb 192
casiotone401 25:6b29d7e631cb 193 PolyCVSeq(GateSeq(bpm, N16TH, GATE1, (gCtrl[6] * 5), NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0]);
casiotone401 24:99045b0f7c4a 194 // beats sequencer
casiotone401 24:99045b0f7c4a 195 BeatsSeq(GateSeq(bpm, N16TH, SUBGATE, 3, NON_INVERT, GATESOUT_OFF, SYNC_OFF), gCtrlSW[0], GATESOUT_OFF);
casiotone401 15:3e4bc47d6a39 196 }
casiotone401 15:3e4bc47d6a39 197 break;
casiotone401 24:99045b0f7c4a 198
casiotone401 15:3e4bc47d6a39 199 case MODE_EUC: // Euclidean Sequencer mode
casiotone401 15:3e4bc47d6a39 200
casiotone401 24:99045b0f7c4a 201 ShiftCVSeq(GateSeq(bpm, N1ST, SUBGATE, (gCtrl[6] * 5), NON_INVERT, GATESOUT_OFF, SYNC_OFF), gCtrlSW[0], CV_CHANNEL8);
casiotone401 24:99045b0f7c4a 202 EuclideanSeq(GateSeq(bpm, N16TH, GATE1, 3, NON_INVERT, GATESOUT_OFF, SYNC_OFF), gCtrlSW[0], GATESOUT_ON, false);
casiotone401 15:3e4bc47d6a39 203 break;
casiotone401 24:99045b0f7c4a 204
casiotone401 21:2273c3676f1b 205 case MODE_RND: // Random CV Generator mode
casiotone401 24:99045b0f7c4a 206
casiotone401 24:99045b0f7c4a 207 RandomCVGenerator(GateSeq(bpm, N32TH, GATE1, (gCtrl[6] * 5), NON_INVERT, GATESOUT_OFF, SYNC_ON));
casiotone401 21:2273c3676f1b 208 break;
casiotone401 21:2273c3676f1b 209
casiotone401 21:2273c3676f1b 210 case MODE_LFO: // Stepped LFO mode
casiotone401 24:99045b0f7c4a 211
casiotone401 24:99045b0f7c4a 212 SteppedLFO(CV_CHANNEL1, true); // LFO out ch1 ~ ch8
casiotone401 21:2273c3676f1b 213 break;
casiotone401 24:99045b0f7c4a 214
casiotone401 15:3e4bc47d6a39 215 default: // CV Calibration mode
casiotone401 15:3e4bc47d6a39 216
casiotone401 15:3e4bc47d6a39 217 CalibrationCV();
casiotone401 15:3e4bc47d6a39 218 break;
casiotone401 15:3e4bc47d6a39 219 }
casiotone401 15:3e4bc47d6a39 220
casiotone401 15:3e4bc47d6a39 221 }
casiotone401 15:3e4bc47d6a39 222 }
casiotone401 15:3e4bc47d6a39 223
casiotone401 15:3e4bc47d6a39 224 //-------------------------------------------------------------
casiotone401 20:a44f4a024902 225 // Ethernet Polling
casiotone401 20:a44f4a024902 226
casiotone401 20:a44f4a024902 227 inline void NetPoll()
casiotone401 20:a44f4a024902 228 {
casiotone401 20:a44f4a024902 229 Net::poll();
casiotone401 20:a44f4a024902 230 }
casiotone401 20:a44f4a024902 231
casiotone401 20:a44f4a024902 232 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 233 // Initialize OSCtoCV
casiotone401 15:3e4bc47d6a39 234
casiotone401 15:3e4bc47d6a39 235 void InitOSCCV()
casiotone401 15:3e4bc47d6a39 236 {
casiotone401 15:3e4bc47d6a39 237 int i;
casiotone401 20:a44f4a024902 238
casiotone401 24:99045b0f7c4a 239 // Set System Frequency 120Mhz
casiotone401 24:99045b0f7c4a 240 setSystemFrequency(0x3, 0x1, 15, 1);
casiotone401 20:a44f4a024902 241 wait(0.5);
casiotone401 20:a44f4a024902 242
casiotone401 20:a44f4a024902 243 // Setup Ethernet
casiotone401 20:a44f4a024902 244 SetupEthNetIf();
casiotone401 20:a44f4a024902 245
casiotone401 20:a44f4a024902 246 // Announce mdnsResponder (Bonjour)
casiotone401 20:a44f4a024902 247 HTTPServer svr;
casiotone401 20:a44f4a024902 248 mDNSResponder mdns;
casiotone401 20:a44f4a024902 249
casiotone401 20:a44f4a024902 250 svr.addHandler<SimpleHandler>("/");
casiotone401 20:a44f4a024902 251 svr.bind(INPUT_PORT);
casiotone401 20:a44f4a024902 252 IpAddr ip = gEth.getIp();
casiotone401 20:a44f4a024902 253 mdns.announce(ip, "OSCtoCV", "_osc._udp", INPUT_PORT, "mbed(OSCtoCV)", (char *[]) {"path=/",NULL});
casiotone401 20:a44f4a024902 254
casiotone401 15:3e4bc47d6a39 255 // Write custom char LCD CGRAM
casiotone401 15:3e4bc47d6a39 256 WriteCustomChar(0x00, str1);
casiotone401 15:3e4bc47d6a39 257 WriteCustomChar(0x01, str2);
casiotone401 15:3e4bc47d6a39 258 WriteCustomChar(0x02, str3);
casiotone401 15:3e4bc47d6a39 259 WriteCustomChar(0x03, str4);
casiotone401 15:3e4bc47d6a39 260 WriteCustomChar(0x04, str5);
casiotone401 15:3e4bc47d6a39 261 WriteCustomChar(0x05, str6);
casiotone401 15:3e4bc47d6a39 262 WriteCustomChar(0x06, str7);
casiotone401 15:3e4bc47d6a39 263 WriteCustomChar(0x07, str8);
casiotone401 15:3e4bc47d6a39 264
casiotone401 15:3e4bc47d6a39 265 // Init SPI
casiotone401 15:3e4bc47d6a39 266 gLDAC = _ENABLE;
casiotone401 15:3e4bc47d6a39 267 gSPI.format(8,1); // Data word length 8bit, Mode=1
casiotone401 15:3e4bc47d6a39 268 gSPI.frequency(SPI_RATE);
casiotone401 15:3e4bc47d6a39 269
casiotone401 15:3e4bc47d6a39 270 UpdateCV(CLR, 0, 0); // Ignore CLR Pin
casiotone401 20:a44f4a024902 271
casiotone401 15:3e4bc47d6a39 272 // Init BPM
casiotone401 15:3e4bc47d6a39 273 gCtrl[0] = 0.398f;
casiotone401 15:3e4bc47d6a39 274
casiotone401 15:3e4bc47d6a39 275 // Init Sequence Data
casiotone401 15:3e4bc47d6a39 276 for (i = 0; i < 16; ++i)
casiotone401 15:3e4bc47d6a39 277 {
casiotone401 24:99045b0f7c4a 278 gSeq_cv[i] = (calibMap1[69] * SCALING_N);
casiotone401 24:99045b0f7c4a 279 }
casiotone401 24:99045b0f7c4a 280
casiotone401 24:99045b0f7c4a 281 for (i = 0; i < 8; ++i)
casiotone401 24:99045b0f7c4a 282 {
casiotone401 24:99045b0f7c4a 283 g185_cv[i] = (calibMap1[69] * SCALING_N);
casiotone401 24:99045b0f7c4a 284 gBeatsLevel[i] = gBeatsDecay[i] = 1;
casiotone401 15:3e4bc47d6a39 285 }
casiotone401 15:3e4bc47d6a39 286
casiotone401 24:99045b0f7c4a 287 // Init Sequencer Reset Count
casiotone401 24:99045b0f7c4a 288 gCtrl[4] = gCtrl[5] = gCtrl[7] = 1;
casiotone401 24:99045b0f7c4a 289
casiotone401 24:99045b0f7c4a 290 // Init Sequencer Gate Length
casiotone401 24:99045b0f7c4a 291 gCtrl[6] = 0.6;
casiotone401 24:99045b0f7c4a 292
casiotone401 24:99045b0f7c4a 293 // Init Euclidean Sequencer
casiotone401 24:99045b0f7c4a 294 InitEuclideanSeq();
casiotone401 24:99045b0f7c4a 295
casiotone401 24:99045b0f7c4a 296 // Init Glide value
casiotone401 24:99045b0f7c4a 297 gGlide = gAIN.read();
casiotone401 4:b9f5ae574447 298
casiotone401 15:3e4bc47d6a39 299 // Set OSC message for sending
casiotone401 15:3e4bc47d6a39 300 sendMes.setIp(touchOSCAddress);
casiotone401 15:3e4bc47d6a39 301 sendMes.setPort(touchOSCPort);
casiotone401 3:ca15241dd6b4 302
casiotone401 15:3e4bc47d6a39 303 gSW.attach(&CheckModeSW,IRQ_RISE, 30); // InterruptIn rising edge(ModeSW)
casiotone401 17:55e5136790a6 304 wait(0.5);
casiotone401 15:3e4bc47d6a39 305
casiotone401 17:55e5136790a6 306 gPoller.attach_us(&NetPoll, POLLING_INTERVAL); // Ticker Polling
casiotone401 25:6b29d7e631cb 307 wait(0.5);
casiotone401 0:a4d93cd4c30d 308 }
casiotone401 0:a4d93cd4c30d 309
casiotone401 0:a4d93cd4c30d 310 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 311 // Calibration Mode
casiotone401 15:3e4bc47d6a39 312
casiotone401 20:a44f4a024902 313 void CalibrationCV()
casiotone401 14:977f3c5a4b4e 314 {
casiotone401 14:977f3c5a4b4e 315 static int ch;
casiotone401 14:977f3c5a4b4e 316 unsigned int cv;
casiotone401 14:977f3c5a4b4e 317
casiotone401 15:3e4bc47d6a39 318 switch (gMode)
casiotone401 14:977f3c5a4b4e 319 {
casiotone401 24:99045b0f7c4a 320 case MODE_CLB:
casiotone401 14:977f3c5a4b4e 321
casiotone401 15:3e4bc47d6a39 322 cv = (unsigned int)(calibMap1[69] * SCALING_N); // A880.0Hz
casiotone401 14:977f3c5a4b4e 323
casiotone401 15:3e4bc47d6a39 324 gSUBGATE = gGATES[0] = gGATES[1] = gGATES[2] = gGATES[3] = true;
casiotone401 14:977f3c5a4b4e 325
casiotone401 14:977f3c5a4b4e 326 UpdateCV(WRITE_UPDATE_N, ch, &cv);
casiotone401 15:3e4bc47d6a39 327
casiotone401 14:977f3c5a4b4e 328 break;
casiotone401 14:977f3c5a4b4e 329 }
casiotone401 14:977f3c5a4b4e 330
casiotone401 15:3e4bc47d6a39 331 UpdateCVMeter(ch, &cv);
casiotone401 14:977f3c5a4b4e 332
casiotone401 15:3e4bc47d6a39 333 ++ch;
casiotone401 14:977f3c5a4b4e 334 ch &= 0x07;
casiotone401 14:977f3c5a4b4e 335 }
casiotone401 14:977f3c5a4b4e 336
casiotone401 14:977f3c5a4b4e 337 //-------------------------------------------------------------
casiotone401 14:977f3c5a4b4e 338 // Calculate CV
casiotone401 14:977f3c5a4b4e 339
casiotone401 15:3e4bc47d6a39 340 inline void SetCV()
casiotone401 14:977f3c5a4b4e 341 {
casiotone401 15:3e4bc47d6a39 342 static int ch, qmode, amode, mcount;
casiotone401 14:977f3c5a4b4e 343 static float glidecv[8];
casiotone401 14:977f3c5a4b4e 344 unsigned int cv;
casiotone401 14:977f3c5a4b4e 345 static float qcv;
casiotone401 14:977f3c5a4b4e 346
casiotone401 15:3e4bc47d6a39 347 qmode = (gCtrl[1] * (SCALE_NUM - 1));
casiotone401 15:3e4bc47d6a39 348 amode = SCALE_AOUT * qmode;
casiotone401 15:3e4bc47d6a39 349
casiotone401 15:3e4bc47d6a39 350 gAOUT.write_u16(amode);
casiotone401 15:3e4bc47d6a39 351
casiotone401 15:3e4bc47d6a39 352 switch (qmode)
casiotone401 14:977f3c5a4b4e 353 {
casiotone401 14:977f3c5a4b4e 354 case Lin:
casiotone401 14:977f3c5a4b4e 355
casiotone401 14:977f3c5a4b4e 356 glidecv[ch] = glidecv[ch] * gGlide + gOSC_cv[ch] * (1.0f - gGlide);
casiotone401 14:977f3c5a4b4e 357 break;
casiotone401 14:977f3c5a4b4e 358
casiotone401 14:977f3c5a4b4e 359 case Chr:
casiotone401 15:3e4bc47d6a39 360
casiotone401 15:3e4bc47d6a39 361 qcv = calibMap1[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES1 - 1))];
casiotone401 14:977f3c5a4b4e 362
casiotone401 14:977f3c5a4b4e 363 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 15:3e4bc47d6a39 364
casiotone401 14:977f3c5a4b4e 365 break;
casiotone401 14:977f3c5a4b4e 366
casiotone401 15:3e4bc47d6a39 367 case Maj:
casiotone401 15:3e4bc47d6a39 368
casiotone401 15:3e4bc47d6a39 369 qcv = calibMap2[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES2 - 1))];
casiotone401 15:3e4bc47d6a39 370
casiotone401 14:977f3c5a4b4e 371 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 15:3e4bc47d6a39 372
casiotone401 14:977f3c5a4b4e 373 break;
casiotone401 15:3e4bc47d6a39 374
casiotone401 15:3e4bc47d6a39 375 case M7:
casiotone401 14:977f3c5a4b4e 376
casiotone401 15:3e4bc47d6a39 377 qcv = calibMap3[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES3 - 1))];
casiotone401 14:977f3c5a4b4e 378
casiotone401 14:977f3c5a4b4e 379 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 15:3e4bc47d6a39 380
casiotone401 15:3e4bc47d6a39 381 break;
casiotone401 15:3e4bc47d6a39 382
casiotone401 15:3e4bc47d6a39 383 case Min7:
casiotone401 15:3e4bc47d6a39 384
casiotone401 15:3e4bc47d6a39 385 qcv = calibMap4[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES4 - 1))];
casiotone401 15:3e4bc47d6a39 386
casiotone401 15:3e4bc47d6a39 387 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 15:3e4bc47d6a39 388
casiotone401 15:3e4bc47d6a39 389 break;
casiotone401 15:3e4bc47d6a39 390
casiotone401 15:3e4bc47d6a39 391 case Dor:
casiotone401 15:3e4bc47d6a39 392
casiotone401 15:3e4bc47d6a39 393 qcv = calibMap5[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES5 - 1))];
casiotone401 15:3e4bc47d6a39 394
casiotone401 15:3e4bc47d6a39 395 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 15:3e4bc47d6a39 396
casiotone401 15:3e4bc47d6a39 397 break;
casiotone401 15:3e4bc47d6a39 398
casiotone401 15:3e4bc47d6a39 399 case Min:
casiotone401 15:3e4bc47d6a39 400
casiotone401 15:3e4bc47d6a39 401 qcv = calibMap6[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES6 - 1))];
casiotone401 15:3e4bc47d6a39 402
casiotone401 15:3e4bc47d6a39 403 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 15:3e4bc47d6a39 404
casiotone401 15:3e4bc47d6a39 405 break;
casiotone401 15:3e4bc47d6a39 406
casiotone401 15:3e4bc47d6a39 407 case S5th:
casiotone401 15:3e4bc47d6a39 408
casiotone401 15:3e4bc47d6a39 409 qcv = calibMap7[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES7 - 1))];
casiotone401 15:3e4bc47d6a39 410
casiotone401 15:3e4bc47d6a39 411 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 15:3e4bc47d6a39 412
casiotone401 15:3e4bc47d6a39 413 break;
casiotone401 15:3e4bc47d6a39 414
casiotone401 15:3e4bc47d6a39 415 case Wht:
casiotone401 15:3e4bc47d6a39 416
casiotone401 15:3e4bc47d6a39 417 qcv = calibMap8[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES8 - 1))];
casiotone401 15:3e4bc47d6a39 418
casiotone401 15:3e4bc47d6a39 419 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 17:55e5136790a6 420
casiotone401 14:977f3c5a4b4e 421 break;
casiotone401 14:977f3c5a4b4e 422 }
casiotone401 17:55e5136790a6 423
casiotone401 17:55e5136790a6 424 cv = (unsigned int)glidecv[ch];
casiotone401 17:55e5136790a6 425
casiotone401 17:55e5136790a6 426 UpdateCV(WRITE_UPDATE_N, ch, &cv);
casiotone401 14:977f3c5a4b4e 427
casiotone401 17:55e5136790a6 428 if (mcount == 0x1F)
casiotone401 17:55e5136790a6 429 {
casiotone401 17:55e5136790a6 430 UpdateCVMeter(ch, &cv);
casiotone401 17:55e5136790a6 431 }
casiotone401 17:55e5136790a6 432
casiotone401 17:55e5136790a6 433 ++ch;
casiotone401 17:55e5136790a6 434
casiotone401 17:55e5136790a6 435 if (ch &= 0x07)
casiotone401 17:55e5136790a6 436 {
casiotone401 17:55e5136790a6 437 ++mcount;
casiotone401 17:55e5136790a6 438 mcount &= 0x3F;
casiotone401 17:55e5136790a6 439 }
casiotone401 14:977f3c5a4b4e 440 }
casiotone401 14:977f3c5a4b4e 441
casiotone401 15:3e4bc47d6a39 442
casiotone401 5:e305509d53f3 443 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 444 // Check BPM
casiotone401 15:3e4bc47d6a39 445
casiotone401 15:3e4bc47d6a39 446 inline int CheckBPM()
casiotone401 15:3e4bc47d6a39 447 {
casiotone401 15:3e4bc47d6a39 448 static int _bpm = -1;
casiotone401 15:3e4bc47d6a39 449 int bpm;
casiotone401 14:977f3c5a4b4e 450
casiotone401 15:3e4bc47d6a39 451 if (gCtrlSW[0])
casiotone401 14:977f3c5a4b4e 452 {
casiotone401 15:3e4bc47d6a39 453 bpm = 0;
casiotone401 15:3e4bc47d6a39 454
casiotone401 15:3e4bc47d6a39 455 return bpm;
casiotone401 0:a4d93cd4c30d 456 }
casiotone401 3:ca15241dd6b4 457
casiotone401 20:a44f4a024902 458 if (gCtrl[0]) {
casiotone401 15:3e4bc47d6a39 459
casiotone401 15:3e4bc47d6a39 460 bpm = (gCtrl[0] * 240 + 5);
casiotone401 15:3e4bc47d6a39 461
casiotone401 15:3e4bc47d6a39 462 if (abs(bpm - _bpm) > 1)
casiotone401 15:3e4bc47d6a39 463 {
casiotone401 15:3e4bc47d6a39 464 _bpm = bpm;
casiotone401 15:3e4bc47d6a39 465
casiotone401 15:3e4bc47d6a39 466 sendMes.setTopAddress("/bpm");
casiotone401 15:3e4bc47d6a39 467 sendMes.setArgs("i", bpm);
casiotone401 15:3e4bc47d6a39 468 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 469 }
casiotone401 15:3e4bc47d6a39 470 }
casiotone401 15:3e4bc47d6a39 471
casiotone401 15:3e4bc47d6a39 472 return bpm;
casiotone401 15:3e4bc47d6a39 473 }
casiotone401 15:3e4bc47d6a39 474
casiotone401 15:3e4bc47d6a39 475 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 476 // Check Mode SW
casiotone401 15:3e4bc47d6a39 477
casiotone401 20:a44f4a024902 478 void CheckModeSW()
casiotone401 15:3e4bc47d6a39 479 {
casiotone401 15:3e4bc47d6a39 480 if (gMode < MODE_TOTAL - 1)
casiotone401 15:3e4bc47d6a39 481 {
casiotone401 15:3e4bc47d6a39 482 ++gMode;
casiotone401 15:3e4bc47d6a39 483
casiotone401 15:3e4bc47d6a39 484 } else {
casiotone401 15:3e4bc47d6a39 485
casiotone401 15:3e4bc47d6a39 486 gMode = 0;
casiotone401 15:3e4bc47d6a39 487 }
casiotone401 15:3e4bc47d6a39 488
casiotone401 15:3e4bc47d6a39 489 gCLOCKOUT = gGATES[0] = gGATES[1] = gGATES[2] = gGATES[3] = false;
casiotone401 21:2273c3676f1b 490 gSubModeCount1 = gSubModeCount2 = 0;
casiotone401 15:3e4bc47d6a39 491
casiotone401 24:99045b0f7c4a 492 if (gMode != MODE_CLB || gMode != MODE_OSC)
casiotone401 15:3e4bc47d6a39 493 {
casiotone401 15:3e4bc47d6a39 494 gTimer.start(); // Sequencer Timer Start
casiotone401 15:3e4bc47d6a39 495 midi.begin(1);
casiotone401 5:e305509d53f3 496
casiotone401 15:3e4bc47d6a39 497 } else {
casiotone401 15:3e4bc47d6a39 498
casiotone401 15:3e4bc47d6a39 499 gTimer.stop(); // Sequencer Timer Stop
casiotone401 5:e305509d53f3 500 }
casiotone401 5:e305509d53f3 501
casiotone401 4:b9f5ae574447 502 }
casiotone401 4:b9f5ae574447 503
casiotone401 4:b9f5ae574447 504 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 505 // Print LCD Mode Status
casiotone401 15:3e4bc47d6a39 506
casiotone401 15:3e4bc47d6a39 507 inline void LCD()
casiotone401 15:3e4bc47d6a39 508 {
casiotone401 15:3e4bc47d6a39 509 static int _mode = -1;
casiotone401 15:3e4bc47d6a39 510 static int _qmode = -1;
casiotone401 15:3e4bc47d6a39 511 static int qmode;
casiotone401 15:3e4bc47d6a39 512
casiotone401 15:3e4bc47d6a39 513 if (_mode != gMode)
casiotone401 15:3e4bc47d6a39 514 {
casiotone401 15:3e4bc47d6a39 515 sendMes.setTopAddress("/mode");
casiotone401 15:3e4bc47d6a39 516
casiotone401 15:3e4bc47d6a39 517 switch (gMode)
casiotone401 15:3e4bc47d6a39 518 {
casiotone401 24:99045b0f7c4a 519 case MODE_CLB:
casiotone401 15:3e4bc47d6a39 520 gLCD.locate( 9, 0 );
casiotone401 15:3e4bc47d6a39 521 gLCD.printf("CLB|880");
casiotone401 15:3e4bc47d6a39 522
casiotone401 21:2273c3676f1b 523 gLCD.locate( 0, 1 );
casiotone401 21:2273c3676f1b 524 gLCD.printf("12345678 G>>%3.2f", gGlide);
casiotone401 21:2273c3676f1b 525
casiotone401 15:3e4bc47d6a39 526 sendMes.setArgs("s", "Calibration");
casiotone401 15:3e4bc47d6a39 527 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 528
casiotone401 15:3e4bc47d6a39 529 sendMes.setTopAddress("/scale");
casiotone401 15:3e4bc47d6a39 530 sendMes.setArgs("s", "880Hz");
casiotone401 15:3e4bc47d6a39 531
casiotone401 15:3e4bc47d6a39 532 _qmode = -1;
casiotone401 15:3e4bc47d6a39 533
casiotone401 15:3e4bc47d6a39 534 break;
casiotone401 15:3e4bc47d6a39 535
casiotone401 15:3e4bc47d6a39 536 case MODE_OSC:
casiotone401 15:3e4bc47d6a39 537 gLCD.locate( 9, 0 );
casiotone401 15:3e4bc47d6a39 538 gLCD.printf("OSC|");
casiotone401 15:3e4bc47d6a39 539
casiotone401 15:3e4bc47d6a39 540 sendMes.setArgs("s", "OSCtoCV");
casiotone401 15:3e4bc47d6a39 541
casiotone401 15:3e4bc47d6a39 542 break;
casiotone401 15:3e4bc47d6a39 543
casiotone401 15:3e4bc47d6a39 544 case MODE_SEQ:
casiotone401 15:3e4bc47d6a39 545 gLCD.locate( 9, 0 );
casiotone401 15:3e4bc47d6a39 546 gLCD.printf("ASR|");
casiotone401 15:3e4bc47d6a39 547
casiotone401 15:3e4bc47d6a39 548 sendMes.setArgs("s", "ASR SEQ");
casiotone401 15:3e4bc47d6a39 549
casiotone401 15:3e4bc47d6a39 550 break;
casiotone401 15:3e4bc47d6a39 551
casiotone401 15:3e4bc47d6a39 552 case MODE_185:
casiotone401 15:3e4bc47d6a39 553 gLCD.locate( 9, 0 );
casiotone401 15:3e4bc47d6a39 554 gLCD.printf("185|");
casiotone401 15:3e4bc47d6a39 555
casiotone401 15:3e4bc47d6a39 556 sendMes.setArgs("s", "M185 SEQ");
casiotone401 15:3e4bc47d6a39 557
casiotone401 15:3e4bc47d6a39 558 break;
casiotone401 24:99045b0f7c4a 559
casiotone401 24:99045b0f7c4a 560 case MODE_437:
casiotone401 24:99045b0f7c4a 561 gLCD.locate( 9, 0 );
casiotone401 24:99045b0f7c4a 562 gLCD.printf("437|");
casiotone401 24:99045b0f7c4a 563
casiotone401 24:99045b0f7c4a 564 sendMes.setArgs("s", "F437 SEQ");
casiotone401 24:99045b0f7c4a 565
casiotone401 24:99045b0f7c4a 566 break;
casiotone401 15:3e4bc47d6a39 567
casiotone401 15:3e4bc47d6a39 568 case MODE_EUC:
casiotone401 15:3e4bc47d6a39 569 gLCD.locate( 9, 0 );
casiotone401 15:3e4bc47d6a39 570 gLCD.printf("EUC|");
casiotone401 15:3e4bc47d6a39 571
casiotone401 15:3e4bc47d6a39 572 sendMes.setArgs("s", "Euclidean SEQ");
casiotone401 15:3e4bc47d6a39 573
casiotone401 15:3e4bc47d6a39 574 break;
casiotone401 24:99045b0f7c4a 575
casiotone401 24:99045b0f7c4a 576 case MODE_RND:
casiotone401 24:99045b0f7c4a 577 gLCD.locate( 9, 0 );
casiotone401 24:99045b0f7c4a 578 gLCD.printf("RND|");
casiotone401 24:99045b0f7c4a 579
casiotone401 24:99045b0f7c4a 580 sendMes.setArgs("s", "Xorshift Random");
casiotone401 24:99045b0f7c4a 581
casiotone401 24:99045b0f7c4a 582 break;
casiotone401 15:3e4bc47d6a39 583
casiotone401 24:99045b0f7c4a 584 case MODE_LFO:
casiotone401 24:99045b0f7c4a 585 gLCD.locate( 9, 0 );
casiotone401 24:99045b0f7c4a 586 gLCD.printf("LFO|");
casiotone401 24:99045b0f7c4a 587
casiotone401 24:99045b0f7c4a 588 sendMes.setArgs("s", "Stepped LFO");
casiotone401 24:99045b0f7c4a 589
casiotone401 24:99045b0f7c4a 590 break;
casiotone401 24:99045b0f7c4a 591
casiotone401 15:3e4bc47d6a39 592 default:
casiotone401 15:3e4bc47d6a39 593 break;
casiotone401 15:3e4bc47d6a39 594 }
casiotone401 15:3e4bc47d6a39 595
casiotone401 15:3e4bc47d6a39 596 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 597 _mode = gMode;
casiotone401 15:3e4bc47d6a39 598 }
casiotone401 15:3e4bc47d6a39 599
casiotone401 15:3e4bc47d6a39 600 qmode = (gCtrl[1] * (SCALE_NUM - 1));
casiotone401 15:3e4bc47d6a39 601
casiotone401 17:55e5136790a6 602 if (_qmode != qmode)
casiotone401 15:3e4bc47d6a39 603 {
casiotone401 15:3e4bc47d6a39 604 sendMes.setTopAddress("/scale");
casiotone401 15:3e4bc47d6a39 605
casiotone401 15:3e4bc47d6a39 606 switch (qmode)
casiotone401 15:3e4bc47d6a39 607 {
casiotone401 15:3e4bc47d6a39 608 case Lin:
casiotone401 15:3e4bc47d6a39 609 gLCD.locate( 13, 0 );
casiotone401 15:3e4bc47d6a39 610 gLCD.printf("lin");
casiotone401 15:3e4bc47d6a39 611
casiotone401 15:3e4bc47d6a39 612 sendMes.setArgs("s", "Linear");
casiotone401 15:3e4bc47d6a39 613
casiotone401 15:3e4bc47d6a39 614 break;
casiotone401 15:3e4bc47d6a39 615
casiotone401 15:3e4bc47d6a39 616 case Chr:
casiotone401 15:3e4bc47d6a39 617 gLCD.locate( 13, 0 );
casiotone401 15:3e4bc47d6a39 618 gLCD.printf("chr");
casiotone401 15:3e4bc47d6a39 619
casiotone401 15:3e4bc47d6a39 620 sendMes.setArgs("s", "Chromatic");
casiotone401 15:3e4bc47d6a39 621
casiotone401 15:3e4bc47d6a39 622 break;
casiotone401 15:3e4bc47d6a39 623
casiotone401 15:3e4bc47d6a39 624 case Maj:
casiotone401 15:3e4bc47d6a39 625 gLCD.locate( 13, 0 );
casiotone401 15:3e4bc47d6a39 626 gLCD.printf("maj");
casiotone401 15:3e4bc47d6a39 627
casiotone401 15:3e4bc47d6a39 628 sendMes.setArgs("s", "Major");
casiotone401 15:3e4bc47d6a39 629
casiotone401 15:3e4bc47d6a39 630 break;
casiotone401 15:3e4bc47d6a39 631
casiotone401 15:3e4bc47d6a39 632 case M7:
casiotone401 15:3e4bc47d6a39 633 gLCD.locate( 13, 0 );
casiotone401 15:3e4bc47d6a39 634 gLCD.printf("ma7");
casiotone401 15:3e4bc47d6a39 635
casiotone401 15:3e4bc47d6a39 636 sendMes.setArgs("s", "Major7");
casiotone401 15:3e4bc47d6a39 637
casiotone401 15:3e4bc47d6a39 638 break;
casiotone401 15:3e4bc47d6a39 639
casiotone401 15:3e4bc47d6a39 640 case Min7:
casiotone401 15:3e4bc47d6a39 641 gLCD.locate( 13, 0 );
casiotone401 15:3e4bc47d6a39 642 gLCD.printf("mi7");
casiotone401 15:3e4bc47d6a39 643
casiotone401 15:3e4bc47d6a39 644 sendMes.setArgs("s", "Minor7");
casiotone401 15:3e4bc47d6a39 645
casiotone401 15:3e4bc47d6a39 646 break;
casiotone401 15:3e4bc47d6a39 647
casiotone401 15:3e4bc47d6a39 648 case Dor:
casiotone401 15:3e4bc47d6a39 649 gLCD.locate( 13, 0 );
casiotone401 15:3e4bc47d6a39 650 gLCD.printf("dor");
casiotone401 15:3e4bc47d6a39 651
casiotone401 15:3e4bc47d6a39 652 sendMes.setArgs("s", "Dorian");
casiotone401 15:3e4bc47d6a39 653
casiotone401 15:3e4bc47d6a39 654 break;
casiotone401 15:3e4bc47d6a39 655
casiotone401 15:3e4bc47d6a39 656 case Min:
casiotone401 15:3e4bc47d6a39 657 gLCD.locate( 13, 0 );
casiotone401 15:3e4bc47d6a39 658 gLCD.printf("min");
casiotone401 15:3e4bc47d6a39 659
casiotone401 15:3e4bc47d6a39 660 sendMes.setTopAddress("/scale");
casiotone401 15:3e4bc47d6a39 661 sendMes.setArgs("s", "Minor");
casiotone401 15:3e4bc47d6a39 662
casiotone401 15:3e4bc47d6a39 663 break;
casiotone401 15:3e4bc47d6a39 664
casiotone401 15:3e4bc47d6a39 665 case S5th:
casiotone401 15:3e4bc47d6a39 666 gLCD.locate( 13, 0 );
casiotone401 15:3e4bc47d6a39 667 gLCD.printf("5th");
casiotone401 15:3e4bc47d6a39 668
casiotone401 15:3e4bc47d6a39 669 sendMes.setArgs("s", "5th");
casiotone401 15:3e4bc47d6a39 670
casiotone401 15:3e4bc47d6a39 671 break;
casiotone401 15:3e4bc47d6a39 672
casiotone401 15:3e4bc47d6a39 673 case Wht:
casiotone401 15:3e4bc47d6a39 674 gLCD.locate( 13, 0 );
casiotone401 15:3e4bc47d6a39 675 gLCD.printf("wht");
casiotone401 15:3e4bc47d6a39 676
casiotone401 15:3e4bc47d6a39 677 sendMes.setArgs("s", "Whole Tone");
casiotone401 15:3e4bc47d6a39 678 break;
casiotone401 15:3e4bc47d6a39 679
casiotone401 15:3e4bc47d6a39 680 default:
casiotone401 15:3e4bc47d6a39 681 break;
casiotone401 15:3e4bc47d6a39 682 }
casiotone401 15:3e4bc47d6a39 683
casiotone401 15:3e4bc47d6a39 684 osc.sendOsc(&sendMes);
casiotone401 15:3e4bc47d6a39 685 _qmode = qmode;
casiotone401 15:3e4bc47d6a39 686 }
casiotone401 15:3e4bc47d6a39 687
casiotone401 4:b9f5ae574447 688 }
casiotone401 4:b9f5ae574447 689
casiotone401 15:3e4bc47d6a39 690
casiotone401 0:a4d93cd4c30d 691 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 692 // Write command Custom Char LCD CGRAM for CV Meter)
casiotone401 0:a4d93cd4c30d 693
casiotone401 0:a4d93cd4c30d 694 void WriteCustomChar(unsigned char addr, unsigned char *c)
casiotone401 0:a4d93cd4c30d 695 {
casiotone401 0:a4d93cd4c30d 696 char cnt = 0;
casiotone401 0:a4d93cd4c30d 697 addr = ((addr << 3) | 0x40);
casiotone401 0:a4d93cd4c30d 698
casiotone401 15:3e4bc47d6a39 699 while (cnt < 0x08)
casiotone401 0:a4d93cd4c30d 700 {
casiotone401 0:a4d93cd4c30d 701 gLCD.writeCommand(addr | cnt);
casiotone401 0:a4d93cd4c30d 702 gLCD.writeData(*c);
casiotone401 4:b9f5ae574447 703
casiotone401 15:3e4bc47d6a39 704 ++cnt;
casiotone401 15:3e4bc47d6a39 705 ++c;
casiotone401 0:a4d93cd4c30d 706 }
casiotone401 0:a4d93cd4c30d 707 }
casiotone401 0:a4d93cd4c30d 708
casiotone401 0:a4d93cd4c30d 709 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 710 // Setup Ethernet port
casiotone401 0:a4d93cd4c30d 711
casiotone401 0:a4d93cd4c30d 712 int SetupEthNetIf()
casiotone401 0:a4d93cd4c30d 713 {
casiotone401 0:a4d93cd4c30d 714 gLCD.locate( 0, 1 );
casiotone401 0:a4d93cd4c30d 715 gLCD.printf("Setting up... ");
casiotone401 0:a4d93cd4c30d 716 // printf("Setting up...\r\n");
casiotone401 0:a4d93cd4c30d 717 EthernetErr ethErr = gEth.setup();
casiotone401 0:a4d93cd4c30d 718
casiotone401 15:3e4bc47d6a39 719 if (ethErr)
casiotone401 0:a4d93cd4c30d 720 {
casiotone401 0:a4d93cd4c30d 721 gLCD.locate( 0, 1 );
casiotone401 0:a4d93cd4c30d 722 gLCD.printf("Error in setup.");
casiotone401 0:a4d93cd4c30d 723 // printf("Error %d in setup.\r\n", ethErr);
casiotone401 0:a4d93cd4c30d 724 return -1;
casiotone401 0:a4d93cd4c30d 725 }
casiotone401 0:a4d93cd4c30d 726 // printf("Setup OK\r\n");
casiotone401 0:a4d93cd4c30d 727
casiotone401 0:a4d93cd4c30d 728 // printf("IP address %d.%d.%d.%d\r\n", gEth.getIp()[0], gEth.getIp()[1], gEth.getIp()[2], gEth.getIp()[3]);
casiotone401 0:a4d93cd4c30d 729 Host broadcast(IpAddr(gEth.getIp()[0], gEth.getIp()[1], gEth.getIp()[2], 255), INPUT_PORT, NULL);
casiotone401 0:a4d93cd4c30d 730 gUdp.setOnEvent(&onUDPSocketEvent);
casiotone401 0:a4d93cd4c30d 731 gUdp.bind(broadcast);
casiotone401 4:b9f5ae574447 732
casiotone401 0:a4d93cd4c30d 733 gLCD.locate( 0, 1 );
casiotone401 0:a4d93cd4c30d 734 gLCD.printf("%03d.%03d.%03d.%03d", gEth.getIp()[0], gEth.getIp()[1], gEth.getIp()[2], gEth.getIp()[3]);
casiotone401 15:3e4bc47d6a39 735
casiotone401 4:b9f5ae574447 736 wait(1.0);
casiotone401 0:a4d93cd4c30d 737
casiotone401 0:a4d93cd4c30d 738 return 0;
casiotone401 0:a4d93cd4c30d 739 }
casiotone401 0:a4d93cd4c30d 740
casiotone401 14:977f3c5a4b4e 741
casiotone401 14:977f3c5a4b4e 742 //-------------------------------------------------------------
casiotone401 15:3e4bc47d6a39 743 // Handller receive OSC UDP Packet
casiotone401 0:a4d93cd4c30d 744
casiotone401 4:b9f5ae574447 745 inline void onUDPSocketEvent(UDPSocketEvent e)
casiotone401 0:a4d93cd4c30d 746 {
casiotone401 15:3e4bc47d6a39 747 static union OSCarg msg[10];
casiotone401 24:99045b0f7c4a 748 static char buf[1024] = {0};
casiotone401 15:3e4bc47d6a39 749 static int recvlen;
casiotone401 24:99045b0f7c4a 750 static int num, numrow, len, offset;
casiotone401 14:977f3c5a4b4e 751 int messagepos = 0;
casiotone401 14:977f3c5a4b4e 752 bool bundleflag = false;
casiotone401 10:ccfeb687c3f2 753
casiotone401 10:ccfeb687c3f2 754 Host host;
casiotone401 10:ccfeb687c3f2 755
casiotone401 15:3e4bc47d6a39 756 switch (e)
casiotone401 0:a4d93cd4c30d 757 {
casiotone401 4:b9f5ae574447 758 case UDPSOCKET_READABLE: // The only event for now
casiotone401 15:3e4bc47d6a39 759
casiotone401 24:99045b0f7c4a 760 recvlen = gUdp.recvfrom(buf, 1024, &host); // packet length
casiotone401 10:ccfeb687c3f2 761
casiotone401 15:3e4bc47d6a39 762 if (recvlen <= 0) break;
casiotone401 15:3e4bc47d6a39 763
casiotone401 15:3e4bc47d6a39 764 if (!bundleflag && buf[0] == '#') // #bundle
casiotone401 0:a4d93cd4c30d 765 {
casiotone401 10:ccfeb687c3f2 766 messagepos += 16; // skip #bundle & timetag
casiotone401 10:ccfeb687c3f2 767 recvlen -= 16;
casiotone401 0:a4d93cd4c30d 768
casiotone401 10:ccfeb687c3f2 769 bundleflag = true;
casiotone401 10:ccfeb687c3f2 770 }
casiotone401 10:ccfeb687c3f2 771
casiotone401 10:ccfeb687c3f2 772 do {
casiotone401 15:3e4bc47d6a39 773 if (bundleflag)
casiotone401 10:ccfeb687c3f2 774 {
casiotone401 10:ccfeb687c3f2 775 messagepos += 4;
casiotone401 10:ccfeb687c3f2 776 recvlen -= 4;
casiotone401 15:3e4bc47d6a39 777
casiotone401 15:3e4bc47d6a39 778 if (recvlen <= 8)
casiotone401 10:ccfeb687c3f2 779 {
casiotone401 10:ccfeb687c3f2 780 bundleflag = false;
casiotone401 10:ccfeb687c3f2 781 break;
casiotone401 10:ccfeb687c3f2 782 }
casiotone401 10:ccfeb687c3f2 783 }
casiotone401 10:ccfeb687c3f2 784
casiotone401 15:3e4bc47d6a39 785 if (getOSCmsg(buf + messagepos, msg) == -1) continue;
casiotone401 4:b9f5ae574447 786
casiotone401 15:3e4bc47d6a39 787 len = strlength(msg[0].address);
casiotone401 10:ccfeb687c3f2 788
casiotone401 15:3e4bc47d6a39 789 if (isdigit(msg[0].address[len-1]))
casiotone401 10:ccfeb687c3f2 790 {
casiotone401 10:ccfeb687c3f2 791 num = msg[0].address[len-1] - '0' - 1;
casiotone401 15:3e4bc47d6a39 792
casiotone401 15:3e4bc47d6a39 793 offset = 1;
casiotone401 15:3e4bc47d6a39 794
casiotone401 15:3e4bc47d6a39 795 if (isdigit(msg[0].address[len-2]))
casiotone401 15:3e4bc47d6a39 796 {
casiotone401 15:3e4bc47d6a39 797 offset = 2;
casiotone401 15:3e4bc47d6a39 798 num += 10;
casiotone401 15:3e4bc47d6a39 799 }
casiotone401 15:3e4bc47d6a39 800
casiotone401 10:ccfeb687c3f2 801 } else {
casiotone401 0:a4d93cd4c30d 802
casiotone401 10:ccfeb687c3f2 803 num = -1;
casiotone401 10:ccfeb687c3f2 804 }
casiotone401 10:ccfeb687c3f2 805
casiotone401 10:ccfeb687c3f2 806 // address pattern SYNC & GATE (Type Tag int, float)
casiotone401 17:55e5136790a6 807 if (!strncmp(msg[0].address + (len - offset) - 4, "sync", 4))
casiotone401 10:ccfeb687c3f2 808 {
casiotone401 15:3e4bc47d6a39 809 if (msg[2].i != 0) gCLOCKOUT = true;
casiotone401 15:3e4bc47d6a39 810 else gCLOCKOUT = false;
casiotone401 10:ccfeb687c3f2 811 continue;
casiotone401 10:ccfeb687c3f2 812
casiotone401 17:55e5136790a6 813 } else if (!strncmp(msg[0].address + (len - offset) - 4, "gate", 4) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 814 if (num > 3) continue;
casiotone401 15:3e4bc47d6a39 815 if (msg[2].i != 0) gGATES[num] = true;
casiotone401 15:3e4bc47d6a39 816 else gGATES[num] = false;
casiotone401 10:ccfeb687c3f2 817 continue;
casiotone401 10:ccfeb687c3f2 818 // (touchOSC Control push, toggle)
casiotone401 17:55e5136790a6 819 } else if (!strncmp(msg[0].address + (len - offset) - 5, "fader", 5) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 820 if (num > 7) continue;
casiotone401 15:3e4bc47d6a39 821 gOSC_cv[num] = msg[2].f * (SCALING_N);
casiotone401 10:ccfeb687c3f2 822 continue;
casiotone401 15:3e4bc47d6a39 823
casiotone401 17:55e5136790a6 824 } else if (!strncmp(msg[0].address + (len - offset) - 9, "multixy1/", 9) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 825 if (num > 7) continue;
casiotone401 15:3e4bc47d6a39 826 if (msg[1].typeTag[1] == 'f') gOSC_cv[num] = msg[2].f * (SCALING_N);
casiotone401 15:3e4bc47d6a39 827 if (msg[1].typeTag[1] == 'f') gOSC_cv[++num] = msg[3].f * (SCALING_N);
casiotone401 10:ccfeb687c3f2 828 continue;
casiotone401 10:ccfeb687c3f2 829
casiotone401 24:99045b0f7c4a 830 } else if (!strncmp(msg[0].address + (len - offset) - 12, "multifader1/", 12) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 831 if (num > 7) continue;
casiotone401 15:3e4bc47d6a39 832 if (msg[1].typeTag[1] == 'f') gOSC_cv[num] = msg[2].f * (SCALING_N);
casiotone401 10:ccfeb687c3f2 833 continue;
casiotone401 15:3e4bc47d6a39 834
casiotone401 24:99045b0f7c4a 835 } else if (!strncmp(msg[0].address + (len - offset) - 5, "m185/", 5) && (num != -1)) {
casiotone401 24:99045b0f7c4a 836 if (num > 7) continue;
casiotone401 24:99045b0f7c4a 837 if (msg[1].typeTag[1] == 'f') g185_cv[num] = msg[2].f * (SCALING_N);
casiotone401 24:99045b0f7c4a 838 continue;
casiotone401 24:99045b0f7c4a 839
casiotone401 17:55e5136790a6 840 } else if (!strncmp(msg[0].address + (len - offset) -10, "sequencer/", 10) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 841 if (num > 15) continue;
casiotone401 15:3e4bc47d6a39 842 gSeq_cv[num] = msg[2].f * (SCALING_N);
casiotone401 10:ccfeb687c3f2 843 continue;
casiotone401 0:a4d93cd4c30d 844
casiotone401 17:55e5136790a6 845 } else if (!strncmp(msg[0].address + (len - offset) - 6, "ctrlsw", 6) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 846 if (num > 7) continue;
casiotone401 15:3e4bc47d6a39 847 if (msg[2].i != 0) gCtrlSW[num] = true;
casiotone401 14:977f3c5a4b4e 848 else gCtrlSW[num] = false;
casiotone401 10:ccfeb687c3f2 849 continue;
casiotone401 4:b9f5ae574447 850
casiotone401 17:55e5136790a6 851 } else if (!strncmp(msg[0].address + (len - offset) - 4, "ctrl", 4) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 852 if (num > 7) continue;
casiotone401 15:3e4bc47d6a39 853 gCtrl[num] = msg[2].f;
casiotone401 15:3e4bc47d6a39 854 continue;
casiotone401 15:3e4bc47d6a39 855
casiotone401 17:55e5136790a6 856 } else if (!strncmp(msg[0].address + (len - offset) - 9, "pulsecnt/", 9) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 857 if (num > 7) continue;
casiotone401 15:3e4bc47d6a39 858 gPulseCount[num] = msg[2].f;
casiotone401 15:3e4bc47d6a39 859 continue;
casiotone401 15:3e4bc47d6a39 860
casiotone401 17:55e5136790a6 861 } else if (!strncmp(msg[0].address + (len - offset) - 9, "gatemode/", 9) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 862 if (num > 15) continue;
casiotone401 15:3e4bc47d6a39 863 gGateMode[num] = msg[2].f;
casiotone401 15:3e4bc47d6a39 864 continue;
casiotone401 15:3e4bc47d6a39 865
casiotone401 24:99045b0f7c4a 866 } else if (!strncmp(msg[0].address + (len - offset) - 9, "g185mode/", 9) && (num != -1)) {
casiotone401 24:99045b0f7c4a 867 if (num > 7) continue;
casiotone401 24:99045b0f7c4a 868 gGateMode185[num] = msg[2].f;
casiotone401 24:99045b0f7c4a 869 continue;
casiotone401 24:99045b0f7c4a 870
casiotone401 17:55e5136790a6 871 } else if (!strncmp(msg[0].address + (len - offset) - 6, "slide/", 6) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 872 if (num > 15) continue;
casiotone401 15:3e4bc47d6a39 873 gSlide[num] = msg[2].f;
casiotone401 15:3e4bc47d6a39 874 continue;
casiotone401 15:3e4bc47d6a39 875
casiotone401 24:99045b0f7c4a 876 } else if (!strncmp(msg[0].address + (len - offset) - 9, "slide185/", 9) && (num != -1)) {
casiotone401 24:99045b0f7c4a 877 if (num > 7) continue;
casiotone401 24:99045b0f7c4a 878 gSlide185[num] = msg[2].f;
casiotone401 24:99045b0f7c4a 879 continue;
casiotone401 17:55e5136790a6 880
casiotone401 24:99045b0f7c4a 881 } else if (!strncmp(msg[0].address + (len - offset - 2) - 7, "accent/", 7) && (num != -1)) {
casiotone401 24:99045b0f7c4a 882
casiotone401 24:99045b0f7c4a 883 if (isdigit(msg[0].address[len - 3]))
casiotone401 17:55e5136790a6 884 {
casiotone401 24:99045b0f7c4a 885 num = msg[0].address[len - 3] - '0' - 1;
casiotone401 17:55e5136790a6 886 }
casiotone401 17:55e5136790a6 887
casiotone401 17:55e5136790a6 888 gAccent[num] = msg[2].i;
casiotone401 17:55e5136790a6 889 continue;
casiotone401 17:55e5136790a6 890
casiotone401 24:99045b0f7c4a 891 } else if (!strncmp(msg[0].address + (len - offset - 3) - 7, "accent/", 7) && (num != -1)) {
casiotone401 17:55e5136790a6 892
casiotone401 24:99045b0f7c4a 893 if (isdigit(msg[0].address[len - 3]))
casiotone401 17:55e5136790a6 894 {
casiotone401 24:99045b0f7c4a 895 num = msg[0].address[len - 3] - '0' - 1;
casiotone401 17:55e5136790a6 896
casiotone401 24:99045b0f7c4a 897 if (isdigit(msg[0].address[len - 4]))
casiotone401 17:55e5136790a6 898 {
casiotone401 17:55e5136790a6 899 num += 10;
casiotone401 17:55e5136790a6 900 }
casiotone401 17:55e5136790a6 901 }
casiotone401 17:55e5136790a6 902
casiotone401 17:55e5136790a6 903 gAccent[num] = msg[2].i;
casiotone401 17:55e5136790a6 904 continue;
casiotone401 17:55e5136790a6 905
casiotone401 24:99045b0f7c4a 906 } else if (!strncmp(msg[0].address + (len - offset - 3) - 6, "185acc/", 6) && (num != -1)) {
casiotone401 24:99045b0f7c4a 907
casiotone401 24:99045b0f7c4a 908 if (isdigit(msg[0].address[len-3]))
casiotone401 24:99045b0f7c4a 909 {
casiotone401 24:99045b0f7c4a 910 num = msg[0].address[len-3] - '0' - 1;
casiotone401 24:99045b0f7c4a 911
casiotone401 24:99045b0f7c4a 912 if (isdigit(msg[0].address[len - 4]))
casiotone401 24:99045b0f7c4a 913 {
casiotone401 24:99045b0f7c4a 914 num += 10;
casiotone401 24:99045b0f7c4a 915 }
casiotone401 24:99045b0f7c4a 916 }
casiotone401 24:99045b0f7c4a 917
casiotone401 24:99045b0f7c4a 918 gAccent185[num] = msg[2].i;
casiotone401 24:99045b0f7c4a 919 continue;
casiotone401 24:99045b0f7c4a 920
casiotone401 24:99045b0f7c4a 921 } else if (!strncmp(msg[0].address + (len - offset - 2) - 3, "bm/", 3) && (num != -1)) {
casiotone401 24:99045b0f7c4a 922
casiotone401 24:99045b0f7c4a 923 if (isdigit(msg[0].address[len - 3]))
casiotone401 24:99045b0f7c4a 924 {
casiotone401 24:99045b0f7c4a 925 num = msg[0].address[len - 3] - '0' - 1;
casiotone401 24:99045b0f7c4a 926
casiotone401 24:99045b0f7c4a 927 if (isdigit(msg[0].address[len - 4]))
casiotone401 24:99045b0f7c4a 928 {
casiotone401 24:99045b0f7c4a 929 num += 10;
casiotone401 24:99045b0f7c4a 930 }
casiotone401 24:99045b0f7c4a 931 }
casiotone401 24:99045b0f7c4a 932
casiotone401 24:99045b0f7c4a 933 if (isdigit(msg[0].address[len - 1]))
casiotone401 24:99045b0f7c4a 934 {
casiotone401 24:99045b0f7c4a 935 numrow = msg[0].address[len - 1] - '0' - 1;
casiotone401 24:99045b0f7c4a 936 }
casiotone401 24:99045b0f7c4a 937
casiotone401 24:99045b0f7c4a 938 gBeatsMatrix[numrow][num] = msg[2].i;
casiotone401 24:99045b0f7c4a 939 continue;
casiotone401 24:99045b0f7c4a 940
casiotone401 24:99045b0f7c4a 941 } else if (!strncmp(msg[0].address + (len - offset - 3) - 3, "bm/", 3) && (num != -1)) {
casiotone401 24:99045b0f7c4a 942
casiotone401 24:99045b0f7c4a 943 if (isdigit(msg[0].address[len - 3]))
casiotone401 24:99045b0f7c4a 944 {
casiotone401 24:99045b0f7c4a 945 num = msg[0].address[len - 3] - '0' - 1;
casiotone401 24:99045b0f7c4a 946
casiotone401 24:99045b0f7c4a 947 if (isdigit(msg[0].address[len - 4]))
casiotone401 24:99045b0f7c4a 948 {
casiotone401 24:99045b0f7c4a 949 num += 10;
casiotone401 24:99045b0f7c4a 950 }
casiotone401 24:99045b0f7c4a 951 }
casiotone401 24:99045b0f7c4a 952
casiotone401 24:99045b0f7c4a 953 if (isdigit(msg[0].address[len - 1]))
casiotone401 24:99045b0f7c4a 954 {
casiotone401 24:99045b0f7c4a 955 numrow = msg[0].address[len - 1] - '0' - 1;
casiotone401 24:99045b0f7c4a 956 }
casiotone401 24:99045b0f7c4a 957
casiotone401 24:99045b0f7c4a 958 gBeatsMatrix[numrow][num] = msg[2].i;
casiotone401 24:99045b0f7c4a 959 continue;
casiotone401 24:99045b0f7c4a 960
casiotone401 24:99045b0f7c4a 961 } else if (!strncmp(msg[0].address + (len - offset) - 4, "bpc/", 4) && (num != -1)) {
casiotone401 24:99045b0f7c4a 962 if (num > 15) continue;
casiotone401 24:99045b0f7c4a 963 gPulseCountBeats[num] = msg[2].f;
casiotone401 24:99045b0f7c4a 964 continue;
casiotone401 24:99045b0f7c4a 965
casiotone401 24:99045b0f7c4a 966 } else if (!strncmp(msg[0].address + (len - offset) - 4, "blv/", 4) && (num != -1)) {
casiotone401 24:99045b0f7c4a 967 if (num > 7) continue;
casiotone401 24:99045b0f7c4a 968 gBeatsLevel[num] = msg[2].f;
casiotone401 24:99045b0f7c4a 969 continue;
casiotone401 24:99045b0f7c4a 970
casiotone401 24:99045b0f7c4a 971 } else if (!strncmp(msg[0].address + (len - offset) - 4, "bdc/", 4) && (num != -1)) {
casiotone401 24:99045b0f7c4a 972 if (num > 7) continue;
casiotone401 24:99045b0f7c4a 973 gBeatsDecay[num] = msg[2].f;
casiotone401 24:99045b0f7c4a 974 continue;
casiotone401 24:99045b0f7c4a 975
casiotone401 24:99045b0f7c4a 976 } else if (!strncmp(msg[0].address + (len - offset) - 4, "euca", 4) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 977 if (num > 5) continue;
casiotone401 15:3e4bc47d6a39 978 gEucA[num] = msg[2].f;
casiotone401 15:3e4bc47d6a39 979 continue;
casiotone401 15:3e4bc47d6a39 980
casiotone401 17:55e5136790a6 981 } else if (!strncmp(msg[0].address + (len - offset) - 4, "eucb", 4) && (num != -1)) {
casiotone401 15:3e4bc47d6a39 982 if (num > 5) continue;
casiotone401 15:3e4bc47d6a39 983 gEucB[num] = msg[2].f;
casiotone401 15:3e4bc47d6a39 984 continue;
casiotone401 15:3e4bc47d6a39 985
casiotone401 20:a44f4a024902 986 } else if (!strncmp(msg[0].address + (len - offset) - 3, "acv", 3) && (num != -1)) {
casiotone401 20:a44f4a024902 987 if (num > 3) continue;
casiotone401 24:99045b0f7c4a 988 gArdCV[num] = msg[2].i;
casiotone401 20:a44f4a024902 989 continue;
casiotone401 20:a44f4a024902 990
casiotone401 20:a44f4a024902 991 } else if (!strncmp(msg[0].address + (len - offset) - 3, "pot", 3) && (num != -1)) {
casiotone401 21:2273c3676f1b 992 if (num > 1) continue;
casiotone401 20:a44f4a024902 993 gArdPot[num] = msg[2].f;
casiotone401 20:a44f4a024902 994 continue;
casiotone401 20:a44f4a024902 995
casiotone401 20:a44f4a024902 996 } else if (!strncmp(msg[0].address + (len - offset) - 2, "sw", 2) && (num != -1)) {
casiotone401 21:2273c3676f1b 997 if (num > 1) continue;
casiotone401 20:a44f4a024902 998 if (msg[2].i != 0) gArdSW[num] = true;
casiotone401 20:a44f4a024902 999 else gArdSW[num] = false;
casiotone401 20:a44f4a024902 1000 continue;
casiotone401 20:a44f4a024902 1001
casiotone401 15:3e4bc47d6a39 1002 } else {
casiotone401 10:ccfeb687c3f2 1003 continue;
casiotone401 10:ccfeb687c3f2 1004 }
casiotone401 10:ccfeb687c3f2 1005
casiotone401 15:3e4bc47d6a39 1006 } while (bundleflag);
casiotone401 15:3e4bc47d6a39 1007 }
casiotone401 15:3e4bc47d6a39 1008 }