Control Surface
main
MIDI Control Surface library for Arduino
Toggle main menu visibility
Loading...
Searching...
No Matches
src
MIDI_Outputs
Abstract
Abstract/MIDIAbsoluteEncoder.hpp
Go to the documentation of this file.
1
#pragma once
2
3
#include <AH/STL/type_traits>
// std::make_signed
4
#include <AH/STL/utility>
// std::forward
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
22
template
<
class
Enc,
class
Sender>
23
class
GenericMIDIAbsoluteEncoder
:
public
MIDIOutputElement
{
24
public
:
25
GenericMIDIAbsoluteEncoder
(Enc &&
encoder
,
MIDIAddress
address
,
26
int16_t speedMultiply, uint8_t pulsesPerStep,
27
const
Sender &
sender
)
28
:
encoder
(std::forward<Enc>(
encoder
)),
address
(
address
),
29
encstate
(speedMultiply, pulsesPerStep),
sender
(
sender
) {}
30
31
void
begin
()
override
{
begin_if_possible
(
encoder
); }
32
33
void
update
()
override
{
34
auto
encval =
encoder
.read();
35
if
(int16_t delta =
encstate
.update(encval)) {
36
int16_t oldValue =
value
;
37
int16_t newValue = oldValue + delta;
38
newValue = constrain(newValue, 0,
maxValue
);
39
if
(oldValue != newValue) {
40
value
= newValue;
41
forcedUpdate
();
42
}
43
}
44
}
45
48
void
forcedUpdate
() {
sender
.send(
value
,
address
); }
49
53
uint16_t
getValue
()
const
{
return
value
; }
54
58
void
setValue
(uint16_t
value
) { this->value =
value
; }
59
61
static
int16_t
getMaxValue
() {
return
maxValue
; }
62
63
void
setSpeedMultiply
(int16_t speedMultiply) {
64
encstate
.setSpeedMultiply(speedMultiply);
65
}
66
int16_t
getSpeedMultiply
()
const
{
return
encstate
.getSpeedMultiply(); }
67
69
MIDIAddress
getAddress
()
const
{
return
this->
address
; }
71
void
setAddress
(
MIDIAddress
address
) { this->address =
address
; }
72
73
int16_t
resetPositionOffset
() {
74
auto
encval =
encoder
.read();
75
return
encstate
.update(encval);
76
}
77
78
private
:
79
Enc
encoder
;
80
MIDIAddress
address
;
81
int16_t
value
= 0;
82
EncoderState
<
decltype
(
encoder
.read())>
encstate
;
83
84
constexpr
static
int16_t
maxValue
= uint16_t(1u << Sender::precision()) - 1;
85
86
public
:
87
Sender
sender
;
88
};
89
90
template
<
class
Sender>
91
using
MIDIAbsoluteEncoder
=
GenericMIDIAbsoluteEncoder<AHEncoder, Sender>
;
92
93
template
<
class
Sender>
94
using
BorrowedMIDIAbsoluteEncoder
=
95
GenericMIDIAbsoluteEncoder<AHEncoder &, Sender>
;
96
97
END_CS_NAMESPACE
AHEncoder.hpp
BorrowedMIDIAbsoluteEncoder
GenericMIDIAbsoluteEncoder< AHEncoder &, Sender > BorrowedMIDIAbsoluteEncoder
Definition
Abstract/MIDIAbsoluteEncoder.hpp:94
MIDIAbsoluteEncoder
GenericMIDIAbsoluteEncoder< AHEncoder, Sender > MIDIAbsoluteEncoder
Definition
Abstract/MIDIAbsoluteEncoder.hpp:91
Def.hpp
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
EncoderState
Class to keep track of relative position changes of rotary encoders.
Definition
EncoderState.hpp:11
GenericMIDIAbsoluteEncoder
An abstract class for rotary encoders that send absolute MIDI events.
Definition
Abstract/MIDIAbsoluteEncoder.hpp:23
GenericMIDIAbsoluteEncoder::resetPositionOffset
int16_t resetPositionOffset()
Definition
Abstract/MIDIAbsoluteEncoder.hpp:73
GenericMIDIAbsoluteEncoder< AHEncoder, Sender >::address
MIDIAddress address
Definition
Abstract/MIDIAbsoluteEncoder.hpp:80
GenericMIDIAbsoluteEncoder::setAddress
void setAddress(MIDIAddress address)
Set the MIDI address.
Definition
Abstract/MIDIAbsoluteEncoder.hpp:71
GenericMIDIAbsoluteEncoder::getMaxValue
static int16_t getMaxValue()
Get the maximum possible value that can be returned by getValue.
Definition
Abstract/MIDIAbsoluteEncoder.hpp:61
GenericMIDIAbsoluteEncoder::getSpeedMultiply
int16_t getSpeedMultiply() const
Definition
Abstract/MIDIAbsoluteEncoder.hpp:66
GenericMIDIAbsoluteEncoder::forcedUpdate
void forcedUpdate()
Send the current value over MIDI, even if the position of the encoder didn't change.
Definition
Abstract/MIDIAbsoluteEncoder.hpp:48
GenericMIDIAbsoluteEncoder::getValue
uint16_t getValue() const
Get the absolute value of the encoder.
Definition
Abstract/MIDIAbsoluteEncoder.hpp:53
GenericMIDIAbsoluteEncoder::setSpeedMultiply
void setSpeedMultiply(int16_t speedMultiply)
Definition
Abstract/MIDIAbsoluteEncoder.hpp:63
GenericMIDIAbsoluteEncoder< AHEncoder, Sender >::sender
Sender sender
Definition
Abstract/MIDIAbsoluteEncoder.hpp:87
GenericMIDIAbsoluteEncoder::update
void update() override
Update this updatable.
Definition
Abstract/MIDIAbsoluteEncoder.hpp:33
GenericMIDIAbsoluteEncoder::setValue
void setValue(uint16_t value)
Set the absolute value of the encoder.
Definition
Abstract/MIDIAbsoluteEncoder.hpp:58
GenericMIDIAbsoluteEncoder::GenericMIDIAbsoluteEncoder
GenericMIDIAbsoluteEncoder(Enc &&encoder, MIDIAddress address, int16_t speedMultiply, uint8_t pulsesPerStep, const Sender &sender)
Definition
Abstract/MIDIAbsoluteEncoder.hpp:25
GenericMIDIAbsoluteEncoder< AHEncoder, Sender >::value
int16_t value
Definition
Abstract/MIDIAbsoluteEncoder.hpp:81
GenericMIDIAbsoluteEncoder::begin
void begin() override
Initialize this updatable.
Definition
Abstract/MIDIAbsoluteEncoder.hpp:31
GenericMIDIAbsoluteEncoder::getAddress
MIDIAddress getAddress() const
Get the MIDI address.
Definition
Abstract/MIDIAbsoluteEncoder.hpp:69
GenericMIDIAbsoluteEncoder< AHEncoder, Sender >::maxValue
static constexpr int16_t maxValue
Definition
Abstract/MIDIAbsoluteEncoder.hpp:84
GenericMIDIAbsoluteEncoder< AHEncoder, Sender >::encoder
AHEncoder encoder
Definition
Abstract/MIDIAbsoluteEncoder.hpp:79
GenericMIDIAbsoluteEncoder< AHEncoder, Sender >::encstate
EncoderState< decltype(encoder.read())> encstate
Definition
Abstract/MIDIAbsoluteEncoder.hpp:82
MIDIAddress
A type-safe utility class for saving a MIDI address consisting of a 7-bit address,...
Definition
MIDIAddress.hpp:145
Generated by
1.17.0