#pragma once #include #include #include BEGIN_CS_NAMESPACE template class MIDIButtonMatrix : public MIDIOutputElement, public AH::ButtonMatrix, NumRows, NumCols> { using ButtonMatrix = AH::ButtonMatrix; friend class AH::ButtonMatrix; protected: MIDIButtonMatrix(const PinList &rowPins, const PinList &colPins, const AddressMatrix &addresses, MIDIChannelCable channelCN, const Sender &sender) : ButtonMatrix(rowPins, colPins), addresses(addresses), baseChannelCN(channelCN), sender(sender) {} public: void begin() final override { ButtonMatrix::begin(); } void update() final override { ButtonMatrix::update(); } MIDIAddress getAddress(uint8_t row, uint8_t col) const { return {this->addresses[row][col], baseChannelCN}; } void setAddressUnsafe(uint8_t row, uint8_t col, uint8_t address) { this->addresses[row][col] = address; } MIDIChannelCable getChannelCable() const { return this->baseChannelCN; } void setChannelCableUnsafe(MIDIChannelCable bccn) { this->baseChannelCN = bccn; } private: void onButtonChanged(uint8_t row, uint8_t col, bool state) { int8_t address = addresses[row][col]; if (state == LOW) sender.sendOn({address, baseChannelCN}); else sender.sendOff({address, baseChannelCN}); } AddressMatrix addresses; MIDIChannelCable baseChannelCN; public: Sender sender; }; END_CS_NAMESPACE