Invert Pan-Azimuth (up means left)
authorRobin Gareus <robin@gareus.org>
Mon, 7 Oct 2019 03:07:55 +0000 (05:07 +0200)
committerRobin Gareus <robin@gareus.org>
Mon, 7 Oct 2019 03:07:55 +0000 (05:07 +0200)
It's a well established convention that pan y-axis automation,
or vertical uses (top) +1 for left.

This special cases rotary knobs (and horizontal sliders) to retain
a clockwise movement (or movement to the right) for panning to the
right.

libs/ardour/ardour/automation_control.h
libs/ardour/ardour/parameter_descriptor.h
libs/ardour/automation_control.cc
libs/ardour/parameter_descriptor.cc
libs/pbd/pbd/controllable.h

index 245c70b915ffed83c9633c84ae83fb7e43eeb2d3..99252f2552a8c9926eba4983b91a4ace367eb8ce 100644 (file)
@@ -113,8 +113,8 @@ public:
        double normal()  const { return _desc.normal; }
        bool   toggled() const { return _desc.toggled; }
 
-       double internal_to_interface (double i) const;
-       double interface_to_internal (double i) const;
+       double internal_to_interface (double, bool rotary = false) const;
+       double interface_to_internal (double, bool rotary = false) const;
 
        virtual std::string get_user_string() const;
 
index e0df2f9537fce4f681de6305e3a2c3ae18490f03..e531133b15f4984731af6772911d65ee48c41840 100644 (file)
@@ -61,8 +61,12 @@ struct LIBARDOUR_API ParameterDescriptor : public Evoral::ParameterDescriptor
         * interface value, using settings from Evoral::ParameterDescriptor.
         *
         * default for AutomationControl::internal_to_interface ();
+        *
+        * @param v the control-value to convert
+        * @param rotary set to true if the GUI control is a rotary knob
+        * @return interface value in range 0..1
         */
-       float to_interface (float) const;
+       float to_interface (float v, bool rotary = false) const;
 
        /** normalized [0..1] to control-value range
         *
@@ -70,8 +74,12 @@ struct LIBARDOUR_API ParameterDescriptor : public Evoral::ParameterDescriptor
         * using settings from Evoral::ParameterDescriptor.
         *
         * default for AutomationControl::interface_to_internal ();
+        *
+        * @param v the value in range 0..1 to on convert
+        * @param rotary set to true if the GUI control is a rotary knob
+        * @return control-value in range lower..upper
         */
-       float from_interface (float) const;
+       float from_interface (float v, bool rotary = false) const;
 
        bool  is_linear () const;
        float compute_delta (float from, float to) const;
index b8d5226b297d4ee286d88141ccb91fcb188f55a4..eda77f64b230fc425fab47397a9ec96140ffc4e3 100644 (file)
@@ -337,23 +337,23 @@ AutomationControl::commit_transaction (bool did_write)
 
 /* take control-value and return UI range [0..1] */
 double
-AutomationControl::internal_to_interface (double val) const
+AutomationControl::internal_to_interface (double val, bool rotary) const
 {
        // XXX maybe optimize. _desc.from_interface() has
        // a switch-statement depending on AutomationType.
-       return _desc.to_interface (val);
+       return _desc.to_interface (val, rotary);
 }
 
 /* map GUI range [0..1] to control-value */
 double
-AutomationControl::interface_to_internal (double val) const
+AutomationControl::interface_to_internal (double val, bool rotary) const
 {
        if (!isfinite_local (val)) {
                assert (0);
                val = 0;
        }
        // XXX maybe optimize. see above.
-       return _desc.from_interface (val);
+       return _desc.from_interface (val, rotary);
 }
 
 std::string
index c86be207f258a4a8bf4169211eb8d1f1396a1634..1269d69d1af870abb6332ae45aafa9ad68b5b493 100644 (file)
@@ -306,7 +306,7 @@ ParameterDescriptor::midi_note_num (const std::string& name)
 }
 
 float
-ParameterDescriptor::to_interface (float val) const
+ParameterDescriptor::to_interface (float val, bool rotary) const
 {
        val = std::min (upper, std::max (lower, val));
        switch(type) {
@@ -323,6 +323,12 @@ ParameterDescriptor::to_interface (float val) const
                        }
                        break;
                case PanAzimuthAutomation:
+                       if (rotary) {
+                               val = val;
+                       } else {
+                               val = 1.0 - val;
+                       }
+                       break;
                case PanElevationAutomation:
                        val = val;
                        break;
@@ -356,7 +362,7 @@ ParameterDescriptor::to_interface (float val) const
 }
 
 float
-ParameterDescriptor::from_interface (float val) const
+ParameterDescriptor::from_interface (float val, bool rotary) const
 {
        val = std::max (0.f, std::min (1.f, val));
 
@@ -374,6 +380,12 @@ ParameterDescriptor::from_interface (float val) const
                        }
                        break;
                case PanAzimuthAutomation:
+                       if (rotary) {
+                               val = val;
+                       } else {
+                               val = 1.0 - val;
+                       }
+                       break;
                case PanElevationAutomation:
                         val = val;
                        break;
index 62127fb0489a507cb1052b9fa2b02273def6fe2a..a83a42bcb394d4bc0ac980276b06b0735dc23e24 100644 (file)
@@ -119,8 +119,15 @@ public:
        virtual double get_save_value () const { return get_value(); }
 
        /** Conversions between `internal', 'interface', and 'user' values */
-       virtual double internal_to_interface (double i) const {return  (i-lower())/(upper() - lower());}  //by default, the interface range is just a linear interpolation between lower and upper values
-       virtual double interface_to_internal (double i) const {return lower() + i*(upper() - lower());}
+       virtual double internal_to_interface (double i, bool rotary = false) const {
+               /* by default, the interface range is just a linear
+                * interpolation between lower and upper values */
+               return  (i-lower())/(upper() - lower());
+       }
+
+       virtual double interface_to_internal (double i, bool rotary = false) const {
+               return lower() + i*(upper() - lower());
+       }
 
        /** Get and Set `interface' value  (typically, fraction of knob travel) */
        virtual float get_interface() const { return (internal_to_interface(get_value())); }