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