MIDI interpreter using mbed

Dependencies:   MIDI TextLCD mbed

events.cpp

Committer:
kayekss
Date:
2013-06-14
Revision:
0:93868ff6d1b1

File content as of revision 0:93868ff6d1b1:

#include <climits>
#include "mbed.h"

#include "define.h"
#include "Instrument.h"
#include "RingBuffer.h"

extern Timer t;

extern Instrument inst[NUM_INSTRUMENT];
extern uint8_t const performerAddress[NUM_PERFORMER];


void dispatchNoteOff(uint8_t statusByte, uint8_t noteNumber) {
    uint16_t targetPerformer;
    char message[2];

    // Find an Instrument sounding the specified note
    for (uint16_t i = 0; i < NUM_INSTRUMENT; i++) {
        if (inst[i].channel == (statusByte & 0x0f) + 1
            && inst[i].noteNumber == noteNumber) {
            inst[i].noteOnMs = 0;
            inst[i].channel = 0;
            inst[i].noteNumber = 0;
            inst[i].velocity = 0;
            
            // Send note off message to Performer
            targetPerformer = i / NUM_INSTRUMENT_IN_PERFORMER;
            message[0] = 0x80;
            message[1] = i % NUM_INSTRUMENT_IN_PERFORMER;
            // i2c.write(performerAddress[targetPerformer] << 1, message, 2);
            return;
        }
    }
}

void dispatchNoteOn(uint8_t statusByte, uint8_t noteNumber, uint8_t velocity) {
    uint32_t currentMs = t.read_ms();
    uint32_t oldestMs = UINT_MAX;
    uint16_t oldest = 0;
    uint16_t targetPerformer;
    char message[4];
    
    // Find a free Instrument or the one with the oldest note
    for (uint16_t i = 0; i < NUM_INSTRUMENT; i++) {
        if (inst[i].noteOnMs < oldestMs) {
            oldest = i;
            oldestMs = inst[i].noteOnMs;
        }
    }
    
    inst[oldest].noteOnMs = currentMs;
    inst[oldest].channel = (statusByte & 0x0f) + 1;
    inst[oldest].noteNumber = noteNumber;
    inst[oldest].velocity = velocity;
        
    // Send note on message to Performer
    targetPerformer = oldest / NUM_INSTRUMENT_IN_PERFORMER;
    message[0] = statusByte;
    message[1] = oldest % NUM_INSTRUMENT_IN_PERFORMER;
    message[2] = noteNumber;
    message[3] = velocity;
    // i2c.write(performerAddress[targetPerformer] << 1, message, 4);
}

void setControlChange(uint8_t statusByte, uint8_t controlNumber, uint8_t value) {
    char message[3];
    
    message[0] = statusByte;
    message[1] = controlNumber;
    message[2] = value;
    /*
    for (uint8_t i = 0; i < NUM_PERFORMER; i++) {
        i2c.write(performerAddress[i] << 1, message, 3);
    }
    */
}

void setProgramChange(uint8_t statusByte, uint8_t programNumber) {
    char message[2];
    
    message[0] = statusByte;
    message[1] = programNumber;
    /*
    for (uint8_t i = 0; i < NUM_PERFORMER; i++) {
        i2c.write(performerAddress[i] << 1, message, 2);
    }
    */
}

void setPitchBend(uint8_t statusByte, uint16_t bend) {
    char message[3];
    
    message[0] = statusByte;
    message[1] = bend >> 8;
    message[2] = bend & 0x00ff;
    /*
    for (uint8_t i = 0; i < NUM_PERFORMER; i++) {
        i2c.write(performerAddress[i] << 1, message, 3);
    }
    */
}