changeset 288:fd4a6183482f kapoor_1202

Merge from branch piper-nopiper. The next release will be based on this.
author Chris Cannam
date Fri, 02 Dec 2016 10:04:44 +0000
parents 9e7d180be225 (current diff) bd6e98b348cf (diff)
children d9f6b5fcde6a
files .hgsubstate
diffstat 45 files changed, 1233 insertions(+), 1131 deletions(-) [+]
line wrap: on
line diff
--- a/.hgsub	Mon Nov 21 16:32:58 2016 +0000
+++ b/.hgsub	Fri Dec 02 10:04:44 2016 +0000
@@ -1,4 +1,7 @@
 vamp-plugin-sdk = https://code.soundsoftware.ac.uk/hg/vamp-plugin-sdk
+bqvec = https://bitbucket.org/breakfastquay/bqvec
+bqfft = https://bitbucket.org/breakfastquay/bqfft
+dataquay = https://bitbucket.org/breakfastquay/dataquay
 svcore = https://code.soundsoftware.ac.uk/hg/svcore
-dataquay = https://bitbucket.org/breakfastquay/dataquay
 sv-dependency-builds = https://code.soundsoftware.ac.uk/hg/sv-dependency-builds
+piper-cpp = https://code.soundsoftware.ac.uk/hg/piper-cpp
--- a/.hgsubstate	Mon Nov 21 16:32:58 2016 +0000
+++ b/.hgsubstate	Fri Dec 02 10:04:44 2016 +0000
@@ -1,4 +1,7 @@
+44865d17ef69a891af778e7b9a4c82e790775c45 bqfft
+68f8e88d6d76fc4ca074166cb80979ccbfc2b6c9 bqvec
 896aefe629c85b05ae0880ec93a396b9e3a5a304 dataquay
-1e4f338ae482429a7ab9bdd0825242042354152f sv-dependency-builds
-6a7ea3bd0e10e6d97bcbdbefb0cee4a7e9734406 svcore
-4101e3f80aa0f2b352577e85c9af1568bc290612 vamp-plugin-sdk
+3257ddb6fff110cc88f3ffeaeefa0f29d5eb3b6f piper-cpp
+5f67a29f0fc7f1b908f7cde4866173a7af337862 sv-dependency-builds
+a421e752d22c71a9cd55db40a62f053f61d9ce57 svcore
+0eebd22a081a824067bf3d5de65326696feab653 vamp-plugin-sdk
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/base.pri	Fri Dec 02 10:04:44 2016 +0000
@@ -0,0 +1,49 @@
+
+SV_INCLUDEPATH = \
+        . \
+	bqvec \
+	bqvec/bqvec \
+	bqfft \
+	piper-cpp \
+	dataquay \
+	dataquay/dataquay \
+	svcore \
+	svcore/data \
+	svcore/plugin/api/alsa \
+	vamp-plugin-sdk
+
+DEPENDPATH += $$SV_INCLUDEPATH
+INCLUDEPATH += $$SV_INCLUDEPATH
+
+# Platform defines for RtMidi
+linux*:   DEFINES += __LINUX_ALSASEQ__
+macx*:    DEFINES += __MACOSX_CORE__
+win*:     DEFINES += __WINDOWS_MM__
+solaris*: DEFINES += __RTMIDI_DUMMY_ONLY__
+
+# Defines for Dataquay
+DEFINES += USE_SORD
+
+DEFINES += NO_HIT_COUNTS
+
+CONFIG += qt thread warn_on stl rtti exceptions c++11
+
+include(bq-files.pri)
+include(vamp-plugin-sdk-files.pri)
+include(svcore/files.pri)
+
+DATAQUAY_SOURCES=$$fromfile(dataquay/lib.pro, SOURCES)
+DATAQUAY_HEADERS=$$fromfile(dataquay/lib.pro, HEADERS)
+
+for (file, BQ_SOURCES)       { SOURCES += $$file }
+for (file, BQ_HEADERS)       { HEADERS += $$file }
+
+for (file, VAMP_SOURCES)     { SOURCES += $$file }
+for (file, VAMP_HEADERS)     { HEADERS += $$file }
+
+for (file, DATAQUAY_SOURCES) { SOURCES += $$sprintf("dataquay/%1", $$file) }
+for (file, DATAQUAY_HEADERS) { HEADERS += $$sprintf("dataquay/%1", $$file) }
+
+for (file, SVCORE_SOURCES)   { SOURCES += $$sprintf("svcore/%1", $$file) }
+for (file, SVCORE_HEADERS)   { HEADERS += $$sprintf("svcore/%1", $$file) }
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bq-files.pri	Fri Dec 02 10:04:44 2016 +0000
@@ -0,0 +1,19 @@
+
+BQ_HEADERS += \
+	bqvec/bqvec/Allocators.h \
+	bqvec/bqvec/Barrier.h \
+	bqvec/bqvec/ComplexTypes.h \
+	bqvec/bqvec/Restrict.h \
+	bqvec/bqvec/RingBuffer.h \
+	bqvec/bqvec/VectorOpsComplex.h \
+	bqvec/bqvec/VectorOps.h \
+	bqvec/pommier/neon_mathfun.h \
+	bqvec/pommier/sse_mathfun.h \
+        bqfft/bqfft/FFT.h
+
+BQ_SOURCES += \
+	bqvec/src/Allocators.cpp \
+	bqvec/src/Barrier.cpp \
+	bqvec/src/VectorOpsComplex.cpp \
+        bqfft/src/FFT.cpp
+
--- a/configure	Mon Nov 21 16:32:58 2016 +0000
+++ b/configure	Fri Dec 02 10:04:44 2016 +0000
@@ -620,10 +620,8 @@
 # include <unistd.h>
 #endif"
 
-enable_option_checking=no
 ac_subst_vars='LTLIBOBJS
 LIBOBJS
-subdirs
 QMAKE_CONFIG
 HAVES
 CXXFLAGS_MINIMAL
@@ -764,7 +762,7 @@
 mad_LIBS
 id3tag_CFLAGS
 id3tag_LIBS'
-ac_subdirs_all='svcore'
+
 
 # Initialize some variables set by options.
 ac_init_help=
@@ -6438,10 +6436,6 @@
 
 
 
-
-
-subdirs="$subdirs svcore"
-
 ac_config_files="$ac_config_files config.pri"
 
 
@@ -7608,151 +7602,6 @@
   # would make configure fail if this is the last instruction.
   $ac_cs_success || as_fn_exit 1
 fi
-
-#
-# CONFIG_SUBDIRS section.
-#
-if test "$no_recursion" != yes; then
-
-  # Remove --cache-file, --srcdir, and --disable-option-checking arguments
-  # so they do not pile up.
-  ac_sub_configure_args=
-  ac_prev=
-  eval "set x $ac_configure_args"
-  shift
-  for ac_arg
-  do
-    if test -n "$ac_prev"; then
-      ac_prev=
-      continue
-    fi
-    case $ac_arg in
-    -cache-file | --cache-file | --cache-fil | --cache-fi \
-    | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-      ac_prev=cache_file ;;
-    -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-    | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \
-    | --c=*)
-      ;;
-    --config-cache | -C)
-      ;;
-    -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-      ac_prev=srcdir ;;
-    -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-      ;;
-    -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-      ac_prev=prefix ;;
-    -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-      ;;
-    --disable-option-checking)
-      ;;
-    *)
-      case $ac_arg in
-      *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-      esac
-      as_fn_append ac_sub_configure_args " '$ac_arg'" ;;
-    esac
-  done
-
-  # Always prepend --prefix to ensure using the same prefix
-  # in subdir configurations.
-  ac_arg="--prefix=$prefix"
-  case $ac_arg in
-  *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-  esac
-  ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args"
-
-  # Pass --silent
-  if test "$silent" = yes; then
-    ac_sub_configure_args="--silent $ac_sub_configure_args"
-  fi
-
-  # Always prepend --disable-option-checking to silence warnings, since
-  # different subdirs can have different --enable and --with options.
-  ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args"
-
-  ac_popdir=`pwd`
-  for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue
-
-    # Do not complain, so a configure script can configure whichever
-    # parts of a large source tree are present.
-    test -d "$srcdir/$ac_dir" || continue
-
-    ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)"
-    $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5
-    $as_echo "$ac_msg" >&6
-    as_dir="$ac_dir"; as_fn_mkdir_p
-    ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-
-    cd "$ac_dir"
-
-    # Check for guested configure; otherwise get Cygnus style configure.
-    if test -f "$ac_srcdir/configure.gnu"; then
-      ac_sub_configure=$ac_srcdir/configure.gnu
-    elif test -f "$ac_srcdir/configure"; then
-      ac_sub_configure=$ac_srcdir/configure
-    elif test -f "$ac_srcdir/configure.in"; then
-      # This should be Cygnus configure.
-      ac_sub_configure=$ac_aux_dir/configure
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5
-$as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
-      ac_sub_configure=
-    fi
-
-    # The recursion is here.
-    if test -n "$ac_sub_configure"; then
-      # Make the cache file name correct relative to the subdirectory.
-      case $cache_file in
-      [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;;
-      *) # Relative name.
-	ac_sub_cache_file=$ac_top_build_prefix$cache_file ;;
-      esac
-
-      { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
-$as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
-      # The eval makes quoting arguments work.
-      eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \
-	   --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" ||
-	as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5
-    fi
-
-    cd "$ac_popdir"
-  done
-fi
 if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
--- a/configure.ac	Mon Nov 21 16:32:58 2016 +0000
+++ b/configure.ac	Fri Dec 02 10:04:44 2016 +0000
@@ -110,7 +110,6 @@
 
 AC_SUBST(QMAKE_CONFIG)
 
-AC_CONFIG_SUBDIRS([svcore])
 AC_CONFIG_FILES([config.pri])
 
 AC_OUTPUT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/noconfig.pri	Fri Dec 02 10:04:44 2016 +0000
@@ -0,0 +1,113 @@
+
+CONFIG += release
+
+#CONFIG -= release
+#CONFIG += debug
+
+DEFINES += NDEBUG BUILD_RELEASE
+DEFINES += NO_TIMING
+
+# Full set of defines expected for all platforms when we have the
+# sv-dependency-builds subrepo available to provide the dependencies.
+
+DEFINES += \
+        HAVE_BZ2 \
+	HAVE_FFTW3 \
+	HAVE_FFTW3F \
+	HAVE_SNDFILE \
+	HAVE_SAMPLERATE \
+	HAVE_MAD \
+	HAVE_ID3TAG
+        
+# Default set of libs for the above. Config sections below may update
+# these.
+
+LIBS += \
+        -lbz2 \
+	-lrubberband \
+	-lfftw3 \
+	-lfftw3f \
+	-lsndfile \
+	-lFLAC \
+	-logg \
+	-lvorbis \
+	-lvorbisenc \
+	-lvorbisfile \
+	-logg \
+	-lmad \
+	-lid3tag \
+	-lsamplerate \
+	-lz \
+	-lsord-0 \
+	-lserd-0
+
+win32-g++ {
+
+    # This config is currently used for 32-bit Windows builds.
+
+    INCLUDEPATH += sv-dependency-builds/win32-mingw/include
+
+    LIBS += -Lrelease -Lsv-dependency-builds/win32-mingw/lib -L../sonic-annotator/sv-dependency-builds/win32-mingw/lib
+
+    DEFINES += NOMINMAX _USE_MATH_DEFINES USE_OWN_ALIGNED_MALLOC CAPNP_LITE
+
+    QMAKE_CXXFLAGS_RELEASE += -ffast-math
+    
+    LIBS += -lwinmm -lws2_32
+}
+
+win32-msvc* {
+
+    # This config is actually used only for 64-bit Windows builds.
+    # even though the qmake spec is still called win32-msvc*. If
+    # we want to do 32-bit builds with MSVC as well, then we'll
+    # need to add a way to distinguish the two.
+    
+    INCLUDEPATH += sv-dependency-builds/win64-msvc/include
+
+    CONFIG(release) {
+        LIBS += -Lrelease \
+            -L../sonic-annotator/sv-dependency-builds/win64-msvc/lib
+    }
+
+    DEFINES += NOMINMAX _USE_MATH_DEFINES USE_OWN_ALIGNED_MALLOC
+
+    QMAKE_CXXFLAGS_RELEASE += -fp:fast
+
+    # No Ogg/FLAC support in the sndfile build on this platform yet
+    LIBS -= -lFLAC -logg -lvorbis -lvorbisenc -lvorbisfile
+
+    # These have different names
+    LIBS -= -lsord-0 -lserd-0
+    LIBS += -lsord -lserd
+    
+    LIBS += -ladvapi32 -lwinmm -lws2_32
+}
+
+macx* {
+
+    # All Mac builds are 64-bit these days.
+
+    INCLUDEPATH += sv-dependency-builds/osx/include
+    LIBS += -Lsv-dependency-builds/osx/lib
+
+    QMAKE_CXXFLAGS_RELEASE += -ffast-math
+
+    DEFINES += MALLOC_IS_ALIGNED HAVE_VDSP
+    LIBS += \
+        -framework CoreAudio \
+	-framework CoreMidi \
+	-framework AudioUnit \
+	-framework AudioToolbox \
+	-framework CoreFoundation \
+	-framework CoreServices \
+	-framework Accelerate
+}
+
+linux* {
+
+    message("Building without ./configure on Linux is unlikely to work")
+    message("If you really want to try it, remove this from noconfig.pri")
+    error("Refusing to build without ./configure first")
+}
+
--- a/runner.pro	Mon Nov 21 16:32:58 2016 +0000
+++ b/runner.pro	Fri Dec 02 10:04:44 2016 +0000
@@ -1,104 +1,29 @@
+
 TEMPLATE = app
 
-INCLUDEPATH += vamp-plugin-sdk
-
-win32-g++ {
-    INCLUDEPATH += sv-dependency-builds/win32-mingw/include
-    LIBS += -Lsv-dependency-builds/win32-mingw/lib
-}
-win32-msvc* {
-    INCLUDEPATH += sv-dependency-builds/win32-msvc/include
-    LIBS += -Lsv-dependency-builds/win32-msvc/lib
-}
-mac* {
-    INCLUDEPATH += sv-dependency-builds/osx/include
-    LIBS += -Lsv-dependency-builds/osx/lib
-}
-
 exists(config.pri) {
     include(config.pri)
 }
 
 !exists(config.pri) {
-
-    CONFIG += release
-    DEFINES += NDEBUG BUILD_RELEASE NO_TIMING
-
-    DEFINES += HAVE_BZ2 HAVE_FFTW3 HAVE_FFTW3F HAVE_SNDFILE HAVE_SAMPLERATE HAVE_DATAQUAY HAVE_MAD HAVE_ID3TAG
-
-    LIBS += -lbz2 -lfftw3 -lfftw3f -lsndfile -lFLAC -logg -lvorbis -lvorbisenc -lvorbisfile -logg -lmad -lid3tag -lsamplerate -lz -lsord-0 -lserd-0
-
-    win* {
-        DEFINES += _USE_MATH_DEFINES
-        LIBS += -lwinmm -lws2_32
-    }
-    macx* {
-        DEFINES += HAVE_COREAUDIO
-        LIBS += -framework CoreAudio -framework CoreMidi -framework AudioUnit -framework AudioToolbox -framework CoreFoundation -framework CoreServices -framework Accelerate
-    }
-    linux* {
-        LIBS += -ldl
-    }
+    include(noconfig.pri)
 }
 
-CONFIG += qt thread warn_on stl rtti exceptions console c++11
+include(base.pri)
+
+CONFIG += console
 QT += xml network
-QT -= gui widgets
+QT -= gui
 
-# Using the "console" CONFIG flag above should ensure this happens for
-# normal Windows builds, but the console feature doesn't get picked up
-# in my local cross-compile setup because qmake itself doesn't know to
-# look for win32 features
 win32-x-g++:QMAKE_LFLAGS += -Wl,-subsystem,console
-
-DEFINES += HAVE_FFTW3 HAVE_VAMP HAVE_VAMPHOSTSDK
+macx*: CONFIG -= app_bundle
 
 TARGET = sonic-annotator
 
-DEPENDPATH += . svcore runner
-INCLUDEPATH += . dataquay svcore runner
-
-QMAKE_LIBDIR = svcore $$QMAKE_LIBDIR
-
-QMAKE_CXXFLAGS_RELEASE += -fmessage-length=80 -fdiagnostics-show-location=every-line
-
 OBJECTS_DIR = o
 MOC_DIR = o
 
-contains(DEFINES, BUILD_STATIC):LIBS -= -ljack
-
-MY_LIBS = -Lsvcore -Ldataquay -lsvcore -ldataquay
-
-linux* {
-MY_LIBS = -Wl,-Bstatic $$MY_LIBS -Wl,-Bdynamic
-}
-
-win* {
-MY_LIBS = -Lsvcore/release -Ldataquay/release $$MY_LIBS
-}
-
-LIBS = $$MY_LIBS $$LIBS
-
-win* {
-PRE_TARGETDEPS += svcore/release/libsvcore.a
-}
-
-!win* {
-PRE_TARGETDEPS += svcore/libsvcore.a
-}
-
 HEADERS += \
-        vamp-plugin-sdk/vamp-hostsdk/PluginBase.h \
-        vamp-plugin-sdk/vamp-hostsdk/PluginBufferingAdapter.h \
-        vamp-plugin-sdk/vamp-hostsdk/PluginChannelAdapter.h \
-        vamp-plugin-sdk/vamp-hostsdk/Plugin.h \
-        vamp-plugin-sdk/vamp-hostsdk/PluginHostAdapter.h \
-        vamp-plugin-sdk/vamp-hostsdk/PluginInputDomainAdapter.h \
-        vamp-plugin-sdk/vamp-hostsdk/PluginLoader.h \
-        vamp-plugin-sdk/vamp-hostsdk/PluginSummarisingAdapter.h \
-        vamp-plugin-sdk/vamp-hostsdk/PluginWrapper.h \
-        vamp-plugin-sdk/vamp-hostsdk/RealTime.h \
-        vamp-plugin-sdk/src/vamp-hostsdk/Window.h \
 	runner/AudioDBFeatureWriter.h \
         runner/FeatureWriterFactory.h  \
         runner/DefaultFeatureWriter.h \
@@ -109,15 +34,6 @@
         runner/MultiplexedReader.h
 
 SOURCES += \
-        vamp-plugin-sdk/src/vamp-hostsdk/PluginBufferingAdapter.cpp \
-        vamp-plugin-sdk/src/vamp-hostsdk/PluginChannelAdapter.cpp \
-        vamp-plugin-sdk/src/vamp-hostsdk/PluginHostAdapter.cpp \
-        vamp-plugin-sdk/src/vamp-hostsdk/PluginInputDomainAdapter.cpp \
-        vamp-plugin-sdk/src/vamp-hostsdk/PluginLoader.cpp \
-        vamp-plugin-sdk/src/vamp-hostsdk/PluginSummarisingAdapter.cpp \
-        vamp-plugin-sdk/src/vamp-hostsdk/PluginWrapper.cpp \
-        vamp-plugin-sdk/src/vamp-hostsdk/RealTime.cpp \
-        vamp-plugin-sdk/src/vamp-hostsdk/Files.cpp \
 	runner/main.cpp \
 	runner/DefaultFeatureWriter.cpp \
 	runner/FeatureExtractionManager.cpp \
--- a/runner/FeatureExtractionManager.cpp	Mon Nov 21 16:32:58 2016 +0000
+++ b/runner/FeatureExtractionManager.cpp	Fri Dec 02 10:04:44 2016 +0000
@@ -23,6 +23,7 @@
 #include <vamp-hostsdk/PluginWrapper.h>
 #include <vamp-hostsdk/PluginLoader.h>
 
+#include "base/Debug.h"
 #include "base/Exceptions.h"
 
 #include <iostream>
@@ -51,7 +52,8 @@
 #include <QFile>
 #include <QFileInfo>
 
-FeatureExtractionManager::FeatureExtractionManager() :
+FeatureExtractionManager::FeatureExtractionManager(bool verbose) :
+    m_verbose(verbose),
     m_summariesOnly(false),
     // We can read using an arbitrary fixed block size --
     // PluginBufferingAdapter handles this for us. But while this
@@ -73,6 +75,9 @@
 
 FeatureExtractionManager::~FeatureExtractionManager()
 {
+    SVDEBUG << "FeatureExtractionManager::~FeatureExtractionManager: cleaning up"
+            << endl;
+    
     for (PluginMap::iterator pi = m_plugins.begin();
          pi != m_plugins.end(); ++pi) {
         delete pi->first;
@@ -80,6 +85,8 @@
     foreach (AudioFileReader *r, m_readyReaders) {
         delete r;
     }
+
+    SVDEBUG << "FeatureExtractionManager::~FeatureExtractionManager: done" << endl;
 }
 
 void FeatureExtractionManager::setChannels(int channels)
@@ -119,7 +126,7 @@
     for (SummaryNameSet::const_iterator i = names.begin();
          i != names.end(); ++i) {
         if (getSummaryType(*i) == PluginSummarisingAdapter::UnknownSummaryType) {
-            cerr << "ERROR: Unknown summary type \"" << *i << "\"" << endl;
+            SVCERR << "ERROR: Unknown summary type \"" << *i << "\"" << endl;
             return false;
         }
     }
@@ -156,7 +163,7 @@
     case ParzenWindow:
         // Not supported in Vamp SDK, fall through
     default:
-        cerr << "ERROR: Unknown or unsupported window type \"" << t << "\", using Hann (\"" << HanningWindow << "\")" << endl;
+        SVCERR << "ERROR: Unknown or unsupported window type \"" << t << "\", using Hann (\"" << HanningWindow << "\")" << endl;
         return PluginInputDomainAdapter::HanningWindow;
     }
 }
@@ -168,11 +175,11 @@
 
     if (transform.getSampleRate() == 0) {
         if (m_sampleRate == 0) {
-            cerr << "NOTE: Transform does not specify a sample rate, using default rate of " << m_defaultSampleRate << endl;
+            SVCERR << "NOTE: Transform does not specify a sample rate, using default rate of " << m_defaultSampleRate << endl;
             transform.setSampleRate(m_defaultSampleRate);
             m_sampleRate = m_defaultSampleRate;
         } else {
-            cerr << "NOTE: Transform does not specify a sample rate, using previous transform's rate of " << m_sampleRate << endl;
+            SVCERR << "NOTE: Transform does not specify a sample rate, using previous transform's rate of " << m_sampleRate << endl;
             transform.setSampleRate(m_sampleRate);
         }
     }
@@ -182,8 +189,8 @@
     }
 
     if (transform.getSampleRate() != m_sampleRate) {
-        cerr << "WARNING: Transform sample rate " << transform.getSampleRate() << " does not match previously specified transform rate of " << m_sampleRate << " -- only a single rate is supported for each run" << endl;
-        cerr << "WARNING: Using previous rate of " << m_sampleRate << " for this transform as well" << endl;
+        SVCERR << "WARNING: Transform sample rate " << transform.getSampleRate() << " does not match previously specified transform rate of " << m_sampleRate << " -- only a single rate is supported for each run" << endl;
+        SVCERR << "WARNING: Using previous rate of " << m_sampleRate << " for this transform as well" << endl;
         transform.setSampleRate(m_sampleRate);
     }
 
