private void SetParameter(int index, double value) { if (index == P_TYPE) { FilterType = (int)(value * 6.99); BiquadL.Type = (Biquad.FilterType)FilterType; BiquadR.Type = (Biquad.FilterType)FilterType; ParameterInfo[index].Display = BiquadL.Type.ToString(); } else if (index == P_FREQ) { Frequency = ValueTables.Get(value, ValueTables.Response3Dec) * 22000; BiquadL.Frequency = Frequency; BiquadR.Frequency = Frequency; ParameterInfo[index].Display = String.Format("{0:0.00}", Frequency); } else if (index == P_SLOPE) { Slope = value; BiquadL.Slope = Slope; BiquadR.Slope = Slope; ParameterInfo[index].Display = String.Format("{0:0.00}", Slope); } else if (index == P_Q) { if (value < 0.5) { Q = 0.1 + 0.9 * 2 * value; } else { Q = 1 + (value - 0.5) * 12; } BiquadL.Q = Q; BiquadR.Q = Q; ParameterInfo[index].Display = String.Format("{0:0.00}", Q); } else if (index == P_GAIN) { GainDB = (2 * value - 1) * 20; BiquadL.GainDB = GainDB; BiquadR.GainDB = GainDB; ParameterInfo[index].Display = String.Format("{0:0.0}", GainDB); } ParameterInfo[index].Value = value; BiquadL.Update(); BiquadR.Update(); }
public override void Process() { var gain = Utils.DB2gain(-30 + 48 * Parameters[0]); var volume = Utils.DB2gain(-60 + 66 * Parameters[1]); var decay = (1 - ValueTables.Get(1 - Parameters[2], ValueTables.Response3Oct)) * 1.14; var basePitch = 60 + (int)((Parameters[3] - 0.5) * 24.01); var p1 = basePitch; var p2 = basePitch + (int)((Parameters[4] - 0.5) * 24.01); var p3 = basePitch + (int)((Parameters[5] - 0.5) * 24.01); var p4 = basePitch + (int)((Parameters[6] - 0.5) * 24.01); var p5 = basePitch + (int)((Parameters[7] - 0.5) * 24.01); var vol1 = Utils.DB2gain(-30 + 36 * Parameters[8]); var vol2 = Utils.DB2gain(-30 + 36 * Parameters[9]); var vol3 = Utils.DB2gain(-30 + 36 * Parameters[10]); var vol4 = Utils.DB2gain(-30 + 36 * Parameters[11]); var vol5 = Utils.DB2gain(-30 + 36 * Parameters[12]); var wet = Parameters[13]; var dry = 1 - wet; var cutoff = ValueTables.Get(Parameters[14], ValueTables.Response4Dec) * 22000; var mode = Parameters[15] < 0.5; var delay1 = GetSamplesPerNote(p1); var delay2 = GetSamplesPerNote(p2); var delay3 = GetSamplesPerNote(p3); var delay4 = GetSamplesPerNote(p4); var delay5 = GetSamplesPerNote(p5); Filter.Frequency = cutoff; Filter.Q = 0.7; Filter.Type = mode ? Biquad.FilterType.LowPass : Biquad.FilterType.HighPass; Filter.Update(); for (int i = 0; i < Inputs[0].Length; i++) { var input = Filter.Process(Inputs[0][i]) * gain; var d1 = Buf1.Read(-delay1) * decay; var d2 = Buf2.Read(-delay2) * decay; var d3 = Buf3.Read(-delay3) * decay; var d4 = Buf4.Read(-delay4) * decay; var d5 = Buf5.Read(-delay5) * decay; var signal = d1 * vol1 + d2 * vol2 + d3 * vol3 + d4 * vol4 + d5 * vol5; Outputs[0][i] = (dry * Inputs[0][i] + wet * signal * 0.2) * volume; Outputs[1][i] = Outputs[0][i]; Buf1.Write(Math.Tanh(input + d1)); Buf2.Write(Math.Tanh(input + d2)); Buf3.Write(Math.Tanh(input + d3)); Buf4.Write(Math.Tanh(input + d4)); Buf5.Write(Math.Tanh(input + d5)); } }
public EqProcessor(MixingConfig config, double samplerate) { this.config = config; this.samplerate = samplerate; filters = Enumerable.Range(0, 6) .Select(_ => { var b = new Biquad { Frequency = 100, Slope = 1.0, GainDB = 0, Q = 1, Samplerate = samplerate, Type = Biquad.FilterType.Peak }; b.Update(); return(b); }) .ToArray(); filters[0].Frequency = config.Eq1FreqTransformed; filters[0].Q = config.Eq1QTransformed; filters[0].GainDB = config.Eq1GainDbTransformed; filters[1].Frequency = config.Eq2FreqTransformed; filters[1].Q = config.Eq2QTransformed; filters[1].GainDB = config.Eq2GainDbTransformed; filters[2].Frequency = config.Eq3FreqTransformed; filters[2].Q = config.Eq3QTransformed; filters[2].GainDB = config.Eq3GainDbTransformed; filters[3].Frequency = config.Eq4FreqTransformed; filters[3].Q = config.Eq4QTransformed; filters[3].GainDB = config.Eq4GainDbTransformed; filters[4].Frequency = config.Eq5FreqTransformed; filters[4].Q = config.Eq5QTransformed; filters[4].GainDB = config.Eq5GainDbTransformed; filters[5].Frequency = config.Eq6FreqTransformed; filters[5].Q = config.Eq6QTransformed; filters[5].GainDB = config.Eq6GainDbTransformed; foreach (var f in filters) { f.Update(); } }
public DelayLine(int bufferSize, int samplerate) { delay = new ModulatedDelay(bufferSize, 10000); diffuser = new AllpassDiffuser(bufferSize, samplerate) { ModulationEnabled = false }; tempBuffer = new double[bufferSize]; filterOutputBuffer = new double[bufferSize]; lowPass = new Lp1(samplerate); lowShelf = new Biquad(Biquad.FilterType.LowShelf, samplerate) { Slope = 1.0, GainDB = -20, Frequency = 20 }; highShelf = new Biquad(Biquad.FilterType.HighShelf, samplerate) { Slope = 1.0, GainDB = -20, Frequency = 19000 }; lowPass.CutoffHz = 1000; lowShelf.Update(); highShelf.Update(); Samplerate = samplerate; }
public void SetLowShelfGain(double gain) { lowShelf.Gain = gain; lowShelf.Update(); }
public void SetHighShelfGain(double gain) { highShelf.Gain = gain; highShelf.Update(); }
public double[][] ProcessOutputStage() { var len = timeSignal[0].Length; var stereoSignal = timeSignal; var gain = Utils.DB2gain(outputStage.GainTransformed); var pan = outputStage.PanTransformed; var leftPan = pan <= 0 ? 1.0 : 1 - Math.Abs(pan); var rightPan = pan >= 0 ? 1.0 : 1 - Math.Abs(pan); var leftInvert = outputStage.InvertPhaseLeft ? -1 : 1; var rightInvert = outputStage.InvertPhaseRight ? -1 : 1; var leftDelay = (int)(outputStage.DelayMillisLTransformed / 1000.0 * samplerate); var rightDelay = (int)(outputStage.DelayMillisRTransformed / 1000.0 * samplerate); var windowLen = outputStage.WindowLengthTransformed; var windowType = outputStage.WindowMethodTransformed; var low12db = outputStage.LowCut12dB; var high12db = outputStage.HighCut12dB; var lp1Left = new ZeroLp1(); var lp1Right = new ZeroLp1(); var hp1Left = new ZeroHp1(); var hp1Right = new ZeroHp1(); lp1Left.SetFc(outputStage.HighCutLeftTransformed / (samplerate / 2)); lp1Right.SetFc(outputStage.HighCutRightTransformed / (samplerate / 2)); hp1Left.SetFc(outputStage.LowCutLeftTransformed / (samplerate / 2)); hp1Right.SetFc(outputStage.LowCutRightTransformed / (samplerate / 2)); var lp2Left = new Biquad { Q = 0.707, Type = Biquad.FilterType.LowPass, Gain = 1, Samplerate = samplerate }; var lp2Right = new Biquad { Q = 0.707, Type = Biquad.FilterType.LowPass, Gain = 1, Samplerate = samplerate }; var hp2Left = new Biquad { Q = 0.707, Type = Biquad.FilterType.HighPass, Gain = 1, Samplerate = samplerate }; var hp2Right = new Biquad { Q = 0.707, Type = Biquad.FilterType.HighPass, Gain = 1, Samplerate = samplerate }; lp2Left.Frequency = outputStage.HighCutLeftTransformed; lp2Right.Frequency = outputStage.HighCutRightTransformed; hp2Left.Frequency = outputStage.LowCutLeftTransformed; hp2Right.Frequency = outputStage.LowCutRightTransformed; lp2Left.Update(); lp2Right.Update(); hp2Left.Update(); hp2Right.Update(); var outputLeft = new double[len]; var outputRight = new double[len]; for (int i = 0; i < stereoSignal[0].Length; i++) { var lSample = stereoSignal[0][i] * gain * leftPan * leftInvert; var rSample = stereoSignal[1][i] * gain * rightPan * rightInvert; if (high12db) { lSample = lp2Left.Process(lSample); rSample = lp2Right.Process(rSample); } else { lSample = lp1Left.Process(lSample); rSample = lp1Right.Process(rSample); } if (low12db) { lSample = hp2Left.Process(lSample); rSample = hp2Right.Process(rSample); } else { lSample = hp1Left.Process(lSample); rSample = hp1Right.Process(rSample); } if (i + leftDelay < len) { outputLeft[i + leftDelay] = lSample; } if (i + rightDelay < len) { outputRight[i + rightDelay] = rSample; } } for (int i = 0; i < len; i++) { var window = GetWindow(i, impulseLength, windowLen, windowType); outputLeft[i] *= window; outputRight[i] *= window; } return(new[] { outputLeft, outputRight }); }