shithub: aubio

Download patch

ref: 740f06b69a354c22dd92e9ca2d371fc93f259604
parent: 6107f4ccc994ff015df0647bbf54a784e8f68be1
author: Paul Brossier <piem@piem.org>
date: Fri Oct 16 20:43:00 EDT 2009

ext/, examples/, swig/, python/, tests/: remove libaubioext, make libsamplerate optional

--- a/Makefile.am
+++ b/Makefile.am
@@ -13,7 +13,7 @@
 endif
 
 
-SUBDIRS = src ext interfaces/cpp examples sounds plugins $(PYTHONDIR) $(SWIGDIR) $(JAVADIR) $(DOC) tests
+SUBDIRS = src interfaces/cpp examples sounds plugins $(PYTHONDIR) $(SWIGDIR) $(JAVADIR) $(DOC) tests
 EXTRA_DIST = bootstrap VERSION
 
 docs:
--- a/configure.ac
+++ b/configure.ac
@@ -166,7 +166,8 @@
   [with_samplerate=$enableval],
   with_samplerate="yes")
 if test "$with_samplerate" = "yes"; then
-  PKG_CHECK_MODULES(SAMPLERATE, samplerate  >= 0.0.15,  HAVE_SAMPLERATE=1)
+  PKG_CHECK_MODULES(SAMPLERATE, samplerate  >= 0.0.15,  HAVE_SAMPLERATE=1,
+                    HAVE_SAMPLERATE=0)
   if test "${HAVE_SAMPLERATE}" = "1"; then
     AC_DEFINE(HAVE_SAMPLERATE,1,[Define to enable libsamplerate support])
   fi