@@ -208,7 +215,7 @@
             test.setOutput(transform.getOutput());
             test.setSummaryType(transform.getSummaryType());
             if (transform == test) {
-                cerr << "NOTE: Already have transform identical to this one (for \""
+                SVCERR << "NOTE: Already have transform identical to this one (for \""
                      << transform.getIdentifier().toStdString()
                      << "\") in every detail except output identifier and/or "
                      << "summary type; sharing its plugin instance" << endl;
@@ -231,10 +238,10 @@
             if (!plugin) {
                 //!!! todo: handle non-Vamp plugins too, or make the main --list
                 // option print out only Vamp transforms
-                cerr << "ERROR: Failed to load plugin for transform \""
+                SVCERR << "ERROR: Failed to load plugin for transform \""
                      << transform.getIdentifier().toStdString() << "\"" << endl;
                 if (pb) {
-                    cerr << "NOTE: (A plugin was loaded, but apparently not a Vamp plugin)" << endl;
+                    SVCERR << "NOTE: (A plugin was loaded, but apparently not a Vamp plugin)" << endl;
                 }
                 delete pb;
                 return false;
@@ -294,12 +301,12 @@
             }
 
             if (!plugin->initialise(m_channels, m_blockSize, m_blockSize)) {
-                cerr << "ERROR: Plugin initialise (channels = " << m_channels << ", stepSize = " << m_blockSize << ", blockSize = " << m_blockSize << ") failed." << endl;    
+                SVCERR << "ERROR: Plugin initialise (channels = " << m_channels << ", stepSize = " << m_blockSize << ", blockSize = " << m_blockSize << ") failed." << endl;    
                 delete plugin;
                 return false;
             }
 
-//            cerr << "Initialised plugin" << endl;
+            SVDEBUG << "Initialised plugin" << endl;
 
             size_t actualStepSize = 0;
             size_t actualBlockSize = 0;
@@ -310,24 +317,23 @@
             Plugin::OutputList outputs = plugin->getOutputDescriptors();
             for (int i = 0; i < (int)outputs.size(); ++i) {
 
-//                cerr << "Newly initialised plugin output " << i << " has bin count " << outputs[i].binCount << endl;
+                SVDEBUG << "Newly initialised plugin output " << i << " has bin count " << outputs[i].binCount << endl;
 
                 m_pluginOutputs[plugin][outputs[i].identifier] = outputs[i];
                 m_pluginOutputIndices[outputs[i].identifier] = i;
             }
 
-            cerr << "NOTE: Loaded and initialised plugin for transform \""
+            SVCERR << "NOTE: Loaded and initialised plugin for transform \""
                  << transform.getIdentifier().toStdString()
                  << "\" with plugin step size " << actualStepSize
                  << " and block size " << actualBlockSize
                  << " (adapter step and block size " << m_blockSize << ")"
                  << endl;
 
-//            cerr << "NOTE: That transform is: " << transform.toXmlString() << endl;
+            SVDEBUG << "NOTE: That transform is: " << transform.toXmlString() << endl;
             
             if (pida) {
-                cerr << "NOTE: PluginInputDomainAdapter timestamp adjustment is "
-
+                SVCERR << "NOTE: PluginInputDomainAdapter timestamp adjustment is "
                      << pida->getTimestampAdjustment() << endl;
             }
 
@@ -358,7 +364,7 @@
         if (transform.getPluginVersion() != "") {
             if (QString("%1").arg(plugin->getPluginVersion())
                 != transform.getPluginVersion()) {
-                cerr << "ERROR: Transform specifies version "
+                SVCERR << "ERROR: Transform specifies version "
                      << transform.getPluginVersion()
                      << " of plugin \"" << plugin->getIdentifier()
                      << "\", but installed plugin is version "
@@ -375,7 +381,7 @@
             if (m_pluginOutputs[plugin].find
                 (transform.getOutput().toLocal8Bit().data()) ==
                 m_pluginOutputs[plugin].end()) {
-                cerr << "ERROR: Transform requests nonexistent plugin output \""
+                SVCERR << "ERROR: Transform requests nonexistent plugin output \""
                      << transform.getOutput()
                      << "\"" << endl;
                 return false;
@@ -384,11 +390,11 @@
 
         m_transformPluginMap[transform] = plugin;
 
-//        cerr << "NOTE: Assigned plugin " << plugin << " for transform: " << transform.toXmlString() << endl;
+        SVDEBUG << "NOTE: Assigned plugin " << plugin << " for transform: " << transform.toXmlString() << endl;
 
         if (!(originalTransform == transform)) {
             m_transformPluginMap[originalTransform] = plugin;
-//            cerr << "NOTE: Also assigned plugin " << plugin << " for original transform: " << originalTransform.toXmlString() << endl;
+            SVDEBUG << "NOTE: Also assigned plugin " << plugin << " for original transform: " << originalTransform.toXmlString() << endl;
         }
 
     } else {
@@ -412,10 +418,10 @@
 
     if (m_sampleRate == 0) {
         if (m_defaultSampleRate == 0) {
-            cerr << "ERROR: Default transform requested, but no default sample rate available" << endl;
+            SVCERR << "ERROR: Default transform requested, but no default sample rate available" << endl;
             return false;
         } else {
-            cerr << "NOTE: Using default sample rate of " << m_defaultSampleRate << " for default transform" << endl;
+            SVCERR << "NOTE: Using default sample rate of " << m_defaultSampleRate << " for default transform" << endl;
             m_sampleRate = m_defaultSampleRate;
         }
     }
@@ -425,7 +431,7 @@
     bool result = addFeatureExtractor(transform, writers);
     if (!result) {
         if (transform.getType() == Transform::UnknownType) {
-            cerr << "(Maybe mixed up filename with transform, or --transform with --default?)" << endl;
+            SVCERR << "(Maybe mixed up filename with transform, or --transform with --default?)" << endl;
         }
     }
     return result;
@@ -454,7 +460,7 @@
         QFile file(transformFile);
         if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
             // Error case 1. File does not exist or cannot be opened
-            cerr << "ERROR: Failed to open transform file \"" << transformFile
+            SVCERR << "ERROR: Failed to open transform file \"" << transformFile
                  << "\" for reading" << endl;
             return false;
         }
@@ -484,11 +490,12 @@
             (QUrl::fromLocalFile(QFileInfo(transformFile).absoluteFilePath())
              .toString());
         ProgressPrinter printer("Parsing transforms RDF file");
-        std::vector<Transform> transforms = factory.getTransforms(&printer);
+        std::vector<Transform> transforms = factory.getTransforms
+            (m_verbose ? &printer : 0);
 
         if (factory.isOK()) {
             if (transforms.empty()) {
-                cerr << "ERROR: Transform file \"" << transformFile
+                SVCERR << "ERROR: Transform file \"" << transformFile
                      << "\" is valid RDF but defines no transforms" << endl;
                 return false;
             } else {
@@ -502,7 +509,7 @@
             }
         } else { // !factory.isOK()
             if (factory.isRDF()) {
-                cerr << "ERROR: Invalid transform RDF file \"" << transformFile
+                SVCERR << "ERROR: Invalid transform RDF file \"" << transformFile
                      << "\": " << factory.getErrorString() << endl;
                 return false;
             }
@@ -518,7 +525,7 @@
         
         QFile file(transformFile);
         if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
-            cerr << "ERROR: Failed to open transform file \""
+            SVCERR << "ERROR: Failed to open transform file \""
                  << transformFile.toStdString() << "\" for reading" << endl;
             return false;
         }
@@ -534,7 +541,7 @@
         if (xmlError == "") {
 
             if (transform.getIdentifier() == "") {
-                cerr << "ERROR: Transform file \"" << transformFile
+                SVCERR << "ERROR: Transform file \"" << transformFile
                      << "\" is valid XML but defines no transform" << endl;
                 return false;
             }
@@ -543,13 +550,13 @@
         }
     }
 
-    cerr << "ERROR: Transform file \"" << transformFile
+    SVCERR << "ERROR: Transform file \"" << transformFile
          << "\" could not be parsed" << endl;
     if (rdfError != "") {
-        cerr << "ERROR: RDF parser reported: " << rdfError << endl;
+        SVCERR << "ERROR: RDF parser reported: " << rdfError << endl;
     }
     if (xmlError != "") {
-        cerr << "ERROR: XML parser reported: " << xmlError << endl;
+        SVCERR << "ERROR: XML parser reported: " << xmlError << endl;
     }
 
     return false;
@@ -557,7 +564,7 @@
 
 void FeatureExtractionManager::addSource(QString audioSource, bool willMultiplex)
 {
-    std::cerr << "Have audio source: \"" << audioSource.toStdString() << "\"" << std::endl;
+    SVCERR << "Have audio source: \"" << audioSource.toStdString() << "\"" << endl;
 
     // We don't actually do anything with it here, unless it's the
     // first audio source and we need it to establish default channel
@@ -567,14 +574,14 @@
 
         ProgressPrinter retrievalProgress("Retrieving first input file to determine default rate and channel count...");
 
-        FileSource source(audioSource, &retrievalProgress);
+        FileSource source(audioSource, m_verbose ? &retrievalProgress : 0);
         if (!source.isAvailable()) {
-            cerr << "ERROR: File or URL \"" << audioSource.toStdString()
+            SVCERR << "ERROR: File or URL \"" << audioSource.toStdString()
                  << "\" could not be located";
             if (source.getErrorString() != "") {
-                cerr << ": " << source.getErrorString();
+                SVCERR << ": " << source.getErrorString();
             }
-            cerr << endl;
+            SVCERR << endl;
             throw FileNotFound(audioSource);
         }
     
@@ -583,32 +590,36 @@
         // Open to determine validity, channel count, sample rate only
         // (then close, and open again later with actual desired rate &c)
 
+        AudioFileReaderFactory::Parameters params;
+        params.normalisation = (m_normalise ?
+                                AudioFileReaderFactory::Normalisation::Peak :
+                                AudioFileReaderFactory::Normalisation::None);
+        
         AudioFileReader *reader =
-            AudioFileReaderFactory::createReader(source, 0, 
-                                                 m_normalise,
-                                                 &retrievalProgress);
+            AudioFileReaderFactory::createReader
+            (source, params, m_verbose ? &retrievalProgress : 0);
     
         if (!reader) {
             throw FailedToOpenFile(audioSource);
         }
 
-        retrievalProgress.done();
+        if (m_verbose) retrievalProgress.done();
 
-        cerr << "File or URL \"" << audioSource.toStdString() << "\" opened successfully" << endl;
+        SVCERR << "File or URL \"" << audioSource.toStdString() << "\" opened successfully" << endl;
 
         if (!willMultiplex) {
             if (m_channels == 0) {
                 m_channels = reader->getChannelCount();
-                cerr << "Taking default channel count of "
+                SVCERR << "Taking default channel count of "
                      << reader->getChannelCount() << " from audio file" << endl;
             }
         }
 
         if (m_defaultSampleRate == 0) {
             m_defaultSampleRate = reader->getNativeRate();
-            cerr << "Taking default sample rate of "
+            SVCERR << "Taking default sample rate of "
                  << reader->getNativeRate() << "Hz from audio file" << endl;
-            cerr << "(Note: Default may be overridden by transforms)" << endl;
+            SVCERR << "(Note: Default may be overridden by transforms)" << endl;
         }
 
         m_readyReaders[audioSource] = reader;
@@ -616,7 +627,7 @@
 
     if (willMultiplex) {
         ++m_channels; // channel count is simply number of sources
-        cerr << "Multiplexing, incremented target channel count to " 
+        SVCERR << "Multiplexing, incremented target channel count to " 
              << m_channels << endl;
     }
 }
@@ -680,21 +691,29 @@
             reader = 0;
         }
     }
+
     if (!reader) {
         ProgressPrinter retrievalProgress("Retrieving audio data...");
-        FileSource fs(source, &retrievalProgress);
+        FileSource fs(source, m_verbose ? &retrievalProgress : 0);
         fs.waitForData();
-        reader = AudioFileReaderFactory::createReader(fs, m_sampleRate, 
-                                                      m_normalise,
-                                                      &retrievalProgress);
-        retrievalProgress.done();
+
+        AudioFileReaderFactory::Parameters params;
+        params.targetRate = m_sampleRate;
+        params.normalisation = (m_normalise ?
+                                AudioFileReaderFactory::Normalisation::Peak :
+                                AudioFileReaderFactory::Normalisation::None);
+        
+        reader = AudioFileReaderFactory::createReader
+            (fs, params, m_verbose ? &retrievalProgress : 0);
+        if (m_verbose) retrievalProgress.done();
     }
+    
     if (!reader) {
         throw FailedToOpenFile(source);
     }
     if (reader->getChannelCount() != m_channels ||
         reader->getNativeRate() != m_sampleRate) {
-        cerr << "NOTE: File will be mixed or resampled for processing, to: "
+        SVCERR << "NOTE: File will be mixed or resampled for processing, to: "
              << m_channels << "ch at " 
              << m_sampleRate << "Hz" << endl;
     }
@@ -707,7 +726,7 @@
 {
     // Note: This also deletes reader
 
-    cerr << "Audio file \"" << audioSource.toStdString() << "\": "
+    SVCERR << "Audio file \"" << audioSource.toStdString() << "\": "
          << reader->getChannelCount() << "ch at " 
          << reader->getNativeRate() << "Hz" << endl;
 
@@ -737,7 +756,7 @@
 
     size_t frameCount = reader->getFrameCount();
     
-//    cerr << "file has " << frameCount << " frames" << endl;
+    SVDEBUG << "FeatureExtractionManager: file has " << frameCount << " frames" << endl;
 
     int earliestStartFrame = 0;
     int latestEndFrame = frameCount;
@@ -747,7 +766,7 @@
 
         PluginMap::iterator pi = m_plugins.find(plugin);
 
-//        std::cerr << "Calling reset on " << plugin << std::endl;
+        SVDEBUG << "FeatureExtractionManager: Calling reset on " << plugin << endl;
         plugin->reset();
 
         for (TransformWriterMap::iterator ti = pi->second.begin();
@@ -769,11 +788,12 @@
             if (!haveExtents || startFrame + duration > latestEndFrame) {
                 latestEndFrame = startFrame + duration;
             }
+
 /*
-            cerr << "startFrame for transform " << startFrame << endl;
-            cerr << "duration for transform " << duration << endl;
-            cerr << "earliestStartFrame becomes " << earliestStartFrame << endl;
-            cerr << "latestEndFrame becomes " << latestEndFrame << endl;
+            SVDEBUG << "startFrame for transform " << startFrame << endl;
+            SVDEBUG << "duration for transform " << duration << endl;
+            SVDEBUG << "earliestStartFrame becomes " << earliestStartFrame << endl;
+            SVDEBUG << "latestEndFrame becomes " << latestEndFrame << endl;
 */
             haveExtents = true;
 
@@ -782,24 +802,23 @@
                 m_pluginOutputs[plugin].end()) {
                 // We shouldn't actually reach this point:
                 // addFeatureExtractor tests whether the output exists
-                cerr << "ERROR: Nonexistent plugin output \"" << outputId << "\" requested for transform \""
+                SVCERR << "ERROR: Nonexistent plugin output \"" << outputId << "\" requested for transform \""
                      << transform.getIdentifier().toStdString() << "\", ignoring this transform"
                      << endl;
-/*
-                cerr << "Known outputs for all plugins are as follows:" << endl;
+
+                SVDEBUG << "Known outputs for all plugins are as follows:" << endl;
                 for (PluginOutputMap::const_iterator k = m_pluginOutputs.begin();
                      k != m_pluginOutputs.end(); ++k) {
-                    cerr << "Plugin " << k->first << ": ";
+                    SVDEBUG << "Plugin " << k->first << ": ";
                     if (k->second.empty()) {
-                        cerr << "(none)";
+                        SVDEBUG << "(none)";
                     }
                     for (OutputMap::const_iterator i = k->second.begin();
                          i != k->second.end(); ++i) {
-                        cerr << "\"" << i->first << "\" ";
+                        SVDEBUG << "\"" << i->first << "\" ";
                     }
-                    cerr << endl;
+                    SVDEBUG << endl;
                 }
-*/
             }
         }
     }
@@ -835,7 +854,7 @@
         //!!! inefficient, although much of the inefficiency may be
         // susceptible to compiler optimisation
         
-        SampleBlock frames = reader->getInterleavedFrames(i, m_blockSize);
+        auto frames = reader->getInterleavedFrames(i, m_blockSize);
         
         // We have to do our own channel handling here; we can't just
         // leave it to the plugin adapter because the same plugin
@@ -911,10 +930,10 @@
 
         int pp = progress;
         progress = int(((i - startFrame) * 100.0) / (endFrame - startFrame) + 0.1);
-        if (progress > pp) extractionProgress.setProgress(progress);
+        if (progress > pp && m_verbose) extractionProgress.setProgress(progress);
     }
 
-//    std::cerr << "FeatureExtractionManager: deleting audio file reader" << std::endl;
+    SVDEBUG << "FeatureExtractionManager: deleting audio file reader" << endl;
 
     lifemgr.destroy(); // deletes reader, data
         
@@ -932,7 +951,7 @@
             PluginSummarisingAdapter *adapter =
                 dynamic_cast<PluginSummarisingAdapter *>(plugin);
             if (!adapter) {
-                cerr << "WARNING: Summaries requested, but plugin is not a summarising adapter" << endl;
+                SVCERR << "WARNING: Summaries requested, but plugin is not a summarising adapter" << endl;
             } else {
                 for (SummaryNameSet::const_iterator sni = m_summaries.begin();
                      sni != m_summaries.end(); ++sni) {
@@ -955,7 +974,7 @@
         writeSummaries(audioSource, plugin);
     }
 
-    extractionProgress.done();
+    if (m_verbose) extractionProgress.done();
 
     finish();
     
@@ -973,29 +992,29 @@
         
         const Transform &transform = ti->first;
 
-//        cerr << "FeatureExtractionManager::writeSummaries: plugin is " << plugin
-//             << ", found transform: " << transform.toXmlString() << endl;
+        SVDEBUG << "FeatureExtractionManager::writeSummaries: plugin is " << plugin
+                << ", found transform: " << transform.toXmlString() << endl;
         
         Transform::SummaryType summaryType = transform.getSummaryType();
         PluginSummarisingAdapter::SummaryType pType =
             (PluginSummarisingAdapter::SummaryType)summaryType;
 
         if (transform.getSummaryType() == Transform::NoSummary) {
-//            cerr << "(no summary, continuing)" << endl;
+            SVDEBUG << "FeatureExtractionManager::writeSummaries: no summary for this transform" << endl;
             continue;
         }
 
         PluginSummarisingAdapter *adapter =
             dynamic_cast<PluginSummarisingAdapter *>(plugin);
         if (!adapter) {
-            cerr << "FeatureExtractionManager::writeSummaries: INTERNAL ERROR: Summary requested for transform, but plugin is not a summarising adapter" << endl;
+            SVCERR << "FeatureExtractionManager::writeSummaries: INTERNAL ERROR: Summary requested for transform, but plugin is not a summarising adapter" << endl;
             continue;
         }
 
         Plugin::FeatureSet featureSet = adapter->getSummaryForAllOutputs
             (pType, PluginSummarisingAdapter::ContinuousTimeAverage);
 
-//        cerr << "summary type " << int(pType) << " for transform:" << endl << transform.toXmlString().toStdString()<< endl << "... feature set with " << featureSet.size() << " elts" << endl;
+        SVDEBUG << "summary type " << int(pType) << " for transform:" << endl << transform.toXmlString().toStdString()<< endl << "... feature set with " << featureSet.size() << " elts" << endl;
 
         writeFeatures(audioSource, plugin, featureSet, summaryType);
     }
@@ -1018,16 +1037,16 @@
         const Transform &transform = ti->first;
         const vector<FeatureWriter *> &writers = ti->second;
 
-//        cerr << "writeFeatures: plugin " << plugin << " has transform: " << transform.toXmlString() << endl;
+//        SVDEBUG << "writeFeatures: plugin " << plugin << " has transform: " << transform.toXmlString() << endl;
 
         if (transform.getSummaryType() == Transform::NoSummary &&
             !m_summaries.empty()) {
-//            cerr << "transform has no summary, but summaries requested on command line, so going for it anyway" << endl;
+            SVDEBUG << "writeFeatures: transform has no summary, but summaries requested on command line, so going for it anyway" << endl;
         } else if (transform.getSummaryType() != summaryType) {
             // Either we're not writing a summary and the transform
             // has one, or we're writing a summary but the transform
             // has none or a different one; either way, skip it
-//            cerr << "summary type differs from passed-in one " << summaryType << endl;
+            SVDEBUG << "writeFeatures: transform summary type " << transform.getSummaryType() << " differs from passed-in one " << summaryType << ", skipping" << endl;
             continue;
         }
 
@@ -1045,7 +1064,7 @@
         Plugin::FeatureSet::const_iterator fsi = features.find(outputIndex);
         if (fsi == features.end()) continue;
 
-//        cerr << "this transform has " << writers.size() << " writer(s)" << endl;
+//        SVDEBUG << "this transform has " << writers.size() << " writer(s)" << endl;
         
         for (int j = 0; j < (int)writers.size(); ++j) {
             writers[j]->write
--- a/runner/FeatureExtractionManager.h	Mon Nov 21 16:32:58 2016 +0000
+++ b/runner/FeatureExtractionManager.h	Fri Dec 02 10:04:44 2016 +0000
@@ -38,7 +38,7 @@
 class FeatureExtractionManager
 {
 public:
-    FeatureExtractionManager();
+    FeatureExtractionManager(bool verbose);
     virtual ~FeatureExtractionManager();
 
     void setChannels(int channels);
@@ -75,6 +75,8 @@
     void extractFeaturesMultiplexed(QStringList sources);
 
 private:
+    bool m_verbose;
+    
     // A plugin may have many outputs, so we can have more than one
     // transform requested for a single plugin.  The things we want to
     // run in our process loop are plugins rather than their outputs,
--- a/runner/MultiplexedReader.cpp	Mon Nov 21 16:32:58 2016 +0000
+++ b/runner/MultiplexedReader.cpp	Fri Dec 02 10:04:44 2016 +0000
@@ -21,6 +21,11 @@
     m_channelCount = readers.size();
     m_sampleRate = readers[0]->getSampleRate();
     
+    SVDEBUG << "MultiplexedReader: channel count: " << m_channelCount
+            << " (i.e. " << m_channelCount << " reader(s) to multiplex)" << endl;
+    SVDEBUG << "MultiplexedReader: sample rate from first reader: "
+            << m_sampleRate << endl;
+    
     m_frameCount = 0;
     m_quicklySeekable = true;
     
@@ -49,18 +54,18 @@
     }
 }
 
