///////////////////////////////////////////////////////////////////////////// // This function sends the SysEx header if merger disabled // if force == 1, send the footer regardless of merger state ///////////////////////////////////////////////////////////////////////////// s32 LC_SYSEX_SendResponse(u8 *buffer, u8 len) { int i; u8 sysex_buffer[128]; // should be enough? int sysex_buffer_ix = 0; // send header for(i=0; i<sizeof(sysex_header); ++i) sysex_buffer[sysex_buffer_ix++] = sysex_header[i]; // add SysEx ID sysex_buffer[sysex_buffer_ix++] = sysex_id; // send buffer content for(i=0; i<len; ++i) sysex_buffer[sysex_buffer_ix++] = buffer[i]; // send footer sysex_buffer[sysex_buffer_ix++] = 0xf7; // finally send SysEx stream and return error status return MIOS32_MIDI_SendSysEx(DEFAULT, (u8 *)sysex_buffer, sysex_buffer_ix); }
///////////////////////////////////////////////////////////////////////////// // This function parses an incoming sysex stream for MIOS32 commands ///////////////////////////////////////////////////////////////////////////// s32 APP_SYSEX_Parser(mios32_midi_port_t port, u8 midi_in) { // determine SysEx buffer int sysex_in = 0; switch( port ) { case USB0: sysex_in = SYSEX_BUFFER_IN_USB0; break; case USB1: sysex_in = SYSEX_BUFFER_IN_USB1; break; case UART0: sysex_in = SYSEX_BUFFER_IN_UART0; break; case UART1: sysex_in = SYSEX_BUFFER_IN_UART1; break; case OSC0: sysex_in = SYSEX_BUFFER_IN_OSC0; break; case OSC1: sysex_in = SYSEX_BUFFER_IN_OSC1; break; default: return -1; // not assigned } // store value into buffer, send when: // o 0xf7 (end of stream) has been received // o 0xf0 (start of stream) has been received although buffer isn't empty // o buffer size has been exceeded // we check for (SYSEX_BUFFER_SIZE-1), so that we always have a free byte for F7 u32 buffer_len = sysex_buffer_len[sysex_in]; if( midi_in == 0xf7 || (midi_in == 0xf0 && buffer_len != 0) || buffer_len >= (SYSEX_BUFFER_SIZE-1) ) { if( midi_in == 0xf7 && buffer_len < SYSEX_BUFFER_SIZE ) // note: we always have a free byte for F7 sysex_buffer[sysex_in][sysex_buffer_len[sysex_in]++] = midi_in; switch( port ) { case USB0: MIOS32_MIDI_SendSysEx(UART0, sysex_buffer[sysex_in], sysex_buffer_len[sysex_in]); OSC_CLIENT_SendSysEx(0, sysex_buffer[sysex_in], sysex_buffer_len[sysex_in]); break; case USB1: MIOS32_MIDI_SendSysEx(UART1, sysex_buffer[sysex_in], sysex_buffer_len[sysex_in]); OSC_CLIENT_SendSysEx(1, sysex_buffer[sysex_in], sysex_buffer_len[sysex_in]); break; case UART0: MIOS32_MIDI_SendSysEx(USB0, sysex_buffer[sysex_in], sysex_buffer_len[sysex_in]); OSC_CLIENT_SendSysEx(2, sysex_buffer[sysex_in], sysex_buffer_len[sysex_in]); break; case UART1: MIOS32_MIDI_SendSysEx(USB1, sysex_buffer[sysex_in], sysex_buffer_len[sysex_in]); OSC_CLIENT_SendSysEx(3, sysex_buffer[sysex_in], sysex_buffer_len[sysex_in]); break; case OSC0: MIOS32_MIDI_SendSysEx(USB0, sysex_buffer[sysex_in], sysex_buffer_len[sysex_in]); MIOS32_MIDI_SendSysEx(UART0, sysex_buffer[sysex_in], sysex_buffer_len[sysex_in]); break; case OSC1: MIOS32_MIDI_SendSysEx(USB1, sysex_buffer[sysex_in], sysex_buffer_len[sysex_in]); MIOS32_MIDI_SendSysEx(UART1, sysex_buffer[sysex_in], sysex_buffer_len[sysex_in]); break; } // empty buffer sysex_buffer_len[sysex_in] = 0; // fill with next byte if buffer size hasn't been exceeded if( midi_in != 0xf7 ) sysex_buffer[sysex_in][sysex_buffer_len[sysex_in]++] = midi_in; } else { // add to buffer sysex_buffer[sysex_in][sysex_buffer_len[sysex_in]++] = midi_in; } return 0; // no error }