2 Copyright (C) 2014 Paul Davis
3 Author: David Robillard
5 This program is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by the Free
7 Software Foundation; either version 2 of the License, or (at your option)
10 This program is distributed in the hope that it will be useful, but WITHOUT
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 675 Mass Ave, Cambridge, MA 02139, USA.
20 #include "ardour/amp.h"
21 #include "ardour/dB.h"
22 #include "ardour/parameter_descriptor.h"
23 #include "ardour/rc_configuration.h"
24 #include "ardour/types.h"
25 #include "ardour/utils.h"
31 ParameterDescriptor::ParameterDescriptor(const Evoral::Parameter& parameter)
32 : Evoral::ParameterDescriptor()
34 , datatype(Variant::NOTHING)
35 , type((AutomationType)parameter.type())
40 , integer_step(parameter.type() >= MidiCCAutomation &&
41 parameter.type() <= MidiChannelPressureAutomation)
50 switch((AutomationType)parameter.type()) {
52 upper = Config->get_max_gain();
56 upper = Config->get_max_gain ();
68 case PanAzimuthAutomation:
69 normal = 0.5f; // there really is no _normal but this works for stereo, sort of
72 case PanWidthAutomation:
77 case RecEnableAutomation:
78 case RecSafeAutomation:
83 case PluginAutomation:
84 case FadeInAutomation:
85 case FadeOutAutomation:
86 case EnvelopeAutomation:
96 case MidiCCAutomation:
97 case MidiPgmChangeAutomation:
98 case MidiChannelPressureAutomation:
103 case MidiPitchBenderAutomation:
108 case PhaseAutomation:
111 case MonitoringAutomation:
115 upper = MonitorDisk; /* XXX bump when we add MonitorCue */
117 case SoloIsolateAutomation:
120 case SoloSafeAutomation:
130 ParameterDescriptor::ParameterDescriptor()
131 : Evoral::ParameterDescriptor()
133 , datatype(Variant::NOTHING)
134 , type(NullAutomation)
139 , integer_step(false)
141 , sr_dependent(false)
148 ParameterDescriptor::update_steps()
150 if (unit == ParameterDescriptor::MIDI_NOTE) {
151 step = smallstep = 1; // semitone
152 largestep = 12; // octave
153 } else if (type == GainAutomation || type == TrimAutomation) {
154 /* dB_coeff_step gives a step normalized for [0, max_gain]. This is
155 like "slider position", so we convert from "slider position" to gain
156 to have the correct unit here. */
157 largestep = slider_position_to_gain(dB_coeff_step(upper));
158 step = slider_position_to_gain(largestep / 10.0);
161 const float delta = upper - lower;
163 /* 30 happens to be the total number of steps for a fader with default
164 max gain of 2.0 (6 dB), so we use 30 here too for consistency. */
165 step = smallstep = (delta / 300.0f);
166 largestep = (delta / 30.0f);
169 /* Steps are linear, but we map them with pow like values (in
170 internal_to_interface). Thus, they are applied exponentially,
171 which means too few steps. So, divide to get roughly the
172 desired number of steps (30). This is not mathematically
173 precise but seems to be about right for the controls I tried.
174 If you're reading this, you've probably found a case where that
175 isn't true, and somebody needs to sit down with a piece of paper
176 and actually do the math. */
177 smallstep = smallstep / logf(30.0f);
178 step = step / logf(30.0f);
179 largestep = largestep / logf(30.0f);
180 } else if (integer_step) {
182 step = std::max(1.f, rintf (step));
183 largestep = std::max(1.f, rintf (largestep));
188 } // namespace ARDOUR