Line data Source code
1 : #include <AH/Hardware/ExtendedInputOutput/ExtendedInputOutput.hpp> 2 : #include <AH/Hardware/LEDs/DotBarDisplayLEDs.hpp> 3 : #include <MIDI_Inputs/NoteCCKPValue.hpp> 4 : 5 : BEGIN_CS_NAMESPACE 6 : 7 : /** 8 : * @brief Callback class that drives a LED dot/bar display based on a note or 9 : * control change value. 10 : * 11 : * @tparam NumLEDs 12 : * The number of LEDs the display has. 13 : */ 14 : template <uint8_t NumLEDs> 15 : class NoteCCKPLEDBarDriver : public AH::DotBarDisplayLEDs<NumLEDs> { 16 : public: 17 1 : NoteCCKPLEDBarDriver(const AH::PinList<NumLEDs> &leds) 18 1 : : AH::DotBarDisplayLEDs<NumLEDs>(leds) {} 19 : 20 3 : void displayBar(uint8_t value) { this->display(value / 128.0f); } 21 : }; 22 : 23 : // -------------------------------------------------------------------------- // 24 : 25 : /// Class that turns on a different number of LEDs depending on the received 26 : /// MIDI velocity, key pressure or Control Change value. Similar to a digital 27 : /// LED VU meter. 28 : /// Can be configured in either bar or dot mode. 29 : template <MIDIMessageType Type, uint8_t NumLEDs> 30 : class NoteCCKPLEDBar 31 : : public MatchingMIDIInputElement<Type, TwoByteMIDIMatcher>, 32 : public NoteCCKPLEDBarDriver<NumLEDs> { 33 : public: 34 : using Matcher = TwoByteMIDIMatcher; 35 : using Parent = MatchingMIDIInputElement<Type, Matcher>; 36 : 37 : /// @param leds 38 : /// A list of LED pins. 39 : /// @param address 40 : /// The MIDI address to listen to. 41 1 : NoteCCKPLEDBar(const AH::PinList<NumLEDs> &leds, MIDIAddress address) 42 1 : : Parent(address), NoteCCKPLEDBarDriver<NumLEDs>(leds) {} 43 : 44 : protected: 45 2 : void handleUpdate(typename Matcher::Result match) override { 46 2 : this->displayBar(match.value); 47 2 : } 48 : 49 : public: 50 1 : void begin() override { 51 1 : NoteCCKPLEDBarDriver<NumLEDs>::begin(); 52 1 : this->displayBar(0); 53 1 : } 54 : 55 0 : void reset() override { this->displayBar(0); } 56 : }; 57 : 58 : // -------------------------------------------------------------------------- // 59 : 60 : /// Class that listens for **Note** events and displays the velocity on an 61 : /// **LED Bar Graph**, turning on a different number of LEDs depending on the 62 : /// velocity. Similar to a digital LED VU meter. 63 : /// Can be configured in either bar or dot mode. 64 : /// @tparam NumLEDs 65 : /// The number of LEDs the display has. 66 : /// @ingroup midi-input-elements-leds 67 : template <uint8_t NumLEDs> 68 : using NoteLEDBar = NoteCCKPLEDBar<MIDIMessageType::NoteOn, NumLEDs>; 69 : 70 : /// Class that listens for **Control Change** events and displays the 71 : /// value on an **LED Bar Graph**, turning on a different number of LEDs 72 : /// depending on the value. Similar to a digital LED VU meter. 73 : /// Can be configured in either bar or dot mode. 74 : /// @tparam NumLEDs 75 : /// The number of LEDs the display has. 76 : /// @ingroup midi-input-elements-leds 77 : template <uint8_t NumLEDs> 78 : using CCLEDBar = NoteCCKPLEDBar<MIDIMessageType::ControlChange, NumLEDs>; 79 : 80 : /// Class that listens for **Key Pressure** events and displays the pressure on 81 : /// an **LED Bar Graph**, turning on a different number of LEDs 82 : /// depending on the value. Similar to a digital LED VU meter. 83 : /// Can be configured in either bar or dot mode. 84 : /// @tparam NumLEDs 85 : /// The number of LEDs the display has. 86 : /// @ingroup midi-input-elements-leds 87 : template <uint8_t NumLEDs> 88 : using KPLEDBar = NoteCCKPLEDBar<MIDIMessageType::KeyPressure, NumLEDs>; 89 : 90 : // :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // 91 : 92 : namespace Bankable { 93 : 94 : /// Class that turns on a different number of LEDs depending on the received 95 : /// MIDI velocity, key pressure or Control Change value. Similar to a digital 96 : /// LED VU meter. 97 : /// Can be configured in either bar or dot mode. 98 : /// This version can be banked. 99 : template <MIDIMessageType Type, uint8_t BankSize, uint8_t NumLEDs> 100 : class NoteCCKPLEDBar : public NoteCCKPValue<Type, BankSize>, 101 : public NoteCCKPLEDBarDriver<NumLEDs> { 102 : public: 103 : using Parent = NoteCCKPValue<Type, BankSize>; 104 : using Matcher = typename Parent::Matcher; 105 : 106 : /// @param config 107 : /// The bank configuration to use. 108 : /// @param leds 109 : /// A list of LED pins. 110 : /// @param address 111 : /// The MIDI address to listen to. 112 : NoteCCKPLEDBar(BankConfig<BankSize> config, 113 : const AH::PinList<NumLEDs> &leds, MIDIAddress address) 114 : : Parent(config, address), NoteCCKPLEDBarDriver<NumLEDs>(leds) {} 115 : 116 : protected: 117 : void handleUpdate(typename Matcher::Result match) override { 118 : bool newdirty = Parent::handleUpdateImpl(match); 119 : if (newdirty) 120 : updateDisplay(); 121 : this->dirty |= newdirty; 122 : } 123 : 124 : void updateDisplay() { this->displayBar(this->getValue()); } 125 : 126 : public: 127 : void begin() override { 128 : Parent::begin(); 129 : NoteCCKPLEDBarDriver<NumLEDs>::begin(); 130 : this->displayBar(0); 131 : } 132 : 133 : void reset() override { 134 : Parent::reset(); 135 : this->displayBar(0); 136 : } 137 : 138 : protected: 139 : void onBankSettingChange() override { 140 : Parent::onBankSettingChange(); 141 : updateDisplay(); 142 : } 143 : }; 144 : 145 : // :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // 146 : 147 : /// Class that listens for **Note** events and displays the velocity on an 148 : /// **LED Bar Graph**, turning on a different number of LEDs 149 : /// depending on the velocity. Similar to a digital LED VU meter. 150 : /// Can be configured in either bar or dot mode. 151 : /// This version can be banked. 152 : /// @tparam BankSize 153 : /// The number of banks. 154 : /// @tparam NumLEDs 155 : /// The number of LEDs the display has. 156 : /// @ingroup BankableMIDIInputElementsLEDs 157 : template <uint8_t BankSize, uint8_t NumLEDs> 158 : using NoteLEDBar = NoteCCKPLEDBar<MIDIMessageType::NoteOn, BankSize, NumLEDs>; 159 : 160 : /// Class that listens for **Control Change** events and displays the 161 : /// value on an **LED Bar Graph**, turning on a different number of LEDs 162 : /// depending on the value. Similar to a digital LED VU meter. 163 : /// Can be configured in either bar or dot mode. 164 : /// This version can be banked. 165 : /// @tparam BankSize 166 : /// The number of banks. 167 : /// @tparam NumLEDs 168 : /// The number of LEDs the display has. 169 : /// @ingroup BankableMIDIInputElementsLEDs 170 : template <uint8_t BankSize, uint8_t NumLEDs> 171 : using CCLEDBar = 172 : NoteCCKPLEDBar<MIDIMessageType::ControlChange, BankSize, NumLEDs>; 173 : 174 : /// Class that listens for **Key Pressure** events and displays the pressure on 175 : /// an **LED Bar Graph**, turning on a different number of LEDs 176 : /// depending on the value. Similar to a digital LED VU meter. 177 : /// Can be configured in either bar or dot mode. 178 : /// This version can be banked. 179 : /// @tparam BankSize 180 : /// The number of banks. 181 : /// @tparam NumLEDs 182 : /// The number of LEDs the display has. 183 : /// @ingroup BankableMIDIInputElementsLEDs 184 : template <uint8_t BankSize, uint8_t NumLEDs> 185 : using KPLEDBar = 186 : NoteCCKPLEDBar<MIDIMessageType::KeyPressure, BankSize, NumLEDs>; 187 : 188 : } // namespace Bankable 189 : 190 : END_CS_NAMESPACE