@@ -256,7 +257,6 @@
 AC_OUTPUT([
     Makefile
     src/Makefile
-    ext/Makefile
     examples/Makefile
     tests/Makefile
     tests/src/Makefile
--- a/examples/Makefile.am
+++ b/examples/Makefile.am
@@ -1,6 +1,6 @@
 # global flags
-AM_CFLAGS = -DAUBIO_PREFIX=\"$(prefix)\" -I$(top_srcdir)/src -I$(top_srcdir)/ext @AUBIO_CFLAGS@ @LASH_CFLAGS@ @FFTWLIB_CFLAGS@
-AM_LDFLAGS = -L$(top_builddir)/src -L$(top_builddir)/ext -laubioext -laubio @LASH_LIBS@
+AM_CFLAGS = -DAUBIO_PREFIX=\"$(prefix)\" -I$(top_srcdir)/src @AUBIO_CFLAGS@ @LASH_CFLAGS@ @SNDFILE_CFLAGS@ @JACK_CFLAGS@
+AM_LDFLAGS = -L$(top_builddir)/src -laubio @LASH_LIBS@
 
 # add your programs to this list
 bin_PROGRAMS = \
@@ -12,17 +12,18 @@
 noinst_PROGRAMS = \
 	aubioquiet
 
-EXTRA_DIST = utils.h
+EXTRA_DIST = utils.h sndfileio.h jackio.h
 
 # optionally add sources file for these programs
-aubioonset_SOURCES = aubioonset.c utils.c
-aubionotes_SOURCES = aubionotes.c utils.c
-aubiotrack_SOURCES = aubiotrack.c utils.c
-aubioquiet_SOURCES = aubioquiet.c utils.c
-aubiomfcc_SOURCES = aubiomfcc.c utils.c
+COMMON_SOURCE_FILES = sndfileio.c jackio.c utils.c
+aubioonset_SOURCES = aubioonset.c $(COMMON_SOURCE_FILES)
+aubionotes_SOURCES = aubionotes.c $(COMMON_SOURCE_FILES)
+aubiotrack_SOURCES = aubiotrack.c $(COMMON_SOURCE_FILES)
+aubioquiet_SOURCES = aubioquiet.c $(COMMON_SOURCE_FILES)
+aubiomfcc_SOURCES = aubiomfcc.c $(COMMON_SOURCE_FILES)
 
-aubioonset_LDADD = @JACK_LIBS@
-aubionotes_LDADD = @JACK_LIBS@
-aubiotrack_LDADD = @JACK_LIBS@
-aubioquiet_LDADD = @JACK_LIBS@
-aubiomfcc_LDADD = @JACK_LIBS@
+aubioonset_LDADD = @SNDFILE_LIBS@ @JACK_LIBS@
+aubionotes_LDADD = @SNDFILE_LIBS@ @JACK_LIBS@
+aubiotrack_LDADD = @SNDFILE_LIBS@ @JACK_LIBS@
+aubioquiet_LDADD = @SNDFILE_LIBS@ @JACK_LIBS@
+aubiomfcc_LDADD = @SNDFILE_LIBS@ @JACK_LIBS@
--- /dev/null
+++ b/examples/jackio.c
@@ -1,0 +1,342 @@
+/*
+  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.h>
+
+#if HAVE_JACK
+#include "aubio_priv.h"
+#include "jackio.h"
+
+typedef jack_default_audio_sample_t jack_sample_t;
+
+#if HAVE_AUBIO_DOUBLE
+#define AUBIO_JACK_MAX_FRAMES 4096
+#define AUBIO_JACK_NEEDS_CONVERSION
+#endif
+
+#define RINGBUFFER_SIZE 1024*sizeof(jack_midi_event_t)
+
+/**
+ * jack device structure 
+ */
+struct _aubio_jack_t
+{
+  /** jack client */
+  jack_client_t *client;
+  /** jack output ports */
+  jack_port_t **oports;
+  /** jack input ports */
+  jack_port_t **iports;
+  /** jack input buffer */
+  jack_sample_t **ibufs;
+  /** jack output buffer */
+  jack_sample_t **obufs;
+#ifdef AUBIO_JACK_NEEDS_CONVERSION
+  /** converted jack input buffer */
+  smpl_t **sibufs;
+  /** converted jack output buffer */
+  smpl_t **sobufs;
+#endif
+  /** jack input audio channels */
+  uint_t ichan;
+  /** jack output audio channels */
+  uint_t ochan;
+  /** jack input midi channels */
+  uint_t imidichan;
+  /** jack output midi channels */
+  uint_t omidichan;
+  /** midi output ringbuffer */
+  jack_ringbuffer_t *midi_out_ring;
+  /** jack samplerate (Hz) */
+  uint_t samplerate;
+  /** jack processing function */
+  aubio_process_func_t callback;
+};
+
+/* static memory management */
+static aubio_jack_t *aubio_jack_alloc (uint_t ichan, uint_t ochan,
+    uint_t imidichan, uint_t omidichan);
+static uint_t aubio_jack_free (aubio_jack_t * jack_setup);
+/* jack callback functions */
+static int aubio_jack_process (jack_nframes_t nframes, void *arg);
+static void aubio_jack_shutdown (void *arg);
+
+aubio_jack_t *
+new_aubio_jack (uint_t ichan, uint_t ochan,
+    uint_t imidichan, uint_t omidichan, aubio_process_func_t callback)
+{
+  aubio_jack_t *jack_setup = aubio_jack_alloc (ichan, ochan,
+      imidichan, omidichan);
+  uint_t i;
+  char *client_name = "aubio";
+  char *jack_port_type;
+  char name[64];
+  /* initial jack client setup */
+  if ((jack_setup->client = jack_client_new (client_name)) == 0) {
+    AUBIO_ERR ("jack server not running?\n");
+    AUBIO_QUIT (AUBIO_FAIL);
+  }
+
+  if (jack_setup->omidichan) {
+    jack_setup->midi_out_ring = jack_ringbuffer_create (RINGBUFFER_SIZE);
+
+    if (jack_setup->midi_out_ring == NULL) {
+      AUBIO_ERR ("Failed creating jack midi output ringbuffer.");
+      AUBIO_QUIT (AUBIO_FAIL);
+    }
+
+    jack_ringbuffer_mlock (jack_setup->midi_out_ring);
+  }
+
+  /* set callbacks */
+  jack_set_process_callback (jack_setup->client, aubio_jack_process,
+      (void *) jack_setup);
+  jack_on_shutdown (jack_setup->client, aubio_jack_shutdown,
+      (void *) jack_setup);
+
+  /* register jack output audio and midi ports */
+  for (i = 0; i < ochan + omidichan; i++) {
+    if (i < ochan) {
+      jack_port_type = JACK_DEFAULT_AUDIO_TYPE;
+      AUBIO_SPRINTF (name, "out_%d", i + 1);
+    } else {
+      jack_port_type = JACK_DEFAULT_MIDI_TYPE;
+      AUBIO_SPRINTF (name, "midi_out_%d", i - ochan + 1);
+    }
+    if ((jack_setup->oports[i] =
+            jack_port_register (jack_setup->client, name,
+                jack_port_type, JackPortIsOutput, 0)) == 0) {
+      goto beach;
+    }
+    AUBIO_DBG ("%s:%s\n", client_name, name);
+  }
+
+  /* register jack input audio ports */
+  for (i = 0; i < ichan + imidichan; i++) {
+    if (i < ichan) {
+      jack_port_type = JACK_DEFAULT_AUDIO_TYPE;
+      AUBIO_SPRINTF (name, "in_%d", i + 1);
+    } else {
+      jack_port_type = JACK_DEFAULT_MIDI_TYPE;
+      AUBIO_SPRINTF (name, "midi_in_%d", i - ichan + 1);
+    }
+    if ((jack_setup->iports[i] =
+            jack_port_register (jack_setup->client, name,
+                jack_port_type, JackPortIsInput, 0)) == 0) {
+      goto beach;
+    }
+    AUBIO_DBG ("%s:%s\n", client_name, name);
+  }
+
+  /* set processing callback */
+  jack_setup->callback = callback;
+  return jack_setup;
+
+beach:
+  AUBIO_ERR ("failed registering port \"%s:%s\"!\n", client_name, name);
+  jack_client_close (jack_setup->client);
+  AUBIO_QUIT (AUBIO_FAIL);
+}
+
+uint_t
+aubio_jack_activate (aubio_jack_t * jack_setup)
+{
+  /* get sample rate */
+  jack_setup->samplerate = jack_get_sample_rate (jack_setup->client);
+  /* actual jack process activation */
+  if (jack_activate (jack_setup->client)) {
+    AUBIO_ERR ("jack client activation failed");
+    return 1;
+  }
+  return 0;
+}
+
+void
+aubio_jack_close (aubio_jack_t * jack_setup)
+{
+  /* bug : should disconnect all ports first */
+  jack_client_close (jack_setup->client);
+  aubio_jack_free (jack_setup);
+}
+
+/* memory management */
+static aubio_jack_t *
+aubio_jack_alloc (uint_t ichan, uint_t ochan,
+    uint_t imidichan, uint_t omidichan)
+{
+  aubio_jack_t *jack_setup = AUBIO_NEW (aubio_jack_t);
+  jack_setup->ichan = ichan;
+  jack_setup->ochan = ochan;
+  jack_setup->imidichan = imidichan;
+  jack_setup->omidichan = omidichan;
+  jack_setup->oports = AUBIO_ARRAY (jack_port_t *, ichan + imidichan);
+  jack_setup->iports = AUBIO_ARRAY (jack_port_t *, ochan + omidichan);
+  jack_setup->ibufs = AUBIO_ARRAY (jack_sample_t *, ichan);
+  jack_setup->obufs = AUBIO_ARRAY (jack_sample_t *, ochan);
+#ifdef AUBIO_JACK_NEEDS_CONVERSION
+  /* allocate arrays for data conversion */
+  jack_setup->sibufs = AUBIO_ARRAY (smpl_t *, ichan);
+  uint_t i;
+  for (i = 0; i < ichan; i++) {
+    jack_setup->sibufs[i] = AUBIO_ARRAY (smpl_t, AUBIO_JACK_MAX_FRAMES);
+  }
+  jack_setup->sobufs = AUBIO_ARRAY (smpl_t *, ochan);
+  for (i = 0; i < ochan; i++) {
+    jack_setup->sobufs[i] = AUBIO_ARRAY (smpl_t, AUBIO_JACK_MAX_FRAMES);
+  }
+#endif
+  return jack_setup;
+}
+
+static uint_t
+aubio_jack_free (aubio_jack_t * jack_setup)
+{
+  if (jack_setup->omidichan && jack_setup->midi_out_ring) {
+    jack_ringbuffer_free (jack_setup->midi_out_ring);
+  }
+  AUBIO_FREE (jack_setup->oports);
+  AUBIO_FREE (jack_setup->iports);
+  AUBIO_FREE (jack_setup->ibufs);
+  AUBIO_FREE (jack_setup->obufs);
+  AUBIO_FREE (jack_setup);
+  return AUBIO_OK;
+}
+
+/* jack callback functions */
+static void
+aubio_jack_shutdown (void *arg UNUSED)
+{
+  AUBIO_ERR ("jack shutdown\n");
+  AUBIO_QUIT (AUBIO_OK);
+}
+
+static void process_midi_output (aubio_jack_t * dev, jack_nframes_t nframes);
+
+static int
+aubio_jack_process (jack_nframes_t nframes, void *arg)
+{
+  aubio_jack_t *dev = (aubio_jack_t *) arg;
+  uint_t i;
+  for (i = 0; i < dev->ichan; i++) {
+    /* get readable input */
+    dev->ibufs[i] =
+        (jack_sample_t *) jack_port_get_buffer (dev->iports[i], nframes);
+  }
+  for (i = 0; i < dev->ochan; i++) {
+    /* get writable output */
+    dev->obufs[i] =
+        (jack_sample_t *) jack_port_get_buffer (dev->oports[i], nframes);
+  }
+#ifndef AUBIO_JACK_NEEDS_CONVERSION
+  dev->callback (dev->ibufs, dev->obufs, nframes);
+#else
+  uint_t j;
+  for (j = 0; j < MIN (nframes, AUBIO_JACK_MAX_FRAMES); j++) {
+    for (i = 0; i < dev->ichan; i++) {
+      dev->sibufs[i][j] = (smpl_t) dev->ibufs[i][j];
+    }
+  }
+  dev->callback (dev->sibufs, dev->sobufs, nframes);
+  for (j = 0; j < MIN (nframes, AUBIO_JACK_MAX_FRAMES); j++) {
+    for (i = 0; i < dev->ochan; i++) {
+      dev->obufs[i][j] = (jack_sample_t) dev->sobufs[i][j];
+    }
+  }
+#endif
+
+  /* now process midi stuff */
+  if (dev->omidichan) {
+    process_midi_output (dev, nframes);
+  }
+
+  return 0;
+}
+
+void
+aubio_jack_midi_event_write (aubio_jack_t * dev, jack_midi_event_t * event)
+{
+  int written;
+
+  if (jack_ringbuffer_write_space (dev->midi_out_ring) < sizeof (*event)) {
+    AUBIO_ERR ("Not enough space to write midi output, midi event lost!\n");
+    return;
+  }
+
+  written = jack_ringbuffer_write (dev->midi_out_ring,
+      (char *) event, sizeof (*event));
+
+  if (written != sizeof (*event)) {
+    AUBIO_WRN ("Call to jack_ringbuffer_write failed, midi event lost! \n");
+  }
+}
+
+static void
+process_midi_output (aubio_jack_t * dev, jack_nframes_t nframes)
+{
+  int read, sendtime;
+  jack_midi_event_t ev;
+  unsigned char *buffer;
+  jack_nframes_t last_frame_time = jack_last_frame_time (dev->client);
+  // TODO for each omidichan
+  void *port_buffer = jack_port_get_buffer (dev->oports[dev->ochan], nframes);
+
+  if (port_buffer == NULL) {
+    AUBIO_WRN ("Failed to get jack midi output port, will not send anything\n");
+    return;
+  }
+
+  jack_midi_clear_buffer (port_buffer);
+
+  // TODO add rate_limit
+
+  while (jack_ringbuffer_read_space (dev->midi_out_ring)) {
+    read = jack_ringbuffer_peek (dev->midi_out_ring, (char *) &ev, sizeof (ev));
+
+    if (read != sizeof (ev)) {
+      AUBIO_WRN ("Short read from the ringbuffer, possible note loss.\n");
+      jack_ringbuffer_read_advance (dev->midi_out_ring, read);
+      continue;
+    }
+
+    sendtime = ev.time + nframes - last_frame_time;
+
+    /* send time is after current period, will do this one later */
+    if (sendtime >= (int) nframes) {
+      break;
+    }
+
+    if (sendtime < 0) {
+      sendtime = 0;
+    }
+
+    jack_ringbuffer_read_advance (dev->midi_out_ring, sizeof (ev));
+
+    buffer = jack_midi_event_reserve (port_buffer, sendtime, ev.size);
+
+    if (buffer == NULL) {
+      AUBIO_WRN ("Call to jack_midi_event_reserve failed, note lost.\n");
+      break;
+    }
+
+    AUBIO_MEMCPY (buffer, ev.buffer, ev.size);
+  }
+}
+
+#endif /* HAVE_JACK */
--- /dev/null
+++ b/examples/jackio.h
@@ -1,0 +1,63 @@
+/*
+  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/>.
+
+*/
+
+#ifndef JACKIO_H
+#define JACKIO_H
+
+/** 
+ * @file
+ *
+ * Jack driver for aubio
+ * 
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <jack/jack.h>
+#include <jack/midiport.h>
+#include <jack/ringbuffer.h>
+
+/** jack object */
+typedef struct _aubio_jack_t aubio_jack_t;
+/** jack process function */
+typedef int (*aubio_process_func_t) (smpl_t ** input,
+    smpl_t ** output, int nframes);
+
+/** jack device creation function */
+aubio_jack_t *new_aubio_jack (uint_t inchannels, uint_t outchannels,
+    uint_t imidichan, uint_t omidichan,
+    aubio_process_func_t callback);
+/** activate jack client (run jackprocess function) */
+uint_t aubio_jack_activate (aubio_jack_t * jack_setup);
+/** close and delete jack client */
+void aubio_jack_close (aubio_jack_t * jack_setup);
+
+/** write a jack_midi_event_t to the midi output ringbuffer */
+void aubio_jack_midi_event_write (aubio_jack_t * jack_setup,
+    jack_midi_event_t * event);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif                          /* JACKIO_H */
--- /dev/null
+++ b/examples/sndfileio.c
@@ -1,0 +1,209 @@
+/*
+   Copyright (C) 2003 Paul Brossier
+
+   This program 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 2 of the License, or
+   (at your option) any later version.
+
+   This program 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 this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <string.h>
+
+#include <sndfile.h>
+
+#include "aubio_priv.h"
+#include "fvec.h"
+#include "sndfileio.h"
+#include "mathutils.h"
+
+#define MAX_CHANNELS 6
+#define MAX_SIZE 4096
+
+struct _aubio_sndfile_t {
+        SNDFILE *handle;
+        int samplerate;
+        int channels;
+        int format;
+        float *tmpdata; /** scratch pad for interleaving/deinterleaving. */
+        int size;       /** store the size to check if realloc needed */
+};
+
+aubio_sndfile_t * new_aubio_sndfile_ro(const char* outputname) {
+        aubio_sndfile_t * f = AUBIO_NEW(aubio_sndfile_t);
+        SF_INFO sfinfo;
+        AUBIO_MEMSET(&sfinfo, 0, sizeof (sfinfo));
+
+        f->handle = sf_open (outputname, SFM_READ, &sfinfo);
+
+        if (f->handle == NULL) {
+                AUBIO_ERR("Failed opening %s: %s\n", outputname,
+                        sf_strerror (NULL)); /* libsndfile err msg */
+                return NULL;
+        }	
+
+        if (sfinfo.channels > MAX_CHANNELS) { 
+                AUBIO_ERR("Not able to process more than %d channels\n", MAX_CHANNELS);
+                return NULL;
+        }
+
+        f->size       = MAX_SIZE*sfinfo.channels;
+        f->tmpdata    = AUBIO_ARRAY(float,f->size);
+        /* get input specs */
+        f->samplerate = sfinfo.samplerate;
+        f->channels   = sfinfo.channels;
+        f->format     = sfinfo.format;
+
+        return f;
+}
+
+int aubio_sndfile_open_wo(aubio_sndfile_t * f, const char* inputname) {
+        SF_INFO sfinfo;
+        AUBIO_MEMSET(&sfinfo, 0, sizeof (sfinfo));
+
+        /* define file output spec */
+        sfinfo.samplerate = f->samplerate;
+        sfinfo.channels   = f->channels;
+        sfinfo.format     = f->format;
+
+        if (! (f->handle = sf_open (inputname, SFM_WRITE, &sfinfo))) {
+                AUBIO_ERR("Not able to open output file %s.\n", inputname);
+                AUBIO_ERR("%s\n",sf_strerror (NULL)); /* libsndfile err msg */
+                AUBIO_QUIT(AUBIO_FAIL);
+        }	
+
+        if (sfinfo.channels > MAX_CHANNELS) { 
+                AUBIO_ERR("Not able to process more than %d channels\n", MAX_CHANNELS);
+                AUBIO_QUIT(AUBIO_FAIL);
+        }
+        f->size       = MAX_SIZE*sfinfo.channels;
+        f->tmpdata    = AUBIO_ARRAY(float,f->size);
+        return AUBIO_OK;
+}
+
+/* setup file struct from existing one */
+aubio_sndfile_t * new_aubio_sndfile_wo(aubio_sndfile_t * fmodel, const char *outputname) {
+        aubio_sndfile_t * f = AUBIO_NEW(aubio_sndfile_t);
+        f->samplerate    = fmodel->samplerate;
+        f->channels      = fmodel->channels;
+        f->format        = fmodel->format;
+        aubio_sndfile_open_wo(f, outputname);
+        return f;
+}
+
+
+/* return 0 if properly closed, 1 otherwise */
+int del_aubio_sndfile(aubio_sndfile_t * f) {
+        if (sf_close(f->handle)) {
+                AUBIO_ERR("Error closing file.");
+                puts (sf_strerror (NULL));
+                return 1;
+        }
+        AUBIO_FREE(f->tmpdata);
+        AUBIO_FREE(f);
+        //AUBIO_DBG("File closed.\n");
+        return 0;
+}
+
+/**************************************************************
+ *
+ * Read write methods 
+ *
+ */
+
+
+/* read frames from file in data 
+ *  return the number of frames actually read */
+int aubio_sndfile_read(aubio_sndfile_t * f, int frames, fvec_t * read) {
+        sf_count_t read_frames;
+        int i,j, channels = f->channels;
+        int nsamples = frames*channels;
+        int aread;
+        smpl_t *pread;	
+
+        /* allocate data for de/interleaving reallocated when needed. */
+        if (nsamples >= f->size) {
+                AUBIO_ERR("Maximum aubio_sndfile_read buffer size exceeded.");
+                return -1;
+                /*
+                AUBIO_FREE(f->tmpdata);
+                f->tmpdata = AUBIO_ARRAY(float,nsamples);
+                */
+        }
+        //f->size = nsamples;
+
+        /* do actual reading */
+        read_frames = sf_read_float (f->handle, f->tmpdata, nsamples);
+
+        aread = (int)FLOOR(read_frames/(float)channels);
+
+        /* de-interleaving data  */
+        for (i=0; i<channels; i++) {
+                pread = (smpl_t *)fvec_get_channel(read,i);
+                for (j=0; j<aread; j++) {
+                        pread[j] = (smpl_t)f->tmpdata[channels*j+i];
+                }
+        }
+        return aread;
+}
+
+/* write 'frames' samples to file from data 
+ *   return the number of frames actually written 
+ */
+int aubio_sndfile_write(aubio_sndfile_t * f, int frames, fvec_t * write) {
+        sf_count_t written_frames = 0;
+        int i, j,	channels = f->channels;
+        int nsamples = channels*frames;
+        smpl_t *pwrite;
+
+        /* allocate data for de/interleaving reallocated when needed. */
+        if (nsamples >= f->size) {
+                AUBIO_ERR("Maximum aubio_sndfile_write buffer size exceeded.");
+                return -1;
+                /*
+                AUBIO_FREE(f->tmpdata);
+                f->tmpdata = AUBIO_ARRAY(float,nsamples);
+                */
+        }
+        //f->size = nsamples;
+
+        /* interleaving data  */
+        for (i=0; i<channels; i++) {
+                pwrite = (smpl_t *)fvec_get_channel(write,i);
+                for (j=0; j<frames; j++) {
+                        f->tmpdata[channels*j+i] = (float)pwrite[j];
+                }
+        }
+        written_frames = sf_write_float (f->handle, f->tmpdata, nsamples);
+        return written_frames/channels;
+}
+
+/*******************************************************************
+ *
+ * Get object info 
+ *
+ */
+
+uint_t aubio_sndfile_channels(aubio_sndfile_t * f) {
+        return f->channels;
+}
+
+uint_t aubio_sndfile_samplerate(aubio_sndfile_t * f) {
+        return f->samplerate;
+}
+
+void aubio_sndfile_info(aubio_sndfile_t * f) {
+        AUBIO_DBG("srate    : %d\n", f->samplerate);
+        AUBIO_DBG("channels : %d\n", f->channels);
+        AUBIO_DBG("format   : %d\n", f->format);
+}
+
--- /dev/null
+++ b/examples/sndfileio.h
@@ -1,0 +1,73 @@
+/*
+	 Copyright (C) 2003 Paul Brossier
+
+	 This program 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 2 of the License, or
+	 (at your option) any later version.
+
+	 This program 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 this program; if not, write to the Free Software
+	 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef SNDFILEIO_H
+#define SNDFILEIO_H
+
+/** @file 
+ * sndfile functions
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * sndfile object
+ */
+typedef struct _aubio_sndfile_t aubio_sndfile_t;
+/** 
+ * Open a sound file for reading
+ */
+aubio_sndfile_t * new_aubio_sndfile_ro (const char * inputfile);
+/**
+ * Copy file model from previously opened sound file.
+ */
+aubio_sndfile_t * new_aubio_sndfile_wo(aubio_sndfile_t * existingfile, const char * outputname);
+/** 
+ * Open a sound file for writing
+ */
+int aubio_sndfile_open_wo (aubio_sndfile_t * file, const char * outputname);
+/** 
+ * Read frames data from file 
+ */
+int aubio_sndfile_read(aubio_sndfile_t * file, int frames, fvec_t * read);
+/** 
+ * Write data of length frames to file
+ */
+int aubio_sndfile_write(aubio_sndfile_t * file, int frames, fvec_t * write);
+/**
+ * Close file and delete file object
+ */
+int del_aubio_sndfile(aubio_sndfile_t * file);
+/**
+ * Return some files facts
+ */
+void aubio_sndfile_info(aubio_sndfile_t * file);
+/**
+ * Return number of channel in file
+ */
+uint_t aubio_sndfile_channels(aubio_sndfile_t * file);
+uint_t aubio_sndfile_samplerate(aubio_sndfile_t * file);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
--- a/examples/utils.h
+++ b/examples/utils.h
@@ -26,7 +26,10 @@
 #include <math.h>               /* for isfinite */
 #include <string.h>             /* for strcmp */
 #include <aubio.h>
-#include <aubioext.h>
+#include "sndfileio.h"
+#ifdef HAVE_JACK
+#include "jackio.h"
+#endif /* HAVE_JACK */
 
 #ifdef HAVE_C99_VARARGS_MACROS
 #define debug(...)              if (verbose) fprintf (stderr, __VA_ARGS__)
--- a/examples/wscript_build
+++ b/examples/wscript_build
@@ -3,23 +3,25 @@
 defines = ['AUBIO_PREFIX="' + bld.env['AUBIO_PREFIX'] + '"']
 defines += ['PACKAGE="' + bld.env['PACKAGE'] + '"']
 
+extra_source = ['utils.c', 'sndfileio.c', 'jackio.c']
+
 bld.new_task_gen(features = 'cc',
-    includes = '../src ../ext',
-    source = 'utils.c',
+    includes = '../src',
+    source = extra_source, 
     uselib = ['LASH'],
     defines = defines, 
-    target = 'utils')
+    target = 'utils_io')
 
 # loop over all *.c filenames in examples to build them all
 for target_name in bld.path.ant_glob('*.c').split():
   # ignore utils.c
