Control Surface new-input
MIDI Control Surface library for Arduino
MIDIInputElement.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <Def/MIDIAddress.hpp>
5 
6 #include <Banks/Bank.hpp> // Bank<N>, BankSettingChangeCallback
7 
9 #include <AH/STL/type_traits>
10 
12 
13 // -------------------------------------------------------------------------- //
14 
20 template <MIDIMessageType Type>
21 class MIDIInputElement : public AH::UpdatableCRTP<MIDIInputElement<Type>> {
22  protected:
23  MIDIInputElement() = default;
24 
25  public:
26  virtual ~MIDIInputElement() = default;
27 
28  public:
29  using MessageType =
30  typename std::conditional<Type == MIDIMessageType::SYSEX_START,
32 
34  virtual void begin() {} // LCOV_EXCL_LINE
35 
37  virtual void reset() {} // LCOV_EXCL_LINE
38 
40  virtual void update() {} // LCOV_EXCL_LINE
41 
43  virtual bool updateWith(MessageType midimsg) = 0;
44 
46  static bool updateAllWith(MessageType midimsg) {
47  for (auto &el : MIDIInputElement::updatables) {
48  if (el.updateWith(midimsg)) {
49  el.moveDown();
50  return true;
51  }
52  }
53  return false;
54  }
55 
57  static void updateAll() {
58  MIDIInputElement::applyToAll(&MIDIInputElement::update);
59  }
60 
62  static void beginAll() {
63  MIDIInputElement::applyToAll(&MIDIInputElement::begin);
64  }
65 
67  static void resetAll() {
68  MIDIInputElement::applyToAll(&MIDIInputElement::reset);
69  }
70 };
71 
72 // -------------------------------------------------------------------------- //
73 
87 template <MIDIMessageType Type, class Matcher>
89  protected:
91 
92  public:
94 
95  bool updateWith(MessageType midimsg) override {
96  auto match = matcher(midimsg);
97  if (match.match)
98  handleUpdate(match);
99  return match.match;
100  }
101 
102  virtual void handleUpdate(typename Matcher::Result match) = 0;
103 
104  protected:
105  Matcher matcher;
106 };
107 
108 // -------------------------------------------------------------------------- //
109 
112 template <MIDIMessageType Type, class Matcher>
114  : public MatchingMIDIInputElement<Type, Matcher>,
116  friend class Bank<Matcher::getBankSize()>;
117 
118  protected:
121  BankableMatchingMIDIInputElement(const Matcher &matcher)
122  : MatchingMIDIInputElement<Type, Matcher>(matcher) {
123  this->matcher.getBank().add(this);
124  }
125 
126  uint8_t getActiveBank() const { return this->matcher.getSelection(); }
127 
128  public:
131  this->matcher.getBank().remove(this);
132  }
133 };
134 
135 // -------------------------------------------------------------------------- //
136 
151 
#define END_CS_NAMESPACE
#define BEGIN_CS_NAMESPACE
A super class for object that have to be updated regularly.
Definition: Updatable.hpp:32
static DoublyLinkedList< MIDIInputElement< Type > > updatables
Definition: Updatable.hpp:156
Callback class for Bankable objects that need to be notified when the active setting of their Bank ch...
Definition: Bank.hpp:69
A class that groups Bankable MIDI Output Elements and Bankable MIDI Input Elements,...
Definition: Bank.hpp:91
Similar to MatchingMIDIInputElement, but for Bankable MIDI Input Elements.
virtual ~BankableMatchingMIDIInputElement()
Destructor: remove element from the bank.
A class for objects that listen for incoming MIDI events.
MIDIInputElement()=default
virtual void begin()
Initialize the input element.
static void updateAll()
Update all.
static void beginAll()
Begin all.
virtual void reset()
Reset the input element to its initial state.
virtual ~MIDIInputElement()=default
typename std::conditional< Type==MIDIMessageType::SYSEX_START, SysExMessage, ChannelMessage >::type MessageType
virtual void update()
Update the value of the input element. Used for decaying VU meters etc.
virtual bool updateWith(MessageType midimsg)=0
Receive a new MIDI message and update the internal state.
static void resetAll()
Reset all.
static bool updateAllWith(MessageType midimsg)
Update all.
The MIDIInputElement base class is very general: you give it a MIDI message, and it calls the updateW...
MatchingMIDIInputElement(const Matcher &matcher)
bool updateWith(MessageType midimsg) override
Receive a new MIDI message and update the internal state.
virtual void handleUpdate(typename Matcher::Result match)=0