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:
Sat Jan 19 12:03:20 2013 +0000
Revision:
4:b9f5ae574447
Parent:
3:ca15241dd6b4
Child:
5:e305509d53f3
added Sequencer & Shift Register Mode

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 1:fd4f70088311 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 3:ca15241dd6b4 42 #define MODE_Q5th 4 // 5th
casiotone401 3:ca15241dd6b4 43 #define MODE_QWht 5 // Wholetone
casiotone401 4:b9f5ae574447 44 #define MODE_SEQ 6 // Sequencer & Shift Register
casiotone401 4:b9f5ae574447 45 #define MODE_Calb 7 // Calibration (VCO Tuning)
casiotone401 0:a4d93cd4c30d 46
casiotone401 0:a4d93cd4c30d 47 #define QUAN_RES1 116 // Quantize voltage Steps
casiotone401 0:a4d93cd4c30d 48 #define QUAN_RES2 69
casiotone401 0:a4d93cd4c30d 49 #define QUAN_RES3 68
casiotone401 3:ca15241dd6b4 50 #define QUAN_RES4 17
casiotone401 3:ca15241dd6b4 51 #define QUAN_RES5 58
casiotone401 0:a4d93cd4c30d 52
casiotone401 4:b9f5ae574447 53 #define MODE_NUM 8 // Modes
casiotone401 0:a4d93cd4c30d 54
casiotone401 0:a4d93cd4c30d 55 #define SPI_RATE 40000000 // 40Mbps SPI Clock
casiotone401 0:a4d93cd4c30d 56 #define SCALING_N 38400.0
casiotone401 3:ca15241dd6b4 57 #define INPUT_PORT 12345 // Input Port Number
casiotone401 0:a4d93cd4c30d 58
casiotone401 3:ca15241dd6b4 59 #define POLLING_INTERVAL 20 // Polling Interval (us)
casiotone401 0:a4d93cd4c30d 60
casiotone401 0:a4d93cd4c30d 61 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 62 // DAC8568 Control Bits
casiotone401 0:a4d93cd4c30d 63
casiotone401 0:a4d93cd4c30d 64 #define WRITE 0x00
casiotone401 0:a4d93cd4c30d 65 #define UPDATE 0x01
casiotone401 0:a4d93cd4c30d 66 #define WRITE_UPDATE_ALL 0x02 // LDAC Write to Selected Update All
casiotone401 0:a4d93cd4c30d 67 #define WRITE_UPDATE_N 0x03 // LDAC Write to Selected Update Respective
casiotone401 0:a4d93cd4c30d 68 #define POWER 0x04
casiotone401 0:a4d93cd4c30d 69 #define CLR 0x05 // Clear Code Register
casiotone401 0:a4d93cd4c30d 70 #define WRITE_LDAC_REG 0x06
casiotone401 0:a4d93cd4c30d 71 #define RESET 0x07 // Software Reset DAC8568
casiotone401 0:a4d93cd4c30d 72 #define SETUP_INTERNAL_REF 0x08
casiotone401 0:a4d93cd4c30d 73
casiotone401 0:a4d93cd4c30d 74 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 75
casiotone401 0:a4d93cd4c30d 76 #define _DISABLE 0
casiotone401 0:a4d93cd4c30d 77 #define _ENABLE 1
casiotone401 0:a4d93cd4c30d 78
casiotone401 0:a4d93cd4c30d 79 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 80 // Functions
casiotone401 0:a4d93cd4c30d 81
casiotone401 4:b9f5ae574447 82 inline void NetPoll(void);
casiotone401 0:a4d93cd4c30d 83 void InitOSCCV(void);
casiotone401 4:b9f5ae574447 84 inline void UpdateCV(int, int, const unsigned int*);
casiotone401 0:a4d93cd4c30d 85 void SetCV(void);
casiotone401 4:b9f5ae574447 86 void SeqCV(void);
casiotone401 0:a4d93cd4c30d 87 void CheckSW(void);
casiotone401 4:b9f5ae574447 88 void CVMeter(int, const unsigned int*);
casiotone401 4:b9f5ae574447 89 void LCD();
casiotone401 0:a4d93cd4c30d 90 void WriteCustomChar(unsigned char, unsigned char*);
casiotone401 0:a4d93cd4c30d 91 int SetupEthNetIf(void);
casiotone401 4:b9f5ae574447 92 inline void onUDPSocketEvent(UDPSocketEvent);
casiotone401 0:a4d93cd4c30d 93
casiotone401 0:a4d93cd4c30d 94 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 95 // Silentway Calibration Data Mapping
casiotone401 0:a4d93cd4c30d 96 // http://www.expert-sleepers.co.uk/silentway.html
casiotone401 0:a4d93cd4c30d 97
casiotone401 0:a4d93cd4c30d 98 // Chromatic Scale
casiotone401 0:a4d93cd4c30d 99 const float calibMap1[QUAN_RES1] = {
casiotone401 0:a4d93cd4c30d 100 0.00663080, 0.01433030, 0.02202980, 0.02972930, 0.03742880,
casiotone401 0:a4d93cd4c30d 101 0.04512830, 0.05282781, 0.06052731, 0.06822681, 0.07592630,
casiotone401 0:a4d93cd4c30d 102 0.08362581, 0.09132531, 0.09902481, 0.10672431, 0.11442380,
casiotone401 0:a4d93cd4c30d 103 0.12212331, 0.12951356, 0.13671936, 0.14392516, 0.15113096,
casiotone401 0:a4d93cd4c30d 104 0.15833676, 0.16554256, 0.17274836, 0.17995416, 0.18715996,
casiotone401 0:a4d93cd4c30d 105 0.19436575, 0.20157155, 0.20877735, 0.21598317, 0.22318897,
casiotone401 0:a4d93cd4c30d 106 0.23039477, 0.23760056, 0.24480636, 0.25202271, 0.25926629,
casiotone401 0:a4d93cd4c30d 107 0.26650983, 0.27375340, 0.28099698, 0.28824055, 0.29548413,
casiotone401 0:a4d93cd4c30d 108 0.30272770, 0.30997124, 0.31721482, 0.32445839, 0.33170196,
casiotone401 0:a4d93cd4c30d 109 0.33894554, 0.34618911, 0.35343266, 0.36067623, 0.36791980,
casiotone401 0:a4d93cd4c30d 110 0.37516347, 0.38241133, 0.38965923, 0.39690709, 0.40415496,
casiotone401 0:a4d93cd4c30d 111 0.41140282, 0.41865072, 0.42589858, 0.43314645, 0.44039431,
casiotone401 0:a4d93cd4c30d 112 0.44764221, 0.45489007, 0.46213794, 0.46938580, 0.47663370,
casiotone401 0:a4d93cd4c30d 113 0.48388156, 0.49112943, 0.49837729, 0.50566339, 0.51296055,
casiotone401 0:a4d93cd4c30d 114 0.52025765, 0.52755481, 0.53485191, 0.54214907, 0.54944617,
casiotone401 0:a4d93cd4c30d 115 0.55674326, 0.56404042, 0.57133752, 0.57863468, 0.58593178,
casiotone401 0:a4d93cd4c30d 116 0.59322894, 0.60052603, 0.60782319, 0.61512029, 0.62241745,
casiotone401 0:a4d93cd4c30d 117 0.62976688, 0.63714498, 0.64452308, 0.65190119, 0.65927929,
casiotone401 0:a4d93cd4c30d 118 0.66665739, 0.67403549, 0.68141359, 0.68879169, 0.69616979,
casiotone401 0:a4d93cd4c30d 119 0.70354789, 0.71092600, 0.71830410, 0.72568226, 0.73306036,
casiotone401 0:a4d93cd4c30d 120 0.74043846, 0.74781656, 0.75820577, 0.76986063, 0.78151548,
casiotone401 0:a4d93cd4c30d 121 0.79317033, 0.80482519, 0.81648004, 0.82813489, 0.83978975,
casiotone401 0:a4d93cd4c30d 122 0.85144460, 0.86309946, 0.87475431, 0.90686423, 0.93941462,
casiotone401 0:a4d93cd4c30d 123 0.97196496
casiotone401 0:a4d93cd4c30d 124 };
casiotone401 0:a4d93cd4c30d 125
casiotone401 0:a4d93cd4c30d 126 // Major Scale
casiotone401 0:a4d93cd4c30d 127 const float calibMap2[QUAN_RES2] = {
casiotone401 0:a4d93cd4c30d 128 0.00663080, 0.01433030, 0.02972930, 0.04512830, 0.05282781,
casiotone401 0:a4d93cd4c30d 129 0.06822681, 0.08362581, 0.09902481, 0.10672431, 0.12212331,
casiotone401 0:a4d93cd4c30d 130 0.13671936, 0.14392516, 0.15833676, 0.17274836, 0.18715996,
casiotone401 0:a4d93cd4c30d 131 0.19436575, 0.20877735, 0.22318897, 0.23039477, 0.24480636,
casiotone401 0:a4d93cd4c30d 132 0.25926629, 0.27375340, 0.28099698, 0.29548413, 0.30997124,
casiotone401 0:a4d93cd4c30d 133 0.31721482, 0.33170196, 0.34618911, 0.36067623, 0.36791980,
casiotone401 0:a4d93cd4c30d 134 0.38241133, 0.39690709, 0.40415496, 0.41865072, 0.43314645,
casiotone401 0:a4d93cd4c30d 135 0.44764221, 0.45489007, 0.46938580, 0.48388156, 0.49112943,
casiotone401 0:a4d93cd4c30d 136 0.50566339, 0.52025765, 0.53485191, 0.54214907, 0.55674326,
casiotone401 0:a4d93cd4c30d 137 0.57133752, 0.57863468, 0.59322894, 0.60782319, 0.62241745,
casiotone401 0:a4d93cd4c30d 138 0.62976688, 0.64452308, 0.65927929, 0.66665739, 0.68141359,
casiotone401 0:a4d93cd4c30d 139 0.69616979, 0.71092600, 0.71830410, 0.73306036, 0.74781656,
casiotone401 0:a4d93cd4c30d 140 0.75820577, 0.78151548, 0.80482519, 0.82813489, 0.83978975,
casiotone401 0:a4d93cd4c30d 141 0.86309946, 0.90686423, 0.93941462
casiotone401 0:a4d93cd4c30d 142 };
casiotone401 0:a4d93cd4c30d 143
casiotone401 0:a4d93cd4c30d 144 // Dorian Scale
casiotone401 0:a4d93cd4c30d 145 const float calibMap3[QUAN_RES3] = {
casiotone401 0:a4d93cd4c30d 146 0.00663080, 0.01433030, 0.02972930, 0.04512830, 0.06052731,
casiotone401 0:a4d93cd4c30d 147 0.06822681, 0.08362581, 0.09902481, 0.10672431, 0.12212331,
casiotone401 0:a4d93cd4c30d 148 0.13671936, 0.15113096, 0.15833676, 0.17274836, 0.18715996,
casiotone401 0:a4d93cd4c30d 149 0.19436575, 0.20877735, 0.22318897, 0.23760056, 0.24480636,
casiotone401 0:a4d93cd4c30d 150 0.25926629, 0.27375340, 0.28099698, 0.29548413, 0.30997124,
casiotone401 0:a4d93cd4c30d 151 0.32445839, 0.33170196, 0.34618911, 0.36067623, 0.36791980,
casiotone401 0:a4d93cd4c30d 152 0.38241133, 0.39690709, 0.41140282, 0.41865072, 0.43314645,
casiotone401 0:a4d93cd4c30d 153 0.44764221, 0.45489007, 0.46938580, 0.48388156, 0.49837729,
casiotone401 0:a4d93cd4c30d 154 0.50566339, 0.52025765, 0.53485191, 0.54214907, 0.55674326,
casiotone401 0:a4d93cd4c30d 155 0.57133752, 0.58593178, 0.59322894, 0.60782319, 0.62241745,
casiotone401 0:a4d93cd4c30d 156 0.62976688, 0.64452308, 0.65927929, 0.67403549, 0.68141359,
casiotone401 0:a4d93cd4c30d 157 0.69616979, 0.71092600, 0.71830410, 0.73306036, 0.74781656,
casiotone401 0:a4d93cd4c30d 158 0.76986063, 0.78151548, 0.80482519, 0.82813489, 0.83978975,
casiotone401 0:a4d93cd4c30d 159 0.86309946, 0.90686423, 0.97196496
casiotone401 0:a4d93cd4c30d 160 };
casiotone401 0:a4d93cd4c30d 161
casiotone401 3:ca15241dd6b4 162 // 5th
casiotone401 0:a4d93cd4c30d 163 const float calibMap4[QUAN_RES4] = {
casiotone401 3:ca15241dd6b4 164 0.00663080, 0.06052731, 0.11442380, 0.16554256, 0.21598317,
casiotone401 3:ca15241dd6b4 165 0.26650983, 0.31721482, 0.36791980, 0.41865072, 0.46938580,
casiotone401 3:ca15241dd6b4 166 0.52025765, 0.57133752, 0.62241745, 0.67403549, 0.72568226,
casiotone401 3:ca15241dd6b4 167 0.79317033, 0.87475431
casiotone401 3:ca15241dd6b4 168
casiotone401 3:ca15241dd6b4 169 };
casiotone401 3:ca15241dd6b4 170
casiotone401 4:b9f5ae574447 171 // Whole tone
casiotone401 3:ca15241dd6b4 172 const float calibMap5[QUAN_RES5] = {
casiotone401 3:ca15241dd6b4 173 0.00663080, 0.02202980, 0.03742880, 0.05282781, 0.06822681,
casiotone401 3:ca15241dd6b4 174 0.08362581, 0.09902481, 0.11442380, 0.12951356, 0.14392516,
casiotone401 3:ca15241dd6b4 175 0.15833676, 0.17274836, 0.18715996, 0.20157155, 0.21598317,
casiotone401 3:ca15241dd6b4 176 0.23039477, 0.24480636, 0.25926629, 0.27375340, 0.28824055,
casiotone401 3:ca15241dd6b4 177 0.30272770, 0.31721482, 0.33170196, 0.34618911, 0.36067623,
casiotone401 3:ca15241dd6b4 178 0.37516347, 0.38965923, 0.40415496, 0.41865072, 0.43314645,
casiotone401 3:ca15241dd6b4 179 0.44764221, 0.46213794, 0.47663370, 0.49112943, 0.50566339,
casiotone401 3:ca15241dd6b4 180 0.52025765, 0.53485191, 0.54944617, 0.56404042, 0.57863468,
casiotone401 3:ca15241dd6b4 181 0.59322894, 0.60782319, 0.62241745, 0.63714498, 0.65190119,
casiotone401 3:ca15241dd6b4 182 0.66665739, 0.68141359, 0.69616979, 0.71092600, 0.72568226,
casiotone401 3:ca15241dd6b4 183 0.74043846, 0.75820577, 0.78151548, 0.80482519, 0.82813489,
casiotone401 3:ca15241dd6b4 184 0.85144460, 0.87475431, 0.93941462
casiotone401 3:ca15241dd6b4 185
casiotone401 0:a4d93cd4c30d 186 };
casiotone401 0:a4d93cd4c30d 187
casiotone401 0:a4d93cd4c30d 188 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 189 // CV Meter Custom Character
casiotone401 0:a4d93cd4c30d 190
casiotone401 0:a4d93cd4c30d 191 unsigned char str1[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F};
casiotone401 0:a4d93cd4c30d 192 unsigned char str2[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 193 unsigned char str3[8] = {0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 194 unsigned char str4[8] = {0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 195 unsigned char str5[8] = {0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 196 unsigned char str6[8] = {0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 197 unsigned char str7[8] = {0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 198 unsigned char str8[8] = {0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
casiotone401 0:a4d93cd4c30d 199
casiotone401 0:a4d93cd4c30d 200 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 201 // Global Variables
casiotone401 0:a4d93cd4c30d 202
casiotone401 4:b9f5ae574447 203 static float gOSC_cv[8];
casiotone401 4:b9f5ae574447 204 static float gSeq_cv1[8];
casiotone401 4:b9f5ae574447 205 static float gSeq_cv2[8];
casiotone401 4:b9f5ae574447 206 static float gGlide;
casiotone401 4:b9f5ae574447 207 static float gCtrl[2];
casiotone401 4:b9f5ae574447 208 unsigned int gCtrlSW[2];
casiotone401 0:a4d93cd4c30d 209 unsigned int gMode;
casiotone401 0:a4d93cd4c30d 210
casiotone401 0:a4d93cd4c30d 211 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 212 // mbed Functions
casiotone401 0:a4d93cd4c30d 213
casiotone401 0:a4d93cd4c30d 214 TextLCD gLCD(p9, p10, p11, p12, p13, p14); // rs, e, d4-d7
casiotone401 0:a4d93cd4c30d 215
casiotone401 0:a4d93cd4c30d 216 SPI gSPI(p5,p6,p7); // SPI (p6 unconnected)
casiotone401 0:a4d93cd4c30d 217 DigitalOut gSYNCMODE(p15); // SYNC DAC8568
casiotone401 0:a4d93cd4c30d 218 DigitalOut gLDAC(p16); // LDAC DAC8568
casiotone401 0:a4d93cd4c30d 219
casiotone401 1:fd4f70088311 220 DigitalOut gGATES[4] = {p22, p23, p24, p25}; // GateOut
casiotone401 1:fd4f70088311 221 DigitalOut gLEDS[4] = {p18, p19, p20, p21}; // LED
casiotone401 0:a4d93cd4c30d 222 DigitalOut gCLOCKOUT(p25); // ClockOut
casiotone401 0:a4d93cd4c30d 223
casiotone401 0:a4d93cd4c30d 224 AnalogIn gAIN(p17); // Glide Potentiometer
casiotone401 0:a4d93cd4c30d 225 InterruptIn gSW(p30); // Mode SW
casiotone401 0:a4d93cd4c30d 226
casiotone401 4:b9f5ae574447 227 Timer gTimer; // Timer
casiotone401 0:a4d93cd4c30d 228 Ticker gPoller; // Ticker Polling
casiotone401 0:a4d93cd4c30d 229
casiotone401 0:a4d93cd4c30d 230 // Ethernet
casiotone401 0:a4d93cd4c30d 231 EthernetNetIf gEth;
casiotone401 0:a4d93cd4c30d 232 UDPSocket gUdp;
casiotone401 0:a4d93cd4c30d 233
casiotone401 0:a4d93cd4c30d 234 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 235 // main
casiotone401 0:a4d93cd4c30d 236
casiotone401 0:a4d93cd4c30d 237 int main()
casiotone401 0:a4d93cd4c30d 238 {
casiotone401 3:ca15241dd6b4 239 float pot, _pot;
casiotone401 3:ca15241dd6b4 240
casiotone401 0:a4d93cd4c30d 241 if(SetupEthNetIf() == -1)
casiotone401 0:a4d93cd4c30d 242 {
casiotone401 4:b9f5ae574447 243 for(int i = 0; i < 4; i++)
casiotone401 0:a4d93cd4c30d 244 {
casiotone401 0:a4d93cd4c30d 245 gLEDS[i] = 1;
casiotone401 0:a4d93cd4c30d 246 wait(0.25);
casiotone401 0:a4d93cd4c30d 247 }
casiotone401 0:a4d93cd4c30d 248 return -1;
casiotone401 0:a4d93cd4c30d 249 }
casiotone401 0:a4d93cd4c30d 250
casiotone401 0:a4d93cd4c30d 251 // mdns (Bonjour)
casiotone401 0:a4d93cd4c30d 252 HTTPServer svr;
casiotone401 0:a4d93cd4c30d 253 mDNSResponder mdns;
casiotone401 4:b9f5ae574447 254
casiotone401 0:a4d93cd4c30d 255 svr.addHandler<SimpleHandler>("/");
casiotone401 0:a4d93cd4c30d 256 svr.bind(INPUT_PORT);
casiotone401 0:a4d93cd4c30d 257 IpAddr ip = gEth.getIp();
casiotone401 0:a4d93cd4c30d 258 mdns.announce(ip, "OSCtoCV", "_osc._udp", INPUT_PORT, "mbed(OSCtoCV)", (char *[]) {"path=/",NULL});
casiotone401 0:a4d93cd4c30d 259
casiotone401 0:a4d93cd4c30d 260 InitOSCCV();
casiotone401 0:a4d93cd4c30d 261
casiotone401 4:b9f5ae574447 262 pot = _pot = 0;
casiotone401 4:b9f5ae574447 263 gGlide = gMode = 0;
casiotone401 4:b9f5ae574447 264
casiotone401 4:b9f5ae574447 265 LCD();
casiotone401 3:ca15241dd6b4 266 gLCD.locate( 0, 1 );
casiotone401 3:ca15241dd6b4 267 gLCD.printf("12345678 G>>%3.2f", gGlide);
casiotone401 3:ca15241dd6b4 268
casiotone401 0:a4d93cd4c30d 269 // loop
casiotone401 0:a4d93cd4c30d 270 while(1)
casiotone401 0:a4d93cd4c30d 271 {
casiotone401 3:ca15241dd6b4 272 gGlide = pot = gAIN.read();
casiotone401 0:a4d93cd4c30d 273
casiotone401 4:b9f5ae574447 274 if(abs(pot - _pot) > 0.01f)
casiotone401 0:a4d93cd4c30d 275 {
casiotone401 3:ca15241dd6b4 276 gLCD.locate( 0, 1 );
casiotone401 3:ca15241dd6b4 277 gLCD.printf("12345678 G>>%3.2f", gGlide);
casiotone401 4:b9f5ae574447 278
casiotone401 3:ca15241dd6b4 279 _pot = gAIN.read();
casiotone401 0:a4d93cd4c30d 280 }
casiotone401 3:ca15241dd6b4 281
casiotone401 4:b9f5ae574447 282 if(gMode == MODE_SEQ)
casiotone401 4:b9f5ae574447 283 {
casiotone401 4:b9f5ae574447 284 SeqCV();
casiotone401 4:b9f5ae574447 285
casiotone401 4:b9f5ae574447 286 } else {
casiotone401 4:b9f5ae574447 287
casiotone401 4:b9f5ae574447 288 SetCV();
casiotone401 4:b9f5ae574447 289 }
casiotone401 0:a4d93cd4c30d 290 }
casiotone401 0:a4d93cd4c30d 291 }
casiotone401 0:a4d93cd4c30d 292
casiotone401 0:a4d93cd4c30d 293 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 294 // Ethernet Polling
casiotone401 0:a4d93cd4c30d 295
casiotone401 4:b9f5ae574447 296 inline void NetPoll()
casiotone401 0:a4d93cd4c30d 297 {
casiotone401 0:a4d93cd4c30d 298 Net::poll();
casiotone401 0:a4d93cd4c30d 299 }
casiotone401 0:a4d93cd4c30d 300
casiotone401 0:a4d93cd4c30d 301 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 302 // Initialize OSC-CV
casiotone401 0:a4d93cd4c30d 303
casiotone401 0:a4d93cd4c30d 304 void InitOSCCV()
casiotone401 0:a4d93cd4c30d 305 {
casiotone401 0:a4d93cd4c30d 306 // write custom char LCD CGRAM
casiotone401 0:a4d93cd4c30d 307 WriteCustomChar(0x00, str1);
casiotone401 0:a4d93cd4c30d 308 WriteCustomChar(0x01, str2);
casiotone401 0:a4d93cd4c30d 309 WriteCustomChar(0x02, str3);
casiotone401 0:a4d93cd4c30d 310 WriteCustomChar(0x03, str4);
casiotone401 0:a4d93cd4c30d 311 WriteCustomChar(0x04, str5);
casiotone401 0:a4d93cd4c30d 312 WriteCustomChar(0x05, str6);
casiotone401 0:a4d93cd4c30d 313 WriteCustomChar(0x06, str7);
casiotone401 0:a4d93cd4c30d 314 WriteCustomChar(0x07, str8);
casiotone401 0:a4d93cd4c30d 315
casiotone401 0:a4d93cd4c30d 316 // Init. SPI
casiotone401 0:a4d93cd4c30d 317 gLDAC = _ENABLE;
casiotone401 0:a4d93cd4c30d 318 gSPI.format(8,1); // Data word length 8bit, Mode=1
casiotone401 0:a4d93cd4c30d 319 gSPI.frequency(SPI_RATE);
casiotone401 0:a4d93cd4c30d 320
casiotone401 0:a4d93cd4c30d 321 UpdateCV(CLR, 0, 0); // Ignore CLR Pin
casiotone401 0:a4d93cd4c30d 322
casiotone401 4:b9f5ae574447 323 gSW.mode(PullUp); // Use internal pullup for ModeSW
casiotone401 0:a4d93cd4c30d 324 wait(.001);
casiotone401 0:a4d93cd4c30d 325
casiotone401 3:ca15241dd6b4 326 gSW.rise(&CheckSW); // InterruptIn rising edge(ModeSW)
casiotone401 0:a4d93cd4c30d 327 gPoller.attach_us(&NetPoll, POLLING_INTERVAL); // Ticker Polling
casiotone401 3:ca15241dd6b4 328
casiotone401 3:ca15241dd6b4 329 wait(0.2);
casiotone401 0:a4d93cd4c30d 330 }
casiotone401 0:a4d93cd4c30d 331
casiotone401 0:a4d93cd4c30d 332 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 333 // SPI Transfer
casiotone401 0:a4d93cd4c30d 334 // DAC8568 data word length 32bit (8bit shift out)
casiotone401 0:a4d93cd4c30d 335
casiotone401 4:b9f5ae574447 336 inline void UpdateCV(int control, int address, const unsigned int *data)
casiotone401 0:a4d93cd4c30d 337 {
casiotone401 0:a4d93cd4c30d 338 __disable_irq();
casiotone401 0:a4d93cd4c30d 339
casiotone401 0:a4d93cd4c30d 340 switch(control)
casiotone401 0:a4d93cd4c30d 341 {
casiotone401 0:a4d93cd4c30d 342 case WRITE_UPDATE_N:
casiotone401 4:b9f5ae574447 343
casiotone401 0:a4d93cd4c30d 344 gSYNCMODE = _DISABLE;
casiotone401 4:b9f5ae574447 345 gSPI.write(00000000|control); // padding at beginning of byte and control bits
casiotone401 4:b9f5ae574447 346 gSPI.write(address << 4 | *data >> 12); // address(ch) bits
casiotone401 4:b9f5ae574447 347 gSPI.write((*data << 4) >> 8); // middle 8 bits of data
casiotone401 4:b9f5ae574447 348 gSPI.write((*data << 12) >> 8 | 00001111);
casiotone401 0:a4d93cd4c30d 349 gSYNCMODE = _ENABLE;
casiotone401 0:a4d93cd4c30d 350 gLDAC = _DISABLE;
casiotone401 0:a4d93cd4c30d 351 gLDAC = _ENABLE;
casiotone401 0:a4d93cd4c30d 352 break;
casiotone401 4:b9f5ae574447 353
casiotone401 0:a4d93cd4c30d 354 case RESET:
casiotone401 4:b9f5ae574447 355
casiotone401 0:a4d93cd4c30d 356 gSYNCMODE = _DISABLE;
casiotone401 4:b9f5ae574447 357 gSPI.write(00000111); // Software RESET
casiotone401 0:a4d93cd4c30d 358 gSPI.write(00000000);
casiotone401 0:a4d93cd4c30d 359 gSPI.write(00000000);
casiotone401 0:a4d93cd4c30d 360 gSPI.write(00000000);
casiotone401 0:a4d93cd4c30d 361 gSYNCMODE = _ENABLE;
casiotone401 0:a4d93cd4c30d 362 break;
casiotone401 4:b9f5ae574447 363
casiotone401 0:a4d93cd4c30d 364 case CLR:
casiotone401 4:b9f5ae574447 365
casiotone401 0:a4d93cd4c30d 366 gSYNCMODE = _DISABLE;
casiotone401 4:b9f5ae574447 367 gSPI.write(00000101); // CLR Register
casiotone401 0:a4d93cd4c30d 368 gSPI.write(00000000);
casiotone401 0:a4d93cd4c30d 369 gSPI.write(00000000);
casiotone401 4:b9f5ae574447 370 gSPI.write(00000011); // Ignore CLR Pin
casiotone401 0:a4d93cd4c30d 371 gSYNCMODE = _ENABLE;
casiotone401 0:a4d93cd4c30d 372 break;
casiotone401 0:a4d93cd4c30d 373 }
casiotone401 0:a4d93cd4c30d 374
casiotone401 0:a4d93cd4c30d 375 __enable_irq();
casiotone401 0:a4d93cd4c30d 376 }
casiotone401 0:a4d93cd4c30d 377
casiotone401 0:a4d93cd4c30d 378 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 379 // Calculate CV
casiotone401 0:a4d93cd4c30d 380
casiotone401 0:a4d93cd4c30d 381 void SetCV()
casiotone401 0:a4d93cd4c30d 382 {
casiotone401 4:b9f5ae574447 383 static int ch;
casiotone401 0:a4d93cd4c30d 384 float glidecv[8];
casiotone401 0:a4d93cd4c30d 385 unsigned int cv[8];
casiotone401 0:a4d93cd4c30d 386 static float oldcv[8];
casiotone401 0:a4d93cd4c30d 387 static unsigned int quan;
casiotone401 0:a4d93cd4c30d 388 float qcv;
casiotone401 0:a4d93cd4c30d 389
casiotone401 0:a4d93cd4c30d 390 switch(gMode)
casiotone401 0:a4d93cd4c30d 391 {
casiotone401 0:a4d93cd4c30d 392 case MODE_LIN:
casiotone401 4:b9f5ae574447 393
casiotone401 0:a4d93cd4c30d 394 glidecv[ch] = oldcv[ch] * gGlide + gOSC_cv[ch] * (1.0f - gGlide);
casiotone401 0:a4d93cd4c30d 395 oldcv[ch] = glidecv[ch];
casiotone401 0:a4d93cd4c30d 396 cv[ch] = (unsigned int)glidecv[ch];
casiotone401 0:a4d93cd4c30d 397
casiotone401 4:b9f5ae574447 398 UpdateCV(WRITE_UPDATE_N, ch, &cv[ch]);
casiotone401 0:a4d93cd4c30d 399 break;
casiotone401 0:a4d93cd4c30d 400
casiotone401 0:a4d93cd4c30d 401 case MODE_QChr:
casiotone401 0:a4d93cd4c30d 402
casiotone401 4:b9f5ae574447 403 quan = 40616 / QUAN_RES1;
casiotone401 4:b9f5ae574447 404 qcv = calibMap1[(unsigned int)(gOSC_cv[ch] / quan)];
casiotone401 4:b9f5ae574447 405
casiotone401 4:b9f5ae574447 406 glidecv[ch] = oldcv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 4:b9f5ae574447 407 oldcv[ch] = glidecv[ch];
casiotone401 4:b9f5ae574447 408 cv[ch] = (unsigned int)glidecv[ch];
casiotone401 4:b9f5ae574447 409
casiotone401 4:b9f5ae574447 410 UpdateCV(WRITE_UPDATE_N, ch, &cv[ch]);
casiotone401 4:b9f5ae574447 411 break;
casiotone401 4:b9f5ae574447 412
casiotone401 4:b9f5ae574447 413 case MODE_QMaj:
casiotone401 4:b9f5ae574447 414
casiotone401 4:b9f5ae574447 415 quan = 40616 / QUAN_RES2;
casiotone401 4:b9f5ae574447 416 qcv = calibMap2[(unsigned int)(gOSC_cv[ch] / quan)];
casiotone401 0:a4d93cd4c30d 417
casiotone401 0:a4d93cd4c30d 418 glidecv[ch] = oldcv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:a4d93cd4c30d 419 oldcv[ch] = glidecv[ch];
casiotone401 0:a4d93cd4c30d 420 cv[ch] = (unsigned int)glidecv[ch];
casiotone401 0:a4d93cd4c30d 421
casiotone401 4:b9f5ae574447 422 UpdateCV(WRITE_UPDATE_N, ch, &cv[ch]);
casiotone401 0:a4d93cd4c30d 423 break;
casiotone401 4:b9f5ae574447 424
casiotone401 4:b9f5ae574447 425 case MODE_QDor:
casiotone401 0:a4d93cd4c30d 426
casiotone401 4:b9f5ae574447 427 quan = 40616 / QUAN_RES3;
casiotone401 4:b9f5ae574447 428 qcv = calibMap3[(unsigned int)(gOSC_cv[ch] / quan)];
casiotone401 0:a4d93cd4c30d 429
casiotone401 0:a4d93cd4c30d 430 glidecv[ch] = oldcv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:a4d93cd4c30d 431 oldcv[ch] = glidecv[ch];
casiotone401 0:a4d93cd4c30d 432 cv[ch] = (unsigned int)glidecv[ch];
casiotone401 0:a4d93cd4c30d 433
casiotone401 4:b9f5ae574447 434 UpdateCV(WRITE_UPDATE_N, ch, &cv[ch]);
casiotone401 0:a4d93cd4c30d 435 break;
casiotone401 4:b9f5ae574447 436
casiotone401 4:b9f5ae574447 437 case MODE_Q5th:
casiotone401 4:b9f5ae574447 438
casiotone401 4:b9f5ae574447 439 quan = 40616 / QUAN_RES4;
casiotone401 4:b9f5ae574447 440 qcv = calibMap4[(unsigned int)(gOSC_cv[ch] / quan)];
casiotone401 0:a4d93cd4c30d 441
casiotone401 4:b9f5ae574447 442 glidecv[ch] = oldcv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 4:b9f5ae574447 443 oldcv[ch] = glidecv[ch];
casiotone401 4:b9f5ae574447 444 cv[ch] = (unsigned int)glidecv[ch];
casiotone401 4:b9f5ae574447 445
casiotone401 4:b9f5ae574447 446 UpdateCV(WRITE_UPDATE_N, ch, &cv[ch]);
casiotone401 4:b9f5ae574447 447 break;
casiotone401 0:a4d93cd4c30d 448
casiotone401 4:b9f5ae574447 449 case MODE_QWht:
casiotone401 4:b9f5ae574447 450
casiotone401 4:b9f5ae574447 451 quan = 40616 / QUAN_RES5;
casiotone401 4:b9f5ae574447 452 qcv = calibMap5[(unsigned int)(gOSC_cv[ch] / quan)];
casiotone401 0:a4d93cd4c30d 453
casiotone401 0:a4d93cd4c30d 454 glidecv[ch] = oldcv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 0:a4d93cd4c30d 455 oldcv[ch] = glidecv[ch];
casiotone401 0:a4d93cd4c30d 456 cv[ch] = (unsigned int)glidecv[ch];
casiotone401 0:a4d93cd4c30d 457
casiotone401 4:b9f5ae574447 458 UpdateCV(WRITE_UPDATE_N, ch, &cv[ch]);
casiotone401 0:a4d93cd4c30d 459 break;
casiotone401 3:ca15241dd6b4 460
casiotone401 4:b9f5ae574447 461 case MODE_Calb:
casiotone401 3:ca15241dd6b4 462
casiotone401 4:b9f5ae574447 463 cv[ch] = 19212; // A440.0Hz
casiotone401 3:ca15241dd6b4 464
casiotone401 4:b9f5ae574447 465 UpdateCV(WRITE_UPDATE_N, ch, &cv[ch]);
casiotone401 3:ca15241dd6b4 466 break;
casiotone401 0:a4d93cd4c30d 467 }
casiotone401 4:b9f5ae574447 468
casiotone401 4:b9f5ae574447 469 CVMeter(ch, &cv[ch]);
casiotone401 0:a4d93cd4c30d 470
casiotone401 0:a4d93cd4c30d 471 ch++;
casiotone401 0:a4d93cd4c30d 472 ch &= 0x07;
casiotone401 0:a4d93cd4c30d 473 }
casiotone401 0:a4d93cd4c30d 474
casiotone401 0:a4d93cd4c30d 475 //-------------------------------------------------------------
casiotone401 4:b9f5ae574447 476 // Sequence & Shift Out CV
casiotone401 4:b9f5ae574447 477
casiotone401 4:b9f5ae574447 478 void SeqCV()
casiotone401 4:b9f5ae574447 479 {
casiotone401 4:b9f5ae574447 480 static int ch;
casiotone401 4:b9f5ae574447 481 static int count;
casiotone401 4:b9f5ae574447 482 static unsigned int SeqMode;
casiotone401 4:b9f5ae574447 483 static float glidecv[8];
casiotone401 4:b9f5ae574447 484 unsigned int cv[8];
casiotone401 4:b9f5ae574447 485 static float shiftcv[8];
casiotone401 4:b9f5ae574447 486 static unsigned int quan;
casiotone401 4:b9f5ae574447 487 float qcv;
casiotone401 4:b9f5ae574447 488 static float clock;
casiotone401 4:b9f5ae574447 489 static float time;
casiotone401 4:b9f5ae574447 490
casiotone401 4:b9f5ae574447 491 SeqMode = (unsigned int)(gCtrl[1] * (MODE_NUM - 3)); // Sequencer Quantize Mode
casiotone401 4:b9f5ae574447 492
casiotone401 4:b9f5ae574447 493 time = gTimer.read();
casiotone401 4:b9f5ae574447 494 clock = gCtrl[0] * 0.5 + 0.01;
casiotone401 4:b9f5ae574447 495
casiotone401 4:b9f5ae574447 496 gLEDS[0] = gGATES[0] = 0; // Trigger
casiotone401 4:b9f5ae574447 497
casiotone401 4:b9f5ae574447 498 if(time > (clock / 2))
casiotone401 4:b9f5ae574447 499 {
casiotone401 4:b9f5ae574447 500 gLEDS[1] = gGATES[1] = 0; // Gate
casiotone401 4:b9f5ae574447 501
casiotone401 4:b9f5ae574447 502 } else if (count % 2) {
casiotone401 4:b9f5ae574447 503
casiotone401 4:b9f5ae574447 504 gLEDS[2] = gGATES[2] = 0;
casiotone401 4:b9f5ae574447 505
casiotone401 4:b9f5ae574447 506 } else if (count % 3) {
casiotone401 4:b9f5ae574447 507
casiotone401 4:b9f5ae574447 508 gLEDS[3] = gGATES[3] = 0;
casiotone401 4:b9f5ae574447 509 count = 0;
casiotone401 4:b9f5ae574447 510 }
casiotone401 4:b9f5ae574447 511
casiotone401 4:b9f5ae574447 512 switch(SeqMode)
casiotone401 4:b9f5ae574447 513 {
casiotone401 4:b9f5ae574447 514 case MODE_LIN:
casiotone401 4:b9f5ae574447 515
casiotone401 4:b9f5ae574447 516 if(ch < 8)
casiotone401 4:b9f5ae574447 517 {
casiotone401 4:b9f5ae574447 518 glidecv[0] = glidecv[0] * gGlide + gSeq_cv1[ch] * (1.0f - gGlide);
casiotone401 4:b9f5ae574447 519
casiotone401 4:b9f5ae574447 520 } else {
casiotone401 4:b9f5ae574447 521
casiotone401 4:b9f5ae574447 522 glidecv[0] = glidecv[0] * gGlide + gSeq_cv2[ch-8] * (1.0f - gGlide);
casiotone401 4:b9f5ae574447 523 }
casiotone401 4:b9f5ae574447 524
casiotone401 4:b9f5ae574447 525 cv[0] = (unsigned int)glidecv[0];
casiotone401 4:b9f5ae574447 526
casiotone401 4:b9f5ae574447 527 UpdateCV(WRITE_UPDATE_N, 0, &cv[0]);
casiotone401 4:b9f5ae574447 528 break;
casiotone401 4:b9f5ae574447 529
casiotone401 4:b9f5ae574447 530 case MODE_QChr:
casiotone401 4:b9f5ae574447 531
casiotone401 4:b9f5ae574447 532 quan = 40616 / QUAN_RES1;
casiotone401 4:b9f5ae574447 533
casiotone401 4:b9f5ae574447 534 if(ch < 8)
casiotone401 4:b9f5ae574447 535 {
casiotone401 4:b9f5ae574447 536 qcv = calibMap1[(unsigned int)(gSeq_cv1[ch] / quan)];
casiotone401 4:b9f5ae574447 537
casiotone401 4:b9f5ae574447 538 } else {
casiotone401 4:b9f5ae574447 539
casiotone401 4:b9f5ae574447 540 qcv = calibMap1[(unsigned int)(gSeq_cv2[ch-8] / quan)];
casiotone401 4:b9f5ae574447 541 }
casiotone401 4:b9f5ae574447 542
casiotone401 4:b9f5ae574447 543 glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 4:b9f5ae574447 544 cv[0] = (unsigned int)glidecv[0];
casiotone401 4:b9f5ae574447 545
casiotone401 4:b9f5ae574447 546 UpdateCV(WRITE_UPDATE_N, 0, &cv[0]);
casiotone401 4:b9f5ae574447 547 break;
casiotone401 4:b9f5ae574447 548
casiotone401 4:b9f5ae574447 549 case MODE_QMaj:
casiotone401 4:b9f5ae574447 550
casiotone401 4:b9f5ae574447 551 quan = 40616 / QUAN_RES2;
casiotone401 4:b9f5ae574447 552
casiotone401 4:b9f5ae574447 553 if(ch < 8)
casiotone401 4:b9f5ae574447 554 {
casiotone401 4:b9f5ae574447 555 qcv = calibMap2[(unsigned int)(gSeq_cv1[ch] / quan)];
casiotone401 4:b9f5ae574447 556
casiotone401 4:b9f5ae574447 557 } else {
casiotone401 4:b9f5ae574447 558
casiotone401 4:b9f5ae574447 559 qcv = calibMap2[(unsigned int)(gSeq_cv2[ch-8] / quan)];
casiotone401 4:b9f5ae574447 560 }
casiotone401 4:b9f5ae574447 561
casiotone401 4:b9f5ae574447 562 glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 4:b9f5ae574447 563 cv[0] = (unsigned int)glidecv[0];
casiotone401 4:b9f5ae574447 564
casiotone401 4:b9f5ae574447 565 UpdateCV(WRITE_UPDATE_N, 0, &cv[0]);
casiotone401 4:b9f5ae574447 566 break;
casiotone401 4:b9f5ae574447 567
casiotone401 4:b9f5ae574447 568 case MODE_QDor:
casiotone401 4:b9f5ae574447 569
casiotone401 4:b9f5ae574447 570 quan = 40616 / QUAN_RES3;
casiotone401 4:b9f5ae574447 571
casiotone401 4:b9f5ae574447 572 if(ch < 8)
casiotone401 4:b9f5ae574447 573 {
casiotone401 4:b9f5ae574447 574 qcv = calibMap3[(unsigned int)(gSeq_cv1[ch] / quan)];
casiotone401 4:b9f5ae574447 575
casiotone401 4:b9f5ae574447 576 } else {
casiotone401 4:b9f5ae574447 577
casiotone401 4:b9f5ae574447 578 qcv = calibMap3[(unsigned int)(gSeq_cv2[ch-8] / quan)];
casiotone401 4:b9f5ae574447 579 }
casiotone401 4:b9f5ae574447 580
casiotone401 4:b9f5ae574447 581 glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 4:b9f5ae574447 582 cv[0] = (unsigned int)glidecv[0];
casiotone401 4:b9f5ae574447 583
casiotone401 4:b9f5ae574447 584 UpdateCV(WRITE_UPDATE_N, 0, &cv[0]);
casiotone401 4:b9f5ae574447 585 break;
casiotone401 4:b9f5ae574447 586
casiotone401 4:b9f5ae574447 587 case MODE_Q5th:
casiotone401 4:b9f5ae574447 588
casiotone401 4:b9f5ae574447 589 quan = 40616 / QUAN_RES4;
casiotone401 4:b9f5ae574447 590
casiotone401 4:b9f5ae574447 591 if(ch < 8)
casiotone401 4:b9f5ae574447 592 {
casiotone401 4:b9f5ae574447 593 qcv = calibMap4[(unsigned int)(gSeq_cv1[ch] / quan)];
casiotone401 4:b9f5ae574447 594
casiotone401 4:b9f5ae574447 595 } else {
casiotone401 4:b9f5ae574447 596
casiotone401 4:b9f5ae574447 597 qcv = calibMap4[(unsigned int)(gSeq_cv2[ch-8] / quan)];
casiotone401 4:b9f5ae574447 598 }
casiotone401 4:b9f5ae574447 599
casiotone401 4:b9f5ae574447 600 glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 4:b9f5ae574447 601 cv[0] = (unsigned int)glidecv[0];
casiotone401 4:b9f5ae574447 602
casiotone401 4:b9f5ae574447 603 UpdateCV(WRITE_UPDATE_N, 0, &cv[0]);
casiotone401 4:b9f5ae574447 604 break;
casiotone401 4:b9f5ae574447 605
casiotone401 4:b9f5ae574447 606 case MODE_QWht:
casiotone401 4:b9f5ae574447 607
casiotone401 4:b9f5ae574447 608 quan = 40616 / QUAN_RES5;
casiotone401 4:b9f5ae574447 609
casiotone401 4:b9f5ae574447 610 if(ch < 8)
casiotone401 4:b9f5ae574447 611 {
casiotone401 4:b9f5ae574447 612 qcv = calibMap5[(unsigned int)(gSeq_cv1[ch] / quan)];
casiotone401 4:b9f5ae574447 613
casiotone401 4:b9f5ae574447 614 } else {
casiotone401 4:b9f5ae574447 615
casiotone401 4:b9f5ae574447 616 qcv = calibMap5[(unsigned int)(gSeq_cv2[ch-8] / quan)];
casiotone401 4:b9f5ae574447 617 }
casiotone401 4:b9f5ae574447 618
casiotone401 4:b9f5ae574447 619 glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
casiotone401 4:b9f5ae574447 620 cv[0] = (unsigned int)glidecv[0];
casiotone401 4:b9f5ae574447 621
casiotone401 4:b9f5ae574447 622 UpdateCV(WRITE_UPDATE_N, 0, &cv[0]);
casiotone401 4:b9f5ae574447 623 break;
casiotone401 4:b9f5ae574447 624 }
casiotone401 4:b9f5ae574447 625
casiotone401 4:b9f5ae574447 626 for(int i = 1; i < 8; ++i)
casiotone401 4:b9f5ae574447 627 {
casiotone401 4:b9f5ae574447 628 glidecv[i] = glidecv[i] * gGlide + shiftcv[i] * (1.0f - gGlide);
casiotone401 4:b9f5ae574447 629 cv[i] = (unsigned int)glidecv[i];
casiotone401 4:b9f5ae574447 630
casiotone401 4:b9f5ae574447 631 UpdateCV(WRITE_UPDATE_N, i, &cv[i]);
casiotone401 4:b9f5ae574447 632 }
casiotone401 4:b9f5ae574447 633
casiotone401 4:b9f5ae574447 634 if(time > clock)
casiotone401 4:b9f5ae574447 635 {
casiotone401 4:b9f5ae574447 636 gLEDS[0] = gGATES[0] = 1;
casiotone401 4:b9f5ae574447 637 gLEDS[1] = gGATES[1] = 1;
casiotone401 4:b9f5ae574447 638 gLEDS[2] = gGATES[2] = 1;
casiotone401 4:b9f5ae574447 639 gLEDS[3] = gGATES[3] = 1;
casiotone401 4:b9f5ae574447 640
casiotone401 4:b9f5ae574447 641 count++;
casiotone401 4:b9f5ae574447 642
casiotone401 4:b9f5ae574447 643 for(int j = 1; j < 8; ++j) // Shift Note
casiotone401 4:b9f5ae574447 644 {
casiotone401 4:b9f5ae574447 645 shiftcv[j] = glidecv[j-1];
casiotone401 4:b9f5ae574447 646 }
casiotone401 4:b9f5ae574447 647
casiotone401 4:b9f5ae574447 648 ch++;
casiotone401 4:b9f5ae574447 649 ch &= 0x0F;
casiotone401 4:b9f5ae574447 650 gTimer.reset();
casiotone401 4:b9f5ae574447 651 }
casiotone401 4:b9f5ae574447 652
casiotone401 4:b9f5ae574447 653 if(ch < 8)
casiotone401 4:b9f5ae574447 654 {
casiotone401 4:b9f5ae574447 655 CVMeter(ch, &cv[0]);
casiotone401 4:b9f5ae574447 656
casiotone401 4:b9f5ae574447 657 } else {
casiotone401 4:b9f5ae574447 658
casiotone401 4:b9f5ae574447 659 CVMeter((ch-8), &cv[0]);
casiotone401 4:b9f5ae574447 660 }
casiotone401 4:b9f5ae574447 661 }
casiotone401 4:b9f5ae574447 662
casiotone401 4:b9f5ae574447 663 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 664 // Check SW
casiotone401 0:a4d93cd4c30d 665
casiotone401 4:b9f5ae574447 666 void CheckSW()
casiotone401 0:a4d93cd4c30d 667 {
casiotone401 4:b9f5ae574447 668 wait(0.01);
casiotone401 4:b9f5ae574447 669
casiotone401 3:ca15241dd6b4 670 if(gMode < MODE_NUM - 1)
casiotone401 0:a4d93cd4c30d 671 {
casiotone401 0:a4d93cd4c30d 672 gMode++;
casiotone401 3:ca15241dd6b4 673
casiotone401 0:a4d93cd4c30d 674 } else {
casiotone401 4:b9f5ae574447 675
casiotone401 0:a4d93cd4c30d 676 gMode = 0;
casiotone401 0:a4d93cd4c30d 677 }
casiotone401 3:ca15241dd6b4 678
casiotone401 4:b9f5ae574447 679 LCD();
casiotone401 4:b9f5ae574447 680 }
casiotone401 4:b9f5ae574447 681
casiotone401 4:b9f5ae574447 682 //-------------------------------------------------------------
casiotone401 4:b9f5ae574447 683 // CV meter
casiotone401 4:b9f5ae574447 684
casiotone401 4:b9f5ae574447 685 void CVMeter(int ch, const unsigned int *level)
casiotone401 4:b9f5ae574447 686 {
casiotone401 4:b9f5ae574447 687 unsigned int cvmeter;
casiotone401 4:b9f5ae574447 688
casiotone401 4:b9f5ae574447 689 cvmeter = *level / 4860;
casiotone401 4:b9f5ae574447 690 // cvmeter = *level / (SCALING_N / 7.9);
casiotone401 4:b9f5ae574447 691
casiotone401 4:b9f5ae574447 692 gLCD.locate ( ch, 0 );
casiotone401 4:b9f5ae574447 693 gLCD.putc(cvmeter); // put custom char
casiotone401 4:b9f5ae574447 694 }
casiotone401 4:b9f5ae574447 695
casiotone401 4:b9f5ae574447 696 //-------------------------------------------------------------
casiotone401 4:b9f5ae574447 697 // Print LCD Menu
casiotone401 4:b9f5ae574447 698
casiotone401 4:b9f5ae574447 699 void LCD()
casiotone401 4:b9f5ae574447 700 {
casiotone401 3:ca15241dd6b4 701 switch(gMode)
casiotone401 3:ca15241dd6b4 702 {
casiotone401 3:ca15241dd6b4 703 case MODE_LIN:
casiotone401 3:ca15241dd6b4 704 gLCD.locate( 9, 0 );
casiotone401 3:ca15241dd6b4 705 gLCD.printf("OSC-CV ");
casiotone401 3:ca15241dd6b4 706 break;
casiotone401 3:ca15241dd6b4 707
casiotone401 3:ca15241dd6b4 708 case MODE_QChr:
casiotone401 3:ca15241dd6b4 709 gLCD.locate( 9, 0 );
casiotone401 3:ca15241dd6b4 710 gLCD.printf("QUAN_C ");
casiotone401 3:ca15241dd6b4 711 break;
casiotone401 3:ca15241dd6b4 712
casiotone401 3:ca15241dd6b4 713 case MODE_QMaj:
casiotone401 3:ca15241dd6b4 714 gLCD.locate( 9, 0 );
casiotone401 3:ca15241dd6b4 715 gLCD.printf("QUAN_M ");
casiotone401 3:ca15241dd6b4 716 break;
casiotone401 3:ca15241dd6b4 717
casiotone401 3:ca15241dd6b4 718 case MODE_QDor:
casiotone401 3:ca15241dd6b4 719 gLCD.locate( 9, 0 );
casiotone401 3:ca15241dd6b4 720 gLCD.printf("QUAN_D ");
casiotone401 3:ca15241dd6b4 721 break;
casiotone401 3:ca15241dd6b4 722
casiotone401 3:ca15241dd6b4 723 case MODE_Q5th:
casiotone401 3:ca15241dd6b4 724 gLCD.locate( 9, 0 );
casiotone401 3:ca15241dd6b4 725 gLCD.printf("QUAN_5 ");
casiotone401 3:ca15241dd6b4 726 break;
casiotone401 3:ca15241dd6b4 727
casiotone401 3:ca15241dd6b4 728 case MODE_QWht:
casiotone401 3:ca15241dd6b4 729 gLCD.locate( 9, 0 );
casiotone401 3:ca15241dd6b4 730 gLCD.printf("QUAN_W ");
casiotone401 3:ca15241dd6b4 731 break;
casiotone401 4:b9f5ae574447 732
casiotone401 4:b9f5ae574447 733 case MODE_SEQ:
casiotone401 4:b9f5ae574447 734 gLCD.locate( 9, 0 );
casiotone401 4:b9f5ae574447 735 gLCD.printf("ASRSEQ ");
casiotone401 4:b9f5ae574447 736
casiotone401 4:b9f5ae574447 737 gTimer.start(); // Sequencer Timer Start
casiotone401 4:b9f5ae574447 738 break;
casiotone401 4:b9f5ae574447 739
casiotone401 4:b9f5ae574447 740 case MODE_Calb:
casiotone401 4:b9f5ae574447 741 gLCD.locate( 9, 0 );
casiotone401 4:b9f5ae574447 742 gLCD.printf("Calibr ");
casiotone401 4:b9f5ae574447 743 break;
casiotone401 3:ca15241dd6b4 744 }
casiotone401 0:a4d93cd4c30d 745 }
casiotone401 0:a4d93cd4c30d 746
casiotone401 0:a4d93cd4c30d 747 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 748 // Write command Custom Char LCD CGRAM(CV Meter)
casiotone401 0:a4d93cd4c30d 749
casiotone401 0:a4d93cd4c30d 750 void WriteCustomChar(unsigned char addr, unsigned char *c)
casiotone401 0:a4d93cd4c30d 751 {
casiotone401 0:a4d93cd4c30d 752 char cnt = 0;
casiotone401 0:a4d93cd4c30d 753 addr = ((addr << 3) | 0x40);
casiotone401 0:a4d93cd4c30d 754
casiotone401 0:a4d93cd4c30d 755 while(cnt < 0x08)
casiotone401 0:a4d93cd4c30d 756 {
casiotone401 0:a4d93cd4c30d 757 gLCD.writeCommand(addr | cnt);
casiotone401 0:a4d93cd4c30d 758 gLCD.writeData(*c);
casiotone401 4:b9f5ae574447 759
casiotone401 0:a4d93cd4c30d 760 cnt++;
casiotone401 0:a4d93cd4c30d 761 c++;
casiotone401 0:a4d93cd4c30d 762 }
casiotone401 0:a4d93cd4c30d 763 }
casiotone401 0:a4d93cd4c30d 764
casiotone401 0:a4d93cd4c30d 765 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 766 // Setup Ethernet port
casiotone401 0:a4d93cd4c30d 767
casiotone401 0:a4d93cd4c30d 768 int SetupEthNetIf()
casiotone401 0:a4d93cd4c30d 769 {
casiotone401 0:a4d93cd4c30d 770 gLCD.locate( 0, 1 );
casiotone401 0:a4d93cd4c30d 771 gLCD.printf("Setting up... ");
casiotone401 0:a4d93cd4c30d 772 // printf("Setting up...\r\n");
casiotone401 0:a4d93cd4c30d 773 EthernetErr ethErr = gEth.setup();
casiotone401 0:a4d93cd4c30d 774
casiotone401 0:a4d93cd4c30d 775 if(ethErr)
casiotone401 0:a4d93cd4c30d 776 {
casiotone401 0:a4d93cd4c30d 777 gLCD.locate( 0, 1 );
casiotone401 0:a4d93cd4c30d 778 gLCD.printf("Error in setup.");
casiotone401 0:a4d93cd4c30d 779 // printf("Error %d in setup.\r\n", ethErr);
casiotone401 0:a4d93cd4c30d 780 return -1;
casiotone401 0:a4d93cd4c30d 781 }
casiotone401 0:a4d93cd4c30d 782 // printf("Setup OK\r\n");
casiotone401 0:a4d93cd4c30d 783
casiotone401 0:a4d93cd4c30d 784 // printf("IP address %d.%d.%d.%d\r\n", gEth.getIp()[0], gEth.getIp()[1], gEth.getIp()[2], gEth.getIp()[3]);
casiotone401 0:a4d93cd4c30d 785 Host broadcast(IpAddr(gEth.getIp()[0], gEth.getIp()[1], gEth.getIp()[2], 255), INPUT_PORT, NULL);
casiotone401 0:a4d93cd4c30d 786 gUdp.setOnEvent(&onUDPSocketEvent);
casiotone401 0:a4d93cd4c30d 787 gUdp.bind(broadcast);
casiotone401 4:b9f5ae574447 788
casiotone401 0:a4d93cd4c30d 789 gLCD.locate( 0, 1 );
casiotone401 0:a4d93cd4c30d 790 gLCD.printf("%03d.%03d.%03d.%03d", gEth.getIp()[0], gEth.getIp()[1], gEth.getIp()[2], gEth.getIp()[3]);
casiotone401 4:b9f5ae574447 791 wait(1.0);
casiotone401 0:a4d93cd4c30d 792
casiotone401 0:a4d93cd4c30d 793 return 0;
casiotone401 0:a4d93cd4c30d 794 }
casiotone401 0:a4d93cd4c30d 795
casiotone401 0:a4d93cd4c30d 796 //-------------------------------------------------------------
casiotone401 0:a4d93cd4c30d 797 // Handller receive UDP Packet
casiotone401 0:a4d93cd4c30d 798
casiotone401 4:b9f5ae574447 799 inline void onUDPSocketEvent(UDPSocketEvent e)
casiotone401 0:a4d93cd4c30d 800 {
casiotone401 0:a4d93cd4c30d 801 union OSCarg msg[10];
casiotone401 0:a4d93cd4c30d 802 static int num;
casiotone401 0:a4d93cd4c30d 803
casiotone401 0:a4d93cd4c30d 804 switch(e)
casiotone401 0:a4d93cd4c30d 805 {
casiotone401 4:b9f5ae574447 806 case UDPSOCKET_READABLE: // The only event for now
casiotone401 0:a4d93cd4c30d 807 char buf[256] = {0};
casiotone401 0:a4d93cd4c30d 808 Host host;
casiotone401 0:a4d93cd4c30d 809
casiotone401 0:a4d93cd4c30d 810 while( int len = gUdp.recvfrom( buf, 256, &host ))
casiotone401 0:a4d93cd4c30d 811 {
casiotone401 0:a4d93cd4c30d 812 if(len <= 0) break;
casiotone401 0:a4d93cd4c30d 813 // printf("\r\nFrom %d.%d.%d.%d:\r\n",
casiotone401 0:a4d93cd4c30d 814 // host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3]);
casiotone401 0:a4d93cd4c30d 815
casiotone401 0:a4d93cd4c30d 816 getOSCmsg(buf,msg);
casiotone401 0:a4d93cd4c30d 817 // printf("OSCmsg: %s %s %f %i\r\n",
casiotone401 0:a4d93cd4c30d 818 // msg[0].address, msg[1].typeTag, msg[2].f, msg[2].i);
casiotone401 0:a4d93cd4c30d 819
casiotone401 0:a4d93cd4c30d 820 len = strlen(msg[0].address);
casiotone401 4:b9f5ae574447 821
casiotone401 4:b9f5ae574447 822 if(isdigit(msg[0].address[len-1]))
casiotone401 4:b9f5ae574447 823
casiotone401 4:b9f5ae574447 824 num = msg[0].address[len-1] - '0' - 1;
casiotone401 0:a4d93cd4c30d 825
casiotone401 4:b9f5ae574447 826 else
casiotone401 4:b9f5ae574447 827
casiotone401 4:b9f5ae574447 828 num = -1;
casiotone401 4:b9f5ae574447 829
casiotone401 4:b9f5ae574447 830 unsigned int absv = msg[2].f + 0; //convert -0 to 0
casiotone401 0:a4d93cd4c30d 831
casiotone401 0:a4d93cd4c30d 832 // address pattern SYNC & GATE (Type Tag int, float)
casiotone401 3:ca15241dd6b4 833 if((strncmp(msg[0].address+(len-1)-4, "sync", 4)==0) && (num == -1)) {
casiotone401 0:a4d93cd4c30d 834 if(num > 1) break;
casiotone401 0:a4d93cd4c30d 835 if(absv >= 1 || msg[2].i >= 1) gCLOCKOUT = 1;
casiotone401 0:a4d93cd4c30d 836 else gCLOCKOUT = 0;
casiotone401 0:a4d93cd4c30d 837 break;
casiotone401 0:a4d93cd4c30d 838
casiotone401 3:ca15241dd6b4 839 } else if ((strncmp(msg[0].address+(len-1)-4, "gate", 4)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 840 if(num > 3) break;
casiotone401 0:a4d93cd4c30d 841 if(absv >= 1 || msg[2].i >= 1) gLEDS[num] = gGATES[num] = 1;
casiotone401 0:a4d93cd4c30d 842 else gLEDS[num] = gGATES[num] = 0;
casiotone401 0:a4d93cd4c30d 843 break;
casiotone401 0:a4d93cd4c30d 844 // (touchOSC Control push, toggle)
casiotone401 3:ca15241dd6b4 845 } else if ((strncmp(msg[0].address+(len-1)-4, "push", 4)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 846 if(num > 3) break;
casiotone401 0:a4d93cd4c30d 847 if(absv >= 1 || msg[2].i >= 1) gLEDS[num] = gGATES[num] = 1;
casiotone401 0:a4d93cd4c30d 848 else gLEDS[num] = gGATES[num] = 0;
casiotone401 0:a4d93cd4c30d 849 break;
casiotone401 0:a4d93cd4c30d 850
casiotone401 3:ca15241dd6b4 851 } else if ((strncmp(msg[0].address+(len-1)-6, "toggle", 6)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 852 if(num > 3) break;
casiotone401 0:a4d93cd4c30d 853 if(absv >= 1 || msg[2].i >= 1) gLEDS[num] = gGATES[num] = 1;
casiotone401 0:a4d93cd4c30d 854 else gLEDS[num] = gGATES[num] = 0;
casiotone401 0:a4d93cd4c30d 855 break;
casiotone401 4:b9f5ae574447 856
casiotone401 0:a4d93cd4c30d 857 } else if ((strncmp(msg[0].address,"/1/multipush",12)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 858 if(num > 3) break;
casiotone401 0:a4d93cd4c30d 859 if(absv >= 1 || msg[2].i >= 1) gLEDS[num] = gGATES[num] = 1;
casiotone401 0:a4d93cd4c30d 860 else gLEDS[num] = gGATES[num] = 0;
casiotone401 0:a4d93cd4c30d 861 break;
casiotone401 0:a4d93cd4c30d 862 }
casiotone401 0:a4d93cd4c30d 863
casiotone401 0:a4d93cd4c30d 864 // address pattern CV (Type Tag float)
casiotone401 3:ca15241dd6b4 865 if((strncmp(msg[0].address+(len-1)-2, "cv", 2)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 866 if(num > 7) break;
casiotone401 0:a4d93cd4c30d 867 if(msg[1].typeTag[1] == 'f') gOSC_cv[num] = msg[2].f * (SCALING_N);
casiotone401 0:a4d93cd4c30d 868 break;
casiotone401 0:a4d93cd4c30d 869 // (touchOSC Control fader, rotary, xy, multixy, multifader)
casiotone401 3:ca15241dd6b4 870 } else if ((strncmp(msg[0].address+(len-1)-5, "fader", 5)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 871 if(num > 7) break;
casiotone401 0:a4d93cd4c30d 872 if(msg[1].typeTag[1] == 'f') gOSC_cv[num] = msg[2].f * (SCALING_N);
casiotone401 0:a4d93cd4c30d 873 break;
casiotone401 0:a4d93cd4c30d 874
casiotone401 3:ca15241dd6b4 875 } else if ((strncmp(msg[0].address+(len-1)-6, "rotary", 6)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 876 if(num > 7) break;
casiotone401 0:a4d93cd4c30d 877 if(msg[1].typeTag[1] == 'f') gOSC_cv[num] = msg[2].f * (SCALING_N);
casiotone401 0:a4d93cd4c30d 878 break;
casiotone401 0:a4d93cd4c30d 879
casiotone401 3:ca15241dd6b4 880 } else if ((strncmp(msg[0].address+(len-1)-2, "xy", 2)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 881 if(num > 7) break;
casiotone401 0:a4d93cd4c30d 882 if(msg[1].typeTag[1] == 'f') gOSC_cv[num] = msg[2].f * (SCALING_N);
casiotone401 0:a4d93cd4c30d 883 if(msg[1].typeTag[1] == 'f') gOSC_cv[++num] = msg[3].f * (SCALING_N);
casiotone401 0:a4d93cd4c30d 884 break;
casiotone401 0:a4d93cd4c30d 885
casiotone401 3:ca15241dd6b4 886 } else if ((strncmp(msg[0].address+(len-1)-9, "multixy1/", 9)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 887 if(num > 7) break;
casiotone401 0:a4d93cd4c30d 888 if(msg[1].typeTag[1] == 'f') gOSC_cv[num] = msg[2].f * (SCALING_N);
casiotone401 0:a4d93cd4c30d 889 if(msg[1].typeTag[1] == 'f') gOSC_cv[++num] = msg[3].f * (SCALING_N);
casiotone401 0:a4d93cd4c30d 890 break;
casiotone401 0:a4d93cd4c30d 891
casiotone401 3:ca15241dd6b4 892 } else if ((strncmp(msg[0].address+(len-1)-12, "multifader1/", 12)==0) && (num != -1)) {
casiotone401 0:a4d93cd4c30d 893 if(num > 7) break;
casiotone401 0:a4d93cd4c30d 894 if(msg[1].typeTag[1] == 'f') gOSC_cv[num] = msg[2].f * (SCALING_N);
casiotone401 4:b9f5ae574447 895 break;
casiotone401 4:b9f5ae574447 896
casiotone401 4:b9f5ae574447 897 } else if ((strncmp(msg[0].address+(len-1)-11, "sequencer1/", 11)==0) && (num != -1)) {
casiotone401 4:b9f5ae574447 898 if(num > 7) break;
casiotone401 4:b9f5ae574447 899 if(msg[1].typeTag[1] == 'f') gSeq_cv1[num] = msg[2].f * (SCALING_N);
casiotone401 4:b9f5ae574447 900 break;
casiotone401 4:b9f5ae574447 901
casiotone401 4:b9f5ae574447 902 } else if ((strncmp(msg[0].address+(len-1)-11, "sequencer2/", 11)==0) && (num != -1)) {
casiotone401 4:b9f5ae574447 903 if(num > 7) break;
casiotone401 4:b9f5ae574447 904 if(msg[1].typeTag[1] == 'f') gSeq_cv2[num] = msg[2].f * (SCALING_N);
casiotone401 4:b9f5ae574447 905 break;
casiotone401 4:b9f5ae574447 906 }
casiotone401 4:b9f5ae574447 907
casiotone401 4:b9f5ae574447 908 // address pattern controller
casiotone401 4:b9f5ae574447 909 if ((strncmp(msg[0].address+(len-1)-6, "ctrlsw", 6)==0) && (num != -1)) {
casiotone401 4:b9f5ae574447 910 if(num > 2) break;
casiotone401 4:b9f5ae574447 911 if(absv >= 1 || msg[2].i >= 1) gCtrlSW[num] = 1;
casiotone401 4:b9f5ae574447 912 else gCtrlSW[num] = 0;
casiotone401 4:b9f5ae574447 913 break;
casiotone401 4:b9f5ae574447 914
casiotone401 4:b9f5ae574447 915 } else if ((strncmp(msg[0].address+(len-1)-4, "ctrl", 4)==0) && (num != -1)) {
casiotone401 4:b9f5ae574447 916 if(num > 2) break;
casiotone401 4:b9f5ae574447 917 if(msg[1].typeTag[1] == 'f') gCtrl[num] = msg[2].f;
casiotone401 4:b9f5ae574447 918 break;
casiotone401 4:b9f5ae574447 919 }
casiotone401 4:b9f5ae574447 920 }
casiotone401 4:b9f5ae574447 921 }
casiotone401 0:a4d93cd4c30d 922 }