OSCtoCV Library

Dependents:   OSCtoCVConverter

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers OSCtoCV.h Source File

OSCtoCV.h

00001 /*
00002     OSCtoCV Converter Configulation
00003 */
00004 
00005 #pragma O3
00006 #pragma Otime
00007 
00008 #ifndef OSCtoCV_H
00009 #define OSCtoCV_H
00010 
00011 #include "mbed.h"
00012 #include "FastIO.h" // https://developer.mbed.org/users/Sissors/code/FastIO/
00013 //#include "FastAnalogIn.h"
00014 #include "DebouncedInterrupt.h" // https://developer.mbed.org/users/kandangath/code/DebouncedInterrupt/
00015 #include "BurstSPI.h" // https://developer.mbed.org/users/Sissors/code/BurstSPI/
00016 #include "TextLCD.h"       //edit "writeCommand" "writeData" protected -> public
00017 #include "EthernetNetIf.h"
00018 #include "UDPSocket.h"
00019 #include "OSCReceiver.h"
00020 #include "mbedOSC.h"
00021 #include "MIDI.h" // https://developer.mbed.org/users/okini3939/code/MIDI/
00022 
00023 //-------------------------------------------------------------
00024 // DAC8568 Control Bits (See datasheet)
00025 
00026 #define WRITE               0x00
00027 #define UPDATE              0x01
00028 #define WRITE_UPDATE_ALL    0x02     // LDAC Write to Selected Update All
00029 #define WRITE_UPDATE_N      0x03     // LDAC Write to Selected Update Respective
00030 #define POWER               0x04
00031 #define CLR                 0x05     // Clear Code Register
00032 #define WRITE_LDAC_REG      0x06
00033 #define RESET               0x07     // Software Reset DAC8568
00034 #define SETUP_INTERNAL_REF  0x08
00035 
00036 #define SPI_RATE            20000000 // 20Mbps SPI Clock
00037 #define POLLING_INTERVAL    19       // Polling Interval (us)
00038 
00039 //-------------------------------------------------------------
00040 // OSCtoCV Converter Macros
00041 
00042 #define Lin                 0        // Linear LinearCV
00043 #define Chr                 1        // Chromatic
00044 #define Maj                 2        // Major
00045 #define M7                  3        // Major7
00046 #define Min7                4        // Minor7
00047 #define Dor                 5        // Dorian
00048 #define Min                 6        // Minor
00049 #define S5th                7        // 5th
00050 #define Wht                 8        // Wholetone
00051 
00052 #define SCALE_TOTAL         9        // Scales total
00053 
00054 #define SCALE_AOUT          (65535 / SCALE_TOTAL - 1)
00055 
00056 #define QUAN_RES1           116      // Quantize voltage Steps
00057 #define QUAN_RES2           68
00058 #define QUAN_RES3           46
00059 #define QUAN_RES4           40
00060 #define QUAN_RES5           68
00061 #define QUAN_RES6           68  
00062 #define QUAN_RES7           16
00063 #define QUAN_RES8           58
00064 
00065 #define SCALING_N       32256.0f
00066 
00067 //------------------------------------------------------------- 
00068 // Ethernet Setting
00069 
00070 #define DHCP                   // address assigned by DHCP
00071 #define INPUT_PORT      12345    // Input Port Number
00072 #define TOSC_PORT        9000    // touchOSC Port Number
00073 
00074 //------------------------------------------------------------- 
00075 // SubModeCount
00076 #define SUBMODE1_TOTAL      8
00077 #define SUBMODE2_TOTAL      8
00078 
00079 //------------------------------------------------------------- 
00080 // Gate Sequencer Macros
00081 
00082 #define _DISABLE            0
00083 #define _ENABLE             1
00084 
00085 #define GATE1               0
00086 #define GATE2               1
00087 #define GATE3               2
00088 #define GATE4               3
00089 #define SUBGATE             4
00090 #define GATE_TOTAL          5
00091 
00092 #define INVERT              1
00093 #define NON_INVERT          0
00094 
00095 #define GATESOUT_ON         0
00096 #define GATESOUT_OFF        1
00097 
00098 #define SYNC_ON             0
00099 #define SYNC_OFF            1
00100 
00101 //------------------------------------------------------------- 
00102 // Beats (Note values)
00103 
00104 #define N1ST                1   // whole
00105 #define N2ND                2   // harf
00106 #define N4TH                4   // quarter
00107 #define N8TH                8
00108 #define N16TH              16
00109 #define N32TH              32
00110 #define N64TH              64
00111 #define NDOT2               3   // dotted
00112 #define NDOT4               7
00113 #define NDOT8               9
00114 #define NDOT16             11
00115 #define NDOT32             13
00116 #define TRIP2               3   // triplets
00117 #define TRIP4               6
00118 #define TRIP8              12
00119 #define TRIP16             24
00120 #define TRIP32             48
00121 #define SYNC24             96
00122 #define NRESET              0   // Gate Reset
00123 
00124 //------------------------------------------------------------- 
00125 // Sequencer Macros
00126 #define SHIFTSEQ            0
00127 #define M185SEQ             1
00128 #define EUCLID              2
00129 #define BEATSSEQ            3
00130 
00131 #define CV_CHANNEL1         1
00132 #define CV_CHANNEL2         2
00133 #define CV_CHANNEL3         3
00134 #define CV_CHANNEL4         4
00135 #define CV_CHANNEL5         5
00136 #define CV_CHANNEL6         6
00137 #define CV_CHANNEL7         7
00138 #define CV_CHANNEL8         8
00139 
00140 #define GATE_MODE_ADDRESS      "/gatemode"   // /gatemode1 ~ gatemode16
00141 #define STEP_INDICATOR_ADDRESS "/seqstep/"   // touchOSC multi toggle(1x16(8)) for Current Step Indicator
00142 #define RESET_COUNTER_ADDRESS  "/reset"      // touchOSC label for Sequencer reset count
00143 
00144 #define ANALOG_JITTER       (rand() % 70 - 35)
00145 
00146 //------------------------------------------------------------- 
00147 // M185 Macros
00148 
00149 #define PULSE_COUNT_ADDRESS       "/pulse"      // /pulse1 ~ pulse8        M185 Pulse Count
00150 #define GATE185_MODE_ADDRESS      "/185gmode"   // /gatemode1 ~ gatemode8  M185 Gate Mode
00151 #define STEP185_INDICATOR_ADDRESS "/185step/"   // touchOSC multi toggle(1x16(8)) for Current Step Indicator
00152 #define RESET185_COUNTER_ADDRESS  "/185reset"   // touchOSC label for Sequencer reset count
00153 
00154 #define SINGLE              0
00155 #define MUTE                1
00156 #define MULTI               2
00157 #define HOLD                3
00158 
00159 //------------------------------------------------------------- 
00160 // Beats Sequencer Macros
00161 
00162 #define BEATS_MATRIX_ADDRESS      "/bm/"     // touchOSC multi toggle(16x16) OSC address
00163 #define BEATS_PULSE_COUNT_ADDRESS "/bp"      // /pulse1 ~ pulse16  BeatsSeq Pulse Count
00164 #define BEATS_INDICATOR_ADDRESS   "/bps/"    // touchOSC multi toggle(1x16(8)) for Current Step Indicator
00165 #define BEATS_COUNTER_ADDRESS     "/bprst"   // touchOSC label for Sequencer reset count
00166 
00167 //------------------------------------------------------------- 
00168 // Euclidean Sequencer Macros
00169 
00170 #define READ_DELAY         10 // for debouncing 
00171 #define MAXCHANNELS         4
00172 #define MAXSTEPS           16 // max step length
00173 #define TRIGGER_DURATION 2200
00174 
00175 #define DISPLAY_UPDATE   2000 // how long active channel display is shown
00176 #define MATRIX_ADDRESS   "/matrix/" // touchOSC multi toggle(9x16) OSC address
00177 
00178 
00179 //-------------------------------------------------------------
00180 // Global Variables
00181 
00182 // Silentway Calibration Data Mapping
00183 // http://www.expert-sleepers.co.uk/silentway.html
00184 
00185 //  Chromatic Scale
00186 extern const float calibMap1[QUAN_RES1];
00187 
00188 //  Major Scale
00189 extern const float calibMap2[QUAN_RES2];
00190 
00191 //  M7(9)
00192 extern const float calibMap3[QUAN_RES3];
00193 
00194 //  m7(9)
00195 extern const float calibMap4[QUAN_RES4];
00196 
00197 //  Dorian Scale
00198 extern const float calibMap5[QUAN_RES5];
00199 
00200 //  Minor Scale
00201 extern const float calibMap6[QUAN_RES6];
00202 
00203 //  5th
00204 extern const float calibMap7[QUAN_RES7];
00205 
00206 //  Whole tone
00207 extern const float calibMap8[QUAN_RES8];
00208 //-------------------------------------------------------------
00209 
00210 // Control Voltage
00211 extern float gOSC_cv[8];
00212 extern float gSeq_cv[16];
00213 extern float g185_cv[8];
00214 
00215 // Glide
00216 extern float gGlide;
00217 
00218 // Sub Mode
00219 extern int gSubModeCount1;
00220 extern int gSubModeCount2;
00221 
00222 // Variables for Sequencer
00223 extern float gPulseCount[8];
00224 extern float gGateMode[16];
00225 extern float gGateMode185[8];
00226 extern float gSlide[16];
00227 extern float gSlide185[8];
00228 extern float gAccent[16];
00229 extern float gAccent185[8];
00230 
00231 // Variables for Beats Seq 
00232 extern float gPulseCountBeats[16];
00233 extern float gBeatsLevel[8];
00234 extern float gBeatsDecay[8];
00235 extern unsigned int gBeatsMatrix[8][16];
00236 
00237 // Euclidean SEQ Variables
00238 extern float gEucA[6], gEucB[6];
00239 
00240 // Variables for Control
00241 /*
00242 gCtrl[0] /ctrl1 BPM
00243 gCtrl[1] /ctrl2 Quantize mode
00244 gCtrl[3] /ctrl4 Glide
00245 gCtrl[4] /ctrl5 Shift CV Seq Reset Count
00246 gCtrl[5] /ctrl6 M185 Seq Reset Count
00247 gCtrl[6] /ctrl7 Gate Length
00248 gCtrl[7] /ctrl8 Beats Seq Reset Count
00249 
00250 gCtrlSW[0] /ctrlsw1 Sequencer STOP
00251 gCtrlSW[1] /ctrlsw2 Euclidean Sequencer reset
00252 gCtrlSW[2] /ctrlsw3 Sequencer Loop
00253 gCtrlSW[3] /ctrlsw4 Euclid Seq ON
00254 gCtrlSW[4] /ctrlsw5 ASR Analog Mode
00255 gCtrlSW[5] /ctrlsw6 Beats Sequencer Random Vel
00256 
00257 gArdPot[0] /pot1  Arduino pot1 control for Random, LFO
00258 gArdPot[1] /pot2  Arduino pot2 control for Random, LFO
00259 gArdSW[0] /sw1    Arduino sw1  control for Sub Mode1
00260 gArdSW[1] /sw2    Arduino sw2  control for Sub Mode2
00261 */
00262 
00263 extern float gCtrl[8];
00264 extern bool  gCtrlSW[8];
00265 
00266 // Variables for Arduino OSC
00267 extern uint16_t gArdCV[4];
00268 extern float gArdPot[2];
00269 extern bool gArdSW[2];
00270 
00271 
00272 //-------------------------------------------------------------
00273 // mbed Functions
00274 
00275 extern TextLCD      gLCD;   // rs, e, d4-d7
00276 
00277 extern BurstSPI     gSPI;   // SPI (p6 unconnected)
00278 
00279 extern FastOut<p15> gSYNCMODE;  // SYNC DAC8568
00280 extern FastOut<p16> gLDAC;      // LDAC DAC8568
00281 
00282 // GateOut
00283 extern DigitalOut   gGATES[4];  // GateOut
00284 extern FastOut<p19> gSUBGATE;   // SubGateOut
00285 extern FastOut<p25> gCLOCKOUT;  // ClockOut
00286 
00287 extern AnalogOut    gAOUT;
00288 
00289 extern AnalogIn     gAIN;
00290 extern DebouncedInterrupt  gSW; // Mode SW
00291 
00292 // MIDI OUT
00293 extern MIDI midi;
00294 
00295 extern Timer        gTimer;     // Timer
00296 extern Ticker       gPoller;    // Ticker for Polling
00297 
00298 // Ethernet
00299 extern EthernetNetIf    gEth;
00300 
00301 // touchOSC Address
00302 extern uint8_t touchOSCAddress[];
00303 extern int touchOSCPort;
00304 
00305 // Set OSC message for sending 
00306 extern OSCClass osc;
00307 extern OSCMessage sendMes;
00308 
00309 
00310 //-------------------------------------------------------------
00311 // Functions
00312 
00313 /* Map Function 
00314 Remaps float value from one range to another range.
00315 
00316 float MapFloat(float x, float in_min, float in_max, float out_min, float out_max)
00317 
00318 */
00319 extern inline float MapFloat(float x, float in_min, float in_max, float out_min, float out_max)
00320 {
00321   return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
00322 }
00323 
00324 // Check current quantize scale
00325 extern inline uint8_t CheckQuantizeMode(void)
00326 {
00327     static uint8_t _qmode;
00328     uint8_t qmode;
00329     
00330     qmode = gCtrl[1] * (SCALE_TOTAL - 1);  // Sequencer Quantize Mode (gCtrl[1])
00331 
00332     if (_qmode != qmode)
00333     {
00334         gAOUT.write_u16(SCALE_AOUT * qmode); // write Analog out for send current scale
00335         _qmode = qmode;
00336     }
00337     
00338     return qmode;
00339 }
00340 
00341 // Fast strlen function http://www.strchr.com/optimized_strlen_function
00342 extern inline size_t strlength(const char *s)
00343 {
00344     size_t len = 0;
00345     
00346     for (;;) 
00347     {
00348         unsigned x = *(unsigned*)s;
00349         if ((x & 0xFF) == 0) return len;
00350         if ((x & 0xFF00) == 0) return len + 1;
00351         if ((x & 0xFF0000) == 0) return len + 2;
00352         if ((x & 0xFF000000) == 0) return len + 3;
00353         s += 4, len += 4;
00354     }
00355 }
00356 
00357 // set touchOSC Matrix Address 
00358 extern inline char * SetMatrixAddress(int row, int column, int mode) 
00359 {
00360     static char address[32];
00361     
00362     switch (mode)
00363     {
00364         case SHIFTSEQ:
00365         
00366             sprintf(address, "%s%d/1", STEP_INDICATOR_ADDRESS, column + 1);
00367             break;
00368         
00369         case M185SEQ:
00370         
00371             sprintf(address, "%s%d/1", STEP185_INDICATOR_ADDRESS, column + 1);
00372             break;
00373         
00374         case BEATSSEQ:
00375         
00376             sprintf(address, "%s%d/1", BEATS_INDICATOR_ADDRESS, column + 1);
00377             break;
00378             
00379         case EUCLID:
00380         
00381             sprintf(address, "%s%d/%d", MATRIX_ADDRESS, column + 1, row + 1);
00382             break;
00383     }
00384     
00385     return address;
00386     
00387 /*
00388     static char address[32];
00389     char col[2];
00390     char ch[2];
00391     
00392     if(euclid)
00393     {
00394         strcpy(address, MATRIX_ADDRESS);
00395     
00396     } else {
00397         
00398         strcpy(address, STEP_INDICATOR_ADDRESS);
00399     }
00400     
00401     sprintf(col, "%d", column + 1);
00402     strcat(address, col);
00403     
00404     if(euclid)
00405     {
00406         strcat(address, "/");
00407         
00408         sprintf(ch, "%d", row + 1);
00409         strcat(address, ch);
00410     
00411     } else {
00412         
00413         strcat(address, "/1");
00414     }
00415     
00416     return address;
00417 */
00418 }
00419 
00420 // SPI Transfer
00421 // DAC8568 data word length 32bit (8bit shift out)
00422 extern void UpdateCV(unsigned int control, unsigned int ch, const unsigned int *data);
00423 
00424 // Update CV Meter(Text LCD bar meter)
00425 extern void UpdateCVMeter(unsigned int ch, const unsigned int *level);
00426 
00427 // Check subMode1(gArdSW[0])
00428 extern int CheckSubMode1(void);
00429 
00430 // Check subMode2(gArdSW[1])
00431 extern int CheckSubMode2(void);
00432 
00433 // Update subMode Text LCD
00434 extern void UpdateSubModeLCD(const char * subModeName);
00435     
00436 #endif