Skip to content

Commit

Permalink
Compressor processAudio Adapted for Level Tracking I/O
Browse files Browse the repository at this point in the history
  • Loading branch information
RachelMaryamLocke committed Jul 5, 2023
1 parent d34c04a commit fb08380
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 25 deletions.
62 changes: 37 additions & 25 deletions src/processors/other/Compressor.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "Compressor.h"
#include "../ParameterHelpers.h"
#include "../BufferHelpers.h"

class Compressor::GainComputer
{
Expand Down Expand Up @@ -136,36 +137,47 @@ void Compressor::prepare (double sampleRate, int samplesPerBlock)

void Compressor::processAudio (AudioBuffer<float>& buffer)
{
const auto numChannels = buffer.getNumChannels();
const auto numSamples = buffer.getNumSamples();

// set up level buffer
if (numChannels == 1)
levelOutBuffer.setSize(1, numSamples, false, false, true);
if (inputsConnected.contains(LevelInput))
{
levelBuffer.makeCopyOf (buffer);
}
else
BufferHelpers::collapseToMonoBuffer(getInputBuffer(LevelInput), levelOutBuffer);
} else
{
levelBuffer.setSize (1, numSamples, true, true, false);
levelBuffer.copyFrom (0, 0, buffer, 0, 0, numSamples);

for (int ch = 1; ch < numChannels; ++ch)
levelBuffer.addFrom (0, 0, buffer, ch, 0, numSamples);

levelBuffer.applyGain (1.0f / (float) numChannels);
if (inputsConnected.contains(AudioInput))
{
levelDetector.setParameters(*attackMsParam, *releaseMsParam);
levelDetector.processBlock(getInputBuffer(AudioInput), levelOutBuffer);
} else
{
levelOutBuffer.clear();
}
}

auto&& levelBlock = dsp::AudioBlock<float> { levelBuffer };
levelDetector.setParameters (*attackMsParam, *releaseMsParam);
levelDetector.process (dsp::ProcessContextReplacing<float> { levelBlock });

gainComputer->setParameters (*threshDBParam, *ratioParam, *kneeDBParam);
gainComputer->process (levelBlock);

auto&& block = dsp::AudioBlock<float> { buffer };
for (int ch = 0; ch < numChannels; ++ch)
block.getSingleChannelBlock ((size_t) ch) *= gainComputer->gainBlock;
if (inputsConnected.contains (AudioInput))
{
levelBuffer.makeCopyOf(levelOutBuffer);
gainComputer->setParameters (*threshDBParam, *ratioParam, *kneeDBParam);
gainComputer->process (levelBuffer);

auto& audioInBuffer = getInputBuffer (AudioInput);
const auto numChannels = audioInBuffer.getNumChannels();
audioOutBuffer.setSize (numChannels, numSamples, false, false, true);
for (int ch = 0; ch < numChannels; ++ch)
{
FloatVectorOperations::multiply(audioOutBuffer.getWritePointer(ch), audioInBuffer.getReadPointer(ch), gainComputer->gainBlock.getChannelPointer(0), numSamples);
}

auto&& audioOutBlock = dsp::AudioBlock<float> { audioOutBuffer };
makeupGain.setGainDecibels (*makeupDBParam);
makeupGain.process (dsp::ProcessContextReplacing<float> { audioOutBlock });
}else
{
audioOutBuffer.setSize (1, numSamples, false, false, true);
audioOutBuffer.clear();
}

makeupGain.setGainDecibels (*makeupDBParam);
makeupGain.process (dsp::ProcessContextReplacing<float> { block });
outputBuffers.getReference (AudioOutput) = &audioOutBuffer;
outputBuffers.getReference (LevelOutput) = &levelOutBuffer;
}
2 changes: 2 additions & 0 deletions src/processors/other/Compressor.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ class Compressor : public BaseProcessor
chowdsp::FloatParameter* makeupDBParam = nullptr;

AudioBuffer<float> levelBuffer;
AudioBuffer<float> levelOutBuffer;
AudioBuffer<float> audioOutBuffer;
chowdsp::LevelDetector<float> levelDetector;

class GainComputer;
Expand Down

0 comments on commit fb08380

Please sign in to comment.