OSCtoCV Library

Dependents:   OSCtoCVConverter

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);
+}