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 ensureStorageAllocated(int minNumElements)
ElementType * begin() noexcept
ElementType * end() noexcept
void add(const ElementType &newElement)
virtual void setCurrentSampleRate(double newRate)
MPENote getCurrentlyPlayingNote() const noexcept
virtual void noteStarted()=0
virtual void noteStopped(bool allowTailOff)=0
bool isPlayingButReleased() const noexcept
void removeVoice(int index)
void reduceNumVoices(int newNumVoices)
virtual MPESynthesiserVoice * findFreeVoice(MPENote noteToFindVoiceFor, bool stealIfNoneAvailable) const
void stopVoice(MPESynthesiserVoice *voice, MPENote noteToStop, bool allowTailOff)
void setCurrentPlaybackSampleRate(double newRate) override
void startVoice(MPESynthesiserVoice *voice, MPENote noteToStart)
void notePressureChanged(MPENote changedNote) override
void noteReleased(MPENote finishedNote) override
void addVoice(MPESynthesiserVoice *newVoice)
~MPESynthesiser() override
virtual MPESynthesiserVoice * findVoiceToSteal(MPENote noteToStealVoiceFor=MPENote()) const
void noteTimbreChanged(MPENote changedNote) override
void noteAdded(MPENote newNote) override
MPESynthesiserVoice * getVoice(int index) const
void noteKeyStateChanged(MPENote changedNote) override
virtual void turnOffAllVoices(bool allowTailOff)
virtual void handleProgramChange(int, int)
void renderNextSubBlock(AudioBuffer< float > &outputAudio, int startSample, int numSamples) override
void notePitchbendChanged(MPENote changedNote) override
void handleMidiEvent(const MidiMessage &) override
virtual void handleController(int, int, int)
void setLowerZone(int numMemberChannels=0, int perNotePitchbendRange=48, int masterPitchbendRange=2) noexcept
int getChannel() const noexcept
bool isProgramChange() const noexcept
bool isController() const noexcept
int getControllerNumber() const noexcept
int getProgramChangeNumber() const noexcept
int getControllerValue() const noexcept
bool isValid() const noexcept
virtual void handleMidiEvent(const MidiMessage &)
void setZoneLayout(MPEZoneLayout newLayout)
std::unique_ptr< MPEInstrument > instrument
virtual void setCurrentPlaybackSampleRate(double sampleRate)
double getSampleRate() const noexcept