OSCtoCV Library
Diff: OSCtoCV.cpp
- Revision:
- 0:cd43a974c54c
- Child:
- 1:981b62bb5c87
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OSCtoCV.cpp Sun Jan 17 09:30:32 2016 +0000 @@ -0,0 +1,359 @@ +/* + OSCtoCV.cpp +*/ + +#include "mbed.h" +#include "OSCtoCV.h" + +//------------------------------------------------------------- +// Global Variables + +// Silentway Calibration Data Mapping +// http://www.expert-sleepers.co.uk/silentway.html + +// Chromatic Scale +const float calibMap1[QUAN_RES1] = { +0.00076928, 0.00900736, 0.01724544, 0.02548352, 0.03372160, +0.04195968, 0.05019776, 0.05843584, 0.06667392, 0.07491200, +0.08315008, 0.09138816, 0.09962624, 0.10786432, 0.11610240, +0.12434047, 0.13258974, 0.14083999, 0.14909023, 0.15734047, +0.16559070, 0.17384095, 0.18209119, 0.19034143, 0.19859168, +0.20684192, 0.21509215, 0.22334240, 0.23159264, 0.23984288, +0.24809311, 0.25634655, 0.26460093, 0.27285531, 0.28110969, +0.28936407, 0.29761845, 0.30587283, 0.31412721, 0.32238159, +0.33063596, 0.33889034, 0.34714472, 0.35539910, 0.36365348, +0.37190786, 0.38017464, 0.38844886, 0.39672306, 0.40499726, +0.41327149, 0.42154568, 0.42981988, 0.43809411, 0.44636831, +0.45464250, 0.46291673, 0.47119093, 0.47946513, 0.48773935, +0.49601355, 0.50430328, 0.51260746, 0.52091163, 0.52921581, +0.53751999, 0.54582411, 0.55412829, 0.56243247, 0.57073665, +0.57904083, 0.58734500, 0.59564912, 0.60395330, 0.61225748, +0.62056166, 0.62890279, 0.63728637, 0.64566994, 0.65405351, +0.66243708, 0.67082065, 0.67920423, 0.68758780, 0.69597137, +0.70435494, 0.71273851, 0.72112209, 0.72950566, 0.73788923, +0.74627280, 0.75476575, 0.76334614, 0.77192658, 0.78050703, +0.78908741, 0.79766786, 0.80624831, 0.81482869, 0.82340914, +0.83198959, 0.84056997, 0.84915042, 0.85773087, 0.86631125, +0.87489170, 0.88425636, 0.89363104, 0.90300572, 0.91238040, +0.92175508, 0.93112975, 0.94050443, 0.94987911, 0.95925385, +0.96862853 +}; + +// Major Scale +const float calibMap2[QUAN_RES2] = { +calibMap1[0], calibMap1[2], calibMap1[4], calibMap1[5], calibMap1[7], +calibMap1[9], calibMap1[11], calibMap1[12], calibMap1[14], calibMap1[16], +calibMap1[17], calibMap1[19], calibMap1[21], calibMap1[23], calibMap1[24], +calibMap1[26], calibMap1[28], calibMap1[29], calibMap1[31], calibMap1[33], +calibMap1[35], calibMap1[36], calibMap1[38], calibMap1[40], calibMap1[41], +calibMap1[43], calibMap1[45], calibMap1[47], calibMap1[48], calibMap1[50], +calibMap1[52], calibMap1[53], calibMap1[55], calibMap1[57], calibMap1[59], +calibMap1[60], calibMap1[62], calibMap1[64], calibMap1[65], calibMap1[67], +calibMap1[69], calibMap1[71], calibMap1[72], calibMap1[74], calibMap1[76], +calibMap1[77], calibMap1[79], calibMap1[81], calibMap1[83], calibMap1[84], +calibMap1[86], calibMap1[88], calibMap1[89], calibMap1[91], calibMap1[93], +calibMap1[95], calibMap1[96], calibMap1[98], calibMap1[100], calibMap1[101], +calibMap1[103], calibMap1[105], calibMap1[107], calibMap1[108], calibMap1[110], +calibMap1[112], calibMap1[113], calibMap1[115] +}; + +// M7(9) +const float calibMap3[QUAN_RES3] = { +calibMap1[0], calibMap1[4], calibMap1[7], calibMap1[11], calibMap1[12], +calibMap1[14], calibMap1[16], calibMap1[19], calibMap1[23], calibMap1[24], +calibMap1[26], calibMap1[28], calibMap1[31], calibMap1[35], calibMap1[36], +calibMap1[38], calibMap1[40], calibMap1[43], calibMap1[47], calibMap1[48], +calibMap1[50], calibMap1[52], calibMap1[55], calibMap1[59], calibMap1[60], +calibMap1[62], calibMap1[64], calibMap1[67], calibMap1[71], calibMap1[72], +calibMap1[76], calibMap1[79], calibMap1[83], calibMap1[84], calibMap1[86], +calibMap1[88], calibMap1[91], calibMap1[95], calibMap1[96], calibMap1[100], +calibMap1[103], calibMap1[107], calibMap1[108], calibMap1[110], calibMap1[112], +calibMap1[115] +}; + +// m7(9) +const float calibMap4[QUAN_RES4] = { +calibMap1[0], calibMap1[3], calibMap1[7], calibMap1[10], calibMap1[12], +calibMap1[15], calibMap1[19], calibMap1[22], calibMap1[26], calibMap1[27], +calibMap1[31], calibMap1[34], calibMap1[36], calibMap1[38], calibMap1[39], +calibMap1[43], calibMap1[46], calibMap1[50], calibMap1[53], calibMap1[55], +calibMap1[58], calibMap1[60], calibMap1[63], calibMap1[67], calibMap1[70], +calibMap1[72], calibMap1[74], calibMap1[75], calibMap1[79], calibMap1[82], +calibMap1[86], calibMap1[89], calibMap1[91], calibMap1[94], calibMap1[96], +calibMap1[99], calibMap1[103], calibMap1[106], calibMap1[110], calibMap1[113] +}; + +// Dorian Scale +const float calibMap5[QUAN_RES5] = { +calibMap1[0], calibMap1[2], calibMap1[3], calibMap1[5], calibMap1[7], +calibMap1[9], calibMap1[10], calibMap1[12], calibMap1[14], calibMap1[15], +calibMap1[17], calibMap1[19], calibMap1[20], calibMap1[21], calibMap1[24], +calibMap1[26], calibMap1[27], calibMap1[29], calibMap1[31], calibMap1[33], +calibMap1[34], calibMap1[36], calibMap1[38], calibMap1[39], calibMap1[41], +calibMap1[43], calibMap1[45], calibMap1[46], calibMap1[48], calibMap1[50], +calibMap1[51], calibMap1[53], calibMap1[55], calibMap1[57], calibMap1[58], +calibMap1[60], calibMap1[62], calibMap1[63], calibMap1[65], calibMap1[67], +calibMap1[69], calibMap1[70], calibMap1[72], calibMap1[74], calibMap1[75], +calibMap1[77], calibMap1[79], calibMap1[81], calibMap1[82], calibMap1[84], +calibMap1[86], calibMap1[87], calibMap1[89], calibMap1[91], calibMap1[93], +calibMap1[94], calibMap1[96], calibMap1[98], calibMap1[99], calibMap1[101], +calibMap1[103], calibMap1[105], calibMap1[106], calibMap1[108], calibMap1[110], +calibMap1[111], calibMap1[113], calibMap1[115] +}; + +// Minor Scale +const float calibMap6[QUAN_RES6] = { +calibMap1[0], calibMap1[2], calibMap1[3], calibMap1[5], calibMap1[7], +calibMap1[8], calibMap1[10], calibMap1[12], calibMap1[14], calibMap1[15], +calibMap1[17], calibMap1[19], calibMap1[20], calibMap1[22], calibMap1[24], +calibMap1[26], calibMap1[27], calibMap1[29], calibMap1[31], calibMap1[32], +calibMap1[34], calibMap1[36], calibMap1[38], calibMap1[39], calibMap1[41], +calibMap1[43], calibMap1[44], calibMap1[46], calibMap1[48], calibMap1[50], +calibMap1[51], calibMap1[53], calibMap1[55], calibMap1[56], calibMap1[58], +calibMap1[60], calibMap1[62], calibMap1[63], calibMap1[65], calibMap1[67], +calibMap1[68], calibMap1[70], calibMap1[72], calibMap1[74], calibMap1[75], +calibMap1[77], calibMap1[79], calibMap1[80], calibMap1[82], calibMap1[84], +calibMap1[86], calibMap1[87], calibMap1[89], calibMap1[91], calibMap1[92], +calibMap1[94], calibMap1[96], calibMap1[98], calibMap1[99], calibMap1[101], +calibMap1[103], calibMap1[104], calibMap1[106], calibMap1[108], calibMap1[110], +calibMap1[111], calibMap1[113], calibMap1[115] +}; + +// 5th +const float calibMap7[QUAN_RES7] = { +calibMap1[0], calibMap1[7], calibMap1[14], calibMap1[21], calibMap1[28], +calibMap1[35], calibMap1[42], calibMap1[49], calibMap1[56], calibMap1[63], +calibMap1[70], calibMap1[77], calibMap1[84], calibMap1[91], calibMap1[98], +calibMap1[105] +}; + +// Whole tone +const float calibMap8[QUAN_RES8] = { +calibMap1[0], calibMap1[1], calibMap1[2], calibMap1[6], calibMap1[8], +calibMap1[10], calibMap1[12], calibMap1[14], calibMap1[16], calibMap1[18], +calibMap1[20], calibMap1[22], calibMap1[24], calibMap1[26], calibMap1[28], +calibMap1[30], calibMap1[32], calibMap1[34], calibMap1[36], calibMap1[38], +calibMap1[40], calibMap1[42], calibMap1[44], calibMap1[46], calibMap1[48], +calibMap1[50], calibMap1[52], calibMap1[54], calibMap1[56], calibMap1[58], +calibMap1[60], calibMap1[62], calibMap1[64], calibMap1[66], calibMap1[68], +calibMap1[70], calibMap1[72], calibMap1[74], calibMap1[76], calibMap1[78], +calibMap1[80], calibMap1[82], calibMap1[84], calibMap1[86], calibMap1[88], +calibMap1[90], calibMap1[92], calibMap1[94], calibMap1[96], calibMap1[98], +calibMap1[100], calibMap1[102], calibMap1[104], calibMap1[106], calibMap1[108], +calibMap1[110], calibMap1[112], calibMap1[114] +}; + +//------------------------------------------------------------- +// Global Variables + +float gOSC_cv[8]; +float gSeq_cv[16]; +float gGlide; + +// Sub Mode Status +int gSubModeCount1 = -1; +int gSubModeCount2 = -1; + +// Variables for Sequencer +float gPulseCount[8] = {0}; +float gGateMode[16] = {0}; +float gSlide[16]; +float gAccent[16] = {0}; + +// Euclidean SEQ Variables +float gEucA[6], gEucB[6]; + +// Variables for Control +/* +gCtrl[0] /ctrl1 BPM +gCtrl[1] /ctrl2 Quantize mode +gCtrl[3] /ctrl4 Glide +gCtrl[4] /ctrl5 M185 Reset Count + +gCtrlSW[0] /ctrlsw1 Sequencer STOP +gCtrlSW[1] /ctrlsw2 Euclidean Sequencer reset +gCtrlSW[2] /ctrlsw3 Sequencer Loop +gCtrlSW[3] /ctrlsw4 Euclid Seq ON +gCtrlSW[4] /ctrlsw5 ASR Analog Mode + +gArdPot[0] /pot1 Arduino pot1 +gArdPot[1] /pot2 Arduino pot2 +gArdSW[0] /sw1 Arduino sw1 +gArdSW[1] /sw2 Arduino sw2 + +*/ + +float gCtrl[8]; +bool gCtrlSW[8] = {false}; + +// Variables for Arduino +uint16_t gArdCV[4]; +float gArdPot[2] = {408.0f, 350.0f}; +bool gArdSW[2] = {false}; + +//------------------------------------------------------------- +// mbed Functions + +TextLCD gLCD(p9, p10, p11, p12, p13, p14); // rs, e, d4-d7 + +BurstSPI gSPI(p5,p6,p7); // SPI (p6 unconnected) + +FastOut<p15> gSYNCMODE; // SYNC DAC8568 +FastOut<p16> gLDAC; // LDAC DAC8568 + +DigitalOut gGATES[4] = {p21, p22, p23, p24}; // GateOut +FastOut<p19> gSUBGATE; // SubGateOut +FastOut<p25> gCLOCKOUT; // ClockOut + +AnalogOut gAOUT(p18); + +AnalogIn gAIN(p17); +DebouncedInterrupt gSW(p30); // Mode SW + +// MIDI OUT +MIDI midi(p28, p27); + +Timer gTimer; // Timer +Ticker gPoller; // Ticker for Polling + +// Ethernet +#ifdef DHCP +EthernetNetIf gEth; +#else +EthernetNetIf gEth( + IpAddr(192,168,1,6), + IpAddr(255,255,255,0), + IpAddr(192,168,1,1), + IpAddr(192,168,1,1) + ); +#endif + + +// touchOSC Address +uint8_t touchOSCAddress[] = {192, 168, 1, 7}; +int touchOSCPort = TOSC_PORT; + +// Set OSC message for sending +OSCClass osc; +OSCMessage sendMes; + +//------------------------------------------------------------- +// SPI Transfer +// DAC8568 data word length 32bit (8bit shift out) + +void UpdateCV(int control, int address, const unsigned int *data) +{ + + switch (control) + { + case WRITE_UPDATE_N: + + gSYNCMODE = _DISABLE; + gSPI.write(00000000|control); // padding at beginning of byte and control bits + gSPI.write(address << 4 | *data >> 12); // address(ch) bits + gSPI.write((*data << 4) >> 8); // middle 8 bits of data + gSPI.write((*data << 12) >> 8 | 00001111); + gSYNCMODE = _ENABLE; + gLDAC = _DISABLE; + gLDAC = _ENABLE; + + break; + + case RESET: + + gSYNCMODE = _DISABLE; + gSPI.write(00000111); // Software RESET + gSPI.write(00000000); + gSPI.write(00000000); + gSPI.write(00000000); + gSYNCMODE = _ENABLE; + + break; + + case CLR: + + gSYNCMODE = _DISABLE; + gSPI.write(00000101); // CLR Register + gSPI.write(00000000); + gSPI.write(00000000); + gSPI.write(00000011); // Ignore CLR Pin + gSYNCMODE = _ENABLE; + + break; + } +} + +//------------------------------------------------------------- +// CV Meter TextLCD bar meter + +void UpdateCVMeter(int ch, const unsigned int *level) +{ + gLCD.locate ( ch, 0 ); + gLCD.putc(*level * 0.0002192f); // put custom char +} + +//------------------------------------------------------------- +// Check subMode1(gArdSW[0]) (subMode Status & Text LCD Update) + +int CheckSubMode1(void) +{ + static int lastSWState = -1; + + if (gArdSW[0] != lastSWState) + { + lastSWState = gArdSW[0]; + + if (gSubModeCount1 < SUBMODE1_TOTAL - 1) + { + ++gSubModeCount1; + + } else { + + gSubModeCount1 = 0; + } + + } + + return gSubModeCount1; +} + +//------------------------------------------------------------- +// Check subMode2(gArdSW[1]) (subMode Status & Text LCD Update) + +int CheckSubMode2(void) +{ + static int lastSWState = -1; + + if (gArdSW[0] != lastSWState) + { + lastSWState = gArdSW[0]; + + if (gSubModeCount2 < SUBMODE2_TOTAL - 1) + { + ++gSubModeCount2; + + } else { + + gSubModeCount2 = 0; + } + + } + + return gSubModeCount2; +} + +//------------------------------------------------------------- +// Update subMode Text LCD +void UpdateSubModeLCD(const char * subModeName) +{ + gLCD.locate( 0, 1 ); + gLCD.printf(" "); + + gLCD.locate( 0, 1 ); + gLCD.printf("%s", subModeName); + + sendMes.setTopAddress("/submode"); + sendMes.setArgs("s", subModeName); + + osc.sendOsc(&sendMes); +}