Line data Source code
1 : #pragma once
2 :
3 : #include <AH/Hardware/IncrementDecrementButtons.hpp>
4 : #include <Def/Def.hpp>
5 : #include <MIDI_Outputs/Abstract/MIDIOutputElement.hpp>
6 :
7 : #include <MIDI_Senders/DigitalNoteSender.hpp>
8 :
9 : BEGIN_CS_NAMESPACE
10 :
11 : /**
12 : * @brief An abstract class for two buttons that send incremental MIDI events.
13 : */
14 : template <class RelativeSender, class ResetSender>
15 : class MIDIIncrementDecrementButtons : public MIDIOutputElement {
16 : protected:
17 : /**
18 : * @brief Construct a new MIDIIncrementDecrementButtons.
19 : *
20 : * @todo Documentation
21 : */
22 1 : MIDIIncrementDecrementButtons(const AH::IncrementDecrementButtons &buttons,
23 : MIDIAddress address, uint8_t multiplier,
24 : MIDIAddress resetAddress,
25 : const RelativeSender &relativeSender,
26 : const ResetSender &resetSender)
27 1 : : buttons(buttons), address(address), multiplier(multiplier),
28 1 : resetAddress(resetAddress), relativeSender(relativeSender),
29 2 : resetSender(resetSender) {}
30 :
31 : public:
32 0 : void begin() override { buttons.begin(); }
33 :
34 0 : void update() override {
35 : using IncrDecrButtons = AH::IncrementDecrementButtons;
36 0 : switch (buttons.update()) {
37 0 : case IncrDecrButtons::Nothing: break;
38 0 : case IncrDecrButtons::IncrementShort: // fallthrough
39 : case IncrDecrButtons::IncrementLong: // fallthrough
40 : case IncrDecrButtons::IncrementHold:
41 0 : send(multiplier, address);
42 0 : break;
43 0 : case IncrDecrButtons::DecrementShort: // fallthrough
44 : case IncrDecrButtons::DecrementLong: // fallthrough
45 : case IncrDecrButtons::DecrementHold:
46 0 : send(-multiplier, address);
47 0 : break;
48 0 : case IncrDecrButtons::Reset: reset(); break;
49 0 : default: break;
50 : }
51 0 : }
52 :
53 0 : void send(long delta, MIDIAddress address) {
54 0 : relativeSender.send(delta, address);
55 0 : }
56 :
57 0 : void reset() {
58 0 : if (resetAddress) {
59 0 : resetSender.sendOn(resetAddress);
60 0 : resetSender.sendOff(resetAddress);
61 : }
62 0 : }
63 :
64 : /// @see @ref AH::Button::invert()
65 : void invert() { buttons.invert(); }
66 :
67 : AH::IncrementDecrementButtons::State getButtonsState() const {
68 : return buttons.getState();
69 : }
70 :
71 : /// Get the MIDI address.
72 : MIDIAddress getAddress() const { return this->address; }
73 : /// Set the MIDI address.
74 : void setAddress(MIDIAddress address) { this->address = address; }
75 :
76 : /// Get the MIDI address of the reset action.
77 : MIDIAddress getResetAddress() const { return this->resetAddress; }
78 : /// Set the MIDI address of the reset action.
79 : void setResetAddress(MIDIAddress address) { this->resetAddress = address; }
80 :
81 : private:
82 : AH::IncrementDecrementButtons buttons;
83 : MIDIAddress address;
84 : uint8_t multiplier;
85 : MIDIAddress resetAddress;
86 :
87 : public:
88 : RelativeSender relativeSender;
89 : ResetSender resetSender;
90 : };
91 :
92 : END_CS_NAMESPACE
|