Loading...
Searching...
No Matches
juce::MPEInstrument Class Reference

## Detailed Description

This class represents an instrument handling MPE.

It has an MPE zone layout and maintains a state of currently active (playing) notes and the values of their dimensions of expression.

You can trigger and modulate notes:

- by passing MIDI messages with the method processNextMidiEvent;
- by directly calling the methods noteOn, noteOff etc.

The class implements the channel and note management logic specified in MPE. If you pass it a message, it will know what notes on what channels (if any) should be affected by that message.

The class has a Listener class that can be used to react to note and state changes and trigger some functionality for your application. For example, you can use this class to write an MPE visualiser.

If you want to write a real-time audio synth with MPE functionality, you should instead use the classes MPESynthesiserBase, which adds the ability to render audio and to manage voices.

See also
  MPENote, MPEZoneLayout, MPESynthesiser

The documentation for this class was generated from the following file:

- juce_audio_basics/mpe/juce_MPEInstrument.h

## Classes

class | Listener
| Derive from this class to be informed about any changes in the MPE notes played by this instrument, and any changes to its zone layout. More...

## Public Types

enum | TrackingMode { lastNotePlayedOnChannel , lowestNoteOnChannel , highestNoteOnChannel , allNotesOnChannel }
| The MPE note tracking mode. More...

## Public Member Functions

| MPEInstrument () noexcept
| Constructor.
| MPEInstrument (MPEZoneLayout layout)
| Constructs an MPE instrument with the specified zone layout.
virtual | ~MPEInstrument ()
| Destructor.
MPEZoneLayout | getZoneLayout () const noexcept
| Returns the current zone layout of the instrument.
void | setZoneLayout (MPEZoneLayout newLayout)
| Re-sets the zone layout of the instrument to the one passed in.
bool | isMemberChannel (int midiChannel) const noexcept
| Returns true if the given MIDI channel (1-16) is a note channel in any of the MPEInstrument's MPE zones; false otherwise.
bool | isMasterChannel (int midiChannel) const noexcept
| Returns true if the given MIDI channel (1-16) is a master channel (channel 1 or 16).
bool | isUsingChannel (int midiChannel) const noexcept
| Returns true if the given MIDI channel (1-16) is used by any of the MPEInstrument's MPE zones; false otherwise.
void | setPressureTrackingMode (TrackingMode modeToUse)
| Set the MPE tracking mode for the pressure dimension.
void | setPitchbendTrackingMode (TrackingMode modeToUse)
| Set the MPE tracking mode for the pitchbend dimension.
void | setTimbreTrackingMode (TrackingMode modeToUse)
| Set the MPE tracking mode for the timbre dimension.
virtual void | processNextMidiEvent (const MidiMessage &message)
| Process a MIDI message and trigger the appropriate method calls (noteOn, noteOff etc.).
virtual void | noteOn (int midiChannel, int midiNoteNumber, MPEValue midiNoteOnVelocity)
| Request a note-on on the given channel, with the given initial note number and velocity.
virtual void | noteOff (int midiChannel, int midiNoteNumber, MPEValue midiNoteOffVelocity)
| Request a note-off.
virtual void | pitchbend (int midiChannel, MPEValue pitchbend)
| Request a pitchbend on the given channel with the given value (in units of MIDI pitchwheel position).
virtual void | pressure (int midiChannel, MPEValue value)
| Request a pressure change on the given channel with the given value.
virtual void | timbre (int midiChannel, MPEValue value)
| Request a third dimension (timbre) change on the given channel with the given value.
virtual void | polyAftertouch (int midiChannel, int midiNoteNumber, MPEValue value)
| Request a poly-aftertouch change for a given note number.
virtual void | sustainPedal (int midiChannel, bool isDown)
| Request a sustain pedal press or release.
virtual void | sostenutoPedal (int midiChannel, bool isDown)
| Request a sostenuto pedal press or release.
void | releaseAllNotes ()
| Discard all currently playing notes.
int | getNumPlayingNotes () const noexcept
| Returns the number of MPE notes currently played by the instrument.
MPENote | getNote (int index) const noexcept
| Returns the note at the given index.
MPENote | getNote (int midiChannel, int midiNoteNumber) const noexcept
| Returns the note currently playing on the given midiChannel with the specified initial MIDI note number, if there is such a note.
MPENote | getNoteWithID (uint16 noteID) const noexcept
| Returns the note with a given ID.
MPENote | getMostRecentNote (int midiChannel) const noexcept
| Returns the most recent note that is playing on the given midiChannel (this will be the note which has received the most recent note-on without a corresponding note-off), if there is such a note.
MPENote | getMostRecentNoteOtherThan (MPENote otherThanThisNote) const noexcept
| Returns the most recent note that is not the note passed in.
void | addListener (Listener *listenerToAdd)
| Adds a listener.
void | removeListener (Listener *listenerToRemove)
| Removes a listener.
void | enableLegacyMode (int pitchbendRange=2, Range< int > channelRange=Range< int >(1, 17))
| Puts the instrument into legacy mode.
bool | isLegacyModeEnabled () const noexcept
| Returns true if the instrument is in legacy mode, false otherwise.
Range< int > | getLegacyModeChannelRange () const noexcept
| Returns the range of MIDI channels (1-16) to be used for notes when in legacy mode.
void | setLegacyModeChannelRange (Range< int > channelRange)
| Re-sets the range of MIDI channels (1-16) to be used for notes when in legacy mode.
int | getLegacyModePitchbendRange () const noexcept
| Returns the pitchbend range in semitones (0-96) to be used for notes when in legacy mode.
void | setLegacyModePitchbendRange (int pitchbendRange)
| Re-sets the pitchbend range in semitones (0-96) to be used for notes when in legacy mode.

