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
MIDIInputElement< MIDIMessageType::ControlChange > MIDIInputElementCC
MIDI Input Element that listens for MIDI Control Change messages.
MIDIInputElement< MIDIMessageType::PitchBend > MIDIInputElementPB
MIDI Input Element that listens for MIDI Pitch Bend messages.
MIDIInputElement< MIDIMessageType::SysExStart > MIDIInputElementSysEx
MIDI Input Element that listens for MIDI System Exclusive messages.
MIDIInputElement< MIDIMessageType::NoteOn > MIDIInputElementNote
MIDI Input Element that listens for MIDI Note On/Off messages.
MIDIInputElement< MIDIMessageType::KeyPressure > MIDIInputElementKP
MIDI Input Element that listens for MIDI Key Pressure messages.
MIDIInputElement< MIDIMessageType::ChannelPressure > MIDIInputElementCP
MIDI Input Element that listens for MIDI Channel Pressure messages.
MIDIInputElement< MIDIMessageType::ProgramChange > MIDIInputElementPC
MIDI Input Element that listens for MIDI Program Change messages.
@ 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
friend class Bank
Definition Bank.hpp:71
virtual ~BankableMatchingMIDIInputElement()
Destructor: remove element from the bank.
BankableMatchingMIDIInputElement(const Matcher &matcher)
Create a new BankableMatchingMIDIInputElement object, and add it to 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.
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