MIDI interpreter using mbed
Dependencies: MIDI TextLCD mbed
events.cpp@0:93868ff6d1b1, 2013-06-14 (annotated)
- 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?
User | Revision | Line number | New 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 | } |