Mackie Control, Fix sends after monitor not showing.
[ardour.git] / libs / surfaces / mackie / pot.cc
index 78973b40df6bd7bb88c697552297425ba35943e3..3ac991116f2153aa19982d1c8ecd5232015dca99 100644 (file)
@@ -22,6 +22,7 @@
 #include "surface.h"
 #include "control_group.h"
 
+using namespace ArdourSurface;
 using namespace Mackie;
 
 int const Pot::External = 0x2e; /* specific ID for "vpot" representing external control */
@@ -42,19 +43,27 @@ Pot::set (float val, bool onoff, Mode mode)
 {
        // TODO do an exact calc for 0.50? To allow manually re-centering the port.
 
-       // center on or off
-       MIDI::byte msg =  (val > 0.45 && val < 0.55 ? 1 : 0) << 6;
-       
-       // mode
+       // center on if val is "very close" to 0.50
+       MIDI::byte msg =  (val > 0.48 && val < 0.58 ? 1 : 0) << 6;
+
+       // Pot/LED mode
        msg |=  (mode << 4);
-       
-       // val, but only if off hasn't explicitly been set
 
-       if  (onoff) {
+       /*
+        * Even though a width value may be negative, there is
+        * technically still width there, it is just reversed,
+        * so make sure to show it on the LED ring appropriately.
+        */
+       if (val < 0){
+         val = val * -1;
+       }
+
+       // val, but only if off hasn't explicitly been set
+       if (onoff) {
                if (mode == spread) {
-                       msg +=  (lrintf (val * 6) + 1) & 0x0f; // 0b00001111
+                       msg |=  (lrintf (val * 6)) & 0x0f; // 0b00001111
                } else {
-                       msg +=  (lrintf (val * 10.0) + 1) & 0x0f; // 0b00001111
+                       msg |=  (lrintf (val * 10.0) + 1) & 0x0f; // 0b00001111
                }
        }
 
@@ -64,4 +73,4 @@ Pot::set (float val, bool onoff, Mode mode)
        return MidiByteArray (3, 0xb0, 0x20 + id(), msg);
 
 }
-       
+