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

Revision:
17:55e5136790a6
Parent:
16:1196b8c87bb7
Child:
19:467f98c51e2d
--- a/main.cpp	Fri Aug 07 12:47:35 2015 +0000
+++ b/main.cpp	Sat Jan 02 23:45:04 2016 +0000
@@ -1,7 +1,6 @@
 //-------------------------------------------------------------
-//                  OSCtoCV Converter
-//   Schematic, touchOSC template & VST Plug-in 
-//   http://gtbts.tumblr.com/post/125663817741/osc-to-cv-converter-ver2-mbed-osctocv
+//                  TI DAC8568  OSCtoCV Converter ver.2
+//  http://gtbts.tumblr.com/post/125663817741/osc-to-cv-converter-ver2-mbed-osctocv
 //
 //   DAC8568 16bit Octal DAC http://www.ti.com/product/dac8568
 //
@@ -16,9 +15,6 @@
 //   http://www.eleclabo.com/denshi/device/lcd1602/gcram.html
 //   Dirk-Willem van Gulik's BonjourLib
 //   http://mbed.org/users/dirkx/code/BonjourLib/file/bb6472f455e8/services/mDNS
-//   ADDAC System & sneak-thief's Euclidean Polyrhythm generator
-//   https://github.com/addacsystem/ADDAC-Library
-//   https://www.muffwiggler.com/forum/viewtopic.php?p=1451228#1451228
 //
 // Released under the MIT License: http://mbed.org/license/mit
 //-------------------------------------------------------------
@@ -28,8 +24,10 @@
 
 #include "mbed.h"
 #include "FastIO.h"
+//#include "FastAnalogIn.h"
 #include "DebouncedInterrupt.h"
 #include "BurstSPI.h"
+//#include "BufferedSoftSerial.h"
 #include "TextLCD.h"       //edit "writeCommand" "writeData" protected -> public
 #include "EthernetNetIf.h"
 #include "HTTPServer.h"
@@ -79,7 +77,7 @@
 #define SCALING_N           32256.0f
 #define INPUT_PORT          12345    // Input Port Number
 
-#define POLLING_INTERVAL    20       // Polling Interval (us)
+#define POLLING_INTERVAL    21       // Polling Interval (us)
 
 //-------------------------------------------------------------
 // DAC8568 Control Bits (See datasheet)
@@ -189,6 +187,7 @@
 int  SetupEthNetIf(void);
 inline size_t strlength(const char *);
 inline void onUDPSocketEvent(UDPSocketEvent);
+inline void ReceiveArduinoOSC(void);
 void EuclideanSeq(int, bool, bool);
 unsigned int Euclid(int, int, int);
 inline int BitRead(uint16_t, int);
@@ -367,6 +366,7 @@
 gCtrlSW[1] /ctrlsw2 Euclidean Sequencer reset
 gCtrlSW[2] /ctrlsw3 Sequencer Loop
 gCtrlSW[3] /ctrlsw4 Euclid Seq ON
+gCtrlSW[4] /ctrlsw5 ASR Analog Mode
 
 float gPulseCount[8] = {0};  M185 Pulse Count
 float gGateMode[8] = {0};    M185 Gate Mode
@@ -386,6 +386,7 @@
 float gPulseCount[8] = {0};
 float gGateMode[16] = {0};
 float gSlide[16];
+float gAccent[16] = {0};
 
 // Euclidean SEQ Variables
 float gEucA[6], gEucB[6];
@@ -428,6 +429,7 @@
 DebouncedInterrupt  gSW(p30);   // Mode SW
 
 // Serial for Arduino
+//BufferedSoftSerial ardSerial(p25, p26);
 MIDI midi(p28, p27);
 
 Timer        gTimer;     // Timer
@@ -443,7 +445,7 @@
                      IpAddr(192,168,1,1)
                     );
 */
-                     
+
 UDPSocket       gUdp;
 
 // touchOSC Address
@@ -529,6 +531,8 @@
             gLCD.printf("G>>%3.2f", gGlide);
         }
         
