Skip to content
Snippets Groups Projects
Commit 59eda084 authored by jsiegle's avatar jsiegle
Browse files

Add compressor to AudioNode (still need to fix params)

parent 67b8970c
No related branches found
No related tags found
No related merge requests found
......@@ -21,6 +21,7 @@
*/
#include <cmath>
#include "AudioNode.h"
#include "Channel.h"
......@@ -140,7 +141,8 @@ void AudioNode::setParameter(int parameterIndex, float newValue)
else if (parameterIndex == 2)
{
// noiseGateLevel level
noiseGateLevel = newValue; // in microVolts
compressor.setThreshold(newValue); // in microVolts
}
else if (parameterIndex == 100)
......@@ -357,17 +359,12 @@ void AudioNode::process(AudioSampleBuffer& buffer,
}
// Simple implementation of a "noise gate" on audio output
float* leftChannelData = buffer.getWritePointer(0);
float* rightChannelData = buffer.getWritePointer(1);
float gateLevel = noiseGateLevel * gain; // uVolts scaled by gain
// Modified from http://musicdsp.org/archive.php?classid=1#272:
compressor.process(buffer.getWritePointer(0), // left channel
buffer.getWritePointer(1), // right channel
buffer.getNumSamples());
for (int m = 0; m < buffer.getNumSamples(); m++)
{
if (fabs(leftChannelData[m]) < gateLevel)
leftChannelData[m] = 0;
if (fabs(rightChannelData[m]) < gateLevel)
rightChannelData[m] = 0;
}
}
}
......@@ -378,3 +375,70 @@ void AudioNode::process(AudioSampleBuffer& buffer,
}
}
// ==========================================================
Compressor::Compressor()
{
threshold = 1.f;
attack = release = envelope_decay = 0.f;
output = 1.f;
transfer_A = 0.f;
transfer_B = 1.f;
env = 0.f;
gain = 1.f;
}
void Compressor::setThreshold(float value)
{
threshold = value;
transfer_B = output * pow(threshold, -transfer_A);
std::cout << "Threshold set to " << threshold << std::endl;
std::cout << "transfer_B set to " << transfer_B << std::endl;
}
void Compressor::setRatio(float value)
{
transfer_A = value - 1.f;
transfer_B = output * pow(threshold, -transfer_A);
}
void Compressor::setAttack(float value)
{
attack = exp(-1.f/value);
}
void Compressor::setRelease(float value)
{
release = exp(-1.f/value);
envelope_decay = exp(-4.f/value); /* = exp(-1/(0.25*value)) */
}
void Compressor::process(float* leftChan, float* rightChan, int numSamples)
{
float det, transfer_gain;
for(int i = 0; i < numSamples; i++)
{
det = jmax(fabs(leftChan[i]),fabs(rightChan[i]));
det += 10e-30f; /* add tiny DC offset (-600dB) to prevent denormals */
env = det >= env ? det : det + envelope_decay*(env-det);
transfer_gain = env > threshold ? pow(env, transfer_A) * transfer_B : output;
gain = transfer_gain < gain ?
transfer_gain + attack * (gain - transfer_gain) :
transfer_gain + release * (gain - transfer_gain);
leftChan[i] = leftChan[i] * gain;
rightChan[i] = rightChan[i] * gain;
}
}
\ No newline at end of file
......@@ -57,6 +57,27 @@ class AudioEditor;
*/
class Compressor
{
public:
Compressor();
void setThreshold(float);
void setRatio(float);
void setAttack(float);
void setRelease(float);
void reset();
void process(float* leftChan, float* rightChan, int numSamples);
private:
float threshold;
float attack, release, envelope_decay;
float output;
float transfer_A, transfer_B;
float env, gain;
};
class AudioNode : public GenericProcessor
{
public:
......@@ -118,6 +139,8 @@ private:
bool bufferSwap;
Compressor compressor;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(AudioNode);
};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment