#pragma once #include "InterfaceMIDIInputElements.hpp" #include "MIDIInputElementMatchers.hpp" BEGIN_CS_NAMESPACE class PBValue : public MatchingMIDIInputElement, public Interfaces::IValue14 { public: using Matcher = PitchBendMIDIMatcher; PBValue(MIDIChannelCable address) : MatchingMIDIInputElement(address) {} protected: void handleUpdate(typename Matcher::Result match) override { dirty |= value != match.value; value = match.value; } public: uint16_t getValue() const override { return value; } void reset() override { value = 0; dirty = true; } private: uint16_t value = 0; }; namespace Bankable { template class PBValue : public BankableMatchingMIDIInputElement< MIDIMessageType::PitchBend, BankablePitchBendMIDIMatcher>, public Interfaces::IValue14 { public: constexpr static auto MessageType = MIDIMessageType::PitchBend; using Matcher = BankablePitchBendMIDIMatcher; using Parent = BankableMatchingMIDIInputElement; PBValue(BankConfig config, MIDIChannelCable address) : Parent({config, address}) {} protected: void handleUpdate(typename Matcher::Result match) override { dirty |= values[match.bankIndex] != match.value && match.bankIndex == this->getActiveBank(); values[match.bankIndex] = match.value; } public: uint16_t getValue() const override { return values[this->getActiveBank()]; } uint16_t getValue(uint8_t bank) const { return values[bank]; } void reset() override { values = {{}}; dirty = true; } protected: void onBankSettingChange() override { dirty = true; } private: AH::Array values = {{}}; }; } // namespace Bankable END_CS_NAMESPACE