MIDI interpreter using mbed
Dependencies: MIDI TextLCD mbed
main.cpp@1:af9dd50ffbc2, 2013-06-14 (annotated)
- Committer:
- kayekss
- Date:
- Fri Jun 14 12:41:54 2013 +0000
- Revision:
- 1:af9dd50ffbc2
- Parent:
- 0:93868ff6d1b1
Fixed pitchbend byte order
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kayekss | 0:93868ff6d1b1 | 1 | #include "mbed.h" |
kayekss | 0:93868ff6d1b1 | 2 | #include "TextLCD.h" |
kayekss | 0:93868ff6d1b1 | 3 | |
kayekss | 0:93868ff6d1b1 | 4 | #include "define.h" |
kayekss | 0:93868ff6d1b1 | 5 | #include "MIDIChannel.h" |
kayekss | 0:93868ff6d1b1 | 6 | #include "Instrument.h" |
kayekss | 0:93868ff6d1b1 | 7 | #include "RingBuffer.h" |
kayekss | 0:93868ff6d1b1 | 8 | #include "events.h" |
kayekss | 0:93868ff6d1b1 | 9 | #include "parser.h" |
kayekss | 0:93868ff6d1b1 | 10 | |
kayekss | 0:93868ff6d1b1 | 11 | Serial midiIn(/*Tx*/ NC, /*Rx*/ p10); |
kayekss | 0:93868ff6d1b1 | 12 | TextLCD lcd(/*RS*/ p26, /*E*/ p25, /*D4 through D7*/ p24, p23, p22, p21, TextLCD::LCD16x2); |
kayekss | 0:93868ff6d1b1 | 13 | BusOut obLeds(LED1, LED2, LED3, LED4); |
kayekss | 0:93868ff6d1b1 | 14 | I2C i2c(/*SDA*/ p28, /*SCL*/ p27); |
kayekss | 0:93868ff6d1b1 | 15 | Timer t; |
kayekss | 0:93868ff6d1b1 | 16 | #ifdef USE_PC_SERIAL |
kayekss | 0:93868ff6d1b1 | 17 | Serial pc(/*Tx*/ USBTX, /*Rx*/ USBRX); |
kayekss | 0:93868ff6d1b1 | 18 | #endif |
kayekss | 0:93868ff6d1b1 | 19 | |
kayekss | 0:93868ff6d1b1 | 20 | uint8_t const performerAddress[NUM_PERFORMER] = { 0x34 }; |
kayekss | 0:93868ff6d1b1 | 21 | |
kayekss | 0:93868ff6d1b1 | 22 | Instrument inst[NUM_INSTRUMENT]; |
kayekss | 0:93868ff6d1b1 | 23 | uint32_t receivedBytes; |
kayekss | 0:93868ff6d1b1 | 24 | RingBuffer<char> buffer(BUFFER_LENGTH); |
kayekss | 0:93868ff6d1b1 | 25 | |
kayekss | 0:93868ff6d1b1 | 26 | extern "C" |
kayekss | 0:93868ff6d1b1 | 27 | void HardFault_Handler() { |
kayekss | 0:93868ff6d1b1 | 28 | volatile uint32_t i; |
kayekss | 0:93868ff6d1b1 | 29 | |
kayekss | 0:93868ff6d1b1 | 30 | while (1) { |
kayekss | 0:93868ff6d1b1 | 31 | i = 0; |
kayekss | 0:93868ff6d1b1 | 32 | obLeds = obLeds ^ 0x8; |
kayekss | 0:93868ff6d1b1 | 33 | while (i < 1000000) i++; |
kayekss | 0:93868ff6d1b1 | 34 | } |
kayekss | 0:93868ff6d1b1 | 35 | } |
kayekss | 0:93868ff6d1b1 | 36 | |
kayekss | 0:93868ff6d1b1 | 37 | void readMidiIn() { |
kayekss | 0:93868ff6d1b1 | 38 | char c; |
kayekss | 0:93868ff6d1b1 | 39 | |
kayekss | 0:93868ff6d1b1 | 40 | // Put a MIDI input byte into buffer if available |
kayekss | 0:93868ff6d1b1 | 41 | if (midiIn.readable()) { |
kayekss | 0:93868ff6d1b1 | 42 | c = midiIn.getc(); |
kayekss | 0:93868ff6d1b1 | 43 | receivedBytes++; |
kayekss | 0:93868ff6d1b1 | 44 | |
kayekss | 0:93868ff6d1b1 | 45 | // Discard if input byte is an active sensing message |
kayekss | 0:93868ff6d1b1 | 46 | if (c != 0xfe) { |
kayekss | 0:93868ff6d1b1 | 47 | buffer.write(c); |
kayekss | 0:93868ff6d1b1 | 48 | /* |
kayekss | 0:93868ff6d1b1 | 49 | #ifdef USE_PC_SERIAL |
kayekss | 0:93868ff6d1b1 | 50 | pc.printf("%02X\r\n", c); |
kayekss | 0:93868ff6d1b1 | 51 | #endif |
kayekss | 0:93868ff6d1b1 | 52 | */ |
kayekss | 0:93868ff6d1b1 | 53 | } |
kayekss | 0:93868ff6d1b1 | 54 | } |
kayekss | 0:93868ff6d1b1 | 55 | } |
kayekss | 0:93868ff6d1b1 | 56 | |
kayekss | 0:93868ff6d1b1 | 57 | void setup() { |
kayekss | 0:93868ff6d1b1 | 58 | // Setup MIDI port |
kayekss | 0:93868ff6d1b1 | 59 | midiIn.baud(31250); |
kayekss | 0:93868ff6d1b1 | 60 | midiIn.format(8, Serial::None, 1); |
kayekss | 0:93868ff6d1b1 | 61 | midiIn.attach(readMidiIn, Serial::RxIrq); |
kayekss | 0:93868ff6d1b1 | 62 | receivedBytes = 0; |
kayekss | 0:93868ff6d1b1 | 63 | |
kayekss | 0:93868ff6d1b1 | 64 | #ifdef USE_PC_SERIAL |
kayekss | 0:93868ff6d1b1 | 65 | // Setup PC Serial port |
kayekss | 0:93868ff6d1b1 | 66 | pc.baud(115200); |
kayekss | 0:93868ff6d1b1 | 67 | pc.format(8, Serial::None, 1); |
kayekss | 0:93868ff6d1b1 | 68 | #endif |
kayekss | 0:93868ff6d1b1 | 69 | |
kayekss | 0:93868ff6d1b1 | 70 | // Initialize Text LCD |
kayekss | 0:93868ff6d1b1 | 71 | lcd.cls(); |
kayekss | 0:93868ff6d1b1 | 72 | wait_ms(10); |
kayekss | 0:93868ff6d1b1 | 73 | |
kayekss | 0:93868ff6d1b1 | 74 | // Initialize onboard LEDs |
kayekss | 0:93868ff6d1b1 | 75 | obLeds = 0x0; |
kayekss | 0:93868ff6d1b1 | 76 | |
kayekss | 0:93868ff6d1b1 | 77 | // Start Timer |
kayekss | 0:93868ff6d1b1 | 78 | t.start(); |
kayekss | 0:93868ff6d1b1 | 79 | } |
kayekss | 0:93868ff6d1b1 | 80 | |
kayekss | 0:93868ff6d1b1 | 81 | void loop() { |
kayekss | 0:93868ff6d1b1 | 82 | /* |
kayekss | 0:93868ff6d1b1 | 83 | lcd.locate(0, 0); |
kayekss | 0:93868ff6d1b1 | 84 | lcd.printf("Recv'd: %8u", receivedBytes); |
kayekss | 0:93868ff6d1b1 | 85 | lcd.locate(0, 1); |
kayekss | 0:93868ff6d1b1 | 86 | lcd.printf("Buffer: %8u", buffer.items()); |
kayekss | 0:93868ff6d1b1 | 87 | */ |
kayekss | 0:93868ff6d1b1 | 88 | |
kayekss | 0:93868ff6d1b1 | 89 | // Parse message buffer |
kayekss | 0:93868ff6d1b1 | 90 | parseMessage(buffer); |
kayekss | 0:93868ff6d1b1 | 91 | } |
kayekss | 0:93868ff6d1b1 | 92 | |
kayekss | 0:93868ff6d1b1 | 93 | int main() { |
kayekss | 0:93868ff6d1b1 | 94 | setup(); |
kayekss | 0:93868ff6d1b1 | 95 | |
kayekss | 0:93868ff6d1b1 | 96 | while (1) { |
kayekss | 0:93868ff6d1b1 | 97 | loop(); |
kayekss | 0:93868ff6d1b1 | 98 | } |
kayekss | 0:93868ff6d1b1 | 99 | } |