44 jassert (voice !=
nullptr);
46 voice->currentlyPlayingNote = noteToStart;
53 jassert (voice !=
nullptr);
55 voice->currentlyPlayingNote = noteToStop;
72 for (
auto* voice : voices)
74 if (voice->isCurrentlyPlayingNote (changedNote))
76 voice->currentlyPlayingNote = changedNote;
77 voice->notePressureChanged();
86 for (
auto* voice : voices)
88 if (voice->isCurrentlyPlayingNote (changedNote))
90 voice->currentlyPlayingNote = changedNote;
91 voice->notePitchbendChanged();
100 for (
auto* voice : voices)
102 if (voice->isCurrentlyPlayingNote (changedNote))
104 voice->currentlyPlayingNote = changedNote;
105 voice->noteTimbreChanged();
114 for (
auto* voice : voices)
116 if (voice->isCurrentlyPlayingNote (changedNote))
118 voice->currentlyPlayingNote = changedNote;
119 voice->noteKeyStateChanged();
128 for (
auto i = voices.size(); --i >= 0;)
130 auto* voice = voices.getUnchecked (i);
132 if (voice->isCurrentlyPlayingNote(finishedNote))
145 for (
auto i = voices.size(); --i >= 0;)
146 voices.getUnchecked (i)->setCurrentSampleRate (newRate);
163 for (
auto* voice : voices)
165 if (! voice->isActive())
169 if (stealIfNoneAvailable)
183 jassert (voices.size() > 0);
193 for (
auto* voice : voices)
195 jassert (voice->isActive());
197 usableVoices.
add (voice);
206 std::sort (usableVoices.
begin(), usableVoices.
end(), Sorter());
208 if (! voice->isPlayingButReleased())
210 auto noteNumber = voice->getCurrentlyPlayingNote().initialNote;
212 if (low ==
nullptr || noteNumber < low->getCurrentlyPlayingNote().initialNote)
226 if (noteToStealVoiceFor.
isValid())
227 for (
auto* voice : usableVoices)
228 if (voice->getCurrentlyPlayingNote().initialNote == noteToStealVoiceFor.
initialNote)
232 for (
auto* voice : usableVoices)
237 for (
auto* voice : usableVoices)
238 if (voice != low && voice != top
244 for (
auto* voice : usableVoices)
245 if (voice != low && voice != top)
249 jassert (low !=
nullptr);
263 voices.add (newVoice);
275 return voices [index];
281 voices.remove (index);
287 jassert (newNumVoices >= 0);
291 while (voices.size() > newNumVoices)
294 voices.removeObject (voice);
307 for (
auto* voice : voices)
308 voice->noteStopped (allowTailOff);
320 for (
auto* voice : voices)
322 if (voice->isActive())
323 voice->renderNextBlock (buffer, startSample, numSamples);
331 for (
auto* voice : voices)
333 if (voice->isActive())
334 voice->renderNextBlock (buffer, startSample, numSamples);
void noteReleased(MPENote finishedNote) override
void stopVoice(MPESynthesiserVoice *voice, MPENote noteToStop, bool allowTailOff)
void setZoneLayout(MPEZoneLayout newLayout)
ElementType * end() noexcept
void setCurrentPlaybackSampleRate(double newRate) override
virtual MPESynthesiserVoice * findFreeVoice(MPENote noteToFindVoiceFor, bool stealIfNoneAvailable) const
virtual void setCurrentSampleRate(double newRate)
void ensureStorageAllocated(int minNumElements)
void add(const ElementType &newElement)
virtual void handleMidiEvent(const MidiMessage &)
void removeVoice(int index)
bool isPlayingButReleased() const noexcept
void startVoice(MPESynthesiserVoice *voice, MPENote noteToStart)
bool isValid() const noexcept
virtual void turnOffAllVoices(bool allowTailOff)
void noteTimbreChanged(MPENote changedNote) override
void notePitchbendChanged(MPENote changedNote) override
void reduceNumVoices(int newNumVoices)
std::unique_ptr< MPEInstrument > instrument
bool isProgramChange() const noexcept
void noteAdded(MPENote newNote) override
ElementType * begin() noexcept
int getControllerNumber() const noexcept
int getChannel() const noexcept
bool isController() const noexcept
virtual void noteStopped(bool allowTailOff)=0
void noteKeyStateChanged(MPENote changedNote) override
int getProgramChangeNumber() const noexcept
MPESynthesiserVoice * getVoice(int index) const
virtual void noteStarted()=0
virtual void setCurrentPlaybackSampleRate(double sampleRate)
MPENote getCurrentlyPlayingNote() const noexcept
virtual void handleController(int, int, int)
double getSampleRate() const noexcept
void handleMidiEvent(const MidiMessage &) override
virtual void handleProgramChange(int, int)
int getControllerValue() const noexcept
~MPESynthesiser() override
void notePressureChanged(MPENote changedNote) override
void renderNextSubBlock(AudioBuffer< float > &outputAudio, int startSample, int numSamples) override
void addVoice(MPESynthesiserVoice *newVoice)
virtual MPESynthesiserVoice * findVoiceToSteal(MPENote noteToStealVoiceFor=MPENote()) const
void setLowerZone(int numMemberChannels=0, int perNotePitchbendRange=48, int masterPitchbendRange=2) noexcept