C# 如何将多个NAudio ISampleProvider效果链接在一起

C# 如何将多个NAudio ISampleProvider效果链接在一起,c#,naudio,C#,Naudio,我在ISampleProvider模型中编码了一些DSP效果。为了应用一种效果,我这样做,效果很好 string filename = "C:\myaudio.mp3"; MediaFoundationReader mediaFileReader = new MediaFoundationReader(filename); ISampleProvider sampProvider = mediaFileReader.ToSampleProvider(); ReverbSampleProvider

我在ISampleProvider模型中编码了一些DSP效果。为了应用一种效果,我这样做,效果很好

string filename = "C:\myaudio.mp3";
MediaFoundationReader mediaFileReader = new MediaFoundationReader(filename);
ISampleProvider sampProvider = mediaFileReader.ToSampleProvider();
ReverbSampleProvider reverbSamplr = new ReverbSampleProvider(sampProvider);
IWavePlayer waveOutDevice.Init(reverbSamplr);
waveOutDevice.Play();
如何对同一输入文件同时应用多个效果?
例如,如果我有混响效果和失真效果提供程序,如何将它们链接在一起,以便同时将它们应用于一个输入文件?

可以通过将其中一个作为下一个输入文件的“源”来链接效果。因此,如果你想让你的音频先经过混响,然后失真,你可以这样做,将原始音频传递到混响效果,将混响的输出传递到失真效果,然后将失真发送到waveOut设备

var reverb = new ReverbSampleProvider(sampProvider);
var distortion = new DistortionSampleProvider(reverb);
waveOutDevice.Init(distortion);

(注意:NAudio没有内置混响/失真效果-您必须自己制作或从其他地方获取)

通过将一个作为下一个的“源”传递,可以将效果链接在一起。因此,如果你想让你的音频先经过混响,然后失真,你可以这样做,将原始音频传递到混响效果,将混响的输出传递到失真效果,然后将失真发送到waveOut设备

var reverb = new ReverbSampleProvider(sampProvider);
var distortion = new DistortionSampleProvider(reverb);
waveOutDevice.Init(distortion);

(注意,NAudio没有内置的混响/失真效果-你必须自己制作或从其他地方获取)

马克的答案是正确的,但如果你以不同的顺序复制和粘贴东西,这种方法会很痛苦,因为你必须改变你传递的变量

例如,如果从以下内容开始:

var lpf = new LowPassEffectStream(input);
var reverb = new ReverbEffectStream(lpf);
var stereo = new StereoEffectStream(reverb);
var vol = new VolumeSampleProvider(stereo);
waveOutDevice.Init(vol);
如果您想交换混响和立体声,快速复制粘贴会让您向后输入变量:

var lpf = new LowPassEffectStream(input);
var stereo = new StereoEffectStream(reverb); // <--
var reverb = new ReverbEffectStream(lpf);    // <--
var vol = new VolumeSampleProvider(stereo);
waveOutDevice.Init(vol);
您可以这样使用它:

var effectChain = new EffectChain(input);

var lpf = new LowPassEffectStream(effectChain.Head);
effectChain.AddEffect(lpf);
var stereo = new StereoEffectStream(effectChain.Head);
effectChain.AddEffect(stereo);
var reverb = new ReverbEffectStream(effectChain.Head);
effectChain.AddEffect(reverb);
var vol = new VolumeSampleProvider(effectChain.Head);
effectChain.AddEffect(vol);

waveOutDevice.Init(effectChain);

这允许您快速重新排序链中的效果,因为每个效果都将效果链的头部作为输入。如果你不添加任何效果,它只是作为一个传递。如果愿意的话,您可以很容易地扩展这个类,以拥有更多的方法来管理包含的效果,但目前它工作得非常干净。

Mark的回答是正确的,但是如果您以不同的顺序复制和粘贴内容,那么这种方法是一种痛苦,因为您必须更改正在传递的变量

例如,如果从以下内容开始:

var lpf = new LowPassEffectStream(input);
var reverb = new ReverbEffectStream(lpf);
var stereo = new StereoEffectStream(reverb);
var vol = new VolumeSampleProvider(stereo);
waveOutDevice.Init(vol);
如果您想交换混响和立体声,快速复制粘贴会让您向后输入变量:

var lpf = new LowPassEffectStream(input);
var stereo = new StereoEffectStream(reverb); // <--
var reverb = new ReverbEffectStream(lpf);    // <--
var vol = new VolumeSampleProvider(stereo);
waveOutDevice.Init(vol);
您可以这样使用它:

var effectChain = new EffectChain(input);

var lpf = new LowPassEffectStream(effectChain.Head);
effectChain.AddEffect(lpf);
var stereo = new StereoEffectStream(effectChain.Head);
effectChain.AddEffect(stereo);
var reverb = new ReverbEffectStream(effectChain.Head);
effectChain.AddEffect(reverb);
var vol = new VolumeSampleProvider(effectChain.Head);
effectChain.AddEffect(vol);

waveOutDevice.Init(effectChain);

这允许您快速重新排序链中的效果,因为每个效果都将效果链的头部作为输入。如果你不添加任何效果,它只是作为一个传递。如果愿意的话,您可以轻松地扩展该类,使其拥有更多的方法来管理包含的效果,但就目前情况而言,它的工作非常干净。

Ha,非常简单。它工作得很好。谢谢Mark,ISampleProvider框架是天才。哈,太简单了。它工作得很好。感谢Mark,ISampleProvider框架是Genius。