+        bpm = CheckBPM(); // check current BPM
+        
         switch (gMode)
         {               
             case MODE_OSC: // OSCtoCV mode
@@ -538,8 +542,7 @@
                 
             case MODE_SEQ: // Shift Sequencer mode
             
-                bpm = CheckBPM();
-
+                //ReceiveArduinoOSC();
                 ShiftCVSeq(GateSeq(bpm, N16TH, GATE1, 3, NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0]);
                 GateSeq(bpm, N8TH, GATE2, 3, NON_INVERT, GATESOUT_ON, SYNC_OFF);
                 
@@ -551,8 +554,6 @@
                 
             case MODE_185: // M185 Sequencer mode
             
-                bpm = CheckBPM();
-            
                 M185Seq(GateSeq(bpm, N16TH, GATE1, 3, NON_INVERT, GATESOUT_OFF, SYNC_ON), gCtrlSW[0]);
                 GateSeq(bpm, N8TH, GATE2, 3, NON_INVERT, GATESOUT_ON, SYNC_OFF);
                 
@@ -564,8 +565,6 @@
                 
             case MODE_EUC: // Euclidean Sequencer mode
             
-                bpm = CheckBPM();
-                
                 ShiftCVSeq(GateSeq(bpm, N1ST, SUBGATE, 3, NON_INVERT, GATESOUT_OFF, SYNC_OFF), gCtrlSW[0]); 
                 EuclideanSeq(GateSeq(bpm, N16TH, GATE1, 1, NON_INVERT, GATESOUT_OFF, SYNC_OFF), gCtrlSW[0], GATESOUT_ON);
                 break;
@@ -654,9 +653,10 @@
     sendMes.setPort(touchOSCPort);
     
     gSW.attach(&CheckModeSW,IRQ_RISE, 30);     // InterruptIn rising edge(ModeSW)
-    gPoller.attach_us(&NetPoll, POLLING_INTERVAL);  // Ticker Polling
+    wait(0.5);
     
-    wait(0.4);
+    gPoller.attach_us(&NetPoll, POLLING_INTERVAL);  // Ticker Polling
+    wait(1.5);
 
     // Begin Serial for Arduino
     //ardSerial.baud(115200);
@@ -771,10 +771,6 @@
             case Lin:
                 
                 glidecv[ch] = glidecv[ch] * gGlide + gOSC_cv[ch] * (1.0f - gGlide);
-                cv = (unsigned int)glidecv[ch];
-                    
-                UpdateCV(WRITE_UPDATE_N, ch, &cv);
-
                 break;
                     
             case Chr:
@@ -782,9 +778,6 @@
                 qcv = calibMap1[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES1 - 1))];
                     
                 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
-                cv = (unsigned int)glidecv[ch];
-                        
-                UpdateCV(WRITE_UPDATE_N, ch, &cv);
 
                 break;
                 
@@ -793,9 +786,6 @@
                 qcv = calibMap2[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES2 - 1))];
 
                 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
-                cv = (unsigned int)glidecv[ch];
-                                        
-                UpdateCV(WRITE_UPDATE_N, ch, &cv);
 
                 break;
             
@@ -804,9 +794,6 @@
                 qcv = calibMap3[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES3 - 1))];
                     
                 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
-                cv = (unsigned int)glidecv[ch];
-                        
-                UpdateCV(WRITE_UPDATE_N, ch, &cv);
 
                 break;
                 
@@ -815,9 +802,6 @@
                 qcv = calibMap4[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES4 - 1))];
 
                 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
-                cv = (unsigned int)glidecv[ch];
-                        
-                UpdateCV(WRITE_UPDATE_N, ch, &cv);
 
                 break;
                     
@@ -826,9 +810,6 @@
                 qcv = calibMap5[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES5 - 1))];
 
                 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
-                cv = (unsigned int)glidecv[ch];
-                        
-                UpdateCV(WRITE_UPDATE_N, ch, &cv);
 
                 break;
         
@@ -837,9 +818,6 @@
                 qcv = calibMap6[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES6 - 1))];
 
                 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
-                cv = (unsigned int)glidecv[ch];
-                        
-                UpdateCV(WRITE_UPDATE_N, ch, &cv);
 
                 break;
                 
@@ -848,9 +826,6 @@
                 qcv = calibMap7[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES7 - 1))];
 
                 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
-                cv = (unsigned int)glidecv[ch];
-                        
-                UpdateCV(WRITE_UPDATE_N, ch, &cv);
 
                 break;
                 
@@ -859,25 +834,26 @@
                 qcv = calibMap8[(unsigned int)MapFloat(gOSC_cv[ch], 0, SCALING_N, 0, (QUAN_RES8 - 1))];
 
                 glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
