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 Mar 09 04:52:52 2014 +0000
Revision:
13:3f42e451a8d3
Parent:
12:33c8f06c2e03
minor update

Who changed what in which revision?

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