带有 SoundTouch BPMDetect 的 NAudio WaveIn 的 C# 示例
Posted
技术标签:
【中文标题】带有 SoundTouch BPMDetect 的 NAudio WaveIn 的 C# 示例【英文标题】:C# Example for NAudio WaveIn with SoundTouch BPMDetect 【发布时间】:2018-05-23 13:39:22 【问题描述】:有没有人举例说明如何将 BPMDetect 类与 naudio WaveIn 一起使用?
我总是得到 0 BPM。
这是我目前所拥有的:
const int ConstWaveInSampleRate = 44100;
private BufferedWaveProvider bufferedWaveProvider;
private WaveIn m_WaveIn;
private WaveOut m_WaveOut;
private BPMDetect m_BpmDetect;
public NAudioBpmDetect()
int deviceNumber = 0;
m_WaveIn = new WaveIn();
m_WaveIn.DeviceNumber = deviceNumber;
int channels = NAudio.Wave.WaveIn.GetCapabilities(deviceNumber).Channels;
m_WaveIn.WaveFormat = new WaveFormat(ConstWaveInSampleRate, 16, 1);
m_WaveOut = new WaveOut();
m_BpmDetect = new BPMDetect(channels, ConstWaveInSampleRate);
m_WaveIn.DataAvailable += new EventHandler<WaveInEventArgs>(WaveIn_DataAvailable);
bufferedWaveProvider = new BufferedWaveProvider(m_WaveIn.WaveFormat);
bufferedWaveProvider.DiscardOnBufferOverflow = true;
m_WaveOut.Init(bufferedWaveProvider);
m_WaveIn.StartRecording();
m_WaveOut.Play();
void WaveIn_DataAvailable(object sender, WaveInEventArgs e)
bufferedWaveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded);
byte[] buffer = e.Buffer.Where((value, index) => index % 2 == 0).ToArray();
var waveBuffer = new WaveBuffer(buffer);
uint count = (uint)waveBuffer.FloatBuffer.Count();
m_BpmDetect.PutSamples(waveBuffer.FloatBuffer, count);
Console.WriteLine(m_BpmDetect.Bpm);
从缓冲区中拆分通道数据可能会出现问题吗?
【问题讨论】:
【参考方案1】:我不熟悉 BPMDetect
类,但在向其中输入数据的方式存在一些问题:
BPMDetect
,这在此处不正确。
即使您以立体声录制,每个样本也是两个字节,因此您不能只取其他每个字节。
WaveBuffer
只执行重新解释演员表。它不会将 16 位整数样本转换为 32 位浮点样本。
您需要做的是获取捕获缓冲区中的每一对字节,将其解释为 Int16
(例如使用 BitConverter
),然后将其转换为范围为 +/- 1.0 的 float
除以 32768f。这将为您提供 BPM 检测器应该能够使用的样本。
【讨论】:
以上是关于带有 SoundTouch BPMDetect 的 NAudio WaveIn 的 C# 示例的主要内容,如果未能解决你的问题,请参考以下文章