VCVRack VST currently exposes 9999 automatable-control parmaters.
This slows down various GUI dropdown lists and dialogs.
(even worse: those parameters are not mapped to anything by default).
This change allows to limit automatable parameters to a reasonable number,
without loosing state of already automated parameters in existing sessions.
CONFIG_VARIABLE (bool, discover_audio_units, "discover-audio-units", false)
CONFIG_VARIABLE (bool, ask_replace_instrument, "ask-replace-instrument", true)
CONFIG_VARIABLE (bool, ask_setup_instrument, "ask-setup-instrument", true)
CONFIG_VARIABLE (bool, discover_audio_units, "discover-audio-units", false)
CONFIG_VARIABLE (bool, ask_replace_instrument, "ask-replace-instrument", true)
CONFIG_VARIABLE (bool, ask_setup_instrument, "ask-setup-instrument", true)
+CONFIG_VARIABLE (uint32_t, limit_n_automatables, "limit-n-automatables", 512)
/* custom user plugin paths */
CONFIG_VARIABLE (std::string, plugin_path_vst, "plugin-path-vst", "@default@")
/* custom user plugin paths */
CONFIG_VARIABLE (std::string, plugin_path_vst, "plugin-path-vst", "@default@")
- if (_can_automate_list.find (param) == _can_automate_list.end ()) {
- warning << "Ignored automation data for non-automatable parameter" << endl;
- continue;
- }
-
if (!id_prop) {
warning << "AutomationList node without automation-id property, "
<< "using default: " << EventTypeMap::instance().to_symbol(legacy_param) << endmsg;
}
if (!id_prop) {
warning << "AutomationList node without automation-id property, "
<< "using default: " << EventTypeMap::instance().to_symbol(legacy_param) << endmsg;
}
+ if (_can_automate_list.find (param) == _can_automate_list.end ()) {
+ boost::shared_ptr<AutomationControl> actl = automation_control (param);
+ if (actl && (*niter)->children().size() > 0 && Config->get_limit_n_automatables () > 0) {
+ actl->set_flags (Controllable::Flag ((int)actl->flags() & ~Controllable::NotAutomatable));
+ can_automate (param);
+ info << "Marked parmater as automatable" << endl;
+ } else {
+ warning << "Ignored automation data for non-automatable parameter" << endl;
+ continue;
+ }
+ }
+
+
boost::shared_ptr<AutomationControl> existing = automation_control (param);
if (existing) {
boost::shared_ptr<AutomationControl> existing = automation_control (param);
if (existing) {
boost::shared_ptr<Plugin> plugin = _plugins.front();
set<Evoral::Parameter> a = _plugins.front()->automatable ();
boost::shared_ptr<Plugin> plugin = _plugins.front();
set<Evoral::Parameter> a = _plugins.front()->automatable ();
+ const uint32_t limit_automatables = Config->get_limit_n_automatables ();
+
for (uint32_t i = 0; i < plugin->parameter_count(); ++i) {
if (!plugin->parameter_is_control (i)) {
continue;
for (uint32_t i = 0; i < plugin->parameter_count(); ++i) {
if (!plugin->parameter_is_control (i)) {
continue;
boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
+ if (!automatable || (limit_automatables > 0 && i > limit_automatables)) {
c->set_flags (Controllable::Flag ((int)c->flags() | Controllable::NotAutomatable));
}
add_control (c);
c->set_flags (Controllable::Flag ((int)c->flags() | Controllable::NotAutomatable));
}
add_control (c);