MIDI interpreter using mbed

Dependencies:   MIDI TextLCD mbed

Committer:
kayekss
Date:
Fri Jun 14 09:25:58 2013 +0000
Revision:
0:93868ff6d1b1
MIDI event interpretion goes succesfully; Slave communication procedures are not implemented yet.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kayekss 0:93868ff6d1b1 1 #include <climits>
kayekss 0:93868ff6d1b1 2 #include "mbed.h"
kayekss 0:93868ff6d1b1 3
kayekss 0:93868ff6d1b1 4 #include "define.h"
kayekss 0:93868ff6d1b1 5 #include "Instrument.h"
kayekss 0:93868ff6d1b1 6 #include "RingBuffer.h"
kayekss 0:93868ff6d1b1 7
kayekss 0:93868ff6d1b1 8 extern Timer t;
kayekss 0:93868ff6d1b1 9
kayekss 0:93868ff6d1b1 10 extern Instrument inst[NUM_INSTRUMENT];
kayekss 0:93868ff6d1b1 11 extern uint8_t const performerAddress[NUM_PERFORMER];
kayekss 0:93868ff6d1b1 12
kayekss 0:93868ff6d1b1 13
kayekss 0:93868ff6d1b1 14 void dispatchNoteOff(uint8_t statusByte, uint8_t noteNumber) {
kayekss 0:93868ff6d1b1 15 uint16_t targetPerformer;
kayekss 0:93868ff6d1b1 16 char message[2];
kayekss 0:93868ff6d1b1 17
kayekss 0:93868ff6d1b1 18 // Find an Instrument sounding the specified note
kayekss 0:93868ff6d1b1 19 for (uint16_t i = 0; i < NUM_INSTRUMENT; i++) {
kayekss 0:93868ff6d1b1 20 if (inst[i].channel == (statusByte & 0x0f) + 1
kayekss 0:93868ff6d1b1 21 && inst[i].noteNumber == noteNumber) {
kayekss 0:93868ff6d1b1 22 inst[i].noteOnMs = 0;
kayekss 0:93868ff6d1b1 23 inst[i].channel = 0;
kayekss 0:93868ff6d1b1 24 inst[i].noteNumber = 0;
kayekss 0:93868ff6d1b1 25 inst[i].velocity = 0;
kayekss 0:93868ff6d1b1 26
kayekss 0:93868ff6d1b1 27 // Send note off message to Performer
kayekss 0:93868ff6d1b1 28 targetPerformer = i / NUM_INSTRUMENT_IN_PERFORMER;
kayekss 0:93868ff6d1b1 29 message[0] = 0x80;
kayekss 0:93868ff6d1b1 30 message[1] = i % NUM_INSTRUMENT_IN_PERFORMER;
kayekss 0:93868ff6d1b1 31 // i2c.write(performerAddress[targetPerformer] << 1, message, 2);
kayekss 0:93868ff6d1b1 32 return;
kayekss 0:93868ff6d1b1 33 }
kayekss 0:93868ff6d1b1 34 }
kayekss 0:93868ff6d1b1 35 }
kayekss 0:93868ff6d1b1 36
kayekss 0:93868ff6d1b1 37 void dispatchNoteOn(uint8_t statusByte, uint8_t noteNumber, uint8_t velocity) {
kayekss 0:93868ff6d1b1 38 uint32_t currentMs = t.read_ms();
kayekss 0:93868ff6d1b1 39 uint32_t oldestMs = UINT_MAX;
kayekss 0:93868ff6d1b1 40 uint16_t oldest = 0;
kayekss 0:93868ff6d1b1 41 uint16_t targetPerformer;
kayekss 0:93868ff6d1b1 42 char message[4];
kayekss 0:93868ff6d1b1 43
kayekss 0:93868ff6d1b1 44 // Find a free Instrument or the one with the oldest note
kayekss 0:93868ff6d1b1 45 for (uint16_t i = 0; i < NUM_INSTRUMENT; i++) {
kayekss 0:93868ff6d1b1 46 if (inst[i].noteOnMs < oldestMs) {
kayekss 0:93868ff6d1b1 47 oldest = i;
kayekss 0:93868ff6d1b1 48 oldestMs = inst[i].noteOnMs;
kayekss 0:93868ff6d1b1 49 }
kayekss 0:93868ff6d1b1 50 }
kayekss 0:93868ff6d1b1 51
kayekss 0:93868ff6d1b1 52 inst[oldest].noteOnMs = currentMs;
kayekss 0:93868ff6d1b1 53 inst[oldest].channel = (statusByte & 0x0f) + 1;
kayekss 0:93868ff6d1b1 54 inst[oldest].noteNumber = noteNumber;
kayekss 0:93868ff6d1b1 55 inst[oldest].velocity = velocity;
kayekss 0:93868ff6d1b1 56
kayekss 0:93868ff6d1b1 57 // Send note on message to Performer
kayekss 0:93868ff6d1b1 58 targetPerformer = oldest / NUM_INSTRUMENT_IN_PERFORMER;
kayekss 0:93868ff6d1b1 59 message[0] = statusByte;
kayekss 0:93868ff6d1b1 60 message[1] = oldest % NUM_INSTRUMENT_IN_PERFORMER;
kayekss 0:93868ff6d1b1 61 message[2] = noteNumber;
kayekss 0:93868ff6d1b1 62 message[3] = velocity;
kayekss 0:93868ff6d1b1 63 // i2c.write(performerAddress[targetPerformer] << 1, message, 4);
kayekss 0:93868ff6d1b1 64 }
kayekss 0:93868ff6d1b1 65
kayekss 0:93868ff6d1b1 66 void setControlChange(uint8_t statusByte, uint8_t controlNumber, uint8_t value) {
kayekss 0:93868ff6d1b1 67 char message[3];
kayekss 0:93868ff6d1b1 68
kayekss 0:93868ff6d1b1 69 message[0] = statusByte;
kayekss 0:93868ff6d1b1 70 message[1] = controlNumber;
kayekss 0:93868ff6d1b1 71 message[2] = value;
kayekss 0:93868ff6d1b1 72 /*
kayekss 0:93868ff6d1b1 73 for (uint8_t i = 0; i < NUM_PERFORMER; i++) {
kayekss 0:93868ff6d1b1 74 i2c.write(performerAddress[i] << 1, message, 3);
kayekss 0:93868ff6d1b1 75 }
kayekss 0:93868ff6d1b1 76 */
kayekss 0:93868ff6d1b1 77 }
kayekss 0:93868ff6d1b1 78
kayekss 0:93868ff6d1b1 79 void setProgramChange(uint8_t statusByte, uint8_t programNumber) {
kayekss 0:93868ff6d1b1 80 char message[2];
kayekss 0:93868ff6d1b1 81
kayekss 0:93868ff6d1b1 82 message[0] = statusByte;
kayekss 0:93868ff6d1b1 83 message[1] = programNumber;
kayekss 0:93868ff6d1b1 84 /*
kayekss 0:93868ff6d1b1 85 for (uint8_t i = 0; i < NUM_PERFORMER; i++) {
kayekss 0:93868ff6d1b1 86 i2c.write(performerAddress[i] << 1, message, 2);
kayekss 0:93868ff6d1b1 87 }
kayekss 0:93868ff6d1b1 88 */
kayekss 0:93868ff6d1b1 89 }
kayekss 0:93868ff6d1b1 90
kayekss 0:93868ff6d1b1 91 void setPitchBend(uint8_t statusByte, uint16_t bend) {
kayekss 0:93868ff6d1b1 92 char message[3];
kayekss 0:93868ff6d1b1 93
kayekss 0:93868ff6d1b1 94 message[0] = statusByte;
kayekss 0:93868ff6d1b1 95 message[1] = bend >> 8;
kayekss 0:93868ff6d1b1 96 message[2] = bend & 0x00ff;
kayekss 0:93868ff6d1b1 97 /*
kayekss 0:93868ff6d1b1 98 for (uint8_t i = 0; i < NUM_PERFORMER; i++) {
kayekss 0:93868ff6d1b1 99 i2c.write(performerAddress[i] << 1, message, 3);
kayekss 0:93868ff6d1b1 100 }
kayekss 0:93868ff6d1b1 101 */
kayekss 0:93868ff6d1b1 102 }