Skip to content

Commit ee1abfe

Browse files
Add SysEx message create methods and value convert in methods
1 parent f11366d commit ee1abfe

File tree

2 files changed

+229
-3
lines changed

2 files changed

+229
-3
lines changed

src/MackieControl.cpp

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,172 @@ namespace mackieControl {
8989
return message.toMidi();
9090
}
9191

92+
Message Message::createDeviceQuery() {
93+
uint8_t bytes[5] = {};
94+
bytes[4] = static_cast<uint8_t>(SysExMessage::DeviceQuery);
95+
96+
return Message{ juce::MidiMessage::createSysExMessage(bytes, sizeof(bytes)) };
97+
}
98+
99+
Message Message::createHostConnectionQuery(uint8_t serialNum[7], uint32_t challengeCode) {
100+
uint8_t bytes[5 + 7 + sizeof(challengeCode)] = {};
101+
bytes[4] = static_cast<uint8_t>(SysExMessage::HostConnectionQuery);
102+
std::memcpy(&bytes[5], serialNum, 7);
103+
std::memcpy(&bytes[5 + 7], &challengeCode, sizeof(challengeCode));
104+
105+
return Message{ juce::MidiMessage::createSysExMessage(bytes, sizeof(bytes)) };
106+
}
107+
108+
Message Message::createHostConnectionReply(uint8_t serialNum[7], uint32_t responseCode) {
109+
uint8_t bytes[5 + 7 + sizeof(responseCode)] = {};
110+
bytes[4] = static_cast<uint8_t>(SysExMessage::HostConnectionReply);
111+
std::memcpy(&bytes[5], serialNum, 7);
112+
std::memcpy(&bytes[5 + 7], &responseCode, sizeof(responseCode));
113+
114+
return Message{ juce::MidiMessage::createSysExMessage(bytes, sizeof(bytes)) };
115+
}
116+
117+
Message Message::createHostConnectionConfirmation(uint8_t serialNum[7]) {
118+
uint8_t bytes[5 + 7] = {};
119+
bytes[4] = static_cast<uint8_t>(SysExMessage::HostConnectionConfirmation);
120+
std::memcpy(&bytes[5], serialNum, 7);
121+
122+
return Message{ juce::MidiMessage::createSysExMessage(bytes, sizeof(bytes)) };
123+
}
124+
125+
Message Message::createHostConnectionError(uint8_t serialNum[7]) {
126+
uint8_t bytes[5 + 7] = {};
127+
bytes[4] = static_cast<uint8_t>(SysExMessage::HostConnectionError);
128+
std::memcpy(&bytes[5], serialNum, 7);
129+
130+
return Message{ juce::MidiMessage::createSysExMessage(bytes, sizeof(bytes)) };
131+
}
132+
133+
Message Message::createLCDBackLightSaver(uint8_t state, uint8_t timeout) {
134+
if (state > 0) {
135+
uint8_t bytes[5 + 2] = {};
136+
bytes[4] = static_cast<uint8_t>(SysExMessage::LCDBackLightSaver);
137+
bytes[5] = state;
138+
bytes[6] = timeout;
139+
140+
return Message{ juce::MidiMessage::createSysExMessage(bytes, sizeof(bytes)) };
141+
}
142+
143+
uint8_t bytes[5 + 1] = {};
144+
bytes[4] = static_cast<uint8_t>(SysExMessage::LCDBackLightSaver);
145+
bytes[5] = state;
146+
147+
return Message{ juce::MidiMessage::createSysExMessage(bytes, sizeof(bytes)) };
148+
}
149+
150+
Message Message::createTouchlessMovableFaders(uint8_t state) {
151+
uint8_t bytes[5 + 1] = {};
152+
bytes[4] = static_cast<uint8_t>(SysExMessage::TouchlessMovableFaders);
153+
bytes[5] = state;
154+
155+
return Message{ juce::MidiMessage::createSysExMessage(bytes, sizeof(bytes)) };
156+
}
157+
158+
Message Message::createFaderTouchSensitivity(uint8_t channelNumber, uint8_t value) {
159+
uint8_t bytes[5 + 2] = {};
160+
bytes[4] = static_cast<uint8_t>(SysExMessage::FaderTouchSensitivity);
161+
bytes[5] = channelNumber;
162+
bytes[6] = value;
163+
164+
return Message{ juce::MidiMessage::createSysExMessage(bytes, sizeof(bytes)) };
165+
}
166+
167+
Message Message::createGoOffline() {
168+
uint8_t bytes[5] = {};
169+
bytes[4] = static_cast<uint8_t>(SysExMessage::GoOffline);
170+
171+
return Message{ juce::MidiMessage::createSysExMessage(bytes, sizeof(bytes)) };
172+
}
173+
174+
Message Message::createTimeCodeBBTDisplay(uint8_t* data, int size) {
175+
int byteSize = 5 + 1 + size + 1;
176+
auto bytes = std::unique_ptr<uint8_t[]>(new uint8_t[byteSize]());
177+
178+
bytes[4] = static_cast<uint8_t>(SysExMessage::TimeCodeBBTDisplay);
179+
std::memcpy(&bytes[6], data, size);
180+
181+
return Message{ juce::MidiMessage::createSysExMessage(bytes.get(), byteSize) };
182+
}
183+
184+
Message Message::createAssignment7SegmentDisplay(uint8_t data[2]) {
185+
uint8_t bytes[5 + 1 + 2] = {};
186+
bytes[4] = static_cast<uint8_t>(SysExMessage::Assignment7SegmentDisplay);
187+
std::memcpy(&bytes[6], data, 2);
188+
189+
return Message{ juce::MidiMessage::createSysExMessage(bytes, sizeof(bytes)) };
190+
}
191+
192+
Message Message::createLCD(uint8_t place, char* data, int size) {
193+
int byteSize = 5 + 1 + size;
194+
auto bytes = std::unique_ptr<uint8_t[]>(new uint8_t[byteSize]());
195+
196+
bytes[4] = static_cast<uint8_t>(SysExMessage::LCD);
197+
bytes[5] = place;
198+
std::memcpy(&bytes[6], data, size);
199+
200+
return Message{ juce::MidiMessage::createSysExMessage(bytes.get(), byteSize) };
201+
}
202+
203+
Message Message::createVersionRequest() {
204+
uint8_t bytes[5] = {};
205+
bytes[4] = static_cast<uint8_t>(SysExMessage::VersionRequest);
206+
207+
return Message{ juce::MidiMessage::createSysExMessage(bytes, sizeof(bytes)) };
208+
}
209+
210+
Message Message::createVersionReply(char* data, int size) {
211+
int byteSize = 5 + 1 + size;
212+
auto bytes = std::unique_ptr<uint8_t[]>(new uint8_t[byteSize]());
213+
214+
bytes[4] = static_cast<uint8_t>(SysExMessage::VersionReply);
215+
std::memcpy(&bytes[6], data, size);
216+
217+
return Message{ juce::MidiMessage::createSysExMessage(bytes.get(), byteSize) };
218+
}
219+
220+
Message Message::createChannelMeterMode(uint8_t channelNumber, uint8_t mode) {
221+
uint8_t bytes[5 + 2] = {};
222+
bytes[4] = static_cast<uint8_t>(SysExMessage::ChannelMeterMode);
223+
bytes[5] = channelNumber;
224+
bytes[6] = mode;
225+
226+
return Message{ juce::MidiMessage::createSysExMessage(bytes, sizeof(bytes)) };
227+
}
228+
229+
Message Message::createGlobalLCDMeterMode(uint8_t mode) {
230+
uint8_t bytes[5 + 1] = {};
231+
bytes[4] = static_cast<uint8_t>(SysExMessage::GlobalLCDMeterMode);
232+
bytes[5] = mode;
233+
234+
return Message{ juce::MidiMessage::createSysExMessage(bytes, sizeof(bytes)) };
235+
}
236+
237+
Message Message::createAllFaderstoMinimum() {
238+
uint8_t bytes[5] = {};
239+
bytes[4] = static_cast<uint8_t>(SysExMessage::AllFaderstoMinimum);
240+
241+
return Message{ juce::MidiMessage::createSysExMessage(bytes, sizeof(bytes)) };
242+
}
243+
244+
Message Message::createAllLEDsOff() {
245+
uint8_t bytes[5] = {};
246+
bytes[4] = static_cast<uint8_t>(SysExMessage::AllLEDsOff);
247+
248+
return Message{ juce::MidiMessage::createSysExMessage(bytes, sizeof(bytes)) };
249+
}
250+
251+
Message Message::createReset() {
252+
uint8_t bytes[5] = {};
253+
bytes[4] = static_cast<uint8_t>(SysExMessage::Reset);
254+
255+
return Message{ juce::MidiMessage::createSysExMessage(bytes, sizeof(bytes)) };
256+
}
257+
92258
Message Message::createNote(NoteMessage type, VelocityMessage vel) {
93259
return Message{ juce::MidiMessage::noteOn(1, static_cast<int>(type), static_cast<uint8_t>(vel)) };
94260
}
@@ -104,4 +270,37 @@ namespace mackieControl {
104270
Message Message::createChannelPressure(int channel, int value) {
105271
return Message{ juce::MidiMessage::channelPressureChange(1, (channel - 1) * 16 + value) };
106272
}
273+
274+
uint8_t Message::charToMackie(char c) {
275+
if (c >= 'a' && c <= 'z') { return static_cast<uint8_t>((c - 'a') + 1); }
276+
else if (c >= 'A' && c <= 'Z') { return static_cast<uint8_t>((c - 'A') + 1); }
277+
else if (c >= '0' && c <= '9') { return static_cast<uint8_t>((c - '0') + 0x30); }
278+
279+
return 0x20;
280+
}
281+
282+
uint8_t Message::toLCDPlace(bool lowerLine, uint8_t index) {
283+
return (lowerLine ? 56Ui8 : 0Ui8) + index;
284+
}
285+
286+
uint8_t Message::toChannelMeterMode(
287+
bool signalLEDEnabled, bool peakHoldDisplayEnabled, bool LCDLevelMeterEnabled) {
288+
return (static_cast<uint8_t>(signalLEDEnabled) << 0)
289+
+ (static_cast<uint8_t>(peakHoldDisplayEnabled) << 1)
290+
+ (static_cast<uint8_t>(LCDLevelMeterEnabled) << 2);
291+
}
292+
293+
int Message::toVPotValue(WheelType type, int ticks) {
294+
return static_cast<int>(type) * 64 + ticks;
295+
}
296+
297+
int Message::toVPotLEDRingValue(bool centerLEDOn, VPotLEDRingMode mode, int value) {
298+
return static_cast<int>(centerLEDOn) * 64
299+
+ static_cast<int>(mode) * 16
300+
+ value;
301+
}
302+
303+
int Message::toJogWheelValue(WheelType type, int ticks) {
304+
return static_cast<int>(type) * 64 + ticks;
305+
}
107306
}

