Индекс вне границ при использовании обнаружения BPM. Обнаружение BPM в реальном времени от микрофона с помощью NAudio и SoundTouch.net - PullRequest
0 голосов
/ 04 июня 2019

Я хочу захватить звук с микрофона с помощью NAudio, а затем передать данные в BpmDetect из SoundTouch

. Эта программа должна инициировать некоторые события, чтобы изменить программы освещения вКлуб.Когда разные ди-джеи воспроизводят музыку с разной скоростью, этот фрагмент кода должен определять ее по микрофонному входу.Я пытался использовать BASS.NET раньше, но не получил хороших результатов от определения ударов в минуту.

var waveIn = new WaveInEvent();
waveIn.StartRecording();

var bpm = BpmDetect<TSampleType, TLongSampleType>.NewInstance(1, 8000);

int z = 0;
Console.WriteLine("WaveFormat of input:");
Console.WriteLine("Channels: " + waveIn.WaveFormat.Channels);
Console.WriteLine("BitsPerSample: " + waveIn.WaveFormat.BitsPerSample);
Console.WriteLine("SampleRate: " + waveIn.WaveFormat.SampleRate);
Console.WriteLine("SampleRate: " + waveIn.WaveFormat.Encoding);
Console.WriteLine("BufferMilliseconds: " + waveIn.BufferMilliseconds);

/*
WaveFormat of input:
Channels: 1
BitsPerSample: 16
SampleRate: 8000
SampleRate: Pcm
*/

var sampleBuffer = new TSampleType[waveIn.WaveFormat.SampleRate / 10];

waveIn.DataAvailable += (s, a) =>
 {
     // interpret as 16 bit audio
     for (int index = 0; index < a.BytesRecorded; index += 2)
     {
         short sample = (short)((a.Buffer[index + 1] << 8) | a.Buffer[index + 0]);
         // to floating point
         var sample32 = sample / 32768f;
         sampleBuffer[index / 2] = sample32;
     }

     bpm.InputSamples(sampleBuffer, 800);
     // pSoundTouch.PutSamples(sampleBuffer, nSamples); Dear future phil, check out lines 148 and below, best, past phil


     Console.WriteLine(z);

     if (z == 9)
     {
         Console.WriteLine(bpm.GetBpm());
         z = 0;
     }
     z = z + 1;
 };     

Console.WriteLine (bpm.GetBpm ());бросает System.IndexOutOfRangeException.

Я пытался изменить многие вещи, такие как разное приведение float при создании sampleBuffer и присвоении различным numSamples bpm.InputSamples(sampleBuffer, numSamples);.Я не могу вспомнить все, что я пробовал, но я чувствую, что мне здесь не хватает чего-то очевидного.Спасибо за любой совет:)

...