Control Surface  1.1.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>
14 
15 class BankableMIDIOutput;
16 
17 /**
18  * @brief A class for changing the address of BankableMIDIOutput%s.
19  */
20 class OutputBank {
21  public:
22  /**
23  * @brief Create a new OutputBank object.
24  *
25  * @param tracksPerBank
26  * The number of addresses/tracks to skip for each bank setting.
27  * Must be strictly positive.
28  * @param initialSelection
29  * The initial bank setting.
30  */
31  OutputBank(uint8_t tracksPerBank = 1, setting_t initialSelection = 0)
32  : tracksPerBank(tracksPerBank), bankSetting(initialSelection) {
33  if (tracksPerBank == 0)
34  FATAL_ERROR(F("A Bank must have a non-zero number of tracks."),
35  0x4573);
36  }
37 
38  /**
39  * @brief Select the given bank setting.
40  *
41  * @param setting
42  * The new setting to select.
43  */
44  void select(setting_t setting) { bankSetting = setting; }
45 
46  /**
47  * @brief Get the current bank setting.
48  */
49  virtual setting_t getSelection() const { return bankSetting; }
50 
51  /**
52  * @brief Get the number of tracks per bank.
53  * This is the number of addresses/tracks to skip for each bank setting.
54  */
55  uint8_t getTracksPerBank() const { return tracksPerBank; }
56 
57  /**
58  * @brief Get the offset (number of banks times the index of the selected
59  * bank)
60  */
61  uint8_t getOffset() const { return getSelection() * getTracksPerBank(); }
62 
63  private:
64  uint8_t tracksPerBank;
66 };
67 
68 /**
69  * @brief A class that groups Bankable BankableMIDIOutput%s and
70  * BankableMIDIInput%s, and allows the user to change the addresses
71  * of these elements.
72  *
73  * @tparam N
74  * The number of banks.
75  */
76 template <setting_t N>
77 class Bank : public Selectable<N>, public OutputBank {
78  friend class BankableMIDIInput<N>;
79 
80  public:
81  /**
82  * @brief Construct a new Bank object.
83  *
84  * @param tracksPerBank
85  * The number of addresses/tracks to skip for each bank setting.
86  * Must be strictly positive.
87  * @param initialSelection
88  * The initial bank setting.
89  */
93 
94  /**
95  * @brief Select the given bank setting.
96  *
97  * All BankableMIDIInput%s will be updated.
98  *
99  * @param bankSetting
100  * The new setting to select.
101  */
102  void select(setting_t bankSetting) override;
103 
104  /**
105  * @brief Get the number of Banks.
106  */
107  constexpr static uint8_t getNumberOfBanks() { return N; }
108 
109  private:
110  /**
111  * @brief Add a BankableMIDIInput to the bank.
112  *
113  * This method is called in the BankableMIDIInput constructor.
114  *
115  * @param bankable
116  * The BankableMIDIInput to be added.
117  */
118  void add(BankableMIDIInput<N> *bankable);
119 
120  /**
121  * @brief Remove a BankableMIDIInput from the bank.
122  *
123  * This method is called in the BankableMIDIInput destructor.
124  *
125  * @param bankable
126  * The BankableMIDIInput to be removed.
127  */
128  void remove(BankableMIDIInput<N> *bankable);
129 
130  /**
131  * @brief A linked list of all BankableMIDIInput elements that have been
132  * added to this bank, and that should be updated when the bank
133  * setting changes.
134  *
135  * The list is updated automatically when BankableMIDIInput elements are
136  * created or destroyed.
137  */
139 };
140 
142 
143 // ---------------------------- Implementations ----------------------------- //
144 
146 
148 
149 template <setting_t N>
151  inputBankables.append(bankable);
152 }
153 
154 template <setting_t N>
156  inputBankables.remove(bankable);
157 }
158 
159 template <setting_t N>
160 void Bank<N>::select(setting_t bankSetting) {
161  bankSetting = this->validateSetting(bankSetting);
162  OutputBank::select(bankSetting);
163  for (BankableMIDIInput<N> &e : inputBankables)
164  e.onBankSettingChange();
165 }
166 
OutputBank
A class for changing the address of BankableMIDIOutputs.
Definition: Bank.hpp:20
Bank
A class that groups Bankable BankableMIDIOutputs and BankableMIDIInputs, and allows the user to chang...
Definition: Bank.hpp:77
Bank::select
void select(setting_t bankSetting) override
Select the given bank setting.
Definition: Bank.hpp:160
OutputBank::getTracksPerBank
uint8_t getTracksPerBank() const
Get the number of tracks per bank.
Definition: Bank.hpp:55
Error.hpp
BEGIN_CS_NAMESPACE
#define BEGIN_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:9
Selectable.hpp
Bank::inputBankables
DoublyLinkedList< BankableMIDIInput< N > > inputBankables
A linked list of all BankableMIDIInput elements that have been added to this bank,...
Definition: Bank.hpp:138
Selectable
Definition: Selectable.hpp:11
OutputBank::getOffset
uint8_t getOffset() const
Get the offset (number of banks times the index of the selected bank)
Definition: Bank.hpp:61
OutputBank::tracksPerBank
uint8_t tracksPerBank
Definition: Bank.hpp:64
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::remove
void remove(BankableMIDIInput< N > *bankable)
Remove a BankableMIDIInput from the bank.
Definition: Bank.hpp:155
OutputBank::select
void select(setting_t setting)
Select the given bank setting.
Definition: Bank.hpp:44
Selectable::initialSelection
setting_t initialSelection
Definition: Selectable.hpp:40
OutputBank::getSelection
virtual setting_t getSelection() const
Get the current bank setting.
Definition: Bank.hpp:49
Bank::add
void add(BankableMIDIInput< N > *bankable)
Add a BankableMIDIInput to the bank.
Definition: Bank.hpp:150
DoublyLinkedList
A class for doubly linked lists.
Definition: LinkedList.hpp:27
setting_t
uint8_t setting_t
The type used for Selectors.
Definition: Def.hpp:50
Debug.hpp
BankableMIDIInput
A base class for all MIDIInputElements that can be banked.
Definition: Bank.hpp:13
OutputBank::bankSetting
setting_t bankSetting
Definition: Bank.hpp:65
OutputBank::OutputBank
OutputBank(uint8_t tracksPerBank=1, setting_t initialSelection=0)
Create a new OutputBank object.
Definition: Bank.hpp:31
BankableMIDIOutput
A base class for all MIDIOutputElements that can be banked.
Definition: BankableMIDIOutput.hpp:84
BankableMIDIInput.hpp
Bank::getNumberOfBanks
constexpr static uint8_t getNumberOfBanks()
Get the number of Banks.
Definition: Bank.hpp:107
Bank::Bank
Bank(uint8_t tracksPerBank=1, setting_t initialSelection=0)
Construct a new Bank object.
Definition: Bank.hpp:90
MIDI_Notes::F
constexpr int8_t F
Definition: Notes.hpp:23