71 lines
2.1 KiB
C#
71 lines
2.1 KiB
C#
// based on SimpleGate v1.10 © 2006, ChunkWare Music Software, OPEN-SOURCE
|
|
using System;
|
|
using NAudio.Utils;
|
|
|
|
namespace NAudio.Dsp
|
|
{
|
|
class SimpleGate : AttRelEnvelope
|
|
{
|
|
// transfer function
|
|
private double threshdB; // threshold (dB)
|
|
private double thresh; // threshold (linear)
|
|
|
|
// runtime variables
|
|
private double env; // over-threshold envelope (linear)
|
|
|
|
public SimpleGate()
|
|
: base(10.0, 10.0, 44100.0)
|
|
{
|
|
threshdB = 0.0;
|
|
thresh = 1.0;
|
|
env = DC_OFFSET;
|
|
}
|
|
|
|
public void Process( ref double in1, ref double in2 )
|
|
{
|
|
// in/out pointers are assummed to reference stereo data
|
|
|
|
// sidechain
|
|
|
|
// rectify input
|
|
double rect1 = Math.Abs( in1 ); // n.b. was fabs
|
|
double rect2 = Math.Abs( in2 ); // n.b. was fabs
|
|
|
|
// if desired, one could use another EnvelopeDetector to smooth
|
|
// the rectified signal.
|
|
|
|
double key = Math.Max( rect1, rect2 ); // link channels with greater of 2
|
|
|
|
// threshold
|
|
double over = ( key > thresh ) ? 1.0 : 0.0; // key over threshold ( 0.0 or 1.0 )
|
|
|
|
// attack/release
|
|
over += DC_OFFSET; // add DC offset to avoid denormal
|
|
|
|
env = Run(over, env); // run attack/release
|
|
|
|
over = env - DC_OFFSET; // subtract DC offset
|
|
|
|
// Regarding the DC offset: In this case, since the offset is added before
|
|
// the attack/release processes, the envelope will never fall below the offset,
|
|
// thereby avoiding denormals. However, to prevent the offset from causing
|
|
// constant gain reduction, we must subtract it from the envelope, yielding
|
|
// a minimum value of 0dB.
|
|
|
|
// output gain
|
|
in1 *= over; // apply gain reduction to input
|
|
in2 *= over;
|
|
}
|
|
|
|
public double Threshold
|
|
{
|
|
get => threshdB;
|
|
set
|
|
{
|
|
threshdB = value;
|
|
thresh = Decibels.DecibelsToLinear(value);
|
|
}
|
|
}
|
|
}
|
|
}
|