示例#1
0
        private void generateSignalButton_Click(object sender, EventArgs e)
        {
            var sampleCount  = int.Parse(durationTextBox.Text);
            var samplingRate = _signal1?.SamplingRate ?? 16000;

            SignalBuilder signalBuilder;

            switch (builderComboBox.Text)
            {
            case "Sinusoid":
                signalBuilder = new SineBuilder();
                _signal2      = signalBuilder
                                .SetParameter("low", -0.4f)
                                .SetParameter("high", 0.4f)
                                .SetParameter("freq", 233 /*Hz*/)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Sawtooth":
                signalBuilder = new SawtoothBuilder();
                _signal2      = signalBuilder
                                .SetParameter("low", -0.3f)
                                .SetParameter("high", 0.3f)
                                .SetParameter("freq", 233 /*Hz*/)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Triangle Wave":
                signalBuilder = new TriangleWaveBuilder();
                _signal2      = signalBuilder
                                .SetParameter("low", -0.3f)
                                .SetParameter("high", 0.3f)
                                .SetParameter("freq", 233 /*Hz*/)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Square Wave":
                signalBuilder = new SquareWaveBuilder();
                _signal2      = signalBuilder
                                .SetParameter("low", -0.25f)
                                .SetParameter("high", 0.25f)
                                .SetParameter("freq", 233 /*Hz*/)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Pulse Wave":
                signalBuilder = new PulseWaveBuilder();
                _signal2      = signalBuilder
                                .SetParameter("min", 0)
                                .SetParameter("max", 0.5f)
                                .SetParameter("pulse", 0.007f /*sec*/)
                                .SetParameter("period", 0.020f /*sec*/)
                                .OfLength(sampleCount)
                                .DelayedBy(50)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Chirp":
                signalBuilder = new ChirpBuilder();
                _signal2      = signalBuilder
                                .SetParameter("min", -0.3f)
                                .SetParameter("max", 0.3f)
                                .OfLength(sampleCount)
                                .RepeatedTimes(3)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Sinc":
                signalBuilder = new SincBuilder();
                _signal2      = signalBuilder
                                .SetParameter("min", 0)
                                .SetParameter("max", 0.5f)
                                .SetParameter("freq", 700 /*Hz*/)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Ramp":
                signalBuilder = new RampBuilder();
                _signal2      = signalBuilder
                                .SetParameter("slope", 0.0007f)
                                .SetParameter("intercept", -0.5f)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "AWGN":
                signalBuilder = new AwgnBuilder();
                _signal2      = signalBuilder
                                .SetParameter("sigma", 0.25f)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Pink Noise":
                signalBuilder = new PinkNoiseBuilder();
                _signal2      = signalBuilder
                                .SetParameter("min", -0.5f)
                                .SetParameter("max", 0.5f)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Red Noise":
                signalBuilder = new RedNoiseBuilder();
                _signal2      = signalBuilder
                                .SetParameter("min", -0.5f)
                                .SetParameter("max", 0.5f)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Perlin Noise":
                signalBuilder = new PerlinNoiseBuilder();
                _signal2      = signalBuilder
                                .SetParameter("min", -0.3f)
                                .SetParameter("max", 0.7f)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            default:
                signalBuilder = new WhiteNoiseBuilder();
                _signal2      = signalBuilder
                                .SetParameter("min", -0.5f)
                                .SetParameter("max", 0.5f)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;
            }

            builderParametersListBox.Items.Clear();
            builderParametersListBox.Items.AddRange(signalBuilder.GetParametersInfo());
            builderParametersListBox.Items.Add("");
            builderParametersListBox.Items.Add($"min: {_signal2.Samples.Min():F2}");
            builderParametersListBox.Items.Add($"max: {_signal2.Samples.Max():F2}");
            builderParametersListBox.Items.Add($"avg: {_signal2.Samples.Average():F4}");

            if (_signal1 != null)
            {
                //_signal3 = _signal1 + _signal2;
                var positions = Enumerable.Range(0, 3).Select(pos => pos * (_signal2.Length + 2000)).ToArray();
                _signal3 = _signal1.SuperimposeMany(_signal2, positions);
                superimposedSignalPanel.Signal = _signal3;
            }

            generatedSignalPanel.Stride = 1;
            generatedSignalPanel.Signal = _signal2;

            var spectrum = _fft.PowerSpectrum(_signal2.First(512));

            spectrumPanel.Line = spectrum.Samples;
            spectrumPanel.ToDecibel();
        }