-  if target_name in ['utils.c']: continue 
+  if target_name in extra_source: continue 
   bld.new_task_gen(features = 'cc cprogram', 
-      add_objects = 'utils',
-      includes = '../src ../ext',
+      add_objects = 'utils_io',
+      includes = '../src',
       defines = defines, 
-      uselib = ['LASH'],
-      uselib_local = ['aubio', 'aubioext'],
+      uselib = ['LASH', 'JACK', 'SNDFILE'],
+      uselib_local = ['aubio'],
       source = target_name,
       # program name is filename.c without the .c
       target = target_name.split('.')[0])
--- a/ext/Makefile.am
+++ /dev/null
@@ -1,15 +1,0 @@
-pkginclude_HEADERS = \
-	aubioext.h \
-	jackio.h \
-	sndfileio.h
-
-lib_LTLIBRARIES = libaubioext.la 
-libaubioext_la_SOURCES = aubioext.h \
-	jackio.c \
-	jackio.h \
-	sndfileio.c \
-	sndfileio.h 
-
-AM_CFLAGS = -I$(top_srcdir)/src @AUBIO_CFLAGS@ @SNDFILE_CFLAGS@ @JACK_CFLAGS@ @FFTWLIB_CFLAGS@ @SAMPLERATE_CFLAGS@
-libaubioext_la_LIBADD = -laubio -L${top_builddir}/src @SNDFILE_LIBS@ @JACK_LIBS@ @FFTWLIB_LIBS@ @SAMPLERATE_LIBS@ @LTLIBOBJS@
-libaubioext_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@
--- a/ext/aubioext.h
+++ /dev/null
@@ -1,42 +1,0 @@
-/*
-	 Copyright (C) 2003 Paul Brossier <piem@altern.org>
-
-	 This program 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 2 of the License, or
-	 (at your option) any later version.
-
-	 This program 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 this program; if not, write to the Free Software
-	 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-	 
-*/
-
-#ifndef __AUBIOEXT_H__
-#define __AUBIOEXT_H__
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <aubio.h>
- 
-#if HAVE_JACK
-#include "jackio.h"
-#endif /* HAVE_JACK */
-
-#if HAVE_SNDFILE
-#include "sndfileio.h"
-#endif /* HAVE_SNDFILE */
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif
--- a/ext/jackio.c
+++ /dev/null
@@ -1,342 +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.h>
-
-#if HAVE_JACK
-#include "aubio_priv.h"
-#include "jackio.h"
-
-typedef jack_default_audio_sample_t jack_sample_t;
-
-#if HAVE_AUBIO_DOUBLE
-#define AUBIO_JACK_MAX_FRAMES 4096
-#define AUBIO_JACK_NEEDS_CONVERSION
-#endif
-
-#define RINGBUFFER_SIZE 1024*sizeof(jack_midi_event_t)
-
-/**
- * jack device structure 
- */
-struct _aubio_jack_t
-{
-  /** jack client */
-  jack_client_t *client;
-  /** jack output ports */
-  jack_port_t **oports;
-  /** jack input ports */
-  jack_port_t **iports;
-  /** jack input buffer */
-  jack_sample_t **ibufs;
-  /** jack output buffer */
-  jack_sample_t **obufs;
-#ifdef AUBIO_JACK_NEEDS_CONVERSION
-  /** converted jack input buffer */
-  smpl_t **sibufs;
-  /** converted jack output buffer */
-  smpl_t **sobufs;
-#endif
-  /** jack input audio channels */
-  uint_t ichan;
-  /** jack output audio channels */
-  uint_t ochan;
-  /** jack input midi channels */
-  uint_t imidichan;
-  /** jack output midi channels */
-  uint_t omidichan;
-  /** midi output ringbuffer */
-  jack_ringbuffer_t *midi_out_ring;
-  /** jack samplerate (Hz) */
-  uint_t samplerate;
-  /** jack processing function */
-  aubio_process_func_t callback;
-};
-
-/* static memory management */
-static aubio_jack_t *aubio_jack_alloc (uint_t ichan, uint_t ochan,
-    uint_t imidichan, uint_t omidichan);
-static uint_t aubio_jack_free (aubio_jack_t * jack_setup);
-/* jack callback functions */
-static int aubio_jack_process (jack_nframes_t nframes, void *arg);
-static void aubio_jack_shutdown (void *arg);
-
-aubio_jack_t *
-new_aubio_jack (uint_t ichan, uint_t ochan,
-    uint_t imidichan, uint_t omidichan, aubio_process_func_t callback)
-{
-  aubio_jack_t *jack_setup = aubio_jack_alloc (ichan, ochan,
-      imidichan, omidichan);
-  uint_t i;
-  char *client_name = "aubio";
-  char *jack_port_type;
-  char name[64];
-  /* initial jack client setup */
-  if ((jack_setup->client = jack_client_new (client_name)) == 0) {
-    AUBIO_ERR ("jack server not running?\n");
-    AUBIO_QUIT (AUBIO_FAIL);
-  }
-
-  if (jack_setup->omidichan) {
-    jack_setup->midi_out_ring = jack_ringbuffer_create (RINGBUFFER_SIZE);
-
-    if (jack_setup->midi_out_ring == NULL) {
-      AUBIO_ERR ("Failed creating jack midi output ringbuffer.");
-      AUBIO_QUIT (AUBIO_FAIL);
-    }
-
-    jack_ringbuffer_mlock (jack_setup->midi_out_ring);
-  }
-
-  /* set callbacks */
-  jack_set_process_callback (jack_setup->client, aubio_jack_process,
-      (void *) jack_setup);
-  jack_on_shutdown (jack_setup->client, aubio_jack_shutdown,
-      (void *) jack_setup);
-
-  /* register jack output audio and midi ports */
-  for (i = 0; i < ochan + omidichan; i++) {
-    if (i < ochan) {
-      jack_port_type = JACK_DEFAULT_AUDIO_TYPE;
-      AUBIO_SPRINTF (name, "out_%d", i + 1);
-    } else {
-      jack_port_type = JACK_DEFAULT_MIDI_TYPE;
-      AUBIO_SPRINTF (name, "midi_out_%d", i - ochan + 1);
-    }
-    if ((jack_setup->oports[i] =
-            jack_port_register (jack_setup->client, name,
-                jack_port_type, JackPortIsOutput, 0)) == 0) {
-      goto beach;
-    }
-    AUBIO_DBG ("%s:%s\n", client_name, name);
-  }
-
-  /* register jack input audio ports */
-  for (i = 0; i < ichan + imidichan; i++) {
-    if (i < ichan) {
-      jack_port_type = JACK_DEFAULT_AUDIO_TYPE;
-      AUBIO_SPRINTF (name, "in_%d", i + 1);
-    } else {
-      jack_port_type = JACK_DEFAULT_MIDI_TYPE;
-      AUBIO_SPRINTF (name, "midi_in_%d", i - ichan + 1);
-    }
-    if ((jack_setup->iports[i] =
-            jack_port_register (jack_setup->client, name,
-                jack_port_type, JackPortIsInput, 0)) == 0) {
-      goto beach;
-    }
-    AUBIO_DBG ("%s:%s\n", client_name, name);
-  }
-
-  /* set processing callback */
-  jack_setup->callback = callback;
-  return jack_setup;
-
-beach:
-  AUBIO_ERR ("failed registering port \"%s:%s\"!\n", client_name, name);
-  jack_client_close (jack_setup->client);
-  AUBIO_QUIT (AUBIO_FAIL);
-}
-
-uint_t
-aubio_jack_activate (aubio_jack_t * jack_setup)
-{
-  /* get sample rate */
-  jack_setup->samplerate = jack_get_sample_rate (jack_setup->client);
-  /* actual jack process activation */
-  if (jack_activate (jack_setup->client)) {
-    AUBIO_ERR ("jack client activation failed");
-    return 1;
-  }
-  return 0;
-}
-
-void
-aubio_jack_close (aubio_jack_t * jack_setup)
-{
-  /* bug : should disconnect all ports first */
-  jack_client_close (jack_setup->client);
-  aubio_jack_free (jack_setup);
-}
-
-/* memory management */
-static aubio_jack_t *
-aubio_jack_alloc (uint_t ichan, uint_t ochan,
-    uint_t imidichan, uint_t omidichan)
-{
-  aubio_jack_t *jack_setup = AUBIO_NEW (aubio_jack_t);
-  jack_setup->ichan = ichan;
-  jack_setup->ochan = ochan;
-  jack_setup->imidichan = imidichan;
-  jack_setup->omidichan = omidichan;
-  jack_setup->oports = AUBIO_ARRAY (jack_port_t *, ichan + imidichan);
-  jack_setup->iports = AUBIO_ARRAY (jack_port_t *, ochan + omidichan);
-  jack_setup->ibufs = AUBIO_ARRAY (jack_sample_t *, ichan);
-  jack_setup->obufs = AUBIO_ARRAY (jack_sample_t *, ochan);
-#ifdef AUBIO_JACK_NEEDS_CONVERSION
-  /* allocate arrays for data conversion */
-  jack_setup->sibufs = AUBIO_ARRAY (smpl_t *, ichan);
-  uint_t i;
-  for (i = 0; i < ichan; i++) {
-    jack_setup->sibufs[i] = AUBIO_ARRAY (smpl_t, AUBIO_JACK_MAX_FRAMES);
-  }
-  jack_setup->sobufs = AUBIO_ARRAY (smpl_t *, ochan);
-  for (i = 0; i < ochan; i++) {
-    jack_setup->sobufs[i] = AUBIO_ARRAY (smpl_t, AUBIO_JACK_MAX_FRAMES);
-  }
-#endif
-  return jack_setup;
-}
-
-static uint_t
-aubio_jack_free (aubio_jack_t * jack_setup)
-{
-  if (jack_setup->omidichan && jack_setup->midi_out_ring) {
-    jack_ringbuffer_free (jack_setup->midi_out_ring);
-  }
-  AUBIO_FREE (jack_setup->oports);
-  AUBIO_FREE (jack_setup->iports);
-  AUBIO_FREE (jack_setup->ibufs);
-  AUBIO_FREE (jack_setup->obufs);
-  AUBIO_FREE (jack_setup);
-  return AUBIO_OK;
-}
-
-/* jack callback functions */
-static void
-aubio_jack_shutdown (void *arg UNUSED)
-{
-  AUBIO_ERR ("jack shutdown\n");
-  AUBIO_QUIT (AUBIO_OK);
-}
-
-static void process_midi_output (aubio_jack_t * dev, jack_nframes_t nframes);
-
-static int
-aubio_jack_process (jack_nframes_t nframes, void *arg)
-{
-  aubio_jack_t *dev = (aubio_jack_t *) arg;
-  uint_t i;
-  for (i = 0; i < dev->ichan; i++) {
-    /* get readable input */
-    dev->ibufs[i] =
-        (jack_sample_t *) jack_port_get_buffer (dev->iports[i], nframes);
-  }
-  for (i = 0; i < dev->ochan; i++) {
-    /* get writable output */
-    dev->obufs[i] =
-        (jack_sample_t *) jack_port_get_buffer (dev->oports[i], nframes);
-  }
-#ifndef AUBIO_JACK_NEEDS_CONVERSION
-  dev->callback (dev->ibufs, dev->obufs, nframes);
-#else
-  uint_t j;
-  for (j = 0; j < MIN (nframes, AUBIO_JACK_MAX_FRAMES); j++) {
-    for (i = 0; i < dev->ichan; i++) {
-      dev->sibufs[i][j] = (smpl_t) dev->ibufs[i][j];
-    }
-  }
-  dev->callback (dev->sibufs, dev->sobufs, nframes);
-  for (j = 0; j < MIN (nframes, AUBIO_JACK_MAX_FRAMES); j++) {
-    for (i = 0; i < dev->ochan; i++) {
-      dev->obufs[i][j] = (jack_sample_t) dev->sobufs[i][j];
-    }
-  }
-#endif
-
-  /* now process midi stuff */
-  if (dev->omidichan) {
-    process_midi_output (dev, nframes);
-  }
-
-  return 0;
-}
-
-void
-aubio_jack_midi_event_write (aubio_jack_t * dev, jack_midi_event_t * event)
-{
-  int written;
-
-  if (jack_ringbuffer_write_space (dev->midi_out_ring) < sizeof (*event)) {
-    AUBIO_ERR ("Not enough space to write midi output, midi event lost!\n");
-    return;
-  }
-
-  written = jack_ringbuffer_write (dev->midi_out_ring,
-      (char *) event, sizeof (*event));
-
-  if (written != sizeof (*event)) {
-    AUBIO_WRN ("Call to jack_ringbuffer_write failed, midi event lost! \n");
-  }
-}
-
-static void
-process_midi_output (aubio_jack_t * dev, jack_nframes_t nframes)
-{
-  int read, sendtime;
-  jack_midi_event_t ev;
-  unsigned char *buffer;
-  jack_nframes_t last_frame_time = jack_last_frame_time (dev->client);
-  // TODO for each omidichan
-  void *port_buffer = jack_port_get_buffer (dev->oports[dev->ochan], nframes);
-
-  if (port_buffer == NULL) {
-    AUBIO_WRN ("Failed to get jack midi output port, will not send anything\n");
-    return;
-  }
-
-  jack_midi_clear_buffer (port_buffer);
-
-  // TODO add rate_limit
-
-  while (jack_ringbuffer_read_space (dev->midi_out_ring)) {
-    read = jack_ringbuffer_peek (dev->midi_out_ring, (char *) &ev, sizeof (ev));
-
-    if (read != sizeof (ev)) {
-      AUBIO_WRN ("Short read from the ringbuffer, possible note loss.\n");
-      jack_ringbuffer_read_advance (dev->midi_out_ring, read);
-      continue;
-    }
-
-    sendtime = ev.time + nframes - last_frame_time;
-
-    /* send time is after current period, will do this one later */
-    if (sendtime >= (int) nframes) {
-      break;
-    }
-
-    if (sendtime < 0) {
-      sendtime = 0;
-    }
-
-    jack_ringbuffer_read_advance (dev->midi_out_ring, sizeof (ev));
-
-    buffer = jack_midi_event_reserve (port_buffer, sendtime, ev.size);
-
-    if (buffer == NULL) {
-      AUBIO_WRN ("Call to jack_midi_event_reserve failed, note lost.\n");
-      break;
-    }
-
-    AUBIO_MEMCPY (buffer, ev.buffer, ev.size);
-  }
-}
-
-#endif /* HAVE_JACK */
--- a/ext/jackio.h
+++ /dev/null
@@ -1,63 +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/>.
-
-*/
-
-#ifndef JACKIO_H
-#define JACKIO_H
-
-/** 
- * @file
- *
- * Jack driver for aubio
- * 
- */
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#include <jack/jack.h>
-#include <jack/midiport.h>
-#include <jack/ringbuffer.h>
-
-/** jack object */
-typedef struct _aubio_jack_t aubio_jack_t;
-/** jack process function */
-typedef int (*aubio_process_func_t) (smpl_t ** input,
-    smpl_t ** output, int nframes);
-
-/** jack device creation function */
-aubio_jack_t *new_aubio_jack (uint_t inchannels, uint_t outchannels,
-    uint_t imidichan, uint_t omidichan,
-    aubio_process_func_t callback);
-/** activate jack client (run jackprocess function) */
-uint_t aubio_jack_activate (aubio_jack_t * jack_setup);
-/** close and delete jack client */
-void aubio_jack_close (aubio_jack_t * jack_setup);
-
-/** write a jack_midi_event_t to the midi output ringbuffer */
-void aubio_jack_midi_event_write (aubio_jack_t * jack_setup,
-    jack_midi_event_t * event);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif                          /* JACKIO_H */
--- a/ext/sndfileio.c
+++ /dev/null
@@ -1,209 +1,0 @@
-/*
-   Copyright (C) 2003 Paul Brossier
-
-   This program 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 2 of the License, or
-   (at your option) any later version.
-
-   This program 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 this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include <string.h>
-
-#include <sndfile.h>
-
-#include "aubio_priv.h"
-#include "fvec.h"
-#include "sndfileio.h"
-#include "mathutils.h"
-
-#define MAX_CHANNELS 6
-#define MAX_SIZE 4096
-
-struct _aubio_sndfile_t {
-        SNDFILE *handle;
-        int samplerate;
-        int channels;
-        int format;
-        float *tmpdata; /** scratch pad for interleaving/deinterleaving. */
-        int size;       /** store the size to check if realloc needed */
-};
-
-aubio_sndfile_t * new_aubio_sndfile_ro(const char* outputname) {
-        aubio_sndfile_t * f = AUBIO_NEW(aubio_sndfile_t);
-        SF_INFO sfinfo;
-        AUBIO_MEMSET(&sfinfo, 0, sizeof (sfinfo));
-
-        f->handle = sf_open (outputname, SFM_READ, &sfinfo);
-
-        if (f->handle == NULL) {
-                AUBIO_ERR("Failed opening %s: %s\n", outputname,
-                        sf_strerror (NULL)); /* libsndfile err msg */
-                return NULL;
-        }	
-
-        if (sfinfo.channels > MAX_CHANNELS) { 
-                AUBIO_ERR("Not able to process more than %d channels\n", MAX_CHANNELS);
-                return NULL;
-        }
-
-        f->size       = MAX_SIZE*sfinfo.channels;
-        f->tmpdata    = AUBIO_ARRAY(float,f->size);
-        /* get input specs */
-        f->samplerate = sfinfo.samplerate;
-        f->channels   = sfinfo.channels;
-        f->format     = sfinfo.format;
-
-        return f;
-}
-
-int aubio_sndfile_open_wo(aubio_sndfile_t * f, const char* inputname) {
-        SF_INFO sfinfo;
-        AUBIO_MEMSET(&sfinfo, 0, sizeof (sfinfo));
-
-        /* define file output spec */
-        sfinfo.samplerate = f->samplerate;
-        sfinfo.channels   = f->channels;
-        sfinfo.format     = f->format;
-
-        if (! (f->handle = sf_open (inputname, SFM_WRITE, &sfinfo))) {
-                AUBIO_ERR("Not able to open output file %s.\n", inputname);
-                AUBIO_ERR("%s\n",sf_strerror (NULL)); /* libsndfile err msg */
-                AUBIO_QUIT(AUBIO_FAIL);
-        }	
-
-        if (sfinfo.channels > MAX_CHANNELS) { 
-                AUBIO_ERR("Not able to process more than %d channels\n", MAX_CHANNELS);
-                AUBIO_QUIT(AUBIO_FAIL);
-        }
-        f->size       = MAX_SIZE*sfinfo.channels;
-        f->tmpdata    = AUBIO_ARRAY(float,f->size);
-        return AUBIO_OK;
-}
-
-/* setup file struct from existing one */
-aubio_sndfile_t * new_aubio_sndfile_wo(aubio_sndfile_t * fmodel, const char *outputname) {
-        aubio_sndfile_t * f = AUBIO_NEW(aubio_sndfile_t);
-        f->samplerate    = fmodel->samplerate;
-        f->channels      = fmodel->channels;
-        f->format        = fmodel->format;
-        aubio_sndfile_open_wo(f, outputname);
-        return f;
-}
-
-
-/* return 0 if properly closed, 1 otherwise */
-int del_aubio_sndfile(aubio_sndfile_t * f) {
-        if (sf_close(f->handle)) {
-                AUBIO_ERR("Error closing file.");
-                puts (sf_strerror (NULL));
-                return 1;
-        }
-        AUBIO_FREE(f->tmpdata);
-        AUBIO_FREE(f);
-        //AUBIO_DBG("File closed.\n");
-        return 0;
-}
-
-/**************************************************************
- *
- * Read write methods 
- *
- */
-
-
-/* read frames from file in data 
- *  return the number of frames actually read */
-int aubio_sndfile_read(aubio_sndfile_t * f, int frames, fvec_t * read) {
-        sf_count_t read_frames;
-        int i,j, channels = f->channels;
-        int nsamples = frames*channels;
-        int aread;
-        smpl_t *pread;	
-
-        /* allocate data for de/interleaving reallocated when needed. */
-        if (nsamples >= f->size) {
-                AUBIO_ERR("Maximum aubio_sndfile_read buffer size exceeded.");
-                return -1;
-                /*
-                AUBIO_FREE(f->tmpdata);
-                f->tmpdata = AUBIO_ARRAY(float,nsamples);
-                */
-        }
-        //f->size = nsamples;
-
-        /* do actual reading */
-        read_frames = sf_read_float (f->handle, f->tmpdata, nsamples);
-
-        aread = (int)FLOOR(read_frames/(float)channels);
-
-        /* de-interleaving data  */
-        for (i=0; i<channels; i++) {
-                pread = (smpl_t *)fvec_get_channel(read,i);
-                for (j=0; j<aread; j++) {
-                        pread[j] = (smpl_t)f->tmpdata[channels*j+i];
-                }
-        }
-        return aread;
-}
-
-/* write 'frames' samples to file from data 
- *   return the number of frames actually written 
- */
-int aubio_sndfile_write(aubio_sndfile_t * f, int frames, fvec_t * write) {
-        sf_count_t written_frames = 0;
-        int i, j,	channels = f->channels;
-        int nsamples = channels*frames;
-        smpl_t *pwrite;
-
-        /* allocate data for de/interleaving reallocated when needed. */
-        if (nsamples >= f->size) {
-                AUBIO_ERR("Maximum aubio_sndfile_write buffer size exceeded.");
-                return -1;
-                /*
-                AUBIO_FREE(f->tmpdata);
-                f->tmpdata = AUBIO_ARRAY(float,nsamples);
-                */
-        }
-        //f->size = nsamples;
-
-        /* interleaving data  */
-        for (i=0; i<channels; i++) {
-                pwrite = (smpl_t *)fvec_get_channel(write,i);
-                for (j=0; j<frames; j++) {
-                        f->tmpdata[channels*j+i] = (float)pwrite[j];
-                }
-        }
-        written_frames = sf_write_float (f->handle, f->tmpdata, nsamples);
-        return written_frames/channels;
-}
-
-/*******************************************************************
- *
- * Get object info 
- *
- */
-
-uint_t aubio_sndfile_channels(aubio_sndfile_t * f) {
-        return f->channels;
-}
-
-uint_t aubio_sndfile_samplerate(aubio_sndfile_t * f) {
-        return f->samplerate;
-}
-
-void aubio_sndfile_info(aubio_sndfile_t * f) {
-        AUBIO_DBG("srate    : %d\n", f->samplerate);
-        AUBIO_DBG("channels : %d\n", f->channels);
-        AUBIO_DBG("format   : %d\n", f->format);
-}
-
--- a/ext/sndfileio.h
+++ /dev/null
@@ -1,73 +1,0 @@
-/*
-	 Copyright (C) 2003 Paul Brossier
-
-	 This program 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 2 of the License, or
-	 (at your option) any later version.
-
-	 This program 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 this program; if not, write to the Free Software
-	 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#ifndef SNDFILEIO_H
-#define SNDFILEIO_H
-
-/** @file 
- * sndfile functions
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * sndfile object
- */
-typedef struct _aubio_sndfile_t aubio_sndfile_t;
-/** 
- * Open a sound file for reading
- */
-aubio_sndfile_t * new_aubio_sndfile_ro (const char * inputfile);
-/**
- * Copy file model from previously opened sound file.
- */
-aubio_sndfile_t * new_aubio_sndfile_wo(aubio_sndfile_t * existingfile, const char * outputname);
-/** 
- * Open a sound file for writing
- */
-int aubio_sndfile_open_wo (aubio_sndfile_t * file, const char * outputname);
-/** 
- * Read frames data from file 
- */
-int aubio_sndfile_read(aubio_sndfile_t * file, int frames, fvec_t * read);
-/** 
- * Write data of length frames to file
- */
-int aubio_sndfile_write(aubio_sndfile_t * file, int frames, fvec_t * write);
-/**
- * Close file and delete file object
- */
-int del_aubio_sndfile(aubio_sndfile_t * file);
-/**
- * Return some files facts
- */
-void aubio_sndfile_info(aubio_sndfile_t * file);
-/**
- * Return number of channel in file
- */
-uint_t aubio_sndfile_channels(aubio_sndfile_t * file);
-uint_t aubio_sndfile_samplerate(aubio_sndfile_t * file);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
--- a/ext/wscript_build
+++ /dev/null
@@ -1,13 +1,0 @@
-# build libaubioext
-libaubioext = bld.new_task_gen(
-    features = 'cc cshlib',
-    includes = ['.', '../src'],
-    source = bld.path.ant_glob('*.c **/*.c'),
-    target = 'aubioext',
-    uselib = ['SNDFILE', 'JACK'],
-    uselib_local = ['aubio'],
-    vnum = bld.env['LIB_VERSION'])
-
-# install headers
-for file in bld.path.ant_glob('**/*.h').split():
-  bld.install_as('${PREFIX}/include/aubio/' + file, file)
--- a/python/aubio/Makefile.am
+++ b/python/aubio/Makefile.am
@@ -44,8 +44,10 @@
 NOWARN_CFLAGS = -Wno-missing-prototypes -Wno-missing-declarations \
 	-Wno-strict-aliasing
 
