OSCtoCV Library
Embed:
(wiki syntax)
Show/hide line numbers
OSCtoCV.cpp
00001 /* 00002 OSCtoCV.cpp 00003 */ 00004 00005 #include "mbed.h" 00006 #include "OSCtoCV.h" 00007 00008 //------------------------------------------------------------- 00009 // Global Variables 00010 00011 // Silentway Calibration Data Mapping 00012 // http://www.expert-sleepers.co.uk/silentway.html 00013 00014 // Chromatic Scale 00015 const float calibMap1[QUAN_RES1] = { 00016 0.00076928f, 0.00900736f, 0.01724544f, 0.02548352f, 0.03372160f, 00017 0.04195968f, 0.05019776f, 0.05843584f, 0.06667392f, 0.07491200f, 00018 0.08315008f, 0.09138816f, 0.09962624f, 0.10786432f, 0.11610240f, 00019 0.12434047f, 0.13258974f, 0.14083999f, 0.14909023f, 0.15734047f, 00020 0.16559070f, 0.17384095f, 0.18209119f, 0.19034143f, 0.19859168f, 00021 0.20684192f, 0.21509215f, 0.22334240f, 0.23159264f, 0.23984288f, 00022 0.24809311f, 0.25634655f, 0.26460093f, 0.27285531f, 0.28110969f, 00023 0.28936407f, 0.29761845f, 0.30587283f, 0.31412721f, 0.32238159f, 00024 0.33063596f, 0.33889034f, 0.34714472f, 0.35539910f, 0.36365348f, 00025 0.37190786f, 0.38017464f, 0.38844886f, 0.39672306f, 0.40499726f, 00026 0.41327149f, 0.42154568f, 0.42981988f, 0.43809411f, 0.44636831f, 00027 0.45464250f, 0.46291673f, 0.47119093f, 0.47946513f, 0.48773935f, 00028 0.49601355f, 0.50430328f, 0.51260746f, 0.52091163f, 0.52921581f, 00029 0.53751999f, 0.54582411f, 0.55412829f, 0.56243247f, 0.57073665f, 00030 0.57904083f, 0.58734500f, 0.59564912f, 0.60395330f, 0.61225748f, 00031 0.62056166f, 0.62890279f, 0.63728637f, 0.64566994f, 0.65405351f, 00032 0.66243708f, 0.67082065f, 0.67920423f, 0.68758780f, 0.69597137f, 00033 0.70435494f, 0.71273851f, 0.72112209f, 0.72950566f, 0.73788923f, 00034 0.74627280f, 0.75476575f, 0.76334614f, 0.77192658f, 0.78050703f, 00035 0.78908741f, 0.79766786f, 0.80624831f, 0.81482869f, 0.82340914f, 00036 0.83198959f, 0.84056997f, 0.84915042f, 0.85773087f, 0.86631125f, 00037 0.87489170f, 0.88425636f, 0.89363104f, 0.90300572f, 0.91238040f, 00038 0.92175508f, 0.93112975f, 0.94050443f, 0.94987911f, 0.95925385f, 00039 0.96862853f 00040 }; 00041 00042 // Major Scale 00043 const float calibMap2[QUAN_RES2] = { 00044 calibMap1[0], calibMap1[2], calibMap1[4], calibMap1[5], calibMap1[7], 00045 calibMap1[9], calibMap1[11], calibMap1[12], calibMap1[14], calibMap1[16], 00046 calibMap1[17], calibMap1[19], calibMap1[21], calibMap1[23], calibMap1[24], 00047 calibMap1[26], calibMap1[28], calibMap1[29], calibMap1[31], calibMap1[33], 00048 calibMap1[35], calibMap1[36], calibMap1[38], calibMap1[40], calibMap1[41], 00049 calibMap1[43], calibMap1[45], calibMap1[47], calibMap1[48], calibMap1[50], 00050 calibMap1[52], calibMap1[53], calibMap1[55], calibMap1[57], calibMap1[59], 00051 calibMap1[60], calibMap1[62], calibMap1[64], calibMap1[65], calibMap1[67], 00052 calibMap1[69], calibMap1[71], calibMap1[72], calibMap1[74], calibMap1[76], 00053 calibMap1[77], calibMap1[79], calibMap1[81], calibMap1[83], calibMap1[84], 00054 calibMap1[86], calibMap1[88], calibMap1[89], calibMap1[91], calibMap1[93], 00055 calibMap1[95], calibMap1[96], calibMap1[98], calibMap1[100], calibMap1[101], 00056 calibMap1[103], calibMap1[105], calibMap1[107], calibMap1[108], calibMap1[110], 00057 calibMap1[112], calibMap1[113], calibMap1[115] 00058 }; 00059 00060 // M7(9) 00061 const float calibMap3[QUAN_RES3] = { 00062 calibMap1[0], calibMap1[4], calibMap1[7], calibMap1[11], calibMap1[12], 00063 calibMap1[14], calibMap1[16], calibMap1[19], calibMap1[23], calibMap1[24], 00064 calibMap1[26], calibMap1[28], calibMap1[31], calibMap1[35], calibMap1[36], 00065 calibMap1[38], calibMap1[40], calibMap1[43], calibMap1[47], calibMap1[48], 00066 calibMap1[50], calibMap1[52], calibMap1[55], calibMap1[59], calibMap1[60], 00067 calibMap1[62], calibMap1[64], calibMap1[67], calibMap1[71], calibMap1[72], 00068 calibMap1[76], calibMap1[79], calibMap1[83], calibMap1[84], calibMap1[86], 00069 calibMap1[88], calibMap1[91], calibMap1[95], calibMap1[96], calibMap1[100], 00070 calibMap1[103], calibMap1[107], calibMap1[108], calibMap1[110], calibMap1[112], 00071 calibMap1[115] 00072 }; 00073 00074 // m7(9) 00075 const float calibMap4[QUAN_RES4] = { 00076 calibMap1[0], calibMap1[3], calibMap1[7], calibMap1[10], calibMap1[12], 00077 calibMap1[15], calibMap1[19], calibMap1[22], calibMap1[26], calibMap1[27], 00078 calibMap1[31], calibMap1[34], calibMap1[36], calibMap1[38], calibMap1[39], 00079 calibMap1[43], calibMap1[46], calibMap1[50], calibMap1[53], calibMap1[55], 00080 calibMap1[58], calibMap1[60], calibMap1[63], calibMap1[67], calibMap1[70], 00081 calibMap1[72], calibMap1[74], calibMap1[75], calibMap1[79], calibMap1[82], 00082 calibMap1[86], calibMap1[89], calibMap1[91], calibMap1[94], calibMap1[96], 00083 calibMap1[99], calibMap1[103], calibMap1[106], calibMap1[110], calibMap1[113] 00084 }; 00085 00086 // Dorian Scale 00087 const float calibMap5[QUAN_RES5] = { 00088 calibMap1[0], calibMap1[2], calibMap1[3], calibMap1[5], calibMap1[7], 00089 calibMap1[9], calibMap1[10], calibMap1[12], calibMap1[14], calibMap1[15], 00090 calibMap1[17], calibMap1[19], calibMap1[20], calibMap1[21], calibMap1[24], 00091 calibMap1[26], calibMap1[27], calibMap1[29], calibMap1[31], calibMap1[33], 00092 calibMap1[34], calibMap1[36], calibMap1[38], calibMap1[39], calibMap1[41], 00093 calibMap1[43], calibMap1[45], calibMap1[46], calibMap1[48], calibMap1[50], 00094 calibMap1[51], calibMap1[53], calibMap1[55], calibMap1[57], calibMap1[58], 00095 calibMap1[60], calibMap1[62], calibMap1[63], calibMap1[65], calibMap1[67], 00096 calibMap1[69], calibMap1[70], calibMap1[72], calibMap1[74], calibMap1[75], 00097 calibMap1[77], calibMap1[79], calibMap1[81], calibMap1[82], calibMap1[84], 00098 calibMap1[86], calibMap1[87], calibMap1[89], calibMap1[91], calibMap1[93], 00099 calibMap1[94], calibMap1[96], calibMap1[98], calibMap1[99], calibMap1[101], 00100 calibMap1[103], calibMap1[105], calibMap1[106], calibMap1[108], calibMap1[110], 00101 calibMap1[111], calibMap1[113], calibMap1[115] 00102 }; 00103 00104 // Minor Scale 00105 const float calibMap6[QUAN_RES6] = { 00106 calibMap1[0], calibMap1[2], calibMap1[3], calibMap1[5], calibMap1[7], 00107 calibMap1[8], calibMap1[10], calibMap1[12], calibMap1[14], calibMap1[15], 00108 calibMap1[17], calibMap1[19], calibMap1[20], calibMap1[22], calibMap1[24], 00109 calibMap1[26], calibMap1[27], calibMap1[29], calibMap1[31], calibMap1[32], 00110 calibMap1[34], calibMap1[36], calibMap1[38], calibMap1[39], calibMap1[41], 00111 calibMap1[43], calibMap1[44], calibMap1[46], calibMap1[48], calibMap1[50], 00112 calibMap1[51], calibMap1[53], calibMap1[55], calibMap1[56], calibMap1[58], 00113 calibMap1[60], calibMap1[62], calibMap1[63], calibMap1[65], calibMap1[67], 00114 calibMap1[68], calibMap1[70], calibMap1[72], calibMap1[74], calibMap1[75], 00115 calibMap1[77], calibMap1[79], calibMap1[80], calibMap1[82], calibMap1[84], 00116 calibMap1[86], calibMap1[87], calibMap1[89], calibMap1[91], calibMap1[92], 00117 calibMap1[94], calibMap1[96], calibMap1[98], calibMap1[99], calibMap1[101], 00118 calibMap1[103], calibMap1[104], calibMap1[106], calibMap1[108], calibMap1[110], 00119 calibMap1[111], calibMap1[113], calibMap1[115] 00120 }; 00121 00122 // 5th 00123 const float calibMap7[QUAN_RES7] = { 00124 calibMap1[0], calibMap1[7], calibMap1[14], calibMap1[21], calibMap1[28], 00125 calibMap1[35], calibMap1[42], calibMap1[49], calibMap1[56], calibMap1[63], 00126 calibMap1[70], calibMap1[77], calibMap1[84], calibMap1[91], calibMap1[98], 00127 calibMap1[105] 00128 }; 00129 00130 // Whole tone 00131 const float calibMap8[QUAN_RES8] = { 00132 calibMap1[0], calibMap1[1], calibMap1[2], calibMap1[6], calibMap1[8], 00133 calibMap1[10], calibMap1[12], calibMap1[14], calibMap1[16], calibMap1[18], 00134 calibMap1[20], calibMap1[22], calibMap1[24], calibMap1[26], calibMap1[28], 00135 calibMap1[30], calibMap1[32], calibMap1[34], calibMap1[36], calibMap1[38], 00136 calibMap1[40], calibMap1[42], calibMap1[44], calibMap1[46], calibMap1[48], 00137 calibMap1[50], calibMap1[52], calibMap1[54], calibMap1[56], calibMap1[58], 00138 calibMap1[60], calibMap1[62], calibMap1[64], calibMap1[66], calibMap1[68], 00139 calibMap1[70], calibMap1[72], calibMap1[74], calibMap1[76], calibMap1[78], 00140 calibMap1[80], calibMap1[82], calibMap1[84], calibMap1[86], calibMap1[88], 00141 calibMap1[90], calibMap1[92], calibMap1[94], calibMap1[96], calibMap1[98], 00142 calibMap1[100], calibMap1[102], calibMap1[104], calibMap1[106], calibMap1[108], 00143 calibMap1[110], calibMap1[112], calibMap1[114] 00144 }; 00145 00146 //------------------------------------------------------------- 00147 // Global Variables 00148 00149 float gOSC_cv[8]; 00150 float gSeq_cv[16]; 00151 float g185_cv[8]; 00152 float gGlide; 00153 00154 // Sub Mode Status 00155 int gSubModeCount1 = -1; 00156 int gSubModeCount2 = -1; 00157 00158 // Variables for Sequencer 00159 float gPulseCount[8] = {0}; 00160 float gGateMode[16] = {0}; 00161 float gGateMode185[8] = {0}; 00162 float gSlide[16]; 00163 float gSlide185[8]; 00164 float gAccent[16] = {0}; 00165 float gAccent185[8] = {0}; 00166 00167 float gPulseCountBeats[16] = {0}; 00168 float gBeatsLevel[8]; 00169 float gBeatsDecay[8]; 00170 unsigned int gBeatsMatrix[8][16] = {{0}}; 00171 00172 // Euclidean SEQ Variables 00173 float gEucA[6], gEucB[6]; 00174 00175 // Variables for Control 00176 /* 00177 gCtrl[0] /ctrl1 BPM 00178 gCtrl[1] /ctrl2 Quantize mode 00179 gCtrl[3] /ctrl4 Glide 00180 gCtrl[4] /ctrl5 Shift CV Seq Reset Count 00181 gCtrl[5] /ctrl6 M185 Seq Reset Count 00182 gCtrl[6] /ctrl7 Gate Length 00183 gCtrl[7] /ctrl8 Beats Seq Reset Count 00184 00185 gCtrlSW[0] /ctrlsw1 Sequencer STOP 00186 gCtrlSW[1] /ctrlsw2 Euclidean Sequencer reset 00187 gCtrlSW[2] /ctrlsw3 Sequencer Loop 00188 gCtrlSW[3] /ctrlsw4 Euclid Seq ON 00189 gCtrlSW[4] /ctrlsw5 ASR Analog Mode 00190 gCtrlSW[5] /ctrlsw6 Beats Sequencer Random Vel 00191 00192 gArdPot[0] /pot1 Arduino pot1 00193 gArdPot[1] /pot2 Arduino pot2 00194 gArdSW[0] /sw1 Arduino sw1 00195 gArdSW[1] /sw2 Arduino sw2 00196 */ 00197 00198 float gCtrl[8] = {0.398f, 0, 0, 0, 1.0f, 1.0f, 1.0f, 1.0f}; 00199 bool gCtrlSW[8] = {false}; 00200 00201 // Variables for Arduino 00202 uint16_t gArdCV[4] = {0}; 00203 float gArdPot[2] = {408.0f, 350}; 00204 bool gArdSW[2] = {false}; 00205 00206 //------------------------------------------------------------- 00207 // mbed Functions 00208 00209 TextLCD gLCD(p9, p10, p11, p12, p13, p14); // rs, e, d4-d7 00210 00211 BurstSPI gSPI(p5,p6,p7); // SPI (p6 unconnected) 00212 00213 FastOut<p15> gSYNCMODE; // SYNC DAC8568 00214 FastOut<p16> gLDAC; // LDAC DAC8568 00215 00216 DigitalOut gGATES[4] = {p21, p22, p23, p24}; // GateOut 00217 FastOut<p19> gSUBGATE; // SubGateOut 00218 FastOut<p25> gCLOCKOUT; // ClockOut 00219 00220 AnalogOut gAOUT(p18); 00221 00222 AnalogIn gAIN(p17); 00223 DebouncedInterrupt gSW(p30); // Mode SW 00224 00225 // MIDI OUT 00226 MIDI midi(p28, p27); 00227 00228 Timer gTimer; // Timer 00229 Ticker gPoller; // Ticker for Polling 00230 00231 // Ethernet 00232 #ifdef DHCP 00233 EthernetNetIf gEth; 00234 #else 00235 EthernetNetIf gEth( 00236 IpAddr(192,168,1,6), 00237 IpAddr(255,255,255,0), 00238 IpAddr(192,168,1,1), 00239 IpAddr(192,168,1,1) 00240 ); 00241 #endif 00242 00243 // touchOSC Address 00244 uint8_t touchOSCAddress[] = {192, 168, 1, 7}; 00245 int touchOSCPort = TOSC_PORT; 00246 00247 // Set OSC message for sending 00248 OSCClass osc; 00249 OSCMessage sendMes; 00250 00251 //------------------------------------------------------------- 00252 // SPI Transfer 00253 // DAC8568 data word length 32bit (8bit shift out) 00254 00255 void UpdateCV(unsigned int control, unsigned int ch, const unsigned int *data) 00256 { 00257 00258 switch (control) 00259 { 00260 case WRITE_UPDATE_N: 00261 00262 gSYNCMODE = _DISABLE; 00263 gSPI.write(00000000|control); // padding at beginning of byte and control bits 00264 gSPI.write(ch << 4 | *data >> 12); // address(ch) bits 00265 gSPI.write((*data << 4) >> 8); // middle 8 bits of data 00266 gSPI.write((*data << 12) >> 8 | 00001111); 00267 gSYNCMODE = _ENABLE; 00268 gLDAC = _DISABLE; 00269 gLDAC = _ENABLE; 00270 00271 break; 00272 00273 case RESET: 00274 00275 gSYNCMODE = _DISABLE; 00276 gSPI.write(00000111); // Software RESET 00277 gSPI.write(00000000); 00278 gSPI.write(00000000); 00279 gSPI.write(00000000); 00280 gSYNCMODE = _ENABLE; 00281 00282 break; 00283 00284 case CLR: 00285 00286 gSYNCMODE = _DISABLE; 00287 gSPI.write(00000101); // CLR Register 00288 gSPI.write(00000000); 00289 gSPI.write(00000000); 00290 gSPI.write(00000011); // Ignore CLR Pin 00291 gSYNCMODE = _ENABLE; 00292 00293 break; 00294 } 00295 } 00296 00297 //------------------------------------------------------------- 00298 // CV Meter TextLCD bar meter 00299 00300 void UpdateCVMeter(unsigned int ch, const unsigned int *level) 00301 { 00302 gLCD.locate ( ch, 0 ); 00303 gLCD.putc(*level * 0.0002192f); // put custom char 00304 } 00305 00306 //------------------------------------------------------------- 00307 // Check subMode1(gArdSW[0]) (subMode Status & Text LCD Update) 00308 00309 int CheckSubMode1(void) 00310 { 00311 static int lastSWState = -1; 00312 00313 if (gArdSW[0] != lastSWState) 00314 { 00315 lastSWState = gArdSW[0]; 00316 00317 if (gSubModeCount1 < SUBMODE1_TOTAL - 1) 00318 { 00319 ++gSubModeCount1; 00320 00321 } else { 00322 00323 gSubModeCount1 = 0; 00324 } 00325 00326 } 00327 00328 return gSubModeCount1; 00329 } 00330 00331 //------------------------------------------------------------- 00332 // Check subMode2(gArdSW[1]) (subMode Status & Text LCD Update) 00333 00334 int CheckSubMode2(void) 00335 { 00336 static int lastSWState = -1; 00337 00338 if (gArdSW[1] != lastSWState) 00339 { 00340 lastSWState = gArdSW[1]; 00341 00342 if (gSubModeCount2 < SUBMODE2_TOTAL - 1) 00343 { 00344 ++gSubModeCount2; 00345 00346 } else { 00347 00348 gSubModeCount2 = 0; 00349 } 00350 00351 } 00352 00353 return gSubModeCount2; 00354 } 00355 00356 //------------------------------------------------------------- 00357 // Update subMode Text LCD 00358 void UpdateSubModeLCD(const char * subModeName) 00359 { 00360 gLCD.locate( 0, 1 ); 00361 gLCD.printf(" "); 00362 00363 gLCD.locate( 0, 1 ); 00364 gLCD.printf("%s", subModeName); 00365 00366 sendMes.setTopAddress("/submode"); 00367 sendMes.setArgs("s", subModeName); 00368 00369 osc.sendOsc(&sendMes); 00370 }
Generated on Tue Jul 12 2022 22:47:49 by 1.7.2