Exemplo n.º 1
0
        private void autoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (_signal == null)
            {
                return;
            }

            _filteredSignal = _filter.ApplyTo(_signal);
            signalAfterFilteringPanel.Signal           = _filteredSignal;
            spectrogramAfterFilteringPanel.Spectrogram = _stft.Spectrogram(_filteredSignal);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Method implements tube distortion effect
        /// </summary>
        /// <param name="signal"></param>
        /// <param name="filteringOptions"></param>
        /// <returns></returns>
        public DiscreteSignal ApplyTo(DiscreteSignal signal,
                                      FilteringOptions filteringOptions = FilteringOptions.Auto)
        {
            var maxAmp = signal.Samples.Max(s => Math.Abs(s));

            if (Math.Abs(maxAmp) < 1e-10)
            {
                return(signal.Copy());
            }

            IEnumerable <float> tempZ;

            if (Math.Abs(Q) < 1e-10)
            {
                tempZ = signal.Samples.Select(s =>
                {
                    var q = Gain * s / maxAmp;
                    return(Math.Abs(q - Q) < 1e-10 ?
                           1.0f / Dist :
                           (float)(q / (1 - Math.Exp(-Dist * q))));
                });
            }
            else
            {
                tempZ = signal.Samples.Select(s =>
                {
                    var q = Gain * s / maxAmp;
                    return(Math.Abs(q - Q) < 1e-10 ?
                           (float)(1.0 / Dist + Q / (1 - Math.Exp(Dist * Q))) :
                           (float)((q - Q) / (1 - Math.Exp(-Dist * (q - Q))) + Q / (1 - Math.Exp(Dist * Q))));
                });
            }

            var maxZ  = tempZ.Max(z => Math.Abs(z));
            var tempY = tempZ.Zip(signal.Samples, (z, x) => Mix * z * maxAmp / maxZ + (1 - Mix) * x);

            var maxY   = tempY.Max(y => Math.Abs(y));
            var output = tempY.Select(y => y * maxAmp / maxY);

            return(_outputFilter.ApplyTo(new DiscreteSignal(signal.SamplingRate, output)));
        }