-AM_CFLAGS = @AUBIO_CFLAGS@ $(NOWARN_CFLAGS) $(SWCFLAGS) \
-	-I$(top_builddir)/src -I$(top_srcdir)/src -I$(top_srcdir)/ext \
+AM_CFLAGS = @AUBIO_CFLAGS@ @SNDFILE_CFLAGS@ \
+	$(NOWARN_CFLAGS) $(SWCFLAGS) \
+	-I$(top_builddir)/src -I$(top_srcdir)/src \
+	-I$(top_srcdir)/examples \
 	-I/usr/include/python${PYTHON_VERSION} \
 	-I${prefix}/include/python${PYTHON_VERSION} \
 	-I/usr/include \
@@ -52,13 +54,13 @@
 	-I${prefix}/include
 
 AUBIO_LDFLAGS = $(SWLDFLAGS) \
-	-L$(top_builddir)/ext -laubioext \
+	@SNDFILE_LIBS@ \
 	-L$(top_builddir)/src -laubio
 
 pkgpyexec_LTLIBRARIES = _aubiowrapper.la
 
 _aubiowrapper_la_LDFLAGS = -module -avoid-version $(AUBIO_LDFLAGS) 
-_aubiowrapper_la_SOURCES = aubio_wrap.c
+_aubiowrapper_la_SOURCES = aubio_wrap.c $(top_srcdir)/examples/sndfileio.c
 
 aubio_wrap.c aubiowrapper.py:
 	$(SWIG) -outdir . -o aubio_wrap.c -python $(top_srcdir)/swig/aubio.i