-SampleBlock
+std::vector<float>
 MultiplexedReader::getInterleavedFrames(sv_frame_t start, sv_frame_t frameCount) const
 {
     int out_chans = m_readers.size();
 
     // Allocate and zero
-    SampleBlock block(frameCount * out_chans, 0.f);
+    std::vector<float> block(frameCount * out_chans, 0.f);
 
     for (int out_chan = 0; out_chan < out_chans; ++out_chan) {
 
 	AudioFileReader *reader = m_readers[out_chan];
-	SampleBlock readerBlock = reader->getInterleavedFrames(start, frameCount);
+	auto readerBlock = reader->getInterleavedFrames(start, frameCount);
 
 	int in_chans = reader->getChannelCount();
 
--- a/runner/MultiplexedReader.h	Mon Nov 21 16:32:58 2016 +0000
+++ b/runner/MultiplexedReader.h	Fri Dec 02 10:04:44 2016 +0000
@@ -30,14 +30,15 @@
     MultiplexedReader(QList<AudioFileReader *> readers);
     virtual ~MultiplexedReader();
 
-    virtual QString getError() const { return m_error; }
-    virtual bool isQuicklySeekable() const { return m_quicklySeekable; }
+    virtual QString getError() const override { return m_error; }
+    virtual bool isQuicklySeekable() const override { return m_quicklySeekable; }
 
-    virtual SampleBlock getInterleavedFrames(sv_frame_t start, sv_frame_t count) const;
+    virtual std::vector<float> getInterleavedFrames
+    (sv_frame_t start, sv_frame_t count) const override;
 
-    virtual int getDecodeCompletion() const;
+    virtual int getDecodeCompletion() const override;
 
-    virtual bool isUpdating() const;
+    virtual bool isUpdating() const override;
 
 protected:
     QString m_error;
--- a/runner/main.cpp	Mon Nov 21 16:32:58 2016 +0000
+++ b/runner/main.cpp	Fri Dec 02 10:04:44 2016 +0000
@@ -36,6 +36,7 @@
 #include "base/Exceptions.h"
 #include "base/TempDirectory.h"
 #include "base/ProgressPrinter.h"
+#include "base/Debug.h"
 
 #include "data/fileio/AudioFileReaderFactory.h"
 #include "data/fileio/PlaylistFileReader.h"
@@ -344,6 +345,9 @@
         cerr << "  -f, --force         "
              << wrapCol("Continue with subsequent files following an error.")
              << endl << endl;
+        cerr << "  -q, --quiet         "
+             << wrapCol("Suppress informational output that would otherwise be printed to stderr and to a log file. Sonic Annotator may run faster with this option, especially if the application data directory is on a shared storage resource, but no diagnostic information will be available except for the application's return code.")
+             << endl << endl;
         cerr << "Housekeeping options:"
              << endl << endl;
         cerr << "  -l, --list          List available transform ids to standard output." << endl;
@@ -474,7 +478,7 @@
     QDir dir(dirname);
 
     QString printable = dir.dirName().left(20);
-    cerr << "\rScanning \"" << printable << "\"..."
+    SVCERR << "\rScanning \"" << printable << "\"..."
          << QString("                    ").left(20 - printable.length())
          << " [" << found << " audio file(s)]";
 
@@ -501,6 +505,7 @@
     QStringList expanded;
     foreach (QString path, sources) {
         if (QFileInfo(path).suffix().toLower() == "m3u") {
+            SVDEBUG << "Expanding m3u playlist file \"" << path << "\"" << endl;
             ProgressPrinter retrievalProgress("Opening playlist file...");
             FileSource source(path, &retrievalProgress);
             if (!source.isAvailable()) {
@@ -519,6 +524,8 @@
                 for (int i = 0; i < (int)files.size(); ++i) {
                     expanded.push_back(files[i]);
                 }
+                SVDEBUG << "Done, m3u playlist references "
+                        << files.size() << " file(s)" << endl;
             }
         } else {
             // not a playlist
@@ -534,7 +541,7 @@
 {
     FileSource source(url);
     if (!source.isAvailable()) {
-        cerr << "File or URL \"" << url << "\" could not be retrieved" << endl;
+        SVCERR << "File or URL \"" << url << "\" could not be retrieved" << endl;
         return false;
     }
     source.waitForData();
@@ -542,7 +549,7 @@
     QString filename = source.getLocalFilename();
     QFile file(filename);
     if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
-        cerr << "File \"" << filename << "\" could not be read" << endl;
+        SVCERR << "File \"" << filename << "\" could not be read" << endl;
         return false;
     }
 
@@ -565,7 +572,7 @@
             importantBit = bits[0];
         }
         if (importantBit == QString()) {
-            cerr << "WARNING: Skipping line " << lineNo << " (no content found)"
+            SVCERR << "WARNING: Skipping line " << lineNo << " (no content found)"
                  << endl;
             continue;
         }
@@ -573,7 +580,7 @@
         boundaries.insert(Vamp::RealTime::fromSeconds
                           (importantBit.toDouble(&good)));
         if (!good) {
-            cerr << "Unparseable or non-numeric segment boundary at line "
+            SVCERR << "Unparseable or non-numeric segment boundary at line "
                  << lineNo << endl;
             return false;
         }
@@ -600,6 +607,7 @@
     bool multiplex = false;
     bool recursive = false;
     bool normalise = false;
+    bool quiet = false;
     bool list = false;
     bool listWriters = false;
     bool listFormats = false;
@@ -756,6 +764,9 @@
         } else if (arg == "-f" || arg == "--force") {
             force = true;
             continue;
+        } else if (arg == "-q" || arg == "--quiet") {
+            quiet = true;
+            continue;
         } else if (arg == "--list-writers") {
             listWriters = true;
             continue;
@@ -802,6 +813,11 @@
         }
     }
 
+    if (quiet) {
+        SVDebug::silence();
+        SVCerr::silence();
+    }
+    
     if (list) {
         if (!requestedWriterTags.empty() || skeletonFor != "") {
             cerr << helpStr << endl;
@@ -910,15 +926,6 @@
 
     QSettings settings;
 
-#ifdef HAVE_FFTW3
-    settings.beginGroup("FFTWisdom");
-    QString wisdom = settings.value("wisdom").toString();
-    if (wisdom != "") {
-        fftw_import_wisdom_from_string(wisdom.toLocal8Bit().data());
-    }
-    settings.endGroup();
-#endif
-
     settings.beginGroup("RDF");
     if (!settings.contains("rdf-indices")) {
         QStringList list;
@@ -927,7 +934,7 @@
     }
     settings.endGroup();
 
-    FeatureExtractionManager manager;
+    FeatureExtractionManager manager(!quiet);
 
     manager.setNormalise(normalise);
 
@@ -1040,6 +1047,7 @@
 
     for (set<string>::const_iterator i = requestedTransformListFiles.begin();
          i != requestedTransformListFiles.end(); ++i) {
+        SVDEBUG << "Reading transform list file \"" << *i << "\"" << endl;
         PlaylistFileReader reader(i->c_str());
         if (reader.isOK()) {
             vector<QString> files = reader.load();
@@ -1047,7 +1055,7 @@
                 requestedTransformFiles.insert(files[j].toStdString());
             }
         } else {
-            cerr << myname << ": failed to read template list file \"" << *i << "\"" << endl;
+            SVCERR << myname << ": failed to read transform list file \"" << *i << "\"" << endl;
             exit(2);
         }
     }
@@ -1059,10 +1067,10 @@
         for (QStringList::const_iterator i = otherArgs.begin();
              i != otherArgs.end(); ++i) {
             if (QDir(*i).exists()) {
-                cerr << "Directory found and recursive flag set, scanning for audio files..." << endl;
+                SVCERR << "Directory found and recursive flag set, scanning for audio files..." << endl;
                 int found = 0;
                 findSourcesRecursive(*i, sources, found);
-                cerr << "\rDone, found " << found << " supported audio file(s)                    " << endl;
+                SVCERR << "\rDone, found " << found << " supported audio file(s)                    " << endl;
             } else {
                 sources.push_back(*i);
             }
@@ -1080,16 +1088,16 @@
             manager.addSource(*i, multiplex);
         } catch (const std::exception &e) {
             badSources.insert(*i);
-            cerr << "ERROR: Failed to process file \"" << i->toStdString()
+            SVCERR << "ERROR: Failed to process file \"" << i->toStdString()
                  << "\": " << e.what() << endl;
             if (force) {
                 // print a note only if we have more files to process
                 QStringList::const_iterator j = i;
                 if (++j != sources.end()) {
-                    cerr << "NOTE: \"--force\" option was provided, continuing (more errors may occur)" << endl;
+                    SVCERR << "NOTE: \"--force\" option was provided, continuing (more errors may occur)" << endl;
                 }
             } else {
-                cerr << "NOTE: If you want to continue with processing any further files after an" << endl
+                SVCERR << "NOTE: If you want to continue with processing any further files after an" << endl
                      << "error like this, use the --force option" << endl;
                 good = false;
                 break;
@@ -1106,7 +1114,7 @@
             if (manager.addFeatureExtractorFromFile(i->c_str(), writers)) {
                 haveFeatureExtractor = true;
             } else {
-                cerr << "ERROR: Failed to add feature extractor from transform file \"" << *i << "\"" << endl;
+                SVCERR << "ERROR: Failed to add feature extractor from transform file \"" << *i << "\"" << endl;
                 good = false;
             }
         }
@@ -1116,13 +1124,13 @@
             if (manager.addDefaultFeatureExtractor(i->c_str(), writers)) {
                 haveFeatureExtractor = true;
             } else {
-                cerr << "ERROR: Failed to add default feature extractor for transform \"" << *i << "\"" << endl;
+                SVCERR << "ERROR: Failed to add default feature extractor for transform \"" << *i << "\"" << endl;
                 good = false;
             }
         }
 
         if (!haveFeatureExtractor) {
-            cerr << myname << ": no feature extractors added" << endl;
+            SVCERR << myname << ": no feature extractors added" << endl;
             good = false;
         }
     }
@@ -1141,15 +1149,14 @@
                 }
                 manager.extractFeaturesMultiplexed(goodSources);
             } catch (const std::exception &e) {
-                cerr << "ERROR: Feature extraction failed: "
+                SVCERR << "ERROR: Feature extraction failed: "
                      << e.what() << endl;
             }
         } else {
             int n = 0;
             for (QStringList::const_iterator i = goodSources.begin();
                  i != goodSources.end(); ++i) {
-                std::cerr << "Extracting features for: \"" << i->toStdString()
-                          << "\"" << std::endl;
+                SVCERR << "Extracting features for: \"" << *i << "\"" << endl;
                 ++n;
                 try {
                     for (int j = 0; j < (int)writers.size(); ++j) {
@@ -1157,17 +1164,17 @@
                     }
                     manager.extractFeatures(*i);
                 } catch (const std::exception &e) {
-                    cerr << "ERROR: Feature extraction failed for \""
-                         << i->toStdString() << "\": " << e.what() << endl;
+                    SVCERR << "ERROR: Feature extraction failed for \""
+                           << i->toStdString() << "\": " << e.what() << endl;
                     if (force) {
                         // print a note only if we have more files to process
                         QStringList::const_iterator j = i;
                         if (++j != sources.end()) {
-                            cerr << "NOTE: \"--force\" option was provided, continuing (more errors may occur)" << endl;
+                            SVCERR << "NOTE: \"--force\" option was provided, continuing (more errors may occur)" << endl;
                         }
                     } else {
-                        cerr << "NOTE: If you want to continue with processing any further files after an" << endl
-                             << "error like this, use the --force option" << endl;
+                        SVCERR << "NOTE: If you want to continue with processing any further files after an" << endl
+                               << "error like this, use the --force option" << endl;
                         good = false;
                         break;
                     }
@@ -1178,16 +1185,6 @@
     
     for (int i = 0; i < (int)writers.size(); ++i) delete writers[i];
 
-#ifdef HAVE_FFTW3
-    settings.beginGroup("FFTWisdom");
-    char *cwisdom = fftw_export_wisdom_to_string();
-    if (cwisdom) {
-        settings.setValue("wisdom", cwisdom);
-        fftw_free(cwisdom);
-    }
-    settings.endGroup();
-#endif
-
     TempDirectory::getInstance()->cleanup();
     
     if (good) return 0;
--- a/sonic-annotator.pro	Mon Nov 21 16:32:58 2016 +0000
+++ b/sonic-annotator.pro	Fri Dec 02 10:04:44 2016 +0000
@@ -1,14 +1,20 @@
 TEMPLATE = subdirs
-SUBDIRS = sub_dataquay svcore sub_runner
 
 !win* {
     # We should build and run the tests on any platform,
     # but doing it automatically doesn't work so well from
     # within an IDE on Windows, so remove that from here
-    SUBDIRS += svcore/data/fileio/test
+    SUBDIRS += \
+	sub_test_svcore_base \
+        sub_test_svcore_data_fileio
 }
 
-sub_dataquay.file = dataquay/lib.pro
+SUBDIRS += sub_runner
+
+sub_test_svcore_base.file = test-svcore-base.pro
+sub_test_svcore_data_fileio.file = test-svcore-data-fileio.pro
 
 sub_runner.file = runner.pro
-sub_runner.depends = svcore
+
+CONFIG += ordered
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-svcore-base.pro	Fri Dec 02 10:04:44 2016 +0000
@@ -0,0 +1,31 @@
+
+TEMPLATE = app
+
+exists(config.pri) {
+    include(config.pri)
+}
+
+!exists(config.pri) {
+    include(noconfig.pri)
+}
+
+include(base.pri)
+
+CONFIG += console
+QT += network xml testlib
+QT -= gui
+
+win32-x-g++:QMAKE_LFLAGS += -Wl,-subsystem,console
+macx*: CONFIG -= app_bundle
+
+TARGET = test-svcore-base
+
+OBJECTS_DIR = o
+MOC_DIR = o
+
+include(svcore/base/test/files.pri)
+
+for (file, TEST_SOURCES) { SOURCES += $$sprintf("svcore/base/test/%1", $$file) }
+for (file, TEST_HEADERS) { HEADERS += $$sprintf("svcore/base/test/%1", $$file) }
+
+QMAKE_POST_LINK = ./$${TARGET}$${TARGET_EXT}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-svcore-data-fileio.pro	Fri Dec 02 10:04:44 2016 +0000
@@ -0,0 +1,31 @@
+
+TEMPLATE = app
+
+exists(config.pri) {
+    include(config.pri)
+}
+
+!exists(config.pri) {
+    include(noconfig.pri)
+}
+
+include(base.pri)
+
+CONFIG += console
+QT += network xml testlib
+QT -= gui
+
+win32-x-g++:QMAKE_LFLAGS += -Wl,-subsystem,console
+macx*: CONFIG -= app_bundle
+
+TARGET = test-svcore-data-fileio
+
+OBJECTS_DIR = o
+MOC_DIR = o
+
+include(svcore/data/fileio/test/files.pri)
+
+for (file, TEST_SOURCES) { SOURCES += $$sprintf("svcore/data/fileio/test/%1", $$file) }
+for (file, TEST_HEADERS) { HEADERS += $$sprintf("svcore/data/fileio/test/%1", $$file) }
+
+QMAKE_POST_LINK = ./$${TARGET}$${TARGET_EXT}
Binary file tests/audio/id3v2-iso-8859-1.mp3 has changed
--- a/tests/include.sh	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/include.sh	Fri Dec 02 10:04:44 2016 +0000
@@ -13,7 +13,7 @@
     ;;
 esac
 
-version=1.5
+version=1.5pre
 nextversion=1.6
 
 testdir=$mypath/..
@@ -64,14 +64,16 @@
     # filter that out, and also reformat to ignore whitespace differences
     a="$1"
     b="$2"
-    cat "$a" | sed 's/Sonic Annotator v[0-9.]*/Sonic Annotator vXXX/' | json_reformat > "${a}__"
-    cat "$b" | sed 's/Sonic Annotator v[0-9.]*/Sonic Annotator vXXX/' | json_reformat > "${b}__"
+    cat "$a" | sed 's/Sonic Annotator v[0-9a-z.]*/Sonic Annotator vXXX/' | json_reformat > "${a}__"
+    cat "$b" | sed 's/Sonic Annotator v[0-9a-z.]*/Sonic Annotator vXXX/' | json_reformat > "${b}__"
     cmp -s "${a}__" "${b}__"
     rv=$?
     rm "${a}__" "${b}__"
     return $rv
 }
 
+SDIFF_WIDTH=140
+
 faildiff() {
     echo "Test failed: $1"
     if [ -n "$2" -a -n "$3" ]; then
@@ -79,13 +81,13 @@
 	echo "--"
 	cat "$2"
 	echo "--"
-	echo "Expected output follows:"
+	echo "Expected output follows ($3):"
 	echo "--"
 	cat "$3"
 	echo "--"
 	echo "Diff (output on left, expected on right):"
 	echo "--"
-	sdiff -w78 "$2" "$3"
+	sdiff -w${SDIFF_WIDTH} "$2" "$3"
 	echo "--"
     fi
     exit 1
@@ -98,14 +100,14 @@
 	echo "--"
 	od -c "$2"
 	echo "--"
-	echo "Expected output follows:"
+	echo "Expected output follows ($3):"
 	echo "--"
 	od -c "$3"
 	echo "--"
 	echo "Diff:"
 	echo "--"
 	od -w8 -c "$3" > "${3}__"
-	od -w8 -c "$2" | sdiff -w78 - "${3}__"
+	od -w8 -c "$2" | sdiff -w${SDIFF_WIDTH} - "${3}__"
 	rm "${3}__"
 	echo "--"
     fi
--- a/tests/test-audioformat/expected/percussiononsets-mp3.csv	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-audioformat/expected/percussiononsets-mp3.csv	Fri Dec 02 10:04:44 2016 +0000
@@ -1,4 +1,3 @@
-"./../audio/3clicks.mp3",0.058049886
-,0.824308390
-,1.706666666
-,2.461315192
+"./../audio/3clicks.mp3",0.777868481
+,1.648616780
+,2.403265306
--- a/tests/test-audioformat/test-audioformat.sh	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-audioformat/test-audioformat.sh	Fri Dec 02 10:04:44 2016 +0000
@@ -28,15 +28,8 @@
     $r -t $transform -w csv --csv-stdout $infile > $tmpfile2 2>/dev/null || \
 	fail "Fails to run transform $transform against audio file $infile"
 
-    if [ "$extension" = "wav" ]; then
-	csvcompare $tmpfile2 $expected || \
-	    faildiff "Output mismatch for transform $transform with audio file $infile" $tmpfile2 $expected
-    else
-	csvcompare $tmpfile2 $expected || \
-	    ( echo "NOTE: Output mismatch for transform $transform with audio file $infile" ; \
-	      echo "This may be the result of differences in the audio file decoder, so I am not" ; \
-	      echo "failing the test, but I recommend that you check the results." )
-    fi
+    csvcompare $tmpfile2 $expected || \
+	faildiff "Output mismatch for transform $transform for format $extension with audio file $infile" $tmpfile2 $expected
 done
 
 # Check the normalise flag
--- a/tests/test-csv-writer/expected/grid-oss-0.csv	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-csv-writer/expected/grid-oss-0.csv	Fri Dec 02 10:04:44 2016 +0000
@@ -1,20 +1,20 @@
 "./../audio/20sec-silence.wav",0.000000000,0.0666667,0.1,0.133333,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,"1 of 20 at 0"
-,0.023219954,0.1,0.133333,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,"2 of 20 at 0.023"
+,0.023219955,0.1,0.133333,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,"2 of 20 at 0.023"
 ,0.046439909,0.133333,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,"3 of 20 at 0.046"
-,0.069659863,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,"4 of 20 at 0.069"
-,0.092879818,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,"5 of 20 at 0.092"
+,0.069659864,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,"4 of 20 at 0.069"
+,0.092879819,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,"5 of 20 at 0.092"
 ,0.116099773,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,"6 of 20 at 0.116"
-,0.139319727,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,"7 of 20 at 0.139"
-,0.162539682,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,"8 of 20 at 0.162"
+,0.139319728,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,"7 of 20 at 0.139"
+,0.162539683,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,"8 of 20 at 0.162"
 ,0.185759637,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,0.633333,"9 of 20 at 0.185"
-,0.208979591,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,"10 of 20 at 0.208"
+,0.208979592,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,"10 of 20 at 0.208"
 ,0.232199546,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,0.7,"11 of 20 at 0.232"
 ,0.255419501,0.433333,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,0.7,0.733333,"12 of 20 at 0.255"
-,0.278639455,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,"13 of 20 at 0.278"
+,0.278639456,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,"13 of 20 at 0.278"
 ,0.301859410,0.5,0.533333,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,0.8,"14 of 20 at 0.301"
 ,0.325079365,0.533333,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,0.8,0.833333,"15 of 20 at 0.325"
-,0.348299319,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,"16 of 20 at 0.348"
+,0.348299320,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,"16 of 20 at 0.348"
 ,0.371519274,0.6,0.633333,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,0.9,"17 of 20 at 0.371"
 ,0.394739229,0.633333,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,0.9,0.933333,"18 of 20 at 0.394"
-,0.417959183,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,0.9,0.933333,0.966667,"19 of 20 at 0.417"
+,0.417959184,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,0.9,0.933333,0.966667,"19 of 20 at 0.417"
 ,0.441179138,0.7,0.733333,0.766667,0.8,0.833333,0.866667,0.9,0.933333,0.966667,1,"20 of 20 at 0.441"
--- a/tests/test-csv-writer/expected/grid-oss-2.csv	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-csv-writer/expected/grid-oss-2.csv	Fri Dec 02 10:04:44 2016 +0000
@@ -1,20 +1,20 @@
 "./../audio/20sec-silence.wav",0.000000000,0.067,0.1,0.13,0.17,0.2,0.23,0.27,0.3,0.33,0.37,"1 of 20 at 0"
-,0.023219954,0.1,0.13,0.17,0.2,0.23,0.27,0.3,0.33,0.37,0.4,"2 of 20 at 0.023"
+,0.023219955,0.1,0.13,0.17,0.2,0.23,0.27,0.3,0.33,0.37,0.4,"2 of 20 at 0.023"
 ,0.046439909,0.13,0.17,0.2,0.23,0.27,0.3,0.33,0.37,0.4,0.43,"3 of 20 at 0.046"
-,0.069659863,0.17,0.2,0.23,0.27,0.3,0.33,0.37,0.4,0.43,0.47,"4 of 20 at 0.069"
-,0.092879818,0.2,0.23,0.27,0.3,0.33,0.37,0.4,0.43,0.47,0.5,"5 of 20 at 0.092"
+,0.069659864,0.17,0.2,0.23,0.27,0.3,0.33,0.37,0.4,0.43,0.47,"4 of 20 at 0.069"
+,0.092879819,0.2,0.23,0.27,0.3,0.33,0.37,0.4,0.43,0.47,0.5,"5 of 20 at 0.092"
 ,0.116099773,0.23,0.27,0.3,0.33,0.37,0.4,0.43,0.47,0.5,0.53,"6 of 20 at 0.116"
-,0.139319727,0.27,0.3,0.33,0.37,0.4,0.43,0.47,0.5,0.53,0.57,"7 of 20 at 0.139"
-,0.162539682,0.3,0.33,0.37,0.4,0.43,0.47,0.5,0.53,0.57,0.6,"8 of 20 at 0.162"
+,0.139319728,0.27,0.3,0.33,0.37,0.4,0.43,0.47,0.5,0.53,0.57,"7 of 20 at 0.139"
+,0.162539683,0.3,0.33,0.37,0.4,0.43,0.47,0.5,0.53,0.57,0.6,"8 of 20 at 0.162"
 ,0.185759637,0.33,0.37,0.4,0.43,0.47,0.5,0.53,0.57,0.6,0.63,"9 of 20 at 0.185"
-,0.208979591,0.37,0.4,0.43,0.47,0.5,0.53,0.57,0.6,0.63,0.67,"10 of 20 at 0.208"
+,0.208979592,0.37,0.4,0.43,0.47,0.5,0.53,0.57,0.6,0.63,0.67,"10 of 20 at 0.208"
 ,0.232199546,0.4,0.43,0.47,0.5,0.53,0.57,0.6,0.63,0.67,0.7,"11 of 20 at 0.232"
 ,0.255419501,0.43,0.47,0.5,0.53,0.57,0.6,0.63,0.67,0.7,0.73,"12 of 20 at 0.255"
-,0.278639455,0.47,0.5,0.53,0.57,0.6,0.63,0.67,0.7,0.73,0.77,"13 of 20 at 0.278"
+,0.278639456,0.47,0.5,0.53,0.57,0.6,0.63,0.67,0.7,0.73,0.77,"13 of 20 at 0.278"
 ,0.301859410,0.5,0.53,0.57,0.6,0.63,0.67,0.7,0.73,0.77,0.8,"14 of 20 at 0.301"
 ,0.325079365,0.53,0.57,0.6,0.63,0.67,0.7,0.73,0.77,0.8,0.83,"15 of 20 at 0.325"
-,0.348299319,0.57,0.6,0.63,0.67,0.7,0.73,0.77,0.8,0.83,0.87,"16 of 20 at 0.348"
+,0.348299320,0.57,0.6,0.63,0.67,0.7,0.73,0.77,0.8,0.83,0.87,"16 of 20 at 0.348"
 ,0.371519274,0.6,0.63,0.67,0.7,0.73,0.77,0.8,0.83,0.87,0.9,"17 of 20 at 0.371"
 ,0.394739229,0.63,0.67,0.7,0.73,0.77,0.8,0.83,0.87,0.9,0.93,"18 of 20 at 0.394"
-,0.417959183,0.67,0.7,0.73,0.77,0.8,0.83,0.87,0.9,0.93,0.97,"19 of 20 at 0.417"
+,0.417959184,0.67,0.7,0.73,0.77,0.8,0.83,0.87,0.9,0.93,0.97,"19 of 20 at 0.417"
 ,0.441179138,0.7,0.73,0.77,0.8,0.83,0.87,0.9,0.93,0.97,1,"20 of 20 at 0.441"
--- a/tests/test-csv-writer/expected/grid-oss-6.csv	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-csv-writer/expected/grid-oss-6.csv	Fri Dec 02 10:04:44 2016 +0000
@@ -1,20 +1,20 @@
 "./../audio/20sec-silence.wav",0.000000000,0.0666667,0.1,0.133333,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,"1 of 20 at 0"
-,0.023219954,0.1,0.133333,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,"2 of 20 at 0.023"
+,0.023219955,0.1,0.133333,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,"2 of 20 at 0.023"
 ,0.046439909,0.133333,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,"3 of 20 at 0.046"
-,0.069659863,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,"4 of 20 at 0.069"
-,0.092879818,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,"5 of 20 at 0.092"
+,0.069659864,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,"4 of 20 at 0.069"
+,0.092879819,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,"5 of 20 at 0.092"
 ,0.116099773,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,"6 of 20 at 0.116"
-,0.139319727,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,"7 of 20 at 0.139"
-,0.162539682,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,"8 of 20 at 0.162"
+,0.139319728,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,"7 of 20 at 0.139"
+,0.162539683,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,"8 of 20 at 0.162"
 ,0.185759637,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,0.633333,"9 of 20 at 0.185"
-,0.208979591,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,"10 of 20 at 0.208"
+,0.208979592,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,"10 of 20 at 0.208"
 ,0.232199546,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,0.7,"11 of 20 at 0.232"
 ,0.255419501,0.433333,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,0.7,0.733333,"12 of 20 at 0.255"
-,0.278639455,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,"13 of 20 at 0.278"
+,0.278639456,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,"13 of 20 at 0.278"
 ,0.301859410,0.5,0.533333,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,0.8,"14 of 20 at 0.301"
 ,0.325079365,0.533333,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,0.8,0.833333,"15 of 20 at 0.325"
-,0.348299319,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,"16 of 20 at 0.348"
+,0.348299320,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,"16 of 20 at 0.348"
 ,0.371519274,0.6,0.633333,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,0.9,"17 of 20 at 0.371"
 ,0.394739229,0.633333,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,0.9,0.933333,"18 of 20 at 0.394"
-,0.417959183,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,0.9,0.933333,0.966667,"19 of 20 at 0.417"
+,0.417959184,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,0.9,0.933333,0.966667,"19 of 20 at 0.417"
 ,0.441179138,0.7,0.733333,0.766667,0.8,0.833333,0.866667,0.9,0.933333,0.966667,1,"20 of 20 at 0.441"
--- a/tests/test-csv-writer/expected/grid-oss-fill-ends.csv	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-csv-writer/expected/grid-oss-fill-ends.csv	Fri Dec 02 10:04:44 2016 +0000
@@ -1,20 +1,20 @@
-"./../audio/20sec-silence.wav",0.000000000,0.023219954,0.0666667,0.1,0.133333,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,"1 of 20 at 0"
-,0.023219954,0.023219955,0.1,0.133333,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,"2 of 20 at 0.023"
-,0.046439909,0.023219954,0.133333,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,"3 of 20 at 0.046"
-,0.069659863,0.023219955,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,"4 of 20 at 0.069"
-,0.092879818,0.023219955,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,"5 of 20 at 0.092"
-,0.116099773,0.023219954,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,"6 of 20 at 0.116"
-,0.139319727,0.023219955,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,"7 of 20 at 0.139"
-,0.162539682,0.023219955,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,"8 of 20 at 0.162"
-,0.185759637,0.023219954,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,0.633333,"9 of 20 at 0.185"
-,0.208979591,0.023219955,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,"10 of 20 at 0.208"
+"./../audio/20sec-silence.wav",0.000000000,0.023219955,0.0666667,0.1,0.133333,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,"1 of 20 at 0"
+,0.023219955,0.023219954,0.1,0.133333,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,"2 of 20 at 0.023"
+,0.046439909,0.023219955,0.133333,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,"3 of 20 at 0.046"
+,0.069659864,0.023219955,0.166667,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,"4 of 20 at 0.069"
+,0.092879819,0.023219954,0.2,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,"5 of 20 at 0.092"
+,0.116099773,0.023219955,0.233333,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,"6 of 20 at 0.116"
+,0.139319728,0.023219955,0.266667,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,"7 of 20 at 0.139"
+,0.162539683,0.023219954,0.3,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,"8 of 20 at 0.162"
+,0.185759637,0.023219955,0.333333,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,0.633333,"9 of 20 at 0.185"
+,0.208979592,0.023219954,0.366667,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,"10 of 20 at 0.208"
 ,0.232199546,0.023219955,0.4,0.433333,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,0.7,"11 of 20 at 0.232"
-,0.255419501,0.023219954,0.433333,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,0.7,0.733333,"12 of 20 at 0.255"
-,0.278639455,0.023219955,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,"13 of 20 at 0.278"
+,0.255419501,0.023219955,0.433333,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,0.7,0.733333,"12 of 20 at 0.255"
+,0.278639456,0.023219954,0.466667,0.5,0.533333,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,"13 of 20 at 0.278"
 ,0.301859410,0.023219955,0.5,0.533333,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,0.8,"14 of 20 at 0.301"
-,0.325079365,0.023219954,0.533333,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,0.8,0.833333,"15 of 20 at 0.325"
-,0.348299319,0.023219955,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,"16 of 20 at 0.348"
+,0.325079365,0.023219955,0.533333,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,0.8,0.833333,"15 of 20 at 0.325"
+,0.348299320,0.023219954,0.566667,0.6,0.633333,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,"16 of 20 at 0.348"
 ,0.371519274,0.023219955,0.6,0.633333,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,0.9,"17 of 20 at 0.371"
-,0.394739229,0.023219954,0.633333,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,0.9,0.933333,"18 of 20 at 0.394"
-,0.417959183,0.023219955,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,0.9,0.933333,0.966667,"19 of 20 at 0.417"
+,0.394739229,0.023219955,0.633333,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,0.9,0.933333,"18 of 20 at 0.394"
+,0.417959184,0.023219954,0.666667,0.7,0.733333,0.766667,0.8,0.833333,0.866667,0.9,0.933333,0.966667,"19 of 20 at 0.417"
 ,0.441179138,0.000000000,0.7,0.733333,0.766667,0.8,0.833333,0.866667,0.9,0.933333,0.966667,1,"20 of 20 at 0.441"
--- a/tests/test-jams-writer/expected/af-0.json	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-jams-writer/expected/af-0.json	Fri Dec 02 10:04:44 2016 +0000
@@ -2,13 +2,13 @@
 "file_metadata": {
   "jams_version": "0.2.0",
   "identifiers": { "filename": "3clicks8.wav" },
-  "duration": 4.979659863
+  "duration": 4.979659864
 },
 "annotations": [
 {
   "namespace": "unknown",
   "annotation_metadata": {
-    "annotation_tools": "Sonic Annotator v1.3",
+    "annotation_tools": "Sonic Annotator v1.5",
     "data_source": "Automatic feature extraction",
     "annotator": {
       "plugin_id": "vamp:vamp-example-plugins:amplitudefollower",
@@ -21,220 +21,220 @@
   },
   "data": [
     { "time": 0.000000000, "duration": 0.0, "confidence": 1.0, "value": 0.00359596 },
-    { "time": 0.023219954, "duration": 0.0, "confidence": 1.0, "value": 0.00351864 },
+    { "time": 0.023219955, "duration": 0.0, "confidence": 1.0, "value": 0.00351864 },
     { "time": 0.046439909, "duration": 0.0, "confidence": 1.0, "value": 0.00357167 },
-    { "time": 0.069659863, "duration": 0.0, "confidence": 1.0, "value": 0.00358918 },
-    { "time": 0.092879818, "duration": 0.0, "confidence": 1.0, "value": 0.00359586 },
+    { "time": 0.069659864, "duration": 0.0, "confidence": 1.0, "value": 0.00358918 },
+    { "time": 0.092879819, "duration": 0.0, "confidence": 1.0, "value": 0.00359586 },
     { "time": 0.116099773, "duration": 0.0, "confidence": 1.0, "value": 0.00352171 },
-    { "time": 0.139319727, "duration": 0.0, "confidence": 1.0, "value": 0.00353074 },
-    { "time": 0.162539682, "duration": 0.0, "confidence": 1.0, "value": 0.00354993 },
+    { "time": 0.139319728, "duration": 0.0, "confidence": 1.0, "value": 0.00353074 },
+    { "time": 0.162539683, "duration": 0.0, "confidence": 1.0, "value": 0.00354993 },
     { "time": 0.185759637, "duration": 0.0, "confidence": 1.0, "value": 0.00354264 },
-    { "time": 0.208979591, "duration": 0.0, "confidence": 1.0, "value": 0.00352689 },
+    { "time": 0.208979592, "duration": 0.0, "confidence": 1.0, "value": 0.00352689 },
     { "time": 0.232199546, "duration": 0.0, "confidence": 1.0, "value": 0.00360165 },
     { "time": 0.255419501, "duration": 0.0, "confidence": 1.0, "value": 0.00361172 },
-    { "time": 0.278639455, "duration": 0.0, "confidence": 1.0, "value": 0.00361564 },
+    { "time": 0.278639456, "duration": 0.0, "confidence": 1.0, "value": 0.00361564 },
     { "time": 0.301859410, "duration": 0.0, "confidence": 1.0, "value": 0.0035339 },
     { "time": 0.325079365, "duration": 0.0, "confidence": 1.0, "value": 0.00361025 },
-    { "time": 0.348299319, "duration": 0.0, "confidence": 1.0, "value": 0.00352643 },
+    { "time": 0.348299320, "duration": 0.0, "confidence": 1.0, "value": 0.00352643 },
     { "time": 0.371519274, "duration": 0.0, "confidence": 1.0, "value": 0.00355937 },
     { "time": 0.394739229, "duration": 0.0, "confidence": 1.0, "value": 0.00353683 },
-    { "time": 0.417959183, "duration": 0.0, "confidence": 1.0, "value": 0.00358946 },
+    { "time": 0.417959184, "duration": 0.0, "confidence": 1.0, "value": 0.00358946 },
     { "time": 0.441179138, "duration": 0.0, "confidence": 1.0, "value": 0.00363629 },
-    { "time": 0.464399092, "duration": 0.0, "confidence": 1.0, "value": 0.00354152 },
-    { "time": 0.487619047, "duration": 0.0, "confidence": 1.0, "value": 0.00348666 },
+    { "time": 0.464399093, "duration": 0.0, "confidence": 1.0, "value": 0.00354152 },
+    { "time": 0.487619048, "duration": 0.0, "confidence": 1.0, "value": 0.00348666 },
     { "time": 0.510839002, "duration": 0.0, "confidence": 1.0, "value": 0.00352516 },
-    { "time": 0.534058956, "duration": 0.0, "confidence": 1.0, "value": 0.00352261 },
-    { "time": 0.557278911, "duration": 0.0, "confidence": 1.0, "value": 0.00350301 },
+    { "time": 0.534058957, "duration": 0.0, "confidence": 1.0, "value": 0.00352261 },
+    { "time": 0.557278912, "duration": 0.0, "confidence": 1.0, "value": 0.00350301 },
     { "time": 0.580498866, "duration": 0.0, "confidence": 1.0, "value": 0.00352414 },
-    { "time": 0.603718820, "duration": 0.0, "confidence": 1.0, "value": 0.00351352 },
-    { "time": 0.626938775, "duration": 0.0, "confidence": 1.0, "value": 0.00345411 },
+    { "time": 0.603718821, "duration": 0.0, "confidence": 1.0, "value": 0.00351352 },
+    { "time": 0.626938776, "duration": 0.0, "confidence": 1.0, "value": 0.00345411 },
     { "time": 0.650158730, "duration": 0.0, "confidence": 1.0, "value": 0.00363914 },
-    { "time": 0.673378684, "duration": 0.0, "confidence": 1.0, "value": 0.00370925 },
+    { "time": 0.673378685, "duration": 0.0, "confidence": 1.0, "value": 0.00370925 },
     { "time": 0.696598639, "duration": 0.0, "confidence": 1.0, "value": 0.00348075 },
     { "time": 0.719818594, "duration": 0.0, "confidence": 1.0, "value": 0.0034814 },
-    { "time": 0.743038548, "duration": 0.0, "confidence": 1.0, "value": 0.00362525 },
+    { "time": 0.743038549, "duration": 0.0, "confidence": 1.0, "value": 0.00362525 },
     { "time": 0.766258503, "duration": 0.0, "confidence": 1.0, "value": 0.0146151 },
     { "time": 0.789478458, "duration": 0.0, "confidence": 1.0, "value": 0.00458446 },
-    { "time": 0.812698412, "duration": 0.0, "confidence": 1.0, "value": 0.00342316 },
+    { "time": 0.812698413, "duration": 0.0, "confidence": 1.0, "value": 0.00342316 },
     { "time": 0.835918367, "duration": 0.0, "confidence": 1.0, "value": 0.0036135 },
-    { "time": 0.859138321, "duration": 0.0, "confidence": 1.0, "value": 0.00352045 },
-    { "time": 0.882358276, "duration": 0.0, "confidence": 1.0, "value": 0.0036266 },
+    { "time": 0.859138322, "duration": 0.0, "confidence": 1.0, "value": 0.00352045 },
+    { "time": 0.882358277, "duration": 0.0, "confidence": 1.0, "value": 0.0036266 },
     { "time": 0.905578231, "duration": 0.0, "confidence": 1.0, "value": 0.00357805 },
-    { "time": 0.928798185, "duration": 0.0, "confidence": 1.0, "value": 0.00355937 },
-    { "time": 0.952018140, "duration": 0.0, "confidence": 1.0, "value": 0.00350579 },
+    { "time": 0.928798186, "duration": 0.0, "confidence": 1.0, "value": 0.00355937 },
+    { "time": 0.952018141, "duration": 0.0, "confidence": 1.0, "value": 0.00350579 },
     { "time": 0.975238095, "duration": 0.0, "confidence": 1.0, "value": 0.00359969 },
-    { "time": 0.998458049, "duration": 0.0, "confidence": 1.0, "value": 0.00352854 },
-    { "time": 1.021678004, "duration": 0.0, "confidence": 1.0, "value": 0.00353486 },
+    { "time": 0.998458050, "duration": 0.0, "confidence": 1.0, "value": 0.00352854 },
+    { "time": 1.021678005, "duration": 0.0, "confidence": 1.0, "value": 0.00353486 },
     { "time": 1.044897959, "duration": 0.0, "confidence": 1.0, "value": 0.00355259 },
-    { "time": 1.068117913, "duration": 0.0, "confidence": 1.0, "value": 0.00347951 },
+    { "time": 1.068117914, "duration": 0.0, "confidence": 1.0, "value": 0.00347951 },
     { "time": 1.091337868, "duration": 0.0, "confidence": 1.0, "value": 0.00361734 },
     { "time": 1.114557823, "duration": 0.0, "confidence": 1.0, "value": 0.00351861 },
-    { "time": 1.137777777, "duration": 0.0, "confidence": 1.0, "value": 0.00351437 },
+    { "time": 1.137777778, "duration": 0.0, "confidence": 1.0, "value": 0.00351437 },
     { "time": 1.160997732, "duration": 0.0, "confidence": 1.0, "value": 0.00352971 },
     { "time": 1.184217687, "duration": 0.0, "confidence": 1.0, "value": 0.00360414 },
-    { "time": 1.207437641, "duration": 0.0, "confidence": 1.0, "value": 0.0034343 },
+    { "time": 1.207437642, "duration": 0.0, "confidence": 1.0, "value": 0.0034343 },
     { "time": 1.230657596, "duration": 0.0, "confidence": 1.0, "value": 0.00358201 },
     { "time": 1.253877551, "duration": 0.0, "confidence": 1.0, "value": 0.00361252 },
-    { "time": 1.277097505, "duration": 0.0, "confidence": 1.0, "value": 0.00361165 },
+    { "time": 1.277097506, "duration": 0.0, "confidence": 1.0, "value": 0.00361165 },
     { "time": 1.300317460, "duration": 0.0, "confidence": 1.0, "value": 0.00355763 },
-    { "time": 1.323537414, "duration": 0.0, "confidence": 1.0, "value": 0.00353226 },
-    { "time": 1.346757369, "duration": 0.0, "confidence": 1.0, "value": 0.00349109 },
+    { "time": 1.323537415, "duration": 0.0, "confidence": 1.0, "value": 0.00353226 },
+    { "time": 1.346757370, "duration": 0.0, "confidence": 1.0, "value": 0.00349109 },
     { "time": 1.369977324, "duration": 0.0, "confidence": 1.0, "value": 0.00352628 },
-    { "time": 1.393197278, "duration": 0.0, "confidence": 1.0, "value": 0.00348415 },
-    { "time": 1.416417233, "duration": 0.0, "confidence": 1.0, "value": 0.00354576 },
+    { "time": 1.393197279, "duration": 0.0, "confidence": 1.0, "value": 0.00348415 },
+    { "time": 1.416417234, "duration": 0.0, "confidence": 1.0, "value": 0.00354576 },
     { "time": 1.439637188, "duration": 0.0, "confidence": 1.0, "value": 0.00369414 },
-    { "time": 1.462857142, "duration": 0.0, "confidence": 1.0, "value": 0.00367139 },
-    { "time": 1.486077097, "duration": 0.0, "confidence": 1.0, "value": 0.00342798 },
+    { "time": 1.462857143, "duration": 0.0, "confidence": 1.0, "value": 0.00367139 },
+    { "time": 1.486077098, "duration": 0.0, "confidence": 1.0, "value": 0.00342798 },
     { "time": 1.509297052, "duration": 0.0, "confidence": 1.0, "value": 0.00338209 },
-    { "time": 1.532517006, "duration": 0.0, "confidence": 1.0, "value": 0.00351023 },
+    { "time": 1.532517007, "duration": 0.0, "confidence": 1.0, "value": 0.00351023 },
     { "time": 1.555736961, "duration": 0.0, "confidence": 1.0, "value": 0.00346643 },
     { "time": 1.578956916, "duration": 0.0, "confidence": 1.0, "value": 0.00346979 },
-    { "time": 1.602176870, "duration": 0.0, "confidence": 1.0, "value": 0.00348269 },
+    { "time": 1.602176871, "duration": 0.0, "confidence": 1.0, "value": 0.00348269 },
     { "time": 1.625396825, "duration": 0.0, "confidence": 1.0, "value": 0.00348368 },
     { "time": 1.648616780, "duration": 0.0, "confidence": 1.0, "value": 0.01162 },
-    { "time": 1.671836734, "duration": 0.0, "confidence": 1.0, "value": 0.00359211 },
+    { "time": 1.671836735, "duration": 0.0, "confidence": 1.0, "value": 0.00359211 },
     { "time": 1.695056689, "duration": 0.0, "confidence": 1.0, "value": 0.00360249 },
-    { "time": 1.718276643, "duration": 0.0, "confidence": 1.0, "value": 0.00352957 },
-    { "time": 1.741496598, "duration": 0.0, "confidence": 1.0, "value": 0.00349559 },
+    { "time": 1.718276644, "duration": 0.0, "confidence": 1.0, "value": 0.00352957 },
+    { "time": 1.741496599, "duration": 0.0, "confidence": 1.0, "value": 0.00349559 },
     { "time": 1.764716553, "duration": 0.0, "confidence": 1.0, "value": 0.00344387 },
-    { "time": 1.787936507, "duration": 0.0, "confidence": 1.0, "value": 0.00352666 },
-    { "time": 1.811156462, "duration": 0.0, "confidence": 1.0, "value": 0.0035248 },
+    { "time": 1.787936508, "duration": 0.0, "confidence": 1.0, "value": 0.00352666 },
+    { "time": 1.811156463, "duration": 0.0, "confidence": 1.0, "value": 0.0035248 },
     { "time": 1.834376417, "duration": 0.0, "confidence": 1.0, "value": 0.00353289 },
-    { "time": 1.857596371, "duration": 0.0, "confidence": 1.0, "value": 0.00353361 },
-    { "time": 1.880816326, "duration": 0.0, "confidence": 1.0, "value": 0.00348838 },
+    { "time": 1.857596372, "duration": 0.0, "confidence": 1.0, "value": 0.00353361 },
+    { "time": 1.880816327, "duration": 0.0, "confidence": 1.0, "value": 0.00348838 },
     { "time": 1.904036281, "duration": 0.0, "confidence": 1.0, "value": 0.00355124 },
-    { "time": 1.927256235, "duration": 0.0, "confidence": 1.0, "value": 0.00349487 },
+    { "time": 1.927256236, "duration": 0.0, "confidence": 1.0, "value": 0.00349487 },
     { "time": 1.950476190, "duration": 0.0, "confidence": 1.0, "value": 0.0036614 },
     { "time": 1.973696145, "duration": 0.0, "confidence": 1.0, "value": 0.00358802 },
-    { "time": 1.996916099, "duration": 0.0, "confidence": 1.0, "value": 0.00351078 },
+    { "time": 1.996916100, "duration": 0.0, "confidence": 1.0, "value": 0.00351078 },
     { "time": 2.020136054, "duration": 0.0, "confidence": 1.0, "value": 0.00351788 },
     { "time": 2.043356009, "duration": 0.0, "confidence": 1.0, "value": 0.00345998 },
-    { "time": 2.066575963, "duration": 0.0, "confidence": 1.0, "value": 0.00359541 },
+    { "time": 2.066575964, "duration": 0.0, "confidence": 1.0, "value": 0.00359541 },
     { "time": 2.089795918, "duration": 0.0, "confidence": 1.0, "value": 0.00363803 },
     { "time": 2.113015873, "duration": 0.0, "confidence": 1.0, "value": 0.00341127 },
-    { "time": 2.136235827, "duration": 0.0, "confidence": 1.0, "value": 0.00358579 },
+    { "time": 2.136235828, "duration": 0.0, "confidence": 1.0, "value": 0.00358579 },
     { "time": 2.159455782, "duration": 0.0, "confidence": 1.0, "value": 0.00358391 },
-    { "time": 2.182675736, "duration": 0.0, "confidence": 1.0, "value": 0.00349291 },
-    { "time": 2.205895691, "duration": 0.0, "confidence": 1.0, "value": 0.00350593 },
+    { "time": 2.182675737, "duration": 0.0, "confidence": 1.0, "value": 0.00349291 },
+    { "time": 2.205895692, "duration": 0.0, "confidence": 1.0, "value": 0.00350593 },
     { "time": 2.229115646, "duration": 0.0, "confidence": 1.0, "value": 0.00347529 },
-    { "time": 2.252335600, "duration": 0.0, "confidence": 1.0, "value": 0.00358021 },
-    { "time": 2.275555555, "duration": 0.0, "confidence": 1.0, "value": 0.00353051 },
+    { "time": 2.252335601, "duration": 0.0, "confidence": 1.0, "value": 0.00358021 },
+    { "time": 2.275555556, "duration": 0.0, "confidence": 1.0, "value": 0.00353051 },
     { "time": 2.298775510, "duration": 0.0, "confidence": 1.0, "value": 0.00360463 },
-    { "time": 2.321995464, "duration": 0.0, "confidence": 1.0, "value": 0.00357421 },
-    { "time": 2.345215419, "duration": 0.0, "confidence": 1.0, "value": 0.00343617 },
+    { "time": 2.321995465, "duration": 0.0, "confidence": 1.0, "value": 0.00357421 },
+    { "time": 2.345215420, "duration": 0.0, "confidence": 1.0, "value": 0.00343617 },
     { "time": 2.368435374, "duration": 0.0, "confidence": 1.0, "value": 0.00367464 },
-    { "time": 2.391655328, "duration": 0.0, "confidence": 1.0, "value": 0.00623882 },
+    { "time": 2.391655329, "duration": 0.0, "confidence": 1.0, "value": 0.00623882 },
     { "time": 2.414875283, "duration": 0.0, "confidence": 1.0, "value": 0.0139992 },
     { "time": 2.438095238, "duration": 0.0, "confidence": 1.0, "value": 0.00347958 },
-    { "time": 2.461315192, "duration": 0.0, "confidence": 1.0, "value": 0.00348231 },
+    { "time": 2.461315193, "duration": 0.0, "confidence": 1.0, "value": 0.00348231 },
     { "time": 2.484535147, "duration": 0.0, "confidence": 1.0, "value": 0.0035482 },
     { "time": 2.507755102, "duration": 0.0, "confidence": 1.0, "value": 0.00350744 },
-    { "time": 2.530975056, "duration": 0.0, "confidence": 1.0, "value": 0.00342298 },
+    { "time": 2.530975057, "duration": 0.0, "confidence": 1.0, "value": 0.00342298 },
     { "time": 2.554195011, "duration": 0.0, "confidence": 1.0, "value": 0.00366419 },
-    { "time": 2.577414965, "duration": 0.0, "confidence": 1.0, "value": 0.0034377 },
-    { "time": 2.600634920, "duration": 0.0, "confidence": 1.0, "value": 0.00356318 },
+    { "time": 2.577414966, "duration": 0.0, "confidence": 1.0, "value": 0.0034377 },
+    { "time": 2.600634921, "duration": 0.0, "confidence": 1.0, "value": 0.00356318 },
     { "time": 2.623854875, "duration": 0.0, "confidence": 1.0, "value": 0.00354368 },
-    { "time": 2.647074829, "duration": 0.0, "confidence": 1.0, "value": 0.00360324 },
-    { "time": 2.670294784, "duration": 0.0, "confidence": 1.0, "value": 0.00354322 },
+    { "time": 2.647074830, "duration": 0.0, "confidence": 1.0, "value": 0.00360324 },
+    { "time": 2.670294785, "duration": 0.0, "confidence": 1.0, "value": 0.00354322 },
     { "time": 2.693514739, "duration": 0.0, "confidence": 1.0, "value": 0.0035675 },
-    { "time": 2.716734693, "duration": 0.0, "confidence": 1.0, "value": 0.00346242 },
-    { "time": 2.739954648, "duration": 0.0, "confidence": 1.0, "value": 0.00348647 },
+    { "time": 2.716734694, "duration": 0.0, "confidence": 1.0, "value": 0.00346242 },
+    { "time": 2.739954649, "duration": 0.0, "confidence": 1.0, "value": 0.00348647 },
     { "time": 2.763174603, "duration": 0.0, "confidence": 1.0, "value": 0.0034772 },
-    { "time": 2.786394557, "duration": 0.0, "confidence": 1.0, "value": 0.00344762 },
+    { "time": 2.786394558, "duration": 0.0, "confidence": 1.0, "value": 0.00344762 },
     { "time": 2.809614512, "duration": 0.0, "confidence": 1.0, "value": 0.00352104 },
     { "time": 2.832834467, "duration": 0.0, "confidence": 1.0, "value": 0.00355933 },
-    { "time": 2.856054421, "duration": 0.0, "confidence": 1.0, "value": 0.00340756 },
+    { "time": 2.856054422, "duration": 0.0, "confidence": 1.0, "value": 0.00340756 },
     { "time": 2.879274376, "duration": 0.0, "confidence": 1.0, "value": 0.00349975 },
     { "time": 2.902494331, "duration": 0.0, "confidence": 1.0, "value": 0.00348265 },
-    { "time": 2.925714285, "duration": 0.0, "confidence": 1.0, "value": 0.00354504 },
+    { "time": 2.925714286, "duration": 0.0, "confidence": 1.0, "value": 0.00354504 },
     { "time": 2.948934240, "duration": 0.0, "confidence": 1.0, "value": 0.00349364 },
     { "time": 2.972154195, "duration": 0.0, "confidence": 1.0, "value": 0.00349891 },
-    { "time": 2.995374149, "duration": 0.0, "confidence": 1.0, "value": 0.00356645 },
+    { "time": 2.995374150, "duration": 0.0, "confidence": 1.0, "value": 0.00356645 },
     { "time": 3.018594104, "duration": 0.0, "confidence": 1.0, "value": 0.00353567 },
-    { "time": 3.041814058, "duration": 0.0, "confidence": 1.0, "value": 0.00360318 },
-    { "time": 3.065034013, "duration": 0.0, "confidence": 1.0, "value": 0.00359901 },
+    { "time": 3.041814059, "duration": 0.0, "confidence": 1.0, "value": 0.00360318 },
+    { "time": 3.065034014, "duration": 0.0, "confidence": 1.0, "value": 0.00359901 },
     { "time": 3.088253968, "duration": 0.0, "confidence": 1.0, "value": 0.00349811 },
-    { "time": 3.111473922, "duration": 0.0, "confidence": 1.0, "value": 0.00358849 },
-    { "time": 3.134693877, "duration": 0.0, "confidence": 1.0, "value": 0.00359128 },
+    { "time": 3.111473923, "duration": 0.0, "confidence": 1.0, "value": 0.00358849 },
+    { "time": 3.134693878, "duration": 0.0, "confidence": 1.0, "value": 0.00359128 },
     { "time": 3.157913832, "duration": 0.0, "confidence": 1.0, "value": 0.00352523 },
-    { "time": 3.181133786, "duration": 0.0, "confidence": 1.0, "value": 0.00360644 },
+    { "time": 3.181133787, "duration": 0.0, "confidence": 1.0, "value": 0.00360644 },
     { "time": 3.204353741, "duration": 0.0, "confidence": 1.0, "value": 0.00351975 },
     { "time": 3.227573696, "duration": 0.0, "confidence": 1.0, "value": 0.00360961 },
-    { "time": 3.250793650, "duration": 0.0, "confidence": 1.0, "value": 0.00353225 },
+    { "time": 3.250793651, "duration": 0.0, "confidence": 1.0, "value": 0.00353225 },
     { "time": 3.274013605, "duration": 0.0, "confidence": 1.0, "value": 0.00356697 },
     { "time": 3.297233560, "duration": 0.0, "confidence": 1.0, "value": 0.00342544 },
-    { "time": 3.320453514, "duration": 0.0, "confidence": 1.0, "value": 0.00356122 },
+    { "time": 3.320453515, "duration": 0.0, "confidence": 1.0, "value": 0.00356122 },
     { "time": 3.343673469, "duration": 0.0, "confidence": 1.0, "value": 0.00357135 },
     { "time": 3.366893424, "duration": 0.0, "confidence": 1.0, "value": 0.00352669 },
-    { "time": 3.390113378, "duration": 0.0, "confidence": 1.0, "value": 0.00359497 },
+    { "time": 3.390113379, "duration": 0.0, "confidence": 1.0, "value": 0.00359497 },
     { "time": 3.413333333, "duration": 0.0, "confidence": 1.0, "value": 0.00357022 },
-    { "time": 3.436553287, "duration": 0.0, "confidence": 1.0, "value": 0.00350066 },
-    { "time": 3.459773242, "duration": 0.0, "confidence": 1.0, "value": 0.00349705 },
+    { "time": 3.436553288, "duration": 0.0, "confidence": 1.0, "value": 0.00350066 },
+    { "time": 3.459773243, "duration": 0.0, "confidence": 1.0, "value": 0.00349705 },
     { "time": 3.482993197, "duration": 0.0, "confidence": 1.0, "value": 0.00350598 },
-    { "time": 3.506213151, "duration": 0.0, "confidence": 1.0, "value": 0.00357775 },
-    { "time": 3.529433106, "duration": 0.0, "confidence": 1.0, "value": 0.00352816 },
+    { "time": 3.506213152, "duration": 0.0, "confidence": 1.0, "value": 0.00357775 },
+    { "time": 3.529433107, "duration": 0.0, "confidence": 1.0, "value": 0.00352816 },
     { "time": 3.552653061, "duration": 0.0, "confidence": 1.0, "value": 0.00358455 },
-    { "time": 3.575873015, "duration": 0.0, "confidence": 1.0, "value": 0.00348071 },
-    { "time": 3.599092970, "duration": 0.0, "confidence": 1.0, "value": 0.00355185 },
+    { "time": 3.575873016, "duration": 0.0, "confidence": 1.0, "value": 0.00348071 },
+    { "time": 3.599092971, "duration": 0.0, "confidence": 1.0, "value": 0.00355185 },
     { "time": 3.622312925, "duration": 0.0, "confidence": 1.0, "value": 0.00350845 },
-    { "time": 3.645532879, "duration": 0.0, "confidence": 1.0, "value": 0.00360378 },
+    { "time": 3.645532880, "duration": 0.0, "confidence": 1.0, "value": 0.00360378 },
     { "time": 3.668752834, "duration": 0.0, "confidence": 1.0, "value": 0.00333629 },
     { "time": 3.691972789, "duration": 0.0, "confidence": 1.0, "value": 0.00341339 },
-    { "time": 3.715192743, "duration": 0.0, "confidence": 1.0, "value": 0.00345791 },
+    { "time": 3.715192744, "duration": 0.0, "confidence": 1.0, "value": 0.00345791 },
     { "time": 3.738412698, "duration": 0.0, "confidence": 1.0, "value": 0.00348351 },
     { "time": 3.761632653, "duration": 0.0, "confidence": 1.0, "value": 0.00349349 },
-    { "time": 3.784852607, "duration": 0.0, "confidence": 1.0, "value": 0.00354578 },
+    { "time": 3.784852608, "duration": 0.0, "confidence": 1.0, "value": 0.00354578 },
     { "time": 3.808072562, "duration": 0.0, "confidence": 1.0, "value": 0.00363189 },
     { "time": 3.831292517, "duration": 0.0, "confidence": 1.0, "value": 0.00352206 },
-    { "time": 3.854512471, "duration": 0.0, "confidence": 1.0, "value": 0.00369021 },
+    { "time": 3.854512472, "duration": 0.0, "confidence": 1.0, "value": 0.00369021 },
     { "time": 3.877732426, "duration": 0.0, "confidence": 1.0, "value": 0.00351326 },
-    { "time": 3.900952380, "duration": 0.0, "confidence": 1.0, "value": 0.00356962 },
-    { "time": 3.924172335, "duration": 0.0, "confidence": 1.0, "value": 0.00357592 },
+    { "time": 3.900952381, "duration": 0.0, "confidence": 1.0, "value": 0.00356962 },
+    { "time": 3.924172336, "duration": 0.0, "confidence": 1.0, "value": 0.00357592 },
     { "time": 3.947392290, "duration": 0.0, "confidence": 1.0, "value": 0.00349988 },
-    { "time": 3.970612244, "duration": 0.0, "confidence": 1.0, "value": 0.00349944 },
-    { "time": 3.993832199, "duration": 0.0, "confidence": 1.0, "value": 0.00355037 },
+    { "time": 3.970612245, "duration": 0.0, "confidence": 1.0, "value": 0.00349944 },
+    { "time": 3.993832200, "duration": 0.0, "confidence": 1.0, "value": 0.00355037 },
     { "time": 4.017052154, "duration": 0.0, "confidence": 1.0, "value": 0.00360133 },
-    { "time": 4.040272108, "duration": 0.0, "confidence": 1.0, "value": 0.00354759 },
+    { "time": 4.040272109, "duration": 0.0, "confidence": 1.0, "value": 0.00354759 },
     { "time": 4.063492063, "duration": 0.0, "confidence": 1.0, "value": 0.00354953 },
     { "time": 4.086712018, "duration": 0.0, "confidence": 1.0, "value": 0.0035587 },
-    { "time": 4.109931972, "duration": 0.0, "confidence": 1.0, "value": 0.00364969 },
+    { "time": 4.109931973, "duration": 0.0, "confidence": 1.0, "value": 0.00364969 },
     { "time": 4.133151927, "duration": 0.0, "confidence": 1.0, "value": 0.00345758 },
     { "time": 4.156371882, "duration": 0.0, "confidence": 1.0, "value": 0.00347695 },
-    { "time": 4.179591836, "duration": 0.0, "confidence": 1.0, "value": 0.00359545 },
+    { "time": 4.179591837, "duration": 0.0, "confidence": 1.0, "value": 0.00359545 },
     { "time": 4.202811791, "duration": 0.0, "confidence": 1.0, "value": 0.00353286 },
     { "time": 4.226031746, "duration": 0.0, "confidence": 1.0, "value": 0.00366958 },
-    { "time": 4.249251700, "duration": 0.0, "confidence": 1.0, "value": 0.00350838 },
+    { "time": 4.249251701, "duration": 0.0, "confidence": 1.0, "value": 0.00350838 },
     { "time": 4.272471655, "duration": 0.0, "confidence": 1.0, "value": 0.00353147 },
-    { "time": 4.295691609, "duration": 0.0, "confidence": 1.0, "value": 0.0036185 },
-    { "time": 4.318911564, "duration": 0.0, "confidence": 1.0, "value": 0.00349132 },
+    { "time": 4.295691610, "duration": 0.0, "confidence": 1.0, "value": 0.0036185 },
+    { "time": 4.318911565, "duration": 0.0, "confidence": 1.0, "value": 0.00349132 },
     { "time": 4.342131519, "duration": 0.0, "confidence": 1.0, "value": 0.00353897 },
-    { "time": 4.365351473, "duration": 0.0, "confidence": 1.0, "value": 0.00347904 },
-    { "time": 4.388571428, "duration": 0.0, "confidence": 1.0, "value": 0.00348759 },
+    { "time": 4.365351474, "duration": 0.0, "confidence": 1.0, "value": 0.00347904 },
+    { "time": 4.388571429, "duration": 0.0, "confidence": 1.0, "value": 0.00348759 },
     { "time": 4.411791383, "duration": 0.0, "confidence": 1.0, "value": 0.00358541 },
-    { "time": 4.435011337, "duration": 0.0, "confidence": 1.0, "value": 0.00349229 },
-    { "time": 4.458231292, "duration": 0.0, "confidence": 1.0, "value": 0.00357759 },
+    { "time": 4.435011338, "duration": 0.0, "confidence": 1.0, "value": 0.00349229 },
+    { "time": 4.458231293, "duration": 0.0, "confidence": 1.0, "value": 0.00357759 },
     { "time": 4.481451247, "duration": 0.0, "confidence": 1.0, "value": 0.00355427 },
-    { "time": 4.504671201, "duration": 0.0, "confidence": 1.0, "value": 0.00355063 },
+    { "time": 4.504671202, "duration": 0.0, "confidence": 1.0, "value": 0.00355063 },
     { "time": 4.527891156, "duration": 0.0, "confidence": 1.0, "value": 0.00358087 },
     { "time": 4.551111111, "duration": 0.0, "confidence": 1.0, "value": 0.00350815 },
-    { "time": 4.574331065, "duration": 0.0, "confidence": 1.0, "value": 0.00353843 },
+    { "time": 4.574331066, "duration": 0.0, "confidence": 1.0, "value": 0.00353843 },
     { "time": 4.597551020, "duration": 0.0, "confidence": 1.0, "value": 0.00354201 },
     { "time": 4.620770975, "duration": 0.0, "confidence": 1.0, "value": 0.00350497 },
-    { "time": 4.643990929, "duration": 0.0, "confidence": 1.0, "value": 0.00354671 },
+    { "time": 4.643990930, "duration": 0.0, "confidence": 1.0, "value": 0.00354671 },
     { "time": 4.667210884, "duration": 0.0, "confidence": 1.0, "value": 0.00353596 },
     { "time": 4.690430839, "duration": 0.0, "confidence": 1.0, "value": 0.00347371 },
-    { "time": 4.713650793, "duration": 0.0, "confidence": 1.0, "value": 0.0035368 },
+    { "time": 4.713650794, "duration": 0.0, "confidence": 1.0, "value": 0.0035368 },
     { "time": 4.736870748, "duration": 0.0, "confidence": 1.0, "value": 0.00360017 },
-    { "time": 4.760090702, "duration": 0.0, "confidence": 1.0, "value": 0.00352821 },
-    { "time": 4.783310657, "duration": 0.0, "confidence": 1.0, "value": 0.00359332 },
+    { "time": 4.760090703, "duration": 0.0, "confidence": 1.0, "value": 0.00352821 },
+    { "time": 4.783310658, "duration": 0.0, "confidence": 1.0, "value": 0.00359332 },
     { "time": 4.806530612, "duration": 0.0, "confidence": 1.0, "value": 0.00353742 },
-    { "time": 4.829750566, "duration": 0.0, "confidence": 1.0, "value": 0.00353795 },
-    { "time": 4.852970521, "duration": 0.0, "confidence": 1.0, "value": 0.00348792 },
+    { "time": 4.829750567, "duration": 0.0, "confidence": 1.0, "value": 0.00353795 },
+    { "time": 4.852970522, "duration": 0.0, "confidence": 1.0, "value": 0.00348792 },
     { "time": 4.876190476, "duration": 0.0, "confidence": 1.0, "value": 0.0034639 },
-    { "time": 4.899410430, "duration": 0.0, "confidence": 1.0, "value": 0.0036387 },
+    { "time": 4.899410431, "duration": 0.0, "confidence": 1.0, "value": 0.0036387 },
     { "time": 4.922630385, "duration": 0.0, "confidence": 1.0, "value": 0.00354102 },
     { "time": 4.945850340, "duration": 0.0, "confidence": 1.0, "value": 0.00351475 },
-    { "time": 4.969070294, "duration": 0.0, "confidence": 1.0, "value": 0.00356904 }
+    { "time": 4.969070295, "duration": 0.0, "confidence": 1.0, "value": 0.00356904 }
   ]
 }
 ]
--- a/tests/test-jams-writer/expected/af-2.json	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-jams-writer/expected/af-2.json	Fri Dec 02 10:04:44 2016 +0000
@@ -2,13 +2,13 @@
 "file_metadata": {
   "jams_version": "0.2.0",
   "identifiers": { "filename": "3clicks8.wav" },
-  "duration": 4.979659863
+  "duration": 4.979659864
 },
 "annotations": [
 {
   "namespace": "unknown",
   "annotation_metadata": {
-    "annotation_tools": "Sonic Annotator v1.3",
+    "annotation_tools": "Sonic Annotator v1.5",
     "data_source": "Automatic feature extraction",
     "annotator": {
       "plugin_id": "vamp:vamp-example-plugins:amplitudefollower",
@@ -21,220 +21,220 @@
   },
   "data": [
     { "time": 0.000000000, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 0.023219954, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 0.023219955, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 0.046439909, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 0.069659863, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 0.092879818, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 0.069659864, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 0.092879819, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 0.116099773, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 0.139319727, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 0.162539682, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 0.139319728, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 0.162539683, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 0.185759637, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 0.208979591, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 0.208979592, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 0.232199546, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 0.255419501, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 0.278639455, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 0.278639456, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 0.301859410, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 0.325079365, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 0.348299319, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 0.348299320, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 0.371519274, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 0.394739229, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 0.417959183, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 0.417959184, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 0.441179138, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 0.464399092, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 0.487619047, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 0.464399093, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 0.487619048, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 0.510839002, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 0.534058956, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 0.557278911, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 0.534058957, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 0.557278912, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 0.580498866, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 0.603718820, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 0.626938775, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 0.603718821, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 0.626938776, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 0.650158730, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 0.673378684, "duration": 0.0, "confidence": 1.0, "value": 0.0037 },
+    { "time": 0.673378685, "duration": 0.0, "confidence": 1.0, "value": 0.0037 },
     { "time": 0.696598639, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 0.719818594, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 0.743038548, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 0.743038549, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 0.766258503, "duration": 0.0, "confidence": 1.0, "value": 0.015 },
     { "time": 0.789478458, "duration": 0.0, "confidence": 1.0, "value": 0.0046 },
-    { "time": 0.812698412, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
+    { "time": 0.812698413, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
     { "time": 0.835918367, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 0.859138321, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 0.882358276, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 0.859138322, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 0.882358277, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 0.905578231, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 0.928798185, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 0.952018140, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 0.928798186, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 0.952018141, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 0.975238095, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 0.998458049, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 1.021678004, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 0.998458050, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 1.021678005, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 1.044897959, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 1.068117913, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 1.068117914, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 1.091337868, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 1.114557823, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 1.137777777, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 1.137777778, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 1.160997732, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 1.184217687, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 1.207437641, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
+    { "time": 1.207437642, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
     { "time": 1.230657596, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 1.253877551, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 1.277097505, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 1.277097506, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 1.300317460, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 1.323537414, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 1.346757369, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 1.323537415, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 1.346757370, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 1.369977324, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 1.393197278, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 1.416417233, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 1.393197279, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 1.416417234, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 1.439637188, "duration": 0.0, "confidence": 1.0, "value": 0.0037 },
-    { "time": 1.462857142, "duration": 0.0, "confidence": 1.0, "value": 0.0037 },
-    { "time": 1.486077097, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
+    { "time": 1.462857143, "duration": 0.0, "confidence": 1.0, "value": 0.0037 },
+    { "time": 1.486077098, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
     { "time": 1.509297052, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
-    { "time": 1.532517006, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 1.532517007, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 1.555736961, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 1.578956916, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 1.602176870, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 1.602176871, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 1.625396825, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 1.648616780, "duration": 0.0, "confidence": 1.0, "value": 0.012 },
-    { "time": 1.671836734, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 1.671836735, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 1.695056689, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 1.718276643, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 1.741496598, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 1.718276644, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 1.741496599, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 1.764716553, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
-    { "time": 1.787936507, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 1.811156462, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 1.787936508, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 1.811156463, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 1.834376417, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 1.857596371, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 1.880816326, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 1.857596372, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 1.880816327, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 1.904036281, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 1.927256235, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 1.927256236, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 1.950476190, "duration": 0.0, "confidence": 1.0, "value": 0.0037 },
     { "time": 1.973696145, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 1.996916099, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 1.996916100, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 2.020136054, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 2.043356009, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 2.066575963, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 2.066575964, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 2.089795918, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 2.113015873, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
-    { "time": 2.136235827, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 2.136235828, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 2.159455782, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 2.182675736, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 2.205895691, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 2.182675737, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 2.205895692, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 2.229115646, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 2.252335600, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 2.275555555, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 2.252335601, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 2.275555556, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 2.298775510, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 2.321995464, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 2.345215419, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
+    { "time": 2.321995465, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 2.345215420, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
     { "time": 2.368435374, "duration": 0.0, "confidence": 1.0, "value": 0.0037 },
-    { "time": 2.391655328, "duration": 0.0, "confidence": 1.0, "value": 0.0062 },
+    { "time": 2.391655329, "duration": 0.0, "confidence": 1.0, "value": 0.0062 },
     { "time": 2.414875283, "duration": 0.0, "confidence": 1.0, "value": 0.014 },
     { "time": 2.438095238, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 2.461315192, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 2.461315193, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 2.484535147, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 2.507755102, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 2.530975056, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
+    { "time": 2.530975057, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
     { "time": 2.554195011, "duration": 0.0, "confidence": 1.0, "value": 0.0037 },
-    { "time": 2.577414965, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
-    { "time": 2.600634920, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 2.577414966, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
+    { "time": 2.600634921, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 2.623854875, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 2.647074829, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 2.670294784, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 2.647074830, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 2.670294785, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 2.693514739, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 2.716734693, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 2.739954648, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 2.716734694, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 2.739954649, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 2.763174603, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 2.786394557, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
+    { "time": 2.786394558, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
     { "time": 2.809614512, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 2.832834467, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 2.856054421, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
+    { "time": 2.856054422, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
     { "time": 2.879274376, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 2.902494331, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 2.925714285, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 2.925714286, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 2.948934240, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 2.972154195, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 2.995374149, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 2.995374150, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 3.018594104, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 3.041814058, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 3.065034013, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 3.041814059, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 3.065034014, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 3.088253968, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 3.111473922, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 3.134693877, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 3.111473923, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 3.134693878, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 3.157913832, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 3.181133786, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 3.181133787, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 3.204353741, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 3.227573696, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 3.250793650, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 3.250793651, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 3.274013605, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 3.297233560, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
-    { "time": 3.320453514, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 3.320453515, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 3.343673469, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 3.366893424, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 3.390113378, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 3.390113379, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 3.413333333, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 3.436553287, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 3.459773242, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 3.436553288, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 3.459773243, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 3.482993197, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 3.506213151, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 3.529433106, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 3.506213152, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 3.529433107, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 3.552653061, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 3.575873015, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 3.599092970, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 3.575873016, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 3.599092971, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 3.622312925, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 3.645532879, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 3.645532880, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 3.668752834, "duration": 0.0, "confidence": 1.0, "value": 0.0033 },
     { "time": 3.691972789, "duration": 0.0, "confidence": 1.0, "value": 0.0034 },
-    { "time": 3.715192743, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 3.715192744, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 3.738412698, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 3.761632653, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 3.784852607, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 3.784852608, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 3.808072562, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 3.831292517, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 3.854512471, "duration": 0.0, "confidence": 1.0, "value": 0.0037 },
+    { "time": 3.854512472, "duration": 0.0, "confidence": 1.0, "value": 0.0037 },
     { "time": 3.877732426, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 3.900952380, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 3.924172335, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 3.900952381, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 3.924172336, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 3.947392290, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 3.970612244, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 3.993832199, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 3.970612245, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 3.993832200, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 4.017052154, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 4.040272108, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 4.040272109, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 4.063492063, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 4.086712018, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 4.109931972, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 4.109931973, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 4.133151927, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 4.156371882, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 4.179591836, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 4.179591837, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 4.202811791, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 4.226031746, "duration": 0.0, "confidence": 1.0, "value": 0.0037 },
-    { "time": 4.249251700, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 4.249251701, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 4.272471655, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 4.295691609, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 4.318911564, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 4.295691610, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 4.318911565, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 4.342131519, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 4.365351473, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 4.388571428, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 4.365351474, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 4.388571429, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 4.411791383, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 4.435011337, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 4.458231292, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 4.435011338, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 4.458231293, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 4.481451247, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 4.504671201, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 4.504671202, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 4.527891156, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 4.551111111, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 4.574331065, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 4.574331066, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 4.597551020, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 4.620770975, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 4.643990929, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 4.643990930, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 4.667210884, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 4.690430839, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 4.713650793, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 4.713650794, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 4.736870748, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
-    { "time": 4.760090702, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 4.783310657, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 4.760090703, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 4.783310658, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 4.806530612, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 4.829750566, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 4.852970521, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 4.829750567, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
+    { "time": 4.852970522, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 4.876190476, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 4.899410430, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
+    { "time": 4.899410431, "duration": 0.0, "confidence": 1.0, "value": 0.0036 },
     { "time": 4.922630385, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
     { "time": 4.945850340, "duration": 0.0, "confidence": 1.0, "value": 0.0035 },
-    { "time": 4.969070294, "duration": 0.0, "confidence": 1.0, "value": 0.0036 }
+    { "time": 4.969070295, "duration": 0.0, "confidence": 1.0, "value": 0.0036 }
   ]
 }
 ]
--- a/tests/test-jams-writer/expected/af-6.json	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-jams-writer/expected/af-6.json	Fri Dec 02 10:04:44 2016 +0000
@@ -2,13 +2,13 @@
 "file_metadata": {
   "jams_version": "0.2.0",
   "identifiers": { "filename": "3clicks8.wav" },
-  "duration": 4.979659863
+  "duration": 4.979659864
 },
 "annotations": [
 {
   "namespace": "unknown",
   "annotation_metadata": {
-    "annotation_tools": "Sonic Annotator v1.3",
+    "annotation_tools": "Sonic Annotator v1.5",
     "data_source": "Automatic feature extraction",
     "annotator": {
       "plugin_id": "vamp:vamp-example-plugins:amplitudefollower",
@@ -21,220 +21,220 @@
   },
   "data": [
     { "time": 0.000000000, "duration": 0.0, "confidence": 1.0, "value": 0.00359596 },
-    { "time": 0.023219954, "duration": 0.0, "confidence": 1.0, "value": 0.00351864 },
+    { "time": 0.023219955, "duration": 0.0, "confidence": 1.0, "value": 0.00351864 },
     { "time": 0.046439909, "duration": 0.0, "confidence": 1.0, "value": 0.00357167 },
-    { "time": 0.069659863, "duration": 0.0, "confidence": 1.0, "value": 0.00358918 },
-    { "time": 0.092879818, "duration": 0.0, "confidence": 1.0, "value": 0.00359586 },
+    { "time": 0.069659864, "duration": 0.0, "confidence": 1.0, "value": 0.00358918 },
+    { "time": 0.092879819, "duration": 0.0, "confidence": 1.0, "value": 0.00359586 },
     { "time": 0.116099773, "duration": 0.0, "confidence": 1.0, "value": 0.00352171 },
-    { "time": 0.139319727, "duration": 0.0, "confidence": 1.0, "value": 0.00353074 },
-    { "time": 0.162539682, "duration": 0.0, "confidence": 1.0, "value": 0.00354993 },
+    { "time": 0.139319728, "duration": 0.0, "confidence": 1.0, "value": 0.00353074 },
+    { "time": 0.162539683, "duration": 0.0, "confidence": 1.0, "value": 0.00354993 },
     { "time": 0.185759637, "duration": 0.0, "confidence": 1.0, "value": 0.00354264 },
-    { "time": 0.208979591, "duration": 0.0, "confidence": 1.0, "value": 0.00352689 },
+    { "time": 0.208979592, "duration": 0.0, "confidence": 1.0, "value": 0.00352689 },
     { "time": 0.232199546, "duration": 0.0, "confidence": 1.0, "value": 0.00360165 },
     { "time": 0.255419501, "duration": 0.0, "confidence": 1.0, "value": 0.00361172 },
-    { "time": 0.278639455, "duration": 0.0, "confidence": 1.0, "value": 0.00361564 },
+    { "time": 0.278639456, "duration": 0.0, "confidence": 1.0, "value": 0.00361564 },
     { "time": 0.301859410, "duration": 0.0, "confidence": 1.0, "value": 0.0035339 },
     { "time": 0.325079365, "duration": 0.0, "confidence": 1.0, "value": 0.00361025 },
-    { "time": 0.348299319, "duration": 0.0, "confidence": 1.0, "value": 0.00352643 },
+    { "time": 0.348299320, "duration": 0.0, "confidence": 1.0, "value": 0.00352643 },
     { "time": 0.371519274, "duration": 0.0, "confidence": 1.0, "value": 0.00355937 },
     { "time": 0.394739229, "duration": 0.0, "confidence": 1.0, "value": 0.00353683 },
-    { "time": 0.417959183, "duration": 0.0, "confidence": 1.0, "value": 0.00358946 },
+    { "time": 0.417959184, "duration": 0.0, "confidence": 1.0, "value": 0.00358946 },
     { "time": 0.441179138, "duration": 0.0, "confidence": 1.0, "value": 0.00363629 },
-    { "time": 0.464399092, "duration": 0.0, "confidence": 1.0, "value": 0.00354152 },
-    { "time": 0.487619047, "duration": 0.0, "confidence": 1.0, "value": 0.00348666 },
+    { "time": 0.464399093, "duration": 0.0, "confidence": 1.0, "value": 0.00354152 },
+    { "time": 0.487619048, "duration": 0.0, "confidence": 1.0, "value": 0.00348666 },
     { "time": 0.510839002, "duration": 0.0, "confidence": 1.0, "value": 0.00352516 },
-    { "time": 0.534058956, "duration": 0.0, "confidence": 1.0, "value": 0.00352261 },
-    { "time": 0.557278911, "duration": 0.0, "confidence": 1.0, "value": 0.00350301 },
+    { "time": 0.534058957, "duration": 0.0, "confidence": 1.0, "value": 0.00352261 },
+    { "time": 0.557278912, "duration": 0.0, "confidence": 1.0, "value": 0.00350301 },
     { "time": 0.580498866, "duration": 0.0, "confidence": 1.0, "value": 0.00352414 },
-    { "time": 0.603718820, "duration": 0.0, "confidence": 1.0, "value": 0.00351352 },
-    { "time": 0.626938775, "duration": 0.0, "confidence": 1.0, "value": 0.00345411 },
+    { "time": 0.603718821, "duration": 0.0, "confidence": 1.0, "value": 0.00351352 },
+    { "time": 0.626938776, "duration": 0.0, "confidence": 1.0, "value": 0.00345411 },
     { "time": 0.650158730, "duration": 0.0, "confidence": 1.0, "value": 0.00363914 },
-    { "time": 0.673378684, "duration": 0.0, "confidence": 1.0, "value": 0.00370925 },
+    { "time": 0.673378685, "duration": 0.0, "confidence": 1.0, "value": 0.00370925 },
     { "time": 0.696598639, "duration": 0.0, "confidence": 1.0, "value": 0.00348075 },
     { "time": 0.719818594, "duration": 0.0, "confidence": 1.0, "value": 0.0034814 },
-    { "time": 0.743038548, "duration": 0.0, "confidence": 1.0, "value": 0.00362525 },
+    { "time": 0.743038549, "duration": 0.0, "confidence": 1.0, "value": 0.00362525 },
     { "time": 0.766258503, "duration": 0.0, "confidence": 1.0, "value": 0.0146151 },
     { "time": 0.789478458, "duration": 0.0, "confidence": 1.0, "value": 0.00458446 },
-    { "time": 0.812698412, "duration": 0.0, "confidence": 1.0, "value": 0.00342316 },
+    { "time": 0.812698413, "duration": 0.0, "confidence": 1.0, "value": 0.00342316 },
     { "time": 0.835918367, "duration": 0.0, "confidence": 1.0, "value": 0.0036135 },
-    { "time": 0.859138321, "duration": 0.0, "confidence": 1.0, "value": 0.00352045 },
-    { "time": 0.882358276, "duration": 0.0, "confidence": 1.0, "value": 0.0036266 },
+    { "time": 0.859138322, "duration": 0.0, "confidence": 1.0, "value": 0.00352045 },
+    { "time": 0.882358277, "duration": 0.0, "confidence": 1.0, "value": 0.0036266 },
     { "time": 0.905578231, "duration": 0.0, "confidence": 1.0, "value": 0.00357805 },
-    { "time": 0.928798185, "duration": 0.0, "confidence": 1.0, "value": 0.00355937 },
-    { "time": 0.952018140, "duration": 0.0, "confidence": 1.0, "value": 0.00350579 },
+    { "time": 0.928798186, "duration": 0.0, "confidence": 1.0, "value": 0.00355937 },
+    { "time": 0.952018141, "duration": 0.0, "confidence": 1.0, "value": 0.00350579 },
     { "time": 0.975238095, "duration": 0.0, "confidence": 1.0, "value": 0.00359969 },
-    { "time": 0.998458049, "duration": 0.0, "confidence": 1.0, "value": 0.00352854 },
-    { "time": 1.021678004, "duration": 0.0, "confidence": 1.0, "value": 0.00353486 },
+    { "time": 0.998458050, "duration": 0.0, "confidence": 1.0, "value": 0.00352854 },
+    { "time": 1.021678005, "duration": 0.0, "confidence": 1.0, "value": 0.00353486 },
     { "time": 1.044897959, "duration": 0.0, "confidence": 1.0, "value": 0.00355259 },
-    { "time": 1.068117913, "duration": 0.0, "confidence": 1.0, "value": 0.00347951 },
+    { "time": 1.068117914, "duration": 0.0, "confidence": 1.0, "value": 0.00347951 },
     { "time": 1.091337868, "duration": 0.0, "confidence": 1.0, "value": 0.00361734 },
     { "time": 1.114557823, "duration": 0.0, "confidence": 1.0, "value": 0.00351861 },
-    { "time": 1.137777777, "duration": 0.0, "confidence": 1.0, "value": 0.00351437 },
+    { "time": 1.137777778, "duration": 0.0, "confidence": 1.0, "value": 0.00351437 },
     { "time": 1.160997732, "duration": 0.0, "confidence": 1.0, "value": 0.00352971 },
     { "time": 1.184217687, "duration": 0.0, "confidence": 1.0, "value": 0.00360414 },
-    { "time": 1.207437641, "duration": 0.0, "confidence": 1.0, "value": 0.0034343 },
+    { "time": 1.207437642, "duration": 0.0, "confidence": 1.0, "value": 0.0034343 },
     { "time": 1.230657596, "duration": 0.0, "confidence": 1.0, "value": 0.00358201 },
     { "time": 1.253877551, "duration": 0.0, "confidence": 1.0, "value": 0.00361252 },
-    { "time": 1.277097505, "duration": 0.0, "confidence": 1.0, "value": 0.00361165 },
+    { "time": 1.277097506, "duration": 0.0, "confidence": 1.0, "value": 0.00361165 },
     { "time": 1.300317460, "duration": 0.0, "confidence": 1.0, "value": 0.00355763 },
-    { "time": 1.323537414, "duration": 0.0, "confidence": 1.0, "value": 0.00353226 },
-    { "time": 1.346757369, "duration": 0.0, "confidence": 1.0, "value": 0.00349109 },
+    { "time": 1.323537415, "duration": 0.0, "confidence": 1.0, "value": 0.00353226 },
+    { "time": 1.346757370, "duration": 0.0, "confidence": 1.0, "value": 0.00349109 },
     { "time": 1.369977324, "duration": 0.0, "confidence": 1.0, "value": 0.00352628 },
-    { "time": 1.393197278, "duration": 0.0, "confidence": 1.0, "value": 0.00348415 },
-    { "time": 1.416417233, "duration": 0.0, "confidence": 1.0, "value": 0.00354576 },
+    { "time": 1.393197279, "duration": 0.0, "confidence": 1.0, "value": 0.00348415 },
+    { "time": 1.416417234, "duration": 0.0, "confidence": 1.0, "value": 0.00354576 },
     { "time": 1.439637188, "duration": 0.0, "confidence": 1.0, "value": 0.00369414 },
-    { "time": 1.462857142, "duration": 0.0, "confidence": 1.0, "value": 0.00367139 },
-    { "time": 1.486077097, "duration": 0.0, "confidence": 1.0, "value": 0.00342798 },
+    { "time": 1.462857143, "duration": 0.0, "confidence": 1.0, "value": 0.00367139 },
+    { "time": 1.486077098, "duration": 0.0, "confidence": 1.0, "value": 0.00342798 },
     { "time": 1.509297052, "duration": 0.0, "confidence": 1.0, "value": 0.00338209 },
-    { "time": 1.532517006, "duration": 0.0, "confidence": 1.0, "value": 0.00351023 },
+    { "time": 1.532517007, "duration": 0.0, "confidence": 1.0, "value": 0.00351023 },
     { "time": 1.555736961, "duration": 0.0, "confidence": 1.0, "value": 0.00346643 },
     { "time": 1.578956916, "duration": 0.0, "confidence": 1.0, "value": 0.00346979 },
-    { "time": 1.602176870, "duration": 0.0, "confidence": 1.0, "value": 0.00348269 },
+    { "time": 1.602176871, "duration": 0.0, "confidence": 1.0, "value": 0.00348269 },
     { "time": 1.625396825, "duration": 0.0, "confidence": 1.0, "value": 0.00348368 },
     { "time": 1.648616780, "duration": 0.0, "confidence": 1.0, "value": 0.01162 },
-    { "time": 1.671836734, "duration": 0.0, "confidence": 1.0, "value": 0.00359211 },
+    { "time": 1.671836735, "duration": 0.0, "confidence": 1.0, "value": 0.00359211 },
     { "time": 1.695056689, "duration": 0.0, "confidence": 1.0, "value": 0.00360249 },
-    { "time": 1.718276643, "duration": 0.0, "confidence": 1.0, "value": 0.00352957 },
-    { "time": 1.741496598, "duration": 0.0, "confidence": 1.0, "value": 0.00349559 },
+    { "time": 1.718276644, "duration": 0.0, "confidence": 1.0, "value": 0.00352957 },
+    { "time": 1.741496599, "duration": 0.0, "confidence": 1.0, "value": 0.00349559 },
     { "time": 1.764716553, "duration": 0.0, "confidence": 1.0, "value": 0.00344387 },
-    { "time": 1.787936507, "duration": 0.0, "confidence": 1.0, "value": 0.00352666 },
-    { "time": 1.811156462, "duration": 0.0, "confidence": 1.0, "value": 0.0035248 },
+    { "time": 1.787936508, "duration": 0.0, "confidence": 1.0, "value": 0.00352666 },
+    { "time": 1.811156463, "duration": 0.0, "confidence": 1.0, "value": 0.0035248 },
     { "time": 1.834376417, "duration": 0.0, "confidence": 1.0, "value": 0.00353289 },
-    { "time": 1.857596371, "duration": 0.0, "confidence": 1.0, "value": 0.00353361 },
-    { "time": 1.880816326, "duration": 0.0, "confidence": 1.0, "value": 0.00348838 },
+    { "time": 1.857596372, "duration": 0.0, "confidence": 1.0, "value": 0.00353361 },
+    { "time": 1.880816327, "duration": 0.0, "confidence": 1.0, "value": 0.00348838 },
     { "time": 1.904036281, "duration": 0.0, "confidence": 1.0, "value": 0.00355124 },
-    { "time": 1.927256235, "duration": 0.0, "confidence": 1.0, "value": 0.00349487 },
+    { "time": 1.927256236, "duration": 0.0, "confidence": 1.0, "value": 0.00349487 },
     { "time": 1.950476190, "duration": 0.0, "confidence": 1.0, "value": 0.0036614 },
     { "time": 1.973696145, "duration": 0.0, "confidence": 1.0, "value": 0.00358802 },
-    { "time": 1.996916099, "duration": 0.0, "confidence": 1.0, "value": 0.00351078 },
+    { "time": 1.996916100, "duration": 0.0, "confidence": 1.0, "value": 0.00351078 },
     { "time": 2.020136054, "duration": 0.0, "confidence": 1.0, "value": 0.00351788 },
     { "time": 2.043356009, "duration": 0.0, "confidence": 1.0, "value": 0.00345998 },
-    { "time": 2.066575963, "duration": 0.0, "confidence": 1.0, "value": 0.00359541 },
+    { "time": 2.066575964, "duration": 0.0, "confidence": 1.0, "value": 0.00359541 },
     { "time": 2.089795918, "duration": 0.0, "confidence": 1.0, "value": 0.00363803 },
     { "time": 2.113015873, "duration": 0.0, "confidence": 1.0, "value": 0.00341127 },
-    { "time": 2.136235827, "duration": 0.0, "confidence": 1.0, "value": 0.00358579 },
+    { "time": 2.136235828, "duration": 0.0, "confidence": 1.0, "value": 0.00358579 },
     { "time": 2.159455782, "duration": 0.0, "confidence": 1.0, "value": 0.00358391 },
-    { "time": 2.182675736, "duration": 0.0, "confidence": 1.0, "value": 0.00349291 },
-    { "time": 2.205895691, "duration": 0.0, "confidence": 1.0, "value": 0.00350593 },
+    { "time": 2.182675737, "duration": 0.0, "confidence": 1.0, "value": 0.00349291 },
+    { "time": 2.205895692, "duration": 0.0, "confidence": 1.0, "value": 0.00350593 },
     { "time": 2.229115646, "duration": 0.0, "confidence": 1.0, "value": 0.00347529 },
-    { "time": 2.252335600, "duration": 0.0, "confidence": 1.0, "value": 0.00358021 },
-    { "time": 2.275555555, "duration": 0.0, "confidence": 1.0, "value": 0.00353051 },
+    { "time": 2.252335601, "duration": 0.0, "confidence": 1.0, "value": 0.00358021 },
+    { "time": 2.275555556, "duration": 0.0, "confidence": 1.0, "value": 0.00353051 },
     { "time": 2.298775510, "duration": 0.0, "confidence": 1.0, "value": 0.00360463 },
-    { "time": 2.321995464, "duration": 0.0, "confidence": 1.0, "value": 0.00357421 },
-    { "time": 2.345215419, "duration": 0.0, "confidence": 1.0, "value": 0.00343617 },
+    { "time": 2.321995465, "duration": 0.0, "confidence": 1.0, "value": 0.00357421 },
+    { "time": 2.345215420, "duration": 0.0, "confidence": 1.0, "value": 0.00343617 },
     { "time": 2.368435374, "duration": 0.0, "confidence": 1.0, "value": 0.00367464 },
-    { "time": 2.391655328, "duration": 0.0, "confidence": 1.0, "value": 0.00623882 },
+    { "time": 2.391655329, "duration": 0.0, "confidence": 1.0, "value": 0.00623882 },
     { "time": 2.414875283, "duration": 0.0, "confidence": 1.0, "value": 0.0139992 },
     { "time": 2.438095238, "duration": 0.0, "confidence": 1.0, "value": 0.00347958 },
-    { "time": 2.461315192, "duration": 0.0, "confidence": 1.0, "value": 0.00348231 },
+    { "time": 2.461315193, "duration": 0.0, "confidence": 1.0, "value": 0.00348231 },
     { "time": 2.484535147, "duration": 0.0, "confidence": 1.0, "value": 0.0035482 },
     { "time": 2.507755102, "duration": 0.0, "confidence": 1.0, "value": 0.00350744 },
-    { "time": 2.530975056, "duration": 0.0, "confidence": 1.0, "value": 0.00342298 },
+    { "time": 2.530975057, "duration": 0.0, "confidence": 1.0, "value": 0.00342298 },
     { "time": 2.554195011, "duration": 0.0, "confidence": 1.0, "value": 0.00366419 },
-    { "time": 2.577414965, "duration": 0.0, "confidence": 1.0, "value": 0.0034377 },
-    { "time": 2.600634920, "duration": 0.0, "confidence": 1.0, "value": 0.00356318 },
+    { "time": 2.577414966, "duration": 0.0, "confidence": 1.0, "value": 0.0034377 },
+    { "time": 2.600634921, "duration": 0.0, "confidence": 1.0, "value": 0.00356318 },
     { "time": 2.623854875, "duration": 0.0, "confidence": 1.0, "value": 0.00354368 },
-    { "time": 2.647074829, "duration": 0.0, "confidence": 1.0, "value": 0.00360324 },
-    { "time": 2.670294784, "duration": 0.0, "confidence": 1.0, "value": 0.00354322 },
+    { "time": 2.647074830, "duration": 0.0, "confidence": 1.0, "value": 0.00360324 },
+    { "time": 2.670294785, "duration": 0.0, "confidence": 1.0, "value": 0.00354322 },
     { "time": 2.693514739, "duration": 0.0, "confidence": 1.0, "value": 0.0035675 },
-    { "time": 2.716734693, "duration": 0.0, "confidence": 1.0, "value": 0.00346242 },
-    { "time": 2.739954648, "duration": 0.0, "confidence": 1.0, "value": 0.00348647 },
+    { "time": 2.716734694, "duration": 0.0, "confidence": 1.0, "value": 0.00346242 },
+    { "time": 2.739954649, "duration": 0.0, "confidence": 1.0, "value": 0.00348647 },
     { "time": 2.763174603, "duration": 0.0, "confidence": 1.0, "value": 0.0034772 },
-    { "time": 2.786394557, "duration": 0.0, "confidence": 1.0, "value": 0.00344762 },
+    { "time": 2.786394558, "duration": 0.0, "confidence": 1.0, "value": 0.00344762 },
     { "time": 2.809614512, "duration": 0.0, "confidence": 1.0, "value": 0.00352104 },
     { "time": 2.832834467, "duration": 0.0, "confidence": 1.0, "value": 0.00355933 },
-    { "time": 2.856054421, "duration": 0.0, "confidence": 1.0, "value": 0.00340756 },
+    { "time": 2.856054422, "duration": 0.0, "confidence": 1.0, "value": 0.00340756 },
     { "time": 2.879274376, "duration": 0.0, "confidence": 1.0, "value": 0.00349975 },
     { "time": 2.902494331, "duration": 0.0, "confidence": 1.0, "value": 0.00348265 },
-    { "time": 2.925714285, "duration": 0.0, "confidence": 1.0, "value": 0.00354504 },
+    { "time": 2.925714286, "duration": 0.0, "confidence": 1.0, "value": 0.00354504 },
     { "time": 2.948934240, "duration": 0.0, "confidence": 1.0, "value": 0.00349364 },
     { "time": 2.972154195, "duration": 0.0, "confidence": 1.0, "value": 0.00349891 },
-    { "time": 2.995374149, "duration": 0.0, "confidence": 1.0, "value": 0.00356645 },
+    { "time": 2.995374150, "duration": 0.0, "confidence": 1.0, "value": 0.00356645 },
     { "time": 3.018594104, "duration": 0.0, "confidence": 1.0, "value": 0.00353567 },
-    { "time": 3.041814058, "duration": 0.0, "confidence": 1.0, "value": 0.00360318 },
-    { "time": 3.065034013, "duration": 0.0, "confidence": 1.0, "value": 0.00359901 },
+    { "time": 3.041814059, "duration": 0.0, "confidence": 1.0, "value": 0.00360318 },
+    { "time": 3.065034014, "duration": 0.0, "confidence": 1.0, "value": 0.00359901 },
     { "time": 3.088253968, "duration": 0.0, "confidence": 1.0, "value": 0.00349811 },
-    { "time": 3.111473922, "duration": 0.0, "confidence": 1.0, "value": 0.00358849 },
-    { "time": 3.134693877, "duration": 0.0, "confidence": 1.0, "value": 0.00359128 },
+    { "time": 3.111473923, "duration": 0.0, "confidence": 1.0, "value": 0.00358849 },
+    { "time": 3.134693878, "duration": 0.0, "confidence": 1.0, "value": 0.00359128 },
     { "time": 3.157913832, "duration": 0.0, "confidence": 1.0, "value": 0.00352523 },
-    { "time": 3.181133786, "duration": 0.0, "confidence": 1.0, "value": 0.00360644 },
+    { "time": 3.181133787, "duration": 0.0, "confidence": 1.0, "value": 0.00360644 },
     { "time": 3.204353741, "duration": 0.0, "confidence": 1.0, "value": 0.00351975 },
     { "time": 3.227573696, "duration": 0.0, "confidence": 1.0, "value": 0.00360961 },
-    { "time": 3.250793650, "duration": 0.0, "confidence": 1.0, "value": 0.00353225 },
+    { "time": 3.250793651, "duration": 0.0, "confidence": 1.0, "value": 0.00353225 },
     { "time": 3.274013605, "duration": 0.0, "confidence": 1.0, "value": 0.00356697 },
     { "time": 3.297233560, "duration": 0.0, "confidence": 1.0, "value": 0.00342544 },
-    { "time": 3.320453514, "duration": 0.0, "confidence": 1.0, "value": 0.00356122 },
+    { "time": 3.320453515, "duration": 0.0, "confidence": 1.0, "value": 0.00356122 },
     { "time": 3.343673469, "duration": 0.0, "confidence": 1.0, "value": 0.00357135 },
     { "time": 3.366893424, "duration": 0.0, "confidence": 1.0, "value": 0.00352669 },
-    { "time": 3.390113378, "duration": 0.0, "confidence": 1.0, "value": 0.00359497 },
+    { "time": 3.390113379, "duration": 0.0, "confidence": 1.0, "value": 0.00359497 },
     { "time": 3.413333333, "duration": 0.0, "confidence": 1.0, "value": 0.00357022 },
-    { "time": 3.436553287, "duration": 0.0, "confidence": 1.0, "value": 0.00350066 },
-    { "time": 3.459773242, "duration": 0.0, "confidence": 1.0, "value": 0.00349705 },
+    { "time": 3.436553288, "duration": 0.0, "confidence": 1.0, "value": 0.00350066 },
+    { "time": 3.459773243, "duration": 0.0, "confidence": 1.0, "value": 0.00349705 },
     { "time": 3.482993197, "duration": 0.0, "confidence": 1.0, "value": 0.00350598 },
-    { "time": 3.506213151, "duration": 0.0, "confidence": 1.0, "value": 0.00357775 },
-    { "time": 3.529433106, "duration": 0.0, "confidence": 1.0, "value": 0.00352816 },
+    { "time": 3.506213152, "duration": 0.0, "confidence": 1.0, "value": 0.00357775 },
+    { "time": 3.529433107, "duration": 0.0, "confidence": 1.0, "value": 0.00352816 },
     { "time": 3.552653061, "duration": 0.0, "confidence": 1.0, "value": 0.00358455 },
-    { "time": 3.575873015, "duration": 0.0, "confidence": 1.0, "value": 0.00348071 },
-    { "time": 3.599092970, "duration": 0.0, "confidence": 1.0, "value": 0.00355185 },
+    { "time": 3.575873016, "duration": 0.0, "confidence": 1.0, "value": 0.00348071 },
+    { "time": 3.599092971, "duration": 0.0, "confidence": 1.0, "value": 0.00355185 },
     { "time": 3.622312925, "duration": 0.0, "confidence": 1.0, "value": 0.00350845 },
-    { "time": 3.645532879, "duration": 0.0, "confidence": 1.0, "value": 0.00360378 },
+    { "time": 3.645532880, "duration": 0.0, "confidence": 1.0, "value": 0.00360378 },
     { "time": 3.668752834, "duration": 0.0, "confidence": 1.0, "value": 0.00333629 },
     { "time": 3.691972789, "duration": 0.0, "confidence": 1.0, "value": 0.00341339 },
-    { "time": 3.715192743, "duration": 0.0, "confidence": 1.0, "value": 0.00345791 },
+    { "time": 3.715192744, "duration": 0.0, "confidence": 1.0, "value": 0.00345791 },
     { "time": 3.738412698, "duration": 0.0, "confidence": 1.0, "value": 0.00348351 },
     { "time": 3.761632653, "duration": 0.0, "confidence": 1.0, "value": 0.00349349 },
-    { "time": 3.784852607, "duration": 0.0, "confidence": 1.0, "value": 0.00354578 },
+    { "time": 3.784852608, "duration": 0.0, "confidence": 1.0, "value": 0.00354578 },
     { "time": 3.808072562, "duration": 0.0, "confidence": 1.0, "value": 0.00363189 },
     { "time": 3.831292517, "duration": 0.0, "confidence": 1.0, "value": 0.00352206 },
-    { "time": 3.854512471, "duration": 0.0, "confidence": 1.0, "value": 0.00369021 },
+    { "time": 3.854512472, "duration": 0.0, "confidence": 1.0, "value": 0.00369021 },
     { "time": 3.877732426, "duration": 0.0, "confidence": 1.0, "value": 0.00351326 },
-    { "time": 3.900952380, "duration": 0.0, "confidence": 1.0, "value": 0.00356962 },
-    { "time": 3.924172335, "duration": 0.0, "confidence": 1.0, "value": 0.00357592 },
+    { "time": 3.900952381, "duration": 0.0, "confidence": 1.0, "value": 0.00356962 },
+    { "time": 3.924172336, "duration": 0.0, "confidence": 1.0, "value": 0.00357592 },
     { "time": 3.947392290, "duration": 0.0, "confidence": 1.0, "value": 0.00349988 },
-    { "time": 3.970612244, "duration": 0.0, "confidence": 1.0, "value": 0.00349944 },
-    { "time": 3.993832199, "duration": 0.0, "confidence": 1.0, "value": 0.00355037 },
+    { "time": 3.970612245, "duration": 0.0, "confidence": 1.0, "value": 0.00349944 },
+    { "time": 3.993832200, "duration": 0.0, "confidence": 1.0, "value": 0.00355037 },
     { "time": 4.017052154, "duration": 0.0, "confidence": 1.0, "value": 0.00360133 },
-    { "time": 4.040272108, "duration": 0.0, "confidence": 1.0, "value": 0.00354759 },
+    { "time": 4.040272109, "duration": 0.0, "confidence": 1.0, "value": 0.00354759 },
     { "time": 4.063492063, "duration": 0.0, "confidence": 1.0, "value": 0.00354953 },
     { "time": 4.086712018, "duration": 0.0, "confidence": 1.0, "value": 0.0035587 },
-    { "time": 4.109931972, "duration": 0.0, "confidence": 1.0, "value": 0.00364969 },
+    { "time": 4.109931973, "duration": 0.0, "confidence": 1.0, "value": 0.00364969 },
     { "time": 4.133151927, "duration": 0.0, "confidence": 1.0, "value": 0.00345758 },
     { "time": 4.156371882, "duration": 0.0, "confidence": 1.0, "value": 0.00347695 },
-    { "time": 4.179591836, "duration": 0.0, "confidence": 1.0, "value": 0.00359545 },
+    { "time": 4.179591837, "duration": 0.0, "confidence": 1.0, "value": 0.00359545 },
     { "time": 4.202811791, "duration": 0.0, "confidence": 1.0, "value": 0.00353286 },
     { "time": 4.226031746, "duration": 0.0, "confidence": 1.0, "value": 0.00366958 },
-    { "time": 4.249251700, "duration": 0.0, "confidence": 1.0, "value": 0.00350838 },
+    { "time": 4.249251701, "duration": 0.0, "confidence": 1.0, "value": 0.00350838 },
     { "time": 4.272471655, "duration": 0.0, "confidence": 1.0, "value": 0.00353147 },
-    { "time": 4.295691609, "duration": 0.0, "confidence": 1.0, "value": 0.0036185 },
-    { "time": 4.318911564, "duration": 0.0, "confidence": 1.0, "value": 0.00349132 },
+    { "time": 4.295691610, "duration": 0.0, "confidence": 1.0, "value": 0.0036185 },
+    { "time": 4.318911565, "duration": 0.0, "confidence": 1.0, "value": 0.00349132 },
     { "time": 4.342131519, "duration": 0.0, "confidence": 1.0, "value": 0.00353897 },
-    { "time": 4.365351473, "duration": 0.0, "confidence": 1.0, "value": 0.00347904 },
-    { "time": 4.388571428, "duration": 0.0, "confidence": 1.0, "value": 0.00348759 },
+    { "time": 4.365351474, "duration": 0.0, "confidence": 1.0, "value": 0.00347904 },
+    { "time": 4.388571429, "duration": 0.0, "confidence": 1.0, "value": 0.00348759 },
     { "time": 4.411791383, "duration": 0.0, "confidence": 1.0, "value": 0.00358541 },
-    { "time": 4.435011337, "duration": 0.0, "confidence": 1.0, "value": 0.00349229 },
-    { "time": 4.458231292, "duration": 0.0, "confidence": 1.0, "value": 0.00357759 },
+    { "time": 4.435011338, "duration": 0.0, "confidence": 1.0, "value": 0.00349229 },
+    { "time": 4.458231293, "duration": 0.0, "confidence": 1.0, "value": 0.00357759 },
     { "time": 4.481451247, "duration": 0.0, "confidence": 1.0, "value": 0.00355427 },
-    { "time": 4.504671201, "duration": 0.0, "confidence": 1.0, "value": 0.00355063 },
+    { "time": 4.504671202, "duration": 0.0, "confidence": 1.0, "value": 0.00355063 },
     { "time": 4.527891156, "duration": 0.0, "confidence": 1.0, "value": 0.00358087 },
     { "time": 4.551111111, "duration": 0.0, "confidence": 1.0, "value": 0.00350815 },
-    { "time": 4.574331065, "duration": 0.0, "confidence": 1.0, "value": 0.00353843 },
+    { "time": 4.574331066, "duration": 0.0, "confidence": 1.0, "value": 0.00353843 },
     { "time": 4.597551020, "duration": 0.0, "confidence": 1.0, "value": 0.00354201 },
     { "time": 4.620770975, "duration": 0.0, "confidence": 1.0, "value": 0.00350497 },
-    { "time": 4.643990929, "duration": 0.0, "confidence": 1.0, "value": 0.00354671 },
+    { "time": 4.643990930, "duration": 0.0, "confidence": 1.0, "value": 0.00354671 },
     { "time": 4.667210884, "duration": 0.0, "confidence": 1.0, "value": 0.00353596 },
     { "time": 4.690430839, "duration": 0.0, "confidence": 1.0, "value": 0.00347371 },
-    { "time": 4.713650793, "duration": 0.0, "confidence": 1.0, "value": 0.0035368 },
+    { "time": 4.713650794, "duration": 0.0, "confidence": 1.0, "value": 0.0035368 },
     { "time": 4.736870748, "duration": 0.0, "confidence": 1.0, "value": 0.00360017 },
-    { "time": 4.760090702, "duration": 0.0, "confidence": 1.0, "value": 0.00352821 },
-    { "time": 4.783310657, "duration": 0.0, "confidence": 1.0, "value": 0.00359332 },
+    { "time": 4.760090703, "duration": 0.0, "confidence": 1.0, "value": 0.00352821 },
+    { "time": 4.783310658, "duration": 0.0, "confidence": 1.0, "value": 0.00359332 },
     { "time": 4.806530612, "duration": 0.0, "confidence": 1.0, "value": 0.00353742 },
-    { "time": 4.829750566, "duration": 0.0, "confidence": 1.0, "value": 0.00353795 },
-    { "time": 4.852970521, "duration": 0.0, "confidence": 1.0, "value": 0.00348792 },
+    { "time": 4.829750567, "duration": 0.0, "confidence": 1.0, "value": 0.00353795 },
+    { "time": 4.852970522, "duration": 0.0, "confidence": 1.0, "value": 0.00348792 },
     { "time": 4.876190476, "duration": 0.0, "confidence": 1.0, "value": 0.0034639 },
-    { "time": 4.899410430, "duration": 0.0, "confidence": 1.0, "value": 0.0036387 },
+    { "time": 4.899410431, "duration": 0.0, "confidence": 1.0, "value": 0.0036387 },
     { "time": 4.922630385, "duration": 0.0, "confidence": 1.0, "value": 0.00354102 },
     { "time": 4.945850340, "duration": 0.0, "confidence": 1.0, "value": 0.00351475 },
-    { "time": 4.969070294, "duration": 0.0, "confidence": 1.0, "value": 0.00356904 }
+    { "time": 4.969070295, "duration": 0.0, "confidence": 1.0, "value": 0.00356904 }
   ]
 }
 ]
--- a/tests/test-jams-writer/expected/grid-oss.json	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-jams-writer/expected/grid-oss.json	Fri Dec 02 10:04:44 2016 +0000
@@ -8,7 +8,7 @@
 {
   "namespace": "unknown",
   "annotation_metadata": {
-    "annotation_tools": "Sonic Annotator v1.3",
+    "annotation_tools": "Sonic Annotator v1.5",
     "data_source": "Automatic feature extraction",
     "annotator": {
       "plugin_id": "vamp:vamp-test-plugin:vamp-test-plugin",
@@ -25,24 +25,24 @@
   },
   "data": [
     { "time": 0.000000000, "duration": 0.0, "confidence": 1.0, "label": "1 of 20 at 0", "value": [ 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667 ] },
-    { "time": 0.023219954, "duration": 0.0, "confidence": 1.0, "label": "2 of 20 at 0.023", "value": [ 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4 ] },
+    { "time": 0.023219955, "duration": 0.0, "confidence": 1.0, "label": "2 of 20 at 0.023", "value": [ 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4 ] },
     { "time": 0.046439909, "duration": 0.0, "confidence": 1.0, "label": "3 of 20 at 0.046", "value": [ 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333 ] },
-    { "time": 0.069659863, "duration": 0.0, "confidence": 1.0, "label": "4 of 20 at 0.069", "value": [ 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667 ] },
-    { "time": 0.092879818, "duration": 0.0, "confidence": 1.0, "label": "5 of 20 at 0.092", "value": [ 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5 ] },
+    { "time": 0.069659864, "duration": 0.0, "confidence": 1.0, "label": "4 of 20 at 0.069", "value": [ 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667 ] },
+    { "time": 0.092879819, "duration": 0.0, "confidence": 1.0, "label": "5 of 20 at 0.092", "value": [ 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5 ] },
     { "time": 0.116099773, "duration": 0.0, "confidence": 1.0, "label": "6 of 20 at 0.116", "value": [ 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5, 0.533333 ] },
-    { "time": 0.139319727, "duration": 0.0, "confidence": 1.0, "label": "7 of 20 at 0.139", "value": [ 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5, 0.533333, 0.566667 ] },
-    { "time": 0.162539682, "duration": 0.0, "confidence": 1.0, "label": "8 of 20 at 0.162", "value": [ 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5, 0.533333, 0.566667, 0.6 ] },
+    { "time": 0.139319728, "duration": 0.0, "confidence": 1.0, "label": "7 of 20 at 0.139", "value": [ 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5, 0.533333, 0.566667 ] },
+    { "time": 0.162539683, "duration": 0.0, "confidence": 1.0, "label": "8 of 20 at 0.162", "value": [ 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5, 0.533333, 0.566667, 0.6 ] },
     { "time": 0.185759637, "duration": 0.0, "confidence": 1.0, "label": "9 of 20 at 0.185", "value": [ 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5, 0.533333, 0.566667, 0.6, 0.633333 ] },
-    { "time": 0.208979591, "duration": 0.0, "confidence": 1.0, "label": "10 of 20 at 0.208", "value": [ 0.366667, 0.4, 0.433333, 0.466667, 0.5, 0.533333, 0.566667, 0.6, 0.633333, 0.666667 ] },
+    { "time": 0.208979592, "duration": 0.0, "confidence": 1.0, "label": "10 of 20 at 0.208", "value": [ 0.366667, 0.4, 0.433333, 0.466667, 0.5, 0.533333, 0.566667, 0.6, 0.633333, 0.666667 ] },
     { "time": 0.232199546, "duration": 0.0, "confidence": 1.0, "label": "11 of 20 at 0.232", "value": [ 0.4, 0.433333, 0.466667, 0.5, 0.533333, 0.566667, 0.6, 0.633333, 0.666667, 0.7 ] },
     { "time": 0.255419501, "duration": 0.0, "confidence": 1.0, "label": "12 of 20 at 0.255", "value": [ 0.433333, 0.466667, 0.5, 0.533333, 0.566667, 0.6, 0.633333, 0.666667, 0.7, 0.733333 ] },
-    { "time": 0.278639455, "duration": 0.0, "confidence": 1.0, "label": "13 of 20 at 0.278", "value": [ 0.466667, 0.5, 0.533333, 0.566667, 0.6, 0.633333, 0.666667, 0.7, 0.733333, 0.766667 ] },
+    { "time": 0.278639456, "duration": 0.0, "confidence": 1.0, "label": "13 of 20 at 0.278", "value": [ 0.466667, 0.5, 0.533333, 0.566667, 0.6, 0.633333, 0.666667, 0.7, 0.733333, 0.766667 ] },
     { "time": 0.301859410, "duration": 0.0, "confidence": 1.0, "label": "14 of 20 at 0.301", "value": [ 0.5, 0.533333, 0.566667, 0.6, 0.633333, 0.666667, 0.7, 0.733333, 0.766667, 0.8 ] },
     { "time": 0.325079365, "duration": 0.0, "confidence": 1.0, "label": "15 of 20 at 0.325", "value": [ 0.533333, 0.566667, 0.6, 0.633333, 0.666667, 0.7, 0.733333, 0.766667, 0.8, 0.833333 ] },
-    { "time": 0.348299319, "duration": 0.0, "confidence": 1.0, "label": "16 of 20 at 0.348", "value": [ 0.566667, 0.6, 0.633333, 0.666667, 0.7, 0.733333, 0.766667, 0.8, 0.833333, 0.866667 ] },
+    { "time": 0.348299320, "duration": 0.0, "confidence": 1.0, "label": "16 of 20 at 0.348", "value": [ 0.566667, 0.6, 0.633333, 0.666667, 0.7, 0.733333, 0.766667, 0.8, 0.833333, 0.866667 ] },
     { "time": 0.371519274, "duration": 0.0, "confidence": 1.0, "label": "17 of 20 at 0.371", "value": [ 0.6, 0.633333, 0.666667, 0.7, 0.733333, 0.766667, 0.8, 0.833333, 0.866667, 0.9 ] },
     { "time": 0.394739229, "duration": 0.0, "confidence": 1.0, "label": "18 of 20 at 0.394", "value": [ 0.633333, 0.666667, 0.7, 0.733333, 0.766667, 0.8, 0.833333, 0.866667, 0.9, 0.933333 ] },
-    { "time": 0.417959183, "duration": 0.0, "confidence": 1.0, "label": "19 of 20 at 0.417", "value": [ 0.666667, 0.7, 0.733333, 0.766667, 0.8, 0.833333, 0.866667, 0.9, 0.933333, 0.966667 ] },
+    { "time": 0.417959184, "duration": 0.0, "confidence": 1.0, "label": "19 of 20 at 0.417", "value": [ 0.666667, 0.7, 0.733333, 0.766667, 0.8, 0.833333, 0.866667, 0.9, 0.933333, 0.966667 ] },
     { "time": 0.441179138, "duration": 0.0, "confidence": 1.0, "label": "20 of 20 at 0.441", "value": [ 0.7, 0.733333, 0.766667, 0.8, 0.833333, 0.866667, 0.9, 0.933333, 0.966667, 1 ] }
   ]
 }
--- a/tests/test-lab-writer/expected/grid-oss-0.lab	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-lab-writer/expected/grid-oss-0.lab	Fri Dec 02 10:04:44 2016 +0000
@@ -1,20 +1,20 @@
 0.000000000	0.0666667	0.1	0.133333	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	"1 of 20 at 0"
-0.023219954	0.1	0.133333	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	"2 of 20 at 0.023"
+0.023219955	0.1	0.133333	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	"2 of 20 at 0.023"
 0.046439909	0.133333	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	"3 of 20 at 0.046"
-0.069659863	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	"4 of 20 at 0.069"
-0.092879818	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	"5 of 20 at 0.092"
+0.069659864	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	"4 of 20 at 0.069"
+0.092879819	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	"5 of 20 at 0.092"
 0.116099773	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	"6 of 20 at 0.116"
-0.139319727	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	"7 of 20 at 0.139"
-0.162539682	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	"8 of 20 at 0.162"
+0.139319728	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	"7 of 20 at 0.139"
+0.162539683	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	"8 of 20 at 0.162"
 0.185759637	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	0.633333	"9 of 20 at 0.185"
-0.208979591	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	"10 of 20 at 0.208"
+0.208979592	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	"10 of 20 at 0.208"
 0.232199546	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	0.7	"11 of 20 at 0.232"
 0.255419501	0.433333	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	0.7	0.733333	"12 of 20 at 0.255"
-0.278639455	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	"13 of 20 at 0.278"
+0.278639456	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	"13 of 20 at 0.278"
 0.301859410	0.5	0.533333	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	0.8	"14 of 20 at 0.301"
 0.325079365	0.533333	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	0.8	0.833333	"15 of 20 at 0.325"
-0.348299319	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	"16 of 20 at 0.348"
+0.348299320	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	"16 of 20 at 0.348"
 0.371519274	0.6	0.633333	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	0.9	"17 of 20 at 0.371"
 0.394739229	0.633333	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	0.9	0.933333	"18 of 20 at 0.394"
-0.417959183	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	0.9	0.933333	0.966667	"19 of 20 at 0.417"
+0.417959184	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	0.9	0.933333	0.966667	"19 of 20 at 0.417"
 0.441179138	0.7	0.733333	0.766667	0.8	0.833333	0.866667	0.9	0.933333	0.966667	1	"20 of 20 at 0.441"
--- a/tests/test-lab-writer/expected/grid-oss-2.lab	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-lab-writer/expected/grid-oss-2.lab	Fri Dec 02 10:04:44 2016 +0000
@@ -1,20 +1,20 @@
 0.000000000	0.067	0.1	0.13	0.17	0.2	0.23	0.27	0.3	0.33	0.37	"1 of 20 at 0"
-0.023219954	0.1	0.13	0.17	0.2	0.23	0.27	0.3	0.33	0.37	0.4	"2 of 20 at 0.023"
+0.023219955	0.1	0.13	0.17	0.2	0.23	0.27	0.3	0.33	0.37	0.4	"2 of 20 at 0.023"
 0.046439909	0.13	0.17	0.2	0.23	0.27	0.3	0.33	0.37	0.4	0.43	"3 of 20 at 0.046"
-0.069659863	0.17	0.2	0.23	0.27	0.3	0.33	0.37	0.4	0.43	0.47	"4 of 20 at 0.069"
-0.092879818	0.2	0.23	0.27	0.3	0.33	0.37	0.4	0.43	0.47	0.5	"5 of 20 at 0.092"
+0.069659864	0.17	0.2	0.23	0.27	0.3	0.33	0.37	0.4	0.43	0.47	"4 of 20 at 0.069"
+0.092879819	0.2	0.23	0.27	0.3	0.33	0.37	0.4	0.43	0.47	0.5	"5 of 20 at 0.092"
 0.116099773	0.23	0.27	0.3	0.33	0.37	0.4	0.43	0.47	0.5	0.53	"6 of 20 at 0.116"
-0.139319727	0.27	0.3	0.33	0.37	0.4	0.43	0.47	0.5	0.53	0.57	"7 of 20 at 0.139"
-0.162539682	0.3	0.33	0.37	0.4	0.43	0.47	0.5	0.53	0.57	0.6	"8 of 20 at 0.162"
+0.139319728	0.27	0.3	0.33	0.37	0.4	0.43	0.47	0.5	0.53	0.57	"7 of 20 at 0.139"
+0.162539683	0.3	0.33	0.37	0.4	0.43	0.47	0.5	0.53	0.57	0.6	"8 of 20 at 0.162"
 0.185759637	0.33	0.37	0.4	0.43	0.47	0.5	0.53	0.57	0.6	0.63	"9 of 20 at 0.185"
-0.208979591	0.37	0.4	0.43	0.47	0.5	0.53	0.57	0.6	0.63	0.67	"10 of 20 at 0.208"
+0.208979592	0.37	0.4	0.43	0.47	0.5	0.53	0.57	0.6	0.63	0.67	"10 of 20 at 0.208"
 0.232199546	0.4	0.43	0.47	0.5	0.53	0.57	0.6	0.63	0.67	0.7	"11 of 20 at 0.232"
 0.255419501	0.43	0.47	0.5	0.53	0.57	0.6	0.63	0.67	0.7	0.73	"12 of 20 at 0.255"
-0.278639455	0.47	0.5	0.53	0.57	0.6	0.63	0.67	0.7	0.73	0.77	"13 of 20 at 0.278"
+0.278639456	0.47	0.5	0.53	0.57	0.6	0.63	0.67	0.7	0.73	0.77	"13 of 20 at 0.278"
 0.301859410	0.5	0.53	0.57	0.6	0.63	0.67	0.7	0.73	0.77	0.8	"14 of 20 at 0.301"
 0.325079365	0.53	0.57	0.6	0.63	0.67	0.7	0.73	0.77	0.8	0.83	"15 of 20 at 0.325"
-0.348299319	0.57	0.6	0.63	0.67	0.7	0.73	0.77	0.8	0.83	0.87	"16 of 20 at 0.348"
+0.348299320	0.57	0.6	0.63	0.67	0.7	0.73	0.77	0.8	0.83	0.87	"16 of 20 at 0.348"
 0.371519274	0.6	0.63	0.67	0.7	0.73	0.77	0.8	0.83	0.87	0.9	"17 of 20 at 0.371"
 0.394739229	0.63	0.67	0.7	0.73	0.77	0.8	0.83	0.87	0.9	0.93	"18 of 20 at 0.394"
-0.417959183	0.67	0.7	0.73	0.77	0.8	0.83	0.87	0.9	0.93	0.97	"19 of 20 at 0.417"
+0.417959184	0.67	0.7	0.73	0.77	0.8	0.83	0.87	0.9	0.93	0.97	"19 of 20 at 0.417"
 0.441179138	0.7	0.73	0.77	0.8	0.83	0.87	0.9	0.93	0.97	1	"20 of 20 at 0.441"
--- a/tests/test-lab-writer/expected/grid-oss-6.lab	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-lab-writer/expected/grid-oss-6.lab	Fri Dec 02 10:04:44 2016 +0000
@@ -1,20 +1,20 @@
 0.000000000	0.0666667	0.1	0.133333	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	"1 of 20 at 0"
-0.023219954	0.1	0.133333	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	"2 of 20 at 0.023"
+0.023219955	0.1	0.133333	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	"2 of 20 at 0.023"
 0.046439909	0.133333	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	"3 of 20 at 0.046"
-0.069659863	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	"4 of 20 at 0.069"
-0.092879818	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	"5 of 20 at 0.092"
+0.069659864	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	"4 of 20 at 0.069"
+0.092879819	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	"5 of 20 at 0.092"
 0.116099773	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	"6 of 20 at 0.116"
-0.139319727	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	"7 of 20 at 0.139"
-0.162539682	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	"8 of 20 at 0.162"
+0.139319728	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	"7 of 20 at 0.139"
+0.162539683	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	"8 of 20 at 0.162"
 0.185759637	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	0.633333	"9 of 20 at 0.185"
-0.208979591	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	"10 of 20 at 0.208"
+0.208979592	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	"10 of 20 at 0.208"
 0.232199546	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	0.7	"11 of 20 at 0.232"
 0.255419501	0.433333	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	0.7	0.733333	"12 of 20 at 0.255"
-0.278639455	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	"13 of 20 at 0.278"
+0.278639456	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	"13 of 20 at 0.278"
 0.301859410	0.5	0.533333	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	0.8	"14 of 20 at 0.301"
 0.325079365	0.533333	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	0.8	0.833333	"15 of 20 at 0.325"
-0.348299319	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	"16 of 20 at 0.348"
+0.348299320	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	"16 of 20 at 0.348"
 0.371519274	0.6	0.633333	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	0.9	"17 of 20 at 0.371"
 0.394739229	0.633333	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	0.9	0.933333	"18 of 20 at 0.394"
-0.417959183	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	0.9	0.933333	0.966667	"19 of 20 at 0.417"
+0.417959184	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	0.9	0.933333	0.966667	"19 of 20 at 0.417"
 0.441179138	0.7	0.733333	0.766667	0.8	0.833333	0.866667	0.9	0.933333	0.966667	1	"20 of 20 at 0.441"
--- a/tests/test-lab-writer/expected/grid-oss-fill-ends.lab	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-lab-writer/expected/grid-oss-fill-ends.lab	Fri Dec 02 10:04:44 2016 +0000
@@ -1,20 +1,20 @@
-0.000000000	0.023219954	0.0666667	0.1	0.133333	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	"1 of 20 at 0"
-0.023219954	0.046439909	0.1	0.133333	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	"2 of 20 at 0.023"
-0.046439909	0.069659863	0.133333	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	"3 of 20 at 0.046"
-0.069659863	0.092879818	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	"4 of 20 at 0.069"
-0.092879818	0.116099773	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	"5 of 20 at 0.092"
-0.116099773	0.139319727	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	"6 of 20 at 0.116"
-0.139319727	0.162539682	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	"7 of 20 at 0.139"
-0.162539682	0.185759637	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	"8 of 20 at 0.162"
-0.185759637	0.208979591	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	0.633333	"9 of 20 at 0.185"
-0.208979591	0.232199546	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	"10 of 20 at 0.208"
+0.000000000	0.023219955	0.0666667	0.1	0.133333	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	"1 of 20 at 0"
+0.023219955	0.046439909	0.1	0.133333	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	"2 of 20 at 0.023"
+0.046439909	0.069659864	0.133333	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	"3 of 20 at 0.046"
+0.069659864	0.092879819	0.166667	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	"4 of 20 at 0.069"
+0.092879819	0.116099773	0.2	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	"5 of 20 at 0.092"
+0.116099773	0.139319728	0.233333	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	"6 of 20 at 0.116"
+0.139319728	0.162539683	0.266667	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	"7 of 20 at 0.139"
+0.162539683	0.185759637	0.3	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	"8 of 20 at 0.162"
+0.185759637	0.208979592	0.333333	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	0.633333	"9 of 20 at 0.185"
+0.208979592	0.232199546	0.366667	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	"10 of 20 at 0.208"
 0.232199546	0.255419501	0.4	0.433333	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	0.7	"11 of 20 at 0.232"
-0.255419501	0.278639455	0.433333	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	0.7	0.733333	"12 of 20 at 0.255"
-0.278639455	0.301859410	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	"13 of 20 at 0.278"
+0.255419501	0.278639456	0.433333	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	0.7	0.733333	"12 of 20 at 0.255"
+0.278639456	0.301859410	0.466667	0.5	0.533333	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	"13 of 20 at 0.278"
 0.301859410	0.325079365	0.5	0.533333	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	0.8	"14 of 20 at 0.301"
-0.325079365	0.348299319	0.533333	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	0.8	0.833333	"15 of 20 at 0.325"
-0.348299319	0.371519274	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	"16 of 20 at 0.348"
+0.325079365	0.348299320	0.533333	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	0.8	0.833333	"15 of 20 at 0.325"
+0.348299320	0.371519274	0.566667	0.6	0.633333	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	"16 of 20 at 0.348"
 0.371519274	0.394739229	0.6	0.633333	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	0.9	"17 of 20 at 0.371"
-0.394739229	0.417959183	0.633333	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	0.9	0.933333	"18 of 20 at 0.394"
-0.417959183	0.441179138	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	0.9	0.933333	0.966667	"19 of 20 at 0.417"
+0.394739229	0.417959184	0.633333	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	0.9	0.933333	"18 of 20 at 0.394"
+0.417959184	0.441179138	0.666667	0.7	0.733333	0.766667	0.8	0.833333	0.866667	0.9	0.933333	0.966667	"19 of 20 at 0.417"
 0.441179138	0.441179138	0.7	0.733333	0.766667	0.8	0.833333	0.866667	0.9	0.933333	0.966667	1	"20 of 20 at 0.441"
--- a/tests/test-multiple-audio/expected/all-files.csv	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-multiple-audio/expected/all-files.csv	Fri Dec 02 10:04:44 2016 +0000
@@ -1,36 +1,36 @@
-"./../audio/20sec-silence.wav",0.000000000,20.015600906,mean,61.1636,"(mean value, continuous-time average)"
-,0.000000000,20.015600906,median,0,"(median value, continuous-time average)"
-,0.000000000,20.015600906,mode,0,"(modal value, continuous-time average)"
-,0.000000000,20.015600906,mean,1406.56,"(mean value, continuous-time average)"
-"./../audio/3clicks.mp3",0.000000000,5.061950112,mean,174.507,"(mean value, continuous-time average)"
-,0.000000000,5.061950112,median,173,"(median value, continuous-time average)"
-,0.000000000,5.061950112,mode,173,"(modal value, continuous-time average)"
-,0.000000000,5.061950112,mean,1510.95,"(mean value, continuous-time average)"
-"./../audio/3clicks.ogg",0.000000000,4.992290248,mean,169.481,"(mean value, continuous-time average)"
-,0.000000000,4.992290248,median,156,"(median value, continuous-time average)"
-,0.000000000,4.992290248,mode,132,"(modal value, continuous-time average)"
-,0.000000000,4.992290248,mean,1480.59,"(mean value, continuous-time average)"
-"./../audio/3clicks8.wav",0.000000000,4.992290248,mean,169.391,"(mean value, continuous-time average)"
-,0.000000000,4.992290248,median,169,"(median value, continuous-time average)"
-,0.000000000,4.992290248,mode,164,"(modal value, continuous-time average)"
-,0.000000000,4.992290248,mean,1403.77,"(mean value, continuous-time average)"
-"./../audio/3clicks8quiet.wav",0.000000000,4.992290248,mean,169.058,"(mean value, continuous-time average)"
-,0.000000000,4.992290248,median,169,"(median value, continuous-time average)"
-,0.000000000,4.992290248,mode,165,"(modal value, continuous-time average)"
-,0.000000000,4.992290248,mean,1342.8,"(mean value, continuous-time average)"
-"./../audio/6clicks.ogg",0.000000000,9.961360543,mean,168.686,"(mean value, continuous-time average)"
-,0.000000000,9.961360543,median,158,"(median value, continuous-time average)"
-,0.000000000,9.961360543,mode,138,"(modal value, continuous-time average)"
-,0.000000000,9.961360543,mean,1423.64,"(mean value, continuous-time average)"
-"./../audio/6clicks8.wav",0.000000000,9.961360543,mean,170.174,"(mean value, continuous-time average)"
-,0.000000000,9.961360543,median,169,"(median value, continuous-time average)"
-,0.000000000,9.961360543,mode,164,"(modal value, continuous-time average)"
-,0.000000000,9.961360543,mean,1411.85,"(mean value, continuous-time average)"
-"./../audio/id3v2-iso-8859-1.mp3",0.000000000,5.015510203,mean,176.083,"(mean value, continuous-time average)"
-,0.000000000,5.015510203,median,172,"(median value, continuous-time average)"
-,0.000000000,5.015510203,mode,164,"(modal value, continuous-time average)"
-,0.000000000,5.015510203,mean,1492.7,"(mean value, continuous-time average)"
-"./../audio/id3v2-ucs-2.mp3",0.000000000,5.061950112,mean,174.507,"(mean value, continuous-time average)"
-,0.000000000,5.061950112,median,173,"(median value, continuous-time average)"
-,0.000000000,5.061950112,mode,173,"(modal value, continuous-time average)"
-,0.000000000,5.061950112,mean,1510.95,"(mean value, continuous-time average)"
+"./../audio/20sec-silence.wav",0.000000000,20.015600907,mean,2.9e-5,"(mean value, continuous-time average)"
+,0.000000000,20.015600907,median,3.05e-5,"(median value, continuous-time average)"
+,0.000000000,20.015600907,mode,3.05e-5,"(modal value, continuous-time average)"
+,0.000000000,20.015600907,mean,3.96e-5,"(mean value, continuous-time average)"
+"./../audio/3clicks.mp3",0.000000000,4.992290250,mean,0.000287,"(mean value, continuous-time average)"
+,0.000000000,4.992290250,median,1.64e-5,"(median value, continuous-time average)"
+,0.000000000,4.992290250,mode,1.39e-5,"(modal value, continuous-time average)"
+,0.000000000,4.992290250,mean,0.000924,"(mean value, continuous-time average)"
+"./../audio/3clicks.ogg",0.000000000,4.992290250,mean,0.000303,"(mean value, continuous-time average)"
+,0.000000000,4.992290250,median,2.42e-5,"(median value, continuous-time average)"
+,0.000000000,4.992290250,mode,1.99e-5,"(modal value, continuous-time average)"
+,0.000000000,4.992290250,mean,0.00108,"(mean value, continuous-time average)"
+"./../audio/3clicks8.wav",0.000000000,4.992290250,mean,0.00369,"(mean value, continuous-time average)"
+,0.000000000,4.992290250,median,0.00354,"(median value, continuous-time average)"
+,0.000000000,4.992290250,mode,0.00334,"(modal value, continuous-time average)"
+,0.000000000,4.992290250,mean,0.0042,"(mean value, continuous-time average)"
+"./../audio/3clicks8quiet.wav",0.000000000,4.992290250,mean,0.00548,"(mean value, continuous-time average)"
+,0.000000000,4.992290250,median,0.00548,"(median value, continuous-time average)"
+,0.000000000,4.992290250,mode,0.00515,"(modal value, continuous-time average)"
+,0.000000000,4.992290250,mean,0.00563,"(mean value, continuous-time average)"
+"./../audio/6clicks.ogg",0.000000000,9.961360545,mean,0.00396,"(mean value, continuous-time average)"
+,0.000000000,9.961360545,median,0.00372,"(median value, continuous-time average)"
+,0.000000000,9.961360545,mode,0.00358,"(modal value, continuous-time average)"
+,0.000000000,9.961360545,mean,0.00468,"(mean value, continuous-time average)"
+"./../audio/6clicks8.wav",0.000000000,9.961360545,mean,0.00369,"(mean value, continuous-time average)"
+,0.000000000,9.961360545,median,0.00354,"(median value, continuous-time average)"
+,0.000000000,9.961360545,mode,0.00346,"(modal value, continuous-time average)"
+,0.000000000,9.961360545,mean,0.00417,"(mean value, continuous-time average)"
+"./../audio/id3v2-iso-8859-1.mp3",0.000000000,4.992290250,mean,0.000287,"(mean value, continuous-time average)"
+,0.000000000,4.992290250,median,1.64e-5,"(median value, continuous-time average)"
+,0.000000000,4.992290250,mode,1.39e-5,"(modal value, continuous-time average)"
+,0.000000000,4.992290250,mean,0.000924,"(mean value, continuous-time average)"
+"./../audio/id3v2-ucs-2.mp3",0.000000000,4.992290250,mean,0.000287,"(mean value, continuous-time average)"
+,0.000000000,4.992290250,median,1.64e-5,"(median value, continuous-time average)"
+,0.000000000,4.992290250,mode,1.39e-5,"(modal value, continuous-time average)"
+,0.000000000,4.992290250,mean,0.000924,"(mean value, continuous-time average)"
--- a/tests/test-multiple-audio/expected/multiplexed.csv	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-multiple-audio/expected/multiplexed.csv	Fri Dec 02 10:04:44 2016 +0000
@@ -1,4 +1,4 @@
-"3clicks.mp3",0.000000000,9.961360543,mean,168.908,"(mean value, continuous-time average)"
-,0.000000000,9.961360543,median,162,"(median value, continuous-time average)"
-,0.000000000,9.961360543,mode,144,"(modal value, continuous-time average)"
-,0.000000000,9.961360543,mean,1418.17,"(mean value, continuous-time average)"
+"3clicks.mp3",0.000000000,9.961360545,mean,0.00203,"(mean value, continuous-time average)"
+,0.000000000,9.961360545,median,0.00186,"(median value, continuous-time average)"
+,0.000000000,9.961360545,mode,0.00179,"(modal value, continuous-time average)"
+,0.000000000,9.961360545,mean,0.00251,"(mean value, continuous-time average)"
--- a/tests/test-multiple-audio/expected/playlist.csv	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-multiple-audio/expected/playlist.csv	Fri Dec 02 10:04:44 2016 +0000
@@ -1,8 +1,8 @@
-"3clicks.mp3",0.000000000,5.061950112,mean,174.507,"(mean value, continuous-time average)"
-,0.000000000,5.061950112,median,173,"(median value, continuous-time average)"
-,0.000000000,5.061950112,mode,173,"(modal value, continuous-time average)"
-,0.000000000,5.061950112,mean,1510.95,"(mean value, continuous-time average)"
-"6clicks.ogg",0.000000000,9.961360543,mean,168.686,"(mean value, continuous-time average)"
-,0.000000000,9.961360543,median,158,"(median value, continuous-time average)"
-,0.000000000,9.961360543,mode,138,"(modal value, continuous-time average)"
-,0.000000000,9.961360543,mean,1423.64,"(mean value, continuous-time average)"
+"3clicks.mp3",0.000000000,4.992290250,mean,0.000287,"(mean value, continuous-time average)"
+,0.000000000,4.992290250,median,1.64e-5,"(median value, continuous-time average)"
+,0.000000000,4.992290250,mode,1.39e-5,"(modal value, continuous-time average)"
+,0.000000000,4.992290250,mean,0.000924,"(mean value, continuous-time average)"
+"6clicks.ogg",0.000000000,9.961360545,mean,0.00396,"(mean value, continuous-time average)"
+,0.000000000,9.961360545,median,0.00372,"(median value, continuous-time average)"
+,0.000000000,9.961360545,mode,0.00358,"(modal value, continuous-time average)"
+,0.000000000,9.961360545,mean,0.00468,"(mean value, continuous-time average)"
--- a/tests/test-multiple-audio/test-multiple-audio.sh	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-multiple-audio/test-multiple-audio.sh	Fri Dec 02 10:04:44 2016 +0000
@@ -7,7 +7,7 @@
 
 trap "rm -f $tmpfile1 $tmpfile2" 0
 
-transform=$mypath/transforms/detectionfunction.n3 
+transform=$mypath/transforms/af.n3 
 
 urlbase=http://vamp-plugins.org/sonic-annotator/testfiles
 
@@ -24,7 +24,7 @@
 # would have to regenerate it if we added more test audio files. Note
 # that the -r flag is not supposed to pick up playlist files, only
 # audio files
-$r -t $transform -w csv --csv-stdout -r --summary-only $audiopath > $tmpfile1 2>/dev/null || \
+$r -t $transform -w csv --csv-digits 3 --csv-stdout -r --summary-only $audiopath > $tmpfile1 2>/dev/null || \
     fail "Fails to run transform $transform with recursive dir option"
 
 expected=$mypath/expected/all-files
@@ -37,7 +37,7 @@
 # Here we strip any leading path from the audio file in the output,
 # because the playlist reader will have resolved files to absolute
 # paths and those will differ between systems
-$r -t $transform -w csv --csv-stdout $audiopath/playlist.m3u --summary-only 2>/dev/null > "$tmpfile2" || \
+$r -t $transform -w csv --csv-digits 3 --csv-stdout $audiopath/playlist.m3u --summary-only 2>/dev/null > "$tmpfile2" || \
     fail "Fails to run transform $transform with playlist input"
 
 cat "$tmpfile2" | sed 's,^"[^"]*/,",' > "$tmpfile1"
@@ -51,7 +51,7 @@
 
 # Strip paths again, just so we can use the same output comparison
 # file as above
-$r -t $transform -w csv --csv-stdout $audiopath/3clicks.mp3 $audiopath/6clicks.ogg --summary-only 2>/dev/null > $tmpfile2 || \
+$r -t $transform -w csv --csv-digits 3 --csv-stdout $audiopath/3clicks.mp3 $audiopath/6clicks.ogg --summary-only 2>/dev/null > $tmpfile2 || \
     fail "Fails to run transform $transform with 2-file input"
 
 cat "$tmpfile2" | sed 's,^"[^"]*/,",' > "$tmpfile1"
@@ -63,7 +63,7 @@
 
 # 4. Multiple files supplied directly on command line, with file: URL
 
-$r -t $transform -w csv --csv-stdout $audiopath/3clicks.mp3 file://`pwd`/$audiopath/6clicks.ogg --summary-only 2>/dev/null > $tmpfile2 || \
+$r -t $transform -w csv --csv-digits 3 --csv-stdout $audiopath/3clicks.mp3 file://`pwd`/$audiopath/6clicks.ogg --summary-only 2>/dev/null > $tmpfile2 || \
     fail "Fails to run transform $transform with 2-file input"
 
 cat "$tmpfile2" | sed 's,^"[^"]*/,",' > "$tmpfile1"
@@ -77,7 +77,7 @@
 
     # 5. Remote playlist file referring to remote audio files
 
-    $r -t $transform -w csv --csv-stdout $urlbase/playlist.m3u --summary-only 2>/dev/null > $tmpfile2 || \
+    $r -t $transform -w csv --csv-digits 3 --csv-stdout $urlbase/playlist.m3u --summary-only 2>/dev/null > $tmpfile2 || \
 	fail "Fails to run transform $transform with remote playlist input"
 
     cat "$tmpfile2" | sed 's,^"[^"]*/,",' > "$tmpfile1"
@@ -89,7 +89,7 @@
 
     # 6. Local playlist file referring to mixture of remote and local audio files
 
-    $r -t $transform -w csv --csv-stdout $audiopath/remote-playlist.m3u --summary-only 2>/dev/null > $tmpfile2 || \
+    $r -t $transform -w csv --csv-digits 3 --csv-stdout $audiopath/remote-playlist.m3u --summary-only 2>/dev/null > $tmpfile2 || \
 	fail "Fails to run transform $transform with playlist of remote files"
 
     cat "$tmpfile2" | sed 's,^"[^"]*/,",' > "$tmpfile1"
@@ -101,7 +101,7 @@
 
     # 7. Multiple remote files supplied directly on command line
 
-    $r -t $transform -w csv --csv-stdout $urlbase/3clicks.mp3 $urlbase/6clicks.ogg --summary-only 2>/dev/null > $tmpfile2 || \
+    $r -t $transform -w csv --csv-digits 3 --csv-stdout $urlbase/3clicks.mp3 $urlbase/6clicks.ogg --summary-only 2>/dev/null > $tmpfile2 || \
 	fail "Fails to run transform $transform with 2-file remote input"
 
     cat "$tmpfile2" | sed 's,^"[^"]*/,",' > "$tmpfile1"
@@ -113,7 +113,7 @@
 
     # 8. Mixture of remote and local files supplied on command line
 
-    $r -t $transform -w csv --csv-stdout $audiopath/3clicks.mp3 $urlbase/6clicks.ogg --summary-only 2>/dev/null > $tmpfile2 || \
+    $r -t $transform -w csv --csv-digits 3 --csv-stdout $audiopath/3clicks.mp3 $urlbase/6clicks.ogg --summary-only 2>/dev/null > $tmpfile2 || \
 	fail "Fails to run transform $transform with 2-file remote input"
 
     cat "$tmpfile2" | sed 's,^"[^"]*/,",' > "$tmpfile1"
@@ -126,7 +126,7 @@
 
 # 9. As 3, but multiplexing rather than extracting separately from each file
 
-$r -t $transform --multiplex -w csv --csv-stdout $audiopath/3clicks.mp3 $audiopath/6clicks.ogg --summary-only 2>/dev/null > $tmpfile2 || \
+$r -t $transform --multiplex --csv-digits 3 -w csv --csv-stdout $audiopath/3clicks.mp3 $audiopath/6clicks.ogg --summary-only 2>/dev/null > $tmpfile2 || \
     fail "Fails to run transform $transform with 2-file input"
 
 cat "$tmpfile2" | sed 's,^"[^"]*/,",' > "$tmpfile1"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-multiple-audio/transforms/af.n3	Fri Dec 02 10:04:44 2016 +0000
@@ -0,0 +1,41 @@
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
+@prefix vamp: <http://purl.org/ontology/vamp/>.
+@prefix examples: <http://vamp-plugins.org/rdf/plugins/vamp-example-plugins#>.
+@prefix : <#>.
+
+:transform0 a vamp:Transform;
+	vamp:plugin examples:amplitudefollower ;
+	vamp:output examples:amplitudefollower_output_amplitude ;
+	vamp:summary_type "mean" .
+
+:transform1 a vamp:Transform;
+	vamp:plugin examples:amplitudefollower ;
+	vamp:output examples:amplitudefollower_output_amplitude ;
+	vamp:summary_type "median" .
+
+# This is not a summary and so should not appear with --summary-only
+:transform2 a vamp:Transform;
+	vamp:plugin examples:percussiononsets ;
+	vamp:output examples:percussiononsets_output_onsets .
+
+:transform3 a vamp:Transform;
+	vamp:plugin examples:amplitudefollower ;
+	vamp:output examples:amplitudefollower_output_amplitude ;
+	vamp:summary_type "mode" .
+
+# This has different step and block sizes from the default
+# (:transform0), and so should be listed separately with different
+# values in the output
+:transform4 a vamp:Transform;
+	vamp:plugin examples:amplitudefollower ;
+	vamp:output examples:amplitudefollower_output_amplitude ;
+	vamp:step_size 4096 ;
+	vamp:block_size 8192 ;
+	vamp:summary_type "mean" .
+
+# This is not a summary and so should not appear with --summary-only
+:transform5 a vamp:Transform;
+	vamp:plugin examples:amplitudefollower ;
+	vamp:output examples:amplitudefollower_output_amplitude .
+
+ 
--- a/tests/test-summaries/expected/summaries-all-summaries-only.csv	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-summaries/expected/summaries-all-summaries-only.csv	Fri Dec 02 10:04:44 2016 +0000
@@ -1,9 +1,9 @@
-"./../audio/3clicks8.wav",0.000000000,4.992290248,count,430,"(count)"
-,0.000000000,4.992290248,max,503,"(maximum value)"
-,0.000000000,4.992290248,mean,169.391,"(mean value, continuous-time average)"
-,0.000000000,4.992290248,median,169,"(median value, continuous-time average)"
-,0.000000000,4.992290248,min,0,"(minimum value)"
-,0.000000000,4.992290248,mode,164,"(modal value, continuous-time average)"
-,0.000000000,4.992290248,sd,32.7775,"(standard deviation, continuous-time average)"
-,0.000000000,4.992290248,sum,72838,"(sum)"
-,0.000000000,4.992290248,variance,1074.36,"(variance, continuous-time average)"
+"./../audio/3clicks8.wav",0.000000000,4.992290250,count,430,"(count)"
+,0.000000000,4.992290250,max,503,"(maximum value)"
+,0.000000000,4.992290250,mean,169.391,"(mean value, continuous-time average)"
+,0.000000000,4.992290250,median,169,"(median value, continuous-time average)"
+,0.000000000,4.992290250,min,0,"(minimum value)"
+,0.000000000,4.992290250,mode,164,"(modal value, continuous-time average)"
+,0.000000000,4.992290250,sd,32.7775,"(standard deviation, continuous-time average)"
+,0.000000000,4.992290250,sum,72838,"(sum)"
+,0.000000000,4.992290250,variance,1074.36,"(variance, continuous-time average)"
--- a/tests/test-summaries/expected/summaries-from-rdf-summaries-only.csv	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-summaries/expected/summaries-from-rdf-summaries-only.csv	Fri Dec 02 10:04:44 2016 +0000
@@ -1,4 +1,4 @@
-"./../audio/3clicks8.wav",0.000000000,4.992290248,mean,169.391,"(mean value, continuous-time average)"
-,0.000000000,4.992290248,median,169,"(median value, continuous-time average)"
-,0.000000000,4.992290248,mode,164,"(modal value, continuous-time average)"
-,0.000000000,4.992290248,mean,703.191,"(mean value, continuous-time average)"
+"./../audio/3clicks8.wav",0.000000000,4.992290250,mean,169.391,"(mean value, continuous-time average)"
+,0.000000000,4.992290250,median,169,"(median value, continuous-time average)"
+,0.000000000,4.992290250,mode,164,"(modal value, continuous-time average)"
+,0.000000000,4.992290250,mean,703.191,"(mean value, continuous-time average)"
--- a/tests/test-summaries/expected/summaries-from-rdf.csv	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-summaries/expected/summaries-from-rdf.csv	Fri Dec 02 10:04:44 2016 +0000
@@ -1,7 +1,7 @@
 "./../audio/3clicks8.wav",0.777868481
 ,1.648616780
-,2.414875283
-,0.000000000,4.992290248,mean,169.391,"(mean value, continuous-time average)"
-,0.000000000,4.992290248,median,169,"(median value, continuous-time average)"
-,0.000000000,4.992290248,mode,164,"(modal value, continuous-time average)"
-,0.000000000,4.992290248,mean,703.191,"(mean value, continuous-time average)"
+,2.414875284
+,0.000000000,4.992290250,mean,169.391,"(mean value, continuous-time average)"
+,0.000000000,4.992290250,median,169,"(median value, continuous-time average)"
+,0.000000000,4.992290250,mode,164,"(modal value, continuous-time average)"
+,0.000000000,4.992290250,mean,703.191,"(mean value, continuous-time average)"
--- a/tests/test-summaries/expected/summaries-segments.csv	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-summaries/expected/summaries-segments.csv	Fri Dec 02 10:04:44 2016 +0000
@@ -1,2 +1,2 @@
 "./../audio/6clicks8.wav",0.000000000,9.900000000,median,169,"(median value, continuous-time average)"
-,9.900000000,0.061360543,median,179,"(median value, continuous-time average)"
+,9.900000000,0.061360545,median,179,"(median value, continuous-time average)"
--- a/tests/test-summaries/expected/summaries-with-mean.csv	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-summaries/expected/summaries-with-mean.csv	Fri Dec 02 10:04:44 2016 +0000
@@ -1,431 +1,431 @@
 "./../audio/3clicks8.wav",0.000000000,0
 ,0.011609977,207
-,0.023219954,170
-,0.034829931,184
+,0.023219955,170
+,0.034829932,184
 ,0.046439909,166
-,0.058049886,174
-,0.069659863,179
+,0.058049887,174
+,0.069659864,179
 ,0.081269841,162
-,0.092879818,157
-,0.104489795,156
+,0.092879819,157
+,0.104489796,156
 ,0.116099773,182
-,0.127709750,168
-,0.139319727,168
+,0.127709751,168
+,0.139319728,168
 ,0.150929705,155
-,0.162539682,200
-,0.174149659,163
+,0.162539683,200
+,0.174149660,163
 ,0.185759637,178
-,0.197369614,164
-,0.208979591,166
+,0.197369615,164
+,0.208979592,166
 ,0.220589569,137
 ,0.232199546,155
-,0.243809523,177
+,0.243809524,177
 ,0.255419501,145
 ,0.267029478,172
-,0.278639455,155
+,0.278639456,155
 ,0.290249433,201
 ,0.301859410,166
-,0.313469387,169
+,0.313469388,169
 ,0.325079365,158
 ,0.336689342,169
-,0.348299319,155
+,0.348299320,155
 ,0.359909297,187
 ,0.371519274,177
-,0.383129251,149
+,0.383129252,149
 ,0.394739229,196
 ,0.406349206,160
-,0.417959183,174
-,0.429569160,165
+,0.417959184,174
+,0.429569161,165
 ,0.441179138,149
-,0.452789115,181
-,0.464399092,180
+,0.452789116,181
+,0.464399093,180
 ,0.476009070,156
-,0.487619047,163
-,0.499229024,188
+,0.487619048,163
+,0.499229025,188
 ,0.510839002,173
-,0.522448979,160
-,0.534058956,168
+,0.522448980,160
+,0.534058957,168
 ,0.545668934,154
-,0.557278911,155
-,0.568888888,161
+,0.557278912,155
+,0.568888889,161
 ,0.580498866,163
-,0.592108843,172
-,0.603718820,168
+,0.592108844,172
+,0.603718821,168
 ,0.615328798,181
-,0.626938775,167
-,0.638548752,172
+,0.626938776,167
+,0.638548753,172
 ,0.650158730,158
 ,0.661768707,172
-,0.673378684,167
+,0.673378685,167
 ,0.684988662,180
 ,0.696598639,188
-,0.708208616,160
+,0.708208617,160
 ,0.719818594,166
 ,0.731428571,158
-,0.743038548,176
+,0.743038549,176
 ,0.754648526,153
 ,0.766258503,173
-,0.777868480,449
+,0.777868481,449
 ,0.789478458,30
 ,0.801088435,70
-,0.812698412,181
+,0.812698413,181
 ,0.824308390,165
 ,0.835918367,174
-,0.847528344,181
-,0.859138321,179
+,0.847528345,181
+,0.859138322,179
 ,0.870748299,154
-,0.882358276,169
-,0.893968253,150
+,0.882358277,169
+,0.893968254,150
 ,0.905578231,189
-,0.917188208,159
-,0.928798185,172
+,0.917188209,159
+,0.928798186,172
 ,0.940408163,157
-,0.952018140,167
-,0.963628117,169
+,0.952018141,167
+,0.963628118,169
 ,0.975238095,155
-,0.986848072,189
-,0.998458049,178
+,0.986848073,189
+,0.998458050,178
 ,1.010068027,168
-,1.021678004,169
-,1.033287981,178
+,1.021678005,169
+,1.033287982,178
 ,1.044897959,157
-,1.056507936,166
-,1.068117913,162
+,1.056507937,166
+,1.068117914,162
 ,1.079727891,170
 ,1.091337868,186
-,1.102947845,178
+,1.102947846,178
 ,1.114557823,178
 ,1.126167800,155
-,1.137777777,173
+,1.137777778,173
 ,1.149387755,156
 ,1.160997732,158
-,1.172607709,170
+,1.172607710,170
 ,1.184217687,167
 ,1.195827664,160
-,1.207437641,180
+,1.207437642,180
 ,1.219047619,153
 ,1.230657596,154
-,1.242267573,171
+,1.242267574,171
 ,1.253877551,159
 ,1.265487528,194
-,1.277097505,170
-,1.288707482,157
+,1.277097506,170
+,1.288707483,157
 ,1.300317460,184
-,1.311927437,156
-,1.323537414,173
+,1.311927438,156
+,1.323537415,173
 ,1.335147392,184
-,1.346757369,168
-,1.358367346,182
+,1.346757370,168
+,1.358367347,182
 ,1.369977324,147
-,1.381587301,164
-,1.393197278,163
+,1.381587302,164
+,1.393197279,163
 ,1.404807256,165
-,1.416417233,181
-,1.428027210,172
+,1.416417234,181
+,1.428027211,172
 ,1.439637188,169
-,1.451247165,165
-,1.462857142,166
+,1.451247166,165
+,1.462857143,166
 ,1.474467120,158
-,1.486077097,162
-,1.497687074,188
+,1.486077098,162
+,1.497687075,188
 ,1.509297052,176
 ,1.520907029,176
-,1.532517006,159
+,1.532517007,159
 ,1.544126984,183
 ,1.555736961,178
-,1.567346938,168
+,1.567346939,168
 ,1.578956916,171
 ,1.590566893,158
-,1.602176870,153
+,1.602176871,153
 ,1.613786848,189
 ,1.625396825,171
-,1.637006802,142
+,1.637006803,142
 ,1.648616780,503
 ,1.660226757,0
-,1.671836734,30
+,1.671836735,30
 ,1.683446712,189
 ,1.695056689,146
-,1.706666666,174
-,1.718276643,171
+,1.706666667,174
+,1.718276644,171
 ,1.729886621,169
-,1.741496598,164
-,1.753106575,181
+,1.741496599,164
+,1.753106576,181
 ,1.764716553,180
-,1.776326530,163
-,1.787936507,174
+,1.776326531,163
+,1.787936508,174
 ,1.799546485,135
-,1.811156462,193
-,1.822766439,187
+,1.811156463,193
+,1.822766440,187
 ,1.834376417,176
-,1.845986394,172
-,1.857596371,155
+,1.845986395,172
+,1.857596372,155
 ,1.869206349,185
-,1.880816326,167
-,1.892426303,173
+,1.880816327,167
+,1.892426304,173
 ,1.904036281,162
-,1.915646258,166
-,1.927256235,167
+,1.915646259,166
+,1.927256236,167
 ,1.938866213,179
 ,1.950476190,170
-,1.962086167,158
+,1.962086168,158
 ,1.973696145,168
 ,1.985306122,162
-,1.996916099,182
+,1.996916100,182
 ,2.008526077,167
 ,2.020136054,185
-,2.031746031,165
+,2.031746032,165
 ,2.043356009,184
 ,2.054965986,157
-,2.066575963,167
+,2.066575964,167
 ,2.078185941,164
 ,2.089795918,160
-,2.101405895,181
+,2.101405896,181
 ,2.113015873,165
 ,2.124625850,181
-,2.136235827,161
-,2.147845804,176
+,2.136235828,161
+,2.147845805,176
 ,2.159455782,177
-,2.171065759,150
-,2.182675736,185
+,2.171065760,150
+,2.182675737,185
 ,2.194285714,173
-,2.205895691,162
-,2.217505668,169
+,2.205895692,162
+,2.217505669,169
 ,2.229115646,171
-,2.240725623,140
-,2.252335600,196
+,2.240725624,140
+,2.252335601,196
 ,2.263945578,155
-,2.275555555,171
-,2.287165532,186
+,2.275555556,171
+,2.287165533,186
 ,2.298775510,157
-,2.310385487,166
-,2.321995464,169
+,2.310385488,166
+,2.321995465,169
 ,2.333605442,183
-,2.345215419,186
-,2.356825396,138
+,2.345215420,186
+,2.356825397,138
 ,2.368435374,162
 ,2.380045351,180
-,2.391655328,165
+,2.391655329,165
 ,2.403265306,181
 ,2.414875283,444
-,2.426485260,27
+,2.426485261,27
 ,2.438095238,150
 ,2.449705215,166
-,2.461315192,177
+,2.461315193,177
 ,2.472925170,174
 ,2.484535147,165
-,2.496145124,158
+,2.496145125,158
 ,2.507755102,178
 ,2.519365079,177
-,2.530975056,172
+,2.530975057,172
 ,2.542585034,174
 ,2.554195011,168
-,2.565804988,165
-,2.577414965,168
+,2.565804989,165
+,2.577414966,168
 ,2.589024943,149
-,2.600634920,171
-,2.612244897,164
+,2.600634921,171
+,2.612244898,164
 ,2.623854875,163
-,2.635464852,182
-,2.647074829,162
+,2.635464853,182
+,2.647074830,162
 ,2.658684807,156
-,2.670294784,173
-,2.681904761,188
+,2.670294785,173
+,2.681904762,188
 ,2.693514739,166
-,2.705124716,157
-,2.716734693,170
+,2.705124717,157
+,2.716734694,170
 ,2.728344671,167
-,2.739954648,191
-,2.751564625,154
+,2.739954649,191
+,2.751564626,154
 ,2.763174603,175
 ,2.774784580,157
-,2.786394557,169
+,2.786394558,169
 ,2.798004535,160
 ,2.809614512,163
-,2.821224489,191
+,2.821224490,191
 ,2.832834467,158
 ,2.844444444,184
-,2.856054421,164
+,2.856054422,164
 ,2.867664399,176
 ,2.879274376,182
-,2.890884353,180
+,2.890884354,180
 ,2.902494331,138
 ,2.914104308,170
-,2.925714285,172
+,2.925714286,172
 ,2.937324263,172
 ,2.948934240,168
-,2.960544217,186
+,2.960544218,186
 ,2.972154195,171
 ,2.983764172,154
-,2.995374149,185
-,3.006984126,172
+,2.995374150,185
+,3.006984127,172
 ,3.018594104,164
-,3.030204081,176
-,3.041814058,195
+,3.030204082,176
+,3.041814059,195
 ,3.053424036,160
-,3.065034013,124
-,3.076643990,181
+,3.065034014,124
+,3.076643991,181
 ,3.088253968,170
-,3.099863945,178
-,3.111473922,165
+,3.099863946,178
+,3.111473923,165
 ,3.123083900,164
-,3.134693877,194
-,3.146303854,157
+,3.134693878,194
+,3.146303855,157
 ,3.157913832,205
-,3.169523809,163
-,3.181133786,159
+,3.169523810,163
+,3.181133787,159
 ,3.192743764,184
 ,3.204353741,145
-,3.215963718,170
+,3.215963719,170
 ,3.227573696,155
 ,3.239183673,161
-,3.250793650,164
+,3.250793651,164
 ,3.262403628,184
 ,3.274013605,175
-,3.285623582,155
+,3.285623583,155
 ,3.297233560,164
 ,3.308843537,181
-,3.320453514,182
+,3.320453515,182
 ,3.332063492,145
 ,3.343673469,177
-,3.355283446,162
+,3.355283447,162
 ,3.366893424,153
 ,3.378503401,185
-,3.390113378,174
+,3.390113379,174
 ,3.401723356,167
 ,3.413333333,187
-,3.424943310,157
-,3.436553287,170
+,3.424943311,157
+,3.436553288,170
 ,3.448163265,169
-,3.459773242,166
-,3.471383219,171
+,3.459773243,166
+,3.471383220,171
 ,3.482993197,165
-,3.494603174,158
-,3.506213151,181
+,3.494603175,158
+,3.506213152,181
 ,3.517823129,168
-,3.529433106,175
-,3.541043083,162
+,3.529433107,175
+,3.541043084,162
 ,3.552653061,167
-,3.564263038,179
-,3.575873015,167
+,3.564263039,179
+,3.575873016,167
 ,3.587482993,156
-,3.599092970,209
-,3.610702947,179
+,3.599092971,209
+,3.610702948,179
 ,3.622312925,159
 ,3.633922902,180
-,3.645532879,152
+,3.645532880,152
 ,3.657142857,169
 ,3.668752834,189
-,3.680362811,170
+,3.680362812,170
 ,3.691972789,156
 ,3.703582766,165
-,3.715192743,179
+,3.715192744,179
 ,3.726802721,173
 ,3.738412698,163
-,3.750022675,170
+,3.750022676,170
 ,3.761632653,181
 ,3.773242630,177
-,3.784852607,181
+,3.784852608,181
 ,3.796462585,166
 ,3.808072562,153
-,3.819682539,164
+,3.819682540,164
 ,3.831292517,209
 ,3.842902494,159
-,3.854512471,194
-,3.866122448,164
+,3.854512472,194
+,3.866122449,164
 ,3.877732426,184
-,3.889342403,163
-,3.900952380,173
+,3.889342404,163
+,3.900952381,173
 ,3.912562358,165
-,3.924172335,164
-,3.935782312,182
+,3.924172336,164
+,3.935782313,182
 ,3.947392290,170
-,3.959002267,160
-,3.970612244,173
+,3.959002268,160
+,3.970612245,173
 ,3.982222222,160
-,3.993832199,174
-,4.005442176,179
+,3.993832200,174
+,4.005442177,179
 ,4.017052154,179
-,4.028662131,145
-,4.040272108,196
+,4.028662132,145
+,4.040272109,196
 ,4.051882086,155
 ,4.063492063,170
-,4.075102040,180
+,4.075102041,180
 ,4.086712018,156
 ,4.098321995,159
-,4.109931972,182
+,4.109931973,182
 ,4.121541950,175
 ,4.133151927,173
-,4.144761904,164
+,4.144761905,164
 ,4.156371882,186
 ,4.167981859,160
-,4.179591836,175
+,4.179591837,175
 ,4.191201814,178
 ,4.202811791,159
-,4.214421768,177
+,4.214421769,177
 ,4.226031746,181
 ,4.237641723,177
-,4.249251700,163
+,4.249251701,163
 ,4.260861678,158
 ,4.272471655,188
-,4.284081632,163
-,4.295691609,158
+,4.284081633,163
+,4.295691610,158
 ,4.307301587,164
-,4.318911564,164
-,4.330521541,183
+,4.318911565,164
+,4.330521542,183
 ,4.342131519,160
-,4.353741496,182
-,4.365351473,172
+,4.353741497,182
+,4.365351474,172
 ,4.376961451,172
-,4.388571428,179
-,4.400181405,154
+,4.388571429,179
+,4.400181406,154
 ,4.411791383,166
-,4.423401360,174
-,4.435011337,156
+,4.423401361,174
+,4.435011338,156
 ,4.446621315,174
-,4.458231292,169
-,4.469841269,169
+,4.458231293,169
+,4.469841270,169
 ,4.481451247,178
 ,4.493061224,175
-,4.504671201,193
+,4.504671202,193
 ,4.516281179,153
 ,4.527891156,160
-,4.539501133,176
+,4.539501134,176
 ,4.551111111,167
 ,4.562721088,184
-,4.574331065,163
+,4.574331066,163
 ,4.585941043,150
 ,4.597551020,156
-,4.609160997,182
+,4.609160998,182
 ,4.620770975,168
 ,4.632380952,168
-,4.643990929,152
+,4.643990930,152
 ,4.655600907,174
 ,4.667210884,186
-,4.678820861,168
+,4.678820862,168
 ,4.690430839,173
 ,4.702040816,184
-,4.713650793,169
-,4.725260770,166
+,4.713650794,169
+,4.725260771,166
 ,4.736870748,164
-,4.748480725,193
-,4.760090702,155
+,4.748480726,193
+,4.760090703,155
 ,4.771700680,164
-,4.783310657,181
-,4.794920634,142
+,4.783310658,181
+,4.794920635,142
 ,4.806530612,183
-,4.818140589,181
-,4.829750566,185
+,4.818140590,181
+,4.829750567,185
 ,4.841360544,171
-,4.852970521,184
-,4.864580498,156
+,4.852970522,184
+,4.864580499,156
 ,4.876190476,162
-,4.887800453,182
-,4.899410430,161
+,4.887800454,182
+,4.899410431,161
 ,4.911020408,175
 ,4.922630385,168
-,4.934240362,172
+,4.934240363,172
 ,4.945850340,151
 ,4.957460317,176
-,4.969070294,171
+,4.969070295,171
 ,4.980680272,93
-,0.000000000,4.992290248,mean,169.391,"(mean value, continuous-time average)"
+,0.000000000,4.992290250,mean,169.391,"(mean value, continuous-time average)"
--- a/tests/test-supportprogs/test-supportprogs.sh	Mon Nov 21 16:32:58 2016 +0000
+++ b/tests/test-supportprogs/test-supportprogs.sh	Fri Dec 02 10:04:44 2016 +0000
@@ -6,19 +6,19 @@
 }
 
 xmllint --version 2>/dev/null || \
-    fail "Can't find required xmllint program"
+    fail "Can't find required xmllint program (from libxml2 distribution)"
 
 rapper --version >/dev/null || \
-    fail "Can't find required rapper program"
+    fail "Can't find required rapper program (from raptor/redland distribution)"
 
 iconv --version >/dev/null || \
-    fail "Can't find required iconv program"
+    fail "Can't find required iconv program (usually associated with glibc or libiconv)"
 
 echo '{}' | json_verify >/dev/null || \
-    fail "Can't find required json_verify program, or it doesn't seem to work"
+    fail "Can't find required json_verify program (from yajl distribution), or it doesn't seem to work"
 
 echo '{}' | json_reformat >/dev/null || \
-    fail "Can't find required json_reformat program, or it doesn't seem to work"
+    fail "Can't find required json_reformat program (from yajl distribution), or it doesn't seem to work"
 
 exit 0
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vamp-plugin-sdk-files.pri	Fri Dec 02 10:04:44 2016 +0000
@@ -0,0 +1,24 @@
+
+VAMP_HEADERS += \
+        vamp-plugin-sdk/vamp-hostsdk/PluginBase.h \
+        vamp-plugin-sdk/vamp-hostsdk/PluginBufferingAdapter.h \
+        vamp-plugin-sdk/vamp-hostsdk/PluginChannelAdapter.h \
+        vamp-plugin-sdk/vamp-hostsdk/Plugin.h \
+        vamp-plugin-sdk/vamp-hostsdk/PluginHostAdapter.h \
+        vamp-plugin-sdk/vamp-hostsdk/PluginInputDomainAdapter.h \
+        vamp-plugin-sdk/vamp-hostsdk/PluginLoader.h \
+        vamp-plugin-sdk/vamp-hostsdk/PluginSummarisingAdapter.h \
+        vamp-plugin-sdk/vamp-hostsdk/PluginWrapper.h \
+        vamp-plugin-sdk/vamp-hostsdk/RealTime.h \
+        vamp-plugin-sdk/src/vamp-hostsdk/Window.h
+
+VAMP_SOURCES +=  \
+        vamp-plugin-sdk/src/vamp-hostsdk/PluginBufferingAdapter.cpp \
+        vamp-plugin-sdk/src/vamp-hostsdk/PluginChannelAdapter.cpp \
+        vamp-plugin-sdk/src/vamp-hostsdk/PluginHostAdapter.cpp \
+        vamp-plugin-sdk/src/vamp-hostsdk/PluginInputDomainAdapter.cpp \
+        vamp-plugin-sdk/src/vamp-hostsdk/PluginLoader.cpp \
+        vamp-plugin-sdk/src/vamp-hostsdk/PluginSummarisingAdapter.cpp \
+        vamp-plugin-sdk/src/vamp-hostsdk/PluginWrapper.cpp \
+        vamp-plugin-sdk/src/vamp-hostsdk/RealTime.cpp \
+        vamp-plugin-sdk/src/vamp-hostsdk/Files.cpp
--- a/version.h	Mon Nov 21 16:32:58 2016 +0000
+++ b/version.h	Fri Dec 02 10:04:44 2016 +0000
@@ -1,1 +1,1 @@
-#define RUNNER_VERSION "1.5"
+#define RUNNER_VERSION "1.5pre"