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 1 : 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 : const MIDIAddress &address, 24 : uint8_t multiplier, 25 : const MIDIAddress &resetAddress, 26 : const RelativeSender &relativeSender, 27 : const ResetSender &resetSender) 28 1 : : buttons(buttons), address(address), multiplier(multiplier), 29 1 : resetAddress(resetAddress), relativeSender(relativeSender), 30 3 : resetSender(resetSender) {} 31 : 32 : public: 33 0 : void begin() override { buttons.begin(); } 34 : 35 0 : void update() override { 36 : using IncrDecrButtons = AH::IncrementDecrementButtons; 37 0 : switch (buttons.update()) { 38 0 : case IncrDecrButtons::Nothing: break; 39 : case IncrDecrButtons::IncrementShort: // fallthrough 40 : case IncrDecrButtons::IncrementLong: // fallthrough 41 : case IncrDecrButtons::IncrementHold: 42 0 : send(multiplier, address); 43 0 : break; 44 : case IncrDecrButtons::DecrementShort: // fallthrough 45 : case IncrDecrButtons::DecrementLong: // fallthrough 46 : case IncrDecrButtons::DecrementHold: 47 0 : send(-multiplier, address); 48 0 : break; 49 0 : case IncrDecrButtons::Reset: reset(); break; 50 0 : default: break; 51 : } 52 0 : } 53 : 54 0 : void send(long delta, const MIDIAddress &address) { 55 0 : relativeSender.send(delta, address); 56 0 : } 57 : 58 0 : void reset() { 59 0 : if (resetAddress) { 60 0 : resetSender.sendOn(resetAddress); 61 0 : resetSender.sendOff(resetAddress); 62 0 : } 63 0 : } 64 : 65 : #ifdef AH_INDIVIDUAL_BUTTON_INVERT 66 : void invert() { buttons.invert(); } 67 : #endif 68 : 69 : AH::IncrementDecrementButtons::State getButtonsState() const { 70 : return buttons.getState(); 71 : } 72 : 73 : private: 74 : AH::IncrementDecrementButtons buttons; 75 : const MIDIAddress address; 76 : const uint8_t multiplier; 77 : const MIDIAddress resetAddress; 78 : 79 : public: 80 : RelativeSender relativeSender; 81 : ResetSender resetSender; 82 : }; 83 : 84 : END_CS_NAMESPACE