OSCtoCV Library
Embed:
(wiki syntax)
Show/hide line numbers
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
Generated on Tue Jul 12 2022 22:47:49 by 1.7.2