#pragma once #include #include #include #include #include BEGIN_CS_NAMESPACE template class MIDIChordButton : public MIDIOutputElement { public: template MIDIChordButton(pin_t pin, MIDIAddress address, Chord chord, const Sender &sender) : button(pin), address(address), newChord(AH::make_unique>(std::move(chord))), sender(sender) {} void begin() final override { button.begin(); } void update() final override { AH::Button::State state = button.update(); MIDIAddress sendAddress = address; if (state == AH::Button::Falling) { if (newChord) chord = std::move(newChord); sender.sendOn(sendAddress); for (int8_t offset : *chord) sender.sendOn(sendAddress + offset); } else if (state == AH::Button::Rising) { sender.sendOff(sendAddress); for (int8_t offset : *chord) sender.sendOff(sendAddress + offset); } } void invert() { button.invert(); } AH::Button::State getButtonState() const { return button.getState(); } template void setChord(Chord chord) { newChord = AH::make_unique>(std::move(chord)); } MIDIAddress getAddress() const { return this->address; } void setAddressUnsafe(MIDIAddress address) { this->address = address; } private: AH::Button button; MIDIAddress address; std::unique_ptr chord; std::unique_ptr newChord; public: Sender sender; }; END_CS_NAMESPACE