--- a/python/aubio/wscript_build
+++ b/python/aubio/wscript_build
@@ -1,10 +1,18 @@
+bld.new_task_gen(features = 'cc',
+    includes = '../../examples ../../src',
+    source = ['../../examples/sndfileio.c'], 
+    uselib = ['JACK'],
+    target = 'sndfileio')
+
 pyaubio = bld.new_task_gen(name = 'python-aubio', 
   features = 'cc cshlib pyext', 
   source = '../../swig/aubio.i',
+  add_objects = 'sndfileio',
   target = '_aubiowrapper',
-  uselib_local = ['aubio', 'aubioext'],
+  uselib_local = ['aubio'],
+  uselib = ['SNDFILE'],
   swig_flags = '-python -Wall',
-  includes = '. ../../src ../../ext')
+  includes = '. ../../src ../../examples')
 pyaubio.install_path = '${PYTHONDIR}/${PACKAGE}'
 
 # install python files 
--- a/swig/aubio.i
+++ b/swig/aubio.i
@@ -1,14 +1,10 @@
 %module aubiowrapper
 
 %{
-        #include "aubio.h"
-        #include "aubioext.h"
+#include "aubio.h"
 %}
 
-#include "aubio.h"
-#include "aubioext.h"
-
-/* type aliases */
+/* type aliases */
 typedef unsigned int uint_t;
 typedef int sint_t;
 typedef float smpl_t;
@@ -60,18 +56,6 @@
 extern smpl_t ** cvec_get_phas(cvec_t *s);
 
 
-/* sndfile */
-%#if HAVE_SNDFILE
-extern aubio_sndfile_t * new_aubio_sndfile_ro (const char * inputfile);
-extern aubio_sndfile_t * new_aubio_sndfile_wo(aubio_sndfile_t * existingfile, const char * outputname);
-extern void aubio_sndfile_info(aubio_sndfile_t * file);
-extern int aubio_sndfile_write(aubio_sndfile_t * file, int frames, fvec_t * write);
-extern int aubio_sndfile_read(aubio_sndfile_t * file, int frames, fvec_t * read);
-extern int del_aubio_sndfile(aubio_sndfile_t * file);
-extern uint_t aubio_sndfile_channels(aubio_sndfile_t * file);
-extern uint_t aubio_sndfile_samplerate(aubio_sndfile_t * file);
-%#endif /* HAVE_SNDFILE */
-
 /* fft */
 extern aubio_fft_t * new_aubio_fft(uint_t size, uint_t channels);
 extern void del_aubio_fft(aubio_fft_t * s);
@@ -175,16 +159,16 @@
 
 /* scale */
 extern aubio_scale_t * new_aubio_scale(smpl_t flow, smpl_t fhig, smpl_t ilow, smpl_t ihig);
-extern void aubio_scale_set_limits (aubio_scale_t *s, smpl_t ilow, smpl_t ihig, smpl_t olow, smpl_t ohig);
+extern uint_t aubio_scale_set_limits (aubio_scale_t *s, smpl_t ilow, smpl_t ihig, smpl_t olow, smpl_t ohig);
 extern void aubio_scale_do(aubio_scale_t *s, fvec_t * input);
 extern void del_aubio_scale(aubio_scale_t *s);
 
 /* resampling */
-%#if HAVE_SAMPLERATE
+#if HAVE_SAMPLERATE
 extern aubio_resampler_t * new_aubio_resampler(float ratio, uint_t type);
 extern void aubio_resampler_do (aubio_resampler_t *s, fvec_t * input,  fvec_t * output);
 extern void del_aubio_resampler(aubio_resampler_t *s);
-%#endif /* HAVE_SAMPLERATE */
+#endif /* HAVE_SAMPLERATE */
 
 /* onset detection */
 aubio_onsetdetection_t * new_aubio_onsetdetection(char * onset_mode, uint_t size, uint_t channels);
@@ -201,11 +185,10 @@
 aubio_pitchdetection_t *new_aubio_pitchdetection (char *pitch_mode,
     uint_t bufsize, uint_t hopsize, uint_t channels, uint_t samplerate);
 void aubio_pitchdetection_do (aubio_pitchdetection_t * p, fvec_t * ibuf, fvec_t * obuf);
-void aubio_pitchdetection_set_tolerance(aubio_pitchdetection_t *p, smpl_t thres);
-void aubio_pitchdetection_set_unit(aubio_pitchdetection_t *p, char * pitch_unit);
+uint_t aubio_pitchdetection_set_tolerance(aubio_pitchdetection_t *p, smpl_t thres);
+uint_t aubio_pitchdetection_set_unit(aubio_pitchdetection_t *p, char * pitch_unit);
 void del_aubio_pitchdetection(aubio_pitchdetection_t * p);
 
-
 /* pitch mcomb */
 aubio_pitchmcomb_t * new_aubio_pitchmcomb(uint_t bufsize, uint_t hopsize, uint_t channels);
 void aubio_pitchmcomb_do (aubio_pitchmcomb_t * p, cvec_t * fftgrain, fvec_t * out);
@@ -231,14 +214,17 @@
 smpl_t aubio_peakpicker_do(aubio_peakpicker_t * p, fvec_t * df);
 smpl_t aubio_peakpicker_get_thresholded_input(aubio_peakpicker_t* p);
 void del_aubio_peakpicker(aubio_peakpicker_t * p);
-void aubio_peakpicker_set_threshold(aubio_peakpicker_t * p, smpl_t threshold);
+uint_t aubio_peakpicker_set_threshold(aubio_peakpicker_t * p, smpl_t threshold);
 smpl_t aubio_peakpicker_get_threshold(aubio_peakpicker_t * p);
 
 /* transient/steady state separation */
-aubio_tss_t * new_aubio_tss(smpl_t thrs, smpl_t alfa, smpl_t beta,
-    uint_t size, uint_t overlap,uint_t channels);
-void del_aubio_tss(aubio_tss_t *s);
-void aubio_tss_do(aubio_tss_t *s, cvec_t * input, cvec_t * trans, cvec_t * stead);
+aubio_tss_t *new_aubio_tss (uint_t win_s, uint_t hop_s, uint_t channels);
+void del_aubio_tss (aubio_tss_t * s);
+void aubio_tss_do (aubio_tss_t * s, cvec_t * input, cvec_t * trans,
+    cvec_t * stead);
+uint_t aubio_tss_set_threshold (aubio_tss_t * o, smpl_t thrs);
+uint_t aubio_tss_set_alpha (aubio_tss_t * o, smpl_t alpha);
+uint_t aubio_tss_set_beta (aubio_tss_t * o, smpl_t beta);
 
 /* beattracking */
 aubio_beattracking_t * new_aubio_beattracking(uint_t winlen, uint_t channels);
@@ -247,3 +233,30 @@
 smpl_t aubio_beattracking_get_bpm(aubio_beattracking_t * p);
 smpl_t aubio_beattracking_get_confidence(aubio_beattracking_t * p);
 
