66 lines
1.8 KiB
C++
66 lines
1.8 KiB
C++
#pragma once
|
|
|
|
#include <AH/Hardware/Button.hpp>
|
|
#include <Def/Def.hpp>
|
|
#include <MIDI_Outputs/Abstract/MIDIOutputElement.hpp>
|
|
|
|
BEGIN_CS_NAMESPACE
|
|
|
|
template <class Sender, uint8_t NumButtons>
|
|
class MIDIButtons : public MIDIOutputElement {
|
|
protected:
|
|
MIDIButtons(const Array<AH::Button, NumButtons> &buttons,
|
|
MIDIAddress baseAddress, RelativeMIDIAddress incrementAddress,
|
|
const Sender &sender)
|
|
: buttons(buttons), baseAddress(baseAddress),
|
|
incrementAddress(incrementAddress), sender(sender) {}
|
|
|
|
public:
|
|
void begin() final override {
|
|
for (auto &button : buttons)
|
|
button.begin();
|
|
}
|
|
void update() final override {
|
|
MIDIAddress address = baseAddress;
|
|
for (auto &button : buttons) {
|
|
AH::Button::State state = button.update();
|
|
if (state == AH::Button::Falling) {
|
|
sender.sendOn(address);
|
|
} else if (state == AH::Button::Rising) {
|
|
sender.sendOff(address);
|
|
}
|
|
address += incrementAddress;
|
|
}
|
|
}
|
|
|
|
AH::Button::State getButtonState(size_t index) const {
|
|
return buttons[index].getState();
|
|
}
|
|
|
|
MIDIAddress getBaseAddress() const { return this->baseAddress; }
|
|
void setBaseAddressUnsafe(MIDIAddress address) {
|
|
this->baseAddress = address;
|
|
}
|
|
RelativeMIDIAddress getIncrementAddress() const {
|
|
return this->incrementAddress;
|
|
}
|
|
void setIncrementAddressUnsafe(RelativeMIDIAddress address) {
|
|
this->incrementAddress = address;
|
|
}
|
|
|
|
void invert() {
|
|
for (auto &button : buttons)
|
|
button.invert();
|
|
}
|
|
|
|
private:
|
|
Array<AH::Button, NumButtons> buttons;
|
|
MIDIAddress baseAddress;
|
|
RelativeMIDIAddress incrementAddress;
|
|
|
|
public:
|
|
Sender sender;
|
|
};
|
|
|
|
END_CS_NAMESPACE
|