Пример C # для NAudio WaveIn с SoundTouch BPMDetect - PullRequest
0 голосов
/ 23 мая 2018

У кого-нибудь есть пример использования класса 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 Ответ

0 голосов
/ 31 мая 2018

Я не знаком с классом BPMDetect, но есть несколько проблем с тем, как вы вводите в него данные:

  • Вы записываете в моно, так что вы нене нужно разделять каналы.
  • Вы, вероятно, инициализируете BPMDetect с 2-мя каналами, что здесь неверно.
  • Даже если вы записывали в стерео, каждый сэмпл составляет два байта, поэтому вы не можете просто взять каждыйдругой байт.
  • WaveBuffer выполняет только повторную интерпретацию.Он не превратит 16-битные целочисленные выборки в 32-битные выборки с плавающей запятой.

Что вам нужно сделать, это взять каждую пару байтов в захваченном буфере, интерпретировать ее как Int16 (например,используя BitConverter), а затем преобразовать его в float в диапазоне +/- 1,0 путем деления на 32768f.Это даст вам образцы, которые ваш BPM-детектор сможет использовать.

...