85 bool isLowerZone()
const noexcept {
return lowerZone; }
86 bool isUpperZone()
const noexcept {
return ! lowerZone; }
88 bool isActive()
const noexcept {
return numMemberChannels > 0; }
90 int getMasterChannel()
const noexcept {
return lowerZone ? 1 : 16; }
91 int getFirstMemberChannel()
const noexcept {
return lowerZone ? 2 : 15; }
92 int getLastMemberChannel()
const noexcept {
return lowerZone ? (1 + numMemberChannels)
93 : (16 - numMemberChannels); }
95 bool isUsingChannelAsMemberChannel (
int channel)
const noexcept
97 return lowerZone ? (channel > 1 && channel <= 1 + numMemberChannels)
101 bool isUsing (
int channel)
const noexcept
103 return isUsingChannelAsMemberChannel (channel) || channel == getMasterChannel();
107 && numMemberChannels ==
other.numMemberChannels
108 && perNotePitchbendRange ==
other.perNotePitchbendRange
109 && masterPitchbendRange ==
other.masterPitchbendRange; }
113 int numMemberChannels;
114 int perNotePitchbendRange;
115 int masterPitchbendRange;
132 void setLowerZone (
int numMemberChannels = 0,
133 int perNotePitchbendRange = 48,
134 int masterPitchbendRange = 2)
noexcept;
137 void setUpperZone (
int numMemberChannels = 0,
138 int perNotePitchbendRange = 48,
139 int masterPitchbendRange = 2)
noexcept;
150 void clearAllZones();
164 void processNextMidiEvent (
const MidiMessage& message);
177 void processNextMidiBuffer (
const MidiBuffer& buffer);
205 Zone lowerZone {
true, 0 };
206 Zone upperZone {
false, 0 };
208 MidiRPNDetector rpnDetector;
209 ListenerList<Listener> listeners;
212 void setZone (
bool,
int,
int,
int)
noexcept;
214 void processRpnMessage (MidiRPNMessage);
215 void processZoneLayoutRpnMessage (MidiRPNMessage);
216 void processPitchbendRangeRpnMessage (MidiRPNMessage);
218 void updateMasterPitchbend (Zone&,
int);
219 void updatePerNotePitchbendRange (Zone&,
int);
221 void sendLayoutChangeMessage();
222 void checkAndLimitZoneParameters (
int,
int,
int&)
noexcept;