OSCtoCV Library

Dependents:   OSCtoCVConverter

OSCtoCV.h

Committer:
casiotone401
Date:
2016-01-17
Revision:
0:cd43a974c54c
Child:
1:981b62bb5c87

File content as of revision 0:cd43a974c54c:

/*
    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    28       // 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_NUM           9        // Scales total

#define SCALE_AOUT          (65535 / SCALE_NUM - 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 STEP_INDICATOR_ADDRESS "/seqstep/"   // touchOSC multi toggle(1x16(8)) for Current Step Indicator
#define RESET_COUNTER_ADDRESS  "/reset"      // touchOSC label for Sequencer reset count                 

//------------------------------------------------------------- 
// M185 Macros

#define PULSE_COUNT_ADDRESS    "/pulse"      // /pulse1 ~ pulse8        M185 Pulse Count
#define GATE_MODE_ADDRESS      "/gatemode"   // /gatemode1 ~ gatemode8  M185 Gate Mode

#define SINGLE              0
#define MUTE                1
#define MULTI               2
#define HOLD                3

//------------------------------------------------------------- 
// 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


//-------------------------------------------------------------
// 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;
}

// 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, bool euclid) 
{
    
    static char address[32];
    
    if (euclid)
    {
        sprintf(address, "%s%d/%d", MATRIX_ADDRESS, column + 1, row + 1);
    
    } else {
        
        sprintf(address, "%s%d/1", STEP_INDICATOR_ADDRESS, column + 1);
    }
    
    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(int, int, const unsigned int *);

// Update CV Meter(Text LCD bar meter)
extern void UpdateCVMeter(int, const unsigned int *);

// 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 *);

//-------------------------------------------------------------
// 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];

extern float   gOSC_cv[8];
extern float   gSeq_cv[16];
extern float   gGlide;

// Sub Mode
extern int gSubModeCount1;
extern int gSubModeCount2;

// Variables for Sequencer
extern float gPulseCount[8];
extern float gGateMode[16];
extern float gSlide[16];
extern float gAccent[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 M185 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] /ctrlsggSubModeCount1w5 ASR Analog Mode

gArdPot[0] /pot1  Arduino pot1
gArdPot[1] /pot2  Arduino pot2
gArdSW[0] /sw1  Arduino sw1
gArdSW[1] /sw2  Arduino sw2

*/

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

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;
    
#endif