Control Surface main
MIDI Control Surface library for Arduino
Loading...
Searching...
No Matches
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
20template <MIDIMessageType Type>
21class MIDIInputElement : public AH::UpdatableCRTP<MIDIInputElement<Type>> {
22 protected:
23 MIDIInputElement() = default;
24
25 public:
26 virtual ~MIDIInputElement() = default;
27
28 public:
30 typename std::conditional<Type == MIDIMessageType::SysExStart,
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
87template <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
112template <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
@ SysExStart
Start of System Exclusive.
#define END_CS_NAMESPACE
#define BEGIN_CS_NAMESPACE
A super class for object that have to be updated regularly.
Definition Updatable.hpp:28
static DoublyLinkedList< MIDIInputElement< Type > > updatables
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:94
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
typename std::conditional< Type==MIDIMessageType::SysExStart, SysExMessage, ChannelMessage >::type MessageType
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
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
typename MIDIInputElement< Type >::MessageType MessageType