38 std::function<void(uint8_t channel, uint16_t parameter, uint16_t value)>
on_rpn;
41 std::function<void(uint8_t channel, uint16_t parameter, uint16_t value)>
on_nrpn;
44 std::function<void(uint8_t channel, uint16_t parameter,
bool is_rpn)>
on_increment;
47 std::function<void(uint8_t channel, uint16_t parameter,
bool is_rpn)>
on_decrement;
51 auto msg =
event.message;
52 if (!msg.isController())
return;
54 uint8_t channel = msg.getChannel0to15();
55 uint8_t cc = msg.getControllerNumber();
56 uint8_t val = msg.getControllerValue();
58 auto&
state = channel_state_[channel];
62 set_parameter_byte(
state,
true,
true, val);
66 set_parameter_byte(
state,
true,
false, val);
70 set_parameter_byte(
state,
false,
true, val);
74 set_parameter_byte(
state,
false,
false, val);
78 state.value_msb = val;
82 if (
state.param_set) {
83 uint16_t param = combine(
state.param_msb,
state.param_lsb);
84 uint16_t value = combine(
state.value_msb, val);
94 if (
state.param_set) {
95 uint16_t param = combine(
state.param_msb,
state.param_lsb);
101 if (
state.param_set) {
102 uint16_t param = combine(
state.param_msb,
state.param_lsb);
114 for (
auto& s : channel_state_) s = {};
118 struct ChannelState {
119 uint8_t param_msb = 0;
120 uint8_t param_lsb = 0;
121 uint8_t value_msb = 0;
123 bool param_msb_set =
false;
124 bool param_lsb_set =
false;
125 bool param_set =
false;
128 ChannelState channel_state_[16]{};
130 static uint16_t combine(uint8_t msb, uint8_t lsb) {
131 return static_cast<uint16_t
>((msb << 7) | lsb);
134 static void update_parameter_state(ChannelState& state) {
135 state.param_set = state.param_msb_set && state.param_lsb_set
136 && !(state.param_msb == 0x7F && state.param_lsb == 0x7F);
139 static void set_parameter_byte(ChannelState& state,
143 if (state.is_rpn != is_rpn) {
146 state.param_msb_set =
false;
147 state.param_lsb_set =
false;
148 state.param_set =
false;
149 }
else if (is_msb && state.param_set) {
150 state.param_lsb_set =
false;
151 state.param_set =
false;
154 state.is_rpn = is_rpn;
156 state.param_msb =
value;
157 state.param_msb_set =
true;
159 state.param_lsb =
value;
160 state.param_lsb_set =
true;
162 update_parameter_state(state);
Parses RPN (Registered Parameter Number) and NRPN (Non-Registered Parameter Number) messages from a s...
Definition rpn_parser.hpp:32
std::function< void(uint8_t channel, uint16_t parameter, uint16_t value)> on_nrpn
Called when a complete NRPN message is received.
Definition rpn_parser.hpp:41
void process(const MidiEvent &event)
Process a MIDI event. Non-CC events are ignored.
Definition rpn_parser.hpp:50
std::function< void(uint8_t channel, uint16_t parameter, bool is_rpn)> on_decrement
Called when a decrement (CC 97) is received for the active parameter.
Definition rpn_parser.hpp:47
void reset()
Reset all channel state.
Definition rpn_parser.hpp:113
std::function< void(uint8_t channel, uint16_t parameter, uint16_t value)> on_rpn
Called when a complete RPN message is received.
Definition rpn_parser.hpp:38
std::function< void(uint8_t channel, uint16_t parameter, bool is_rpn)> on_increment
Called when an increment (CC 96) is received for the active parameter.
Definition rpn_parser.hpp:44
Definition custom_node_events.hpp:26
SequencerStateChannel is the audio-safe transport for a plugin's structured NON-parameter state: the ...
Definition audio_device_manager.hpp:48
@ value
the widget's primary value (Knob, Fader, RangeSlider, Toggle, ProgressBar)
Definition binding_diagnostics.hpp:19
Timestamped MIDI event combining a choc::midi::ShortMessage with timing info.
Definition message.hpp:32