X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fsurfaces%2Fmackie%2Fpot.cc;h=3ac991116f2153aa19982d1c8ecd5232015dca99;hb=7229dccb3ba3e8feb94fa8b5bf8a1f39d0508ce8;hp=1320512e928e818c8a5554483a317355447339e0;hpb=939801a8d87a56f98ffdc9bb96f1c11e299f4edf;p=ardour.git diff --git a/libs/surfaces/mackie/pot.cc b/libs/surfaces/mackie/pot.cc index 1320512e92..3ac991116f 100644 --- a/libs/surfaces/mackie/pot.cc +++ b/libs/surfaces/mackie/pot.cc @@ -22,8 +22,12 @@ #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 */ +int const Pot::ID = 0x10; /* base value for v-pot IDs */ + Control* Pot::factory (Surface& surface, int id, const char* name, Group& group) { @@ -35,43 +39,32 @@ Pot::factory (Surface& surface, int id, const char* name, Group& group) } MidiByteArray -Pot::set_mode (Pot::Mode m) -{ - mode = m; - return update_message (); -} - -MidiByteArray -Pot::set_onoff (bool onoff) -{ - on = onoff; - return update_message (); -} - -MidiByteArray -Pot::set_all (float val, bool onoff, Mode m) -{ - position = val; - on = onoff; - mode = m; - return update_message (); -} - -MidiByteArray -Pot::update_message () +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 = (position > 0.45 && position < 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); - - // position, but only if off hasn't explicitly been set - if (on) { - msg += (lrintf (position * 10.0) + 1) & 0x0f; // 0b00001111 + /* + * 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)) & 0x0f; // 0b00001111 + } else { + msg |= (lrintf (val * 10.0) + 1) & 0x0f; // 0b00001111 + } } /* outbound LED message requires 0x20 to be added to the LED's id @@ -80,4 +73,4 @@ Pot::update_message () return MidiByteArray (3, 0xb0, 0x20 + id(), msg); } - +