OSC-CV Converter

Dependencies:   Bonjour OSCReceiver TextLCD mbed mbed-rpc BurstSPI DebouncedInterrupt FastIO MIDI OSC OSCtoCV ClockControl

OSC to CV Converter

http://gtbts.tumblr.com/post/125663817741/osc-to-cv-converter-ver2-mbed-osctocv

/media/uploads/casiotone401/tumblr_nsg7y4pkfg1qlle9fo1_540.png

Files at this revision

API Documentation at this revision

Comitter:
casiotone401
Date:
Thu Feb 25 11:22:24 2016 +0000
Parent:
28:14be965b333e
Child:
30:d82b42321364
Commit message:
minor change

Changed in this revision

OSC.lib Show annotated file Show diff for this revision Revisions of this file
OSCReceiver.lib Show annotated file Show diff for this revision Revisions of this file
OSCtoCV.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/OSC.lib	Thu Feb 18 13:27:35 2016 +0000
+++ b/OSC.lib	Thu Feb 25 11:22:24 2016 +0000
@@ -1,1 +1,1 @@
-http://developer.mbed.org/users/casiotone401/code/OSC/#a47004fb44f5
+http://developer.mbed.org/users/casiotone401/code/OSC/#498455cded21
--- a/OSCReceiver.lib	Thu Feb 18 13:27:35 2016 +0000
+++ b/OSCReceiver.lib	Thu Feb 25 11:22:24 2016 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/casiotone401/code/OSCReceiver/#6dab18e1eb37
+http://mbed.org/users/casiotone401/code/OSCReceiver/#ff3e4aee583e
--- a/OSCtoCV.lib	Thu Feb 18 13:27:35 2016 +0000
+++ b/OSCtoCV.lib	Thu Feb 25 11:22:24 2016 +0000
@@ -1,1 +1,1 @@
-https://developer.mbed.org/users/casiotone401/code/OSCtoCV/#abe335652add
+https://developer.mbed.org/users/casiotone401/code/OSCtoCV/#7fb15b1b5459
--- a/main.cpp	Thu Feb 18 13:27:35 2016 +0000
+++ b/main.cpp	Thu Feb 25 11:22:24 2016 +0000
@@ -41,7 +41,6 @@
 #include "OSCtoCV_Random.h"
 #include "OSCtoCV_LFO.h"
 
-
 #include <stdlib.h>
 #include <ctype.h>
 #include <math.h>
@@ -68,8 +67,10 @@
 void CalibrationCV(void);
 inline void SetCV(void);
 inline int CheckBPM(void);
+inline float CheckGlide(void);
+inline float CheckDuration(void);
 void CheckModeSW(void);
-inline void LCD();
+inline void UpdateLCD();
 void WriteCustomChar(unsigned char, unsigned char*);
 int  SetupEthNetIf(void);
 inline void onUDPSocketEvent(UDPSocketEvent);
