mirror of
https://github.com/vale981/openAV-Luppp
synced 2025-03-05 17:11:40 -05:00
-Added SidechainGain class
This commit is contained in:
parent
7c30d2a6eb
commit
c7ea67f8b0
4 changed files with 135 additions and 0 deletions
83
src/dsp/dsp_sidechain_gain.cxx
Normal file
83
src/dsp/dsp_sidechain_gain.cxx
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
|
||||||
|
#include "dsp_sidechain_gain.hxx"
|
||||||
|
|
||||||
|
// for pow()
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
SidechainGain::SidechainGain(int rate) :
|
||||||
|
/// filter state init
|
||||||
|
w(10.0f / (rate * 0.02)),
|
||||||
|
a(0.07f),
|
||||||
|
b(1.0f / (1.0f - a)),
|
||||||
|
g1(0.0f),
|
||||||
|
g2(0.0f),
|
||||||
|
|
||||||
|
peakFrameCounter(0),
|
||||||
|
peakCountDuration( rate / 4 ),
|
||||||
|
|
||||||
|
currentTarget(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SidechainGain::process(unsigned int n_samples, float** inputs, float** outputs)
|
||||||
|
{
|
||||||
|
/// audio inputs
|
||||||
|
float* inL = inputs[0];
|
||||||
|
float* inR = inputs[1];
|
||||||
|
float* side = inputs[2];
|
||||||
|
float* outL = outputs[0];
|
||||||
|
float* outR = outputs[0];
|
||||||
|
|
||||||
|
/// control inputs
|
||||||
|
float threshold = controlThreshold;
|
||||||
|
float reduction = controlReduction;
|
||||||
|
float releaseTime = controlReleaseTime;
|
||||||
|
|
||||||
|
|
||||||
|
/// analyse sidechain input for peak
|
||||||
|
float sum = 0.f;
|
||||||
|
for( unsigned int i = 0; i < n_samples; i++ )
|
||||||
|
{
|
||||||
|
if ( *side > 0.000001 )
|
||||||
|
sum += *side++;
|
||||||
|
else
|
||||||
|
sum += -*side++;
|
||||||
|
}
|
||||||
|
|
||||||
|
currentTarget = 0.f;
|
||||||
|
|
||||||
|
/// check for peak level (offset to avoid "always on" peak)
|
||||||
|
if ( sum / n_samples > threshold + 0.05 )
|
||||||
|
{
|
||||||
|
peakFrameCounter = peakCountDuration * releaseTime;
|
||||||
|
currentTarget = 1.f - reduction;
|
||||||
|
}
|
||||||
|
else if ( peakFrameCounter < 0 )
|
||||||
|
{
|
||||||
|
currentTarget = 1.f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
currentTarget = 1.f - reduction;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( currentTarget < 0.f )
|
||||||
|
currentTarget = 0.f;
|
||||||
|
|
||||||
|
peakFrameCounter -= n_samples;
|
||||||
|
|
||||||
|
for( unsigned int i = 0; i < n_samples; i++ )
|
||||||
|
{
|
||||||
|
/// smoothing algo is a lowpass, to de-zip the fades
|
||||||
|
/// x^^4 approximates linear volume increase for human ears
|
||||||
|
g1 += w * ( pow ( currentTarget, 4.f ) - g1 - a * g2 - 1e-20f);
|
||||||
|
g2 += w * (b * g1 - g2 + 1e-20f);
|
||||||
|
float gain = g2;
|
||||||
|
|
||||||
|
*outL++ = *inL++ * gain;
|
||||||
|
*outR++ = *inR++ * gain;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// update output value
|
||||||
|
controlSidechainAmp = currentTarget;
|
||||||
|
}
|
49
src/dsp/dsp_sidechain_gain.hxx
Normal file
49
src/dsp/dsp_sidechain_gain.hxx
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
|
||||||
|
#ifndef OPENAV_DSP_SIDECHAIN_GAIN_H
|
||||||
|
#define OPENAV_DSP_SIDECHAIN_GAIN_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
class SidechainGain
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SidechainGain(int rate);
|
||||||
|
~SidechainGain(){}
|
||||||
|
|
||||||
|
void threshold(float t){controlThreshold = t;}
|
||||||
|
void reduction(float r){controlReduction = r;}
|
||||||
|
void time (float t){controlReleaseTime = t;}
|
||||||
|
|
||||||
|
void process(unsigned int n_samples, float** inputs, float** outputs);
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// audio buffers
|
||||||
|
float* audioInputL;
|
||||||
|
float* audioInputR;
|
||||||
|
float* audioSidechain;
|
||||||
|
float* audioOutputL;
|
||||||
|
float* audioOutputR;
|
||||||
|
|
||||||
|
/// control signals
|
||||||
|
float controlThreshold;
|
||||||
|
float controlReduction;
|
||||||
|
float controlReleaseTime;
|
||||||
|
float controlSidechainAmp;
|
||||||
|
|
||||||
|
/// filter state
|
||||||
|
float w, a, b, g1, g2;
|
||||||
|
|
||||||
|
/// last peak history
|
||||||
|
bool nowIsAPeak;
|
||||||
|
long peakFrameCounter;
|
||||||
|
|
||||||
|
/// nframes available for countdown
|
||||||
|
long peakCountDuration;
|
||||||
|
|
||||||
|
/// control output
|
||||||
|
float currentTarget;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // OPENAV_DSP_SIDECHAIN_GAIN_H
|
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
#include "dsp/dsp_reverb.hxx"
|
#include "dsp/dsp_reverb.hxx"
|
||||||
#include "dsp/dsp_dbmeter.hxx"
|
#include "dsp/dsp_dbmeter.hxx"
|
||||||
|
#include "dsp/dsp_sidechain_gain.hxx"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
2
wscript
2
wscript
|
@ -39,6 +39,8 @@ def build(bld):
|
||||||
'src/controller/apc.cxx',
|
'src/controller/apc.cxx',
|
||||||
'src/controller/gui.cxx',
|
'src/controller/gui.cxx',
|
||||||
|
|
||||||
|
'src/dsp/dsp_sidechain_gain.cxx',
|
||||||
|
|
||||||
'src/eventhandlergui.cxx',
|
'src/eventhandlergui.cxx',
|
||||||
'src/eventhandlerdsp.cxx']
|
'src/eventhandlerdsp.cxx']
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue