From 35f73b8cda047d1115dec4efe967a8bed0f44020 Mon Sep 17 00:00:00 2001 From: Paul Brossier Date: Fri, 15 Mar 2013 17:48:10 -0500 Subject: [PATCH] src/onset/: remove wasonset, add getters and setters, improve doc --- src/onset/onset.c | 73 +++++++++++----------- src/onset/onset.h | 154 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 172 insertions(+), 55 deletions(-) diff --git a/src/onset/onset.c b/src/onset/onset.c index c05344f4..5939bb10 100644 --- a/src/onset/onset.c +++ b/src/onset/onset.c @@ -38,7 +38,6 @@ struct _aubio_onset_t { smpl_t silence; /**< silence threhsold */ uint_t minioi; /**< minimum inter onset interval */ uint_t delay; /**< constant delay, in samples, removed from detected onset times */ - fvec_t * wasonset; /**< number of blocks since last onset */ uint_t samplerate; /**< sampling rate of the input signal */ uint_t hop_size; /**< number of samples between two runs */ @@ -50,39 +49,30 @@ struct _aubio_onset_t { void aubio_onset_do (aubio_onset_t *o, fvec_t * input, fvec_t * onset) { smpl_t isonset = 0; - smpl_t wasonset = 0; aubio_pvoc_do (o->pv,input, o->fftgrain); aubio_specdesc_do (o->od,o->fftgrain, o->of); aubio_peakpicker_do(o->pp, o->of, onset); isonset = onset->data[0]; - wasonset = o->wasonset->data[0]; if (isonset > 0.) { if (aubio_silence_detection(input, o->silence)==1) { isonset = 0; - wasonset++; } else { - if (wasonset > o->minioi) { - wasonset = 0; - o->last_onset = o->total_frames + isonset * o->hop_size; + uint_t new_onset = o->total_frames + isonset * o->hop_size; + if (o->last_onset + o->minioi < new_onset) { + o->last_onset = new_onset; } else { isonset = 0; - wasonset++; } } } else { - if (wasonset == -1 && aubio_silence_detection(input, o->silence) == 0) { - //AUBIO_MSG("beginning of file is not silent, marking as onset\n", - // wasonset, aubio_silence_detection(input, o->silence)); + // we are at the beginning of the file, and we don't find silence + if (o->total_frames == 0 && aubio_silence_detection(input, o->silence) == 0) { + //AUBIO_DBG ("beginning of file is not silent, marking as onset\n"); isonset = o->delay / o->hop_size; o->last_onset = o->delay; - wasonset = 0; } - wasonset++; } - o->wasonset->data[0] = wasonset; - //onset->data[0] = isonset * o->hop_size - o->delay; onset->data[0] = isonset; - // also keep a copy of the offset for use in get_last_onset o->total_frames += o->hop_size; return; } @@ -102,15 +92,6 @@ smpl_t aubio_onset_get_last_onset_ms (aubio_onset_t *o) return aubio_onset_get_last_onset_s (o) / 1000.; } -smpl_t aubio_onset_get_descriptor(aubio_onset_t * o) { - return o->of->data[0]; -} - -smpl_t aubio_onset_get_thresholded_descriptor(aubio_onset_t * o) { - fvec_t * thresholded = aubio_peakpicker_get_thresholded_input(o->pp); - return thresholded->data[0]; -} - uint_t aubio_onset_set_silence(aubio_onset_t * o, smpl_t silence) { o->silence = silence; return AUBIO_OK; @@ -123,7 +104,7 @@ uint_t aubio_onset_set_threshold(aubio_onset_t * o, smpl_t threshold) { } uint_t aubio_onset_set_minioi(aubio_onset_t * o, uint_t minioi) { - o->minioi = FLOOR(minioi / 1000. * o->samplerate / o->hop_size); + o->minioi = minioi; return AUBIO_OK; } @@ -131,6 +112,22 @@ uint_t aubio_onset_get_minioi(aubio_onset_t * o) { return o->minioi; } +uint_t aubio_onset_set_minioi_s(aubio_onset_t * o, smpl_t minioi) { + return aubio_onset_set_minioi (o, minioi * o->samplerate); +} + +smpl_t aubio_onset_get_minioi_s(aubio_onset_t * o) { + return aubio_onset_get_minioi (o) / (smpl_t) o->samplerate; +} + +uint_t aubio_onset_set_minioi_ms(aubio_onset_t * o, smpl_t minioi) { + return aubio_onset_set_minioi_s (o, minioi / 1000.); +} + +smpl_t aubio_onset_get_minioi_ms(aubio_onset_t * o) { + return aubio_onset_get_minioi_s (o) * 1000.; +} + uint_t aubio_onset_set_delay(aubio_onset_t * o, uint_t delay) { o->delay = delay; return AUBIO_OK; @@ -156,32 +153,35 @@ smpl_t aubio_onset_get_delay_ms(aubio_onset_t * o) { return aubio_onset_get_delay_s (o) * 1000.; } +smpl_t aubio_onset_get_descriptor(aubio_onset_t * o) { + return o->of->data[0]; +} + +smpl_t aubio_onset_get_thresholded_descriptor(aubio_onset_t * o) { + fvec_t * thresholded = aubio_peakpicker_get_thresholded_input(o->pp); + return thresholded->data[0]; +} + /* Allocate memory for an onset detection */ aubio_onset_t * new_aubio_onset (char_t * onset_mode, uint_t buf_size, uint_t hop_size, uint_t samplerate) { aubio_onset_t * o = AUBIO_NEW(aubio_onset_t); /** set some default parameter */ + o->samplerate = samplerate; + o->hop_size = hop_size; o->last_onset = 0; o->threshold = 0.3; o->delay = 4.3 * hop_size; - o->minioi = 5; + o->minioi = 5 * hop_size; o->silence = -70; - o->wasonset = new_fvec(1); - o->wasonset->data[0] = -1.; o->total_frames = 0; - o->samplerate = samplerate; - o->hop_size = hop_size; - o->pv = new_aubio_pvoc(buf_size, hop_size); + o->pv = new_aubio_pvoc(buf_size, o->hop_size); o->pp = new_aubio_peakpicker(); aubio_peakpicker_set_threshold (o->pp, o->threshold); o->od = new_aubio_specdesc(onset_mode,buf_size); o->fftgrain = new_cvec(buf_size); o->of = new_fvec(1); - /*if (usedoubled) { - o2 = new_aubio_specdesc(onset_type2,buffer_size); - onset2 = new_fvec(1); - }*/ return o; } @@ -191,7 +191,6 @@ void del_aubio_onset (aubio_onset_t *o) del_aubio_peakpicker(o->pp); del_aubio_pvoc(o->pv); del_fvec(o->of); - del_fvec(o->wasonset); del_cvec(o->fftgrain); AUBIO_FREE(o); } diff --git a/src/onset/onset.h b/src/onset/onset.h index d9cf74be..83dfff3c 100644 --- a/src/onset/onset.h +++ b/src/onset/onset.h @@ -19,7 +19,7 @@ */ /** \file - + Onset detection object The following routines compute the onset detection function and detect peaks @@ -48,49 +48,68 @@ extern "C" { typedef struct _aubio_onset_t aubio_onset_t; /** create onset detection object - + \param method onset detection type as specified in specdesc.h \param buf_size buffer size for phase vocoder \param hop_size hop size for phase vocoder - \param samplerate sampling rate of the input signal + \param samplerate sampling rate of the input signal */ -aubio_onset_t * new_aubio_onset (char_t * method, +aubio_onset_t * new_aubio_onset (char_t * method, uint_t buf_size, uint_t hop_size, uint_t samplerate); /** execute onset detection - \param o onset detection object as returned by new_aubio_onset + \param o onset detection object as returned by ::new_aubio_onset \param input new audio vector of length hop_size - \param onset output vector, 1 if onset is found, 0 otherwise + \param onset output vector of length 1, containing 0 if no onset was found, + and a value equal or greater than 1 otherwise + + When no onset was detected, the first element of the output vector `onset` + is set to 0. + + When an onset is found, the first element of the output vector `onset` is set + to `offset = 1 + a` where `a` is a number in the range`[0, 1]`. + + The final onset detection time, in samples, can be obtained with + ::aubio_onset_get_last_onset. It can also be derived from `offset` as + follows: + + \code + t = total_frames + offset * hop_size - delay + \endcode + + where `total_frames` is the total number of frames processed so far, and + `delay` is the current delay of the onset object, as returned by + ::aubio_onset_get_delay. */ void aubio_onset_do (aubio_onset_t *o, fvec_t * input, fvec_t * onset); /** get the time of the latest onset detected, in samples - \param o onset detection object as returned by new_aubio_onset + \param o onset detection object as returned by ::new_aubio_onset */ smpl_t aubio_onset_get_last_onset (aubio_onset_t *o); /** get the time of the latest onset detected, in seconds - \param o onset detection object as returned by new_aubio_onset + \param o onset detection object as returned by ::new_aubio_onset */ smpl_t aubio_onset_get_last_onset_s (aubio_onset_t *o); /** get the time of the latest onset detected, in milliseconds - \param o onset detection object as returned by new_aubio_onset + \param o onset detection object as returned by ::new_aubio_onset */ smpl_t aubio_onset_get_last_onset_ms (aubio_onset_t *o); /** set onset detection silence threshold - \param o onset detection object as returned by new_aubio_onset + \param o onset detection object as returned by ::new_aubio_onset \param silence new silence detection threshold */ @@ -98,7 +117,7 @@ uint_t aubio_onset_set_silence(aubio_onset_t * o, smpl_t silence); /** get onset detection function - \param o onset detection object as returned by new_aubio_onset + \param o onset detection object as returned by ::new_aubio_onset \return the current value of the descriptor */ @@ -106,32 +125,131 @@ smpl_t aubio_onset_get_descriptor ( aubio_onset_t *o); /** get thresholded onset detection function - \param o onset detection object as returned by new_aubio_onset + \param o onset detection object as returned by ::new_aubio_onset \return the value of the thresholded descriptor */ smpl_t aubio_onset_get_thresholded_descriptor ( aubio_onset_t *o); -/** set onset detection peak picking threshold +/** set onset detection peak picking threshold - \param o onset detection object as returned by new_aubio_onset + \param o onset detection object as returned by ::new_aubio_onset \param threshold new peak-picking threshold */ uint_t aubio_onset_set_threshold(aubio_onset_t * o, smpl_t threshold); -/** set minimum inter onset interval +/** set minimum inter onset interval in samples - \param o onset detection object as returned by new_aubio_onset + \param o onset detection object as returned by ::new_aubio_onset \param minioi minimum interval between two consecutive onsets (in - milliseconds) + samples) */ uint_t aubio_onset_set_minioi(aubio_onset_t * o, uint_t minioi); +/** set minimum inter onset interval in seconds + + \param o onset detection object as returned by ::new_aubio_onset + \param minioi minimum interval between two consecutive onsets (in + seconds) + +*/ +uint_t aubio_onset_set_minioi_s(aubio_onset_t * o, smpl_t minioi); + +/** set minimum inter onset interval in milliseconds + + \param o onset detection object as returned by ::new_aubio_onset + \param minioi minimum interval between two consecutive onsets (in + milliseconds) + +*/ +uint_t aubio_onset_set_minioi_ms(aubio_onset_t * o, smpl_t minioi); + +/** set minimum inter onset interval in samples + + \param o onset detection object as returned by ::new_aubio_onset + \param delay constant system delay to take back from detection time + (in samples) + +*/ +uint_t aubio_onset_set_delay(aubio_onset_t * o, uint_t delay); + +/** set minimum inter onset interval in seconds + + \param o onset detection object as returned by ::new_aubio_onset + \param delay constant system delay to take back from detection time + (in seconds) + +*/ +uint_t aubio_onset_set_delay_s(aubio_onset_t * o, smpl_t delay); + +/** set minimum inter onset interval in milliseconds + + \param o onset detection object as returned by ::new_aubio_onset + \param delay constant system delay to take back from detection time + (in milliseconds) + +*/ +uint_t aubio_onset_set_delay_ms(aubio_onset_t * o, smpl_t delay); + +/** get minimum inter onset interval in samples + + \param o onset detection object as returned by ::new_aubio_onset + \return minimum interval between two consecutive onsets (in + samples) + +*/ +uint_t aubio_onset_get_minioi(aubio_onset_t * o); + +/** get minimum inter onset interval in seconds + + \param o onset detection object as returned by ::new_aubio_onset + \return minimum interval between two consecutive onsets (in + seconds) + +*/ +smpl_t aubio_onset_get_minioi_s(aubio_onset_t * o); + +/** get minimum inter onset interval in milliseconds + + \param o onset detection object as returned by ::new_aubio_onset + \return minimum interval between two consecutive onsets (in + milliseconds) + +*/ +smpl_t aubio_onset_get_minioi_ms(aubio_onset_t * o); + +/** get minimum inter onset interval in samples + + \param o onset detection object as returned by ::new_aubio_onset + \return constant system delay to take back from detection time + (in samples) + +*/ +uint_t aubio_onset_get_delay(aubio_onset_t * o); + +/** get minimum inter onset interval in seconds + + \param o onset detection object as returned by ::new_aubio_onset + \return constant system delay to take back from detection time + (in seconds) + +*/ +smpl_t aubio_onset_get_delay_s(aubio_onset_t * o); + +/** get minimum inter onset interval in milliseconds + + \param o onset detection object as returned by ::new_aubio_onset + \return constant system delay to take back from detection time + (in milliseconds) + +*/ +smpl_t aubio_onset_get_delay_ms(aubio_onset_t * o); + /** delete onset detection object - \param o onset detection object to delete + \param o onset detection object to delete */ void del_aubio_onset(aubio_onset_t * o); -- 2.26.2