OSCtoCV Library

Dependents:   OSCtoCVConverter

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers OSCtoCV.cpp Source File

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 }