Line data Source code
1 : #pragma once 2 : 3 : #include <AH/Math/IncreaseBitDepth.hpp> 4 : #include <Control_Surface/Control_Surface_Class.hpp> 5 : 6 : BEGIN_CS_NAMESPACE 7 : 8 : /** 9 : * @brief Class that sends continuous MIDI pitch bend messages with a 10 : * resolution of 14 bits. 11 : * 12 : * @tparam INPUT_PRECISION_BITS 13 : * The resolution of the input values. For example, if 14 : * @p INPUT_PRECISION_BITS == 10, the send function expects a @p value 15 : * between 0 and 1023. 16 : * 17 : * @ingroup MIDI_Senders 18 : */ 19 : template <uint8_t INPUT_PRECISION_BITS> 20 : class PitchBendSender { 21 : public: 22 : /// Send a MIDI pitch bend message with the given value and channel+cable. 23 : /// address.getAddress() is ignored. 24 : /// Value should be @p INPUT_PRECISION_BITS wide. 25 9 : static void send(uint16_t value, MIDIAddress address) { 26 9 : value = AH::increaseBitDepth<14, precision(), uint16_t>(value); 27 : // ignore address byte, just use channel and cable numbers 28 9 : MIDIChannelCable channelCN = address.getChannelCable(); 29 9 : Control_Surface.sendPitchBend(channelCN, value); 30 9 : } 31 : 32 : /// Get this sender's precision. 33 : constexpr static uint8_t precision() { 34 : static_assert(INPUT_PRECISION_BITS <= 14, 35 : "Maximum pitch bend resolution is 14 bits"); 36 : return INPUT_PRECISION_BITS; 37 : } 38 : }; 39 : 40 : END_CS_NAMESPACE