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
MidiSender Class Reference

#include <MIDISender.h>

Public Member Functions

 MidiSender (const MidiSender &other)=delete
 
 MidiSender (Devices &devices) noexcept
 
 MidiSender (MidiSender &&other) noexcept=delete
 
 ~MidiSender ()
 
MidiSenderoperator= (const MidiSender &other)=delete
 
MidiSenderoperator= (MidiSender &&other) noexcept=delete
 
void RescanDevices ()
 
void Send (rsj::MidiMessageId id, int value) const
 
void Start ()
 

Private Member Functions

void InitDevices ()
 
void SendControllerEvent (rsj::MidiMessageId id, int value) const
 
void SendNoteOn (rsj::MidiMessageId id, int value) const
 
void SendNrpn (rsj::MidiMessageId id, int value) const
 
void SendPitchWheel (rsj::MidiMessageId id, int value) const
 
bool ShouldOpenDevice (const std::string &devname, const auto &open_device)
 

Private Attributes

Devicesdevices_
 
std::vector< std::unique_ptr< juce::MidiOutput > > output_devices_
 

Constructor & Destructor Documentation

◆ MidiSender() [1/3]

MidiSender::MidiSender ( Devices devices)
inlineexplicitnoexcept
37: devices_(devices) {}
Devices & devices_
Definition MIDISender.h:57

◆ ~MidiSender()

MidiSender::~MidiSender ( )
inline
39{ output_devices_.clear(); /* close devices */ }
std::vector< std::unique_ptr< juce::MidiOutput > > output_devices_
Definition MIDISender.h:59

◆ MidiSender() [2/3]

MidiSender::MidiSender ( const MidiSender other)
delete

◆ MidiSender() [3/3]

MidiSender::MidiSender ( MidiSender &&  other)
deletenoexcept

Member Function Documentation

◆ InitDevices()

void MidiSender::InitDevices ( )
private
139{
140 try {
141 const auto available_devices {juce::MidiOutput::getAvailableDevices()};
142 for (const auto& device : available_devices) {
143 if (auto open_device {juce::MidiOutput::openDevice(device.identifier)}) {
144 const auto devname {open_device->getName().toStdString()};
145 if (ShouldOpenDevice(devname, open_device)) {
146 rsj::Log(fmt::format(FMT_STRING("Opened output device {}."), devname));
147 output_devices_.push_back(std::move(open_device));
148 }
149 else {
150 rsj::Log(fmt::format(FMT_STRING("Ignored output device {}."), devname));
151 }
152 }
153 } /* devices that are skipped have their pointers deleted and are automatically closed*/
154 }
155 catch (const std::exception& e) {
157 throw;
158 }
159}
bool ShouldOpenDevice(const std::string &devname, const auto &open_device)
Definition MIDISender.cpp:127
void ExceptionResponse(gsl::czstring id, gsl::czstring fu, const std::exception &e) noexcept
void Log(const juce::String &info, const std::source_location &location=std::source_location::current()) noexcept
Definition Misc.cpp:131

◆ operator=() [1/2]

MidiSender & MidiSender::operator= ( const MidiSender other)
delete

◆ operator=() [2/2]

MidiSender & MidiSender::operator= ( MidiSender &&  other)
deletenoexcept

◆ RescanDevices()

void MidiSender::RescanDevices ( )
115{
116 try {
117 output_devices_.clear();
118 rsj::Log("Cleared output devices.");
119 InitDevices();
120 }
121 catch (const std::exception& e) {
123 throw;
124 }
125}
void InitDevices()
Definition MIDISender.cpp:138

◆ Send()

