From: Paul Brossier Date: Tue, 3 Nov 2009 17:23:04 +0000 (+0100) Subject: src/spectral/specdesc.{c,h}: rename aubio_onsetdetection to aubio_specdesc X-Git-Tag: 0.4.0-beta1~578 X-Git-Url: https://git.aubio.org/?a=commitdiff_plain;h=31907fd993a3680189eec64ca301467fa77df7bd;p=aubio.git src/spectral/specdesc.{c,h}: rename aubio_onsetdetection to aubio_specdesc --- diff --git a/python/aubio/aubioclass.py b/python/aubio/aubioclass.py index fd92727b..ded95485 100644 --- a/python/aubio/aubioclass.py +++ b/python/aubio/aubioclass.py @@ -68,13 +68,13 @@ class pvoc: aubio_pvoc_rdo(self.pv,tc(),tf()) class onsetdetection: - """ class for aubio_onsetdetection """ + """ class for aubio_specdesc """ def __init__(self,mode,buf,chan): - self.od = new_aubio_onsetdetection(mode,buf,chan) + self.od = new_aubio_specdesc(mode,buf,chan) def do(self,tc,tf): - aubio_onsetdetection_do(self.od,tc(),tf()) + aubio_specdesc_do(self.od,tc(),tf()) def __del__(self): - del_aubio_onsetdetection(self.od) + del_aubio_specdesc(self.od) class peakpick: """ class for aubio_peakpicker """ @@ -91,7 +91,7 @@ class peakpick: del_aubio_peakpicker(self.pp) class onsetpick: - """ superclass for aubio_pvoc + aubio_onsetdetection + aubio_peakpicker """ + """ superclass for aubio_pvoc + aubio_specdesc + aubio_peakpicker """ def __init__(self,bufsize,hopsize,channels,myvec,threshold,mode='dual',derivate=False,dcthreshold=0): self.myfft = cvec(bufsize,channels) self.pv = pvoc(bufsize,hopsize,channels) diff --git a/src/Makefile.am b/src/Makefile.am index 7ece9d55..931557e5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -22,6 +22,7 @@ nobase_pkginclude_HEADERS = \ spectral/phasevoc.h \ spectral/fft.h \ spectral/tss.h \ + spectral/specdesc.h \ spectral/spectral_centroid.h \ pitch/pitch.h \ pitch/pitchmcomb.h \ @@ -30,7 +31,6 @@ nobase_pkginclude_HEADERS = \ pitch/pitchfcomb.h \ pitch/pitchyinfft.h \ onset/onset.h \ - onset/onsetdetection.h \ onset/peakpick.h \ tempo/tempo.h \ tempo/beattracking.h diff --git a/src/aubio.h b/src/aubio.h index 5b553189..6008ad4e 100644 --- a/src/aubio.h +++ b/src/aubio.h @@ -165,6 +165,7 @@ extern "C" #include "spectral/fft.h" #include "spectral/phasevoc.h" #include "spectral/mfcc.h" +#include "spectral/specdesc.h" #include "pitch/pitch.h" #include "onset/onset.h" #include "tempo/tempo.h" @@ -182,7 +183,6 @@ extern "C" #include "pitch/pitchyinfft.h" #include "pitch/pitchschmitt.h" #include "pitch/pitchfcomb.h" -#include "onset/onsetdetection.h" #include "spectral/spectral_centroid.h" #include "onset/peakpick.h" #include "tempo/beattracking.h" diff --git a/src/onset/onset.c b/src/onset/onset.c index 2d567c9a..d626702b 100644 --- a/src/onset/onset.c +++ b/src/onset/onset.c @@ -21,7 +21,7 @@ #include "aubio_priv.h" #include "fvec.h" #include "cvec.h" -#include "onset/onsetdetection.h" +#include "spectral/specdesc.h" #include "spectral/phasevoc.h" #include "onset/peakpick.h" #include "mathutils.h" @@ -30,7 +30,7 @@ /** structure to store object state */ struct _aubio_onset_t { aubio_pvoc_t * pv; /**< phase vocoder */ - aubio_onsetdetection_t * od; /**< onset detection */ + aubio_specdesc_t * od; /**< onset detection */ aubio_peakpicker_t * pp; /**< peak picker */ cvec_t * fftgrain; /**< phase vocoder output */ fvec_t * of; /**< onset detection function */ @@ -48,9 +48,9 @@ void aubio_onset_do (aubio_onset_t *o, fvec_t * input, fvec_t * onset) smpl_t wasonset = 0; uint_t i; aubio_pvoc_do (o->pv,input, o->fftgrain); - aubio_onsetdetection_do (o->od,o->fftgrain, o->of); + aubio_specdesc_do (o->od,o->fftgrain, o->of); /*if (usedoubled) { - aubio_onsetdetection_do (o2,fftgrain, onset2); + aubio_specdesc_do (o2,fftgrain, onset2); onset->data[0][0] *= onset2->data[0][0]; }*/ aubio_peakpicker_do(o->pp, o->of, onset); @@ -108,11 +108,11 @@ aubio_onset_t * new_aubio_onset (char_t * onset_mode, o->pv = new_aubio_pvoc(buf_size, hop_size, channels); o->pp = new_aubio_peakpicker(channels); aubio_peakpicker_set_threshold (o->pp, o->threshold); - o->od = new_aubio_onsetdetection(onset_mode,buf_size,channels); + o->od = new_aubio_specdesc(onset_mode,buf_size,channels); o->fftgrain = new_cvec(buf_size,channels); o->of = new_fvec(1, channels); /*if (usedoubled) { - o2 = new_aubio_onsetdetection(onset_type2,buffer_size,channels); + o2 = new_aubio_specdesc(onset_type2,buffer_size,channels); onset2 = new_fvec(1 , channels); }*/ return o; @@ -120,7 +120,7 @@ aubio_onset_t * new_aubio_onset (char_t * onset_mode, void del_aubio_onset (aubio_onset_t *o) { - del_aubio_onsetdetection(o->od); + del_aubio_specdesc(o->od); del_aubio_peakpicker(o->pp); del_aubio_pvoc(o->pv); del_fvec(o->of); diff --git a/src/onset/onset.h b/src/onset/onset.h index a94770c6..67a34f48 100644 --- a/src/onset/onset.h +++ b/src/onset/onset.h @@ -46,7 +46,7 @@ typedef struct _aubio_onset_t aubio_onset_t; /** create onset detection object - \param onset_mode onset detection type as specified in onsetdetection.h + \param onset_mode 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 channels number of channels diff --git a/src/onset/onsetdetection.c b/src/onset/onsetdetection.c deleted file mode 100644 index 6b06a0dc..00000000 --- a/src/onset/onsetdetection.c +++ /dev/null @@ -1,455 +0,0 @@ -/* - Copyright (C) 2003-2009 Paul Brossier - - This file is part of aubio. - - aubio is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - aubio is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with aubio. If not, see . - -*/ - -#include "aubio_priv.h" -#include "fvec.h" -#include "cvec.h" -#include "spectral/fft.h" -#include "mathutils.h" -#include "utils/hist.h" -#include "onset/onsetdetection.h" - -/** Energy based onset detection function - - This function calculates the local energy of the input spectral frame. - - \param o onset detection object as returned by new_aubio_onsetdetection() - \param fftgrain input spectral frame - \param onset output onset detection function - -*/ -void aubio_onsetdetection_energy(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset); -/** High Frequency Content onset detection function - - This method computes the High Frequency Content (HFC) of the input spectral - frame. The resulting function is efficient at detecting percussive onsets. - - Paul Masri. Computer modeling of Sound for Transformation and Synthesis of - Musical Signal. PhD dissertation, University of Bristol, UK, 1996. - - \param o onset detection object as returned by new_aubio_onsetdetection() - \param fftgrain input spectral frame - \param onset output onset detection function - -*/ -void aubio_onsetdetection_hfc(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset); -/** Complex Domain Method onset detection function - - Christopher Duxbury, Mike E. Davies, and Mark B. Sandler. Complex domain - onset detection for musical signals. In Proceedings of the Digital Audio - Effects Conference, DAFx-03, pages 90-93, London, UK, 2003. - - \param o onset detection object as returned by new_aubio_onsetdetection() - \param fftgrain input spectral frame - \param onset output onset detection function - -*/ -void aubio_onsetdetection_complex(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset); -/** Phase Based Method onset detection function - - Juan-Pablo Bello, Mike P. Davies, and Mark B. Sandler. Phase-based note onset - detection for music signals. In Proceedings of the IEEE International - Conference on Acoustics Speech and Signal Processing, pages 441­444, - Hong-Kong, 2003. - - \param o onset detection object as returned by new_aubio_onsetdetection() - \param fftgrain input spectral frame - \param onset output onset detection function - -*/ -void aubio_onsetdetection_phase(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset); -/** Spectral difference method onset detection function - - Jonhatan Foote and Shingo Uchihashi. The beat spectrum: a new approach to - rhythm analysis. In IEEE International Conference on Multimedia and Expo - (ICME 2001), pages 881­884, Tokyo, Japan, August 2001. - - \param o onset detection object as returned by new_aubio_onsetdetection() - \param fftgrain input spectral frame - \param onset output onset detection function - -*/ -void aubio_onsetdetection_specdiff(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset); -/** Kullback-Liebler onset detection function - - Stephen Hainsworth and Malcom Macleod. Onset detection in music audio - signals. In Proceedings of the International Computer Music Conference - (ICMC), Singapore, 2003. - - \param o onset detection object as returned by new_aubio_onsetdetection() - \param fftgrain input spectral frame - \param onset output onset detection function - -*/ -void aubio_onsetdetection_kl(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset); -/** Modified Kullback-Liebler onset detection function - - Paul Brossier, ``Automatic annotation of musical audio for interactive - systems'', Chapter 2, Temporal segmentation, PhD thesis, Centre for Digital - music, Queen Mary University of London, London, UK, 2006. - - \param o onset detection object as returned by new_aubio_onsetdetection() - \param fftgrain input spectral frame - \param onset output onset detection function - -*/ -void aubio_onsetdetection_mkl(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset); -/** Spectral Flux - - Simon Dixon, Onset Detection Revisited, in ``Proceedings of the 9th - International Conference on Digital Audio Effects'' (DAFx-06), Montreal, - Canada, 2006. - - \param o onset detection object as returned by new_aubio_onsetdetection() - \param fftgrain input spectral frame - \param onset output onset detection function - -*/ -void aubio_onsetdetection_specflux(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset); - -/** onsetdetection types */ -typedef enum { - aubio_onset_energy, /**< energy based */ - aubio_onset_specdiff, /**< spectral diff */ - aubio_onset_hfc, /**< high frequency content */ - aubio_onset_complex, /**< complex domain */ - aubio_onset_phase, /**< phase fast */ - aubio_onset_kl, /**< Kullback Liebler */ - aubio_onset_mkl, /**< modified Kullback Liebler */ - aubio_onset_specflux, /**< spectral flux */ - aubio_onset_default = aubio_onset_hfc, /**< default mode, set to hfc */ -} aubio_onsetdetection_type; - -/** structure to store object state */ -struct _aubio_onsetdetection_t { - aubio_onsetdetection_type onset_type; /**< onset detection type */ - /** Pointer to aubio_onsetdetection_ function */ - void (*funcpointer)(aubio_onsetdetection_t *o, - cvec_t * fftgrain, fvec_t * onset); - smpl_t threshold; /**< minimum norm threshold for phase and specdiff */ - fvec_t *oldmag; /**< previous norm vector */ - fvec_t *dev1 ; /**< current onset detection measure vector */ - fvec_t *theta1; /**< previous phase vector, one frame behind */ - fvec_t *theta2; /**< previous phase vector, two frames behind */ - aubio_hist_t * histog; /**< histogram */ -}; - - -/* Energy based onset detection function */ -void aubio_onsetdetection_energy (aubio_onsetdetection_t *o UNUSED, - cvec_t * fftgrain, fvec_t * onset) { - uint_t i,j; - for (i=0;ichannels;i++) { - onset->data[i][0] = 0.; - for (j=0;jlength;j++) { - onset->data[i][0] += SQR(fftgrain->norm[i][j]); - } - } -} - -/* High Frequency Content onset detection function */ -void aubio_onsetdetection_hfc(aubio_onsetdetection_t *o UNUSED, - cvec_t * fftgrain, fvec_t * onset){ - uint_t i,j; - for (i=0;ichannels;i++) { - onset->data[i][0] = 0.; - for (j=0;jlength;j++) { - onset->data[i][0] += (j+1)*fftgrain->norm[i][j]; - } - } -} - - -/* Complex Domain Method onset detection function */ -void aubio_onsetdetection_complex (aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset) { - uint_t i, j; - uint_t nbins = fftgrain->length; - for (i=0;ichannels; i++) { - onset->data[i][0] = 0.; - for (j=0;jdev1->data[i][j] = 2. * o->theta1->data[i][j] - o->theta2->data[i][j]; - // compute the euclidean distance in the complex domain - // sqrt ( r_1^2 + r_2^2 - 2 * r_1 * r_2 * \cos ( \phi_1 - \phi_2 ) ) - onset->data[i][0] += - SQRT (ABS (SQR (o->oldmag->data[i][j]) + SQR (fftgrain->norm[i][j]) - - 2. * o->oldmag->data[i][j] * fftgrain->norm[i][j] - * COS (o->dev1->data[i][j] - fftgrain->phas[i][j]))); - /* swap old phase data (need to remember 2 frames behind)*/ - o->theta2->data[i][j] = o->theta1->data[i][j]; - o->theta1->data[i][j] = fftgrain->phas[i][j]; - /* swap old magnitude data (1 frame is enough) */ - o->oldmag->data[i][j] = fftgrain->norm[i][j]; - } - } -} - - -/* Phase Based Method onset detection function */ -void aubio_onsetdetection_phase(aubio_onsetdetection_t *o, - cvec_t * fftgrain, fvec_t * onset){ - uint_t i, j; - uint_t nbins = fftgrain->length; - for (i=0;ichannels; i++) { - onset->data[i][0] = 0.0; - o->dev1->data[i][0]=0.; - for ( j=0;jdev1->data[i][j] = - aubio_unwrap2pi( - fftgrain->phas[i][j] - -2.0*o->theta1->data[i][j] - +o->theta2->data[i][j]); - if ( o->threshold < fftgrain->norm[i][j] ) - o->dev1->data[i][j] = ABS(o->dev1->data[i][j]); - else - o->dev1->data[i][j] = 0.0; - /* keep a track of the past frames */ - o->theta2->data[i][j] = o->theta1->data[i][j]; - o->theta1->data[i][j] = fftgrain->phas[i][j]; - } - /* apply o->histogram */ - aubio_hist_dyn_notnull(o->histog,o->dev1); - /* weight it */ - aubio_hist_weight(o->histog); - /* its mean is the result */ - onset->data[i][0] = aubio_hist_mean(o->histog); - //onset->data[i][0] = fvec_mean(o->dev1); - } -} - -/* Spectral difference method onset detection function */ -void aubio_onsetdetection_specdiff(aubio_onsetdetection_t *o, - cvec_t * fftgrain, fvec_t * onset){ - uint_t i, j; - uint_t nbins = fftgrain->length; - for (i=0;ichannels; i++) { - onset->data[i][0] = 0.0; - for (j=0;jdev1->data[i][j] = SQRT( - ABS(SQR( fftgrain->norm[i][j]) - - SQR(o->oldmag->data[i][j]))); - if (o->threshold < fftgrain->norm[i][j] ) - o->dev1->data[i][j] = ABS(o->dev1->data[i][j]); - else - o->dev1->data[i][j] = 0.0; - o->oldmag->data[i][j] = fftgrain->norm[i][j]; - } - - /* apply o->histogram (act somewhat as a low pass on the - * overall function)*/ - aubio_hist_dyn_notnull(o->histog,o->dev1); - /* weight it */ - aubio_hist_weight(o->histog); - /* its mean is the result */ - onset->data[i][0] = aubio_hist_mean(o->histog); - - } -} - -/* Kullback Liebler onset detection function - * note we use ln(1+Xn/(Xn-1+0.0001)) to avoid - * negative (1.+) and infinite values (+1.e-10) */ -void aubio_onsetdetection_kl(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset){ - uint_t i,j; - for (i=0;ichannels;i++) { - onset->data[i][0] = 0.; - for (j=0;jlength;j++) { - onset->data[i][0] += fftgrain->norm[i][j] - *LOG(1.+fftgrain->norm[i][j]/(o->oldmag->data[i][j]+1.e-10)); - o->oldmag->data[i][j] = fftgrain->norm[i][j]; - } - if (isnan(onset->data[i][0])) onset->data[i][0] = 0.; - } -} - -/* Modified Kullback Liebler onset detection function - * note we use ln(1+Xn/(Xn-1+0.0001)) to avoid - * negative (1.+) and infinite values (+1.e-10) */ -void aubio_onsetdetection_mkl(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset){ - uint_t i,j; - for (i=0;ichannels;i++) { - onset->data[i][0] = 0.; - for (j=0;jlength;j++) { - onset->data[i][0] += LOG(1.+fftgrain->norm[i][j]/(o->oldmag->data[i][j]+1.e-10)); - o->oldmag->data[i][j] = fftgrain->norm[i][j]; - } - if (isnan(onset->data[i][0])) onset->data[i][0] = 0.; - } -} - -/* Spectral flux */ -void aubio_onsetdetection_specflux(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset){ - uint_t i, j; - for (i=0;ichannels;i++) { - onset->data[i][0] = 0.; - for (j=0;jlength;j++) { - if (fftgrain->norm[i][j] > o->oldmag->data[i][j]) - onset->data[i][0] += fftgrain->norm[i][j] - o->oldmag->data[i][j]; - o->oldmag->data[i][j] = fftgrain->norm[i][j]; - } - } -} - -/* Generic function pointing to the choosen one */ -void -aubio_onsetdetection_do (aubio_onsetdetection_t *o, cvec_t * fftgrain, - fvec_t * onset) { - o->funcpointer(o,fftgrain,onset); -} - -/* Allocate memory for an onset detection - * depending on the choosen type, allocate memory as needed - */ -aubio_onsetdetection_t * -new_aubio_onsetdetection (char_t * onset_mode, - uint_t size, uint_t channels){ - aubio_onsetdetection_t * o = AUBIO_NEW(aubio_onsetdetection_t); - uint_t rsize = size/2+1; - aubio_onsetdetection_type onset_type; - if (strcmp (onset_mode, "energy") == 0) - onset_type = aubio_onset_energy; - else if (strcmp (onset_mode, "specdiff") == 0) - onset_type = aubio_onset_specdiff; - else if (strcmp (onset_mode, "hfc") == 0) - onset_type = aubio_onset_hfc; - else if (strcmp (onset_mode, "complexdomain") == 0) - onset_type = aubio_onset_complex; - else if (strcmp (onset_mode, "complex") == 0) - onset_type = aubio_onset_complex; - else if (strcmp (onset_mode, "phase") == 0) - onset_type = aubio_onset_phase; - else if (strcmp (onset_mode, "mkl") == 0) - onset_type = aubio_onset_mkl; - else if (strcmp (onset_mode, "kl") == 0) - onset_type = aubio_onset_kl; - else if (strcmp (onset_mode, "specflux") == 0) - onset_type = aubio_onset_specflux; - else if (strcmp (onset_mode, "default") == 0) - onset_type = aubio_onset_default; - else { - AUBIO_ERR("unknown onset type.\n"); - onset_type = aubio_onset_default; - } - switch(onset_type) { - /* for both energy and hfc, only fftgrain->norm is required */ - case aubio_onset_energy: - break; - case aubio_onset_hfc: - break; - /* the other approaches will need some more memory spaces */ - case aubio_onset_complex: - o->oldmag = new_fvec(rsize,channels); - o->dev1 = new_fvec(rsize,channels); - o->theta1 = new_fvec(rsize,channels); - o->theta2 = new_fvec(rsize,channels); - break; - case aubio_onset_phase: - o->dev1 = new_fvec(rsize,channels); - o->theta1 = new_fvec(rsize,channels); - o->theta2 = new_fvec(rsize,channels); - o->histog = new_aubio_hist(0.0, PI, 10, channels); - o->threshold = 0.1; - break; - case aubio_onset_specdiff: - o->oldmag = new_fvec(rsize,channels); - o->dev1 = new_fvec(rsize,channels); - o->histog = new_aubio_hist(0.0, PI, 10, channels); - o->threshold = 0.1; - break; - case aubio_onset_kl: - case aubio_onset_mkl: - case aubio_onset_specflux: - o->oldmag = new_fvec(rsize,channels); - break; - default: - break; - } - - /* this switch could be in its own function to change between - * detections on the fly. this would need getting rid of the switch - * above and always allocate all the structure */ - - switch(onset_type) { - case aubio_onset_energy: - o->funcpointer = aubio_onsetdetection_energy; - break; - case aubio_onset_hfc: - o->funcpointer = aubio_onsetdetection_hfc; - break; - case aubio_onset_complex: - o->funcpointer = aubio_onsetdetection_complex; - break; - case aubio_onset_phase: - o->funcpointer = aubio_onsetdetection_phase; - break; - case aubio_onset_specdiff: - o->funcpointer = aubio_onsetdetection_specdiff; - break; - case aubio_onset_kl: - o->funcpointer = aubio_onsetdetection_kl; - break; - case aubio_onset_mkl: - o->funcpointer = aubio_onsetdetection_mkl; - break; - case aubio_onset_specflux: - o->funcpointer = aubio_onsetdetection_specflux; - break; - default: - break; - } - o->onset_type = onset_type; - return o; -} - -void del_aubio_onsetdetection (aubio_onsetdetection_t *o){ - switch(o->onset_type) { - /* for both energy and hfc, only fftgrain->norm is required */ - case aubio_onset_energy: - break; - case aubio_onset_hfc: - break; - /* the other approaches will need some more memory spaces */ - case aubio_onset_complex: - del_fvec(o->oldmag); - del_fvec(o->dev1); - del_fvec(o->theta1); - del_fvec(o->theta2); - break; - case aubio_onset_phase: - del_fvec(o->dev1); - del_fvec(o->theta1); - del_fvec(o->theta2); - del_aubio_hist(o->histog); - break; - case aubio_onset_specdiff: - del_fvec(o->oldmag); - del_fvec(o->dev1); - del_aubio_hist(o->histog); - break; - case aubio_onset_kl: - case aubio_onset_mkl: - case aubio_onset_specflux: - del_fvec(o->oldmag); - break; - default: - break; - } - AUBIO_FREE(o); -} diff --git a/src/onset/onsetdetection.h b/src/onset/onsetdetection.h deleted file mode 100644 index b4b01ba2..00000000 --- a/src/onset/onsetdetection.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - Copyright (C) 2003-2009 Paul Brossier - - This file is part of aubio. - - aubio is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - aubio is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with aubio. If not, see . - -*/ - -/** \file - - Onset detection functions - - All of the following onset detection function take as arguments the FFT of a - windowed signal (as created with aubio_pvoc). They output one smpl_t per - buffer and per channel (stored in a vector of size [channels]x[1]). - - These functions were first adapted from Juan Pablo Bello's code, and now - include further improvements and modifications made within aubio. - -*/ - - -#ifndef ONSETDETECTION_H -#define ONSETDETECTION_H - -#ifdef __cplusplus -extern "C" { -#endif - -/** onsetdetection structure */ -typedef struct _aubio_onsetdetection_t aubio_onsetdetection_t; -/** execute onset detection function on a spectral frame - - Generic function to compute onset detection. - - \param o onset detection object as returned by new_aubio_onsetdetection() - \param fftgrain input signal spectrum as computed by aubio_pvoc_do - \param onset output vector (one sample long, to send to the peak picking) - -*/ -void aubio_onsetdetection_do (aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset); -/** creation of an onset detection object - - \param type onset detection mode - \param size length of the input spectrum frame - \param channels number of input channels - -*/ -aubio_onsetdetection_t * new_aubio_onsetdetection(char_t * onset_mode, uint_t buf_size, uint_t channels); -/** deletion of an onset detection object - - \param o onset detection object as returned by new_aubio_onsetdetection() - -*/ -void del_aubio_onsetdetection(aubio_onsetdetection_t *o); - -#ifdef __cplusplus -} -#endif - -#endif /* ONSETDETECTION_H */ diff --git a/src/spectral/specdesc.c b/src/spectral/specdesc.c new file mode 100644 index 00000000..684a16cd --- /dev/null +++ b/src/spectral/specdesc.c @@ -0,0 +1,455 @@ +/* + Copyright (C) 2003-2009 Paul Brossier + + This file is part of aubio. + + aubio is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + aubio is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with aubio. If not, see . + +*/ + +#include "aubio_priv.h" +#include "fvec.h" +#include "cvec.h" +#include "spectral/fft.h" +#include "spectral/specdesc.h" +#include "mathutils.h" +#include "utils/hist.h" + +/** Energy based onset detection function + + This function calculates the local energy of the input spectral frame. + + \param o onset detection object as returned by new_aubio_specdesc() + \param fftgrain input spectral frame + \param onset output onset detection function + +*/ +void aubio_specdesc_energy(aubio_specdesc_t *o, cvec_t * fftgrain, fvec_t * onset); +/** High Frequency Content onset detection function + + This method computes the High Frequency Content (HFC) of the input spectral + frame. The resulting function is efficient at detecting percussive onsets. + + Paul Masri. Computer modeling of Sound for Transformation and Synthesis of + Musical Signal. PhD dissertation, University of Bristol, UK, 1996. + + \param o onset detection object as returned by new_aubio_specdesc() + \param fftgrain input spectral frame + \param onset output onset detection function + +*/ +void aubio_specdesc_hfc(aubio_specdesc_t *o, cvec_t * fftgrain, fvec_t * onset); +/** Complex Domain Method onset detection function + + Christopher Duxbury, Mike E. Davies, and Mark B. Sandler. Complex domain + onset detection for musical signals. In Proceedings of the Digital Audio + Effects Conference, DAFx-03, pages 90-93, London, UK, 2003. + + \param o onset detection object as returned by new_aubio_specdesc() + \param fftgrain input spectral frame + \param onset output onset detection function + +*/ +void aubio_specdesc_complex(aubio_specdesc_t *o, cvec_t * fftgrain, fvec_t * onset); +/** Phase Based Method onset detection function + + Juan-Pablo Bello, Mike P. Davies, and Mark B. Sandler. Phase-based note onset + detection for music signals. In Proceedings of the IEEE International + Conference on Acoustics Speech and Signal Processing, pages 441­444, + Hong-Kong, 2003. + + \param o onset detection object as returned by new_aubio_specdesc() + \param fftgrain input spectral frame + \param onset output onset detection function + +*/ +void aubio_specdesc_phase(aubio_specdesc_t *o, cvec_t * fftgrain, fvec_t * onset); +/** Spectral difference method onset detection function + + Jonhatan Foote and Shingo Uchihashi. The beat spectrum: a new approach to + rhythm analysis. In IEEE International Conference on Multimedia and Expo + (ICME 2001), pages 881­884, Tokyo, Japan, August 2001. + + \param o onset detection object as returned by new_aubio_specdesc() + \param fftgrain input spectral frame + \param onset output onset detection function + +*/ +void aubio_specdesc_specdiff(aubio_specdesc_t *o, cvec_t * fftgrain, fvec_t * onset); +/** Kullback-Liebler onset detection function + + Stephen Hainsworth and Malcom Macleod. Onset detection in music audio + signals. In Proceedings of the International Computer Music Conference + (ICMC), Singapore, 2003. + + \param o onset detection object as returned by new_aubio_specdesc() + \param fftgrain input spectral frame + \param onset output onset detection function + +*/ +void aubio_specdesc_kl(aubio_specdesc_t *o, cvec_t * fftgrain, fvec_t * onset); +/** Modified Kullback-Liebler onset detection function + + Paul Brossier, ``Automatic annotation of musical audio for interactive + systems'', Chapter 2, Temporal segmentation, PhD thesis, Centre for Digital + music, Queen Mary University of London, London, UK, 2006. + + \param o onset detection object as returned by new_aubio_specdesc() + \param fftgrain input spectral frame + \param onset output onset detection function + +*/ +void aubio_specdesc_mkl(aubio_specdesc_t *o, cvec_t * fftgrain, fvec_t * onset); +/** Spectral Flux + + Simon Dixon, Onset Detection Revisited, in ``Proceedings of the 9th + International Conference on Digital Audio Effects'' (DAFx-06), Montreal, + Canada, 2006. + + \param o onset detection object as returned by new_aubio_specdesc() + \param fftgrain input spectral frame + \param onset output onset detection function + +*/ +void aubio_specdesc_specflux(aubio_specdesc_t *o, cvec_t * fftgrain, fvec_t * onset); + +/** onsetdetection types */ +typedef enum { + aubio_onset_energy, /**< energy based */ + aubio_onset_specdiff, /**< spectral diff */ + aubio_onset_hfc, /**< high frequency content */ + aubio_onset_complex, /**< complex domain */ + aubio_onset_phase, /**< phase fast */ + aubio_onset_kl, /**< Kullback Liebler */ + aubio_onset_mkl, /**< modified Kullback Liebler */ + aubio_onset_specflux, /**< spectral flux */ + aubio_onset_default = aubio_onset_hfc, /**< default mode, set to hfc */ +} aubio_specdesc_type; + +/** structure to store object state */ +struct _aubio_specdesc_t { + aubio_specdesc_type onset_type; /**< onset detection type */ + /** Pointer to aubio_specdesc_ function */ + void (*funcpointer)(aubio_specdesc_t *o, + cvec_t * fftgrain, fvec_t * onset); + smpl_t threshold; /**< minimum norm threshold for phase and specdiff */ + fvec_t *oldmag; /**< previous norm vector */ + fvec_t *dev1 ; /**< current onset detection measure vector */ + fvec_t *theta1; /**< previous phase vector, one frame behind */ + fvec_t *theta2; /**< previous phase vector, two frames behind */ + aubio_hist_t * histog; /**< histogram */ +}; + + +/* Energy based onset detection function */ +void aubio_specdesc_energy (aubio_specdesc_t *o UNUSED, + cvec_t * fftgrain, fvec_t * onset) { + uint_t i,j; + for (i=0;ichannels;i++) { + onset->data[i][0] = 0.; + for (j=0;jlength;j++) { + onset->data[i][0] += SQR(fftgrain->norm[i][j]); + } + } +} + +/* High Frequency Content onset detection function */ +void aubio_specdesc_hfc(aubio_specdesc_t *o UNUSED, + cvec_t * fftgrain, fvec_t * onset){ + uint_t i,j; + for (i=0;ichannels;i++) { + onset->data[i][0] = 0.; + for (j=0;jlength;j++) { + onset->data[i][0] += (j+1)*fftgrain->norm[i][j]; + } + } +} + + +/* Complex Domain Method onset detection function */ +void aubio_specdesc_complex (aubio_specdesc_t *o, cvec_t * fftgrain, fvec_t * onset) { + uint_t i, j; + uint_t nbins = fftgrain->length; + for (i=0;ichannels; i++) { + onset->data[i][0] = 0.; + for (j=0;jdev1->data[i][j] = 2. * o->theta1->data[i][j] - o->theta2->data[i][j]; + // compute the euclidean distance in the complex domain + // sqrt ( r_1^2 + r_2^2 - 2 * r_1 * r_2 * \cos ( \phi_1 - \phi_2 ) ) + onset->data[i][0] += + SQRT (ABS (SQR (o->oldmag->data[i][j]) + SQR (fftgrain->norm[i][j]) + - 2. * o->oldmag->data[i][j] * fftgrain->norm[i][j] + * COS (o->dev1->data[i][j] - fftgrain->phas[i][j]))); + /* swap old phase data (need to remember 2 frames behind)*/ + o->theta2->data[i][j] = o->theta1->data[i][j]; + o->theta1->data[i][j] = fftgrain->phas[i][j]; + /* swap old magnitude data (1 frame is enough) */ + o->oldmag->data[i][j] = fftgrain->norm[i][j]; + } + } +} + + +/* Phase Based Method onset detection function */ +void aubio_specdesc_phase(aubio_specdesc_t *o, + cvec_t * fftgrain, fvec_t * onset){ + uint_t i, j; + uint_t nbins = fftgrain->length; + for (i=0;ichannels; i++) { + onset->data[i][0] = 0.0; + o->dev1->data[i][0]=0.; + for ( j=0;jdev1->data[i][j] = + aubio_unwrap2pi( + fftgrain->phas[i][j] + -2.0*o->theta1->data[i][j] + +o->theta2->data[i][j]); + if ( o->threshold < fftgrain->norm[i][j] ) + o->dev1->data[i][j] = ABS(o->dev1->data[i][j]); + else + o->dev1->data[i][j] = 0.0; + /* keep a track of the past frames */ + o->theta2->data[i][j] = o->theta1->data[i][j]; + o->theta1->data[i][j] = fftgrain->phas[i][j]; + } + /* apply o->histogram */ + aubio_hist_dyn_notnull(o->histog,o->dev1); + /* weight it */ + aubio_hist_weight(o->histog); + /* its mean is the result */ + onset->data[i][0] = aubio_hist_mean(o->histog); + //onset->data[i][0] = fvec_mean(o->dev1); + } +} + +/* Spectral difference method onset detection function */ +void aubio_specdesc_specdiff(aubio_specdesc_t *o, + cvec_t * fftgrain, fvec_t * onset){ + uint_t i, j; + uint_t nbins = fftgrain->length; + for (i=0;ichannels; i++) { + onset->data[i][0] = 0.0; + for (j=0;jdev1->data[i][j] = SQRT( + ABS(SQR( fftgrain->norm[i][j]) + - SQR(o->oldmag->data[i][j]))); + if (o->threshold < fftgrain->norm[i][j] ) + o->dev1->data[i][j] = ABS(o->dev1->data[i][j]); + else + o->dev1->data[i][j] = 0.0; + o->oldmag->data[i][j] = fftgrain->norm[i][j]; + } + + /* apply o->histogram (act somewhat as a low pass on the + * overall function)*/ + aubio_hist_dyn_notnull(o->histog,o->dev1); + /* weight it */ + aubio_hist_weight(o->histog); + /* its mean is the result */ + onset->data[i][0] = aubio_hist_mean(o->histog); + + } +} + +/* Kullback Liebler onset detection function + * note we use ln(1+Xn/(Xn-1+0.0001)) to avoid + * negative (1.+) and infinite values (+1.e-10) */ +void aubio_specdesc_kl(aubio_specdesc_t *o, cvec_t * fftgrain, fvec_t * onset){ + uint_t i,j; + for (i=0;ichannels;i++) { + onset->data[i][0] = 0.; + for (j=0;jlength;j++) { + onset->data[i][0] += fftgrain->norm[i][j] + *LOG(1.+fftgrain->norm[i][j]/(o->oldmag->data[i][j]+1.e-10)); + o->oldmag->data[i][j] = fftgrain->norm[i][j]; + } + if (isnan(onset->data[i][0])) onset->data[i][0] = 0.; + } +} + +/* Modified Kullback Liebler onset detection function + * note we use ln(1+Xn/(Xn-1+0.0001)) to avoid + * negative (1.+) and infinite values (+1.e-10) */ +void aubio_specdesc_mkl(aubio_specdesc_t *o, cvec_t * fftgrain, fvec_t * onset){ + uint_t i,j; + for (i=0;ichannels;i++) { + onset->data[i][0] = 0.; + for (j=0;jlength;j++) { + onset->data[i][0] += LOG(1.+fftgrain->norm[i][j]/(o->oldmag->data[i][j]+1.e-10)); + o->oldmag->data[i][j] = fftgrain->norm[i][j]; + } + if (isnan(onset->data[i][0])) onset->data[i][0] = 0.; + } +} + +/* Spectral flux */ +void aubio_specdesc_specflux(aubio_specdesc_t *o, cvec_t * fftgrain, fvec_t * onset){ + uint_t i, j; + for (i=0;ichannels;i++) { + onset->data[i][0] = 0.; + for (j=0;jlength;j++) { + if (fftgrain->norm[i][j] > o->oldmag->data[i][j]) + onset->data[i][0] += fftgrain->norm[i][j] - o->oldmag->data[i][j]; + o->oldmag->data[i][j] = fftgrain->norm[i][j]; + } + } +} + +/* Generic function pointing to the choosen one */ +void +aubio_specdesc_do (aubio_specdesc_t *o, cvec_t * fftgrain, + fvec_t * onset) { + o->funcpointer(o,fftgrain,onset); +} + +/* Allocate memory for an onset detection + * depending on the choosen type, allocate memory as needed + */ +aubio_specdesc_t * +new_aubio_specdesc (char_t * onset_mode, + uint_t size, uint_t channels){ + aubio_specdesc_t * o = AUBIO_NEW(aubio_specdesc_t); + uint_t rsize = size/2+1; + aubio_specdesc_type onset_type; + if (strcmp (onset_mode, "energy") == 0) + onset_type = aubio_onset_energy; + else if (strcmp (onset_mode, "specdiff") == 0) + onset_type = aubio_onset_specdiff; + else if (strcmp (onset_mode, "hfc") == 0) + onset_type = aubio_onset_hfc; + else if (strcmp (onset_mode, "complexdomain") == 0) + onset_type = aubio_onset_complex; + else if (strcmp (onset_mode, "complex") == 0) + onset_type = aubio_onset_complex; + else if (strcmp (onset_mode, "phase") == 0) + onset_type = aubio_onset_phase; + else if (strcmp (onset_mode, "mkl") == 0) + onset_type = aubio_onset_mkl; + else if (strcmp (onset_mode, "kl") == 0) + onset_type = aubio_onset_kl; + else if (strcmp (onset_mode, "specflux") == 0) + onset_type = aubio_onset_specflux; + else if (strcmp (onset_mode, "default") == 0) + onset_type = aubio_onset_default; + else { + AUBIO_ERR("unknown onset type.\n"); + onset_type = aubio_onset_default; + } + switch(onset_type) { + /* for both energy and hfc, only fftgrain->norm is required */ + case aubio_onset_energy: + break; + case aubio_onset_hfc: + break; + /* the other approaches will need some more memory spaces */ + case aubio_onset_complex: + o->oldmag = new_fvec(rsize,channels); + o->dev1 = new_fvec(rsize,channels); + o->theta1 = new_fvec(rsize,channels); + o->theta2 = new_fvec(rsize,channels); + break; + case aubio_onset_phase: + o->dev1 = new_fvec(rsize,channels); + o->theta1 = new_fvec(rsize,channels); + o->theta2 = new_fvec(rsize,channels); + o->histog = new_aubio_hist(0.0, PI, 10, channels); + o->threshold = 0.1; + break; + case aubio_onset_specdiff: + o->oldmag = new_fvec(rsize,channels); + o->dev1 = new_fvec(rsize,channels); + o->histog = new_aubio_hist(0.0, PI, 10, channels); + o->threshold = 0.1; + break; + case aubio_onset_kl: + case aubio_onset_mkl: + case aubio_onset_specflux: + o->oldmag = new_fvec(rsize,channels); + break; + default: + break; + } + + /* this switch could be in its own function to change between + * detections on the fly. this would need getting rid of the switch + * above and always allocate all the structure */ + + switch(onset_type) { + case aubio_onset_energy: + o->funcpointer = aubio_specdesc_energy; + break; + case aubio_onset_hfc: + o->funcpointer = aubio_specdesc_hfc; + break; + case aubio_onset_complex: + o->funcpointer = aubio_specdesc_complex; + break; + case aubio_onset_phase: + o->funcpointer = aubio_specdesc_phase; + break; + case aubio_onset_specdiff: + o->funcpointer = aubio_specdesc_specdiff; + break; + case aubio_onset_kl: + o->funcpointer = aubio_specdesc_kl; + break; + case aubio_onset_mkl: + o->funcpointer = aubio_specdesc_mkl; + break; + case aubio_onset_specflux: + o->funcpointer = aubio_specdesc_specflux; + break; + default: + break; + } + o->onset_type = onset_type; + return o; +} + +void del_aubio_specdesc (aubio_specdesc_t *o){ + switch(o->onset_type) { + /* for both energy and hfc, only fftgrain->norm is required */ + case aubio_onset_energy: + break; + case aubio_onset_hfc: + break; + /* the other approaches will need some more memory spaces */ + case aubio_onset_complex: + del_fvec(o->oldmag); + del_fvec(o->dev1); + del_fvec(o->theta1); + del_fvec(o->theta2); + break; + case aubio_onset_phase: + del_fvec(o->dev1); + del_fvec(o->theta1); + del_fvec(o->theta2); + del_aubio_hist(o->histog); + break; + case aubio_onset_specdiff: + del_fvec(o->oldmag); + del_fvec(o->dev1); + del_aubio_hist(o->histog); + break; + case aubio_onset_kl: + case aubio_onset_mkl: + case aubio_onset_specflux: + del_fvec(o->oldmag); + break; + default: + break; + } + AUBIO_FREE(o); +} diff --git a/src/spectral/specdesc.h b/src/spectral/specdesc.h new file mode 100644 index 00000000..7bc20be5 --- /dev/null +++ b/src/spectral/specdesc.h @@ -0,0 +1,73 @@ +/* + Copyright (C) 2003-2009 Paul Brossier + + This file is part of aubio. + + aubio is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + aubio is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with aubio. If not, see . + +*/ + +/** \file + + Onset detection functions + + All of the following onset detection function take as arguments the FFT of a + windowed signal (as created with aubio_pvoc). They output one smpl_t per + buffer and per channel (stored in a vector of size [channels]x[1]). + + These functions were first adapted from Juan Pablo Bello's code, and now + include further improvements and modifications made within aubio. + +*/ + + +#ifndef ONSETDETECTION_H +#define ONSETDETECTION_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** onsetdetection structure */ +typedef struct _aubio_specdesc_t aubio_specdesc_t; +/** execute onset detection function on a spectral frame + + Generic function to compute onset detection. + + \param o onset detection object as returned by new_aubio_specdesc() + \param fftgrain input signal spectrum as computed by aubio_pvoc_do + \param onset output vector (one sample long, to send to the peak picking) + +*/ +void aubio_specdesc_do (aubio_specdesc_t *o, cvec_t * fftgrain, fvec_t * onset); +/** creation of an onset detection object + + \param type onset detection mode + \param size length of the input spectrum frame + \param channels number of input channels + +*/ +aubio_specdesc_t * new_aubio_specdesc(char_t * onset_mode, uint_t buf_size, uint_t channels); +/** deletion of an onset detection object + + \param o onset detection object as returned by new_aubio_specdesc() + +*/ +void del_aubio_specdesc(aubio_specdesc_t *o); + +#ifdef __cplusplus +} +#endif + +#endif /* ONSETDETECTION_H */ diff --git a/src/tempo/tempo.c b/src/tempo/tempo.c index 54684667..f9e3b2a4 100644 --- a/src/tempo/tempo.c +++ b/src/tempo/tempo.c @@ -21,7 +21,7 @@ #include "aubio_priv.h" #include "fvec.h" #include "cvec.h" -#include "onset/onsetdetection.h" +#include "spectral/specdesc.h" #include "tempo/beattracking.h" #include "spectral/phasevoc.h" #include "onset/peakpick.h" @@ -30,7 +30,7 @@ /* structure to store object state */ struct _aubio_tempo_t { - aubio_onsetdetection_t * od; /** onset detection */ + aubio_specdesc_t * od; /** onset detection */ aubio_pvoc_t * pv; /** phase vocoder */ aubio_peakpicker_t * pp; /** peak picker */ aubio_beattracking_t * bt; /** beat tracking */ @@ -55,9 +55,9 @@ void aubio_tempo_do(aubio_tempo_t *o, fvec_t * input, fvec_t * tempo) uint_t winlen = o->winlen; uint_t step = o->step; aubio_pvoc_do (o->pv, input, o->fftgrain); - aubio_onsetdetection_do (o->od, o->fftgrain, o->of); + aubio_specdesc_do (o->od, o->fftgrain, o->of); /*if (usedoubled) { - aubio_onsetdetection_do(o2,fftgrain, onset2); + aubio_specdesc_do(o2,fftgrain, onset2); onset->data[0][0] *= onset2->data[0][0]; }*/ /* execute every overlap_size*step */ @@ -120,13 +120,13 @@ aubio_tempo_t * new_aubio_tempo (char_t * onset_mode, o->pv = new_aubio_pvoc(buf_size, hop_size, channels); o->pp = new_aubio_peakpicker(channels); aubio_peakpicker_set_threshold (o->pp, o->threshold); - o->od = new_aubio_onsetdetection(onset_mode,buf_size,channels); + o->od = new_aubio_specdesc(onset_mode,buf_size,channels); o->of = new_fvec(1, channels); o->bt = new_aubio_beattracking(o->winlen,channels); o->onset = new_fvec(1, channels); o->peek = new_fvec(3, channels); /*if (usedoubled) { - o2 = new_aubio_onsetdetection(type_onset2,buffer_size,channels); + o2 = new_aubio_specdesc(type_onset2,buffer_size,channels); onset2 = new_fvec(1 , channels); }*/ return o; @@ -142,7 +142,7 @@ smpl_t aubio_tempo_get_confidence(aubio_tempo_t *o) { void del_aubio_tempo (aubio_tempo_t *o) { - del_aubio_onsetdetection(o->od); + del_aubio_specdesc(o->od); del_aubio_beattracking(o->bt); del_aubio_peakpicker(o->pp); del_aubio_pvoc(o->pv); diff --git a/tests/src/test-onsetdetection.c b/tests/src/test-onsetdetection.c index fb90de2b..8234d98c 100644 --- a/tests/src/test-onsetdetection.c +++ b/tests/src/test-onsetdetection.c @@ -11,35 +11,35 @@ main () cvec_t *in = new_cvec (win_s, channels); /* input buffer */ fvec_t *out = new_fvec (1, channels); /* input buffer */ - aubio_onsetdetection_t *o; + aubio_specdesc_t *o; - o = new_aubio_onsetdetection ("energy", win_s, channels); - aubio_onsetdetection_do (o, in, out); - del_aubio_onsetdetection (o); + o = new_aubio_specdesc ("energy", win_s, channels); + aubio_specdesc_do (o, in, out); + del_aubio_specdesc (o); - o = new_aubio_onsetdetection ("energy", win_s, channels); - aubio_onsetdetection_do (o, in, out); - del_aubio_onsetdetection (o); + o = new_aubio_specdesc ("energy", win_s, channels); + aubio_specdesc_do (o, in, out); + del_aubio_specdesc (o); - o = new_aubio_onsetdetection ("hfc", win_s, channels); - aubio_onsetdetection_do (o, in, out); - del_aubio_onsetdetection (o); + o = new_aubio_specdesc ("hfc", win_s, channels); + aubio_specdesc_do (o, in, out); + del_aubio_specdesc (o); - o = new_aubio_onsetdetection ("complex", win_s, channels); - aubio_onsetdetection_do (o, in, out); - del_aubio_onsetdetection (o); + o = new_aubio_specdesc ("complex", win_s, channels); + aubio_specdesc_do (o, in, out); + del_aubio_specdesc (o); - o = new_aubio_onsetdetection ("phase", win_s, channels); - aubio_onsetdetection_do (o, in, out); - del_aubio_onsetdetection (o); + o = new_aubio_specdesc ("phase", win_s, channels); + aubio_specdesc_do (o, in, out); + del_aubio_specdesc (o); - o = new_aubio_onsetdetection ("kl", win_s, channels); - aubio_onsetdetection_do (o, in, out); - del_aubio_onsetdetection (o); + o = new_aubio_specdesc ("kl", win_s, channels); + aubio_specdesc_do (o, in, out); + del_aubio_specdesc (o); - o = new_aubio_onsetdetection ("mkl", win_s, channels); - aubio_onsetdetection_do (o, in, out); - del_aubio_onsetdetection (o); + o = new_aubio_specdesc ("mkl", win_s, channels); + aubio_specdesc_do (o, in, out); + del_aubio_specdesc (o); del_cvec (in); del_fvec (out);