Control Surface
main
MIDI Control Surface library for Arduino
Toggle main menu visibility
Loading...
Searching...
No Matches
src
MIDI_Outputs
Bankable
Abstract
Bankable/Abstract/MIDIAbsoluteEncoder.hpp
Go to the documentation of this file.
1
#pragma once
2
3
#include <AH/STL/utility>
// std::forward
4
#include <
Banks/BankableAddresses.hpp
>
5
#include <
Def/Def.hpp
>
6
#include <
Def/TypeTraits.hpp
>
7
#include <
MIDI_Outputs/Abstract/EncoderState.hpp
>
8
#include <
MIDI_Outputs/Abstract/MIDIOutputElement.hpp
>
9
10
#ifdef ARDUINO
11
#include <
Submodules/Encoder/AHEncoder.hpp
>
12
#else
13
#include <Encoder.h>
// Mock
14
#endif
15
16
BEGIN_CS_NAMESPACE
17
18
namespace
Bankable
{
19
24
template
<
class
Enc, u
int
8_t NumBanks,
class
BankAddress,
class
Sender>
25
class
GenericMIDIAbsoluteEncoder
:
public
MIDIOutputElement
{
26
public
:
27
GenericMIDIAbsoluteEncoder
(
const
BankAddress &
address
, Enc &&
encoder
,
28
int16_t speedMultiply, uint8_t pulsesPerStep,
29
const
Sender &
sender
)
30
:
encoder
(std::forward<Enc>(
encoder
)),
address
(
address
),
31
encstate
(speedMultiply, pulsesPerStep),
sender
(
sender
) {}
32
33
void
begin
()
override
{
begin_if_possible
(
encoder
); }
34
35
void
update
()
override
{
36
auto
encval =
encoder
.read();
37
if
(int16_t delta =
encstate
.update(encval)) {
38
address
.lock();
39
int16_t oldValue =
values
[
address
.getSelection()];
40
int16_t newValue = oldValue + delta;
41
newValue = constrain(newValue, 0,
maxValue
);
42
if
(oldValue != newValue) {
43
values
[
address
.getSelection()] = newValue;
44
forcedUpdate
();
45
}
46
address
.unlock();
47
}
48
}
49
52
void
forcedUpdate
() {
53
sender
.send(
values
[
address
.getSelection()],
address
.getActiveAddress());
54
}
55
void
forcedUpdate
(
setting_t
bank) {
56
sender
.send(
values
[bank],
address
.getActiveAddress(bank));
57
}
58
62
uint16_t
getValue
(
setting_t
bank)
const
{
return
values
[bank]; }
66
uint16_t
getValue
()
const
{
return
getValue
(
address
.getSelection()); }
67
71
void
setValue
(uint16_t value,
setting_t
bank) {
values
[bank] = value; }
75
void
setValue
(uint16_t value) {
setValue
(value,
address
.getSelection()); }
76
78
static
int16_t
getMaxValue
() {
return
maxValue
; }
79
80
void
setSpeedMultiply
(int16_t speedMultiply) {
81
encstate
.setSpeedMultiply(speedMultiply);
82
}
83
int16_t
getSpeedMultiply
()
const
{
return
encstate
.getSpeedMultiply(); }
84
85
int16_t
resetPositionOffset
() {
86
auto
encval =
encoder
.read();
87
return
encstate
.update(encval);
88
}
89
90
protected
:
91
Enc
encoder
;
92
BankAddress
address
;
93
Array<int16_t, NumBanks>
values
= {{}};
94
EncoderState
<
decltype
(
encoder
.read())>
encstate
;
95
96
constexpr
static
int16_t
maxValue
= uint16_t(1u << Sender::precision()) - 1;
97
98
public
:
99
Sender
sender
;
100
};
101
102
template
<u
int
8_t NumBanks,
class
BankAddress,
class
Sender>
103
using
MIDIAbsoluteEncoder
=
104
GenericMIDIAbsoluteEncoder<AHEncoder, NumBanks, BankAddress, Sender>
;
105
106
template
<u
int
8_t NumBanks,
class
BankAddress,
class
Sender>
107
using
BorrowedMIDIAbsoluteEncoder
=
108
GenericMIDIAbsoluteEncoder<AHEncoder &, NumBanks, BankAddress, Sender>
;
109
110
}
// namespace Bankable
111
112
END_CS_NAMESPACE
AHEncoder.hpp
BankableAddresses.hpp
Def.hpp
setting_t
uint8_t setting_t
The type used for Selectors.
Definition
Def.hpp:53
EncoderState.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
TypeTraits.hpp
begin_if_possible
std::enable_if< has_method_begin< T >::value >::type begin_if_possible(T &t)
Calls the begin() method of t if that method exists.
Definition
TypeTraits.hpp:23
Bankable::GenericMIDIAbsoluteEncoder
An abstract class for rotary encoders that send absolute MIDI events.
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:25
Bankable::GenericMIDIAbsoluteEncoder::resetPositionOffset
int16_t resetPositionOffset()
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:85
Bankable::GenericMIDIAbsoluteEncoder::getMaxValue
static int16_t getMaxValue()
Get the maximum possible value that can be returned by getValue.
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:78
Bankable::GenericMIDIAbsoluteEncoder< AHEncoder, NumBanks, BankAddress, Sender >::address
BankAddress address
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:92
Bankable::GenericMIDIAbsoluteEncoder::getSpeedMultiply
int16_t getSpeedMultiply() const
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:83
Bankable::GenericMIDIAbsoluteEncoder::forcedUpdate
void forcedUpdate()
Send the current value over MIDI, even if the position of the encoder didn't change.
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:52
Bankable::GenericMIDIAbsoluteEncoder::getValue
uint16_t getValue() const
Get the absolute value of the encoder in the active bank.
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:66
Bankable::GenericMIDIAbsoluteEncoder::setValue
void setValue(uint16_t value, setting_t bank)
Set the absolute value of the encoder in the given bank.
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:71
Bankable::GenericMIDIAbsoluteEncoder::setSpeedMultiply
void setSpeedMultiply(int16_t speedMultiply)
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:80
Bankable::GenericMIDIAbsoluteEncoder< AHEncoder, NumBanks, BankAddress, Sender >::sender
Sender sender
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:99
Bankable::GenericMIDIAbsoluteEncoder::update
void update() override
Update this updatable.
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:35
Bankable::GenericMIDIAbsoluteEncoder::setValue
void setValue(uint16_t value)
Set the absolute value of the encoder in the active bank.
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:75
Bankable::GenericMIDIAbsoluteEncoder::forcedUpdate
void forcedUpdate(setting_t bank)
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:55
Bankable::GenericMIDIAbsoluteEncoder::begin
void begin() override
Initialize this updatable.
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:33
Bankable::GenericMIDIAbsoluteEncoder< AHEncoder, NumBanks, BankAddress, Sender >::values
Array< int16_t, NumBanks > values
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:93
Bankable::GenericMIDIAbsoluteEncoder< AHEncoder, NumBanks, BankAddress, Sender >::maxValue
static constexpr int16_t maxValue
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:96
Bankable::GenericMIDIAbsoluteEncoder::GenericMIDIAbsoluteEncoder
GenericMIDIAbsoluteEncoder(const BankAddress &address, Enc &&encoder, int16_t speedMultiply, uint8_t pulsesPerStep, const Sender &sender)
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:27
Bankable::GenericMIDIAbsoluteEncoder::getValue
uint16_t getValue(setting_t bank) const
Get the absolute value of the encoder in the given bank.
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:62
Bankable::GenericMIDIAbsoluteEncoder< AHEncoder, NumBanks, BankAddress, Sender >::encoder
AHEncoder encoder
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:91
Bankable::GenericMIDIAbsoluteEncoder< AHEncoder, NumBanks, BankAddress, Sender >::encstate
EncoderState< decltype(encoder.read())> encstate
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:94
EncoderState
Class to keep track of relative position changes of rotary encoders.
Definition
EncoderState.hpp:11
Bankable
A namespace for MIDI elements that can be added to a Bank, to change their address or channel.
Definition
BankAddresses.hpp:7
Bankable::BorrowedMIDIAbsoluteEncoder
GenericMIDIAbsoluteEncoder< AHEncoder &, NumBanks, BankAddress, Sender > BorrowedMIDIAbsoluteEncoder
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:107
Bankable::MIDIAbsoluteEncoder
GenericMIDIAbsoluteEncoder< AHEncoder, NumBanks, BankAddress, Sender > MIDIAbsoluteEncoder
Definition
Bankable/Abstract/MIDIAbsoluteEncoder.hpp:103
AH::Array
An array wrapper for easy copying, comparing, and iterating.
Definition
Array.hpp:32
Generated by
1.17.0