ref: 31907fd993a3680189eec64ca301467fa77df7bd
parent: bafe71d4aff707869145b763043e36aaded03d02
author: Paul Brossier <piem@piem.org>
date: Tue Nov 3 13:23:04 EST 2009
src/spectral/specdesc.{c,h}: rename aubio_onsetdetection to aubio_specdesc
--- a/python/aubio/aubioclass.py
+++ b/python/aubio/aubioclass.py
@@ -68,13 +68,13 @@
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 @@
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)
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -22,6 +22,7 @@
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 @@
pitch/pitchfcomb.h \
pitch/pitchyinfft.h \
onset/onset.h \
- onset/onsetdetection.h \
onset/peakpick.h \
tempo/tempo.h \
tempo/beattracking.h
--- a/src/aubio.h
+++ b/src/aubio.h
@@ -165,6 +165,7 @@
#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 @@
#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"
--- 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 @@
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 @@
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 @@
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);
--- a/src/onset/onset.h
+++ b/src/onset/onset.h
@@ -46,7 +46,7 @@
/** 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
--- a/src/onset/onsetdetection.c
+++ /dev/null
@@ -1,455 +1,0 @@
-/*
- Copyright (C) 2003-2009 Paul Brossier <piem@aubio.org>
-
- 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 <http://www.gnu.org/licenses/>.
-
-*/
-
-#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 441444,
- 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 881884, 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_<type> 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;i<fftgrain->channels;i++) {
- onset->data[i][0] = 0.;
- for (j=0;j<fftgrain->length;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;i<fftgrain->channels;i++) {
- onset->data[i][0] = 0.;
- for (j=0;j<fftgrain->length;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;i<fftgrain->channels; i++) {
- onset->data[i][0] = 0.;
- for (j=0;j<nbins; j++) {
- // compute the predicted phase
- o->dev1->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;i<fftgrain->channels; i++) {
- onset->data[i][0] = 0.0;
- o->dev1->data[i][0]=0.;
- for ( j=0;j<nbins; j++ ) {
- o->dev1->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;i<fftgrain->channels; i++) {
- onset->data[i][0] = 0.0;
- for (j=0;j<nbins; j++) {
- o->dev1->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;i<fftgrain->channels;i++) {
- onset->data[i][0] = 0.;
- for (j=0;j<fftgrain->length;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;i<fftgrain->channels;i++) {
- onset->data[i][0] = 0.;
- for (j=0;j<fftgrain->length;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;i<fftgrain->channels;i++) {
- onset->data[i][0] = 0.;
- for (j=0;j<fftgrain->length;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);
-}
--- a/src/onset/onsetdetection.h
+++ /dev/null
@@ -1,73 +1,0 @@
-/*
- Copyright (C) 2003-2009 Paul Brossier <piem@aubio.org>
-
- 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 <http://www.gnu.org/licenses/>.
-
-*/
-
-/** \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 */
--- /dev/null
+++ b/src/spectral/specdesc.c
@@ -1,0 +1,455 @@
+/*
+ Copyright (C) 2003-2009 Paul Brossier <piem@aubio.org>
+
+ 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 <http://www.gnu.org/licenses/>.
+
+*/
+
+#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 441444,
+ 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 881884, 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_<type> 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;i<fftgrain->channels;i++) {
+ onset->data[i][0] = 0.;
+ for (j=0;j<fftgrain->length;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;i<fftgrain->channels;i++) {
+ onset->data[i][0] = 0.;
+ for (j=0;j<fftgrain->length;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;i<fftgrain->channels; i++) {
+ onset->data[i][0] = 0.;
+ for (j=0;j<nbins; j++) {
+ // compute the predicted phase
+ o->dev1->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;i<fftgrain->channels; i++) {
+ onset->data[i][0] = 0.0;
+ o->dev1->data[i][0]=0.;
+ for ( j=0;j<nbins; j++ ) {
+ o->dev1->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;i<fftgrain->channels; i++) {
+ onset->data[i][0] = 0.0;
+ for (j=0;j<nbins; j++) {
+ o->dev1->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;i<fftgrain->channels;i++) {
+ onset->data[i][0] = 0.;
+ for (j=0;j<fftgrain->length;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;i<fftgrain->channels;i++) {
+ onset->data[i][0] = 0.;
+ for (j=0;j<fftgrain->length;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;i<fftgrain->channels;i++) {
+ onset->data[i][0] = 0.;
+ for (j=0;j<fftgrain->length;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);
+}
--- /dev/null
+++ b/src/spectral/specdesc.h
@@ -1,0 +1,73 @@
+/*
+ Copyright (C) 2003-2009 Paul Brossier <piem@aubio.org>
+
+ 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 <http://www.gnu.org/licenses/>.
+
+*/
+
+/** \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 */
--- 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 @@
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 @@
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 @@
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);
--- a/tests/src/test-onsetdetection.c
+++ b/tests/src/test-onsetdetection.c
@@ -11,35 +11,35 @@
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);