MIDI2LR 6.1.0.0
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
222 {
223#pragma warning(suppress : 26446 26482) /* Channel bounds-checked in calling functions */
224 // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-constant-array-index)
225 intermediate_results_[channel] = {0, 0, 0, 0, 0};
226 }
std::array< InternalStructure, kChannels > intermediate_results_
Definition MidiUtilities.h:237

◆ operator()()

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

Member Data Documentation

◆ intermediate_results_

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

◆ kChannels

constexpr int NrpnFilter::kChannels {16}
staticconstexprprivate
236{16};

The documentation for this class was generated from the following files: