Я хочу захватить звук с микрофона с помощью 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);
.Я не могу вспомнить все, что я пробовал, но я чувствую, что мне здесь не хватает чего-то очевидного.Спасибо за любой совет:)