示例#1
0
        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();
        }
示例#2
0
        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));
            }
        }
示例#3
0
        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();
            }
        }
示例#4
0
        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;
        }
示例#5
0
 public void SetLowShelfGain(double gain)
 {
     lowShelf.Gain = gain;
     lowShelf.Update();
 }
示例#6
0
 public void SetHighShelfGain(double gain)
 {
     highShelf.Gain = gain;
     highShelf.Update();
 }
示例#7
0
        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 });
        }