## Protected Attributes

CriticalSection | lock

## Member Enums

## TrackingMode

enum juce::MPEInstrument::TrackingMode

The MPE note tracking mode.

In case there is more than one note playing simultaneously on the same MIDI channel, this determines which of these notes will be modulated by an incoming MPE message on that channel (pressure, pitchbend, or timbre).

The default is lastNotePlayedOnChannel.

Enumerator
lastNotePlayedOnChannel | The most recent note on the channel that is still played (key down and/or sustained).
lowestNoteOnChannel | The lowest note (by initialNote) on the channel with the note key still down.
highestNoteOnChannel | The highest note (by initialNote) on the channel with the note key still down.
allNotesOnChannel | All notes on the channel (key down and/or sustained).

## Constructors and Destructors

## MPEInstrument() [1/2]

juce::MPEInstrument::MPEInstrument | ( |  | ) |

noexcept

Constructor.

This will construct an MPE instrument with inactive lower and upper zones.

In order to process incoming MIDI messages call setZoneLayout, use the MPEZoneLayout constructor, define the layout via MIDI RPN messages, or set the instrument to legacy mode.

Referenced by MPEInstrument(), and ~MPEInstrument().

## MPEInstrument() [2/2]

juce::MPEInstrument::MPEInstrument | ( | MPEZoneLayout | layout | ) |

Constructs an MPE instrument with the specified zone layout.

References MPEInstrument().

## ~MPEInstrument()

virtual juce::MPEInstrument::~MPEInstrument | ( |  | ) |

virtual

Destructor.

References MPEInstrument().

## Member Functions

## getZoneLayout()

MPEZoneLayout juce::MPEInstrument::getZoneLayout | ( |  | ) | const

noexcept

Returns the current zone layout of the instrument.

This happens by value, to enforce thread-safety and class invariants.

Note: If the instrument is in legacy mode, the return value of this method is unspecified.

References getZoneLayout().

Referenced by getZoneLayout().

## setZoneLayout()

void juce::MPEInstrument::setZoneLayout | ( | MPEZoneLayout | newLayout | ) |

Re-sets the zone layout of the instrument to the one passed in.

As a side effect, this will discard all currently playing notes, and call noteReleased for all of them.

This will also disable legacy mode in case it was enabled previously.

References setZoneLayout().

Referenced by setZoneLayout().

## isMemberChannel()

bool juce::MPEInstrument::isMemberChannel | ( | int | midiChannel | ) | const

noexcept

Returns true if the given MIDI channel (1-16) is a note channel in any of the MPEInstrument's MPE zones; false otherwise.

When in legacy mode, this will return true if the given channel is contained in the current legacy mode channel range; false otherwise.

References isMemberChannel().

Referenced by isMemberChannel().

## isMasterChannel()

bool juce::MPEInstrument::isMasterChannel | ( | int | midiChannel | ) | const

noexcept

Returns true if the given MIDI channel (1-16) is a master channel (channel 1 or 16).

In legacy mode, this will always return false.

References isMasterChannel().

Referenced by isMasterChannel().

## isUsingChannel()

bool juce::MPEInstrument::isUsingChannel | ( | int | midiChannel | ) | const

noexcept

Returns true if the given MIDI channel (1-16) is used by any of the MPEInstrument's MPE zones; false otherwise.

When in legacy mode, this will return true if the given channel is contained in the current legacy mode channel range; false otherwise.

