#pragma once #include #include #include BEGIN_CS_NAMESPACE template class MIDIButtons : public MIDIOutputElement { protected: MIDIButtons(const Array &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 buttons; MIDIAddress baseAddress; RelativeMIDIAddress incrementAddress; public: Sender sender; }; END_CS_NAMESPACE