OSCtoCV Library

Dependents:   OSCtoCVConverter

OSCtoCV.cpp

Committer:
casiotone401
Date:
2016-02-16
Revision:
4:fe335dc8d53d
Parent:
1:981b62bb5c87
Child:
6:7fb15b1b5459

File content as of revision 4:fe335dc8d53d:

/*
 OSCtoCV.cpp 
*/

#include "mbed.h"
#include "OSCtoCV.h"

//-------------------------------------------------------------
// Global Variables

// Silentway Calibration Data Mapping
// http://www.expert-sleepers.co.uk/silentway.html

//  Chromatic Scale
const float calibMap1[QUAN_RES1] = {
0.00076928,   0.00900736,   0.01724544,   0.02548352,   0.03372160,
0.04195968,   0.05019776,   0.05843584,   0.06667392,   0.07491200,
0.08315008,   0.09138816,   0.09962624,   0.10786432,   0.11610240,
0.12434047,   0.13258974,   0.14083999,   0.14909023,   0.15734047,
0.16559070,   0.17384095,   0.18209119,   0.19034143,   0.19859168,
0.20684192,   0.21509215,   0.22334240,   0.23159264,   0.23984288,
0.24809311,   0.25634655,   0.26460093,   0.27285531,   0.28110969,
0.28936407,   0.29761845,   0.30587283,   0.31412721,   0.32238159,
0.33063596,   0.33889034,   0.34714472,   0.35539910,   0.36365348,
0.37190786,   0.38017464,   0.38844886,   0.39672306,   0.40499726,
0.41327149,   0.42154568,   0.42981988,   0.43809411,   0.44636831,
0.45464250,   0.46291673,   0.47119093,   0.47946513,   0.48773935,
0.49601355,   0.50430328,   0.51260746,   0.52091163,   0.52921581,
0.53751999,   0.54582411,   0.55412829,   0.56243247,   0.57073665,
0.57904083,   0.58734500,   0.59564912,   0.60395330,   0.61225748,
0.62056166,   0.62890279,   0.63728637,   0.64566994,   0.65405351,
0.66243708,   0.67082065,   0.67920423,   0.68758780,   0.69597137,
0.70435494,   0.71273851,   0.72112209,   0.72950566,   0.73788923,
0.74627280,   0.75476575,   0.76334614,   0.77192658,   0.78050703,
0.78908741,   0.79766786,   0.80624831,   0.81482869,   0.82340914,
0.83198959,   0.84056997,   0.84915042,   0.85773087,   0.86631125,
0.87489170,   0.88425636,   0.89363104,   0.90300572,   0.91238040,
0.92175508,   0.93112975,   0.94050443,   0.94987911,   0.95925385,
0.96862853
};

//  Major Scale
const float calibMap2[QUAN_RES2] = {
calibMap1[0], calibMap1[2], calibMap1[4], calibMap1[5], calibMap1[7],
calibMap1[9], calibMap1[11], calibMap1[12], calibMap1[14], calibMap1[16],
calibMap1[17], calibMap1[19], calibMap1[21], calibMap1[23], calibMap1[24],
calibMap1[26], calibMap1[28], calibMap1[29], calibMap1[31], calibMap1[33],
calibMap1[35], calibMap1[36], calibMap1[38], calibMap1[40], calibMap1[41],
calibMap1[43], calibMap1[45], calibMap1[47], calibMap1[48], calibMap1[50],
calibMap1[52], calibMap1[53], calibMap1[55], calibMap1[57], calibMap1[59],
calibMap1[60], calibMap1[62], calibMap1[64], calibMap1[65], calibMap1[67],
calibMap1[69], calibMap1[71], calibMap1[72], calibMap1[74], calibMap1[76],
calibMap1[77], calibMap1[79], calibMap1[81], calibMap1[83], calibMap1[84],
calibMap1[86], calibMap1[88], calibMap1[89], calibMap1[91], calibMap1[93],
calibMap1[95], calibMap1[96], calibMap1[98], calibMap1[100], calibMap1[101],
calibMap1[103], calibMap1[105], calibMap1[107], calibMap1[108], calibMap1[110],
calibMap1[112], calibMap1[113], calibMap1[115]
};

