Control Surface
main
MIDI Control Surface library for Arduino
Toggle main menu visibility
Loading...
Searching...
No Matches
src
Banks
Bank.hpp
Go to the documentation of this file.
1
/* ✔ */
2
3
#pragma once
4
5
#include <
AH/Containers/LinkedList.hpp
>
6
#include <
AH/Debug/Debug.hpp
>
7
#include <
AH/Error/Error.hpp
>
8
#include <
Selectors/Selectable.hpp
>
9
10
BEGIN_CS_NAMESPACE
11
12
template
<setting_t N>
13
class
BankableMIDIInput
;
14
16
class
OutputBank
{
17
public
:
28
OutputBank
(uint8_t
tracksPerBank
= 1,
setting_t
initialSelection = 0,
29
int8_t
selectionOffset
= 0)
30
:
tracksPerBank
(
tracksPerBank
),
bankSetting
(initialSelection),
31
selectionOffset
(
selectionOffset
) {
32
if
(
tracksPerBank
== 0)
33
FATAL_ERROR
(F(
"A Bank must have a non-zero number of tracks."
),
34
0x4573);
35
}
36
41
void
select
(
setting_t
setting) {
bankSetting
= setting; }
42
44
setting_t
getSelection
()
const
{
return
bankSetting
; }
46
int8_t
getSelectionOffset
()
const
{
return
selectionOffset
; }
47
50
uint8_t
getTracksPerBank
()
const
{
return
tracksPerBank
; }
51
53
int8_t
getOffsetOfSetting
(
setting_t
s)
const
{
54
return
(s +
getSelectionOffset
()) *
getTracksPerBank
();
55
}
56
58
int8_t
getOffset
()
const
{
return
getOffsetOfSetting
(
getSelection
()); }
59
60
private
:
61
uint8_t
tracksPerBank
;
62
setting_t
bankSetting
;
63
int8_t
selectionOffset
;
64
};
65
68
class
BankSettingChangeCallback
69
:
public
DoublyLinkable
<BankSettingChangeCallback> {
70
template
<setting_t N>
71
friend
class
Bank
;
72
73
private
:
81
virtual
void
onBankSettingChange
() {}
82
};
83
93
template
<setting_t NumBanks>
94
class
Bank
:
public
Selectable
<NumBanks>,
public
OutputBank
{
95
96
public
:
107
Bank
(uint8_t
tracksPerBank
= 1,
setting_t
initialSelection
= 0,
108
int8_t
selectionOffset
= 0)
109
:
Selectable
<NumBanks>(
initialSelection
),
110
OutputBank
(
tracksPerBank
,
initialSelection
,
selectionOffset
) {}
111
119
void
select
(
setting_t
bankSetting
)
override
;
120
122
constexpr
static
uint8_t
getNumberOfBanks
() {
return
NumBanks; }
123
124
public
:
129
void
add
(
BankSettingChangeCallback
*bankable);
130
135
void
remove
(
BankSettingChangeCallback
*bankable);
136
137
private
:
142
DoublyLinkedList<BankSettingChangeCallback>
inputBankables
;
143
};
144
145
END_CS_NAMESPACE
146
147
// ---------------------------- Implementations ----------------------------- //
148
149
BEGIN_CS_NAMESPACE
150
151
template
<setting_t NumBanks>
152
void
Bank<NumBanks>::add
(
BankSettingChangeCallback
*bankable) {
153
inputBankables
.append(bankable);
154
}
155
156
template
<setting_t NumBanks>
157
void
Bank<NumBanks>::remove
(
BankSettingChangeCallback
*bankable) {
158
inputBankables
.remove(bankable);
159
}
160
161
template
<setting_t NumBanks>
162
void
Bank<NumBanks>::select
(
setting_t
bankSetting
) {
163
bankSetting
= this->
validateSetting
(
bankSetting
);
164
OutputBank::select
(
bankSetting
);
165
for
(
BankSettingChangeCallback
&e :
inputBankables
)
166
e.onBankSettingChange();
167
}
168
169
END_CS_NAMESPACE
Debug.hpp
setting_t
uint8_t setting_t
The type used for Selectors.
Definition
Def.hpp:53
Error.hpp
LinkedList.hpp
Selectable.hpp
END_CS_NAMESPACE
#define END_CS_NAMESPACE
Definition
Settings/NamespaceSettings.hpp:14
BEGIN_CS_NAMESPACE
#define BEGIN_CS_NAMESPACE
Definition
Settings/NamespaceSettings.hpp:11
BankSettingChangeCallback
Callback class for Bankable objects that need to be notified when the active setting of their Bank ch...
Definition
Bank.hpp:69
BankSettingChangeCallback::onBankSettingChange
virtual void onBankSettingChange()
A function to be executed each time the bank setting changes.
Definition
Bank.hpp:81
BankSettingChangeCallback::Bank
friend class Bank
Definition
Bank.hpp:71
Bank::getNumberOfBanks
static constexpr uint8_t getNumberOfBanks()
Get the number of banks.
Definition
Bank.hpp:122
Bank::add
void add(BankSettingChangeCallback *bankable)
Add a Bankable MIDI Input Element to the bank.
Definition
Bank.hpp:152
Bank::remove
void remove(BankSettingChangeCallback *bankable)
Remove a Bankable MIDI Input Element from the bank.
Definition
Bank.hpp:157
Bank::select
void select(setting_t bankSetting) override
Select the given bank setting.
Definition
Bank.hpp:162
Bank::Bank
Bank(uint8_t tracksPerBank=1, setting_t initialSelection=0, int8_t selectionOffset=0)
Construct a new Bank object.
Definition
Bank.hpp:107
Bank::inputBankables
DoublyLinkedList< BankSettingChangeCallback > inputBankables
A linked list of all Bankable MIDI Input Elements that have been added to this bank,...
Definition
Bank.hpp:142
BankableMIDIInput
Definition
Bank.hpp:13
DoublyLinkable< BankSettingChangeCallback >::DoublyLinkable
DoublyLinkable()=default
DoublyLinkedList
A class for doubly linked lists.
Definition
LinkedList.hpp:21
OutputBank::getTracksPerBank
uint8_t getTracksPerBank() const
Get the number of tracks per bank.
Definition
Bank.hpp:50
OutputBank::getSelection
setting_t getSelection() const
Get the current bank setting (zero-based).
Definition
Bank.hpp:44
OutputBank::getOffset
int8_t getOffset() const
Get the address offset (number of banks times the index of the selected bank after applying the offse...
Definition
Bank.hpp:58
OutputBank::OutputBank
OutputBank(uint8_t tracksPerBank=1, setting_t initialSelection=0, int8_t selectionOffset=0)
Create a new OutputBank object.
Definition
Bank.hpp:28
OutputBank::tracksPerBank
uint8_t tracksPerBank
Definition
Bank.hpp:61
OutputBank::select
void select(setting_t setting)
Select the given bank setting.
Definition
Bank.hpp:41
OutputBank::getOffsetOfSetting
int8_t getOffsetOfSetting(setting_t s) const
The same as getOffset, but for a given setting.
Definition
Bank.hpp:53
OutputBank::selectionOffset
int8_t selectionOffset
Definition
Bank.hpp:63
OutputBank::bankSetting
setting_t bankSetting
Definition
Bank.hpp:62
OutputBank::getSelectionOffset
int8_t getSelectionOffset() const
Get the offset of the bank setting.
Definition
Bank.hpp:46
Selectable< NumBanks >::initialSelection
setting_t initialSelection
Definition
Selectable.hpp:40
Selectable< NumBanks >::Selectable
Selectable(setting_t initialSelection=0)
Definition
Selectable.hpp:13
Selectable< NumBanks >::validateSetting
static setting_t validateSetting(setting_t setting)
Definition
Selectable.hpp:19
FATAL_ERROR
#define FATAL_ERROR(msg, errc)
Print the error message and error code, and stop the execution.
Definition
Error.hpp:57
Generated by
1.17.0