MIDI interpreter using mbed

Dependencies:   MIDI TextLCD mbed

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?

UserRevisionLine numberNew 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 }