References isUsingChannel().

Referenced by isUsingChannel().

## setPressureTrackingMode()

void juce::MPEInstrument::setPressureTrackingMode | ( | TrackingMode | modeToUse | ) |

Set the MPE tracking mode for the pressure dimension.

## setPitchbendTrackingMode()

void juce::MPEInstrument::setPitchbendTrackingMode | ( | TrackingMode | modeToUse | ) |

Set the MPE tracking mode for the pitchbend dimension.

## setTimbreTrackingMode()

void juce::MPEInstrument::setTimbreTrackingMode | ( | TrackingMode | modeToUse | ) |

Set the MPE tracking mode for the timbre dimension.

## processNextMidiEvent()

virtual void juce::MPEInstrument::processNextMidiEvent | ( | const MidiMessage & | message | ) |

virtual

Process a MIDI message and trigger the appropriate method calls (noteOn, noteOff etc.).

You can override this method if you need some special MIDI message treatment on top of the standard MPE logic implemented here.

## noteOn()

virtual void juce::MPEInstrument::noteOn | ( | int | midiChannel,
|  | int | midiNoteNumber,
|  | MPEValue | midiNoteOnVelocity )

virtual

Request a note-on on the given channel, with the given initial note number and velocity.

If the message arrives on a valid note channel, this will create a new MPENote and call the noteAdded callback.

## noteOff()

virtual void juce::MPEInstrument::noteOff | ( | int | midiChannel,
|  | int | midiNoteNumber,
|  | MPEValue | midiNoteOffVelocity )

virtual

Request a note-off.

If there is a matching playing note, this will release the note (except if it is sustained by a sustain or sostenuto pedal) and call the noteReleased callback.

## pitchbend()

virtual void juce::MPEInstrument::pitchbend | ( | int | midiChannel,
|  | MPEValue | pitchbend )

virtual

Request a pitchbend on the given channel with the given value (in units of MIDI pitchwheel position).

Internally, this will determine whether the pitchwheel move is a per-note pitchbend or a master pitchbend (depending on midiChannel), take the correct per-note or master pitchbend range of the affected MPE zone, and apply the resulting pitchbend to the affected note(s) (if any).

References pitchbend().

Referenced by pitchbend().

## pressure()

virtual void juce::MPEInstrument::pressure | ( | int | midiChannel,
|  | MPEValue | value )

virtual

Request a pressure change on the given channel with the given value.

This will modify the pressure dimension of the note currently held down on this channel (if any). If the channel is a zone master channel, the pressure change will be broadcast to all notes in this zone.

## timbre()

virtual void juce::MPEInstrument::timbre | ( | int | midiChannel,
|  | MPEValue | value )

virtual

Request a third dimension (timbre) change on the given channel with the given value.

This will modify the timbre dimension of the note currently held down on this channel (if any). If the channel is a zone master channel, the timbre change will be broadcast to all notes in this zone.

## polyAftertouch()

virtual void juce::MPEInstrument::polyAftertouch | ( | int | midiChannel,
|  | int | midiNoteNumber,
|  | MPEValue | value )

virtual

Request a poly-aftertouch change for a given note number.

The change will be broadcast to all notes sharing the channel and note number of the change message.

## sustainPedal()

virtual void juce::MPEInstrument::sustainPedal | ( | int | midiChannel,
|  | bool | isDown )

virtual

Request a sustain pedal press or release.

If midiChannel is a zone's master channel, this will act on all notes in that zone; otherwise, nothing will happen.

## sostenutoPedal()

virtual void juce::MPEInstrument::sostenutoPedal | ( | int | midiChannel,
|  | bool | isDown )

virtual

Request a sostenuto pedal press or release.

If midiChannel is a zone's master channel, this will act on all notes in that zone; otherwise, nothing will happen.

## releaseAllNotes()

void juce::MPEInstrument::releaseAllNotes | ( |  | ) |

Discard all currently playing notes.

This will also call the noteReleased listener callback for all of them.

## getNumPlayingNotes()

int juce::MPEInstrument::getNumPlayingNotes | ( |  | ) | const

noexcept

Returns the number of MPE notes currently played by the instrument.

## getNote() [1/2]

MPENote juce::MPEInstrument::getNote | ( | int | index | ) | const

noexcept

Returns the note at the given index.

If there is no such note, returns an invalid MPENote. The notes are sorted such that the most recently added note is the last element.

References getNote().

Referenced by getNote(), and getNote().

## getNote() [2/2]

MPENote juce::MPEInstrument::getNote | ( | int | midiChannel,
|  | int | midiNoteNumber ) const

