Here’s the renderNextBlock. I keep hearing weird noises all over the place after adding the reverb. I declared a juce::Reverb in .h file, and then in prepare method added the default reverb parameters, everything else seems to be working, up until I process the outputBuffer with the reverb. What am I doin wrong?
void SynthVoice::renderNextBlock ( juce::AudioBuffer &outputBuffer,
int startSample,
int numSamples){
//Apply ADSR Envelope Changes
mAdsrParams.attack = *audioProcessor.apvts.getRawParameterValue("ATTACK");
mAdsrParams.decay = *audioProcessor.apvts.getRawParameterValue("DECAY");
mAdsrParams.sustain = *audioProcessor.apvts.getRawParameterValue("SUSTAIN");
mAdsrParams.release = *audioProcessor.apvts.getRawParameterValue("RELEASE");
mAdsr.setParameters(mAdsrParams);
//Apply Filter Cutoff and Resonance Changes
mFilter.setCutoffFrequency(*audioProcessor.apvts.getRawParameterValue("CUTOFF"));
mFilter.setResonance(*audioProcessor.apvts.getRawParameterValue("RESONANCE"));
//Compresser Update Parameters
mCompressor.setRatio(*audioProcessor.apvts.getRawParameterValue("COMPRATIO"));
mCompressor.setThreshold(*audioProcessor.apvts.getRawParameterValue("COMPTHRESH"));
mCompressor.setAttack(*audioProcessor.apvts.getRawParameterValue("COMPATTACK"));
mCompressor.setRelease(*audioProcessor.apvts.getRawParameterValue("COMPRELEASE"));
//Process the signal buffer
if (angleDelta != 0.0f){
if (tailOff > 0.0f){
while (--numSamples >= 0){
//auto currentSample = (float) (processedOscillatorSample(std::sin (currentAngle)) * level * tailOff);
auto currentSample = (float) processedOscillatorSample(level * tailOff * std::cos(currentAngle));
for (auto i = outputBuffer.getNumChannels(); --i >= 0;){
auto sampleAfterEnvelopeAndGain = currentSample * (mAdsr.getNextSample() * (*audioProcessor.apvts.getRawParameterValue("GAIN")));
auto filteredSample = mFilter.processSample(i,sampleAfterEnvelopeAndGain);
auto compressedSample = mCompressor.processSample(i,filteredSample);
outputBuffer.addSample (i, startSample, compressedSample);
}
currentAngle += angleDelta;
++startSample;
tailOff *= 1.0f;
if (tailOff <= 0.005f){
clearCurrentNote();
angleDelta = 0.0f;
break;
}
}
}
else{
while (--numSamples >= 0){
auto currentSample = (float) processedOscillatorSample(level * std::cos(currentAngle));
for (auto i = outputBuffer.getNumChannels(); --i >= 0;){
auto sampleAfterEnvelopeAndGain = currentSample * (mAdsr.getNextSample() * (*audioProcessor.apvts.getRawParameterValue("GAIN")));
auto filteredSample = mFilter.processSample(i,sampleAfterEnvelopeAndGain);
auto compressedSample = mCompressor.processSample(i,filteredSample * *audioProcessor.apvts.getRawParameterValue("GAIN"));
outputBuffer.addSample (i, startSample, compressedSample);
}
currentAngle += angleDelta;
++startSample;
}
}
mReverb.processStereo(outputBuffer.getWritePointer(0),outputBuffer.getWritePointer(1), outputBuffer.getNumSamples());
}
`
Hey if anybody reads this and ends up in a similar situation, I figured out that the problem was that I was trying to process the reverb on each individual voice’s renderNextBlock buffer, instead I was supposed to process the reverb on the processBlock buffer of the PluginProcessor.cpp instead. So I just removed the reverb from the SynthVoice class altogether, and defined it within the PluginProcessor class instead. Hope that helps someone.