push2: provide basic GUI control for pressure mode
[ardour.git] / libs / surfaces / push2 / push2.cc
index 412fc3c51beb7e284042c5da9656cecec97ff0e2..caa3f1e1026250eeb0066e4f1e3d7f36294393f9 100644 (file)
@@ -40,6 +40,7 @@
 #include "ardour/session.h"
 #include "ardour/tempo.h"
 
+#include "gtkmm2ext/gui_thread.h"
 #include "gtkmm2ext/rgb_macros.h"
 
 #include "canvas/colors.h"
@@ -52,7 +53,7 @@
 #include "track_mix.h"
 #include "menu.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace std;
@@ -140,9 +141,8 @@ Push2::Push2 (ARDOUR::Session& s)
        , _in_key (true)
        , octave_shift (0)
        , percussion (false)
+       , _pressure_mode (AfterTouch)
 {
-       cerr << "new push2 @ " << this << "\n";
-
        context = Cairo::Context::create (frame_buffer);
 
        build_maps ();
@@ -176,15 +176,16 @@ Push2::Push2 (ARDOUR::Session& s)
 
 Push2::~Push2 ()
 {
-       cerr << "push2 deleted\n";
        stop ();
+
+       delete track_mix_layout;
+       delete mix_layout;
+       delete scale_layout;
 }
 
 void
 Push2::port_registration_handler ()
 {
-       cerr << "preg for " << this << endl;
-
        if (!_async_in && !_async_out) {
                /* ports not registered yet */
                return;
@@ -709,6 +710,19 @@ void
 Push2::handle_midi_sysex (MIDI::Parser&, MIDI::byte* raw_bytes, size_t sz)
 {
        DEBUG_TRACE (DEBUG::Push2, string_compose ("Sysex, %1 bytes\n", sz));
+       MidiByteArray msg (sz, raw_bytes);
+       MidiByteArray aftertouch_mode_response (9, 0xF0, 0x00, 0x21, 0x1D, 0x01, 0x01, 0x1F, 0x0, 0xF7);
+       MidiByteArray polypress_mode_response (9, 0xF0, 0x00, 0x21, 0x1D, 0x01, 0x01, 0x1F, 0x1, 0xF7);
+
+       if (msg == aftertouch_mode_response) {
+               _pressure_mode = AfterTouch;
+               PressureModeChange (AfterTouch);
+               cerr << "Pressure mod eis after\n";
+       } else if (msg == polypress_mode_response) {
+               _pressure_mode = PolyPressure;
+               PressureModeChange (PolyPressure);
+               cerr << "Pressure mod eis poly\n";
+       }
 }
 
 void
@@ -1290,7 +1304,7 @@ Push2::pad_filter (MidiBuffer& in, MidiBuffer& out) const
 
                                matched = true;
                        }
-               } else if ((*ev).is_pitch_bender() || (*ev).is_aftertouch() || (*ev).is_channel_pressure()) {
+               } else if ((*ev).is_pitch_bender() || (*ev).is_poly_pressure() || (*ev).is_channel_pressure()) {
                        out.push_back (*ev);
                }
        }
@@ -1336,7 +1350,7 @@ Push2::connection_handler (boost::weak_ptr<ARDOUR::Port>, std::string name1, boo
 
                g_usleep (100000);
                 DEBUG_TRACE (DEBUG::FaderPort, "device now connected for both input and output\n");
-                // connected ();
+                connected ();
 
        } else {
                DEBUG_TRACE (DEBUG::FaderPort, "Device disconnected (input or output or both) or not yet fully connected\n");
@@ -1349,6 +1363,12 @@ Push2::connection_handler (boost::weak_ptr<ARDOUR::Port>, std::string name1, boo
        return true; /* connection status changed */
 }
 
+void
+Push2::connected ()
+{
+       request_pressure_mode ();
+}
+
 boost::shared_ptr<Port>
 Push2::output_port()
 {
@@ -1735,3 +1755,30 @@ Push2::set_current_layout (Push2Layout* layout)
                _current_layout->on_show ();
        }
 }
+
+void
+Push2::request_pressure_mode ()
+{
+       MidiByteArray msg (8, 0xF0, 0x00, 0x21, 0x1D, 0x01, 0x01, 0x1F, 0xF7);
+       write (msg);
+}
+
+void
+Push2::set_pressure_mode (PressureMode pm)
+{
+       MidiByteArray msg (9, 0xF0, 0x00, 0x21, 0x1D, 0x01, 0x01, 0x1E, 0x0, 0xF7);
+
+       switch (pm) {
+       case AfterTouch:
+               /* nothing to do, message is correct */
+               break;
+       case PolyPressure:
+               msg[7] = 0x1;
+               break;
+       default:
+               return;
+       }
+
+       write (msg);
+       cerr << "Sent PM message " << msg << endl;
+}