+ struct Pad : public LED {
+ enum WhenPressed {
+ Nothing,
+ FlashOn,
+ FlashOff,
+ };
+
+ Pad (int xx, int yy, uint8_t ex)
+ : LED (ex)
+ , x (xx)
+ , y (yy)
+ , do_when_pressed (FlashOn)
+ , filtered (ex)
+ , perma_color (LED::Black)
+ {}
+
+ MidiByteArray state_msg () const { return MidiByteArray (3, 0x90|_state, _extra, _color_index); }
+
+ int coord () const { return (y * 8) + x; }
+ int note_number() const { return extra(); }
+
+ int x;
+ int y;
+ int do_when_pressed;
+ int filtered;
+ int perma_color;
+ };
+
+ struct Button : public LED {
+ Button (ButtonID bb, uint8_t ex)
+ : LED (ex)
+ , id (bb)
+ , press_method (&Push2::relax)
+ , release_method (&Push2::relax)
+ , long_press_method (&Push2::relax)
+ {}
+
+ Button (ButtonID bb, uint8_t ex, void (Push2::*press)())
+ : LED (ex)
+ , id (bb)
+ , press_method (press)
+ , release_method (&Push2::relax)
+ , long_press_method (&Push2::relax)
+ {}
+
+ Button (ButtonID bb, uint8_t ex, void (Push2::*press)(), void (Push2::*release)())
+ : LED (ex)
+ , id (bb)
+ , press_method (press)
+ , release_method (release)
+ , long_press_method (&Push2::relax)
+ {}
+
+ Button (ButtonID bb, uint8_t ex, void (Push2::*press)(), void (Push2::*release)(), void (Push2::*long_press)())
+ : LED (ex)
+ , id (bb)
+ , press_method (press)
+ , release_method (release)
+ , long_press_method (long_press)
+ {}
+
+ MidiByteArray state_msg () const { return MidiByteArray (3, 0xb0|_state, _extra, _color_index); }
+ int controller_number() const { return extra(); }
+
+ ButtonID id;
+ void (Push2::*press_method)();
+ void (Push2::*release_method)();
+ void (Push2::*long_press_method)();
+ sigc::connection timeout_connection;
+ };
+
+ struct ColorButton : public Button {
+ ColorButton (ButtonID bb, uint8_t ex)
+ : Button (bb, ex) {}
+
+
+ ColorButton (ButtonID bb, uint8_t ex, void (Push2::*press)())
+ : Button (bb, ex, press) {}
+
+ ColorButton (ButtonID bb, uint8_t ex, void (Push2::*press)(), void (Push2::*release)())
+ : Button (bb, ex, press, release) {}
+
+ ColorButton (ButtonID bb, uint8_t ex, void (Push2::*press)(), void (Push2::*release)(), void (Push2::*long_press)())
+ : Button (bb, ex, press, release, long_press) {}
+ };
+
+ struct WhiteButton : public Button {
+ WhiteButton (ButtonID bb, uint8_t ex)
+ : Button (bb, ex) {}
+
+ WhiteButton (ButtonID bb, uint8_t ex, void (Push2::*press)())
+ : Button (bb, ex, press) {}
+
+ WhiteButton (ButtonID bb, uint8_t ex, void (Push2::*press)(), void (Push2::*release)())
+ : Button (bb, ex, press, release) {}
+
+ WhiteButton (ButtonID bb, uint8_t ex, void (Push2::*press)(), void (Push2::*release)(), void (Push2::*long_press)())
+ : Button (bb, ex, press, release, long_press) {}
+ };
+
+ enum ColorName {
+ DarkBackground,
+ LightBackground,
+
+ ParameterName,
+ StripableName,
+ ClockText,
+
+ KnobArcBackground,
+ KnobArcStart,
+ KnobArcEnd,
+
+ KnobLine,
+ KnobLineShadow,
+
+ KnobForeground,
+ KnobBackground,
+ KnobShadow,
+ KnobBorder,
+ };
+
+ enum PressureMode {
+ AfterTouch,
+ PolyPressure,
+ };
+
+ public:
+ Push2 (ARDOUR::Session&);
+ ~Push2 ();
+
+ static bool probe ();
+ static void* request_factory (uint32_t);
+
+ std::list<boost::shared_ptr<ARDOUR::Bundle> > bundles ();
+
+ bool has_editor () const { return true; }
+ void* get_gui () const;
+ void tear_down_gui ();
+
+ int set_active (bool yn);
+ XMLNode& get_state();
+ int set_state (const XMLNode & node, int version);
+
+ PBD::Signal0<void> ConnectionChange;
+
+ boost::shared_ptr<ARDOUR::Port> input_port();
+ boost::shared_ptr<ARDOUR::Port> output_port();
+
+ int pad_note (int row, int col) const;
+ PBD::Signal0<void> PadChange;
+
+ void update_selection_color ();
+
+ void set_pad_scale (int root, int octave, MusicalMode::Type mode, bool inkey);
+ PBD::Signal0<void> ScaleChange;
+
+ MusicalMode::Type mode() const { return _mode; }
+ int scale_root() const { return _scale_root; }
+ int root_octave() const { return _root_octave; }
+ bool in_key() const { return _in_key; }
+
+ Push2Layout* current_layout() const;
+ void use_previous_layout ();
+
+ Push2Canvas* canvas() const { return _canvas; }
+
+ enum ModifierState {
+ None = 0,
+ ModShift = 0x1,
+ ModSelect = 0x2,