CVtoOSC Converter for Nucleo F303K8

Dependencies:   DebouncedInterrupt MIDI mbed osc-cnmat BufferedSerial

OSC to CV Converter

http://gtbts.tumblr.com/post/142840140501/cvtoosc-converter-for-modular-synthesizer

Committer:
casiotone401
Date:
Sat Feb 20 01:33:47 2016 +0000
Revision:
2:7997fb939580
Parent:
1:0a963a78f2bd
increase send buffer size

Who changed what in which revision?

UserRevisionLine numberNew contents of line
casiotone401 0:577ad245b1f5 1 /*
casiotone401 0:577ad245b1f5 2 CVtoOSC&MIDI Converter for Nucleo F303K8
casiotone401 0:577ad245b1f5 3 https://developer.mbed.org/platforms/ST-Nucleo-F303K8/
casiotone401 0:577ad245b1f5 4 */
casiotone401 0:577ad245b1f5 5
casiotone401 0:577ad245b1f5 6 #pragma O3
casiotone401 0:577ad245b1f5 7 #pragma Otime
casiotone401 0:577ad245b1f5 8
casiotone401 0:577ad245b1f5 9 #include <stdlib.h>
casiotone401 0:577ad245b1f5 10 #include <ctype.h>
casiotone401 0:577ad245b1f5 11 #include <math.h>
casiotone401 0:577ad245b1f5 12 #include <string>
casiotone401 0:577ad245b1f5 13
casiotone401 0:577ad245b1f5 14 #include "mbed.h"
casiotone401 1:0a963a78f2bd 15 #include "BufferedSerial.h"
casiotone401 0:577ad245b1f5 16 #include "DebouncedInterrupt.h"
casiotone401 0:577ad245b1f5 17 #include "MIDI.h"
casiotone401 0:577ad245b1f5 18 #include "OSCBundle.h"
casiotone401 0:577ad245b1f5 19
casiotone401 0:577ad245b1f5 20 //-------------------------------------------------------------
casiotone401 0:577ad245b1f5 21 // Macros
casiotone401 0:577ad245b1f5 22
casiotone401 0:577ad245b1f5 23 #define MIDI_OFFSET 4
casiotone401 0:577ad245b1f5 24 #define MAP_OFFSET 0
casiotone401 0:577ad245b1f5 25 #define CALIB_OFFSET 37
casiotone401 0:577ad245b1f5 26
casiotone401 0:577ad245b1f5 27 #define QUAN_RES1 116 // Quantize voltage Steps
casiotone401 0:577ad245b1f5 28 #define QUAN_RES2 68
casiotone401 0:577ad245b1f5 29 #define QUAN_RES3 46
casiotone401 0:577ad245b1f5 30 #define QUAN_RES4 40
casiotone401 0:577ad245b1f5 31 #define QUAN_RES5 68
casiotone401 0:577ad245b1f5 32 #define QUAN_RES6 68
casiotone401 0:577ad245b1f5 33 #define QUAN_RES7 16
casiotone401 0:577ad245b1f5 34 #define QUAN_RES8 58
casiotone401 0:577ad245b1f5 35
casiotone401 0:577ad245b1f5 36 #define Lin 0 // Linear LinearCV
casiotone401 0:577ad245b1f5 37 #define Chr 1 // Chromatic
casiotone401 0:577ad245b1f5 38 #define Maj 2 // Major
casiotone401 0:577ad245b1f5 39 #define M7 3 // Major7
casiotone401 0:577ad245b1f5 40 #define Min7 4 // Minor7
casiotone401 0:577ad245b1f5 41 #define Dor 5 // Dorian
casiotone401 0:577ad245b1f5 42 #define Min 6 // Minor
casiotone401 0:577ad245b1f5 43 #define S5th 7 // 5th
casiotone401 0:577ad245b1f5 44 #define Wht 8 // Wholetone
casiotone401 0:577ad245b1f5 45
casiotone401 0:577ad245b1f5 46 #define SCALE_TOTAL 9
casiotone401 0:577ad245b1f5 47
casiotone401 2:7997fb939580 48 #define SEND_BUFF_SIZE 1024 // OSC send buffer size
casiotone401 0:577ad245b1f5 49 #define WAIT_SEND 20 // wait time(ms) for esp8266 transmission complete
casiotone401 0:577ad245b1f5 50
casiotone401 0:577ad245b1f5 51 #define MIDI_CHANNEL 1 // MIDI channel
casiotone401 0:577ad245b1f5 52
casiotone401 0:577ad245b1f5 53 //-------------------------------------------------------------
casiotone401 0:577ad245b1f5 54 // Global Variables
casiotone401 0:577ad245b1f5 55
casiotone401 0:577ad245b1f5 56 // Silentway Calibration Data Mapping
casiotone401 0:577ad245b1f5 57 // http://www.expert-sleepers.co.uk/silentway.html
casiotone401 0:577ad245b1f5 58
casiotone401 0:577ad245b1f5 59 // Chromatic Scale
casiotone401 0:577ad245b1f5 60 const float calibMap1[QUAN_RES1] = {
casiotone401 0:577ad245b1f5 61 0.00076928, 0.00900736, 0.01724544, 0.02548352, 0.03372160,
casiotone401 0:577ad245b1f5 62 0.04195968, 0.05019776, 0.05843584, 0.06667392, 0.07491200,
casiotone401 0:577ad245b1f5 63 0.08315008, 0.09138816, 0.09962624, 0.10786432, 0.11610240,
casiotone401 0:577ad245b1f5 64 0.12434047, 0.13258974, 0.14083999, 0.14909023, 0.15734047,
casiotone401 0:577ad245b1f5 65 0.16559070, 0.17384095, 0.18209119, 0.19034143, 0.19859168,
casiotone401 0:577ad245b1f5 66 0.20684192, 0.21509215, 0.22334240, 0.23159264, 0.23984288,
casiotone401 0:577ad245b1f5 67 0.24809311, 0.25634655, 0.26460093, 0.27285531, 0.28110969,
casiotone401 0:577ad245b1f5 68 0.28936407, 0.29761845, 0.30587283, 0.31412721, 0.32238159,
casiotone401 0:577ad245b1f5 69 0.33063596, 0.33889034, 0.34714472, 0.35539910, 0.36365348,
casiotone401 0:577ad245b1f5 70 0.37190786, 0.38017464, 0.38844886, 0.39672306, 0.40499726,
casiotone401 0:577ad245b1f5 71 0.41327149, 0.42154568, 0.42981988, 0.43809411, 0.44636831,
casiotone401 0:577ad245b1f5 72 0.45464250, 0.46291673, 0.47119093, 0.47946513, 0.48773935,
casiotone401 0:577ad245b1f5 73 0.49601355, 0.50430328, 0.51260746, 0.52091163, 0.52921581,
casiotone401 0:577ad245b1f5 74 0.53751999, 0.54582411, 0.55412829, 0.56243247, 0.57073665,
casiotone401 0:577ad245b1f5 75 0.57904083, 0.58734500, 0.59564912, 0.60395330, 0.61225748,
casiotone401 0:577ad245b1f5 76 0.62056166, 0.62890279, 0.63728637, 0.64566994, 0.65405351,
casiotone401 0:577ad245b1f5 77 0.66243708, 0.67082065, 0.67920423, 0.68758780, 0.69597137,
casiotone401 0:577ad245b1f5 78 0.70435494, 0.71273851, 0.72112209, 0.72950566, 0.73788923,
casiotone401 0:577ad245b1f5 79 0.74627280, 0.75476575, 0.76334614, 0.77192658, 0.78050703,
casiotone401 0:577ad245b1f5 80 0.78908741, 0.79766786, 0.80624831, 0.81482869, 0.82340914,
casiotone401 0:577ad245b1f5 81 0.83198959, 0.84056997, 0.84915042, 0.85773087, 0.86631125,
casiotone401 0:577ad245b1f5 82 0.87489170, 0.88425636, 0.89363104, 0.90300572, 0.91238040,
casiotone401 0:577ad245b1f5 83 0.92175508, 0.93112975, 0.94050443, 0.94987911, 0.95925385,
casiotone401 0:577ad245b1f5 84 0.96862853
casiotone401 0:577ad245b1f5 85 };
casiotone401 0:577ad245b1f5 86
casiotone401 0:577ad245b1f5 87 // Major Scale
casiotone401 0:577ad245b1f5 88 const float calibMap2[QUAN_RES2] = {
casiotone401 0:577ad245b1f5 89 calibMap1[0], calibMap1[2], calibMap1[4], calibMap1[5], calibMap1[7],
casiotone401 0:577ad245b1f5 90 calibMap1[9], calibMap1[11], calibMap1[12], calibMap1[14], calibMap1[16],
casiotone401 0:577ad245b1f5 91 calibMap1[17], calibMap1[19], calibMap1[21], calibMap1[23], calibMap1[24],
casiotone401 0:577ad245b1f5 92 calibMap1[26], calibMap1[28], calibMap1[29], calibMap1[31], calibMap1[33],
casiotone401 0:577ad245b1f5 93 calibMap1[35], calibMap1[36], calibMap1[38], calibMap1[40], calibMap1[41],
casiotone401 0:577ad245b1f5 94 calibMap1[43], calibMap1[45], calibMap1[47], calibMap1[48], calibMap1[50],
casiotone401 0:577ad245b1f5 95 calibMap1[52], calibMap1[53], calibMap1[55], calibMap1[57], calibMap1[59],
casiotone401 0:577ad245b1f5 96 calibMap1[60], calibMap1[62], calibMap1[64], calibMap1[65], calibMap1[67],
casiotone401 0:577ad245b1f5 97 calibMap1[69], calibMap1[71], calibMap1[72], calibMap1[74], calibMap1[76],
casiotone401 0:577ad245b1f5 98 calibMap1[77], calibMap1[79], calibMap1[81], calibMap1[83], calibMap1[84],
casiotone401 0:577ad245b1f5 99 calibMap1[86], calibMap1[88], calibMap1[89], calibMap1[91], calibMap1[93],
casiotone401 0:577ad245b1f5 100 calibMap1[95], calibMap1[96], calibMap1[98], calibMap1[100], calibMap1[101],
casiotone401 0:577ad245b1f5 101 calibMap1[103], calibMap1[105], calibMap1[107], calibMap1[108], calibMap1[110],
casiotone401 0:577ad245b1f5 102 calibMap1[112], calibMap1[113], calibMap1[115]
casiotone401 0:577ad245b1f5 103 };
casiotone401 0:577ad245b1f5 104
casiotone401 0:577ad245b1f5 105 // M7(9)
casiotone401 0:577ad245b1f5 106 const float calibMap3[QUAN_RES3] = {
casiotone401 0:577ad245b1f5 107 calibMap1[0], calibMap1[4], calibMap1[7], calibMap1[11], calibMap1[12],
casiotone401 0:577ad245b1f5 108 calibMap1[14], calibMap1[16], calibMap1[19], calibMap1[23], calibMap1[24],
casiotone401 0:577ad245b1f5 109 calibMap1[26], calibMap1[28], calibMap1[31], calibMap1[35], calibMap1[36],
casiotone401 0:577ad245b1f5 110 calibMap1[38], calibMap1[40], calibMap1[43], calibMap1[47], calibMap1[48],
casiotone401 0:577ad245b1f5 111 calibMap1[50], calibMap1[52], calibMap1[55], calibMap1[59], calibMap1[60],
casiotone401 0:577ad245b1f5 112 calibMap1[62], calibMap1[64], calibMap1[67], calibMap1[71], calibMap1[72],
casiotone401 0:577ad245b1f5 113 calibMap1[76], calibMap1[79], calibMap1[83], calibMap1[84], calibMap1[86],
casiotone401 0:577ad245b1f5 114 calibMap1[88], calibMap1[91], calibMap1[95], calibMap1[96], calibMap1[100],
casiotone401 0:577ad245b1f5 115 calibMap1[103], calibMap1[107], calibMap1[108], calibMap1[110], calibMap1[112],
casiotone401 0:577ad245b1f5 116 calibMap1[115]
casiotone401 0:577ad245b1f5 117 };
casiotone401 0:577ad245b1f5 118
casiotone401 0:577ad245b1f5 119 // m7(9)
casiotone401 0:577ad245b1f5 120 const float calibMap4[QUAN_RES4] = {
casiotone401 0:577ad245b1f5 121 calibMap1[0], calibMap1[3], calibMap1[7], calibMap1[10], calibMap1[12],
casiotone401 0:577ad245b1f5 122 calibMap1[15], calibMap1[19], calibMap1[22], calibMap1[26], calibMap1[27],
casiotone401 0:577ad245b1f5 123 calibMap1[31], calibMap1[34], calibMap1[36], calibMap1[38], calibMap1[39],
casiotone401 0:577ad245b1f5 124 calibMap1[43], calibMap1[46], calibMap1[50], calibMap1[53], calibMap1[55],
casiotone401 0:577ad245b1f5 125 calibMap1[58], calibMap1[60], calibMap1[63], calibMap1[67], calibMap1[70],
casiotone401 0:577ad245b1f5 126 calibMap1[72], calibMap1[74], calibMap1[75], calibMap1[79], calibMap1[82],
casiotone401 0:577ad245b1f5 127 calibMap1[86], calibMap1[89], calibMap1[91], calibMap1[94], calibMap1[96],
casiotone401 0:577ad245b1f5 128 calibMap1[99], calibMap1[103], calibMap1[106], calibMap1[110], calibMap1[113]
casiotone401 0:577ad245b1f5 129 };
casiotone401 0:577ad245b1f5 130
casiotone401 0:577ad245b1f5 131 // Dorian Scale
casiotone401 0:577ad245b1f5 132 const float calibMap5[QUAN_RES5] = {
casiotone401 0:577ad245b1f5 133 calibMap1[0], calibMap1[2], calibMap1[3], calibMap1[5], calibMap1[7],
casiotone401 0:577ad245b1f5 134 calibMap1[9], calibMap1[10], calibMap1[12], calibMap1[14], calibMap1[15],
casiotone401 0:577ad245b1f5 135 calibMap1[17], calibMap1[19], calibMap1[20], calibMap1[21], calibMap1[24],
casiotone401 0:577ad245b1f5 136 calibMap1[26], calibMap1[27], calibMap1[29], calibMap1[31], calibMap1[33],
casiotone401 0:577ad245b1f5 137 calibMap1[34], calibMap1[36], calibMap1[38], calibMap1[39], calibMap1[41],
casiotone401 0:577ad245b1f5 138 calibMap1[43], calibMap1[45], calibMap1[46], calibMap1[48], calibMap1[50],
casiotone401 0:577ad245b1f5 139 calibMap1[51], calibMap1[53], calibMap1[55], calibMap1[57], calibMap1[58],
casiotone401 0:577ad245b1f5 140 calibMap1[60], calibMap1[62], calibMap1[63], calibMap1[65], calibMap1[67],
casiotone401 0:577ad245b1f5 141 calibMap1[69], calibMap1[70], calibMap1[72], calibMap1[74], calibMap1[75],
casiotone401 0:577ad245b1f5 142 calibMap1[77], calibMap1[79], calibMap1[81], calibMap1[82], calibMap1[84],
casiotone401 0:577ad245b1f5 143 calibMap1[86], calibMap1[87], calibMap1[89], calibMap1[91], calibMap1[93],
casiotone401 0:577ad245b1f5 144 calibMap1[94], calibMap1[96], calibMap1[98], calibMap1[99], calibMap1[101],
casiotone401 0:577ad245b1f5 145 calibMap1[103], calibMap1[105], calibMap1[106], calibMap1[108], calibMap1[110],
casiotone401 0:577ad245b1f5 146 calibMap1[111], calibMap1[113], calibMap1[115]
casiotone401 0:577ad245b1f5 147 };
casiotone401 0:577ad245b1f5 148
casiotone401 0:577ad245b1f5 149 // Minor Scale
casiotone401 0:577ad245b1f5 150 const float calibMap6[QUAN_RES6] = {
casiotone401 0:577ad245b1f5 151 calibMap1[0], calibMap1[2], calibMap1[3], calibMap1[5], calibMap1[7],
casiotone401 0:577ad245b1f5 152 calibMap1[8], calibMap1[10], calibMap1[12], calibMap1[14], calibMap1[15],
casiotone401 0:577ad245b1f5 153 calibMap1[17], calibMap1[19], calibMap1[20], calibMap1[22], calibMap1[24],
casiotone401 0:577ad245b1f5 154 calibMap1[26], calibMap1[27], calibMap1[29], calibMap1[31], calibMap1[32],
casiotone401 0:577ad245b1f5 155 calibMap1[34], calibMap1[36], calibMap1[38], calibMap1[39], calibMap1[41],
casiotone401 0:577ad245b1f5 156 calibMap1[43], calibMap1[44], calibMap1[46], calibMap1[48], calibMap1[50],
casiotone401 0:577ad245b1f5 157 calibMap1[51], calibMap1[53], calibMap1[55], calibMap1[56], calibMap1[58],
casiotone401 0:577ad245b1f5 158 calibMap1[60], calibMap1[62], calibMap1[63], calibMap1[65], calibMap1[67],
casiotone401 0:577ad245b1f5 159 calibMap1[68], calibMap1[70], calibMap1[72], calibMap1[74], calibMap1[75],
casiotone401 0:577ad245b1f5 160 calibMap1[77], calibMap1[79], calibMap1[80], calibMap1[82], calibMap1[84],
casiotone401 0:577ad245b1f5 161 calibMap1[86], calibMap1[87], calibMap1[89], calibMap1[91], calibMap1[92],
casiotone401 0:577ad245b1f5 162 calibMap1[94], calibMap1[96], calibMap1[98], calibMap1[99], calibMap1[101],
casiotone401 0:577ad245b1f5 163 calibMap1[103], calibMap1[104], calibMap1[106], calibMap1[108], calibMap1[110],
casiotone401 0:577ad245b1f5 164 calibMap1[111], calibMap1[113], calibMap1[115]
casiotone401 0:577ad245b1f5 165 };
casiotone401 0:577ad245b1f5 166
casiotone401 0:577ad245b1f5 167 // 5th
casiotone401 0:577ad245b1f5 168 const float calibMap7[QUAN_RES7] = {
casiotone401 0:577ad245b1f5 169 calibMap1[0], calibMap1[7], calibMap1[14], calibMap1[21], calibMap1[28],
casiotone401 0:577ad245b1f5 170 calibMap1[35], calibMap1[42], calibMap1[49], calibMap1[56], calibMap1[63],
casiotone401 0:577ad245b1f5 171 calibMap1[70], calibMap1[77], calibMap1[84], calibMap1[91], calibMap1[98],
casiotone401 0:577ad245b1f5 172 calibMap1[105]
casiotone401 0:577ad245b1f5 173 };
casiotone401 0:577ad245b1f5 174
casiotone401 0:577ad245b1f5 175 // Whole tone
casiotone401 0:577ad245b1f5 176 const float calibMap8[QUAN_RES8] = {
casiotone401 0:577ad245b1f5 177 calibMap1[0], calibMap1[1], calibMap1[2], calibMap1[6], calibMap1[8],
casiotone401 0:577ad245b1f5 178 calibMap1[10], calibMap1[12], calibMap1[14], calibMap1[16], calibMap1[18],
casiotone401 0:577ad245b1f5 179 calibMap1[20], calibMap1[22], calibMap1[24], calibMap1[26], calibMap1[28],
casiotone401 0:577ad245b1f5 180 calibMap1[30], calibMap1[32], calibMap1[34], calibMap1[36], calibMap1[38],
casiotone401 0:577ad245b1f5 181 calibMap1[40], calibMap1[42], calibMap1[44], calibMap1[46], calibMap1[48],
casiotone401 0:577ad245b1f5 182 calibMap1[50], calibMap1[52], calibMap1[54], calibMap1[56], calibMap1[58],
casiotone401 0:577ad245b1f5 183 calibMap1[60], calibMap1[62], calibMap1[64], calibMap1[66], calibMap1[68],
casiotone401 0:577ad245b1f5 184 calibMap1[70], calibMap1[72], calibMap1[74], calibMap1[76], calibMap1[78],
casiotone401 0:577ad245b1f5 185 calibMap1[80], calibMap1[82], calibMap1[84], calibMap1[86], calibMap1[88],
casiotone401 0:577ad245b1f5 186 calibMap1[90], calibMap1[92], calibMap1[94], calibMap1[96], calibMap1[98],
casiotone401 0:577ad245b1f5 187 calibMap1[100], calibMap1[102], calibMap1[104], calibMap1[106], calibMap1[108],
casiotone401 0:577ad245b1f5 188 calibMap1[110], calibMap1[112], calibMap1[114]
casiotone401 0:577ad245b1f5 189 };
casiotone401 0:577ad245b1f5 190
casiotone401 0:577ad245b1f5 191 // Major Scale
casiotone401 0:577ad245b1f5 192 const uint8_t calibMapMidi2[QUAN_RES2] = {
casiotone401 0:577ad245b1f5 193 0, 2, 4, 5, 7, 9, 11,
casiotone401 0:577ad245b1f5 194 12, 14, 16, 17, 19, 21, 23,
casiotone401 0:577ad245b1f5 195 24, 26, 28, 29, 31, 33, 35,
casiotone401 0:577ad245b1f5 196 36, 38, 40, 41, 43, 45, 47,
casiotone401 0:577ad245b1f5 197 48, 50, 52, 53, 55, 57, 59,
casiotone401 0:577ad245b1f5 198 60, 62, 64, 65, 67, 69, 71,
casiotone401 0:577ad245b1f5 199 72, 74, 76, 77, 79, 81, 83,
casiotone401 0:577ad245b1f5 200 84, 86, 88, 89, 91, 93, 95,
casiotone401 0:577ad245b1f5 201 96, 98, 100, 101, 103, 105, 107,
casiotone401 0:577ad245b1f5 202 108, 110, 112, 113, 115
casiotone401 0:577ad245b1f5 203 };
casiotone401 0:577ad245b1f5 204
casiotone401 0:577ad245b1f5 205 // M7(9)
casiotone401 0:577ad245b1f5 206 const uint8_t calibMapMidi3[QUAN_RES3] = {
casiotone401 0:577ad245b1f5 207 0, 4, 7, 11,
casiotone401 0:577ad245b1f5 208 12, 14, 16, 19, 23,
casiotone401 0:577ad245b1f5 209 24, 26, 28, 31, 35,
casiotone401 0:577ad245b1f5 210 36, 38, 40, 43, 47,
casiotone401 0:577ad245b1f5 211 48, 50, 52, 55, 59,
casiotone401 0:577ad245b1f5 212 60, 62, 64, 67, 71,
casiotone401 0:577ad245b1f5 213 72, 76, 79, 83,
casiotone401 0:577ad245b1f5 214 84, 86, 88, 91, 95,
casiotone401 0:577ad245b1f5 215 96, 100, 103, 107,
casiotone401 0:577ad245b1f5 216 108, 110, 112, 115
casiotone401 0:577ad245b1f5 217 };
casiotone401 0:577ad245b1f5 218
casiotone401 0:577ad245b1f5 219 // m7(9)
casiotone401 0:577ad245b1f5 220 const uint8_t calibMapMidi4[QUAN_RES4] = {
casiotone401 0:577ad245b1f5 221 0, 3, 7, 10,
casiotone401 0:577ad245b1f5 222 12, 15, 19, 22,
casiotone401 0:577ad245b1f5 223 26, 27, 31, 34,
casiotone401 0:577ad245b1f5 224 36, 38, 39, 43, 46,
casiotone401 0:577ad245b1f5 225 50, 53, 55, 58,
casiotone401 0:577ad245b1f5 226 60, 63, 67, 70,
casiotone401 0:577ad245b1f5 227 72, 74, 75, 79, 82,
casiotone401 0:577ad245b1f5 228 86, 89, 91, 94,
casiotone401 0:577ad245b1f5 229 96, 99, 103, 106, 110, 113
casiotone401 0:577ad245b1f5 230 };
casiotone401 0:577ad245b1f5 231
casiotone401 0:577ad245b1f5 232 // Dorian Scale
casiotone401 0:577ad245b1f5 233 const uint8_t calibMapMidi5[QUAN_RES5] = {
casiotone401 0:577ad245b1f5 234 0, 2, 3, 5, 7, 9, 10,
casiotone401 0:577ad245b1f5 235 12, 14, 15, 17, 19, 20, 21,
casiotone401 0:577ad245b1f5 236 24, 26, 27, 29, 31, 33, 34,
casiotone401 0:577ad245b1f5 237 36, 38, 39, 41, 43, 45, 46,
casiotone401 0:577ad245b1f5 238 48, 50, 51, 53, 55, 57, 58,
casiotone401 0:577ad245b1f5 239 60, 62, 63, 65, 67, 69, 70,
casiotone401 0:577ad245b1f5 240 72, 74, 75, 77, 79, 81, 82,
casiotone401 0:577ad245b1f5 241 84, 86, 87, 89, 91, 93, 94,
casiotone401 0:577ad245b1f5 242 96, 98, 99, 101, 103, 105, 106,
casiotone401 0:577ad245b1f5 243 108, 110, 111, 113, 115
casiotone401 0:577ad245b1f5 244 };
casiotone401 0:577ad245b1f5 245
casiotone401 0:577ad245b1f5 246 // Minor Scale
casiotone401 0:577ad245b1f5 247 const uint8_t calibMapMidi6[QUAN_RES6] = {
casiotone401 0:577ad245b1f5 248 0, 2, 3, 5, 7, 8, 10,
casiotone401 0:577ad245b1f5 249 12, 14, 15, 17, 19, 20, 22,
casiotone401 0:577ad245b1f5 250 24, 26, 27, 29, 31, 32, 34,
casiotone401 0:577ad245b1f5 251 36, 38, 39, 41, 43, 44, 46,
casiotone401 0:577ad245b1f5 252 48, 50, 51, 53, 55, 56, 58,
casiotone401 0:577ad245b1f5 253 60, 62, 63, 65, 67, 68, 70,
casiotone401 0:577ad245b1f5 254 72, 74, 75, 77, 79, 80, 82,
casiotone401 0:577ad245b1f5 255 84, 86, 87, 89, 91, 92, 94,
casiotone401 0:577ad245b1f5 256 96, 98, 99, 101, 103, 104, 106,
casiotone401 0:577ad245b1f5 257 108, 110, 111, 113, 115
casiotone401 0:577ad245b1f5 258 };
casiotone401 0:577ad245b1f5 259
casiotone401 0:577ad245b1f5 260 // 5th
casiotone401 0:577ad245b1f5 261 const uint8_t calibMapMidi7[QUAN_RES7] = {
casiotone401 0:577ad245b1f5 262 0, 7, 14, 21, 28, 35,
casiotone401 0:577ad245b1f5 263 42, 49, 56, 63, 70, 77,
casiotone401 0:577ad245b1f5 264 84, 91, 98, 105
casiotone401 0:577ad245b1f5 265 };
casiotone401 0:577ad245b1f5 266
casiotone401 0:577ad245b1f5 267 // Whole tone
casiotone401 0:577ad245b1f5 268 const uint8_t calibMapMidi8[QUAN_RES8] = {
casiotone401 0:577ad245b1f5 269 0, 1, 2, 6, 8, 10,
casiotone401 0:577ad245b1f5 270 12, 14, 16, 18,20, 22,
casiotone401 0:577ad245b1f5 271 24, 26, 28, 30, 32, 34,
casiotone401 0:577ad245b1f5 272 36, 38, 40, 42, 44, 46,
casiotone401 0:577ad245b1f5 273 48, 50, 52, 54, 56, 58,
casiotone401 0:577ad245b1f5 274 60, 62, 64, 66, 68, 70,
casiotone401 0:577ad245b1f5 275 72, 74, 76, 78, 80, 82,
casiotone401 0:577ad245b1f5 276 84, 86, 88, 90, 92, 94,
casiotone401 0:577ad245b1f5 277 96, 98, 100, 102, 104, 106,
casiotone401 0:577ad245b1f5 278 108, 110, 112, 114
casiotone401 0:577ad245b1f5 279 };
casiotone401 0:577ad245b1f5 280
casiotone401 0:577ad245b1f5 281 volatile bool changeFlag = false;
casiotone401 0:577ad245b1f5 282
casiotone401 0:577ad245b1f5 283 //-------------------------------------------------------------
casiotone401 0:577ad245b1f5 284 // mbed Functions
casiotone401 0:577ad245b1f5 285 /*
casiotone401 0:577ad245b1f5 286 //Nucleo F303K8 //MCP3204
casiotone401 0:577ad245b1f5 287 CS : pin 10 -- pin 8 (CS/SHDN)
casiotone401 0:577ad245b1f5 288 MOSI: pin 11 -- pin 9 (D in)
casiotone401 0:577ad245b1f5 289 MISO: pin 12 -- pin 10(D out)
casiotone401 0:577ad245b1f5 290 SCK : pin 13 -- pin 11(CLK)
casiotone401 0:577ad245b1f5 291 */
casiotone401 0:577ad245b1f5 292 SPI spi(D11, D12, D13);
casiotone401 0:577ad245b1f5 293 DigitalOut csPin(D10);
casiotone401 0:577ad245b1f5 294
casiotone401 0:577ad245b1f5 295 AnalogIn scalePin(A0); // Scale Pin
casiotone401 0:577ad245b1f5 296
casiotone401 0:577ad245b1f5 297 AnalogIn potPin1(A1); // Pot1~2
casiotone401 0:577ad245b1f5 298 AnalogIn potPin2(D6);
casiotone401 0:577ad245b1f5 299
casiotone401 0:577ad245b1f5 300 DebouncedInterrupt switch1(D8); // SW1
casiotone401 0:577ad245b1f5 301 DebouncedInterrupt switch2(D9); // SW2
casiotone401 0:577ad245b1f5 302
casiotone401 0:577ad245b1f5 303 // esp8266 wi-fi settings
casiotone401 0:577ad245b1f5 304 #define SSID "SSID"
casiotone401 0:577ad245b1f5 305 #define PASSWORD "PASSWORD"
casiotone401 0:577ad245b1f5 306
casiotone401 0:577ad245b1f5 307 #define REMOTE_ADDRESS "192.168.1.2"
casiotone401 0:577ad245b1f5 308 #define REMOTE_PORT "8000"
casiotone401 0:577ad245b1f5 309
casiotone401 1:0a963a78f2bd 310 #define STATIC_IP // if you use DHCP comment out this line
casiotone401 0:577ad245b1f5 311
casiotone401 0:577ad245b1f5 312 #define LOCAL_ADDRESS "192.168.1.8"
casiotone401 0:577ad245b1f5 313 #define LOCAL_PORT "9000"
casiotone401 0:577ad245b1f5 314
casiotone401 0:577ad245b1f5 315 // Serial for esp8266 (tx, rx)
casiotone401 1:0a963a78f2bd 316 BufferedSerial esp8266Serial(D1, D0);
casiotone401 0:577ad245b1f5 317
casiotone401 0:577ad245b1f5 318 // Serial for debug (tx, rx)
casiotone401 0:577ad245b1f5 319 Serial pc(USBTX, USBRX);
casiotone401 0:577ad245b1f5 320
casiotone401 0:577ad245b1f5 321 // MIDI (tx, rx)
casiotone401 1:0a963a78f2bd 322 MIDI midi(A7, NC);
casiotone401 0:577ad245b1f5 323
casiotone401 0:577ad245b1f5 324 // declare the OSC bundle
casiotone401 0:577ad245b1f5 325 OSCBundle bndl;
casiotone401 0:577ad245b1f5 326
casiotone401 0:577ad245b1f5 327 // Timer
casiotone401 0:577ad245b1f5 328 Timer timer;
casiotone401 0:577ad245b1f5 329
casiotone401 0:577ad245b1f5 330 //-------------------------------------------------------------
casiotone401 0:577ad245b1f5 331 // Functions
casiotone401 0:577ad245b1f5 332
casiotone401 0:577ad245b1f5 333 int map(int, int, int, int, int);
casiotone401 0:577ad245b1f5 334 uint16_t adcRead(uint8_t);
casiotone401 0:577ad245b1f5 335 void interruptSW1();
casiotone401 0:577ad245b1f5 336 void interruptSW2();
casiotone401 0:577ad245b1f5 337 void getESP8266Response();
casiotone401 0:577ad245b1f5 338 void connectWifi();
casiotone401 0:577ad245b1f5 339
casiotone401 0:577ad245b1f5 340
casiotone401 0:577ad245b1f5 341 //-------------------------------------------------------------
casiotone401 0:577ad245b1f5 342 // Remaps value from one range to another range.
casiotone401 0:577ad245b1f5 343
casiotone401 0:577ad245b1f5 344 inline int map(int x, int in_min, int in_max, int out_min, int out_max)
casiotone401 0:577ad245b1f5 345 {
casiotone401 0:577ad245b1f5 346 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
casiotone401 0:577ad245b1f5 347 }
casiotone401 0:577ad245b1f5 348
casiotone401 0:577ad245b1f5 349 //-------------------------------------------------------------
casiotone401 0:577ad245b1f5 350 // Read MCP3208 AD Converter
casiotone401 0:577ad245b1f5 351
casiotone401 0:577ad245b1f5 352 uint16_t adcRead(uint8_t ch) {
casiotone401 0:577ad245b1f5 353 uint8_t b1, b2;
casiotone401 0:577ad245b1f5 354 uint8_t address = 0B01100000 | ((ch & 0B11) << 2);
casiotone401 0:577ad245b1f5 355
casiotone401 0:577ad245b1f5 356 csPin = 0; // CS pin Low
casiotone401 0:577ad245b1f5 357
casiotone401 0:577ad245b1f5 358 spi.write(address);
casiotone401 0:577ad245b1f5 359 b1 = spi.write(0x00);
casiotone401 0:577ad245b1f5 360 b2 = spi.write(0x00);
casiotone401 0:577ad245b1f5 361
casiotone401 0:577ad245b1f5 362 csPin = 1; // CS pin Hi
casiotone401 0:577ad245b1f5 363
casiotone401 0:577ad245b1f5 364 return (b1 << 4) | (b2 >> 4);
casiotone401 0:577ad245b1f5 365 }
casiotone401 0:577ad245b1f5 366
casiotone401 0:577ad245b1f5 367 //-------------------------------------------------------------
casiotone401 0:577ad245b1f5 368 // Check SW Status
casiotone401 0:577ad245b1f5 369
casiotone401 0:577ad245b1f5 370 void interruptSW1() {
casiotone401 0:577ad245b1f5 371 volatile static uint8_t sw1State;
casiotone401 0:577ad245b1f5 372
casiotone401 0:577ad245b1f5 373 if (!sw1State) {
casiotone401 0:577ad245b1f5 374
casiotone401 0:577ad245b1f5 375 sw1State = 1;
casiotone401 0:577ad245b1f5 376
casiotone401 0:577ad245b1f5 377 } else {
casiotone401 0:577ad245b1f5 378
casiotone401 0:577ad245b1f5 379 sw1State = 0;
casiotone401 0:577ad245b1f5 380 }
casiotone401 0:577ad245b1f5 381
casiotone401 0:577ad245b1f5 382 bndl.add("/sw1").add(sw1State);
casiotone401 0:577ad245b1f5 383 changeFlag = true;
casiotone401 0:577ad245b1f5 384 }
casiotone401 0:577ad245b1f5 385
casiotone401 0:577ad245b1f5 386 void interruptSW2() {
casiotone401 0:577ad245b1f5 387 volatile static uint8_t sw2State;
casiotone401 0:577ad245b1f5 388
casiotone401 0:577ad245b1f5 389 if (!sw2State) {
casiotone401 0:577ad245b1f5 390
casiotone401 0:577ad245b1f5 391 sw2State = 1;
casiotone401 0:577ad245b1f5 392
casiotone401 0:577ad245b1f5 393 } else {
casiotone401 0:577ad245b1f5 394
casiotone401 0:577ad245b1f5 395 sw2State = 0;
casiotone401 0:577ad245b1f5 396 }
casiotone401 0:577ad245b1f5 397
casiotone401 0:577ad245b1f5 398 bndl.add("/sw2").add(sw2State);
casiotone401 0:577ad245b1f5 399 changeFlag = true;
casiotone401 0:577ad245b1f5 400 }
casiotone401 0:577ad245b1f5 401
casiotone401 0:577ad245b1f5 402 //-------------------------------------------------------------
casiotone401 0:577ad245b1f5 403 // get & print esp8266 response
casiotone401 0:577ad245b1f5 404
casiotone401 0:577ad245b1f5 405 void getESP8266Response(int timeout)
casiotone401 0:577ad245b1f5 406 {
casiotone401 0:577ad245b1f5 407 char resBuff[256] = {0};
casiotone401 0:577ad245b1f5 408
casiotone401 0:577ad245b1f5 409 timer.start();
casiotone401 0:577ad245b1f5 410
casiotone401 0:577ad245b1f5 411 uint8_t i = 0;
casiotone401 0:577ad245b1f5 412
casiotone401 0:577ad245b1f5 413 while (!(timer.read() > timeout)) {
casiotone401 0:577ad245b1f5 414
casiotone401 0:577ad245b1f5 415 if (esp8266Serial.readable()) {
casiotone401 0:577ad245b1f5 416
casiotone401 0:577ad245b1f5 417 resBuff[i++] = esp8266Serial.getc();
casiotone401 0:577ad245b1f5 418 }
casiotone401 0:577ad245b1f5 419 }
casiotone401 0:577ad245b1f5 420
casiotone401 0:577ad245b1f5 421 pc.printf(resBuff);
casiotone401 0:577ad245b1f5 422
casiotone401 0:577ad245b1f5 423 timer.stop();
casiotone401 0:577ad245b1f5 424 timer.reset();
casiotone401 0:577ad245b1f5 425 }
casiotone401 0:577ad245b1f5 426
casiotone401 0:577ad245b1f5 427 //-------------------------------------------------------------
casiotone401 0:577ad245b1f5 428 // Setup esp8266 wi-fi module
casiotone401 0:577ad245b1f5 429
casiotone401 0:577ad245b1f5 430 void connectWifi() {
casiotone401 0:577ad245b1f5 431
casiotone401 0:577ad245b1f5 432 pc.printf("\n---------- Starting ESP8266 Config ----------\r\n");
casiotone401 0:577ad245b1f5 433 wait(2);
casiotone401 0:577ad245b1f5 434
casiotone401 0:577ad245b1f5 435 // set station mode
casiotone401 0:577ad245b1f5 436 pc.printf("\n---------- Set Station Mode ----------\r\n");
casiotone401 0:577ad245b1f5 437
casiotone401 0:577ad245b1f5 438 esp8266Serial.printf("AT+CWMODE=1\r\n");
casiotone401 0:577ad245b1f5 439
casiotone401 0:577ad245b1f5 440 getESP8266Response(1);
casiotone401 0:577ad245b1f5 441 wait(1);
casiotone401 0:577ad245b1f5 442
casiotone401 0:577ad245b1f5 443 // restart
casiotone401 0:577ad245b1f5 444 pc.printf("\n---------- Reset ESP8266 ----------\r\n");
casiotone401 0:577ad245b1f5 445
casiotone401 0:577ad245b1f5 446 esp8266Serial.printf("AT+RST\r\n");
casiotone401 0:577ad245b1f5 447
casiotone401 0:577ad245b1f5 448 getESP8266Response(2);
casiotone401 0:577ad245b1f5 449 wait(1);
casiotone401 0:577ad245b1f5 450
casiotone401 0:577ad245b1f5 451 #ifdef STATIC_IP
casiotone401 0:577ad245b1f5 452
casiotone401 0:577ad245b1f5 453 // set static IP
casiotone401 0:577ad245b1f5 454 pc.printf("\n---------- Setting Static IP ----------\r\n");
casiotone401 0:577ad245b1f5 455
casiotone401 0:577ad245b1f5 456 esp8266Serial.printf("AT+CIPSTA=\"");
casiotone401 0:577ad245b1f5 457 esp8266Serial.printf(LOCAL_ADDRESS);
casiotone401 0:577ad245b1f5 458 esp8266Serial.printf("\"\r\n");
casiotone401 0:577ad245b1f5 459
casiotone401 0:577ad245b1f5 460 getESP8266Response(3);
casiotone401 0:577ad245b1f5 461 wait(1);
casiotone401 0:577ad245b1f5 462
casiotone401 0:577ad245b1f5 463 #endif
casiotone401 0:577ad245b1f5 464
casiotone401 0:577ad245b1f5 465 // connect wifi
casiotone401 0:577ad245b1f5 466 pc.printf("\n---------- Wi-fi Connect ----------\r\n");
casiotone401 0:577ad245b1f5 467
casiotone401 0:577ad245b1f5 468 esp8266Serial.printf("AT+CWJAP=\"");
casiotone401 0:577ad245b1f5 469 esp8266Serial.printf(SSID);
casiotone401 0:577ad245b1f5 470 esp8266Serial.printf("\",\"");
casiotone401 0:577ad245b1f5 471 esp8266Serial.printf(PASSWORD);
casiotone401 0:577ad245b1f5 472 esp8266Serial.printf("\"\r\n");
casiotone401 0:577ad245b1f5 473
casiotone401 0:577ad245b1f5 474 getESP8266Response(3);
casiotone401 0:577ad245b1f5 475 wait(2);
casiotone401 0:577ad245b1f5 476
casiotone401 0:577ad245b1f5 477 // single connection
casiotone401 0:577ad245b1f5 478 pc.printf("\n---------- Setting Connection Mode ----------\r\n");
casiotone401 0:577ad245b1f5 479
casiotone401 0:577ad245b1f5 480 esp8266Serial.printf("AT+CIPMUX=0\r\n");
casiotone401 0:577ad245b1f5 481
casiotone401 0:577ad245b1f5 482 getESP8266Response(1);
casiotone401 0:577ad245b1f5 483 wait(1);
casiotone401 0:577ad245b1f5 484
casiotone401 0:577ad245b1f5 485 // set UDP connection
casiotone401 0:577ad245b1f5 486 pc.printf("\n---------- Setting UDP Connection ----------\r\n");
casiotone401 0:577ad245b1f5 487
casiotone401 0:577ad245b1f5 488 esp8266Serial.printf("AT+CIPSTART=");
casiotone401 0:577ad245b1f5 489 esp8266Serial.printf("\"UDP\",\"");
casiotone401 0:577ad245b1f5 490 esp8266Serial.printf(REMOTE_ADDRESS);
casiotone401 0:577ad245b1f5 491 esp8266Serial.printf("\",");
casiotone401 0:577ad245b1f5 492 esp8266Serial.printf(REMOTE_PORT);
casiotone401 0:577ad245b1f5 493 esp8266Serial.printf(",");
casiotone401 0:577ad245b1f5 494 esp8266Serial.printf(LOCAL_PORT);
casiotone401 0:577ad245b1f5 495 esp8266Serial.printf(",");
casiotone401 0:577ad245b1f5 496 esp8266Serial.printf("0\r\n");
casiotone401 0:577ad245b1f5 497
casiotone401 0:577ad245b1f5 498 getESP8266Response(3);
casiotone401 0:577ad245b1f5 499 wait(1);
casiotone401 0:577ad245b1f5 500
casiotone401 0:577ad245b1f5 501 // set data transmission mode
casiotone401 0:577ad245b1f5 502 pc.printf("\n---------- Setting Data Transmission Mode ----------\r\n");
casiotone401 0:577ad245b1f5 503
casiotone401 0:577ad245b1f5 504 esp8266Serial.printf("AT+CIPMODE=1\r\n");
casiotone401 0:577ad245b1f5 505
casiotone401 0:577ad245b1f5 506 getESP8266Response(1);
casiotone401 0:577ad245b1f5 507 wait(1);
casiotone401 0:577ad245b1f5 508
casiotone401 0:577ad245b1f5 509 // change Baud Rate
casiotone401 0:577ad245b1f5 510 pc.printf("\n---------- Change Baud Rate 4Mbps ----------\r\n");
casiotone401 0:577ad245b1f5 511
casiotone401 0:577ad245b1f5 512 esp8266Serial.printf("AT+UART_CUR=4000000,8,1,0,0\r\n");
casiotone401 0:577ad245b1f5 513 getESP8266Response(3);
casiotone401 0:577ad245b1f5 514
casiotone401 0:577ad245b1f5 515 esp8266Serial.baud(4000000);
casiotone401 0:577ad245b1f5 516 wait(1);
casiotone401 0:577ad245b1f5 517
casiotone401 0:577ad245b1f5 518 // ready to send data
casiotone401 0:577ad245b1f5 519 pc.printf("\n---------- Ready to Send Data ----------\r\n");
casiotone401 0:577ad245b1f5 520
casiotone401 0:577ad245b1f5 521 esp8266Serial.printf("AT+CIPSEND\r\n");
casiotone401 0:577ad245b1f5 522
casiotone401 0:577ad245b1f5 523 getESP8266Response(2);
casiotone401 0:577ad245b1f5 524 wait(1);
casiotone401 0:577ad245b1f5 525 }
casiotone401 0:577ad245b1f5 526
casiotone401 0:577ad245b1f5 527 //-------------------------------------------------------------
casiotone401 0:577ad245b1f5 528 // Main
casiotone401 0:577ad245b1f5 529
casiotone401 0:577ad245b1f5 530 int main() {
casiotone401 0:577ad245b1f5 531
casiotone401 0:577ad245b1f5 532 uint8_t i, idx;
casiotone401 0:577ad245b1f5 533 uint8_t oscBuff[SEND_BUFF_SIZE] = {0};
casiotone401 0:577ad245b1f5 534 static uint8_t scale;
casiotone401 0:577ad245b1f5 535 uint8_t note[4] = {0};
casiotone401 0:577ad245b1f5 536 static uint8_t _note[4];
casiotone401 0:577ad245b1f5 537 uint16_t adc[4] = {0};
casiotone401 0:577ad245b1f5 538 static uint16_t _adc[4];
casiotone401 0:577ad245b1f5 539 float pot[2] = {0};
casiotone401 0:577ad245b1f5 540 static float _pot[2] = {potPin1.read(), potPin2.read()};
casiotone401 0:577ad245b1f5 541
casiotone401 1:0a963a78f2bd 542 // Init SPI (4MHz clock)
casiotone401 0:577ad245b1f5 543 spi.format(8, 0);
casiotone401 1:0a963a78f2bd 544 spi.frequency(4000000);
casiotone401 0:577ad245b1f5 545 csPin = 1;
casiotone401 0:577ad245b1f5 546
casiotone401 0:577ad245b1f5 547 // setup esp8266 wi-fi
casiotone401 0:577ad245b1f5 548 esp8266Serial.baud(115200);
casiotone401 0:577ad245b1f5 549 connectWifi();
casiotone401 0:577ad245b1f5 550
casiotone401 0:577ad245b1f5 551 // start MIDI (ch1)
casiotone401 0:577ad245b1f5 552 midi.begin(MIDI_CHANNEL);
casiotone401 0:577ad245b1f5 553
casiotone401 0:577ad245b1f5 554 // start InterruptIn rising edge
casiotone401 0:577ad245b1f5 555 switch1.attach(&interruptSW1, IRQ_RISE, 10);
casiotone401 0:577ad245b1f5 556 switch2.attach(&interruptSW2, IRQ_RISE, 10);
casiotone401 0:577ad245b1f5 557
casiotone401 0:577ad245b1f5 558 // start timer (wait untile esp8266 transmission completed)
casiotone401 0:577ad245b1f5 559 timer.start();
casiotone401 0:577ad245b1f5 560
casiotone401 0:577ad245b1f5 561 while (1) {
casiotone401 0:577ad245b1f5 562
casiotone401 0:577ad245b1f5 563 scale = map(scalePin.read_u16(), 0, 51890, 0, (SCALE_TOTAL - 1));
casiotone401 0:577ad245b1f5 564
casiotone401 0:577ad245b1f5 565 for (i = 0; i < 4; ++i) {
casiotone401 0:577ad245b1f5 566 // read ADC
casiotone401 0:577ad245b1f5 567 adc[i] = adcRead(i);
casiotone401 0:577ad245b1f5 568
casiotone401 0:577ad245b1f5 569 if (abs(adc[i] - _adc[i]) > 10) {
casiotone401 0:577ad245b1f5 570
casiotone401 0:577ad245b1f5 571 changeFlag = true;
casiotone401 0:577ad245b1f5 572
casiotone401 0:577ad245b1f5 573 switch (i) {
casiotone401 0:577ad245b1f5 574 case 0:
casiotone401 0:577ad245b1f5 575 bndl.add("/acv1").add(adc[i]);
casiotone401 0:577ad245b1f5 576 break;
casiotone401 0:577ad245b1f5 577 case 1:
casiotone401 0:577ad245b1f5 578 bndl.add("/acv2").add(adc[i]);
casiotone401 0:577ad245b1f5 579 break;
casiotone401 0:577ad245b1f5 580 case 2:
casiotone401 0:577ad245b1f5 581 bndl.add("/acv3").add(adc[i]);
casiotone401 0:577ad245b1f5 582 break;
casiotone401 0:577ad245b1f5 583 case 3:
casiotone401 0:577ad245b1f5 584 bndl.add("/acv4").add(adc[i]);
casiotone401 0:577ad245b1f5 585 break;
casiotone401 0:577ad245b1f5 586 }
casiotone401 0:577ad245b1f5 587 }
casiotone401 0:577ad245b1f5 588
casiotone401 0:577ad245b1f5 589 if (abs(adc[i] - _adc[i]) > 31) {
casiotone401 0:577ad245b1f5 590
casiotone401 0:577ad245b1f5 591 // MIDI quantize
casiotone401 0:577ad245b1f5 592 switch (scale) {
casiotone401 0:577ad245b1f5 593
casiotone401 0:577ad245b1f5 594 case Lin:
casiotone401 0:577ad245b1f5 595 case Chr:
casiotone401 0:577ad245b1f5 596 note[i] = map(adc[i], 825, 3757, 0, (84 - MAP_OFFSET)) + CALIB_OFFSET; // C0(12) ~ C7(96)
casiotone401 0:577ad245b1f5 597 break;
casiotone401 0:577ad245b1f5 598
casiotone401 0:577ad245b1f5 599 case Maj:
casiotone401 0:577ad245b1f5 600 note[i] = calibMapMidi2[map(adc[i], 0, 4095, 0, QUAN_RES2 - 1)] + MIDI_OFFSET;
casiotone401 0:577ad245b1f5 601 break;
casiotone401 0:577ad245b1f5 602
casiotone401 0:577ad245b1f5 603 case M7:
casiotone401 0:577ad245b1f5 604 note[i] = calibMapMidi3[map(adc[i], 0, 4095, 0, QUAN_RES3 - 1)] + MIDI_OFFSET;
casiotone401 0:577ad245b1f5 605 break;
casiotone401 0:577ad245b1f5 606
casiotone401 0:577ad245b1f5 607 case Min7:
casiotone401 0:577ad245b1f5 608 note[i] = calibMapMidi4[map(adc[i], 0, 4095, 0, QUAN_RES4 - 1)] + MIDI_OFFSET;
casiotone401 0:577ad245b1f5 609 break;
casiotone401 0:577ad245b1f5 610
casiotone401 0:577ad245b1f5 611 case Dor:
casiotone401 0:577ad245b1f5 612 note[i] = calibMapMidi5[map(adc[i], 0, 4095, 0, QUAN_RES5 - 1)] + MIDI_OFFSET;
casiotone401 0:577ad245b1f5 613 break;
casiotone401 0:577ad245b1f5 614
casiotone401 0:577ad245b1f5 615 case Min:
casiotone401 0:577ad245b1f5 616 note[i] = calibMapMidi6[map(adc[i], 0, 4095, 0, QUAN_RES6 - 1)] + MIDI_OFFSET;
casiotone401 0:577ad245b1f5 617 break;
casiotone401 0:577ad245b1f5 618
casiotone401 0:577ad245b1f5 619 case S5th:
casiotone401 0:577ad245b1f5 620 note[i] = calibMapMidi7[map(adc[i], 0, 4095, 0, QUAN_RES7 - 1)] + MIDI_OFFSET;
casiotone401 0:577ad245b1f5 621 break;
casiotone401 0:577ad245b1f5 622
casiotone401 0:577ad245b1f5 623 case Wht:
casiotone401 0:577ad245b1f5 624 note[i] = calibMapMidi8[map(adc[i], 0, 4095, 0, QUAN_RES8 - 1)] + MIDI_OFFSET;
casiotone401 0:577ad245b1f5 625 break;
casiotone401 0:577ad245b1f5 626
casiotone401 0:577ad245b1f5 627 }
casiotone401 0:577ad245b1f5 628
casiotone401 0:577ad245b1f5 629
casiotone401 0:577ad245b1f5 630 if (_note[i] != note[i]) {
casiotone401 0:577ad245b1f5 631
casiotone401 0:577ad245b1f5 632 midi.sendNoteOff(_note[i], 0, MIDI_CHANNEL);
casiotone401 0:577ad245b1f5 633 midi.sendNoteOn(note[i], 100, MIDI_CHANNEL);
casiotone401 0:577ad245b1f5 634
casiotone401 0:577ad245b1f5 635 _note[i] = note[i];
casiotone401 0:577ad245b1f5 636 }
casiotone401 0:577ad245b1f5 637
casiotone401 0:577ad245b1f5 638 }
casiotone401 0:577ad245b1f5 639
casiotone401 0:577ad245b1f5 640 _adc[i] = adc[i];
casiotone401 0:577ad245b1f5 641 }
casiotone401 0:577ad245b1f5 642
casiotone401 0:577ad245b1f5 643 // check potentiometer value
casiotone401 0:577ad245b1f5 644 pot[0] = potPin1.read();
casiotone401 0:577ad245b1f5 645 pot[1] = potPin2.read();
casiotone401 0:577ad245b1f5 646
casiotone401 0:577ad245b1f5 647 if (fabs(pot[0] - _pot[0]) > 0.02f) {
casiotone401 0:577ad245b1f5 648
casiotone401 0:577ad245b1f5 649 bndl.add("/pot1").add(pot[0] * 1023.0f);
casiotone401 0:577ad245b1f5 650 midi.sendControlChange(0x16, map(potPin1.read_u16(), 0, 65535, 0, 127), MIDI_CHANNEL); // microKorg Noise Level
casiotone401 0:577ad245b1f5 651
casiotone401 0:577ad245b1f5 652 _pot[0] = pot[0];
casiotone401 0:577ad245b1f5 653 changeFlag = true;
casiotone401 0:577ad245b1f5 654
casiotone401 0:577ad245b1f5 655 } else if (fabs(pot[1] - _pot[1]) > 0.02f) {
casiotone401 0:577ad245b1f5 656
casiotone401 0:577ad245b1f5 657 bndl.add("/pot2").add(pot[1] * 1023.0f);
casiotone401 0:577ad245b1f5 658 midi.sendControlChange(0x5E, map(potPin2.read_u16(), 0, 65535, 0, 127), MIDI_CHANNEL); // microKorg Delay Level
casiotone401 0:577ad245b1f5 659
casiotone401 0:577ad245b1f5 660 _pot[1] = pot[1];
casiotone401 0:577ad245b1f5 661 changeFlag = true;
casiotone401 0:577ad245b1f5 662 }
casiotone401 0:577ad245b1f5 663
casiotone401 0:577ad245b1f5 664 if (changeFlag && timer.read_ms() > WAIT_SEND) {
casiotone401 0:577ad245b1f5 665
casiotone401 0:577ad245b1f5 666 idx = 0;
casiotone401 0:577ad245b1f5 667 int len = bndl.send(oscBuff);
casiotone401 0:577ad245b1f5 668
casiotone401 0:577ad245b1f5 669 while (len--) {
casiotone401 0:577ad245b1f5 670 // send OSC to esp8266 wifi
casiotone401 0:577ad245b1f5 671 esp8266Serial.putc(oscBuff[idx++]);
casiotone401 0:577ad245b1f5 672 }
casiotone401 0:577ad245b1f5 673
casiotone401 0:577ad245b1f5 674 changeFlag = false;
casiotone401 0:577ad245b1f5 675 bndl.empty(); // empty the bundle to free room for a new one
casiotone401 0:577ad245b1f5 676
casiotone401 0:577ad245b1f5 677 timer.reset();
casiotone401 0:577ad245b1f5 678 }
casiotone401 0:577ad245b1f5 679
casiotone401 0:577ad245b1f5 680 }
casiotone401 0:577ad245b1f5 681
casiotone401 0:577ad245b1f5 682 }