/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2017 - ROLI Ltd. JUCE is an open source library subject to commercial or open-source licensing. The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission To use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted provided that the above copyright notice and this permission notice appear in all copies. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ namespace juce { //============================================================================== /** This struct represents an MPE Zone. An MPE Zone occupies one master MIDI channel and an arbitrary number of note channels that immediately follow the master channel. It also defines a pitchbend range (in semitones) to be applied for per-note pitchbends and master pitchbends, respectively. @see MPEZoneLayout */ struct JUCE_API MPEZone { /** Constructor. Creates an MPE zone with the given master channel and number of note channels. @param masterChannel The master MIDI channel of the new zone. All master (not per-note) messages should be send to this channel. Must be between 1 and 15. Otherwise, the behaviour is undefined. @param numNoteChannels The number of note channels that the new zone should use. The first note channel will be one higher than the master channel. The number of note channels must be at least 1 and no greater than 16 - masterChannel. Otherwise, the behaviour is undefined. @param perNotePitchbendRange The per-note pitchbend range in semitones of the new zone. Must be between 0 and 96. Otherwise the behaviour is undefined. If unspecified, the default setting of +/- 48 semitones will be used. @param masterPitchbendRange The master pitchbend range in semitones of the new zone. Must be between 0 and 96. Otherwise the behaviour is undefined. If unspecified, the default setting of +/- 2 semitones will be used. */ MPEZone (int masterChannel, int numNoteChannels, int perNotePitchbendRange = 48, int masterPitchbendRange = 2) noexcept; /* Returns the MIDI master channel number (in the range 1-16) of this zone. */ int getMasterChannel() const noexcept; /** Returns the number of note channels occupied by this zone. */ int getNumNoteChannels() const noexcept; /* Returns the MIDI channel number (in the range 1-16) of the lowest-numbered note channel of this zone. */ int getFirstNoteChannel() const noexcept; /* Returns the MIDI channel number (in the range 1-16) of the highest-numbered note channel of this zone. */ int getLastNoteChannel() const noexcept; /** Returns the MIDI channel numbers (in the range 1-16) of the note channels of this zone as a Range. */ Range getNoteChannelRange() const noexcept; /** Returns true if the MIDI channel (in the range 1-16) is used by this zone either as a note channel or as the master channel; false otherwise. */ bool isUsingChannel (int channel) const noexcept; /** Returns true if the MIDI channel (in the range 1-16) is used by this zone as a note channel; false otherwise. */ bool isUsingChannelAsNoteChannel (int channel) const noexcept; /** Returns the per-note pitchbend range in semitones set for this zone. */ int getPerNotePitchbendRange() const noexcept; /** Returns the master pitchbend range in semitones set for this zone. */ int getMasterPitchbendRange() const noexcept; /** Sets the per-note pitchbend range in semitones for this zone. */ void setPerNotePitchbendRange (int rangeInSemitones) noexcept; /** Sets the master pitchbend range in semitones for this zone. */ void setMasterPitchbendRange (int rangeInSemitones) noexcept; /** Returns true if the MIDI channels occupied by this zone overlap with those occupied by the other zone. */ bool overlapsWith (MPEZone other) const noexcept; /** Tries to truncate this zone in such a way that the range of MIDI channels it occupies do not overlap with the other zone, by reducing this zone's number of note channels. @returns true if the truncation succeeded or if no truncation is necessary because the zones do not overlap. False if the zone cannot be truncated in a way that would remove the overlap (in this case you need to delete the zone to remove the overlap). */ bool truncateToFit (MPEZone zoneToAvoid) noexcept; /** @returns true if this zone is equal to the one passed in. */ bool operator== (const MPEZone& other) const noexcept; /** @returns true if this zone is not equal to the one passed in. */ bool operator!= (const MPEZone& other) const noexcept; private: //============================================================================== int masterChannel; int numNoteChannels; int perNotePitchbendRange; int masterPitchbendRange; }; } // namespace juce