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
main.cpp@2:7997fb939580, 2016-02-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |