|
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2015 - ROLI Ltd.
-
- Permission is granted to use this software under the terms of either:
- a) the GPL v2 (or any later version)
- b) the Affero GPL v3
-
- Details of these licenses can be found at: www.gnu.org/licenses
-
- JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
- ------------------------------------------------------------------------------
-
- To release a closed-source product which uses JUCE, commercial licenses are
- available: visit www.juce.com for more information.
-
- ==============================================================================
- */
-
- #ifndef JUCE_MIDIRPNDETECTOR_H_INCLUDED
- #define JUCE_MIDIRPNDETECTOR_H_INCLUDED
-
-
- //==============================================================================
- /** Represents a MIDI RPN (registered parameter number) or NRPN (non-registered
- parameter number) message.
- */
- struct MidiRPNMessage
- {
- /** Midi channel of the message, in the range 1 to 16. */
- int channel;
-
- /** The 14-bit parameter index, in the range 0 to 16383 (0x3fff). */
- int parameterNumber;
-
- /** The parameter value, in the range 0 to 16383 (0x3fff).
- If the message contains no value LSB, the value will be in the range
- 0 to 127 (0x7f).
- */
- int value;
-
- /** True if this message is an NRPN; false if it is an RPN. */
- bool isNRPN;
-
- /** True if the value uses 14-bit resolution (LSB + MSB); false if
- the value is 7-bit (MSB only).
- */
- bool is14BitValue;
- };
-
- //==============================================================================
- /**
- Parses a stream of MIDI data to assemble RPN and NRPN messages from their
- constituent MIDI CC messages.
-
- The detector uses the following parsing rules: the parameter number
- LSB/MSB can be sent/received in either order and must both come before the
- parameter value; for the parameter value, LSB always has to be sent/received
- before the value MSB, otherwise it will be treated as 7-bit (MSB only).
- */
- class JUCE_API MidiRPNDetector
- {
- public:
- /** Constructor. */
- MidiRPNDetector() noexcept;
-
- /** Destructor. */
- ~MidiRPNDetector() noexcept;
-
- /** Resets the RPN detector's internal state, so that it forgets about
- previously received MIDI CC messages.
- */
- void reset() noexcept;
-
- //==============================================================================
- /** Takes the next in a stream of incoming MIDI CC messages and returns true
- if it forms the last of a sequence that makes an RPN or NPRN.
-
- If this returns true, then the RPNMessage object supplied will be
- filled-out with the message's details.
- (If it returns false then the RPNMessage object will be unchanged).
- */
- bool parseControllerMessage (int midiChannel,
- int controllerNumber,
- int controllerValue,
- MidiRPNMessage& result) noexcept;
-
- private:
- //==============================================================================
- struct ChannelState
- {
- ChannelState() noexcept;
- bool handleController (int channel, int controllerNumber,
- int value, MidiRPNMessage&) noexcept;
- void resetValue() noexcept;
- bool sendIfReady (int channel, MidiRPNMessage&) noexcept;
-
- uint8 parameterMSB, parameterLSB, valueMSB, valueLSB;
- bool isNRPN;
- };
-
- //==============================================================================
- ChannelState states[16];
-
- JUCE_LEAK_DETECTOR (MidiRPNDetector)
- };
-
- //==============================================================================
- /**
- Generates an appropriate sequence of MIDI CC messages to represent an RPN
- or NRPN message.
-
- This sequence (as a MidiBuffer) can then be directly sent to a MidiOutput.
- */
- class JUCE_API MidiRPNGenerator
- {
- public:
- //==============================================================================
- /** Generates a MIDI sequence representing the given RPN or NRPN message. */
- static MidiBuffer generate (MidiRPNMessage message);
-
- //==============================================================================
- /** Generates a MIDI sequence representing an RPN or NRPN message with the
- given parameters.
-
- @param channel The MIDI channel of the RPN/NRPN message.
-
- @param parameterNumber The parameter number, in the range 0 to 16383.
-
- @param value The parameter value, in the range 0 to 16383, or
- in the range 0 to 127 if sendAs14BitValue is false.
-
- @param isNRPN Whether you need a MIDI RPN or NRPN sequence (RPN is default).
-
- @param use14BitValue If true (default), the value will have 14-bit precision
- (two MIDI bytes). If false, instead the value will have
- 7-bit presision (a single MIDI byte).
- */
- static MidiBuffer generate (int channel,
- int parameterNumber,
- int value,
- bool isNRPN = false,
- bool use14BitValue = true);
- };
-
-
- #endif // JUCE_MIDIRPNDETECTOR_H_INCLUDED
|