/* 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