void MidiSender::Send ( rsj::MidiMessageId  id,
int  value 
) const
53{
54 try {
55 if (id.msg_id_type == rsj::MessageType::kCc) { SendControllerEvent(id, value); }
56 else if (id.msg_id_type == rsj::MessageType::kNoteOn) {
57 SendNoteOn(id, value);
58 }
59 else if (id.msg_id_type == rsj::MessageType::kPw) {
60 SendPitchWheel(id, value);
61 }
62 else {
63 LogUnexpectedDataType(id);
64 }
65 }
66 catch (const std::exception& e) {
68 throw;
69 }
70}
void SendNoteOn(rsj::MidiMessageId id, int value) const
Definition MIDISender.cpp:78
void SendPitchWheel(rsj::MidiMessageId id, int value) const
Definition MIDISender.cpp:72
void SendControllerEvent(rsj::MidiMessageId id, int value) const
Definition MIDISender.cpp:85

◆ SendControllerEvent()

void MidiSender::SendControllerEvent ( rsj::MidiMessageId  id,
int  value 
) const
private
86{
87 if (id.control_number < 128 && value < 128) {
88 /* regular message */
89 const auto msg {juce::MidiMessage::controllerEvent(id.channel, id.control_number, value)};
90 for (const auto& dev : output_devices_) { dev->sendMessageNow(msg); }
91 }
92 else {
93 /* NPRN */
94 SendNrpn(id, value);
95 }
96}
void SendNrpn(rsj::MidiMessageId id, int value) const
Definition MIDISender.cpp:98

◆ SendNoteOn()

void MidiSender::SendNoteOn ( rsj::MidiMessageId  id,
int  value 
) const
private
79{
80 const auto msg {juce::MidiMessage::noteOn(id.channel, id.control_number,
81 gsl::narrow_cast<juce::uint8>(value))};
82 for (const auto& dev : output_devices_) { dev->sendMessageNow(msg); }
83}

◆ SendNrpn()

void MidiSender::SendNrpn ( rsj::MidiMessageId  id,
int  value 
) const
private
99{
100 const auto msg_parm_msb {
101 juce::MidiMessage::controllerEvent(id.channel, 99, id.control_number >> 7 & 0x7F)};
102 const auto msg_parm_lsb {
103 juce::MidiMessage::controllerEvent(id.channel, 98, id.control_number & 0x7f)};
104 const auto msg_val_msb {juce::MidiMessage::controllerEvent(id.channel, 6, value >> 7 & 0x7F)};
105 const auto msg_val_lsb {juce::MidiMessage::controllerEvent(id.channel, 38, value & 0x7f)};
106 for (const auto& dev : output_devices_) {
107 dev->sendMessageNow(msg_parm_msb);
108 dev->sendMessageNow(msg_parm_lsb);
109 dev->sendMessageNow(msg_val_msb);
110 dev->sendMessageNow(msg_val_lsb);
111 }
112}

◆ SendPitchWheel()

void MidiSender::SendPitchWheel ( rsj::MidiMessageId  id,
int  value 
) const
private
73{
74 const auto msg {juce::MidiMessage::pitchWheel(id.channel, value)};
75 for (const auto& dev : output_devices_) { dev->sendMessageNow(msg); }
76}

◆ ShouldOpenDevice()

bool MidiSender::ShouldOpenDevice ( const std::string &  devname,
const auto &  open_device 
)
private
128{
129 if constexpr (MSWindows) {
130 return devname != "Microsoft GS Wavetable Synth"
131 && devices_.EnabledOrNew(open_device->getDeviceInfo(), "output");
132 }
133 else {
134 return devices_.EnabledOrNew(open_device->getDeviceInfo(), "output");
135 }
136}
bool EnabledOrNew(const juce::MidiDeviceInfo &info, const juce::String &io)
Definition Devices.cpp:152

◆ Start()

void MidiSender::Start ( )
33{
34 try {
36 }
37 catch (const std::exception& e) {
39 throw;
40 }
41}

Member Data Documentation

◆ devices_

Devices& MidiSender::devices_
private

◆ output_devices_

std::vector<std::unique_ptr<juce::MidiOutput> > MidiSender::output_devices_
private

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