forked from PAWPAW-Mirror/lib_xua
First commit
This commit is contained in:
68
module_usb_midi/src/midioutparse.xc
Normal file
68
module_usb_midi/src/midioutparse.xc
Normal file
@@ -0,0 +1,68 @@
|
||||
/**
|
||||
* @file midioutparse.xc
|
||||
* @brief Parses USB-MIDI events into set of MIDI bytes
|
||||
* @author Russell Gallop, XMOS Semiconductor
|
||||
* @version 0.1
|
||||
*/
|
||||
|
||||
#include "midioutparse.h"
|
||||
|
||||
/**
|
||||
* @brief Breaks a USB-MIDI event into it's constituant fields
|
||||
*
|
||||
* @param[in] ev USB-MIDI event
|
||||
*/
|
||||
{unsigned, unsigned, unsigned, unsigned, unsigned} breakEvent(unsigned ev) {
|
||||
unsigned cable_number = (ev >> 28) & 0xf;
|
||||
unsigned codeIndexNumber = (ev >> 24) & 0xf;
|
||||
unsigned midi0 = (ev >> 16) & 0xff;
|
||||
unsigned midi1 = (ev >> 8) & 0xff;
|
||||
unsigned midi2 = (ev >> 0) & 0xff;
|
||||
return {cable_number, codeIndexNumber, midi0, midi1, midi2};
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Parse a USB-MIDI event into the MIDI bytes and a length field
|
||||
*
|
||||
* @param[in] ev USB-MIDI event
|
||||
*/
|
||||
{unsigned, unsigned, unsigned, unsigned} midi_out_parse(unsigned event) {
|
||||
unsigned cable_number; // ignore this for now!
|
||||
unsigned codeIndexNumber;
|
||||
unsigned midi[3];
|
||||
unsigned size = 0;
|
||||
|
||||
{cable_number, codeIndexNumber, midi[0], midi[1], midi[2]} = breakEvent(event);
|
||||
// Not doing anything with cable number
|
||||
switch (codeIndexNumber) {
|
||||
case 0x3: // Three-byte system Common messages like SPP, etc.
|
||||
case 0x4: // SysEx starts or continues
|
||||
case 0x7: // SysEx ends with the following three bytes
|
||||
case 0x8: // Note-off
|
||||
case 0x9: // Note-on
|
||||
case 0xA: // Poly-KeyPress
|
||||
case 0xB: // Control Change
|
||||
case 0xE: // PitchBend Change
|
||||
{
|
||||
size = 3;
|
||||
break;
|
||||
}
|
||||
case 0x2: // Two-byte system Common messages like MTC, SongSelect, etc.
|
||||
case 0x6: // SysEx ends with the following two bytes
|
||||
case 0xC: // Program Change
|
||||
case 0xD: // Channel Pressure
|
||||
{
|
||||
size = 2;
|
||||
break;
|
||||
}
|
||||
case 0x5: // Single-byte System Common Message or SysEx ends with following single byte.
|
||||
case 0xF: // Single byte
|
||||
{
|
||||
size = 1;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return {midi[0], midi[1], midi[2], size};
|
||||
}
|
||||
Reference in New Issue
Block a user