//  M7(9)
const float calibMap3[QUAN_RES3] = {
calibMap1[0],  calibMap1[4], calibMap1[7], calibMap1[11], calibMap1[12], 
calibMap1[14], calibMap1[16], calibMap1[19], calibMap1[23], calibMap1[24],
calibMap1[26], calibMap1[28], calibMap1[31], calibMap1[35], calibMap1[36], 
calibMap1[38], calibMap1[40], calibMap1[43], calibMap1[47], calibMap1[48], 
calibMap1[50], calibMap1[52], calibMap1[55], calibMap1[59], calibMap1[60], 
calibMap1[62], calibMap1[64], calibMap1[67], calibMap1[71], calibMap1[72], 
calibMap1[76], calibMap1[79], calibMap1[83], calibMap1[84], calibMap1[86], 
calibMap1[88], calibMap1[91], calibMap1[95], calibMap1[96], calibMap1[100],
calibMap1[103], calibMap1[107], calibMap1[108], calibMap1[110], calibMap1[112], 
calibMap1[115]
};

//  m7(9)
const float calibMap4[QUAN_RES4] = {
calibMap1[0], calibMap1[3], calibMap1[7], calibMap1[10], calibMap1[12], 
calibMap1[15], calibMap1[19], calibMap1[22], calibMap1[26], calibMap1[27], 
calibMap1[31], calibMap1[34], calibMap1[36], calibMap1[38], calibMap1[39], 
calibMap1[43], calibMap1[46], calibMap1[50], calibMap1[53], calibMap1[55], 
calibMap1[58], calibMap1[60], calibMap1[63], calibMap1[67], calibMap1[70], 
calibMap1[72], calibMap1[74], calibMap1[75], calibMap1[79], calibMap1[82], 
calibMap1[86], calibMap1[89], calibMap1[91], calibMap1[94], calibMap1[96], 
calibMap1[99],  calibMap1[103], calibMap1[106], calibMap1[110], calibMap1[113]
};

//  Dorian Scale
const float calibMap5[QUAN_RES5] = {
calibMap1[0], calibMap1[2], calibMap1[3], calibMap1[5], calibMap1[7],
calibMap1[9], calibMap1[10], calibMap1[12], calibMap1[14], calibMap1[15],
calibMap1[17], calibMap1[19], calibMap1[20], calibMap1[21], calibMap1[24],
calibMap1[26], calibMap1[27], calibMap1[29], calibMap1[31], calibMap1[33],
calibMap1[34], calibMap1[36], calibMap1[38], calibMap1[39], calibMap1[41],
calibMap1[43], calibMap1[45], calibMap1[46], calibMap1[48], calibMap1[50],
calibMap1[51], calibMap1[53], calibMap1[55], calibMap1[57], calibMap1[58],
calibMap1[60], calibMap1[62], calibMap1[63], calibMap1[65], calibMap1[67],
calibMap1[69], calibMap1[70], calibMap1[72], calibMap1[74], calibMap1[75],
calibMap1[77], calibMap1[79], calibMap1[81], calibMap1[82], calibMap1[84],
calibMap1[86], calibMap1[87], calibMap1[89], calibMap1[91], calibMap1[93],
calibMap1[94], calibMap1[96], calibMap1[98], calibMap1[99], calibMap1[101],
calibMap1[103], calibMap1[105], calibMap1[106], calibMap1[108], calibMap1[110],
calibMap1[111], calibMap1[113], calibMap1[115]
};

