From 767c0238a34ef4acc4d345e88cd5ddb0c8a8e421 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 1 Dec 2014 14:28:03 -0500 Subject: Replace half-baked param metadata with descriptor. Among other things, this means that automation controls/lists have the actual min/max/normal/toggled of parameters, and not those inferred from the Parameter ID, which is not correct for things like plugin parameters. Pushing things down to the Evoral::ParmeterDescriptor may be useful in the future to have lists do smarter things based on parameter range, but currently I have just pushed down the above-mentioned currently used attributes. --- libs/ardour/parameter_descriptor.cc | 135 ++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 libs/ardour/parameter_descriptor.cc (limited to 'libs/ardour/parameter_descriptor.cc') diff --git a/libs/ardour/parameter_descriptor.cc b/libs/ardour/parameter_descriptor.cc new file mode 100644 index 0000000000..88debb0200 --- /dev/null +++ b/libs/ardour/parameter_descriptor.cc @@ -0,0 +1,135 @@ +/* + Copyright (C) 2014 Paul Davis + Author: David Robillard + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "ardour/amp.h" +#include "ardour/parameter_descriptor.h" +#include "ardour/types.h" + +namespace ARDOUR { + +ParameterDescriptor::ParameterDescriptor(const Evoral::Parameter& parameter) + : Evoral::ParameterDescriptor() + , key((uint32_t)-1) + , datatype(Variant::NOTHING) + , unit(NONE) + , step(0) + , smallstep(0) + , largestep(0) + , integer_step(parameter.type() >= MidiCCAutomation && + parameter.type() <= MidiChannelPressureAutomation) + , logarithmic(false) + , sr_dependent(false) + , min_unbound(0) + , max_unbound(0) + , enumeration(false) +{ + if (parameter.type() == GainAutomation) { + unit = DB; + } + + switch((AutomationType)parameter.type()) { + case GainAutomation: + upper = Amp::max_gain_coefficient; + normal = 1.0f; + break; + case PanAzimuthAutomation: + normal = 0.5f; // there really is no _normal but this works for stereo, sort of + break; + case PanWidthAutomation: + lower = -1.0; + upper = 1.0; + normal = 0.0f; + break; + case RecEnableAutomation: + /* default 0.0 - 1.0 is fine */ + toggled = true; + break; + case PluginAutomation: + case FadeInAutomation: + case FadeOutAutomation: + case EnvelopeAutomation: + upper = 2.0f; + normal = 1.0f; + break; + case SoloAutomation: + case MuteAutomation: + upper = 1.0f; + normal = 0.0f; + toggled = true; + break; + case MidiCCAutomation: + case MidiPgmChangeAutomation: + case MidiChannelPressureAutomation: + lower = 0.0; + normal = 0.0; + upper = 127.0; + break; + case MidiPitchBenderAutomation: + lower = 0.0; + normal = 8192.0; + upper = 16383.0; + break; + default: + break; + } + + update_steps(); +} + +ParameterDescriptor::ParameterDescriptor() + : Evoral::ParameterDescriptor() + , key((uint32_t)-1) + , datatype(Variant::NOTHING) + , unit(NONE) + , step(0) + , smallstep(0) + , largestep(0) + , integer_step(false) + , logarithmic(false) + , sr_dependent(false) + , min_unbound(0) + , max_unbound(0) + , enumeration(false) +{} + +void +ParameterDescriptor::update_steps() +{ + if (unit == ParameterDescriptor::MIDI_NOTE) { + step = smallstep = 1; // semitone + largestep = 12; // octave + } else if (integer_step) { + const float delta = upper - lower; + + smallstep = delta / 10000.0f; + step = delta / 1000.0f; + largestep = delta / 40.0f; + + smallstep = std::max(1.0, rint(smallstep)); + step = std::max(1.0, rint(step)); + largestep = std::max(1.0, rint(largestep)); + } + /* else: leave all others as default '0' + * in that case the UI (eg. AutomationController::create) + * uses internal_to_interface() to map the value + * to an appropriate interface range + */ +} + +} // namespace ARDOUR -- cgit v1.2.3