OSCtoCV Library
OSCtoCV.h
- Committer:
- casiotone401
- Date:
- 2016-02-25
- Revision:
- 6:7fb15b1b5459
- Parent:
- 4:fe335dc8d53d
File content as of revision 6:7fb15b1b5459:
/* OSCtoCV Converter Configulation */ #pragma O3 #pragma Otime #ifndef OSCtoCV_H #define OSCtoCV_H #include "mbed.h" #include "FastIO.h" // https://developer.mbed.org/users/Sissors/code/FastIO/ //#include "FastAnalogIn.h" #include "DebouncedInterrupt.h" // https://developer.mbed.org/users/kandangath/code/DebouncedInterrupt/ #include "BurstSPI.h" // https://developer.mbed.org/users/Sissors/code/BurstSPI/ #include "TextLCD.h" //edit "writeCommand" "writeData" protected -> public #include "EthernetNetIf.h" #include "UDPSocket.h" #include "OSCReceiver.h" #include "mbedOSC.h" #include "MIDI.h" // https://developer.mbed.org/users/okini3939/code/MIDI/ //------------------------------------------------------------- // DAC8568 Control Bits (See datasheet) #define WRITE 0x00 #define UPDATE 0x01 #define WRITE_UPDATE_ALL 0x02 // LDAC Write to Selected Update All #define WRITE_UPDATE_N 0x03 // LDAC Write to Selected Update Respective #define POWER 0x04 #define CLR 0x05 // Clear Code Register #define WRITE_LDAC_REG 0x06 #define RESET 0x07 // Software Reset DAC8568 #define SETUP_INTERNAL_REF 0x08 #define SPI_RATE 20000000 // 20Mbps SPI Clock #define POLLING_INTERVAL 19 // Polling Interval (us) //------------------------------------------------------------- // OSCtoCV Converter Macros #define Lin 0 // Linear LinearCV #define Chr 1 // Chromatic #define Maj 2 // Major #define M7 3 // Major7 #define Min7 4 // Minor7 #define Dor 5 // Dorian #define Min 6 // Minor #define S5th 7 // 5th #define Wht 8 // Wholetone #define SCALE_TOTAL 9 // Scales total #define SCALE_AOUT (65535 / SCALE_TOTAL - 1) #define QUAN_RES1 116 // Quantize voltage Steps #define QUAN_RES2 68 #define QUAN_RES3 46 #define QUAN_RES4 40 #define QUAN_RES5 68 #define QUAN_RES6 68 #define QUAN_RES7 16 #define QUAN_RES8 58 #define SCALING_N 32256.0f //------------------------------------------------------------- // Ethernet Setting #define DHCP // address assigned by DHCP #define INPUT_PORT 12345 // Input Port Number #define TOSC_PORT 9000 // touchOSC Port Number //------------------------------------------------------------- // SubModeCount #define SUBMODE1_TOTAL 8 #define SUBMODE2_TOTAL 8 //------------------------------------------------------------- // Gate Sequencer Macros #define _DISABLE 0 #define _ENABLE 1 #define GATE1 0 #define GATE2 1 #define GATE3 2 #define GATE4 3 #define SUBGATE 4 #define GATE_TOTAL 5 #define INVERT 1 #define NON_INVERT 0 #define GATESOUT_ON 0 #define GATESOUT_OFF 1 #define SYNC_ON 0 #define SYNC_OFF 1 //------------------------------------------------------------- // Beats (Note values) #define N1ST 1 // whole #define N2ND 2 // harf #define N4TH 4 // quarter #define N8TH 8 #define N16TH 16 #define N32TH 32 #define N64TH 64 #define NDOT2 3 // dotted #define NDOT4 7 #define NDOT8 9 #define NDOT16 11 #define NDOT32 13 #define TRIP2 3 // triplets #define TRIP4 6 #define TRIP8 12 #define TRIP16 24 #define TRIP32 48 #define SYNC24 96 #define NRESET 0 // Gate Reset //------------------------------------------------------------- // Sequencer Macros #define SHIFTSEQ 0 #define M185SEQ 1 #define EUCLID 2 #define BEATSSEQ 3 #define CV_CHANNEL1 1 #define CV_CHANNEL2 2 #define CV_CHANNEL3 3 #define CV_CHANNEL4 4 #define CV_CHANNEL5 5 #define CV_CHANNEL6 6 #define CV_CHANNEL7 7 #define CV_CHANNEL8 8 #define GATE_MODE_ADDRESS "/gatemode" // /gatemode1 ~ gatemode16 #define STEP_INDICATOR_ADDRESS "/seqstep/" // touchOSC multi toggle(1x16(8)) for Current Step Indicator #define RESET_COUNTER_ADDRESS "/reset" // touchOSC label for Sequencer reset count #define ANALOG_JITTER (rand() % 70 - 35) //------------------------------------------------------------- // M185 Macros #define PULSE_COUNT_ADDRESS "/pulse" // /pulse1 ~ pulse8 M185 Pulse Count #define GATE185_MODE_ADDRESS "/185gmode" // /gatemode1 ~ gatemode8 M185 Gate Mode #define STEP185_INDICATOR_ADDRESS "/185step/" // touchOSC multi toggle(1x16(8)) for Current Step Indicator #define RESET185_COUNTER_ADDRESS "/185reset" // touchOSC label for Sequencer reset count #define SINGLE 0 #define MUTE 1 #define MULTI 2 #define HOLD 3 //------------------------------------------------------------- // Beats Sequencer Macros #define BEATS_MATRIX_ADDRESS "/bm/" // touchOSC multi toggle(16x16) OSC address #define BEATS_PULSE_COUNT_ADDRESS "/bp" // /pulse1 ~ pulse16 BeatsSeq Pulse Count #define BEATS_INDICATOR_ADDRESS "/bps/" // touchOSC multi toggle(1x16(8)) for Current Step Indicator #define BEATS_COUNTER_ADDRESS "/bprst" // touchOSC label for Sequencer reset count //------------------------------------------------------------- // Euclidean Sequencer Macros #define READ_DELAY 10 // for debouncing #define MAXCHANNELS 4 #define MAXSTEPS 16 // max step length #define TRIGGER_DURATION 2200 #define DISPLAY_UPDATE 2000 // how long active channel display is shown #define MATRIX_ADDRESS "/matrix/" // touchOSC multi toggle(9x16) OSC address //------------------------------------------------------------- // Global Variables // Silentway Calibration Data Mapping // http://www.expert-sleepers.co.uk/silentway.html // Chromatic Scale extern const float calibMap1[QUAN_RES1]; // Major Scale extern const float calibMap2[QUAN_RES2]; // M7(9) extern const float calibMap3[QUAN_RES3]; // m7(9) extern const float calibMap4[QUAN_RES4]; // Dorian Scale extern const float calibMap5[QUAN_RES5]; // Minor Scale extern const float calibMap6[QUAN_RES6]; // 5th extern const float calibMap7[QUAN_RES7]; // Whole tone extern const float calibMap8[QUAN_RES8]; //------------------------------------------------------------- // Control Voltage extern float gOSC_cv[8]; extern float gSeq_cv[16]; extern float g185_cv[8]; // Glide extern float gGlide; // Sub Mode extern int gSubModeCount1; extern int gSubModeCount2; // Variables for Sequencer extern float gPulseCount[8]; extern float gGateMode[16]; extern float gGateMode185[8]; extern float gSlide[16]; extern float gSlide185[8]; extern float gAccent[16]; extern float gAccent185[8]; // Variables for Beats Seq extern float gPulseCountBeats[16]; extern float gBeatsLevel[8]; extern float gBeatsDecay[8]; extern unsigned int gBeatsMatrix[8][16]; // Euclidean SEQ Variables extern float gEucA[6], gEucB[6]; // Variables for Control /* gCtrl[0] /ctrl1 BPM gCtrl[1] /ctrl2 Quantize mode gCtrl[3] /ctrl4 Glide gCtrl[4] /ctrl5 Shift CV Seq Reset Count gCtrl[5] /ctrl6 M185 Seq Reset Count gCtrl[6] /ctrl7 Gate Length gCtrl[7] /ctrl8 Beats Seq 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 gCtrlSW[5] /ctrlsw6 Beats Sequencer Random Vel gArdPot[0] /pot1 Arduino pot1 control for Random, LFO gArdPot[1] /pot2 Arduino pot2 control for Random, LFO gArdSW[0] /sw1 Arduino sw1 control for Sub Mode1 gArdSW[1] /sw2 Arduino sw2 control for Sub Mode2 */ extern float gCtrl[8]; extern bool gCtrlSW[8]; // Variables for Arduino OSC extern uint16_t gArdCV[4]; extern float gArdPot[2]; extern bool gArdSW[2]; //------------------------------------------------------------- // mbed Functions extern TextLCD gLCD; // rs, e, d4-d7 extern BurstSPI gSPI; // SPI (p6 unconnected) extern FastOut<p15> gSYNCMODE; // SYNC DAC8568 extern FastOut<p16> gLDAC; // LDAC DAC8568 // GateOut extern DigitalOut gGATES[4]; // GateOut extern FastOut<p19> gSUBGATE; // SubGateOut extern FastOut<p25> gCLOCKOUT; // ClockOut extern AnalogOut gAOUT; extern AnalogIn gAIN; extern DebouncedInterrupt gSW; // Mode SW // MIDI OUT extern MIDI midi; extern Timer gTimer; // Timer extern Ticker gPoller; // Ticker for Polling // Ethernet extern EthernetNetIf gEth; // touchOSC Address extern uint8_t touchOSCAddress[]; extern int touchOSCPort; // Set OSC message for sending extern OSCClass osc; extern OSCMessage sendMes; //------------------------------------------------------------- // Functions /* Map Function Remaps float value from one range to another range. float MapFloat(float x, float in_min, float in_max, float out_min, float out_max) */ extern inline float MapFloat(float x, float in_min, float in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } // Check current quantize scale extern inline uint8_t CheckQuantizeMode(void) { static uint8_t _qmode; uint8_t qmode; qmode = gCtrl[1] * (SCALE_TOTAL - 1); // Sequencer Quantize Mode (gCtrl[1]) if (_qmode != qmode) { gAOUT.write_u16(SCALE_AOUT * qmode); // write Analog out for send current scale _qmode = qmode; } return qmode; } // Fast strlen function http://www.strchr.com/optimized_strlen_function extern inline size_t strlength(const char *s) { size_t len = 0; for (;;) { unsigned x = *(unsigned*)s; if ((x & 0xFF) == 0) return len; if ((x & 0xFF00) == 0) return len + 1; if ((x & 0xFF0000) == 0) return len + 2; if ((x & 0xFF000000) == 0) return len + 3; s += 4, len += 4; } } // set touchOSC Matrix Address extern inline char * SetMatrixAddress(int row, int column, int mode) { static char address[32]; switch (mode) { case SHIFTSEQ: sprintf(address, "%s%d/1", STEP_INDICATOR_ADDRESS, column + 1); break; case M185SEQ: sprintf(address, "%s%d/1", STEP185_INDICATOR_ADDRESS, column + 1); break; case BEATSSEQ: sprintf(address, "%s%d/1", BEATS_INDICATOR_ADDRESS, column + 1); break; case EUCLID: sprintf(address, "%s%d/%d", MATRIX_ADDRESS, column + 1, row + 1); break; } return address; /* static char address[32]; char col[2]; char ch[2]; if(euclid) { strcpy(address, MATRIX_ADDRESS); } else { strcpy(address, STEP_INDICATOR_ADDRESS); } sprintf(col, "%d", column + 1); strcat(address, col); if(euclid) { strcat(address, "/"); sprintf(ch, "%d", row + 1); strcat(address, ch); } else { strcat(address, "/1"); } return address; */ } // SPI Transfer // DAC8568 data word length 32bit (8bit shift out) extern void UpdateCV(unsigned int control, unsigned int ch, const unsigned int *data); // Update CV Meter(Text LCD bar meter) extern void UpdateCVMeter(unsigned int ch, const unsigned int *level); // Check subMode1(gArdSW[0]) extern int CheckSubMode1(void); // Check subMode2(gArdSW[1]) extern int CheckSubMode2(void); // Update subMode Text LCD extern void UpdateSubModeLCD(const char * subModeName); #endif