OSC-CV Converter

Dependencies:   Bonjour OSCReceiver TextLCD mbed mbed-rpc BurstSPI DebouncedInterrupt FastIO MIDI OSC OSCtoCV ClockControl

OSC to CV Converter

http://gtbts.tumblr.com/post/125663817741/osc-to-cv-converter-ver2-mbed-osctocv

/media/uploads/casiotone401/tumblr_nsg7y4pkfg1qlle9fo1_540.png

Committer:
casiotone401
Date:
Fri Dec 21 13:32:18 2012 +0000
Revision:
0:a4d93cd4c30d
Child:
1:fd4f70088311
TI DAC8568 OSC to CV Converter

Who changed what in which revision?

UserRevisionLine numberNew contents of line
casiotone401 0:a4d93cd4c30d 1 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 2 // TI DAC8568 OSC-CV 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 0:a4d93cd4c30d 25 #include "TextLCD.h" //edit "writeCommand" "writeData" protected -> public
casiotone401 0:a4d93cd4c30d 26 #include "EthernetNetIf.h"
casiotone401 0:a4d93cd4c30d 27 #include "HTTPServer.h"
casiotone401 0:a4d93cd4c30d 28 #include "mDNSResponder.h" // mDNS response to announce oneselve
casiotone401 0:a4d93cd4c30d 29 #include "UDPSocket.h"
casiotone401 0:a4d93cd4c30d 30 #include "OSCReceiver.h"
casiotone401 0:a4d93cd4c30d 31 #include <stdlib.h>
casiotone401 0:a4d93cd4c30d 32 #include <ctype.h>
casiotone401 0:a4d93cd4c30d 33 #include "math.h"
casiotone401 0:a4d93cd4c30d 34
casiotone401 0:a4d93cd4c30d 35 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 36 // Define
casiotone401 0:a4d93cd4c30d 37
casiotone401 0:a4d93cd4c30d 38 #define MODE_LIN 0 // Linear ~LinearCV Mode
casiotone401 0:a4d93cd4c30d 39 #define MODE_QChr 1 // Chromatic ~Quantize Mode
casiotone401 0:a4d93cd4c30d 40 #define MODE_QMaj 2 // Major
casiotone401 0:a4d93cd4c30d 41 #define MODE_QDor 3 // Dorian
casiotone401 0:a4d93cd4c30d 42 #define MODE_QPen 4 // Pentatonic
casiotone401 0:a4d93cd4c30d 43
casiotone401 0:a4d93cd4c30d 44 #define QUAN_RES1 116 // Quantize voltage Steps
casiotone401 0:a4d93cd4c30d 45 #define QUAN_RES2 69
casiotone401 0:a4d93cd4c30d 46 #define QUAN_RES3 68
casiotone401 0:a4d93cd4c30d 47 #define QUAN_RES4 48
casiotone401 0:a4d93cd4c30d 48
casiotone401 0:a4d93cd4c30d 49 #define MODE_NUM 5 // Modes
casiotone401 0:a4d93cd4c30d 50
casiotone401 0:a4d93cd4c30d 51 #define SPI_RATE 40000000 // 40Mbps SPI Clock
casiotone401 0:a4d93cd4c30d 52 #define SCALING_N 38400.0
casiotone401 0:a4d93cd4c30d 53 #define INPUT_PORT 12345 // Input Port Number
casiotone401 0:a4d93cd4c30d 54
casiotone401 0:a4d93cd4c30d 55 #define UPDATE_INTERVAL 60 // CV Update Interval (us)
casiotone401 0:a4d93cd4c30d 56 #define POLLING_INTERVAL 25 // Polling Interval (us)
casiotone401 0:a4d93cd4c30d 57
casiotone401 0:a4d93cd4c30d 58 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 59 // DAC8568 Control Bits
casiotone401 0:a4d93cd4c30d 60
casiotone401 0:a4d93cd4c30d 61 #define WRITE 0x00
casiotone401 0:a4d93cd4c30d 62 #define UPDATE 0x01
casiotone401 0:a4d93cd4c30d 63 #define WRITE_UPDATE_ALL 0x02 // LDAC Write to Selected Update All
casiotone401 0:a4d93cd4c30d 64 #define WRITE_UPDATE_N 0x03 // LDAC Write to Selected Update Respective
casiotone401 0:a4d93cd4c30d 65 #define POWER 0x04
casiotone401 0:a4d93cd4c30d 66 #define CLR 0x05 // Clear Code Register
casiotone401 0:a4d93cd4c30d 67 #define WRITE_LDAC_REG 0x06
casiotone401 0:a4d93cd4c30d 68 #define RESET 0x07 // Software Reset DAC8568
casiotone401 0:a4d93cd4c30d 69 #define SETUP_INTERNAL_REF 0x08
casiotone401 0:a4d93cd4c30d 70
casiotone401 0:a4d93cd4c30d 71 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 72
casiotone401 0:a4d93cd4c30d 73 #define _DISABLE 0
casiotone401 0:a4d93cd4c30d 74 #define _ENABLE 1
casiotone401 0:a4d93cd4c30d 75
casiotone401 0:a4d93cd4c30d 76 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 77 // Functions
casiotone401 0:a4d93cd4c30d 78
casiotone401 0:a4d93cd4c30d 79 void NetPoll(void);
casiotone401 0:a4d93cd4c30d 80 void InitOSCCV(void);
casiotone401 0:a4d93cd4c30d 81 void UpdateCV(unsigned char, unsigned char, unsigned int);
casiotone401 0:a4d93cd4c30d 82 void SetCV(void);
casiotone401 0:a4d93cd4c30d 83 void CheckSW(void);
casiotone401 0:a4d93cd4c30d 84 void CVMeter(unsigned int, unsigned int);
casiotone401 0:a4d93cd4c30d 85 void WriteCustomChar(unsigned char, unsigned char*);
casiotone401 0:a4d93cd4c30d 86 int SetupEthNetIf(void);
casiotone401 0:a4d93cd4c30d 87 void onUDPSocketEvent(UDPSocketEvent);
casiotone401 0:a4d93cd4c30d 88
casiotone401 0:a4d93cd4c30d 89 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 90 // Silentway Calibration Data Mapping
casiotone401 0:a4d93cd4c30d 91 // http://www.expert-sleepers.co.uk/silentway.html
casiotone401 0:a4d93cd4c30d 92
casiotone401 0:a4d93cd4c30d 93 // Chromatic Scale
casiotone401 0:a4d93cd4c30d 94 const float calibMap1[QUAN_RES1] = {
casiotone401 0:a4d93cd4c30d 95 0.00663080, 0.01433030, 0.02202980, 0.02972930, 0.03742880,
casiotone401 0:a4d93cd4c30d 96 0.04512830, 0.05282781, 0.06052731, 0.06822681, 0.07592630,
casiotone401 0:a4d93cd4c30d 97 0.08362581, 0.09132531, 0.09902481, 0.10672431, 0.11442380,
casiotone401 0:a4d93cd4c30d 98 0.12212331, 0.12951356, 0.13671936, 0.14392516, 0.15113096,
casiotone401 0:a4d93cd4c30d 99 0.15833676, 0.16554256, 0.17274836, 0.17995416, 0.18715996,
casiotone401 0:a4d93cd4c30d 100 0.19436575, 0.20157155, 0.20877735, 0.21598317, 0.22318897,
casiotone401 0:a4d93cd4c30d 101 0.23039477, 0.23760056, 0.24480636, 0.25202271, 0.25926629,
casiotone401 0:a4d93cd4c30d 102 0.26650983, 0.27375340, 0.28099698, 0.28824055, 0.29548413,
casiotone401 0:a4d93cd4c30d 103 0.30272770, 0.30997124, 0.31721482, 0.32445839, 0.33170196,
casiotone401 0:a4d93cd4c30d 104 0.33894554, 0.34618911, 0.35343266, 0.36067623, 0.36791980,
casiotone401 0:a4d93cd4c30d 105 0.37516347, 0.38241133, 0.38965923, 0.39690709, 0.40415496,
casiotone401 0:a4d93cd4c30d 106 0.41140282, 0.41865072, 0.42589858, 0.43314645, 0.44039431,
casiotone401 0:a4d93cd4c30d 107 0.44764221, 0.45489007, 0.46213794, 0.46938580, 0.47663370,
casiotone401 0:a4d93cd4c30d 108 0.48388156, 0.49112943, 0.49837729, 0.50566339, 0.51296055,
casiotone401 0:a4d93cd4c30d 109 0.52025765, 0.52755481, 0.53485191, 0.54214907, 0.54944617,
casiotone401 0:a4d93cd4c30d 110 0.55674326, 0.56404042, 0.57133752, 0.57863468, 0.58593178,
casiotone401 0:a4d93cd4c30d 111 0.59322894, 0.60052603, 0.60782319, 0.61512029, 0.62241745,
casiotone401 0:a4d93cd4c30d 112 0.62976688, 0.63714498, 0.64452308, 0.65190119, 0.65927929,
casiotone401 0:a4d93cd4c30d 113 0.66665739, 0.67403549, 0.68141359, 0.68879169, 0.69616979,
casiotone401 0:a4d93cd4c30d 114 0.70354789, 0.71092600, 0.71830410, 0.72568226, 0.73306036,
casiotone401 0:a4d93cd4c30d 115 0.74043846, 0.74781656, 0.75820577, 0.76986063, 0.78151548,
casiotone401 0:a4d93cd4c30d 116 0.79317033, 0.80482519, 0.81648004, 0.82813489, 0.83978975,
casiotone401 0:a4d93cd4c30d 117 0.85144460, 0.86309946, 0.87475431, 0.90686423, 0.93941462,
casiotone401 0:a4d93cd4c30d 118 0.97196496
casiotone401 0:a4d93cd4c30d 119 };
casiotone401 0:a4d93cd4c30d 120
casiotone401 0:a4d93cd4c30d 121 // Major Scale
casiotone401 0:a4d93cd4c30d 122 const float calibMap2[QUAN_RES2] = {
casiotone401 0:a4d93cd4c30d 123 0.00663080, 0.01433030, 0.02972930, 0.04512830, 0.05282781,
casiotone401 0:a4d93cd4c30d 124 0.06822681, 0.08362581, 0.09902481, 0.10672431, 0.12212331,
casiotone401 0:a4d93cd4c30d 125 0.13671936, 0.14392516, 0.15833676, 0.17274836, 0.18715996,
casiotone401 0:a4d93cd4c30d 126 0.19436575, 0.20877735, 0.22318897, 0.23039477, 0.24480636,
casiotone401 0:a4d93cd4c30d 127 0.25926629, 0.27375340, 0.28099698, 0.29548413, 0.30997124,
casiotone401 0:a4d93cd4c30d 128 0.31721482, 0.33170196, 0.34618911, 0.36067623, 0.36791980,
casiotone401 0:a4d93cd4c30d 129 0.38241133, 0.39690709, 0.40415496, 0.41865072, 0.43314645,
casiotone401 0:a4d93cd4c30d 130 0.44764221, 0.45489007, 0.46938580, 0.48388156, 0.49112943,
casiotone401 0:a4d93cd4c30d 131 0.50566339, 0.52025765, 0.53485191, 0.54214907, 0.55674326,
casiotone401 0:a4d93cd4c30d 132 0.57133752, 0.57863468, 0.59322894, 0.60782319, 0.62241745,
casiotone401 0:a4d93cd4c30d 133 0.62976688, 0.64452308, 0.65927929, 0.66665739, 0.68141359,
casiotone401 0:a4d93cd4c30d 134 0.69616979, 0.71092600, 0.71830410, 0.73306036, 0.74781656,
casiotone401 0:a4d93cd4c30d 135 0.75820577, 0.78151548, 0.80482519, 0.82813489, 0.83978975,
casiotone401 0:a4d93cd4c30d 136 0.86309946, 0.90686423, 0.93941462
casiotone401 0:a4d93cd4c30d 137 };
casiotone401 0:a4d93cd4c30d 138
casiotone401 0:a4d93cd4c30d 139 // Dorian Scale
casiotone401 0:a4d93cd4c30d 140 const float calibMap3[QUAN_RES3] = {
casiotone401 0:a4d93cd4c30d 141 0.00663080, 0.01433030, 0.02972930, 0.04512830, 0.06052731,
casiotone401 0:a4d93cd4c30d 142 0.06822681, 0.08362581, 0.09902481, 0.10672431, 0.12212331,
casiotone401 0:a4d93cd4c30d 143 0.13671936, 0.15113096, 0.15833676, 0.17274836, 0.18715996,
casiotone401 0:a4d93cd4c30d 144 0.19436575, 0.20877735, 0.22318897, 0.23760056, 0.24480636,
casiotone401 0:a4d93cd4c30d 145 0.25926629, 0.27375340, 0.28099698, 0.29548413, 0.30997124,
casiotone401 0:a4d93cd4c30d 146 0.32445839, 0.33170196, 0.34618911, 0.36067623, 0.36791980,
casiotone401 0:a4d93cd4c30d 147 0.38241133, 0.39690709, 0.41140282, 0.41865072, 0.43314645,
casiotone401 0:a4d93cd4c30d 148 0.44764221, 0.45489007, 0.46938580, 0.48388156, 0.49837729,
casiotone401 0:a4d93cd4c30d 149 0.50566339, 0.52025765, 0.53485191, 0.54214907, 0.55674326,
casiotone401 0:a4d93cd4c30d 150 0.57133752, 0.58593178, 0.59322894, 0.60782319, 0.62241745,
casiotone401 0:a4d93cd4c30d 151 0.62976688, 0.64452308, 0.65927929, 0.67403549, 0.68141359,
casiotone401 0:a4d93cd4c30d 152 0.69616979, 0.71092600, 0.71830410, 0.73306036, 0.74781656,
casiotone401 0:a4d93cd4c30d 153 0.76986063, 0.78151548, 0.80482519, 0.82813489, 0.83978975,
casiotone401 0:a4d93cd4c30d 154 0.86309946, 0.90686423, 0.97196496
casiotone401 0:a4d93cd4c30d 155 };
casiotone401 0:a4d93cd4c30d 156
casiotone401 0:a4d93cd4c30d 157 // Pentatonic Scale
casiotone401 0:a4d93cd4c30d 158 const float calibMap4[QUAN_RES4] = {
casiotone401 0:a4d93cd4c30d 159 0.01433030, 0.02972930, 0.04512830, 0.06822681, 0.08362581,
casiotone401 0:a4d93cd4c30d 160 0.10672431, 0.12212331, 0.13671936, 0.15833676, 0.17274836,
casiotone401 0:a4d93cd4c30d 161 0.19436575, 0.20877735, 0.22318897, 0.24480636, 0.25926629,
casiotone401 0:a4d93cd4c30d 162 0.28099698, 0.29548413, 0.30997124, 0.33170196, 0.34618911,
casiotone401 0:a4d93cd4c30d 163 0.36791980, 0.38241133, 0.39690709, 0.41865072, 0.43314645,
casiotone401 0:a4d93cd4c30d 164 0.45489007, 0.46938580, 0.48388156, 0.50566339, 0.52025765,
casiotone401 0:a4d93cd4c30d 165 0.54214907, 0.55674326, 0.57133752, 0.59322894, 0.60782319,
casiotone401 0:a4d93cd4c30d 166 0.62976688, 0.64452308, 0.65927929, 0.68141359, 0.69616979,
casiotone401 0:a4d93cd4c30d 167 0.71830410, 0.73306036, 0.74781656, 0.78151548, 0.80482519,
casiotone401 0:a4d93cd4c30d 168 0.83978975, 0.86309946, 0.90686423
casiotone401 0:a4d93cd4c30d 169 };
casiotone401 0:a4d93cd4c30d 170
casiotone401 0:a4d93cd4c30d 171 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 172 // CV Meter Custom Character
casiotone401 0:a4d93cd4c30d 173
casiotone401 0:a4d93cd4c30d 174 unsigned char str1[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F};
casiotone401 0:a4d93cd4c30d 175 unsigned char str2[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 176 unsigned char str3[8] = {0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 177 unsigned char str4[8] = {0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 178 unsigned char str5[8] = {0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 179 unsigned char str6[8] = {0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 180 unsigned char str7[8] = {0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 181 unsigned char str8[8] = {0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 182
casiotone401 0:a4d93cd4c30d 183 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 184 // Global Variables
casiotone401 0:a4d93cd4c30d 185
casiotone401 0:a4d93cd4c30d 186 float gOSC_cv[8];
casiotone401 0:a4d93cd4c30d 187 float gGlide;
casiotone401 0:a4d93cd4c30d 188 unsigned int gMode;
casiotone401 0:a4d93cd4c30d 189
casiotone401 0:a4d93cd4c30d 190 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 191 // mbed Functions
casiotone401 0:a4d93cd4c30d 192
casiotone401 0:a4d93cd4c30d 193 TextLCD gLCD(p9, p10, p11, p12, p13, p14); // rs, e, d4-d7
casiotone401 0:a4d93cd4c30d 194
casiotone401 0:a4d93cd4c30d 195 SPI gSPI(p5,p6,p7); // SPI (p6 unconnected)
casiotone401 0:a4d93cd4c30d 196 DigitalOut gSYNCMODE(p15); // SYNC DAC8568
casiotone401 0:a4d93cd4c30d 197 DigitalOut gLDAC(p16); // LDAC DAC8568
casiotone401 0:a4d93cd4c30d 198
casiotone401 0:a4d93cd4c30d 199 DigitalOut gGATES[4] = {p21, p22, p23, p24}; // GateOut
casiotone401 0:a4d93cd4c30d 200 DigitalOut gLEDS[4] = {p18, p19, p20, p28}; // LED
casiotone401 0:a4d93cd4c30d 201 DigitalOut gCLOCKOUT(p25); // ClockOut
casiotone401 0:a4d93cd4c30d 202
casiotone401 0:a4d93cd4c30d 203 AnalogIn gAIN(p17); // Glide Potentiometer
casiotone401 0:a4d93cd4c30d 204 InterruptIn gSW(p30); // Mode SW
casiotone401 0:a4d93cd4c30d 205
casiotone401 0:a4d93cd4c30d 206 Ticker gSetter; // Ticker SetCV
casiotone401 0:a4d93cd4c30d 207 Ticker gPoller; // Ticker Polling
casiotone401 0:a4d93cd4c30d 208
casiotone401 0:a4d93cd4c30d 209 // Ethernet
casiotone401 0:a4d93cd4c30d 210 EthernetNetIf gEth;
casiotone401 0:a4d93cd4c30d 211 UDPSocket gUdp;
casiotone401 0:a4d93cd4c30d 212
casiotone401 0:a4d93cd4c30d 213 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 214 // main
casiotone401 0:a4d93cd4c30d 215
casiotone401 0:a4d93cd4c30d 216 int main()
casiotone401 0:a4d93cd4c30d 217 {
casiotone401 0:a4d93cd4c30d 218 int i;
casiotone401 0:a4d93cd4c30d 219
casiotone401 0:a4d93cd4c30d 220 if(SetupEthNetIf() == -1)
casiotone401 0:a4d93cd4c30d 221 {
casiotone401 0:a4d93cd4c30d 222 for(i = 0; i < 4; i++)
casiotone401 0:a4d93cd4c30d 223 {
casiotone401 0:a4d93cd4c30d 224 gLEDS[i] = 1;
casiotone401 0:a4d93cd4c30d 225 wait(0.25);
casiotone401 0:a4d93cd4c30d 226 }
casiotone401 0:a4d93cd4c30d 227 return -1;
casiotone401 0:a4d93cd4c30d 228 }
casiotone401 0:a4d93cd4c30d 229
casiotone401 0:a4d93cd4c30d 230 // mdns (Bonjour)
casiotone401 0:a4d93cd4c30d 231 HTTPServer svr;
casiotone401 0:a4d93cd4c30d 232 mDNSResponder mdns;
casiotone401 0:a4d93cd4c30d 233 svr.addHandler<SimpleHandler>("/");
casiotone401 0:a4d93cd4c30d 234 svr.bind(INPUT_PORT);
casiotone401 0:a4d93cd4c30d 235 IpAddr ip = gEth.getIp();
casiotone401 0:a4d93cd4c30d 236 mdns.announce(ip, "OSCtoCV", "_osc._udp", INPUT_PORT, "mbed(OSCtoCV)", (char *[]) {"path=/",NULL});
casiotone401 0:a4d93cd4c30d 237
casiotone401 0:a4d93cd4c30d 238 InitOSCCV();
casiotone401 0:a4d93cd4c30d 239
casiotone401 0:a4d93cd4c30d 240 // loop
casiotone401 0:a4d93cd4c30d 241 while(1)
casiotone401 0:a4d93cd4c30d 242 {
casiotone401 0:a4d93cd4c30d 243 gGlide = gAIN.read();
casiotone401 0:a4d93cd4c30d 244
casiotone401 0:a4d93cd4c30d 245 gLCD.locate( 0, 1 );
casiotone401 0:a4d93cd4c30d 246 gLCD.printf("12345678 G>>%3.2f", gGlide);
casiotone401 0:a4d93cd4c30d 247
casiotone401 0:a4d93cd4c30d 248 switch(gMode)
casiotone401 0:a4d93cd4c30d 249 {
casiotone401 0:a4d93cd4c30d 250 case MODE_LIN:
casiotone401 0:a4d93cd4c30d 251 gLCD.locate( 9, 0 );
casiotone401 0:a4d93cd4c30d 252 gLCD.printf("OSC-CV");
casiotone401 0:a4d93cd4c30d 253 break;
casiotone401 0:a4d93cd4c30d 254
casiotone401 0:a4d93cd4c30d 255 case MODE_QChr:
casiotone401 0:a4d93cd4c30d 256 gLCD.locate( 9, 0 );
casiotone401 0:a4d93cd4c30d 257 gLCD.printf("QUAN_C");
casiotone401 0:a4d93cd4c30d 258 break;
casiotone401 0:a4d93cd4c30d 259
casiotone401 0:a4d93cd4c30d 260 case MODE_QMaj:
casiotone401 0:a4d93cd4c30d 261 gLCD.locate( 9, 0 );
casiotone401 0:a4d93cd4c30d 262 gLCD.printf("QUAN_M");
casiotone401 0:a4d93cd4c30d 263 break;
casiotone401 0:a4d93cd4c30d 264
casiotone401 0:a4d93cd4c30d 265 case MODE_QDor:
casiotone401 0:a4d93cd4c30d 266 gLCD.locate( 9, 0 );
casiotone401 0:a4d93cd4c30d 267 gLCD.printf("QUAN_D");
casiotone401 0:a4d93cd4c30d 268 break;
casiotone401 0:a4d93cd4c30d 269
casiotone401 0:a4d93cd4c30d 270 case MODE_QPen:
casiotone401 0:a4d93cd4c30d 271 gLCD.locate( 9, 0 );
casiotone401 0:a4d93cd4c30d 272 gLCD.printf("QUAN_P");
casiotone401 0:a4d93cd4c30d 273 break;
casiotone401 0:a4d93cd4c30d 274 }
casiotone401 0:a4d93cd4c30d 275 //CV Meter
casiotone401 0:a4d93cd4c30d 276 for(i = 0; i < 8; i++)
casiotone401 0:a4d93cd4c30d 277 {
casiotone401 0:a4d93cd4c30d 278 CVMeter(i, (unsigned int)gOSC_cv[i]);
casiotone401 0:a4d93cd4c30d 279 }
casiotone401 0:a4d93cd4c30d 280 }
casiotone401 0:a4d93cd4c30d 281 }
casiotone401 0:a4d93cd4c30d 282
casiotone401 0:a4d93cd4c30d 283 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 284 // Ethernet Polling
casiotone401 0:a4d93cd4c30d 285
casiotone401 0:a4d93cd4c30d 286 void NetPoll()
casiotone401 0:a4d93cd4c30d 287 {
casiotone401 0:a4d93cd4c30d 288 Net::poll();
casiotone401 0:a4d93cd4c30d 289 }
casiotone401 0:a4d93cd4c30d 290
casiotone401 0:a4d93cd4c30d 291 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 292 // Initialize OSC-CV
casiotone401 0:a4d93cd4c30d 293
casiotone401 0:a4d93cd4c30d 294 void InitOSCCV()
casiotone401 0:a4d93cd4c30d 295 {
casiotone401 0:a4d93cd4c30d 296 // write custom char LCD CGRAM
casiotone401 0:a4d93cd4c30d 297 WriteCustomChar(0x00, str1);
casiotone401 0:a4d93cd4c30d 298 WriteCustomChar(0x01, str2);
casiotone401 0:a4d93cd4c30d 299 WriteCustomChar(0x02, str3);
casiotone401 0:a4d93cd4c30d 300 WriteCustomChar(0x03, str4);
casiotone401 0:a4d93cd4c30d 301 WriteCustomChar(0x04, str5);
casiotone401 0:a4d93cd4c30d 302 WriteCustomChar(0x05, str6);
casiotone401 0:a4d93cd4c30d 303 WriteCustomChar(0x06, str7);
casiotone401 0:a4d93cd4c30d 304 WriteCustomChar(0x07, str8);
casiotone401 0:a4d93cd4c30d 305
casiotone401 0:a4d93cd4c30d 306 // Init. SPI
casiotone401 0:a4d93cd4c30d 307 gLDAC = _ENABLE;
casiotone401 0:a4d93cd4c30d 308 gSPI.format(8,1); // Data word length 8bit, Mode=1
casiotone401 0:a4d93cd4c30d 309 gSPI.frequency(SPI_RATE);
casiotone401 0:a4d93cd4c30d 310
casiotone401 0:a4d93cd4c30d 311 UpdateCV(CLR, 0, 0); // Ignore CLR Pin
casiotone401 0:a4d93cd4c30d 312
casiotone401 0:a4d93cd4c30d 313 gSW.mode(PullUp); //Use internal pullup for ModeSW
casiotone401 0:a4d93cd4c30d 314 wait(.001);
casiotone401 0:a4d93cd4c30d 315
casiotone401 0:a4d93cd4c30d 316 gMode = 0;
casiotone401 0:a4d93cd4c30d 317
casiotone401 0:a4d93cd4c30d 318 gSW.fall(&CheckSW); // InterruptIn falling edge(ModeSW)
casiotone401 0:a4d93cd4c30d 319 gSetter.attach_us(&SetCV, UPDATE_INTERVAL); // Ticker SetCV
casiotone401 0:a4d93cd4c30d 320 gPoller.attach_us(&NetPoll, POLLING_INTERVAL); // Ticker Polling
casiotone401 0:a4d93cd4c30d 321 wait(0.5);
casiotone401 0:a4d93cd4c30d 322 }
casiotone401 0:a4d93cd4c30d 323
casiotone401 0:a4d93cd4c30d 324 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 325 // SPI Transfer
casiotone401 0:a4d93cd4c30d 326 // DAC8568 data word length 32bit (8bit shift out)
casiotone401 0:a4d93cd4c30d 327
casiotone401 0:a4d93cd4c30d 328 void UpdateCV(unsigned char control, unsigned char address, unsigned int data)
casiotone401 0:a4d93cd4c30d 329 {
casiotone401 0:a4d93cd4c30d 330 typedef unsigned char byte;
casiotone401 0:a4d93cd4c30d 331
casiotone401 0:a4d93cd4c30d 332 __disable_irq();
casiotone401 0:a4d93cd4c30d 333
casiotone401 0:a4d93cd4c30d 334 switch(control)
casiotone401 0:a4d93cd4c30d 335 {
casiotone401 0:a4d93cd4c30d 336 case WRITE_UPDATE_N:
casiotone401 0:a4d93cd4c30d 337 {
casiotone401 0:a4d93cd4c30d 338 gSYNCMODE = _DISABLE;
casiotone401 0:a4d93cd4c30d 339 gSPI.write(00000000|control); //padding at beginning of byte and control bits
casiotone401 0:a4d93cd4c30d 340 gSPI.write(address << 4 | data >> 12); //address(ch) bits
casiotone401 0:a4d93cd4c30d 341 gSPI.write((data << 4) >> 8); // middle 8 bits of data
casiotone401 0:a4d93cd4c30d 342 gSPI.write((data << 12) >> 8 | 00001111);
casiotone401 0:a4d93cd4c30d 343 gSYNCMODE = _ENABLE;
casiotone401 0:a4d93cd4c30d 344 gLDAC = _DISABLE;
casiotone401 0:a4d93cd4c30d 345 gLDAC = _ENABLE;
casiotone401 0:a4d93cd4c30d 346 break;
casiotone401 0:a4d93cd4c30d 347 }
casiotone401 0:a4d93cd4c30d 348 case RESET:
casiotone401 0:a4d93cd4c30d 349 {
casiotone401 0:a4d93cd4c30d 350 gSYNCMODE = _DISABLE;
casiotone401 0:a4d93cd4c30d 351 gSPI.write(00000111); //Software RESET
casiotone401 0:a4d93cd4c30d 352 gSPI.write(00000000);
casiotone401 0:a4d93cd4c30d 353 gSPI.write(00000000);
casiotone401 0:a4d93cd4c30d 354 gSPI.write(00000000);
casiotone401 0:a4d93cd4c30d 355 gSYNCMODE = _ENABLE;
casiotone401 0:a4d93cd4c30d 356 break;
casiotone401 0:a4d93cd4c30d 357 }
casiotone401 0:a4d93cd4c30d 358 case CLR:
casiotone401 0:a4d93cd4c30d 359 {
casiotone401 0:a4d93cd4c30d 360 gSYNCMODE = _DISABLE;
casiotone401 0:a4d93cd4c30d 361 gSPI.write(00000101); //CLR Register
casiotone401 0:a4d93cd4c30d 362 gSPI.write(00000000);
casiotone401 0:a4d93cd4c30d 363 gSPI.write(00000000);
casiotone401 0:a4d93cd4c30d 364 gSPI.write(00000011); //Ignore CLR Pin
casiotone401 0:a4d93cd4c30d 365 gSYNCMODE = _ENABLE;
casiotone401 0:a4d93cd4c30d 366 break;
casiotone401 0:a4d93cd4c30d 367 }
casiotone401 0:a4d93cd4c30d 368 }
casiotone401 0:a4d93cd4c30d 369
casiotone401 0:a4d93cd4c30d 370 __enable_irq();
casiotone401 0:a4d93cd4c30d 371 }
casiotone401 0:a4d93cd4c30d 372
casiotone401 0:a4d93cd4c30d 373 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 374 // Calculate CV
casiotone401 0:a4d93cd4c30d 375
casiotone401 0:a4d93cd4c30d 376 void SetCV()
casiotone401 0:a4d93cd4c30d 377 {
casiotone401 0:a4d93cd4c30d 378 static unsigned int ch;
casiotone401 0:a4d93cd4c30d 379 float glidecv[8];
casiotone401 0:a4d93cd4c30d 380 unsigned int cv[8];
casiotone401 0:a4d93cd4c30d 381 static float oldcv[8];
casiotone401 0:a4d93cd4c30d 382 static unsigned int quan;
casiotone401 0:a4d93cd4c30d 383 float qcv;
casiotone401 0:a4d93cd4c30d 384
casiotone401 0:a4d93cd4c30d 385 switch(gMode)
casiotone401 0:a4d93cd4c30d 386 {
casiotone401 0:a4d93cd4c30d 387 case MODE_LIN:
casiotone401 0:a4d93cd4c30d 388
casiotone401 0:a4d93cd4c30d 389 glidecv[ch] = oldcv[ch] * gGlide + gOSC_cv[ch] * (1.0f - gGlide);
casiotone401 0:a4d93cd4c30d 390 oldcv[ch] = glidecv[ch];
casiotone401 0:a4d93cd4c30d 391 cv[ch] = (unsigned int)glidecv[ch];
casiotone401 0:a4d93cd4c30d 392
casiotone401 0:a4d93cd4c30d 393 UpdateCV(WRITE_UPDATE_N, ch, cv[ch]);
casiotone401 0:a4d93cd4c30d 394 break;
casiotone401 0:a4d93cd4c30d 395
casiotone401 0:a4d93cd4c30d 396 case MODE_QChr:
casiotone401 0:a4d93cd4c30d 397
casiotone401 0:a4d93cd4c30d 398 quan = 65535 / QUAN_RES1;
casiotone401 0:a4d93cd4c30d 399 qcv = calibMap1[(unsigned int)(gOSC_cv[ch] / quan )];
casiotone401 0:a4d93cd4c30d 400
casiotone401 0:a4d93cd4c30d 401 glidecv[ch] = oldcv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:a4d93cd4c30d 402 oldcv[ch] = glidecv[ch];
casiotone401 0:a4d93cd4c30d 403 cv[ch] = (unsigned int)glidecv[ch];
casiotone401 0:a4d93cd4c30d 404
casiotone401 0:a4d93cd4c30d 405 UpdateCV(WRITE_UPDATE_N, ch, cv[ch]);
casiotone401 0:a4d93cd4c30d 406 break;
casiotone401 0:a4d93cd4c30d 407
casiotone401 0:a4d93cd4c30d 408 case MODE_QMaj:
casiotone401 0:a4d93cd4c30d 409
casiotone401 0:a4d93cd4c30d 410 quan = 65535 / QUAN_RES2;
casiotone401 0:a4d93cd4c30d 411 qcv = calibMap2[(unsigned int)(gOSC_cv[ch] / quan )];
casiotone401 0:a4d93cd4c30d 412
casiotone401 0:a4d93cd4c30d 413 glidecv[ch] = oldcv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:a4d93cd4c30d 414 oldcv[ch] = glidecv[ch];
casiotone401 0:a4d93cd4c30d 415 cv[ch] = (unsigned int)glidecv[ch];
casiotone401 0:a4d93cd4c30d 416
casiotone401 0:a4d93cd4c30d 417 UpdateCV(WRITE_UPDATE_N, ch, cv[ch]);
casiotone401 0:a4d93cd4c30d 418 break;
casiotone401 0:a4d93cd4c30d 419
casiotone401 0:a4d93cd4c30d 420 case MODE_QDor:
casiotone401 0:a4d93cd4c30d 421
casiotone401 0:a4d93cd4c30d 422 quan = 65535 / QUAN_RES3;
casiotone401 0:a4d93cd4c30d 423 qcv = calibMap3[(unsigned int)(gOSC_cv[ch] / quan )];
casiotone401 0:a4d93cd4c30d 424
casiotone401 0:a4d93cd4c30d 425 glidecv[ch] = oldcv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:a4d93cd4c30d 426 oldcv[ch] = glidecv[ch];
casiotone401 0:a4d93cd4c30d 427 cv[ch] = (unsigned int)glidecv[ch];
casiotone401 0:a4d93cd4c30d 428
casiotone401 0:a4d93cd4c30d 429 UpdateCV(WRITE_UPDATE_N, ch, cv[ch]);
casiotone401 0:a4d93cd4c30d 430 break;
casiotone401 0:a4d93cd4c30d 431
casiotone401 0:a4d93cd4c30d 432 case MODE_QPen:
casiotone401 0:a4d93cd4c30d 433
casiotone401 0:a4d93cd4c30d 434 quan = 65535 / QUAN_RES4;
casiotone401 0:a4d93cd4c30d 435 qcv = calibMap4[(unsigned int)(gOSC_cv[ch] / quan )];
casiotone401 0:a4d93cd4c30d 436
casiotone401 0:a4d93cd4c30d 437 glidecv[ch] = oldcv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:a4d93cd4c30d 438 oldcv[ch] = glidecv[ch];
casiotone401 0:a4d93cd4c30d 439 cv[ch] = (unsigned int)glidecv[ch];
casiotone401 0:a4d93cd4c30d 440
casiotone401 0:a4d93cd4c30d 441 UpdateCV(WRITE_UPDATE_N, ch, cv[ch]);
casiotone401 0:a4d93cd4c30d 442 break;
casiotone401 0:a4d93cd4c30d 443 }
casiotone401 0:a4d93cd4c30d 444
casiotone401 0:a4d93cd4c30d 445 ch++;
casiotone401 0:a4d93cd4c30d 446 ch &= 0x07;
casiotone401 0:a4d93cd4c30d 447 }
casiotone401 0:a4d93cd4c30d 448
casiotone401 0:a4d93cd4c30d 449 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 450 // Check SW
casiotone401 0:a4d93cd4c30d 451
casiotone401 0:a4d93cd4c30d 452 void CheckSW()
casiotone401 0:a4d93cd4c30d 453 {
casiotone401 0:a4d93cd4c30d 454 if (gMode < MODE_NUM - 1)
casiotone401 0:a4d93cd4c30d 455 {
casiotone401 0:a4d93cd4c30d 456 gMode++;
casiotone401 0:a4d93cd4c30d 457
casiotone401 0:a4d93cd4c30d 458 } else {
casiotone401 0:a4d93cd4c30d 459
casiotone401 0:a4d93cd4c30d 460 gMode = 0;
casiotone401 0:a4d93cd4c30d 461 }
casiotone401 0:a4d93cd4c30d 462 }
casiotone401 0:a4d93cd4c30d 463
casiotone401 0:a4d93cd4c30d 464 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 465 // CV meter
casiotone401 0:a4d93cd4c30d 466
casiotone401 0:a4d93cd4c30d 467 void CVMeter(unsigned int ch, unsigned int level)
casiotone401 0:a4d93cd4c30d 468 {
casiotone401 0:a4d93cd4c30d 469 unsigned int cvmeter;
casiotone401 0:a4d93cd4c30d 470
casiotone401 0:a4d93cd4c30d 471 cvmeter = level / (SCALING_N / 7.9);
casiotone401 0:a4d93cd4c30d 472 gLCD.locate ( ch, 0 );
casiotone401 0:a4d93cd4c30d 473 gLCD.putc(cvmeter); // put custom char
casiotone401 0:a4d93cd4c30d 474 }
casiotone401 0:a4d93cd4c30d 475
casiotone401 0:a4d93cd4c30d 476 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 477 // Write command Custom Char LCD CGRAM(CV Meter)
casiotone401 0:a4d93cd4c30d 478
casiotone401 0:a4d93cd4c30d 479 void WriteCustomChar(unsigned char addr, unsigned char *c)
casiotone401 0:a4d93cd4c30d 480 {
casiotone401 0:a4d93cd4c30d 481 char cnt = 0;
casiotone401 0:a4d93cd4c30d 482 addr = ((addr << 3) | 0x40);
casiotone401 0:a4d93cd4c30d 483
casiotone401 0:a4d93cd4c30d 484 while(cnt < 0x08)
casiotone401 0:a4d93cd4c30d 485 {
casiotone401 0:a4d93cd4c30d 486 gLCD.writeCommand(addr | cnt);
casiotone401 0:a4d93cd4c30d 487 gLCD.writeData(*c);
casiotone401 0:a4d93cd4c30d 488 cnt++;
casiotone401 0:a4d93cd4c30d 489 c++;
casiotone401 0:a4d93cd4c30d 490 }
casiotone401 0:a4d93cd4c30d 491 }
casiotone401 0:a4d93cd4c30d 492
casiotone401 0:a4d93cd4c30d 493 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 494 // Setup Ethernet port
casiotone401 0:a4d93cd4c30d 495
casiotone401 0:a4d93cd4c30d 496 int SetupEthNetIf()
casiotone401 0:a4d93cd4c30d 497 {
casiotone401 0:a4d93cd4c30d 498 gLCD.locate( 0, 1 );
casiotone401 0:a4d93cd4c30d 499 gLCD.printf("Setting up... ");
casiotone401 0:a4d93cd4c30d 500 // printf("Setting up...\r\n");
casiotone401 0:a4d93cd4c30d 501 EthernetErr ethErr = gEth.setup();
casiotone401 0:a4d93cd4c30d 502
casiotone401 0:a4d93cd4c30d 503 if(ethErr)
casiotone401 0:a4d93cd4c30d 504 {
casiotone401 0:a4d93cd4c30d 505 gLCD.locate( 0, 1 );
casiotone401 0:a4d93cd4c30d 506 gLCD.printf("Error in setup.");
casiotone401 0:a4d93cd4c30d 507 // printf("Error %d in setup.\r\n", ethErr);
casiotone401 0:a4d93cd4c30d 508
casiotone401 0:a4d93cd4c30d 509 return -1;
casiotone401 0:a4d93cd4c30d 510 }
casiotone401 0:a4d93cd4c30d 511 // printf("Setup OK\r\n");
casiotone401 0:a4d93cd4c30d 512
casiotone401 0:a4d93cd4c30d 513 // printf("IP address %d.%d.%d.%d\r\n", gEth.getIp()[0], gEth.getIp()[1], gEth.getIp()[2], gEth.getIp()[3]);
casiotone401 0:a4d93cd4c30d 514 Host broadcast(IpAddr(gEth.getIp()[0], gEth.getIp()[1], gEth.getIp()[2], 255), INPUT_PORT, NULL);
casiotone401 0:a4d93cd4c30d 515 gUdp.setOnEvent(&onUDPSocketEvent);
casiotone401 0:a4d93cd4c30d 516 gUdp.bind(broadcast);
casiotone401 0:a4d93cd4c30d 517
casiotone401 0:a4d93cd4c30d 518 gLCD.locate( 0, 1 );
casiotone401 0:a4d93cd4c30d 519 gLCD.printf("%03d.%03d.%03d.%03d", gEth.getIp()[0], gEth.getIp()[1], gEth.getIp()[2], gEth.getIp()[3]);
casiotone401 0:a4d93cd4c30d 520 wait(2.0);
casiotone401 0:a4d93cd4c30d 521
casiotone401 0:a4d93cd4c30d 522 return 0;
casiotone401 0:a4d93cd4c30d 523 }
casiotone401 0:a4d93cd4c30d 524
casiotone401 0:a4d93cd4c30d 525 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 526 // Handller receive UDP Packet
casiotone401 0:a4d93cd4c30d 527
casiotone401 0:a4d93cd4c30d 528 void onUDPSocketEvent(UDPSocketEvent e)
casiotone401 0:a4d93cd4c30d 529 {
casiotone401 0:a4d93cd4c30d 530 union OSCarg msg[10];
casiotone401 0:a4d93cd4c30d 531 static int num;
casiotone401 0:a4d93cd4c30d 532
casiotone401 0:a4d93cd4c30d 533 switch(e)
casiotone401 0:a4d93cd4c30d 534 {
casiotone401 0:a4d93cd4c30d 535 case UDPSOCKET_READABLE: //The only event for now
casiotone401 0:a4d93cd4c30d 536 char buf[256] = {0};
casiotone401 0:a4d93cd4c30d 537 Host host;
casiotone401 0:a4d93cd4c30d 538
casiotone401 0:a4d93cd4c30d 539 while( int len = gUdp.recvfrom( buf, 256, &host ))
casiotone401 0:a4d93cd4c30d 540 {
casiotone401 0:a4d93cd4c30d 541 if(len <= 0) break;
casiotone401 0:a4d93cd4c30d 542 // printf("\r\nFrom %d.%d.%d.%d:\r\n",
casiotone401 0:a4d93cd4c30d 543 // host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3]);
casiotone401 0:a4d93cd4c30d 544
casiotone401 0:a4d93cd4c30d 545 getOSCmsg(buf,msg);
casiotone401 0:a4d93cd4c30d 546 // printf("OSCmsg: %s %s %f %i\r\n",
casiotone401 0:a4d93cd4c30d 547 // msg[0].address, msg[1].typeTag, msg[2].f, msg[2].i);
casiotone401 0:a4d93cd4c30d 548
casiotone401 0:a4d93cd4c30d 549 len = strlen(msg[0].address);
casiotone401 0:a4d93cd4c30d 550 if(isdigit(msg[0].address[len-1])) num = msg[0].address[len-1] - '0' - 1;
casiotone401 0:a4d93cd4c30d 551 else num = -1;
casiotone401 0:a4d93cd4c30d 552
casiotone401 0:a4d93cd4c30d 553 unsigned int absv = msg[2].f * 1; //convert -0 to 0
casiotone401 0:a4d93cd4c30d 554
casiotone401 0:a4d93cd4c30d 555 // address pattern SYNC & GATE (Type Tag int, float)
casiotone401 0:a4d93cd4c30d 556 if((strncmp(msg[0].address,"/1/sync",7)==0) && (num == -1)) {
casiotone401 0:a4d93cd4c30d 557 if(num > 1) break;
casiotone401 0:a4d93cd4c30d 558 if(absv >= 1 || msg[2].i >= 1) gCLOCKOUT = 1;
casiotone401 0:a4d93cd4c30d 559 else gCLOCKOUT = 0;
casiotone401 0:a4d93cd4c30d 560 break;
casiotone401 0:a4d93cd4c30d 561
casiotone401 0:a4d93cd4c30d 562 } else if ((strncmp(msg[0].address,"/1/gate",7)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 563 if(num > 3) break;
casiotone401 0:a4d93cd4c30d 564 if(absv >= 1 || msg[2].i >= 1) gLEDS[num] = gGATES[num] = 1;
casiotone401 0:a4d93cd4c30d 565 else gLEDS[num] = gGATES[num] = 0;
casiotone401 0:a4d93cd4c30d 566 break;
casiotone401 0:a4d93cd4c30d 567 // (touchOSC Control push, toggle)
casiotone401 0:a4d93cd4c30d 568 } else if ((strncmp(msg[0].address,"/1/push",7)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 569 if(num > 3) break;
casiotone401 0:a4d93cd4c30d 570 if(absv >= 1 || msg[2].i >= 1) gLEDS[num] = gGATES[num] = 1;
casiotone401 0:a4d93cd4c30d 571 else gLEDS[num] = gGATES[num] = 0;
casiotone401 0:a4d93cd4c30d 572 break;
casiotone401 0:a4d93cd4c30d 573
casiotone401 0:a4d93cd4c30d 574 } else if ((strncmp(msg[0].address,"/1/toggle",9)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 575 if(num > 3) break;
casiotone401 0:a4d93cd4c30d 576 if(absv >= 1 || msg[2].i >= 1) gLEDS[num] = gGATES[num] = 1;
casiotone401 0:a4d93cd4c30d 577 else gLEDS[num] = gGATES[num] = 0;
casiotone401 0:a4d93cd4c30d 578 break;
casiotone401 0:a4d93cd4c30d 579 } else if ((strncmp(msg[0].address,"/1/multipush",12)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 580 if(num > 3) break;
casiotone401 0:a4d93cd4c30d 581 if(absv >= 1 || msg[2].i >= 1) gLEDS[num] = gGATES[num] = 1;
casiotone401 0:a4d93cd4c30d 582 else gLEDS[num] = gGATES[num] = 0;
casiotone401 0:a4d93cd4c30d 583 break;
casiotone401 0:a4d93cd4c30d 584 }
casiotone401 0:a4d93cd4c30d 585
casiotone401 0:a4d93cd4c30d 586 // address pattern CV (Type Tag float)
casiotone401 0:a4d93cd4c30d 587 if((strncmp(msg[0].address,"/1/cv",5)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 588 if(num > 7) break;
casiotone401 0:a4d93cd4c30d 589 if(msg[1].typeTag[1] == 'f') gOSC_cv[num] = msg[2].f * (SCALING_N);
casiotone401 0:a4d93cd4c30d 590 break;
casiotone401 0:a4d93cd4c30d 591 // (touchOSC Control fader, rotary, xy, multixy, multifader)
casiotone401 0:a4d93cd4c30d 592 } else if ((strncmp(msg[0].address,"/1/fader",8)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 593 if(num > 7) break;
casiotone401 0:a4d93cd4c30d 594 if(msg[1].typeTag[1] == 'f') gOSC_cv[num] = msg[2].f * (SCALING_N);
casiotone401 0:a4d93cd4c30d 595 break;
casiotone401 0:a4d93cd4c30d 596
casiotone401 0:a4d93cd4c30d 597 } else if ((strncmp(msg[0].address,"/1/rotary",9)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 598 if(num > 7) break;
casiotone401 0:a4d93cd4c30d 599 if(msg[1].typeTag[1] == 'f') gOSC_cv[num] = msg[2].f * (SCALING_N);
casiotone401 0:a4d93cd4c30d 600 break;
casiotone401 0:a4d93cd4c30d 601
casiotone401 0:a4d93cd4c30d 602 } else if ((strncmp(msg[0].address,"/1/xy",5)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 603 if(num > 7) break;
casiotone401 0:a4d93cd4c30d 604 if(msg[1].typeTag[1] == 'f') gOSC_cv[num] = msg[2].f * (SCALING_N);
casiotone401 0:a4d93cd4c30d 605 if(msg[1].typeTag[1] == 'f') gOSC_cv[++num] = msg[3].f * (SCALING_N);
casiotone401 0:a4d93cd4c30d 606 break;
casiotone401 0:a4d93cd4c30d 607
casiotone401 0:a4d93cd4c30d 608 } else if ((strncmp(msg[0].address,"/1/multixy",10)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 609 if(num > 7) break;
casiotone401 0:a4d93cd4c30d 610 if(msg[1].typeTag[1] == 'f') gOSC_cv[num] = msg[2].f * (SCALING_N);
casiotone401 0:a4d93cd4c30d 611 if(msg[1].typeTag[1] == 'f') gOSC_cv[++num] = msg[3].f * (SCALING_N);
casiotone401 0:a4d93cd4c30d 612 break;
casiotone401 0:a4d93cd4c30d 613
casiotone401 0:a4d93cd4c30d 614 } else if ((strncmp(msg[0].address,"/1/multifader",13)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 615 if(num > 7) break;
casiotone401 0:a4d93cd4c30d 616 if(msg[1].typeTag[1] == 'f') gOSC_cv[num] = msg[2].f * (SCALING_N);
casiotone401 0:a4d93cd4c30d 617 }
casiotone401 0:a4d93cd4c30d 618 }
casiotone401 0:a4d93cd4c30d 619 }
casiotone401 0:a4d93cd4c30d 620 }