I’m working on a plugin which adds noise to an audio signal in input. Here is the code I use:
void PluginTest1AudioProcessor::processBlock (AudioBuffer<float>& buffer, MidiBuffer& midiMessages)
{
ScopedNoDenormals noDenormals;
auto totalNumInputChannels = getTotalNumInputChannels();
auto totalNumOutputChannels = getTotalNumOutputChannels();
//Temporary buffer for DSP processing.
juce::AudioBuffer<float> tmpBuffer = *new juce::AudioBuffer<float>(buffer.getNumChannels() ,buffer.getNumSamples());
//resault of randomization
double randRes = rand.nextDouble();
// counter to check if recalculation is nessacary.
double factorCount = 0;
// In case we have more outputs than inputs, this code clears any output
// channels that didn't contain input data, (because these aren't
// guaranteed to be empty - they may contain garbage).
// This is here to avoid people getting screaming feedback
// when they first compile a plugin, but obviously you don't need to keep
// this code if your algorithm always overwrites all the output channels.
for (auto i = totalNumInputChannels; i < totalNumOutputChannels; ++i)
buffer.clear (i, 0, buffer.getNumSamples());
// This is the place where you'd normally do the guts of your plugin's
// audio processing...
// Make sure to reset the state if your inner loop is processing
// the samples and the outer loop is handling the channels.
// Alternatively, you can process the samples with the channels
// interleaved by keeping the same state.
for (int channel = 0; channel < totalNumInputChannels; ++channel)
{
//get channel data
// loop through each sample
for (int sample = 0; sample < buffer.getNumSamples(); sample++)
{
// validate if recalculation is needed
if (factorCount == (int)*treeState.getRawParameterValue(RRF_ID))
{
// get a value for the noise;
randRes = rand.nextDouble();
// set counter back to 0;
factorCount = 0;
}
// apply 0 gating
if (buffer.getSample(channel, sample) == 0.0f && zeroGate)
//the change in amplitude is 0.
staticChange = 0;
else
// add the noise as static
staticChange = ((randRes * 2.0f) - 1.0f) * *treeState.getRawParameterValue(AMT_ID);
//check if dynamicFollow mode is activated
if (dynamicFollow)
// multiply static change by the sample value * DFF
dynamicChange = staticChange + *treeState.getRawParameterValue(DFF_ID) * (staticChange * buffer.getSample(channel, sample) - staticChange);
else
// dynamicchange is equal to the static change value.
dynamicChange = staticChange;
// Add noise sample to the audio buffer
tmpBuffer.addSample(channel, sample, dynamicChange);
//TMP Disabled
//// apply the change value to the sample
//channelData[sample] = buffer.getSample(channel, sample) + dynamicChange;
// increment factor counter
factorCount++;
}
// filter in channel
//updateLowPass();
//lowPass->processSamples(tmpBuffer.getWritePointer(channel), buffer.getNumSamples());
//updateHighPass();
//highPass->processSamples(tmpBuffer.getWritePointer(channel), buffer.getNumSamples());
}
//Add input to the tmpBuffer.
for (int channel = 0; channel < totalNumInputChannels; ++channel)
{
auto* channelData = buffer.getWritePointer(channel);
for (int sample = 0; sample < buffer.getNumSamples(); sample++)
{
channelData[sample] = buffer.getSample(channel, sample) + tmpBuffer.getSample(channel, sample);
}
}
//Set output buffer equal to tmpBuffer.
}
both zeroGate and DynamicFollow are turned on.
As you can see I generate a random value every X amount of samples determined by treeState.getRawParameterValue(RRF_ID)
and then do some dynamic processing to get a dynamicChange
value.
After that I want to filter the noise signal so I add each value to a buffer and filter it. (For debugging I turned off the filters). After filtering I add the filtered noise buffer back to the original buffer.
Whenever i add the plugin to a new track on ableton to test it I get a wierd output. Even if I don’t provide an input signal. Here is an example of the output I get: Glitchy FX 3.zip (194.0 KB)
Turning the sliders for RRF_ID, AMT_ID and DFF_ID doesn’t change the effect.
What is going on here? what am I doing wrong?