//  Minor Scale
const float calibMap6[QUAN_RES6] = {
calibMap1[0], calibMap1[2], calibMap1[3], calibMap1[5], calibMap1[7],
calibMap1[8], calibMap1[10], calibMap1[12], calibMap1[14], calibMap1[15],
calibMap1[17], calibMap1[19], calibMap1[20], calibMap1[22], calibMap1[24],
calibMap1[26], calibMap1[27], calibMap1[29], calibMap1[31], calibMap1[32],
calibMap1[34], calibMap1[36], calibMap1[38], calibMap1[39], calibMap1[41],
calibMap1[43], calibMap1[44], calibMap1[46], calibMap1[48], calibMap1[50],
calibMap1[51], calibMap1[53], calibMap1[55], calibMap1[56], calibMap1[58],
calibMap1[60], calibMap1[62], calibMap1[63], calibMap1[65], calibMap1[67],
calibMap1[68], calibMap1[70], calibMap1[72], calibMap1[74], calibMap1[75],
calibMap1[77], calibMap1[79], calibMap1[80], calibMap1[82], calibMap1[84],
calibMap1[86], calibMap1[87], calibMap1[89], calibMap1[91], calibMap1[92],
calibMap1[94], calibMap1[96], calibMap1[98], calibMap1[99], calibMap1[101],
calibMap1[103], calibMap1[104], calibMap1[106], calibMap1[108], calibMap1[110],
calibMap1[111], calibMap1[113], calibMap1[115]
};

//  5th
const float calibMap7[QUAN_RES7] = {
calibMap1[0], calibMap1[7], calibMap1[14], calibMap1[21], calibMap1[28],
calibMap1[35], calibMap1[42], calibMap1[49], calibMap1[56], calibMap1[63],
calibMap1[70], calibMap1[77], calibMap1[84], calibMap1[91], calibMap1[98],
calibMap1[105]
};

//  Whole tone
const float calibMap8[QUAN_RES8] = {
calibMap1[0], calibMap1[1], calibMap1[2], calibMap1[6], calibMap1[8],
calibMap1[10], calibMap1[12], calibMap1[14], calibMap1[16], calibMap1[18],
calibMap1[20], calibMap1[22], calibMap1[24], calibMap1[26], calibMap1[28],
calibMap1[30], calibMap1[32], calibMap1[34], calibMap1[36], calibMap1[38],
calibMap1[40], calibMap1[42], calibMap1[44], calibMap1[46], calibMap1[48],
calibMap1[50], calibMap1[52], calibMap1[54], calibMap1[56], calibMap1[58],
calibMap1[60], calibMap1[62], calibMap1[64], calibMap1[66], calibMap1[68],
calibMap1[70], calibMap1[72], calibMap1[74], calibMap1[76], calibMap1[78],
calibMap1[80], calibMap1[82], calibMap1[84], calibMap1[86], calibMap1[88],
calibMap1[90], calibMap1[92], calibMap1[94], calibMap1[96], calibMap1[98],
calibMap1[100], calibMap1[102], calibMap1[104], calibMap1[106], calibMap1[108],
calibMap1[110], calibMap1[112], calibMap1[114]
};

//-------------------------------------------------------------
// Global Variables

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

// Sub Mode Status
int gSubModeCount1 = -1;
int gSubModeCount2 = -1;

// Variables for Sequencer
float gPulseCount[8] = {0};
float gGateMode[16] = {0};
float gGateMode185[8] = {0};
float gSlide[16];
float gSlide185[8];
float gAccent[16] = {0};
float gAccent185[8] = {0};

float gPulseCountBeats[16] = {0};
float gBeatsLevel[8] = {1};
float gBeatsDecay[8] = {1};
unsigned int gBeatsMatrix[8][16] = {{0}};

// Euclidean SEQ Variables
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
gArdPot[1] /pot2  Arduino pot2
gArdSW[0] /sw1  Arduino sw1
gArdSW[1] /sw2  Arduino sw2
*/

float gCtrl[8];
bool  gCtrlSW[8] = {false};

// Variables for Arduino
uint16_t gArdCV[4];
float gArdPot[2] = {408.0f, 350.0f};
bool gArdSW[2] = {false};

//-------------------------------------------------------------
// mbed Functions

TextLCD      gLCD(p9, p10, p11, p12, p13, p14); // rs, e, d4-d7

BurstSPI     gSPI(p5,p6,p7);    // SPI (p6 unconnected)

FastOut<p15> gSYNCMODE;         // SYNC DAC8568
FastOut<p16> gLDAC;             // LDAC DAC8568

