ALSA MIDI driver:
Pith bend message now has correct size (was 2 bytes instead of 3). Recognized (but not implemented) 0xF? messages. SysEx messages will be reocognized as such, but their contents will be ignored.
This commit is contained in:
parent
90a224c6eb
commit
9c48eb1c59
2 changed files with 28 additions and 2 deletions
|
@ -52,7 +52,12 @@ void MIDIDriver::receive_input_packet(uint64_t timestamp, uint8_t *data, uint32_
|
||||||
uint32_t param_position = 1;
|
uint32_t param_position = 1;
|
||||||
|
|
||||||
if (length >= 1) {
|
if (length >= 1) {
|
||||||
if ((data[0] & 0x80) == 0x00) {
|
if (data[0] >= 0xF0) {
|
||||||
|
// channel does not apply to system common messages
|
||||||
|
event->set_channel(0);
|
||||||
|
event->set_message(data[0]);
|
||||||
|
last_received_message = data[0];
|
||||||
|
} else if ((data[0] & 0x80) == 0x00) {
|
||||||
// running status
|
// running status
|
||||||
event->set_channel(last_received_message & 0xF);
|
event->set_channel(last_received_message & 0xF);
|
||||||
event->set_message(last_received_message >> 4);
|
event->set_message(last_received_message >> 4);
|
||||||
|
|
|
@ -43,12 +43,30 @@ static int get_message_size(uint8_t message) {
|
||||||
case 0x90: // note on
|
case 0x90: // note on
|
||||||
case 0xA0: // aftertouch
|
case 0xA0: // aftertouch
|
||||||
case 0xB0: // continuous controller
|
case 0xB0: // continuous controller
|
||||||
|
case 0xE0: // pitch bend
|
||||||
|
case 0xF2: // song position pointer
|
||||||
return 3;
|
return 3;
|
||||||
|
|
||||||
case 0xC0: // patch change
|
case 0xC0: // patch change
|
||||||
case 0xD0: // channel pressure
|
case 0xD0: // channel pressure
|
||||||
case 0xE0: // pitch bend
|
case 0xF1: // time code quarter frame
|
||||||
|
case 0xF3: // song select
|
||||||
return 2;
|
return 2;
|
||||||
|
|
||||||
|
case 0xF0: // SysEx start
|
||||||
|
case 0xF4: // reserved
|
||||||
|
case 0xF5: // reserved
|
||||||
|
case 0xF6: // tune request
|
||||||
|
case 0xF7: // SysEx end
|
||||||
|
case 0xF8: // timing clock
|
||||||
|
case 0xF9: // reserved
|
||||||
|
case 0xFA: // start
|
||||||
|
case 0xFB: // continue
|
||||||
|
case 0xFC: // stop
|
||||||
|
case 0xFD: // reserved
|
||||||
|
case 0xFE: // active sensing
|
||||||
|
case 0xFF: // reset
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 256;
|
return 256;
|
||||||
|
@ -83,6 +101,9 @@ void MIDIDriverALSAMidi::thread_func(void *p_udata) {
|
||||||
bytes = 0;
|
bytes = 0;
|
||||||
}
|
}
|
||||||
expected_size = get_message_size(byte);
|
expected_size = get_message_size(byte);
|
||||||
|
// After a SysEx start, all bytes are data until a SysEx end, so
|
||||||
|
// we're going to end the command at the SES, and let the common
|
||||||
|
// driver ignore the following data bytes.
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bytes < 256) {
|
if (bytes < 256) {
|
||||||
|
|
Loading…
Reference in a new issue