Control Surface  1.1.1
MIDI Control Surface library for Arduino
NoteCCRangeLEDs.hpp
Go to the documentation of this file.
1 #pragma once
2 
5 
6 #include <AH/Hardware/ExtendedInputOutput/ExtendedInputOutput.hpp>
9 
11 
14 template <uint8_t NumLEDs>
16  public:
17  NoteCCLED(const PinList<NumLEDs> &ledPins) : ledPins(ledPins) {}
18 
19  void setThreshold(uint8_t threshold) { this->threshold = threshold; }
20  uint8_t getThreshold() const { return this->threshold; }
21 
22  void begin(const INoteCCValue &t) override {
23  for (pin_t pin : ledPins)
25  updateAll(t);
26  }
27 
28  void update(const INoteCCValue &t, uint8_t index) override {
29  uint8_t value = t.getValue(index);
30  bool state = value > threshold;
31  AH::ExtIO::digitalWrite(ledPins[index], state);
32  }
33 
34  private:
35  PinList<NumLEDs> ledPins;
36  uint8_t threshold = 0x3F;
37 };
38 
41 template <uint8_t NumLEDs>
43  public:
44  NoteCCLEDPWM(const PinList<NumLEDs> &ledPins) : ledPins(ledPins) {}
45 
46  void begin(const INoteCCValue &t) override {
47  for (pin_t pin : ledPins)
49  updateAll(t);
50  }
51 
52  void update(const INoteCCValue &t, uint8_t index) override {
53  uint8_t value = AH::increaseBitDepth<8, 7, uint8_t>(t.getValue(index));
54  AH::ExtIO::analogWrite(ledPins[index], value);
55  }
56 
57  private:
58  PinList<NumLEDs> ledPins;
59 };
60 
61 // :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: //
62 // Everything below is just definitions of type aliases to make the library
63 // easier to use.
64 //
65 // It defines MIDI elements that listen to (a single, a range of)
66 // (MIDI Note, MIDI Control Change) message(s) that display the values of
67 // these messages using normal on/off or PWM LEDs.
68 // :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: //
69 
70 // --------------------------------- ON/OFF --------------------------------- //
71 
74 
84 template <uint8_t RangeLen>
85 class NoteRangeLEDs : public GenericNoteCCRange<MIDIInputElementNote, RangeLen,
86  NoteCCLED<RangeLen>> {
87  public:
99  NoteRangeLEDs(const PinList<RangeLen> &ledPins,
102  NoteCCLED<RangeLen>>{
103  address,
104  {ledPins},
105  } {}
106 };
107 
115  : public GenericNoteCCRange<MIDIInputElementNote, 1, NoteCCLED<1>> {
116  public:
127  address,
128  {{ledPin}},
129  } {}
130 };
131 
134 using MIDINoteLED[[deprecated("Use NoteValueLED instead")]] = NoteValueLED;
135 
145 template <uint8_t RangeLen>
146 class CCRangeLEDs : public GenericNoteCCRange<MIDIInputElementCC, RangeLen,
147  NoteCCLED<RangeLen>> {
148  public:
160  CCRangeLEDs(const PinList<RangeLen> &ledPins, MIDICNChannelAddress address)
161  : GenericNoteCCRange<MIDIInputElementCC, RangeLen, NoteCCLED<RangeLen>>{
162  address,
163  {ledPins},
164  } {}
165 };
166 
174  : public GenericNoteCCRange<MIDIInputElementCC, 1, NoteCCLED<1>> {
175  public:
186  address,
187  {{ledPin}},
188  } {}
189 };
190 
192 
193 namespace Bankable {
194 
197 
198 template <uint8_t RangeLen, uint8_t BankSize>
199 class NoteRangeLEDs : public GenericNoteCCRange<MIDIInputElementNote, RangeLen,
200  BankSize, NoteCCLED<RangeLen>> {
201  public:
203  const PinList<RangeLen> &ledPins,
205  : GenericNoteCCRange<MIDIInputElementNote, RangeLen, BankSize,
206  NoteCCLED<RangeLen>>{
207  config,
208  address,
209  {ledPins},
210  } {}
211 };
212 
213 template <uint8_t BankSize>
214 class NoteValueLED : public GenericNoteCCRange<MIDIInputElementNote, 1,
215  BankSize, NoteCCLED<1>> {
216  public:
217  NoteValueLED(const BankConfig<BankSize> &config, pin_t ledPin,
220  config,
221  address,
222  {{ledPin}},
223  } {}
224 };
225 
228 template <uint8_t BankSize>
229 using MIDINoteLED[[deprecated("Use NoteValueLED instead")]] =
231 
232 template <uint8_t RangeLen, uint8_t BankSize>
233 class CCRangeLEDs : public GenericNoteCCRange<MIDIInputElementCC, RangeLen,
234  BankSize, NoteCCLED<RangeLen>> {
235  public:
237  const PinList<RangeLen> &ledPins,
239  : GenericNoteCCRange<MIDIInputElementCC, RangeLen, BankSize,
240  NoteCCLED<RangeLen>>{
241  config,
242  address,
243  {ledPins},
244  } {}
245 };
246 
247 template <uint8_t BankSize>
249  : public GenericNoteCCRange<MIDIInputElementCC, 1, BankSize, NoteCCLED<1>> {
250  public:
251  CCValueLED(const BankConfig<BankSize> &config, pin_t ledPin,
253  : GenericNoteCCRange<MIDIInputElementCC, 1, BankSize, NoteCCLED<1>>{
254  config,
255  address,
256  {{ledPin}},
257  } {}
258 };
259 
261 
262 } // namespace Bankable
263 
264 // ----------------------------------- PWM ---------------------------------- //
265 
268 
277 template <uint8_t RangeLen>
278 class NoteRangeLEDsPWM : public GenericNoteCCRange<MIDIInputElementNote, RangeLen,
279  NoteCCLEDPWM<RangeLen>> {
280  public:
292  NoteRangeLEDsPWM(const PinList<RangeLen> &ledPins,
295  NoteCCLEDPWM<RangeLen>>{
296  address,
297  {ledPins},
298  } {}
299 };
300 
307  : public GenericNoteCCRange<MIDIInputElementNote, 1, NoteCCLEDPWM<1>> {
308  public:
319  address,
320  {{ledPin}},
321  } {}
322 };
323 
332 template <uint8_t RangeLen>
333 class CCRangeLEDsPWM : public GenericNoteCCRange<MIDIInputElementCC, RangeLen,
334  NoteCCLEDPWM<RangeLen>> {
335  public:
347  CCRangeLEDsPWM(const PinList<RangeLen> &ledPins, MIDICNChannelAddress address)
348  : GenericNoteCCRange<MIDIInputElementCC, RangeLen, NoteCCLEDPWM<RangeLen>>{
349  address,
350  {ledPins},
351  } {}
352 };
353 
360  : public GenericNoteCCRange<MIDIInputElementCC, 1, NoteCCLEDPWM<1>> {
361  public:
372  address,
373  {{ledPin}},
374  } {}
375 };
376 
378 
379 namespace Bankable {
380 
383 
384 template <uint8_t RangeLen, uint8_t BankSize>
385 class NoteRangeLEDsPWM : public GenericNoteCCRange<MIDIInputElementNote, RangeLen,
386  BankSize, NoteCCLEDPWM<RangeLen>> {
387  public:
389  const PinList<RangeLen> &ledPins,
391  : GenericNoteCCRange<MIDIInputElementNote, RangeLen, BankSize,
392  NoteCCLEDPWM<RangeLen>>{
393  config,
394  address,
395  {ledPins},
396  } {}
397 };
398 
399 template <uint8_t BankSize>
400 class NoteValueLEDPWM : public GenericNoteCCRange<MIDIInputElementNote, 1,
401  BankSize, NoteCCLEDPWM<1>> {
402  public:
406  config,
407  address,
408  {{ledPin}},
409  } {}
410 };
411 
412 template <uint8_t RangeLen, uint8_t BankSize>
413 class CCRangeLEDsPWM : public GenericNoteCCRange<MIDIInputElementCC, RangeLen,
414  BankSize, NoteCCLEDPWM<RangeLen>> {
415  public:
417  const PinList<RangeLen> &ledPins,
419  : GenericNoteCCRange<MIDIInputElementCC, RangeLen, BankSize,
420  NoteCCLEDPWM<RangeLen>>{
421  config,
422  address,
423  {ledPins},
424  } {}
425 };
426 
427 template <uint8_t BankSize>
429  : public GenericNoteCCRange<MIDIInputElementCC, 1, BankSize, NoteCCLEDPWM<1>> {
430  public:
431  CCValueLEDPWM(const BankConfig<BankSize> &config, pin_t ledPin,
434  config,
435  address,
436  {{ledPin}},
437  } {}
438 };
439 
441 
442 } // namespace Bankable
443 
445 
AH::ExtIO::pinMode
void pinMode(pin_t pin, uint8_t mode)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:36
MIDIInputElement::address
const MIDICNChannelAddress address
Definition: MIDIInputElement.hpp:80
AH::ExtIO::analogWrite
void analogWrite(pin_t pin, analog_t val)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:103
Bankable::CCValueLED::CCValueLED
CCValueLED(const BankConfig< BankSize > &config, pin_t ledPin, const MIDICNChannelAddress &address)
Definition: NoteCCRangeLEDs.hpp:251
Bankable::CCValueLED
Definition: NoteCCRangeLEDs.hpp:248
MIDIInputElementNote
Class for objects that listen for incoming MIDI Note events.
Definition: MIDIInputElementNote.hpp:20
CCRangeLEDsPWM::CCRangeLEDsPWM
CCRangeLEDsPWM(const PinList< RangeLen > &ledPins, MIDICNChannelAddress address)
Construct a new CCRangeLEDsPWM object.
Definition: NoteCCRangeLEDs.hpp:347
Warnings.hpp
Bankable::NoteValueLED
Definition: NoteCCRangeLEDs.hpp:214
Bankable::CCValueLEDPWM
Definition: NoteCCRangeLEDs.hpp:428
Bankable
A namespace for MIDI elements that can be added to a Bank, to change their address or channel.
Definition: BankAddresses.hpp:7
NoteCCLEDPWM::ledPins
PinList< NumLEDs > ledPins
Definition: NoteCCRangeLEDs.hpp:58
SimpleNoteCCValueCallback::updateAll
virtual void updateAll(const INoteCCValue &noteccval)
Update all values: called when a bank change causes all values to (possibly) change,...
Definition: NoteCCRange.hpp:58
Bankable::CCRangeLEDsPWM::CCRangeLEDsPWM
CCRangeLEDsPWM(const BankConfig< BankSize > &config, const PinList< RangeLen > &ledPins, const MIDICNChannelAddress &address)
Definition: NoteCCRangeLEDs.hpp:416
NoteRangeLEDs::NoteRangeLEDs
NoteRangeLEDs(const PinList< RangeLen > &ledPins, MIDICNChannelAddress address)
Construct a new NoteRangeLEDs object.
Definition: NoteCCRangeLEDs.hpp:99
GenericNoteCCRange
Definition: NoteCCRange.hpp:155
Bankable::CCRangeLEDs::CCRangeLEDs
CCRangeLEDs(const BankConfig< BankSize > &config, const PinList< RangeLen > &ledPins, const MIDICNChannelAddress &address)
Definition: NoteCCRangeLEDs.hpp:236
INoteCCValue
Interface for NoteCCValue objects: provides getters for the velocity or controller values.
Definition: NoteCCRange.hpp:13
AH::pin_t
uint16_t pin_t
The type for Arduino pins (and ExtendedIOElement pins).
Definition: Hardware-Types.hpp:17
Bankable::NoteValueLEDPWM
Definition: NoteCCRangeLEDs.hpp:400
SimpleNoteCCValueCallback
A callback for NoteCCRange with an action that can be implemented by the user.
Definition: NoteCCRange.hpp:46
Bankable::NoteValueLED::NoteValueLED
NoteValueLED(const BankConfig< BankSize > &config, pin_t ledPin, const MIDICNChannelAddress &address)
Definition: NoteCCRangeLEDs.hpp:217
Bankable::GenericNoteCCRange
Definition: NoteCCRange.hpp:247
CCValueLED::CCValueLED
CCValueLED(pin_t ledPin, MIDICNChannelAddress address)
Construct a new CCValueLED object.
Definition: NoteCCRangeLEDs.hpp:184
NoteValueLEDPWM::NoteValueLEDPWM
NoteValueLEDPWM(pin_t ledPin, MIDICNChannelAddress address)
Construct a new NoteValueLEDPWM object.
Definition: NoteCCRangeLEDs.hpp:317
IncreaseBitDepth.hpp
BEGIN_CS_NAMESPACE
#define BEGIN_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:9
MIDIInputElementCC
Class for objects that listen for incoming MIDI Controller Change events.
Definition: MIDIInputElementCC.hpp:23
NoteCCLED::begin
void begin(const INoteCCValue &t) override
Initialize: called once.
Definition: NoteCCRangeLEDs.hpp:22
AH_DIAGNOSTIC_POP
#define AH_DIAGNOSTIC_POP()
Definition: Warnings.hpp:17
Bankable::CCRangeLEDs
Definition: NoteCCRangeLEDs.hpp:233
NoteCCLEDPWM::NoteCCLEDPWM
NoteCCLEDPWM(const PinList< NumLEDs > &ledPins)
Definition: NoteCCRangeLEDs.hpp:44
CCValueLEDPWM::CCValueLEDPWM
CCValueLEDPWM(pin_t ledPin, MIDICNChannelAddress address)
Construct a new CCValueLEDPWM object.
Definition: NoteCCRangeLEDs.hpp:370
END_CS_NAMESPACE
#define END_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:10
MIDICNChannelAddress
A type-safe utility class for saving a MIDI address consisting of a 7-bit address,...
Definition: MIDICNChannelAddress.hpp:82
Bankable::CCValueLEDPWM::CCValueLEDPWM
CCValueLEDPWM(const BankConfig< BankSize > &config, pin_t ledPin, const MIDICNChannelAddress &address)
Definition: NoteCCRangeLEDs.hpp:431
NoteCCLEDPWM::update
void update(const INoteCCValue &t, uint8_t index) override
Update the given index: called when a new message is received for this index.
Definition: NoteCCRangeLEDs.hpp:52
NoteRangeLEDsPWM::NoteRangeLEDsPWM
NoteRangeLEDsPWM(const PinList< RangeLen > &ledPins, MIDICNChannelAddress address)
Construct a new NoteRangeLEDsPWM object.
Definition: NoteCCRangeLEDs.hpp:292
Bankable::NoteRangeLEDsPWM::NoteRangeLEDsPWM
NoteRangeLEDsPWM(const BankConfig< BankSize > &config, const PinList< RangeLen > &ledPins, const MIDICNChannelAddress &address)
Definition: NoteCCRangeLEDs.hpp:388
NoteValueLED
MIDI Input Element that listens for MIDI Note messages for the given note, and displays its value by ...
Definition: NoteCCRangeLEDs.hpp:114
NoteCCLED::ledPins
PinList< NumLEDs > ledPins
Definition: NoteCCRangeLEDs.hpp:35
NoteCCLED::NoteCCLED
NoteCCLED(const PinList< NumLEDs > &ledPins)
Definition: NoteCCRangeLEDs.hpp:17
NoteCCLED
Callback for Note or CC range or value input that displays the value to a normal on/off LED.
Definition: NoteCCRangeLEDs.hpp:15
INoteCCValue::getValue
virtual uint8_t getValue(uint8_t index) const =0
Get the velocity or controller value for the given index in the range.
Bankable::NoteRangeLEDs::NoteRangeLEDs
NoteRangeLEDs(const BankConfig< BankSize > &config, const PinList< RangeLen > &ledPins, const MIDICNChannelAddress &address)
Definition: NoteCCRangeLEDs.hpp:202
CCRangeLEDsPWM
MIDI Input Element that listens for MIDI Control Change messages in a given range,...
Definition: NoteCCRangeLEDs.hpp:333
NoteCCLEDPWM
Callback for Note or CC range or value input that displays the value to a PWM LED.
Definition: NoteCCRangeLEDs.hpp:42
CCRangeLEDs
MIDI Input Element that listens for MIDI Control Change messages in a given range,...
Definition: NoteCCRangeLEDs.hpp:146
NoteCCLED::setThreshold
void setThreshold(uint8_t threshold)
Definition: NoteCCRangeLEDs.hpp:19
CCRangeLEDs::CCRangeLEDs
CCRangeLEDs(const PinList< RangeLen > &ledPins, MIDICNChannelAddress address)
Construct a new CCRangeLEDs object.
Definition: NoteCCRangeLEDs.hpp:160
AH_DIAGNOSTIC_WERROR
#define AH_DIAGNOSTIC_WERROR()
Definition: Warnings.hpp:16
CCValueLED
MIDI Input Element that listens for MIDI Control Change messages for the given controller,...
Definition: NoteCCRangeLEDs.hpp:173
CCValueLEDPWM
MIDI Input Element that listens for MIDI Control Change messages for the given controller,...
Definition: NoteCCRangeLEDs.hpp:359
BankConfig
A struct for selecting the bank of BankableMIDIInputs and the bank type.
Definition: BankConfig.hpp:39
Bankable::CCRangeLEDsPWM
Definition: NoteCCRangeLEDs.hpp:413
OUTPUT
const uint8_t OUTPUT
Definition: ExtendedInputOutput.hpp:50
AH::ExtIO::digitalWrite
void digitalWrite(pin_t pin, uint8_t val)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:48
NoteRangeLEDsPWM
MIDI Input Element that listens for MIDI Note messages in a given range, and displays their velocity ...
Definition: NoteCCRangeLEDs.hpp:278
NoteValueLED::NoteValueLED
NoteValueLED(pin_t ledPin, MIDICNChannelAddress address)
Construct a new NoteValueLED object.
Definition: NoteCCRangeLEDs.hpp:125
NoteValueLEDPWM
MIDI Input Element that listens for MIDI Note messages for the given note, and displays its velocity ...
Definition: NoteCCRangeLEDs.hpp:306
NoteCCLEDPWM::begin
void begin(const INoteCCValue &t) override
Initialize: called once.
Definition: NoteCCRangeLEDs.hpp:46
Bankable::NoteRangeLEDs
Definition: NoteCCRangeLEDs.hpp:199
Bankable::NoteValueLEDPWM::NoteValueLEDPWM
NoteValueLEDPWM(const BankConfig< BankSize > &config, pin_t ledPin, const MIDICNChannelAddress &address)
Definition: NoteCCRangeLEDs.hpp:403
NoteCCLED::threshold
uint8_t threshold
Definition: NoteCCRangeLEDs.hpp:36
NoteRangeLEDs
MIDI Input Element that listens for MIDI Note messages in a given range, and displays their values by...
Definition: NoteCCRangeLEDs.hpp:85
NoteCCRange.hpp
Bankable::NoteRangeLEDsPWM
Definition: NoteCCRangeLEDs.hpp:385
NoteCCLED::update
void update(const INoteCCValue &t, uint8_t index) override
Update the given index: called when a new message is received for this index.
Definition: NoteCCRangeLEDs.hpp:28
NoteCCLED::getThreshold
uint8_t getThreshold() const
Definition: NoteCCRangeLEDs.hpp:20