Использование эквалайзера в петле NAudio
Я написал этот простой метод, используя NAudio для создания эффекта реверберации на текущем звуковом устройстве. Это уже работает.
Тем не менее, я хотел бы применить эффект реверберации только на более высоких частотах, потому что в противном случае вы услышите много эхо базового барабана, а это не то, что я хочу, чтобы он звучал.
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;
};
}
Я попробовал какой-то код, который я нашел в Интернете, который создает эквалайзер, но я не смог применить его к своему существующему коду.
Вопрос: Как я могу изменить этот эффект реверберации, чтобы он влиял только на более высокие тона, используя какой-нибудь euqalizer?
1 ответ
Я наткнулся на BiQuadFilter
и получается, что его можно использовать для этой цели.
Он преобразует образец в число с плавающей точкой, в то время как WasapiLoopbackCapture.DataAvailable
возвращает 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;
};
}