main.cpp


#include "mbed.h"
#include "MIDI_sub2.h"

int main(){
    int i, j, p, counter;
    unsigned char adc_new;
    i = j  = p = counter = 0;
    rx_top = rx_end = tx_top = tx_end = 0;
    adc_no = 0;
    MIDI.baud(115200);
    MIDI.attach(&rx_fifoset, MIDI.RxIrq);
    for(i=0; i<2; i++){
         LED_set(i, 0);
    }  
    for(i=0; i<4; i++){
         adc_old[i] = 0;
    }  
    while(1){        
        p++;
        if(p == 500){
            LED_set(adc_no * 2, 1);
            LED_set(adc_no * 2 + 1, 0);
        }
        else if(p == 1000){
            adc_new = ADC_get(adc_no * 2);
            if(adc_old[adc_no * 4] != adc_new){
                adc_old[adc_no * 4] = adc_new;
                tx_fifoset(0xB0);
                tx_fifoset(adc_no * 4);
                tx_fifoset(adc_new);
            }
            adc_new = ADC_get(adc_no * 2 + 1);
            if(adc_old[adc_no * 4 + 1] != adc_new){
                adc_old[adc_no * 4 + 1] = adc_new;
                tx_fifoset(0xB0);
                tx_fifoset(adc_no * 4 + 1);
                tx_fifoset(adc_new);
            }
            LED_set(adc_no * 2, 0);
            LED_set(adc_no * 2 + 1, 0);
        }
        else if(p == 1500){
            LED_set(adc_no * 2, 0);
            LED_set(adc_no * 2 + 1, 1);
        }
        else if(p > 1999){
            p = 0;
            adc_new = ADC_get(adc_no * 2);
            if(adc_old[adc_no * 4 + 2] != adc_new){
                adc_old[adc_no * 4 + 2] = adc_new;
                tx_fifoset(0xB0);
                tx_fifoset(adc_no * 4 + 2);
                tx_fifoset(adc_new);
            }
            adc_new = ADC_get(adc_no * 2 + 1);
            if(adc_old[adc_no * 4 + 3] != adc_new){
                adc_old[adc_no * 4 + 3] = adc_new;
                tx_fifoset(0xB0);
                tx_fifoset(adc_no * 4 + 3);
                tx_fifoset(adc_new);
            }
            LED_set(adc_no * 2, 0);
            LED_set(adc_no * 2 + 1, 0);
            adc_no++;
            if(adc_no > 1) adc_no = 0;
        }        
        tx_fifo_check();
        if(rx_fifo_check() == 1){
        }
        if(++j > 1000000){
            j = 0;
            counter = ++counter & 0x7F;
            tx_fifoset(0xC0);
            tx_fifoset(counter);
        }
    }
}


MIDI_sub2.h

unsigned char rxFIFO[256], txFIFO[256], adc_old[32];
unsigned char rx_top, rx_end, tx_top, tx_end, status, keyno, dcb;
int midi_message, adc_no;

RawSerial MIDI(PA_2,PA_3);
DigitalOut A_5(PB_8);
DigitalOut A_4(PB_9);
DigitalOut B_5(PC_7);
DigitalOut B_4(PA_9);
AnalogIn A_3(PA_7);
AnalogIn A_2(PA_6);
AnalogIn B_3(PA_5);
AnalogIn B_2(PA_0);

void LED_set(int num, int value){
    switch(num){
        case(0):
            A_5 = value;
            break;
        case(1):
            A_4 = value;
            break;
        case(2):
            B_5 = value;
            break;
        case(3):
            B_4 = value;
            break;
    }
    return;
}
    
unsigned char ADC_get(int num){
    unsigned short data = 0;
    switch(num){
        case(0):
            data = A_3.read_u16();
            break;
        case(1):
            data = A_2.read_u16();
            break;
        case(2):
            data = B_3.read_u16();
            break;
        case(3):
            data = B_2.read_u16();
            break;
    }
    return(data>>9);
}
    
int rx_fifo_check(void){
    unsigned char data;
    if(rx_top != rx_end){
        data = rxFIFO[rx_end];
        ++rx_end &= 255;
        if (data > 127){
            status = data;
            dcb = 0;
            return(0);
        }
        else if(status > 0xEF){
            return(0);
        }
        else if( (status > 0xBF) && (status < 0xE0) ){
            midi_message = (status<<16) + (data<<8);
            dcb = 0;
            return(1);
        }
        else if(dcb==0){
            keyno = data;
            dcb++;
            return(0);
        }
        else{
            midi_message = (status<<16) + (keyno<<8) + data;
            dcb = 0;
            return(1);
        }
    }
    return(0);
}

void rx_fifoset(void){
    rxFIFO[rx_top] = MIDI.getc();
    ++rx_top &= 255;
    return;
}

void tx_fifo_check(void){
    if(MIDI.writeable() == 1){
        if(tx_top != tx_end){
            MIDI.putc(txFIFO[tx_end]);
            ++tx_end &= 255;
        }
    }
    return;
}

void tx_fifoset(unsigned char data){
    txFIFO[tx_top] = data;
    ++tx_top &= 255;
    return;
}