src/MackieControl.h

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include <JuceHeader.h>
44

55
namespace mackieControl {
6-
enum class SysExMessage {
6+
enum class SysExMessage : uint8_t {
77
DeviceQuery = 0,
88
HostConnectionQuery,
99
HostConnectionReply,
@@ -50,7 +50,7 @@ namespace mackieControl {
5050
constexpr bool isValidSysExMessage(int mes) {
5151
return isValidSysExMessage(static_cast<SysExMessage>(mes)); }
5252

53-
enum class VelocityMessage {
53+
enum class VelocityMessage : uint8_t {
5454
Off = 0,
5555
Flashing,
5656
On = 127
@@ -230,12 +230,39 @@ namespace mackieControl {
230230
static Message fromMidi(const juce::MidiMessage& message);
231231
static juce::MidiMessage toMidi(const Message& message);
232232

233-
/** TODO createSysEx */
233+
static Message createDeviceQuery();
234+
static Message createHostConnectionQuery(uint8_t serialNum[7], uint32_t challengeCode);
235+
static Message createHostConnectionReply(uint8_t serialNum[7], uint32_t responseCode);
236+
static Message createHostConnectionConfirmation(uint8_t serialNum[7]);
237+
static Message createHostConnectionError(uint8_t serialNum[7]);
238+
static Message createLCDBackLightSaver(uint8_t state, uint8_t timeout);
239+
static Message createTouchlessMovableFaders(uint8_t state);
240+
static Message createFaderTouchSensitivity(uint8_t channelNumber, uint8_t value);
241+
static Message createGoOffline();
242+
static Message createTimeCodeBBTDisplay(uint8_t* data, int size);
243+
static Message createAssignment7SegmentDisplay(uint8_t data[2]);
244+
static Message createLCD(uint8_t place, char* data, int size);
245+
static Message createVersionRequest();
246+
static Message createVersionReply(char* data, int size);
247+
static Message createChannelMeterMode(uint8_t channelNumber, uint8_t mode);
248+
static Message createGlobalLCDMeterMode(uint8_t mode);
249+
static Message createAllFaderstoMinimum();
250+
static Message createAllLEDsOff();
251+
static Message createReset();
234252
static Message createNote(NoteMessage type, VelocityMessage vel);
235253
static Message createCC(CCMessage type, int value);
236254
static Message createPitchWheel(int channel, int value);
237255
static Message createChannelPressure(int channel, int value);
238256

257+
static uint8_t charToMackie(char c);
258+
259+
static uint8_t toLCDPlace(bool lowerLine, uint8_t index);
260+
static uint8_t toChannelMeterMode(
261+
bool signalLEDEnabled, bool peakHoldDisplayEnabled, bool LCDLevelMeterEnabled);
262+
static int toVPotValue(WheelType type, int ticks);
263+
static int toVPotLEDRingValue(bool centerLEDOn, VPotLEDRingMode mode, int value);
264+
static int toJogWheelValue(WheelType type, int ticks);
265+
239266
private:
240267
juce::MidiMessage message;
241268

0 commit comments

Comments
 (0)