feedback for toggled MIDI controls now sends 0 or 127, not various in-between values...
[ardour.git] / libs / surfaces / generic_midi / midifunction.h
index 5374d94157aa50a0ed965553f69fd5309190fbf2..8f0b0218d01821293357fb05f7fe131624820088 100644 (file)
 
 #include "ardour/types.h"
 
+#include "midiinvokable.h"
+
 namespace MIDI {
        class Channel;
        class Port;
        class Parser;
 }
 
-class BasicUI;
+class GenericMidiControlProtocol;
 
-class MIDIFunction : public PBD::Stateful
+class MIDIFunction : public MIDIInvokable
 {
   public:
        enum Function { 
+               NextBank,
+               PrevBank,
                TransportRoll,
                TransportStop,
                TransportZero,
                TransportStart,
-               TransportEnd
+               TransportEnd,
+               TransportLoopToggle,
+               TransportRecordEnable,
+               TransportRecordDisable,
+               /* 1 argument functions: RID */
+               Select,
+               SetBank,
+               /* 2 argument functions: RID, value */
+               TrackSetSolo, 
+               TrackSetMute,
+               TrackSetGain,
+               TrackSetRecordEnable,
+               TrackSetSoloIsolate,
        };
 
        MIDIFunction (MIDI::Port&);
        virtual ~MIDIFunction ();
 
-       int init (BasicUI&, const std::string&);
+       int setup (GenericMidiControlProtocol&, const std::string& function_name, const std::string& argument, MIDI::byte* sysex = 0, size_t ssize = 0);
 
-       MIDI::Port& get_port() const { return _port; }
-       const std::string& function_name() const { return _function_name; }
+       const std::string& function_name() const { return _invokable_name; }
 
        XMLNode& get_state (void);
        int set_state (const XMLNode&, int version);
 
-       void bind_midi (MIDI::channel_t, MIDI::eventType, MIDI::byte);
-       MIDI::channel_t get_control_channel () { return control_channel; }
-       MIDI::eventType get_control_type () { return control_type; }
-       MIDI::byte get_control_additional () { return control_additional; }
-       
   private:
        Function        _function;
-       BasicUI*        _ui;
-       std::string     _function_name;
-       MIDI::Port&     _port;
-       PBD::ScopedConnection midi_sense_connection[2];
-       MIDI::eventType  control_type;
-       MIDI::byte       control_additional;
-       MIDI::channel_t  control_channel;
-
-       void init (const std::string& function_name);
+       std::string     _argument;
        void execute ();
-
-       void midi_sense_note (MIDI::Parser &, MIDI::EventTwoBytes *, bool is_on);
-       void midi_sense_note_on (MIDI::Parser &p, MIDI::EventTwoBytes *tb);
-       void midi_sense_note_off (MIDI::Parser &p, MIDI::EventTwoBytes *tb);
-       void midi_sense_controller (MIDI::Parser &, MIDI::EventTwoBytes *);
-       void midi_sense_program_change (MIDI::Parser &, MIDI::byte);
 };
 
 #endif // __gm_midicontrollable_h__