Control Surface
2.1.2
MIDI Control Surface library for Arduino
Toggle main menu visibility
Loading...
Searching...
No Matches
src
MIDI_Outputs
Bankable
Abstract
SmartMIDIFilteredAnalog.hpp
Go to the documentation of this file.
1
#pragma once
2
3
#include <
AH/Containers/BitArray.hpp
>
4
#include <
AH/Hardware/FilteredAnalog.hpp
>
5
#include <AH/STL/algorithm>
// std::fill
6
#include <
Banks/BankableAddresses.hpp
>
7
#include <
Def/Def.hpp
>
8
#include <
MIDI_Outputs/Abstract/MIDIOutputElement.hpp
>
9
10
BEGIN_CS_NAMESPACE
11
12
namespace
Bankable
{
13
25
template
<u
int
8_t NumBanks,
class
BankAddress,
class
Sender>
26
class
SmartMIDIFilteredAnalog
:
public
MIDIOutputElement
{
27
protected
:
39
SmartMIDIFilteredAnalog
(BankAddress bankAddress,
pin_t
analogPin,
40
const
Sender &
sender
)
41
:
address
(bankAddress),
filteredAnalog
(analogPin),
sender
(
sender
) {}
42
43
public
:
45
enum
State
{
48
Active
,
52
Lower
,
56
Higher
,
57
};
58
59
void
begin
()
override
{
60
filteredAnalog
.resetToCurrentValue();
61
previousBank
=
address
.getSelection();
62
std::fill(std::begin(
previousValues
), std::end(
previousValues
),
63
initial
);
64
}
65
66
void
update
()
override
{
67
auto
activeBank =
address
.getSelection();
68
if
(
filteredAnalog
.update() || activeBank !=
previousBank
) {
69
auto
previousValue =
previousValues
[activeBank];
70
auto
value =
filteredAnalog
.getValue();
71
if
(activeBank ==
previousBank
&&
state
==
Higher
) {
72
if
(value <= previousValue)
73
state
=
Active
;
74
}
else
if
(activeBank ==
previousBank
&&
state
==
Lower
) {
75
if
(value >= previousValue)
76
state
=
Active
;
77
}
else
if
(activeBank !=
previousBank
) {
78
if
(value == previousValue || previousValue ==
initial
)
79
state
=
Active
;
80
else
if
(value > previousValue)
81
state
=
Higher
;
82
else
83
state
=
Lower
;
84
previousBank
= activeBank;
85
}
86
if
(activeBank ==
previousBank
&&
state
==
Active
) {
87
sender
.send(value,
address
.getActiveAddress());
88
previousValues
[activeBank] = value;
89
}
90
}
91
}
92
97
State
getState
()
const
{
return
state
; }
98
103
void
activate
() {
state
=
Active
; }
104
117
void
map
(
MappingFunction
fn) {
filteredAnalog
.map(fn); }
118
120
void
invert
() {
filteredAnalog
.invert(); }
121
126
analog_t
getRawValue
()
const
{
return
filteredAnalog
.getRawValue(); }
127
131
static
constexpr
analog_t
getMaxRawValue
() {
132
return
FilteredAnalog::getMaxRawValue
();
133
}
134
139
analog_t
getValue
()
const
{
return
filteredAnalog
.getValue(); }
140
144
analog_t
getPreviousValue
(
setting_t
bank)
const
{
145
return
previousValues
[bank];
146
}
147
151
analog_t
getPreviousValue
()
const
{
152
return
getPreviousValue
(
address
.getSelection());
153
}
154
155
protected
:
156
BankAddress
address
;
157
using
FilteredAnalog
=
AH::FilteredAnalog
<Sender::precision()>;
158
FilteredAnalog
filteredAnalog
;
159
static_assert
(
160
Sender::precision() <= 14,
161
"Sender precision must be 14 or less, because larger values are "
162
"reserved."
);
163
constexpr
static
analog_t
initial
= 1u << 14;
164
AH::Array<analog_t, NumBanks>
previousValues
= {{}};
165
State
state
=
Active
;
166
setting_t
previousBank
= 0;
167
168
public
:
169
Sender
sender
;
170
};
171
172
}
// namespace Bankable
173
174
END_CS_NAMESPACE
BankableAddresses.hpp
BitArray.hpp
Def.hpp
setting_t
uint8_t setting_t
The type used for Selectors.
Definition
Def.hpp:53
MappingFunction
analog_t(*)(analog_t) MappingFunction
Definition
Def.hpp:23
FilteredAnalog.hpp
MIDIOutputElement.hpp
MIDIOutputElement
AH::Updatable<> MIDIOutputElement
Definition
MIDIOutputElement.hpp:9
END_CS_NAMESPACE
#define END_CS_NAMESPACE
Definition
Settings/NamespaceSettings.hpp:14
BEGIN_CS_NAMESPACE
#define BEGIN_CS_NAMESPACE
Definition
Settings/NamespaceSettings.hpp:11
AH::FilteredAnalog
A class that reads and filters an analog input.
Definition
FilteredAnalog.hpp:275
AH::FilteredAnalog< Sender::precision()>::getMaxRawValue
static constexpr analog_t getMaxRawValue()
Definition
FilteredAnalog.hpp:172
Bankable::SmartMIDIFilteredAnalog::address
BankAddress address
Definition
SmartMIDIFilteredAnalog.hpp:156
Bankable::SmartMIDIFilteredAnalog::sender
Sender sender
Definition
SmartMIDIFilteredAnalog.hpp:169
Bankable::SmartMIDIFilteredAnalog::getValue
analog_t getValue() const
Get the value of the analog input (this is the value after first applying the mapping function).
Definition
SmartMIDIFilteredAnalog.hpp:139
Bankable::SmartMIDIFilteredAnalog::update
void update() override
Update this updatable.
Definition
SmartMIDIFilteredAnalog.hpp:66
Bankable::SmartMIDIFilteredAnalog::getMaxRawValue
static constexpr analog_t getMaxRawValue()
Get the maximum value that can be returned from getRawValue.
Definition
SmartMIDIFilteredAnalog.hpp:131
Bankable::SmartMIDIFilteredAnalog::map
void map(MappingFunction fn)
Specify a mapping function that is applied to the raw analog value before sending.
Definition
SmartMIDIFilteredAnalog.hpp:117
Bankable::SmartMIDIFilteredAnalog::initial
static constexpr analog_t initial
Definition
SmartMIDIFilteredAnalog.hpp:163
Bankable::SmartMIDIFilteredAnalog::State
State
State of the smart potentiometer.
Definition
SmartMIDIFilteredAnalog.hpp:45
Bankable::SmartMIDIFilteredAnalog::Active
@ Active
The potentiometer is active, the position changes will be sent over MIDI.
Definition
SmartMIDIFilteredAnalog.hpp:48
Bankable::SmartMIDIFilteredAnalog::Higher
@ Higher
The value of the potentiometer is higher than the previously recorded value for the current bank.
Definition
SmartMIDIFilteredAnalog.hpp:56
Bankable::SmartMIDIFilteredAnalog::Lower
@ Lower
The value of the potentiometer is lower than the previously recorded value for the current bank.
Definition
SmartMIDIFilteredAnalog.hpp:52
Bankable::SmartMIDIFilteredAnalog::FilteredAnalog
AH::FilteredAnalog< Sender::precision()> FilteredAnalog
Definition
SmartMIDIFilteredAnalog.hpp:157
Bankable::SmartMIDIFilteredAnalog::previousValues
AH::Array< analog_t, NumBanks > previousValues
Definition
SmartMIDIFilteredAnalog.hpp:164
Bankable::SmartMIDIFilteredAnalog::begin
void begin() override
Initialize this updatable.
Definition
SmartMIDIFilteredAnalog.hpp:59
Bankable::SmartMIDIFilteredAnalog::invert
void invert()
Invert the analog value.
Definition
SmartMIDIFilteredAnalog.hpp:120
Bankable::SmartMIDIFilteredAnalog::activate
void activate()
Activate the potentiometer in the current bank, regardless of its current and previous position.
Definition
SmartMIDIFilteredAnalog.hpp:103
Bankable::SmartMIDIFilteredAnalog::state
State state
Definition
SmartMIDIFilteredAnalog.hpp:165
Bankable::SmartMIDIFilteredAnalog::getState
State getState() const
Get the state of the smart potentiometer, to know whether the position has to be lower or higher in o...
Definition
SmartMIDIFilteredAnalog.hpp:97
Bankable::SmartMIDIFilteredAnalog::getRawValue
analog_t getRawValue() const
Get the raw value of the analog input (this is the value without applying the filter or the mapping f...
Definition
SmartMIDIFilteredAnalog.hpp:126
Bankable::SmartMIDIFilteredAnalog::getPreviousValue
analog_t getPreviousValue(setting_t bank) const
Get the previous value of the analog input of the given bank.
Definition
SmartMIDIFilteredAnalog.hpp:144
Bankable::SmartMIDIFilteredAnalog::filteredAnalog
FilteredAnalog filteredAnalog
Definition
SmartMIDIFilteredAnalog.hpp:158
Bankable::SmartMIDIFilteredAnalog::SmartMIDIFilteredAnalog
SmartMIDIFilteredAnalog(BankAddress bankAddress, pin_t analogPin, const Sender &sender)
Construct a new SmartMIDIFilteredAnalog.
Definition
SmartMIDIFilteredAnalog.hpp:39
Bankable::SmartMIDIFilteredAnalog::getPreviousValue
analog_t getPreviousValue() const
Get the previous value of the analog input of the active bank.
Definition
SmartMIDIFilteredAnalog.hpp:151
Bankable::SmartMIDIFilteredAnalog::previousBank
setting_t previousBank
Definition
SmartMIDIFilteredAnalog.hpp:166
AH::analog_t
uint16_t analog_t
The type returned from analogRead and similar functions.
Definition
Hardware-Types.hpp:14
Bankable
A namespace for MIDI elements that can be added to a Bank, to change their address or channel.
Definition
BankAddresses.hpp:7
AH::Array
An array wrapper for easy copying, comparing, and iterating.
Definition
Array.hpp:32
AH::ExtIO::pin_t
Type for storing pin numbers of Extended Input/Output elements.
Definition
Hardware-Types.hpp:25
Generated by
1.17.0