DigitalOut   gGATES[4] = {p21, p22, p23, p24};   // GateOut
FastOut<p19> gSUBGATE;                           // SubGateOut
FastOut<p25> gCLOCKOUT;                          // ClockOut

AnalogOut    gAOUT(p18);

AnalogIn gAIN(p17);
DebouncedInterrupt  gSW(p30);   // Mode SW

// MIDI OUT
MIDI midi(p28, p27);

Timer        gTimer;     // Timer
Ticker       gPoller;    // Ticker for Polling

// Ethernet
#ifdef DHCP
EthernetNetIf gEth;
#else
EthernetNetIf gEth(
                   IpAddr(192,168,1,6),
                   IpAddr(255,255,255,0),
                   IpAddr(192,168,1,1),
                   IpAddr(192,168,1,1)
                   );
#endif


// touchOSC Address
uint8_t touchOSCAddress[] = {192, 168, 1, 7};
int touchOSCPort = TOSC_PORT;

// Set OSC message for sending 
OSCClass osc;
OSCMessage sendMes;

//-------------------------------------------------------------
// SPI Transfer
// DAC8568 data word length 32bit (8bit shift out)

void UpdateCV(unsigned int control, unsigned int ch, const unsigned int *data)
{

    switch (control)
    {
        case WRITE_UPDATE_N:

            gSYNCMODE = _DISABLE;
            gSPI.write(00000000|control);            // padding at beginning of byte and control bits
            gSPI.write(ch << 4 | *data >> 12);       // address(ch) bits
            gSPI.write((*data << 4) >> 8);           // middle 8 bits of data
            gSPI.write((*data << 12) >> 8 | 00001111);
            gSYNCMODE = _ENABLE;
            gLDAC = _DISABLE;
            gLDAC = _ENABLE;
            
            break;

        case RESET:

            gSYNCMODE = _DISABLE;
            gSPI.write(00000111);   // Software RESET
            gSPI.write(00000000);
            gSPI.write(00000000);
            gSPI.write(00000000);
            gSYNCMODE = _ENABLE;
            
            break;

        case CLR:
        
            gSYNCMODE = _DISABLE;
            gSPI.write(00000101);   // CLR Register
            gSPI.write(00000000);
            gSPI.write(00000000);
            gSPI.write(00000011);   // Ignore CLR Pin
            gSYNCMODE = _ENABLE;
            
            break;
    }
}

//-------------------------------------------------------------
// CV Meter TextLCD bar meter

void UpdateCVMeter(unsigned int ch, const unsigned int *level)
{       
    gLCD.locate ( ch, 0 );
    gLCD.putc(*level * 0.0002192f);     // put custom char
}

//-------------------------------------------------------------
// Check subMode1(gArdSW[0]) (subMode Status & Text LCD Update)

int CheckSubMode1(void)
{
    static int lastSWState = -1;
    
    if (gArdSW[0] != lastSWState)
    {
        lastSWState = gArdSW[0];
        
        if (gSubModeCount1 < SUBMODE1_TOTAL - 1) 
        {   
            ++gSubModeCount1;
        
        } else {
            
            gSubModeCount1 = 0;
        }
    
    }
    
    return gSubModeCount1;
}

//-------------------------------------------------------------
// Check subMode2(gArdSW[1]) (subMode Status & Text LCD Update)

int CheckSubMode2(void)
{
    static int lastSWState = -1;
    
    if (gArdSW[1] != lastSWState)
    {
        lastSWState = gArdSW[1];
        
        if (gSubModeCount2 < SUBMODE2_TOTAL - 1) 
        {   
            ++gSubModeCount2;
        
        } else {
            
            gSubModeCount2 = 0;
        }
    
    }
    
    return gSubModeCount2;
}

//-------------------------------------------------------------
// Update subMode Text LCD
void UpdateSubModeLCD(const char * subModeName)
{
    gLCD.locate( 0, 1 );
    gLCD.printf("        ");
        
    gLCD.locate( 0, 1 );
    gLCD.printf("%s", subModeName);
    
    sendMes.setTopAddress("/submode");
    sendMes.setArgs("s", subModeName);
    
    osc.sendOsc(&sendMes);
}