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:
99 case MidiNotePressureAutomation:
104 case MidiPitchBenderAutomation:
109 case PhaseAutomation:
112 case MonitoringAutomation:
116 upper = MonitorDisk; /* XXX bump when we add MonitorCue */
118 case SoloIsolateAutomation:
121 case SoloSafeAutomation:
131 ParameterDescriptor::ParameterDescriptor()
132 : Evoral::ParameterDescriptor()
134 , datatype(Variant::NOTHING)
135 , type(NullAutomation)
140 , integer_step(false)
142 , sr_dependent(false)
149 ParameterDescriptor::update_steps()
151 if (unit == ParameterDescriptor::MIDI_NOTE) {
152 step = smallstep = 1; // semitone
153 largestep = 12; // octave
154 } else if (type == GainAutomation || type == TrimAutomation) {
155 /* dB_coeff_step gives a step normalized for [0, max_gain]. This is
156 like "slider position", so we convert from "slider position" to gain
157 to have the correct unit here. */
158 largestep = slider_position_to_gain(dB_coeff_step(upper));
159 step = slider_position_to_gain(largestep / 10.0);
162 /* note that LV2Plugin::get_parameter_descriptor ()
163 * overrides this is lv2:rangeStep is set for a port.
165 const float delta = upper - lower;
167 /* 30 happens to be the total number of steps for a fader with default
168 max gain of 2.0 (6 dB), so we use 30 here too for consistency. */
169 step = smallstep = (delta / 300.0f);
170 largestep = (delta / 30.0f);
173 /* Steps are linear, but we map them with pow like values (in
174 internal_to_interface). Thus, they are applied exponentially,
175 which means too few steps. So, divide to get roughly the
176 desired number of steps (30). This is not mathematically
177 precise but seems to be about right for the controls I tried.
178 If you're reading this, you've probably found a case where that
179 isn't true, and somebody needs to sit down with a piece of paper
180 and actually do the math. */
181 smallstep = smallstep / logf(30.0f);
182 step = step / logf(30.0f);
183 largestep = largestep / logf(30.0f);
184 } else if (integer_step) {
186 step = std::max(1.f, rintf (step));
187 largestep = std::max(1.f, rintf (largestep));
193 ParameterDescriptor::midi_note_name (const uint8_t b)
197 snprintf(buf, sizeof(buf), "%d", b);
201 static const char* notes[] = {
216 /* MIDI note 0 is in octave -1 (in scientific pitch notation) */
217 const int octave = b / 12 - 1;
218 snprintf (buf, sizeof (buf), "%s%d", notes[b % 12], octave);
222 } // namespace ARDOUR