@@ -99,17 +100,13 @@
  
 int main() 
 { 
-    float pot, _pot;
-    float duration, _duration = 0.6;
+    float duration;
     int bpm;
         
-    InitOSCCV();     
-    
-    gCtrl[3] = _pot = pot = gMode = 0;
-
+    InitOSCCV();
 
 // Init LCD        
-    LCD();
+    UpdateLCD();
     
     gLCD.locate( 0, 1 );
     gLCD.printf("12345678 G>>%3.2f", gGlide);
@@ -117,41 +114,13 @@
 // Main loop
     while (1) 
     {
-        LCD(); // Check Text LCD Mode Status
-        
-        pot = gAIN.read();  // Update glide value
+        UpdateLCD(); // Check Text LCD Mode Status
         
-        if (!pot) // when glide pot value == 0 
-        {         // use gCtrl[3] value (MODE_OSC)
-            if (abs(gCtrl[3] - _pot) > 0.01f)
-            {
-                _pot = gGlide = gCtrl[3];
-            
-                gLCD.locate( 9, 1 );
-                gLCD.printf("G>>%3.2f", gGlide);
-            }
-        
-        } else if (abs(pot - _pot) > 0.01f) {
-            
-            _pot = gGlide =  gAIN.read();
-            
-            gLCD.locate( 9, 1 );
-            gLCD.printf("G>>%3.2f", gGlide);
-        }
+        CheckGlide(); // check glide value
         
         bpm = CheckBPM(); // check current BPM
         
-        duration = gCtrl[6];
-        
-        if (_duration != duration) // check current gate duration
-        {
-            sendMes.setTopAddress("/ctrl7");
-            sendMes.setArgs("f", gCtrl[6]);
-    
-            osc.sendOsc(&sendMes);
-            
-            _duration = duration;
-        }
+        duration = CheckDuration(); // check current duration(Gate length)
         
         switch (gMode)
         {               
@@ -166,11 +135,11 @@
                 
                 if (gCtrlSW[3])
                 {   // euclid sequencer auto offset
-                    ShiftCVSeq(EuclideanSeq(GateSeq(bpm, N16TH, SUBGATE, (duration * 12), NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0], GATESOUT_OFF, true), gCtrlSW[0], CV_CHANNEL8);
+                    ShiftCVSeq(EuclideanSeq(GateSeq(bpm, N16TH, SUBGATE, (duration * 12.0f), NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0], GATESOUT_OFF, true), gCtrlSW[0], CV_CHANNEL8);
                 
                 } else {
                     
-                    ShiftCVSeq(BeatsSeq(GateSeq(bpm, N16TH, SUBGATE, (duration * 8), NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0], GATESOUT_OFF), gCtrlSW[0], CV_CHANNEL8);
+                    ShiftCVSeq(BeatsSeq(GateSeq(bpm, N16TH, SUBGATE, (duration * 8.0f), NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0], GATESOUT_OFF), gCtrlSW[0], CV_CHANNEL8);
                 }
                 break;
                 
@@ -181,11 +150,11 @@
                 
                 if (gCtrlSW[3])
                 {   // euclid sequencer auto offset
-                    M185Seq(EuclideanSeq(GateSeq(bpm, N16TH, SUBGATE, (duration * 12), NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0], GATESOUT_OFF, true), gCtrlSW[0], CV_CHANNEL8);
+                    M185Seq(EuclideanSeq(GateSeq(bpm, N16TH, SUBGATE, (duration * 12.0f), NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0], GATESOUT_OFF, true), gCtrlSW[0], CV_CHANNEL8);
                     
                 } else {
                     
-                    M185Seq(BeatsSeq(GateSeq(bpm, N16TH, SUBGATE, (duration * 8), NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0], GATESOUT_OFF), gCtrlSW[0], CV_CHANNEL8);
+                    M185Seq(BeatsSeq(GateSeq(bpm, N16TH, SUBGATE, (duration * 8.0f), NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0], GATESOUT_OFF), gCtrlSW[0], CV_CHANNEL8);
                 }
                 break;
             
@@ -195,23 +164,23 @@
                 
                 if (gCtrlSW[3])
                 {   // euclid sequencer auto offset
-                    PolyCVSeq(EuclideanSeq(GateSeq(bpm, N16TH, SUBGATE, (duration * 12), NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0], GATESOUT_OFF, true), gCtrlSW[0]);
+                    PolyCVSeq(EuclideanSeq(GateSeq(bpm, N16TH, SUBGATE, (duration * 12.0f), NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0], GATESOUT_OFF, true), gCtrlSW[0]);
                     
                 } else {
                     
-                    PolyCVSeq(BeatsSeq(GateSeq(bpm, N16TH, SUBGATE, (duration * 8), NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0], GATESOUT_OFF), gCtrlSW[0]);
+                    PolyCVSeq(BeatsSeq(GateSeq(bpm, N16TH, SUBGATE, (duration * 8.0f), NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0], GATESOUT_OFF), gCtrlSW[0]);
                 }
                 break;
                     
             case MODE_EUC: // Euclidean Sequencer mode
             
-                ShiftCVSeq(GateSeq(bpm, N1ST, SUBGATE, (duration * 5), NON_INVERT, GATESOUT_OFF, SYNC_OFF), gCtrlSW[0], CV_CHANNEL8); 
+                ShiftCVSeq(GateSeq(bpm, N1ST, SUBGATE, (duration * 5.0f), NON_INVERT, GATESOUT_OFF, SYNC_OFF), gCtrlSW[0], CV_CHANNEL8); 
                 EuclideanSeq(GateSeq(bpm, N16TH, GATE1, 3, NON_INVERT, GATESOUT_OFF, SYNC_OFF), gCtrlSW[0], GATESOUT_ON, false);
                 break;
             
             case MODE_RND: // Random CV Generator mode
         
-                RandomCVGenerator(GateSeq(bpm, N32TH, GATE1, (duration * 5), NON_INVERT, GATESOUT_OFF, SYNC_ON));
+                RandomCVGenerator(GateSeq(bpm, N32TH, GATE1, (duration * 5.0f), NON_INVERT, GATESOUT_OFF, SYNC_ON));
                 break;
 
             case MODE_LFO: // Stepped LFO mode
@@ -241,7 +210,6 @@
 
 void InitOSCCV()
 {
-    int i;
     
 // Set System Frequency 120Mhz 
     setSystemFrequency(0x3, 0x1, 15, 1);
@@ -275,39 +243,33 @@
     gSPI.frequency(SPI_RATE);
     
     UpdateCV(CLR, 0, 0);        // Ignore CLR Pin
-     
-// Init BPM
-    gCtrl[0] = 0.398f;
-
-// Init Sequencer Data
-    for (i = 0; i < 16; ++i) 
-    {
-        gSeq_cv[i] = (calibMap1[69] * SCALING_N);
-    }
-    
-    for (i = 0; i < 8; ++i) 
-    {
-        g185_cv[i] = (calibMap1[69] * SCALING_N);
-        gBeatsLevel[i] = gBeatsDecay[i] = 1;
-    }
-    
-// Init Sequencer Reset Count    
-    gCtrl[4] = gCtrl[5] = gCtrl[7] = 1;
-
-// Init Sequencer Gate Length    
-    gCtrl[6] = 0.6;
 
 // Init Euclidean Sequencer    
     InitEuclideanSeq();    
     
 // Init Glide value
     gGlide = gAIN.read();
-    
+ 
+// Init Mode
+    gMode = MODE_CLB;
+
+// Init Sequencer Data
+    for (int i = 0; i < 16; ++i) 
+    {
+        if (i < 8) 
+        {
+            g185_cv[i] = (calibMap1[69] * SCALING_N);
+            gBeatsLevel[i] = gBeatsDecay[i] = 1;    
+        }
+        
+        gSeq_cv[i] = (calibMap1[69] * SCALING_N);
+    }
+
 // Set OSC message for sending 
     sendMes.setIp(touchOSCAddress); 
     sendMes.setPort(touchOSCPort);
     
-    gSW.attach(&CheckModeSW,IRQ_RISE, 20);     // InterruptIn rising edge(ModeSW)
+    gSW.attach(&CheckModeSW, IRQ_RISE, 20);     // InterruptIn rising edge(ModeSW)
     wait(0.5);
     
     gPoller.attach_us(&NetPoll, POLLING_INTERVAL);  // Ticker Polling
@@ -322,19 +284,11 @@
     static int ch;
     unsigned int cv;
 
-    switch (gMode) 
-        {
-            case MODE_CLB:
-                
-                cv = (unsigned int)(calibMap1[69] * SCALING_N);  // A880.0Hz
+    cv = (unsigned int)(calibMap1[69] * SCALING_N);  // A880.0Hz
                 
-                gSUBGATE = gGATES[0] = gGATES[1] = gGATES[2] = gGATES[3] = true;
-                
-                UpdateCV(WRITE_UPDATE_N, ch, &cv);
-                
-                break;
-        }
-
+    gSUBGATE = gGATES[0] = gGATES[1] = gGATES[2] = gGATES[3] = true;
+    
+    UpdateCV(WRITE_UPDATE_N, ch, &cv);
     UpdateCVMeter(ch, &cv);
     
     ++ch;
@@ -461,7 +415,7 @@
 
         bpm = (gCtrl[0] * 240 + 5);
 
-        if (abs(bpm - _bpm) > 1)
+        if (bpm != _bpm)
         {
             _bpm = bpm;
             
@@ -469,11 +423,8 @@
             sendMes.setArgs("i", bpm);
             osc.sendOsc(&sendMes);
             
-            osc.sendOsc(&sendMes);
-            
             sendMes.setTopAddress("/ctrl1");
             sendMes.setArgs("f", gCtrl[0]);
-    
             osc.sendOsc(&sendMes);
         }
     }
@@ -482,6 +433,56 @@
 }
 
 //-------------------------------------------------------------
+// Check Glide Value
+
+inline float CheckGlide()
+{
+    static float _pot;
+    float pot = 0;
+    
+    pot = gAIN.read();  // Update glide value
+        
+    if (!pot) // when (glide pot value == 0) && MODE_OSC
+    {         // use gCtrl[3] value
+        if (abs(gCtrl[3] - _pot) > 0.01f)
+        {
+            _pot = gGlide = gCtrl[3];
+        
+            gLCD.locate( 9, 1 );
+            gLCD.printf("G>>%3.2f", gGlide);
+        }
+    
+    } else if (abs(pot - _pot) > 0.01f) {
+        
+        _pot = gGlide = pot;
+        
+        gLCD.locate( 9, 1 );
+        gLCD.printf("G>>%3.2f", gGlide);
+    }
+    
+    return pot;
+}
+
+//-------------------------------------------------------------
+// Check Duration Value
+
+inline float CheckDuration()
+{
+    static float _duration = 0.6f;
+    
+    if (_duration != gCtrl[6]) // check current gate duration
+    {
+        sendMes.setTopAddress("/ctrl7");
+        sendMes.setArgs("f", gCtrl[6]);
+        osc.sendOsc(&sendMes);
+        
+        _duration = gCtrl[6];
+    }
+    
+    return gCtrl[6];    
+}
+
+//-------------------------------------------------------------
 // Check Mode SW
 
 void CheckModeSW()
@@ -513,7 +514,7 @@
 //-------------------------------------------------------------
 // Print LCD Mode Status
 
-inline void LCD()
+inline void UpdateLCD()
 {
     static int _mode = -1;
     static int _qmode = -1;
@@ -755,8 +756,8 @@
 {
     static union OSCarg msg[10];
     static char buf[1024] = {0};
-    static int recvlen;
-    static int num, numrow, len, offset;
+    int recvlen;
+    int num, numrow, len, offset;
     int messagepos = 0;
     bool bundleflag = false;
     
@@ -816,14 +817,12 @@
                 // address pattern SYNC & GATE (Type Tag int, float)
                 if (!strncmp(msg[0].address + (len - offset) - 4, "sync", 4)) 
                 { 
-                    if (msg[2].i != 0) gCLOCKOUT = true;
-                    else              gCLOCKOUT = false;
+                    gCLOCKOUT = (msg[2].i != 0) ? true: false;
                     continue;
 
                 } else if (!strncmp(msg[0].address + (len - offset) - 4, "gate", 4) && (num != -1)) {
                     if (num > 3) continue;
-                    if (msg[2].i != 0) gGATES[num] = true;
-                    else              gGATES[num] = false;
+                    gGATES[num] = (msg[2].i != 0) ? true: false;
                     continue;
                     // (touchOSC Control push, toggle)
                 } else if (!strncmp(msg[0].address + (len - offset) - 5, "fader", 5) && (num != -1)) {
@@ -854,8 +853,7 @@
 
                 } else if (!strncmp(msg[0].address + (len - offset) - 6, "ctrlsw", 6) && (num != -1)) {
                     if (num > 7) continue;
-                    if (msg[2].i != 0) gCtrlSW[num] = true;
-                    else              gCtrlSW[num] = false;
+                    gCtrlSW[num] = (msg[2].i != 0) ? true: false;
                     continue;
 
                 } else if (!strncmp(msg[0].address + (len - offset) - 4, "ctrl", 4) && (num != -1)) {
@@ -1007,8 +1005,7 @@
 
                     } else if (!strncmp(msg[0].address + (len - offset) - 2, "sw", 2) && (num != -1)) {
                         if (num > 1) continue;
-                        if (msg[2].i != 0) gArdSW[num] = true;
-                        else               gArdSW[num] = false;                                       
+                        gArdSW[num] = (msg[2].i != 0) ? true: false;                              
                         continue;
 
                     }