60void MPEZoneLayout::setZone (
bool isLower,
int numMemberChannels,
int perNotePitchbendRange,
int masterPitchbendRange)
noexcept
71 if (numMemberChannels > 0)
75 if (totalChannels >= 15)
78 upperZone.numMemberChannels = 14 - numMemberChannels;
80 lowerZone.numMemberChannels = 14 - numMemberChannels;
89 setZone (
true, numMemberChannels, perNotePitchbendRange, masterPitchbendRange);
94 setZone (
false, numMemberChannels, perNotePitchbendRange, masterPitchbendRange);
182 for (
const auto metadata : buffer)
199 int& valueToCheckAndLimit)
noexcept
201 if (valueToCheckAndLimit < minValue || valueToCheckAndLimit > maxValue)
210 valueToCheckAndLimit =
jlimit (minValue, maxValue, valueToCheckAndLimit);
219class MPEZoneLayoutTests :
public UnitTest
226 void runTest()
override
228 beginTest (
"initialisation");
230 MPEZoneLayout layout;
231 expect (! layout.getLowerZone().isActive());
232 expect (! layout.getUpperZone().isActive());
235 beginTest (
"adding zones");
237 MPEZoneLayout layout;
239 layout.setLowerZone (7);
241 expect (layout.getLowerZone().isActive());
242 expect (! layout.getUpperZone().isActive());
243 expectEquals (layout.getLowerZone().getMasterChannel(), 1);
244 expectEquals (layout.getLowerZone().numMemberChannels, 7);
246 layout.setUpperZone (7);
248 expect (layout.getLowerZone().isActive());
249 expect (layout.getUpperZone().isActive());
250 expectEquals (layout.getLowerZone().getMasterChannel(), 1);
251 expectEquals (layout.getLowerZone().numMemberChannels, 7);
252 expectEquals (layout.getUpperZone().getMasterChannel(), 16);
253 expectEquals (layout.getUpperZone().numMemberChannels, 7);
255 layout.setLowerZone (3);
257 expect (layout.getLowerZone().isActive());
258 expect (layout.getUpperZone().isActive());
259 expectEquals (layout.getLowerZone().getMasterChannel(), 1);
260 expectEquals (layout.getLowerZone().numMemberChannels, 3);
261 expectEquals (layout.getUpperZone().getMasterChannel(), 16);
262 expectEquals (layout.getUpperZone().numMemberChannels, 7);
264 layout.setUpperZone (3);
266 expect (layout.getLowerZone().isActive());
267 expect (layout.getUpperZone().isActive());
268 expectEquals (layout.getLowerZone().getMasterChannel(), 1);
269 expectEquals (layout.getLowerZone().numMemberChannels, 3);
270 expectEquals (layout.getUpperZone().getMasterChannel(), 16);
271 expectEquals (layout.getUpperZone().numMemberChannels, 3);
273 layout.setLowerZone (15);
275 expect (layout.getLowerZone().isActive());
276 expect (! layout.getUpperZone().isActive());
277 expectEquals (layout.getLowerZone().getMasterChannel(), 1);
278 expectEquals (layout.getLowerZone().numMemberChannels, 15);
281 beginTest (
"clear all zones");
283 MPEZoneLayout layout;
285 expect (! layout.getLowerZone().isActive());
286 expect (! layout.getUpperZone().isActive());
288 layout.setLowerZone (7);
289 layout.setUpperZone (2);
291 expect (layout.getLowerZone().isActive());
292 expect (layout.getUpperZone().isActive());
294 layout.clearAllZones();
296 expect (! layout.getLowerZone().isActive());
297 expect (! layout.getUpperZone().isActive());
300 beginTest (
"process MIDI buffers");
302 MPEZoneLayout layout;
305 buffer = MPEMessages::setLowerZone (7);
306 layout.processNextMidiBuffer (buffer);
308 expect (layout.getLowerZone().isActive());
309 expect (! layout.getUpperZone().isActive());
310 expectEquals (layout.getLowerZone().getMasterChannel(), 1);
311 expectEquals (layout.getLowerZone().numMemberChannels, 7);
313 buffer = MPEMessages::setUpperZone (7);
314 layout.processNextMidiBuffer (buffer);
316 expect (layout.getLowerZone().isActive());
317 expect (layout.getUpperZone().isActive());
318 expectEquals (layout.getLowerZone().getMasterChannel(), 1);
319 expectEquals (layout.getLowerZone().numMemberChannels, 7);
320 expectEquals (layout.getUpperZone().getMasterChannel(), 16);
321 expectEquals (layout.getUpperZone().numMemberChannels, 7);
324 buffer = MPEMessages::setLowerZone (10);
325 layout.processNextMidiBuffer (buffer);
327 expect (layout.getLowerZone().isActive());
328 expect (layout.getUpperZone().isActive());
329 expectEquals (layout.getLowerZone().getMasterChannel(), 1);
330 expectEquals (layout.getLowerZone().numMemberChannels, 10);
331 expectEquals (layout.getUpperZone().getMasterChannel(), 16);
332 expectEquals (layout.getUpperZone().numMemberChannels, 4);
335 buffer = MPEMessages::setLowerZone (10, 33, 44);
336 layout.processNextMidiBuffer (buffer);
338 expectEquals (layout.getLowerZone().numMemberChannels, 10);
339 expectEquals (layout.getLowerZone().perNotePitchbendRange, 33);
340 expectEquals (layout.getLowerZone().masterPitchbendRange, 44);
344 buffer = MPEMessages::setUpperZone (10);
345 layout.processNextMidiBuffer (buffer);
347 expect (layout.getLowerZone().isActive());
348 expect (layout.getUpperZone().isActive());
349 expectEquals (layout.getLowerZone().getMasterChannel(), 1);
350 expectEquals (layout.getLowerZone().numMemberChannels, 4);
351 expectEquals (layout.getUpperZone().getMasterChannel(), 16);
352 expectEquals (layout.getUpperZone().numMemberChannels, 10);
354 buffer = MPEMessages::setUpperZone (10, 33, 44);
356 layout.processNextMidiBuffer (buffer);
358 expectEquals (layout.getUpperZone().numMemberChannels, 10);
359 expectEquals (layout.getUpperZone().perNotePitchbendRange, 33);
360 expectEquals (layout.getUpperZone().masterPitchbendRange, 44);
363 buffer = MPEMessages::clearAllZones();
364 layout.processNextMidiBuffer (buffer);
366 expect (! layout.getLowerZone().isActive());
367 expect (! layout.getUpperZone().isActive());
370 beginTest (
"process individual MIDI messages");
372 MPEZoneLayout layout;
374 layout.processNextMidiEvent ({ 0x80, 0x59, 0xd0 });
375 layout.processNextMidiEvent ({ 0xb0, 0x64, 0x06 });
376 layout.processNextMidiEvent ({ 0xb0, 0x65, 0x00 });
377 layout.processNextMidiEvent ({ 0xb8, 0x0b, 0x66 });
378 layout.processNextMidiEvent ({ 0xb0, 0x06, 0x03 });
379 layout.processNextMidiEvent ({ 0x90, 0x60, 0x00 });
381 expect (layout.getLowerZone().isActive());
382 expect (! layout.getUpperZone().isActive());
383 expectEquals (layout.getLowerZone().getMasterChannel(), 1);
384 expectEquals (layout.getLowerZone().numMemberChannels, 3);
385 expectEquals (layout.getLowerZone().perNotePitchbendRange, 48);
386 expectEquals (layout.getLowerZone().masterPitchbendRange, 2);
391static MPEZoneLayoutTests MPEZoneLayoutUnitTests;
static void message(int level, const char *fmt,...)
Definition adplugdb.cpp:120
static const int zoneLayoutMessagesRpnNumber
Definition juce_MPEMessages.h:113
Definition juce_MPEZoneLayout.h:196
void updateMasterPitchbend(MPEZone &, int)
Definition juce_MPEZoneLayout.cpp:141
ListenerList< Listener > listeners
Definition juce_MPEZoneLayout.h:225
void processNextMidiBuffer(const MidiBuffer &buffer)
Definition juce_MPEZoneLayout.cpp:180
void processRpnMessage(MidiRPNMessage)
Definition juce_MPEZoneLayout.cpp:122
void clearAllZones()
Definition juce_MPEZoneLayout.cpp:97
void updatePerNotePitchbendRange(MPEZone &, int)
Definition juce_MPEZoneLayout.cpp:151
MPEZone upperZone
Definition juce_MPEZoneLayout.h:222
void sendLayoutChangeMessage()
Definition juce_MPEZoneLayout.cpp:54
MidiRPNDetector rpnDetector
Definition juce_MPEZoneLayout.h:224
void checkAndLimitZoneParameters(int, int, int &) noexcept
Definition juce_MPEZoneLayout.cpp:198
void setUpperZone(int numMemberChannels=0, int perNotePitchbendRange=48, int masterPitchbendRange=2) noexcept
Definition juce_MPEZoneLayout.cpp:92
void processPitchbendRangeRpnMessage(MidiRPNMessage)
Definition juce_MPEZoneLayout.cpp:161
void removeListener(Listener *const listenerToRemove) noexcept
Definition juce_MPEZoneLayout.cpp:192
void processZoneLayoutRpnMessage(MidiRPNMessage)
Definition juce_MPEZoneLayout.cpp:130
void addListener(Listener *const listenerToAdd) noexcept
Definition juce_MPEZoneLayout.cpp:187
MPEZone lowerZone
Definition juce_MPEZoneLayout.h:221
void setZone(bool, int, int, int) noexcept
Definition juce_MPEZoneLayout.cpp:60
void setLowerZone(int numMemberChannels=0, int perNotePitchbendRange=48, int masterPitchbendRange=2) noexcept
Definition juce_MPEZoneLayout.cpp:87
void processNextMidiEvent(const MidiMessage &message)
Definition juce_MPEZoneLayout.cpp:106
Definition juce_MidiBuffer.h:145
Definition juce_MidiMessage.h:35
Definition juce_UnitTest.h:70
int * l
Definition inflate.c:1579
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
Type jlimit(Type lowerLimit, Type upperLimit, Type valueToConstrain) noexcept
Definition juce_MathsFunctions.h:262
Definition juce_MPEZoneLayout.h:40
int masterPitchbendRange
Definition juce_MPEZoneLayout.h:99
int perNotePitchbendRange
Definition juce_MPEZoneLayout.h:98
@ upper
Definition juce_MPEZoneLayout.h:41
@ lower
Definition juce_MPEZoneLayout.h:41
Definition juce_MidiRPN.h:33
int channel
Definition juce_MidiRPN.h:35
int parameterNumber
Definition juce_MidiRPN.h:38
int value
Definition juce_MidiRPN.h:44