24 for (
auto p : processors)
67 ioBuffer.getNumChannels();
72 auto ioBufferPtrsArray = ioBuffer.getArrayOfWritePointers();
75 AudioBuffer<float> tempBuf{tempBufferPtrsArray, workingChannels, startSample, numSamples};
85 for (
int j = 0; j < workingChannels; j++)
86 FloatVectorOperations::add(ioBufferPtrsArray[j] + startSample, tempBufferPtrsArray[j] + startSample,
99#ifdef USE_VOICE_DEBUG_PRINTOUT
100 if (isActive_old && !active)
104 if (!isActive_old && active)
108 isActive_old = active;
140 int voicesOffset,
int forceNumVoices,
int numOutputChannels)
142 auto numVoices = forceNumVoices;
154 for (
int i = 0; i < numVoices; i++)
155 addVoice(
new KwidgetSynthVoice(voicesOffset + i, numOutputChannels, {&modulatorGraph, &mainGraph}));
160 renderNextBlock(buffer, midi, 0, buffer.getNumSamples());
165 int numActiveVoices = 0;
166 for (
int i = 0; i < getNumVoices(); i++)
168 auto voice = getVoice(i);
169 if (voice->isVoiceActive())
172 return numActiveVoices;
178 int midiNoteNumber)
const
185 jassert(!voices.isEmpty());
188 SynthesiserVoice* low =
nullptr;
189 SynthesiserVoice* top =
nullptr;
192 Array<SynthesiserVoice*> usableVoices;
193 usableVoices.ensureStorageAllocated(voices.size());
195 for (
auto* voice : voices)
197 if (voice->canPlaySound(soundToPlay))
199 jassert(voice->isVoiceActive());
201 usableVoices.add(voice);
207 bool operator()(
const SynthesiserVoice* a,
const SynthesiserVoice* b)
const noexcept
209 return a->wasStartedBefore(*b);
213 std::sort(usableVoices.begin(), usableVoices.end(), Sorter());
215 if (!voice->isPlayingButReleased())
217 auto note = voice->getCurrentlyPlayingNote();
219 if (low ==
nullptr || note < low->getCurrentlyPlayingNote())
222 if (top ==
nullptr || note > top->getCurrentlyPlayingNote())
236 for (
auto* voice : usableVoices)
237 if (voice->getCurrentlyPlayingNote() == midiNoteNumber)
242 for (
auto* voice : usableVoices)
243 if (voice != low && voice != top && voice->isPlayingButReleased())
247 for (
auto* voice : usableVoices)
248 if (voice != low && voice != top && !voice->isKeyDown())
252 for (
auto* voice : usableVoices)
253 if (voice != low && voice != top)
257 jassert(low !=
nullptr);
268 Synthesiser::noteOff(midiChannel, midiNoteNumber, velocity, allowTailOff);
288 Synthesiser::noteOn(midiChannel, midiNoteNumber, velocity);
Definition AirAbsorptionFilter.cpp:2
static const int MIDI_NOTE_MASK
Definition OscillatorUtils.h:21
static const int MIDI_NOTE_FLAG_NOR
Definition OscillatorUtils.h:25