cs-midi/MIDI_Outputs/Abstract/MIDIIncrementDecrementButto...

78 lines
2.5 KiB
C++

#pragma once
#include <AH/Hardware/IncrementDecrementButtons.hpp>
#include <Def/Def.hpp>
#include <MIDI_Outputs/Abstract/MIDIOutputElement.hpp>
#include <MIDI_Senders/DigitalNoteSender.hpp>
BEGIN_CS_NAMESPACE
template <class RelativeSender, class ResetSender>
class MIDIIncrementDecrementButtons : public MIDIOutputElement {
protected:
MIDIIncrementDecrementButtons(const AH::IncrementDecrementButtons &buttons,
MIDIAddress address, uint8_t multiplier,
MIDIAddress resetAddress,
const RelativeSender &relativeSender,
const ResetSender &resetSender)
: buttons(buttons), address(address), multiplier(multiplier),
resetAddress(resetAddress), relativeSender(relativeSender),
resetSender(resetSender) {}
public:
void begin() override { buttons.begin(); }
void update() override {
using IncrDecrButtons = AH::IncrementDecrementButtons;
switch (buttons.update()) {
case IncrDecrButtons::Nothing: break;
case IncrDecrButtons::IncrementShort:
case IncrDecrButtons::IncrementLong:
case IncrDecrButtons::IncrementHold:
send(multiplier, address);
break;
case IncrDecrButtons::DecrementShort:
case IncrDecrButtons::DecrementLong:
case IncrDecrButtons::DecrementHold:
send(-multiplier, address);
break;
case IncrDecrButtons::Reset: reset(); break;
default: break;
}
}
void send(long delta, MIDIAddress address) {
relativeSender.send(delta, address);
}
void reset() {
if (resetAddress) {
resetSender.sendOn(resetAddress);
resetSender.sendOff(resetAddress);
}
}
void invert() { buttons.invert(); }
AH::IncrementDecrementButtons::State getButtonsState() const {
return buttons.getState();
}
MIDIAddress getAddress() const { return this->address; }
void setAddress(MIDIAddress address) { this->address = address; }
MIDIAddress getResetAddress() const { return this->resetAddress; }
void setResetAddress(MIDIAddress address) { this->resetAddress = address; }
private:
AH::IncrementDecrementButtons buttons;
MIDIAddress address;
uint8_t multiplier;
MIDIAddress resetAddress;
public:
RelativeSender relativeSender;
ResetSender resetSender;
};
END_CS_NAMESPACE