From 8df0fcb654a15ccfdd0c97eb1031b867702a1760 Mon Sep 17 00:00:00 2001 From: falkTX Date: Sat, 6 Jul 2013 07:11:43 +0100 Subject: [PATCH] Fix [midi] program changes, parameters must auto-update --- source/backend/plugin/CarlaPlugin.cpp | 134 ++++++++++++++++---------- 1 file changed, 84 insertions(+), 50 deletions(-) diff --git a/source/backend/plugin/CarlaPlugin.cpp b/source/backend/plugin/CarlaPlugin.cpp index d16972e38..104f8035e 100644 --- a/source/backend/plugin/CarlaPlugin.cpp +++ b/source/backend/plugin/CarlaPlugin.cpp @@ -1453,10 +1453,18 @@ void CarlaPlugin::setProgram(int32_t index, const bool sendGui, const bool sendO if (index > static_cast(kData->prog.count)) return; - const int32_t fixedIndex = carla_fixValue(-1, kData->prog.count, index); + const int32_t fixedIndex(carla_fixValue(-1, kData->prog.count, index)); kData->prog.current = fixedIndex; +#ifndef BUILD_BRIDGE + if (sendOsc) + kData->engine->osc_send_control_set_program(fId, fixedIndex); +#endif + + if (sendCallback) + kData->engine->callback(CALLBACK_PROGRAM_CHANGED, fId, fixedIndex, 0, 0.0f, nullptr); + // Change default parameter values if (fixedIndex >= 0) { @@ -1465,36 +1473,33 @@ void CarlaPlugin::setProgram(int32_t index, const bool sendGui, const bool sendO uiProgramChange(fixedIndex); #endif + if (type() == PLUGIN_GIG || type() == PLUGIN_SF2 || type() == PLUGIN_SFZ) + return; + for (uint32_t i=0; i < kData->param.count; ++i) { - // FIXME? - kData->param.ranges[i].def = getParameterValue(i); - kData->param.ranges[i].fixDefault(); + const float value(kData->param.ranges[i].fixValue(getParameterValue(i))); -#ifndef BUILD_BRIDGE - if (sendOsc) - { - kData->engine->osc_send_control_set_default_value(fId, i, kData->param.ranges[i].def); - kData->engine->osc_send_control_set_parameter_value(fId, i, kData->param.ranges[i].def); - } -#endif - } - } + kData->param.ranges[i].def = value; + if (sendOsc || sendCallback) + { #ifndef BUILD_BRIDGE - if (sendOsc) - kData->engine->osc_send_control_set_program(fId, fixedIndex); + kData->engine->osc_send_control_set_default_value(fId, i, value); + kData->engine->osc_send_control_set_parameter_value(fId, i, value); #endif - if (sendCallback) - kData->engine->callback(CALLBACK_PROGRAM_CHANGED, fId, fixedIndex, 0, 0.0f, nullptr); + kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, i, 0, value, nullptr); + kData->engine->callback(CALLBACK_PARAMETER_DEFAULT_CHANGED, fId, i, 0, value, nullptr); + } + } + } #ifdef BUILD_BRIDGE return; // unused (void)sendGui; - (void)sendOsc; #endif } @@ -1508,10 +1513,18 @@ void CarlaPlugin::setMidiProgram(int32_t index, const bool sendGui, const bool s if (index > static_cast(kData->midiprog.count)) return; - const int32_t fixedIndex = carla_fixValue(-1, kData->midiprog.count, index); + const int32_t fixedIndex(carla_fixValue(-1, kData->midiprog.count, index)); kData->midiprog.current = fixedIndex; +#ifndef BUILD_BRIDGE + if (sendOsc) + kData->engine->osc_send_control_set_midi_program(fId, fixedIndex); +#endif + + if (sendCallback) + kData->engine->callback(CALLBACK_MIDI_PROGRAM_CHANGED, fId, fixedIndex, 0, 0.0f, nullptr); + if (fixedIndex >= 0) { #ifndef BUILD_BRIDGE @@ -1519,40 +1532,33 @@ void CarlaPlugin::setMidiProgram(int32_t index, const bool sendGui, const bool s uiMidiProgramChange(fixedIndex); #endif - // Change default parameter values (sound banks never change defaults) - if (type() != PLUGIN_GIG && type() != PLUGIN_SF2 && type() != PLUGIN_SFZ) + if (type() == PLUGIN_GIG || type() == PLUGIN_SF2 || type() == PLUGIN_SFZ) + return; + + for (uint32_t i=0; i < kData->param.count; ++i) { - for (uint32_t i=0; i < kData->param.count; ++i) - { - // FIXME? - kData->param.ranges[i].def = getParameterValue(i); - kData->param.ranges[i].fixDefault(); + const float value(kData->param.ranges[i].fixValue(getParameterValue(i))); + + kData->param.ranges[i].def = value; + if (sendOsc || sendCallback) + { #ifndef BUILD_BRIDGE - if (sendOsc) - { - kData->engine->osc_send_control_set_default_value(fId, i, kData->param.ranges[i].def); - kData->engine->osc_send_control_set_parameter_value(fId, i, kData->param.ranges[i].def); - } + kData->engine->osc_send_control_set_default_value(fId, i, value); + kData->engine->osc_send_control_set_parameter_value(fId, i, value); #endif + + kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, i, 0, value, nullptr); + kData->engine->callback(CALLBACK_PARAMETER_DEFAULT_CHANGED, fId, i, 0, value, nullptr); } } } -#ifndef BUILD_BRIDGE - if (sendOsc) - kData->engine->osc_send_control_set_midi_program(fId, fixedIndex); -#endif - - if (sendCallback) - kData->engine->callback(CALLBACK_MIDI_PROGRAM_CHANGED, fId, fixedIndex, 0, 0.0f, nullptr); - #ifdef BUILD_BRIDGE return; // unused (void)sendGui; - (void)sendOsc; #endif } @@ -2015,15 +2021,29 @@ void CarlaPlugin::postRtEventsRun() #ifndef BUILD_BRIDGE // Update OSC control client if (kData->engine->isOscControlRegistered()) - { kData->engine->osc_send_control_set_program(fId, event.value1); - for (uint32_t j=0; j < kData->param.count; ++j) - kData->engine->osc_send_control_set_default_value(fId, j, kData->param.ranges[j].def); - } - // Update Host kData->engine->callback(CALLBACK_PROGRAM_CHANGED, fId, event.value1, 0, 0.0f, nullptr); + + // Update param values + { + const bool sendOsc(kData->engine->isOscControlRegistered()); + + for (uint32_t j=0; j < kData->param.count; ++j) + { + const float value(getParameterValue(j)); + + if (sendOsc) + { + kData->engine->osc_send_control_set_parameter_value(fId, j, value); + kData->engine->osc_send_control_set_default_value(fId, j, kData->param.ranges[j].def); + } + + kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, j, 0, value, nullptr); + kData->engine->callback(CALLBACK_PARAMETER_DEFAULT_CHANGED, fId, j, 0, kData->param.ranges[j].def, nullptr); + } + } #endif break; @@ -2035,15 +2055,29 @@ void CarlaPlugin::postRtEventsRun() #ifndef BUILD_BRIDGE // Update OSC control client if (kData->engine->isOscControlRegistered()) - { kData->engine->osc_send_control_set_midi_program(fId, event.value1); - for (uint32_t j=0; j < kData->param.count; ++j) - kData->engine->osc_send_control_set_default_value(fId, j, kData->param.ranges[j].def); - } - // Update Host kData->engine->callback(CALLBACK_MIDI_PROGRAM_CHANGED, fId, event.value1, 0, 0.0f, nullptr); + + // Update param values + { + const bool sendOsc(kData->engine->isOscControlRegistered()); + + for (uint32_t j=0; j < kData->param.count; ++j) + { + const float value(getParameterValue(j)); + + if (sendOsc) + { + kData->engine->osc_send_control_set_parameter_value(fId, j, value); + kData->engine->osc_send_control_set_default_value(fId, j, kData->param.ranges[j].def); + } + + kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, j, 0, value, nullptr); + kData->engine->callback(CALLBACK_PARAMETER_DEFAULT_CHANGED, fId, j, 0, kData->param.ranges[j].def, nullptr); + } + } #endif break;