在 NAudio 环回中使用均衡器
Using equalizer in NAudio loopback
我使用 NAudio 编写了这个简单的方法来在当前声音设备上创建 reverb 效果。它已经在工作了。
但是,我只想在较高频率上应用混响效果,否则您会听到很多基鼓回声,这不是我想要的声音。
private void CreateReverb()
{
WasapiLoopbackCapture waveIn = new WasapiLoopbackCapture();
BufferedWaveProvider bufferedWaveProvider = new BufferedWaveProvider(waveIn.WaveFormat);
VolumeSampleProvider volumeProvider = new VolumeSampleProvider(bufferedWaveProvider.ToSampleProvider());
WasapiOut wasapiOut = new WasapiOut(AudioClientShareMode.Shared, 0);
wasapiOut.Init(volumeProvider);
wasapiOut.Play();
waveIn.StartRecording();
waveIn.DataAvailable += delegate(object sender, WaveInEventArgs e)
{
bufferedWaveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded);
volumeProvider.Volume = .8f * ReverbIntensity;
};
}
我尝试了一些我在网上找到的创建均衡器的代码,但我无法将它应用到我现有的代码中。
问题:如何使用某种均衡器将此混响效果更改为仅影响较高音调?
我偶然发现了 BiQuadFilter
,事实证明它可以用于那个目的。
它将样本转换为浮点数,而WasapiLoopbackCapture.DataAvailable
returns byte[]
。但是 BitConverter
可以将浮点数转换为 byte[4]
并且 Buffer.BlockCopy
将其写回到流中。
这是一个包含均衡器的工作混响。
private void CreateReverb()
{
WasapiLoopbackCapture waveIn = new WasapiLoopbackCapture();
BufferedWaveProvider bufferedWaveProvider = new BufferedWaveProvider(waveIn.WaveFormat);
VolumeSampleProvider volumeProvider = new VolumeSampleProvider(bufferedWaveProvider.ToSampleProvider());
WasapiOut wasapiOut = new WasapiOut(AudioClientShareMode.Shared, 0);
BiQuadFilter filter = BiQuadFilter.HighPassFilter(44000, 200, 1);
wasapiOut.Init(volumeProvider);
wasapiOut.Play();
waveIn.StartRecording();
waveIn.DataAvailable += delegate(object sender, WaveInEventArgs e)
{
for (int i = 0; i < e.BytesRecorded; i += 4)
{
byte[] transformed = BitConverter.GetBytes(filter.Transform(BitConverter.ToSingle(e.Buffer, i)));
Buffer.BlockCopy(transformed, 0, e.Buffer, i, 4);
}
bufferedWaveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded);
volumeProvider.Volume = .8f * ReverbIntensity;
};
}
我使用 NAudio 编写了这个简单的方法来在当前声音设备上创建 reverb 效果。它已经在工作了。
但是,我只想在较高频率上应用混响效果,否则您会听到很多基鼓回声,这不是我想要的声音。
private void CreateReverb()
{
WasapiLoopbackCapture waveIn = new WasapiLoopbackCapture();
BufferedWaveProvider bufferedWaveProvider = new BufferedWaveProvider(waveIn.WaveFormat);
VolumeSampleProvider volumeProvider = new VolumeSampleProvider(bufferedWaveProvider.ToSampleProvider());
WasapiOut wasapiOut = new WasapiOut(AudioClientShareMode.Shared, 0);
wasapiOut.Init(volumeProvider);
wasapiOut.Play();
waveIn.StartRecording();
waveIn.DataAvailable += delegate(object sender, WaveInEventArgs e)
{
bufferedWaveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded);
volumeProvider.Volume = .8f * ReverbIntensity;
};
}
我尝试了一些我在网上找到的创建均衡器的代码,但我无法将它应用到我现有的代码中。
问题:如何使用某种均衡器将此混响效果更改为仅影响较高音调?
我偶然发现了 BiQuadFilter
,事实证明它可以用于那个目的。
它将样本转换为浮点数,而WasapiLoopbackCapture.DataAvailable
returns byte[]
。但是 BitConverter
可以将浮点数转换为 byte[4]
并且 Buffer.BlockCopy
将其写回到流中。
这是一个包含均衡器的工作混响。
private void CreateReverb()
{
WasapiLoopbackCapture waveIn = new WasapiLoopbackCapture();
BufferedWaveProvider bufferedWaveProvider = new BufferedWaveProvider(waveIn.WaveFormat);
VolumeSampleProvider volumeProvider = new VolumeSampleProvider(bufferedWaveProvider.ToSampleProvider());
WasapiOut wasapiOut = new WasapiOut(AudioClientShareMode.Shared, 0);
BiQuadFilter filter = BiQuadFilter.HighPassFilter(44000, 200, 1);
wasapiOut.Init(volumeProvider);
wasapiOut.Play();
waveIn.StartRecording();
waveIn.DataAvailable += delegate(object sender, WaveInEventArgs e)
{
for (int i = 0; i < e.BytesRecorded; i += 4)
{
byte[] transformed = BitConverter.GetBytes(filter.Transform(BitConverter.ToSingle(e.Buffer, i)));
Buffer.BlockCopy(transformed, 0, e.Buffer, i, 4);
}
bufferedWaveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded);
volumeProvider.Volume = .8f * ReverbIntensity;
};
}