示例#2
0
        private void applyEffectButton_Click(object sender, EventArgs e)
        {
            AudioEffect effect;

            var fs = _signal.SamplingRate;

            var winSize = int.Parse(winSizeTextBox.Text);
            var hopSize = int.Parse(hopSizeTextBox.Text);
            var tsm     = (TsmAlgorithm)tsmComboBox.SelectedIndex;

            var shift = float.Parse(pitchShiftTextBox.Text);

            if (tremoloRadioButton.Checked)
            {
                var freq  = float.Parse(tremoloFrequencyTextBox.Text);
                var index = float.Parse(tremoloIndexTextBox.Text);
                effect = new TremoloEffect(fs, freq, index);
            }
            else if (overdriveRadioButton.Checked)
            {
                var gain = float.Parse(distortionGainTextBox.Text);
                effect = new OverdriveEffect(gain);
            }
            else if (distortionRadioButton.Checked)
            {
                var gain = float.Parse(distortionGainTextBox.Text);
                effect = new DistortionEffect(gain);
            }
            else if (tubeDistortionRadioButton.Checked)
            {
                var gain = float.Parse(distortionGainTextBox.Text);
                var mix  = float.Parse(wetTextBox.Text);
                var dist = float.Parse(distTextBox.Text);
                var q    = float.Parse(qTextBox.Text);
                effect = new TubeDistortionEffect(gain, mix, q, dist);
            }
            else if (echoRadioButton.Checked)
            {
                var delay = float.Parse(echoDelayTextBox.Text);
                var decay = float.Parse(echoDecayTextBox.Text);
                effect = new EchoEffect(fs, delay, decay);
            }
            else if (delayRadioButton.Checked)
            {
                var delay = float.Parse(echoDelayTextBox.Text);
                var decay = float.Parse(echoDecayTextBox.Text);
                effect = new DelayEffect(fs, delay, decay);
            }
            else if (wahwahRadioButton.Checked)
            {
                var lfoFrequency = float.Parse(lfoFreqTextBox.Text);
                var minFrequency = float.Parse(minFreqTextBox.Text);
                var maxFrequency = float.Parse(maxFreqTextBox.Text);
                var q            = float.Parse(lfoQTextBox.Text);
                //effect = new WahwahEffect(fs, lfoFrequency, minFrequency, maxFrequency, q);
                effect = new AutowahEffect(fs, minFrequency, maxFrequency, q);
            }
            else if (flangerRadioButton.Checked)
            {
                var lfoFrequency = float.Parse(lfoFreqTextBox.Text);
                var maxDelay     = float.Parse(maxDelayTextBox.Text);
                effect = new FlangerEffect(fs, maxDelay, lfoFrequency);
            }
            else if (pitchShiftRadioButton.Checked)
            {
                effect = pitchShiftCheckBox.Checked ? new PitchShiftEffect(shift, winSize, hopSize, tsm) : null;
                //effect = pitchShiftCheckBox.Checked ? new WhisperEffect(hopSize, winSize) : null;
                //effect = new MorphEffect(hopSize, winSize);
            }
            else
            {
                var lfoFrequency = float.Parse(lfoFreqTextBox.Text);
                var minFrequency = float.Parse(minFreqTextBox.Text);
                var maxFrequency = float.Parse(maxFreqTextBox.Text);
                var q            = float.Parse(lfoQTextBox.Text);

                var lfo = new SawtoothBuilder()
                          .SetParameter("freq", lfoFrequency)
                          .SetParameter("min", minFrequency)
                          .SetParameter("max", maxFrequency)
                          .SampledAt(_signal.SamplingRate);

                effect = new PhaserEffect(fs, lfo, q);
            }

            if (effect != null)
            {
                effect.Wet = float.Parse(wetTextBox.Text);
                effect.Dry = float.Parse(dryTextBox.Text);

                _filteredSignal = effect.ApplyTo(_signal, FilteringMethod.Auto);

                //DiscreteSignal morph;
                //using (var stream = new FileStream(@"D:\Docs\Research\DATABASE\Dictor1\wav\gtr16khz.wav", FileMode.Open))
                //{
                //    var waveFile = new WaveFile(stream);
                //    morph = waveFile[Channels.Average];
                //}

                //_filteredSignal = ((MorphEffect)effect).ApplyTo(_signal, morph);
            }
            else
            {
                _filteredSignal = Operation.TimeStretch(_signal, shift, tsm);
                //Operation.TimeStretch(_signal, shift, winSize, hopSize, tsm);
            }

            signalAfterFilteringPanel.Signal           = _filteredSignal;
            spectrogramAfterFilteringPanel.Spectrogram = _stft.Spectrogram(_filteredSignal.Samples);
        }