From 6d5a40daa3810766ead500e0255b5d943a902c3a Mon Sep 17 00:00:00 2001 From: falkTX Date: Sun, 14 Jan 2018 13:36:21 +0100 Subject: [PATCH] Allow to send midi program-changes directly into vst plugins Closes #244 --- source/backend/plugin/CarlaPluginVST2.cpp | 32 +++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/source/backend/plugin/CarlaPluginVST2.cpp b/source/backend/plugin/CarlaPluginVST2.cpp index 246708753..f0ccc75a1 100644 --- a/source/backend/plugin/CarlaPluginVST2.cpp +++ b/source/backend/plugin/CarlaPluginVST2.cpp @@ -241,6 +241,7 @@ public: options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; options |= PLUGIN_OPTION_SEND_PITCHBEND; options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; + options |= PLUGIN_OPTION_SEND_PROGRAM_CHANGES; } return options; @@ -1323,6 +1324,21 @@ public: } // case kEngineControlEventTypeParameter case kEngineControlEventTypeMidiBank: + if ((pData->options & PLUGIN_OPTION_SEND_PROGRAM_CHANGES) != 0) + { + if (fMidiEventCount >= kPluginMaxMidiEvents*2) + continue; + + VstMidiEvent& vstMidiEvent(fMidiEvents[fMidiEventCount++]); + carla_zeroStruct(vstMidiEvent); + + vstMidiEvent.type = kVstMidiType; + vstMidiEvent.byteSize = kVstMidiEventSize; + vstMidiEvent.deltaFrames = static_cast(isSampleAccurate ? startTime : event.time); + vstMidiEvent.midiData[0] = char(MIDI_STATUS_CONTROL_CHANGE | (event.channel & MIDI_CHANNEL_BIT)); + vstMidiEvent.midiData[1] = MIDI_CONTROL_BANK_SELECT; + vstMidiEvent.midiData[2] = char(ctrlEvent.param); + } break; case kEngineControlEventTypeMidiProgram: @@ -1335,6 +1351,20 @@ public: break; } } + else if (pData->options & PLUGIN_OPTION_SEND_PROGRAM_CHANGES) + { + if (fMidiEventCount >= kPluginMaxMidiEvents*2) + continue; + + VstMidiEvent& vstMidiEvent(fMidiEvents[fMidiEventCount++]); + carla_zeroStruct(vstMidiEvent); + + vstMidiEvent.type = kVstMidiType; + vstMidiEvent.byteSize = kVstMidiEventSize; + vstMidiEvent.deltaFrames = static_cast(isSampleAccurate ? startTime : event.time); + vstMidiEvent.midiData[0] = char(MIDI_STATUS_PROGRAM_CHANGE | (event.channel & MIDI_CHANNEL_BIT)); + vstMidiEvent.midiData[1] = char(ctrlEvent.param); + } break; case kEngineControlEventTypeAllSoundOff: @@ -2281,6 +2311,8 @@ public: if (options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) pData->options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; + if (options & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) + pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; } return true;