#pragma once #include "MIDIInputElementMatchers.hpp" BEGIN_CS_NAMESPACE template class NoteCCKPRange : public MatchingMIDIInputElement { public: using Matcher = TwoByteRangeMIDIMatcher; NoteCCKPRange(MIDIAddress address) : MatchingMIDIInputElement({address, RangeLen}) {} private: bool handleUpdateImpl(typename Matcher::Result match) { bool newdirty = values[match.index] != match.value; values[match.index] = match.value; return newdirty; } void handleUpdate(typename Matcher::Result match) override { dirty |= handleUpdateImpl(match); } public: uint8_t getValue(uint8_t index) const { return values[index]; } void reset() override { values = {{}}; dirty = true; } bool getDirty() const { return dirty; } void clearDirty() { dirty = false; } private: AH::Array values = {{}}; bool dirty = true; }; template using NoteRange = NoteCCKPRange; template using CCRange = NoteCCKPRange; template using KPRange = NoteCCKPRange; namespace Bankable { template class NoteCCKPRange : public BankableMatchingMIDIInputElement< Type, BankableTwoByteRangeMIDIMatcher> { public: using Matcher = BankableTwoByteRangeMIDIMatcher; NoteCCKPRange(BankConfig config, MIDIAddress address) : BankableMatchingMIDIInputElement( {config, address, RangeLen}) {} protected: bool handleUpdateImpl(typename Matcher::Result match) { bool newdirty = values[match.bankIndex][match.index] != match.value && match.bankIndex == this->getActiveBank(); values[match.bankIndex][match.index] = match.value; return newdirty; } void handleUpdate(typename Matcher::Result match) override { dirty |= handleUpdateImpl(match); } public: uint8_t getValue(uint8_t index) const { return values[this->getActiveBank()][index]; } uint8_t getValue(uint8_t bank, uint8_t index) const { return values[bank][index]; } void reset() override { values = {{{}}}; dirty = true; } bool getDirty() const { return dirty; } void clearDirty() { dirty = false; } protected: void onBankSettingChange() override { dirty = true; } private: AH::Array2D values = {{{}}}; protected: bool dirty = true; }; template using NoteRange = NoteCCKPRange; template using CCRange = NoteCCKPRange; template using KPRange = NoteCCKPRange; } // namespace Bankable END_CS_NAMESPACE