-                cv = (unsigned int)glidecv[ch];
-                        
-                UpdateCV(WRITE_UPDATE_N, ch, &cv);
-
+                
                 break;
         }
-
-        if (mcount == 0x1F) 
-        {
-            UpdateCVMeter(ch, &cv);
-        }
+        
+    cv = (unsigned int)glidecv[ch];
+            
+    UpdateCV(WRITE_UPDATE_N, ch, &cv);
 
-        ++ch;
-        
-        if (ch &= 0x07)
-        {
-            ++mcount;
-            mcount &= 0x3F;
-        }
+    if (mcount == 0x1F) 
+    {
+        UpdateCVMeter(ch, &cv);
+    }
+
+    ++ch;
+    
+    if (ch &= 0x07)
+    {
+        ++mcount;
+        mcount &= 0x3F;
+    }
 }
 
 //-------------------------------------------------------------
@@ -897,6 +873,8 @@
     static float glidecv[8], shiftcv[8];
     unsigned int cv;
     static float qcv;
+    static int jitterCount;
+    static int jitter;
         
     qmode = (gCtrl[1] * (SCALE_NUM - 1.0f));  // Sequencer Quantize Mode (gCtrl[1])
     amode = SCALE_AOUT * qmode;
@@ -908,11 +886,7 @@
             case Lin:
 
                 glidecv[0] = glidecv[0] * gSlide[currentStep] + gSeq_cv[currentStep] * (1.0f - gSlide[currentStep]);
-
-                cv = (unsigned int)glidecv[0];
-
-                UpdateCV(WRITE_UPDATE_N, 0, &cv);
-
+                
                 break;
     
             case Chr:
@@ -920,10 +894,7 @@
                 qcv = calibMap1[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES1 - 1))];
     
                 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
-                cv = (unsigned int)glidecv[0];
-
-                UpdateCV(WRITE_UPDATE_N, 0, &cv);
-
+                
                 break;
 
             case Maj:
@@ -931,9 +902,6 @@
                 qcv = calibMap2[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES2 - 1))];
     
                 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
-                cv = (unsigned int)glidecv[0];
-
-                UpdateCV(WRITE_UPDATE_N, 0, &cv);
 
                 break;
 
@@ -942,9 +910,6 @@
                 qcv = calibMap3[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES3 - 1))];
     
                 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
-                cv = (unsigned int)glidecv[0];
-
-                UpdateCV(WRITE_UPDATE_N, 0, &cv);
 
                 break;
     
@@ -953,9 +918,6 @@
                 qcv = calibMap4[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES4 - 1))];
             
                 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
-                cv = (unsigned int)glidecv[0];
-
-                UpdateCV(WRITE_UPDATE_N, 0, &cv);
 
                 break;
             
@@ -964,9 +926,6 @@
                 qcv = calibMap5[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES5 - 1))];
 
                 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
-                cv = (unsigned int)glidecv[0];
-
-                UpdateCV(WRITE_UPDATE_N, 0, &cv);
 
                 break;
 
@@ -975,10 +934,7 @@
                 qcv = calibMap6[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES6 - 1))];
 
                 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
-                cv = (unsigned int)glidecv[0];
-
-                UpdateCV(WRITE_UPDATE_N, 0, &cv);
-
+                
                 break;
 
             case S5th:
@@ -986,10 +942,7 @@
                 qcv = calibMap7[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES7 - 1))];
 
                 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
-                cv = (unsigned int)glidecv[0];
-
-                UpdateCV(WRITE_UPDATE_N, 0, &cv);
-
+                
                 break;
 
             case Wht:
@@ -997,17 +950,27 @@
                 qcv = calibMap8[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES8 - 1))];
     
                 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
-                cv = (unsigned int)glidecv[0];
-
-                UpdateCV(WRITE_UPDATE_N, 0, &cv);
 
                 break;
         }
     
