summaryrefslogtreecommitdiff
path: root/libs/ardour/parameter_descriptor.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-06-19 16:34:29 +0200
committerRobin Gareus <robin@gareus.org>2017-06-21 18:12:45 +0200
commit37905d82a611a09342faf52d01378c9b4e86a2ac (patch)
treed1b1340bbacff5e70d969d2f74ae57b711b66375 /libs/ardour/parameter_descriptor.cc
parent8dcc28c9ad91baade9c30a2ec6d59a1f799dc654 (diff)
Centralize Parameter scaling
This exposes an AutomationType dependent abstract version of inteface_to_internal(), internal_to_interface().
Diffstat (limited to 'libs/ardour/parameter_descriptor.cc')
-rw-r--r--libs/ardour/parameter_descriptor.cc115
1 files changed, 108 insertions, 7 deletions
diff --git a/libs/ardour/parameter_descriptor.cc b/libs/ardour/parameter_descriptor.cc
index 29d13af540..7ed0c78512 100644
--- a/libs/ardour/parameter_descriptor.cc
+++ b/libs/ardour/parameter_descriptor.cc
@@ -48,13 +48,12 @@ ParameterDescriptor::ParameterDescriptor(const Evoral::Parameter& parameter)
{
ScalePoints sp;
+ /* Note: defaults in Evoral::ParameterDescriptor */
+
switch((AutomationType)parameter.type()) {
case GainAutomation:
- upper = Config->get_max_gain();
- normal = 1.0f;
- break;
case BusSendLevel:
- upper = Config->get_max_gain ();
+ upper = Config->get_max_gain();
normal = 1.0f;
break;
case BusSendEnable:
@@ -65,6 +64,7 @@ ParameterDescriptor::ParameterDescriptor(const Evoral::Parameter& parameter)
upper = 10; // +20dB
lower = .1; // -20dB
normal = 1.0f;
+ logarithmic = true;
break;
case PanAzimuthAutomation:
normal = 0.5f; // there really is no _normal but this works for stereo, sort of
@@ -81,7 +81,6 @@ ParameterDescriptor::ParameterDescriptor(const Evoral::Parameter& parameter)
upper = 1.0;
toggled = true;
break;
- case PluginAutomation:
case FadeInAutomation:
case FadeOutAutomation:
case EnvelopeAutomation:
@@ -117,8 +116,6 @@ ParameterDescriptor::ParameterDescriptor(const Evoral::Parameter& parameter)
upper = MonitorDisk; /* XXX bump when we add MonitorCue */
break;
case SoloIsolateAutomation:
- toggled = true;
- break;
case SoloSafeAutomation:
toggled = true;
break;
@@ -253,4 +250,108 @@ ParameterDescriptor::midi_note_num (const std::string& name)
return num;
}
+float
+ParameterDescriptor::to_interface (float val) const
+{
+ val = std::min (upper, std::max (lower, val));
+ switch(type) {
+ case GainAutomation:
+ case BusSendLevel:
+ case EnvelopeAutomation:
+ val = gain_to_slider_position_with_max (val, upper);
+ break;
+ case TrimAutomation:
+ {
+ const float lower_db = accurate_coefficient_to_dB (lower);
+ const float range_db = accurate_coefficient_to_dB (upper) - lower_db;
+ val = (accurate_coefficient_to_dB (val) - lower_db) / range_db;
+ }
+ break;
+ case PanAzimuthAutomation:
+ case PanElevationAutomation:
+ val = 1.f - val;
+ break;
+ case PanWidthAutomation:
+ val = .5f + val * .5f;
+ break;
+ default:
+ if (logarithmic) {
+ if (rangesteps > 1) {
+ val = logscale_to_position_with_steps (val, lower, upper, rangesteps);
+ } else {
+ val = logscale_to_position (val, lower, upper);
+ }
+ } else if (toggled) {
+ return (val - lower) / (upper - lower) >= 0.5f ? 1.f : 0.f;
+ } else if (integer_step) {
+ /* evenly-divide steps. lower,upper inclusive
+ * e.g. 5 integers 0,1,2,3,4 are mapped to a fader
+ * [0.0 ... 0.2 | 0.2 ... 0.4 | 0.4 ... 0.6 | 0.6 ... 0.8 | 0.8 ... 1.0]
+ * 0 1 2 3 4
+ * 0.1 0.3 0.5 0.7 0.9
+ */
+ val = (val + .5f - lower) / (1.f + upper - lower);
+ } else {
+ val = (val - lower) / (upper - lower);
+ }
+ break;
+ }
+ val = std::max (0.f, std::min (1.f, val));
+ return val;
+}
+
+float
+ParameterDescriptor::from_interface (float val) const
+{
+ val = std::max (0.f, std::min (1.f, val));
+
+ switch(type) {
+ case GainAutomation:
+ case EnvelopeAutomation:
+ case BusSendLevel:
+ val = slider_position_to_gain_with_max (val, upper);
+ break;
+ case TrimAutomation:
+ {
+ const float lower_db = accurate_coefficient_to_dB (lower);
+ const float range_db = accurate_coefficient_to_dB (upper) - lower_db;
+ val = dB_to_coefficient (lower_db + val * range_db);
+ }
+ break;
+ case PanAzimuthAutomation:
+ case PanElevationAutomation:
+ val = 1.f - val;
+ break;
+ case PanWidthAutomation:
+ val = 2.f * val - 1.f;
+ break;
+ default:
+ if (logarithmic) {
+ assert (!toggled && !integer_step); // update_steps() should prevent that.
+ if (rangesteps > 1) {
+ val = position_to_logscale_with_steps (val, lower, upper, rangesteps);
+ } else {
+ val = position_to_logscale (val, lower, upper);
+ }
+ } else if (toggled) {
+ val = val > 0 ? upper : lower;
+ } else if (integer_step) {
+ /* upper and lower are inclusive. use evenly-divided steps
+ * e.g. 5 integers 0,1,2,3,4 are mapped to a fader
+ * [0.0 .. 0.2 | 0.2 .. 0.4 | 0.4 .. 0.6 | 0.6 .. 0.8 | 0.8 .. 1.0]
+ */
+ val = round (lower + val * (1.f + upper - lower) - .5f);
+ } else if (rangesteps > 1) {
+ /* similar to above, but for float controls */
+ val = floor (val * (rangesteps - 1.f)) / (rangesteps - 1.f); // XXX
+ val = val * (upper - lower) + lower;
+ } else {
+ val = val * (upper - lower) + lower;
+ }
+ break;
+ }
+ val = std::min (upper, std::max (lower, val));
+ return val;
+}
+
} // namespace ARDOUR