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:
Sun Feb 14 03:32:40 2016 +0000
Revision:
0:577ad245b1f5
Child:
1:0a963a78f2bd
ver.1

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