+    if (!gCtrlSW[4]) 
+    { 
+        jitter = 0;
+    
+    } else if (gCtrlSW[4] && jitterCount % 64 == 0) { // ASR Analog Mode
+        
+        jitter = (rand() % 100 - 50); 
+    }
+    
+    cv = (unsigned int)(glidecv[0] + jitter);
+    
+    UpdateCV(WRITE_UPDATE_N, 0, &cv);
+    
     for (i = 1; i < 8; ++i)
     {
         glidecv[i] = glidecv[i] * gSlide[currentStep] + shiftcv[i] * (1.0f - gSlide[currentStep]);
-        cv = (unsigned int)glidecv[i];
+        cv = (unsigned int)(glidecv[i] + jitter);
 
         UpdateCV(WRITE_UPDATE_N, i, &cv);
     }   
@@ -1120,11 +1083,23 @@
             gGATES[0] = true;
         }
         
+        if (gAccent[currentStep]) // accent
+        {
+            gGATES[2] = gGATES[3] = true;
+        
+        } else {
+            
+            gGATES[2] = gGATES[3] = false;
+        }
+        
         stepFoward = false;
     }
     
     ++ch;
     ch &= 0x0F;
+    
+    ++jitterCount;
+    jitterCount &= 0x1FF;
 }
 
 //-------------------------------------------------------------
@@ -1157,11 +1132,7 @@
             case Lin:
 
                 glidecv[0] = glidecv[0] * gSlide[currentStep] + gSeq_cv[currentStep] * (1.0f - gSlide[currentStep]);
-
-                cv = (unsigned int)glidecv[0];
-
-                UpdateCV(WRITE_UPDATE_N, 0, &cv);
-
+                
                 break;
     
             case Chr:
@@ -1169,9 +1140,6 @@
                 qcv = calibMap1[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES1 - 1))];
     
                 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
-                cv = (unsigned int)glidecv[0];
-
-                UpdateCV(WRITE_UPDATE_N, 0, &cv);
 
                 break;
 
@@ -1180,10 +1148,7 @@
                 qcv = calibMap2[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES2 - 1))];
     
                 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
-                cv = (unsigned int)glidecv[0];
-
-                UpdateCV(WRITE_UPDATE_N, 0, &cv);
-
+                
                 break;
 
             case M7:
@@ -1191,10 +1156,7 @@
                 qcv = calibMap3[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES3 - 1))];
     
                 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
-                cv = (unsigned int)glidecv[0];
-
-                UpdateCV(WRITE_UPDATE_N, 0, &cv);
-
+                
                 break;
     
             case Min7:
@@ -1202,10 +1164,7 @@
                 qcv = calibMap4[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES4 - 1))];
             
                 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
-                cv = (unsigned int)glidecv[0];
-
-                UpdateCV(WRITE_UPDATE_N, 0, &cv);
-
+                
                 break;
             
             case Dor:
@@ -1213,9 +1172,6 @@
                 qcv = calibMap5[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES5 - 1))];
 
                 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
-                cv = (unsigned int)glidecv[0];
-
-                UpdateCV(WRITE_UPDATE_N, 0, &cv);
 
                 break;
 
@@ -1224,10 +1180,7 @@
                 qcv = calibMap6[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES6 - 1))];
 
                 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
-                cv = (unsigned int)glidecv[0];
-
-                UpdateCV(WRITE_UPDATE_N, 0, &cv);
-
+                
                 break;
 
             case S5th:
@@ -1235,9 +1188,6 @@
                 qcv = calibMap7[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES7 - 1))];
 
                 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
-                cv = (unsigned int)glidecv[0];
-
-                UpdateCV(WRITE_UPDATE_N, 0, &cv);
 
                 break;
 
@@ -1246,13 +1196,14 @@
                 qcv = calibMap8[(unsigned int)MapFloat(gSeq_cv[currentStep], 0, SCALING_N, 0, (QUAN_RES8 - 1))];
     
                 glidecv[0] = glidecv[0] * gSlide[currentStep] + (qcv * SCALING_N) * (1.0f - gSlide[currentStep]);
-                cv = (unsigned int)glidecv[0];
-
-                UpdateCV(WRITE_UPDATE_N, 0, &cv);
 
                 break;
         }
-    
+        
+    cv = (unsigned int)glidecv[0];
+
+    UpdateCV(WRITE_UPDATE_N, 0, &cv);
+
     for (i = 1; i < 8; ++i)
     {
         glidecv[i] = glidecv[i] * gSlide[currentStep] + shiftcv[i] * (1.0f - gSlide[currentStep]);
@@ -1435,7 +1386,7 @@
                 break;
         }
 
