39 jassert (midiChannel >= 1 && midiChannel <= 16);
48 for (
int i = 0; i < 16; ++i)
50 states[i].parameterMSB = 0xff;
51 states[i].parameterLSB = 0xff;
52 states[i].resetValue();
53 states[i].isNRPN =
false;
58MidiRPNDetector::ChannelState::ChannelState()
noexcept
59 : parameterMSB (0
xff), parameterLSB (0
xff), valueMSB (0
xff), valueLSB (0
xff), isNRPN (
false)
63bool MidiRPNDetector::ChannelState::handleController (
int channel,
66 MidiRPNMessage& result)
noexcept
68 switch (controllerNumber)
70 case 0x62: parameterLSB = uint8 (value); resetValue(); isNRPN =
true;
break;
71 case 0x63: parameterMSB = uint8 (value); resetValue(); isNRPN =
true;
break;
73 case 0x64: parameterLSB = uint8 (value); resetValue(); isNRPN =
false;
break;
74 case 0x65: parameterMSB = uint8 (value); resetValue(); isNRPN =
false;
break;
76 case 0x06: valueMSB = uint8 (value);
return sendIfReady (channel, result);
77 case 0x26: valueLSB = uint8 (value);
break;
85void MidiRPNDetector::ChannelState::resetValue() noexcept
92bool MidiRPNDetector::ChannelState::sendIfReady (
int channel, MidiRPNMessage& result)
noexcept
94 if (parameterMSB < 0x80 && parameterLSB < 0x80)
98 result.channel = channel;
99 result.parameterNumber = (parameterMSB << 7) + parameterLSB;
100 result.isNRPN = isNRPN;
104 result.value = (valueMSB << 7) + valueLSB;
105 result.is14BitValue =
true;
109 result.value = valueMSB;
110 result.is14BitValue =
false;
136 jassert (midiChannel > 0 && midiChannel <= 16);
137 jassert (parameterNumber >= 0 && parameterNumber < 16384);
138 jassert (value >= 0 && value < (
use14BitValue ? 16384 : 128));
140 uint8 parameterLSB =
uint8 (parameterNumber & 0x0000007f);
141 uint8 parameterMSB =
uint8 (parameterNumber >> 7);
171 :
UnitTest (
"MidiRPNDetector class", UnitTestCategories::midi)
174 void runTest()
override
176 beginTest (
"7-bit RPN");
180 expect (!
detector.parseControllerMessage (2, 101, 0,
rpn));
181 expect (!
detector.parseControllerMessage (2, 100, 7,
rpn));
182 expect (
detector.parseControllerMessage (2, 6, 42,
rpn));
184 expectEquals (
rpn.channel, 2);
185 expectEquals (
rpn.parameterNumber, 7);
186 expectEquals (
rpn.value, 42);
187 expect (!
rpn.isNRPN);
188 expect (!
rpn.is14BitValue);
191 beginTest (
"14-bit RPN");
195 expect (!
detector.parseControllerMessage (1, 100, 44,
rpn));
196 expect (!
detector.parseControllerMessage (1, 101, 2,
rpn));
197 expect (!
detector.parseControllerMessage (1, 38, 94,
rpn));
198 expect (
detector.parseControllerMessage (1, 6, 1,
rpn));
200 expectEquals (
rpn.channel, 1);
201 expectEquals (
rpn.parameterNumber, 300);
202 expectEquals (
rpn.value, 222);
203 expect (!
rpn.isNRPN);
204 expect (
rpn.is14BitValue);
207 beginTest (
"RPNs on multiple channels simultaneously");
211 expect (!
detector.parseControllerMessage (1, 100, 44,
rpn));
212 expect (!
detector.parseControllerMessage (2, 101, 0,
rpn));
213 expect (!
detector.parseControllerMessage (1, 101, 2,
rpn));
214 expect (!
detector.parseControllerMessage (2, 100, 7,
rpn));
215 expect (!
detector.parseControllerMessage (1, 38, 94,
rpn));
216 expect (
detector.parseControllerMessage (2, 6, 42,
rpn));
218 expectEquals (
rpn.channel, 2);
219 expectEquals (
rpn.parameterNumber, 7);
220 expectEquals (
rpn.value, 42);
221 expect (!
rpn.isNRPN);
222 expect (!
rpn.is14BitValue);
224 expect (
detector.parseControllerMessage (1, 6, 1,
rpn));
226 expectEquals (
rpn.channel, 1);
227 expectEquals (
rpn.parameterNumber, 300);
228 expectEquals (
rpn.value, 222);
229 expect (!
rpn.isNRPN);
230 expect (
rpn.is14BitValue);
233 beginTest (
"14-bit RPN with value within 7-bit range");
237 expect (!
detector.parseControllerMessage (16, 100, 0 ,
rpn));
238 expect (!
detector.parseControllerMessage (16, 101, 0,
rpn));
239 expect (!
detector.parseControllerMessage (16, 38, 3,
rpn));
240 expect (
detector.parseControllerMessage (16, 6, 0,
rpn));
242 expectEquals (
rpn.channel, 16);
243 expectEquals (
rpn.parameterNumber, 0);
244 expectEquals (
rpn.value, 3);
245 expect (!
rpn.isNRPN);
246 expect (
rpn.is14BitValue);
249 beginTest (
"invalid RPN (wrong order)");
253 expect (!
detector.parseControllerMessage (2, 6, 42,
rpn));
254 expect (!
detector.parseControllerMessage (2, 101, 0,
rpn));
255 expect (!
detector.parseControllerMessage (2, 100, 7,
rpn));
258 beginTest (
"14-bit RPN interspersed with unrelated CC messages");
262 expect (!
detector.parseControllerMessage (16, 3, 80,
rpn));
263 expect (!
detector.parseControllerMessage (16, 100, 0 ,
rpn));
264 expect (!
detector.parseControllerMessage (16, 4, 81,
rpn));
265 expect (!
detector.parseControllerMessage (16, 101, 0,
rpn));
266 expect (!
detector.parseControllerMessage (16, 5, 82,
rpn));
267 expect (!
detector.parseControllerMessage (16, 5, 83,
rpn));
268 expect (!
detector.parseControllerMessage (16, 38, 3,
rpn));
269 expect (!
detector.parseControllerMessage (16, 4, 84,
rpn));
270 expect (!
detector.parseControllerMessage (16, 3, 85,
rpn));
271 expect (
detector.parseControllerMessage (16, 6, 0,
rpn));
273 expectEquals (
rpn.channel, 16);
274 expectEquals (
rpn.parameterNumber, 0);
275 expectEquals (
rpn.value, 3);
276 expect (!
rpn.isNRPN);
277 expect (
rpn.is14BitValue);
280 beginTest (
"14-bit NRPN");
284 expect (!
detector.parseControllerMessage (1, 98, 44,
rpn));
285 expect (!
detector.parseControllerMessage (1, 99 , 2,
rpn));
286 expect (!
detector.parseControllerMessage (1, 38, 94,
rpn));
287 expect (
detector.parseControllerMessage (1, 6, 1,
rpn));
289 expectEquals (
rpn.channel, 1);
290 expectEquals (
rpn.parameterNumber, 300);
291 expectEquals (
rpn.value, 222);
293 expect (
rpn.is14BitValue);
300 expect (!
detector.parseControllerMessage (2, 101, 0,
rpn));
302 expect (!
detector.parseControllerMessage (2, 100, 7,
rpn));
303 expect (!
detector.parseControllerMessage (2, 6, 42,
rpn));
308static MidiRPNDetectorTests MidiRPNDetectorUnitTests;
311class MidiRPNGeneratorTests :
public UnitTest
315 : UnitTest (
"MidiRPNGenerator class", UnitTestCategories::midi)
318 void runTest()
override
320 beginTest (
"generating RPN/NRPN");
331 MidiRPNMessage message = { 16, 101, 34,
false,
false };
347 MidiRPNMessage
expected = { channel, parameterNumber, value, isNRPN, is14BitValue };
356 MidiRPNMessage result = MidiRPNMessage();
369 expectEquals (result.channel,
expected.channel);
370 expectEquals (result.parameterNumber,
expected.parameterNumber);
371 expectEquals (result.value,
expected.value);
372 expect (result.isNRPN ==
expected.isNRPN);
373 expect (result.is14BitValue ==
expected.is14BitValue);
377static MidiRPNGeneratorTests MidiRPNGeneratorUnitTests;
void addEvent(const MidiMessage &midiMessage, int sampleNumber)
MidiRPNDetector() noexcept
bool parseControllerMessage(int midiChannel, int controllerNumber, int controllerValue, MidiRPNMessage &result) noexcept
~MidiRPNDetector() noexcept
static MidiBuffer generate(MidiRPNMessage message)