Real-Time Onset Detection
Paul Dean
PaulD at 4stlaw.com
Wed Mar 19 19:07:35 CET 2008
Something is up with this and I can't find it. I'm an AUBIO noob
still.. lol
I'm trying to get onsets and their peak value in real-time. It's
actually working, but not 100%.
ISSUES:
*It seems if to many onsets happen at once, the program gets stuck and
it no longer detects them. Buffer issues?
*The "threshold" variable seems to be ignored. It has no effect.
*When I test for silence I get nothing. If I change silence to about
-10.0, I get ALL silence. Is this working correctly?
Forgive me if there are obvious errors in this, I am new to AUBIO and
DSP in general. This code was made in reference to aubioonset.c and
utils.c. I believe the issues are in my callback function. Thanks
for any help in advance.
//######################################################
//# Real-Time Onset Detector
//#
//# Note: "currently NO error protection"
//#
//######################################################
#include <aubio.h>
#include "portaudio/include/portaudio.h"
#include "portaudio/src/common/pa_trace.h"
#include <windows.h> //for Sleep() function
///////// PORTAUDIO ///////
#define SAMPLE_RATE (44100)
#define PA_SAMPLE_TYPE paFloat32
#define FRAMES_PER_BUFFER (256)
typedef struct PaQaData
{
unsigned long framesLeft;
int numChannels;
int bytesPerSample;
int mode;
short sawPhase;
PaSampleFormat format;
}PaQaData;
//////// AUBIO /////////
smpl_t threshold = (smpl_t)0.3;
smpl_t silence = -90.;
smpl_t peak;
fvec_t * ibuf;
aubio_pvoc_t * pv;
cvec_t * fftgrain;
uint_t buffer_size = (FRAMES_PER_BUFFER * 2);
uint_t overlap_size = FRAMES_PER_BUFFER;
uint_t channels = 1;
aubio_onsetdetection_type type_onset = aubio_onset_kl;
aubio_onsetdetection_t *o;
fvec_t *onset;
aubio_pickpeak_t * parms;
uint_t isonset = 0;
uint_t pos = 0; /*frames%dspblocksize*/
uint_t number = 0;
static int gNumNoInputs = 0;
///////////////////////////////////////////////////////////////////
class Audio
{
public:
Audio() { inDev = new PaStreamParameters; Pa_Initialize(); }
~Audio() { Pa_Terminate(); delete inDev; }
void StartCallback() { Pa_StartStream( stream ); }
void StopCallback() { Pa_StopStream( stream ); }
static int CallBack( const void *inputBuffer, void
*outputBuffer,unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData );
PaStreamParameters *inDev;
PaStream *stream;
PaQaData myData;
};
int Audio::CallBack( const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags, void *userData )
{
smpl_t *in = (smpl_t*)inputBuffer;
isonset=0;
/////// AUBIO ONSET DETECTION ////////////
unsigned int f; /*frames*/
ibuf->data = ∈
for (f=0;f<(unsigned)framesPerBuffer;f++) {
//time for fft
if (pos == overlap_size-1){
aubio_pvoc_do(pv,ibuf, fftgrain);
aubio_onsetdetection(o,fftgrain, onset);
isonset = aubio_peakpick_pimrt(onset,parms);
if (isonset){
// test for silence
if (aubio_silence_detection(ibuf, silence)==1){
isonset=0;
}
else{
peak = aubio_peakpick_pimrt_getval(parms);
printf("%d !ONSET DETECTED! %f \n",
number++, peak);
}
}
pos = -1; // so it will be zero next f loop
}
pos++;
}
return 0;
}
////////////////////////////////////////////////
int main(){
////////// AUBIO ////////////////////
pv = new_aubio_pvoc(buffer_size, overlap_size, channels);
ibuf = new_fvec(overlap_size, channels);
fftgrain = new_cvec(buffer_size, channels);
parms = new_aubio_peakpicker(threshold);
o = new_aubio_onsetdetection(type_onset,buffer_size,channels);
onset = new_fvec(1, channels);
//////// PORTAUDIO //////////////////
Audio *audio = new Audio();
audio->inDev->device = Pa_GetDefaultInputDevice();
audio->inDev->channelCount = channels;
audio->inDev->sampleFormat = PA_SAMPLE_TYPE;
audio->inDev->suggestedLatency = Pa_GetDeviceInfo(
audio->inDev->device )->defaultLowInputLatency;
audio->inDev->hostApiSpecificStreamInfo = NULL;
Pa_OpenStream ( &audio->stream, audio->inDev, NULL, SAMPLE_RATE,
FRAMES_PER_BUFFER, 0, audio->CallBack, NULL );
audio->StartCallback();
printf("\n The program will run for 30 seconds \n");
Sleep(30000);
return 0;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.aubio.org/pipermail/aubio-user/attachments/20080319/d265374a/attachment.html>
More information about the aubio-user
mailing list