-        osc.sendOsc(&sendMes);
+    osc.sendOsc(&sendMes);
 }
 
 //-------------------------------------------------------------
@@ -1738,7 +1689,7 @@
     
     qmode = (gCtrl[1] * (SCALE_NUM - 1));
     
-    if ((_qmode != qmode) && gMode)
+    if (_qmode != qmode)
     {
         sendMes.setTopAddress("/scale");
         
@@ -1969,72 +1920,96 @@
                 }
         
             // address pattern SYNC & GATE (Type Tag int, float)
-                if (!strncmp(msg[0].address+(len-offset)-4, "sync", 4)) 
+                if (!strncmp(msg[0].address + (len - offset) - 4, "sync", 4)) 
                 { 
                     if (msg[2].i != 0) gCLOCKOUT = true;
                     else              gCLOCKOUT = false;
                     continue;
 
-                } else if (!strncmp(msg[0].address+(len-offset)-4, "gate", 4) && (num != -1)) {
+                } 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;
                     continue;
             // (touchOSC Control push, toggle)
-                } else if (!strncmp(msg[0].address+(len-offset)-5, "fader", 5) && (num != -1)) {
+                } else if (!strncmp(msg[0].address + (len - offset) - 5, "fader", 5) && (num != -1)) {
                     if (num > 7) continue;                                              
                     gOSC_cv[num] = msg[2].f * (SCALING_N);
                     continue;
 
-                } else if (!strncmp(msg[0].address+(len-offset)-9, "multixy1/", 9) && (num != -1)) {
+                } else if (!strncmp(msg[0].address + (len - offset) - 9, "multixy1/", 9) && (num != -1)) {
                     if (num > 7) continue;
                     if (msg[1].typeTag[1] == 'f') gOSC_cv[num] = msg[2].f * (SCALING_N);
                     if (msg[1].typeTag[1] == 'f') gOSC_cv[++num] = msg[3].f * (SCALING_N);
                     continue;
     
-                } else if (!strncmp(msg[0].address+(len-offset)-12, "multifader1/", 12) && (num != -1)) {
+                } else if (!strncmp(msg[0].address + (len - offset) -12, "multifader1/", 12) && (num != -1)) {
                     if (num > 7) continue;
                     if (msg[1].typeTag[1] == 'f') gOSC_cv[num] = msg[2].f * (SCALING_N);
                     continue;
                     
-                } else if (!strncmp(msg[0].address+(len-offset)-10, "sequencer/", 10) && (num != -1)) {
-                    
+                } else if (!strncmp(msg[0].address + (len - offset) -10, "sequencer/", 10) && (num != -1)) {
                     if (num > 15) continue;
                     gSeq_cv[num] = msg[2].f * (SCALING_N);
                     continue;
                             
-                } else if (!strncmp(msg[0].address+(len-offset)-6, "ctrlsw", 6) && (num != -1)) {
+                } 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;
                     continue;
                                                 
