From 99b895bd1e63ca263bf4361bd2e4cdf4f7cd6c6f Mon Sep 17 00:00:00 2001 From: falkTX Date: Sat, 16 Nov 2013 01:39:50 +0000 Subject: [PATCH] Pass raw midi data to linuxsampler, fixes missing channel pressure --- source/backend/plugin/LinuxSamplerPlugin.cpp | 68 +++++--------------- 1 file changed, 17 insertions(+), 51 deletions(-) diff --git a/source/backend/plugin/LinuxSamplerPlugin.cpp b/source/backend/plugin/LinuxSamplerPlugin.cpp index 3cf2b1910..51b68023b 100644 --- a/source/backend/plugin/LinuxSamplerPlugin.cpp +++ b/source/backend/plugin/LinuxSamplerPlugin.cpp @@ -764,57 +764,23 @@ public: uint8_t status = MIDI_GET_STATUS_FROM_DATA(midiEvent.data); uint8_t channel = event.channel; - - // Fix bad note-off (per DSSI spec) - if (MIDI_IS_STATUS_NOTE_ON(status) && midiEvent.data[2] == 0) - status -= 0x10; - - int32_t fragmentPos = sampleAccurate ? startTime : time; - - if (MIDI_IS_STATUS_NOTE_OFF(status)) - { - const uint8_t note = midiEvent.data[1]; - - fMidiInputPort->DispatchNoteOff(note, 0, channel, fragmentPos); - - postponeRtEvent(kPluginPostRtEventNoteOff, channel, note, 0.0f); - } - else if (MIDI_IS_STATUS_NOTE_ON(status)) - { - const uint8_t note = midiEvent.data[1]; - const uint8_t velo = midiEvent.data[2]; - - fMidiInputPort->DispatchNoteOn(note, velo, channel, fragmentPos); - - postponeRtEvent(kPluginPostRtEventNoteOn, channel, note, velo); - } - else if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status) && (fOptions & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) != 0) - { - //const uint8_t note = midiEvent.data[1]; - //const uint8_t pressure = midiEvent.data[2]; - - // unsupported - } - else if (MIDI_IS_STATUS_CONTROL_CHANGE(status) && (fOptions & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0) - { - const uint8_t control = midiEvent.data[1]; - const uint8_t value = midiEvent.data[2]; - - fMidiInputPort->DispatchControlChange(control, value, channel, fragmentPos); - } - else if (MIDI_IS_STATUS_AFTERTOUCH(status) && (fOptions & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) != 0) - { - //const uint8_t pressure = midiEvent.data[1]; - - // unsupported - } - else if (MIDI_IS_STATUS_PITCH_WHEEL_CONTROL(status) && (fOptions & PLUGIN_OPTION_SEND_PITCHBEND) != 0) - { - const uint8_t lsb = midiEvent.data[1]; - const uint8_t msb = midiEvent.data[2]; - - fMidiInputPort->DispatchPitchbend(((msb << 7) | lsb) - 8192, channel, fragmentPos); - } + uint32_t mtime = sampleAccurate ? startTime : time; + + if (MIDI_IS_STATUS_AFTERTOUCH(status) && (fOptions & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) == 0) + continue; + if (MIDI_IS_STATUS_CONTROL_CHANGE(status) && (fOptions & PLUGIN_OPTION_SEND_CONTROL_CHANGES) == 0) + continue; + if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status) && (fOptions & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) == 0) + continue; + if (MIDI_IS_STATUS_PITCH_WHEEL_CONTROL(status) && (fOptions & PLUGIN_OPTION_SEND_PITCHBEND) == 0) + continue; + + fMidiInputPort->DispatchRaw((uint8_t*)midiEvent.data, mtime); + + if (status == MIDI_STATUS_NOTE_ON) + postponeRtEvent(kPluginPostRtEventNoteOn, channel, midiEvent.data[1], midiEvent.data[2]); + else if (status == MIDI_STATUS_NOTE_OFF) + postponeRtEvent(kPluginPostRtEventNoteOff, channel, midiEvent.data[1], 0.0f); break; }