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 Jan 17 10:48:23 2016 +0000
Revision:
23:2cb7fad36ce0
Parent:
21:2273c3676f1b
Child:
24:99045b0f7c4a
bugfix;

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