#pragma once #include #include #include BEGIN_CS_NAMESPACE template class GenericProgramChangeSelector : public GenericSelector, public MatchingMIDIInputElement { public: using Matcher = OneByteMIDIMatcher; using Parent = MatchingMIDIInputElement; GenericProgramChangeSelector(Selectable &selectable, const Callback &callback, MIDIChannelCable address) : GenericSelector {selectable, callback}, Parent(address) { } void begin() override { GenericSelector::begin(); } void reset() override { GenericSelector::reset(); } void handleUpdate(typename Matcher::Result match) override { uint8_t program = match.value; if (program < N) { this->set(program); } else { DEBUGFN(F("Warning: Received Program Change to program 0x") << hex << program << dec << F(", which is not smaller than the number of settings (") << N << ')'); } } }; /** * @brief Selector that listens for MIDI Program Change events on a given * MIDI Channel, and uses the program number as its selection. * * @tparam N * The number of settings. The maximum program number is @f$ N - 1 @f$. * @ingroup Selectors */ template class ProgramChangeSelector : public GenericProgramChangeSelector { public: ProgramChangeSelector(Selectable &selectable, MIDIChannelCable address) : GenericProgramChangeSelector {selectable, {}, address} {} }; END_CS_NAMESPACE