+/* tempo */
+typedef struct _aubio_tempo_t aubio_tempo_t;
+aubio_tempo_t * new_aubio_tempo (char_t * mode,
+    uint_t buf_size, uint_t hop_size, uint_t channels, uint_t samplerate);
+void aubio_tempo_do (aubio_tempo_t *o, fvec_t * input, fvec_t * tempo);
+uint_t aubio_tempo_set_silence(aubio_tempo_t * o, smpl_t silence);
+uint_t aubio_tempo_set_threshold(aubio_tempo_t * o, smpl_t threshold);
+smpl_t aubio_tempo_get_bpm(aubio_tempo_t * bt);
+smpl_t aubio_tempo_get_confidence(aubio_tempo_t * bt);
+void del_aubio_tempo(aubio_tempo_t * o);
+
+/* sndfile */
+%{
+#if HAVE_SNDFILE
+#include "sndfileio.h"
+%}
+extern aubio_sndfile_t * new_aubio_sndfile_ro (const char * inputfile);
+extern aubio_sndfile_t * new_aubio_sndfile_wo(aubio_sndfile_t * existingfile, const char * outputname);
+extern void aubio_sndfile_info(aubio_sndfile_t * file);
+extern int aubio_sndfile_write(aubio_sndfile_t * file, int frames, fvec_t * write);
+extern int aubio_sndfile_read(aubio_sndfile_t * file, int frames, fvec_t * read);
+extern int del_aubio_sndfile(aubio_sndfile_t * file);
+extern uint_t aubio_sndfile_channels(aubio_sndfile_t * file);
+extern uint_t aubio_sndfile_samplerate(aubio_sndfile_t * file);
+%{
+#endif /* HAVE_SNDFILE */
+%}
--- /dev/null
+++ b/tests/README.tests
@@ -1,0 +1,1 @@
+Python unit tests checking the output of the programs in aubio/examples/
--- a/tests/python/examples/README
+++ /dev/null
@@ -1,1 +1,0 @@
-Python unit tests checking the output of the programs in aubio/examples/
--- /dev/null
+++ b/tests/python/examples/aubiopitch/yinfft.16568__acclivity__TwoCows.wav.txt
@@ -1,0 +1,566 @@
+0.0232199546485	-1.0
+0.0464399092971	-1.0
+0.0696598639456	-1.0
+0.0928798185941	-1.0
+0.116099773243	-1.0
+0.139319727891	-1.0
+0.16253968254	-1.0
+0.185759637188	-1.0
+0.208979591837	-1.0
+0.232199546485	-1.0
+0.255419501134	-1.0
+0.278639455782	-1.0
+0.301859410431	-1.0
+0.325079365079	-1.0
+0.348299319728	-1.0
+0.371519274376	-1.0
+0.394739229025	-1.0
+0.417959183673	-1.0
+0.441179138322	-1.0
+0.464399092971	-1.0
+0.487619047619	-1.0
+0.510839002268	-1.0
+0.534058956916	-1.0
+0.557278911565	-1.0
+0.580498866213	-1.0
+0.603718820862	-1.0
+0.62693877551	-1.0
+0.650158730159	-1.0
+0.673378684807	-1.0
+0.696598639456	-1.0
+0.719818594104	-1.0
+0.743038548753	-1.0
+0.766258503401	-1.0
+0.78947845805	-1.0
+0.812698412698	-1.0
+0.835918367347	-1.0
+0.859138321995	-1.0
+0.882358276644	-1.0
+0.905578231293	-1.0
+0.928798185941	-1.0
+0.95201814059	-1.0
+0.975238095238	-1.0
+0.998458049887	-1.0
+1.02167800454	-1.0
+1.04489795918	-1.0
+1.06811791383	392.768096924
+1.09133786848	115.522140503
+1.11455782313	116.574150085
+1.13777777778	117.720863342
+1.16099773243	120.00163269
+1.18421768707	123.633300781
+1.20743764172	426.787963867
+1.23065759637	141.312179565
+1.25387755102	144.336975098
+1.27709750567	148.604934692
+1.30031746032	150.864654541
+1.32353741497	154.889007568
+1.34675736961	156.505081177
+1.36997732426	158.878829956
+1.39319727891	160.931289673
+1.41641723356	163.155059814
+1.43963718821	324.814025879
+1.46285714286	167.016983032
+1.48607709751	168.871704102
+1.50929705215	170.665634155
+1.5325170068	172.353149414
+1.55573696145	174.764205933
+1.5789569161	176.318893433
+1.60217687075	178.282669067
+1.6253968254	179.82383728
+1.64861678005	181.488952637
+1.67183673469	183.1927948
+1.69505668934	184.449371338
+1.71827664399	185.715484619
+1.74149659864	186.702224731
+1.76471655329	187.907455444
+1.78793650794	188.703475952
+1.81115646259	189.502182007
+1.83437641723	190.250213623
+1.85759637188	190.834747314
+1.88081632653	190.98348999
+1.90403628118	190.847137451
+1.92725623583	190.805847168
+1.95047619048	191.00831604
+1.97369614512	191.377182007
+1.99691609977	191.935241699
+2.02013605442	192.395782471
+2.04335600907	192.534378052
+2.06657596372	192.404174805
+2.08979591837	192.085708618
+2.11301587302	191.410400391
+2.13623582766	191.070388794
+2.15945578231	190.677963257
+2.18267573696	190.020675659
+2.20589569161	189.669265747
+2.22911564626	189.298828125
+2.25233560091	188.546142578
+2.27555555556	186.856491089
+2.2987755102	184.917297363
+2.32199546485	183.044509888
+2.3452154195	181.399368286
+2.36843537415	179.126312256
+2.3916553288	175.22946167
+2.41487528345	171.139190674
+2.4380952381	338.55368042
+2.46131519274	162.799713135
+2.48453514739	320.075500488
+2.50775510204	148.602432251
+2.53097505669	139.503982544
+2.55419501134	340.922271729
+2.57741496599	326.436950684
+2.60063492063	333.484558105
+2.62385487528	-1.0
+2.64707482993	-1.0
+2.67029478458	-1.0
+2.69351473923	-1.0
+2.71673469388	-1.0
+2.73995464853	-1.0
+2.76317460317	-1.0
+2.78639455782	-1.0
+2.80961451247	-1.0
+2.83283446712	-1.0
+2.85605442177	-1.0
+2.87927437642	-1.0
+2.90249433107	-1.0
+2.92571428571	-1.0
+2.94893424036	-1.0
+2.97215419501	-1.0
+2.99537414966	-1.0
+3.01859410431	-1.0
+3.04181405896	-1.0
+3.06503401361	-1.0
+3.08825396825	-1.0
+3.1114739229	-1.0
+3.13469387755	-1.0
+3.1579138322	-1.0
+3.18113378685	-1.0
+3.2043537415	-1.0
+3.22757369615	-1.0
+3.25079365079	-1.0
+3.27401360544	-1.0
+3.29723356009	-1.0
+3.32045351474	-1.0
+3.34367346939	-1.0
+3.36689342404	-1.0
+3.39011337868	-1.0
+3.41333333333	-1.0
+3.43655328798	-1.0
+3.45977324263	-1.0
+3.48299319728	-1.0
+3.50621315193	-1.0
+3.52943310658	-1.0
+3.55265306122	-1.0
+3.57587301587	-1.0
+3.59909297052	-1.0
+3.62231292517	-1.0
+3.64553287982	-1.0
+3.66875283447	-1.0
+3.69197278912	-1.0
+3.71519274376	-1.0
+3.73841269841	-1.0
+3.76163265306	-1.0
+3.78485260771	-1.0
+3.80807256236	-1.0
+3.83129251701	-1.0
+3.85451247166	-1.0
+3.8777324263	-1.0
+3.90095238095	-1.0
+3.9241723356	-1.0
+3.94739229025	-1.0
+3.9706122449	-1.0
+3.99383219955	-1.0
+4.0170521542	-1.0
+4.04027210884	-1.0
+4.06349206349	-1.0
+4.08671201814	-1.0
+4.10993197279	-1.0
+4.13315192744	-1.0
+4.15637188209	-1.0
+4.17959183673	-1.0
+4.20281179138	-1.0
+4.22603174603	-1.0
+4.24925170068	-1.0
+4.27247165533	-1.0
+4.29569160998	-1.0
+4.31891156463	-1.0
+4.34213151927	-1.0
+4.36535147392	-1.0
+4.38857142857	-1.0
+4.41179138322	-1.0
+4.43501133787	-1.0
+4.45823129252	-1.0
+4.48145124717	-1.0
+4.50467120181	-1.0
+4.52789115646	-1.0
+4.55111111111	-1.0
+4.57433106576	-1.0
+4.59755102041	-1.0
+4.62077097506	-1.0
+4.64399092971	-1.0
+4.66721088435	-1.0
+4.690430839	-1.0
+4.71365079365	-1.0
+4.7368707483	-1.0
+4.76009070295	-1.0
+4.7833106576	-1.0
+4.80653061224	-1.0
+4.82975056689	-1.0
+4.85297052154	-1.0
+4.87619047619	-1.0
+4.89941043084	-1.0
+4.92263038549	-1.0
+4.94585034014	-1.0
+4.96907029478	-1.0
+4.99229024943	-1.0
+5.01551020408	-1.0
+5.03873015873	-1.0
+5.06195011338	-1.0
+5.08517006803	-1.0
+5.10839002268	-1.0
+5.13160997732	-1.0
+5.15482993197	-1.0
+5.17804988662	-1.0
+5.20126984127	-1.0
+5.22448979592	-1.0
+5.24770975057	-1.0
+5.27092970522	-1.0
+5.29414965986	-1.0
+5.31736961451	-1.0
+5.34058956916	-1.0
+5.36380952381	-1.0
+5.38702947846	-1.0
+5.41024943311	-1.0
+5.43346938776	-1.0
+5.4566893424	-1.0
+5.47990929705	-1.0
+5.5031292517	-1.0
+5.52634920635	-1.0
+5.549569161	-1.0
+5.57278911565	-1.0
+5.59600907029	-1.0
+5.61922902494	-1.0
+5.64244897959	-1.0
+5.66566893424	-1.0
+5.68888888889	-1.0
+5.71210884354	-1.0
+5.73532879819	-1.0
+5.75854875283	-1.0
+5.78176870748	-1.0
+5.80498866213	-1.0
+5.82820861678	-1.0
+5.85142857143	-1.0
+5.87464852608	-1.0
+5.89786848073	-1.0
+5.92108843537	-1.0
+5.94430839002	-1.0
+5.96752834467	-1.0
+5.99074829932	-1.0
+6.01396825397	-1.0
+6.03718820862	-1.0
+6.06040816327	-1.0
+6.08362811791	-1.0
+6.10684807256	-1.0
+6.13006802721	-1.0
+6.15328798186	-1.0
+6.17650793651	-1.0
+6.19972789116	-1.0
+6.2229478458	-1.0
+6.24616780045	-1.0
+6.2693877551	-1.0
+6.29260770975	-1.0
+6.3158276644	-1.0
+6.33904761905	-1.0
+6.3622675737	-1.0
+6.38548752834	-1.0
+6.40870748299	-1.0
+6.43192743764	-1.0
+6.45514739229	-1.0
+6.47836734694	-1.0
+6.50158730159	187.887435913
+6.52480725624	143.988250732
+6.54802721088	147.904678345
+6.57124716553	151.674087524
+6.59446712018	3221.32983398
+6.61768707483	3159.02587891
+6.64090702948	160.395706177
+6.66412698413	162.535690308
+6.68734693878	164.282516479
+6.71056689342	166.054779053
+6.73378684807	167.578659058
+6.75700680272	169.234619141
+6.78022675737	171.029663086
+6.80344671202	173.257110596
+6.82666666667	174.64654541
+6.84988662132	175.149429321
+6.87310657596	175.456039429
+6.89632653061	176.283660889
+6.91954648526	177.318511963
+6.94276643991	178.066696167
+6.96598639456	178.517211914
+6.98920634921	179.053573608
+7.01242630385	179.549285889
+7.0356462585	180.029403687
+7.05886621315	180.64515686
+7.0820861678	180.8934021
+7.10530612245	180.952774048
+7.1285260771	181.48147583
+7.15174603175	182.092208862
+7.17496598639	183.082504272
+7.19818594104	183.907089233
+7.22140589569	184.607666016
+7.24462585034	185.0181427
+7.26784580499	185.282440186
+7.29106575964	185.946502686
+7.31428571429	186.74571228
+7.33750566893	187.205505371
+7.36072562358	187.595703125
+7.38394557823	187.939483643
+7.40716553288	188.01159668
+7.43038548753	187.807418823
+7.45360544218	187.751464844
+7.47682539683	187.811416626
+7.50004535147	187.951507568
+7.52326530612	188.168029785
+7.54648526077	188.630828857
+7.56970521542	188.946014404
+7.59292517007	189.095901489
+7.61614512472	189.302886963
+7.63936507937	189.673339844
+7.66258503401	189.881591797
+7.68580498866	189.865234375
+7.70902494331	189.865234375
+7.73224489796	189.595870972
+7.75546485261	188.954116821
+7.77868480726	188.192108154
+7.8019047619	187.352645874
+7.82512471655	186.524551392
+7.8483446712	184.967712402
+7.87156462585	183.589355469
+7.8947845805	182.828231812
+7.91800453515	181.968215942
+7.9412244898	180.796981812
+7.96444444444	180.0
+7.98766439909	179.184524536
+8.01088435374	178.799484253
+8.03410430839	178.29347229
+8.05732426304	178.088272095
+8.08054421769	177.894317627
+8.10376417234	177.693618774
+8.12698412698	177.905075073
+8.15020408163	178.041549683
+8.17342403628	178.045135498
+8.19664399093	177.650650024
+8.21986394558	177.32208252
+8.24308390023	176.611938477
+8.26630385488	175.525878906
+8.28952380952	172.121078491
+8.31274376417	584.997009277
+8.33596371882	575.042358398
+8.35918367347	465.681121826
+8.38240362812	447.307037354
+8.40562358277	-1.0
+8.42884353741	-1.0
+8.45206349206	-1.0
+8.47528344671	-1.0
+8.49850340136	-1.0
+8.52172335601	-1.0
+8.54494331066	-1.0
+8.56816326531	-1.0
+8.59138321995	-1.0
+8.6146031746	-1.0
+8.63782312925	-1.0
+8.6610430839	-1.0
+8.68426303855	-1.0
+8.7074829932	-1.0
+8.73070294785	-1.0
+8.75392290249	-1.0
+8.77714285714	-1.0
+8.80036281179	-1.0
+8.82358276644	-1.0
+8.84680272109	-1.0
+8.87002267574	-1.0
+8.89324263039	-1.0
+8.91646258503	-1.0
+8.93968253968	-1.0
+8.96290249433	-1.0
+8.98612244898	-1.0
+9.00934240363	-1.0
+9.03256235828	-1.0
+9.05578231293	-1.0
+9.07900226757	-1.0
+9.10222222222	-1.0
+9.12544217687	-1.0
+9.14866213152	-1.0
+9.17188208617	-1.0
+9.19510204082	-1.0
+9.21832199546	-1.0
+9.24154195011	-1.0
+9.26476190476	-1.0
+9.28798185941	-1.0
+9.31120181406	-1.0
+9.33442176871	-1.0
+9.35764172336	-1.0
+9.380861678	-1.0
+9.40408163265	-1.0
+9.4273015873	-1.0
+9.45052154195	-1.0
+9.4737414966	-1.0
+9.49696145125	-1.0
+9.5201814059	-1.0
+9.54340136054	-1.0
+9.56662131519	-1.0
+9.58984126984	-1.0
+9.61306122449	-1.0
+9.63628117914	-1.0
+9.65950113379	-1.0
+9.68272108844	-1.0
+9.70594104308	-1.0
+9.72916099773	-1.0
+9.75238095238	-1.0
+9.77560090703	-1.0
+9.79882086168	-1.0
+9.82204081633	-1.0
+9.84526077098	-1.0
+9.86848072562	-1.0
+9.89170068027	-1.0
+9.91492063492	-1.0
+9.93814058957	-1.0
+9.96136054422	-1.0
+9.98458049887	-1.0
+10.0078004535	-1.0
+10.0310204082	-1.0
+10.0542403628	-1.0
+10.0774603175	-1.0
+10.1006802721	-1.0
+10.1239002268	-1.0
+10.1471201814	-1.0
+10.1703401361	-1.0
+10.1935600907	-1.0
+10.2167800454	-1.0
+10.24	-1.0
+10.2632199546	-1.0
+10.2864399093	100.193115234
+10.3096598639	-1.0
+10.3328798186	326.038757324
+10.3560997732	104.222053528
+10.3793197279	105.370048523
+10.4025396825	106.595123291
+10.4257596372	107.893875122
+10.4489795918	108.992500305
+10.4721995465	109.93119812
+10.4954195011	110.819335938
+10.5186394558	112.031303406
+10.5418594104	113.389472961
+10.5650793651	114.239830017
+10.5882993197	116.827377319
+10.6115192744	119.250427246
+10.634739229	122.184356689
+10.6579591837	148.222839355
+10.6811791383	150.104660034
+10.704399093	153.361968994
+10.7276190476	155.115112305
+10.7508390023	158.433624268
+10.7740589569	161.372955322
+10.7972789116	163.421096802
+10.8204988662	167.165771484
+10.8437188209	170.329452515
+10.8669387755	173.311584473
+10.8901587302	175.445571899
+10.9133786848	177.304244995
+10.9365986395	179.024490356
+10.9598185941	180.073501587
+10.9830385488	180.826629639
+11.0062585034	181.559936523
+11.029478458	182.487792969
+11.0526984127	183.303192139
+11.0759183673	183.976135254
+11.099138322	184.650161743
+11.1223582766	185.613876343
+11.1455782313	186.123062134
+11.1687981859	186.852523804
+11.1920181406	187.531890869
+11.2152380952	188.232284546
+11.2384580499	189.20135498
+11.2616780045	189.485900879
+11.2848979592	190.094390869
+11.3081179138	190.636749268
+11.3313378685	191.252670288
+11.3545578231	191.647476196
+11.3777777778	192.673187256
+11.4009977324	193.018920898
+11.4242176871	193.641860962
+11.4474376417	194.307373047
+11.4706575964	194.234619141
+11.493877551	194.290252686
+11.5170975057	194.641845703
+11.5403174603	194.663314819
+11.563537415	194.719177246
+11.5867573696	194.149108887
+11.6099773243	194.166213989
+11.6331972789	194.136291504
+11.6564172336	193.786529541
+11.6796371882	192.605865479
+11.7028571429	190.785202026
+11.7260770975	188.578399658
+11.7492970522	182.544433594
+11.7725170068	173.676742554
+11.7957369615	415.019744873
+11.8189569161	417.989685059
+11.8421768707	333.699066162
+11.8653968254	415.058837891
+11.88861678	352.025543213
+11.9118367347	-1.0
+11.9350566893	-1.0
+11.958276644	-1.0
+11.9814965986	-1.0
+12.0047165533	-1.0
+12.0279365079	-1.0
+12.0511564626	-1.0
+12.0743764172	-1.0
+12.0975963719	-1.0
+12.1208163265	-1.0
+12.1440362812	-1.0
+12.1672562358	-1.0
+12.1904761905	-1.0
+12.2136961451	-1.0
+12.2369160998	-1.0
+12.2601360544	-1.0
+12.2833560091	-1.0
+12.3065759637	-1.0
+12.3297959184	-1.0
+12.353015873	-1.0
+12.3762358277	-1.0
+12.3994557823	-1.0
+12.422675737	-1.0
+12.4458956916	-1.0
+12.4691156463	-1.0
+12.4923356009	-1.0
+12.5155555556	-1.0
+12.5387755102	-1.0
+12.5619954649	-1.0
+12.5852154195	-1.0
+12.6084353741	-1.0
+12.6316553288	-1.0
+12.6548752834	-1.0
+12.6780952381	-1.0
+12.7013151927	-1.0
+12.7245351474	-1.0
+12.747755102	-1.0
+12.7709750567	-1.0
+12.7941950113	-1.0
+12.817414966	-1.0
+12.8406349206	-1.0
+12.8638548753	-1.0
+12.8870748299	-1.0
+12.9102947846	-1.0
+12.9335147392	-1.0
+12.9567346939	-1.0
+12.9799546485	-1.0
+13.0031746032	-1.0
+13.0263945578	-1.0
+13.0496145125	-1.0
+13.0728344671	-1.0
+13.0960544218	-1.0
+13.1192743764	-1.0
+13.1424943311	-1.0
--- a/tests/python/examples/aubiopitch/yinfft.16568_acclivity_TwoCows.wav.txt
+++ /dev/null
@@ -1,566 +1,0 @@
-0.0232199546485	-1.0
-0.0464399092971	-1.0
-0.0696598639456	-1.0
-0.0928798185941	-1.0
-0.116099773243	-1.0
-0.139319727891	-1.0
-0.16253968254	-1.0
-0.185759637188	-1.0
-0.208979591837	-1.0
-0.232199546485	-1.0
-0.255419501134	-1.0
-0.278639455782	-1.0
-0.301859410431	-1.0
-0.325079365079	-1.0
-0.348299319728	-1.0
-0.371519274376	-1.0
-0.394739229025	-1.0
-0.417959183673	-1.0
-0.441179138322	-1.0
-0.464399092971	-1.0
-0.487619047619	-1.0
-0.510839002268	-1.0
-0.534058956916	-1.0
-0.557278911565	-1.0
-0.580498866213	-1.0
-0.603718820862	-1.0
-0.62693877551	-1.0
-0.650158730159	-1.0
-0.673378684807	-1.0
-0.696598639456	-1.0
-0.719818594104	-1.0
-0.743038548753	-1.0
-0.766258503401	-1.0
-0.78947845805	-1.0
-0.812698412698	-1.0
-0.835918367347	-1.0
-0.859138321995	-1.0
-0.882358276644	-1.0
-0.905578231293	-1.0
-0.928798185941	-1.0
-0.95201814059	-1.0
-0.975238095238	-1.0
-0.998458049887	-1.0
-1.02167800454	-1.0
-1.04489795918	-1.0
-1.06811791383	392.768096924
-1.09133786848	115.522140503
-1.11455782313	116.574150085
-1.13777777778	117.720863342
-1.16099773243	120.00163269
-1.18421768707	123.633300781
-1.20743764172	426.787963867
-1.23065759637	141.312179565
-1.25387755102	144.336975098
-1.27709750567	148.604934692
-1.30031746032	150.864654541
-1.32353741497	154.889007568
-1.34675736961	156.505081177
-1.36997732426	158.878829956
-1.39319727891	160.931289673
-1.41641723356	163.155059814
-1.43963718821	324.814025879
-1.46285714286	167.016983032
-1.48607709751	168.871704102
-1.50929705215	170.665634155
-1.5325170068	172.353149414
-1.55573696145	174.764205933
-1.5789569161	176.318893433
-1.60217687075	178.282669067
-1.6253968254	179.82383728
-1.64861678005	181.488952637
-1.67183673469	183.1927948
-1.69505668934	184.449371338
-1.71827664399	185.715484619
-1.74149659864	186.702224731
-1.76471655329	187.907455444
-1.78793650794	188.703475952
-1.81115646259	189.502182007
-1.83437641723	190.250213623
-1.85759637188	190.834747314
-1.88081632653	190.98348999
-1.90403628118	190.847137451
-1.92725623583	190.805847168
-1.95047619048	191.00831604
-1.97369614512	191.377182007
-1.99691609977	191.935241699
-2.02013605442	192.395782471
-2.04335600907	192.534378052
-2.06657596372	192.404174805
-2.08979591837	192.085708618
-2.11301587302	191.410400391
-2.13623582766	191.070388794
-2.15945578231	190.677963257
-2.18267573696	190.020675659
-2.20589569161	189.669265747
-2.22911564626	189.298828125
-2.25233560091	188.546142578
-2.27555555556	186.856491089
-2.2987755102	184.917297363
-2.32199546485	183.044509888
-2.3452154195	181.399368286
-2.36843537415	179.126312256
-2.3916553288	175.22946167
-2.41487528345	171.139190674
-2.4380952381	338.55368042
-2.46131519274	162.799713135
-2.48453514739	320.075500488
-2.50775510204	148.602432251
-2.53097505669	139.503982544
-2.55419501134	340.922271729
-2.57741496599	326.436950684
-2.60063492063	333.484558105
-2.62385487528	-1.0
-2.64707482993	-1.0
-2.67029478458	-1.0
-2.69351473923	-1.0
-2.71673469388	-1.0
-2.73995464853	-1.0
-2.76317460317	-1.0
-2.78639455782	-1.0
-2.80961451247	-1.0
-2.83283446712	-1.0
-2.85605442177	-1.0
-2.87927437642	-1.0
-2.90249433107	-1.0
-2.92571428571	-1.0
-2.94893424036	-1.0
-2.97215419501	-1.0
-2.99537414966	-1.0
-3.01859410431	-1.0
-3.04181405896	-1.0
-3.06503401361	-1.0
-3.08825396825	-1.0
-3.1114739229	-1.0
-3.13469387755	-1.0
-3.1579138322	-1.0
-3.18113378685	-1.0
-3.2043537415	-1.0
-3.22757369615	-1.0
-3.25079365079	-1.0
-3.27401360544	-1.0
-3.29723356009	-1.0
-3.32045351474	-1.0
-3.34367346939	-1.0
-3.36689342404	-1.0
-3.39011337868	-1.0
-3.41333333333	-1.0
-3.43655328798	-1.0
-3.45977324263	-1.0
-3.48299319728	-1.0
-3.50621315193	-1.0
-3.52943310658	-1.0
-3.55265306122	-1.0
-3.57587301587	-1.0
-3.59909297052	-1.0
-3.62231292517	-1.0
-3.64553287982	-1.0
-3.66875283447	-1.0
-3.69197278912	-1.0
-3.71519274376	-1.0
-3.73841269841	-1.0
-3.76163265306	-1.0
-3.78485260771	-1.0
-3.80807256236	-1.0
-3.83129251701	-1.0
-3.85451247166	-1.0
-3.8777324263	-1.0
-3.90095238095	-1.0
-3.9241723356	-1.0
-3.94739229025	-1.0
-3.9706122449	-1.0
-3.99383219955	-1.0
-4.0170521542	-1.0
-4.04027210884	-1.0
-4.06349206349	-1.0
-4.08671201814	-1.0
-4.10993197279	-1.0
-4.13315192744	-1.0
-4.15637188209	-1.0
-4.17959183673	-1.0
-4.20281179138	-1.0
-4.22603174603	-1.0
-4.24925170068	-1.0
-4.27247165533	-1.0
-4.29569160998	-1.0
-4.31891156463	-1.0
-4.34213151927	-1.0
-4.36535147392	-1.0
-4.38857142857	-1.0
-4.41179138322	-1.0
-4.43501133787	-1.0
-4.45823129252	-1.0
-4.48145124717	-1.0
-4.50467120181	-1.0
-4.52789115646	-1.0
-4.55111111111	-1.0
-4.57433106576	-1.0
-4.59755102041	-1.0
-4.62077097506	-1.0
-4.64399092971	-1.0
-4.66721088435	-1.0
-4.690430839	-1.0
-4.71365079365	-1.0
-4.7368707483	-1.0
-4.76009070295	-1.0
-4.7833106576	-1.0
-4.80653061224	-1.0
-4.82975056689	-1.0
-4.85297052154	-1.0
-4.87619047619	-1.0
-4.89941043084	-1.0
-4.92263038549	-1.0
-4.94585034014	-1.0
-4.96907029478	-1.0
-4.99229024943	-1.0
-5.01551020408	-1.0
-5.03873015873	-1.0
-5.06195011338	-1.0
-5.08517006803	-1.0
-5.10839002268	-1.0
-5.13160997732	-1.0
-5.15482993197	-1.0
-5.17804988662	-1.0
-5.20126984127	-1.0
-5.22448979592	-1.0
-5.24770975057	-1.0
-5.27092970522	-1.0
-5.29414965986	-1.0
-5.31736961451	-1.0
-5.34058956916	-1.0
-5.36380952381	-1.0
-5.38702947846	-1.0
-5.41024943311	-1.0
-5.43346938776	-1.0
-5.4566893424	-1.0
-5.47990929705	-1.0
-5.5031292517	-1.0
-5.52634920635	-1.0
-5.549569161	-1.0
-5.57278911565	-1.0
-5.59600907029	-1.0
-5.61922902494	-1.0
-5.64244897959	-1.0
-5.66566893424	-1.0
-5.68888888889	-1.0
-5.71210884354	-1.0
-5.73532879819	-1.0
-5.75854875283	-1.0
-5.78176870748	-1.0
-5.80498866213	-1.0
-5.82820861678	-1.0
-5.85142857143	-1.0
-5.87464852608	-1.0
-5.89786848073	-1.0
-5.92108843537	-1.0
-5.94430839002	-1.0
-5.96752834467	-1.0
-5.99074829932	-1.0
-6.01396825397	-1.0
-6.03718820862	-1.0
-6.06040816327	-1.0
-6.08362811791	-1.0
-6.10684807256	-1.0
-6.13006802721	-1.0
-6.15328798186	-1.0
-6.17650793651	-1.0
-6.19972789116	-1.0
-6.2229478458	-1.0
-6.24616780045	-1.0
-6.2693877551	-1.0
-6.29260770975	-1.0
-6.3158276644	-1.0
-6.33904761905	-1.0
-6.3622675737	-1.0
-6.38548752834	-1.0
-6.40870748299	-1.0
-6.43192743764	-1.0
-6.45514739229	-1.0
-6.47836734694	-1.0
-6.50158730159	187.887435913
-6.52480725624	143.988250732
-6.54802721088	147.904678345
-6.57124716553	151.674087524
-6.59446712018	3221.32983398
-6.61768707483	3159.02587891
-6.64090702948	160.395706177
-6.66412698413	162.535690308
-6.68734693878	164.282516479
-6.71056689342	166.054779053
-6.73378684807	167.578659058
-6.75700680272	169.234619141
-6.78022675737	171.029663086
-6.80344671202	173.257110596
-6.82666666667	174.64654541
-6.84988662132	175.149429321
-6.87310657596	175.456039429
-6.89632653061	176.283660889
-6.91954648526	177.318511963
-6.94276643991	178.066696167
-6.96598639456	178.517211914
-6.98920634921	179.053573608
-7.01242630385	179.549285889
-7.0356462585	180.029403687
-7.05886621315	180.64515686
-7.0820861678	180.8934021
-7.10530612245	180.952774048
-7.1285260771	181.48147583
-7.15174603175	182.092208862
-7.17496598639	183.082504272
-7.19818594104	183.907089233
-7.22140589569	184.607666016
-7.24462585034	185.0181427
-7.26784580499	185.282440186
-7.29106575964	185.946502686
-7.31428571429	186.74571228
-7.33750566893	187.205505371
-7.36072562358	187.595703125
-7.38394557823	187.939483643
-7.40716553288	188.01159668
-7.43038548753	187.807418823
-7.45360544218	187.751464844
-7.47682539683	187.811416626
-7.50004535147	187.951507568
-7.52326530612	188.168029785
-7.54648526077	188.630828857
-7.56970521542	188.946014404
-7.59292517007	189.095901489
-7.61614512472	189.302886963
-7.63936507937	189.673339844
-7.66258503401	189.881591797
-7.68580498866	189.865234375
-7.70902494331	189.865234375
-7.73224489796	189.595870972
-7.75546485261	188.954116821
-7.77868480726	188.192108154
-7.8019047619	187.352645874
-7.82512471655	186.524551392
-7.8483446712	184.967712402
-7.87156462585	183.589355469
-7.8947845805	182.828231812
-7.91800453515	181.968215942
-7.9412244898	180.796981812
-7.96444444444	180.0
-7.98766439909	179.184524536
-8.01088435374	178.799484253
-8.03410430839	178.29347229
-8.05732426304	178.088272095
-8.08054421769	177.894317627
-8.10376417234	177.693618774
-8.12698412698	177.905075073
-8.15020408163	178.041549683
-8.17342403628	178.045135498
-8.19664399093	177.650650024
-8.21986394558	177.32208252
-8.24308390023	176.611938477
-8.26630385488	175.525878906
-8.28952380952	172.121078491
-8.31274376417	584.997009277
-8.33596371882	575.042358398
-8.35918367347	465.681121826
-8.38240362812	447.307037354
-8.40562358277	-1.0
-8.42884353741	-1.0
-8.45206349206	-1.0
-8.47528344671	-1.0
-8.49850340136	-1.0
-8.52172335601	-1.0
-8.54494331066	-1.0
-8.56816326531	-1.0
-8.59138321995	-1.0
-8.6146031746	-1.0
-8.63782312925	-1.0
-8.6610430839	-1.0
-8.68426303855	-1.0
-8.7074829932	-1.0
-8.73070294785	-1.0
-8.75392290249	-1.0
-8.77714285714	-1.0
-8.80036281179	-1.0
-8.82358276644	-1.0
-8.84680272109	-1.0
-8.87002267574	-1.0
-8.89324263039	-1.0
-8.91646258503	-1.0
-8.93968253968	-1.0
-8.96290249433	-1.0
-8.98612244898	-1.0
-9.00934240363	-1.0
-9.03256235828	-1.0
-9.05578231293	-1.0
-9.07900226757	-1.0
-9.10222222222	-1.0
-9.12544217687	-1.0
-9.14866213152	-1.0
-9.17188208617	-1.0
-9.19510204082	-1.0
-9.21832199546	-1.0
-9.24154195011	-1.0
-9.26476190476	-1.0
-9.28798185941	-1.0
-9.31120181406	-1.0
-9.33442176871	-1.0
-9.35764172336	-1.0
-9.380861678	-1.0
-9.40408163265	-1.0
-9.4273015873	-1.0
-9.45052154195	-1.0
-9.4737414966	-1.0
-9.49696145125	-1.0
-9.5201814059	-1.0
-9.54340136054	-1.0
-9.56662131519	-1.0
-9.58984126984	-1.0
-9.61306122449	-1.0
-9.63628117914	-1.0
-9.65950113379	-1.0
-9.68272108844	-1.0
-9.70594104308	-1.0
-9.72916099773	-1.0
-9.75238095238	-1.0
-9.77560090703	-1.0
-9.79882086168	-1.0
-9.82204081633	-1.0
-9.84526077098	-1.0
-9.86848072562	-1.0
-9.89170068027	-1.0
-9.91492063492	-1.0
-9.93814058957	-1.0
-9.96136054422	-1.0
-9.98458049887	-1.0
-10.0078004535	-1.0
-10.0310204082	-1.0
-10.0542403628	-1.0
-10.0774603175	-1.0
-10.1006802721	-1.0
-10.1239002268	-1.0
-10.1471201814	-1.0
-10.1703401361	-1.0
-10.1935600907	-1.0
-10.2167800454	-1.0
-10.24	-1.0
-10.2632199546	-1.0
-10.2864399093	100.193115234
-10.3096598639	-1.0
-10.3328798186	326.038757324
-10.3560997732	104.222053528
-10.3793197279	105.370048523
-10.4025396825	106.595123291
-10.4257596372	107.893875122
-10.4489795918	108.992500305
-10.4721995465	109.93119812
-10.4954195011	110.819335938
-10.5186394558	112.031303406
-10.5418594104	113.389472961
-10.5650793651	114.239830017
-10.5882993197	116.827377319
-10.6115192744	119.250427246
-10.634739229	122.184356689
-10.6579591837	148.222839355
-10.6811791383	150.104660034
-10.704399093	153.361968994
-10.7276190476	155.115112305
-10.7508390023	158.433624268
-10.7740589569	161.372955322
-10.7972789116	163.421096802
-10.8204988662	167.165771484
-10.8437188209	170.329452515
-10.8669387755	173.311584473
-10.8901587302	175.445571899
-10.9133786848	177.304244995
-10.9365986395	179.024490356
-10.9598185941	180.073501587
-10.9830385488	180.826629639
-11.0062585034	181.559936523
-11.029478458	182.487792969
-11.0526984127	183.303192139
-11.0759183673	183.976135254
-11.099138322	184.650161743
-11.1223582766	185.613876343
-11.1455782313	186.123062134
-11.1687981859	186.852523804
-11.1920181406	187.531890869
-11.2152380952	188.232284546
-11.2384580499	189.20135498
-11.2616780045	189.485900879
-11.2848979592	190.094390869
-11.3081179138	190.636749268
-11.3313378685	191.252670288
-11.3545578231	191.647476196
-11.3777777778	192.673187256
-11.4009977324	193.018920898
-11.4242176871	193.641860962
-11.4474376417	194.307373047
-11.4706575964	194.234619141
-11.493877551	194.290252686
-11.5170975057	194.641845703
-11.5403174603	194.663314819
-11.563537415	194.719177246
-11.5867573696	194.149108887
-11.6099773243	194.166213989
-11.6331972789	194.136291504
-11.6564172336	193.786529541
-11.6796371882	192.605865479
-11.7028571429	190.785202026
-11.7260770975	188.578399658
-11.7492970522	182.544433594
-11.7725170068	173.676742554
-11.7957369615	415.019744873
-11.8189569161	417.989685059
-11.8421768707	333.699066162
-11.8653968254	415.058837891
-11.88861678	352.025543213
-11.9118367347	-1.0
-11.9350566893	-1.0
-11.958276644	-1.0
-11.9814965986	-1.0
-12.0047165533	-1.0
-12.0279365079	-1.0
-12.0511564626	-1.0
-12.0743764172	-1.0
-12.0975963719	-1.0
-12.1208163265	-1.0
-12.1440362812	-1.0
-12.1672562358	-1.0
-12.1904761905	-1.0
-12.2136961451	-1.0
-12.2369160998	-1.0
-12.2601360544	-1.0
-12.2833560091	-1.0
-12.3065759637	-1.0
-12.3297959184	-1.0
-12.353015873	-1.0
-12.3762358277	-1.0
-12.3994557823	-1.0
-12.422675737	-1.0
-12.4458956916	-1.0
-12.4691156463	-1.0
-12.4923356009	-1.0
-12.5155555556	-1.0
-12.5387755102	-1.0
-12.5619954649	-1.0
-12.5852154195	-1.0
-12.6084353741	-1.0
-12.6316553288	-1.0
-12.6548752834	-1.0
-12.6780952381	-1.0
-12.7013151927	-1.0
-12.7245351474	-1.0
-12.747755102	-1.0
-12.7709750567	-1.0
-12.7941950113	-1.0
-12.817414966	-1.0
-12.8406349206	-1.0
-12.8638548753	-1.0
-12.8870748299	-1.0
-12.9102947846	-1.0
-12.9335147392	-1.0
-12.9567346939	-1.0
-12.9799546485	-1.0
-13.0031746032	-1.0
-13.0263945578	-1.0
-13.0496145125	-1.0
-13.0728344671	-1.0
-13.0960544218	-1.0
-13.1192743764	-1.0
-13.1424943311	-1.0
--- a/tests/src/test-phasevoc-jack.c
+++ b/tests/src/test-phasevoc-jack.c
@@ -9,7 +9,7 @@
 
 #include <unistd.h>  /* sleep() */
 #include <aubio.h>
-#include <aubioext.h>
+#include "jackio.h"
 
 uint_t testing  = 1;  /* change this to 1 to listen        */
 
--- a/wscript
+++ b/wscript
@@ -136,7 +136,7 @@
   bld.env['LIB_VERSION'] = LIB_VERSION 
 
   # add sub directories
-  bld.add_subdirs('src ext examples interfaces/cpp')
+  bld.add_subdirs('src examples interfaces/cpp')
   if bld.env['SWIG']:
     if bld.env['PYTHON']:
       bld.add_subdirs('python/aubio python')
@@ -187,8 +187,11 @@
         source = target_name,
         target = target_name.split('.')[0],
         includes = 'src',
+        defines = 'AUBIO_UNSTABLE_API=1',
         uselib_local = 'aubio')
-    # phasevoc-jack also needs aubioext
+    # phasevoc-jack also needs jack 
     if target_name.endswith('test-phasevoc-jack.c'):
-      this_target.includes = ['src', 'ext']
-      this_target.uselib_local = ['aubio', 'aubioext']
+      this_target.includes = ['src', 'examples']
+      this_target.uselib_local = ['aubio']
+      this_target.uselib = ['JACK']
+      this_target.source += ' examples/jackio.c'