78 lines
2.5 KiB
C++
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
|