From d7c4299cd4aaaabcce3c5d6eab3a4f693dd784cc Mon Sep 17 00:00:00 2001 From: Jonas Gunz Date: Sat, 22 Jul 2017 12:22:52 +0200 Subject: midi input handling redone --- floppyMusic/midi.c | 107 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 66 insertions(+), 41 deletions(-) (limited to 'floppyMusic/midi.c') diff --git a/floppyMusic/midi.c b/floppyMusic/midi.c index ca32d5a..8e760a8 100644 --- a/floppyMusic/midi.c +++ b/floppyMusic/midi.c @@ -7,53 +7,65 @@ #include "midi.h" -const uint16_t midi_code_frequency_table[] = {8,9,9,10,10,11,12,12,13,14,15,15,16,17,18,19,21,22,23,25,26,28,29,31,33,35,37,39,41,44,46,49,52,55,58,62,65,69,73,78,82,87,93,98,104,110,117,123,131,139,147,156,165,175,185,196,208,220,233,247,262,277,294,311,330,349,370,392,415,440,466,494,523,554,587,622,659,698,740,784,831,880,932,988,1047,1109,1175,1245,1319,1397,1480,1568,1661,1760,1865,1976,2093,2217,2349,2489,2637,2794,2960,3136,3322,3520,3729,3951,4186,4435,4699,4978,5274,5588,5920,6272}; +static const uint16_t midi_code_frequency_table[] = {8,9,9,10,10,11,12,12,13,14,15,15,16,17,18,19,21,22,23,25,26,28,29,31,33,35,37,39,41,44,46,49,52,55,58,62,65,69,73,78,82,87,93,98,104,110,117,123,131,139,147,156,165,175,185,196,208,220,233,247,262,277,294,311,330,349,370,392,415,440,466,494,523,554,587,622,659,698,740,784,831,880,932,988,1047,1109,1175,1245,1319,1397,1480,1568,1661,1760,1865,1976,2093,2217,2349,2489,2637,2794,2960,3136,3322,3520,3729,3951,4186,4435,4699,4978,5274,5588,5920,6272}; + +static uint8_t midi_recv_ptr = 0; ISR(USART_RXC_vect) { - char data[3] = {0x00, 0x00, 0x00}; - char command, /*channel,*/ note/*, velocity*/; + midi_recv_buffer[midi_recv_ptr] = UDR; + midi_recv_ptr++; +} - UCSRB &= ~(1<>8) & 0xff; + UBRRL = (unsigned char) ubrr & 0xff; - for(int i = 0; i < 20; i++) { //Wait 100µs for next datapackage - _delay_us(1); - if((UCSRA & (1<> 4) & 0x0f; // Shift command into first 4 bits; note = data[1]; - /*velocity = data2;*/ - - //PORTA = ~command; - - switch(command) + velocity = data[2]; + + midi_command(command, note, velocity); + +} + +void midi_command(char _cmd, char _note, char _vel) +{ + switch(_cmd) { case 0x08: //Note off PORTA = 1; - midi_update_note(note, 0); + midi_update_note(_note, 0); break; case 0x09: //Note on PORTA = 2; - midi_update_note(note, 1); + midi_update_note(_note, 1); break; /* case 0x0A:break; //Note Fade Out @@ -68,23 +80,25 @@ ISR(USART_RXC_vect) } } -void midi_setup() +uint8_t midi_recv_avail() { - midi_active_channels = 0x00; - DDRA = 0xff; - PORTA = 0xff; - //UART init - unsigned int ubrr = (F_CPU / (16 * _MIDI_LINK_SPEED)) - 1; + return midi_recv_ptr; +} - UBRRH = (unsigned char) (ubrr>>8) & 0xff; - UBRRL = (unsigned char) ubrr & 0xff; +char midi_get_recv_buf() +{ + if(midi_recv_ptr > 0) + midi_recv_ptr--; + else + return 0x00; - UCSRB = (1<