Simon
Simon

Reputation: 1312

BASS WASAPI BPMCounter

I want to analyse my default playback device and detect the beats. I've been using the BASS WASAPI to get the FFT data of the selected device with:

int ret = BassWasapi.BASS_WASAPI_GetData(_fft, (int)BASSData.BASS_DATA_FFT2048);

Now I was using the data to generate spectrum data and display this to the user. In addition I want to detect the Beats using the BPMCounter Class from BASS. However as far as I can tell the BPMCounter.ProcessAudio() function requires a stream (which I don't get with WASAPI) in order to work. Is there a ways I can use BPMCounter with WASAPI? Would be great if someone can point me to the right direction. Thanks

Edit: Tried this to convert the data to a stream, but without success:

int ret = BassWasapi.BASS_WASAPI_GetData(_fft, (int)BASSData.BASS_DATA_FFT2048); //get channel fft data
var chan = Bass.BASS_StreamCreate(0, 44100, BASSFlag.BASS_DEFAULT, BASSStreamProc.STREAMPROC_PUSH);
Bass.BASS_ChannelPlay(chan, false);
Bass.BASS_StreamPutData(chan, _fft, _fft.Length);
bool beat = _count.ProcessAudio(chan, true);
Debug.Write(beat);

beat is always False, however I can see at the Spectrum that the capturing of the FFT Data is corrent.

Upvotes: 0

Views: 1348

Answers (1)

Greg Anakin
Greg Anakin

Reputation: 11

I've just started playing with this lib a few hours ago and i am still going through the examples. So my answer maybe is not what you want. For my project i also want to transform WASAPI into a stream and use it for a displaying a spectrum. What i did was to create a StreamPush, right after BASS_WASAPI initialization.

To init your WASAPI use this call and this delegate:

private InitWasapi()
{
  WASAPIPROC _process = new WASAPIPROC(Process); // Delegate
  bool res = BassWasapi.BASS_WASAPI_Init(_YourDeviceNumber, 0, 0, BASSWASAPIInit.BASS_WASAPI_BUFFER, 1f, 0f, _process, IntPtr.Zero);
  if (!res)
  {
    // Do error checking
  }      

  // This is the part you are looking for (maybe!)
  // Use these flags because Wasapi needs 32-bit sample data
  var info = BassWasapi.BASS_WASAPI_GetInfo();
  _stream = Bass.BASS_StreamCreatePush(info.freq, info.chans, BASSFlag.BASS_STREAM_DECODE | BASSFlag.BASS_SAMPLE_FLOAT, IntPtr.Zero);

  BassWasapi.BASS_WASAPI_Start();
}

private int Process(IntPtr buffer, int length, IntPtr user)
{
  Bass.BASS_StreamPutData(_stream, buffer, length);
  return length;
}

Please note: This works, but i am still experimenting. For example i am not getting the same spectrum output as when i create the stream from the music file itself. There are some (small) differences. Maybe it's because i am using a custom EQ in Winamp for playing the same .mp3. So if anyone knows more on this subject, i would like also to hear it!

Upvotes: 1

Related Questions