-                } else if (!strncmp(msg[0].address+(len-offset)-4, "ctrl", 4) && (num != -1)) {
+                } else if (!strncmp(msg[0].address + (len - offset) - 4, "ctrl", 4) && (num != -1)) {
                     if (num > 7) continue;                                             
                     gCtrl[num] = msg[2].f;
                     continue;
                     
-                } else if (!strncmp(msg[0].address+(len-offset)-9, "pulsecnt/", 9) && (num != -1)) {
+                } else if (!strncmp(msg[0].address + (len - offset) - 9, "pulsecnt/", 9) && (num != -1)) {
                     if (num > 7) continue;
                     gPulseCount[num] = msg[2].f;
                     continue;
                     
-                } else if (!strncmp(msg[0].address+(len-offset)-9, "gatemode/", 9) && (num != -1)) {
+                } else if (!strncmp(msg[0].address + (len - offset) - 9, "gatemode/", 9) && (num != -1)) {
                     if (num > 15) continue;
                     gGateMode[num] = msg[2].f;
                     continue;
                     
-                } else if (!strncmp(msg[0].address+(len-offset)-6, "slide/", 6) && (num != -1)) {
+                } else if (!strncmp(msg[0].address + (len - offset) - 6, "slide/", 6) && (num != -1)) {
                     if (num > 15) continue;
                     gSlide[num] = msg[2].f;
                     continue;
                     
-                } else if (!strncmp(msg[0].address+(len-offset)-4, "euca", 4) && (num != -1)) {
+                } else if (!strncmp(msg[0].address + (len - offset-2) - 7, "accent/", 7) && (num != -1)) {
+                    
+                    if (isdigit(msg[0].address[len-3])) 
+                    {       
+                        num = msg[0].address[len-3] - '0' - 1;
+                    }
+                    
+                    gAccent[num] = msg[2].i;
+                    continue;
+                    
+                } else if (!strncmp(msg[0].address + (len - offset-3) - 7, "accent/", 7) && (num != -1)) {
+                    
+                    if (isdigit(msg[0].address[len-3])) 
+                    {       
+                        num = msg[0].address[len-3] - '0' - 1;
+                        
+                        if (isdigit(msg[0].address[len-4])) 
+                        {
+                            num += 10;
+                        }
+                    }
+                    
+                    gAccent[num] = msg[2].i;
+                    continue;
+                    
+                } else if (!strncmp(msg[0].address + (len - offset) - 4, "euca", 4) && (num != -1)) {
                     if (num > 5) continue;                                             
                     gEucA[num] = msg[2].f;
                     continue;
                     
-                } else if (!strncmp(msg[0].address+(len-offset)-4, "eucb", 4) && (num != -1)) {
+                } else if (!strncmp(msg[0].address + (len - offset) - 4, "eucb", 4) && (num != -1)) {
                     if (num > 5) continue;                                             
                     gEucB[num] = msg[2].f;
                     continue;
@@ -2048,6 +2023,88 @@
 }
 
 //-------------------------------------------------------------
+// Handller receive Arduino OSC Serial Packet
+
+inline void ReceiveArduinoOSC()
+{
+    static union OSCarg msg[10];
+    static char buf[512] = {0};
+    static int recvlen = 0;
+    static int num, len;
+    //int i = 0;
+    int messagepos = 0;
+    bool bundleflag = false;
+
+    //pc.printf("%s", buf);
+/*
+    while (ardSerial.readable())
+    {
+        buf[i] = ardSerial.getc();
+        
+        ++i;
+        ++recvlen;
+        
+        if (!bundleflag && buf[i] == '#') // #bundle
+        {
+            messagepos += (16 + i);     // skip #bundle & timetag
+            recvlen -= (16 + i);
+
+            bundleflag = true;
+        }
+    }
+*/
+    do {    
+            if (bundleflag)
+            {
+                messagepos += 4;
+                recvlen -= 4;
+    
+                if (recvlen <= 2)
+                {
+                    bundleflag = false;
+                    break;
+                }
+            }
+
+            if (getOSCmsg(buf + messagepos, msg) == -1)  continue;
+
+            len = strlength(msg[0].address);
+            
+
+            if (isdigit(msg[0].address[len-1])) 
+            {       
+                num = msg[0].address[len-1] - '0' - 1;
+
+            } else {
+
+                num = -1;
+            }
+            
+            if (!strncmp(msg[0].address+(len-1)-2, "sw", 2)) 
+            { 
+                if (num > 3) continue;
+                if (msg[2].i != 0) gArdSW[num] = true;
+                else              gArdSW[num] = false;
+                continue;
+
+            } else if (!strncmp(msg[0].address+(len-1)-3, "pot", 3) && (num != -1)) {
+                if (num > 3 && (msg[2].i < 1024)) continue;                                              
+                gArdCtrl[num] = msg[2].i;
+                continue; 
+
+            } else if (!strncmp(msg[0].address+(len-1)-2, "ch", 2) && (num != -1)) {
+                if (num > 3 && (msg[2].i < 4096)) continue;                                              
+                gArdCV[num] = msg[2].i;
+                continue; 
+
+            } else {
+                continue;
+            }
+            
+        } while (bundleflag);
+}
+
+//-------------------------------------------------------------
 // Euclidean Sequencer
 
 void EuclideanSeq(int trigger, bool reset, bool gatesoff) {
@@ -2865,7 +2922,7 @@
     char col[2];
     char ch[2];
     
-    if(euclid)
+    if (euclid)
     {
         strcpy(address, MATRIX_ADDRESS);
     
@@ -2877,7 +2934,7 @@
     sprintf(col, "%d", column + 1);
     strcat(address, col);
     
-    if(euclid)
+    if (euclid)
     {
         strcat(address, "/");