MIDI2LR 6.3.0.1
MIDI2LR is an application that interfaces MIDI controllers with Lightroom 6+/CC Classic. It processes MIDI input into develop parameter updates and photo actions, and sends MIDI output when parameters are changed for motorized feedback (on controllers that have motorized faders). A listing of available LightRoom commands is in the Wiki. Assistance on the code and design is welcome.
Loading...
Searching...
No Matches
NrpnFilter Class Reference

#include <MidiUtilities.h>

Classes

struct  InternalStructure
struct  ProcessResult

Public Member Functions

ProcessResult operator() (rsj::MidiMessage message)

Private Member Functions

void Clear (int channel) noexcept

Private Attributes

std::array< InternalStructure, kChannelsintermediate_results_ {}

Static Private Attributes

static constexpr int kChannels {16}

Member Function Documentation

◆ Clear()

void NrpnFilter::Clear ( int channel)
inlineprivatenoexcept
220 {
221#pragma warning(suppress : 26446 26482) /* Channel bounds-checked in calling functions */
222 // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-constant-array-index)
223 intermediate_results_[channel] = {.control_lsb_ = 0,
224 .control_msb_ = 0,
225 .ready_flags_ = 0,
226 .value_lsb_ = 0,
227 .value_msb_ = 0};
228 }
std::array< InternalStructure, kChannels > intermediate_results_
Definition MidiUtilities.h:239

Referenced by operator()().

◆ operator()()

NrpnFilter::ProcessResult NrpnFilter::operator() ( rsj::MidiMessage message)
73{
74 try {
75 Expects(message.value <= 0x7F && message.value >= 0);
76 Expects(message.control_number <= 0x7F && message.control_number >= 0);
77 ProcessResult ret_val {.is_nrpn = false, .is_ready = false, .control = 0, .value = 0};
78 switch (message.control_number) {
79 case 6:
80 {
81 auto& i_ref {intermediate_results_.at(message.channel)};
82 if (i_ref.ready_flags_ >= 0b11) {
83 ret_val.is_nrpn = true;
84 i_ref.value_msb_ = message.value & 0x7F;
85 i_ref.ready_flags_ |= 0b100; //-V112
86 if (i_ref.ready_flags_ == 0b1111) {
87 ret_val.is_ready = true;
88 ret_val.control = (i_ref.control_msb_ << 7) + i_ref.control_lsb_;
89 ret_val.value = (i_ref.value_msb_ << 7) + i_ref.value_lsb_;
90 Clear(message.channel);
91 }
92 }
93 }
94 return ret_val;
95 case 38:
96 {
97 auto& i_ref {intermediate_results_.at(message.channel)};
98 if (i_ref.ready_flags_ >= 0b11) {
99 ret_val.is_nrpn = true;
100 i_ref.value_lsb_ = message.value & 0x7F;
101 i_ref.ready_flags_ |= 0b1000;
102 if (i_ref.ready_flags_ == 0b1111) {
103 ret_val.is_ready = true;
104 ret_val.control = (i_ref.control_msb_ << 7) + i_ref.control_lsb_;
105 ret_val.value = (i_ref.value_msb_ << 7) + i_ref.value_lsb_;
106 Clear(message.channel);
107 }
108 }
109 }
110 return ret_val;
111 case 98:
112 ret_val.is_nrpn = true;
113 {
114 auto& i_ref {intermediate_results_.at(message.channel)};
115 i_ref.control_lsb_ = message.value & 0x7F;
116 i_ref.ready_flags_ |= 0b10;
117 }
118 return ret_val;
119 case 99:
120 ret_val.is_nrpn = true;
121 {
122 auto& i_ref {intermediate_results_.at(message.channel)};
123 i_ref.control_msb_ = message.value & 0x7F;
124 i_ref.ready_flags_ |= 0b1;
125 }
126 return ret_val;
127 default:
128 /* not an expected nrpn control #, handle as typical midi message */
129 return ret_val;
130 }
131 }
132 catch (const std::exception& e) {
133 rsj::ExceptionResponse(e, std::source_location::current());
134 throw;
135 }
136}
void Clear(int channel) noexcept
Definition MidiUtilities.h:219
void ExceptionResponse(gsl::czstring id, gsl::czstring fu, const std::exception &e) noexcept
Definition MidiUtilities.h:209
int control_number
Definition MidiUtilities.h:123
int channel
Definition MidiUtilities.h:122
int value
Definition MidiUtilities.h:124

References rsj::MidiMessage::channel, Clear(), NrpnFilter::ProcessResult::control, NrpnFilter::InternalStructure::control_lsb_, NrpnFilter::InternalStructure::control_msb_, rsj::MidiMessage::control_number, intermediate_results_, NrpnFilter::ProcessResult::is_nrpn, NrpnFilter::ProcessResult::is_ready, NrpnFilter::InternalStructure::ready_flags_, NrpnFilter::ProcessResult::value, rsj::MidiMessage::value, NrpnFilter::InternalStructure::value_lsb_, and NrpnFilter::InternalStructure::value_msb_.

Member Data Documentation

◆ intermediate_results_

std::array<InternalStructure, kChannels> NrpnFilter::intermediate_results_ {}
private
239{};

Referenced by operator()().

◆ kChannels

int NrpnFilter::kChannels {16}
staticconstexprprivate
238{16};

The documentation for this class was generated from the following files:
  • C:/Users/rsjaf/source/repos/MIDI2LR/src/application/MidiUtilities.h
  • C:/Users/rsjaf/source/repos/MIDI2LR/src/application/MidiUtilities.cpp