39 jassert (midiChannel > 0 && midiChannel <= 16);
40 jassert (controllerNumber >= 0 && controllerNumber < 128);
41 jassert (controllerValue >= 0 && controllerValue < 128);
43 return states[midiChannel - 1].handleController (midiChannel, controllerNumber, controllerValue,
result);
48 for (
int i = 0;
i < 16; ++
i)
63 switch (controllerNumber)
100 result.is14BitValue =
true;
105 result.is14BitValue =
false;
131 jassert (midiChannel > 0 && midiChannel <= 16);
132 jassert (parameterNumber >= 0 && parameterNumber < 16384);
135 uint8 parameterLSB =
uint8 (parameterNumber & 0x0000007f);
136 uint8 parameterMSB =
uint8 (parameterNumber >> 7);
141 uint8 channelByte =
uint8 (0xb0 + midiChannel - 1);
145 buffer.addEvent (
MidiMessage (channelByte, isNRPN ? 0x62 : 0x64, parameterLSB), 0);
146 buffer.addEvent (
MidiMessage (channelByte, isNRPN ? 0x63 : 0x65, parameterMSB), 0);
150 buffer.addEvent (
MidiMessage (channelByte, 0x26, valueLSB), 0);
152 buffer.addEvent (
MidiMessage (channelByte, 0x06, valueMSB), 0);
162class MidiRPNDetectorTests :
public UnitTest
165 MidiRPNDetectorTests()
169 void runTest()
override
171 beginTest (
"7-bit RPN");
173 MidiRPNDetector detector;
175 expect (! detector.parseControllerMessage (2, 101, 0, rpn));
176 expect (! detector.parseControllerMessage (2, 100, 7, rpn));
177 expect (detector.parseControllerMessage (2, 6, 42, rpn));
179 expectEquals (rpn.channel, 2);
180 expectEquals (rpn.parameterNumber, 7);
181 expectEquals (rpn.value, 42);
182 expect (! rpn.isNRPN);
183 expect (! rpn.is14BitValue);
186 beginTest (
"14-bit RPN");
188 MidiRPNDetector detector;
190 expect (! detector.parseControllerMessage (1, 100, 44, rpn));
191 expect (! detector.parseControllerMessage (1, 101, 2, rpn));
192 expect (! detector.parseControllerMessage (1, 38, 94, rpn));
193 expect (detector.parseControllerMessage (1, 6, 1, rpn));
195 expectEquals (rpn.channel, 1);
196 expectEquals (rpn.parameterNumber, 300);
197 expectEquals (rpn.value, 222);
198 expect (! rpn.isNRPN);
199 expect (rpn.is14BitValue);
202 beginTest (
"RPNs on multiple channels simultaneously");
204 MidiRPNDetector detector;
206 expect (! detector.parseControllerMessage (1, 100, 44, rpn));
207 expect (! detector.parseControllerMessage (2, 101, 0, rpn));
208 expect (! detector.parseControllerMessage (1, 101, 2, rpn));
209 expect (! detector.parseControllerMessage (2, 100, 7, rpn));
210 expect (! detector.parseControllerMessage (1, 38, 94, rpn));
211 expect (detector.parseControllerMessage (2, 6, 42, rpn));
213 expectEquals (rpn.channel, 2);
214 expectEquals (rpn.parameterNumber, 7);
215 expectEquals (rpn.value, 42);
216 expect (! rpn.isNRPN);
217 expect (! rpn.is14BitValue);
219 expect (detector.parseControllerMessage (1, 6, 1, rpn));
221 expectEquals (rpn.channel, 1);
222 expectEquals (rpn.parameterNumber, 300);
223 expectEquals (rpn.value, 222);
224 expect (! rpn.isNRPN);
225 expect (rpn.is14BitValue);
228 beginTest (
"14-bit RPN with value within 7-bit range");
230 MidiRPNDetector detector;
232 expect (! detector.parseControllerMessage (16, 100, 0 , rpn));
233 expect (! detector.parseControllerMessage (16, 101, 0, rpn));
234 expect (! detector.parseControllerMessage (16, 38, 3, rpn));
235 expect (detector.parseControllerMessage (16, 6, 0, rpn));
237 expectEquals (rpn.channel, 16);
238 expectEquals (rpn.parameterNumber, 0);
239 expectEquals (rpn.value, 3);
240 expect (! rpn.isNRPN);
241 expect (rpn.is14BitValue);
244 beginTest (
"invalid RPN (wrong order)");
246 MidiRPNDetector detector;
248 expect (! detector.parseControllerMessage (2, 6, 42, rpn));
249 expect (! detector.parseControllerMessage (2, 101, 0, rpn));
250 expect (! detector.parseControllerMessage (2, 100, 7, rpn));
253 beginTest (
"14-bit RPN interspersed with unrelated CC messages");
255 MidiRPNDetector detector;
257 expect (! detector.parseControllerMessage (16, 3, 80, rpn));
258 expect (! detector.parseControllerMessage (16, 100, 0 , rpn));
259 expect (! detector.parseControllerMessage (16, 4, 81, rpn));
260 expect (! detector.parseControllerMessage (16, 101, 0, rpn));
261 expect (! detector.parseControllerMessage (16, 5, 82, rpn));
262 expect (! detector.parseControllerMessage (16, 5, 83, rpn));
263 expect (! detector.parseControllerMessage (16, 38, 3, rpn));
264 expect (! detector.parseControllerMessage (16, 4, 84, rpn));
265 expect (! detector.parseControllerMessage (16, 3, 85, rpn));
266 expect (detector.parseControllerMessage (16, 6, 0, rpn));
268 expectEquals (rpn.channel, 16);
269 expectEquals (rpn.parameterNumber, 0);
270 expectEquals (rpn.value, 3);
271 expect (! rpn.isNRPN);
272 expect (rpn.is14BitValue);
275 beginTest (
"14-bit NRPN");
277 MidiRPNDetector detector;
279 expect (! detector.parseControllerMessage (1, 98, 44, rpn));
280 expect (! detector.parseControllerMessage (1, 99 , 2, rpn));
281 expect (! detector.parseControllerMessage (1, 38, 94, rpn));
282 expect (detector.parseControllerMessage (1, 6, 1, rpn));
284 expectEquals (rpn.channel, 1);
285 expectEquals (rpn.parameterNumber, 300);
286 expectEquals (rpn.value, 222);
288 expect (rpn.is14BitValue);
293 MidiRPNDetector detector;
295 expect (! detector.parseControllerMessage (2, 101, 0, rpn));
297 expect (! detector.parseControllerMessage (2, 100, 7, rpn));
298 expect (! detector.parseControllerMessage (2, 6, 42, rpn));
303static MidiRPNDetectorTests MidiRPNDetectorUnitTests;
306class MidiRPNGeneratorTests :
public UnitTest
309 MidiRPNGeneratorTests()
310 : UnitTest (
"MidiRPNGenerator class", UnitTestCategories::midi)
313 void runTest()
override
315 beginTest (
"generating RPN/NRPN");
318 MidiBuffer
buffer = MidiRPNGenerator::generate (1, 23, 1337,
true,
true);
319 expectContainsRPN (buffer, 1, 23, 1337,
true,
true);
322 MidiBuffer
buffer = MidiRPNGenerator::generate (16, 101, 34,
false,
false);
323 expectContainsRPN (buffer, 16, 101, 34,
false,
false);
326 MidiRPNMessage
message = { 16, 101, 34,
false,
false };
328 expectContainsRPN (buffer,
message);
335 void expectContainsRPN (
const MidiBuffer& midiBuffer,
342 MidiRPNMessage expected = { channel, parameterNumber,
value, isNRPN, is14BitValue };
343 expectContainsRPN (midiBuffer, expected);
347 void expectContainsRPN (
const MidiBuffer& midiBuffer, MidiRPNMessage expected)
349 MidiRPNMessage
result = MidiRPNMessage();
350 MidiRPNDetector detector;
352 for (
const auto metadata : midiBuffer)
354 const auto midiMessage = metadata.getMessage();
356 if (detector.parseControllerMessage (midiMessage.getChannel(),
357 midiMessage.getControllerNumber(),
358 midiMessage.getControllerValue(),
363 expectEquals (
result.channel, expected.channel);
364 expectEquals (
result.parameterNumber, expected.parameterNumber);
365 expectEquals (
result.value, expected.value);
366 expect (
result.isNRPN == expected.isNRPN);
367 expect (
result.is14BitValue == expected.is14BitValue);
371static MidiRPNGeneratorTests MidiRPNGeneratorUnitTests;
#define noexcept
Definition DistrhoDefines.h:72
static void message(int level, const char *fmt,...)
Definition adplugdb.cpp:120
uint8_t uint8
Definition basics.h:86
Definition juce_MidiBuffer.h:145
Definition juce_MidiMessage.h:35
ChannelState states[16]
Definition juce_MidiRPN.h:108
MidiRPNDetector() noexcept
Definition juce_MidiRPN.cpp:26
bool parseControllerMessage(int midiChannel, int controllerNumber, int controllerValue, MidiRPNMessage &result) noexcept
Definition juce_MidiRPN.cpp:34
void reset() noexcept
Definition juce_MidiRPN.cpp:46
~MidiRPNDetector() noexcept
Definition juce_MidiRPN.cpp:30
static MidiBuffer generate(MidiRPNMessage message)
Definition juce_MidiRPN.cpp:116
Definition juce_UnitTest.h:70
register unsigned i
Definition inflate.c:1575
static PuglViewHint int value
Definition pugl.h:1708
Definition juce_UnitTestCategories.h:27
JOCTET * buffer
Definition juce_JPEGLoader.cpp:302
Definition carla_juce.cpp:31
unsigned char uint8
Definition juce_MathsFunctions.h:37
bool handleController(int channel, int controllerNumber, int value, MidiRPNMessage &) noexcept
Definition juce_MidiRPN.cpp:58
bool isNRPN
Definition juce_MidiRPN.h:104
bool sendIfReady(int channel, MidiRPNMessage &) noexcept
Definition juce_MidiRPN.cpp:87
uint8 valueMSB
Definition juce_MidiRPN.h:103
void resetValue() noexcept
Definition juce_MidiRPN.cpp:80
uint8 parameterLSB
Definition juce_MidiRPN.h:103
uint8 valueLSB
Definition juce_MidiRPN.h:103
uint8 parameterMSB
Definition juce_MidiRPN.h:103
Definition juce_MidiRPN.h:33
int result
Definition process.c:1455