OpenShot Audio Library | OpenShotAudio 0.4.0
Loading...
Searching...
No Matches
juce_MPEInstrument.h
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 The code included in this file is provided under the terms of the ISC license
11 http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12 To use, copy, modify, and/or distribute this software for any purpose with or
13 without fee is hereby granted provided that the above copyright notice and
14 this permission notice appear in all copies.
15
16 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18 DISCLAIMED.
19
20 ==============================================================================
21*/
22
23namespace juce
24{
25
26//==============================================================================
53class JUCE_API MPEInstrument
54{
55public:
63 MPEInstrument() noexcept;
64
67
69 virtual ~MPEInstrument();
70
71 //==============================================================================
78 MPEZoneLayout getZoneLayout() const noexcept;
79
86 void setZoneLayout (MPEZoneLayout newLayout);
87
94 bool isMemberChannel (int midiChannel) const noexcept;
95
101 bool isMasterChannel (int midiChannel) const noexcept;
102
109 bool isUsingChannel (int midiChannel) const noexcept;
110
111 //==============================================================================
126
128 void setPressureTrackingMode (TrackingMode modeToUse);
129
131 void setPitchbendTrackingMode (TrackingMode modeToUse);
132
134 void setTimbreTrackingMode (TrackingMode modeToUse);
135
136 //==============================================================================
143 virtual void processNextMidiEvent (const MidiMessage& message);
144
145 //==============================================================================
152 virtual void noteOn (int midiChannel, int midiNoteNumber, MPEValue midiNoteOnVelocity);
153
160 virtual void noteOff (int midiChannel, int midiNoteNumber, MPEValue midiNoteOffVelocity);
161
170 virtual void pitchbend (int midiChannel, MPEValue pitchbend);
171
178 virtual void pressure (int midiChannel, MPEValue value);
179
187 virtual void timbre (int midiChannel, MPEValue value);
188
194 virtual void polyAftertouch (int midiChannel, int midiNoteNumber, MPEValue value);
195
201 virtual void sustainPedal (int midiChannel, bool isDown);
202
208 virtual void sostenutoPedal (int midiChannel, bool isDown);
209
214 void releaseAllNotes();
215
216 //==============================================================================
218 int getNumPlayingNotes() const noexcept;
219
225 MPENote getNote (int index) const noexcept;
226
231 MPENote getNote (int midiChannel, int midiNoteNumber) const noexcept;
232
234 MPENote getNoteWithID (uint16 noteID) const noexcept;
235
241 MPENote getMostRecentNote (int midiChannel) const noexcept;
242
248 MPENote getMostRecentNoteOtherThan (MPENote otherThanThisNote) const noexcept;
249
250 //==============================================================================
259 class JUCE_API Listener
260 {
261 public:
263 virtual ~Listener() = default;
264
268 virtual void noteAdded (MPENote newNote);
269
273 virtual void notePressureChanged (MPENote changedNote);
274
282 virtual void notePitchbendChanged (MPENote changedNote);
283
287 virtual void noteTimbreChanged (MPENote changedNote);
288
296 virtual void noteKeyStateChanged (MPENote changedNote);
297
303 virtual void noteReleased (MPENote finishedNote);
304
308 virtual void zoneLayoutChanged();
309 };
310
311 //==============================================================================
313 void addListener (Listener* listenerToAdd);
314
316 void removeListener (Listener* listenerToRemove);
317
318 //==============================================================================
340 void enableLegacyMode (int pitchbendRange = 2,
341 Range<int> channelRange = Range<int> (1, 17));
342
344 bool isLegacyModeEnabled() const noexcept;
345
347 Range<int> getLegacyModeChannelRange() const noexcept;
348
350 void setLegacyModeChannelRange (Range<int> channelRange);
351
353 int getLegacyModePitchbendRange() const noexcept;
354
356 void setLegacyModePitchbendRange (int pitchbendRange);
357
358protected:
359 //==============================================================================
360 CriticalSection lock;
361
362private:
363 //==============================================================================
364 Array<MPENote> notes;
365 MPEZoneLayout zoneLayout;
366 ListenerList<Listener> listeners;
367
368 uint8 lastPressureLowerBitReceivedOnChannel[16];
369 uint8 lastTimbreLowerBitReceivedOnChannel[16];
370 bool isMemberChannelSustained[16];
371
372 struct LegacyMode
373 {
374 bool isEnabled = false;
375 Range<int> channelRange;
376 int pitchbendRange = 2;
377 };
378
379 struct MPEDimension
380 {
381 TrackingMode trackingMode = lastNotePlayedOnChannel;
382 MPEValue lastValueReceivedOnChannel[16];
383 MPEValue MPENote::* value;
384 MPEValue& getValue (MPENote& note) noexcept { return note.*(value); }
385 };
386
387 LegacyMode legacyMode;
388 MPEDimension pitchbendDimension, pressureDimension, timbreDimension;
389
390 void resetLastReceivedValues();
391
392 void updateDimension (int midiChannel, MPEDimension&, MPEValue);
393 void updateDimensionMaster (bool, MPEDimension&, MPEValue);
394 void updateDimensionForNote (MPENote&, MPEDimension&, MPEValue);
395 void callListenersDimensionChanged (const MPENote&, const MPEDimension&);
396 MPEValue getInitialValueForNewNote (int midiChannel, MPEDimension&) const;
397
398 void processMidiNoteOnMessage (const MidiMessage&);
399 void processMidiNoteOffMessage (const MidiMessage&);
400 void processMidiPitchWheelMessage (const MidiMessage&);
401 void processMidiChannelPressureMessage (const MidiMessage&);
402 void processMidiControllerMessage (const MidiMessage&);
403 void processMidiResetAllControllersMessage (const MidiMessage&);
404 void processMidiAfterTouchMessage (const MidiMessage&);
405 void handlePressureMSB (int midiChannel, int value) noexcept;
406 void handlePressureLSB (int midiChannel, int value) noexcept;
407 void handleTimbreMSB (int midiChannel, int value) noexcept;
408 void handleTimbreLSB (int midiChannel, int value) noexcept;
409 void handleSustainOrSostenuto (int midiChannel, bool isDown, bool isSostenuto);
410
411 const MPENote* getNotePtr (int midiChannel, int midiNoteNumber) const noexcept;
412 MPENote* getNotePtr (int midiChannel, int midiNoteNumber) noexcept;
413 const MPENote* getNotePtr (int midiChannel, TrackingMode) const noexcept;
414 MPENote* getNotePtr (int midiChannel, TrackingMode) noexcept;
415 const MPENote* getLastNotePlayedPtr (int midiChannel) const noexcept;
416 MPENote* getLastNotePlayedPtr (int midiChannel) noexcept;
417 const MPENote* getHighestNotePtr (int midiChannel) const noexcept;
418 MPENote* getHighestNotePtr (int midiChannel) noexcept;
419 const MPENote* getLowestNotePtr (int midiChannel) const noexcept;
420 MPENote* getLowestNotePtr (int midiChannel) noexcept;
421 void updateNoteTotalPitchbend (MPENote&);
422
423 JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MPEInstrument)
424};
425
426} // namespace juce
virtual void noteAdded(MPENote newNote)
virtual void noteReleased(MPENote finishedNote)
virtual void noteKeyStateChanged(MPENote changedNote)
virtual void notePitchbendChanged(MPENote changedNote)
virtual void notePressureChanged(MPENote changedNote)
virtual void noteTimbreChanged(MPENote changedNote)
virtual ~Listener()=default
void setLegacyModeChannelRange(Range< int > channelRange)
MPEZoneLayout getZoneLayout() const noexcept
bool isMemberChannel(int midiChannel) const noexcept
virtual ~MPEInstrument()
void enableLegacyMode(int pitchbendRange=2, Range< int > channelRange=Range< int >(1, 17))
void setZoneLayout(MPEZoneLayout newLayout)
void setLegacyModePitchbendRange(int pitchbendRange)
bool isLegacyModeEnabled() const noexcept
void addListener(Listener *listenerToAdd)
void removeListener(Listener *listenerToRemove)
Range< int > getLegacyModeChannelRange() const noexcept
int getLegacyModePitchbendRange() const noexcept
bool isMasterChannel(int midiChannel) const noexcept
bool isUsingChannel(int midiChannel) const noexcept