diff --git a/Plugins/MIDI/MIDI/BMPlayer.cpp b/Plugins/MIDI/MIDI/BMPlayer.cpp index 5a899fd64..02cc9808d 100644 --- a/Plugins/MIDI/MIDI/BMPlayer.cpp +++ b/Plugins/MIDI/MIDI/BMPlayer.cpp @@ -274,29 +274,25 @@ void BMPlayer::setSincInterpolation(bool enable) { } void BMPlayer::send_event(uint32_t b) { - if(!(b & 0x80000000)) { - unsigned char event[3]; - event[0] = (unsigned char)b; - event[1] = (unsigned char)(b >> 8); - event[2] = (unsigned char)(b >> 16); - unsigned port = (b >> 24) & 0x7F; - unsigned channel = b & 0x0F; - unsigned command = b & 0xF0; - unsigned event_length = (command == 0xC0 || command == 0xD0) ? 2 : 3; - if(port > 2) port = 2; - if(bank_lsb_overridden && command == 0xB0 && event[1] == 0x20) return; - BASS_MIDI_StreamEvents(_stream[port], BASS_MIDI_EVENTS_RAW + 1 + channel, event, event_length); - } else { - uint32_t n = b & 0xffffff; - const uint8_t *data; - std::size_t size, port; - mSysexMap.get_entry(n, data, size, port); - if(port > 2) port = 2; - BASS_MIDI_StreamEvents(_stream[port], BASS_MIDI_EVENTS_RAW, data, (unsigned int)size); - if(port == 0) { - BASS_MIDI_StreamEvents(_stream[1], BASS_MIDI_EVENTS_RAW, data, (unsigned int)size); - BASS_MIDI_StreamEvents(_stream[2], BASS_MIDI_EVENTS_RAW, data, (unsigned int)size); - } + uint8_t event[3]; + event[0] = static_cast(b); + event[1] = static_cast(b >> 8); + event[2] = static_cast(b >> 16); + unsigned port = (b >> 24) & 0x7F; + const unsigned channel = b & 0x0F; + const unsigned command = b & 0xF0; + const unsigned event_length = (command >= 0xF8 && command <= 0xFF) ? 1 : ((command == 0xC0 || command == 0xD0) ? 2 : 3); + if(port > 2) port = 0; + if(bank_lsb_overridden && command == 0xB0 && event[1] == 0x20) return; + BASS_MIDI_StreamEvents(_stream[port], BASS_MIDI_EVENTS_RAW + 1 + channel, event, event_length); +} + +void BMPlayer::send_sysex(const uint8_t *data, size_t size, size_t port) { + if(port > 2) port = 0; + BASS_MIDI_StreamEvents(_stream[port], BASS_MIDI_EVENTS_RAW, event, static_cast(size)); + if(port == 0) { + BASS_MIDI_StreamEvents(_stream[1], BASS_MIDI_EVENTS_RAW, data, static_cast(size)); + BASS_MIDI_StreamEvents(_stream[2], BASS_MIDI_EVENTS_RAW, data, static_cast(size)); } } diff --git a/Plugins/MIDI/MIDI/BMPlayer.h b/Plugins/MIDI/MIDI/BMPlayer.h index 818261d5e..81be0608e 100644 --- a/Plugins/MIDI/MIDI/BMPlayer.h +++ b/Plugins/MIDI/MIDI/BMPlayer.h @@ -22,6 +22,7 @@ class BMPlayer : public MIDIPlayer { private: virtual void send_event(uint32_t b); + virtual void send_sysex(const uint8_t* data, size_t size, size_t port); virtual void render(float* out, unsigned long count); virtual void shutdown();