Control Surface  1.2.0
MIDI Control Surface library for Arduino
Bank.hpp
Go to the documentation of this file.
1 /* ✔ */
2 
3 #pragma once
4 
5 #include <AH/Debug/Debug.hpp>
6 #include <AH/Error/Error.hpp>
9 
11 
12 template <setting_t N>
13 class BankableMIDIInput;
14 
18 class OutputBank {
19  public:
29  OutputBank(uint8_t tracksPerBank = 1, setting_t initialSelection = 0)
30  : tracksPerBank(tracksPerBank), bankSetting(initialSelection) {
31  if (tracksPerBank == 0)
32  FATAL_ERROR(F("A Bank must have a non-zero number of tracks."),
33  0x4573);
34  }
35 
42  void select(setting_t setting) { bankSetting = setting; }
43 
47  virtual setting_t getSelection() const { return bankSetting; }
48 
53  uint8_t getTracksPerBank() const { return tracksPerBank; }
54 
59  uint8_t getOffset() const { return getSelection() * getTracksPerBank(); }
60 
61  private:
62  uint8_t tracksPerBank;
64 };
65 
74 template <setting_t N>
75 class Bank : public Selectable<N>, public OutputBank {
76  friend class BankableMIDIInput<N>;
77 
78  public:
91 
100  void select(setting_t bankSetting) override;
101 
105  constexpr static uint8_t getNumberOfBanks() { return N; }
106 
107  private:
116  void add(BankableMIDIInput<N> *bankable);
117 
126  void remove(BankableMIDIInput<N> *bankable);
127 
137 };
138 
140 
141 // ---------------------------- Implementations ----------------------------- //
142 
144 
146 
147 template <setting_t N>
149  inputBankables.append(bankable);
150 }
151 
152 template <setting_t N>
154  inputBankables.remove(bankable);
155 }
156 
157 template <setting_t N>
158 void Bank<N>::select(setting_t bankSetting) {
159  bankSetting = this->validateSetting(bankSetting);
160  OutputBank::select(bankSetting);
161  for (BankableMIDIInput<N> &e : inputBankables)
162  e.onBankSettingChange();
163 }
164 
OutputBank::getTracksPerBank
uint8_t getTracksPerBank() const
Get the number of tracks per bank.
Definition: Bank.hpp:53
OutputBank
A class for changing the address of BankableMIDIOutputs.
Definition: Bank.hpp:18
Bank
A class that groups Bankable BankableMIDIOutputs and BankableMIDIInputs, and allows the user to chang...
Definition: Bank.hpp:75
OutputBank::select
void select(setting_t setting)
Select the given bank setting.
Definition: Bank.hpp:42
Error.hpp
Bank::select
void select(setting_t bankSetting) override
Select the given bank setting.
Definition: Bank.hpp:158
BEGIN_CS_NAMESPACE
#define BEGIN_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:9
Selectable.hpp
Selectable
Definition: Selectable.hpp:11
Bank::remove
void remove(BankableMIDIInput< N > *bankable)
Remove a BankableMIDIInput from the bank.
Definition: Bank.hpp:153
Bank::Bank
Bank(uint8_t tracksPerBank=1, setting_t initialSelection=0)
Construct a new Bank object.
Definition: Bank.hpp:88
FATAL_ERROR
#define FATAL_ERROR(msg, errc)
Print the error message and error code, and stop the execution.
Definition: Error.hpp:60
END_CS_NAMESPACE
#define END_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:10
LinkedList.hpp
Bank::inputBankables
DoublyLinkedList< BankableMIDIInput< N > > inputBankables
A linked list of all BankableMIDIInput elements that have been added to this bank,...
Definition: Bank.hpp:136
Bank::getNumberOfBanks
constexpr static uint8_t getNumberOfBanks()
Get the number of Banks.
Definition: Bank.hpp:105
OutputBank::tracksPerBank
uint8_t tracksPerBank
Definition: Bank.hpp:62
OutputBank::getSelection
virtual setting_t getSelection() const
Get the current bank setting.
Definition: Bank.hpp:47
OutputBank::bankSetting
setting_t bankSetting
Definition: Bank.hpp:63
Selectable::initialSelection
setting_t initialSelection
Definition: Selectable.hpp:40
MIDI_Notes::F
constexpr int8_t F
Definition: Notes.hpp:23
DoublyLinkedList
A class for doubly linked lists.
Definition: LinkedList.hpp:25
setting_t
uint8_t setting_t
The type used for Selectors.
Definition: Def.hpp:50
OutputBank::getOffset
uint8_t getOffset() const
Get the offset (number of banks times the index of the selected bank)
Definition: Bank.hpp:59
Debug.hpp
BankableMIDIInput
A base class for all MIDIInputElements that can be banked.
Definition: BankableMIDIInput.hpp:21
Bank::add
void add(BankableMIDIInput< N > *bankable)
Add a BankableMIDIInput to the bank.
Definition: Bank.hpp:148
BankableMIDIInput.hpp
OutputBank::OutputBank
OutputBank(uint8_t tracksPerBank=1, setting_t initialSelection=0)
Create a new OutputBank object.
Definition: Bank.hpp:29