Ejemplo n.º 1
0
        /// <summary>
        /// Processes one sample.
        /// </summary>
        /// <param name="sample">Input sample</param>
        public float Process(float sample)
        {
            var abs = Math.Abs(sample);

            var xg = abs > 1e-6f ? (float)Scale.ToDecibel(abs) : _minAmplitudeDb;
            var yg = 0f;

            switch (_mode)
            {
            case DynamicsMode.Limiter:
            case DynamicsMode.Compressor:
            {
                yg = xg < Threshold ? xg : Threshold + (xg - Threshold) / Ratio;
                break;
            }

            case DynamicsMode.Expander:
            case DynamicsMode.NoiseGate:
            {
                yg = xg > Threshold ? xg : Threshold + (xg - Threshold) * Ratio;
                break;
            }
            }

            var envelope = _envelopeFollower.Process(yg - xg);

            var gain = (float)Scale.FromDecibel(MakeupGain - envelope);

            return(sample * gain);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Method for extracting the envelope of a signal
        /// </summary>
        /// <param name="signal">Signal</param>
        /// <param name="attackTime"></param>
        /// <param name="releaseTime"></param>
        /// <returns></returns>
        public static DiscreteSignal Envelope(DiscreteSignal signal, float attackTime = 0.01f, float releaseTime = 0.05f)
        {
            var envelopeFollower = new EnvelopeFollower(signal.SamplingRate, attackTime, releaseTime);

            return(new DiscreteSignal(signal.SamplingRate, signal.Samples.Select(s => envelopeFollower.Process(s))));
        }