noexcept

Returns the note currently playing on the given midiChannel with the specified initial MIDI note number, if there is such a note.

Otherwise, this returns an invalid MPENote (check with note.isValid() before use!)

References getNote().

## getNoteWithID()

MPENote juce::MPEInstrument::getNoteWithID | ( | uint16 | noteID | ) | const

noexcept

Returns the note with a given ID.

References getNoteWithID().

Referenced by getNoteWithID().

## getMostRecentNote()

MPENote juce::MPEInstrument::getMostRecentNote | ( | int | midiChannel | ) | const

noexcept

Returns the most recent note that is playing on the given midiChannel (this will be the note which has received the most recent note-on without a corresponding note-off), if there is such a note.

Otherwise, this returns an invalid MPENote (check with note.isValid() before use!)

References getMostRecentNote().

Referenced by getMostRecentNote().

## getMostRecentNoteOtherThan()

MPENote juce::MPEInstrument::getMostRecentNoteOtherThan | ( | MPENote | otherThanThisNote | ) | const

noexcept

Returns the most recent note that is not the note passed in.

If there is no such note, this returns an invalid MPENote (check with note.isValid() before use!).

This helper method might be useful for some custom voice handling algorithms.

References getMostRecentNoteOtherThan().

Referenced by getMostRecentNoteOtherThan().

## addListener()

void juce::MPEInstrument::addListener | ( | Listener * | listenerToAdd | ) |

Adds a listener.

## removeListener()

void juce::MPEInstrument::removeListener | ( | Listener * | listenerToRemove | ) |

Removes a listener.

## enableLegacyMode()

void juce::MPEInstrument::enableLegacyMode | ( | int | pitchbendRange = 2,
|  | Range< int > | channelRange = Range< int >(1, 17) )

Puts the instrument into legacy mode.

If legacy mode is already enabled this method does nothing.

As a side effect, this will discard all currently playing notes, and call noteReleased for all of them.

This special zone layout mode is for backwards compatibility with non-MPE MIDI devices. In this mode, the instrument will ignore the current MPE zone layout. It will instead take a range of MIDI channels (default: all channels 1-16) and treat them as note channels, with no master channel. MIDI channels outside of this range will be ignored.

Parameters

  pitchbendRange | The note pitchbend range in semitones to use when in legacy mode. Must be between 0 and 96, otherwise behaviour is undefined. The default pitchbend range in legacy mode is +/- 2 semitones.
  channelRange | The range of MIDI channels to use for notes when in legacy mode. The default is to use all MIDI channels (1-16).

To get out of legacy mode, set a new MPE zone layout using setZoneLayout.

## isLegacyModeEnabled()

bool juce::MPEInstrument::isLegacyModeEnabled | ( |  | ) | const

noexcept

Returns true if the instrument is in legacy mode, false otherwise.

## getLegacyModeChannelRange()

Range< int > juce::MPEInstrument::getLegacyModeChannelRange | ( |  | ) | const

noexcept

Returns the range of MIDI channels (1-16) to be used for notes when in legacy mode.

References getLegacyModeChannelRange().

Referenced by getLegacyModeChannelRange().

## setLegacyModeChannelRange()

void juce::MPEInstrument::setLegacyModeChannelRange | ( | Range< int > | channelRange | ) |

Re-sets the range of MIDI channels (1-16) to be used for notes when in legacy mode.

References setLegacyModeChannelRange().

Referenced by setLegacyModeChannelRange().

## getLegacyModePitchbendRange()

int juce::MPEInstrument::getLegacyModePitchbendRange | ( |  | ) | const

noexcept

Returns the pitchbend range in semitones (0-96) to be used for notes when in legacy mode.

References getLegacyModePitchbendRange().

Referenced by getLegacyModePitchbendRange().

## setLegacyModePitchbendRange()

void juce::MPEInstrument::setLegacyModePitchbendRange | ( | int | pitchbendRange | ) |

Re-sets the pitchbend range in semitones (0-96) to be used for notes when in legacy mode.

References setLegacyModePitchbendRange().

Referenced by setLegacyModePitchbendRange().

## Member Data Documentation

## lock

CriticalSection juce::MPEInstrument::lock

protected

### Purchase

Get JUCE

### Discover

What's New in JUCE Features

### Learn

Documentaion Tutorials Made with JUCE Resources

### Support

JUCE Forum Newsletter Archive

### About

Contact Us JUCE Legal JUCE Licensing FAQ

### Events

Audio Developer Conference
© Raw Material Software Limited