Пример C# для NAudio WaveIn с SoundTouch BPMDetect
У кого-нибудь есть пример, как использовать класс BPMDetect с naudio WaveIn?
Я всегда получаю 0 ударов в минуту.
Это то, что я имею до сих пор:
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
с 2 каналами, что здесь неверно. - Даже если вы записывали в стерео, каждый сэмпл занимает два байта, поэтому вы не можете просто взять каждый второй байт.
WaveBuffer
выполняет только повторную интерпретацию. Он не превратит 16-битные целочисленные выборки в 32-битные с плавающей точкой.
Что вам нужно сделать, это взять каждую пару байтов в захваченном буфере, интерпретировать его как Int16
(например, используя BitConverter
), а затем преобразовать это в float
в диапазоне +/- 1,0 путем деления на 32768f. Это даст вам образцы, которые ваш BPM-детектор сможет использовать.