diff --git a/.gitmodules b/.gitmodules
index 5ea9241213d7cafd59acb40c0cbd4d31488326c8..b68dccb93a332e90e7a3a15d2da6e4b3a3b629b7 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -4,15 +4,9 @@
 [submodule "l2ork_addons/cwiid"]
 	path = externals/disis/cwiid
 	url = https://github.com/pd-l2ork/cwiid
-[submodule "externals/fftease"]
-	path = externals/fftease
-	url = https://git.purrdata.net/jwilkes/fftease.git
 [submodule "Gem"]
 	path = Gem
 	url = https://git.purrdata.net/jwilkes/Gem.git
-[submodule "externals/lyonpotpourri"]
-	path = externals/lyonpotpourri
-	url = https://git.purrdata.net/jwilkes/lyonpotpourri3.0.git
 [submodule "l2ork_addons/raspberry_pi/disis_gpio/wiringPi"]
 	path = l2ork_addons/raspberry_pi/disis_gpio/wiringPi
 	url = https://git.purrdata.net/jwilkes/wiringPi.git
diff --git a/externals/fftease b/externals/fftease
deleted file mode 160000
index ecd960938ed5517a765770fe181b094bddae040c..0000000000000000000000000000000000000000
--- a/externals/fftease
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit ecd960938ed5517a765770fe181b094bddae040c
diff --git a/externals/fftease/LICENSE.txt b/externals/fftease/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..aeda5b6324baf5d5a324a555d8bf1c712d3f766b
--- /dev/null
+++ b/externals/fftease/LICENSE.txt
@@ -0,0 +1,20 @@
+FFTease 3.0 is Copyright (c) 1999-2014 Eric Lyon and Christopher Penrose
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions: 
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software. 
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/externals/fftease/MSPd.h b/externals/fftease/MSPd.h
new file mode 100644
index 0000000000000000000000000000000000000000..9b971506ec1a3bed1dacd3c882abc670fe0f0387
--- /dev/null
+++ b/externals/fftease/MSPd.h
@@ -0,0 +1,15 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <time.h>
+
+/* for compiling under XP */
+
+#ifndef PIOVERTWO
+#define PIOVERTWO 1.5707963268
+#endif
+#ifndef TWOPI
+#define TWOPI 6.2831853072
+#endif
+
+
diff --git a/externals/fftease/Makefile b/externals/fftease/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..0698e7c3739f8ae66e23dd0e7c4a73716622b68a
--- /dev/null
+++ b/externals/fftease/Makefile
@@ -0,0 +1,454 @@
+## Pd library template version 1.0.14
+# For instructions on how to use this template, see:
+#  http://puredata.info/docs/developer/MakefileTemplate
+# EL removed liberty link
+LIBRARY_NAME = fftease
+
+# add your .c source files, one object per file, to the SOURCES
+# variable, help files will be included automatically, and for GUI
+# objects, the matching .tcl file too
+SOURCES = bthresher~.c burrow~.c cavoc~.c cavoc27~.c centerring~.c \
+codepend~.c cross~.c dentist~.c disarrain~.c disarray~.c drown~.c \
+enrich~.c ether~.c leaker~.c mindwarp~.c morphine~.c multyq~.c \
+pileup~.c pvcompand~.c pvgrain~.c pvharm~.c pvoc~.c pvtuner~.c pvwarp~.c pvwarpb~.c \
+reanimator~.c resent~.c residency~.c residency_buffer~.c schmear~.c scrape~.c \
+shapee~.c swinger~.c taint~.c thresher~.c vacancy~.c xsyn~.c
+
+# list all pd objects (i.e. myobject.pd) files here, and their helpfiles will
+# be included automatically
+PDOBJECTS = smap.pd
+
+# example patches and related files, in the 'examples' subfolder
+EXAMPLES = 
+
+# manuals and related files, in the 'manual' subfolder
+MANUAL = 
+
+# if you want to include any other files in the source and binary tarballs,
+# list them here.  This can be anything from header files, test patches,
+# documentation, etc.  README.txt and LICENSE.txt are required and therefore
+# automatically included
+EXTRA_DIST = MSPd.h PenroseOscil.h PenroseRand.h bashfest.h fftease.h ugens.h
+
+# unit tests and related files here, in the 'unittests' subfolder
+UNITTESTS = 
+
+
+SHARED_SOURCE = bloscbank.c convert.c fft.c fft4.c fftease_setup.c fftease_utilities.c fold.c leanconvert.c leanunconvert.c legacy.c limit_fftsize.c limited_oscbank.c makewindows.c oscbank.c overlapadd.c PenroseOscil.c PenroseRand.c power_of_two.c qsortE.c unconvert.c 
+SHARED_LIB = lib$(LIBRARY_NAME).$(SHARED_EXTENSION)
+
+#------------------------------------------------------------------------------#
+#
+# things you might need to edit if you are using other C libraries
+#
+#------------------------------------------------------------------------------#
+
+ALL_CFLAGS = -I"$(PD_INCLUDE)"
+ALL_LDFLAGS =  
+SHARED_LDFLAGS =
+ALL_LIBS = 
+
+
+#------------------------------------------------------------------------------#
+#
+# you shouldn't need to edit anything below here, if we did it right :)
+#
+#------------------------------------------------------------------------------#
+
+# these can be set from outside without (usually) breaking the build
+CFLAGS = -Wall -W -g
+# Skip irritating warnings:
+# CFLAGS = -w -g
+LDFLAGS =
+LIBS =
+
+# get library version from meta file
+LIBRARY_VERSION = $(shell sed -n 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' $(LIBRARY_NAME)-meta.pd)
+
+ALL_CFLAGS += -DPD -DVERSION='"$(LIBRARY_VERSION)"'
+
+PD_INCLUDE = $(PD_PATH)/include/pd
+# where to install the library, overridden below depending on platform
+prefix = /usr/local
+libdir = $(prefix)/lib
+pkglibdir = $(libdir)/pd-externals
+objectsdir = $(pkglibdir)
+
+INSTALL = install
+INSTALL_PROGRAM = $(INSTALL) -p -m 644
+INSTALL_DATA = $(INSTALL) -p -m 644
+INSTALL_DIR     = $(INSTALL) -p -m 755 -d
+
+ALLSOURCES := $(SOURCES) $(SOURCES_android) $(SOURCES_cygwin) $(SOURCES_macosx) \
+	         $(SOURCES_iphoneos) $(SOURCES_linux) $(SOURCES_windows)
+
+DISTDIR=$(LIBRARY_NAME)-$(LIBRARY_VERSION)
+ORIGDIR=pd-$(LIBRARY_NAME:~=)_$(LIBRARY_VERSION)
+
+UNAME := $(shell uname -s)
+ifeq ($(UNAME),Darwin)
+  CPU := $(shell uname -p)
+  ifeq ($(CPU),arm) # iPhone/iPod Touch
+    SOURCES += $(SOURCES_iphoneos)
+    EXTENSION = pd_darwin
+    SHARED_EXTENSION = dylib
+    OS = iphoneos
+    PD_PATH = /Applications/Pd-extended.app/Contents/Resources
+    IPHONE_BASE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin
+    CC=$(IPHONE_BASE)/gcc
+    CPP=$(IPHONE_BASE)/cpp
+    CXX=$(IPHONE_BASE)/g++
+    ISYSROOT = -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk
+    IPHONE_CFLAGS = -miphoneos-version-min=3.0 $(ISYSROOT) -arch armv6
+    OPT_CFLAGS = -fast -funroll-loops -fomit-frame-pointer
+    ALL_CFLAGS := $(IPHONE_CFLAGS) $(ALL_CFLAGS)
+    ALL_LDFLAGS += -arch armv6 -bundle -undefined dynamic_lookup $(ISYSROOT)
+    SHARED_LDFLAGS += -arch armv6 -dynamiclib -undefined dynamic_lookup $(ISYSROOT)
+    ALL_LIBS += -lc $(LIBS_iphoneos)
+    STRIP = strip -x
+    DISTBINDIR=$(DISTDIR)-$(OS)
+  else # Mac OS X
+    SOURCES += $(SOURCES_macosx)
+    EXTENSION = pd_darwin
+    SHARED_EXTENSION = dylib
+    OS = macosx
+    PD_PATH = 
+    OPT_CFLAGS = -ftree-vectorize 
+# build universal 32-bit on 10.4 and 32/64 on newer
+    ifeq ($(shell uname -r | sed 's|\([0-9][0-9]*\)\.[0-9][0-9]*\.[0-9][0-9]*|\1|'), 8)
+      FAT_FLAGS = -arch ppc -arch i386 -mmacosx-version-min=10.4
+    else
+      SOURCES += $(SOURCES_iphoneos)
+# Starting with Xcode 4.0, the PowerPC compiler is not installed by default
+      ifeq ($(wildcard /usr/llvm-gcc-4.2/libexec/gcc/powerpc*), )
+        FAT_FLAGS = -arch i386 -arch x86_64 -mmacosx-version-min=10.5
+      else
+        FAT_FLAGS = -arch ppc -arch i386 -arch x86_64 -mmacosx-version-min=10.4
+      endif
+    endif
+    ALL_CFLAGS += $(FAT_FLAGS) -fPIC -I/sw/include
+    # if the 'pd' binary exists, check the linking against it to aid with stripping
+    BUNDLE_LOADER = $(shell test ! -e $(PD_PATH)/bin/pd || echo -bundle_loader $(PD_PATH)/bin/pd)
+    ALL_LDFLAGS += $(FAT_FLAGS) -headerpad_max_install_names -bundle $(BUNDLE_LOADER) \
+	-undefined dynamic_lookup 
+    SHARED_LDFLAGS += $(FAT_FLAGS) -dynamiclib -undefined dynamic_lookup \
+	-install_name @loader_path/$(SHARED_LIB) -compatibility_version 1 -current_version 1.0
+    ALL_LIBS += -lc $(LIBS_macosx)
+    STRIP = strip -x
+    DISTBINDIR=$(DISTDIR)-$(OS)
+# install into ~/Library/Pd on Mac OS X since /usr/local isn't used much
+    pkglibdir=$(HOME)/Library/Pd
+  endif
+endif
+# Tho Android uses Linux, we use this fake uname to provide an easy way to
+# setup all this things needed to cross-compile for Android using the NDK
+ifeq ($(UNAME),ANDROID)
+  CPU := arm
+  SOURCES += $(SOURCES_android)
+  EXTENSION = pd_linux
+  SHARED_EXTENSION = so
+  OS = android
+  PD_PATH = /usr
+  NDK_BASE := /usr/local/android-ndk
+  NDK_PLATFORM_VERSION := 5
+  NDK_SYSROOT=$(NDK_BASE)/platforms/android-$(NDK_PLATFORM_VERSION)/arch-arm
+  NDK_UNAME := $(shell uname -s | tr '[A-Z]' '[a-z]')
+  NDK_TOOLCHAIN_BASE=$(NDK_BASE)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/$(NDK_UNAME)-x86
+  CC := $(NDK_TOOLCHAIN_BASE)/bin/arm-linux-androideabi-gcc --sysroot=$(NDK_SYSROOT)
+  OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer
+  CFLAGS += 
+  LDFLAGS += -rdynamic -shared
+  SHARED_LDFLAGS += -Wl,-soname,$(SHARED_LIB) -shared
+  LIBS += -lc $(LIBS_android)
+  STRIP := $(NDK_TOOLCHAIN_BASE)/bin/arm-linux-androideabi-strip \
+	--strip-unneeded -R .note -R .comment
+  DISTBINDIR=$(DISTDIR)-$(OS)-$(shell uname -m)
+endif
+ifeq ($(UNAME),Linux)
+  CPU := $(shell uname -m)
+  SOURCES += $(SOURCES_linux)
+  EXTENSION = pd_linux
+  SHARED_EXTENSION = so
+  OS = linux
+  PD_PATH = /usr
+  OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer
+  ALL_CFLAGS += -fPIC
+  ALL_LDFLAGS += -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags
+  SHARED_LDFLAGS += -Wl,-soname,$(SHARED_LIB) -shared
+  ALL_LIBS += -lc $(LIBS_linux)
+  STRIP = strip --strip-unneeded -R .note -R .comment
+  DISTBINDIR=$(DISTDIR)-$(OS)-$(shell uname -m)
+endif
+ifeq ($(UNAME),GNU)
+  # GNU/Hurd, should work like GNU/Linux for basically all externals
+  CPU := $(shell uname -m)
+  SOURCES += $(SOURCES_linux)
+  EXTENSION = pd_linux
+  SHARED_EXTENSION = so
+  OS = linux
+  PD_PATH = /usr
+  OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer
+  ALL_CFLAGS += -fPIC
+  ALL_LDFLAGS += -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags
+  SHARED_LDFLAGS += -shared -Wl,-soname,$(SHARED_LIB)
+  ALL_LIBS += -lc $(LIBS_linux)
+  STRIP = strip --strip-unneeded -R .note -R .comment
+  DISTBINDIR=$(DISTDIR)-$(OS)-$(shell uname -m)
+endif
+ifeq ($(UNAME),GNU/kFreeBSD)
+  # Debian GNU/kFreeBSD, should work like GNU/Linux for basically all externals
+  CPU := $(shell uname -m)
+  SOURCES += $(SOURCES_linux)
+  EXTENSION = pd_linux
+  SHARED_EXTENSION = so
+  OS = linux
+  PD_PATH = /usr
+  OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer
+  ALL_CFLAGS += -fPIC
+  ALL_LDFLAGS += -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags
+  SHARED_LDFLAGS += -shared -Wl,-soname,$(SHARED_LIB)
+  ALL_LIBS += -lc $(LIBS_linux)
+  STRIP = strip --strip-unneeded -R .note -R .comment
+  DISTBINDIR=$(DISTDIR)-$(OS)-$(shell uname -m)
+endif
+ifeq (CYGWIN,$(findstring CYGWIN,$(UNAME)))
+  CPU := $(shell uname -m)
+  SOURCES += $(SOURCES_cygwin)
+  EXTENSION = dll
+  SHARED_EXTENSION = dll
+  OS = cygwin
+  PD_PATH = $(shell cygpath $$PROGRAMFILES)/pd
+  OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer
+  ALL_CFLAGS += 
+  ALL_LDFLAGS += -rdynamic -shared -L"$(PD_PATH)/src" -L"$(PD_PATH)/bin"
+  SHARED_LDFLAGS += -shared -Wl,-soname,$(SHARED_LIB)
+  ALL_LIBS += -lc -lpd $(LIBS_cygwin)
+  STRIP = strip --strip-unneeded -R .note -R .comment
+  DISTBINDIR=$(DISTDIR)-$(OS)
+endif
+ifeq (MINGW,$(findstring MINGW,$(UNAME)))
+  CPU := $(shell uname -m)
+  SOURCES += $(SOURCES_windows)
+  EXTENSION = dll
+  SHARED_EXTENSION = dll
+  OS = windows
+  PD_PATH = $(shell cd "$$PROGRAMFILES/pd" && pwd)
+  # MinGW doesn't seem to include cc so force gcc
+  CC=gcc
+  OPT_CFLAGS = -O3 -funroll-loops -fomit-frame-pointer
+  ALL_CFLAGS += -mms-bitfields
+  ALL_LDFLAGS += -s -shared -Wl,--enable-auto-import
+  SHARED_LDFLAGS += -shared
+  ALL_LIBS += -L"$(PD_PATH)/src" -L"$(PD_PATH)/bin" -L"$(PD_PATH)/obj" \
+	-lpd -lwsock32 -lkernel32 -luser32 -lgdi32 $(LIBS_windows)
+  STRIP = strip --strip-unneeded -R .note -R .comment
+  DISTBINDIR=$(DISTDIR)-$(OS)
+endif
+
+# in case somebody manually set the HELPPATCHES above
+HELPPATCHES ?= $(SOURCES:.c=-help.pd) $(PDOBJECTS:.pd=-help.pd)
+
+ALL_CFLAGS := $(ALL_CFLAGS) $(CFLAGS) $(OPT_CFLAGS)
+ALL_LDFLAGS := $(LDFLAGS) $(ALL_LDFLAGS)
+ALL_LIBS := $(LIBS) $(ALL_LIBS)
+
+SHARED_SOURCE ?= $(wildcard lib$(LIBRARY_NAME).c)
+SHARED_HEADER ?= $(shell test ! -e $(LIBRARY_NAME).h || echo $(LIBRARY_NAME).h)
+SHARED_LIB ?= $(SHARED_SOURCE:.c=.$(SHARED_EXTENSION))
+SHARED_TCL_LIB = $(wildcard lib$(LIBRARY_NAME).tcl)
+
+.PHONY = install libdir_install single_install install-doc install-examples install-manual install-unittests clean distclean dist etags $(LIBRARY_NAME)
+
+all: $(SOURCES:.c=.$(EXTENSION)) $(SHARED_LIB)
+
+%.o: %.c
+	$(CC) $(ALL_CFLAGS) -o "$*.o" -c "$*.c"
+
+%.$(EXTENSION): %.o $(SHARED_LIB)
+	$(CC) $(ALL_LDFLAGS) -o "$*.$(EXTENSION)" "$*.o"  $(ALL_LIBS) $(SHARED_LIB)
+	chmod a-x "$*.$(EXTENSION)"
+
+# this links everything into a single binary file
+$(LIBRARY_NAME): $(SOURCES:.c=.o) $(LIBRARY_NAME).o lib$(LIBRARY_NAME).o
+	$(CC) $(ALL_LDFLAGS) -o $(LIBRARY_NAME).$(EXTENSION) $(SOURCES:.c=.o) \
+		$(LIBRARY_NAME).o lib$(LIBRARY_NAME).o $(ALL_LIBS)
+	chmod a-x $(LIBRARY_NAME).$(EXTENSION)
+
+$(SHARED_LIB): $(SHARED_SOURCE:.c=.o)
+	$(CC) $(SHARED_LDFLAGS) -o $(SHARED_LIB) $(SHARED_SOURCE:.c=.o) $(ALL_LIBS)
+
+install: libdir_install
+
+# The meta and help files are explicitly installed to make sure they are
+# actually there.  Those files are not optional, then need to be there.
+libdir_install: $(SOURCES:.c=.$(EXTENSION)) $(SHARED_LIB) install-doc install-examples install-manual install-unittests
+	$(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+	$(INSTALL_DATA) $(LIBRARY_NAME)-meta.pd \
+		$(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+	test -z "$(strip $(SOURCES))" || (\
+		$(INSTALL_PROGRAM) $(SOURCES:.c=.$(EXTENSION)) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME) && \
+		$(STRIP) $(addprefix $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/,$(SOURCES:.c=.$(EXTENSION))))
+	test -z "$(strip $(SHARED_LIB))" || \
+		$(INSTALL_DATA) $(SHARED_LIB) \
+			$(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+	test -z "$(strip $(wildcard $(SOURCES:.c=.tcl)))" || \
+		$(INSTALL_DATA) $(wildcard $(SOURCES:.c=.tcl)) \
+			$(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+	test -z "$(strip $(PDOBJECTS))" || \
+		$(INSTALL_DATA) $(PDOBJECTS) \
+			$(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+	test -z "$(strip $(SHARED_TCL_LIB))" || \
+		$(INSTALL_DATA) $(SHARED_TCL_LIB) \
+			$(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+
+# install library linked as single binary
+single_install: $(LIBRARY_NAME) install-doc install-examples install-manual install-unittests
+	$(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+	$(INSTALL_PROGRAM) $(LIBRARY_NAME).$(EXTENSION) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+	$(STRIP) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/$(LIBRARY_NAME).$(EXTENSION)
+
+install-doc:
+	$(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+	test -z "$(strip $(SOURCES) $(PDOBJECTS))" || \
+		$(INSTALL_DATA) $(HELPPATCHES) \
+			$(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+	$(INSTALL_DATA) README.txt $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/README.txt
+	$(INSTALL_DATA) LICENSE.txt $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/LICENSE.txt
+
+install-examples:
+	test -z "$(strip $(EXAMPLES))" || \
+		$(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/examples && \
+		for file in $(EXAMPLES); do \
+			$(INSTALL_DATA) examples/$$file $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/examples; \
+		done
+
+install-manual:
+	test -z "$(strip $(MANUAL))" || \
+		$(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/manual && \
+		for file in $(MANUAL); do \
+			$(INSTALL_DATA) manual/$$file $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/manual; \
+		done
+
+install-unittests:
+	test -z "$(strip $(UNITTESTS))" || \
+		$(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/unittests && \
+		for file in $(UNITTESTS); do \
+			$(INSTALL_DATA) unittests/$$file $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/unittests; \
+		done
+
+clean:
+	-rm -f -- $(SOURCES:.c=.o) $(SOURCES_LIB:.c=.o) $(SHARED_SOURCE:.c=.o)
+	-rm -f -- $(SOURCES:.c=.$(EXTENSION))
+	-rm -f -- $(LIBRARY_NAME).o
+	-rm -f -- $(LIBRARY_NAME).$(EXTENSION)
+	-rm -f -- $(SHARED_LIB)
+
+distclean: clean
+	-rm -f -- $(DISTBINDIR).tar.gz
+	-rm -rf -- $(DISTBINDIR)
+	-rm -f -- $(DISTDIR).tar.gz
+	-rm -rf -- $(DISTDIR)
+	-rm -f -- $(ORIGDIR).tar.gz
+	-rm -rf -- $(ORIGDIR)
+
+
+$(DISTBINDIR):
+	$(INSTALL_DIR) $(DISTBINDIR)
+
+libdir: all $(DISTBINDIR)
+	$(INSTALL_DATA) $(LIBRARY_NAME)-meta.pd  $(DISTBINDIR)
+	$(INSTALL_DATA) $(SOURCES) $(SHARED_SOURCE) $(SHARED_HEADER) $(DISTBINDIR)
+	$(INSTALL_DATA) $(HELPPATCHES) $(DISTBINDIR)
+	test -z "$(strip $(EXTRA_DIST))" || \
+		$(INSTALL_DATA) $(EXTRA_DIST)    $(DISTBINDIR)
+#	tar --exclude-vcs -czpf $(DISTBINDIR).tar.gz $(DISTBINDIR)
+
+$(DISTDIR):
+	$(INSTALL_DIR) $(DISTDIR)
+
+$(ORIGDIR):
+	$(INSTALL_DIR) $(ORIGDIR)
+
+dist: $(DISTDIR)
+	$(INSTALL_DATA) Makefile  $(DISTDIR)
+	$(INSTALL_DATA) README.txt $(DISTDIR)
+	$(INSTALL_DATA) LICENSE.txt $(DISTDIR)
+	$(INSTALL_DATA) $(LIBRARY_NAME)-meta.pd  $(DISTDIR)
+	test -z "$(strip $(ALLSOURCES))" || \
+		$(INSTALL_DATA) $(ALLSOURCES)  $(DISTDIR)
+	test -z "$(strip $(wildcard $(ALLSOURCES:.c=.tcl)))" || \
+		$(INSTALL_DATA) $(wildcard $(ALLSOURCES:.c=.tcl))  $(DISTDIR)
+	test -z "$(strip $(wildcard $(LIBRARY_NAME).c))" || \
+		$(INSTALL_DATA) $(LIBRARY_NAME).c  $(DISTDIR)
+	test -z "$(strip $(SHARED_HEADER))" || \
+		$(INSTALL_DATA) $(SHARED_HEADER)  $(DISTDIR)
+	test -z "$(strip $(SHARED_SOURCE))" || \
+		$(INSTALL_DATA) $(SHARED_SOURCE)  $(DISTDIR)
+	test -z "$(strip $(SHARED_TCL_LIB))" || \
+		$(INSTALL_DATA) $(SHARED_TCL_LIB)  $(DISTDIR)
+	test -z "$(strip $(PDOBJECTS))" || \
+		$(INSTALL_DATA) $(PDOBJECTS)  $(DISTDIR)
+	test -z "$(strip $(HELPPATCHES))" || \
+		$(INSTALL_DATA) $(HELPPATCHES) $(DISTDIR)
+	test -z "$(strip $(EXTRA_DIST))" || \
+		$(INSTALL_DATA) $(EXTRA_DIST)    $(DISTDIR)
+	test -z "$(strip $(EXAMPLES))" || \
+		$(INSTALL_DIR) $(DISTDIR)/examples && \
+		for file in $(EXAMPLES); do \
+			$(INSTALL_DATA) examples/$$file $(DISTDIR)/examples; \
+		done
+	test -z "$(strip $(MANUAL))" || \
+		$(INSTALL_DIR) $(DISTDIR)/manual && \
+		for file in $(MANUAL); do \
+			$(INSTALL_DATA) manual/$$file $(DISTDIR)/manual; \
+		done
+	test -z "$(strip $(UNITTESTS))" || \
+		$(INSTALL_DIR) $(DISTDIR)/unittests && \
+		for file in $(UNITTESTS); do \
+			$(INSTALL_DATA) unittests/$$file $(DISTDIR)/unittests; \
+		done
+	tar --exclude-vcs -czpf $(DISTDIR).tar.gz $(DISTDIR)
+
+# make a Debian source package
+dpkg-source:
+	debclean
+	make distclean dist
+	mv $(DISTDIR) $(ORIGDIR)
+	tar --exclude-vcs -czpf ../$(ORIGDIR).orig.tar.gz $(ORIGDIR)
+	rm -f -- $(DISTDIR).tar.gz
+	rm -rf -- $(DISTDIR) $(ORIGDIR)
+	cd .. && dpkg-source -b $(LIBRARY_NAME)
+
+etags: TAGS
+
+TAGS: $(wildcard $(PD_INCLUDE)/*.h) $(SOURCES) $(SHARED_SOURCE) $(SHARED_HEADER)
+	etags $(wildcard $(PD_INCLUDE)/*.h)
+	etags -a *.h $(SOURCES) $(SHARED_SOURCE) $(SHARED_HEADER)
+	etags -a --language=none --regex="/proc[ \t]+\([^ \t]+\)/\1/" *.tcl
+
+showsetup:
+	@echo "CC: $(CC)"
+	@echo "CFLAGS: $(CFLAGS)"
+	@echo "LDFLAGS: $(LDFLAGS)"
+	@echo "LIBS: $(LIBS)"
+	@echo "ALL_CFLAGS: $(ALL_CFLAGS)"
+	@echo "ALL_LDFLAGS: $(ALL_LDFLAGS)"
+	@echo "ALL_LIBS: $(ALL_LIBS)"
+	@echo "PD_INCLUDE: $(PD_INCLUDE)"
+	@echo "PD_PATH: $(PD_PATH)"
+	@echo "objectsdir: $(objectsdir)"
+	@echo "LIBRARY_NAME: $(LIBRARY_NAME)"
+	@echo "LIBRARY_VERSION: $(LIBRARY_VERSION)"
+	@echo "SOURCES: $(SOURCES)"
+	@echo "SHARED_HEADER: $(SHARED_HEADER)"
+	@echo "SHARED_SOURCE: $(SHARED_SOURCE)"
+	@echo "SHARED_LIB: $(SHARED_LIB)"
+	@echo "SHARED_TCL_LIB: $(SHARED_TCL_LIB)"
+	@echo "PDOBJECTS: $(PDOBJECTS)"
+	@echo "ALLSOURCES: $(ALLSOURCES)"
+	@echo "ALLSOURCES TCL: $(wildcard $(ALLSOURCES:.c=.tcl))"
+	@echo "UNAME: $(UNAME)"
+	@echo "CPU: $(CPU)"
+	@echo "pkglibdir: $(pkglibdir)"
+	@echo "DISTDIR: $(DISTDIR)"
+	@echo "ORIGDIR: $(ORIGDIR)"
diff --git a/externals/fftease/PenroseOscil.c b/externals/fftease/PenroseOscil.c
new file mode 100644
index 0000000000000000000000000000000000000000..7d581455129b67ec2dd1cddf977ab786485f29ab
--- /dev/null
+++ b/externals/fftease/PenroseOscil.c
@@ -0,0 +1,40 @@
+#include <math.h>
+#include "PenroseOscil.h"
+
+
+t_float fftease_frequencyToIncrement( t_float samplingRate, t_float frequency, int bufferLength ) {
+
+  return (frequency / samplingRate) * (t_float) bufferLength;
+} 
+
+void fftease_makeSineBuffer( t_float *buffer, int bufferLength ) {
+  
+  int   i;
+
+  float myTwoPi = 8. * atan(1.);
+
+  for ( i=0; i <= bufferLength; i++ )
+    *(buffer+i) = sin( myTwoPi * ((t_float) i / (t_float) bufferLength) );
+
+  return;
+}
+
+
+t_float fftease_bufferOscil( t_float *phase, t_float increment, t_float *buffer,
+                   int bufferLength )
+{
+
+  t_float sample;
+
+  while ( *phase > bufferLength )
+    *phase -= bufferLength;
+
+  while ( *phase < 0. )
+    *phase += bufferLength;
+
+  sample = *( buffer + (int) (*phase) );
+
+  *phase += increment;
+
+  return sample;
+}
diff --git a/externals/fftease/PenroseOscil.h b/externals/fftease/PenroseOscil.h
new file mode 100644
index 0000000000000000000000000000000000000000..737975baac078da3e3b0b3e5582e6c64b8992940
--- /dev/null
+++ b/externals/fftease/PenroseOscil.h
@@ -0,0 +1,5 @@
+#include "fftease.h"
+
+t_float frequencyToIncrement( t_float samplingRate, t_float frequency, int bufferLength );
+void makeSineBuffer( t_float *buffer, int bufferLength );
+t_float bufferOscil( t_float *phase, t_float increment, t_float *buffer, int bufferLength );
diff --git a/externals/fftease/PenroseRand.c b/externals/fftease/PenroseRand.c
new file mode 100644
index 0000000000000000000000000000000000000000..e086a6e931f2c8a8f569b467babce875f88a5259
--- /dev/null
+++ b/externals/fftease/PenroseRand.c
@@ -0,0 +1,13 @@
+#include "PenroseRand.h"
+
+float fftease_rrand(int *seed)
+{
+    int i = ((*seed = *seed * 1103515245 + 12345)>>16) & 077777;
+    return((float)i/16384. - 1.);
+}
+
+float fftease_prand(int *seed)
+{
+    int i = ((*seed = *seed * 1103515245 + 12345)>>16) & 077777;
+    return((float)i/32768.);
+}
diff --git a/externals/fftease/PenroseRand.h b/externals/fftease/PenroseRand.h
new file mode 100644
index 0000000000000000000000000000000000000000..89e0f44fdeaad4825e8236013e39876e385f067b
--- /dev/null
+++ b/externals/fftease/PenroseRand.h
@@ -0,0 +1,3 @@
+
+float fftease_rrand(int *seed);
+float fftease_prand(int *seed);
diff --git a/externals/fftease/README.txt b/externals/fftease/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..75015e0bae910e88f5eae60fcec9d6a301a048f5
--- /dev/null
+++ b/externals/fftease/README.txt
@@ -0,0 +1,49 @@
+About FFTease 3.0
+
+FFTease is a collection of objects designed to facilitate spectral sound
+processing in Max. The collection was designed by Eric Lyon and
+Christopher Penrose in 1999, and has been maintained by Eric Lyon since
+2003. 
+
+
+Installation 
+
+
+The contents of "fftease32-externals" were compiled on Mac OSX 10.9.3
+and should work on Intel-based Mac computers. For other Unix-based
+computers, just type 'make' to build executables appropriate for your
+computer. Then type 'perl collect.pl' to collect all the externals to
+the "fftease32-externals" folder. Finally, move "fftease32-externals"
+and "fftease32-help" to a Pd-accessible location.
+
+
+Performance Considerations
+
+
+The default Pd audio buffer settings for both I/O vector size and signal
+vector size will work fine for FFT sizes up to around 4096 or so. For
+larger FFT sizes, adjusting the Pd signal vector size and I/O vector
+size upward can dramatically improve performance. With larger FFT sizes,
+the reported CPU load may fluctuate. This is because a large FFT is
+being performed only once for several vectors worth of samples. The
+default FFT size is 1024, and the default overlap factor is 8. The
+maximum FFT size is 1073741824. Let me know if you find a computer
+powerful enough to compute the maximum FFT size in real-time. 
+
+
+For Coders 
+
+
+Full source code is included, so that intrepid coders may extend
+FFTease, or even code up a 64-bit version. (Note that current 64-bit
+versions of Pd compute all DSP with 32-bit resolution, thus a 64-bit
+port does not yet seem advisable.) The FFTease code is distributed under
+the MIT license to facilitate deployment to any combination of free,
+open-source, commercial, or closed-source projects.
+
+Have fun!
+
+Eric Lyon
+ericlyon@vt.edu
+Blacksburg, Virginia
+July, 2014
\ No newline at end of file
diff --git a/externals/fftease/bloscbank.c b/externals/fftease/bloscbank.c
new file mode 100644
index 0000000000000000000000000000000000000000..f09185406b4ef8a64d56f1833f89b811de20600d
--- /dev/null
+++ b/externals/fftease/bloscbank.c
@@ -0,0 +1,34 @@
+
+#include "fftease.h"
+
+void fftease_bloscbank( t_float *S, t_float *O, int D, t_float iD, t_float *lf, t_float *la, t_float *index, t_float *tab,
+			   int len, t_float synt, int lo, int hi )
+{
+	int    amp,freq,chan, i;
+
+	t_float    a,ainc,f,finc,address;
+
+	for ( chan = lo; chan < hi; chan++ ) {
+
+		freq = ( amp = ( chan << 1 ) ) + 1;
+		if ( S[amp] > synt ){
+			finc = ( S[freq] - ( f = lf[chan] ) )* iD;
+			ainc = ( S[amp] - ( a = la[chan] ) )* iD;
+			address = index[chan];
+			for ( i = 0; i < D ; i++ ) {
+				O[i] += a*tab[ (int) address ];
+
+				address += f;
+				while ( address >= len )
+					address -= len;
+				while ( address < 0 )
+					address += len;
+				a += ainc;
+				f += finc;
+			}
+			lf[chan] = S[freq];
+			la[chan] = S[amp];
+			index[chan] = address;
+		}
+	}
+}
\ No newline at end of file
diff --git a/externals/fftease/bthresher~.c b/externals/fftease/bthresher~.c
new file mode 100644
index 0000000000000000000000000000000000000000..748aced6263e0cb8a0474230e9bcb39f5a2311ac
--- /dev/null
+++ b/externals/fftease/bthresher~.c
@@ -0,0 +1,486 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *bthresher_class;
+
+#define OBJECT_NAME "bthresher~"
+
+typedef struct _bthresher
+{
+	t_object x_obj;
+    float x_f;
+	t_fftease *fft;
+	/* bthresher vars */
+	t_float *move_threshold;
+	t_float *composite_frame ;
+	int *frames_left;
+	int max_hold_frames;
+	t_float max_hold_time;
+	int first_frame;
+	t_float *damping_factor ;
+	t_float thresh_scalar;
+	t_float damp_scalar;
+	short thresh_connected;
+	short damping_connected;
+	void *list_outlet;
+	void *misc_outlet;
+	t_atom *list_data;
+	short mute;
+	short bypass;
+	t_float init_thresh;
+	t_float init_damping;
+	t_float tadv;
+	short inf_hold;
+} t_bthresher;
+
+
+void *bthresher_new(t_symbol *s, int argc, t_atom *argv);
+void bthresher_dsp(t_bthresher *x, t_signal **sp);
+t_int *bthresher_perform(t_int *w);
+void bthresher_mute(t_bthresher *x, t_float f);
+void bthresher_fftinfo(t_bthresher *x);
+void bthresher_free(t_bthresher *x);
+void bthresher_bin(t_bthresher *x, t_float bin_num, t_float threshold, t_float damper);
+void bthresher_rdamper(t_bthresher *x, t_float min, t_float max );
+void bthresher_rthreshold(t_bthresher *x, t_float min, t_float max);
+void bthresher_dump(t_bthresher *x );
+void bthresher_list (t_bthresher *x, t_symbol *msg, short argc, t_atom *argv);
+void bthresher_init(t_bthresher *x);
+t_float bthresher_boundrand(t_float min, t_float max);
+void bthresher_allthresh(t_bthresher *x, t_float f);
+void bthresher_alldamp(t_bthresher *x, t_float f);
+void bthresher_inf_hold(t_bthresher *x, t_float f);
+void bthresher_max_hold(t_bthresher *x, t_float f);
+void do_bthresher(t_bthresher *x);
+void bthresher_oscbank(t_bthresher *x, t_float flag);
+void bthresher_synthresh(t_bthresher *x, t_float thresh);
+void bthresher_transpose(t_bthresher *x, t_float tf);
+
+void bthresher_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("bthresher~"), (t_newmethod)bthresher_new,
+                  (t_method)bthresher_free,sizeof(t_bthresher), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_bthresher, x_f);
+	class_addmethod(c,(t_method)bthresher_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)bthresher_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(c,(t_method)bthresher_fftinfo,gensym("fftinfo"),0);
+	class_addmethod(c,(t_method)bthresher_oscbank,gensym("oscbank"),A_FLOAT,0);
+	class_addmethod(c,(t_method)bthresher_transpose,gensym("transpose"),A_FLOAT,0);
+	class_addmethod(c,(t_method)bthresher_synthresh,gensym("synthresh"),A_FLOAT,0);
+	class_addmethod(c,(t_method)bthresher_bin, gensym("bin"), A_FLOAT, A_FLOAT, A_FLOAT, 0);
+	class_addmethod(c,(t_method)bthresher_rdamper, gensym("rdamper"), A_DEFFLOAT, A_DEFFLOAT, 0);
+	class_addmethod(c,(t_method)bthresher_rthreshold, gensym("rthreshold"), A_DEFFLOAT, A_DEFFLOAT, 0);
+	class_addmethod(c,(t_method)bthresher_dump,gensym("dump"),0);
+	class_addmethod(c,(t_method)bthresher_list,gensym("list"),A_GIMME,0);
+	class_addmethod(c,(t_method)bthresher_alldamp,gensym("alldamp"),A_FLOAT,0);
+	class_addmethod(c,(t_method)bthresher_allthresh,gensym("allthresh"),A_FLOAT,0);
+	class_addmethod(c,(t_method)bthresher_inf_hold,gensym("inf_hold"),A_FLOAT,0);
+	class_addmethod(c,(t_method)bthresher_max_hold,gensym("max_hold"),A_FLOAT,0);
+    bthresher_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+
+void bthresher_fftinfo( t_bthresher *x )
+{
+	fftease_fftinfo( x->fft, OBJECT_NAME );
+}
+
+void bthresher_free( t_bthresher *x ){
+	t_fftease *fft = x->fft;
+	fftease_free(fft);
+	/* external-specific memory */
+	free(x->composite_frame);
+	free(x->frames_left);
+	free(x->move_threshold);
+	free(x->damping_factor);
+	free(x->list_data);
+}
+
+void bthresher_max_hold(t_bthresher *x, t_float f)
+{
+	if(f<=0)
+		return;
+	x->max_hold_time = f * .001;
+	x->max_hold_frames = x->max_hold_time / x->tadv;
+}
+
+void bthresher_inf_hold(t_bthresher *x, t_float f)
+{
+	x->inf_hold = (int)f;
+}
+
+void bthresher_allthresh(t_bthresher *x, t_float f)
+{
+	int i;
+	t_fftease *fft = x->fft;
+	//post("thresh %f",f);
+	for(i=0;i < fft->N2+1;i++)
+		x->move_threshold[i] = f;
+}
+
+void bthresher_alldamp(t_bthresher *x, t_float f)
+{
+	int i;
+	t_fftease *fft = x->fft;
+    
+	//post("damp %f",f);
+	for(i=0;i < fft->N2+1;i++)
+		x->damping_factor[i] = f;
+}
+
+void bthresher_mute(t_bthresher *x, t_float f){
+	x->mute = f;
+}
+
+
+void bthresher_list (t_bthresher *x, t_symbol *msg, short argc, t_atom *argv) {
+	int i, bin, idiv;
+	t_float fdiv;
+	t_float *damping_factor = x->damping_factor;
+	t_float *move_threshold = x->move_threshold;
+	
+	//	post("reading %d elements", argc);
+	idiv = fdiv = (t_float) argc / 3.0 ;
+	if( fdiv - idiv > 0.0 ) {
+		post("list must be in triplets");
+		return;
+	}
+	
+	for( i = 0; i < argc; i += 3 ) {
+		bin = atom_getintarg(i,argc,argv);
+		damping_factor[bin] = atom_getfloatarg(i+1,argc,argv);
+		move_threshold[bin] = atom_getfloatarg(i+2,argc,argv);
+		
+	}
+}
+
+void bthresher_dump (t_bthresher *x) {
+	
+	t_atom *list_data = x->list_data;
+	t_float *damping_factor = x->damping_factor;
+	t_float *move_threshold = x->move_threshold;
+	
+	int i,j, count;
+    
+	for( i = 0, j = 0; i < x->fft->N2 * 3 ; i += 3, j++ ) {
+        
+		SETFLOAT(list_data+i,(t_float)j);
+		SETFLOAT(list_data+(i+1),damping_factor[j]);
+		SETFLOAT(list_data+(i+2),move_threshold[j]);
+	}
+	
+	count = x->fft->N2 * 3;
+	outlet_list(x->list_outlet,0,count,list_data);
+	
+	return;
+}
+
+void *bthresher_new(t_symbol *s, int argc, t_atom *argv)
+{
+    t_fftease *fft;
+    
+	t_bthresher *x = (t_bthresher *)pd_new(bthresher_class);
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+    x->list_outlet = outlet_new(&x->x_obj, gensym("list"));
+    
+	
+	x->fft = (t_fftease *) calloc( 1, sizeof(t_fftease) );
+	
+	fft = x->fft;
+	fft->initialized = 0;
+	x->init_thresh = 0.1;
+	x->init_damping = 0.99;
+    
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+    
+	return x;
+}
+
+
+
+void bthresher_transpose(t_bthresher *x, t_float tf)
+{
+	x->fft->P = (t_float) tf;
+}
+
+void bthresher_synthresh(t_bthresher *x, t_float thresh)
+{
+	x->fft->synt = (t_float) thresh;
+}
+
+void bthresher_init(t_bthresher *x)
+{
+	int i;
+	t_fftease *fft = x->fft;
+    
+	short initialized = fft->initialized;
+	fftease_init(fft);
+	
+	if(!initialized){
+		x->first_frame = 1;
+		x->max_hold_time = 60.0 ;
+		x->thresh_connected = 0;
+		x->damping_connected = 0;
+		x->thresh_scalar = 1;
+		x->damp_scalar = 1;
+		x->mute = 0;
+		x->bypass = 0;
+		x->inf_hold = 0;
+		x->composite_frame = (t_float *) calloc(fft->N + 2, sizeof(t_float));
+		x->frames_left = (int *) calloc(fft->N + 2, sizeof(int));
+		
+		
+		// TRIPLETS OF bin# damp_factor threshold
+		x->list_data = (t_atom *) calloc((fft->N2 + 1) * 3, sizeof(t_atom));
+		x->move_threshold = (t_float *) calloc((fft->N2+1), sizeof(t_float));
+		x->damping_factor = (t_float *) calloc((fft->N2+1), sizeof(t_float));
+        
+		for(i = 0; i < fft->N2+1; i++) {
+			x->move_threshold[i] = x->init_thresh;
+			x->damping_factor[i] = x->init_damping;
+		}
+	} else {
+		x->list_data = (t_atom *) realloc((void *)x->list_data, (fft->N2 + 1) * 3 * sizeof(t_atom));
+		x->move_threshold = (t_float *) realloc((void *)x->move_threshold, (fft->N2+1) * sizeof(t_float));
+		x->damping_factor = (t_float *) realloc((void *)x->damping_factor, (fft->N2+1) * sizeof(t_float));
+	}
+    // NEED TO HANDLE REALLOC CASE!!!
+    
+	x->tadv = (t_float) fft->D / (t_float) fft->R;
+	x->max_hold_frames = x->max_hold_time / x->tadv;
+}
+
+void bthresher_version(void)
+{
+	fftease_version(OBJECT_NAME);
+}
+
+void bthresher_rdamper(t_bthresher *x,  t_float min, t_float max)
+{
+	int i;
+	
+	for( i = 0; i < x->fft->N2; i++ ) {
+		x->damping_factor[i] = bthresher_boundrand(min, max);
+	}
+}
+
+void bthresher_rthreshold( t_bthresher *x,  t_float min, t_float max )
+{
+	int i;
+	for( i = 0; i < x->fft->N2; i++ ) {
+		x->move_threshold[i] = bthresher_boundrand(min, max);
+	}
+}
+
+
+void bthresher_bin(t_bthresher *x, t_float bin_num, t_float damper, t_float threshold)
+{
+	int bn = (int) bin_num;
+	if( bn >= 0 && bn < x->fft->N2 ){
+		//    post("setting %d to %f %f",bn,threshold,damper);
+		x->move_threshold[bn] = threshold;
+		x->damping_factor[bn] = damper;
+	} else {
+		post("bthresher~: %d is out of range", bn);
+	}
+}
+
+
+void do_bthresher(t_bthresher *x)
+{
+	t_fftease *fft = x->fft;
+    
+	int N = fft->N;
+    
+	t_float *channel = fft->channel;
+	t_float *damping_factor = x->damping_factor;
+	t_float *move_threshold = x->move_threshold;
+	t_float *composite_frame = x->composite_frame;
+	int max_hold_frames = x->max_hold_frames;
+	int *frames_left = x->frames_left;
+	t_float thresh_scalar = x->thresh_scalar;
+	t_float damp_scalar = x->damp_scalar;
+	short inf_hold = x->inf_hold;
+	int i, j;
+	
+	fftease_fold(fft);
+	fftease_rdft(fft,1);
+	fftease_convert(fft);
+	if( x->first_frame ){
+		for ( i = 0; i < N+2; i++ ){
+			composite_frame[i] = channel[i];
+			x->frames_left[i] = max_hold_frames;
+		}
+		x->first_frame = 0;
+	}
+	else {
+		if( thresh_scalar < .999 || thresh_scalar > 1.001 || damp_scalar < .999 || damp_scalar > 1.001 ) {
+			for(i = 0, j = 0; i < N+2; i += 2, j++ ){
+				if( fabs( composite_frame[i] - channel[i] ) > move_threshold[j] * thresh_scalar|| frames_left[j] <= 0 ){
+					composite_frame[i] = channel[i];
+					composite_frame[i+1] = channel[i+1];
+					frames_left[j] = max_hold_frames;
+				}
+				else {
+					if(!inf_hold){
+						--(frames_left[j]);
+					}
+					composite_frame[i] *= damping_factor[j] * damp_scalar; /* denormals protection */
+					if( composite_frame[i] < 0.000001 )
+						composite_frame[i] = 0.0;
+				}
+			}
+			
+		}
+		else {
+			for( i = 0, j = 0; i < N+2; i += 2, j++ ){
+				if( fabs( composite_frame[i] - channel[i] ) > move_threshold[j] || frames_left[j] <= 0 ){
+					composite_frame[i] = channel[i];
+					composite_frame[i+1] = channel[i+1];
+					frames_left[j] = max_hold_frames;
+				} else {
+					if(!inf_hold){
+						--(frames_left[j]);
+					}
+					// composite_frame[i] *= damping_factor[j]; // was a bug here ??
+					composite_frame[i] *= damping_factor[j] * damp_scalar;
+					if( composite_frame[i] < 0.000001 )  /* denormals protection */
+						composite_frame[i] = 0.0;
+				}
+			}
+		}
+	}
+    // use memcopy
+	for(i = 0; i < N+2; i++){
+		channel[i] = composite_frame[i];
+	}
+	if(fft->obank_flag){
+		fftease_oscbank(fft);
+	} else {
+		fftease_unconvert(fft);
+		fftease_rdft(fft,-1);
+		fftease_overlapadd(fft);
+	}
+}
+
+void bthresher_oscbank(t_bthresher *x, t_float flag)
+{
+	x->fft->obank_flag = (short) flag;
+}
+
+t_int *bthresher_perform(t_int *w)
+{
+	int	i,j;
+    t_bthresher *x = (t_bthresher *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *inthresh = (t_float *)(w[3]);
+	t_float *damping = (t_float *)(w[4]);
+	t_float *MSPOutputVector = (t_float *)(w[5]);
+	t_fftease *fft = x->fft;
+	
+	int MSPVectorSize = fft->MSPVectorSize;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	int Nw = fft->Nw;
+	t_float mult = fft->mult;
+	int D = fft->D;
+	
+	if(x->mute) {
+        for(i=0; i < MSPVectorSize; i++){
+            MSPOutputVector[i] = 0.0;
+        }
+        return w+6;
+	}
+    
+    x->thresh_scalar = *inthresh;
+    x->damp_scalar = *damping;
+	
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_bthresher(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+    }
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_bthresher(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_bthresher(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+6;
+}
+
+
+void bthresher_dsp(t_bthresher *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        bthresher_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(bthresher_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec);
+    }
+}
+
+t_float bthresher_boundrand( t_float min, t_float max) {
+	t_float frand;
+	frand = (t_float) (rand() % 32768)/ 32768.0;
+	return (min + frand * (max-min) );
+}
+
diff --git a/externals/fftease/burrow~.c b/externals/fftease/burrow~.c
new file mode 100644
index 0000000000000000000000000000000000000000..c736a6824dfcb17575f8b39b4029bbc62882e429
--- /dev/null
+++ b/externals/fftease/burrow~.c
@@ -0,0 +1,390 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *burrow_class;
+
+#define OBJECT_NAME "burrow~"
+
+typedef struct _burrow
+{
+	t_object x_obj;
+    float x_f;
+	t_fftease *fft;
+	t_fftease *fft2; // for cross synthesis use
+    int invert;
+    t_float threshold;
+    t_float multiplier;
+	short mute;
+ 	short bypass;
+} t_burrow;
+
+void *burrow_new(t_symbol *s, int argc, t_atom *argv);
+void burrow_dsp(t_burrow *x, t_signal **sp);
+t_int *burrow_perform(t_int *w);
+t_int *offset_perform(t_int *w);
+t_int *burrow_perform(t_int *w);
+void burrow_assist(t_burrow *x, void *b, long m, long a, char *s);
+void burrow_float(t_burrow *x, t_floatarg myFloat);
+void burrow_init(t_burrow *x);
+void burrow_free(t_burrow *x);
+void burrow_invert(t_burrow *x, t_floatarg toggle);
+void burrow_mute(t_burrow *x, t_floatarg toggle);
+void burrow_fftinfo(t_burrow *x);
+void burrow_tilde_setup(void);
+void burrow_winfac(t_burrow *x, t_floatarg f);
+void do_burrow(t_burrow *x);
+void burrow_bypass(t_burrow *x, t_floatarg toggle);
+void burrow_perform64(t_burrow *x, t_object *dsp64, t_float **ins,
+                      long numins, t_float **outs,long numouts, long vectorsize,
+                      long flags, void *userparam);
+void burrow_dsp64(t_burrow *x, t_object *dsp64, short *count, t_float samplerate, long maxvectorsize, long flags);
+
+void burrow_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("burrow~"), (t_newmethod)burrow_new,
+                  (t_method)burrow_free,sizeof(t_burrow), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_burrow, x_f);
+	class_addmethod(c,(t_method)burrow_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)burrow_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(c,(t_method)burrow_fftinfo,gensym("fftinfo"),0);
+    class_addmethod(c,(t_method)burrow_invert,gensym("invert"), A_FLOAT, 0);
+    burrow_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void burrow_free(t_burrow *x)
+{
+	fftease_free(x->fft);
+    fftease_free(x->fft2);
+}
+
+void burrow_invert(t_burrow *x, t_floatarg toggle)
+{
+	x->invert = (short)toggle;
+}
+
+void burrow_mute(t_burrow *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;
+}
+
+void burrow_bypass(t_burrow *x, t_floatarg toggle)
+{
+	x->bypass = (short)toggle;
+}
+
+void burrow_winfac(t_burrow *x, t_floatarg f)
+{
+	x->fft->winfac = (int) f;
+	x->fft2->winfac = (int) f;
+	burrow_init(x);
+}
+
+
+void burrow_fftinfo( t_burrow *x )
+{
+	fftease_fftinfo(x->fft, OBJECT_NAME);
+}
+
+void burrow_init(t_burrow *x)
+{
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	short initialized = fft->initialized;
+	
+	fftease_init(fft);
+	fftease_init(fft2);
+
+	if(!initialized){
+		x->mute = 0;
+		x->invert = 0;
+	}
+}
+
+void *burrow_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_fftease *fft, *fft2;
+	t_burrow 	*x = (t_burrow *) pd_new(burrow_class);
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+
+	x->fft = (t_fftease *) calloc(1, sizeof(t_fftease));
+	x->fft2 = (t_fftease *) calloc(1, sizeof(t_fftease));
+
+	fft = x->fft;
+	fft2 = x->fft2;	
+	fft->initialized = fft2->initialized = 0;
+	x->threshold = 0.0;
+	x->multiplier = 0.01;
+
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+	fft2->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft2->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft2->winfac = FFTEASE_DEFAULT_WINFAC;	
+
+    if(argc > 0){ fft->N = fft2->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = fft2->overlap = (int) atom_getfloatarg(1, argc, argv); }
+    
+	return x;
+}
+
+t_int *burrow_perform(t_int *w)
+{
+	/* get our inlets and outlets */
+	t_burrow *x = (t_burrow *) (w[1]);
+	t_float *MSPInputVector1 = (t_float *)(w[2]);
+	t_float *MSPInputVector2 = (t_float *)(w[3]);
+	t_float *flt_threshold = (t_float *)(w[4]);
+	t_float *flt_multiplier = (t_float *)(w[5]);
+	t_float *MSPOutputVector = (t_float *)(w[6]);
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int MSPVectorSize = fft->MSPVectorSize;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalInputVector1 = fft->internalInputVector;
+	t_float *internalInputVector2 = fft2->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *output = fft->output;
+	t_float mult = fft->mult;
+	
+	if( fft->obank_flag )
+		mult *= FFTEASE_OSCBANK_SCALAR;
+		
+	int
+	i,j,
+	invert = 0,
+	threshold = 1.,
+	multiplier = 1.;
+	t_float
+	*inputOne,
+	*inputTwo,
+	*bufferOne,
+	*bufferTwo,
+	*channelOne,
+	*channelTwo;
+    
+	/* dereference structure  */
+	
+	inputOne = fft->input;
+	inputTwo = fft2->input;
+	bufferOne = fft->buffer;
+	bufferTwo = fft2->buffer;
+	channelOne = fft->channel;
+	channelTwo = fft2->channel;
+	multiplier = x->multiplier;
+	threshold = x->threshold;
+	invert = x->invert;
+    
+	mult = fft->mult;
+    x->threshold = *flt_threshold;
+    x->multiplier = *flt_multiplier;
+    
+	/* save some CPUs if muted */
+	if(x->mute){
+        for(i=0; i < MSPVectorSize; i++){
+            MSPOutputVector[i] = 0.0;
+        }
+        return w+7;
+	}
+    
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputOne + (Nw - D), MSPInputVector1, D * sizeof(t_float));
+        memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputTwo + (Nw - D), MSPInputVector2, D * sizeof(t_float));
+        
+		do_burrow(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw-D), MSPInputVector1 + (D*i), D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw-D), MSPInputVector2 + (D*i), D * sizeof(t_float));
+            
+			do_burrow(x);
+            
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector1 + (operationCount * MSPVectorSize), MSPInputVector1, MSPVectorSize * sizeof(t_float));
+        memcpy(internalInputVector2 + (operationCount * MSPVectorSize), MSPInputVector2, MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize), MSPVectorSize * sizeof(t_float));
+      
+		operationCount = (operationCount + 1) % operationRepeat;
+        
+        if( operationCount == 0 ) {
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw - D), internalInputVector1, D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw - D), internalInputVector2, D * sizeof(t_float));
+            
+            do_burrow(x);
+ 
+            for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+7;
+}
+
+void do_burrow(t_burrow *x)
+{
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int i;
+	int N2 = fft->N2;
+	float a1, b1,
+	a2, b2;
+	int even, odd;
+	
+	/* dereference structure  */	
+	
+	t_float *bufferOne = fft->buffer;
+	t_float *bufferTwo = fft2->buffer;
+	
+	t_float *channelOne = fft->channel;
+	t_float *channelTwo = fft2->channel;
+	t_float multiplier = x->multiplier;	
+	t_float threshold = x->threshold;
+	
+	int invert = x->invert;
+
+
+	/* apply hamming window and fold our window buffer into the fft buffer */ 
+	
+	fftease_fold(fft);
+	fftease_fold(fft2);
+	
+	
+	/* do an fft */ 
+	
+	fftease_rdft(fft, 1);
+	fftease_rdft(fft2, 1);
+	
+	if (invert) {
+		
+		/* convert to polar coordinates from complex values */
+		
+		for ( i = 0; i <= N2; i++ ) {
+			
+			odd = ( even = i<<1 ) + 1;
+			
+			a1 = ( i == N2 ? *(bufferOne+1) : *(bufferOne+even) );
+			b1 = ( i == 0 || i == N2 ? 0. : *(bufferOne+odd) );
+			
+			a2 = ( i == N2 ? *(bufferTwo+1) : *(bufferTwo+even) );
+			b2 = ( i == 0 || i == N2 ? 0. : *(bufferTwo+odd) );
+			
+			*(channelOne+even) = hypot( a1, b1 );
+			*(channelOne+odd) = -atan2( b1, a1 );
+			
+			*(channelTwo+even) = hypot( a2, b2 );
+			
+			/* use simple threshold from second signal to trigger filtering */
+			
+			if ( *(channelTwo+even) < threshold )
+				*(channelOne+even) *= multiplier;
+						
+		}  
+	}
+	
+	else {
+		
+		/* convert to polar coordinates from complex values */
+		
+		for ( i = 0; i <= N2; i++ ) {
+			
+			odd = ( even = i<<1 ) + 1;
+			
+			a1 = ( i == N2 ? *(bufferOne+1) : *(bufferOne+even) );
+			b1 = ( i == 0 || i == N2 ? 0. : *(bufferOne+odd) );
+			
+			a2 = ( i == N2 ? *(bufferTwo+1) : *(bufferTwo+even) );
+			b2 = ( i == 0 || i == N2 ? 0. : *(bufferTwo+odd) );
+			
+			*(channelOne+even) = hypot( a1, b1 );
+			*(channelOne+odd) = -atan2( b1, a1 );
+			
+			*(channelTwo+even) = hypot( a2, b2 );
+			
+			/* use simple threshold from second signal to trigger filtering */
+			
+			if ( *(channelTwo+even) > threshold )
+				*(channelOne+even) *= multiplier;						
+		}  
+	}
+	
+	/* convert back to complex form, read for the inverse fft */
+	
+	for ( i = 0; i <= N2; i++ ) {
+		
+		odd = ( even = i<<1 ) + 1;
+		
+		*(bufferOne+even) = *(channelOne+even) * cos( *(channelOne+odd) );
+		
+		if ( i != N2 )
+			*(bufferOne+odd) = -(*(channelOne+even)) * sin( *(channelOne+odd) );
+	}
+	
+	
+	/* do an inverse fft */
+	
+	fftease_rdft(fft, -1);
+	
+	/* dewindow our result */
+	
+	fftease_overlapadd(fft);
+	
+}
+
+void burrow_dsp(t_burrow *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    t_fftease *fft = x->fft;
+    t_fftease *fft2 = x->fft2;
+    
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(!samplerate)
+        return;
+
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+		fft2->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft2);
+	}
+	if(fft->R != samplerate ){
+		fft->R = samplerate;
+        fft2->R = samplerate;
+	}
+    if(reset_required){
+        burrow_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(burrow_perform, 6, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, sp[4]->s_vec);
+    }
+}
diff --git a/externals/fftease/cavoc27~.c b/externals/fftease/cavoc27~.c
new file mode 100644
index 0000000000000000000000000000000000000000..e09eb01bacad75a60b6f8133be46dcad22a0ce58
--- /dev/null
+++ b/externals/fftease/cavoc27~.c
@@ -0,0 +1,633 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *cavoc27_class;
+
+#define OBJECT_NAME "cavoc27~"
+
+/* NOTE THIS IS A MORE COMPLEX CA WITH 3 DIFFERENT STATES  */
+
+typedef struct _cavoc27
+{
+	t_object x_obj;
+    float x_f;
+	t_fftease *fft;
+	t_float *ichannel; //for interpolation
+	t_float *tmpchannel; // for spectrum capture
+	t_float frame_duration;
+	int max_bin;
+	t_float fundamental;
+	t_float *last_frame;
+	short left;
+	short right;
+	short center;
+	short *rule;
+	
+	t_float start_breakpoint;
+	int hold_frames;
+	int frames_left;
+	int set_count;
+	short interpolate_flag;
+	short capture_flag;
+	short capture_lock;
+	void *list_outlet;
+	t_atom *list_data;
+	short mute;
+	
+	short external_trigger;
+	short trigger_value; // set to 1 when a bang is received
+	t_float topfreq; // highest to synthesize - Nyquist by default
+	t_float bottomfreq;
+	t_float *freqs;
+	t_float *amps;
+	short manual_mode; // respond to outside
+	short freeze; // flag to maintain current spectrum
+	long fftsize_attr;
+	long overlap_attr;
+    t_float density;
+    t_float hold_time; //hold time in seconds
+} t_cavoc27;
+
+void *cavoc27_new(t_symbol *s, int argc, t_atom *argv);
+void cavoc27_dsp(t_cavoc27 *x, t_signal **sp);
+t_int *cavoc27_perform(t_int *w);
+void cavoc27_assist(t_cavoc27 *x, void *b, long m, long a, char *s);
+void cavoc27_free( t_cavoc27 *x);
+int cavoc27_apply_rule( short left, short right, short center, short *rule);
+void cavoc27_rule (t_cavoc27 *x, t_symbol *msg, short argc, t_atom *argv);
+void cavoc27_density (t_cavoc27 *x, t_floatarg density);
+void cavoc27_hold_time (t_cavoc27 *x, t_floatarg hold_time);
+void cavoc27_interpolate (t_cavoc27 *x, t_floatarg interpolate);
+void cavoc27_capture_spectrum (t_cavoc27 *x, t_floatarg flag );
+void cavoc27_capture_lock (t_cavoc27 *x, t_floatarg toggle );
+void cavoc27_retune (t_cavoc27 *x, t_floatarg min, t_floatarg max);
+void cavoc27_mute (t_cavoc27 *x, t_floatarg toggle);
+void cavoc27_init(t_cavoc27 *x);
+void cavoc27_rand_set_spectrum(t_cavoc27 *x);
+void cavoc27_rand_set_rule(t_cavoc27 *x);
+void cavoc27_fftinfo(t_cavoc27 *x);
+void cavoc27_oscbank(t_cavoc27 *x, t_floatarg flag);
+void cavoc27_transpose (t_cavoc27 *x, t_floatarg pfac);
+void cavoc27_noalias(t_cavoc27 *x, t_floatarg flag);
+void cavoc27_manual(t_cavoc27 *x, t_floatarg tog);
+void cavoc27_trigger(t_cavoc27 *x);
+void cavoc27_freeze(t_cavoc27 *x, t_floatarg tog);
+
+void cavoc27_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("cavoc27~"), (t_newmethod)cavoc27_new,
+                  (t_method)cavoc27_free,sizeof(t_cavoc27), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_cavoc27, x_f);
+	class_addmethod(c,(t_method)cavoc27_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)cavoc27_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(c,(t_method)cavoc27_oscbank,gensym("oscbank"),A_FLOAT,0);
+	class_addmethod(c,(t_method)cavoc27_transpose,gensym("transpose"),A_FLOAT,0);
+	class_addmethod(c,(t_method)cavoc27_fftinfo,gensym("fftinfo"),0);
+	class_addmethod(c,(t_method)cavoc27_rule,gensym("rule"),A_GIMME,0);
+	class_addmethod(c,(t_method)cavoc27_interpolate,gensym("interpolate"),A_FLOAT,0);
+	class_addmethod(c,(t_method)cavoc27_retune,gensym("retune"),A_FLOAT,A_FLOAT,0);
+	class_addmethod(c,(t_method)cavoc27_capture_spectrum,gensym("capture_spectrum"),A_FLOAT,0);
+	class_addmethod(c,(t_method)cavoc27_noalias,gensym("noalias"),A_FLOAT,0);
+	class_addmethod(c,(t_method)cavoc27_manual,gensym("manual"),A_FLOAT,0);
+	class_addmethod(c,(t_method)cavoc27_freeze,gensym("freeze"),A_FLOAT,0);
+	class_addmethod(c,(t_method)cavoc27_trigger,gensym("trigger"),0);
+    class_addmethod(c,(t_method)cavoc27_density,gensym("density"),A_FLOAT,0);
+    class_addmethod(c,(t_method)cavoc27_hold_time,gensym("hold_time"),A_FLOAT,0);
+    cavoc27_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void cavoc27_rand_set_rule(t_cavoc27 *x)
+{
+	int i;
+	float rval;
+	for( i = 0; i < 27; i++ ){
+		rval = fftease_randf(0.0,1.0);
+		if( rval < .333 )
+			x->rule[i] = 0;
+		else if(rval < .666 )
+			x->rule[i] = 1;
+		else x->rule[i] = 2;
+	}
+}
+
+void cavoc27_freeze(t_cavoc27 *x, t_floatarg tog)
+{
+	x->freeze = (short) tog;
+}
+
+void cavoc27_manual(t_cavoc27 *x, t_floatarg tog)
+{
+	x->manual_mode = (short) tog;
+}
+
+void cavoc27_trigger(t_cavoc27 *x)
+{
+	x->external_trigger = 1;
+}
+
+
+void cavoc27_retune(t_cavoc27 *x, t_floatarg min, t_floatarg max)
+{
+	int i;
+	t_fftease *fft = x->fft;
+	t_float *tmpchannel = x->tmpchannel;
+	t_float *last_frame = x->last_frame;
+	if( max <= 0 || min <= 0 || min > max ){
+		error("bad values for min and max multipliers");
+		return;
+	}
+	if( min < .1 )
+		min = 0.1;
+	if( max > 2.0 )
+		max = 2.0;
+	for( i = 1; i < fft->N + 1; i += 2 ){
+		 last_frame[i] = tmpchannel[i] = fft->c_fundamental * (float) (i / 2) * fftease_randf(min, max);
+	}
+	
+}
+
+void cavoc27_transpose (t_cavoc27 *x, t_floatarg pfac)
+{
+	t_fftease *fft = x->fft;
+	fft->P = (float) pfac;
+	fft->pitch_increment = fft->P*fft->L/fft->R;
+}
+
+void cavoc27_mute (t_cavoc27 *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;
+}
+
+
+void cavoc27_interpolate(t_cavoc27 *x, t_floatarg flag)
+{
+	x->interpolate_flag = (short) flag;
+}
+
+void cavoc27_capture_spectrum(t_cavoc27 *x, t_floatarg flag )
+{
+	x->capture_lock = (short)flag;
+    post("capture flag: %d", x->capture_lock);
+}
+
+void cavoc27_capture_lock(t_cavoc27 *x, t_floatarg flag )
+{
+	x->capture_lock = (short)flag; 
+}
+
+void cavoc27_rule (t_cavoc27 *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	int i;
+	short *rule = x->rule;
+	if( argc != 27 ){
+		error("the rule must be size 18");
+		return;
+	}
+	
+	for( i = 0; i < 27; i++ ){
+		rule[i] = (short) atom_getfloatarg( i, argc, argv);
+	}
+}
+
+void cavoc27_free( t_cavoc27 *x ){
+    fftease_free(x->fft);
+    free(x->fft);
+	free(x->ichannel);
+	free(x->tmpchannel);
+	free(x->last_frame);
+	free(x->rule);
+}
+
+void *cavoc27_new(t_symbol *s, int argc, t_atom *argv)
+{
+t_fftease *fft;
+
+	t_cavoc27 *x = (t_cavoc27 *)pd_new(cavoc27_class);
+	outlet_new(&x->x_obj, gensym("signal"));
+	x->fft = (t_fftease *) calloc(1, sizeof(t_fftease));
+	fft = x->fft;
+	fft->initialized = 0;
+	x->hold_time = 1000.0;
+	x->density = 0.1;
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+	x->freeze = 0;
+	x->start_breakpoint = 1.0 - x->density;
+	fft->obank_flag = 0;
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+    if(argc > 2){ x->density = atom_getfloatarg(2, argc, argv); }
+    if(argc > 3){ x->hold_time = atom_getfloatarg(3, argc, argv); }
+	return x;
+}
+
+void cavoc27_noalias(t_cavoc27 *x, t_floatarg flag)
+{
+	x->fft->noalias = (short) flag;
+}
+
+void cavoc27_oscbank(t_cavoc27 *x, t_floatarg flag)
+{
+	x->fft->obank_flag = (short) flag;
+}
+
+void cavoc27_fftsize(t_cavoc27 *x, t_floatarg f)
+{	
+	x->fft->N = (int) f;
+	cavoc27_init(x);
+}
+
+void cavoc27_overlap(t_cavoc27 *x, t_floatarg f)
+{
+	x->fft->overlap = (int) f;
+	cavoc27_init(x);
+}
+
+void cavoc27_winfac(t_cavoc27 *x, t_floatarg f)
+{
+	x->fft->winfac = (int) f;
+	cavoc27_init(x);
+}
+
+void cavoc27_fftinfo(t_cavoc27 *x)
+{
+	fftease_fftinfo( x->fft, OBJECT_NAME );	
+	post("frames left %d", x->frames_left);
+	post("no alias: %d", x->fft->noalias);
+}
+
+
+void cavoc27_init(t_cavoc27 *x)
+{
+	int i;
+	t_fftease *fft = x->fft;
+	short initialized = fft->initialized;
+	fftease_init(fft);	
+	if(! fft->R ){
+		error("cavoc27~: zero sampling rate!");
+		return;
+	}
+	x->frame_duration = (float)fft->D/(float) fft->R;
+	x->hold_frames = (int) (x->hold_time/x->frame_duration);
+	x->frames_left = x->hold_frames;
+	x->trigger_value = 0;
+	x->set_count = 0;
+	
+	if(!initialized){
+		srand(time(0));
+		x->interpolate_flag = 0;
+		x->capture_lock = 0;
+		
+		x->mute = 0;
+
+		x->ichannel = (t_float *) calloc((fft->N+2), sizeof(t_float));
+		x->tmpchannel = (t_float *) calloc((fft->N+2), sizeof(t_float));
+		x->last_frame = (t_float *) calloc((fft->N+2), sizeof(t_float));
+		x->rule = (short *) calloc(27, sizeof(short));
+	}
+    else {
+		x->ichannel = (t_float *)realloc(x->ichannel,(fft->N+2)*sizeof(t_float));
+		x->tmpchannel = (t_float *)realloc(x->tmpchannel,(fft->N+2)*sizeof(t_float));
+		x->last_frame = (t_float *)realloc(x->last_frame,(fft->N+2)*sizeof(t_float));
+	}
+    if(x->frame_duration != 0){
+        x->hold_frames = (int) ( (x->hold_time/1000.0) / x->frame_duration);
+    } else {
+        post("%s: zero FFT frame duration", OBJECT_NAME);
+    }
+    if( x->hold_frames < 1 )
+        x->hold_frames = 1;
+    
+	cavoc27_rand_set_rule(x);
+	cavoc27_rand_set_spectrum(x);
+	for( i = 0; i < fft->N+2; i++ ){
+		x->last_frame[i] = fft->channel[i];
+	}
+}
+
+void cavoc27_rand_set_spectrum(t_cavoc27 *x)
+{
+	int i;
+	float rval;
+	t_fftease *fft = x->fft;
+	t_float *channel = x->tmpchannel;
+	//set spectrum
+
+	for( i = 0; i < fft->N2 + 1; i++ ){
+		if( fftease_randf(0.0, 1.0) > x->start_breakpoint){
+			rval = fftease_randf(0.0, 1.0);
+			if( rval < 0.5 ){
+				channel[ i * 2 ] = 1;
+			}
+			else {
+				channel[ i * 2 ] = 2;
+			}
+			++(x->set_count);
+		} else {
+			channel[ i * 2 ] = 0;
+		}
+		channel[ i * 2 + 1 ] = fft->c_fundamental * (float) i * fftease_randf(.9,1.1);
+	}
+}
+
+void do_cavoc27(t_cavoc27 *x)
+{
+	t_fftease *fft = x->fft;
+	int i;
+	int frames_left = x->frames_left;
+
+	int N = fft->N;
+	t_float *tmpchannel = x->tmpchannel;
+	t_float *ichannel = x->ichannel;
+
+	int hold_frames = x->hold_frames;
+	short *rule = x->rule;
+	short left = x->left;
+	short right = x->right;
+	short center = x->center;
+	t_float *last_frame = x->last_frame;
+	t_float frak;
+	short manual_mode = x->manual_mode;
+	short trigger;
+	short interpolate_flag = x->interpolate_flag;
+	t_float *channel = fft->channel;
+	
+	if( manual_mode ){
+		trigger = x->external_trigger;
+	} else {
+		trigger = 0;
+	}
+	
+	if( x->capture_flag || (x->capture_lock && ! x->freeze)) {
+		
+		fftease_fold(fft);
+		fftease_rdft(fft,1);
+		fftease_convert(fft);
+		for( i = 1; i < fft->N+1; i += 2){
+			tmpchannel[i] = channel[i];
+		}
+	}
+	if( ! manual_mode ){
+		if( --frames_left <= 0 ){
+			trigger = 1;
+		}
+	}
+	if(trigger && ! x->freeze){
+		for( i = 0; i < fft->N+1; i++ ){
+			last_frame[i] = tmpchannel[i];
+		}
+		frames_left = hold_frames;
+		for( i = 2; i < fft->N; i+=2 ){
+			left = last_frame[ i - 2 ];
+			center = last_frame[i] ;
+			right = last_frame[i+2];
+			tmpchannel[i] = cavoc27_apply_rule(left, right, center, rule );
+		}
+		// boundary cases 
+		center = last_frame[0];
+		right = last_frame[2];
+		left = last_frame[N];
+		tmpchannel[0] = cavoc27_apply_rule(left, right, center, rule );
+		
+		center = last_frame[N];
+		right = last_frame[0];
+		left = last_frame[N - 2];
+		tmpchannel[N] = cavoc27_apply_rule(left, right, center, rule );
+		x->external_trigger = trigger = 0 ;
+	}
+	if( interpolate_flag && ! x->freeze){
+		frak = 1.0 - ((float) frames_left / (float) hold_frames);
+
+		for( i = 0; i <N+2; i += 2 ){
+			ichannel[i] = last_frame[i] + frak * ( tmpchannel[i] - last_frame[i] ); 
+			ichannel[i+1] = last_frame[i+1];
+		}	
+		for( i = 0; i < N+2; i++ ){
+			channel[i] = ichannel[i];
+		}	
+	} else {
+		for( i = 0; i < N+2; i++){
+			channel[i] = tmpchannel[i];
+		}
+	}	
+	if(x->freeze){
+		for( i = 0; i < N+2; i++){
+			channel[i] = tmpchannel[i];
+		}
+	}
+	
+	if(fft->obank_flag){
+		fftease_oscbank(fft);
+	} else {
+		fftease_unconvert(fft);
+		fftease_rdft(fft, -1);
+		fftease_overlapadd(fft);
+	}
+
+	x->frames_left = frames_left;
+	
+}
+
+t_int *cavoc27_perform(t_int *w)
+{
+	int	i,j;
+
+	////////////
+	t_cavoc27 *x = (t_cavoc27 *) (w[1]);
+    t_float *MSPInputVector = (t_float *) (w[2]);
+	t_float *MSPOutputVector = (t_float *) (w[3]);
+    t_fftease *fft = x->fft;
+	int D = fft->D;
+	int Nw = fft->Nw;
+    t_float *input = fft->input;
+	t_float *output = fft->output;
+	t_float mult = fft->mult;
+	int MSPVectorSize = fft->MSPVectorSize;
+    t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;	
+	
+    
+	if(x->mute){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+        return w+4;
+	}
+	if(fft->obank_flag){
+		mult *= FFTEASE_OSCBANK_SCALAR;
+	}
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+		do_cavoc27(x);
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+    }
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+			do_cavoc27(x);
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+			do_cavoc27(x);
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+        fft->operationCount = operationCount;
+	}
+    return w+4;
+}		
+
+int cavoc27_apply_rule( short left, short right, short center, short *rule){
+	
+	if( left == 0 && center == 0 && right == 0 )
+		return rule[0];
+	if( left == 1 && center == 0 && right == 1 )
+		return rule[1];
+	if( left == 1 && center == 0 && right == 0 )
+		return rule[2];
+	if( left == 0 && center == 0 && right == 1 )
+		return rule[3];
+	if( left == 2 && center == 0 && right == 2 )
+		return rule[4];
+	if( left == 2 && center == 0 && right == 0 )
+		return rule[5];
+	if( left == 0 && center == 0 && right == 2 )
+		return rule[6];
+	if( left == 2 && center == 0 && right == 1 )
+		return rule[7];
+	if( left == 1 && center == 0 && right == 2 )
+		return rule[8];
+	
+	if( left == 0 && center == 1 && right == 0 )
+		return rule[9];
+	if( left == 1 && center == 1 && right == 1 )
+		return rule[10];
+	if( left == 1 && center == 1 && right == 0 )
+		return rule[11];
+	if( left == 0 && center == 1 && right == 1 )
+		return rule[12];
+	if( left == 2 && center == 1 && right == 2 )
+		return rule[13];
+	if( left == 2 && center == 1 && right == 0 )
+		return rule[14];
+	if( left == 0 && center == 1 && right == 2 )
+		return rule[15];
+	if( left == 2 && center == 1 && right == 1 )
+		return rule[16];
+	if( left == 1 && center == 1 && right == 2 )
+		return rule[17];
+	
+	if( left == 0 && center == 2 && right == 0 )
+		return rule[18];
+	if( left == 1 && center == 2 && right == 1 )
+		return rule[19];
+	if( left == 1 && center == 2 && right == 0 )
+		return rule[20];
+	if( left == 0 && center == 2 && right == 1 )
+		return rule[21];
+	if( left == 2 && center == 2 && right == 2 )
+		return rule[22];
+	if( left == 2 && center == 2 && right == 0 )
+		return rule[23];
+	if( left == 0 && center == 2 && right == 2 )
+		return rule[24];
+	if( left == 2 && center == 2 && right == 1 )
+		return rule[25];
+	if( left == 1 && center == 2 && right == 2 )
+		return rule[26];
+	return 0; //should never happen  
+}
+
+
+void cavoc27_density(t_cavoc27 *x, t_floatarg density)
+{
+    int i;
+    t_fftease *fft = x->fft;
+    t_float *channel =  x->tmpchannel;
+    
+    if( density < 0.0001 ){
+        density = .0001;
+    } else if( density > .9999 ){
+        density = 1.0;
+    }
+    x->density = density;
+    x->start_breakpoint = 1.0 - x->density;
+    for( i = 0; i < fft->N2 + 1; i++ ){
+        if( fftease_randf(0.0, 1.0) > x->start_breakpoint ){
+            if( fftease_randf(0.0,1.0) > 0.5 ){
+                channel[ i * 2 ] = 1;
+            }
+            else {
+                channel[ i * 2 ] = 2;
+            }
+            ++(x->set_count);
+        } else {
+            channel[ i * 2 ] = 0;
+        }
+    }
+    for( i = 0; i < fft->N+2; i++ ){
+        x->last_frame[i] = channel[i];
+    }
+}
+
+void cavoc27_hold_time(t_cavoc27 *x, t_floatarg hold_time)
+{
+    if(hold_time <= 0){
+        post("illegal hold time %f",hold_time);
+        return;
+    }
+    x->hold_time = hold_time;
+    if(! x->fft->initialized){
+        return;
+    }
+    if(! x->frame_duration){
+        error("%s: zero frame duration",OBJECT_NAME);
+        return;
+    }
+    x->hold_frames = (int) ( (x->hold_time/1000.0) / x->frame_duration);
+    if( x->hold_frames < 1 )
+        x->hold_frames = 1;    
+}
+
+void cavoc27_dsp(t_cavoc27 *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(!samplerate)
+        return;
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate ){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        cavoc27_init(x);
+    }
+    dsp_add(cavoc27_perform, 3, x, sp[0]->s_vec, sp[1]->s_vec);
+}
+
diff --git a/externals/fftease/cavoc~.c b/externals/fftease/cavoc~.c
new file mode 100644
index 0000000000000000000000000000000000000000..8f211e3311b58aed9b5817e2ebdbafc5ae118d80
--- /dev/null
+++ b/externals/fftease/cavoc~.c
@@ -0,0 +1,472 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *cavoc_class;
+
+#define OBJECT_NAME "cavoc~"
+
+typedef struct _cavoc
+{
+	t_object x_obj;
+    float x_f;
+	t_fftease *fft;
+	t_float frame_duration;
+	int max_bin;
+	
+	t_float fundamental;
+	short left;
+	short right;
+	short center;
+	short *rule;
+	
+	t_float start_breakpoint;
+	int hold_frames;
+	int frames_left;
+	int set_count;
+	void *list_outlet;
+	t_atom *list_data;
+	short mute;
+	short external_trigger;
+	short trigger_value; // set to 1 when a bang is received
+	
+	t_float topfreq; // highest to synthesize - Nyquist by default
+	t_float bottomfreq;
+	t_float *freqs;
+	t_float *amps;
+	t_float *cavoc;
+    t_float density; // treat as attribute
+    t_float hold_time; // treat as attribute
+} t_cavoc;
+
+void *cavoc_new(t_symbol *msg, short argc, t_atom *argv);
+void cavoc_dsp(t_cavoc *x, t_signal **sp);
+t_int *cavoc_perform(t_int *w);
+void cavoc_free( t_cavoc *x );
+int cavoc_apply_rule( short left, short right, short center, short *rule);
+float cavoc_randf(float min, float max);
+void cavoc_rule (t_cavoc *x, t_symbol *msg, short argc, t_atom *argv);
+void cavoc_retune (t_cavoc *x, t_floatarg min, t_floatarg max);
+void cavoc_mute (t_cavoc *x, t_floatarg toggle);
+void cavoc_external_trigger(t_cavoc *x, t_floatarg toggle);
+void cavoc_init(t_cavoc *x);
+void cavoc_fftinfo(t_cavoc *x);
+void cavoc_bang(t_cavoc *x);
+void cavoc_topfreq(t_cavoc *x, t_floatarg tf);
+void cavoc_oscbank(t_cavoc *x, t_floatarg flag);
+void cavoc_density(t_cavoc *x, t_floatarg f);
+void cavoc_hold_time(t_cavoc *x, t_floatarg f);
+void build_spectrum(t_cavoc *x, float min, float max);
+void cavoc_bottomfreq(t_cavoc *x, t_floatarg bf);
+
+
+void cavoc_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("cavoc~"), (t_newmethod)cavoc_new,
+                  (t_method)cavoc_free,sizeof(t_cavoc), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_cavoc, x_f);
+	class_addmethod(c,(t_method)cavoc_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)cavoc_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(c,(t_method)cavoc_oscbank,gensym("oscbank"),A_FLOAT,0);
+	class_addmethod(c,(t_method)cavoc_rule,gensym("rule"),A_GIMME,0);
+	class_addmethod(c,(t_method)cavoc_external_trigger,gensym("external_trigger"),A_FLOAT,0);
+	class_addmethod(c,(t_method)cavoc_bang,gensym("bang"),0);
+	class_addmethod(c,(t_method)cavoc_retune,gensym("retune"),A_FLOAT,A_FLOAT,0);
+	class_addmethod(c,(t_method)cavoc_topfreq,gensym("topfreq"),A_FLOAT,0);
+	class_addmethod(c,(t_method)cavoc_bottomfreq,gensym("bottomfreq"),A_FLOAT,0);
+    class_addmethod(c,(t_method)cavoc_density,gensym("density"),A_FLOAT,0);
+    class_addmethod(c,(t_method)cavoc_hold_time,gensym("hold_time"),A_FLOAT,0);
+    cavoc_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+
+void cavoc_fftinfo( t_cavoc *x )
+{
+t_fftease *fft = x->fft;
+	fftease_fftinfo( fft, OBJECT_NAME );
+}
+
+void cavoc_density(t_cavoc *x, t_floatarg density)
+{
+    int i;
+    t_fftease *fft = x->fft;
+    
+    if( density < 0.0001 ){
+        density = .0001;
+    } else if( density > .9999 ){
+        density = 1.0;
+    }
+    x->density = density;
+    x->start_breakpoint = 1.0 - x->density;
+    for( i = 0; i < fft->N2 + 1; i++ ){
+        if( cavoc_randf(0.0, 1.0) > x->start_breakpoint ){
+            x->amps[ i ] = 1;
+            ++(x->set_count);
+        } else {
+            x->amps[ i ] = 0;
+        }
+    }
+}
+
+void cavoc_hold_time(t_cavoc *x, t_floatarg f)
+{
+    if(f <= 0)
+        return;
+    x->hold_time = f;
+    x->hold_frames = (int) ((x->hold_time/1000.0) / x->frame_duration);
+    if( x->hold_frames < 1 )
+        x->hold_frames = 1;
+    x->frames_left = x->hold_frames;
+}
+
+void cavoc_external_trigger(t_cavoc *x, t_floatarg toggle)
+{
+	x->external_trigger = (short)toggle;
+}
+
+void cavoc_mute (t_cavoc *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;
+}
+
+void cavoc_retune(t_cavoc *x, t_floatarg min, t_floatarg max)
+{	
+	if( max <= 0 || min <= 0 || min > max ){
+		error("bad values for min and max multipliers");
+		return;
+	}
+	if( min < .1 )
+		min = 0.1;
+	if( max > 2.0 )
+		max = 2.0;
+	build_spectrum(x, (float)min, (float)max);
+}
+
+
+
+void cavoc_bang(t_cavoc *x)
+{
+	if(x->external_trigger)
+		x->trigger_value = 1;
+}
+
+void cavoc_oscbank(t_cavoc *x, t_floatarg flag)
+{
+	x->fft->obank_flag = (short) flag;
+}
+
+void cavoc_rule (t_cavoc *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	int i;
+	short *rule = x->rule;
+	if( argc != 8 ){
+		error("the rule must be size 8");
+		return;
+	}
+	
+	for( i = 0; i < 8; i++ ){
+		rule[i] = (short) atom_getfloatarg(i, argc, argv);
+	}
+}
+
+void cavoc_free( t_cavoc *x ){
+	fftease_free(x->fft);
+    free(x->fft);
+	free(x->amps);
+	free(x->freqs);
+	free(x->rule);
+}
+
+void *cavoc_new(t_symbol *msg, short argc, t_atom *argv)
+{
+	t_cavoc *x = (t_cavoc *)pd_new(cavoc_class);
+    t_fftease *fft;
+	outlet_new(&x->x_obj, gensym("signal"));
+
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+    fft = x->fft;
+    x->fft->initialized = 0;
+	x->density = 0.1;
+	x->hold_time = 500.0; // convert from ms
+	x->fft->obank_flag = 0;
+	x->fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	x->fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	x->fft->winfac = FFTEASE_DEFAULT_WINFAC;
+
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+    if(argc > 2){ x->density = atom_getfloatarg(2, argc, argv); }
+    if(argc > 3){ x->hold_time = atom_getfloatarg(3, argc, argv); }
+
+	return x;
+}
+
+void cavoc_init(t_cavoc *x)
+{
+	t_fftease *fft = x->fft;
+	short initialized = fft->initialized;
+	fftease_init(fft);
+
+	fft->lo_bin = 0; 
+	fft->hi_bin = fft->N2 - 1; 
+			
+	if(! fft->R ){
+		error("zero sampling rate!");
+		return;
+	}
+	x->frame_duration = (float)fft->D/(float) fft->R;
+	if(x->hold_time <= 0.0)
+		x->hold_time = 150;
+	x->hold_frames = (int) ((x->hold_time * 0.001) / x->frame_duration) ;
+	x->frames_left = x->hold_frames;
+	x->trigger_value = 0;
+	x->topfreq = fft->R / 2.0;
+	x->bottomfreq = 0.0;
+
+	if(!initialized){
+		
+		srand(time(0));
+		x->mute = 0;
+		
+		x->external_trigger = 0;
+		if( x->density < 0.0 ){
+			x->density = 0;
+		} else if( x->density > 1.0 ){
+			x->density = 1.0;
+		}
+		x->start_breakpoint = 1.0 - x->density;
+		x->freqs = (t_float *) calloc((fft->N2 + 1), sizeof(t_float));
+		x->amps = (t_float *) calloc((fft->N2 + 1), sizeof(t_float));
+		x->cavoc = (t_float *) calloc((fft->N + 2), sizeof(t_float));
+		x->rule = (short *)  calloc(8, sizeof(short));
+		
+		x->rule[2] = x->rule[3] = x->rule[5] = x->rule[6] = 1;
+		x->rule[0] = x->rule[1] = x->rule[4] = x->rule[7] = 0;
+		
+		
+	} else {    
+		x->freqs = (t_float *) realloc(x->freqs, (fft->N2 + 1) * sizeof(t_float));
+		x->amps = (t_float *) realloc(x->amps, (fft->N2 + 1) * sizeof(t_float));
+	}
+	build_spectrum(x, 0.9, 1.1);
+}
+
+
+void build_spectrum(t_cavoc *x, float min, float max)
+{
+t_fftease *fft = x->fft;
+float basefreq;
+int i;
+	x->set_count = 0;
+	for(i = 0; i < fft->N2 + 1; i++){
+		if(cavoc_randf(0.0, 1.0) > x->start_breakpoint){
+			x->amps[i] = 1;
+			++(x->set_count);
+		} else {
+			x->amps[i] = 0;
+		}
+		basefreq = x->bottomfreq + (( (x->topfreq - x->bottomfreq) / (float) fft->N2 ) * (float) i );
+		x->freqs[i] = basefreq * cavoc_randf(min,max);
+	}
+	for( i = 0; i < fft->N2 + 1; i++ ){
+		fft->channel[i * 2] = x->amps[i];
+		fft->channel[i * 2 + 1] = x->freqs[i];
+	}
+
+}
+
+void cavoc_topfreq(t_cavoc *x, t_floatarg tf)
+{
+	t_fftease *fft = x->fft;
+	if(tf < 100 || tf > fft->R / 2.0){
+		error("%s: top frequency out of range: %f",OBJECT_NAME,  tf);
+		return;
+	}
+	x->topfreq = (float) tf;
+	build_spectrum(x, 0.9, 1.1);
+}
+
+void cavoc_bottomfreq(t_cavoc *x, t_floatarg bf)
+{
+	if(bf < 0 && bf > x->topfreq){
+		error("%s: bottom frequency out of range: %f",OBJECT_NAME,  bf);
+		return;
+	}
+	x->bottomfreq = (float) bf;
+	build_spectrum(x, 0.9, 1.1);
+}
+
+void do_cavoc(t_cavoc *x)
+{
+	int i;
+	t_fftease *fft = x->fft;
+	int N = fft->N;
+	int N2 = fft->N2;
+	t_float *channel = fft->channel;
+	int hold_frames = x->hold_frames;
+	short *rule = x->rule;
+	short left = x->left;
+	short right = x->right;
+	short center = x->center;
+	short external_trigger = x->external_trigger;
+	short new_event = 0;
+	t_float *amps = x->amps;
+	t_float *freqs = x->freqs;
+			
+	if(external_trigger){// only accurate to within a vector because of FFT
+		if(x->trigger_value){
+			x->trigger_value = 0;
+			new_event = 1;
+		}
+	} else if(--(x->frames_left) <= 0){
+		x->frames_left = hold_frames;
+		new_event = 1;
+	}
+	if(new_event){
+		for( i = 1; i < N2; i++ ){
+			left = amps[i - 1];
+			center = amps[i] ;
+			right = amps[i + 1];
+			channel[i * 2] = cavoc_apply_rule(left, right, center, rule);
+		}
+		center = amps[0];
+		right = amps[1];
+		left = amps[N2];
+		channel[0] = cavoc_apply_rule(left, right, center, rule);
+		
+		center = amps[N2];
+		right = amps[0];
+		left = amps[N2 - 1];
+		channel[N] = cavoc_apply_rule(left, right, center, rule);
+		for(i = 0; i < N2 + 1; i++){
+			channel[(i*2) + 1] = freqs[i];
+			amps[i] = channel[i * 2];
+		}	
+	}
+		
+	if(fft->obank_flag){
+		for(i = 0; i < N2 + 1; i++){
+			channel[(i*2) + 1] = freqs[i];
+			channel[i * 2] = amps[i];
+		}
+		fftease_oscbank(fft);
+	} else {
+		fftease_unconvert(fft);
+		fftease_rdft(fft, -1);
+		fftease_overlapadd(fft);
+	}		
+}
+
+
+t_int *cavoc_perform(t_int *w)
+{
+	int	i,j;
+    t_cavoc *x = (t_cavoc *) (w[1]);
+    t_float *MSPOutputVector = (t_float *)(w[2]);
+	t_fftease *fft = x->fft;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *output = fft->output;
+	float mult = fft->mult ;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	int MSPVectorSize = fft->MSPVectorSize;
+	
+	if(fft->obank_flag){
+		mult *= FFTEASE_OSCBANK_SCALAR;
+	}
+    
+	if( x->mute){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+        return w+3;
+	}
+	
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        
+		do_cavoc(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+			do_cavoc(x);
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+		memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize), MSPVectorSize * sizeof(float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		if( operationCount == 0 ) {
+			do_cavoc(x);
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+        fft->operationCount = operationCount;
+	}
+	return w+3;
+}		
+
+int cavoc_apply_rule(short left, short right, short center, short *rule){
+	
+	if( ! center ){
+		if( ! left && ! right){
+			return  rule[0];
+		} else if ( ! left && right ){ 
+			return rule[1];
+		} else if ( left && ! right ) {
+			return rule[2];
+		} else if (left && right) {
+			return rule[3];
+		}
+	} else {
+		if( ! left && ! right){
+			return rule[4];
+		} else if ( ! left && right ){ 
+			return rule[5];
+		} else if ( left && ! right ) {
+			return rule[6];
+		} else if (left && right) {
+			return rule[7];
+		}
+	}
+	return 0;
+}
+
+float cavoc_randf(float min, float max)
+{
+	float randv;
+	randv = (float) (rand() % 32768) / 32768.0 ;
+	return (min + ((max-min) * randv))  ;
+}
+
+void cavoc_dsp(t_cavoc *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(!samplerate)
+        return;
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate ){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        cavoc_init(x);
+    }
+    dsp_add(cavoc_perform, 2, x, sp[1]->s_vec);
+}
diff --git a/externals/fftease/centerring~.c b/externals/fftease/centerring~.c
new file mode 100644
index 0000000000000000000000000000000000000000..ba9dda45aac8f862d4d7440b1274c6e3801910c6
--- /dev/null
+++ b/externals/fftease/centerring~.c
@@ -0,0 +1,380 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+#define OBJECT_NAME "centerring~"
+#define MAX_WARP 16.0
+
+static t_class *centerring_class;
+
+#define OBJECT_NAME "centerring~"
+
+typedef struct _centerring
+{
+
+	t_object x_obj;
+    float x_f;
+	t_fftease *fft;
+    int bufferLength;
+    int recalc;
+    int	seed;
+    t_float baseFreq;
+    t_float constFreq;
+    t_float bandFreq;
+    t_float frameR;
+    t_float *ringPhases;
+    t_float *ringIncrements;
+    t_float *sineBuffer;
+    t_float *bufferOne;
+    t_float *channelOne;
+	short connected[8];
+	short mute;
+	short bypass;
+} t_centerring;
+
+void *centerring_new(t_symbol *s, int argc, t_atom *argv);
+t_int *centerring_perform(t_int *w);
+void centerring_dsp(t_centerring *x, t_signal **sp);
+void centerring_dest(t_centerring *x, t_float f);
+void centerring_messages(t_centerring *x, t_symbol *s, short argc, t_atom *argv);
+void centerring_adjust( t_centerring *x );
+void centerring_zerophases( t_centerring *x );
+void centerring_randphases( t_centerring *x );
+void centerring_free(t_centerring *x);
+void centerring_init(t_centerring *x);
+void centerring_mute(t_centerring *x, t_floatarg toggle);
+void centerring_fftinfo( t_centerring *x );
+
+void centerring_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("centerring~"), (t_newmethod)centerring_new,
+                  (t_method)centerring_free,sizeof(t_centerring), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_centerring, x_f);
+	class_addmethod(c,(t_method)centerring_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)centerring_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(c,(t_method)centerring_fftinfo,gensym("fftinfo"),0);
+	class_addmethod(c,(t_method)centerring_messages,gensym("seed"), A_GIMME, 0);
+	class_addmethod(c,(t_method)centerring_messages,gensym("zerophases"), 0);
+	class_addmethod(c,(t_method)centerring_messages,gensym("randphases"), 0);
+    centerring_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void centerring_messages(t_centerring *x, t_symbol *s, short argc, t_atom *argv)
+{	
+	
+	if (s == gensym("seed"))
+		x->seed = (int) atom_getfloatarg(0,argc,argv);
+	
+	if (s == gensym("zerophases")) 
+		centerring_zerophases( x );
+	
+	if (s == gensym("randphases"))
+		centerring_randphases( x );
+}
+
+void *centerring_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_fftease *fft;
+
+	t_centerring *x = (t_centerring *)pd_new(centerring_class);
+
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	/* optional arguments: baseFreq, bandFreq, constFreq, seed, overlap, winfac */
+	x->baseFreq = 1.0;
+	x->bandFreq = 0.2;
+	x->constFreq = 1.0;
+	x->seed = 1977;
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+}
+
+void centerring_init(t_centerring *x)
+{
+	t_fftease *fft = x->fft;
+	int Nw;
+	int N;
+	int N2;
+	short initialized= fft->initialized;
+	fftease_init(fft);
+	Nw = fft->Nw;
+	N = fft->N;
+	N2 = fft->N2;
+	if(! fftease_msp_sanity_check(fft,OBJECT_NAME)){
+		post("failed sanity check!");
+		return;
+	}
+
+	x->frameR = (float) fft->R / (float) fft->D;
+
+	if(!initialized){
+		x->mute = 0;
+		x->bufferLength = 131072;
+		x->recalc = 0;
+		x->ringPhases = (t_float *) calloc((N2 + 1), sizeof(t_float));
+		x->ringIncrements = (t_float *) calloc((N2 + 1), sizeof(t_float));
+		x->sineBuffer = (t_float *) calloc((x->bufferLength + 1), sizeof(t_float));
+		fftease_makeSineBuffer(x->sineBuffer, x->bufferLength);
+	} else {
+		x->ringIncrements = (t_float *)realloc((void *)x->ringIncrements, (N2 + 1) * sizeof(t_float));
+		x->ringPhases = (t_float *)realloc((void *)x->ringPhases, (N2 + 1) * sizeof(t_float));
+	}
+	centerring_adjust(x);
+	centerring_zerophases(x); 
+}
+
+void centerring_free(t_centerring *x)
+{
+
+	fftease_free(x->fft);
+    free(x->fft);
+	free(x->ringPhases);
+	free(x->ringIncrements);
+	free(x->sineBuffer);
+}
+
+void centerring_adjust( t_centerring *x ) {
+	
+	int		i;
+	t_float	*ringIncrements = x->ringIncrements;
+	int N2 = x->fft->N2;
+	
+	if(x->frameR == 0){
+		post("centerring_adjust got at 0 SR!");
+		return;
+	}
+    for (i=0; i < N2; i++) {
+
+		*(ringIncrements+i) = 
+		fftease_frequencyToIncrement(
+			x->frameR, 
+			x->baseFreq * ((fftease_rrand(&(x->seed)) * x->bandFreq) + x->constFreq ),
+			x->bufferLength
+		);
+    }
+}
+
+
+void centerring_zerophases( t_centerring *x ) {
+	
+	int	i;
+	
+	for (i=0; i < x->fft->N2; i++)
+		*((x->ringPhases)+i) = 0.;
+}
+
+
+void centerring_randphases( t_centerring *x ) {
+	
+	int	i;
+	
+	for (i=0; i < x->fft->N2; i++)
+		*((x->ringPhases)+i) = fftease_prand(&(x->seed)) * (float) (x->bufferLength);
+	
+}
+
+void do_centerring(t_centerring *x)
+{
+	t_fftease *fft = x->fft;
+	t_float *buffer = fft->buffer;
+	t_float *channel = fft->channel;
+	int i, odd, even;
+	t_float a1,b1;
+	int N2 = fft->N2;
+	int bufferLength = x->bufferLength;
+	t_float *ringPhases = x->ringPhases;
+	t_float *ringIncrements = x->ringIncrements;
+	t_float *sineBuffer = x->sineBuffer;
+	
+	/* recalculate our oscillator values if object inputs have been updated */
+	
+	if (x->recalc)
+		centerring_adjust( x );
+	
+	x->recalc = 0;
+	
+	fftease_fold(fft);
+	fftease_rdft(fft,1);
+	
+	/* convert to polar coordinates from complex values */ 
+	
+	for ( i = 0; i <= N2; i++ ) {
+		odd = ( even = i<<1 ) + 1;
+		
+		a1 = ( i == N2 ? *(buffer+1) : *(buffer + even) );
+		b1 = ( i == 0 || i == N2 ? 0. : *(buffer + odd) );
+		*(channel + even) = hypot( a1, b1 );
+		*(channel + odd) = -atan2( b1, a1 );      
+	}
+	
+	
+	/* perform ring modulation on successive fft frames */
+	
+	for (i=0; i < N2; i++) {
+		even = i<<1;
+		
+		*(channel + even) *= fftease_bufferOscil( ringPhases+i,
+							  *(ringIncrements+i), sineBuffer, bufferLength );
+	}
+	
+	/* convert from polar to cartesian */	
+	
+	for ( i = 0; i <= N2; i++ ) {
+		
+		odd = ( even = i<<1 ) + 1;
+		
+		*(buffer + even) = *(channel + even) * cos( *(channel + odd) );
+		
+		if ( i != N2 )
+			*(buffer + odd) = (*(channel + even)) * -sin( *(channel + odd) );
+	}
+	fftease_rdft(fft,-1);
+	fftease_overlapadd(fft);
+}
+
+t_int *centerring_perform(t_int *w)
+{
+
+	int i, j;
+	
+    t_centerring *x = (t_centerring *) (w[1]);
+    t_fftease *fft = x->fft;
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *vec_baseFreq = (t_float *)(w[3]);
+	t_float *vec_bandFreq = (t_float *)(w[4]);
+	t_float *vec_constFreq = (t_float *)(w[5]);
+	t_float *MSPOutputVector = (t_float *)(w[6]);
+	t_float *input = fft->input;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *output = fft->output;
+	float mult = fft->mult ;
+	int MSPVectorSize = fft->MSPVectorSize;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;		
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;	
+
+	if(x->mute){
+		for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+        return w+7;
+	}
+    x->recalc = 1;
+    x->baseFreq = *vec_baseFreq;
+    x->bandFreq = *vec_bandFreq;
+    x->constFreq = *vec_constFreq;
+
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_centerring(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_centerring(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_centerring(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+7;
+}
+
+void centerring_mute(t_centerring *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;
+}
+
+void centerring_bypass(t_centerring *x, t_floatarg toggle)
+{
+	x->bypass = (short)toggle;
+}
+
+void centerring_overlap(t_centerring *x, t_floatarg f)
+{
+	x->fft->overlap = (int) f;
+	centerring_init(x);
+}
+
+void centerring_winfac(t_centerring *x, t_floatarg f)
+{
+	x->fft->winfac = (int) f;
+	centerring_init(x);
+}
+
+void centerring_fftsize(t_centerring *x, t_floatarg f)
+{
+	x->fft->N = (int) f;
+	centerring_init(x);
+}
+
+void centerring_fftinfo( t_centerring *x )
+{
+	fftease_fftinfo( x->fft, OBJECT_NAME );	
+}
+void centerring_dsp(t_centerring *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        centerring_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(centerring_perform, 6, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec,
+                sp[4]->s_vec);
+    }
+}
+
+
diff --git a/externals/fftease/codepend~.c b/externals/fftease/codepend~.c
new file mode 100644
index 0000000000000000000000000000000000000000..a9bf7708f32d5ff9230560115fe7a938fbd0d60c
--- /dev/null
+++ b/externals/fftease/codepend~.c
@@ -0,0 +1,377 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *codepend_class;
+
+#define OBJECT_NAME "codepend~"
+
+typedef struct _codepend
+{
+	t_object x_obj;
+    float x_f;
+	t_fftease *fft;
+	t_fftease *fft2; // for cross synthesis use
+	t_float threshold;
+	t_float exponent;
+	short connected[8];
+	short mute;
+	short bypass;
+	int invert_countdown; // delay onset of invert effect to avoid loud glitches
+	int invert_nextstate;// next state for invert   
+	int invert;
+	t_float invert_pad;
+} t_codepend;
+
+void *codepend_new(t_symbol *s, int argc, t_atom *argv);
+void codepend_dsp(t_codepend *x, t_signal **sp);
+t_int *codepend_perform(t_int *w);
+void codepend_invert(t_codepend *x, t_floatarg toggle);
+void codepend_free(t_codepend *x);
+void codepend_mute(t_codepend *x, t_floatarg toggle);
+void codepend_fftinfo(t_codepend *x);
+void codepend_init(t_codepend *x);
+void codepend_pad(t_codepend *x, t_floatarg pad);
+
+void codepend_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("codepend~"), (t_newmethod)codepend_new,
+                  (t_method)codepend_free,sizeof(t_codepend), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_codepend, x_f);
+	class_addmethod(c,(t_method)codepend_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)codepend_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(c,(t_method)codepend_fftinfo,gensym("fftinfo"),0);
+    class_addmethod(c,(t_method)codepend_invert,gensym("invert"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)codepend_pad,gensym("pad"), A_FLOAT, 0);
+    codepend_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void codepend_mute(t_codepend *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;
+}
+
+void codepend_fftinfo( t_codepend *x )
+{
+	fftease_fftinfo(x->fft, OBJECT_NAME);
+}
+
+void codepend_free(t_codepend *x)
+{
+	fftease_free(x->fft);
+	fftease_free(x->fft2);
+    free(x->fft);
+    free(x->fft2);
+}
+
+void codepend_pad(t_codepend *x, t_floatarg pad)
+{
+	x->invert_pad = pad;
+	codepend_invert(x,x->invert);//resubmit to invert
+}
+
+void codepend_invert(t_codepend *x, t_floatarg toggle)
+{
+	
+	x->invert_nextstate = (short)toggle;
+	x->invert_countdown = x->fft->overlap; // delay effect for "overlap" vectors
+	
+	if(x->invert_nextstate){ // lower gain immediately; delay going to invert
+		x->fft->mult = (1. / (float) x->fft->N) * x->invert_pad;
+	} else {
+		x->invert = 0; //immediately turn off invert; delay raising gain
+	}
+	
+}
+
+void *codepend_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_fftease *fft, *fft2;
+	t_codepend *x = (t_codepend *)pd_new(codepend_class);
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	x->fft2 = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft2 = x->fft2;
+	fft->initialized = 0;
+	fft2->initialized = 0;
+	
+	/* optional arguments: scaling exponent, threshold (now linear), overlap, winfac */
+	x->exponent = 0.25;
+	x->threshold = 0.01;
+
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+
+	fft2->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft2->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft2->winfac = FFTEASE_DEFAULT_WINFAC;
+		
+	fft2->MSPVectorSize = fft->MSPVectorSize = sys_getblksize();
+    if(argc > 0){ fft->N = fft2->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = fft2->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	
+	return x;
+}
+
+void codepend_init(t_codepend *x )
+{
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	short initialized = fft->initialized;
+	
+	fftease_init(fft);
+	fftease_init(fft2);
+	if(!initialized){
+		x->invert_pad = 0.025; // -32 dB
+		x->invert_countdown = 0;
+		x->mute = 0;
+		x->invert = 0;
+	}
+    if(x->invert){
+		x->fft->mult *= x->invert_pad;
+    }
+}
+
+void do_codepend(t_codepend *x)
+{
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int i;
+	int N2 = fft->N2;
+	float a1, b1, a2, b2, threshold = 0.1;
+	int even, odd;
+	int invert = x->invert;
+	t_float exponent = x->exponent;
+	t_float *bufferOne = fft->buffer;
+	t_float *bufferTwo = fft2->buffer;
+	t_float *channelOne = fft->channel;
+	//	float *channelTwo = fft2->channel;
+	
+	if(x->invert_countdown > 0){
+		
+		if(x->invert) { // we 
+		} else {
+		}  
+		--(x->invert_countdown);
+		if(! x->invert_countdown){ // countdown just ended
+			if(x->invert_nextstate){ // moving to invert (gain is already down)
+				x->invert = x->invert_nextstate;
+			} else { // invert is already off - now reset gain
+				x->fft->mult = 1. / (float) x->fft->N;
+			}
+		}
+	}
+	if ( x->threshold != 0. )
+		threshold = x->threshold;		
+	
+	fftease_fold(fft);
+	fftease_fold(fft2);
+	
+	fftease_rdft(fft, 1);
+	fftease_rdft(fft2, 1);
+	
+	if (invert) {
+		
+		for ( i = 0; i <= N2; i++ ) {
+			
+			float mag_1, mag_2;
+			
+			odd = ( even = i<<1 ) + 1;
+			
+			a1 = ( i == N2 ? *(bufferOne+1) : *(bufferOne+even) );
+			b1 = ( i == 0 || i == N2 ? 0. : *(bufferOne+odd) );
+			
+			a2 = ( i == N2 ? *(bufferTwo+1) : *(bufferTwo+even) );
+			b2 = ( i == 0 || i == N2 ? 0. : *(bufferTwo+odd) );
+			
+			/* complex division */	
+			
+			mag_1 = hypot( a1, b1 );
+			mag_2 = hypot( a2, b2 );
+			
+			if ( mag_2 > threshold )
+				*(channelOne+even) =  mag_1 / mag_2;
+			
+			else
+				*(channelOne+even) =  mag_1 / threshold;
+			
+			if ( mag_1 != 0. && mag_2 != 0. )
+				*(channelOne+odd) = atan2( b2, a2 ) - atan2( b1, a1 );
+			
+			else 
+				*(channelOne+odd) = 0.;
+			
+			/* raise resulting magnitude to a desired power */
+			
+			*(channelOne+even) = pow( *(channelOne+even), exponent );
+		}  
+	}
+	
+	
+	else {
+		
+		for ( i = 0; i <= N2; i++ ) {
+			
+			float f_real, f_imag;
+			
+			odd = ( even = i<<1 ) + 1;
+			
+			a1 = ( i == N2 ? *(bufferOne+1) : *(bufferOne+even) );
+			b1 = ( i == 0 || i == N2 ? 0. : *(bufferOne+odd) );
+			
+			a2 = ( i == N2 ? *(bufferTwo+1) : *(bufferTwo+even) );
+			b2 = ( i == 0 || i == N2 ? 0. : *(bufferTwo+odd) );
+			
+			/* complex multiply */
+			
+			f_real = (a1 * a2) - (b1 * b2);
+			f_imag = (a1 * b2) + (b1 * a2);	
+			
+			*(channelOne+even) = hypot( f_real, f_imag );
+			*(channelOne+odd) = -atan2( f_imag, f_real );
+			
+			/* raise resulting magnitude to a desired power */
+			
+			*(channelOne+even) = pow( *(channelOne+even), exponent );
+		}
+	}
+	
+	/* convert back to complex form, read for the inverse fft */
+	
+	for ( i = 0; i <= N2; i++ ) {
+		
+		odd = ( even = i<<1 ) + 1;
+		
+		*(bufferOne+even) = *(channelOne+even) * cos( *(channelOne+odd) );
+		
+		if ( i != N2 )
+			*(bufferOne+odd) = -(*(channelOne+even)) * sin( *(channelOne+odd) );
+	}
+	
+	fftease_rdft(fft, -1);
+	fftease_overlapadd(fft);
+}
+
+t_int *codepend_perform(t_int *w)
+{
+	int i, j;
+	/* get our inlets and outlets */
+	t_codepend *x = (t_codepend *) (w[1]);
+	t_float *MSPInputVector1 = (t_float *)(w[2]);
+	t_float *MSPInputVector2 = (t_float *)(w[3]);
+	t_float *vec_exponent = (t_float *)(w[4]);
+	t_float *vec_threshold = (t_float *)(w[5]);
+	t_float *MSPOutputVector = (t_float *)(w[6]);
+	
+    x->exponent = *vec_exponent;
+    x->threshold = *vec_threshold;
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int MSPVectorSize = fft->MSPVectorSize;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalInputVector1 = fft->internalInputVector;
+	t_float *internalInputVector2 = fft2->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	t_float *inputOne = fft->input;
+	t_float *inputTwo = fft2->input;
+	t_float *output = fft->output;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	float mult = fft->mult;	
+	
+	if(x->mute){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+        return w+7;
+	}
+
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){	
+        memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputOne + (Nw - D), MSPInputVector1, D * sizeof(t_float));
+        memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputTwo + (Nw - D), MSPInputVector2, D * sizeof(t_float));
+        
+		do_codepend(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw-D), MSPInputVector1 + (D*i), D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw-D), MSPInputVector2 + (D*i), D * sizeof(t_float));
+            
+			do_codepend(x);
+            
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	} 
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector1 + (operationCount * MSPVectorSize), MSPInputVector1, MSPVectorSize * sizeof(t_float));
+        memcpy(internalInputVector2 + (operationCount * MSPVectorSize), MSPInputVector2, MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize), MSPVectorSize * sizeof(t_float));
+        
+		operationCount = (operationCount + 1) % operationRepeat;
+        
+        if( operationCount == 0 ) {
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw - D), internalInputVector1, D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw - D), internalInputVector2, D * sizeof(t_float));
+            
+            do_codepend(x);
+            
+            for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+7;
+}		
+
+void codepend_dsp(t_codepend *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    t_fftease *fft = x->fft;
+    t_fftease *fft2 = x->fft2;
+    
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(!samplerate)
+        return;
+    
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+		fft2->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft2);
+	}
+	if(fft->R != samplerate ){
+		fft->R = samplerate;
+        fft2->R = samplerate;
+	}
+    if(reset_required){
+        codepend_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(codepend_perform, 6, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, sp[4]->s_vec);
+    }
+}
diff --git a/externals/fftease/collect.pl b/externals/fftease/collect.pl
new file mode 100644
index 0000000000000000000000000000000000000000..34f1f89b19b30bdbc7c8405008cfa3acf6be019c
--- /dev/null
+++ b/externals/fftease/collect.pl
@@ -0,0 +1,6 @@
+while(<*>){
+    chomp;
+    if(/darwin$/ || /libfftease.dylib/){
+	`mv $_ fftease32-externals`;
+    }
+}
diff --git a/externals/fftease/convert.c b/externals/fftease/convert.c
new file mode 100644
index 0000000000000000000000000000000000000000..f08ee78c4a7a6f569dbb07c98f4ca22e9525815e
--- /dev/null
+++ b/externals/fftease/convert.c
@@ -0,0 +1,49 @@
+#include "fftease.h"
+
+
+/* S is a spectrum in rfft format, i.e., it contains N real values
+ arranged as real followed by imaginary values, except for first
+ two values, which are real parts of 0 and Nyquist frequencies;
+ convert first changes these into N/2+1 PAIRS of magnitude and
+ phase values to be stored in output array C; the phases are then
+ unwrapped and successive phase differences are used to compute
+ estimates of the instantaneous frequencies for each phase vocoder
+ analysis channel; decimation rate D and sampling rate R are used
+ to render these frequency values directly in Hz. */
+
+
+void fftease_convert(t_fftease *fft)
+{
+	t_float *buffer = fft->buffer;
+	t_float *channel = fft->channel;
+	int N2 = fft->N2;
+	t_float *lastphase = fft->c_lastphase_in;
+	t_float fundamental = fft->c_fundamental;
+	t_float factor = fft->c_factor_in;
+	
+	t_float 	phase, phasediff;
+	int real,imag,amp,freq;
+	t_float a,b;
+	int i;
+	
+	
+    for ( i = 0; i <= N2; i++ ) {
+		imag = freq = ( real = amp = i<<1 ) + 1;
+		a = ( i == N2 ? buffer[1] : buffer[real] );
+		b = ( i == 0 || i == N2 ? 0. : buffer[imag] );
+		
+		channel[amp] = hypot( a, b );
+		if ( channel[amp] == 0. )
+			phasediff = 0.;
+		else {
+			phasediff = ( phase = -atan2( b, a ) ) - lastphase[i];
+			lastphase[i] = phase;
+			
+			while ( phasediff > PI )
+				phasediff -= TWOPI;
+			while ( phasediff < -PI )
+				phasediff += TWOPI;
+		}
+		channel[freq] = phasediff*factor + i*fundamental;
+    }
+}
diff --git a/externals/fftease/cross~.c b/externals/fftease/cross~.c
new file mode 100644
index 0000000000000000000000000000000000000000..56d14144179244d5f46937af06f3b22423192bae
--- /dev/null
+++ b/externals/fftease/cross~.c
@@ -0,0 +1,297 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *cross_class;
+
+#define OBJECT_NAME "cross~"
+
+typedef struct _cross
+{
+	t_object x_obj;
+    float x_f;
+	t_fftease *fft;
+	t_fftease *fft2; 
+	t_float threshie;
+	short mute;//flag
+	short autonorm;// for self gain regulation
+    t_float normult; // adjusted multiplier on a per-frame basis
+} t_cross;
+
+void *cross_new(t_symbol *s, int argc, t_atom *argv);
+t_int *cross_perform(t_int *w);
+void cross_dsp(t_cross *x, t_signal **sp);
+void *cross_new(t_symbol *s, int argc, t_atom *argv);
+void cross_init(t_cross *x);
+void cross_fftinfo(t_cross *x);
+void cross_mute(t_cross *x, t_floatarg toggle);
+void cross_autonorm(t_cross *x, t_floatarg toggle);
+void cross_free(t_cross *x);
+
+void cross_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("cross~"), (t_newmethod)cross_new,
+                  (t_method)cross_free,sizeof(t_cross), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_cross, x_f);
+	class_addmethod(c,(t_method)cross_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)cross_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(c,(t_method)cross_autonorm, gensym("autonorm"),  A_FLOAT, 0);
+    cross_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void cross_autonorm(t_cross *x, t_floatarg toggle)
+{
+	x->autonorm = (short) toggle;
+}
+
+void cross_fftsize(t_cross *x, t_floatarg f)
+{	
+	x->fft->N = (int) f;
+	x->fft2->N = (int) f;
+	cross_init(x);
+}
+
+void cross_mute(t_cross *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;
+}
+
+void cross_free(t_cross *x)
+{
+	fftease_free(x->fft);
+	fftease_free(x->fft2);
+    free(x->fft);
+    free(x->fft2);
+}
+
+void *cross_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_fftease *fft, *fft2;
+	t_cross *x = (t_cross *)pd_new(cross_class);
+
+
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	x->fft2 = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft2 = x->fft2;	
+	fft->initialized = 0;
+	fft2->initialized = 0;
+	
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+	fft2->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft2->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft2->winfac = FFTEASE_DEFAULT_WINFAC;
+    if(argc > 0){ fft->N = fft2->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = fft2->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+}
+
+void cross_init(t_cross *x)
+{
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	short initialized;
+
+	initialized = fft->initialized;
+	
+	fftease_init(fft);
+	fftease_init(fft2);
+
+	if(!initialized){
+		x->threshie = .001 ;
+		x->autonorm = 0;
+        x->mute = 0;
+	}
+}
+
+void do_cross(t_cross *x)
+{
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int i;
+	int N2 = fft->N2;
+	t_float a1, b1, a2, b2;
+	t_float *buffer1 = fft->buffer;
+	t_float *buffer2 = fft2->buffer;
+	t_float *channel1 = fft->channel;
+	short autonorm = x->autonorm;
+	int N = fft->N;
+	t_float mult = fft->mult;
+	int even, odd;
+	t_float gainer;
+	t_float threshie = x->threshie;
+	t_float ingain = 0;
+	t_float outgain, rescale;
+	t_float mymult;
+
+	fftease_fold(fft);
+	fftease_fold(fft2);
+	fftease_rdft(fft,1);
+	fftease_rdft(fft2,1);
+
+	/* changing algorithm for window flexibility */
+	if(autonorm){
+		ingain = 0;
+		for(i = 0; i < N; i+=2){
+			ingain += hypot(buffer1[i], buffer1[i+1]);
+		}
+	}
+	
+	for ( i = 0; i <= N2; i++ ) {
+		odd = ( even = i<<1 ) + 1;
+		
+		a1 = ( i == N2 ? *(buffer1+1) : *(buffer1+even) );
+		b1 = ( i == 0 || i == N2 ? 0. : *(buffer1+odd) );
+		a2 = ( i == N2 ? *(buffer2+1) : *(buffer2+even) );
+		b2 = ( i == 0 || i == N2 ? 0. : *(buffer2+odd) );
+		gainer = hypot(a2, b2);
+		if( gainer > threshie ) 
+			*(channel1+even) = hypot( a1, b1 ) * gainer;
+		*(channel1+odd) = -atan2( b1, a1 );
+		*(buffer1+even) = *(channel1+even) * cos( *(channel1+odd) );
+		if ( i != N2 )
+			*(buffer1+odd) = -(*(channel1+even)) * sin( *(channel1+odd) );
+		
+	}
+	if(autonorm){
+		outgain = 0;
+		for(i = 0; i < N; i+=2){
+			outgain += hypot(buffer1[i], buffer1[i+1]);
+		}
+		if(ingain <= .0000001){
+			// post("gain emergency!");
+			rescale = 1.0;
+		} else {
+			rescale = ingain / outgain;
+		} 
+		//post("ingain %f outgain %f rescale %f",ingain, outgain, rescale);
+		x->normult = mult * rescale;
+	}  else {
+		x->normult = mult;
+        //post("mymult: %f", mymult);
+	}
+	fftease_rdft(fft, -1);
+	fftease_overlapadd(fft);
+}
+
+t_int *cross_perform(t_int *w)
+{
+	int i, j;
+    t_cross *x = (t_cross *) (w[1]);
+	t_float *MSPInputVector1 = (t_float *)(w[2]);
+	t_float *MSPInputVector2 = (t_float *)(w[3]);
+	t_float *threshold = (t_float *)(w[4]);
+	t_float *MSPOutputVector = (t_float *)(w[5]);
+
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int MSPVectorSize = fft->MSPVectorSize;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalInputVector1 = fft->internalInputVector;
+	t_float *internalInputVector2 = fft2->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	t_float *inputOne = fft->input;
+	t_float *inputTwo = fft2->input;
+	t_float *output = fft->output;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float mult = fft->mult;	
+	
+	if(x->mute){
+		for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+        return w+6;
+	}
+
+    x->threshie = *threshold;
+
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputOne + (Nw - D), MSPInputVector1, D * sizeof(t_float));
+        memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputTwo + (Nw - D), MSPInputVector2, D * sizeof(t_float));
+        
+		do_cross(x);
+        mult = x->normult;
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw-D), MSPInputVector1 + (D*i), D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw-D), MSPInputVector2 + (D*i), D * sizeof(t_float));
+            
+			do_cross(x);
+            mult = x->normult;
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector1 + (operationCount * MSPVectorSize), MSPInputVector1, MSPVectorSize * sizeof(t_float));
+        memcpy(internalInputVector2 + (operationCount * MSPVectorSize), MSPInputVector2, MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize), MSPVectorSize * sizeof(t_float));
+        
+		operationCount = (operationCount + 1) % operationRepeat;
+        
+        if( operationCount == 0 ) {
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw - D), internalInputVector1, D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw - D), internalInputVector2, D * sizeof(t_float));
+            
+            do_cross(x);
+            mult = x->normult;
+            for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+6;
+}
+
+void cross_dsp(t_cross *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    t_fftease *fft = x->fft;
+    t_fftease *fft2 = x->fft2;
+    
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(!samplerate)
+        return;
+    
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+		fft2->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft2);
+	}
+	if(fft->R != samplerate ){
+		fft->R = samplerate;
+        fft2->R = samplerate;
+	}
+    if(reset_required){
+        cross_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(cross_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec);
+    }
+}
+
diff --git a/externals/fftease/dentist~.c b/externals/fftease/dentist~.c
new file mode 100644
index 0000000000000000000000000000000000000000..62c8e4bdcf5f9e8d0576b055d3120496d143cf86
--- /dev/null
+++ b/externals/fftease/dentist~.c
@@ -0,0 +1,585 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *dentist_class;
+
+#define OBJECT_NAME "dentist~"
+
+typedef struct _dentist
+{
+	t_object x_obj;
+    float x_f;
+    t_fftease *fft;
+	short *bin_selection;
+	short *last_bin_selection;
+	int *active_bins;
+	int tooth_count;
+	int ramp_frames;
+	int frames_left;
+	t_float frame_duration;
+	int max_bin;
+	t_float topfreq;
+	t_float funda;
+	void *list_outlet;
+	short direct_update;
+	short mute;
+	t_atom *list_data;
+	short interpolate_singles;
+	t_float sync;
+    t_float ramp_ms;
+
+} t_dentist;
+
+void *dentist_new(t_symbol *msg, short argc, t_atom *argv);
+void dentist_dsp(t_dentist *x, t_signal **sp);
+t_int *dentist_perform(t_int *w);
+void set_switch_bins (t_dentist *x, int i);
+void reset_shuffle(t_dentist *x);
+void dentist_showstate(t_dentist *x);
+void dentist_direct_update(t_dentist *x, t_floatarg toggle);
+void dentist_mute(t_dentist *x, t_floatarg toggle);
+void dentist_setstate(t_dentist *x, t_symbol *msg, short argc, t_atom *argv);
+void dentist_ramptime(t_dentist *x, t_floatarg ramp_ms);
+int rand_index(int max);
+void dentist_init(t_dentist *x);
+void dentist_bins_pd (t_dentist *x, t_floatarg i);
+void dentist_topfreq(t_dentist *x, t_floatarg f);
+void dentist_free(t_dentist *x);
+void dentist_toothcount(t_dentist *x, t_floatarg newcount);
+void dentist_scramble(t_dentist *x);
+void dentist_activate_bins(t_dentist *x, t_floatarg f);
+void dentist_interpolate_singles(t_dentist *x, t_floatarg f);
+void dentist_fftinfo(t_dentist *x);
+void dentist_mute(t_dentist *x, t_floatarg toggle);
+
+void dentist_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("dentist~"), (t_newmethod)dentist_new,
+                  (t_method)dentist_free,sizeof(t_dentist), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_dentist, x_f);
+	class_addmethod(c,(t_method)dentist_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)dentist_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(c,(t_method)dentist_fftinfo,gensym("fftinfo"),0);
+	class_addmethod(c,(t_method)dentist_showstate,gensym("showstate"),0);
+	class_addmethod(c,(t_method)dentist_setstate, gensym("setstate"), A_GIMME, 0);
+	class_addmethod(c,(t_method)dentist_ramptime, gensym("ramptime"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)dentist_topfreq, gensym("topfreq"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)dentist_toothcount, gensym("toothcount"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)dentist_interpolate_singles, gensym("interpolate_singles"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)dentist_scramble, gensym("scramble"), 0);
+    
+    dentist_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+
+void dentist_interpolate_singles(t_dentist *x, t_floatarg f)
+{
+    x->interpolate_singles = (short)f;
+	//    post("singles interp: %d",x->interpolate_singles);
+}
+
+void dentist_free(t_dentist *x)
+{
+	fftease_free(x->fft);
+    free(x->fft);
+    free(x->bin_selection);
+    free(x->active_bins);
+    free(x->last_bin_selection);
+    free(x->list_data);
+}
+
+void dentist_fftsize(t_dentist *x, t_floatarg f)
+{	
+	t_fftease *fft = x->fft;
+	fft->N = (int) f;
+	dentist_init(x);
+}
+
+void dentist_overlap(t_dentist *x, t_floatarg f)
+{
+	x->fft->overlap = (int) f;
+	dentist_init(x);
+}
+
+void dentist_winfac(t_dentist *x, t_floatarg f)
+{
+	t_fftease *fft = x->fft;
+	fft->winfac = (int) f;
+	dentist_init(x);
+}
+
+void dentist_fftinfo( t_dentist *x )
+{
+	fftease_fftinfo( x->fft, OBJECT_NAME );
+}
+
+
+void dentist_direct_update( t_dentist *x, t_floatarg toggle)
+{
+	x->direct_update = (short)toggle;
+}
+
+void dentist_mute( t_dentist *x, t_floatarg toggle )
+{
+	x->mute = (short)toggle;
+}
+
+void *dentist_new(t_symbol *msg, short argc, t_atom *argv)
+{
+    t_fftease *fft;
+	t_dentist *x = (t_dentist *)pd_new(dentist_class);
+	
+	outlet_new(&x->x_obj, gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+    x->list_outlet = outlet_new(&x->x_obj, gensym("list"));
+    
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft->initialized = 0;
+	
+	x->topfreq = 3000; // an attribute candidate
+	x->ramp_ms = 1000.0;
+    x->tooth_count = 3;
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+
+	return x;
+}
+
+void dentist_topfreq(t_dentist *x, t_floatarg f)
+{
+	float funda = x->funda;
+	float curfreq;
+	t_fftease *fft = x->fft;
+    if(f < 50 || f > fft->R/2.0)
+        return;
+	
+    x->topfreq = f;
+    if(! x->fft->initialized){
+        return;
+    }
+    x->max_bin = 1;  
+    curfreq = 0;
+    while(curfreq < x->topfreq) {
+        ++(x->max_bin);
+        curfreq += funda ;
+    }
+}
+
+void dentist_init(t_dentist *x)
+{
+	int i;
+	t_fftease *fft = x->fft;
+	short initialized = fft->initialized;
+ 	fftease_init(fft);
+	   
+	if(!initialized){
+		x->sync = 0;
+		x->mute = 0;
+		x->direct_update = 0;
+		if(x->topfreq < 100)
+			x->topfreq = 100.0;
+		x->bin_selection = (short *) calloc(fft->N, sizeof(short));
+		x->active_bins = (int *) calloc(fft->N2, sizeof(int));
+		x->last_bin_selection = (short *) calloc(fft->N2, sizeof(short)) ;
+		x->list_data = (t_atom *) calloc((fft->N + 2), sizeof(t_atom));
+		
+		x->interpolate_singles = 1;
+		x->ramp_frames = 0;
+		
+	} else {
+		x->bin_selection = (short *) realloc((void *)x->bin_selection, fft->N * sizeof(short));
+		x->active_bins = (int *) realloc((void *)x->active_bins, fft->N2 * sizeof(int));
+		x->last_bin_selection = (short *) realloc((void *)x->last_bin_selection, fft->N2 * sizeof(short)) ;
+		x->list_data = (t_atom *) realloc((void *)x->list_data, (fft->N + 2) * sizeof(t_atom));
+	}
+
+	dentist_scramble(x);
+	
+    fft->mult = 1. / (t_float) fft->N;
+    x->frame_duration = (t_float) fft->D / (t_float) fft->R;
+    x->frames_left = x->ramp_frames = (int)(x->ramp_ms * .001 / x->frame_duration);
+    x->funda = (t_float) fft->R / (t_float) fft->N;
+    x->max_bin = 1;  
+
+    if(!x->funda){
+    	error("%s: zero sampling rate!",OBJECT_NAME);
+    	return;
+    }
+    x->max_bin = (int) (x->topfreq / x->funda);
+    if(x->max_bin < 1)
+    	x->max_bin = 1;
+     
+    for( i = 0; i < fft->N2; i++) {
+        x->last_bin_selection[i] = x->bin_selection[i];
+    }
+    dentist_toothcount(x, x->tooth_count);
+}
+
+void do_dentist(t_dentist *x)
+{
+	int	i;
+	t_float oldfrac,newfrac;
+	t_fftease *fft = x->fft;
+	t_float *channel = fft->channel;
+	int frames_left = x->frames_left;
+	int ramp_frames = x->ramp_frames;
+	short *bin_selection = x->bin_selection;
+	short *last_bin_selection = x->last_bin_selection;
+	int N2 = fft->N2;
+	float sync = x->sync;
+
+	fftease_fold(fft);
+	fftease_rdft(fft,1);
+	fftease_leanconvert(fft);
+	
+	if(frames_left > 0 && ramp_frames > 0) {
+		// INTERPOLATE ACCORDING TO POSITION IN RAMP
+		oldfrac = (float) frames_left / (float) ramp_frames ;
+		sync = newfrac = 1.0 - oldfrac;
+		for( i = 0; i < N2 ; i++){
+			if( (! bin_selection[i]) && (! last_bin_selection[i]) ){
+				channel[i * 2]  = 0;
+			} 
+			else if (bin_selection[i]) {
+				channel[i * 2]  *= newfrac;
+			} 
+			else if (last_bin_selection[i]) {
+				channel[i * 2]  *= oldfrac;
+			}
+		}
+		--frames_left;
+		if( ! frames_left ){
+			// Copy current to last
+			for( i = 0; i < N2; i++) {
+				last_bin_selection[i] = bin_selection[i];
+			}
+		}
+	} else {
+		for( i = 0; i < N2 ; i++){
+			if( ! bin_selection[ i ] ){
+				channel[ i * 2 ]  = 0;
+			}
+		}
+		oldfrac = 0.0;
+		sync = 1.0;
+	}
+	
+	fftease_leanunconvert(fft);
+	fftease_rdft(fft,-1);
+	fftease_overlapadd(fft);
+	x->frames_left = frames_left;
+	x->sync = sync;
+}
+
+t_int *dentist_perform(t_int *w)
+{
+	int	i,j;
+    t_dentist *x = (t_dentist *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *MSPOutputVector = (t_float *)(w[3]);
+	t_float *sync_vec = (t_float *)(w[4]);
+	t_fftease *fft = x->fft;
+	t_float *input = fft->input;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *output = fft->output;
+	t_float mult = fft->mult ;
+	int MSPVectorSize = fft->MSPVectorSize;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;		
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;	
+	
+	if(x->mute){
+		for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		for(i=0; i < MSPVectorSize; i++){ sync_vec[i] = 0.0; }
+        return w+5;
+	}	
+
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_dentist(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_dentist(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_dentist(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+	for(i = 0; i < MSPVectorSize; i++){
+		sync_vec[i] = x->sync;
+	}
+	return w+5;
+}		
+
+
+void set_switch_bins (t_dentist *x, int i)
+{
+	if( i < 0 ){
+		i = 0;
+	}
+	if( i > x->fft->N2 ) {
+		i = x->fft->N2;
+	}
+	x->tooth_count = i;
+	if( x->direct_update ){
+		reset_shuffle(x);
+	}
+	return;
+}
+//identical function for Pd
+void dentist_bins_pd (t_dentist *x, t_floatarg i)
+{
+	if( i < 0 ){
+		i = 0;
+	}
+	if( i > x->fft->N2 ) {
+		i = x->fft->N2;
+	}
+	x->tooth_count = (int)i;
+	if(x->direct_update){
+		reset_shuffle(x);
+	}
+	return;
+}
+
+// experimental, not to be used
+void dentist_activate_bins(t_dentist *x, t_floatarg f)
+{
+    if(f < 0 || f > x->max_bin){
+        post("* %d bin out of range",(int)f);
+        return;
+    }
+    x->tooth_count = (int)f;
+}
+
+void dentist_scramble(t_dentist *x)
+{
+	short *last_bin_selection = x->last_bin_selection;
+	short *bin_selection = x->bin_selection;
+	int *active_bins = x->active_bins;
+	int N2 = x->fft->N2;
+	int i,tmp,b1,b2;
+	int maxswap = x->max_bin;
+
+    if(!x->fft->initialized){
+        return;
+    }
+	for(i=0; i<N2; i++){
+		bin_selection[i] = 0;
+		active_bins[i] = i;
+	}
+	while(maxswap > 0){
+		b1 = maxswap;
+		b2 = rand_index(maxswap);
+		tmp = active_bins[b1];
+		active_bins[b1] = active_bins[b2];
+		active_bins[b2] = tmp;
+		--maxswap;
+	}
+	for( i = 0; i < x->tooth_count; i++ ) {
+		x->bin_selection[active_bins[i]] = 1;
+	}
+	x->frames_left = x->ramp_frames;
+	if(! x->ramp_frames) {
+		for(i = 0; i < N2; i++){
+			last_bin_selection[i] = bin_selection[i];
+		}
+	}    
+}
+
+
+
+void dentist_toothcount(t_dentist *x, t_floatarg newcount)
+{
+	int i;
+	int nc = (int) newcount;
+	int tooth_count = x->tooth_count;
+    if(! x->fft->initialized){
+        x->tooth_count = newcount;
+        return;
+    }
+	if(nc < 0 || nc > x->fft->N2){
+		error("dentist~: %d out of range",nc);
+		return;
+	}
+
+	if(nc < x->tooth_count){
+		for(i = nc; i < tooth_count; i++){
+			x->bin_selection[x->active_bins[i]] = 0;
+		}
+	}
+    else {
+		for(i = tooth_count; i < nc; i++){
+			x->bin_selection[x->active_bins[i]] = 1;
+		}
+	}
+	// if immediate reset
+	if(x->interpolate_singles){
+		//  post("setting frames left");
+		x->frames_left = x->ramp_frames;
+	}
+	if(! x->ramp_frames) {
+		for(i = 0; i < x->fft->N2; i++){
+			x->last_bin_selection[i] = x->bin_selection[i];
+		}
+	}
+	x->tooth_count = nc;
+}
+
+
+void reset_shuffle (t_dentist *x)
+{
+	int i;
+	int max;
+	
+	max = x->max_bin;
+	for(i = 0; i < x->fft->N2; i++){
+		x->last_bin_selection[i] = x->bin_selection[i];
+		x->bin_selection[i] = 0;
+	}
+	for(i = 0; i < x->max_bin; i++) {
+		x->active_bins[i] = rand_index(max);
+		x->bin_selection[x->active_bins[i]] = 1;
+	}
+	x->frames_left = x->ramp_frames;
+	if(! x->ramp_frames) { // Ramp Off - Immediately set last to current
+		for( i = 0; i < x->fft->N2; i++ ){
+			x->last_bin_selection[ i ] = x->bin_selection[ i ];
+		}
+	}
+}
+
+int rand_index(int max) {
+	return (rand() % max);
+}
+
+void dentist_setstate (t_dentist *x, t_symbol *msg, short argc, t_atom *argv) {
+	short i;
+	int selex;
+	
+	short *last_bin_selection = x->last_bin_selection;
+	short *bin_selection = x->bin_selection;
+	int *active_bins = x->active_bins;
+	x->tooth_count = argc;
+	int N2 = x->fft->N2;
+	
+	for(i = 0; i < N2; i++){
+		last_bin_selection[i] = bin_selection[i]; // needed here
+		bin_selection[i] = 0;
+	}
+	
+	for (i=0; i < argc; i++) {
+		selex = atom_getfloatarg(i,argc,argv);
+		if (selex < N2 && selex >= 0 ) {
+			active_bins[i] = selex;
+			bin_selection[selex] = 1;
+		} else {
+			post ("%d out of range bin",selex);
+		}		
+	}
+	
+	
+	x->frames_left = x->ramp_frames;
+	if(! x->ramp_frames) { // Ramp Off - Immediately set last to current
+		for(i = 0; i < N2; i++){
+			last_bin_selection[i] = bin_selection[i];
+		}
+	}
+	
+	return;
+}
+void dentist_ramptime (t_dentist *x, t_floatarg ramp_ms) {
+	
+	if(ramp_ms <= 0){
+		return;
+	}
+    x->ramp_ms = ramp_ms;
+    if(!x->fft->initialized){
+        return;
+    }
+	x->frames_left = x->ramp_frames = (int)(x->ramp_ms * .001 / x->frame_duration);
+	return;
+}
+// REPORT CURRENT SHUFFLE STATUS
+void dentist_showstate (t_dentist *x) {
+	
+	t_atom *list_data = x->list_data;
+	
+	short i, count;
+	float data;
+	
+	count = 0;
+	for(i = 0; i < x->tooth_count; i++ ) {
+		data = x->active_bins[i];
+		SETFLOAT(list_data+count,(t_float)x->active_bins[i]);
+		++count;
+	}	
+	outlet_list(x->list_outlet,0,x->tooth_count,list_data);
+	return;
+}
+
+void dentist_dsp(t_dentist *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        dentist_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(dentist_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec);
+    }
+}
+
+
diff --git a/externals/fftease/disarrain~.c b/externals/fftease/disarrain~.c
new file mode 100644
index 0000000000000000000000000000000000000000..41b525fefce42f4b58aa3bdf8584467e41c08d31
--- /dev/null
+++ b/externals/fftease/disarrain~.c
@@ -0,0 +1,687 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *disarrain_class;
+
+#define OBJECT_NAME "disarrain~"
+
+typedef struct _disarrain
+{
+	t_object x_obj;
+    float x_f;
+	t_fftease *fft;
+	t_float *last_channel;
+	t_float *composite_channel;
+	int *shuffle_mapping;
+	int *last_shuffle_mapping;
+	int *shuffle_tmp; // work space for making a new distribution
+	int shuffle_count;// number of bins to swap
+	int last_shuffle_count;// ditto from last shuffle mapping
+	int max_bin;
+	void *list_outlet;
+	t_atom *list_data;
+	short mute;
+	short bypass;
+	t_float frame_duration; // duration in seconds of a single frame
+	t_float interpolation_duration; // duration in seconds of interpolation
+	int interpolation_frames; // number of frames to interpolate
+	int frame_countdown; // keep track of position in interpolation
+	int perform_method;// 0 for lean, 1 for full conversion
+	float ival;
+	short lock;// lock for switching mapping arrays, but not used now
+	short force_fade; // new fadetime set regardless of situation
+	short force_switch;// binds new distribution to change of bin count
+	long fftsize_attr;
+	long overlap_attr;
+    t_float top_frequency;// for remapping spectrum (NOW AN ATTRIBUTE)
+	short reset_flag; // call for reset 
+	short switchcount_flag; // call for switch count
+    int switchcount;
+	int new_shuffle_count; // call to change switch count
+} t_disarrain;
+
+
+void *disarrain_new(t_symbol *msg, short argc, t_atom *argv);
+void disarrain_dsp(t_disarrain *x, t_signal **sp);
+t_int *disarrain_perform(t_int *w);
+void disarrain_switch_count(t_disarrain *x, t_floatarg i);
+void disarrain_fadetime(t_disarrain *x, t_floatarg f);
+void disarrain_topfreq(t_disarrain *x, t_floatarg f);
+void reset_shuffle( t_disarrain *x );
+void disarrain_showstate( t_disarrain *x );
+void disarrain_list (t_disarrain *x, t_symbol *msg, short argc, t_atom *argv);
+void disarrain_setstate (t_disarrain *x, t_symbol *msg, short argc, t_atom *argv);
+void disarrain_isetstate (t_disarrain *x, t_symbol *msg, short argc, t_atom *argv);
+int rand_index(int max);
+void disarrain_mute(t_disarrain *x, t_floatarg toggle);
+void copy_shuffle_array(t_disarrain *x);
+void interpolate_frames_to_channel(t_disarrain *x);
+void disarrain_killfade(t_disarrain *x);
+void disarrain_forcefade(t_disarrain *x, t_floatarg toggle);
+void disarrain_init(t_disarrain *x);
+void disarrain_free(t_disarrain *x);
+void disarrain_fftinfo(t_disarrain *x);
+void disarrain_force_switch(t_disarrain *x, t_floatarg toggle);
+
+void disarrain_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("disarrain~"), (t_newmethod)disarrain_new,
+                  (t_method)disarrain_free,sizeof(t_disarrain), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_disarrain, x_f);
+	class_addmethod(c,(t_method)disarrain_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)disarrain_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(c,(t_method)reset_shuffle, gensym("bang"), 0);
+	class_addmethod(c,(t_method)disarrain_showstate,gensym("showstate"),0);
+	class_addmethod(c,(t_method)disarrain_setstate, gensym("setstate"), A_GIMME, 0);
+	class_addmethod(c,(t_method)disarrain_isetstate, gensym("isetstate"), A_GIMME, 0);
+	class_addmethod(c,(t_method)disarrain_topfreq, gensym("topfreq"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)disarrain_fadetime, gensym("fadetime"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)disarrain_switch_count, gensym("switch_count"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)disarrain_killfade, gensym("killfade"), 0);
+    disarrain_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void disarrain_free(t_disarrain *x)
+{
+	fftease_free(x->fft);
+    free(x->fft);
+	free(x->last_channel);
+	free(x->composite_channel);
+	free(x->shuffle_mapping);
+	free(x->last_shuffle_mapping);
+	free(x->shuffle_tmp);
+	free(x->list_data);
+}
+
+void disarrain_init(t_disarrain *x)
+{
+	int i;
+	t_float curfreq;
+	
+	t_fftease *fft = x->fft;
+
+	t_float c_fundamental;
+	short initialized = fft->initialized;
+	
+ 	fftease_init(fft);
+
+	int N2 = fft->N2;
+	int N = fft->N;
+	int D = fft->D;
+	int R = fft->R;
+	c_fundamental = fft->c_fundamental;
+	if(initialized == 0){
+		x->mute = 0;
+		x->bypass = 0;
+		x->force_fade = 0;
+		x->interpolation_duration = 0.1; //seconds
+		x->shuffle_mapping = (int *) calloc( N2, sizeof(int) ) ;
+		x->last_shuffle_mapping = (int *) calloc( N2, sizeof(int) ) ;
+		x->shuffle_tmp = (int *) calloc( N2, sizeof(int) ) ;
+		x->list_data = (t_atom *) calloc((N+2), sizeof(t_atom) ) ;
+		x->last_channel = (t_float *) calloc((N+2), sizeof(float));
+		x->composite_channel = (t_float *) calloc((N+2), sizeof(float));
+		x->reset_flag = 0;
+		x->new_shuffle_count = 0;
+	} else {
+		x->shuffle_mapping = (int *)realloc(x->shuffle_mapping, N2 * sizeof(int));
+		x->last_shuffle_mapping = (int *)realloc(x->last_shuffle_mapping, N2 * sizeof(int));
+		x->shuffle_tmp = (int *)realloc(x->shuffle_tmp, N2 * sizeof(int));
+		x->list_data = (t_atom *)realloc(x->list_data, (N+2) * sizeof(t_atom));
+		x->last_channel = (t_float *)realloc(x->last_channel,(N+2) * sizeof(t_float));
+		x->composite_channel = (t_float *)realloc(x->composite_channel, (N+2) * sizeof(t_float));
+
+	}
+	
+	if( x->top_frequency < c_fundamental || x->top_frequency > 20000) {
+		x->top_frequency = 20000.0 ;
+	}
+	x->max_bin = 1;  
+	curfreq = 0;
+	while( curfreq < x->top_frequency ) {
+		++(x->max_bin);
+		curfreq += c_fundamental ;
+	}
+	for( i = 0; i < N2; i++ ) {
+		x->shuffle_mapping[i] = x->last_shuffle_mapping[i] = i*2;
+	}
+	reset_shuffle(x); // set shuffle lookup
+	copy_shuffle_array(x);// copy it to the last lookup (for interpolation)
+	x->frame_duration = (float) D / (float) R;
+	x->interpolation_frames = x->interpolation_duration / x->frame_duration;
+	x->frame_countdown = 0;
+	x->shuffle_count = 0;
+	x->last_shuffle_count = 0;
+    if(x->switchcount > 0){
+        disarrain_switch_count (x, (t_float)x->switchcount);
+    }
+}
+
+
+void disarrain_force_switch(t_disarrain *x, t_floatarg f)
+{
+	x->force_switch = (short)f;
+}
+
+
+
+void disarrain_fadetime (t_disarrain *x, t_floatarg f)
+{
+	int frames;
+	float duration;
+	
+
+    if(f > 0.0){
+        x->interpolation_duration = f * 0.001;
+    } else {
+        return;
+    }
+    if(! x->fft->initialized){
+        return;
+    }
+	if(x->frame_duration <= 0.0){
+		// error("%s: frame duration %f is too low", OBJECT_NAME, x->frame_duration);
+		return;
+	}
+	// duration = f * .001;
+	frames = x->interpolation_duration / x->frame_duration;
+	if( frames <= 1){
+		error("%s: fadetime too short",OBJECT_NAME);
+		return;
+	}
+	x->interpolation_frames = frames;
+}
+
+void disarrain_killfade(t_disarrain *x)
+{
+	x->frame_countdown = 0;
+	
+}
+
+void *disarrain_new(t_symbol *msg, short argc, t_atom *argv)
+{
+	t_fftease *fft;
+	t_disarrain *x = (t_disarrain *)pd_new(disarrain_class);
+	outlet_new(&x->x_obj, gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+    x->list_outlet = outlet_new(&x->x_obj, gensym("list"));
+	srand(time(0));
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+
+	fft->initialized = 0;
+	x->top_frequency = 3000;
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+}
+
+void disarrain_forcefade(t_disarrain *x, t_floatarg toggle)
+{
+	x->force_fade = (short)toggle;	
+}
+
+void disarrain_mute(t_disarrain *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;	
+}
+
+void disarrain_bypass(t_disarrain *x, t_floatarg toggle)
+{
+	x->bypass = (short)toggle;	
+}
+
+void disarrain_fftsize(t_disarrain *x, t_floatarg f)
+{	
+	t_fftease *fft = x->fft;
+	fft->N = (int) f;
+	disarrain_init(x);
+}
+
+void disarrain_overlap(t_disarrain *x, t_floatarg f)
+{
+	t_fftease *fft = x->fft;
+	fft->overlap = (int) f;
+	disarrain_init(x);
+}
+
+void disarrain_winfac(t_disarrain *x, t_floatarg f)
+{
+	t_fftease *fft = x->fft;
+	fft->winfac = (int) f;
+	disarrain_init(x); /* calling lighter reinit routine */
+}
+
+void disarrain_fftinfo( t_disarrain *x )
+{
+	fftease_fftinfo( x->fft, OBJECT_NAME );
+}
+
+void do_disarrain(t_disarrain *x)
+{
+	t_fftease *fft = x->fft;
+	t_float *channel = fft->channel;
+	int N = fft->N;
+	int  N2 = fft->N2;
+	t_float *last_channel = x->last_channel;
+	int		i,j;
+	int max = x->max_bin;
+	int temp, p1, p2;
+	float tmp;
+	int *shuffle_mapping = x->shuffle_mapping;
+	int shuffle_count = x->shuffle_count;
+	int *last_shuffle_mapping = x->last_shuffle_mapping;
+	int *shuffle_tmp = x->shuffle_tmp;
+	int last_shuffle_count = x->last_shuffle_count;	
+	int frame_countdown = x->frame_countdown; // will read from variable
+	int interpolation_frames = x->interpolation_frames;
+	float ival = x->ival;
+	int new_shuffle_count = x->new_shuffle_count;
+
+	
+	if(x->switchcount_flag){
+		
+		if( new_shuffle_count < 0 ){
+			new_shuffle_count = 0;
+		}
+		if( new_shuffle_count > N2 ) {
+			new_shuffle_count = N2;
+		}
+		if( new_shuffle_count > x->max_bin){
+			new_shuffle_count = x->max_bin;
+			post("disarrain~: switch constrained to %d", x->max_bin);
+		}		
+
+		memcpy(last_shuffle_mapping, shuffle_mapping,  N2 * sizeof(int));
+        
+		x->last_shuffle_count = x->shuffle_count;
+		x->shuffle_count = new_shuffle_count;
+		x->frame_countdown = x->interpolation_frames; // force interpolation
+
+		shuffle_count = x->shuffle_count;
+		frame_countdown = x->frame_countdown;
+		
+		x->switchcount_flag = 0;
+		x->reset_flag = 0;
+	}
+	else if(x->reset_flag){
+        
+		memcpy(last_shuffle_mapping, shuffle_mapping,  N2 * sizeof(int));
+		last_shuffle_count = shuffle_count;
+		shuffle_count = new_shuffle_count;
+		// post("%d %d %d", last_shuffle_count, shuffle_count, new_shuffle_count);
+		
+		for( i = 0; i < N2; i++ ) {
+			shuffle_tmp[i] = i;
+		}
+		
+		// crashed before here
+		for( i = 0; i < max; i++ ) {
+			p1 = rand() % max;
+			p2 = rand() % max;
+			if(p1 < 0 || p1 > max || p2 < 0 || p2 > max){
+				error("disarrain~: bad remaps: %d %d against %d", p1, p2, max);
+			} else {
+				temp = shuffle_tmp[p1];
+				shuffle_tmp[ p1 ] = shuffle_tmp[ p2 ];
+				shuffle_tmp[ p2 ] = temp;
+			}
+		}
+		for( i = 0; i < N2; i++ ) {
+			shuffle_tmp[i] *= 2;
+		}
+		frame_countdown = interpolation_frames;	
+		// post("in: countdown: %d, frames: %d", frame_countdown, interpolation_frames);
+        // dangerous???
+        
+		memcpy(shuffle_mapping, shuffle_tmp,  N2 * sizeof(int));
+
+		x->reset_flag = 0;
+	}
+	
+	fftease_fold(fft);
+	fftease_rdft(fft,1);
+	fftease_leanconvert(fft);
+	
+	// first time for interpolation, just do last frame 
+	
+	if(frame_countdown == interpolation_frames){
+		
+		for( i = 0, j = 0; i < last_shuffle_count ; i++, j+=2){
+			tmp = channel[j];
+			channel[j] = channel[last_shuffle_mapping[i]];
+			channel[last_shuffle_mapping[i]] = tmp;
+		}
+		--frame_countdown;
+	} 
+	// test only
+	else if( frame_countdown > 0 ){
+		ival = (float)frame_countdown/(float)interpolation_frames;
+		// copy current frame to lastframe
+		for(j = 0; j < N; j+=2){
+			last_channel[j] = channel[j];
+		}	
+		// make last frame swap
+		for(i = 0, j = 0; i < last_shuffle_count ; i++, j+=2){
+			tmp = last_channel[j];
+			last_channel[j] = last_channel[last_shuffle_mapping[i]];
+			last_channel[last_shuffle_mapping[i]] = tmp;
+			
+		}	
+		// make current frame swap
+		for( i = 0, j = 0; i < shuffle_count ; i++, j+=2){
+			tmp = channel[j];
+			channel[j]  = channel[shuffle_mapping[i]];
+			channel[shuffle_mapping[i]]  = tmp;
+			
+		}
+		// now interpolate between the two
+		
+		for(j = 0; j < N; j+=2){
+			channel[j] = channel[j] + ival * (last_channel[j] - channel[j]);
+		}
+		
+		--frame_countdown;
+		if(frame_countdown <= 0){
+			for(i = 0; i<N2; i++){
+				last_shuffle_mapping[i] = shuffle_mapping[i];
+			}
+			last_shuffle_count = shuffle_count;
+		}
+	} else {
+		// otherwise straight swapping
+		for( i = 0, j = 0; i < shuffle_count ; i++, j+=2){
+			tmp = channel[j];
+			channel[j]  = channel[ shuffle_mapping[i]];
+			channel[shuffle_mapping[i]] = tmp;     
+		}
+		ival = 0.0;
+	}
+	
+	fftease_leanunconvert(fft);
+	fftease_rdft(fft,-1);
+	fftease_overlapadd(fft);
+
+
+	
+	x->frame_countdown = frame_countdown;
+	x->last_shuffle_count = last_shuffle_count;
+	x->shuffle_count = shuffle_count;
+	x->ival = ival;
+}
+
+t_int *disarrain_perform(t_int *w)
+{
+	int i,j;
+	
+    t_disarrain *x = (t_disarrain *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *MSPOutputVector = (t_float *)(w[3]);
+	t_float *sync_vec = (t_float *)(w[4]);
+    t_fftease *fft = x->fft;
+	t_float *input = fft->input;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *output = fft->output;
+	t_float mult = fft->mult;
+	int MSPVectorSize = fft->MSPVectorSize;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;		
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;	
+	
+	if(x->mute){
+		for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		for(i=0; i < MSPVectorSize; i++){ sync_vec[i] = 0.0; }
+		return w+5;
+	}	
+
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_disarrain(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_disarrain(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_disarrain(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+	/* send out sync signal */
+	for(j = 0; j < MSPVectorSize; j++){
+		sync_vec[j] = 1.0 - x->ival;
+	}
+    return w+5;
+}		
+
+
+void interpolate_frames_to_channel(t_disarrain *x)
+{
+	float ival;
+	float tmp;
+	int i,j;
+	int frame_countdown = x->frame_countdown;
+	int interpolation_frames = x->interpolation_frames;
+	t_float *channel = x->fft->channel;
+	t_float *last_channel = x->last_channel;
+	int *shuffle_mapping = x->shuffle_mapping;
+	int shuffle_count = x->shuffle_count;
+	int *last_shuffle_mapping = x->last_shuffle_mapping;
+	int last_shuffle_count = x->last_shuffle_count;	
+	int local_max_bins;
+	int N = x->fft->N;
+	
+	ival = (t_float)frame_countdown/(t_float)interpolation_frames;
+	
+	local_max_bins = (shuffle_count > last_shuffle_count)? shuffle_count : last_shuffle_count;
+	for(j = 0; j < N; j+=2){
+		last_channel[j] = channel[j];
+	}
+	// make last frame
+	for( i = 0, j = 0; i < last_shuffle_count ; i++, j+=2){
+		tmp = last_channel[j];
+		last_channel[j] = last_channel[last_shuffle_mapping[i]];
+		last_channel[last_shuffle_mapping[i]] = tmp;
+	}
+	// make current frame
+	for( i = 0, j = 0; i < shuffle_count ; i++, j+=2){
+		tmp = channel[j];
+		channel[j]  = channel[shuffle_mapping[i]];
+		channel[shuffle_mapping[i]]  = tmp;
+	}
+	// now interpolate between the two
+	
+	for(j = 0; j < N; j+=2){
+		channel[j] += ival * (last_channel[j] - channel[j]);
+	}
+}
+
+
+
+void disarrain_switch_count (t_disarrain *x, t_floatarg f)
+{
+	int i = f;
+    x->switchcount = i;
+    if(! x->fft->initialized){
+        return;
+    }
+	if( i < 0 ){
+		i = 0;
+	}
+	if( i > x->max_bin ) {
+		i = x->max_bin;
+	}
+	x->reset_flag = 1;
+	x->new_shuffle_count = i;
+}
+
+
+void reset_shuffle (t_disarrain *x)
+{	
+	x->reset_flag = 1;
+}
+
+void copy_shuffle_array(t_disarrain *x)
+{
+	int N2 = x->fft->N2;
+	int *shuffle_mapping = x->shuffle_mapping;
+	int *last_shuffle_mapping = x->last_shuffle_mapping;	
+
+	memcpy(shuffle_mapping, last_shuffle_mapping,  N2 * sizeof(int));
+	x->last_shuffle_count = x->shuffle_count;
+	
+}
+
+
+int rand_index(int max) {
+	return (rand() % max);
+}
+
+
+void disarrain_topfreq (t_disarrain *x, t_floatarg freq)
+{
+    t_float funda = (t_float) x->fft->R / (t_float) x->fft->N;
+    t_float curfreq;
+    if(freq  <= 0 || freq > 22050){
+        post("freq %f is out of range", freq);
+        return;
+    }
+    x->top_frequency = freq;
+    if(! x->fft->initialized){
+        return;
+    }
+    funda = (t_float) x->fft->R / (t_float) x->fft->N;
+    x->max_bin = 1;
+    curfreq = 0;
+    while( curfreq < freq ) {
+        ++(x->max_bin);
+        curfreq += funda ;
+    }
+}
+
+void disarrain_list (t_disarrain *x, t_symbol *msg, short argc, t_atom *argv) {
+	short i;
+	int ival;
+	x->shuffle_count = argc;
+	for (i=0; i < argc; i++) {
+		ival = (int)argv[i].a_w.w_float;
+		if (ival < x->fft->N2) {
+			x->shuffle_mapping[i] = ival;
+		}
+	}
+	return;
+}
+
+
+void disarrain_isetstate (t_disarrain *x, t_symbol *msg, short argc, t_atom *argv) {
+	short i;
+	int ival;
+	int N2 = x->fft->N2;
+	
+	copy_shuffle_array(x);
+	x->shuffle_count = argc;
+    
+	for (i=0; i < argc; i++) {
+		ival = 2 * atom_getfloatarg(i,argc,argv);
+		
+		if ( ival < N2 && ival >= 0) {
+			x->shuffle_mapping[ i ] = ival;
+		}else {
+			error("%s: %d is out of range",OBJECT_NAME, ival);
+		}
+	}
+
+	x->frame_countdown = x->interpolation_frames;
+	return;
+}
+
+void disarrain_setstate (t_disarrain *x, t_symbol *msg, short argc, t_atom *argv) {
+	short i;
+	int ival;
+	int N2 = x->fft->N2;
+	x->shuffle_count = argc;
+	for (i=0; i < argc; i++) {
+		ival = 2 *atom_getfloatarg(i,argc,argv);
+		
+		if ( ival < N2 && ival >= 0) {
+			x->shuffle_mapping[ i ] = ival;
+		} else {
+			error("%s: %d is out of range",OBJECT_NAME, ival);
+		}
+	}
+	return;
+}
+
+// REPORT CURRENT SHUFFLE STATUS
+void disarrain_showstate (t_disarrain *x ) {
+	
+	t_atom *list_data = x->list_data;
+	short i;
+	for( i = 0; i < x->shuffle_count; i++ ) {
+		SETFLOAT(list_data+i,(t_float)x->shuffle_mapping[i]/2);
+	}
+	outlet_list(x->list_outlet,0,x->shuffle_count,list_data);
+	return;
+}
+
+void disarrain_dsp(t_disarrain *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        disarrain_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(disarrain_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec);
+    }
+}
+
diff --git a/externals/fftease/disarray~.c b/externals/fftease/disarray~.c
new file mode 100644
index 0000000000000000000000000000000000000000..4d27b4f316cd7d71d5882a82262520bfe7a2e494
--- /dev/null
+++ b/externals/fftease/disarray~.c
@@ -0,0 +1,403 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *disarray_class;
+
+#define OBJECT_NAME "disarray~"
+
+
+typedef struct _disarray
+{
+	t_object x_obj;
+    float x_f;
+	t_fftease *fft;
+    t_float top_frequency;
+	int *shuffle_in;
+    int *shuffle_out;
+    int shuffle_count;
+    int max_bin;
+	void *list_outlet;
+	t_atom *list_data;
+	short mute;
+	short bypass;
+	long fftsize_attr;
+	long overlap_attr;
+} t_disarray;
+
+void *disarray_new(t_symbol *msg, short argc, t_atom *argv);
+void disarray_dsp(t_disarray *x, t_signal **sp);
+t_int *disarray_perform(t_int *w);
+void disarray_switch_count (t_disarray *x, t_floatarg i);
+void disarray_topfreq (t_disarray *x, t_floatarg freq);
+void disarray_fadetime (t_disarray *x, t_floatarg f);
+void reset_shuffle( t_disarray *x );
+void disarray_showstate( t_disarray *x );
+void disarray_list (t_disarray *x, t_symbol *msg, short argc, t_atom *argv);
+void disarray_setstate (t_disarray *x, t_symbol *msg, short argc, t_atom *argv);
+void disarray_isetstate (t_disarray *x, t_symbol *msg, short argc, t_atom *argv);
+int rand_index(int max);
+void disarray_mute(t_disarray *x, t_floatarg toggle);
+void copy_shuffle_array(t_disarray *x);
+void interpolate_frames_to_channel(t_disarray *x);
+void disarray_killfade(t_disarray *x);
+void disarray_forcefade(t_disarray *x, t_floatarg toggle);
+void disarray_init(t_disarray *x);
+void disarray_free(t_disarray *x);
+void disarray_fftinfo(t_disarray *x);
+void disarray_force_switch(t_disarray *x, t_floatarg toggle);
+void iswitch_count(t_disarray *x, t_int i);
+void switch_count (t_disarray *x, t_floatarg i);
+
+void disarray_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("disarray~"), (t_newmethod)disarray_new,
+                  (t_method)disarray_free,sizeof(t_disarray), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_disarray, x_f);
+	class_addmethod(c,(t_method)disarray_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)disarray_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(c,(t_method)reset_shuffle, gensym("bang"), 0);
+	class_addmethod(c,(t_method)disarray_showstate,gensym("showstate"),0);
+	class_addmethod(c,(t_method)disarray_setstate, gensym("setstate"), A_GIMME, 0);
+	class_addmethod(c,(t_method)disarray_topfreq, gensym("topfreq"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)switch_count, gensym("switch_count"), A_FLOAT, 0);
+    disarray_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void iswitch_count(t_disarray *x, t_int i)
+{
+	switch_count(x,(t_floatarg)i);
+}
+
+void switch_count (t_disarray *x, t_floatarg i)
+{
+	if( i < 0 ){
+        i = 0;
+	}
+	if( i > x->fft->N2 ) {
+		i = x->fft->N2;
+	}
+	x->shuffle_count = i;
+}
+
+void disarray_free(t_disarray *x)
+{
+	fftease_free(x->fft);
+    free(x->fft);
+	free(x->list_data);
+	free(x->shuffle_in);
+	free(x->shuffle_out);
+}
+
+void disarray_init(t_disarray *x )
+{
+	t_float curfreq;
+	t_fftease *fft = x->fft;
+	t_float c_fundamental;
+ 	fftease_init(fft);
+	
+	int N2 = fft->N2;
+	int N = fft->N;
+	short initialized = fft->initialized;
+	
+	c_fundamental = fft->c_fundamental;
+	if(initialized == 0){
+		x->mute = 0;
+		x->bypass = 0;
+		x->list_data = (t_atom *) calloc((N+2), sizeof(t_atom)) ;
+		x->shuffle_in = (int *) calloc(N2, sizeof(int));
+		x->shuffle_out = (int *) calloc(N2, sizeof(int));
+	} else if (initialized == 1) {
+		x->list_data = (t_atom *)realloc(x->list_data, (N+2) * sizeof(t_atom));
+		x->shuffle_in = (int *) realloc(x->shuffle_in, N2 * sizeof(int));
+		x->shuffle_out = (int *) realloc(x->shuffle_out, N2 * sizeof(int));
+	}
+	
+	if(initialized != 2){
+		if( x->top_frequency < c_fundamental || x->top_frequency > 20000) {
+			x->top_frequency = 20000.0 ;
+		}
+		x->max_bin = 1;
+		curfreq = 0;
+		while( curfreq < x->top_frequency ) {
+			++(x->max_bin);
+			curfreq += c_fundamental ;
+		}
+		reset_shuffle(x); // set shuffle lookup
+		x->shuffle_count = 0;
+	}
+}
+
+void disarray_topfreq (t_disarray *x, t_floatarg freq)
+{
+	t_float funda = (t_float) x->fft->R / (t_float) x->fft->N;
+	t_float curfreq;
+	
+	if( freq < funda || freq > 20000) {
+        post("freq %f is out of range", freq);
+        return;
+	}
+    if(! x->fft->initialized){
+        return;
+    }
+	x->max_bin = 1;
+	curfreq = 0;
+	while( curfreq < freq ) {
+		++(x->max_bin);
+		curfreq += funda ;
+	}
+}
+
+void *disarray_new(t_symbol *msg, short argc, t_atom *argv)
+{
+	t_fftease *fft;
+    
+	t_disarray *x = (t_disarray *)pd_new(disarray_class);
+	outlet_new(&x->x_obj, gensym("signal"));
+    x->list_outlet = outlet_new(&x->x_obj, gensym("list"));
+    
+	srand(time(0));
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+
+	fft->initialized = 0;
+	x->top_frequency = 15000;
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+}
+
+
+void disarray_mute(t_disarray *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;
+}
+
+void disarray_bypass(t_disarray *x, t_floatarg toggle)
+{
+	x->bypass = (short)toggle;
+}
+
+void disarray_fftsize(t_disarray *x, t_floatarg f)
+{
+	t_fftease *fft = x->fft;
+	fft->N = (int) f;
+	disarray_init(x);
+}
+
+void disarray_overlap(t_disarray *x, t_floatarg f)
+{
+	t_fftease *fft = x->fft;
+	fft->overlap = (int) f;
+	disarray_init(x);
+}
+
+void disarray_winfac(t_disarray *x, t_floatarg f)
+{
+	t_fftease *fft = x->fft;
+	fft->winfac = (int) f;
+	disarray_init(x); /* calling lighter reinit routine */
+}
+
+void disarray_fftinfo( t_disarray *x )
+{
+	fftease_fftinfo( x->fft, OBJECT_NAME );
+}
+
+void do_disarray(t_disarray *x)
+{
+	t_fftease *fft = x->fft;
+	t_float *channel = fft->channel;
+	int		i;
+	t_float tmp;
+	int shuffle_count = x->shuffle_count;
+    int *shuffle_in = x->shuffle_in;
+    int *shuffle_out = x->shuffle_out;
+  	
+	fftease_fold(fft);
+	fftease_rdft(fft,1);
+	fftease_leanconvert(fft);
+	for( i = 0; i < shuffle_count ; i++){
+		tmp = channel[ shuffle_in[ i ] * 2 ];
+		channel[ shuffle_in[ i ] * 2]  = channel[ shuffle_out[ i ] * 2];
+		channel[ shuffle_out[ i ] * 2]  = tmp;
+	}
+	fftease_leanunconvert(fft);
+	fftease_rdft(fft,-1);
+	fftease_overlapadd(fft);
+}
+
+
+t_int *disarray_perform(t_int *w)
+{
+	int i,j;
+	t_disarray *x = (t_disarray *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *MSPOutputVector = (t_float *)(w[3]);
+    t_fftease *fft = x->fft;
+	t_float *input = fft->input;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *output = fft->output;
+	t_float mult = fft->mult;
+	int MSPVectorSize = fft->MSPVectorSize;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	
+	if(x->mute){
+		for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+4;
+	}
+
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_disarray(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_disarray(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_disarray(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+4;
+}
+
+
+void reset_shuffle (t_disarray *x)
+{
+    int i;
+    int temp, p1, p2;
+    int max;
+    
+    //post("max bin %d",x->max_bin);
+    max = x->max_bin;
+	for( i = 0; i < x->fft->N2; i++ ) {
+		x->shuffle_out[i] = x->shuffle_in[i] = i ;
+	}
+	
+	for( i = 0; i < 10000; i++ ) {
+		p1 = x->shuffle_out[ rand_index( max ) ];
+		p2 = x->shuffle_out[ rand_index( max ) ];
+		temp = x->shuffle_out[ p1 ];
+		x->shuffle_out[ p1 ] = x->shuffle_out[ p2 ];
+		x->shuffle_out[ p2 ] = temp;
+	}
+	
+}
+
+int rand_index(int max) {
+	
+	return (rand() % max);
+}
+
+
+
+void disarray_list (t_disarray *x, t_symbol *msg, short argc, t_atom *argv) {
+	short i;
+	int ival;
+	x->shuffle_count = argc;
+	for (i=0; i < argc; i++) {
+        
+        ival = (int)atom_getfloatarg(i,argc,argv);
+        
+        
+		if ( ival < x->fft->N2 ) {
+			x->shuffle_out[ i ] = ival;
+		} else {
+			post ("%d out of range",ival);
+		}
+	}
+}
+
+void disarray_setstate (t_disarray *x, t_symbol *msg, short argc, t_atom *argv) {
+    short i;
+    int ival;
+    
+    x->shuffle_count = argc;
+    for (i=0; i < argc; i++) {
+        ival = atom_getfloatarg(i,argc,argv);
+        
+        if ( ival < x->fft->N2 && ival >= 0) {
+            x->shuffle_out[ i ] = ival;
+        } else {
+            error("%s: %d is out of range",OBJECT_NAME, ival);
+        }
+    }
+}
+
+void disarray_showstate (t_disarray *x ) {
+    
+    t_atom *list_data = x->list_data;
+    
+    short i;
+    // post("showstate: %d", x->shuffle_count);
+    for( i = 0; i < x->shuffle_count; i++ ) {
+        SETFLOAT(list_data+i,(t_float)x->shuffle_out[i]);
+        // post(x->shuffle_out[i]);
+    }
+    outlet_list(x->list_outlet,0,x->shuffle_count,list_data);
+}
+
+void disarray_dsp(t_disarray *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        disarray_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(disarray_perform, 3, x, sp[0]->s_vec, sp[1]->s_vec);
+    }
+}
+
diff --git a/externals/fftease/drown~.c b/externals/fftease/drown~.c
new file mode 100644
index 0000000000000000000000000000000000000000..9264fb8b62e93a1a7208c2f841b15e0ef668a8e8
--- /dev/null
+++ b/externals/fftease/drown~.c
@@ -0,0 +1,245 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *drown_class;
+
+#define OBJECT_NAME "drown~"
+
+typedef struct _drown
+{
+	t_object x_obj;
+    float x_f;
+	t_fftease *fft;
+	t_float drownmult;
+	short mute;
+	short bypass;
+	t_float threshold;
+	short peakflag;
+} t_drown;
+
+t_int *bthresher_perform(t_int *w);
+void drown_dsp(t_drown *x, t_signal **sp);
+void *drown_new(t_symbol *s, int argc, t_atom *argv);
+void drown_mute(t_drown *x, t_floatarg toggle);
+void drown_adaptive(t_drown *x, t_floatarg toggle);
+void drown_float(t_drown *x, t_float f);
+void drown_overlap(t_drown *x, t_floatarg o);
+void drown_free(t_drown *x);
+void drown_init(t_drown *x);
+void drown_fftinfo(t_drown *x);
+
+void drown_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("drown~"), (t_newmethod)drown_new,
+                  (t_method)drown_free,sizeof(t_drown), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_drown, x_f);
+	class_addmethod(c,(t_method)drown_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)drown_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(c,(t_method)drown_fftinfo,gensym("fftinfo"),0);
+    class_addmethod(c,(t_method)drown_adaptive,gensym("adaptive"),A_FLOAT,0);
+    drown_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void drown_fftsize(t_drown *x, t_floatarg f)
+{	
+	x->fft->N = (int) f;
+	drown_init(x);
+}
+
+void drown_overlap(t_drown *x, t_floatarg f)
+{
+	x->fft->overlap = (int) f;
+	drown_init(x);
+}
+
+void drown_winfac(t_drown *x, t_floatarg f)
+{
+	x->fft->winfac = (int) f;
+	drown_init(x);
+}
+
+void drown_fftinfo(t_drown *x)
+{
+	fftease_fftinfo(x->fft, OBJECT_NAME);
+}
+
+void drown_adaptive(t_drown *x, t_floatarg toggle)
+{
+	x->peakflag = (short)toggle;
+}
+
+void drown_mute(t_drown *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;
+}
+
+void drown_bypass(t_drown *x, t_floatarg toggle)
+{
+	x->bypass = (short)toggle;
+}
+
+void *drown_new(t_symbol *s, int argc, t_atom *argv)
+{
+    t_fftease *fft;
+	t_drown *x = (t_drown *)pd_new(drown_class);
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+    fft = x->fft;
+	x->fft->initialized = 0;
+	x->threshold = 0.001;
+	x->drownmult = 0.1;
+	x->mute = 0;
+	x->peakflag = 1;
+	x->fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	x->fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	x->fft->winfac = FFTEASE_DEFAULT_WINFAC;
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	
+	return x;
+}
+
+void drown_init(t_drown *x)
+{
+	fftease_init(x->fft);
+}
+
+void drown_free(t_drown *x)
+{
+	fftease_free(x->fft);
+    free(x->fft);
+}
+
+void do_drown(t_drown *x)
+{
+	int i;
+	t_fftease *fft = x->fft;
+	t_float *channel = fft->channel;
+	t_float threshold = x->threshold;
+	t_float drownmult = x->drownmult;
+	t_float frame_peak = 0.0, local_thresh;
+	int N = fft->N;
+	
+	fftease_fold(fft);
+	fftease_rdft(fft,1);
+	fftease_leanconvert(fft);
+	if(x->peakflag){
+		for(i = 0; i < N; i += 2){	
+			if(frame_peak < channel[i])
+				frame_peak = channel[i];
+		}
+		local_thresh = frame_peak * threshold;
+	} else {
+		local_thresh = threshold;
+	}
+	for(i = 0; i < N; i += 2){	
+		if(channel[i] < local_thresh)
+			channel[i]  *= drownmult;
+	}  	
+	fftease_leanunconvert(fft);
+	fftease_rdft(fft,-1);
+	fftease_overlapadd(fft);
+}
+
+t_int *drown_perform(t_int *w)
+{
+	int	i,j;
+    t_drown *x = (t_drown *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *threshold = (t_float *)(w[3]);
+	t_float *drownmult = (t_float *)(w[4]);
+	t_float *MSPOutputVector = (t_float *)(w[5]);
+	t_fftease *fft = x->fft;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	t_float mult = fft->mult;
+	int MSPVectorSize = fft->MSPVectorSize;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;		
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	
+	if(x->mute){
+		for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+6;
+	}	
+
+    x->threshold = *threshold;
+    x->drownmult = *drownmult;
+
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_drown(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_drown(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_drown(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+6;
+}
+
+void drown_dsp(t_drown *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        drown_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(drown_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec);
+    }
+}
diff --git a/externals/fftease/enrich~.c b/externals/fftease/enrich~.c
new file mode 100644
index 0000000000000000000000000000000000000000..2b4e0a462c11c541f9c48c1f74103abf8b146a80
--- /dev/null
+++ b/externals/fftease/enrich~.c
@@ -0,0 +1,366 @@
+/* Pd 32-bit FFTease 3.0 */
+
+/* STILL NEEDS Pd Array code installed */
+
+#include "fftease.h"
+
+static t_class *enrich_class;
+
+#define OBJECT_NAME "enrich~"
+
+typedef struct _enrich
+{
+	t_object x_obj;
+    float x_f;
+	t_fftease *fft;
+	t_symbol *buffername;
+	t_float lofreq;
+	t_float hifreq;
+	int lo_bin;
+	int hi_bin;
+	t_float topfreq;
+	short mute;
+    int b_valid;
+    long b_frames;
+    t_float *b_samples;
+} t_enrich;
+
+void enrich_dsp(t_enrich *x, t_signal **sp);
+t_int *enrich_perform(t_int *w);
+void *enrich_new(t_symbol *s, int argc, t_atom *argv);
+void enrich_free(t_enrich *x);
+void enrich_mute(t_enrich *x, t_floatarg tog);
+void enrich_init(t_enrich *x);
+void enrich_lowfreq(t_enrich *x, t_floatarg f);
+void enrich_highfreq(t_enrich *x, t_floatarg f);
+void enrich_fftinfo(t_enrich *x);
+void enrich_setbuf(t_enrich *x, t_symbol *newbufname);
+void enrich_dolowfreq(t_enrich *x);
+void enrich_dohighfreq(t_enrich *x);
+void enrich_binstats(t_enrich *x);
+void enrich_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("enrich~"), (t_newmethod)enrich_new,
+                  (t_method)enrich_free,sizeof(t_enrich), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_enrich, x_f);
+	class_addmethod(c,(t_method)enrich_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)enrich_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(c,(t_method)enrich_lowfreq,gensym("lowfreq"),A_FLOAT,0);
+    class_addmethod(c,(t_method)enrich_highfreq,gensym("highfreq"),A_FLOAT,0);
+    enrich_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void enrich_mute(t_enrich *x, t_floatarg tog)
+{
+	x->mute = (short)tog;
+}
+
+void enrich_fftsize(t_enrich *x, t_floatarg f)
+{	
+	t_fftease *fft = x->fft;
+	fft->N = (int) f;
+	enrich_init(x);
+}
+
+void enrich_overlap(t_enrich *x, t_floatarg f)
+{
+
+	x->fft->overlap = (int) f;
+	enrich_init(x);
+}
+
+void enrich_winfac(t_enrich *x, t_floatarg f)
+{
+
+	x->fft->winfac = (int) f;
+	enrich_init(x);
+}
+
+void enrich_fftinfo(t_enrich *x)
+{
+	fftease_fftinfo( x->fft, OBJECT_NAME );
+}
+
+void enrich_free(t_enrich *x ){
+	fftease_free(x->fft);
+    free(x->fft);
+}
+
+void enrich_highfreq(t_enrich *x, t_floatarg f)
+{
+	t_fftease *fft = x->fft;
+
+	float curfreq;
+	
+	if(f < x->lofreq){
+		error("current minimum is %f",x->lofreq);
+		return;
+	}
+	if(f > fft->R/2 ){
+		f = fft->R/2;
+	}	
+	x->hifreq = f;
+	fft->hi_bin = 1;  
+	curfreq = 0;
+	while(curfreq < x->hifreq) {
+		++(fft->hi_bin);
+		curfreq += fft->c_fundamental;
+	}
+}
+
+void enrich_lowfreq(t_enrich *x, t_floatarg f)
+{
+	t_fftease *fft = x->fft;
+	float curfreq;
+	
+	if(f > x->hifreq){
+		error("current maximum is %f",x->lofreq);
+		return;
+	}
+	if(f < 0 ){
+		f = 0;
+	}	
+	x->lofreq = f;
+	fft->lo_bin = 0;  
+	curfreq = 0;
+	while( curfreq < x->lofreq ) {
+		++(fft->lo_bin);
+		curfreq += fft->c_fundamental ;
+	}
+}
+
+
+
+void enrich_dohighfreq(t_enrich *x)
+{
+	t_fftease *fft = x->fft;
+    
+	t_float curfreq;
+    if( fft->c_fundamental <= 0.0){
+        return;
+    }
+    if(x->hifreq <= 0.0){
+        x->hifreq = 100.0;
+    }
+	fft->hi_bin = 1;
+	curfreq = 0.0;
+	while(curfreq < x->hifreq) {
+		++(fft->hi_bin);
+		curfreq += fft->c_fundamental;
+	}
+}
+
+void enrich_dolowfreq(t_enrich *x)
+{
+	t_fftease *fft = x->fft;
+    if(x->lofreq < 0){
+        x->lofreq = 0.0;
+    }
+    if(x->lofreq >= x->hifreq){
+        x->lofreq = 0.0;
+    }
+	t_float curfreq;
+    if( fft->c_fundamental <= 0.0){
+        return;
+    }
+	fft->lo_bin = 0;
+	curfreq = 0;
+	while( curfreq < x->lofreq ) {
+		++(fft->lo_bin);
+		curfreq += fft->c_fundamental ;
+	}
+}
+
+
+
+void enrich_init(t_enrich *x)
+{
+	fftease_init(x->fft);
+	fftease_oscbank_setbins(x->fft, x->lofreq, x->hifreq);
+}
+
+void enrich_setbuf(t_enrich *x, t_symbol *newbufname)
+{
+	x->buffername = newbufname;
+}
+
+void *enrich_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_fftease *fft;
+	t_enrich *x = (t_enrich *)pd_new(enrich_class);
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft->initialized = 0;
+ 	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+    if(argc > 0){ x->buffername = atom_getsymbolarg(0, argc, argv); }
+    else { post("%s: Must specify array name", OBJECT_NAME); return NULL; }
+    if(argc > 1){ fft->N = (int) atom_getfloatarg(1, argc, argv); }
+    if(argc > 2){ fft->overlap = (int) atom_getfloatarg(2, argc, argv); }
+
+	return x;
+}
+
+void enrich_attachbuf(t_enrich *x)
+{
+  	int frames;
+    t_symbol *buffername = x->buffername;
+	t_garray *a;
+    
+	x->b_frames = 0;
+	x->b_valid = 0;
+	if (!(a = (t_garray *)pd_findbyclass(buffername, garray_class)))
+    {
+		if (*buffername->s_name) pd_error(x, "player~: %s: no such array",
+										buffername->s_name);
+    }
+	else if (!garray_getfloatarray(a, &frames, &x->b_samples))
+    {
+		pd_error(x, "%s: bad template for player~", buffername->s_name);
+    }
+	else  {
+		x->b_frames = frames;
+		x->b_valid = 1;
+		garray_usedindsp(a);
+	}
+}
+
+void enrich_binstats(t_enrich *x)
+{
+    post("lo freq %f hi freq %f lo bin %d hi bin %d",x->lofreq, x->fft->lo_bin,x->hifreq,x->fft->hi_bin);
+}
+
+void do_enrich(t_enrich *x)
+{
+	t_fftease *fft = x->fft;
+    enrich_dolowfreq(x);
+    enrich_dohighfreq(x);
+    fftease_fold(fft);
+    fftease_rdft(fft,1);
+    fftease_convert(fft);
+	fftease_oscbank(fft);
+}
+
+t_int *enrich_perform(t_int *w)
+{
+    t_enrich *x = (t_enrich *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *transpose = (t_float *)(w[3]);
+	t_float *synt = (t_float *)(w[4]);
+	t_float *MSPOutputVector = (t_float *)(w[5]);
+	t_fftease *fft = x->fft;
+	int i, j;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float mult = fft->mult;	
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	int MSPVectorSize = fft->MSPVectorSize;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;	
+    float *b_samples;
+    
+    enrich_attachbuf(x);
+	if(x->mute || ! x->b_valid){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+6;
+	}
+    
+    if(x->b_frames < fft->L){
+        post("enrich~: table too small or not mono");
+        return w+6;
+    }
+    b_samples = x->b_samples;
+	mult *= fft->N;
+	
+	// copy buffer to internal table (try more efficient means later)
+	for(i = 0; i < fft->L; i++){
+		fft->table[i] = b_samples[i];
+	}
+
+	
+    fft->P  = *transpose;
+    fft->synt = *synt;
+
+
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_enrich(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_enrich(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_enrich(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+6;
+}
+
+void enrich_dsp(t_enrich *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        enrich_init(x);
+        enrich_dolowfreq(x);
+        enrich_dohighfreq(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(enrich_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec);
+    }
+}
+
+
diff --git a/externals/fftease/ether~.c b/externals/fftease/ether~.c
new file mode 100644
index 0000000000000000000000000000000000000000..c54cbd4e24f8c8b1a467722b7e46ddbb341ccae6
--- /dev/null
+++ b/externals/fftease/ether~.c
@@ -0,0 +1,313 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *ether_class;
+
+#define OBJECT_NAME "ether~"
+
+
+/* Added a new inlet for the composite index */
+
+typedef struct _ether
+{
+	t_object x_obj;
+    float x_f;
+	t_fftease *fft;
+	t_fftease *fft2;	
+    int invert;
+    t_float threshMult;
+	short mute;
+} t_ether;
+
+void ether_dsp(t_ether *x, t_signal **sp);
+t_int *ether_perform(t_int *w);
+void *ether_new(t_symbol *s, int argc, t_atom *argv);
+void ether_invert(t_ether *x, t_floatarg toggle);
+void ether_init(t_ether *x);
+void ether_free(t_ether *x);
+void ether_mute(t_ether *x, t_floatarg toggle);
+void ether_tilde_setup(void);
+
+void ether_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("ether~"), (t_newmethod)ether_new,
+                  (t_method)ether_free,sizeof(t_ether), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_ether, x_f);
+	class_addmethod(c,(t_method)ether_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)ether_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(c,(t_method)ether_invert,gensym("invert"), A_FLOAT, 0);
+    ether_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void ether_free(t_ether *x)
+{
+	fftease_free(x->fft);
+	fftease_free(x->fft2);
+    free(x->fft);
+    free(x->fft2);
+}
+
+void *ether_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_fftease *fft, *fft2;
+	t_ether *x = (t_ether *)pd_new(ether_class);
+
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	x->fft2 = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft2 = x->fft2;
+	fft->initialized = 0;
+	fft2->initialized = 0;
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+	fft2->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft2->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft2->winfac = FFTEASE_DEFAULT_WINFAC;
+    if(argc > 0){ fft->N = fft2->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = fft2->overlap = (int) atom_getfloatarg(1, argc, argv); }
+
+	return x;
+}
+
+void ether_init(t_ether *x)
+{
+
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	
+	short initialized = fft->initialized;
+	
+	fftease_init(fft);
+	fftease_init(fft2);
+
+	if(!initialized){
+		x->mute = 0;
+		x->invert = 0;
+		x->threshMult = 0.;
+	} else {
+        x->fft->input = (t_float *) realloc(fft->input,fft->Nw * sizeof(t_float));
+        x->fft2->input = (t_float *) realloc(fft2->input,fft2->Nw * sizeof(t_float));
+        x->fft->output = (t_float *) realloc(fft->output,fft->Nw * sizeof(t_float));
+
+	}
+}
+
+void do_ether(t_ether *x)
+{
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int i;
+	int N2 = fft->N2;
+	float a1, b1, a2, b2;
+	int even, odd;
+	int invert = x->invert;
+	t_float threshMult = x->threshMult;
+	t_float *bufferOne = fft->buffer;
+	t_float *bufferTwo = fft2->buffer;
+	t_float *channelOne = fft->channel;
+	t_float *channelTwo = fft2->channel;
+	
+	fftease_fold(fft);
+	fftease_fold(fft2);
+	fftease_rdft(fft,1);
+	fftease_rdft(fft2,1);
+	
+	if (invert) {	
+		
+		
+		for ( i = 0; i <= N2; i++ ) {
+			odd = ( even = i<<1 ) + 1;
+			
+			a1 = ( i == N2 ? *(bufferOne+1) : *(bufferOne+even) );
+			b1 = ( i == 0 || i == N2 ? 0. : *(bufferOne+odd) );
+			
+			a2 = ( i == N2 ? *(bufferTwo+1) : *(bufferTwo+even) );
+			b2 = ( i == 0 || i == N2 ? 0. : *(bufferTwo+odd) );
+			
+			*(channelOne+even) = hypot( a1, b1 );
+			*(channelOne+odd) = -atan2( b1, a1 );
+			
+			*(channelTwo+even) = hypot( a2, b2 );
+			*(channelTwo+odd) = -atan2( b2, a2 );
+						
+			if ( *(channelOne+even) > *(channelTwo+even) * threshMult )
+				*(channelOne+even) = *(channelTwo+even);
+			
+			if ( *(channelOne+odd) == 0. )
+				*(channelOne+odd) = *(channelTwo+odd);	 
+		}
+	}
+	
+	else {
+		for ( i = 0; i <= N2; i++ ) {
+			
+			odd = ( even = i<<1 ) + 1;
+			
+			a1 = ( i == N2 ? *(bufferOne+1) : *(bufferOne+even) );
+			b1 = ( i == 0 || i == N2 ? 0. : *(bufferOne+odd) );
+			
+			a2 = ( i == N2 ? *(bufferTwo+1) : *(bufferTwo+even) );
+			b2 = ( i == 0 || i == N2 ? 0. : *(bufferTwo+odd) );
+			
+			*(channelOne+even) = hypot( a1, b1 );
+			*(channelOne+odd) = -atan2( b1, a1 );
+			
+			*(channelTwo+even) = hypot( a2, b2 );
+			*(channelTwo+odd) = -atan2( b2, a2 );
+			
+			
+			if ( *(channelOne+even) < *(channelTwo+even) * threshMult )
+				*(channelOne+even) = *(channelTwo+even);
+			
+			if ( *(channelOne+odd) == 0. )
+				*(channelOne+odd) = *(channelTwo+odd);	 
+		}  
+	}
+	
+
+	for ( i = 0; i <= N2; i++ ) {
+		odd = ( even = i<<1 ) + 1;
+		
+		*(bufferOne+even) = *(channelOne+even) * cos( *(channelOne+odd) );
+		
+		if ( i != N2 )
+			*(bufferOne+odd) = -(*(channelOne+even)) * sin( *(channelOne+odd) );
+	}
+	fftease_rdft(fft, -1);
+	fftease_overlapadd(fft);
+}
+
+t_int *ether_perform(t_int *w)
+{
+	int i,j;
+    t_ether *x = (t_ether *) (w[1]);
+	t_float *MSPInputVector1 = (t_float *)(w[2]);
+	t_float *MSPInputVector2 = (t_float *)(w[3]);
+	t_float *vec_threshMult = (t_float *)(w[4]);
+	t_float *MSPOutputVector = (t_float *)(w[5]);
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int MSPVectorSize = fft->MSPVectorSize;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalInputVector1 = fft->internalInputVector;
+	t_float *internalInputVector2 = fft2->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	t_float *inputOne = fft->input;
+	t_float *inputTwo = fft2->input;
+	t_float *output = fft->output;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float mult = fft->mult;	
+	
+
+    x->threshMult = *vec_threshMult;
+
+	if ( x->threshMult == 0. ){
+		x->threshMult = 0.0001;
+	}
+	if(x->mute){
+		for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+6;
+	}
+
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputOne + (Nw - D), MSPInputVector1, D * sizeof(t_float));
+        memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputTwo + (Nw - D), MSPInputVector2, D * sizeof(t_float));
+        
+		do_ether(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw-D), MSPInputVector1 + (D*i), D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw-D), MSPInputVector2 + (D*i), D * sizeof(t_float));
+            
+			do_ether(x);
+            
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector1 + (operationCount * MSPVectorSize), MSPInputVector1, MSPVectorSize * sizeof(t_float));
+        memcpy(internalInputVector2 + (operationCount * MSPVectorSize), MSPInputVector2, MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize), MSPVectorSize * sizeof(t_float));
+        
+		operationCount = (operationCount + 1) % operationRepeat;
+        
+        if( operationCount == 0 ) {
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw - D), internalInputVector1, D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw - D), internalInputVector2, D * sizeof(t_float));
+            
+            do_ether(x);
+            
+            for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+6;
+}		
+
+void ether_mute(t_ether *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;
+}
+
+void ether_invert(t_ether *x, t_floatarg toggle)
+{
+	x->invert = (int)toggle;
+}
+
+void ether_dsp(t_ether *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    t_fftease *fft = x->fft;
+    t_fftease *fft2 = x->fft2;
+    
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(!samplerate)
+        return;
+    
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+		fft2->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft2);
+	}
+	if(fft->R != samplerate ){
+		fft->R = samplerate;
+        fft2->R = samplerate;
+	}
+    if(reset_required){
+        ether_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(ether_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec,sp[3]->s_vec);
+    }
+}
+
diff --git a/externals/fftease/fft.c b/externals/fftease/fft.c
new file mode 100644
index 0000000000000000000000000000000000000000..aadac03a9a87afc161b8bafc68d736be8d3ab419
--- /dev/null
+++ b/externals/fftease/fft.c
@@ -0,0 +1,159 @@
+#include "fftease.h"
+
+/* If forward is true, rfft replaces 2*N real data points in x with
+   N complex values representing the positive frequency half of their
+   Fourier spectrum, with x[1] replaced with the real part of the Nyquist
+   frequency value.  If forward is false, rfft expects x to contain a
+   positive frequency spectrum arranged as before, and replaces it with
+   2*N real values.  N MUST be a power of 2. */
+
+void fftease_rfft( t_float *x, int N, int forward )
+
+{
+  t_float 	c1,c2,
+  		h1r,h1i,
+		h2r,h2i,
+		wr,wi,
+		wpr,wpi,
+  		temp,
+		theta;
+  t_float 	xr,xi;
+  int 		i,
+		i1,i2,i3,i4,
+		N2p1;
+  static int 	first = 1;
+/*t_float PI, TWOPI;*/
+void fftease_cfft();
+
+    if ( first ) {
+
+	first = 0;
+    }
+    theta = PI/N;
+    wr = 1.;
+    wi = 0.;
+    c1 = 0.5;
+    if ( forward ) {
+	c2 = -0.5;
+	fftease_cfft( x, N, forward );
+	xr = x[0];
+	xi = x[1];
+    } else {
+	c2 = 0.5;
+	theta = -theta;
+	xr = x[1];
+	xi = 0.;
+	x[1] = 0.;
+    }
+    wpr = -2.*pow( sin( 0.5*theta ), 2. );
+    wpi = sin( theta );
+    N2p1 = (N<<1) + 1;
+    for ( i = 0; i <= N>>1; i++ ) {
+	i1 = i<<1;
+	i2 = i1 + 1;
+	i3 = N2p1 - i2;
+	i4 = i3 + 1;
+	if ( i == 0 ) {
+	    h1r =  c1*(x[i1] + xr );
+	    h1i =  c1*(x[i2] - xi );
+	    h2r = -c2*(x[i2] + xi );
+	    h2i =  c2*(x[i1] - xr );
+	    x[i1] =  h1r + wr*h2r - wi*h2i;
+	    x[i2] =  h1i + wr*h2i + wi*h2r;
+	    xr =  h1r - wr*h2r + wi*h2i;
+	    xi = -h1i + wr*h2i + wi*h2r;
+	} else {
+	    h1r =  c1*(x[i1] + x[i3] );
+	    h1i =  c1*(x[i2] - x[i4] );
+	    h2r = -c2*(x[i2] + x[i4] );
+	    h2i =  c2*(x[i1] - x[i3] );
+	    x[i1] =  h1r + wr*h2r - wi*h2i;
+	    x[i2] =  h1i + wr*h2i + wi*h2r;
+	    x[i3] =  h1r - wr*h2r + wi*h2i;
+	    x[i4] = -h1i + wr*h2i + wi*h2r;
+	}
+	wr = (temp = wr)*wpr - wi*wpi + wr;
+	wi = wi*wpr + temp*wpi + wi;
+    }
+    if ( forward )
+	x[1] = xr;
+    else
+	fftease_cfft( x, N, forward );
+}
+
+/* cfft replaces t_float array x containing NC complex values
+   (2*NC t_float values alternating real, imagininary, etc.)
+   by its Fourier transform if forward is true, or by its
+   inverse Fourier transform if forward is false, using a
+   recursive Fast Fourier transform method due to Danielson
+   and Lanczos.  NC MUST be a power of 2. */
+
+void fftease_cfft( t_float *x, int NC, int forward )
+
+{
+  t_float 	wr,wi,
+		wpr,wpi,
+		theta,
+		scale;
+  int 		mmax,
+		ND,
+		m,
+		i,j,
+		delta;
+
+void fftease_bitreverse();
+
+    ND = NC<<1;
+    fftease_bitreverse( x, ND );
+    for ( mmax = 2; mmax < ND; mmax = delta ) {
+	delta = mmax<<1;
+	theta = TWOPI/( forward? mmax : -mmax );
+	wpr = -2.*pow( sin( 0.5*theta ), 2. );
+	wpi = sin( theta );
+	wr = 1.;
+	wi = 0.;
+	for ( m = 0; m < mmax; m += 2 ) {
+	 register t_float rtemp, itemp;
+	    for ( i = m; i < ND; i += delta ) {
+		j = i + mmax;
+		rtemp = wr*x[j] - wi*x[j+1];
+		itemp = wr*x[j+1] + wi*x[j];
+		x[j] = x[i] - rtemp;
+		x[j+1] = x[i+1] - itemp;
+		x[i] += rtemp;
+		x[i+1] += itemp;
+	    }
+	    wr = (rtemp = wr)*wpr - wi*wpi + wr;
+	    wi = wi*wpr + rtemp*wpi + wi;
+	}
+    }
+
+/* scale output */
+
+    scale = forward ? 1./ND : 2.;
+    { register t_float *xi=x, *xe=x+ND;
+	while ( xi < xe )
+	    *xi++ *= scale;
+    }
+}
+
+/* bitreverse places t_float array x containing N/2 complex values
+   into bit-reversed order */
+
+void fftease_bitreverse( t_float *x, int N )
+
+{
+  t_float 	rtemp,itemp;
+  int 		i,j,
+		m;
+
+    for ( i = j = 0; i < N; i += 2, j += m ) {
+	if ( j > i ) {
+	    rtemp = x[j]; itemp = x[j+1]; /* complex exchange */
+	    x[j] = x[i]; x[j+1] = x[i+1];
+	    x[i] = rtemp; x[i+1] = itemp;
+	}
+	for ( m = N>>1; m >= 2 && j >= m; m >>= 1 )
+	    j -= m;
+    }
+}
diff --git a/externals/fftease/fft4.c b/externals/fftease/fft4.c
new file mode 100644
index 0000000000000000000000000000000000000000..8181e4758e036d04c255181b0fc5843690bb0ef3
--- /dev/null
+++ b/externals/fftease/fft4.c
@@ -0,0 +1,336 @@
+#include <math.h>
+#include "fftease.h"
+
+/* forward declarations */
+static void rftsub(int n, t_float *a, int nc, t_float *c);
+static void fftease_bitrv2(int n, int *ip, t_float *a);
+static void fftease_cftsub(int n, t_float *a, t_float *w);
+
+void fftease_init_rdft(int n, int *ip, t_float *w)
+{
+	
+	int	nw,
+	nc;
+	
+	void	fftease_makewt(int nw, int *ip, t_float *w);
+	void	fftease_makect(int nc, int *ip, t_float *c);
+	nw = n >> 2;
+	fftease_makewt(nw, ip, w);
+	
+	nc = n >> 2;
+	fftease_makect(nc, ip, w + nw);
+	
+	return;
+}
+
+
+void fftease_rdft(t_fftease *fft, int isgn)
+{
+	int n = fft->N;
+	t_float *a = fft->buffer;
+	int *ip = fft->bitshuffle;
+	t_float *w = fft->trigland; 
+	
+	int j, nw, nc;
+	
+	t_float	xi;
+
+    
+	nw = ip[0];
+	nc = ip[1];
+	
+	if (isgn < 0) {
+		a[1] = 0.5 * (a[1] - a[0]);
+		a[0] += a[1];
+		
+		for (j = 3; j <= n - 1; j += 2) {
+			a[j] = -a[j];
+		}
+		
+		if (n > 4) {
+			rftsub(n, a, nc, w + nw);
+			fftease_bitrv2(n, ip + 2, a);
+		}
+		
+		fftease_cftsub(n, a, w);
+		
+		for (j = 1; j <= n - 1; j += 2) {
+			a[j] = -a[j];
+		}
+	}
+	
+	else {
+		
+		if (n > 4) {
+			fftease_bitrv2(n, ip + 2, a);
+		}
+		
+		fftease_cftsub(n, a, w);
+		
+		if (n > 4) {
+			rftsub(n, a, nc, w + nw);
+		}
+		
+		xi = a[0] - a[1];
+		a[0] += a[1];
+		a[1] = xi;
+	}
+}
+
+
+void fftease_bitrv2(int n, int *ip, t_float *a)
+{
+	int j, j1, k, k1, l, m, m2;
+	t_float xr, xi;
+    
+	ip[0] = 0;
+	l = n;
+	m = 1;
+	
+	while ((m << 2) < l) {
+		l >>= 1;
+		for (j = 0; j <= m - 1; j++) {
+			ip[m + j] = ip[j] + l;
+		}
+		m <<= 1;
+	}
+	
+	if ((m << 2) > l) {
+		
+		for (k = 1; k <= m - 1; k++) {
+			
+			for (j = 0; j <= k - 1; j++) {
+				j1 = (j << 1) + ip[k];
+				k1 = (k << 1) + ip[j];
+				xr = a[j1];
+				xi = a[j1 + 1];
+				a[j1] = a[k1];
+				a[j1 + 1] = a[k1 + 1];
+				a[k1] = xr;
+				a[k1 + 1] = xi;
+			}
+		}
+	}
+	
+	else {
+		m2 = m << 1;
+		
+		for (k = 1; k <= m - 1; k++) {
+			
+			for (j = 0; j <= k - 1; j++) {
+				j1 = (j << 1) + ip[k];
+				k1 = (k << 1) + ip[j];
+				xr = a[j1];
+				xi = a[j1 + 1];
+				a[j1] = a[k1];
+				a[j1 + 1] = a[k1 + 1];
+				a[k1] = xr;
+				a[k1 + 1] = xi;
+				j1 += m2;
+				k1 += m2;
+				xr = a[j1];
+				xi = a[j1 + 1];
+				a[j1] = a[k1];
+				a[j1 + 1] = a[k1 + 1];
+				a[k1] = xr;
+				a[k1 + 1] = xi;
+			}
+		}
+	}
+}
+
+
+void fftease_cftsub(int n, t_float *a, t_float *w)
+{
+	int j, j1, j2, j3, k, k1, ks, l, m;
+	t_float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
+	t_float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+    
+	l = 2;
+	
+	while ((l << 1) < n) {
+		m = l << 2;
+		
+		for (j = 0; j <= l - 2; j += 2) {
+			j1 = j + l;
+			j2 = j1 + l;
+			j3 = j2 + l;
+			x0r = a[j] + a[j1];
+			x0i = a[j + 1] + a[j1 + 1];
+			x1r = a[j] - a[j1];
+			x1i = a[j + 1] - a[j1 + 1];
+			x2r = a[j2] + a[j3];
+			x2i = a[j2 + 1] + a[j3 + 1];
+			x3r = a[j2] - a[j3];
+			x3i = a[j2 + 1] - a[j3 + 1];
+			a[j] = x0r + x2r;
+			a[j + 1] = x0i + x2i;
+			a[j2] = x0r - x2r;
+			a[j2 + 1] = x0i - x2i;
+			a[j1] = x1r - x3i;
+			a[j1 + 1] = x1i + x3r;
+			a[j3] = x1r + x3i;
+			a[j3 + 1] = x1i - x3r;
+		}
+		
+		if (m < n) {
+			wk1r = w[2];
+			
+			for (j = m; j <= l + m - 2; j += 2) {
+				j1 = j + l;
+				j2 = j1 + l;
+				j3 = j2 + l;
+				x0r = a[j] + a[j1];
+				x0i = a[j + 1] + a[j1 + 1];
+				x1r = a[j] - a[j1];
+				x1i = a[j + 1] - a[j1 + 1];
+				x2r = a[j2] + a[j3];
+				x2i = a[j2 + 1] + a[j3 + 1];
+				x3r = a[j2] - a[j3];
+				x3i = a[j2 + 1] - a[j3 + 1];
+				a[j] = x0r + x2r;
+				a[j + 1] = x0i + x2i;
+				a[j2] = x2i - x0i;
+				a[j2 + 1] = x0r - x2r;
+				x0r = x1r - x3i;
+				x0i = x1i + x3r;
+				a[j1] = wk1r * (x0r - x0i);
+				a[j1 + 1] = wk1r * (x0r + x0i);
+				x0r = x3i + x1r;
+				x0i = x3r - x1i;
+				a[j3] = wk1r * (x0i - x0r);
+				a[j3 + 1] = wk1r * (x0i + x0r);
+			}
+			
+			k1 = 1;
+			ks = -1;
+			
+			for (k = (m << 1); k <= n - m; k += m) {
+				k1++;
+				ks = -ks;
+				wk1r = w[k1 << 1];
+				wk1i = w[(k1 << 1) + 1];
+				wk2r = ks * w[k1];
+				wk2i = w[k1 + ks];
+				wk3r = wk1r - 2 * wk2i * wk1i;
+				wk3i = 2 * wk2i * wk1r - wk1i;
+				
+				for (j = k; j <= l + k - 2; j += 2) {
+					j1 = j + l;
+					j2 = j1 + l;
+					j3 = j2 + l;
+					x0r = a[j] + a[j1];
+					x0i = a[j + 1] + a[j1 + 1];
+					x1r = a[j] - a[j1];
+					x1i = a[j + 1] - a[j1 + 1];
+					x2r = a[j2] + a[j3];
+					x2i = a[j2 + 1] + a[j3 + 1];
+					x3r = a[j2] - a[j3];
+					x3i = a[j2 + 1] - a[j3 + 1];
+					a[j] = x0r + x2r;
+					a[j + 1] = x0i + x2i;
+					x0r -= x2r;
+					x0i -= x2i;
+					a[j2] = wk2r * x0r - wk2i * x0i;
+					a[j2 + 1] = wk2r * x0i + wk2i * x0r;
+					x0r = x1r - x3i;
+					x0i = x1i + x3r;
+					a[j1] = wk1r * x0r - wk1i * x0i;
+					a[j1 + 1] = wk1r * x0i + wk1i * x0r;
+					x0r = x1r + x3i;
+					x0i = x1i - x3r;
+					a[j3] = wk3r * x0r - wk3i * x0i;
+					a[j3 + 1] = wk3r * x0i + wk3i * x0r;
+				}
+			}
+		}
+		
+		l = m;
+	}
+	
+	if (l < n) {
+		
+		for (j = 0; j <= l - 2; j += 2) {
+			j1 = j + l;
+			x0r = a[j] - a[j1];
+			x0i = a[j + 1] - a[j1 + 1];
+			a[j] += a[j1];
+			a[j + 1] += a[j1 + 1];
+			a[j1] = x0r;
+			a[j1 + 1] = x0i;
+		}
+	}
+}
+
+
+static void rftsub(int n, t_float *a, int nc, t_float *c)
+{
+	int j, k, kk, ks;
+	t_float wkr, wki, xr, xi, yr, yi;
+    
+	ks = (nc << 2) / n;
+	kk = 0;
+	
+	for (k = (n >> 1) - 2; k >= 2; k -= 2) {
+		j = n - k;
+		kk += ks;
+		wkr = 0.5 - c[kk];
+		wki = c[nc - kk];
+		xr = a[k] - a[j];
+		xi = a[k + 1] + a[j + 1];
+		yr = wkr * xr - wki * xi;
+		yi = wkr * xi + wki * xr;
+		a[k] -= yr;
+		a[k + 1] -= yi;
+		a[j] += yr;
+		a[j + 1] -= yi;
+	}
+}
+
+
+void fftease_makewt(int nw, int *ip, t_float *w)
+{
+    void fftease_bitrv2(int n, int *ip, t_float *a);
+    int nwh, j;
+    t_float delta, x, y;
+    
+    ip[0] = nw;
+    ip[1] = 1;
+    if (nw > 2) {
+        nwh = nw >> 1;
+        delta = atan(1.0) / nwh;
+        w[0] = 1;
+        w[1] = 0;
+        w[nwh] = cos(delta * nwh);
+        w[nwh + 1] = w[nwh];
+        for (j = 2; j <= nwh - 2; j += 2) {
+            x = cos(delta * j);
+            y = sin(delta * j);
+            w[j] = x;
+            w[j + 1] = y;
+            w[nw - j] = y;
+            w[nw - j + 1] = x;
+        }
+        fftease_bitrv2(nw, ip + 2, w);
+    }
+}
+
+
+void fftease_makect(int nc, int *ip, t_float *c)
+{
+    int nch, j;
+    t_float delta;
+    
+    ip[1] = nc;
+    if (nc > 1) {
+        nch = nc >> 1;
+        delta = atan(1.0) / nch;
+        c[0] = 0.5;
+        c[nch] = 0.5 * cos(delta * nch);
+        for (j = 1; j <= nch - 1; j++) {
+            c[j] = 0.5 * cos(delta * j);
+            c[nc - j] = 0.5 * sin(delta * j);
+        }
+    }
+}
+
diff --git a/externals/fftease/fftease-meta.pd b/externals/fftease/fftease-meta.pd
new file mode 100644
index 0000000000000000000000000000000000000000..eac3c0693c8ac4397ef80b94685a18e2b0b52366
--- /dev/null
+++ b/externals/fftease/fftease-meta.pd
@@ -0,0 +1,6 @@
+#N canvas 15 49 195 101 10;
+#N canvas 285 484 420 300 META 0;
+#X text 10 25 AUTHOR ericlyon@vt.edu;
+#X text 13 41 NAME FFTease;
+#X text 10 10 VERSION 3;
+#X restore 10 10 pd META;
diff --git a/externals/fftease/fftease.h b/externals/fftease/fftease.h
new file mode 100644
index 0000000000000000000000000000000000000000..15351862c04b5f069f479ada8f26f347a48764f9
--- /dev/null
+++ b/externals/fftease/fftease.h
@@ -0,0 +1,177 @@
+/* 32-bit version for Pd */
+
+#include <stdio.h>
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "m_pd.h"
+
+#define MAX_N 1073741824
+#define MAX_Nw MAX_N
+
+#define FFTEASE_ANNOUNCEMENT "<[ FFTease 3.0 ]>   |  "
+#define FFTEASE_VERSION "FFTease 3.0 for Pd 32-bit version"
+#define FFTEASE_COMPILE_DATE "June 20, 2014"
+
+#define fftease_announce(objname)  post("%s ( %s )",FFTEASE_ANNOUNCEMENT,objname)
+
+#define fftease_version(objectname) post("%s: version %s compiled %s",objectname,FFTEASE_VERSION,FFTEASE_COMPILE_DATE);
+
+#define BIGGER_THAN_MSP_VECTOR 0
+#define SMALLER_THAN_MSP_VECTOR 1
+#define EQUAL_TO_MSP_VECTOR 2
+
+#define FFTEASE_DEFAULT_FFTSIZE 1024
+#define FFTEASE_DEFAULT_OVERLAP 8
+#define FFTEASE_DEFAULT_WINFAC 1
+	
+#define DEFAULT_FFTEASE_FFTSIZE 1024
+#define FFTEASE_MAX_FFTSIZE 1073741824
+
+#define FFTEASE_OSCBANK_SCALAR (0.25)
+#define FFTEASE_OSCBANK_TABLESIZE (8192)
+#define FFTEASE_BYPASS_GAIN (0.5)
+
+#define FFT_FORWARD 1
+#define FFT_INVERSE -1
+
+#ifndef PIOVERTWO
+#define PIOVERTWO 1.5707963268
+#endif
+#ifndef TWOPI
+#define TWOPI 6.2831853072
+#endif
+#ifndef PI
+#define PI 3.14159265358979
+#endif
+
+typedef struct _fftease
+{
+	int R;
+	int	N;
+	int	N2;
+	int	Nw;
+	int	Nw2; 
+	int	D; 
+	int	in_count;
+	int out_count;
+	t_float *Wanal;
+	t_float *Wsyn;
+	t_float *input;
+	t_float *Hwin;
+	t_float *buffer;
+	t_float *channel;
+	t_float *output;
+	// for convert
+	t_float *c_lastphase_in;
+	t_float *c_lastphase_out;
+	t_float c_fundamental;
+	t_float c_factor_in;
+	t_float c_factor_out;
+	// for oscbank
+	int NP;
+	t_float P;
+	int L;
+	int first;
+	t_float Iinv;
+	t_float *lastamp;
+	t_float *lastfreq;
+	t_float *bindex;
+	t_float *table;
+	t_float pitch_increment;
+	t_float ffac;
+	int hi_bin;
+	int lo_bin;
+	// for fast fft
+	t_float mult;
+	t_float *trigland;
+	int *bitshuffle;
+	int overlap;
+	int winfac;
+    int last_overlap; // save values to test if memory reallocation needed
+    int last_winfac;
+    int last_N;
+    int last_R;
+	t_float synt;
+	t_float *internalInputVector; // hold input data from smaller MSP buffers
+	t_float *internalOutputVector; // hold output data for smaller MSP buffers
+	int operationRepeat; // how many times to do whatever on each perform call
+	int operationCount; // keep track of where we are in buffer operation
+	int bufferStatus; // relations between MSP vector size and internal buffer size
+	int MSPVectorSize; // what it says
+	short obank_flag; // resynthesis method flag
+	short init_status; // whether initialization has successfully occurred
+	short noalias; // inhibit aliasing in oscbank mode
+	t_float nyquist; // nyquest frequency == R/2
+	short initialized; // set to 0 for the first time in new(); after that it will be 1
+} t_fftease;
+
+
+
+void fftease_convert(t_fftease *fft);
+void fftease_unconvert(t_fftease *fft);
+void fftease_rfft( t_float *x, int N, int forward );
+void fftease_cfft( t_float *x, int NC, int forward );
+void fftease_bitreverse( t_float *x, int N );
+void fftease_fold( t_fftease *fft );
+void fftease_init_rdft(int n, int *ip, t_float *w);
+void fftease_rdft(t_fftease *fft, int isgn);
+//void fftease_bitrv2(int n, int *ip, t_float *a);
+//void fftease_cftsub(int n, t_float *a, t_float *w);
+//void rftsub(int n, t_float *a, int nc, t_float *c);
+void fftease_makewt(int nw, int *ip, t_float *w);
+void fftease_makect(int nc, int *ip, t_float *c);
+void fftease_leanconvert(t_fftease *fft);
+void fftease_leanunconvert(t_fftease *fft);
+void fftease_makewindows( t_float *H, t_float *A, t_float *S, int Nw, int N, int I );
+void fftease_makehamming( t_float *H, t_float *A, t_float *S, int Nw, int N, int I,int odd );
+void fftease_makehanning( t_float *H, t_float *A, t_float *S, int Nw, int N, int I,int odd );
+void fftease_overlapadd(t_fftease *fft);
+void fftease_bloscbank( t_float *S, t_float *O, int D, t_float iD, t_float *lf, t_float *la,
+	t_float *bindex, t_float *tab, int len, t_float synt, int lo, int hi );
+void fftease_oscbank( t_fftease *fft );
+//t_float randf( t_float min, t_float max );
+//int randi( int min, int max );
+int fftease_power_of_two(int test);
+void fftease_limit_fftsize(int *N, int *Nw, char *OBJECT_NAME);
+int fftease_fft_size(int testfft);
+void fftease_free(t_fftease *fft);
+void fftease_init(t_fftease *fft);
+int fftease_winfac(int winfac);
+int fftease_overlap(int overlap);
+void fftease_set_fft_buffers(t_fftease *fft);
+void fftease_fftinfo(t_fftease *fft, char *object_name);
+int fftease_msp_sanity_check(t_fftease *fft, char *oname);
+t_float fftease_randf(t_float min, t_float max);
+void fftease_noalias(t_fftease* fft, short flag);
+void fftease_oscbank_setbins(t_fftease *fft, t_float lowfreq, t_float highfreq);
+void fftease_limited_oscbank(t_fftease *fft, int osclimit, t_float framethresh);
+t_float fftease_randf(t_float min, t_float max);
+// Penrose extras
+t_float fftease_frequencyToIncrement( t_float samplingRate, t_float frequency, int bufferLength );
+void fftease_makeSineBuffer( t_float *buffer, int bufferLength );
+t_float fftease_bufferOscil( t_float *phase, t_float increment, t_float *buffer, int bufferLength );
+float fftease_rrand(int *seed);
+float fftease_prand(int *seed);
+
+/*** MSP helper functions, thanks JKC! ***/
+/*
+void atom_arg_getfloat(float *c, long idx, long ac, t_atom *av);
+void atom_arg_getsym(t_symbol **c, long idx, long ac, t_atom *av);
+
+void atom_arg_getfloat(float *c, long idx, long ac, t_atom *av)
+{
+    if (c&&ac&&av&&(idx<ac)) {
+        *c = atom_getfloat(av+idx);
+    }
+}
+
+void atom_arg_getsym(t_symbol **c, long idx, long ac, t_atom *av)
+{
+	if (c&&ac&&av&&(idx<ac)) {
+		*c = atom_getsymbol(av+idx);
+	} 
+}
+*/
+
diff --git a/externals/fftease/fftease32-helpfiles/bthresher~-help.pd b/externals/fftease/fftease32-helpfiles/bthresher~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..eab7fbc9343f5c07377e26faa69dfd6f41d0d593
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/bthresher~-help.pd
@@ -0,0 +1,52 @@
+#N canvas 1169 280 575 554 10;
+#X obj 153 209 bthresher~;
+#X obj 29 180 noise~;
+#X obj 155 293 *~ 0.05;
+#X obj 156 350 dac~;
+#X msg 259 335 \; pd dsp \$1;
+#X obj 259 304 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 218 242 hsl 128 15 0 1 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 1500 1;
+#X floatatom 194 273 5 0 0 0 - - -, f 5;
+#X floatatom 258 174 5 0 0 0 - - -, f 5;
+#X obj 261 148 hsl 128 15 0.25 1 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 12700 1;
+#X floatatom 182 124 5 0 0 0 - - -, f 5;
+#X obj 185 98 hsl 128 15 0.5 1.25 0 0 empty empty empty -2 -8 0 10
+-262144 -1 -1 12700 1;
+#X obj 38 358 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X obj 63 146 r fftz.bthresh.msg;
+#X obj 38 525 s fftz.bthresh.msg;
+#X msg 39 390 inf_hold 0;
+#X text 129 392 broken!;
+#X msg 208 405 oscbank \$1;
+#X obj 217 374 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X msg 332 403 max_hold 100000;
+#X msg 330 493 transpose \$1;
+#X floatatom 329 471 5 0 0 0 - - -, f 5;
+#X obj 332 445 hsl 128 15 0.25 1.1 0 0 empty empty empty -2 -8 0 10
+-262144 -1 -1 8100 1;
+#X text 415 492 (oscbank only);
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 2 0 3 1;
+#X connect 5 0 4 0;
+#X connect 6 0 7 0;
+#X connect 7 0 2 1;
+#X connect 8 0 0 2;
+#X connect 9 0 8 0;
+#X connect 10 0 0 1;
+#X connect 11 0 10 0;
+#X connect 12 0 15 0;
+#X connect 13 0 0 0;
+#X connect 15 0 14 0;
+#X connect 17 0 14 0;
+#X connect 18 0 17 0;
+#X connect 19 0 14 0;
+#X connect 20 0 14 0;
+#X connect 21 0 20 0;
+#X connect 22 0 21 0;
diff --git a/externals/fftease/fftease32-helpfiles/burrow~-help.pd b/externals/fftease/fftease32-helpfiles/burrow~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..3a0f140fd77fdf33be17235f3e41311f376540a3
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/burrow~-help.pd
@@ -0,0 +1,86 @@
+#N canvas 579 460 937 510 10;
+#X obj 246 254 burrow~;
+#X obj 246 336 *~ 0.05;
+#X obj 246 394 dac~;
+#X msg 350 378 \; pd dsp \$1;
+#X obj 350 347 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 288 294 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 8200 1;
+#X floatatom 285 316 5 0 0 0 - - -, f 5;
+#X floatatom 436 79 5 -90 0 0 - - -, f 5;
+#X obj 424 183 pow;
+#X msg 424 154 10;
+#X obj 436 103 * 0.05;
+#X obj 436 131 t b f;
+#X text 430 60 filtering threshold (dB);
+#X floatatom 609 82 5 0 0 0 - - -, f 5;
+#X obj 597 186 pow;
+#X msg 597 157 10;
+#X obj 609 106 * 0.05;
+#X obj 609 134 t b f;
+#X text 603 63 filtering multiplier (dB);
+#X msg 63 270 invert \$1;
+#X obj 63 237 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X obj 77 100 phasor~ 200;
+#X obj 77 129 -~ 0.5;
+#X obj 193 101 noise~;
+#X obj 235 165 bp~ 600 30;
+#X floatatom 270 110 5 0 0 0 - - -, f 5;
+#X text 194 77 filtering sound;
+#X text 508 233 burrow~ filters the sound in the left input by utlizing
+a second signal input as a filter threshold reference. The threshold
+controls the extent of the filtering. Threshold inversion is available
+via the invert message. Since the spectral shape of the second sound
+is *subtracted* from the first \, the normal behavior of burrow~ is
+inverse to more familiar filtering. When the "inverse" flag is set
+\, the second sound becomes a positive (and perhaps more intuitively
+understandable) filter.;
+#X msg 63 212 1;
+#X obj 63 181 loadbang;
+#X obj 320 28 loadbang;
+#X msg 320 50 600;
+#X obj 797 61 loadbang;
+#X msg 797 83 -20;
+#X obj 506 12 loadbang;
+#X msg 506 34 -45;
+#X text 73 78 source sound;
+#X msg 112 355 mute \$1;
+#X obj 112 328 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 1 0 2 1;
+#X connect 4 0 3 0;
+#X connect 5 0 6 0;
+#X connect 6 0 1 1;
+#X connect 7 0 10 0;
+#X connect 8 0 0 2;
+#X connect 9 0 8 0;
+#X connect 10 0 11 0;
+#X connect 11 0 9 0;
+#X connect 11 1 8 1;
+#X connect 13 0 16 0;
+#X connect 14 0 0 3;
+#X connect 15 0 14 0;
+#X connect 16 0 17 0;
+#X connect 17 0 15 0;
+#X connect 17 1 14 1;
+#X connect 19 0 0 0;
+#X connect 20 0 19 0;
+#X connect 21 0 22 0;
+#X connect 22 0 0 0;
+#X connect 23 0 24 0;
+#X connect 24 0 0 1;
+#X connect 25 0 24 1;
+#X connect 28 0 20 0;
+#X connect 29 0 28 0;
+#X connect 30 0 31 0;
+#X connect 31 0 25 0;
+#X connect 32 0 33 0;
+#X connect 33 0 13 0;
+#X connect 34 0 35 0;
+#X connect 35 0 7 0;
+#X connect 37 0 0 0;
+#X connect 38 0 37 0;
diff --git a/externals/fftease/fftease32-helpfiles/cavoc27~-help.pd b/externals/fftease/fftease32-helpfiles/cavoc27~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..8d034cffb4444f9fe193f4fc540cfb3dea7e5797
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/cavoc27~-help.pd
@@ -0,0 +1,120 @@
+#N canvas 1082 165 576 304 10;
+#X obj 160 156 cavoc27~;
+#X obj 193 199 *~ 0.05;
+#X obj 193 257 dac~;
+#X obj 235 157 hsl 128 15 0 1 0 0 empty cavoc27-gain Gain -2 -8 0 10
+-262144 -1 -1 0 1;
+#X floatatom 232 179 5 0 0 0 - - -, f 5;
+#X obj 229 110 r fftz.cavoc27.msgs;
+#N canvas 1379 450 450 300 rules 0;
+#X obj 65 222 s fftz.cavoc27.msgs;
+#X msg 29 88 rule 1 0 1 0 0 0 1 0 0 1 2 1 0 2 0 2 0 0 1 0 2 0 2 1 2
+1 1;
+#X msg 51 115 rule 0 2 1 0 0 1 0 0 0 1 1 2 0 1 2 1 1 1 1 0 0 0 1 1
+0 1 1;
+#X msg 73 143 rule 2 2 0 1 0 2 1 1 0 2 1 2 0 1 1 2 0 2 2 1 2 1 1 2
+0 0 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X restore 36 132 pd rules;
+#N canvas 1371 522 450 300 triggering 0;
+#X obj 65 222 s fftz.cavoc27.msgs;
+#X msg 65 163 trigger;
+#X msg 204 160 manual \$1;
+#X obj 204 128 tgl 15 0 empty cavoc27-triggertog empty 17 7 0 10 -262144
+-1 -1 0 1;
+#X obj 65 128 metro 250;
+#X obj 64 72 tgl 15 0 empty cavoc27-metro-tog empty 17 7 0 10 -262144
+-1 -1 0 1;
+#X floatatom 103 99 5 0 0 0 - - -, f 5;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 2 0;
+#X connect 4 0 1 0;
+#X connect 5 0 4 0;
+#X connect 6 0 4 1;
+#X restore 35 156 pd triggering;
+#N canvas 221 259 450 300 init 0;
+#X obj 28 34 loadbang;
+#X msg 28 62 \; cavoc27-triggertog 0 \; cavoc27-metro-tog 1 \; cavoc27-infreq
+133 \; cavoc27-gain 0.02 \; cavoc27-holdtime 250 \;;
+#X connect 0 0 1 0;
+#X restore 35 178 pd init;
+#X text 228 250 cavoc27~ generates spectra with a 27 rule cellular
+automaton. Start with very low gain.;
+#N canvas 1167 563 450 300 sample-input-spectrum 1;
+#X msg 237 101 capture_spectrum \$1;
+#X obj 237 70 inlet;
+#X floatatom 22 31 5 0 0 0 - cavoc27-infreq -, f 5;
+#X obj 20 111 phasor~;
+#X obj 20 137 -~ 0.5;
+#X obj 73 111 phasor~;
+#X obj 73 137 -~ 0.5;
+#X obj 128 112 phasor~;
+#X obj 128 138 -~ 0.5;
+#X obj 36 185 *~ 0.5;
+#X obj 35 236 outlet~;
+#X obj 60 73 * 1.25;
+#X obj 126 74 * 1.5;
+#X obj 237 133 s fftz.cavoc27.msgs;
+#X connect 0 0 13 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 2 0 11 0;
+#X connect 2 0 12 0;
+#X connect 3 0 4 0;
+#X connect 4 0 9 0;
+#X connect 5 0 6 0;
+#X connect 6 0 9 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 11 0 5 0;
+#X connect 12 0 7 0;
+#X restore 160 82 pd sample-input-spectrum;
+#X obj 160 41 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#N canvas 637 695 517 307 more-msgs 0;
+#X obj 31 268 s fftz.cavoc27.msgs;
+#X msg 43 184 density \$1;
+#X floatatom 43 154 5 0 0 0 - - -, f 5;
+#X msg 31 99 oscbank \$1;
+#X obj 31 60 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1
+;
+#X obj 215 66 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X msg 215 103 interpolate \$1;
+#X msg 317 180 transpose \$1;
+#X floatatom 317 151 5 0 0 0 - - -, f 5;
+#X obj 320 102 hsl 128 15 0.5 2 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 8300 1;
+#X msg 221 226 retune 0.5 2;
+#X msg 351 247 freeze \$1;
+#X obj 351 219 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X msg 158 178 hold_time \$1;
+#X floatatom 193 151 5 0 0 0 - cavoc27-holdtime -, f 5;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
+#X connect 5 0 6 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X connect 8 0 7 0;
+#X connect 9 0 8 0;
+#X connect 10 0 0 0;
+#X connect 11 0 0 0;
+#X connect 12 0 11 0;
+#X connect 13 0 0 0;
+#X connect 14 0 13 0;
+#X restore 35 215 pd more-msgs;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 1 0 2 1;
+#X connect 3 0 4 0;
+#X connect 4 0 1 1;
+#X connect 5 0 0 0;
+#X connect 10 0 0 0;
+#X connect 11 0 10 0;
diff --git a/externals/fftease/fftease32-helpfiles/cavoc~-help.pd b/externals/fftease/fftease32-helpfiles/cavoc~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..79f3794aa3daabd917fe9c70ea8577f28b691f5f
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/cavoc~-help.pd
@@ -0,0 +1,78 @@
+#N canvas 979 487 505 383 10;
+#X obj 193 107 cavoc~;
+#X obj 193 199 *~ 0.05;
+#X obj 193 230 dac~;
+#X obj 235 159 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 232 179 5 0 0 0 - - -, f 5;
+#X text 16 323 cavoc~ generates spectra with an 8 rule cellular automaton.
+Start with very low gain.;
+#X obj 193 75 r fftz.cavoc.msgs;
+#N canvas 1230 207 504 565 more-messages 0;
+#X obj 74 472 s fftz.cavoc.msgs;
+#X msg 70 129 retune 0.5 1.5;
+#X msg 273 163 bottomfreq \$1;
+#X msg 231 84 topfreq \$1;
+#X floatatom 232 49 8 500 8000 0 - - -, f 8;
+#X floatatom 271 134 8 0 400 0 - - -, f 8;
+#X msg 23 103 mute \$1;
+#X obj 23 73 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1
+;
+#X obj 99 30 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1
+;
+#X msg 99 60 external_trigger \$1;
+#X msg 170 163 bang;
+#X msg 259 259 hold_time \$1;
+#X floatatom 258 230 5 100 1000 0 - - -, f 5;
+#X floatatom 328 49 5 0.01 0.25 0 - - -, f 5;
+#X msg 328 68 density \$1;
+#X msg 270 387 oscbank \$1;
+#X obj 278 347 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 326 26 hsl 128 15 0.01 0.2 0 0 empty empty empty -2 -8 0 10
+-262144 -1 -1 0 1;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
+#X connect 5 0 2 0;
+#X connect 6 0 0 0;
+#X connect 7 0 6 0;
+#X connect 8 0 9 0;
+#X connect 9 0 0 0;
+#X connect 10 0 0 0;
+#X connect 11 0 0 0;
+#X connect 12 0 11 0;
+#X connect 13 0 14 0;
+#X connect 14 0 0 0;
+#X connect 15 0 0 0;
+#X connect 16 0 15 0;
+#X connect 17 0 13 0;
+#X restore 30 247 pd more-messages;
+#N canvas 805 281 465 670 rules 0;
+#X obj 30 503 s fftz.cavoc.msgs;
+#X msg 87 107 rule 0 1 0 1 0 0 1 1;
+#X msg 59 79 rule 0 1 1 0 1 0 0 1;
+#X msg 122 127 rule 0 0 0 0 1 1 1 1;
+#X msg 129 158 rule 0 0 0 1 1 0 0 0;
+#X msg 153 215 rule 1 0 0 1 1 0 0 1;
+#X msg 180 259 rule 1 1 0 1 0 1 0 0;
+#X msg 205 302 rule 1 1 0 1 0 1 1 0;
+#X msg 223 342 rule 1 1 0 0 1 1 0 0;
+#X msg 233 387 rule 0 0 1 0 1 0 1 1;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 0 0;
+#X restore 27 105 pd rules;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 1 0 2 1;
+#X connect 3 0 4 0;
+#X connect 4 0 1 1;
+#X connect 6 0 0 0;
diff --git a/externals/fftease/fftease32-helpfiles/centerring~-help.pd b/externals/fftease/fftease32-helpfiles/centerring~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..21b9a59ac2e3932513ad79d94bb732b65d6f5900
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/centerring~-help.pd
@@ -0,0 +1,51 @@
+#N canvas 1282 501 452 406 10;
+#X obj 126 116 centerring~;
+#X obj 126 198 *~ 0.05;
+#X obj 126 256 dac~;
+#X obj 168 156 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 9200 1;
+#X floatatom 165 178 5 0 0 0 - - -, f 5;
+#X obj 125 34 phasor~ 67;
+#X obj 125 59 -~ 0.5;
+#X obj 126 87 *~ 2;
+#X floatatom 125 11 5 0 0 0 - - -, f 5;
+#X floatatom 244 56 5 0 0 0 base centerring-basefreq -, f 5;
+#X floatatom 259 77 5 0 0 0 bw centerring-freqbandw -, f 5;
+#X floatatom 291 96 5 0 0 0 const centerring-freqconst -, f 5;
+#X msg 8 60 zerophases;
+#X msg 15 127 randphases;
+#N canvas 804 464 450 300 init 0;
+#X msg 60 85 \; centerring-basefreq 1 \; centerring-freqbandw 0.15
+\; centerring-freqconst 1 \;;
+#X msg 132 216 \; centerring-basefreq \$1 \; centerring-freqbandw \$2
+\; centerring-freqconst \$3 \;;
+#X msg 81 167 300 0.2 1;
+#X msg 164 168 1.1 10 7;
+#X msg 249 169 1 1 1;
+#X obj 57 54 loadbang;
+#X text 82 146 a few other settings;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 1 0;
+#X connect 5 0 0 0;
+#X restore 261 225 pd init;
+#X text 21 279 centerring~ performs frequency independent amplitude
+modulation upon the spectral magnitudes of input signals. The effect
+is somewhat akin to flanging. The base frequency is used to derive
+the frequency of an oscillator associated with each frequency band.
+The frequency bandwidth and constant control the deviation of a particular
+frequency band's modulation oscillator frequency.;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 1 0 2 1;
+#X connect 3 0 4 0;
+#X connect 4 0 1 1;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 0 0;
+#X connect 8 0 5 0;
+#X connect 9 0 0 1;
+#X connect 10 0 0 2;
+#X connect 11 0 0 3;
+#X connect 12 0 0 0;
+#X connect 13 0 0 0;
diff --git a/externals/fftease/fftease32-helpfiles/codepend~-help.pd b/externals/fftease/fftease32-helpfiles/codepend~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0523f9e72711fb7aa90ec086a12ee7fd5497374a
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/codepend~-help.pd
@@ -0,0 +1,72 @@
+#N canvas 963 492 707 429 10;
+#X obj 126 162 codepend~;
+#X obj 126 199 *~ 0.05;
+#X obj 126 230 dac~;
+#X obj 225 163 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 6600 1;
+#X floatatom 222 183 5 0 0 0 - - -, f 5;
+#X text 15 258 codepend~ is a classic "block convolution" processor.
+It performs a complex multiply upon the spectra of two input signals.
+Multiplication of spectra can cause significant drops in the amplitude
+of the output signal. The invert message causes codepend~ to perform
+complex division of the input spectra rather than multiplication. Be
+careful! This can cause huge amplitude gains. A "pad" message is provided
+to allow for empirical amplitude balancing between the normal and "invert"
+states. Experiment at low volume levels while getting a feel for this
+external.;
+#X floatatom 320 18 5 0 0 0 - codepend-scalingexp -, f 5;
+#X floatatom 381 92 5 0 0 0 - - -, f 5;
+#X obj 381 70 expr pow(10. \, $f1 * 0.05);
+#X floatatom 381 48 5 -120 0 1 inverse-threshold - -, f 5;
+#X text 360 17 scaling exponent (lower values increase distortion)
+;
+#X obj 50 91 readsf~;
+#X msg 17 61 1;
+#X obj 50 35 openpanel;
+#X msg 50 60 open \$1;
+#X msg 50 8 bang;
+#X obj 160 85 readsf~;
+#X obj 160 29 openpanel;
+#X msg 160 54 open \$1;
+#X msg 160 2 bang;
+#N canvas 516 425 450 300 init 0;
+#X msg 124 172 \; codepend-scalingexp 0.2 \; codepend-invertscale -36
+;
+#X restore 413 380 pd init;
+#X obj 14 127 r fftz.codepend.msgs;
+#X obj 413 345 s fftz.codepend.msgs;
+#X msg 413 309 invert \$1;
+#X obj 413 273 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X msg 534 307 pad \$1;
+#X floatatom 534 284 5 0 0 0 - - -, f 5;
+#X obj 534 262 expr pow(10. \, $f1 * 0.05);
+#X floatatom 534 235 5 0 0 0 - codepend-invertscale -, f 5;
+#X text 84 6 load sf1;
+#X text 196 6 load sf2;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 1 0 2 1;
+#X connect 3 0 4 0;
+#X connect 4 0 1 1;
+#X connect 6 0 0 2;
+#X connect 7 0 0 3;
+#X connect 8 0 7 0;
+#X connect 9 0 8 0;
+#X connect 11 0 0 0;
+#X connect 12 0 11 0;
+#X connect 12 0 16 0;
+#X connect 13 0 14 0;
+#X connect 14 0 11 0;
+#X connect 15 0 13 0;
+#X connect 16 0 0 1;
+#X connect 17 0 18 0;
+#X connect 18 0 16 0;
+#X connect 19 0 17 0;
+#X connect 21 0 0 0;
+#X connect 23 0 22 0;
+#X connect 24 0 23 0;
+#X connect 25 0 22 0;
+#X connect 26 0 25 0;
+#X connect 27 0 26 0;
+#X connect 28 0 27 0;
diff --git a/externals/fftease/fftease32-helpfiles/cross~-help.pd b/externals/fftease/fftease32-helpfiles/cross~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..a1c48989b97685037efb9e8866472cce875d931f
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/cross~-help.pd
@@ -0,0 +1,124 @@
+#N canvas 823 457 553 431 10;
+#X obj -268 175 cross~;
+#X obj -238 107 readsf~;
+#X obj -238 51 openpanel;
+#X msg -238 76 open \$1;
+#X msg -238 24 bang;
+#X text -202 28 load sf2;
+#X obj -354 118 readsf~;
+#X obj -353 43 openpanel;
+#X msg -353 68 open \$1;
+#X msg -353 16 bang;
+#X text -317 20 load sf1;
+#X obj -268 295 *~ 0.05;
+#X obj -268 326 dac~;
+#X obj -226 250 hsl 128 15 0 20 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 9500 1;
+#X floatatom -229 275 5 0 0 0 - - -, f 5;
+#X floatatom -143 136 5 0 0 0 - - -, f 5;
+#X msg -287 80 1;
+#X msg -143 91 1e-06;
+#X obj 3 298 vu 15 120 empty empty -1 -8 0 10 -66577 -1 1 0;
+#N canvas 0 22 450 300 meter 0;
+#X obj 110 164 snapshot~;
+#X obj 126 114 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X floatatom 110 187 5 0 0 0 - - -, f 5;
+#X obj 110 91 env~ 1024;
+#X obj 126 140 metro 100;
+#X obj 109 211 - 100;
+#X obj 231 46 loadbang;
+#X msg 231 71 1;
+#X obj 109 246 outlet;
+#X obj 110 51 inlet~;
+#X connect 0 0 2 0;
+#X connect 1 0 4 0;
+#X connect 2 0 5 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 8 0;
+#X connect 6 0 7 0;
+#X connect 7 0 1 0;
+#X connect 9 0 3 0;
+#X restore 2 256 pd meter;
+#X obj 71 300 vu 15 120 empty empty -1 -8 0 10 -66577 -1 1 0;
+#N canvas 0 22 450 300 meter 0;
+#X obj 110 164 snapshot~;
+#X obj 126 114 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X floatatom 110 187 5 0 0 0 - - -, f 5;
+#X obj 110 91 env~ 1024;
+#X obj 126 140 metro 100;
+#X obj 109 211 - 100;
+#X obj 231 46 loadbang;
+#X msg 231 71 1;
+#X obj 109 246 outlet;
+#X obj 110 51 inlet~;
+#X connect 0 0 2 0;
+#X connect 1 0 4 0;
+#X connect 2 0 5 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 8 0;
+#X connect 6 0 7 0;
+#X connect 7 0 1 0;
+#X connect 9 0 3 0;
+#X restore 70 257 pd meter;
+#X msg -78 92 0.25;
+#X msg -36 93 0.05;
+#X obj -268 231 *~;
+#X floatatom -208 208 5 0 0 0 - cross-pad -, f 5;
+#N canvas 1452 650 450 300 autonorm 0;
+#X obj 57 24 inlet;
+#X obj 57 59 t f f;
+#X obj 44 124 sel 0 1;
+#X msg 20 192 1;
+#X msg 100 175 0.025;
+#X obj 45 223 s cross-pad;
+#X msg 148 118 autonorm \$1;
+#X obj 149 149 s fftz-cross-msgs;
+#X obj 18 160 pipe 50;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 1 1 6 0;
+#X connect 2 0 8 0;
+#X connect 2 1 4 0;
+#X connect 3 0 5 0;
+#X connect 4 0 5 0;
+#X connect 6 0 7 0;
+#X connect 8 0 3 0;
+#X restore -16 192 pd autonorm;
+#X obj -375 195 r fftz-cross-msgs;
+#X obj -16 170 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X text -365 349 cross~ uses a threshold to determine whether to perform
+spectral multiplication or maintain the last calculated magnitude/phase
+pair. An autonorm option attempts to keep overall frame amplitudes
+consistent.;
+#X connect 0 0 24 0;
+#X connect 1 0 0 1;
+#X connect 1 0 21 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 2 0;
+#X connect 6 0 0 0;
+#X connect 6 0 19 0;
+#X connect 7 0 8 0;
+#X connect 8 0 6 0;
+#X connect 9 0 7 0;
+#X connect 11 0 12 0;
+#X connect 11 0 12 1;
+#X connect 13 0 14 0;
+#X connect 14 0 11 1;
+#X connect 15 0 0 2;
+#X connect 16 0 6 0;
+#X connect 16 0 1 0;
+#X connect 17 0 15 0;
+#X connect 19 0 18 0;
+#X connect 21 0 20 0;
+#X connect 22 0 15 0;
+#X connect 23 0 15 0;
+#X connect 24 0 11 0;
+#X connect 25 0 24 1;
+#X connect 27 0 0 0;
+#X connect 28 0 26 0;
diff --git a/externals/fftease/fftease32-helpfiles/dentist~-help.pd b/externals/fftease/fftease32-helpfiles/dentist~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..f23b5c72b8494748985a86ee3d7207387d67c9be
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/dentist~-help.pd
@@ -0,0 +1,77 @@
+#N canvas 692 324 623 380 10;
+#X obj 197 240 *~ 0.05;
+#X obj 197 271 dac~;
+#X obj 239 200 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 4700 1;
+#X floatatom 236 220 5 0 0 0 - - -, f 5;
+#X obj 197 105 dentist~ 2048 8;
+#X obj 197 37 r fftz-dentist-msgs;
+#X obj 114 28 noise~;
+#N canvas 404 737 450 300 showsync 0;
+#X obj 205 102 inlet~;
+#X obj 205 159 snapshot~;
+#X obj 325 121 metro 50;
+#X obj 325 89 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X obj 325 22 loadbang;
+#X msg 325 57 1;
+#X obj 205 225 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 6 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 5 0;
+#X connect 5 0 3 0;
+#X restore 240 135 pd showsync;
+#X msg 57 173 scramble;
+#X obj 57 143 metro 7000;
+#X obj 57 109 tgl 15 0 empty dentist-scrambletog empty 17 7 0 10 -262144
+-1 -1 1 1;
+#N canvas 1413 688 450 300 interpolation-and-control 0;
+#X msg 57 100 ramptime \$1;
+#X floatatom 57 65 5 0 0 0 - dentist-ramptime -, f 5;
+#X obj 54 212 s fftz-dentist-msgs;
+#X msg 192 107 topfreq \$1;
+#X floatatom 189 71 5 0 0 0 - dentist-topfreq -, f 5;
+#X msg 281 168 toothcount \$1;
+#X floatatom 303 126 5 0 0 0 - dentist-toothcount -, f 5;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 3 0 2 0;
+#X connect 4 0 3 0;
+#X connect 5 0 2 0;
+#X connect 6 0 5 0;
+#X restore 427 126 pd interpolation-and-control;
+#N canvas 497 416 384 290 init 0;
+#X msg 118 125 \; dentist-ramptime 7000 \; dentist-topfreq 3000 \;
+dentist-toothcount 18 \; dentist-scrambletog 1 \;;
+#X obj 118 96 loadbang;
+#X connect 1 0 0 0;
+#X restore 429 180 pd init;
+#X floatatom 240 162 5 0 0 0 - - -, f 5;
+#N canvas 1224 626 533 316 data-storage 0;
+#X obj 54 212 s fftz-dentist-msgs;
+#X msg 123 107 setstate 15 7 9 92;
+#X msg 116 144 setstate 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
+19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40;
+#X msg 51 40 setstate 10 11 12 13 14 50 51 52 53 43;
+#X msg 94 73 setstate 7 15 40;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X restore 428 155 pd data-storage;
+#X text 60 304 dentist~ punches out all but a select set of partials.
+;
+#X connect 0 0 1 0;
+#X connect 0 0 1 1;
+#X connect 2 0 3 0;
+#X connect 3 0 0 1;
+#X connect 4 0 0 0;
+#X connect 4 1 7 0;
+#X connect 5 0 4 0;
+#X connect 6 0 4 0;
+#X connect 7 0 13 0;
+#X connect 8 0 4 0;
+#X connect 9 0 8 0;
+#X connect 10 0 9 0;
diff --git a/externals/fftease/fftease32-helpfiles/disarrain~-help.pd b/externals/fftease/fftease32-helpfiles/disarrain~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d001908166e086bacd908133181d35043405239d
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/disarrain~-help.pd
@@ -0,0 +1,86 @@
+#N canvas 889 356 642 531 10;
+#X obj 142 209 disarrain~;
+#X obj 98 101 phasor~ 261;
+#X obj 98 129 -~ 0.5;
+#X msg 198 131 fadetime \$1;
+#X floatatom 198 109 5 0 0 0 - disarrain-fadetime -, f 5;
+#X floatatom 296 126 5 0 0 0 - disarrain-switchct -, f 5;
+#X obj 98 335 *~ 0.05;
+#X obj 98 366 dac~;
+#X obj 140 295 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 3900 1;
+#X floatatom 137 315 5 0 0 0 - - -, f 5;
+#N canvas 404 737 450 300 showsync 0;
+#X obj 205 102 inlet~;
+#X obj 205 159 snapshot~;
+#X obj 325 121 metro 50;
+#X obj 325 89 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X obj 325 22 loadbang;
+#X msg 325 57 1;
+#X obj 205 225 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 6 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 5 0;
+#X connect 5 0 3 0;
+#X restore 183 247 pd showsync;
+#X floatatom 183 273 5 0 0 0 - - -, f 5;
+#X msg 296 151 switch_count \$1;
+#X obj 36 180 metro 3000;
+#X obj 37 27 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1
+;
+#N canvas 309 378 450 300 init 0;
+#X obj -52 38 loadbang;
+#X msg -52 65 \; disarrain-fadetime 3000 \; disarrain-switchct 70 \;
+disarrain-topfreq 2000;
+#X connect 0 0 1 0;
+#X restore 286 293 pd init;
+#X text 22 388 fftz.disarrain~ reorders a certain number of bins \,
+which can significantly transform the timbre. The spectral reordering
+is reported from the third outlet.;
+#X msg 332 177 showstate;
+#N canvas 0 22 450 300 showbins 0;
+#X obj 103 48 inlet;
+#X msg 42 210 62 70 5 20 43 30 48 49 60 44 32 11 8 46 35 6 65 38 34
+33 14 21 22 61 53 25 45 57 16 10 3 37 52 17 18 55 36 66 2 26 68 4 69
+0 42 47 31 39 54 27 40 50 13 63 58 24 56 59 67 7 19 23 1 9 64 41 29
+51 15 28;
+#X msg 42 109 set \$1 \$2 \$3 \$4 \$5 \$6 \$7 \$8 \$9 \$10 \$11 \$12
+\$13 \$14 \$15 \$16 \$17 \$18 \$19 \$20 \$21 \$22 \$23 \$24 \$25 \$26
+\$27 \$28 \$29 \$30 \$31 \$32 \$33 \$34 \$35 \$36 \$37 \$38 \$39 \$40
+\$41 \$42 \$43 \$44 \$45 \$46 \$47 \$48 \$49 \$50 \$51 \$52 \$53 \$54
+\$55 \$56 \$57 \$58 \$59 \$60 \$61 \$62 \$63 \$64 \$65 \$66 \$67 \$68
+\$69 \$70;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X restore 271 245 pd showbins;
+#X text 59 26 turn on for interpolation;
+#X obj 37 56 t f b b;
+#X obj 223 50 s disarrain-switchct;
+#X obj 223 70 s disarrain-fadetime;
+#X floatatom 469 181 5 0 0 0 - disarrain-topfreq -, f 5;
+#X msg 469 209 topfreq \$1;
+#X connect 0 0 6 0;
+#X connect 0 1 10 0;
+#X connect 0 2 18 0;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
+#X connect 5 0 12 0;
+#X connect 6 0 7 0;
+#X connect 6 0 7 1;
+#X connect 8 0 9 0;
+#X connect 9 0 6 1;
+#X connect 10 0 11 0;
+#X connect 12 0 0 0;
+#X connect 13 0 0 0;
+#X connect 14 0 20 0;
+#X connect 17 0 0 0;
+#X connect 20 0 13 0;
+#X connect 20 1 22 0;
+#X connect 20 2 21 0;
+#X connect 23 0 24 0;
+#X connect 24 0 0 0;
diff --git a/externals/fftease/fftease32-helpfiles/disarray~-help.pd b/externals/fftease/fftease32-helpfiles/disarray~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..605d358f31179bad983f330a9fe1743dd6be750e
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/disarray~-help.pd
@@ -0,0 +1,50 @@
+#N canvas 867 556 734 372 10;
+#X obj 112 160 disarray~;
+#X obj 97 50 phasor~ 261;
+#X obj 97 77 -~ 0.5;
+#X obj 112 249 *~ 0.05;
+#X obj 112 280 dac~;
+#X obj 154 209 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 3500 1;
+#X floatatom 151 229 5 0 0 0 - - -, f 5;
+#X msg 191 51 switch_count \$1;
+#X floatatom 191 18 5 0 0 0 - disarray-swcnt -, f 5;
+#X msg 389 178 topfreq \$1;
+#X floatatom 389 149 5 0 0 0 - disarray-topf -, f 5;
+#X msg 18 131 bang;
+#X msg 347 219 set \$1 \$2 \$3 \$4 \$5 \$6 \$7 \$8 \$9 \$10 \$11 \$12
+\$13 \$14 \$15 \$16 \$17 \$18 \$19 \$20 \$21 \$22 \$23 \$24 \$25 \$26
+\$27 \$28 \$29 \$30;
+#X msg 347 269 68 23 20 16 53 18 14 32 5 58 50 8 33 28 3 29 52 62 70
+35 13 48 42 69 26 12 37 39 17 0;
+#X msg 298 52 showstate;
+#X msg 310 76 setstate 68 23 20 16 53 18 14 32 5 58 50 8 33 28 3 29
+52 62 70 35 13 48 42 69 26 12 37 39 17 0;
+#X msg 309 113 setstate 40 108 102 115 104 49 10 21 89 45 84 22 4 28
+92 83 68 14 46 65 110 63 25 116 24 117 30 32 31 72;
+#X text 14 112 new scramble;
+#N canvas 398 725 450 300 init 0;
+#X msg 130 129 \; disarray-swcnt 30 \; disarray-topf 3000 \;;
+#X obj 167 74 loadbang;
+#X connect 1 0 0 0;
+#X restore 479 37 pd init;
+#X text 23 312 disarray~ reorders a certain number of bins \, which
+can significantly transform the timbre. The spectral reordering is
+reported from the second outlet.;
+#X connect 0 0 3 0;
+#X connect 0 1 12 0;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 3 0 4 0;
+#X connect 3 0 4 1;
+#X connect 5 0 6 0;
+#X connect 6 0 3 1;
+#X connect 7 0 0 0;
+#X connect 8 0 7 0;
+#X connect 9 0 0 0;
+#X connect 10 0 9 0;
+#X connect 11 0 0 0;
+#X connect 12 0 13 0;
+#X connect 14 0 0 0;
+#X connect 15 0 0 0;
+#X connect 16 0 0 0;
diff --git a/externals/fftease/fftease32-helpfiles/drown~-help.pd b/externals/fftease/fftease32-helpfiles/drown~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..4fdbbc98ee83ba08f7b9476f1f79296de3327a8d
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/drown~-help.pd
@@ -0,0 +1,51 @@
+#N canvas 812 597 450 300 10;
+#X obj 142 111 drown~;
+#X obj 142 189 *~ 0.05;
+#X obj 142 220 dac~;
+#X obj 184 149 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 181 169 5 0 0 0 - - -, f 5;
+#X obj 60 58 osc~ 440;
+#X floatatom 175 88 5 0 0 0 - - -, f 5;
+#X obj 178 64 hsl 128 15 0 1 0 0 empty empty noise-reduction-factor
+-2 -8 0 10 -262144 -1 -1 11000 1;
+#X floatatom 131 51 5 0 0 0 - - -, f 5;
+#X obj 134 27 hsl 128 15 0 1 0 0 empty empty noise-threshold -2 -8
+0 10 -262144 -1 -1 0 1;
+#N canvas 1336 367 450 300 add-noise 0;
+#X obj 89 109 noise~;
+#X obj 135 169 *~;
+#X obj 190 77 inlet;
+#X obj 130 227 outlet~;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 2 0 1 1;
+#X restore 50 143 pd add-noise;
+#X obj 50 117 tgl 15 0 empty drown-noisetog empty 17 7 0 10 -262144
+-1 -1 1 1;
+#X msg -19 57 adaptive \$1;
+#X obj -19 27 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X text -16 242 drown~ reduces the energy of low energy bins for noise
+reduction. Or you could use a factor > 1 to increase the noise in the
+signal. In adaptive mode \, the threshold is determined relative to
+each FFT frame peak.;
+#N canvas 285 462 450 300 init 0;
+#X msg 141 120 \; drown-noisetog 1 \;;
+#X obj 142 84 loadbang;
+#X connect 1 0 0 0;
+#X restore 260 207 pd init;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 1 0 2 1;
+#X connect 3 0 4 0;
+#X connect 4 0 1 1;
+#X connect 5 0 0 0;
+#X connect 6 0 0 2;
+#X connect 7 0 6 0;
+#X connect 8 0 0 1;
+#X connect 9 0 8 0;
+#X connect 10 0 0 0;
+#X connect 11 0 10 0;
+#X connect 12 0 0 0;
+#X connect 13 0 12 0;
diff --git a/externals/fftease/fftease32-helpfiles/enrich~-help.pd b/externals/fftease/fftease32-helpfiles/enrich~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7dfec304ada84c6b51fcdd0f87a2f3db912ee96e
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/enrich~-help.pd
@@ -0,0 +1,68 @@
+#N canvas 851 431 869 609 10;
+#N canvas 0 22 450 278 (subpatch) 0;
+#X array enrich-buffer 8195 float 2;
+#X coords 0 1 8195 -1 200 140 1 0 0;
+#X restore 361 27 graph;
+#X msg 252 355 \; enrich-buffer cosinesum 8192 0 1;
+#X obj 41 121 readsf~;
+#X obj 41 65 openpanel;
+#X msg 41 90 open \$1;
+#X msg 41 38 bang;
+#X msg 114 92 1;
+#X obj 41 259 enrich~ enrich-buffer;
+#X obj 41 371 *~ 0.05;
+#X obj 41 402 dac~;
+#X obj 83 331 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 80 351 5 0 0 0 - - -, f 5;
+#X obj 149 210 sig~ 1;
+#X obj 220 208 sig~ 0.001;
+#X msg 250 397 \; enrich-buffer cosinesum 8192 0 0.333 0.333 0.33;
+#X text 460 354 normal resynthesis with a cosine;
+#X text 548 404 add more harmonics;
+#X msg 250 441 \; enrich-buffer cosinesum 8192 0 0 0 0 0.2 0.4 0 0
+0.4;
+#X obj 252 328 loadbang;
+#X text 566 27 try drawing directly into the array;
+#X text 565 45 for lots of harmonics;
+#X text 81 43 load a sound file;
+#X text 143 91 play it;
+#X obj 152 148 hsl 128 15 0.5 1.9999 0 0 empty enrich-tfac transpose-factor
+-2 -8 0 10 -262144 -1 -1 4234 1;
+#X floatatom 149 181 9 0 0 0 - - -, f 9;
+#X msg 371 226 highfreq \$1;
+#X floatatom 371 200 5 0 0 0 - enrich-hfr -, f 5;
+#N canvas 365 262 450 300 init 0;
+#X msg 87 143 \; enrich-hfr 10000 \; enrich-tfac 1 \; enrich-lofr 0
+;
+#X obj 101 105 loadbang;
+#X connect 1 0 0 0;
+#X restore 499 313 pd init;
+#X floatatom 461 198 5 0 0 0 - enrich-lofr -, f 5;
+#X msg 461 224 lowfreq \$1;
+#X obj 9 190 r fftz-enrich-msgs;
+#X obj 371 268 s fftz-enrich-msgs;
+#X text 46 501 enrich~ synthesizes an oscillator bank that reads from
+a Pd array \, which can contain any user-specified waveform. Useful
+for distortion.;
+#X text 575 450 way high harmonics;
+#X connect 2 0 7 0;
+#X connect 3 0 4 0;
+#X connect 4 0 2 0;
+#X connect 5 0 3 0;
+#X connect 6 0 2 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 8 0 9 1;
+#X connect 10 0 11 0;
+#X connect 11 0 8 1;
+#X connect 12 0 7 1;
+#X connect 13 0 7 2;
+#X connect 18 0 1 0;
+#X connect 23 0 24 0;
+#X connect 24 0 12 0;
+#X connect 25 0 31 0;
+#X connect 26 0 25 0;
+#X connect 28 0 29 0;
+#X connect 29 0 31 0;
+#X connect 30 0 7 0;
diff --git a/externals/fftease/fftease32-helpfiles/ether~-help.pd b/externals/fftease/fftease32-helpfiles/ether~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..5fa5a27f709d9a193b18617da77d49cec0482dc7
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/ether~-help.pd
@@ -0,0 +1,51 @@
+#N canvas 945 525 525 499 10;
+#X obj 143 202 ether~;
+#X obj 143 137 readsf~;
+#X obj 143 81 openpanel;
+#X msg 143 106 open \$1;
+#X msg 143 54 bang;
+#X msg 211 106 1;
+#X obj 278 140 readsf~;
+#X obj 278 84 openpanel;
+#X msg 278 109 open \$1;
+#X msg 278 57 bang;
+#X text 314 61 load sf2;
+#X floatatom 292 178 5 0 512 0 - - -, f 5;
+#X obj 160 283 *~ 0.05;
+#X obj 160 314 dac~;
+#X obj 202 243 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 2600 1;
+#X floatatom 199 263 5 0 0 0 - - -, f 5;
+#X msg 36 163 invert \$1;
+#X obj 36 129 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X text 13 337 ether~ selects portions of two input signals and creates
+a composite output spectrum based upon the amplitude of the inputs.
+In a bin-by-bin comparison \, the strongest bin of the two inputs will
+be selected. Sending the inverse message will reverse this behavior
+\, selecting the weakest bins. The composite index is a scalar for
+the selection of the second input. Higher values for the composite
+index will favor the second input. Useful values will vary according
+to the amplitude characteristics of the input signals. Try values greater
+than 0 and less than 100 But higher values may be effective depending
+upon the input signals.;
+#X text 331 176 composite index;
+#X text 179 58 load sf1;
+#X connect 0 0 12 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 2 0;
+#X connect 5 0 1 0;
+#X connect 5 0 6 0;
+#X connect 6 0 0 1;
+#X connect 7 0 8 0;
+#X connect 8 0 6 0;
+#X connect 9 0 7 0;
+#X connect 11 0 0 2;
+#X connect 12 0 13 0;
+#X connect 12 0 13 1;
+#X connect 14 0 15 0;
+#X connect 15 0 12 1;
+#X connect 16 0 0 0;
+#X connect 17 0 16 0;
diff --git a/externals/fftease/fftease32-helpfiles/leaker~-help.pd b/externals/fftease/fftease32-helpfiles/leaker~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..cb093e289c999564f3fae35f8869083eb1ed2026
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/leaker~-help.pd
@@ -0,0 +1,50 @@
+#N canvas 802 314 518 484 10;
+#X obj 197 210 leaker~;
+#X obj 155 149 readsf~;
+#X obj 155 93 openpanel;
+#X msg 155 118 open \$1;
+#X msg 155 66 bang;
+#X msg 223 118 1;
+#X obj 274 153 readsf~;
+#X obj 274 97 openpanel;
+#X msg 274 122 open \$1;
+#X msg 274 70 bang;
+#X text 310 74 load sf2;
+#X text 191 70 load sf1;
+#X floatatom 298 188 5 0 0 0 - - -, f 5;
+#X obj 358 162 hsl 128 15 0 1 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 12700 1;
+#X obj 197 301 *~ 0.05;
+#X obj 197 332 dac~;
+#X obj 239 261 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 10700 1;
+#X floatatom 236 281 5 0 0 0 - - -, f 5;
+#X msg 22 96 upsieve;
+#X msg 23 122 downsieve;
+#X msg 23 155 randsieve;
+#X text 33 360 leaker~ combines two input sounds \, with the spectral
+contribution of each sound determined by an internally maintained sieve
+and a threshold selection value. At value 0 \, only sound 1 is heard
+and at value 1 \, only sound 2 is heard. At intermediate values \,
+parts of each spectrum are aggregated according to the sieve structure
+which may be specified as upsieve \, downsieve or randsieve.;
+#X connect 0 0 14 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 2 0;
+#X connect 5 0 1 0;
+#X connect 5 0 6 0;
+#X connect 6 0 0 1;
+#X connect 7 0 8 0;
+#X connect 8 0 6 0;
+#X connect 9 0 7 0;
+#X connect 12 0 0 2;
+#X connect 13 0 12 0;
+#X connect 14 0 15 0;
+#X connect 14 0 15 1;
+#X connect 16 0 17 0;
+#X connect 17 0 14 1;
+#X connect 18 0 0 0;
+#X connect 19 0 0 0;
+#X connect 20 0 0 0;
diff --git a/externals/fftease/fftease32-helpfiles/mindwarp~-help.pd b/externals/fftease/fftease32-helpfiles/mindwarp~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..087deab23e0c7538f92fc46c2c1be3b0a73422ab
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/mindwarp~-help.pd
@@ -0,0 +1,93 @@
+#N canvas 750 306 571 646 10;
+#X obj 208 215 mindwarp~;
+#X obj 146 168 pvoc~;
+#N canvas 402 529 480 401 selector 0;
+#X obj 127 50 inlet~;
+#X obj 202 52 inlet~;
+#X obj 48 53 inlet;
+#X obj 155 350 outlet~;
+#X obj 154 278 *~;
+#X obj 214 274 *~;
+#X obj 48 105 sel 0 1;
+#X msg 48 139 1 0;
+#X msg 94 139 0 1;
+#X floatatom 170 225 5 0 0 0 - - -, f 5;
+#X floatatom 246 223 5 0 0 0 - - -, f 5;
+#X obj 48 173 unpack f f;
+#X connect 0 0 4 0;
+#X connect 1 0 5 0;
+#X connect 2 0 6 0;
+#X connect 4 0 3 0;
+#X connect 5 0 3 0;
+#X connect 6 0 7 0;
+#X connect 6 1 8 0;
+#X connect 7 0 11 0;
+#X connect 8 0 11 0;
+#X connect 9 0 4 1;
+#X connect 10 0 5 1;
+#X connect 11 0 9 0;
+#X connect 11 1 10 0;
+#X restore 173 281 pd selector;
+#X obj 141 230 tgl 15 0 empty mindwarp-tog empty 17 7 0 10 -262144
+-1 -1 1 1;
+#X obj 173 364 *~ 0.05;
+#X obj 173 395 dac~;
+#X obj 215 324 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 4900 1;
+#X floatatom 212 344 5 0 0 0 - - -, f 5;
+#X obj 146 134 readsf~;
+#X obj 146 78 openpanel;
+#X msg 146 103 open \$1;
+#X msg 146 51 bang;
+#X msg 214 103 1;
+#X text 182 55 load sf;
+#X text 247 103 play it;
+#X floatatom 229 136 5 0 0 0 - mindwarp-tfac -, f 5;
+#X floatatom 305 168 5 0 0 0 - mindwarp-wfac -, f 5;
+#X obj 235 157 sig~ 0.001;
+#X floatatom 343 194 5 0 0 0 - mindwarp-shapew -, f 5;
+#X text 50 221 0 - raw pvoc;
+#X text 49 237 1 - mindwarp;
+#N canvas 0 22 450 300 init 0;
+#X obj 36 100 loadbang;
+#X msg 36 135 \; mindwarp-tfac 1 \; mindwarp-wfac 1 \; mindwarp-shapew
+10 \; mindwarp-tog 1 \; mindwarp-tfac&warpfac 1;
+#X connect 0 0 1 0;
+#X restore 422 262 pd init;
+#X obj 353 117 hsl 128 15 0.5 2 0 0 empty mindwarp-tfac&warpfac tfac&warpfac
+-2 -8 0 10 -262144 -1 -1 533 1;
+#X obj 350 137 s mindwarp-tfac;
+#X obj 383 162 s mindwarp-wfac;
+#X text 27 423 mindwarp~ performs spectral envelope warping. It can
+be used to correct for the formant shifting effects of pitch-scaling.
+The warp factor is tuned to warp spectra to compensate for directly
+corresponding pitch-scaling values. For example \, if you have pitch-scaled
+a signal by a factor of two \, increasing its frequency content by
+an octave \, by providing mindwarp~ with a warp factor of 2 and the
+pitch-scaled signal \, mindwarp~ will restore the spectral formant
+of the signal to an estimation of the shape present in the original
+unscaled signal. Currently \, warp factor values are restricted to
+the range [1/16 ... 16.]. mindwarp~ utilizes frequency shaping to perform
+its duty. You may need to fiddle with the shape width to best catch
+the formants. It can be fun to decorrelate the warp factor from the
+transposition factor.;
+#X connect 0 0 2 2;
+#X connect 1 0 0 0;
+#X connect 1 0 2 1;
+#X connect 2 0 4 0;
+#X connect 3 0 2 0;
+#X connect 4 0 5 0;
+#X connect 4 0 5 1;
+#X connect 6 0 7 0;
+#X connect 7 0 4 1;
+#X connect 8 0 1 0;
+#X connect 9 0 10 0;
+#X connect 10 0 8 0;
+#X connect 11 0 9 0;
+#X connect 12 0 8 0;
+#X connect 15 0 1 1;
+#X connect 16 0 0 1;
+#X connect 17 0 1 2;
+#X connect 18 0 0 2;
+#X connect 22 0 23 0;
+#X connect 22 0 24 0;
diff --git a/externals/fftease/fftease32-helpfiles/morphine~-help.pd b/externals/fftease/fftease32-helpfiles/morphine~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..cbc3449bd8f0a345cc39c358daba1d17417fe7d8
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/morphine~-help.pd
@@ -0,0 +1,53 @@
+#N canvas 808 479 612 478 10;
+#X obj 181 140 readsf~;
+#X obj 181 84 openpanel;
+#X msg 181 109 open \$1;
+#X msg 181 57 bang;
+#X msg 249 109 1;
+#X obj 312 139 readsf~;
+#X obj 312 83 openpanel;
+#X msg 312 108 open \$1;
+#X msg 312 56 bang;
+#X text 348 60 load sf2;
+#X text 217 61 load sf1;
+#X msg 60 135 transition \$1;
+#X floatatom 60 104 5 0 0 0 - morphine-trans -, f 5;
+#X obj 193 265 *~ 0.05;
+#X obj 193 296 dac~;
+#X obj 235 225 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 11800 1;
+#X floatatom 232 245 5 0 0 0 - - -, f 5;
+#X obj 191 187 morphine~ 4096 8;
+#X text 19 318 morphine~ performs spectral morphing \, creating a new
+spectrum from its two inputs. Values between 0 and 1 are the useful
+range for the morph index. The progression depends upon the exponential
+transition scaling value. Progressively smaller negative values will
+widen the transition space between the two sounds. Larger FFT sizes
+\, such as 4096 \, produce smoother results.;
+#X obj 407 169 hsl 128 15 0 1 0 0 empty empty morph-index -2 -8 0 10
+-262144 -1 -1 5500 1;
+#X floatatom 404 195 5 0 0 0 - - -, f 5;
+#N canvas 0 22 450 300 init 0;
+#X msg 151 157 \; morphine-trans -5;
+#X obj 151 125 loadbang;
+#X connect 1 0 0 0;
+#X restore 441 258 pd init;
+#X connect 0 0 17 0;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 3 0 1 0;
+#X connect 4 0 0 0;
+#X connect 4 0 5 0;
+#X connect 5 0 17 1;
+#X connect 6 0 7 0;
+#X connect 7 0 5 0;
+#X connect 8 0 6 0;
+#X connect 11 0 17 0;
+#X connect 12 0 11 0;
+#X connect 13 0 14 0;
+#X connect 13 0 14 1;
+#X connect 15 0 16 0;
+#X connect 16 0 13 1;
+#X connect 17 0 13 0;
+#X connect 19 0 20 0;
+#X connect 20 0 17 2;
diff --git a/externals/fftease/fftease32-helpfiles/multyq~-help.pd b/externals/fftease/fftease32-helpfiles/multyq~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..37805a30f8161321d769fc67da2a4ae1d7d200c7
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/multyq~-help.pd
@@ -0,0 +1,60 @@
+#N canvas 1099 521 568 422 10;
+#X obj 52 50 noise~;
+#X obj 52 261 *~ 0.05;
+#X obj 52 292 dac~;
+#X obj 94 221 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 91 241 5 0 0 0 - - -, f 5;
+#X floatatom 69 100 5 0 0 0 - multyq-f1 -, f 5;
+#X floatatom 105 100 5 0 0 0 - multyq-bw1 -, f 5;
+#X floatatom 141 99 5 0 0 0 - multyq-g1 -, f 5;
+#N canvas 609 675 450 300 init 0;
+#X msg 33 95 \; multyq-f1 565 \; multyq-bw1 0.5 \; multyq-g1 4 \; multyq-bw2
+0.45 \; multyq-bw3 0.2 \; multyq-g3 12 \;;
+#X obj 33 64 loadbang;
+#X connect 1 0 0 0;
+#X restore 437 184 pd init;
+#X obj 193 106 *~;
+#X obj 193 41 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 282 30 osc~ 0.2;
+#X obj 282 52 *~ 1000;
+#X obj 282 74 +~ 1300;
+#X obj 52 156 multyq~ 1024 8, f 71;
+#X obj 263 107 * 4;
+#X floatatom 228 126 5 0 0 0 - multyq-bw2 -, f 5;
+#X text 124 41 autosweep;
+#X floatatom 445 85 5 0 0 0 - multyq-bw3 -, f 5;
+#X floatatom 487 85 5 0 0 0 - multyq-g3 -, f 5;
+#X obj 407 45 hsl 128 15 1000 10000 0 0 empty empty empty -2 -8 0 10
+-262144 -1 -1 0 1;
+#X floatatom 404 86 5 0 0 0 - - -, f 5;
+#X text 397 21 sweep high end;
+#X text 289 137 room for one more;
+#X text 52 319 multyq~ is a four band equalizer. Gain values below
+0 create notches rather than peaks \, but only go as far as -1.0. Bandwidth
+is from 0 to 1 Only three bands are used in this example \, but CPU
+usage is the same regardless of how many are used. As the filter is
+FFT-based \, its performance is spotty in the low frequency range.
+;
+#X connect 0 0 14 0;
+#X connect 1 0 2 0;
+#X connect 1 0 2 1;
+#X connect 3 0 4 0;
+#X connect 4 0 1 1;
+#X connect 5 0 14 1;
+#X connect 6 0 14 2;
+#X connect 7 0 14 3;
+#X connect 9 0 14 4;
+#X connect 10 0 9 0;
+#X connect 10 0 15 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 13 0 9 1;
+#X connect 14 0 1 0;
+#X connect 15 0 14 6;
+#X connect 16 0 14 5;
+#X connect 18 0 14 11;
+#X connect 19 0 14 12;
+#X connect 20 0 21 0;
+#X connect 21 0 14 10;
diff --git a/externals/fftease/fftease32-helpfiles/pileup~-help.pd b/externals/fftease/fftease32-helpfiles/pileup~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..98a5683668a761ca12f08b6ac72ebad801705630
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/pileup~-help.pd
@@ -0,0 +1,69 @@
+#N canvas 1256 420 532 415 10;
+#X obj 112 222 pileup~;
+#X msg 39 167 mode \$1;
+#X obj 111 188 readsf~;
+#X obj 111 132 openpanel;
+#X msg 111 157 open \$1;
+#X msg 111 105 bang;
+#X msg 179 157 1;
+#X text 147 109 load sf;
+#X obj 112 299 *~ 0.05;
+#X obj 112 330 dac~;
+#X obj 154 259 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 151 279 5 0 0 0 - - -, f 5;
+#X obj 218 186 r fftz-pileup-msgs;
+#N canvas 1208 223 683 377 controls 0;
+#X obj 96 277 s fftz-pileup-msgs;
+#X msg 100 149 persistence \$1;
+#X floatatom 100 110 5 0 0 0 - pileup-pers -, f 5;
+#X msg 209 148 oscbank \$1, f 11;
+#X obj 209 114 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X msg 303 148 synthresh \$1;
+#X floatatom 303 118 5 0 0 0 - - -, f 5;
+#X obj 300 72 hsl 128 15 0 0.2 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 454 120 5 0 0 0 - - -, f 5;
+#X obj 451 74 hsl 128 15 0.5 1.999 0 0 empty pileup-transp empty -2
+-8 0 10 -262144 -1 -1 4236 1;
+#X msg 454 150 transpose \$1;
+#X msg 349 240 clear;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
+#X connect 5 0 0 0;
+#X connect 6 0 5 0;
+#X connect 7 0 6 0;
+#X connect 8 0 10 0;
+#X connect 9 0 8 0;
+#X connect 10 0 0 0;
+#X connect 11 0 0 0;
+#X restore 254 133 pd controls;
+#N canvas 568 719 450 300 init 0;
+#X msg 97 151 \; pileup-transp 1 \; pileup-pers 0.99;
+#X obj 97 107 loadbang;
+#X connect 1 0 0 0;
+#X restore 250 88 pd init;
+#X obj 38 16 vradio 20 1 0 3 empty empty empty 0 -8 0 10 -262144 -1
+-1 0;
+#X text 65 17 persistent amplitude and phase;
+#X text 66 36 persistent amplitude only;
+#X text 66 58 inverse persistence;
+#X text 52 353 pileup~ maintains amplitude/phase information in bins
+(with possible damping) until new information comes in above a given
+threshold. This is useful for various reverberant effects.;
+#X connect 0 0 8 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 4 0;
+#X connect 4 0 2 0;
+#X connect 5 0 3 0;
+#X connect 6 0 2 0;
+#X connect 8 0 9 0;
+#X connect 8 0 9 1;
+#X connect 10 0 11 0;
+#X connect 11 0 8 1;
+#X connect 12 0 0 0;
+#X connect 15 0 1 0;
diff --git a/externals/fftease/fftease32-helpfiles/pvcompand~-help.pd b/externals/fftease/fftease32-helpfiles/pvcompand~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..94f249ef59d2b5e959f77717ff4b8afeb31c1890
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/pvcompand~-help.pd
@@ -0,0 +1,31 @@
+#N canvas 1205 620 541 378 10;
+#X obj 43 149 pvcompand~;
+#X obj 43 109 readsf~;
+#X obj 43 53 openpanel;
+#X msg 43 78 open \$1;
+#X msg 43 26 bang;
+#X msg 111 78 1;
+#X text 79 30 load sf;
+#X floatatom 192 96 5 0 0 0 - - -, f 5;
+#X text 189 74 threshold factor;
+#X obj 43 225 *~ 0.05;
+#X obj 43 256 dac~;
+#X obj 85 185 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 82 205 5 0 0 0 - - -, f 5;
+#X text 41 274 pvcompand~ either expands or compresses the differences
+between the amplitudes of the spectral frames. The threshold is interpreted
+as dB and useful ranges are from about -60 to +60. Positive values
+increase the "peakiness" of the sound and negative values tend to whiten
+the spectrum.;
+#X connect 0 0 9 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 2 0;
+#X connect 5 0 1 0;
+#X connect 7 0 0 1;
+#X connect 9 0 10 0;
+#X connect 9 0 10 1;
+#X connect 11 0 12 0;
+#X connect 12 0 9 1;
diff --git a/externals/fftease/fftease32-helpfiles/pvgrain~-help.pd b/externals/fftease/fftease32-helpfiles/pvgrain~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..79a439e354a643db08c1ab39bd9d2300e707ee24
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/pvgrain~-help.pd
@@ -0,0 +1,440 @@
+#N canvas 986 280 572 436 10;
+#X obj 144 173 pvgrain~;
+#X obj 53 121 readsf~;
+#X obj 53 65 openpanel;
+#X msg 53 90 open \$1;
+#X msg 53 38 bang;
+#X msg 121 90 1;
+#X text 89 42 load sf;
+#X obj 53 213 *~;
+#X floatatom 68 180 5 0 0 0 - mix-in-orig -, f 5;
+#X obj 53 305 *~ 0.05;
+#X obj 53 336 dac~;
+#X obj 126 263 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 123 283 5 0 0 0 - - -, f 5;
+#N canvas 0 22 450 278 (subpatch) 0;
+#X array pvgrain-pf 46379 float 2;
+#X coords 0 1 46379 -1 200 140 1;
+#X restore 255 28 graph;
+#X obj 275 273 soundfiler;
+#X obj 275 207 loadbang;
+#X obj 144 137 r pvgrain-msgs;
+#N canvas 1172 705 632 335 control 0;
+#X obj 143 143 s pvgrain-msgs;
+#X msg 143 106 probability \$1;
+#X floatatom 143 73 7 0 0 0 - - -, f 7;
+#X obj 146 38 hsl 128 15 0.0001 0.1 0 0 empty pvgrain-prob empty -2
+-8 0 10 -262144 -1 -1 2530 1;
+#X msg 276 106 framegrains \$1;
+#X floatatom 276 73 5 1 60 0 - pvgrain-fgr -, f 5;
+#X msg 437 110 topfreq \$1;
+#X floatatom 437 75 7 50 20000 0 - pvgrain-topf -, f 7;
+#X floatatom 355 190 5 0 0 0 - base-freq -, f 5;
+#X obj 355 209 s base-frequency;
+#X obj 121 206 hsl 128 15 0 1 0 0 mix-in-orig empty mix-in-orig -2
+-8 0 10 -262144 -1 -1 0 1;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 0 0;
+#X connect 5 0 4 0;
+#X connect 6 0 0 0;
+#X connect 7 0 6 0;
+#X connect 8 0 9 0;
+#X restore 275 301 pd control;
+#N canvas 857 534 450 300 init 0;
+#X obj 39 78 loadbang;
+#X msg 39 114 \; base-freq 261 \; pvgrain-topf 4000 \; pvgrain-fgr
+20 \; pvgrain-prob 0.02;
+#X connect 0 0 1 0;
+#X restore 274 326 pd init;
+#N canvas 610 230 689 382 playback 0;
+#X obj 51 29 inlet;
+#X obj 92 104 + 1;
+#X obj 92 139 % 8;
+#N canvas 1105 181 610 733 gate8 0;
+#X obj 33 22 inlet;
+#X obj 525 101 inlet;
+#X obj 33 75 sel 0 1 2 3 4 5 6 7;
+#X obj 14 508 spigot;
+#X obj 14 530 outlet;
+#X obj 64 508 spigot;
+#X obj 64 530 outlet;
+#X obj 115 510 spigot;
+#X obj 115 532 outlet;
+#X obj 165 510 spigot;
+#X obj 165 532 outlet;
+#X obj 216 508 spigot;
+#X obj 216 530 outlet;
+#X obj 266 508 spigot;
+#X obj 266 530 outlet;
+#X obj 317 510 spigot;
+#X obj 317 532 outlet;
+#X obj 367 510 spigot;
+#X obj 367 532 outlet;
+#X obj 11 461 unpack f f f f f f f f, f 59;
+#X msg 34 115 1 0 0 0 0 0 0 0;
+#X msg 43 139 0 1 0 0 0 0 0 0;
+#X msg 57 161 0 0 1 0 0 0 0 0;
+#X msg 70 187 0 0 0 1 0 0 0 0;
+#X msg 90 221 0 0 0 0 1 0 0 0 0;
+#X msg 100 250 0 0 0 0 0 1 0 0 0;
+#X msg 117 279 0 0 0 0 0 0 1 0 0;
+#X msg 129 309 0 0 0 0 0 0 0 1 0;
+#X msg 142 337 0 0 0 0 0 0 0 0 1, f 79;
+#X connect 0 0 2 0;
+#X connect 1 0 3 0;
+#X connect 1 0 5 0;
+#X connect 1 0 7 0;
+#X connect 1 0 9 0;
+#X connect 1 0 11 0;
+#X connect 1 0 13 0;
+#X connect 1 0 15 0;
+#X connect 1 0 17 0;
+#X connect 2 0 20 0;
+#X connect 2 1 21 0;
+#X connect 2 2 22 0;
+#X connect 2 3 23 0;
+#X connect 2 4 24 0;
+#X connect 2 5 25 0;
+#X connect 2 6 26 0;
+#X connect 2 7 27 0;
+#X connect 2 8 28 0;
+#X connect 3 0 4 0;
+#X connect 5 0 6 0;
+#X connect 7 0 8 0;
+#X connect 9 0 10 0;
+#X connect 11 0 12 0;
+#X connect 13 0 14 0;
+#X connect 15 0 16 0;
+#X connect 17 0 18 0;
+#X connect 19 0 3 1;
+#X connect 19 1 5 1;
+#X connect 19 2 7 1;
+#X connect 19 3 9 1;
+#X connect 19 4 11 1;
+#X connect 19 5 13 1;
+#X connect 19 6 15 1;
+#X connect 19 7 17 1;
+#X connect 20 0 19 0;
+#X connect 21 0 19 0;
+#X connect 22 0 19 0;
+#X connect 23 0 19 0;
+#X connect 24 0 19 0;
+#X connect 25 0 19 0;
+#X connect 26 0 19 0;
+#X connect 27 0 19 0;
+#X connect 28 0 19 0;
+#X restore 92 165 pd gate8;
+#X obj 51 60 t l b;
+#N canvas 775 197 588 642 playlet 0;
+#X obj 200 43 inlet;
+#X obj 200 95 unpack f f;
+#X obj 257 130 / 261;
+#X obj 65 407 line~;
+#X obj 65 444 tabread4~ pvgrain-pf;
+#X obj 65 499 *~ 0.1;
+#X floatatom 257 164 5 0 0 0 - - -, f 5;
+#X msg 20 375 1;
+#X msg 65 279 1051;
+#X obj 65 317 /;
+#X obj 257 200 t b f;
+#X obj 65 342 t f b;
+#X text 15 29 assumes 44100 SR;
+#X obj 65 545 outlet~;
+#X msg 65 374 46376 \$1;
+#X connect 0 0 1 0;
+#X connect 1 0 5 1;
+#X connect 1 1 2 0;
+#X connect 2 0 6 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 13 0;
+#X connect 6 0 10 0;
+#X connect 7 0 3 0;
+#X connect 8 0 9 0;
+#X connect 9 0 11 0;
+#X connect 10 0 8 0;
+#X connect 10 1 9 1;
+#X connect 11 0 14 0;
+#X connect 11 1 7 0;
+#X connect 14 0 3 0;
+#X restore 92 211 pd playlet;
+#X obj 92 263 outlet~;
+#X obj 51 105 f 0;
+#N canvas 775 197 588 642 playlet 0;
+#X obj 200 43 inlet;
+#X obj 200 95 unpack f f;
+#X obj 257 130 / 261;
+#X obj 65 407 line~;
+#X obj 65 444 tabread4~ pvgrain-pf;
+#X obj 65 499 *~ 0.1;
+#X floatatom 257 164 5 0 0 0 - - -, f 5;
+#X msg 20 375 1;
+#X msg 65 279 1051;
+#X obj 65 317 /;
+#X obj 257 200 t b f;
+#X obj 65 342 t f b;
+#X text 15 29 assumes 44100 SR;
+#X obj 65 545 outlet~;
+#X msg 65 374 46376 \$1;
+#X connect 0 0 1 0;
+#X connect 1 0 5 1;
+#X connect 1 1 2 0;
+#X connect 2 0 6 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 13 0;
+#X connect 6 0 10 0;
+#X connect 7 0 3 0;
+#X connect 8 0 9 0;
+#X connect 9 0 11 0;
+#X connect 10 0 8 0;
+#X connect 10 1 9 1;
+#X connect 11 0 14 0;
+#X connect 11 1 7 0;
+#X connect 14 0 3 0;
+#X restore 163 211 pd playlet;
+#N canvas 775 197 588 642 playlet 0;
+#X obj 200 43 inlet;
+#X obj 200 95 unpack f f;
+#X obj 257 130 / 261;
+#X obj 65 407 line~;
+#X obj 65 444 tabread4~ pvgrain-pf;
+#X obj 65 499 *~ 0.1;
+#X floatatom 257 164 5 0 0 0 - - -, f 5;
+#X msg 20 375 1;
+#X msg 65 279 1051;
+#X obj 65 317 /;
+#X obj 257 200 t b f;
+#X obj 65 342 t f b;
+#X text 15 29 assumes 44100 SR;
+#X obj 65 545 outlet~;
+#X msg 65 374 46376 \$1;
+#X connect 0 0 1 0;
+#X connect 1 0 5 1;
+#X connect 1 1 2 0;
+#X connect 2 0 6 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 13 0;
+#X connect 6 0 10 0;
+#X connect 7 0 3 0;
+#X connect 8 0 9 0;
+#X connect 9 0 11 0;
+#X connect 10 0 8 0;
+#X connect 10 1 9 1;
+#X connect 11 0 14 0;
+#X connect 11 1 7 0;
+#X connect 14 0 3 0;
+#X restore 238 210 pd playlet;
+#N canvas 775 197 588 642 playlet 0;
+#X obj 200 43 inlet;
+#X obj 200 95 unpack f f;
+#X obj 257 130 / 261;
+#X obj 65 407 line~;
+#X obj 65 444 tabread4~ pvgrain-pf;
+#X obj 65 499 *~ 0.1;
+#X floatatom 257 164 5 0 0 0 - - -, f 5;
+#X msg 20 375 1;
+#X msg 65 279 1051;
+#X obj 65 317 /;
+#X obj 257 200 t b f;
+#X obj 65 342 t f b;
+#X text 15 29 assumes 44100 SR;
+#X obj 65 545 outlet~;
+#X msg 65 374 46376 \$1;
+#X connect 0 0 1 0;
+#X connect 1 0 5 1;
+#X connect 1 1 2 0;
+#X connect 2 0 6 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 13 0;
+#X connect 6 0 10 0;
+#X connect 7 0 3 0;
+#X connect 8 0 9 0;
+#X connect 9 0 11 0;
+#X connect 10 0 8 0;
+#X connect 10 1 9 1;
+#X connect 11 0 14 0;
+#X connect 11 1 7 0;
+#X connect 14 0 3 0;
+#X restore 309 210 pd playlet;
+#N canvas 775 197 588 642 playlet 0;
+#X obj 200 43 inlet;
+#X obj 200 95 unpack f f;
+#X obj 257 130 / 261;
+#X obj 65 407 line~;
+#X obj 65 444 tabread4~ pvgrain-pf;
+#X obj 65 499 *~ 0.1;
+#X floatatom 257 164 5 0 0 0 - - -, f 5;
+#X msg 20 375 1;
+#X msg 65 279 1051;
+#X obj 65 317 /;
+#X obj 257 200 t b f;
+#X obj 65 342 t f b;
+#X text 15 29 assumes 44100 SR;
+#X obj 65 545 outlet~;
+#X msg 65 374 46376 \$1;
+#X connect 0 0 1 0;
+#X connect 1 0 5 1;
+#X connect 1 1 2 0;
+#X connect 2 0 6 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 13 0;
+#X connect 6 0 10 0;
+#X connect 7 0 3 0;
+#X connect 8 0 9 0;
+#X connect 9 0 11 0;
+#X connect 10 0 8 0;
+#X connect 10 1 9 1;
+#X connect 11 0 14 0;
+#X connect 11 1 7 0;
+#X connect 14 0 3 0;
+#X restore 383 209 pd playlet;
+#N canvas 775 197 588 642 playlet 0;
+#X obj 200 43 inlet;
+#X obj 200 95 unpack f f;
+#X obj 257 130 / 261;
+#X obj 65 407 line~;
+#X obj 65 444 tabread4~ pvgrain-pf;
+#X obj 65 499 *~ 0.1;
+#X floatatom 257 164 5 0 0 0 - - -, f 5;
+#X msg 20 375 1;
+#X msg 65 279 1051;
+#X obj 65 317 /;
+#X obj 257 200 t b f;
+#X obj 65 342 t f b;
+#X text 15 29 assumes 44100 SR;
+#X obj 65 545 outlet~;
+#X msg 65 374 46376 \$1;
+#X connect 0 0 1 0;
+#X connect 1 0 5 1;
+#X connect 1 1 2 0;
+#X connect 2 0 6 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 13 0;
+#X connect 6 0 10 0;
+#X connect 7 0 3 0;
+#X connect 8 0 9 0;
+#X connect 9 0 11 0;
+#X connect 10 0 8 0;
+#X connect 10 1 9 1;
+#X connect 11 0 14 0;
+#X connect 11 1 7 0;
+#X connect 14 0 3 0;
+#X restore 454 209 pd playlet;
+#N canvas 775 197 588 642 playlet 0;
+#X obj 200 43 inlet;
+#X obj 200 95 unpack f f;
+#X obj 257 130 / 261;
+#X obj 65 407 line~;
+#X obj 65 444 tabread4~ pvgrain-pf;
+#X obj 65 499 *~ 0.1;
+#X floatatom 257 164 5 0 0 0 - - -, f 5;
+#X msg 20 375 1;
+#X msg 65 279 1051;
+#X obj 65 317 /;
+#X obj 257 200 t b f;
+#X obj 65 342 t f b;
+#X text 15 29 assumes 44100 SR;
+#X obj 65 545 outlet~;
+#X msg 65 374 46376 \$1;
+#X connect 0 0 1 0;
+#X connect 1 0 5 1;
+#X connect 1 1 2 0;
+#X connect 2 0 6 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 13 0;
+#X connect 6 0 10 0;
+#X connect 7 0 3 0;
+#X connect 8 0 9 0;
+#X connect 9 0 11 0;
+#X connect 10 0 8 0;
+#X connect 10 1 9 1;
+#X connect 11 0 14 0;
+#X connect 11 1 7 0;
+#X connect 14 0 3 0;
+#X restore 529 208 pd playlet;
+#N canvas 775 197 588 642 playlet 0;
+#X obj 200 43 inlet;
+#X obj 200 95 unpack f f;
+#X obj 257 130 / 261;
+#X obj 65 407 line~;
+#X obj 65 444 tabread4~ pvgrain-pf;
+#X obj 65 499 *~ 0.1;
+#X floatatom 257 164 5 0 0 0 - - -, f 5;
+#X msg 20 375 1;
+#X msg 65 279 1051;
+#X obj 65 317 /;
+#X obj 257 200 t b f;
+#X obj 65 342 t f b;
+#X text 15 29 assumes 44100 SR;
+#X obj 65 545 outlet~;
+#X msg 65 374 46376 \$1;
+#X connect 0 0 1 0;
+#X connect 1 0 5 1;
+#X connect 1 1 2 0;
+#X connect 2 0 6 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 13 0;
+#X connect 6 0 10 0;
+#X connect 7 0 3 0;
+#X connect 8 0 9 0;
+#X connect 9 0 11 0;
+#X connect 10 0 8 0;
+#X connect 10 1 9 1;
+#X connect 11 0 14 0;
+#X connect 11 1 7 0;
+#X connect 14 0 3 0;
+#X restore 600 208 pd playlet;
+#X connect 0 0 4 0;
+#X connect 1 0 2 0;
+#X connect 1 0 7 1;
+#X connect 2 0 3 0;
+#X connect 3 0 5 0;
+#X connect 3 1 8 0;
+#X connect 3 2 9 0;
+#X connect 3 3 10 0;
+#X connect 3 4 11 0;
+#X connect 3 5 12 0;
+#X connect 3 6 13 0;
+#X connect 3 7 14 0;
+#X connect 4 0 3 1;
+#X connect 4 1 7 0;
+#X connect 5 0 6 0;
+#X connect 7 0 1 0;
+#X connect 8 0 6 0;
+#X connect 9 0 6 0;
+#X connect 10 0 6 0;
+#X connect 11 0 6 0;
+#X connect 12 0 6 0;
+#X connect 13 0 6 0;
+#X connect 14 0 6 0;
+#X restore 126 220 pd playback;
+#X text 49 379 pvgrain~ tracks an input sound and outputs control data
+that can be used to play notes on a synthesizer or sampler.;
+#X msg 275 243 read -resize sound/Piano.aif pvgrain-pf;
+#X connect 0 0 19 0;
+#X connect 1 0 0 0;
+#X connect 1 0 7 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 2 0;
+#X connect 5 0 1 0;
+#X connect 7 0 9 0;
+#X connect 8 0 7 1;
+#X connect 9 0 10 0;
+#X connect 9 0 10 1;
+#X connect 11 0 12 0;
+#X connect 12 0 9 1;
+#X connect 15 0 21 0;
+#X connect 16 0 0 0;
+#X connect 19 0 9 0;
+#X connect 21 0 14 0;
diff --git a/externals/fftease/fftease32-helpfiles/pvharm~-help.pd b/externals/fftease/fftease32-helpfiles/pvharm~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..3797d55708a6261dfb1a459f7584dc5d81a708de
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/pvharm~-help.pd
@@ -0,0 +1,46 @@
+#N canvas 591 546 544 339 10;
+#X obj 156 165 pvharm~;
+#X obj 156 56 phasor~ 261;
+#X obj 156 83 -~ 0.5;
+#X floatatom 192 103 5 0 0 0 - pvharm-t1 -, f 5;
+#X floatatom 236 102 5 0 0 0 - pvharm-t2 -, f 5;
+#X obj 297 101 sig~ 0.001;
+#X obj 156 241 *~ 0.05;
+#X obj 156 272 dac~;
+#X obj 198 201 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 300 1;
+#X floatatom 195 221 5 0 0 0 - - -, f 5;
+#N canvas 1322 528 450 300 init 0;
+#X msg 104 131 \; pvharm-t1 1.5 \; pvharm-t2 1.25 \;;
+#X obj 104 89 loadbang;
+#X connect 1 0 0 0;
+#X restore 381 140 pd init;
+#X text 71 295 pvharm~ provides basic harmonizing with two transpositions
+of the input internally calculated and mixed to the output;
+#X obj 45 128 r pvharm-msgs;
+#N canvas 1163 594 556 345 control 0;
+#X obj 134 188 s pvharm-msgs;
+#X msg 119 132 lowfreq \$1;
+#X floatatom 115 79 5 0 0 0 - - -, f 5;
+#X floatatom 224 78 5 0 0 0 - - -, f 5;
+#X msg 228 131 highfreq \$1;
+#X msg 354 140 osclimit \$1;
+#X floatatom 370 90 5 0 0 0 - - -, f 5;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 4 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 5 0;
+#X restore 354 198 pd control;
+#X connect 0 0 6 0;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 1;
+#X connect 4 0 0 2;
+#X connect 5 0 0 3;
+#X connect 6 0 7 0;
+#X connect 6 0 7 1;
+#X connect 8 0 9 0;
+#X connect 9 0 6 1;
+#X connect 12 0 0 0;
diff --git a/externals/fftease/fftease32-helpfiles/pvoc~-help.pd b/externals/fftease/fftease32-helpfiles/pvoc~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..6f2b5f9661dff561dd7fbbbc8e1334c24e0e0992
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/pvoc~-help.pd
@@ -0,0 +1,44 @@
+#N canvas 935 286 642 545 10;
+#X obj 236 346 *~ 0.05;
+#X obj 295 132 sig~ 0.001;
+#X obj 237 403 dac~;
+#X floatatom 249 63 5 0 0 0 - - -, f 5;
+#X obj 249 85 sig~ 1.5;
+#X msg 105 233 mute \$1;
+#X obj 105 203 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X floatatom 295 110 5 0 0 0 - - -, f 5;
+#X msg 340 388 \; pd dsp \$1;
+#X obj 340 357 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 252 39 hsl 128 15 0.2 2 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 1500 1;
+#X obj 238 267 pvoc~ 2048;
+#X obj 278 306 hsl 128 15 0 1 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 275 326 5 0 0 0 - - -, f 5;
+#X obj 152 86 phasor~ 220;
+#X obj 152 111 -~ 0.5;
+#X msg 451 196 lowfreq \$1;
+#X floatatom 451 165 5 0 0 0 - - -, f 5;
+#X floatatom 529 170 5 0 0 0 - - -, f 5;
+#X msg 529 201 highfreq \$1;
+#X connect 0 0 2 0;
+#X connect 0 0 2 1;
+#X connect 1 0 11 2;
+#X connect 3 0 4 0;
+#X connect 4 0 11 1;
+#X connect 5 0 11 0;
+#X connect 6 0 5 0;
+#X connect 7 0 1 0;
+#X connect 9 0 8 0;
+#X connect 10 0 3 0;
+#X connect 11 0 0 0;
+#X connect 12 0 13 0;
+#X connect 13 0 0 1;
+#X connect 14 0 15 0;
+#X connect 15 0 11 0;
+#X connect 16 0 11 0;
+#X connect 17 0 16 0;
+#X connect 18 0 19 0;
+#X connect 19 0 11 0;
diff --git a/externals/fftease/fftease32-helpfiles/pvtuner~-help.pd b/externals/fftease/fftease32-helpfiles/pvtuner~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..95683637e979908e7c5e154e8a848d469cb2bb1c
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/pvtuner~-help.pd
@@ -0,0 +1,101 @@
+#N canvas 849 580 545 411 10;
+#X obj 93 109 r pvtuner-msgs;
+#N canvas 1344 734 450 300 control 0;
+#X obj 103 205 s pvtuner-msgs;
+#X msg 103 175 basefreq \$1;
+#X floatatom 103 143 5 0 0 0 - - -, f 5;
+#X msg 205 175 interpolation \$1;
+#X obj 205 148 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X obj 103 100 mtof;
+#X floatatom 103 62 5 21 64 0 - pvtuner-scalestp -, f 5;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
+#X connect 5 0 2 0;
+#X connect 6 0 5 0;
+#X restore 364 189 pd control;
+#X obj 150 150 sig~ 1;
+#X obj 287 146 sig~ 0;
+#X floatatom 287 120 5 0 1 0 - - -, f 5;
+#X obj 290 95 hsl 128 15 0 1 0 0 empty pvtuner-interslide empty -2
+-8 0 10 -262144 -1 -1 0 1;
+#X obj 56 58 noise~;
+#X obj 100 271 *~ 0.05;
+#X obj 100 302 dac~;
+#X obj 142 231 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 1000 1;
+#X floatatom 139 251 5 0 0 0 - - -, f 5;
+#X obj 200 151 sig~ 0.01;
+#N canvas 249 593 683 461 scales 0;
+#X obj 49 418 s pvtuner-msgs;
+#X msg 118 96 minor_seventh_chord;
+#X msg 130 128 diatonic;
+#X msg 62 54 eq12;
+#N canvas 0 22 450 300 werkmeisterIII 0;
+#X msg 134 125 32.625 36.4726 40.9036 43.4989 48.7835 54.5367 61.357
+65.25 72.9451 81.8072 86.9977 97.5671 109.073 122.714 130.5 145.89
+163.614 173.995 195.134 218.147 245.428 261 291.78 327.229 347.991
+390.268 436.294 490.856 522 583.561 654.458 695.982 780.537 872.588
+981.712 1044 1167.12 1308.92 1391.96 1561.07 1745.18 1963.42 2088 2334.24
+2617.83 2783.93 3122.15 3490.35 3926.85 4176 4668.49 5235.66 5567.86
+6244.29 6980.7 7853.7;
+#X obj 146 55 inlet;
+#X obj 69 246 outlet;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X restore 318 116 pd werkmeisterIII;
+#X msg 320 80 bang;
+#X msg 289 190 added_sixth_minor;
+#X msg 294 222 added_sixth_major;
+#X msg 101 65 major_seventh_chord;
+#X msg 300 255 pelog;
+#X msg 326 301 slendro;
+#X msg 315 280 pentaclust;
+#X msg 307 334 pentatonic;
+#X msg 377 390 quarterclust;
+#X msg 14 121 eq8;
+#X msg 10 171 eq5;
+#X msg 208 150 eqn 7;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 4 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 0 0;
+#X connect 10 0 0 0;
+#X connect 11 0 0 0;
+#X connect 12 0 0 0;
+#X connect 13 0 0 0;
+#X connect 14 0 0 0;
+#X connect 15 0 0 0;
+#X connect 16 0 0 0;
+#X restore 364 167 pd scales;
+#N canvas 739 94 450 300 init 0;
+#X obj 108 104 loadbang;
+#X msg 108 135 \; pvtuner-scalestp 21 \; pvtuner-interslide 1;
+#X connect 0 0 1 0;
+#X restore 364 211 pd init;
+#X text 44 342 pvtuner~ allows you to impose an arbitrary tuning scale
+on any input sound. Several scales are built into the object \, and
+you can provide arbitrary tunings with a sorted list of numbers representing
+Hz values.;
+#X text 188 57 Interpolate between scales \, when interpolation is
+on;
+#X obj 56 191 pvtuner~ 2048;
+#X connect 0 0 16 0;
+#X connect 2 0 16 1;
+#X connect 3 0 16 3;
+#X connect 4 0 3 0;
+#X connect 5 0 4 0;
+#X connect 6 0 16 0;
+#X connect 7 0 8 0;
+#X connect 7 0 8 1;
+#X connect 9 0 10 0;
+#X connect 10 0 7 1;
+#X connect 11 0 16 2;
+#X connect 16 0 7 0;
diff --git a/externals/fftease/fftease32-helpfiles/pvwarpb~-help.pd b/externals/fftease/fftease32-helpfiles/pvwarpb~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..04f9f85abb91444d9a7b6cb9bf4faf6fe202578d
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/pvwarpb~-help.pd
@@ -0,0 +1,105 @@
+#N canvas 888 460 692 533 10;
+#N canvas 495 165 450 278 (subpatch) 0;
+#X array pvwarpb-array 512 float 3;
+#A 0 0.203754 0.219606 0.235459 0.251311 0.267164 0.283017 0.298869
+0.314722 0.330575 0.346427 0.36228 0.378132 0.393985 0.409838 0.42569
+0.441543 0.457395 0.473248 0.489101 0.504953 0.520806 0.536658 0.552511
+0.568364 0.584216 0.600069 0.615921 0.631774 0.647627 0.663479 0.679332
+0.695185 0.711037 0.72689 0.742742 0.758595 0.774448 0.77349 0.772532
+0.771575 0.770617 0.769659 0.768702 0.767744 0.766786 0.765829 0.764871
+0.763914 0.762956 0.761998 0.761041 0.760083 0.759125 0.758168 0.75721
+0.756252 0.755295 0.754337 0.753379 0.752422 0.751464 0.750507 0.749549
+0.748591 0.747634 0.746676 0.745718 0.744761 0.743803 0.742845 0.741888
+0.74093 0.739973 0.739015 0.738057 0.7371 0.736142 0.735184 0.734227
+0.733269 0.732311 0.731354 0.730396 0.729438 0.728481 0.727523 0.726566
+0.728633 0.7307 0.732768 0.734835 0.736903 0.73897 0.741038 0.743105
+0.745172 0.74724 0.749307 0.751375 0.753442 0.755509 0.757577 0.759644
+0.761712 0.763779 0.765847 0.767914 0.769982 0.772049 0.774116 0.776184
+0.778251 0.780319 0.782386 0.784454 0.786521 0.788588 0.790656 0.792723
+0.794791 0.796858 0.798926 0.800993 0.80306 0.805128 0.807195 0.809263
+0.81133 0.813397 0.815465 0.817532 0.8196 0.821667 0.823735 0.825802
+0.827869 0.829937 0.832004 0.834072 0.836139 0.838207 0.840274 0.849787
+0.8593 0.868814 0.878327 0.88784 0.897354 0.906867 0.91638 0.925893
+0.935406 0.94492 0.954433 0.963946 0.973459 0.982973 0.992486 1.002
+1.01151 1.02103 1.03054 1.04005 1.04957 1.05908 1.06859 1.07811 1.08762
+1.09713 1.10664 1.11616 1.12567 1.13518 1.1447 1.15421 1.16372 1.17324
+1.18275 1.19226 1.20178 1.21129 1.2208 1.23032 1.23983 1.24934 1.25886
+1.26837 1.27788 1.2874 1.29691 1.30642 1.31594 1.31048 1.30503 1.29957
+1.29412 1.28866 1.28321 1.27775 1.2723 1.26685 1.26139 1.25594 1.25048
+1.24503 1.23957 1.23412 1.22866 1.22321 1.21775 1.2123 1.20685 1.20139
+1.19594 1.19048 1.18503 1.17957 1.17412 1.16866 1.16321 1.15775 1.1523
+1.14685 1.14139 1.13594 1.13048 1.12503 1.11957 1.11412 1.10866 1.10321
+1.09775 1.0923 1.08685 1.08139 1.07594 1.07048 1.06503 1.05957 1.05412
+1.04866 1.04321 1.03775 1.0323 1.02685 1.02139 1.01594 1.01048 1.00503
+0.999573 0.994118 0.988664 0.983209 0.977755 0.9723 0.966846 0.974203
+0.981559 0.988916 0.996273 1.00363 1.01099 1.01834 1.0257 1.03306 1.04041
+1.04777 1.05513 1.06248 1.06984 1.0772 1.08455 1.09191 1.09927 1.10663
+1.11398 1.12134 1.1287 1.13605 1.14341 1.15077 1.15812 1.16548 1.17284
+1.18019 1.18755 1.19491 1.20226 1.20962 1.21698 1.22433 1.23169 1.23905
+1.2464 1.25376 1.26112 1.26848 1.27583 1.28319 1.29055 1.2979 1.30526
+1.31262 1.31997 1.32733 1.33469 1.34204 1.3494 1.35676 1.36411 1.37147
+1.37883 1.38618 1.39354 1.4009 1.40825 1.41561 1.42297 1.43033 1.43768
+1.44504 1.4524 1.43825 1.42411 1.40997 1.39583 1.38169 1.36754 1.3534
+1.33926 1.32512 1.31098 1.29684 1.28269 1.26855 1.25441 1.24027 1.22613
+1.21198 1.19784 1.1837 1.16956 1.15542 1.14128 1.12713 1.11299 1.09885
+1.08471 1.07057 1.05642 1.04228 1.02814 1.02761 1.02707 1.02654 1.02601
+1.02547 1.02494 1.02441 1.02387 1.02334 1.02281 1.02227 1.02174 1.02121
+1.02068 1.02014 1.01961 1.01908 1.01854 1.01801 1.01748 1.01694 1.01641
+1.01588 1.01534 1.01481 1.01428 1.01374 1.01321 1.01268 1.01214 1.01161
+1.01108 1.01054 1.01001 1.00948 1.00894 1.00841 1.00788 1.00734 1.00681
+1.00628 1.00574 1.00521 1.00468 1.00414 1.00361 1.00308 1.00255 1.00201
+1.00148 1.00095 1.00041 0.999879 0.999346 0.998812 0.998279 0.997746
+0.997213 0.99668 0.996146 0.995613 0.99508 0.994547 0.994013 0.99348
+0.992947 0.992414 0.99188 0.991347 0.990814 0.990281 0.989748 0.989214
+0.988681 0.988148 0.987615 0.987081 0.986548 0.986015 0.985482 0.984948
+0.984415 0.983882 0.983349 0.982816 0.982282 0.981749 0.981216 0.980682
+0.980149 0.979616 0.979083 0.97855 0.978016 0.977483 0.97695 0.976417
+0.975883 0.97535 0.974817 0.974284 0.973751 0.973217 0.972684 0.972151
+0.971618 0.971084 0.970551 0.970018 0.969485 0.968951 0.95575 0.942548
+0.929346 0.916144 0.902942 0.88974 0.876538 0.863336 0.850134 0.836932
+0.82373 0.810529 0.797327 0.784125 0.770923 0.757721 0.744519 0.731317
+0.718115 0.704913 0.691711 0.67851 0.665308 0.652106 0.638904 0.625702
+0.6125 0.599298 0.586096 0.572894 0.559692 0.54649 0.533289 0.520087
+0.506885 0.493683 0.480481 0.467279 0.454077 0.440875 0.427673 0.414471
+0.401269 0.388068 0.374866 0.361664 0.348462 0.33526 0.322058;
+#X coords 0 2 511 0 200 140 1 0 0;
+#X restore 300 285 graph;
+#X obj 55 234 pvwarpb~ pvwarpb-array, f 72;
+#X obj 486 199 sig~ 0.0001;
+#X obj 55 329 *~ 0.05;
+#X obj 55 360 dac~;
+#X obj 97 289 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 4000 1;
+#X floatatom 94 309 5 0 0 0 - - -, f 5;
+#X obj 55 161 readsf~;
+#X obj 55 105 openpanel;
+#X msg 55 130 open \$1;
+#X msg 55 78 bang;
+#X msg 123 130 1;
+#X text 91 82 load sf;
+#X msg 201 158 autofunc 0.2 1.7;
+#X obj 436 190 sig~ 1;
+#X floatatom 386 150 5 0 0 0 - - -, f 5;
+#X obj 389 115 hsl 128 15 0 1 0 0 empty empty function-read-offset
+-2 -8 0 10 -262144 -1 -1 0 1;
+#X obj 439 149 hsl 128 15 0.2 2 0 0 empty empty transposition -2 -8
+0 10 -262144 -1 -1 3500 1;
+#X text 42 446 Spectrum warper. An internal frequency warping function
+is created either with the autofunc message. Try it on vocal sounds.
+In this version \, the warp function is read from a Pd array;
+#X connect 1 0 3 0;
+#X connect 2 0 1 3;
+#X connect 3 0 4 0;
+#X connect 3 0 4 1;
+#X connect 5 0 6 0;
+#X connect 6 0 3 1;
+#X connect 7 0 1 0;
+#X connect 8 0 9 0;
+#X connect 9 0 7 0;
+#X connect 10 0 8 0;
+#X connect 11 0 7 0;
+#X connect 13 0 1 0;
+#X connect 14 0 1 2;
+#X connect 15 0 1 1;
+#X connect 16 0 15 0;
+#X connect 17 0 14 0;
diff --git a/externals/fftease/fftease32-helpfiles/pvwarp~-help.pd b/externals/fftease/fftease32-helpfiles/pvwarp~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..dccf1dfc2499340cad9db6b4670e1344e22acd61
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/pvwarp~-help.pd
@@ -0,0 +1,68 @@
+#N canvas 891 601 544 383 10;
+#X obj 34 179 pvwarp~, f 63;
+#X obj 34 140 readsf~;
+#X obj 34 84 openpanel;
+#X msg 34 109 open \$1;
+#X msg 34 57 bang;
+#X msg 102 109 1;
+#X text 70 61 load sf;
+#X obj 34 264 *~ 0.05;
+#X obj 34 295 dac~;
+#X obj 76 224 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 73 244 5 0 0 0 - - -, f 5;
+#X obj 379 117 sig~ 0.0001;
+#X floatatom 367 97 5 0 0 0 - - -, f 5;
+#X floatatom 318 124 5 0 0 0 - - -, f 5;
+#X msg 177 86 autofunc 0.1 2;
+#N canvas 946 176 450 300 a-lump 0;
+#X obj 85 206 outlet;
+#X obj 85 172 pack f f f;
+#X floatatom 175 93 5 0 0 0 - - -, f 5;
+#X obj 175 114 t b f;
+#X floatatom 123 88 5 0 0 0 - - -, f 5;
+#X obj 123 109 t b f;
+#X floatatom 62 87 5 0 0 0 - - -, f 5;
+#X msg 61 29 667 0.45 0.25;
+#X obj 62 54 unpack f f f;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 3 1 1 2;
+#X connect 4 0 5 0;
+#X connect 5 0 1 0;
+#X connect 5 1 1 1;
+#X connect 6 0 1 0;
+#X connect 7 0 8 0;
+#X connect 8 0 6 0;
+#X connect 8 1 4 0;
+#X connect 8 2 2 0;
+#X restore 166 121 pd a-lump;
+#X obj 166 143 unpack f f f;
+#X obj 370 63 hsl 128 15 0.25 2 0 0 empty empty Transposition -2 -8
+0 10 -262144 -1 -1 0 1;
+#X obj 279 29 hsl 128 15 0 1 0 0 empty empty function-read-offset -2
+-8 0 10 -262144 -1 -1 0 1;
+#X text 32 327 Spectrum warper. An internal frequency warping function
+is created either according to specification or with the autofunc message.
+Try it on vocal sounds.;
+#X connect 0 0 7 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 2 0;
+#X connect 5 0 1 0;
+#X connect 7 0 8 0;
+#X connect 7 0 8 1;
+#X connect 9 0 10 0;
+#X connect 10 0 7 1;
+#X connect 11 0 0 9;
+#X connect 12 0 0 8;
+#X connect 13 0 0 7;
+#X connect 14 0 0 0;
+#X connect 15 0 16 0;
+#X connect 16 0 0 1;
+#X connect 16 1 0 2;
+#X connect 16 2 0 3;
+#X connect 17 0 12 0;
+#X connect 18 0 13 0;
diff --git a/externals/fftease/fftease32-helpfiles/reanimator~-help.pd b/externals/fftease/fftease32-helpfiles/reanimator~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..3eb956f3d89b67a154b4150d2f9509637eea27ba
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/reanimator~-help.pd
@@ -0,0 +1,76 @@
+#N canvas 892 417 468 461 10;
+#X obj 148 169 reanimator~ 2000;
+#X obj 148 104 readsf~;
+#X obj 148 48 openpanel;
+#X msg 148 73 open \$1;
+#X msg 148 21 bang;
+#X msg 216 73 1;
+#X text 184 25 load driver sf;
+#X obj 287 111 readsf~;
+#X obj 287 55 openpanel;
+#X msg 287 80 open \$1;
+#X msg 287 28 bang;
+#X text 323 32 load texture sf;
+#X obj 148 324 *~ 0.05;
+#X obj 148 355 dac~;
+#X obj 190 284 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 187 304 5 0 0 0 - - -, f 5;
+#X floatatom 274 232 5 0 0 0 - - -, f 5;
+#X floatatom 183 232 5 0 0 0 - - -, f 5;
+#N canvas 404 737 450 300 showframe 0;
+#X obj 205 102 inlet~;
+#X obj 205 159 snapshot~;
+#X obj 325 121 metro 50;
+#X obj 325 89 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X obj 325 22 loadbang;
+#X msg 325 57 1;
+#X obj 205 225 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 6 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 5 0;
+#X connect 5 0 3 0;
+#X restore 183 208 pd showframe;
+#X msg 37 122 analyze;
+#X text 26 385 reanimator~ first analyzes a "texture" sound \, and
+then resynthesizes a "driver" sound by finding the spectral frame in
+the texture sound that is closest to the current driver frame.;
+#N canvas 404 737 450 300 show-analysis-progress 0;
+#X obj 205 102 inlet~;
+#X obj 205 159 snapshot~;
+#X obj 325 121 metro 50;
+#X obj 325 89 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X obj 325 22 loadbang;
+#X msg 325 57 1;
+#X obj 205 225 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 6 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 5 0;
+#X connect 5 0 3 0;
+#X restore 274 208 pd show-analysis-progress;
+#X connect 0 0 12 0;
+#X connect 0 1 18 0;
+#X connect 0 2 21 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 2 0;
+#X connect 5 0 1 0;
+#X connect 5 0 7 0;
+#X connect 7 0 0 1;
+#X connect 8 0 9 0;
+#X connect 9 0 7 0;
+#X connect 10 0 8 0;
+#X connect 12 0 13 0;
+#X connect 12 0 13 1;
+#X connect 14 0 15 0;
+#X connect 15 0 12 1;
+#X connect 18 0 17 0;
+#X connect 19 0 0 0;
+#X connect 21 0 16 0;
diff --git a/externals/fftease/fftease32-helpfiles/resent~-help.pd b/externals/fftease/fftease32-helpfiles/resent~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..23b35bc9b0ace52f68dac32a4ffa2ee6d98de387
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/resent~-help.pd
@@ -0,0 +1,129 @@
+#N canvas 932 503 426 468 10;
+#X obj 162 102 readsf~;
+#X obj 162 46 openpanel;
+#X msg 162 71 open \$1;
+#X msg 162 19 bang;
+#X msg 230 71 1;
+#X text 198 23 load sf;
+#X obj 162 149 resent~ 6000;
+#N canvas 404 737 450 300 showsync 0;
+#X obj 205 102 inlet~;
+#X obj 205 159 snapshot~;
+#X obj 325 121 metro 50;
+#X obj 325 89 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X obj 325 22 loadbang;
+#X msg 325 57 1;
+#X obj 205 225 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 6 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 5 0;
+#X connect 5 0 3 0;
+#X restore 239 178 pd showsync;
+#X floatatom 239 203 5 0 0 0 - - -, f 5;
+#X obj 162 296 *~ 0.05;
+#X obj 162 327 dac~;
+#X obj 204 256 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 201 276 5 0 0 0 - - -, f 5;
+#X msg 24 42 acquire_sample;
+#X obj 26 119 r resent-msgs;
+#N canvas 1044 90 450 300 speed-and-phase 0;
+#X obj 124 236 s resent-msgs;
+#X msg 23 139 setspeed \$1;
+#X floatatom 23 113 5 0 0 0 - - -, f 5;
+#X obj 26 84 hsl 128 15 -2 2 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X msg 267 189 addphase \$1;
+#X floatatom 267 167 5 0 0 0 - - -, f 5;
+#X obj 270 138 hsl 128 15 0 1 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 122 168 5 0 0 0 - - -, f 5;
+#X obj 125 139 hsl 128 15 0 1 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X msg 122 190 setphase \$1;
+#X msg 234 81 setspeed_and_phase \$1 \$2;
+#X msg 237 31 1 0;
+#X msg 278 32 0 0;
+#X msg 324 31 -1 1;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 0 0;
+#X connect 5 0 4 0;
+#X connect 6 0 5 0;
+#X connect 7 0 9 0;
+#X connect 8 0 7 0;
+#X connect 9 0 0 0;
+#X connect 10 0 0 0;
+#X connect 11 0 10 0;
+#X connect 12 0 10 0;
+#X connect 13 0 10 0;
+#X restore 242 322 pd speed-and-phase;
+#N canvas 133 590 450 300 oscbank 0;
+#X obj 124 236 s resent-msgs;
+#X msg 103 144 oscbank \$1;
+#X obj 103 96 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X msg 190 140 transpose \$1;
+#X floatatom 192 110 5 0 0 0 - - -, f 5;
+#X obj 197 66 hsl 128 15 0.1 2 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X msg 312 184 synthresh \$1;
+#X msg 309 145 0.001;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 0;
+#X connect 6 0 0 0;
+#X connect 7 0 6 0;
+#X restore 241 351 pd oscbank;
+#N canvas 775 566 719 379 individual-bin-control 0;
+#X obj 34 343 s resent-msgs;
+#X msg 115 152 linespeed 0 -1 511 1;
+#X msg 183 184 randspeed 0.5 0.9;
+#X msg 245 217 randphase 0 1;
+#X msg 340 311 setspeed_and_phase \$1 \$2;
+#X msg 340 278 0 0;
+#X text 369 274 first freeze sound to hear effects;
+#X msg 32 174 bin \$1 \$2;
+#X obj 32 126 pack f f;
+#X floatatom 87 69 5 0 0 0 - - -, f 5;
+#X floatatom 26 44 5 0 511 0 - - -, f 5;
+#X text 128 69 speed;
+#X text 70 47 bin number;
+#X text 108 119 terminal value limited by FFT size / 2;
+#X text 255 151 linear distribution of speeds. (we assume here an FFT
+size of 1024.);
+#X text 310 183 likewise for phase;
+#X text 339 217 randomly set all speeds within min/max parameters;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 4 0;
+#X connect 7 0 0 0;
+#X connect 8 0 7 0;
+#X connect 9 0 8 1;
+#X connect 10 0 8 0;
+#X restore 242 294 pd individual-bin-control;
+#X text 28 394 resent~ follows the model of residency~ but allows independent
+control over each bin. It is recommended that you familiarize yourself
+with residency~ before working with the more complicated resent~;
+#X connect 0 0 6 0;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 3 0 1 0;
+#X connect 4 0 0 0;
+#X connect 6 0 9 0;
+#X connect 6 1 7 0;
+#X connect 7 0 8 0;
+#X connect 9 0 10 0;
+#X connect 9 0 10 1;
+#X connect 11 0 12 0;
+#X connect 12 0 9 1;
+#X connect 13 0 6 0;
+#X connect 14 0 6 0;
diff --git a/externals/fftease/fftease32-helpfiles/residency_buffer~-help.pd b/externals/fftease/fftease32-helpfiles/residency_buffer~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..37f5a18448444e3b5a3caa325f89a2f75b44e9e9
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/residency_buffer~-help.pd
@@ -0,0 +1,76 @@
+#N canvas 771 474 726 482 10;
+#N canvas 0 22 450 278 (subpatch) 0;
+#X array analysis-array1 1.76744e+06 float 2;
+#X coords 0 32767 1.76744e+06 -32768 200 140 1 0 0;
+#X restore 456 47 graph;
+#X obj 88 148 residency_buffer~ analysis-array1;
+#X obj 88 119 readsf~;
+#X obj 88 63 openpanel;
+#X msg 88 88 open \$1;
+#X msg 88 36 bang;
+#X msg 156 88 1;
+#X text 124 40 load sf;
+#X obj 89 260 *~ 0.05;
+#X obj 89 291 dac~;
+#X obj 131 220 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 128 240 5 0 0 0 - - -, f 5;
+#X floatatom 204 71 5 0 0 0 - - -, f 5;
+#X floatatom 272 73 5 0 0 0 - - -, f 5;
+#X obj 274 29 hsl 128 15 0 1 0 0 empty empty position -2 -8 0 10 -262144
+-1 -1 8900 1;
+#X msg 5 117 calcbuf 5000;
+#X msg 273 216 set \$1;
+#X msg 273 242 1.76745e+06;
+#N canvas 404 737 450 300 showsync 0;
+#X obj 205 102 inlet~;
+#X obj 205 159 snapshot~;
+#X obj 325 121 metro 50;
+#X obj 325 89 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X obj 325 22 loadbang;
+#X msg 325 57 1;
+#X obj 205 225 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 6 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 5 0;
+#X connect 5 0 3 0;
+#X restore 220 269 pd showsync;
+#X floatatom 220 294 5 0 0 0 - - -, f 5;
+#X obj 200 112 sig~ 0;
+#X obj 276 108 sig~ 0;
+#X msg 11 12 acquire_sample;
+#X text 458 191 warning: do not write into this array \, as you will
+create extremely loud glitches if you do so.;
+#X text 46 349 residency_buffer~ is like residency~ except that it
+uses a Pd array rather than an internal buffer. This makes it more
+complicated to work with \, but potentially more efficient than residency~.
+Any number of units may access the same array (or different ones).
+The array name is the obbligatory first argument. Do NOT attempt to
+play the recorded buffer with tabread~ or other time-domain audio objects
+unless you have some idea of what you are doing (and turn the volume
+way down before attempting this).;
+#X text 353 243 required array size;
+#X connect 1 0 8 0;
+#X connect 1 1 18 0;
+#X connect 1 2 16 0;
+#X connect 2 0 1 0;
+#X connect 3 0 4 0;
+#X connect 4 0 2 0;
+#X connect 5 0 3 0;
+#X connect 6 0 2 0;
+#X connect 8 0 9 0;
+#X connect 8 0 9 1;
+#X connect 10 0 11 0;
+#X connect 11 0 8 1;
+#X connect 12 0 20 0;
+#X connect 13 0 21 0;
+#X connect 14 0 13 0;
+#X connect 15 0 1 0;
+#X connect 16 0 17 0;
+#X connect 18 0 19 0;
+#X connect 20 0 1 1;
+#X connect 21 0 1 2;
+#X connect 22 0 1 0;
diff --git a/externals/fftease/fftease32-helpfiles/residency~-help.pd b/externals/fftease/fftease32-helpfiles/residency~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..bdfc8e0b22a4463f69fc535ce9bb3b8fdbd9b7f9
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/residency~-help.pd
@@ -0,0 +1,62 @@
+#N canvas 759 530 540 383 10;
+#X obj 109 147 residency~ 5000;
+#X obj 109 114 readsf~;
+#X obj 109 56 openpanel;
+#X msg 109 81 open \$1;
+#X msg 109 29 bang;
+#X msg 177 81 1;
+#X text 145 33 load sf;
+#X obj 109 239 *~ 0.05;
+#X obj 109 270 dac~;
+#X obj 151 199 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 12700 1;
+#X floatatom 148 219 5 0 0 0 - - -, f 5;
+#N canvas 404 737 450 300 showsync 0;
+#X obj 205 102 inlet~;
+#X obj 205 159 snapshot~;
+#X obj 325 121 metro 50;
+#X obj 325 89 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X obj 325 22 loadbang;
+#X msg 325 57 1;
+#X obj 205 225 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 6 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 5 0;
+#X connect 5 0 3 0;
+#X restore 346 212 pd showsync;
+#X floatatom 346 237 5 0 0 0 - - -, f 5;
+#X floatatom 233 105 5 0 0 0 - - -, f 5;
+#X floatatom 359 110 5 0 0 0 - - -, f 5;
+#X msg 276 39 0 0;
+#X obj 276 64 unpack f f;
+#X msg 13 59 acquire_sample;
+#X obj 364 54 hsl 128 15 0 1 0 0 empty empty position -2 -8 0 10 -262144
+-1 -1 2200 1;
+#X obj 276 10 loadbang;
+#X text 274 105 speed;
+#X text 108 306 residency~ samples input to an internal buffer \, after
+which the sound can be resynthesized with arbitrary speed and pitch.
+;
+#X connect 0 0 7 0;
+#X connect 0 1 11 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 2 0;
+#X connect 5 0 1 0;
+#X connect 7 0 8 0;
+#X connect 7 0 8 1;
+#X connect 9 0 10 0;
+#X connect 10 0 7 1;
+#X connect 11 0 12 0;
+#X connect 13 0 0 1;
+#X connect 14 0 0 2;
+#X connect 15 0 16 0;
+#X connect 16 0 13 0;
+#X connect 16 1 14 0;
+#X connect 17 0 0 0;
+#X connect 18 0 14 0;
+#X connect 19 0 15 0;
diff --git a/externals/fftease/fftease32-helpfiles/schmear~-help.pd b/externals/fftease/fftease32-helpfiles/schmear~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..f29dac22ed06b349748cf836b627f54a7062e3e4
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/schmear~-help.pd
@@ -0,0 +1,68 @@
+#N canvas 663 510 451 371 10;
+#X obj 152 146 schmear~;
+#X obj 152 234 *~ 0.05;
+#X obj 152 265 dac~;
+#X obj 194 194 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 191 214 5 0 0 0 - - -, f 5;
+#X obj 40 116 r schmear-msgs;
+#X obj 152 98 osc~ 140;
+#N canvas 1092 277 472 423 vibrato 0;
+#X obj 110 127 osc~ 0.3;
+#X obj 110 173 *~ 50;
+#X obj 109 214 +~ 100;
+#X obj 109 261 *~;
+#X obj 229 71 inlet;
+#X obj 106 340 outlet~;
+#X obj 107 303 +~ 140;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 6 0;
+#X connect 4 0 3 1;
+#X connect 6 0 5 0;
+#X restore 101 54 pd vibrato;
+#X obj 101 21 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#N canvas 1290 542 450 300 impulses 0;
+#X msg 27 90 schmimp 1;
+#X msg 36 121 schmimp 0 0 0 0 0 0 0.25 0 0 1 1 1 1;
+#X msg 46 146 schmimp 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.001 0 1 0
+0 1 0 0 0 1;
+#X msg 63 184 schmimp 0 0 0 0 0 0 0 0 0 0 1 0.1 0 1 0.1 0 0.1 1 0.1
+0 0;
+#X obj 41 247 s schmear-msgs;
+#X text 92 92 no smear;
+#X text 227 105 a few different kernels:;
+#X connect 0 0 4 0;
+#X connect 1 0 4 0;
+#X connect 2 0 4 0;
+#X connect 3 0 4 0;
+#X restore 276 91 pd impulses;
+#N canvas 1159 204 450 300 control 0;
+#X obj 49 185 s schmear-msgs;
+#X msg 51 135 threshold \$1;
+#X floatatom 49 98 5 0 0 0 - - -, f 5;
+#X obj 56 67 hsl 128 15 0 1 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X msg 248 138 shift \$1;
+#X floatatom 249 109 5 0 511 0 - - -, f 5;
+#X text 246 84 shift bin energy upward;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 0 0;
+#X connect 5 0 4 0;
+#X restore 276 116 pd control;
+#X text 51 290 schmear~ convolves the amplitude spectrum with a user-supplied
+impulse response \, thus smearing the spectrum \, for those times when
+you need a New York moment.;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 1 0 2 1;
+#X connect 3 0 4 0;
+#X connect 4 0 1 1;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 7 0 6 0;
+#X connect 8 0 7 0;
diff --git a/externals/fftease/fftease32-helpfiles/scrape~-help.pd b/externals/fftease/fftease32-helpfiles/scrape~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..8e4dbfe9358ebb928ffe551d1ba743232aaea400
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/scrape~-help.pd
@@ -0,0 +1,46 @@
+#N canvas 764 423 510 389 10;
+#X obj 50 150 scrape~, f 33;
+#X obj 50 110 readsf~;
+#X obj 50 54 openpanel;
+#X msg 50 79 open \$1;
+#X msg 50 27 bang;
+#X text 86 31 load sf;
+#X obj 50 227 *~ 0.05;
+#X obj 50 258 dac~;
+#X obj 92 187 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 89 207 5 0 0 0 - - -, f 5;
+#X floatatom 284 19 5 0 0 1 knee scrape-knee -, f 5;
+#X floatatom 285 39 5 0 0 1 cutoff scrape-cutoff -, f 5;
+#X floatatom 284 62 5 0 0 1 thresh1 scrape-t1 -, f 5;
+#X floatatom 285 82 5 0 0 1 thresh2 scrape-t2 -, f 5;
+#X floatatom 285 104 5 0 0 1 weak-bin-multiplier scrape-wbm -, f 5
+;
+#N canvas 1271 554 450 300 init 0;
+#X msg 72 99 \; scrape-knee 1000 \; scrape-cutoff 4000 \; scrape-t1
+0.001 \; scrape-t2 0.05 \; scrape-wbm 0.1;
+#X obj 72 65 loadbang;
+#X connect 1 0 0 0;
+#X restore 284 147 pd init;
+#X text 39 280 scrape~ is like drown~ except that it only operates
+between the frequencies specified by knee and cutoff to the Nyquist.
+Between knee and cutoff is a transition range to gradually increase
+the noise reduction. This is good if you just want to scrape some noise
+off the upper frequency range without affecting lower parts of the
+spectrum (much).;
+#X msg 118 79 1;
+#X connect 0 0 6 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 2 0;
+#X connect 6 0 7 0;
+#X connect 6 0 7 1;
+#X connect 8 0 9 0;
+#X connect 9 0 6 1;
+#X connect 10 0 0 1;
+#X connect 11 0 0 2;
+#X connect 12 0 0 3;
+#X connect 13 0 0 4;
+#X connect 14 0 0 5;
+#X connect 17 0 1 0;
diff --git a/externals/fftease/fftease32-helpfiles/shapee~-help.pd b/externals/fftease/fftease32-helpfiles/shapee~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c8cf340616f38a3d4eebc4cc5a96b99a67f5550e
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/shapee~-help.pd
@@ -0,0 +1,38 @@
+#N canvas 736 486 451 368 10;
+#X obj 27 107 readsf~;
+#X obj 27 51 openpanel;
+#X msg 27 76 open \$1;
+#X msg 27 24 bang;
+#X msg 95 76 1;
+#X obj 187 110 readsf~;
+#X obj 187 54 openpanel;
+#X msg 187 79 open \$1;
+#X msg 187 27 bang;
+#X text 63 28 load frequency sf;
+#X text 223 31 load formant sf;
+#X floatatom 355 113 5 1 511 2 shape-width - -, f 5;
+#X obj 27 247 *~ 0.05;
+#X obj 27 278 dac~;
+#X obj 69 207 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 66 227 5 0 0 0 - - -, f 5;
+#X obj 27 167 shapee~;
+#X text 23 308 shapee~ shapes the frequency evolution of one signal
+with that of another. The shape width controls the amount of the frequency
+shaping effect.;
+#X connect 0 0 16 0;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 3 0 1 0;
+#X connect 4 0 0 0;
+#X connect 4 0 5 0;
+#X connect 5 0 16 1;
+#X connect 6 0 7 0;
+#X connect 7 0 5 0;
+#X connect 8 0 6 0;
+#X connect 11 0 16 2;
+#X connect 12 0 13 0;
+#X connect 12 0 13 1;
+#X connect 14 0 15 0;
+#X connect 15 0 12 1;
+#X connect 16 0 12 0;
diff --git a/externals/fftease/fftease32-helpfiles/smap-help.pd b/externals/fftease/fftease32-helpfiles/smap-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..37a53b9e2f6c78e44da1b03677df7fe4a645739b
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/smap-help.pd
@@ -0,0 +1,9 @@
+#N canvas 246 169 450 300 10;
+#X obj 141 163 smap 0 4;
+#X obj 144 113 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 141 195 5 0 0 0 - - -;
+#X text 49 56 remap a 0-127 MIDI input range to the output range specified
+in the arguments;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
diff --git a/externals/fftease/fftease32-helpfiles/sound/Piano.aif b/externals/fftease/fftease32-helpfiles/sound/Piano.aif
new file mode 100644
index 0000000000000000000000000000000000000000..837dbc6350a4e8b63b4794fa09d45d8b991a0e85
Binary files /dev/null and b/externals/fftease/fftease32-helpfiles/sound/Piano.aif differ
diff --git a/externals/fftease/fftease32-helpfiles/swinger~-help.pd b/externals/fftease/fftease32-helpfiles/swinger~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..9b909cf9f5a84f94d3612629754fd24fbeba6f15
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/swinger~-help.pd
@@ -0,0 +1,37 @@
+#N canvas 803 561 465 402 10;
+#X obj 113 188 swinger~;
+#X obj 55 119 readsf~;
+#X obj 55 63 openpanel;
+#X msg 55 88 open \$1;
+#X msg 55 36 bang;
+#X msg 123 88 1;
+#X obj 222 120 readsf~;
+#X obj 222 64 openpanel;
+#X msg 222 89 open \$1;
+#X msg 222 37 bang;
+#X text 91 40 load amplitude sf;
+#X text 258 41 load phase sf;
+#X obj 156 241 *~ 0.05;
+#X obj 156 272 dac~;
+#X obj 198 201 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 8300 1;
+#X floatatom 195 221 5 0 0 0 - - -, f 5;
+#X text 48 309 swinger~ replaces the phases of one signal (left) with
+those from another (right). The result often sounds like victory. A
+swinging trick: Don't connect any signal to the right inlet and listen
+to the result.;
+#X connect 0 0 12 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 2 0;
+#X connect 5 0 1 0;
+#X connect 5 0 6 0;
+#X connect 6 0 0 1;
+#X connect 7 0 8 0;
+#X connect 8 0 6 0;
+#X connect 9 0 7 0;
+#X connect 12 0 13 0;
+#X connect 12 0 13 1;
+#X connect 14 0 15 0;
+#X connect 15 0 12 1;
diff --git a/externals/fftease/fftease32-helpfiles/taint~-help.pd b/externals/fftease/fftease32-helpfiles/taint~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..49c9a88c46eba13deda49f9b9e5ff3a1a0f09f34
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/taint~-help.pd
@@ -0,0 +1,82 @@
+#N canvas 638 328 720 564 10;
+#X obj 153 253 taint~, f 18;
+#X obj 301 112 expr pow(10 \, $f1/20);
+#X floatatom 301 55 5 -180 0 0 - taint-invthresh -, f 5;
+#X floatatom 230 201 5 0 0 0 - taint-scaleexp -, f 5;
+#X obj 38 105 readsf~;
+#X obj 38 49 openpanel;
+#X msg 38 74 open \$1;
+#X msg 38 22 bang;
+#X msg 106 74 1;
+#X text 74 26 load sf;
+#X obj 156 105 readsf~;
+#X obj 156 49 openpanel;
+#X msg 156 74 open \$1;
+#X msg 156 22 bang;
+#X text 192 26 load sf;
+#X obj 161 334 *~ 0.05;
+#X obj 161 365 dac~;
+#X obj 203 294 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 3900 1;
+#X floatatom 200 314 5 0 0 0 - - -, f 5;
+#X text 28 404 taint~ multiplies the spectra of two input signals.
+Multiplication of spectra can cause significant drops in the amplitude
+of the output signal. The inverse option allows division of the input
+spectra. Division requires the use of a threshold to avert division
+by zero. Also \, signal division will cause massive amplitude gains.
+Be careful of your ears and equipment. Start the amplitude very low
+(-100dB) and slowly work up to an acceptable level. A pad is provided
+to balance gain between normal and invert options.;
+#X obj 24 197 r taint-msgs;
+#N canvas 1384 608 450 300 control 0;
+#X obj 115 206 s taint-msgs;
+#X floatatom 114 54 5 0 0 0 - taint-pad -, f 5;
+#X obj 114 77 expr pow(10 \, $f1/20);
+#X floatatom 114 99 5 0 0 0 - - -, f 5;
+#X msg 114 118 pad \$1;
+#X msg 287 146 invert \$1;
+#X obj 287 113 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X text 21 11 this pad only affects the gain when "invert" is turned
+on thus it may be used to balance levels between the two states of
+taint~;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 5 0;
+#X restore 257 337 pd control;
+#N canvas 0 22 450 300 init 1;
+#X obj 185 126 loadbang;
+#X msg 182 165 \; taint-pad -36 \; taint-scaleexp 0.2 \; taint-invthresh
+-40;
+#X connect 0 0 1 0;
+#X restore 258 362 pd init;
+#X text 339 50 inverse threshold (lower values intensify effect but
+only when "invert" is turned on);
+#X text 278 202 scaling exponent (lower values increase amplitude)
+;
+#X obj 492 289 hsl 128 15 0.05 1 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 1200 1;
+#X obj 489 309 s taint-scaleexp;
+#X connect 0 0 15 0;
+#X connect 1 0 0 3;
+#X connect 2 0 1 0;
+#X connect 3 0 0 2;
+#X connect 4 0 0 0;
+#X connect 5 0 6 0;
+#X connect 6 0 4 0;
+#X connect 7 0 5 0;
+#X connect 8 0 4 0;
+#X connect 8 0 10 0;
+#X connect 10 0 0 1;
+#X connect 11 0 12 0;
+#X connect 12 0 10 0;
+#X connect 13 0 11 0;
+#X connect 15 0 16 0;
+#X connect 15 0 16 1;
+#X connect 17 0 18 0;
+#X connect 18 0 15 1;
+#X connect 20 0 0 0;
+#X connect 25 0 26 0;
diff --git a/externals/fftease/fftease32-helpfiles/thresher~-help.pd b/externals/fftease/fftease32-helpfiles/thresher~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..1b67ca7c10843930b314855fe3bcddb94ac356fc
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/thresher~-help.pd
@@ -0,0 +1,45 @@
+#N canvas 815 263 505 512 10;
+#X obj 100 193 thresher~;
+#X obj 45 108 readsf~;
+#X obj 45 52 openpanel;
+#X msg 45 77 open \$1;
+#X msg 45 25 bang;
+#X msg 113 77 1;
+#X text 81 29 load sf;
+#X floatatom 164 136 5 0 0 0 - - -, f 5;
+#X floatatom 290 137 5 0 0 0 - - -, f 5;
+#X obj 294 -19 vsl 15 128 0.7 1 0 0 empty thresher-damp empty 0 -9
+0 10 -262144 -1 -1 12067 1;
+#X obj 164 -19 vsl 15 128 0 0.5 0 0 empty thresher-thresh empty 0 -9
+0 10 -262144 -1 -1 900 1;
+#X obj 108 273 *~ 0.05;
+#X obj 108 304 dac~;
+#X obj 150 233 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 12700 1;
+#X floatatom 147 253 5 0 0 0 - - -, f 5;
+#X text 46 330 thresher~ sustains the amplitude and frequency in lower-energy
+FFT bins. The extent of this effect is controlled by the threshold
+parameter: at 0 all frames pass \, at higher values more frames are
+sustained. The damping factor controls the decay time. A value of 1
+gives an infinite freeze.;
+#X text 329 137 damping factor;
+#X text 201 139 threshold;
+#N canvas 0 22 450 300 init 0;
+#X msg 164 150 \; thresher-thresh 0.05 \; thresher-damp 0.9;
+#X obj 214 82 loadbang;
+#X connect 1 0 0 0;
+#X restore 334 211 pd init;
+#X connect 0 0 11 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 2 0;
+#X connect 5 0 1 0;
+#X connect 7 0 0 1;
+#X connect 8 0 0 2;
+#X connect 9 0 8 0;
+#X connect 10 0 7 0;
+#X connect 11 0 12 0;
+#X connect 11 0 12 1;
+#X connect 13 0 14 0;
+#X connect 14 0 11 1;
diff --git a/externals/fftease/fftease32-helpfiles/vacancy~-help.pd b/externals/fftease/fftease32-helpfiles/vacancy~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d151b829cc165ab553818399352c766ef36dab68
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/vacancy~-help.pd
@@ -0,0 +1,64 @@
+#N canvas 713 398 517 445 10;
+#X obj 152 182 vacancy~;
+#X obj 146 115 readsf~;
+#X obj 146 59 openpanel;
+#X msg 146 84 open \$1;
+#X msg 146 32 bang;
+#X msg 214 84 1;
+#X text 182 36 load sf;
+#X obj 263 114 readsf~;
+#X obj 263 58 openpanel;
+#X msg 263 83 open \$1;
+#X msg 263 31 bang;
+#X text 299 35 load sf;
+#X obj 183 227 *~ 0.05;
+#X obj 183 258 dac~;
+#X obj 225 187 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 6700 1;
+#X floatatom 222 207 5 0 0 0 - - -, f 5;
+#X floatatom 357 129 5 0 0 0 - - -, f 5;
+#X obj 23 139 r vacancy-msgs;
+#N canvas 1360 274 450 300 control 0;
+#X obj 129 174 s vacancy-msgs;
+#X msg 98 107 rms \$1;
+#X obj 98 62 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1
+;
+#X obj 178 55 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X msg 178 100 invert \$1;
+#X obj 272 69 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X msg 272 114 swapphase \$1;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 4 0;
+#X connect 4 0 0 0;
+#X connect 5 0 6 0;
+#X connect 6 0 0 0;
+#X restore 44 225 pd control;
+#X text 45 296 vacancy~ performs spectral compositing. The threshold
+controls the compositing. Useful values lie in the range from -90 dB
+to 90 dB. Threshold inversion is available via the invert message.
+The threshold can also track the current RMS value of of the signal.
+In RMS tracking mode \, the useful threshold range will be somewhat
+different depending upon the character of the input signals. Phases
+will be derived from the left input unless phase swapping is specified.
+In this case phases will be taken from the right input signal when
+the threshold test is true.;
+#X connect 0 0 12 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 2 0;
+#X connect 5 0 1 0;
+#X connect 5 0 7 0;
+#X connect 7 0 0 1;
+#X connect 8 0 9 0;
+#X connect 9 0 7 0;
+#X connect 10 0 8 0;
+#X connect 12 0 13 0;
+#X connect 12 0 13 1;
+#X connect 14 0 15 0;
+#X connect 15 0 12 1;
+#X connect 16 0 0 2;
+#X connect 17 0 0 0;
diff --git a/externals/fftease/fftease32-helpfiles/xsyn~-help.pd b/externals/fftease/fftease32-helpfiles/xsyn~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..07392a77139bf54f81273b06bb3031cdd0d630d7
--- /dev/null
+++ b/externals/fftease/fftease32-helpfiles/xsyn~-help.pd
@@ -0,0 +1,35 @@
+#N canvas 879 506 472 383 10;
+#X obj 149 181 xsyn~;
+#X obj 31 100 readsf~;
+#X obj 31 44 openpanel;
+#X msg 31 69 open \$1;
+#X msg 31 17 bang;
+#X msg 99 69 1;
+#X text 67 21 load sf;
+#X obj 200 113 readsf~;
+#X obj 200 57 openpanel;
+#X msg 200 82 open \$1;
+#X msg 200 30 bang;
+#X text 236 34 load sf;
+#X obj 152 234 *~ 0.05;
+#X obj 152 265 dac~;
+#X obj 194 194 hsl 128 15 0 1 0 0 empty empty Gain -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 191 214 5 0 0 0 - - -, f 5;
+#X text 34 320 xsyn~ filters the first input with the second input
+\, creating a spectral cross synthesis effect.;
+#X connect 0 0 12 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 2 0;
+#X connect 5 0 1 0;
+#X connect 5 0 7 0;
+#X connect 7 0 0 1;
+#X connect 8 0 9 0;
+#X connect 9 0 7 0;
+#X connect 10 0 8 0;
+#X connect 12 0 13 0;
+#X connect 12 0 13 1;
+#X connect 14 0 15 0;
+#X connect 15 0 12 1;
diff --git a/externals/fftease/fftease_setup.c b/externals/fftease/fftease_setup.c
new file mode 100644
index 0000000000000000000000000000000000000000..981bc133966478eb5189fe08f6b49f6f027e44f4
--- /dev/null
+++ b/externals/fftease/fftease_setup.c
@@ -0,0 +1,5 @@
+void fftease_setup(void)
+{
+//  post("Loaded FFTease Library");
+//  printf("Loaded FFTease Library(2)");
+}
diff --git a/externals/fftease/fftease_utilities.c b/externals/fftease/fftease_utilities.c
new file mode 100644
index 0000000000000000000000000000000000000000..3ccacac2826f8311e982154dbe619212871c554f
--- /dev/null
+++ b/externals/fftease/fftease_utilities.c
@@ -0,0 +1,276 @@
+#include "fftease.h"
+#define FFTEASE_LIB_VERSION "FFTease library 3.0 Pd 32-bit version"
+
+void fftease_noalias(t_fftease* fft, short flag)
+{
+	fft->noalias = flag;
+}
+
+int fftease_fft_size( int testfft )
+{
+int test = 2;
+	if( testfft <= 0 )
+		return DEFAULT_FFTEASE_FFTSIZE;
+	while( test < testfft && test < FFTEASE_MAX_FFTSIZE){
+		test *= 2;
+	}
+	if( test != testfft ){
+		post("incorrect FFT size specified, using %d", DEFAULT_FFTEASE_FFTSIZE);
+		test = DEFAULT_FFTEASE_FFTSIZE;
+	}
+	if( test == FFTEASE_MAX_FFTSIZE){
+		post("fftsize capped at maximum: %d", test);
+	}
+	return test;
+}
+
+void fftease_set_fft_buffers(t_fftease *fft)
+{
+	if( fft->D <= 0 || fft->MSPVectorSize <= 0 ){
+		return;
+	}
+    // post("setting up FFTease buffers");
+	fft->operationCount = 0;
+	if( fft->D > fft->MSPVectorSize ){
+		fft->operationRepeat = fft->D / fft->MSPVectorSize;
+		fft->bufferStatus = BIGGER_THAN_MSP_VECTOR;
+		// post("fftease_set_fft_buffers: bigger than MSP vector");
+	} else if( fft->D < fft->MSPVectorSize ){
+		fft->operationRepeat = fft->MSPVectorSize / fft->D;
+		fft->bufferStatus = SMALLER_THAN_MSP_VECTOR;
+		// post("fftease_set_fft_buffers: smaller than MSP buffer");
+	} else {
+		fft->operationRepeat = 1;
+		fft->bufferStatus = EQUAL_TO_MSP_VECTOR;
+		// post("fftease_set_fft_buffers: equal to MSP buffer");
+	}
+}
+
+int fftease_overlap( int overlap )
+{
+	int target = 1;
+	while( target < overlap && target < 64 ){
+		target *= 2;
+	}
+	if( target != overlap ){
+		error("fftease_overlap: %d is not a legal overlap factor",overlap);
+		return 1;
+	}
+	return overlap;
+}
+
+int fftease_winfac( int winfac)
+{
+	int target = 1;
+	while( target < winfac && target < 64 ){
+		target *= 2;
+	}
+	if( target != winfac ){
+		// error("%d is not a legal window factor", winfac);
+		return 1;
+	}
+	return winfac;
+}
+
+void fftease_oscbank_setbins(t_fftease *fft, t_float lowfreq, t_float highfreq)
+{
+	if(fft->initialized == -1){
+		post("oscbank setbins inhibited");
+		return;
+	}
+	t_float curfreq = 0;
+	fft->hi_bin = 1;
+	int N2 = fft->N2;
+	while(curfreq < highfreq){
+		++(fft->hi_bin);
+		curfreq += fft->c_fundamental;
+	}
+	fft->lo_bin = 0;
+	curfreq = 0;
+	while(curfreq < lowfreq){
+		++(fft->lo_bin);
+		curfreq += fft->c_fundamental;
+	}
+	if(fft->hi_bin > N2)
+		fft->hi_bin = N2;
+//	post("lowfreq %f highfreq %f low bin %d high bin %d",lowfreq, highfreq, fft->lo_bin, fft->hi_bin);
+}
+
+void fftease_init(t_fftease *fft)
+{
+	int i;
+	int mem;
+	if(fft->initialized == -1){
+		// post("fftease_init manually aborted with initialization status -1");
+		return;
+	}
+	if(!fft->R){
+		// post("fftease_init: zero sample rate, aborting init");
+        return;
+    }
+	// fft->init_status = 0;
+    fft->overlap = fftease_overlap(fft->overlap);
+    fft->winfac = fftease_winfac(fft->winfac);
+
+	if(fft->P <= 0)
+		fft->P = 1.0;		
+	fft->N = fftease_fft_size( fft->N );
+	fft->D = fft->N / fft->overlap;
+	fft->Nw = fft->N * fft->winfac;
+		
+	fft->Iinv = 1.0/fft->D;
+	fft->N2 = fft->N / 2;
+	fft->Nw2 = fft->Nw / 2;
+	
+	fft->in_count = -(fft->Nw);
+	fft->out_count = fft->in_count;
+	fft->mult = 1.0 / (t_float) fft->N;
+	fft->c_fundamental =  (t_float) fft->R/(t_float) fft->N;
+	fft->c_factor_in =  (t_float) fft->R/((t_float)fft->D * TWOPI);
+	fft->c_factor_out = TWOPI * (t_float)  fft->D / (t_float) fft->R;
+	// fft->synt = 0.001;
+	fft->L = FFTEASE_OSCBANK_TABLESIZE;
+	fft->pitch_increment = fft->P * fft->L / fft->R;
+	fft->ffac = fft->P * PI / fft->N;
+	fft->nyquist = (t_float) fft->R / 2.0;
+	
+	if(! fft->initialized){
+		// post("Initializing FFT Memory");
+		fft->P = 1.0;
+		fft->obank_flag = 0; // default no oscbank
+		fft->lo_bin = 0; 
+		fft->hi_bin = fft->N2; 
+		mem = (fft->Nw) * sizeof(t_float);
+		fft->Wanal = (t_float *) calloc(1,mem);
+		fft->Wsyn = (t_float *) calloc(1,mem);	
+		fft->Hwin = (t_float *) calloc(1,mem);	
+		fft->input = (t_float *) calloc(1,mem);		
+		fft->output = (t_float *) calloc(1,mem);	
+		mem = (fft->N + 2) * sizeof(t_float);
+		fft->buffer = (t_float *) calloc(1,mem);	
+		mem = (fft->N + 2) * sizeof(t_float);
+		fft->channel = (t_float *) calloc(1,mem);	
+		mem = (fft->N * 2) * sizeof(int);
+		fft->bitshuffle = (int *) calloc(1,mem);	
+		mem = (fft->N*2)*sizeof(t_float);
+		fft->trigland = (t_float *) calloc(1,mem);	
+		mem = (fft->N2+1)*sizeof(t_float);
+		fft->c_lastphase_in = (t_float *) calloc(1,mem);	
+		fft->c_lastphase_out = (t_float *)calloc(1,mem);	
+		// oscbank stuff
+		mem = (fft->N+1)*sizeof(t_float);
+		fft->lastamp = (t_float *) calloc(1,mem);	
+		fft->lastfreq = (t_float *) calloc(1,mem);	
+		fft->bindex = (t_float *) calloc(1,mem);	
+		mem = (2 + fft->L)*sizeof(t_float); // includes guardpoint
+		fft->table = (t_float *) calloc(1,mem);	
+		// t_float buffering
+		mem = fft->D * sizeof(t_float);
+		fft->internalInputVector = (t_float *) calloc(1,mem);
+		fft->internalOutputVector = (t_float *) calloc(1,mem);
+		fft->initialized = 1;
+	}
+    else if( (fft->N == fft->last_N) && (fft->overlap == fft->last_overlap) &&
+            (fft->winfac == fft->last_winfac) && (fft->last_R == fft->R) ) {
+        //post("fftease_init: no change in vital parameters so memory reallocation skipped");
+        return;
+    }
+    else {
+		// post("Resizing FFT Memory");
+		mem = (fft->Nw)*sizeof(t_float);
+		fft->Wanal = (t_float *) realloc((void *) fft->Wanal, mem);
+		fft->Wsyn = (t_float *) realloc((void *) fft->Wsyn, mem);
+		fft->Hwin = (t_float *)realloc((void *) fft->Hwin, mem);
+		fft->input = (t_float *) realloc((void *) fft->input, mem);
+		fft->output = (t_float *) realloc((void *) fft->output, mem);	
+		mem = (fft->N + 2)*sizeof(t_float);
+		fft->buffer = (t_float *) realloc((void *) fft->buffer, mem);
+		mem = (fft->N+2)*sizeof(t_float);
+		fft->channel = (t_float *) realloc((void *) fft->channel, mem);
+		mem = (fft->N*2)*sizeof(int);
+		fft->bitshuffle = (int *) realloc((void *) fft->bitshuffle, mem);
+		mem = (fft->N*2)*sizeof(t_float);
+		fft->trigland = (t_float *) realloc((void *) fft->trigland, mem);
+		mem = (fft->N2+1)*sizeof(t_float);
+		fft->c_lastphase_in = (t_float *) realloc((void *) fft->c_lastphase_in, mem);
+		fft->c_lastphase_out = (t_float *)realloc((void *)fft->c_lastphase_out, mem);
+		mem = (fft->N+1)*sizeof(t_float);
+		fft->lastamp = (t_float *) realloc((void *) fft->lastamp, mem);
+		fft->lastfreq = (t_float *) realloc((void *) fft->lastfreq, mem);
+		fft->bindex = (t_float *) realloc((void *) fft->bindex, mem);	
+		mem = fft->D * sizeof(t_float);
+		fft->internalInputVector = (t_float *)realloc((void *) fft->internalInputVector, mem);
+		fft->internalOutputVector = (t_float *) realloc((void *) fft->internalOutputVector, mem);		
+	}
+    fft->last_N = fft->N;
+    fft->last_overlap = fft->overlap;
+    fft->last_winfac = fft->winfac;
+    fft->last_R = fft->R;
+	for ( i = 0; i < fft->L; i++ ) {
+		fft->table[i] = (t_float) fft->N * cos((t_float)i * TWOPI / (t_float)fft->L);
+	}
+	fft->table[fft->L] = fft->table[fft->L - 1]; // guard point
+	fftease_makewindows( fft->Hwin, fft->Wanal, fft->Wsyn, fft->Nw, fft->N, fft->D);
+	fftease_init_rdft( fft->N, fft->bitshuffle, fft->trigland);
+	fftease_set_fft_buffers(fft);
+	fftease_oscbank_setbins(fft,0,fft->nyquist);
+	fft->init_status = 1;
+}
+
+void fftease_free(t_fftease *fft)
+{
+	if(fft->init_status == 1){
+        
+		free(fft->trigland);
+		free(fft->bitshuffle);
+		free(fft->Wanal);
+		free(fft->Wsyn);
+		free(fft->Hwin);
+		free(fft->buffer);
+        
+		free(fft->channel); // this is the killer
+        
+		free(fft->input);
+		free(fft->output);
+		free(fft->internalInputVector);
+		free(fft->internalOutputVector);
+		free(fft->c_lastphase_in);
+		free(fft->c_lastphase_out);
+		free(fft->lastamp);
+		free(fft->lastfreq);
+		free(fft->bindex);
+		free(fft->table);
+        
+	}
+}
+
+void fftease_fftinfo(t_fftease *fft, char *object_name)
+{
+	if( ! fft->overlap ){
+		post("%s: zero overlap!", object_name);
+		return;
+	}
+	post("%s: FFT size %d, hopsize %d, windowsize %d, MSP Vector Size %d", object_name, 
+	fft->N, fft->N/fft->overlap, fft->Nw, fft->MSPVectorSize);
+	post("%s\n", FFTEASE_LIB_VERSION);
+}
+
+int fftease_msp_sanity_check(t_fftease *fft, char *oname)
+{
+	if( fft->R <= 0 || fft->R > 10000000 || fft->MSPVectorSize <= 0 || fft->D <= 0){
+		post("%s is concerned that perhaps no audio driver has been loaded",oname);
+		post("R: %d, vector size: %d, D: %d", fft->R, fft->MSPVectorSize, fft->D);
+		return 0;
+	} else {
+		return 1;
+	}
+}
+
+t_float fftease_randf(t_float min, t_float max)
+{
+	t_float randv;
+	
+	randv = (t_float) (rand() % 32768) / 32768.0 ;
+	return min + (max-min) * randv;
+}
+
diff --git a/externals/fftease/fold.c b/externals/fftease/fold.c
new file mode 100644
index 0000000000000000000000000000000000000000..73cb068cc118280ccfb72b7dee38c50b801b11cd
--- /dev/null
+++ b/externals/fftease/fold.c
@@ -0,0 +1,32 @@
+#include "fftease.h"
+
+/*
+ * multiply current input I by window W (both of length Nw);
+ * using modulus arithmetic, fold and rotate windowed input
+ * into output array O of (FFT) length N according to current
+ * input time n
+ */
+
+void fftease_fold( t_fftease *fft )
+{
+	int Nw = fft->Nw;
+	int N = fft->N;
+	t_float *Wanal = fft->Wanal;
+	t_float *input = fft->input;
+	t_float *buffer = fft->buffer;
+	int in_count = fft->in_count;	
+    int i;
+	
+	memset(buffer, 0.0, N * sizeof(t_float));
+	
+    while ( in_count < 0 )
+      	in_count += N;
+    in_count %= N;
+    for ( i = 0; i < Nw; i++ ) {
+		buffer[in_count] += input[i] * Wanal[i];
+      	if ( ++in_count == N )
+			in_count = 0;
+    }
+	fft->in_count = (fft->in_count + fft->D) % fft->Nw;
+}
+
diff --git a/externals/fftease/leaker~.c b/externals/fftease/leaker~.c
new file mode 100644
index 0000000000000000000000000000000000000000..65ca4406c81760f5b06aa18bb2c6b2efd79692d7
--- /dev/null
+++ b/externals/fftease/leaker~.c
@@ -0,0 +1,308 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *leaker_class;
+
+#define OBJECT_NAME "leaker~"
+
+typedef struct _leaker
+{
+	t_object x_obj;
+    float x_f;
+	t_fftease *fft;
+	t_fftease *fft2;
+	int *sieve;
+	short mute;
+	t_float fade_value;
+} t_leaker;
+
+void leaker_dsp(t_leaker *x, t_signal **sp);
+t_int *leaker_perform(t_int *w);
+static void leaker_free(t_leaker *x);
+void *leaker_new(t_symbol *msg, short argc, t_atom *argv);
+void leaker_upsieve(t_leaker *x) ;
+void leaker_downsieve(t_leaker *x) ;
+void leaker_randsieve(t_leaker *x) ;
+void leaker_mute(t_leaker *x, t_floatarg state);
+void leaker_init(t_leaker *x);
+
+void leaker_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("leaker~"), (t_newmethod)leaker_new,
+                  (t_method)leaker_free,sizeof(t_leaker), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_leaker, x_f);
+	class_addmethod(c,(t_method)leaker_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)leaker_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(c,(t_method)leaker_upsieve,gensym("upsieve"), 0);
+	class_addmethod(c,(t_method)leaker_downsieve,gensym("downsieve"), 0);
+	class_addmethod(c,(t_method)leaker_randsieve,gensym("randsieve"), 0);
+    
+    leaker_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void leaker_free( t_leaker *x ){
+	fftease_free(x->fft);
+	fftease_free(x->fft2);
+    free(x->fft);
+    free(x->fft2);
+	free(x->sieve);
+}
+
+void leaker_upsieve(t_leaker *x) {
+	int i;
+	int *sieve = x->sieve;
+	for( i = 0; i < x->fft->N2; i++ ){
+		sieve[i] = i + 1;
+	}
+}
+
+void leaker_downsieve(t_leaker *x) {
+	int i;
+	int *sieve = x->sieve;
+	int N2 = x->fft->N2;
+	for( i = 0; i < N2; i++ ){
+		sieve[i] = N2  - i;
+	}
+}
+
+void leaker_randsieve(t_leaker *x) {
+	int i;
+	int temp;
+	int pos1, pos2;
+	int N2 = x->fft->N2;
+	int *sieve = x->sieve;
+    int maxswap = N2 - 1;
+	
+	for( i = 0; i < N2; i++ ){
+		sieve[i] = i + 1;
+	}
+    while(maxswap > 0){
+        pos1 = maxswap;
+        pos2 = rand() % (N2 - 1);
+        temp = sieve[pos1];
+        sieve[pos1] = sieve[pos2];
+        sieve[pos2] = temp;
+        --maxswap;
+    }
+}
+
+void leaker_mute(t_leaker *x, t_floatarg state)
+{
+	x->mute = (short)state;	
+}
+
+void *leaker_new(t_symbol *msg, short argc, t_atom *argv)
+{
+	t_fftease *fft, *fft2;
+
+	t_leaker *x = (t_leaker *)pd_new(leaker_class);
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	x->fft2 = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft2 = x->fft2;
+		
+	fft->initialized = 0;
+	fft2->initialized = 0;
+
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+	
+	fft2->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft2->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft2->winfac = FFTEASE_DEFAULT_WINFAC;
+	
+	return x;
+}
+
+void leaker_init(t_leaker *x)
+{
+	int i;
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	short initialized = fft->initialized;
+	
+	fftease_init(fft);
+	fftease_init(fft2);
+
+	if(!initialized) {
+		x->mute = 0;
+		x->fade_value = 0;
+		x->sieve = (int *) calloc((fft->N2 + 1),sizeof(int));
+	}
+	if(initialized != 2){
+		for(i = 0; i < fft->N2; i++){
+			x->sieve[i] = i;
+		}
+	}
+}
+
+void do_leaker(t_leaker *x)
+{
+	int i,odd,even;
+	t_float a1,a2,b1,b2;
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int N2 = fft->N2;
+	t_float *buffer1 = fft->buffer;
+	t_float *buffer2 = fft2->buffer;
+	t_float *channel1 = fft->channel;
+	int *sieve = x->sieve;
+	t_float fade_value = x->fade_value;
+
+	fftease_fold(fft);
+	fftease_fold(fft2);
+	fftease_rdft(fft,1);
+	fftease_rdft(fft2,1);
+	
+	
+	for ( i = 0; i <= N2; i++ ) {
+		odd = ( even = i<<1 ) + 1;
+		if( fade_value <= 0 || fade_value < sieve[i]  ){
+			a1 = ( i == N2 ? *(buffer1+1) : *(buffer1+even) );
+			b1 = ( i == 0 || i == N2 ? 0. : *(buffer1+odd) );
+			
+			*(channel1+even) = hypot( a1, b1 ) ;
+			*(channel1+odd) = -atan2( b1, a1 );
+			*(buffer1+even) = *(channel1+even) * cos(*(channel1+odd));
+			if ( i != N2 ){
+				*(buffer1+odd) = -(*(channel1+even)) * sin(*(channel1+odd));
+			}
+		} else {
+			a2 = ( i == N2 ? *(buffer2+1) : *(buffer2+even) );
+			b2 = ( i == 0 || i == N2 ? 0. : *(buffer2+odd) );
+			*(channel1+even) = hypot( a2, b2 ) ;
+			*(channel1+odd) = -atan2( b2, a2 );
+			*(buffer1+even) = *(channel1+even) * cos(*(channel1+odd) );
+			if ( i != N2 ){
+				*(buffer1+odd) = -(*(channel1+even)) * sin( *(channel1+odd) );
+			}
+		}
+	}
+	fftease_rdft(fft,-1);
+	fftease_overlapadd(fft);
+}
+
+
+t_int *leaker_perform(t_int *w)
+{
+	int i,j;
+    t_leaker *x = (t_leaker *) (w[1]);
+	t_float *MSPInputVector1 = (t_float *)(w[2]);
+	t_float *MSPInputVector2 = (t_float *)(w[3]);
+	t_float *fade_value = (t_float *)(w[4]);
+	t_float *MSPOutputVector = (t_float *)(w[5]);
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int MSPVectorSize = fft->MSPVectorSize;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalInputVector1 = fft->internalInputVector;
+	t_float *internalInputVector2 = fft2->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	t_float *inputOne = fft->input;
+	t_float *inputTwo = fft2->input;
+	t_float *output = fft->output;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float mult = fft->mult;	
+	int N2 = fft->N2;
+	
+    x->fade_value = *fade_value * (float) N2;
+
+	if(x->mute){
+		for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+6;
+	}
+
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputOne + (Nw - D), MSPInputVector1, D * sizeof(t_float));
+        memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputTwo + (Nw - D), MSPInputVector2, D * sizeof(t_float));
+        
+		do_leaker(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw-D), MSPInputVector1 + (D*i), D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw-D), MSPInputVector2 + (D*i), D * sizeof(t_float));
+            
+			do_leaker(x);
+            
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector1 + (operationCount * MSPVectorSize), MSPInputVector1, MSPVectorSize * sizeof(t_float));
+        memcpy(internalInputVector2 + (operationCount * MSPVectorSize), MSPInputVector2, MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize), MSPVectorSize * sizeof(t_float));
+        
+		operationCount = (operationCount + 1) % operationRepeat;
+        
+        if( operationCount == 0 ) {
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw - D), internalInputVector1, D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw - D), internalInputVector2, D * sizeof(t_float));
+            
+            do_leaker(x);
+            
+            for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+6;
+}		
+
+void leaker_dsp(t_leaker *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    t_fftease *fft = x->fft;
+    t_fftease *fft2 = x->fft2;
+    
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(!samplerate)
+        return;
+    
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+		fft2->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft2);
+	}
+	if(fft->R != samplerate ){
+		fft->R = samplerate;
+        fft2->R = samplerate;
+	}
+    if(reset_required){
+        leaker_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(leaker_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec,sp[3]->s_vec);
+    }
+}
+
+
diff --git a/externals/fftease/leanconvert.c b/externals/fftease/leanconvert.c
new file mode 100644
index 0000000000000000000000000000000000000000..39d6ff389d5692077d3e86e82b4a2963cb11262e
--- /dev/null
+++ b/externals/fftease/leanconvert.c
@@ -0,0 +1,22 @@
+#include "fftease.h"
+
+void fftease_leanconvert(t_fftease *fft)
+
+{
+
+	int		real, imag, amp, phase;
+	t_float		a, b;
+	int		i;
+	t_float *buffer = fft->buffer;
+	t_float *channel = fft->channel;
+	int N2 = fft->N2;
+
+	for ( i = 0; i <= N2; i++ ) {
+		imag = phase = ( real = amp = i<<1 ) + 1;
+		a = ( i == N2 ? buffer[1] : buffer[real] );
+		b = ( i == 0 || i == N2 ? 0. : buffer[imag] );
+		channel[amp] = hypot( a, b );
+		channel[phase] = -atan2( b, a );
+	}
+}
+
diff --git a/externals/fftease/leanunconvert.c b/externals/fftease/leanunconvert.c
new file mode 100644
index 0000000000000000000000000000000000000000..a333d89f1a9dc5f1990eae12392dfe649ac9af97
--- /dev/null
+++ b/externals/fftease/leanunconvert.c
@@ -0,0 +1,19 @@
+#include "fftease.h"
+
+
+void fftease_leanunconvert(t_fftease *fft)
+
+{
+	int		real, imag, amp, phase;
+	register int		i;
+	t_float *buffer = fft->buffer;
+	t_float *channel = fft->channel;
+	int N2 = fft->N2;	
+	
+	for ( i = 0; i <= N2; i++ ) {
+		imag = phase = ( real = amp = i<<1 ) + 1;
+		buffer[real] = *(channel+amp) * cos( *(channel+phase) );
+		if ( i != N2 )
+			buffer[imag] = -*(channel+amp) * sin( *(channel+phase) );
+	}
+}
diff --git a/externals/fftease/legacy.c b/externals/fftease/legacy.c
new file mode 100644
index 0000000000000000000000000000000000000000..4d40fa983d0bb00bc088aa8d5d889fc628c07eaf
--- /dev/null
+++ b/externals/fftease/legacy.c
@@ -0,0 +1,83 @@
+#include "fftease.h"
+
+void old_overlapadd( float *I, int N, float *W, float *O, int Nw, int n )
+
+{
+ int i ;
+    while ( n < 0 )
+	n += N ;
+    n %= N ;
+    for ( i = 0 ; i < Nw ; i++ ) {
+	O[i] += I[n]*W[i] ;
+	if ( ++n == N )
+	    n = 0 ;
+    }
+}
+
+
+void old_convert(float *S, float *C, int N2, float *lastphase, float fundamental, float factor )
+{
+  float 	phase,
+		phasediff;
+  int 		real,
+		imag,
+		amp,
+		freq;
+  float 	a,
+		b;
+  int 		i;
+
+
+    for ( i = 0; i <= N2; i++ ) {
+      imag = freq = ( real = amp = i<<1 ) + 1;
+      a = ( i == N2 ? S[1] : S[real] );
+      b = ( i == 0 || i == N2 ? 0. : S[imag] );
+
+      C[amp] = hypot( a, b );
+      if ( C[amp] == 0. )
+	phasediff = 0.;
+      else {
+	phasediff = ( phase = -atan2( b, a ) ) - lastphase[i];
+	lastphase[i] = phase;
+	
+	while ( phasediff > PI )
+	  phasediff -= TWOPI;
+	while ( phasediff < -PI )
+	  phasediff += TWOPI;
+      }
+      C[freq] = phasediff*factor + i*fundamental;
+    }
+}
+
+
+
+void old_unconvert( float *C, float *S, int N2, float *lastphase, float fundamental, float factor )
+
+{
+  int 		i,
+		real,
+		imag,
+		amp,
+		freq;
+  float 	mag,
+		phase;
+double sin(), cos();
+
+    for ( i = 0; i <= N2; i++ ) {
+
+	imag = freq = ( real = amp = i<<1 ) + 1;
+
+	if ( i == N2 )
+	  real = 1;
+
+	mag = C[amp];
+	lastphase[i] += C[freq] - i*fundamental;
+	phase = lastphase[i]*factor;
+	S[real] = mag*cos( phase );
+
+	if ( i != N2 )
+	  S[imag] = -mag*sin( phase );
+
+    }
+
+}
diff --git a/externals/fftease/limit_fftsize.c b/externals/fftease/limit_fftsize.c
new file mode 100644
index 0000000000000000000000000000000000000000..25ff70fd497c395cbbd3a0bebf165d70cab06b9d
--- /dev/null
+++ b/externals/fftease/limit_fftsize.c
@@ -0,0 +1,32 @@
+#include "fftease.h"
+
+extern void post(const char *fmt, ...);
+
+void fftease_limit_fftsize(int *N, int *Nw, char *OBJECT_NAME)
+{
+	if(*N > MAX_N){
+		// post("%s: N set to maximum FFT size of %d",OBJECT_NAME,MAX_N);
+		*N = MAX_N;
+	}
+	if(*Nw > MAX_Nw){
+	// 	post("%s: Nw set to maximum window size of %d",OBJECT_NAME,MAX_Nw);
+		*Nw = MAX_Nw;
+	}
+}
+
+int fftease_FFT_size( int testfft )
+{
+int test = 2;
+	if( testfft <= 0 )
+		return DEFAULT_FFTEASE_FFTSIZE;
+	while( test < testfft && test < FFTEASE_MAX_FFTSIZE){
+		test *= 2;
+	}
+	if( test != testfft ){
+		post("incorrect FFT size specified, using %d", test);
+	}
+	if( test == FFTEASE_MAX_FFTSIZE){
+		post("fftsize capped at maximum: %d", test);
+	}
+	return test;
+}
\ No newline at end of file
diff --git a/externals/fftease/limited_oscbank.c b/externals/fftease/limited_oscbank.c
new file mode 100644
index 0000000000000000000000000000000000000000..ed278dea8bc46191bc7fb1c15accf46abaadb6f5
--- /dev/null
+++ b/externals/fftease/limited_oscbank.c
@@ -0,0 +1,132 @@
+#include "fftease.h"
+// extern void post(const char *fmt, ...);
+#define PARANOID 0
+
+void fftease_limited_oscbank( t_fftease *fft, int osclimit, t_float framethresh)
+{
+	int    amp,freq,chan, n;
+	
+	t_float    a,ainc,f,finc,address;
+	int D = fft->D;
+	int I = D;
+	int L = fft->L;
+	t_float synt = fft->synt;
+	t_float P  = fft->P; 
+	int R = fft->R;
+	int N2 = fft->N2;
+	t_float Iinv = 1./fft->D;
+	t_float pitch_increment = fft->pitch_increment;
+	t_float *table = fft->table;
+	t_float *lastamp = fft->lastamp ;
+	t_float *lastfreq = fft->lastfreq ;
+	t_float *bindex = fft->bindex;
+	t_float *channel = fft->channel;
+	t_float *output = fft->output;
+	int hi_bin = fft->hi_bin;
+	int lo_bin = fft->lo_bin;
+	t_float maxamp = 0.0;
+    t_float localthresh, testamp;
+	short noalias = fft->noalias;
+	t_float nyquist = fft->nyquist;
+	int oscnt = 0;
+#ifdef PARANOID	
+	if(! fft->init_status ){ // means memory alloc in effect
+		goto exit;
+	}
+#endif
+	
+	if(R == 0){
+		post("FFTeaseLib: limited oscbank got 0 SR");
+		return;
+	}
+
+	if(lo_bin < 0 || hi_bin > N2){
+		post("FFTeaseLib: limited oscbank: bad bins: %d %d",lo_bin,hi_bin);
+	}
+
+	pitch_increment = P * (t_float) L / (t_float) R;
+
+	if( synt > 0.0 ){
+		maxamp = 0.0;
+		for ( chan = lo_bin; chan < hi_bin; chan++ ){
+			amp = chan << 1;
+			testamp = fabs( channel[amp] );
+			if( testamp > maxamp )
+				maxamp = testamp;
+		}
+	}
+	if(maxamp > framethresh){
+		localthresh = synt * maxamp;
+	} else {
+		localthresh = synt * framethresh; // watch this line!
+	}
+	
+	
+    for ( chan = lo_bin; chan < hi_bin; chan++ ) {
+#ifdef PARANOID	
+		if(! fft->init_status ){ // means memory alloc in effect
+			goto exit;
+		}
+#endif
+		freq = ( amp = ( chan << 1 ) ) + 1;
+		if(noalias){
+			if( channel[freq] * P >= nyquist )
+				channel[amp] = 0;
+		}
+		if ( channel[amp] > localthresh ){ 
+			++oscnt;
+#ifdef PARANOID	
+			if(! fft->init_status ){ // means memory alloc in effect
+				goto exit;
+			}
+#endif
+			if(oscnt > osclimit){
+				goto exit;
+			}
+			channel[freq] *= pitch_increment;
+			finc = ( channel[freq] - ( f = lastfreq[chan] ) )*Iinv;
+			ainc = ( channel[amp] - ( a = lastamp[chan] ) )*Iinv;
+			address = bindex[chan];
+			// this was the bug - somewhere bindex was not properly initialized!
+			//i_address = (int) address;
+			if( address < 0 || address >= L){
+				address = 0;
+				// post("limited oscbank: bad address");
+			}			
+			for ( n = 0; n < I; n++ ) {
+#ifdef PARANOID	
+				if(! fft->init_status ){ // means memory alloc in effect
+					goto exit;
+				}
+#endif
+// this is a suspected bug line:
+					/*
+				iAddress = (int) address;
+				if( iAddress == L ){
+					iAddress = L - 1;
+				}
+				
+			
+				if( iAddress < 0 || iAddress >= L ){
+					post("limited oscbank: bad address: %d", iAddress);
+				} else {
+					output[n] += a*table[ iAddress ];
+				}
+				*/
+				// skip excessive paranoia for efficiency
+				output[n] += a*table[ (int) address ]; // this WILL go to L, so tab needs a guardpoint
+				address += f;
+				while ( address >= L )
+					address -= L;
+				while ( address < 0 )
+					address += L;
+				a += ainc;
+				f += finc;
+			}
+			lastfreq[chan] = channel[freq];
+			lastamp[chan] = channel[amp];
+			bindex[chan] = address;
+		}
+    } 
+	exit:;
+}
\ No newline at end of file
diff --git a/externals/fftease/lyonpotpourri-meta.pd b/externals/fftease/lyonpotpourri-meta.pd
new file mode 100644
index 0000000000000000000000000000000000000000..55430cf8453db047f955f4a6290609bc37c1af1e
--- /dev/null
+++ b/externals/fftease/lyonpotpourri-meta.pd
@@ -0,0 +1,7 @@
+#N canvas 15 49 200 200 10;
+#N canvas 25 49 420 300 META 1;
+#X text 13 41 NAME lyonpotpourri;
+#X text 10 25 AUTHOR Eric Lyon <e.lyon@qub.ac.uk>;
+#X text 10 10 VERSION 2.0;
+#X text 10 60 LICENSE MIT;
+#X restore 10 10 pd META;
diff --git a/externals/fftease/m_pd.h b/externals/fftease/m_pd.h
new file mode 100644
index 0000000000000000000000000000000000000000..f3af689744bfd03b5d208c7ff1313e620d4c5d5a
--- /dev/null
+++ b/externals/fftease/m_pd.h
@@ -0,0 +1,634 @@
+/* Copyright (c) 1997-1999 Miller Puckette.
+* For information on usage and redistribution, and for a DISCLAIMER OF ALL
+* WARRANTIES, see the file, "LICENSE.txt," in this distribution.  */
+
+#ifndef __m_pd_h_
+
+#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus)
+extern "C" {
+#endif
+
+#define PD_MAJOR_VERSION 0
+#define PD_MINOR_VERSION 38   
+
+/* old name for "MSW" flag -- we have to take it for the sake of many old
+"nmakefiles" for externs, which will define NT and not MSW */
+#if defined(NT) && !defined(MSW)
+#define MSW
+#endif
+
+#ifdef MSW
+// #pragma warning( disable : 4091 ) 
+#pragma warning( disable : 4305 )  /* uncast const double to float */
+#pragma warning( disable : 4244 )  /* uncast float/int conversion etc. */
+#pragma warning( disable : 4101 )  /* unused automatic variables */
+#endif /* MSW */
+
+    /* the external storage class is "extern" in UNIX; in MSW it's ugly. */
+#ifdef MSW
+#ifdef PD_INTERNAL
+#define EXTERN __declspec(dllexport) extern
+#else
+#define EXTERN __declspec(dllimport) extern
+#endif /* PD_INTERNAL */
+#else
+#define EXTERN extern
+#endif /* MSW */
+
+    /* and depending on the compiler, hidden data structures are
+    declared differently: */
+#if defined( __GNUC__) || defined( __BORLANDC__ ) || defined( __MWERKS__ )
+#define EXTERN_STRUCT struct
+#else
+#define EXTERN_STRUCT extern struct
+#endif
+
+
+#if !defined(_SIZE_T) && !defined(_SIZE_T_)
+#include <stddef.h>     /* just for size_t -- how lame! */
+#endif
+
+#define MAXPDSTRING 1000        /* use this for anything you want */
+#define MAXPDARG 5              /* max number of args we can typecheck today */
+
+/* signed and unsigned integer types the size of a pointer:  */
+/* GG: long is the size of a pointer */
+typedef long t_int;
+
+typedef float t_float;  /* a floating-point number at most the same size */
+typedef float t_floatarg;  /* floating-point type for function calls */
+
+typedef struct _symbol
+{
+    char *s_name;
+    struct _class **s_thing;
+    struct _symbol *s_next;
+} t_symbol;
+
+EXTERN_STRUCT _array;
+#define t_array struct _array       /* g_canvas.h */
+
+/* pointers to glist and array elements go through a "stub" which sticks
+around after the glist or array is freed.  The stub itself is deleted when
+both the glist/array is gone and the refcount is zero, ensuring that no
+gpointers are pointing here. */
+
+#define GP_NONE 0       /* the stub points nowhere (has been cut off) */
+#define GP_GLIST 1      /* the stub points to a glist element */
+#define GP_ARRAY 2      /* ... or array */
+
+typedef struct _gstub
+{
+    union
+    {
+        struct _glist *gs_glist;    /* glist we're in */
+        struct _array *gs_array;    /* array we're in */
+    } gs_un;
+    int gs_which;                   /* GP_GLIST/GP_ARRAY */
+    int gs_refcount;                /* number of gpointers pointing here */
+} t_gstub;
+
+typedef struct _gpointer           /* pointer to a gobj in a glist */
+{
+    union
+    {   
+        struct _scalar *gp_scalar;  /* scalar we're in (if glist) */
+        union word *gp_w;           /* raw data (if array) */
+    } gp_un;
+    int gp_valid;                   /* number which must match gpointee */
+    t_gstub *gp_stub;               /* stub which points to glist/array */
+} t_gpointer;
+
+typedef union word
+{
+    t_float w_float;
+    t_symbol *w_symbol;
+    t_gpointer *w_gpointer;
+    t_array *w_array;
+    struct _glist *w_list;
+    int w_index;
+} t_word;
+
+typedef enum
+{
+    A_NULL,
+    A_FLOAT,
+    A_SYMBOL,
+    A_POINTER,
+    A_SEMI,
+    A_COMMA,
+    A_DEFFLOAT,
+    A_DEFSYM,
+    A_DOLLAR, 
+    A_DOLLSYM,
+    A_GIMME,
+    A_CANT
+}  t_atomtype;
+
+#define A_DEFSYMBOL A_DEFSYM    /* better name for this */
+
+typedef struct _atom
+{
+    t_atomtype a_type;
+    union word a_w;
+} t_atom;
+
+EXTERN_STRUCT _class;
+#define t_class struct _class
+
+EXTERN_STRUCT _outlet;
+#define t_outlet struct _outlet
+
+EXTERN_STRUCT _inlet;
+#define t_inlet struct _inlet
+
+EXTERN_STRUCT _binbuf;
+#define t_binbuf struct _binbuf
+
+EXTERN_STRUCT _clock;
+#define t_clock struct _clock
+
+EXTERN_STRUCT _outconnect;
+#define t_outconnect struct _outconnect
+
+EXTERN_STRUCT _glist;
+#define t_glist struct _glist
+#define t_canvas struct _glist  /* LATER lose this */
+
+typedef t_class *t_pd;      /* pure datum: nothing but a class pointer */
+
+typedef struct _gobj        /* a graphical object */
+{
+    t_pd g_pd;              /* pure datum header (class) */
+    struct _gobj *g_next;   /* next in list */
+} t_gobj;
+
+typedef struct _scalar      /* a graphical object holding data */
+{
+    t_gobj sc_gobj;         /* header for graphical object */
+    t_symbol *sc_template;  /* template name (LATER replace with pointer) */
+    t_word sc_vec[1];       /* indeterminate-length array of words */
+} t_scalar;
+
+typedef struct _text        /* patchable object - graphical, with text */
+{
+    t_gobj te_g;                /* header for graphical object */
+    t_binbuf *te_binbuf;        /* holder for the text */
+    t_outlet *te_outlet;        /* linked list of outlets */
+    t_inlet *te_inlet;          /* linked list of inlets */
+    short te_xpix;              /* x&y location (within the toplevel) */
+    short te_ypix;
+    short te_width;             /* requested width in chars, 0 if auto */
+    unsigned int te_type:2;     /* from defs below */
+} t_text;
+
+#define T_TEXT 0        /* just a textual comment */
+#define T_OBJECT 1      /* a MAX style patchable object */
+#define T_MESSAGE 2     /* a MAX stype message */
+#define T_ATOM 3        /* a cell to display a number or symbol */
+
+#define te_pd te_g.g_pd
+
+   /* t_object is synonym for t_text (LATER unify them) */
+
+typedef struct _text t_object;
+
+#define ob_outlet te_outlet
+#define ob_inlet te_inlet
+#define ob_binbuf te_binbuf
+#define ob_pd te_g.g_pd
+#define ob_g te_g
+
+typedef void (*t_method)(void);
+typedef void *(*t_newmethod)( void);
+typedef void (*t_gotfn)(void *x, ...);
+
+/* ---------------- pre-defined objects and symbols --------------*/
+EXTERN t_pd pd_objectmaker;     /* factory for creating "object" boxes */
+EXTERN t_pd pd_canvasmaker;     /* factory for creating canvases */
+EXTERN t_symbol s_pointer;
+EXTERN t_symbol s_float;
+EXTERN t_symbol s_symbol;
+EXTERN t_symbol s_bang;
+EXTERN t_symbol s_list;
+EXTERN t_symbol s_anything;
+EXTERN t_symbol s_signal;
+EXTERN t_symbol s__N;
+EXTERN t_symbol s__X;
+EXTERN t_symbol s_x;
+EXTERN t_symbol s_y;
+EXTERN t_symbol s_;
+
+/* --------- prototypes from the central message system ----------- */
+EXTERN void pd_typedmess(t_pd *x, t_symbol *s, int argc, t_atom *argv);
+EXTERN void pd_forwardmess(t_pd *x, int argc, t_atom *argv);
+EXTERN t_symbol *gensym(char *s);
+EXTERN t_gotfn getfn(t_pd *x, t_symbol *s);
+EXTERN t_gotfn zgetfn(t_pd *x, t_symbol *s);
+EXTERN void nullfn(void);
+EXTERN void pd_vmess(t_pd *x, t_symbol *s, char *fmt, ...);
+#define mess0(x, s) ((*getfn((x), (s)))((x)))
+#define mess1(x, s, a) ((*getfn((x), (s)))((x), (a)))
+#define mess2(x, s, a,b) ((*getfn((x), (s)))((x), (a),(b)))
+#define mess3(x, s, a,b,c) ((*getfn((x), (s)))((x), (a),(b),(c)))
+#define mess4(x, s, a,b,c,d) ((*getfn((x), (s)))((x), (a),(b),(c),(d)))
+#define mess5(x, s, a,b,c,d,e) ((*getfn((x), (s)))((x), (a),(b),(c),(d),(e)))
+EXTERN void obj_list(t_object *x, t_symbol *s, int argc, t_atom *argv);
+EXTERN t_pd *pd_newest(void);
+
+/* --------------- memory management -------------------- */
+EXTERN void *getbytes(size_t nbytes);
+EXTERN void *getzbytes(size_t nbytes);
+EXTERN void *copybytes(void *src, size_t nbytes);
+EXTERN void freebytes(void *x, size_t nbytes);
+EXTERN void *resizebytes(void *x, size_t oldsize, size_t newsize);
+
+/* -------------------- atoms ----------------------------- */
+
+#define SETSEMI(atom) ((atom)->a_type = A_SEMI, (atom)->a_w.w_index = 0)
+#define SETCOMMA(atom) ((atom)->a_type = A_COMMA, (atom)->a_w.w_index = 0)
+#define SETPOINTER(atom, gp) ((atom)->a_type = A_POINTER, \
+    (atom)->a_w.w_gpointer = (gp))
+#define SETFLOAT(atom, f) ((atom)->a_type = A_FLOAT, (atom)->a_w.w_float = (f))
+#define SETSYMBOL(atom, s) ((atom)->a_type = A_SYMBOL, \
+    (atom)->a_w.w_symbol = (s))
+#define SETDOLLAR(atom, n) ((atom)->a_type = A_DOLLAR, \
+    (atom)->a_w.w_index = (n))
+#define SETDOLLSYM(atom, s) ((atom)->a_type = A_DOLLSYM, \
+    (atom)->a_w.w_symbol= (s))
+
+EXTERN t_float atom_getfloat(t_atom *a);
+EXTERN t_int atom_getint(t_atom *a);
+EXTERN t_symbol *atom_getsymbol(t_atom *a);
+EXTERN t_symbol *atom_gensym(t_atom *a);
+EXTERN t_float atom_getfloatarg(int which, int argc, t_atom *argv);
+EXTERN t_int atom_getintarg(int which, int argc, t_atom *argv);
+EXTERN t_symbol *atom_getsymbolarg(int which, int argc, t_atom *argv);
+
+EXTERN void atom_string(t_atom *a, char *buf, unsigned int bufsize);
+
+/* ------------------  binbufs --------------- */
+
+EXTERN t_binbuf *binbuf_new(void);
+EXTERN void binbuf_free(t_binbuf *x);
+EXTERN t_binbuf *binbuf_duplicate(t_binbuf *y);
+
+EXTERN void binbuf_text(t_binbuf *x, char *text, size_t size);
+EXTERN void binbuf_gettext(t_binbuf *x, char **bufp, int *lengthp);
+EXTERN void binbuf_clear(t_binbuf *x);
+EXTERN void binbuf_add(t_binbuf *x, int argc, t_atom *argv);
+EXTERN void binbuf_addv(t_binbuf *x, char *fmt, ...);
+EXTERN void binbuf_addbinbuf(t_binbuf *x, t_binbuf *y);
+EXTERN void binbuf_addsemi(t_binbuf *x);
+EXTERN void binbuf_restore(t_binbuf *x, int argc, t_atom *argv);
+EXTERN void binbuf_print(t_binbuf *x);
+EXTERN int binbuf_getnatom(t_binbuf *x);
+EXTERN t_atom *binbuf_getvec(t_binbuf *x);
+EXTERN void binbuf_eval(t_binbuf *x, t_pd *target, int argc, t_atom *argv);
+EXTERN int binbuf_read(t_binbuf *b, char *filename, char *dirname,
+    int crflag);
+EXTERN int binbuf_read_via_path(t_binbuf *b, char *filename, char *dirname,
+    int crflag);
+EXTERN int binbuf_write(t_binbuf *x, char *filename, char *dir,
+    int crflag);
+EXTERN void binbuf_evalfile(t_symbol *name, t_symbol *dir);
+EXTERN t_symbol *binbuf_realizedollsym(t_symbol *s, int ac, t_atom *av,
+    int tonew);
+
+/* ------------------  clocks --------------- */
+
+EXTERN t_clock *clock_new(void *owner, t_method fn);
+EXTERN void clock_set(t_clock *x, double systime);
+EXTERN void clock_delay(t_clock *x, double delaytime);
+EXTERN void clock_unset(t_clock *x);
+EXTERN double clock_getlogicaltime(void);
+EXTERN double clock_getsystime(void); /* OBSOLETE; use clock_getlogicaltime() */
+EXTERN double clock_gettimesince(double prevsystime);
+EXTERN double clock_getsystimeafter(double delaytime);
+EXTERN void clock_free(t_clock *x);
+
+/* ----------------- pure data ---------------- */
+EXTERN t_pd *pd_new(t_class *cls);
+EXTERN void pd_free(t_pd *x);
+EXTERN void pd_bind(t_pd *x, t_symbol *s);
+EXTERN void pd_unbind(t_pd *x, t_symbol *s);
+EXTERN t_pd *pd_findbyclass(t_symbol *s, t_class *c);
+EXTERN void pd_pushsym(t_pd *x);
+EXTERN void pd_popsym(t_pd *x);
+EXTERN t_symbol *pd_getfilename(void);
+EXTERN t_symbol *pd_getdirname(void);
+EXTERN void pd_bang(t_pd *x);
+EXTERN void pd_pointer(t_pd *x, t_gpointer *gp);
+EXTERN void pd_float(t_pd *x, t_float f);
+EXTERN void pd_symbol(t_pd *x, t_symbol *s);
+EXTERN void pd_list(t_pd *x, t_symbol *s, int argc, t_atom *argv);
+EXTERN void pd_anything(t_pd *x, t_symbol *s, int argc, t_atom *argv);
+#define pd_class(x) (*(x))
+
+/* ----------------- pointers ---------------- */
+EXTERN void gpointer_init(t_gpointer *gp);
+EXTERN void gpointer_copy(const t_gpointer *gpfrom, t_gpointer *gpto);
+EXTERN void gpointer_unset(t_gpointer *gp);
+EXTERN int gpointer_check(const t_gpointer *gp, int headok);
+
+/* ----------------- patchable "objects" -------------- */
+EXTERN t_inlet *inlet_new(t_object *owner, t_pd *dest, t_symbol *s1,
+    t_symbol *s2);
+EXTERN t_inlet *pointerinlet_new(t_object *owner, t_gpointer *gp);
+EXTERN t_inlet *floatinlet_new(t_object *owner, t_float *fp);
+EXTERN t_inlet *symbolinlet_new(t_object *owner, t_symbol **sp);
+EXTERN void inlet_free(t_inlet *x);
+
+EXTERN t_outlet *outlet_new(t_object *owner, t_symbol *s);
+EXTERN void outlet_bang(t_outlet *x);
+EXTERN void outlet_pointer(t_outlet *x, t_gpointer *gp);
+EXTERN void outlet_float(t_outlet *x, t_float f);
+EXTERN void outlet_symbol(t_outlet *x, t_symbol *s);
+EXTERN void outlet_list(t_outlet *x, t_symbol *s, int argc, t_atom *argv);
+EXTERN void outlet_anything(t_outlet *x, t_symbol *s, int argc, t_atom *argv);
+EXTERN t_symbol *outlet_getsymbol(t_outlet *x);
+EXTERN void outlet_free(t_outlet *x);
+EXTERN t_object *pd_checkobject(t_pd *x);
+
+
+/* -------------------- canvases -------------- */
+
+EXTERN void glob_setfilename(void *dummy, t_symbol *name, t_symbol *dir);
+
+EXTERN void canvas_setargs(int argc, t_atom *argv);
+EXTERN void canvas_getargs(int *argcp, t_atom **argvp);
+EXTERN t_symbol *canvas_getcurrentdir(void);
+EXTERN t_glist *canvas_getcurrent(void);
+EXTERN void canvas_makefilename(t_glist *c, char *file,
+    char *result,int resultsize);
+EXTERN t_symbol *canvas_getdir(t_glist *x);
+EXTERN int sys_fontwidth(int fontsize);
+EXTERN int sys_fontheight(int fontsize);
+EXTERN void canvas_dataproperties(t_glist *x, t_scalar *sc, t_binbuf *b);
+
+/* ---------------- widget behaviors ---------------------- */
+
+EXTERN_STRUCT _widgetbehavior;
+#define t_widgetbehavior struct _widgetbehavior
+
+EXTERN_STRUCT _parentwidgetbehavior;
+#define t_parentwidgetbehavior struct _parentwidgetbehavior
+EXTERN t_parentwidgetbehavior *pd_getparentwidget(t_pd *x);
+
+/* -------------------- classes -------------- */
+
+#define CLASS_DEFAULT 0         /* flags for new classes below */
+#define CLASS_PD 1
+#define CLASS_GOBJ 2
+#define CLASS_PATCHABLE 3
+#define CLASS_NOINLET 8
+
+#define CLASS_TYPEMASK 3
+
+
+EXTERN t_class *class_new(t_symbol *name, t_newmethod newmethod,
+    t_method freemethod, size_t size, int flags, t_atomtype arg1, ...);
+EXTERN void class_addcreator(t_newmethod newmethod, t_symbol *s, 
+    t_atomtype type1, ...);
+EXTERN void class_addmethod(t_class *c, t_method fn, t_symbol *sel,
+    t_atomtype arg1, ...);
+EXTERN void class_addbang(t_class *c, t_method fn);
+EXTERN void class_addpointer(t_class *c, t_method fn);
+EXTERN void class_doaddfloat(t_class *c, t_method fn);
+EXTERN void class_addsymbol(t_class *c, t_method fn);
+EXTERN void class_addlist(t_class *c, t_method fn);
+EXTERN void class_addanything(t_class *c, t_method fn);
+EXTERN void class_sethelpsymbol(t_class *c, t_symbol *s);
+EXTERN void class_setwidget(t_class *c, t_widgetbehavior *w);
+EXTERN void class_setparentwidget(t_class *c, t_parentwidgetbehavior *w);
+EXTERN t_parentwidgetbehavior *class_parentwidget(t_class *c);
+EXTERN char *class_getname(t_class *c);
+EXTERN char *class_gethelpname(t_class *c);
+EXTERN void class_setdrawcommand(t_class *c);
+EXTERN int class_isdrawcommand(t_class *c);
+EXTERN void class_domainsignalin(t_class *c, int onset);
+#define CLASS_MAINSIGNALIN(c, type, field) \
+    class_domainsignalin(c, (char *)(&((type *)0)->field) - (char *)0)
+
+         /* prototype for functions to save Pd's to a binbuf */
+typedef void (*t_savefn)(t_gobj *x, t_binbuf *b);
+EXTERN void class_setsavefn(t_class *c, t_savefn f);
+EXTERN t_savefn class_getsavefn(t_class *c);
+        /* prototype for functions to open properties dialogs */
+typedef void (*t_propertiesfn)(t_gobj *x, struct _glist *glist);
+EXTERN void class_setpropertiesfn(t_class *c, t_propertiesfn f);
+EXTERN t_propertiesfn class_getpropertiesfn(t_class *c);
+
+#ifndef PD_CLASS_DEF
+#define class_addbang(x, y) class_addbang((x), (t_method)(y))
+#define class_addpointer(x, y) class_addpointer((x), (t_method)(y))
+#define class_addfloat(x, y) class_doaddfloat((x), (t_method)(y))
+#define class_addsymbol(x, y) class_addsymbol((x), (t_method)(y))
+#define class_addlist(x, y) class_addlist((x), (t_method)(y))
+#define class_addanything(x, y) class_addanything((x), (t_method)(y))
+#endif
+
+/* ------------   printing --------------------------------- */
+EXTERN void post(const char *fmt, ...);
+EXTERN void startpost(const char *fmt, ...);
+EXTERN void poststring(const char *s);
+EXTERN void postfloat(float f);
+EXTERN void postatom(int argc, t_atom *argv);
+EXTERN void endpost(void);
+EXTERN void error(const char *fmt, ...);
+EXTERN void bug(const char *fmt, ...);
+EXTERN void pd_error(void *object, const char *fmt, ...);
+EXTERN void sys_logerror(const char *object, const char *s);
+EXTERN void sys_unixerror(const char *object);
+EXTERN void sys_ouch(void);
+
+
+/* ------------  system interface routines ------------------- */
+EXTERN int sys_isreadablefile(const char *name);
+EXTERN void sys_bashfilename(const char *from, char *to);
+EXTERN void sys_unbashfilename(const char *from, char *to);
+EXTERN int open_via_path(const char *name, const char *ext, const char *dir,
+    char *dirresult, char **nameresult, unsigned int size, int bin);
+EXTERN int sched_geteventno(void);
+EXTERN double sys_getrealtime(void);
+
+
+/* ------------  threading ------------------- */
+/* T.Grill - see m_sched.c */
+ 
+EXTERN void sys_lock(void);
+EXTERN void sys_unlock(void);
+EXTERN int sys_trylock(void);
+
+
+/* --------------- signals ----------------------------------- */
+
+typedef float t_sample;
+#define MAXLOGSIG 32
+#define MAXSIGSIZE (1 << MAXLOGSIG)
+
+typedef struct _signal
+{
+    int s_n;            /* number of points in the array */
+    t_sample *s_vec;    /* the array */
+    float s_sr;         /* sample rate */
+    int s_refcount;     /* number of times used */
+    int s_isborrowed;   /* whether we're going to borrow our array */
+    struct _signal *s_borrowedfrom;     /* signal to borrow it from */
+    struct _signal *s_nextfree;         /* next in freelist */
+    struct _signal *s_nextused;         /* next in used list */
+} t_signal;
+
+
+typedef t_int *(*t_perfroutine)(t_int *args);
+
+EXTERN t_int *plus_perform(t_int *args);
+EXTERN t_int *zero_perform(t_int *args);
+EXTERN t_int *copy_perform(t_int *args);
+
+EXTERN void dsp_add_plus(t_sample *in1, t_sample *in2, t_sample *out, int n);
+EXTERN void dsp_add_copy(t_sample *in, t_sample *out, int n);
+EXTERN void dsp_add_scalarcopy(t_sample *in, t_sample *out, int n);
+EXTERN void dsp_add_zero(t_sample *out, int n);
+
+EXTERN int sys_getblksize(void);
+EXTERN float sys_getsr(void);
+EXTERN int sys_get_inchannels(void);
+EXTERN int sys_get_outchannels(void);
+
+EXTERN void dsp_add(t_perfroutine f, int n, ...);
+EXTERN void dsp_addv(t_perfroutine f, int n, t_int *vec);
+EXTERN void pd_fft(float *buf, int npoints, int inverse);
+EXTERN int ilog2(int n);
+
+EXTERN void mayer_fht(float *fz, int n);
+EXTERN void mayer_fft(int n, float *real, float *imag);
+EXTERN void mayer_ifft(int n, float *real, float *imag);
+EXTERN void mayer_realfft(int n, float *real);
+EXTERN void mayer_realifft(int n, float *real);
+
+EXTERN float *cos_table;
+#define LOGCOSTABSIZE 9
+#define COSTABSIZE (1<<LOGCOSTABSIZE)
+
+EXTERN int canvas_suspend_dsp(void);
+EXTERN void canvas_resume_dsp(int oldstate);
+EXTERN void canvas_update_dsp(void);
+
+/* IOhannes { (up/downsampling) */
+typedef struct _resample
+{
+  int method;       /* up/downsampling method ID */
+
+  t_int downsample; /* downsampling factor */
+  t_int upsample;   /* upsampling factor */
+
+  t_float *s_vec;   /* here we hold the resampled data */
+  int      s_n;
+
+  t_float *coeffs;  /* coefficients for filtering... */
+  int      coefsize;
+
+  t_float *buffer;  /* buffer for filtering */
+  int      bufsize;
+} t_resample;
+
+EXTERN void resample_init(t_resample *x);
+EXTERN void resample_free(t_resample *x);
+
+EXTERN void resample_dsp(t_resample *x, t_sample *in, int insize, t_sample *out, int outsize, int method);
+EXTERN void resamplefrom_dsp(t_resample *x, t_sample *in, int insize, int outsize, int method);
+EXTERN void resampleto_dsp(t_resample *x, t_sample *out, int insize, int outsize, int method);
+/* } IOhannes */
+
+/* ----------------------- utility functions for signals -------------- */
+EXTERN float mtof(float);
+EXTERN float ftom(float);
+EXTERN float rmstodb(float);
+EXTERN float powtodb(float);
+EXTERN float dbtorms(float);
+EXTERN float dbtopow(float);
+
+EXTERN float q8_sqrt(float);
+EXTERN float q8_rsqrt(float);
+#ifndef N32     
+EXTERN float qsqrt(float);  /* old names kept for extern compatibility */
+EXTERN float qrsqrt(float);
+#endif
+/* --------------------- data --------------------------------- */
+
+    /* graphical arrays */
+EXTERN_STRUCT _garray;
+#define t_garray struct _garray
+
+EXTERN t_class *garray_class;
+EXTERN int garray_getfloatarray(t_garray *x, int *size, t_float **vec);
+EXTERN float garray_get(t_garray *x, t_symbol *s, t_int indx);
+EXTERN void garray_redraw(t_garray *x);
+EXTERN int garray_npoints(t_garray *x);
+EXTERN char *garray_vec(t_garray *x);
+EXTERN void garray_resize(t_garray *x, t_floatarg f);
+EXTERN void garray_usedindsp(t_garray *x);
+EXTERN void garray_setsaveit(t_garray *x, int saveit);
+EXTERN t_class *scalar_class;
+
+EXTERN t_float *value_get(t_symbol *s);
+EXTERN void value_release(t_symbol *s);
+EXTERN int value_getfloat(t_symbol *s, t_float *f);
+EXTERN int value_setfloat(t_symbol *s, t_float f);
+
+/* ------- GUI interface - functions to send strings to TK --------- */
+typedef void (*t_guicallbackfn)(t_gobj *client, t_glist *glist);
+
+EXTERN void sys_vgui(char *fmt, ...);
+EXTERN void sys_gui(char *s);
+EXTERN void sys_pretendguibytes(int n);
+EXTERN void sys_queuegui(void *client, t_glist *glist, t_guicallbackfn f);
+EXTERN void sys_unqueuegui(void *client);
+    /* dialog window creation and destruction */
+EXTERN void gfxstub_new(t_pd *owner, void *key, const char *cmd);
+EXTERN void gfxstub_deleteforkey(void *key);
+
+extern t_class *glob_pdobject;  /* object to send "pd" messages */
+
+/*-------------  Max 0.26 compatibility --------------------*/
+
+/* the following reflects the new way classes are laid out, with the class
+   pointing to the messlist and not vice versa. Externs shouldn't feel it. */
+typedef t_class *t_externclass;
+
+EXTERN void c_extern(t_externclass *cls, t_newmethod newroutine,
+    t_method freeroutine, t_symbol *name, size_t size, int tiny, \
+    t_atomtype arg1, ...);
+EXTERN void c_addmess(t_method fn, t_symbol *sel, t_atomtype arg1, ...);
+
+#define t_getbytes getbytes
+#define t_freebytes freebytes
+#define t_resizebytes resizebytes
+#define typedmess pd_typedmess
+#define vmess pd_vmess
+
+/* A definition to help gui objects straddle 0.34-0.35 changes.  If this is
+defined, there is a "te_xpix" field in objects, not a "te_xpos" as before: */
+
+#define PD_USE_TE_XPIX
+
+
+#ifdef __i386__
+/* a test for NANs and denormals.  Should only be necessary on i386. */
+#define PD_BADFLOAT(f) ((((*(unsigned int*)&(f))&0x7f800000)==0) || \
+    (((*(unsigned int*)&(f))&0x7f800000)==0x7f800000))
+/* more stringent test: anything not between 1e-19 and 1e19 in absolute val */
+#define PD_BIGORSMALL(f) ((((*(unsigned int*)&(f))&0x60000000)==0) || \
+    (((*(unsigned int*)&(f))&0x60000000)==0x60000000))
+#else
+#define PD_BADFLOAT(f) 0
+#define PD_BIGORSMALL(f) 0
+#endif
+
+#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus)
+}
+#endif
+
+#define __m_pd_h_
+#endif /* __m_pd_h_ */
diff --git a/externals/fftease/makewindows.c b/externals/fftease/makewindows.c
new file mode 100644
index 0000000000000000000000000000000000000000..9c71e84ed3c11cedf210c138a260e9b248573bd9
--- /dev/null
+++ b/externals/fftease/makewindows.c
@@ -0,0 +1,137 @@
+#include "fftease.h"
+
+void fftease_makewindows( t_float *H, t_float *A, t_float *S, int Nw, int N, int I )
+
+{
+ int i ;
+ t_float sum ;
+
+    for ( i = 0 ; i < Nw ; i++ )
+	H[i] = A[i] = S[i] = 0.54 - 0.46*cos( TWOPI*i/(Nw - 1) ) ;
+
+    if ( Nw > N ) {
+     t_float x ;
+
+	x = -(Nw - 1)/2. ;
+	for ( i = 0 ; i < Nw ; i++, x += 1. )
+	    if ( x != 0. ) {
+		A[i] *= N*sin( PI*x/N )/(PI*x) ;
+		if ( I )
+		    S[i] *= I*sin( PI*x/I )/(PI*x) ;
+	    }
+    }
+
+    for ( sum = i = 0 ; i < Nw ; i++ )
+	sum += A[i] ;
+
+    for ( i = 0 ; i < Nw ; i++ ) {
+     t_float afac = 2./sum ;
+     t_float sfac = Nw > N ? 1./afac : afac ;
+	A[i] *= afac ;
+	S[i] *= sfac ;
+    }
+
+    if ( Nw <= N && I ) {
+	for ( sum = i = 0 ; i < Nw ; i += I )
+	    sum += S[i]*S[i] ;
+	for ( sum = 1./sum, i = 0 ; i < Nw ; i++ )
+	    S[i] *= sum ;
+    }
+}
+
+void fftease_makehamming( t_float *H, t_float *A, t_float *S, int Nw, int N, int I, int odd )
+
+{
+ int i;
+ t_float sum ;
+
+
+
+ if (odd) {
+    for ( i = 0 ; i < Nw ; i++ )
+	  H[i] = A[i] = S[i] = sqrt(0.54 - 0.46*cos( TWOPI*i/(Nw - 1) ));
+ }
+
+ else {
+
+   for ( i = 0 ; i < Nw ; i++ )
+	  H[i] = A[i] = S[i] = 0.54 - 0.46*cos( TWOPI*i/(Nw - 1) );
+
+ }
+
+    if ( Nw > N ) {
+     t_float x ;
+
+	x = -(Nw - 1)/2. ;
+	for ( i = 0 ; i < Nw ; i++, x += 1. )
+	    if ( x != 0. ) {
+		A[i] *= N*sin( PI*x/N )/(PI*x) ;
+		if ( I )
+		    S[i] *= I*sin( PI*x/I )/(PI*x) ;
+	    }
+    }
+    for ( sum = i = 0 ; i < Nw ; i++ )
+	sum += A[i] ;
+
+    for ( i = 0 ; i < Nw ; i++ ) {
+     t_float afac = 2./sum ;
+     t_float sfac = Nw > N ? 1./afac : afac ;
+	A[i] *= afac ;
+	S[i] *= sfac ;
+    }
+
+    if ( Nw <= N && I ) {
+	for ( sum = i = 0 ; i < Nw ; i += I )
+	    sum += S[i]*S[i] ;
+	for ( sum = 1./sum, i = 0 ; i < Nw ; i++ )
+	    S[i] *= sum ;
+    }
+}
+
+
+void fftease_makehanning( t_float *H, t_float *A, t_float *S, int Nw, int N, int I, int odd )
+{
+ int i;
+ t_float sum ;
+
+
+ if (odd) {
+    for ( i = 0 ; i < Nw ; i++ )
+	  H[i] = A[i] = S[i] = sqrt(0.5 * (1. + cos(PI + TWOPI * i / (Nw - 1))));
+ }
+
+ else {
+
+   for ( i = 0 ; i < Nw ; i++ )
+	  H[i] = A[i] = S[i] = 0.5 * (1. + cos(PI + TWOPI * i / (Nw - 1)));
+
+ }
+
+    if ( Nw > N ) {
+     t_float x ;
+
+	x = -(Nw - 1)/2. ;
+	for ( i = 0 ; i < Nw ; i++, x += 1. )
+	    if ( x != 0. ) {
+		A[i] *= N*sin( PI*x/N )/(PI*x) ;
+		if ( I )
+		    S[i] *= I*sin( PI*x/I )/(PI*x) ;
+	    }
+    }
+    for ( sum = i = 0 ; i < Nw ; i++ )
+	sum += A[i] ;
+
+    for ( i = 0 ; i < Nw ; i++ ) {
+     t_float afac = 2./sum ;
+     t_float sfac = Nw > N ? 1./afac : afac ;
+	A[i] *= afac ;
+	S[i] *= sfac ;
+    }
+
+    if ( Nw <= N && I ) {
+	for ( sum = i = 0 ; i < Nw ; i += I )
+	    sum += S[i]*S[i] ;
+	for ( sum = 1./sum, i = 0 ; i < Nw ; i++ )
+	    S[i] *= sum ;
+    }
+}
diff --git a/externals/fftease/mindwarp~.c b/externals/fftease/mindwarp~.c
new file mode 100644
index 0000000000000000000000000000000000000000..a215ab8128addfb542b25f419f78cb12c281ad0f
--- /dev/null
+++ b/externals/fftease/mindwarp~.c
@@ -0,0 +1,383 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *mindwarp_class;
+
+#define OBJECT_NAME "mindwarp~"
+
+#define MAX_WARP 16.0
+
+typedef struct _mindwarp
+{
+	t_object x_obj;
+    float x_f;
+	t_fftease *fft;
+    t_float warpFactor;
+    t_float shapeWidth;
+	t_float *newChannel;
+    t_float *newAmplitudes;
+	short mute;
+} t_mindwarp;
+
+void mindwarp_dsp(t_mindwarp *x, t_signal **sp);
+t_int *mindwarp_perform(t_int *w);
+void *mindwarp_new(t_symbol *s, int argc, t_atom *argv);
+void mindwarp_dest(t_mindwarp *x, t_float f);
+void mindwarp_init(t_mindwarp *x);
+void mindwarp_free(t_mindwarp *x);
+void mindwarp_mute(t_mindwarp *x, t_floatarg toggle);
+
+void mindwarp_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("mindwarp~"), (t_newmethod)mindwarp_new,
+                  (t_method)mindwarp_free,sizeof(t_mindwarp), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_mindwarp, x_f);
+	class_addmethod(c,(t_method)mindwarp_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)mindwarp_mute,gensym("mute"),A_FLOAT,0);
+    mindwarp_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void *mindwarp_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_fftease *fft;
+	t_mindwarp *x = (t_mindwarp *)pd_new(mindwarp_class);
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+    
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	
+	/* args: warpfactor, shape width, overlap, window factor */
+	
+  	x->warpFactor = 1.0;
+  	x->shapeWidth = 3.0;
+	
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+	
+}
+
+void mindwarp_init(t_mindwarp *x)
+{
+	short initialized = x->fft->initialized;
+	
+	fftease_init(x->fft);
+	
+	if(!initialized){
+		x->mute = 0;
+		x->newAmplitudes = (t_float *)calloc(((x->fft->N2 + 1) * 16), sizeof(t_float));
+		x->newChannel = (t_float *)calloc ((x->fft->N + 1), sizeof(t_float));
+	}
+    else if(initialized == 1) {
+		x->newAmplitudes = (t_float *)realloc(x->newAmplitudes, ((x->fft->N2 + 1) * 16) * sizeof(float));
+		x->newChannel = (t_float *)realloc(x->newChannel, (x->fft->N + 1) * sizeof(t_float));
+	}
+}
+
+void mindwarp_free(t_mindwarp *x)
+{
+    short initialized = x->fft->initialized;
+	fftease_free(x->fft);
+    free(x->fft);
+    if(initialized){
+        free(x->newAmplitudes);
+        free(x->newChannel);
+    }
+}
+
+void do_mindwarp(t_mindwarp *x)
+{
+	t_float *newChannel = x->newChannel;
+	
+	int		
+	i,j,
+	bindex,
+	N,
+	N2,
+	Nw,
+	shapeWidth = (int) x->shapeWidth,
+	remainingWidth,
+	newLength;
+float
+	cutoff,
+	filterMult,
+	interpIncr,
+	interpPhase;
+	t_float warpFactor;
+	t_fftease *fft = x->fft;
+	t_float *newAmplitudes = x->newAmplitudes;
+	t_float *channelOne = fft->channel;
+	
+	N = fft->N;
+	N2 = fft->N2;
+	Nw = fft->Nw;
+	warpFactor = x->warpFactor;
+	cutoff = (t_float) N2 * .9;
+	filterMult = .00001;
+	
+	fftease_fold(fft);
+	fftease_rdft(fft,FFT_FORWARD);
+	fftease_leanconvert(fft);
+	
+	if(warpFactor <= 0){
+		error("bad warp, resetting");
+		warpFactor = 1.0;
+	}
+	
+	newLength = (int) ((t_float) N2 / warpFactor);
+	
+	if(newLength <= 0){
+		error("bad length: resetting");
+		newLength = 1.0;
+	}
+	
+	interpIncr = (t_float) N2 / (t_float) newLength;
+	
+	interpPhase = 0.;
+	
+	
+	// do simple linear interpolation on magnitudes
+	
+	for ( bindex=0; bindex < newLength; bindex++ ) {
+		
+		int		localbindex = ((int) interpPhase) << 1;
+		
+		t_float	lower = *(channelOne + localbindex),
+		upper = *(channelOne + localbindex + 2),
+		diff = interpPhase - ( (t_float) ( (int) interpPhase ) );
+		
+		*(newAmplitudes+bindex) = lower + ( ( upper - lower ) * diff );
+		
+		interpPhase += interpIncr;
+	}
+	
+	
+	
+	// replace magnitudes with warped values 
+	
+	if (warpFactor > 1.) {
+		
+		int	until = (int) ( cutoff / warpFactor );
+		
+		for ( bindex=0; bindex < until; bindex++ ) {
+			register int	amp = bindex<<1;
+			
+			*(newChannel+amp) = *(newAmplitudes+bindex);
+		}
+		
+		
+		// filter remaining spectrum as spectral envelope has shrunk 
+		
+		for ( bindex=until; bindex < N2; bindex++ ) {
+			register int	amp = bindex<<1;
+			
+			*(newChannel+amp) *= filterMult;
+		}
+	}
+	
+	
+	//OK
+	
+	// spectral envelope has enlarged, no post filtering is necessary
+	
+	else {
+		
+		for ( bindex=0; bindex <= N2; bindex++ ) {
+			register int	amp = bindex<<1;
+			
+			*(newChannel+amp) = *(newAmplitudes+bindex);
+		}
+	}
+	
+	
+	
+	// constrain our shapeWidth value
+	
+	if ( shapeWidth > N2 )
+		shapeWidth = N2;
+  	
+	if ( shapeWidth < 1 )
+		shapeWidth = 1;
+	
+	// lets just shape the entire signal by the shape width 
+	
+	
+	for ( i=0; i < N; i += shapeWidth << 1 ) {
+		
+		t_float       amplSum = 0.,
+		freqSum = 0.,
+		factor = 1.0;
+		
+		for ( j = 0; j < shapeWidth << 1; j += 2 ) {
+			
+			amplSum += *(newChannel+i+j);
+			freqSum += *(channelOne+i+j);
+		}
+		
+		if (amplSum < 0.000000001)
+			factor = 0.000000001;	
+		
+		// this can happen, crashing external; now fixed.
+		
+		if( freqSum <= 0 ){
+			//		error("bad freq sum, resetting");
+			freqSum = 1.0;
+		}
+		else	
+			factor = amplSum / freqSum;
+		
+		for ( j = 0; j < shapeWidth << 1; j += 2 )
+			*(channelOne+i+j) *= factor;
+	}
+	
+	// copy remaining magnitudes (fixed shadowed variable warning by renaming bindex)
+	
+	if ( (remainingWidth = N2 % shapeWidth) ) {
+		
+		int			lbindex = (N2 - remainingWidth) << 1;
+		
+		
+		t_float       amplSum = 0.,
+		freqSum = 0.,
+		factor;
+		
+		for ( j = 0; j < remainingWidth << 1; j += 2 ) {
+			
+			amplSum += *(newChannel+lbindex+j);
+			freqSum += *(channelOne+lbindex+j);
+		}
+		
+		if (amplSum < 0.000000001)
+			factor = 0.000000001;	
+		
+		else	
+			factor = amplSum / freqSum;
+		
+		for ( j = 0; j < remainingWidth << 1; j += 2 )
+			*(channelOne+bindex+j) *= factor;
+	}
+
+	fftease_leanunconvert(fft);
+
+	fftease_rdft(fft,FFT_INVERSE);
+	fftease_overlapadd(fft);
+	
+}
+
+
+t_int *mindwarp_perform(t_int *w)
+{
+    t_mindwarp *x = (t_mindwarp *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *vec_warpFactor = (t_float *)(w[3]);
+	t_float *vec_shapeWidth = (t_float *)(w[4]);
+	t_float *MSPOutputVector = (t_float *)(w[5]);
+	t_fftease *fft = x->fft;
+	
+	int i, j;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float mult = fft->mult;	
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	int MSPVectorSize = fft->MSPVectorSize;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;	
+	
+	if(x->mute){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+6;
+	}
+
+	x->warpFactor = *vec_warpFactor;
+	x->shapeWidth =  *vec_shapeWidth;
+	
+	if(x->warpFactor <= 0.0){
+		x->warpFactor = 0.1;
+		error("%s: zero warp factor is illegal",OBJECT_NAME);
+	}
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_mindwarp(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_mindwarp(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_mindwarp(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+6;
+}	
+
+void mindwarp_mute(t_mindwarp *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;
+}
+
+void mindwarp_dsp(t_mindwarp *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        mindwarp_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(mindwarp_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec);
+    }
+}
+
diff --git a/externals/fftease/morphine~.c b/externals/fftease/morphine~.c
new file mode 100644
index 0000000000000000000000000000000000000000..8e5be29cf528444cf832eae1e74fa2e19ecee16b
--- /dev/null
+++ b/externals/fftease/morphine~.c
@@ -0,0 +1,392 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+/*
+ This external links to qsortE, so unlike others in this collection, morphine~ is covered under the GNU GPL.
+ */
+static t_class *morphine_class;
+
+#define OBJECT_NAME "morphine~"
+
+typedef struct _pickme {
+	
+	int		bin;
+	float		value;
+	
+} pickme;
+
+
+typedef struct _morphine
+{
+
+    t_object x_obj;
+    t_float x_f;
+	t_fftease *fft;
+	t_fftease *fft2;
+    pickme *picks;
+    pickme *mirror;
+    t_float morphIndex;
+    t_float exponScale;	
+	short mute;
+} t_morphine;
+
+void morphine_dsp(t_morphine *x, t_signal **sp);
+t_int *morphine_perform(t_int *w);
+void *morphine_new(t_symbol *s, int argc, t_atom *argv);
+int sortIncreasing( const void *a, const void *b );
+int qsortE (char *base_ptr, int total_elems, int size, int (*cmp)(const void *a, const void *b));
+void morphine_transition(t_morphine *x, t_floatarg f);
+void morphine_free(t_morphine *x);
+void morphine_mute(t_morphine *x, t_floatarg toggle);
+void morphine_tilde_setup(void);
+void morphine_init(t_morphine *x);
+
+int sortIncreasing( const void *a, const void *b )
+{
+	
+	if ( ((pickme *) a)->value > ((pickme *) b)->value )
+		return 1;
+	
+	if ( ((pickme *) a)->value < ((pickme *) b)->value )
+		return -1;
+	
+	return 0;
+}
+
+void morphine_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("morphine~"), (t_newmethod)morphine_new,
+                  (t_method)morphine_free,sizeof(t_morphine), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_morphine, x_f);
+	class_addmethod(c,(t_method)morphine_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)morphine_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(c,(t_method)morphine_transition,gensym("transition"), A_FLOAT, 0);
+    morphine_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void morphine_transition(t_morphine *x, t_floatarg f)
+{	
+	x->exponScale = f;
+}
+
+void *morphine_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_fftease *fft, *fft2;	
+	t_morphine *x = (t_morphine *)pd_new(morphine_class);
+
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+    
+	x->fft = (t_fftease *)  calloc(1,sizeof(t_fftease));
+	x->fft2 = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft2 = x->fft2;
+	fft->initialized = 0;
+	fft2->initialized = 0;
+	x->exponScale = -5.0;	
+
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+	fft2->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft2->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft2->winfac = FFTEASE_DEFAULT_WINFAC;	
+    if(argc > 0){ fft->N = fft2->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = fft2->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+}
+
+void morphine_init(t_morphine *x)
+{
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	short initialized = fft->initialized;
+    
+	fftease_init(fft);
+	fftease_init(fft2);
+
+	if(!initialized){
+		x->morphIndex = 0.;
+		x->mute = 0;
+		x->picks = (pickme *) calloc((fft->N2+1), sizeof(pickme));
+		x->mirror = (pickme *) calloc((fft->N2+1), sizeof(pickme));
+	} else if(x->fft->initialized == 1) {
+		x->picks = (pickme *) realloc(x->picks, (fft->N2+1) * sizeof(pickme));
+		x->mirror = (pickme *) realloc(x->mirror, (fft->N2+1) * sizeof(pickme));
+	}
+}
+
+void do_morphine(t_morphine *x)
+{
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int	i;
+	int lookupIndex,even, odd;
+	t_float mult,
+	morphIndex,
+	exponScale,
+	a1, b1,
+	a2, b2;
+
+	t_float *bufferOne = fft->buffer;
+	t_float *bufferTwo = fft2->buffer;
+	t_float *channelOne = fft->channel;
+	t_float *channelTwo = fft2->channel;
+	int N2 = fft->N2;
+	pickme	*picks = x->picks;
+	pickme *mirror = x->mirror;
+	mult = fft->mult;	
+	morphIndex = x->morphIndex;
+	exponScale = x->exponScale;
+
+	fftease_fold(fft);
+	fftease_fold(fft2);
+	
+	/* do an fft */ 
+	
+	fftease_rdft(fft,1);
+	fftease_rdft(fft2,1);
+	
+	/* convert to polar coordinates from complex values */
+	
+    for ( i = 0; i <= N2; i++ ) {
+		odd = ( even = i<<1 ) + 1;
+		
+		a1 = ( i == N2 ? *(bufferOne+1) : *(bufferOne+even) );
+		b1 = ( i == 0 || i == N2 ? 0. : *(bufferOne+odd) );
+		
+		a2 = ( i == N2 ? *(bufferTwo+1) : *(bufferTwo+even) );
+		b2 = ( i == 0 || i == N2 ? 0. : *(bufferTwo+odd) );
+		
+		*(channelOne+even) = hypot( a1, b1 );
+		*(channelOne+odd) = -atan2( b1, a1 );
+		
+		*(channelTwo+even) = hypot( a2, b2 );
+		*(channelTwo+odd) = -atan2( b2, a2 );
+		
+		
+		/* find amplitude differences between home and visitors */
+		
+		(picks+i)->value = fabs( *(channelOne+even) - 
+								*(channelTwo+even) );
+		(picks+i)->bin = i;  
+    }
+	
+	/* sort our differences in ascending order */
+	
+	
+	qsortE( (char *) picks, (int) N2+1, (int) sizeof(pickme),
+		   sortIncreasing );
+	
+	/* now we create an effective mirror of the sorted distribution.
+	 we will assure that the initial transition will be made from
+	 small spectral differences (when the sort behavior is increasing)
+	 and the ending transition will also be made from small spectral
+	 differences */
+	
+	for ( i=0; i <= N2; i += 2 ) {
+        (mirror+(i/2))->bin = (picks+i)->bin;
+        (mirror+(i/2))->value = (picks+i)->value;
+	}
+	
+	for ( i=1; i <= N2; i += 2 ) {
+        (mirror+(N2-(i/2)))->bin = (picks+i)->bin;
+        (mirror+(N2-(i/2)))->value = (picks+i)->value;
+	}
+	
+	
+	/* calculate our morphIndex from an exponential function based on exponScale */
+	
+	if (exponScale == 0.) 
+		lookupIndex = (int) (( (float) N2 ) * morphIndex);
+	
+	else {
+		
+     	if ( morphIndex < .5 ) {
+			
+			lookupIndex = (int) ( ((float) N2) * ((
+												   (1. - exp( exponScale * morphIndex * 2. )) /
+												   (1. - exp( exponScale )) ) * .5) );
+    	}
+		
+    	else {
+			
+			lookupIndex = (int) ( ((float) N2) * ( .5 +  
+												  (( (1. - exp( -exponScale * (morphIndex - .5) * 2. )) /
+													(1. - exp( -exponScale )) ) * .5) ) );
+    	}			 
+		
+	}
+	
+	
+	//      post("%d", lookupIndex);
+	
+	/* choose the bins that are least different first */
+	
+    for ( i=0; i <= lookupIndex; i++ ) {
+		
+		even = ((mirror+i)->bin)<<1,
+		odd = (((mirror+i)->bin)<<1) + 1;	
+		
+		*(channelOne+even) = *(channelTwo+even);
+		*(channelOne+odd) = *(channelTwo+odd);
+    }
+	
+	/* convert back to complex form, read for the inverse fft */
+	
+	for ( i = 0; i <= N2; i++ ) {
+		
+		odd = ( even = i<<1 ) + 1;
+		
+		*(bufferOne+even) = *(channelOne+even) * cos( *(channelOne+odd) );
+		
+		if ( i != N2 )
+			*(bufferOne+odd) = -(*(channelOne+even)) * sin( *(channelOne+odd) );
+	}
+	fftease_rdft(fft,-1);
+	fftease_overlapadd(fft);
+}
+
+
+t_int *morphine_perform(t_int *w)
+{
+
+	int i, j;
+    t_morphine *x = (t_morphine *) (w[1]);
+	t_float *MSPInputVector1 = (t_float *)(w[2]);
+	t_float *MSPInputVector2 = (t_float *)(w[3]);
+	t_float *vec_morphIndex = (t_float *)(w[4]);
+	t_float *MSPOutputVector = (t_float *)(w[5]);
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int MSPVectorSize = fft->MSPVectorSize;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalInputVector1 = fft->internalInputVector;
+	t_float *internalInputVector2 = fft2->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	t_float *inputOne = fft->input;
+	t_float *inputTwo = fft2->input;
+	t_float *output = fft->output;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float mult = fft->mult;	
+	t_float morphIndex = x->morphIndex;
+	
+	if(x->mute){
+		for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+6;
+	}		
+
+	morphIndex = *vec_morphIndex;
+	if ( morphIndex < 0 )
+		morphIndex = 0.;
+	else {
+		if ( morphIndex > 1. )
+			morphIndex = 1.;
+	}
+	x->morphIndex = morphIndex;
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputOne + (Nw - D), MSPInputVector1, D * sizeof(t_float));
+        memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputTwo + (Nw - D), MSPInputVector2, D * sizeof(t_float));
+        
+		do_morphine(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw-D), MSPInputVector1 + (D*i), D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw-D), MSPInputVector2 + (D*i), D * sizeof(t_float));
+            
+			do_morphine(x);
+            
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector1 + (operationCount * MSPVectorSize), MSPInputVector1, MSPVectorSize * sizeof(t_float));
+        memcpy(internalInputVector2 + (operationCount * MSPVectorSize), MSPInputVector2, MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize), MSPVectorSize * sizeof(t_float));
+        
+		operationCount = (operationCount + 1) % operationRepeat;
+        
+        if( operationCount == 0 ) {
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw - D), internalInputVector1, D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw - D), internalInputVector2, D * sizeof(t_float));
+            
+            do_morphine(x);
+            
+            for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+6;
+}
+
+void morphine_free(t_morphine *x)
+{
+    if(x->fft->initialized){
+        free(x->picks);
+        free(x->mirror);
+    }
+	fftease_free(x->fft);
+	fftease_free(x->fft2);
+    free(x->fft);
+    free(x->fft2);
+}
+
+void morphine_mute(t_morphine *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;
+}
+
+void morphine_dsp(t_morphine *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    t_fftease *fft = x->fft;
+    t_fftease *fft2 = x->fft2;
+    
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(!samplerate)
+        return;
+    
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+		fft2->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft2);
+	}
+	if(fft->R != samplerate ){
+		fft->R = samplerate;
+        fft2->R = samplerate;
+	}
+    if(reset_required){
+        morphine_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(morphine_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec,sp[3]->s_vec);
+    }
+}
+
+
diff --git a/externals/fftease/multyq~.c b/externals/fftease/multyq~.c
new file mode 100644
index 0000000000000000000000000000000000000000..7a653f60b05f00b74b121181a9e3e25548bf7fb3
--- /dev/null
+++ b/externals/fftease/multyq~.c
@@ -0,0 +1,450 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *multyq_class;
+
+#define OBJECT_NAME "multyq~"
+
+typedef struct _multyq
+{
+    t_object x_obj;
+    t_float x_f;
+	t_fftease *fft;
+	t_float cf1;
+	t_float gainfac1;
+	t_float bw1;
+	t_float cf2;
+	t_float gainfac2;
+	t_float bw2;
+	t_float cf3;
+	t_float gainfac3;
+	t_float bw3;
+	t_float cf4;
+	t_float gainfac4;
+	t_float bw4;
+	t_float *rcos;
+	t_float *filt;
+	t_float *freqs;
+	int rcoslen;
+	short please_update;
+	short always_update;
+	short mute;
+} t_multyq;
+
+void multyq_dsp(t_multyq *x, t_signal **sp);
+t_int *multyq_perform(t_int *w);
+void *multyq_new(t_symbol *s, int argc, t_atom *argv);
+void multyq_mute(t_multyq *x, t_floatarg state);
+void update_filter_function(t_multyq *x);
+void filtyQ( float *S, float *C, float *filtfunc, int N2 );
+void multyq_init(t_multyq *x);
+void multyq_free(t_multyq *x);
+void multyq_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("multyq~"), (t_newmethod)multyq_new,
+                  (t_method)multyq_free,sizeof(t_multyq), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_multyq, x_f);
+	class_addmethod(c,(t_method)multyq_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)multyq_mute,gensym("mute"),A_FLOAT,0);
+    multyq_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void multyq_free(t_multyq *x)
+{
+    if(x->fft->initialized){
+        free(x->rcos);
+        free(x->freqs);
+        free(x->filt);
+    }
+	fftease_free(x->fft);
+    free(x->fft);
+}
+
+void *multyq_new(t_symbol *s, int argc, t_atom *argv)
+{
+    int i;
+	t_fftease *fft;
+	t_multyq *x = (t_multyq *)pd_new(multyq_class);
+    for(i = 0; i < 12; i++){
+        inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    }
+    outlet_new(&x->x_obj, gensym("signal"));
+
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft->R = sys_getsr();
+	fft->MSPVectorSize = sys_getblksize();	
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;		
+	fft->initialized = 0;
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+}
+
+void multyq_init(t_multyq *x)
+{
+	int i;
+	t_float funda, base;
+	
+	t_fftease  *fft = x->fft;
+	short initialized = fft->initialized;
+	
+	fftease_init(fft);
+
+	if(!initialized){
+		x->please_update = 0;
+		x->always_update = 0;
+		x->rcoslen = 8192 ;	
+		x->rcos = (t_float *) calloc(x->rcoslen, sizeof( t_float ));
+		x->freqs = (t_float *) calloc(fft->N2, sizeof( t_float ));
+		x->filt = (t_float *) calloc((fft->N2 + 1), sizeof( t_float ));
+		
+		x->cf1  = 200.;
+		x->gainfac1  = 0.0;
+		x->bw1 = .15;
+		x->cf2  = 700.;
+		x->gainfac2  = 0.0;
+		x->bw2  = .1; 
+		x->cf3  = 3000.;
+		x->gainfac3  = 0.0;
+		x->bw3  = .15;
+		x->cf4  = 12000.;
+		x->gainfac4 = 0.0;
+		x->bw4 = .15;
+		x->mute = 0;
+		for (i = 0; i < x->rcoslen; i++){
+			x->rcos[i] =  .5 - .5 * cos(((float)i/(float)x->rcoslen) * TWOPI);
+		}	
+	} else {
+		x->freqs = (t_float *) realloc(x->freqs, fft->N2 * sizeof( t_float ));
+		x->filt = (t_float *) realloc(x->filt, (fft->N2 + 1) * sizeof( t_float ));
+	}
+	x->fft->input = (t_float *)realloc(fft->input, fft->Nw * sizeof(t_float));
+    x->fft->output = (t_float *)realloc(fft->output, fft->Nw * sizeof(t_float));
+	
+	funda = base = (t_float)fft->R /(t_float)fft->N ;
+	for(i = 0; i < fft->N2; i++){
+		x->freqs[i] = base;
+		base += funda;
+	}
+	update_filter_function(x);
+}
+
+void do_multyq(t_multyq *x)
+{
+	int real, imag, amp, phase;
+	t_float a, b;
+	int i;
+	t_fftease *fft = x->fft;
+	t_float *S = fft->buffer;
+	t_float *C = fft->channel;
+	t_float *filtfunc = x->filt;
+	int N2 = fft->N2;
+	fftease_fold(fft);
+	fftease_rdft(fft,1);
+	for ( i = 0; i <= N2; i++ ) {
+		imag = phase = ( real = amp = i<<1 ) + 1;
+		a = ( i == N2 ? S[1] : S[real] );
+		b = ( i == 0 || i == N2 ? 0. : S[imag] );
+		C[amp] = hypot( a, b );
+		C[amp] *= filtfunc[ i ];
+		C[phase] = -atan2( b, a );
+	}
+	for ( i = 0; i <= N2; i++ ) {
+		imag = phase = ( real = amp = i<<1 ) + 1;
+		S[real] = *(C+amp) * cos( *(C+phase) );
+		if ( i != N2 )
+			S[imag] = -*(C+amp) * sin( *(C+phase) );
+	}
+	fftease_rdft(fft,-1);
+	fftease_overlapadd(fft);
+}
+
+
+t_int *multyq_perform(t_int *w)
+{
+	int i, j;
+    t_multyq *x = (t_multyq *) (w[1]);
+	t_float	*MSPInputVector = (t_float *)(w[2]);
+	t_float	*in2 = (t_float *)(w[3]);
+	t_float	*in3 = (t_float *)(w[4]);
+	t_float	*in4 = (t_float *)(w[5]);
+	t_float	*in5 = (t_float *)(w[6]);
+	t_float	*in6 = (t_float *)(w[7]);
+	t_float	*in7 = (t_float *)(w[8]);
+	t_float	*in8 = (t_float *)(w[9]);
+	t_float	*in9 = (t_float *)(w[10]);
+	t_float	*in10 = (t_float *)(w[11]);
+	t_float	*in11 = (t_float *)(w[12]);
+	t_float	*in12 = (t_float *)(w[13]);
+	t_float	*in13 = (t_float *)(w[14]);
+	t_float	*MSPOutputVector = (t_float *)(w[15]);
+	t_fftease *fft = x->fft;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	t_float mult = fft->mult;
+	int MSPVectorSize = fft->MSPVectorSize;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;		
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+
+    x->cf1 = *in2;
+    x->bw1 = *in3;
+    x->gainfac1 = *in4;
+    x->cf2 = *in5;
+    x->bw2 = *in6;
+    x->gainfac2 = *in7;
+    x->cf3 = *in8;
+    x->bw3 = *in9;
+    x->gainfac3 = *in10;
+    x->cf4 = *in11;
+    x->bw4 = *in12;
+    x->gainfac4 = *in13;
+
+	if(x->mute){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+16;
+	}	
+		
+    update_filter_function(x);
+
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_multyq(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_multyq(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_multyq(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+16;
+}		
+
+void multyq_mute(t_multyq *x, t_floatarg state)
+{
+	x->mute = (short)state;	
+}
+
+void update_filter_function(t_multyq *x)
+{
+	t_float lo, hi ;
+	t_float ploc, gainer;
+	int i;
+	t_float nyquist = (float)x->fft->R / 2.0;
+	t_float *filt = x->filt;
+	t_float *rcos = x->rcos;
+	t_float *freqs = x->freqs;
+	int rcoslen = x->rcoslen;
+	int N2 = x->fft->N2;
+	
+	// sanity
+	if( x->cf1 < 0 ){
+		x->cf1 = 0;
+	} 
+	else if( x->cf1 > nyquist){
+		x->cf1 = nyquist ;
+	} 
+	if( x->bw1 <= .05 ){
+		x->bw1 = .05;
+	}
+	else if( x->bw1 > 1. ){
+		x->bw1 = 1.;
+	}
+	if( x->gainfac1 < -1. ){
+		x->gainfac1 = -1;
+	}
+	if( x->cf2 < 0 ){
+		x->cf2 = 0;
+	} 
+	else if( x->cf2> nyquist){
+		x->cf2 = nyquist ;
+	} 
+	if( x->bw2 <= .05 ){
+		x->bw2 = .05;
+	}
+	else if( x->bw2 > 1. ){
+		x->bw2 = 1.;
+	}
+	if( x->gainfac2 < -1. ){
+		x->gainfac2 = -1;
+	}
+	if( x->cf3 < 0 ){
+		x->cf3 = 0;
+	} 
+	else if( x->cf3 > nyquist){
+		x->cf3 = nyquist ;
+	} 
+	if( x->bw3 <= .05 ){
+		x->bw3 = .05;
+	}
+	else if( x->bw3 > 1. ){
+		x->bw3 = 1.;
+	}
+	if( x->gainfac3 < -1. ){
+		x->gainfac3 = -1;
+	}
+	if( x->cf4 < 0 ){
+		x->cf4 = 0;
+	} 
+	else if( x->cf4 > nyquist){
+		x->cf4 = nyquist ;
+	} 
+	if( x->bw4 <= .05 ){
+		x->bw4 = .05;
+	}
+	else if( x->bw4 > 1. ){
+		x->bw4 = 1.;
+	}
+	if( x->gainfac4 < -1. ){
+		x->gainfac4 = -1;
+	}
+	for( i = 0; i < N2; i++ ) {
+		x->filt[i] = 1.0 ;
+	}
+	// filt 1
+	lo = x->cf1 * (1.0 - x->bw1 );
+	hi = x->cf1 * (1.0 + x->bw1 );
+	for( i = 0; i < N2; i++ ) {
+		if(freqs[i] >= lo && freqs[i] <= hi){
+			ploc = (freqs[i] - lo) / (hi - lo);
+			gainer = 1 + x->gainfac1 * rcos[ (int) (ploc * rcoslen) ] ;
+			if( gainer < 0 ){
+				gainer = 0;
+			}
+			filt[i] *= gainer ;
+			
+		}
+	}
+	// filt 2
+	lo = x->cf2 * (1.0 - x->bw2 );
+	hi = x->cf2 * (1.0 + x->bw2 );
+	for( i = 0; i < N2; i++ ) {
+		if( freqs[i] >= lo && freqs[i] <= hi){
+			ploc = (freqs[i] - lo) / (hi - lo);
+			gainer = 1 + x->gainfac2 * rcos[ (int) (ploc * rcoslen) ] ;
+			if( gainer < 0 ){
+				gainer = 0;
+			}
+			filt[i] *= gainer ;
+			
+		}
+	}
+	// filt 3
+	lo = x->cf3 * (1.0 - x->bw3 );
+	hi = x->cf3 * (1.0 + x->bw3 );
+	for( i = 0; i < N2; i++ ) {
+		if(freqs[i] >= lo && freqs[i] <= hi){
+			ploc = (freqs[i] - lo) / (hi - lo);
+			gainer = 1 + x->gainfac3 * rcos[ (int) (ploc * rcoslen) ] ;
+			if( gainer < 0 ){
+				gainer = 0;
+			}
+			filt[i] *= gainer ;
+			
+		}
+	}
+	// filt 4
+	lo = x->cf4 * (1.0 - x->bw4 );
+	hi = x->cf4 * (1.0 + x->bw4 );
+	for( i = 0; i < N2; i++ ) {
+		if(freqs[i] >= lo && freqs[i] <= hi){
+			ploc = (freqs[i] - lo) / (hi - lo);
+			gainer = 1 + x->gainfac4 * rcos[ (int) (ploc * rcoslen) ] ;
+			if( gainer < 0 ){
+				gainer = 0;
+			}
+			filt[i] *= gainer ;
+		}
+	}
+}
+
+void filtyQ( float *S, float *C, float *filtfunc, int N2 )
+{
+	int real, imag, amp, phase;
+	t_float a, b;
+	int i;
+	
+	for ( i = 0; i <= N2; i++ ) {
+		imag = phase = ( real = amp = i<<1 ) + 1;
+		a = ( i == N2 ? S[1] : S[real] );
+		b = ( i == 0 || i == N2 ? 0. : S[imag] );
+		C[amp] = hypot( a, b );
+		C[amp] *= filtfunc[ i ];
+		C[phase] = -atan2( b, a );
+	}
+	
+	for ( i = 0; i <= N2; i++ ) {
+		imag = phase = ( real = amp = i<<1 ) + 1;
+		S[real] = *(C+amp) * cos( *(C+phase) );
+		if ( i != N2 )
+			S[imag] = -*(C+amp) * sin( *(C+phase) );
+	}
+}
+
+void multyq_dsp(t_multyq *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        multyq_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(multyq_perform, 15, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec,
+                sp[4]->s_vec, sp[5]->s_vec, sp[6]->s_vec, sp[7]->s_vec,
+                sp[8]->s_vec, sp[9]->s_vec, sp[10]->s_vec, sp[11]->s_vec,
+                sp[12]->s_vec, sp[13]->s_vec);
+    }
+}
\ No newline at end of file
diff --git a/externals/fftease/oscbank.c b/externals/fftease/oscbank.c
new file mode 100644
index 0000000000000000000000000000000000000000..7710fa3ba63a075ea5d4125a3a4d921a92b0304e
--- /dev/null
+++ b/externals/fftease/oscbank.c
@@ -0,0 +1,88 @@
+#include "fftease.h"
+
+void fftease_oscbank( t_fftease *fft )
+{
+	int    amp,freq,chan, n;
+	
+	t_float    a,ainc,f,finc,address;
+	int D = fft->D;
+	int I = D;
+	int L = fft->L;
+	t_float synt = fft->synt;
+	t_float P  = fft->P;
+	int R = fft->R;
+	t_float Iinv = 1./fft->D;
+	t_float pitch_increment = fft->pitch_increment;
+	t_float *table = fft->table;
+	t_float *lastamp = fft->lastamp ;
+	t_float *lastfreq = fft->lastfreq ;
+	t_float *bindex = fft->bindex;
+	t_float *channel = fft->channel;
+	t_float *output = fft->output;
+	int hi_bin = fft->hi_bin;
+	int lo_bin = fft->lo_bin;
+	t_float maxamp = 0.0;
+    t_float localthresh, testamp;
+	short noalias = fft->noalias;
+	t_float nyquist = fft->nyquist;
+	if(! fft->init_status ){ // means memory alloc in effect
+		goto exit;
+	}
+	if(R == 0){
+		post("oscbank got 0 SR");
+		return;
+	}
+	pitch_increment = P * (t_float) L / (t_float) R;
+	
+	if( synt > 0.0 ){
+		maxamp = 0.0;
+		for ( chan = lo_bin; chan < hi_bin; chan++ ){
+			amp = chan << 1;
+			testamp = fabs( channel[amp] );
+			if( testamp > maxamp )
+				maxamp = testamp;
+		}
+	}
+	localthresh = synt * maxamp;
+	
+    for ( chan = lo_bin; chan < hi_bin; chan++ ) {
+		if(! fft->init_status ){ // means memory alloc in effect
+			goto exit;
+		}
+		freq = ( amp = ( chan << 1 ) ) + 1;
+		if(noalias){
+			if( channel[freq] * P >= nyquist )
+				channel[amp] = 0;
+		}
+		if ( channel[amp] > localthresh ){ 
+			channel[freq] *= pitch_increment;
+			finc = ( channel[freq] - ( f = lastfreq[chan] ) )*Iinv;
+			ainc = ( channel[amp] - ( a = lastamp[chan] ) )*Iinv;
+			address = bindex[chan];
+			if( address < 0 || address >= L){
+				address = 0.0;
+				// post("limited oscbank: bad address");
+			}
+			for ( n = 0; n < I; n++ ) {
+				// taking this out now:
+				
+				if(! fft->init_status ){ // means memory alloc in effect
+					goto exit;
+				}
+				
+				output[n] += a*table[ (int) address ];
+				address += f;
+				while ( address >= L )
+					address -= L;
+				while ( address < 0 )
+					address += L;
+				a += ainc;
+				f += finc;
+			}
+			lastfreq[chan] = channel[freq];
+			lastamp[chan] = channel[amp];
+			bindex[chan] = address;
+		}
+    }
+exit:;
+}
\ No newline at end of file
diff --git a/externals/fftease/overlapadd.c b/externals/fftease/overlapadd.c
new file mode 100644
index 0000000000000000000000000000000000000000..03638c1d2bd467334056401415754fda5a0a7689
--- /dev/null
+++ b/externals/fftease/overlapadd.c
@@ -0,0 +1,29 @@
+/*
+ * input I is a folded spectrum of length N; output O and
+ * synthesis window W are of length Nw--overlap-add windowed,
+ * unrotated, unfolded input data into output O
+ */
+
+#include "fftease.h"
+
+void fftease_overlapadd(t_fftease *fft)
+
+{
+	t_float *buffer = fft->buffer;
+	int N = fft->N;
+	t_float *Wsyn = fft->Wsyn;
+	t_float *output = fft->output;
+	int Nw = fft->Nw;
+	int out_count = fft->out_count;
+	
+	int i ;
+    while ( out_count < 0 )
+		out_count += N ;
+    out_count %= N ;
+    for ( i = 0 ; i < Nw ; i++ ) {
+		output[i] += buffer[out_count] * Wsyn[i];
+		if ( ++out_count == N )
+			out_count = 0 ;
+    }
+	fft->out_count = (fft->out_count + fft->D) % fft->Nw;
+}
diff --git a/externals/fftease/pileup~.c b/externals/fftease/pileup~.c
new file mode 100644
index 0000000000000000000000000000000000000000..f7cb8ed59f366e70511fd4eceaa9969ec0d5a78b
--- /dev/null
+++ b/externals/fftease/pileup~.c
@@ -0,0 +1,357 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *pileup_class;
+
+#define OBJECT_NAME "pileup~"
+
+
+typedef struct _pileup
+{
+    t_object x_obj;
+    t_float x_f;
+	t_fftease *fft;
+	/* pileup vars */
+	t_float move_threshold;
+	t_float *last_frame ;
+	int *frames_left;
+	t_float inverse_compensation_gain; // gain up inverse
+	t_float persistence; // decay factor
+	int mode;
+	t_float tadv;
+	short mute;
+	t_float hi_freq;
+	t_float lo_freq;
+} t_pileup;
+
+void pileup_dsp(t_pileup *x, t_signal **sp);
+t_int *pileup_perform(t_int *w);
+void *pileup_new(t_symbol *s, int argc, t_atom *argv);
+void pileup_mute(t_pileup *x, t_floatarg f);
+void pileup_free( t_pileup *x );
+void pileup_clear( t_pileup *x );
+void pileup_init(t_pileup *x);
+void pileup_mode(t_pileup *x, t_floatarg mode);
+void pileup_inverse_gain(t_pileup *x, t_floatarg gain);
+void pileup_persistence(t_pileup *x, t_floatarg persistence);
+void pileup_transpose(t_pileup *x, t_floatarg tf);
+void pileup_synthresh(t_pileup *x, t_floatarg thresh);
+void pileup_oscbank(t_pileup *x, t_floatarg flag);
+void pileup_highfreq(t_pileup *x, t_floatarg f);
+void pileup_lowfreq(t_pileup *x, t_floatarg f);
+
+void pileup_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("pileup~"), (t_newmethod)pileup_new,
+                  (t_method)pileup_free,sizeof(t_pileup), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_pileup, x_f);
+	class_addmethod(c,(t_method)pileup_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)pileup_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(c,(t_method)pileup_oscbank,gensym("oscbank"),A_FLOAT,0);
+	class_addmethod(c,(t_method)pileup_transpose,gensym("transpose"),A_FLOAT,0);
+	class_addmethod(c,(t_method)pileup_synthresh,gensym("synthresh"),A_FLOAT,0);
+	class_addmethod(c,(t_method)pileup_clear,gensym("clear"), 0);
+	class_addmethod(c,(t_method)pileup_mode,gensym("mode"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)pileup_inverse_gain,gensym("inverse_gain"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)pileup_persistence,gensym("persistence"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)pileup_lowfreq,gensym("lowfreq"),A_FLOAT,0);
+	class_addmethod(c,(t_method)pileup_highfreq,gensym("highfreq"),A_FLOAT,0);
+    
+    pileup_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void pileup_highfreq(t_pileup *x, t_floatarg f)
+{
+	t_float curfreq;
+	t_fftease *fft = x->fft;
+	
+	if(f < x->lo_freq){
+		error("current minimum is %f",x->lo_freq);
+		return;
+	}
+	if(f > fft->R/2 ){
+		f = fft->R/2;
+	}	
+	x->hi_freq = f;
+	fft->hi_bin = 1;  
+	curfreq = 0;
+	while(curfreq < x->hi_freq) {
+		++(fft->hi_bin);
+		curfreq += fft->c_fundamental;
+	}
+}
+
+void pileup_lowfreq(t_pileup *x, t_floatarg f)
+{
+	t_float curfreq;
+	t_fftease *fft = x->fft;
+	
+	if(f > x->hi_freq){
+		error("current maximum is %f",x->lo_freq);
+		return;
+	}
+	if(f < 0 ){
+		f = 0;
+	}	
+	x->lo_freq = f;
+	fft->lo_bin = 0;  
+	curfreq = 0;
+	while( curfreq < x->lo_freq ) {
+		++(fft->lo_bin);
+		curfreq += fft->c_fundamental ;
+	}
+}
+
+
+void pileup_transpose(t_pileup *x, t_floatarg tf)
+{
+	x->fft->P = tf;
+}
+
+void pileup_synthresh(t_pileup *x, t_floatarg thresh)
+{
+	x->fft->synt = thresh;
+}
+
+void pileup_oscbank(t_pileup *x, t_floatarg flag)
+{
+	x->fft->obank_flag = (short) flag;
+}
+
+void pileup_persistence(t_pileup *x, t_floatarg persistence)
+{
+	x->persistence = persistence; 
+}
+
+void pileup_clear(t_pileup *x)
+{
+    x->last_frame = (t_float*)realloc(x->last_frame,(x->fft->N+2) * sizeof(t_float));
+}
+
+void pileup_mode(t_pileup *x, t_floatarg mode)
+{
+	if( mode >= 0 && mode <= 3)
+		x->mode = (int) mode;
+}
+
+void pileup_inverse_gain(t_pileup *x, t_floatarg gain)
+{
+	x->inverse_compensation_gain = gain;
+}
+
+
+void pileup_free(t_pileup *x){
+    if(x->fft->initialized){
+        free(x->last_frame);
+        free(x->frames_left);
+    }
+	fftease_free(x->fft);
+    free(x->fft);
+}
+
+void pileup_mute(t_pileup *x, t_floatarg f){
+	x->mute = (short)f;
+}
+
+void *pileup_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_fftease *fft;
+	t_pileup *x = (t_pileup *)pd_new(pileup_class);
+	outlet_new(&x->x_obj, gensym("signal"));
+
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft->initialized = 0;
+		
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+}
+
+void pileup_init(t_pileup *x)
+{
+	t_fftease  *fft = x->fft;
+	short initialized = fft->initialized;
+
+	fftease_init(fft);
+	
+	if(!initialized){
+		x->mode = 0;
+		x->inverse_compensation_gain = 4.0;
+		x->mute = 0;
+		x->move_threshold = .00001 ;
+
+		x->last_frame = (t_float *) calloc((fft->N+2), sizeof(t_float));
+		x->frames_left = (int *) calloc((fft->N+2), sizeof(int));
+	} else {
+		x->last_frame = (t_float *) realloc(x->last_frame,(fft->N+2)*sizeof(t_float));
+		x->frames_left = (int *) realloc(x->frames_left, (fft->N+2) * sizeof(int));
+        x->fft->input = (t_float*) realloc(fft->input, fft->Nw * sizeof(t_float));
+        x->fft->output = (t_float*) realloc(fft->output, fft->Nw * sizeof(t_float));
+        x->fft->c_lastphase_in = (t_float*)realloc(fft->c_lastphase_in, (fft->N2+1) * sizeof(t_float));
+        x->fft->c_lastphase_out = (t_float*)realloc(fft->c_lastphase_out, (fft->N2+1) * sizeof(t_float));
+	}
+	x->tadv = (t_float) fft->D / (t_float)fft->R ;
+}
+
+void do_pileup(t_pileup *x)
+{
+	int i;
+	t_fftease *fft = x->fft;
+	t_float *last_frame = x->last_frame;
+	t_float persistence = x->persistence; // decay factor
+	int N = fft->N;
+	t_float *channel = fft->channel;
+
+	fftease_fold(fft);
+	fftease_rdft(fft,FFT_FORWARD);
+	fftease_convert(fft);
+	
+	if( x->mode == 0 ){
+		for( i = 0; i < N; i += 2 ){
+			if( fabs( channel[i] ) < last_frame[i]  ){ // fabs?
+				channel[i] = last_frame[i];
+				channel[i + 1] = last_frame[i + 1];
+			} else {
+				last_frame[i] = fabs( channel[i] );
+				last_frame[i + 1] = channel[i + 1];
+			}
+		}
+	}
+	else if( x->mode == 1) {
+		for( i = 0; i < N; i += 2 ){
+			if( fabs( channel[i] ) < last_frame[i]  ){ // fabs?
+				channel[i] = last_frame[i];
+			} else {
+				last_frame[i] = fabs( channel[i] );
+			}
+		}
+	}
+	else if( x->mode == 2 ){
+		for( i = 0; i < N; i += 2 ){
+			if( fabs( channel[i] ) > last_frame[i]  ){ // fabs?
+				channel[i] = last_frame[i] * x->inverse_compensation_gain;
+				channel[i + 1] = last_frame[i + 1];
+			} else {
+				last_frame[i] = fabs( channel[i] );
+				last_frame[i + 1] = channel[i + 1];
+			}
+		}
+	}	
+	if( persistence < 1.0){
+		for( i = 0; i < N; i += 2 ){
+			last_frame[i] *= persistence;
+		}
+	}
+
+	if(fft->obank_flag){
+		fftease_oscbank(fft);
+	} else {
+	    fftease_unconvert(fft);
+		fftease_rdft(fft,FFT_INVERSE);
+		fftease_overlapadd(fft);
+	}
+}
+t_int *pileup_perform(t_int *w)
+
+{
+	int		    i,j;
+    t_pileup *x = (t_pileup *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *MSPOutputVector = (t_float *)(w[3]);
+	t_fftease *fft = x->fft;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	t_float mult = fft->mult;
+	int MSPVectorSize = fft->MSPVectorSize;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;		
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+
+	if(x->mute){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+4;
+	}	
+	
+	if( fft->obank_flag )
+		mult *= FFTEASE_OSCBANK_SCALAR;
+				
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_pileup(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_pileup(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_pileup(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+4;
+}
+
+void pileup_dsp(t_pileup *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        pileup_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(pileup_perform, 3, x, sp[0]->s_vec, sp[1]->s_vec);
+    }
+}
+
+
diff --git a/externals/fftease/power_of_two.c b/externals/fftease/power_of_two.c
new file mode 100644
index 0000000000000000000000000000000000000000..799d43767d921cd44a3ecea8e31f3319a2233bb6
--- /dev/null
+++ b/externals/fftease/power_of_two.c
@@ -0,0 +1,15 @@
+
+int fftease_power_of_two(int test)
+{
+	int limit = 1048576;
+	int compare = 1;
+	do {
+		if(test == compare){
+			return 1;
+		} 
+		compare *= 2;
+	} while (compare <= limit);
+	
+	return 0;
+}
+
diff --git a/externals/fftease/pvcompand~.c b/externals/fftease/pvcompand~.c
new file mode 100644
index 0000000000000000000000000000000000000000..421b30dadadb0554a8af783cf2626db272a6167b
--- /dev/null
+++ b/externals/fftease/pvcompand~.c
@@ -0,0 +1,329 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *pvcompand_class;
+
+#define OBJECT_NAME "pvcompand~"
+
+typedef struct _pvcompand
+{
+    t_object x_obj;
+    t_float x_f;
+	t_fftease *fft;
+	t_float rescale;
+	t_float *curthresh;
+	t_float *atten;
+	t_float *thresh;
+	int count;
+	t_float thresh_interval;
+	t_float max_atten; 
+	t_float atten_interval;
+	t_float tstep;
+	t_float gstep;
+	t_float last_max_atten;
+	short norml;
+	short mute;
+} t_pvcompand;
+
+void pvcompand_dsp(t_pvcompand *x, t_signal **sp);
+t_int *pvcompand_perform(t_int *w);
+void *pvcompand_new(t_symbol *s, int argc, t_atom *argv);
+void update_thresholds(t_pvcompand *x);
+void pvcompand_normalize(t_pvcompand *x, t_floatarg val);
+void pvcompand_float(t_pvcompand *x, t_float f);
+void pvcompand_free(t_pvcompand *x);
+float pvcompand_ampdb(float db);
+void pvcompand_init(t_pvcompand *x);
+void pvcompand_mute(t_pvcompand *x, t_floatarg f);
+
+void pvcompand_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("pvcompand~"), (t_newmethod)pvcompand_new,
+                  (t_method)pvcompand_free,sizeof(t_pvcompand), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_pvcompand, x_f);
+	class_addmethod(c,(t_method)pvcompand_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)pvcompand_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(c,(t_method)pvcompand_normalize,gensym("normalize"), A_FLOAT, 0);
+    pvcompand_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void pvcompand_mute(t_pvcompand *x, t_floatarg f)
+{
+	x->mute = (short)f;
+}
+
+
+void pvcompand_free( t_pvcompand *x ){
+    if(x->fft->initialized){
+        free(x->curthresh);
+        free(x->atten);
+        free(x->thresh);
+    }
+	fftease_free(x->fft);
+    free(x->fft);
+}
+
+void *pvcompand_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_fftease *fft;
+	t_pvcompand *x = (t_pvcompand *)pd_new(pvcompand_class);
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft->initialized = 0;
+	x->max_atten = -6.0;
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+}
+
+void pvcompand_init(t_pvcompand *x)
+{
+	t_fftease  *fft = x->fft;
+	short initialized = x->fft->initialized;
+
+	fftease_init(fft);
+	
+	if(!initialized){
+		x->norml = 0;
+		x->mute = 0;
+		x->thresh_interval = 1.0;
+		x->last_max_atten =  x->max_atten; 
+		x->atten_interval = 2.0 ; 
+		x->tstep = 1.0 ;
+		x->gstep = 2.0 ;
+		x->thresh = (t_float *) calloc((fft->N), sizeof(t_float));
+		x->atten = (t_float *) calloc(fft->N, sizeof(t_float) );
+		x->curthresh = (t_float *) calloc(fft->N, sizeof(t_float) );
+	} else if(initialized == 1) {
+		x->thresh = (t_float *) realloc(x->thresh, fft->N * sizeof(t_float));
+		x->atten = (t_float *) realloc(x->atten, fft->N * sizeof(t_float));
+		x->curthresh = (t_float *) realloc(x->curthresh, fft->N * sizeof(t_float));
+	}
+	update_thresholds(x);
+}
+
+void update_thresholds( t_pvcompand *x ) {
+	int i;
+	t_float nowamp = x->max_atten ;
+	t_float nowthresh = 0.0 ;
+	int N = x->fft->N;
+	x->count = 0;
+	if( nowamp < 0.0 ){
+		while( nowamp < 0.0 ){
+			x->atten[x->count] = pvcompand_ampdb( nowamp );
+			nowamp += x->gstep ;
+			++(x->count);
+			if(x->count >= N){
+				error("count exceeds %d",N);
+				x->count = N - 1;
+				break;
+			}
+		}
+    }
+	else if( nowamp > 0.0 ){
+		while( nowamp > 0.0 ){
+			x->atten[x->count] = pvcompand_ampdb( nowamp );
+			nowamp -= x->gstep ;
+			++(x->count);
+			if(x->count >= N){
+				error("count exceeds %d",N);
+				x->count = N - 1;
+				break;
+			}
+		}
+	}
+	for( i = 0; i < x->count; i++){
+		x->thresh[i] = pvcompand_ampdb( nowthresh );
+		nowthresh -= x->tstep ;
+	}
+}
+
+void pvcompand_normalize(t_pvcompand *x, t_floatarg val) 
+{
+	x->norml = (short)val;
+}
+
+void do_pvcompand(t_pvcompand *x)
+{
+	t_fftease *fft = x->fft;
+	t_float *channel = fft->channel;
+	int N = fft->N;
+	t_float *curthresh = x->curthresh;
+	t_float *thresh = x->thresh;
+	t_float *atten = x->atten;
+	int count = x->count;
+	t_float max_atten = x->max_atten;
+	int i,j;	
+	t_float maxamp ;	
+	t_float cutoff;
+	t_float avr, new_avr, rescale;
+	
+	fftease_fold(fft);
+	fftease_rdft(fft,FFT_FORWARD);
+	fftease_leanconvert(fft);
+
+	maxamp = 0.;
+	avr = 0;
+	for( i = 0; i < N; i+= 2 ){
+		avr += channel[i];
+		if( maxamp < channel[i] ){
+			maxamp = channel[i] ;
+		}
+	}
+	if(count <= 1){
+		//	post("count too low!"); 
+		count = 1;
+	}
+	for( i = 0; i < count; i++ ){
+		curthresh[i] = thresh[i]*maxamp ;
+	}
+	cutoff = curthresh[count-1];
+	new_avr = 0;
+	for( i = 0; i < N; i += 2){
+		if( channel[i] > cutoff ){
+			j = count-1;
+			while( channel[i] > curthresh[j] ){
+				j--;
+				if( j < 0 ){
+					j = 0;
+					break;
+				}
+			}
+			channel[i] *= atten[j];
+		}
+		new_avr += channel[i] ;
+	}
+	
+	if( x->norml ) {
+		if( new_avr <= 0 ){
+			new_avr = .0001;
+		}
+		rescale =  avr / new_avr ;
+		
+	} else {
+		rescale = pvcompand_ampdb( max_atten * -.5); 
+	}
+	for( i = 0; i < N; i += 2){
+		channel[i] *= rescale;
+	} 
+	
+	fftease_leanunconvert(fft);
+	fftease_rdft(fft, FFT_INVERSE);
+	fftease_overlapadd(fft);
+}
+
+t_int *pvcompand_perform(t_int *w)
+{
+	int i,j;
+    t_pvcompand *x = (t_pvcompand *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *in2 = (t_float *)(w[3]);
+	t_float *MSPOutputVector = (t_float *)(w[4]);
+	t_fftease *fft = x->fft;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	t_float mult = fft->mult;
+	int MSPVectorSize = fft->MSPVectorSize;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;		
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	
+	if(x->mute){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+5;
+	}
+
+    x->max_atten = *in2;
+    if(x->max_atten != x->last_max_atten) {
+        x->last_max_atten = x->max_atten;
+        update_thresholds(x);
+    }
+	
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_pvcompand(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_pvcompand(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_pvcompand(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+5;
+}	
+
+float pvcompand_ampdb(float db) 
+{
+	float amp;
+	amp = pow((t_float)10.0, (t_float)(db/20.0)) ;
+	return(amp);
+}
+
+void pvcompand_dsp(t_pvcompand *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        pvcompand_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(pvcompand_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec);
+    }
+}
+
+
diff --git a/externals/fftease/pvgrain~.c b/externals/fftease/pvgrain~.c
new file mode 100644
index 0000000000000000000000000000000000000000..703690a6a61582e4958e00e069f390f6f4b24fc3
--- /dev/null
+++ b/externals/fftease/pvgrain~.c
@@ -0,0 +1,318 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *pvgrain_class;
+
+#define OBJECT_NAME "pvgrain~"
+
+typedef struct _pvgrain
+{
+    t_object x_obj;
+    t_float x_f;
+	t_fftease *fft;
+	short *binsort;
+	t_float topfreq;
+	t_float bottomfreq;
+	short bypass;
+	int mute;
+	t_float grain_probability;
+	t_float sample_basefreq;
+	int grains_per_frame;
+	void *list_outlet;
+	t_float *listdata;
+	short list_count;
+	void *m_clock;
+	t_atom myList[2];
+
+} t_pvgrain;
+
+void pvgrain_dsp(t_pvgrain *x, t_signal **sp);
+t_int *pvgrain_perform(t_int *w);
+void *pvgrain_new(t_symbol *s, int argc, t_atom *argv);
+void pvgrain_mute(t_pvgrain *x, t_floatarg state);
+void pvgrain_tick(t_pvgrain *x);
+void pvgrain_printchan(t_pvgrain *x);
+void pvgrain_probability (t_pvgrain *x, t_floatarg prob);
+void pvgrain_framegrains (t_pvgrain *x, t_floatarg grains);
+void pvgrain_topfreq (t_pvgrain *x, t_floatarg top);
+void pvgrain_bottomfreq (t_pvgrain *x, t_floatarg f);
+void pvgrain_basefreq (t_pvgrain *x, t_floatarg base);
+float pvgrain_randf(float min, float max);
+void pvgrain_init(t_pvgrain *x);
+void pvgrain_free(t_pvgrain *x);
+
+void pvgrain_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("pvgrain~"), (t_newmethod)pvgrain_new,
+                  (t_method)pvgrain_free,sizeof(t_pvgrain), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_pvgrain, x_f);
+	class_addmethod(c,(t_method)pvgrain_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)pvgrain_mute,gensym("mute"),A_FLOAT,0);
+
+    class_addmethod(c,(t_method)pvgrain_printchan,gensym("printchan"),A_DEFFLOAT,0);
+	class_addmethod(c,(t_method)pvgrain_probability,gensym("probability"),A_DEFFLOAT,0);
+	class_addmethod(c,(t_method)pvgrain_framegrains,gensym("framegrains"),A_DEFFLOAT,0);
+	class_addmethod(c,(t_method)pvgrain_topfreq,gensym("topfreq"),A_FLOAT,0);
+	class_addmethod(c,(t_method)pvgrain_basefreq,gensym("basefreq"),A_FLOAT,0);
+    pvgrain_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+void pvgrain_printchan(t_pvgrain *x)
+{
+	int i;
+	t_float *channel = x->fft->channel;
+	post("***");
+	for( i = 0 ; i < 30; i+= 2 ){
+		post("amp %f freq %f", channel[i*2], channel[i*2 + 1]);
+	}
+	post("***");
+}
+
+void pvgrain_basefreq (t_pvgrain *x, t_floatarg base)
+{
+	int R = x->fft->R;
+	if( base < 0.0 )
+		base = 0. ;
+	if( base > R / 2 )
+		base = R / 2 ;
+	x->sample_basefreq = base;
+}
+
+void pvgrain_topfreq (t_pvgrain *x, t_floatarg top)
+{
+	int R = x->fft->R;
+	t_fftease *fft = x->fft;
+
+	if( top < 50. )
+		top = 50.;
+	if( top > R / 2 )
+		top = R / 2;
+	x->topfreq = top ;
+	fftease_oscbank_setbins(fft,x->bottomfreq, x->topfreq);
+}
+
+void pvgrain_bottomfreq (t_pvgrain *x, t_floatarg f)
+{
+	int R = x->fft->R;
+	t_fftease *fft = x->fft;
+	if( f >= x->topfreq || f >= R/2){
+		post("%f is too high a bottom freq",f);
+		return;
+	}
+	
+	x->bottomfreq = f;
+	fftease_oscbank_setbins(fft,x->bottomfreq, x->topfreq);
+}
+
+void pvgrain_probability (t_pvgrain *x, t_floatarg prob)
+{
+	if( prob < 0. )
+		prob = 0.;
+	if( prob > 1. )
+		prob = 1.;
+	x->grain_probability = prob ;
+}
+
+void pvgrain_framegrains (t_pvgrain *x, t_floatarg grains)
+{
+	int N2 = x->fft->N2;
+	if( grains < 1 )
+		grains = 1;
+	if( grains > N2 - 1 )
+		grains = N2 - 1;
+	x->grains_per_frame = grains ;
+}
+
+void pvgrain_tick(t_pvgrain *x)
+{
+	t_atom *myList = x->myList;
+	t_float *listdata = x->listdata;
+	int i;
+	
+	for (i=0; i < 2; i++) {
+		SETFLOAT(myList+i,listdata[i]); /* macro for setting a t_atom */
+	}
+	outlet_list(x->list_outlet,0,2,myList);
+}
+
+void *pvgrain_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_fftease *fft;
+	t_pvgrain *x = (t_pvgrain *)pd_new(pvgrain_class);
+
+    x->list_outlet = outlet_new(&x->x_obj, gensym("list"));
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft->initialized = 0;
+	
+	x->grain_probability = 0.0001;
+	x->topfreq = 1000.0;
+
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+}
+
+void pvgrain_init(t_pvgrain *x)
+{
+	t_fftease  *fft = x->fft;
+	short initialized = fft->initialized;
+	fftease_init(fft);
+	
+	if(!initialized){
+        x->m_clock = clock_new(x,(void *)pvgrain_tick);
+		x->sample_basefreq = 261.0;
+		x->bottomfreq = 0.0;
+		x->mute = 0;
+		x->binsort = (short *) calloc((fft->N2+1), sizeof(short) );
+		x->listdata = (t_float *) calloc(40, sizeof(t_float));
+	} else if(initialized == 1) {
+		x->binsort = (short *) realloc(x->binsort,(fft->N2+1) * sizeof(short));
+	}
+	fftease_oscbank_setbins(fft,x->bottomfreq, x->topfreq);
+}
+
+void pvgrain_free(t_pvgrain *x)
+{
+    if(x->fft->initialized){
+        free(x->binsort);
+        free(x->listdata);
+    }
+	fftease_free(x->fft);
+    free(x->fft);
+}
+
+void do_pvgrain(t_pvgrain *x)
+{
+	int 	i,j;
+	t_float tmp, dice;
+	short print_grain;
+	t_fftease *fft = x->fft;
+	t_float *channel = fft->channel;
+	short *binsort = x->binsort;
+	int grains_per_frame = x->grains_per_frame ;
+	t_float selection_probability = x->grain_probability;
+	int hi_bin = fft->hi_bin;
+	int lo_bin = fft->lo_bin;
+	t_float *listdata = x->listdata;
+		
+	x->list_count = 0;
+	
+	fftease_fold(fft);
+	fftease_rdft(fft,FFT_FORWARD);
+	fftease_convert(fft);
+	if( grains_per_frame > hi_bin - lo_bin )
+		grains_per_frame = hi_bin - lo_bin;
+	//  binsort[0] = 0;
+	for( i = 0; i < hi_bin; i++ ){// could be hi_bin - lo_bin
+		binsort[i] = i + lo_bin;
+	}
+	for( i = lo_bin; i < hi_bin - 1; i++ ){
+		for( j = i+1; j < hi_bin; j++ ){
+			if(channel[binsort[j] * 2] > channel[binsort[i] * 2]) {
+				tmp = binsort[j];
+				binsort[j] = binsort[i];
+				binsort[i] = tmp;
+			}
+		}
+	}
+	for( i = 0; i < grains_per_frame; i++ ){
+		print_grain = 1;
+		dice = fftease_randf(0.,1.);
+		if( dice < 0.0 || dice > 1.0 ){
+			error("dice %f out of range", dice);
+		}
+		if( selection_probability < 1.0 ){
+			if( dice > selection_probability) {
+				print_grain = 0;
+			} 
+		}
+		if( print_grain ){
+			listdata[ x->list_count * 2 ] = channel[ binsort[i]*2 ];
+			listdata[ (x->list_count * 2) + 1 ] = channel[(binsort[i]*2) + 1] ;
+			++(x->list_count);
+			clock_delay(x->m_clock,0); 
+		}
+	}
+}
+
+t_int *pvgrain_perform(t_int *w)
+{
+	int 	i;
+    t_pvgrain *x = (t_pvgrain *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_fftease *fft = x->fft;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *input = fft->input;
+	int MSPVectorSize = fft->MSPVectorSize;
+	t_float *internalInputVector = fft->internalInputVector;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+
+	if (x->mute) {
+		return w+3;
+	}
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+		do_pvgrain(x);
+	}	
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+			do_pvgrain(x);
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+			do_pvgrain(x);
+		}
+		fft->operationCount = operationCount;
+	}
+	return w+3;
+}	
+
+void pvgrain_mute(t_pvgrain *x, t_floatarg state)
+{
+	x->mute = (short)state;	
+}
+
+void pvgrain_dsp(t_pvgrain *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        pvgrain_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(pvgrain_perform, 2, x, sp[0]->s_vec);
+    }
+}
diff --git a/externals/fftease/pvharm~.c b/externals/fftease/pvharm~.c
new file mode 100644
index 0000000000000000000000000000000000000000..b275c2d7f3011550df587c268de063baa61d60d9
--- /dev/null
+++ b/externals/fftease/pvharm~.c
@@ -0,0 +1,351 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *pvharm_class;
+
+#define OBJECT_NAME "pvharm~"
+
+typedef struct _pvharm
+{
+    t_object x_obj;
+    t_float x_f;
+	t_fftease *fft;
+	t_fftease *fft2;
+	short mute;
+	short peakflag;
+	t_float hifreq;/* highest frequency to synthesize */
+	t_float lofreq;/* lowest frequency to synthesize */
+	t_float framethresh; /* set lower limit for synth cutoff, to avoid noise */
+	int osclimit;
+	int oscnt;
+	t_float local_thresh;
+	t_float framepeak;
+	t_float *ampsort; /* sort amplitudes from highest to lowest */
+	short compressor; /* flag to compress */
+	t_float framestop; /* amplitude below which compressor is turned off */
+} t_pvharm;
+
+void pvharm_dsp(t_pvharm *x, t_signal **sp);
+t_int *pvharm_perform(t_int *w);
+void *pvharm_new(t_symbol *s, int argc, t_atom *argv);
+void pvharm_mute(t_pvharm *x, t_floatarg f);
+void pvharm_init(t_pvharm *x);
+void pvharm_rel2peak(t_pvharm *x, t_floatarg toggle);
+void pvharm_free(t_pvharm *x);
+void pvharm_oscnt(t_pvharm *x);
+void pvharm_osclimit(t_pvharm *x, t_floatarg f);
+void pvharm_compressor(t_pvharm *x, t_floatarg state);
+void pvharm_framestop(t_pvharm *x, t_floatarg state);
+void pvharm_lowfreq(t_pvharm *x, t_floatarg f);
+void pvharm_highfreq(t_pvharm *x, t_floatarg f);
+
+void pvharm_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("pvharm~"), (t_newmethod)pvharm_new,
+                  (t_method)pvharm_free,sizeof(t_pvharm), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_pvharm, x_f);
+	class_addmethod(c,(t_method)pvharm_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)pvharm_mute,gensym("mute"),A_FLOAT,0);
+
+    class_addmethod(c,(t_method)pvharm_osclimit,gensym("osclimit"),A_FLOAT,0);
+	class_addmethod(c,(t_method)pvharm_oscnt,gensym("oscnt"),0);
+	class_addmethod(c,(t_method)pvharm_compressor,gensym("compressor"),A_FLOAT,0);
+	class_addmethod(c,(t_method)pvharm_framestop,gensym("framestop"),A_FLOAT,0);
+    class_addmethod(c,(t_method)pvharm_highfreq,gensym("highfreq"),A_FLOAT,0);
+    class_addmethod(c,(t_method)pvharm_lowfreq,gensym("lowfreq"),A_FLOAT,0);
+    pvharm_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void pvharm_lowfreq(t_pvharm *x, t_floatarg f)
+{
+    t_fftease *fft = x->fft;
+    t_fftease *fft2 = x->fft2;
+    if(f > x->hifreq){
+        error("%s: minimum cannot exceed current maximum: %f",OBJECT_NAME,x->hifreq);
+        return;
+    }
+    if(f < 0 ){
+        f = 0;
+    }
+    x->lofreq = f;
+    fftease_oscbank_setbins(fft,x->lofreq, x->hifreq);
+    fftease_oscbank_setbins(fft2,x->lofreq, x->hifreq);
+}
+
+void pvharm_highfreq(t_pvharm *x, t_floatarg f)
+{
+    t_fftease *fft = x->fft;
+    t_fftease *fft2 = x->fft2;
+    int R = x->fft->R;
+    if(f < x->lofreq){
+        error("%s: maximum cannot go below current minimum: %f",OBJECT_NAME,x->lofreq);
+        return;
+    }
+    if(f > R/2 ){
+        f = R/2;
+    }
+    x->hifreq = f;
+    fftease_oscbank_setbins(fft,x->lofreq, x->hifreq);
+    fftease_oscbank_setbins(fft2,x->lofreq, x->hifreq);
+}
+
+void pvharm_oscnt(t_pvharm *x)
+{
+	post("%s: osc count: %d, local thresh: %f, frame peak: %f",OBJECT_NAME, x->oscnt, x->local_thresh, x->framepeak);
+}
+
+void pvharm_free(t_pvharm *x)
+{
+    if(x->fft->initialized){
+        free(x->ampsort);
+    }
+	fftease_free(x->fft);
+	fftease_free(x->fft2);
+    free(x->fft);
+    free(x->fft2);
+}
+
+void pvharm_rel2peak(t_pvharm *x, t_floatarg toggle)
+{
+	x->peakflag = (short)toggle;
+}
+
+void *pvharm_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_fftease *fft, *fft2;
+	t_pvharm *x = (t_pvharm *)pd_new(pvharm_class);
+
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+    
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	x->fft2 = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft2 = x->fft2;
+	fft->initialized = 0;
+	fft2->initialized = 0;
+	x->lofreq = 0;
+	x->hifreq = 15000;
+	fft2->N = fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft2->overlap = fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft2->winfac = fft->winfac = FFTEASE_DEFAULT_WINFAC;
+    if(argc > 0){ fft->N = fft2->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = fft2->overlap = (int) atom_getfloatarg(1, argc, argv); }
+
+	return x;
+}
+
+void pvharm_init(t_pvharm *x)
+{
+	t_fftease  *fft = x->fft;
+	t_fftease  *fft2 = x->fft2;
+	short initialized = fft->initialized;
+	fftease_init(fft);
+	fftease_init(fft2);
+    
+	if(!initialized){
+		x->framethresh = 0.005;
+		x->osclimit = fft->N2;
+		fft->P = .5 ; // for testing purposes
+		fft2->P = .6666666666 ; // for testing purposes
+		x->mute = 0;
+		x->compressor = 0;
+		x->framestop = .001;
+		x->ampsort = (t_float *) calloc((fft->N+1), sizeof(t_float));
+	} else if(initialized == 1){
+		x->ampsort = (t_float *) realloc(x->ampsort, (fft->N+1) * sizeof(t_float));
+	}
+	fftease_oscbank_setbins(fft, x->lofreq, x->hifreq);
+	fftease_oscbank_setbins(fft2, x->lofreq, x->hifreq);
+}
+
+void do_pvharm(t_pvharm *x)
+{
+	t_float framethresh = x->framethresh;
+	int osclimit = x->osclimit;
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int i;
+	int D = fft->D;
+	int freq, amp,chan;
+	t_float framesum, frame_rescale;
+	t_float framestop = x->framestop;
+	t_float *channel = fft->channel;
+	t_float *channel2 = fft2->channel;
+	t_float *output = fft->output;
+	t_float *output2 = fft2->output;
+	int lo_bin = fft->lo_bin;
+	int hi_bin = fft->hi_bin;
+
+	fftease_fold(fft);
+	fftease_rdft(fft,FFT_FORWARD);
+	fftease_convert(fft);
+	
+	if(x->compressor){
+		framesum = 0.0;
+		for(chan = fft->lo_bin; chan < fft->hi_bin; chan++){
+			amp = chan << 1;
+			framesum += channel[amp];
+		}
+		if(framesum > framestop && framesum >= 0.0){
+			frame_rescale = 1.0 / framesum;
+			for(chan = lo_bin; chan < hi_bin; chan++){
+				amp = chan << 1;
+				channel[amp] *= frame_rescale;		
+			}
+		}	
+	}
+	// copy spectrum to second channel (yes it is inefficient)
+
+	for(chan = lo_bin; chan < hi_bin; chan++){
+		amp = chan << 1;
+		freq = amp + 1;
+		channel2[amp] = channel[amp];
+		channel2[freq] = channel[freq];
+	} 
+	fftease_limited_oscbank(fft, osclimit, framethresh);
+	fftease_limited_oscbank(fft2, osclimit, framethresh);
+	for(i = 0; i < D; i++){
+		output[i] += output2[i];
+	}
+}
+
+t_int *pvharm_perform(t_int *w)
+{
+	int i,j;
+    t_pvharm *x = (t_pvharm *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *in2 = (t_float *)(w[3]);
+	t_float *in3 = (t_float *)(w[4]);
+	t_float *in4 = (t_float *)(w[5]);
+	t_float *MSPOutputVector = (t_float *)(w[6]);
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	t_float *output2 = fft2->output;
+	t_float mult = fft->mult;
+	int MSPVectorSize = fft->MSPVectorSize;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;		
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	
+	if(x->mute){
+		for( j = 0; j < MSPVectorSize; j++) {
+			*MSPOutputVector++ = *MSPInputVector++ * FFTEASE_BYPASS_GAIN;
+		}
+		return w+7;
+	}
+
+    fft->P = *in2;
+    fft2->P = *in3;
+    fft->synt = fft2->synt =  *in4;
+	
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+		do_pvharm(x);
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+        memcpy(output2, output2 + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output2[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_pvharm(x);
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+            memcpy(output2, output2 + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output2[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+			
+			do_pvharm( x );
+            
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+            memcpy(output2, output2 + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output2[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+7;
+}		
+
+void pvharm_compressor(t_pvharm *x, t_floatarg state)
+{
+	x->compressor = (short)state;	
+}
+
+void pvharm_framestop(t_pvharm *x, t_floatarg state)
+{
+	x->framestop = state;	
+}
+
+void pvharm_mute(t_pvharm *x, t_floatarg state)
+{
+	x->mute = (short)state;	
+}
+
+void pvharm_osclimit(t_pvharm *x, t_floatarg limit)
+{
+	x->osclimit = (int)limit;	
+}
+
+void pvharm_dsp(t_pvharm *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    t_fftease *fft = x->fft;
+    t_fftease *fft2 = x->fft2;
+    
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(!samplerate)
+        return;
+    
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+		fft2->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft2);
+	}
+	if(fft->R != samplerate ){
+		fft->R = samplerate;
+        fft2->R = samplerate;
+	}
+    if(reset_required){
+        pvharm_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(pvharm_perform, 6, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec,sp[3]->s_vec,
+                sp[4]->s_vec);
+    }
+}
+
diff --git a/externals/fftease/pvoc~.c b/externals/fftease/pvoc~.c
new file mode 100644
index 0000000000000000000000000000000000000000..d8384fc67c23c5fc55ee01552485c94ceaed129d
--- /dev/null
+++ b/externals/fftease/pvoc~.c
@@ -0,0 +1,253 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *pvoc_class;
+
+#define OBJECT_NAME "pvoc~"
+
+typedef struct _pvoc
+{
+	t_object x_obj;
+    float x_f;
+	t_fftease *fft;
+	t_float lofreq;
+	t_float hifreq;
+	t_float topfreq;
+	short mute;
+} t_pvoc;
+
+void *pvoc_new(t_symbol *s, int argc, t_atom *argv);
+void pvoc_free(t_pvoc *x);
+void pvoc_mute(t_pvoc *x, t_floatarg tog);
+void pvoc_init(t_pvoc *x);
+void pvoc_fftinfo(t_pvoc *x);
+void pvoc_lowfreq(t_pvoc *x, t_floatarg f);
+void pvoc_highfreq(t_pvoc *x, t_floatarg f);
+void do_pvoc(t_pvoc *x );
+t_int *pvoc_perform(t_int *w);
+void pvoc_dsp(t_pvoc *x, t_signal **sp);
+
+void pvoc_tilde_setup(void)
+{
+    pvoc_class = class_new(gensym("pvoc~"), (t_newmethod)pvoc_new,
+						   (t_method)pvoc_free,sizeof(t_pvoc), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(pvoc_class, t_pvoc, x_f);
+	class_addmethod(pvoc_class,(t_method)pvoc_dsp,gensym("dsp"),0);
+	class_addmethod(pvoc_class,(t_method)pvoc_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(pvoc_class,(t_method)pvoc_lowfreq,gensym("lowfreq"),A_FLOAT,0);
+    class_addmethod(pvoc_class,(t_method)pvoc_highfreq,gensym("highfreq"),A_FLOAT,0);
+    class_addmethod(pvoc_class,(t_method)pvoc_fftinfo,gensym("fftinfo"),0);
+    fftease_announce(OBJECT_NAME);
+}
+
+void pvoc_lowfreq(t_pvoc *x, t_floatarg f)
+{
+    if(!x->fft->initialized)
+        return;
+    if(f < 0 ){
+        f = 0;
+    }
+    x->lofreq = f;
+    fftease_oscbank_setbins(x->fft,x->lofreq, x->hifreq);
+}
+
+void pvoc_highfreq(t_pvoc *x, t_floatarg f)
+{
+    if(!x->fft->initialized)
+        return;
+    if(f < 0 ){
+        f = 0;
+    }
+    if(f < x->lofreq){
+        error("%s: maximum cannot go below current minimum: %f",OBJECT_NAME,x->lofreq);
+        return;
+    }
+    if(f > x->fft->R/2 ){
+        f = x->fft->R/2;
+    }
+    x->hifreq = f;
+    fftease_oscbank_setbins(x->fft,x->lofreq, x->hifreq);
+}
+
+void pvoc_mute(t_pvoc *x, t_floatarg tog)
+{
+	x->mute = (short)tog;
+}
+
+void pvoc_fftinfo(t_pvoc *x)
+{
+t_fftease *fft = x->fft;
+	fftease_fftinfo( fft, OBJECT_NAME );	
+}
+
+void pvoc_free(t_pvoc *x ){
+	fftease_free(x->fft);
+    free(x->fft);
+}
+
+void pvoc_init(t_pvoc *x)
+{
+	float curfreq;
+	t_fftease *fft = x->fft;
+	
+	if(fft->initialized == -1){
+		return;
+	}
+    
+	fftease_init(fft);
+
+	if( x->hifreq < fft->c_fundamental ) {
+        post("default hi frequency of 18000 Hz");
+		x->hifreq = 18000.0 ;
+	}
+	x->fft->hi_bin = 1;  
+	curfreq = 0;
+	while( curfreq < x->hifreq ) {
+		++(x->fft->hi_bin);
+		curfreq += fft->c_fundamental ;
+	}
+	
+	x->fft->lo_bin = 0;  
+	curfreq = 0;
+	while( curfreq < x->lofreq ) {
+		++(x->fft->lo_bin);
+		curfreq += fft->c_fundamental;
+	}
+}
+
+void *pvoc_new(t_symbol *s, int argc, t_atom *argv)
+{
+    t_fftease *fft;
+	t_pvoc *x = (t_pvoc *)pd_new(pvoc_class);
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	x->lofreq = 0;
+	x->hifreq = 15000;
+	x->mute = 0;
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv);}
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv);}
+    if(argc > 2){ x->lofreq = atom_getfloatarg(2, argc, argv);}
+    if(argc > 3){ x->hifreq = atom_getfloatarg(3, argc, argv);}
+	fft->initialized = 0;// prepare for init in DSP routine
+	return x;
+}
+
+void do_pvoc(t_pvoc *x)
+{
+	t_fftease *fft = x->fft;
+    fftease_fold(fft);
+	fftease_rdft(fft, 1);
+	fftease_convert(fft);
+	fftease_oscbank(fft);
+}
+
+t_int *pvoc_perform(t_int *w)
+{
+    t_pvoc *x = (t_pvoc *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *transp = (t_float *)(w[3]);
+	t_float *synth_thresh = (t_float *)(w[4]);
+	t_float *MSPOutputVector = (t_float *)(w[5]);
+    
+	t_fftease *fft = x->fft;
+	int i, j;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float mult = fft->mult;
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	int MSPVectorSize = fft->MSPVectorSize;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	
+	if(x->mute){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+6;
+	}
+
+    fft->P  = *transp;
+    fft->pitch_increment = fft->P*fft->L/fft->R;
+    fft->synt = *synth_thresh;
+
+	// HERE IS THE GOOD STUFF
+	
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+		do_pvoc( x );
+        
+		for ( j = 0; j < D; j++ ){
+			*MSPOutputVector++ = output[j] * mult;
+        }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+			do_pvoc( x );
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+			
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+
+			do_pvoc( x );
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+6;
+}
+
+void pvoc_dsp(t_pvoc *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+	if(!samplerate)
+        return;
+    t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate ){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        pvoc_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(pvoc_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec);
+    }
+}
+
diff --git a/externals/fftease/pvtuner~.c b/externals/fftease/pvtuner~.c
new file mode 100644
index 0000000000000000000000000000000000000000..0729cab33016daa276193b2ed626fda0dbc21ba9
--- /dev/null
+++ b/externals/fftease/pvtuner~.c
@@ -0,0 +1,1014 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *pvtuner_class;
+
+#define OBJECT_NAME "pvtuner~"
+
+#define MAXTONES (8192)
+#define BASE_FREQ (27.5)	/* low A  */
+#define DIATONIC 0
+#define EASTERN 1
+#define MINOR 2
+#define EQ12 3
+#define PENTATONIC 4
+#define MAJOR_ADDED_SIXTH 5
+#define MINOR_ADDED_SIXTH 6
+#define ADDED_SIXTH_MAJOR 5
+#define ADDED_SIXTH_MINOR 6
+#define MAJOR_SEVENTH_CHORD 7
+#define MINOR_SEVENTH_CHORD 8
+#define DOMINANT_SEVENTH_CHORD 9
+#define EQ8 10
+#define PENTACLUST 11
+#define QUARTERCLUST 12
+#define EQ5 13
+#define SLENDRO 14
+#define PELOG 15
+#define IMPORTED_SCALE 16
+#define EQN 17
+
+typedef struct {
+	t_float *pitchgrid;
+	int scale_steps; // total number of members
+	short current_scale;
+} t_pvtuner_scale;
+
+typedef struct _pvtuner
+{
+    t_object x_obj;
+    t_float x_f;
+	t_fftease *fft;
+	int lo_bin;
+	int hi_bin;
+	int hi_tune_bin;
+	t_float topfreq;
+	t_float curfreq;
+	// TUNING
+	float *pitchgrid;
+	float pbase;
+	int scale_steps;
+	short current_scale;
+	short mute;
+	t_float lofreq;
+	t_float hifreq;
+	t_float tabscale;
+	int scale_len;
+	short verbose;
+	long fftsize_attr;
+	long overlap_attr;
+	long scale_interpolation; // interpolation flag, set to zero by default
+	t_float interpolation_dur; // set to 1 second
+	long interpolation_frames; // == duration / (D/R)
+	long interpolation_countdown; // count frames for interpolation
+	t_float ip; // interpolation point
+	t_pvtuner_scale *this_scale;
+	t_pvtuner_scale *last_scale;
+} t_pvtuner;
+
+
+void pvtuner_dsp(t_pvtuner *x, t_signal **sp);
+t_int *pvtuner_perform(t_int *w);
+t_float closestf(t_float test, t_float *arr) ;
+void pvtuner_diatonic( t_pvtuner *x );
+void pvtuner_eastern( t_pvtuner *x );
+void pvtuner_minor( t_pvtuner *x );
+void pvtuner_eq12( t_pvtuner *x );
+void pvtuner_pentatonic( t_pvtuner *x );
+void pvtuner_major_added_sixth( t_pvtuner *x );
+void pvtuner_minor_added_sixth( t_pvtuner *x );
+void pvtuner_major_seventh_chord( t_pvtuner *x );
+void pvtuner_minor_seventh_chord( t_pvtuner *x );
+void pvtuner_dominant_seventh_chord( t_pvtuner *x );
+void pvtuner_eq8( t_pvtuner *x );
+void pvtuner_pentaclust( t_pvtuner *x );
+void pvtuner_quarterclust( t_pvtuner *x );
+void pvtuner_eq5( t_pvtuner *x );
+void pvtuner_slendro( t_pvtuner *x );
+void pvtuner_pelog( t_pvtuner *x );
+void pvtuner_update_imported( t_pvtuner *x );
+void pvtuner_init(t_pvtuner *x);
+void *pvtuner_new(t_symbol *s, int argc, t_atom *argv);
+void pvtuner_import_scale(t_pvtuner *x, t_symbol *filename);
+void pvtuner_list (t_pvtuner *x, t_symbol *msg, short argc, t_atom *argv);
+void pvtuner_toptune( t_pvtuner *x, t_floatarg f );
+void pvtuner_frequency_range(t_pvtuner *x, t_floatarg lo, t_floatarg hi);
+void pvtuner_basefreq( t_pvtuner *x, t_floatarg bassfreq);
+void pvtuner_free(t_pvtuner *x);
+void pvtuner_mute(t_pvtuner *x, t_floatarg state);
+void pvtuner_list (t_pvtuner *x, t_symbol *msg, short argc, t_atom *argv);
+void pvtuner_binfo(t_pvtuner *x);
+void pvtuner_eqn(t_pvtuner *x, t_floatarg steps);
+void pvtuner_interpolation(t_pvtuner *x, t_floatarg state);
+
+void pvtuner_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("pvtuner~"), (t_newmethod)pvtuner_new,
+                  (t_method)pvtuner_free,sizeof(t_pvtuner), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_pvtuner, x_f);
+	class_addmethod(c,(t_method)pvtuner_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)pvtuner_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(c,(t_method)pvtuner_basefreq,gensym("basefreq"),A_DEFFLOAT,0);
+	class_addmethod(c,(t_method)pvtuner_diatonic,gensym("diatonic"),0);
+	class_addmethod(c,(t_method)pvtuner_eastern,gensym("eastern"),0);
+	class_addmethod(c,(t_method)pvtuner_minor,gensym("minor"),0);
+	class_addmethod(c,(t_method)pvtuner_eq12,gensym("eq12"),0);
+	class_addmethod(c,(t_method)pvtuner_pentatonic,gensym("pentatonic"),0);
+	class_addmethod(c,(t_method)pvtuner_major_added_sixth,gensym("added_sixth_major"),0);
+	class_addmethod(c,(t_method)pvtuner_minor_added_sixth,gensym("added_sixth_minor"),0);
+	class_addmethod(c,(t_method)pvtuner_major_seventh_chord,gensym("major_seventh_chord"),0);
+	class_addmethod(c,(t_method)pvtuner_minor_seventh_chord,gensym("minor_seventh_chord"),0);
+	class_addmethod(c,(t_method)pvtuner_dominant_seventh_chord,gensym("dominant_seventh_chord"),0);
+	class_addmethod(c,(t_method)pvtuner_eq8,gensym("eq8"),0);
+	class_addmethod(c,(t_method)pvtuner_pentaclust,gensym("pentaclust"),0);
+	class_addmethod(c,(t_method)pvtuner_quarterclust,gensym("quarterclust"),0);
+	class_addmethod(c,(t_method)pvtuner_eq5,gensym("eq5"),0);
+	class_addmethod(c,(t_method)pvtuner_eqn,gensym("eqn"),A_FLOAT, 0);
+    class_addmethod(c,(t_method)pvtuner_interpolation,gensym("interpolation"),A_FLOAT, 0);
+	class_addmethod(c,(t_method)pvtuner_slendro,gensym("slendro"),0);
+	class_addmethod(c,(t_method)pvtuner_pelog,gensym("pelog"),0);
+	class_addmethod(c,(t_method)pvtuner_list,gensym("list"),A_GIMME,0);
+	class_addmethod(c,(t_method)pvtuner_frequency_range,gensym("frequency_range"),A_FLOAT,A_FLOAT, 0);
+    pvtuner_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void *pvtuner_new(t_symbol *s, int argc, t_atom *argv)
+{
+    t_fftease *fft;
+	t_pvtuner *x = (t_pvtuner *)pd_new(pvtuner_class);
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft->initialized = 0;
+	x->verbose = 0;
+	x->lofreq = 0;
+	x->hifreq = 18000;
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;	
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+}
+/* Copies current scale (this_scale) to next scale (next_scale)
+ */
+void pvtuner_copy_scale(t_pvtuner *x)
+{
+	int i;
+	t_pvtuner_scale *this = x->this_scale;
+	t_pvtuner_scale *last = x->last_scale;
+	last->scale_steps = this->scale_steps;
+	last->current_scale = this->current_scale;
+	for(i = 0; i < last->scale_steps; i++){
+		last->pitchgrid[i] = this->pitchgrid[i];
+	}
+}
+
+void pvtuner_init(t_pvtuner *x)
+{
+	int mem;
+	
+	t_fftease *fft = x->fft;
+	if( fft->R <= 0.0 ){
+		post("%s: zero sample rate reported - initialization deferred", OBJECT_NAME);
+		x->fft->initialized = 0; // failed initialization
+		return;
+	}
+
+	if(!x->fft->initialized){
+		x->mute = 0;
+		mem = (MAXTONES+1)*sizeof(float);
+		x->pitchgrid = (float *) calloc(mem,1);
+		x->pbase = BASE_FREQ;
+		x->this_scale = (t_pvtuner_scale *) calloc(1,sizeof(t_pvtuner_scale));
+		x->last_scale = (t_pvtuner_scale *) calloc(1,sizeof(t_pvtuner_scale));
+		x->this_scale->pitchgrid = (t_float *) calloc(1,mem);
+		x->last_scale->pitchgrid = (t_float *) calloc(1,mem);
+		x->this_scale->scale_steps = 0;
+		x->last_scale->scale_steps = 0;
+		pvtuner_diatonic(x);// default scale (rebuilt for new scale structure)
+		pvtuner_copy_scale(x); // now both this and next scale are diatonic
+	} 
+
+	fftease_init(fft);
+	if( x->fft->D && x->fft->R ){
+		/*
+		x->interpolation_frames = x->interpolation_dur / ((float)x->fft->D / (float)x->fft->R);
+		post("interpolation frames: %d", x->interpolation_frames);
+		*/
+	} else {
+		post("pvtuner~: dire warning!");
+		return;
+		// dire warning
+	}
+	fftease_oscbank_setbins(fft,x->lofreq, x->hifreq);
+	x->hi_tune_bin = fft->hi_bin;
+}
+
+void pvtuner_toptune(t_pvtuner *x, t_floatarg f)
+{
+	int tbin;
+	t_float curfreq;
+	t_float fundamental = x->fft->c_fundamental;
+	t_fftease *fft = x->fft;
+	tbin = 1;  
+	curfreq = 0;
+	
+	if( f < 0 || f > x->fft->R / 2.0 ){
+		error("frequency %f out of range", f);
+		return;
+	}
+	while( curfreq < f ) {
+		++tbin;
+		curfreq += fundamental ;
+	}
+	if( tbin > fft->lo_bin && tbin <= fft->hi_bin ){
+		x->hi_tune_bin = tbin;
+	} else {
+		error("pvtuner~: bin %d out of range", tbin);
+	}
+	
+}
+
+
+void pvtuner_list (t_pvtuner *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	t_float *pitchgrid = x->this_scale->pitchgrid;
+    t_float dval;
+	t_pvtuner_scale *s = x->this_scale;
+	int i = 0;
+	
+	if( ! atom_getfloatarg(i,argc,argv) ){
+		error("either zero length scale or 0.0 (prohibited) is first value");
+		return;
+	}
+	pvtuner_copy_scale(x);
+	/* first set every value to maximum */
+	for(i=0; i < MAXTONES; i++){
+		pitchgrid[i] = (t_float)x->fft->R / 2.0;
+	}
+    // now read scale
+	for( i = 0; i < argc; i++ ){
+        dval = atom_getfloatarg(i,argc,argv);
+		pitchgrid[ i ] = dval;
+	}
+	s->scale_steps = argc;
+	s->current_scale = IMPORTED_SCALE;
+}
+
+void pvtuner_binfo(t_pvtuner *x)
+{
+	t_fftease *fft = x->fft;
+	post("%s: frequency targets: %f %f", OBJECT_NAME, x->lofreq, x->hifreq);
+	post("synthesizing %d bins, from %d to %d",(fft->hi_bin - fft->lo_bin), fft->lo_bin, fft->hi_bin);
+}
+
+void pvtuner_frequency_range(t_pvtuner *x, t_floatarg lo, t_floatarg hi)
+{
+	t_fftease *fft = x->fft;
+	x->lofreq = lo ;
+	x->hifreq = hi;
+	
+	
+	if( lo >= hi ){
+		error("low frequency must be lower than high frequency");
+		return;
+	}
+	x->curfreq = 0;
+	fft->hi_bin = 0;
+	
+	while( x->curfreq < x->hifreq ) {
+		++(fft->hi_bin);
+		x->curfreq += x->fft->c_fundamental;
+	}
+	
+	x->curfreq = 0;
+	fft->lo_bin = 0;  
+	while( x->curfreq < x->lofreq ) {
+		++(fft->lo_bin);
+		x->curfreq += x->fft->c_fundamental ;
+	}
+}
+
+void do_pvtuner(t_pvtuner *x)
+{
+	t_fftease *fft = x->fft;
+	int freq,chan;
+	t_float *channel = fft->channel;
+	t_float *this_pitchgrid = x->this_scale->pitchgrid;
+	t_float *last_pitchgrid = x->last_scale->pitchgrid;
+	int hi_bin = fft->hi_bin;
+	int lo_bin = fft->lo_bin;
+	int hi_tune_bin = x->hi_tune_bin;
+	long scale_interpolation = x->scale_interpolation;
+	t_float ip = x->ip;
+	t_float freq_this, freq_last;
+	fftease_fold(fft);
+	fftease_rdft(fft, 1);
+	fftease_convert(fft);
+	// static case
+	if( scale_interpolation == 0) {
+		for ( chan = lo_bin; chan < hi_bin; chan++ ) {
+			freq = (chan * 2) + 1;
+			if(chan <= hi_tune_bin){
+				channel[freq] = closestf(channel[freq], this_pitchgrid);
+			}
+		}
+	}
+	// interpolated case
+	else if( scale_interpolation == 1) {
+		// clip
+		if( ip < 0 )
+			ip = 0;
+		if( ip > 1 )
+			ip = 1;
+		// degenerate cases first
+		if( ip == 0 ){
+			for ( chan = lo_bin; chan < hi_bin; chan++ ) {
+				freq = (chan * 2) + 1;
+				if(chan <= hi_tune_bin){
+					channel[freq] = closestf(channel[freq], last_pitchgrid);
+				}
+			}
+		} 
+		else if ( ip == 1){
+			for ( chan = lo_bin; chan < hi_bin; chan++ ) {
+				freq = (chan * 2) + 1;
+				if(chan <= hi_tune_bin){
+					channel[freq] = closestf(channel[freq], this_pitchgrid);
+				}
+			}
+		}
+		else {
+			for ( chan = lo_bin; chan < hi_bin; chan++ ) {
+				freq = (chan * 2) + 1;
+				if(chan <= hi_tune_bin){
+					freq_this = closestf(channel[freq], this_pitchgrid);
+					freq_last = closestf(channel[freq], last_pitchgrid);
+					channel[freq] = freq_last + (freq_this - freq_last) * ip; // linear interpolation
+				}
+			}
+		}
+	}
+	fftease_oscbank(fft);
+}
+
+
+t_int *pvtuner_perform(t_int *w)
+{
+	int 	i,j;
+    t_pvtuner *x = (t_pvtuner *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *pitchfac = (t_float *)(w[3]);
+	t_float *synth_thresh = (t_float *)(w[4]);
+	t_float *ip = (t_float *)(w[5]);
+	t_float *MSPOutputVector = (t_float *)(w[6]);
+	t_fftease *fft = x->fft;
+	
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float mult = fft->mult;	
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	int MSPVectorSize = fft->MSPVectorSize;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	
+	if (x->mute) {
+		memset(MSPOutputVector, 0.0, MSPVectorSize * sizeof(float));
+		return w+7;
+	}
+
+    fft->P  = *pitchfac;
+    fft->synt = *synth_thresh ;
+    x->ip = *ip;
+
+
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_pvtuner(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_pvtuner(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_pvtuner(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+7;
+}
+
+void pvtuner_basefreq( t_pvtuner *x, t_floatarg bassfreq)
+{
+    if(! x->fft->initialized){
+        return;
+    }
+	if( bassfreq < 1 ){
+		bassfreq = 1;
+		post("%s: base frequency may not go lower than 1 Hz", OBJECT_NAME);
+	}
+	if( bassfreq > 10000. ){
+		bassfreq = 10000.;
+		post("%s: base frequency may not go higher than 10000 Hz", OBJECT_NAME);
+	}
+	x->pbase = bassfreq;
+	if( x->current_scale == IMPORTED_SCALE ){
+		pvtuner_update_imported( x );
+	}
+	else if( x->current_scale == DIATONIC ){
+		pvtuner_diatonic( x );
+	} 
+	else if( x->current_scale == EASTERN) {
+		pvtuner_eastern( x );
+	}
+	else if( x->current_scale == MINOR) {
+		pvtuner_minor( x );
+	}
+	else if( x->current_scale == EQ12) {
+		pvtuner_eq12( x );
+	}
+	else if( x->current_scale == PENTATONIC) {
+		pvtuner_pentatonic( x );
+	}
+	else if( x->current_scale == MAJOR_ADDED_SIXTH) {
+		pvtuner_major_added_sixth( x );
+	}
+	else if( x->current_scale == MINOR_ADDED_SIXTH) {
+		pvtuner_minor_added_sixth( x );
+	}
+	else if( x->current_scale == MAJOR_SEVENTH_CHORD) {
+		pvtuner_major_seventh_chord( x );
+	}
+	else if( x->current_scale == MINOR_SEVENTH_CHORD) {
+		pvtuner_minor_seventh_chord( x );
+	}
+	else if( x->current_scale == DOMINANT_SEVENTH_CHORD) {
+		pvtuner_dominant_seventh_chord( x );
+	}
+	else if( x->current_scale == EQ8) {
+		pvtuner_eq8( x );
+	}
+	else if( x->current_scale == PENTACLUST) {
+		pvtuner_pentaclust( x );
+	}
+	else if( x->current_scale == QUARTERCLUST ) {
+		pvtuner_quarterclust( x );
+	}
+	else if( x->current_scale == EQ5 ) {
+		pvtuner_eq5( x );
+	}
+	else if( x->current_scale == SLENDRO ) {
+		pvtuner_slendro( x );
+	}
+	else if( x->current_scale == PELOG ) {
+		pvtuner_pelog( x );
+	}	
+	else {
+		post("unknown scale");
+	}
+}
+
+void pvtuner_free(t_pvtuner *x)
+{
+    if(x->fft->initialized){
+        free(x->this_scale);
+        free(x->last_scale);
+    }
+	fftease_free(x->fft);
+    free(x->fft);
+}
+
+void pvtuner_update_imported( t_pvtuner *x ){
+	t_float *pitchgrid = x->this_scale->pitchgrid;
+	t_float factor; 
+	int i;
+
+	if( pitchgrid[0] <= 0.0){
+		error("%s: illegal first value of scale: %f",OBJECT_NAME,pitchgrid[0]);
+		return;
+	}
+	
+	factor = x->pbase / pitchgrid[0];
+	pvtuner_copy_scale(x); // copies this scale to next
+	for( i = 0; i < x->scale_len; i++ )
+		pitchgrid[i] *= factor;
+}
+
+void pvtuner_diatonic( t_pvtuner *x ){
+	int i, j;
+	int octsteps = 7;
+	t_pvtuner_scale *s = x->this_scale;
+	
+	pvtuner_copy_scale(x); // copies this scale to next
+
+	s->pitchgrid[0] = x->pbase;
+	s->pitchgrid[1] = x->pbase * (9./8.);
+	s->pitchgrid[2] = x->pbase * (5./4.);
+	s->pitchgrid[3] = x->pbase * (4./3.);
+	s->pitchgrid[4] = x->pbase * (3./2.);
+	s->pitchgrid[5] = x->pbase * (27./16.);
+	s->pitchgrid[6] = x->pbase * (15./8.);
+	s->scale_steps = 7;
+	for( i = 1; i < 10; i++ ){
+		for( j = 0; j < octsteps; j++ ){
+			s->pitchgrid[ i * octsteps + j] = s->pitchgrid[j] * pow(2.0,(float)i);
+		}
+	}
+	s->current_scale = DIATONIC ;
+	s->scale_steps = 70; // 10 * 7
+}
+
+void pvtuner_minor( t_pvtuner *x ){
+	int i, j;
+	int octsteps = 7;
+	t_pvtuner_scale *s = x->this_scale;
+	t_float *pitchgrid = x->this_scale->pitchgrid;
+	
+	pvtuner_copy_scale(x); // copies this scale to next
+	
+	pitchgrid[0] = x->pbase;
+	pitchgrid[1] = x->pbase * (9./8.);
+	pitchgrid[2] = x->pbase * (6./5.);
+	pitchgrid[3] = x->pbase * (4./3.);
+	pitchgrid[4] = x->pbase * (3./2.);
+	pitchgrid[5] = x->pbase * (8./5.);
+	pitchgrid[6] = x->pbase * (9./5.);
+	for( i = 1; i < 10; i++ ){
+		for( j = 0; j < octsteps; j++ ){
+			pitchgrid[ i * octsteps + j] = pitchgrid[j] * pow(2.0,(float)i);
+		}
+	}
+	s->current_scale = MINOR;
+	s->scale_steps = 70;
+	
+}
+
+void pvtuner_pentatonic( t_pvtuner *x ){
+	int i, j;
+	t_pvtuner_scale *s = x->this_scale;
+	t_float *pitchgrid = x->this_scale->pitchgrid;
+	int octsteps = 5;
+	pvtuner_copy_scale(x); 
+	pitchgrid[0] = x->pbase;
+	pitchgrid[1] = x->pbase * (9./8.);
+	pitchgrid[2] = x->pbase * (81./64.);
+	pitchgrid[3] = x->pbase * (3./2.);
+	pitchgrid[4] = x->pbase * (27./16.);
+	for( i = 1; i < 10; i++ ){
+		for( j = 0; j < octsteps; j++ ){
+			pitchgrid[ i * octsteps + j] = pitchgrid[j] * pow(2.0,(float)i);
+		}
+	}
+	s->current_scale = PENTATONIC;
+	s->scale_steps = 50;
+}
+
+void pvtuner_eq12( t_pvtuner *x ){
+	int i, j;
+	t_float expon;
+	int octsteps = 12;
+	t_float pbase = x->pbase;
+	t_pvtuner_scale *s = x->this_scale;
+	t_float *pitchgrid = x->this_scale->pitchgrid;
+	
+	pvtuner_copy_scale(x); // copies this scale to next
+	
+	// now refill this scale
+	pitchgrid[0] = pbase;
+	for( i = 0; i < octsteps; i++ ){
+		expon = (float) i / (float) octsteps;
+		pitchgrid[i] = pbase * pow(2.0,expon);
+	}
+	for( i = 1; i < 10; i++ ){
+		for( j = 0; j < octsteps; j++ ){
+			pitchgrid[ i * octsteps + j] = pitchgrid[j] * pow(2.0,(float)i);
+		}
+	}
+	s->current_scale = EQ12;
+	s->scale_steps = 120;
+}
+
+void pvtuner_major_added_sixth( t_pvtuner *x ){
+	int i, j;
+	t_pvtuner_scale *s = x->this_scale;
+	t_float *pitchgrid = x->this_scale->pitchgrid;
+	t_float pbase = x->pbase;
+	int octsteps = 4;
+	
+	pvtuner_copy_scale(x);
+	
+	pitchgrid[0] = pbase;
+	pitchgrid[1] = pbase * 1.259921;
+	pitchgrid[2] = pbase * 1.498307;
+	pitchgrid[3] = pbase * 1.681793;
+    
+	for( i = 1; i < 10; i++ ){
+		for( j = 0; j < octsteps; j++ ){
+			pitchgrid[ i * octsteps + j] = pitchgrid[j] * pow(2.0,(float)i);
+		}
+	}
+	s->current_scale = MAJOR_ADDED_SIXTH;
+	s->scale_steps = 40;
+}
+
+void pvtuner_minor_added_sixth( t_pvtuner *x ){
+	int i, j;
+	// float *pitchgrid = x->pitchgrid;
+	t_float pbase = x->pbase;
+	t_pvtuner_scale *s = x->this_scale;
+	t_float *pitchgrid = x->this_scale->pitchgrid;
+	int octsteps = 4;
+	
+	pvtuner_copy_scale(x);
+	
+	pitchgrid[0] = pbase;
+	pitchgrid[1] = pbase * 1.189207;
+	pitchgrid[2] = pbase * 1.498307;
+	pitchgrid[3] = pbase * 1.587401;
+	// scale_steps = 4 ;
+    
+	for( i = 1; i < 10; i++ ){
+		for( j = 0; j < octsteps; j++ ){
+			pitchgrid[ i * octsteps + j] = pitchgrid[j] * pow(2.0,(float)i);
+		}
+	}
+	s->current_scale = MINOR_ADDED_SIXTH;
+	s->scale_steps = 40;
+}
+
+void pvtuner_major_seventh_chord( t_pvtuner *x ){
+	int i, j;
+	t_pvtuner_scale *s = x->this_scale;
+	t_float *pitchgrid = s->pitchgrid;
+	t_float pbase = x->pbase;
+	int scale_steps;
+	
+	pvtuner_copy_scale(x);
+	
+	pitchgrid[0] = pbase;
+	pitchgrid[1] = pbase * 1.25;
+	pitchgrid[2] = pbase * 1.5;
+	pitchgrid[3] = pbase * 1.875;
+	scale_steps = 4 ;
+    
+	for( i = 1; i < 10; i++ ){
+		for( j = 0; j < scale_steps; j++ ){
+			pitchgrid[ i * scale_steps + j] = pitchgrid[j] * pow(2.0,(float)i);
+		}
+	}
+	s->current_scale = MAJOR_SEVENTH_CHORD;
+	s->scale_steps = 40;
+}
+
+void pvtuner_minor_seventh_chord( t_pvtuner *x ){
+	int i, j;
+	t_pvtuner_scale *s = x->this_scale;
+	t_float *pitchgrid = s->pitchgrid;
+	t_float pbase = x->pbase;
+	int scale_steps;
+	
+	pvtuner_copy_scale(x);
+	
+	pitchgrid[0] = pbase;
+	pitchgrid[1] = pbase * 1.2;
+	pitchgrid[2] = pbase * 1.5;
+	pitchgrid[3] = pbase * 1.781797;
+	scale_steps = 4 ;
+    
+	for( i = 1; i < 10; i++ ){
+		for( j = 0; j < scale_steps; j++ ){
+			pitchgrid[ i * scale_steps + j] = pitchgrid[j] * pow(2.0,(float)i);
+		}
+	}
+	s->current_scale = MINOR_SEVENTH_CHORD;
+	s->scale_steps = 40;
+}
+
+void pvtuner_dominant_seventh_chord( t_pvtuner *x ){
+	int i, j;
+	t_pvtuner_scale *s = x->this_scale;
+	t_float *pitchgrid = s->pitchgrid;
+	t_float pbase = x->pbase;
+	int scale_steps;
+	
+	pvtuner_copy_scale(x);
+	
+	pitchgrid[0] = pbase;
+	pitchgrid[1] = pbase * 1.25;
+	pitchgrid[2] = pbase * 1.5;
+	pitchgrid[3] = pbase * 1.781797;
+	scale_steps = 4 ;
+    
+	for( i = 1; i < 10; i++ ){
+		for( j = 0; j < scale_steps; j++ ){
+			pitchgrid[ i * scale_steps + j] = pitchgrid[j] * pow(2.0,(float)i);
+		}
+	}
+	s->current_scale = DOMINANT_SEVENTH_CHORD;
+	s->scale_steps = 40;
+}
+void pvtuner_eqn( t_pvtuner *x, t_floatarg steps )
+{
+int dexter = 0;
+	if(steps <= 0.0){
+		return;
+	}
+	t_pvtuner_scale *s = x->this_scale;
+	t_float *pitchgrid = x->this_scale->pitchgrid;
+	
+	float pbase = x->pbase;
+	float factor = pow(2.0, (1.0/steps) );
+	
+	pvtuner_copy_scale(x);
+	
+	while(pbase < (x->fft->R / 2.0) && dexter < MAXTONES ){
+		pitchgrid[dexter] = pbase;
+		pbase = pbase * factor;
+		dexter = dexter + 1;
+	}
+	s->scale_steps = dexter;
+	s->current_scale = EQN;
+}
+
+void pvtuner_eq8( t_pvtuner *x ){
+	int i, j;
+	t_pvtuner_scale *s = x->this_scale;
+	t_float *pitchgrid = s->pitchgrid;
+	t_float pbase = x->pbase;
+	int octsteps = 8;
+	
+	pvtuner_copy_scale(x);
+	
+	pitchgrid[0] = pbase;
+	pitchgrid[1] = pbase * 1.090508;
+	pitchgrid[2] = pbase * 1.189207;
+	pitchgrid[3] = pbase * 1.296840;
+	pitchgrid[4] = pbase * 1.414214;
+	pitchgrid[5] = pbase * 1.542211;
+	pitchgrid[6] = pbase * 1.681793;
+	pitchgrid[7] = pbase * 1.834008;
+	
+    
+	for( i = 1; i < 10; i++ ){
+		for( j = 0; j < octsteps; j++ ){
+			pitchgrid[ i * octsteps + j] = pitchgrid[j] * pow(2.0,(float)i);
+		}
+	}
+	s->current_scale = EQ8;
+	s->scale_steps = 80;
+}
+
+void pvtuner_pentaclust( t_pvtuner *x ){
+	int i, j;
+	t_pvtuner_scale *s = x->this_scale;
+	t_float *pitchgrid = s->pitchgrid;
+	t_float pbase = x->pbase;
+	int scale_steps;
+	
+	pvtuner_copy_scale(x);
+	
+	pitchgrid[0] = pbase;
+	pitchgrid[1] = pbase * 1.059463;
+	pitchgrid[2] = pbase * 1.122462;
+	pitchgrid[3] = pbase * 1.189207;
+	pitchgrid[4] = pbase * 1.259921;
+	
+	scale_steps = 5 ;
+    
+	for( i = 1; i < 10; i++ ){
+		for( j = 0; j < scale_steps; j++ ){
+			pitchgrid[ i * scale_steps + j] = pitchgrid[j] * pow(2.0,(float)i);
+		}
+	}
+	s->current_scale = PENTACLUST;
+	s->scale_steps = 50;
+}
+
+void pvtuner_quarterclust( t_pvtuner *x ){
+	int i, j;
+	t_pvtuner_scale *s = x->this_scale;
+	t_float *pitchgrid = s->pitchgrid;
+	t_float pbase = x->pbase;
+	int scale_steps;
+	
+	pvtuner_copy_scale(x);
+	
+	pitchgrid[0] = pbase;
+	pitchgrid[1] = pbase * 1.029302;
+	pitchgrid[2] = pbase * 1.059463;
+	pitchgrid[3] = pbase * 1.090508;
+	pitchgrid[4] = pbase * 1.122462;
+	pitchgrid[5] = pbase * 1.155353;
+	pitchgrid[6] = pbase * 1.189207;
+	pitchgrid[7] = pbase * 1.224054;
+	
+	scale_steps = 8 ;
+    
+	for( i = 1; i < 10; i++ ){
+		for( j = 0; j < scale_steps; j++ ){
+			pitchgrid[ i * scale_steps + j] = pitchgrid[j] * pow(2.0,(float)i);
+		}
+	}
+	s->current_scale = QUARTERCLUST;
+	s->scale_steps = 80;
+}
+
+void pvtuner_eq5( t_pvtuner *x ){
+	int i, j;
+	t_pvtuner_scale *s = x->this_scale;
+	t_float *pitchgrid = s->pitchgrid;
+	t_float pbase = x->pbase;
+	int scale_steps;
+	
+	pvtuner_copy_scale(x);
+	
+	pitchgrid[0] = pbase;
+	pitchgrid[1] = pbase * 1.148698;
+	pitchgrid[2] = pbase * 1.319508;
+	pitchgrid[3] = pbase * 1.515717;
+	pitchgrid[4] = pbase * 1.741101;
+	
+	scale_steps = 5 ;
+    
+	for( i = 1; i < 10; i++ ){
+		for( j = 0; j < scale_steps; j++ ){
+			pitchgrid[ i * scale_steps + j] = pitchgrid[j] * pow(2.0,(float)i);
+		}
+	}
+	s->current_scale = EQ5;
+	s->scale_steps = 50;
+}
+
+void pvtuner_pelog( t_pvtuner *x ){
+	int i, j;
+	t_float *pitchgrid = x->this_scale->pitchgrid;
+	t_pvtuner_scale *s = x->this_scale;
+	t_float pbase = x->pbase;
+	int scale_steps;
+	
+	pvtuner_copy_scale(x);
+	
+	pitchgrid[0] = pbase;
+	pitchgrid[1] = pbase * 1.152;
+	pitchgrid[2] = pbase * 1.340;
+	pitchgrid[3] = pbase * 1.532;
+	pitchgrid[4] = pbase * 1.756;
+	scale_steps = 5 ;
+    
+	for( i = 1; i < 10; i++ ){
+		for( j = 0; j < scale_steps; j++ ){
+			pitchgrid[ i * scale_steps + j] = pitchgrid[j] * pow(2.0,(float)i);
+		}
+	}
+	s->current_scale = PELOG;
+	s->scale_steps = 50;
+}
+
+void pvtuner_slendro( t_pvtuner *x ){
+	int i, j;
+	t_float *pitchgrid = x->this_scale->pitchgrid;
+	t_pvtuner_scale *s = x->this_scale;
+	t_float pbase = x->pbase;
+	int scale_steps;
+	
+	pvtuner_copy_scale(x);
+	
+	pitchgrid[0] = pbase;
+	pitchgrid[1] = pbase * 1.104;
+	pitchgrid[2] = pbase * 1.199;
+	pitchgrid[3] = pbase * 1.404;
+	pitchgrid[4] = pbase * 1.514;
+	pitchgrid[5] = pbase * 1.615;    
+	pitchgrid[6] = pbase * 1.787;    
+	scale_steps = 7 ;
+    
+	for( i = 1; i < 10; i++ ){
+		for( j = 0; j < scale_steps; j++ ){
+			pitchgrid[ i * scale_steps + j] = pitchgrid[j] * pow(2.0,(float)i);
+		}
+	}
+	s->current_scale = SLENDRO;
+	s->scale_steps = 70;
+}
+void pvtuner_eastern( t_pvtuner *x ){
+	int i, j;
+	t_pvtuner_scale *s = x->this_scale;
+	t_float *pitchgrid = s->pitchgrid;
+	pvtuner_copy_scale(x);
+	int octsteps = 7;
+	
+	pitchgrid[0] = x->pbase;
+	pitchgrid[1] = x->pbase * 1.059463;
+	pitchgrid[2] = x->pbase * 1.259921;
+	pitchgrid[3] = x->pbase * 1.334840;
+	pitchgrid[4] = x->pbase * 1.498307;
+	pitchgrid[5] = x->pbase * 1.587401;
+	pitchgrid[6] = x->pbase * 1.887749;
+	// scale_steps = 7 ;
+    
+	for( i = 1; i < 10; i++ ){
+		for( j = 0; j < x->scale_steps; j++ ){
+			pitchgrid[ i * octsteps + j] = pitchgrid[j] * pow(2.0,(float)i);
+		}
+	}
+	s->current_scale = EASTERN ;
+	s->scale_steps = 70;
+	//   post("eastern scale");
+}
+
+t_float closestf(t_float test, t_float *arr) 
+{
+	int i;
+	i = 0;
+	if( test <= arr[0] ){
+		return arr[0];
+	}
+	while( i < MAXTONES ){
+		if( arr[i] > test ){
+			break;
+		}
+		++i;
+	}
+	if( i >= MAXTONES - 1) {
+		return arr[MAXTONES - 1];
+	}
+	if( (test - arr[i-1]) > ( arr[i] - test) ) {
+		return arr[i];
+	} else {
+		return arr[i-1];
+	}
+}
+
+void pvtuner_interpolation(t_pvtuner *x, t_floatarg state)
+{
+	x->scale_interpolation = (short)state;
+}
+
+void pvtuner_mute(t_pvtuner *x, t_floatarg state)
+{
+	x->mute = (short)state;	
+}
+
+void pvtuner_dsp(t_pvtuner *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        pvtuner_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(pvtuner_perform, 6, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, sp[4]->s_vec);
+    }
+}
+
diff --git a/externals/fftease/pvwarpb~.c b/externals/fftease/pvwarpb~.c
new file mode 100644
index 0000000000000000000000000000000000000000..1ef60959568f1737e610cf967cea7a794d148997
--- /dev/null
+++ b/externals/fftease/pvwarpb~.c
@@ -0,0 +1,515 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *pvwarpb_class;
+
+#define OBJECT_NAME "pvwarpb~"
+
+typedef struct _pvwarpb
+{
+    t_object x_obj;
+    t_float x_f;
+	t_symbol *buffername;
+	t_float lofreq;/* user speficied lowest synthfreq */
+	t_float hifreq;/* user specified highest synthfreq */
+	t_float topfreq;
+	t_fftease *fft;
+	short mute;
+	short please_update;
+	short always_update;
+	t_float cf1;
+	t_float bw1;
+	t_float warpfac1;
+	t_float cf2;
+	t_float bw2;
+	t_float warpfac2;
+	int funcoff;
+	short verbose;
+	short automate;
+    t_float *warpfunc; // workspace to create a new function
+	short initialized; // state for object
+    int b_frames;
+    t_float *b_samples;
+    int b_valid;
+} t_pvwarpb;
+
+void pvwarpb_dsp(t_pvwarpb *x, t_signal **sp);
+t_int *pvwarpb_perform(t_int *w);
+void *pvwarpb_new(t_symbol *s, int argc, t_atom *argv);
+void pvwarpb_mute(t_pvwarpb *x, t_floatarg state);
+void pvwarpb_automate(t_pvwarpb *x, t_floatarg state);
+void pvwarpb_autofunc(t_pvwarpb *x, t_floatarg minval, t_floatarg maxval);
+void pvwarpb_free( t_pvwarpb *x );
+t_float fftease_randf( t_float min, t_float max );
+t_float closestf(t_float test, t_float *arr) ;
+int freq_to_bin(t_float target, t_float fundamental);
+void update_warp_function( t_pvwarpb *x ) ;
+void pvwarpb_init(t_pvwarpb *x);
+void pvwarpb_bottomfreq(t_pvwarpb *x, t_floatarg f);
+void pvwarpb_topfreq(t_pvwarpb *x, t_floatarg f);
+void pvwarpb_attachbuf(t_pvwarpb *x);
+void pvwarpb_setbuf(t_pvwarpb *x, t_symbol *wavename);
+void pvwarpb_redraw(t_pvwarpb *x);
+
+void pvwarpb_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("pvwarpb~"), (t_newmethod)pvwarpb_new,
+                  (t_method)pvwarpb_free,sizeof(t_pvwarpb), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_pvwarpb, x_f);
+	class_addmethod(c,(t_method)pvwarpb_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)pvwarpb_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(c,(t_method)pvwarpb_bottomfreq,gensym("bottomfreq"),A_FLOAT,0);
+	class_addmethod(c,(t_method)pvwarpb_topfreq,gensym("topfreq"),A_FLOAT,0);
+	class_addmethod(c,(t_method)pvwarpb_autofunc,gensym("autofunc"),A_DEFFLOAT, A_DEFFLOAT,0);
+    pvwarpb_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void pvwarpb_automate(t_pvwarpb *x, t_floatarg state)
+{
+	x->automate = state;
+}
+
+void update_warp_function( t_pvwarpb *x )
+{
+	int i,j;
+	int N2 = x->fft->N2;
+	t_float warpfac1 = x->warpfac1;
+	t_float warpfac2 = x->warpfac2;
+    long b_frames;
+    t_float *warpfunc = x->warpfunc;
+    float *b_samples;
+	t_float cf1 = x->cf1;
+	t_float cf2 = x->cf2;
+	t_float bw1 = x->bw1;
+	t_float bw2 = x->bw2;
+	t_float c_fundamental = x->fft->c_fundamental;
+	t_float deviation;
+	t_float diff;
+	int midbin, lobin, hibin ;
+	t_float hif, lof;
+	int bin_extent;
+    
+    pvwarpb_attachbuf(x);
+
+    b_frames = x->b_frames;
+    if(b_frames < N2){
+        post("%s: table too small",OBJECT_NAME);
+        return;
+    }
+    
+	for( i = 0; i < N2; i++ ){
+		warpfunc[i] = 1.0;
+	}
+	hif = cf1 * (1. + bw1);
+	lof = cf1 * (1. - bw1);
+	midbin = freq_to_bin( cf1, c_fundamental );
+	hibin = freq_to_bin( hif, c_fundamental );
+	lobin = freq_to_bin( lof, c_fundamental );
+	if( hibin >= N2 - 1 ){
+		hibin = N2 - 1;
+	}
+	if( lobin < 0 ){
+		lobin = 0;
+	} 
+/*	if( verbose )
+		post("bump1: hi %d mid %d lo %d",hibin,midbin,lobin); */
+	
+	warpfunc[midbin] = warpfac1;
+	diff = warpfac1 - 1.0 ;
+	bin_extent = hibin - midbin ;
+	for( i = midbin, j = 0; i < hibin; i++, j++ ){
+		deviation = diff * ((float)(bin_extent - j) / (float) bin_extent );
+		warpfunc[ i ] += deviation ;
+	}
+	bin_extent = midbin - lobin ;
+	for( i = midbin, j = 0; i > lobin; i--, j++ ){
+		deviation = diff * ((float)(bin_extent - j) / (float) bin_extent );
+		warpfunc[ i ] += deviation ;
+	}
+	
+	// NOW DO SECOND BUMP
+	hif = cf2 * (1. + bw2);
+	lof = cf2 * (1. - bw2);
+	midbin = freq_to_bin( cf2, c_fundamental );
+	hibin = freq_to_bin( hif, c_fundamental );
+	lobin = freq_to_bin( lof, c_fundamental );
+	if( hibin >= N2 - 1 ){
+		hibin = N2 - 1;
+	}
+	if( lobin < 0 ){
+		lobin = 0;
+	} 
+	/* if( verbose )
+		post("bump2: hi %d mid %d lo %d",hibin,midbin,lobin); */
+	warpfunc[midbin] = warpfac2;
+	diff = warpfac2 - 1.0 ;
+	bin_extent = hibin - midbin ;
+	for( i = midbin, j = 0; i < hibin; i++, j++ ){
+		deviation = diff * ((float)(bin_extent - j) / (float) bin_extent );
+		warpfunc[ i ] += deviation ;
+	}
+	bin_extent = midbin - lobin ;
+	for( i = midbin, j = 0; i > lobin; i--, j++ ){
+		deviation = diff * ((float)(bin_extent - j) / (float) bin_extent );
+		warpfunc[ i ] += deviation ;
+	}
+    // buffer stuffer
+	b_samples = x->b_samples;
+    for(i = 0; i < N2; i++){
+        b_samples[i] = warpfunc[i];
+    }
+	x->please_update = 0;
+    pvwarpb_redraw(x);
+}
+
+void pvwarpb_redraw(t_pvwarpb *x)
+{
+    t_garray *a;
+    if (!(a = (t_garray *)pd_findbyclass(x->buffername, garray_class))) {
+        if (*x->buffername->s_name) pd_error(x, "function~: %s: no such array", x->buffername->s_name);
+    }
+    else  {
+        garray_redraw(a);
+    }
+}
+
+void pvwarpb_verbose(t_pvwarpb *x, t_floatarg state)
+{
+	x->verbose = state;	
+}
+
+void pvwarpb_autofunc(t_pvwarpb *x, t_floatarg minval, t_floatarg maxval)
+{
+	int minpoints, maxpoints, segpoints, i;
+	int pointcount = 0;
+	t_float target, lastval;
+	t_float m1, m2;
+	int N2 = x->fft->N2;
+    long b_frames;
+    t_float *warpfunc = x->warpfunc;
+    float *b_samples;
+    
+    pvwarpb_attachbuf(x);
+
+    b_frames = x->b_frames;
+    if(b_frames < N2){
+        post("%s: table too small or not mono",OBJECT_NAME);
+        return;
+    }
+
+	minpoints = 0.05 * (float) N2;
+	maxpoints = 0.25 * (float) N2;
+	if( minval > 1000.0 || minval < .001 ){
+		minval = 0.5;
+	}
+	if( maxval < 0.01 || maxval > 1000.0 ){
+		minval = 2.0;
+	}
+	
+	lastval = fftease_randf(minval, maxval);
+	// post("automate: min %d max %d",minpoints, maxpoints);
+	while( pointcount < N2 ){
+		target = fftease_randf(minval, maxval);
+		segpoints = minpoints + (rand() % (maxpoints-minpoints));
+		if( pointcount + segpoints > N2 ){
+			segpoints = N2 - pointcount;
+		}
+		for( i = 0; i < segpoints; i++ ){
+			m2 = (float)i / (float) segpoints ;
+			m1 = 1.0 - m2;
+			warpfunc[ pointcount + i ] = m1 * lastval + m2 * target;
+		}
+		lastval = target;
+		pointcount += segpoints;
+	}
+    // buffer stuffer
+	b_samples = x->b_samples;
+    for(i = 0; i < N2; i++){
+        b_samples[i] = warpfunc[i];
+    }
+    pvwarpb_redraw(x);
+}
+
+void pvwarpb_mute(t_pvwarpb *x, t_floatarg state)
+{
+	x->mute = state;	
+}
+
+void pvwarpb_free( t_pvwarpb *x ){
+    if(x->fft->initialized){
+        free(x->warpfunc);
+    }
+    fftease_free(x->fft);
+    free(x->fft);
+}
+
+void *pvwarpb_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_fftease *fft;
+	t_pvwarpb *x = (t_pvwarpb *)pd_new(pvwarpb_class);
+    int i;
+    for(i=0;i<3;i++){
+        inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    }
+	outlet_new(&x->x_obj, gensym("signal"));
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft->initialized = 0; // for FFTease package
+	x->initialized = 0; // for object
+	x->lofreq = 0.0;
+	x->hifreq = 10000.0;
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+    x->warpfunc = (t_float *) calloc(8192, sizeof(t_float));
+    if(argc > 0){ x->buffername = atom_getsymbolarg(0, argc, argv); }
+    else { post("%s: Must specify array name", OBJECT_NAME); return NULL; }
+    if(argc > 1){ fft->N = (int) atom_getfloatarg(1, argc, argv); }
+    if(argc > 2){ fft->overlap = (int) atom_getfloatarg(2, argc, argv); }
+	return x;
+}
+
+void pvwarpb_init(t_pvwarpb *x)
+{
+	t_fftease  *fft = x->fft;
+
+	fftease_init(fft);
+	
+	if(!x->initialized){
+		srand(clock());
+		x->please_update = 0;
+		x->verbose = 0;
+		x->mute = 0;
+		x->topfreq = 3000. ;
+		x->always_update = 0;
+		x->automate = 0;
+		x->warpfac1 = 1.0;
+		x->warpfac2 = 1.0;
+		x->funcoff = 0;
+		x->cf1 = 500.;
+		x->cf2 = 3000.;
+		x->bw1 = 0.2;
+		x->bw2 = 0.2;
+		x->initialized = 1;
+	}
+    if(fft->N2 > 8192){
+        x->warpfunc = (t_float *) realloc(x->warpfunc, fft->N2);
+    }
+	fftease_oscbank_setbins(fft,x->lofreq, x->hifreq);
+}
+
+void pvwarpb_bottomfreq(t_pvwarpb *x, t_floatarg f)
+{
+	if( f < 0 || f > x->fft->R / 2.0 ){
+		error("%s: frequency %f out of range", OBJECT_NAME, f);
+		return;
+	}
+	x->lofreq = f;
+	fftease_oscbank_setbins(x->fft, x->lofreq, x->hifreq);	
+}
+
+void pvwarpb_topfreq(t_pvwarpb *x, t_floatarg f)
+{
+	if( f < x->lofreq || f > x->fft->R / 2.0 ){
+		error("%s: frequency %f out of range", OBJECT_NAME, f);
+		return;
+	}
+	x->hifreq = f;
+	fftease_oscbank_setbins(x->fft, x->lofreq, x->hifreq);	
+}
+
+void do_pvwarpb(t_pvwarpb *x)
+{
+	t_fftease *fft = x->fft;
+	int lo_bin = fft->lo_bin;
+	int hi_bin = fft->hi_bin;
+	int chan, freq;
+	int funcoff = x->funcoff;
+	int N2 = fft->N2;
+	t_float *channel = fft->channel;
+    long b_frames;
+    float *b_samples;
+
+	fftease_fold(fft);
+	fftease_rdft(fft,FFT_FORWARD);
+	fftease_convert(fft);
+
+    b_samples = x->b_samples;
+    if(! b_samples){
+        goto panic2;
+    }
+
+    b_frames = x->b_frames;
+    if(b_frames < N2){
+        post("%s: table too small",OBJECT_NAME);
+        goto panic1;
+    }
+
+	for ( chan = lo_bin; chan < hi_bin; chan++ ) {
+		freq = (chan << 1) + 1;
+		channel[freq] *= b_samples[(chan + funcoff) % N2];
+	}
+panic1: ;
+panic2: ;
+	fftease_oscbank(fft);
+}
+
+t_int *pvwarpb_perform(t_int *w)
+{
+	int 	i,j;
+	
+	t_float f;
+	t_pvwarpb *x = (t_pvwarpb *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *in7 = (t_float *)(w[3]);
+	t_float *in8 = (t_float *)(w[4]);
+	t_float *in9 = (t_float *)(w[5]);
+	t_float *MSPOutputVector = (t_float *)(w[6]);
+	t_fftease *fft = x->fft;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	int N2 = fft->N2;
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	t_float mult = fft->mult;
+	int MSPVectorSize = fft->MSPVectorSize;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;		
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+
+    pvwarpb_attachbuf(x);
+	if(x->mute || !x->b_valid || x->b_frames < N2){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+7;
+	}
+
+    f  = *in7 ;
+    if( f < 0 ) {
+        f = 0.0;
+    } else if (f > 1.0 ){
+        f = 1.0;
+    }
+    x->funcoff = (int) (f * (t_float) (N2 - 1));
+    fft->P = *in8 ;
+    fft->synt = *in9;
+
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_pvwarpb(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_pvwarpb(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_pvwarpb(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+7;
+}		
+
+
+int freq_to_bin( t_float target, t_float fundamental ){
+	float lastf = 0.0;
+	float testf = 0.0;
+	int thebin = 0;
+	while( testf < target ){
+		++thebin;
+		lastf = testf;
+		testf += fundamental;
+	}
+	
+	if(fabs(target - testf) < fabs(target - lastf) ){
+		return thebin;
+	} else {
+		return (thebin - 1);
+	}
+}
+
+void pvwarpb_attachbuf(t_pvwarpb *x)
+{
+  	int frames;
+    t_symbol *buffername = x->buffername;
+	t_garray *a;
+    
+	x->b_frames = 0;
+	x->b_valid = 0;
+	if (!(a = (t_garray *)pd_findbyclass(buffername, garray_class)))
+    {
+		if (*buffername->s_name) pd_error(x, "player~: %s: no such array",
+                                          buffername->s_name);
+    }
+	else if (!garray_getfloatarray(a, &frames, &x->b_samples))
+    {
+		pd_error(x, "%s: bad template for player~", buffername->s_name);
+    }
+	else  {
+		x->b_frames = frames;
+		x->b_valid = 1;
+		garray_usedindsp(a);
+	}
+}
+
+void pvwarpb_setbuf(t_pvwarpb *x, t_symbol *wavename)
+{
+    x->buffername = wavename;
+}
+
+void pvwarpb_dsp(t_pvwarpb *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        pvwarpb_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(pvwarpb_perform, 6, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec,
+                sp[4]->s_vec);
+    }
+}
\ No newline at end of file
diff --git a/externals/fftease/pvwarp~.c b/externals/fftease/pvwarp~.c
new file mode 100644
index 0000000000000000000000000000000000000000..d0748d8d6a0943cf1535d476b76aa891212dba69
--- /dev/null
+++ b/externals/fftease/pvwarp~.c
@@ -0,0 +1,439 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *pvwarp_class;
+
+#define OBJECT_NAME "pvwarp~"
+
+typedef struct _pvwarp
+{
+    t_object x_obj;
+    t_float x_f;
+	t_fftease *fft;
+	t_float hifreq; // user specified highest synthfreq
+	t_float lofreq;//user speficied lowest synthfreq
+	t_float topfreq;
+	short *connections;
+	short mute;
+	short bypass;
+	int pitch_connected;
+	int synt_connected;
+	t_float *warpfunc ;
+	short please_update;
+	short always_update;
+	t_float cf1;
+	t_float bw1;
+	t_float warpfac1;
+	t_float cf2;
+	t_float bw2;
+	t_float warpfac2;
+	int funcoff;
+	short verbose;
+	short automate;
+	long fftsize_attr;
+	long overlap_attr;
+} t_pvwarp;
+
+void pvwarp_dsp(t_pvwarp *x, t_signal **sp);
+t_int *pvwarp_perform(t_int *w);
+void *pvwarp_new(t_symbol *s, int argc, t_atom *argv);
+void pvwarp_mute(t_pvwarp *x, t_floatarg state);
+void pvwarp_automate(t_pvwarp *x, t_floatarg state);
+void pvwarp_autofunc(t_pvwarp *x, t_floatarg minval, t_floatarg maxval);
+void pvwarp_free( t_pvwarp *x );
+float closestf(float test, float *arr) ;
+int freq_to_bin( float target, float fundamental );
+void update_warp_function( t_pvwarp *x ) ;
+void pvwarp_init(t_pvwarp *x);
+void pvwarp_bottomfreq(t_pvwarp *x, t_floatarg f);
+void pvwarp_topfreq(t_pvwarp *x, t_floatarg f);
+void pvwarp_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("pvwarp~"), (t_newmethod)pvwarp_new,
+                  (t_method)pvwarp_free,sizeof(t_pvwarp), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_pvwarp, x_f);
+	class_addmethod(c,(t_method)pvwarp_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)pvwarp_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(c,(t_method)pvwarp_bottomfreq,gensym("bottomfreq"),A_FLOAT,0);
+	class_addmethod(c,(t_method)pvwarp_topfreq,gensym("topfreq"),A_FLOAT,0);
+	class_addmethod(c,(t_method)pvwarp_autofunc,gensym("autofunc"),A_DEFFLOAT, A_DEFFLOAT,0);
+    pvwarp_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void pvwarp_automate(t_pvwarp *x, t_floatarg state)
+{
+	x->automate = (short)state;
+}
+
+void update_warp_function( t_pvwarp *x )
+{
+	int i,j;
+	int N2 = x->fft->N2;
+	t_float *warpfunc = x->warpfunc;
+	t_float warpfac1 = x->warpfac1;
+	t_float warpfac2 = x->warpfac2;
+	t_float cf1 = x->cf1;
+	t_float cf2 = x->cf2;
+	t_float bw1 = x->bw1;
+	t_float bw2 = x->bw2;
+	t_float c_fundamental = x->fft->c_fundamental;
+	t_float deviation;
+	t_float diff;
+	int midbin, lobin, hibin ;
+	t_float hif, lof;
+	int bin_extent;
+	short verbose = x->verbose;
+	
+	for( i = 0; i < N2; i++ ){
+		warpfunc[i] = 1.0;
+	}
+	hif = cf1 * (1. + bw1);
+	lof = cf1 * (1. - bw1);
+	midbin = freq_to_bin( cf1, c_fundamental );
+	hibin = freq_to_bin( hif, c_fundamental );
+	lobin = freq_to_bin( lof, c_fundamental );
+	if( hibin >= N2 - 1 ){
+		hibin = N2 - 1;
+	}
+	if( lobin < 0 ){
+		lobin = 0;
+	} 
+	if( verbose )
+		post("bump1: hi %d mid %d lo %d",hibin,midbin,lobin);
+	
+	warpfunc[midbin] = warpfac1;
+	diff = warpfac1 - 1.0 ;
+	bin_extent = hibin - midbin ;
+	for( i = midbin, j = 0; i < hibin; i++, j++ ){
+		deviation = diff * ((float)(bin_extent - j) / (float) bin_extent );
+		warpfunc[ i ] += deviation ;
+	}
+	bin_extent = midbin - lobin ;
+	for( i = midbin, j = 0; i > lobin; i--, j++ ){
+		deviation = diff * ((float)(bin_extent - j) / (float) bin_extent );
+		warpfunc[ i ] += deviation ;
+	}
+	
+	// NOW DO SECOND BUMP
+	hif = cf2 * (1. + bw2);
+	lof = cf2 * (1. - bw2);
+	midbin = freq_to_bin( cf2, c_fundamental );
+	hibin = freq_to_bin( hif, c_fundamental );
+	lobin = freq_to_bin( lof, c_fundamental );
+	if( hibin >= N2 - 1 ){
+		hibin = N2 - 1;
+	}
+	if( lobin < 0 ){
+		lobin = 0;
+	} 
+	if( verbose )
+		post("bump2: hi %d mid %d lo %d",hibin,midbin,lobin);
+	warpfunc[midbin] = warpfac2;
+	diff = warpfac2 - 1.0 ;
+	bin_extent = hibin - midbin ;
+	for( i = midbin, j = 0; i < hibin; i++, j++ ){
+		deviation = diff * ((float)(bin_extent - j) / (float) bin_extent );
+		warpfunc[ i ] += deviation ;
+	}
+	bin_extent = midbin - lobin ;
+	for( i = midbin, j = 0; i > lobin; i--, j++ ){
+		deviation = diff * ((float)(bin_extent - j) / (float) bin_extent );
+		warpfunc[ i ] += deviation ;
+	}
+	
+	x->please_update = 0;	
+}
+
+void pvwarp_autofunc(t_pvwarp *x, t_floatarg minval, t_floatarg maxval)
+{
+	int minpoints, maxpoints, segpoints, i;
+	int pointcount = 0;
+	t_float target, lastval;
+	t_float m1, m2;
+	int N2 = x->fft->N2;
+	t_float *warpfunc = x->warpfunc;
+	
+	minpoints = 0.05 * (float) N2;
+	maxpoints = 0.25 * (float) N2;
+	if( minval > 1000.0 || minval < .001 ){
+		minval = 0.5;
+	}
+	if( maxval < 0.01 || maxval > 1000.0 ){
+		minval = 2.0;
+	}
+	
+	lastval = fftease_randf(minval, maxval);
+	// post("automate: min %d max %d",minpoints, maxpoints);
+	while( pointcount < N2 ){
+		target = fftease_randf(minval, maxval);
+		segpoints = minpoints + (rand() % (maxpoints-minpoints));
+		if( pointcount + segpoints > N2 ){
+			segpoints = N2 - pointcount;
+		}
+		for( i = 0; i < segpoints; i++ ){
+			m2 = (float)i / (float) segpoints ;
+			m1 = 1.0 - m2;
+			warpfunc[ pointcount + i ] = m1 * lastval + m2 * target;
+		}
+		lastval = target;
+		pointcount += segpoints;
+	}
+}
+
+void pvwarp_mute(t_pvwarp *x, t_floatarg state)
+{
+	x->mute = state;	
+}
+
+void pvwarp_free( t_pvwarp *x ){
+    if(x->fft->initialized){
+        free(x->warpfunc);
+        free(x->connections);
+    }
+	fftease_free(x->fft);
+    free(x->fft);
+}
+
+void *pvwarp_new(t_symbol *s, int argc, t_atom *argv)
+{
+    int i;
+	t_fftease *fft;
+	t_pvwarp *x = (t_pvwarp *)pd_new(pvwarp_class);
+    for(i = 0; i < 9; i++){
+        inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    }
+	outlet_new(&x->x_obj, gensym("signal"));
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft->initialized = 0;
+	x->lofreq = 0.0;
+	x->hifreq = 18000.0;
+
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+}
+
+void pvwarp_init(t_pvwarp *x)
+{
+	
+	t_fftease  *fft = x->fft;
+	
+	fftease_init(fft);
+		srand(clock());
+		x->please_update = 0;
+		x->verbose = 0;
+		x->bypass = 0;
+		x->mute = 0;
+		x->always_update = 0;
+		x->automate = 0;
+		x->warpfac1 = 1.0;
+		x->warpfac2 = 1.0;
+		x->funcoff = 0;
+		x->cf1 = 500.;
+		x->cf2 = 3000.;
+		x->bw1 = 0.2;
+		x->bw2 = 0.2;
+		x->connections = (short *) calloc(16, sizeof(short));
+	x->warpfunc = (t_float *) calloc(fft->N2, sizeof(t_float));
+	fftease_oscbank_setbins(fft,x->lofreq, x->hifreq);
+	update_warp_function(x);
+}
+
+void pvwarp_bottomfreq(t_pvwarp *x, t_floatarg f)
+{
+	
+	if( f < 0 || f > x->fft->R / 2.0 ){
+		error("%s: frequency %f out of range", OBJECT_NAME, f);
+		return;
+	}
+	x->lofreq = f;
+	fftease_oscbank_setbins(x->fft, x->lofreq, x->hifreq);	
+}
+
+void pvwarp_topfreq(t_pvwarp *x, t_floatarg f)
+{
+	if( f < x->lofreq || f > x->fft->R / 2.0 ){
+		error("%s: frequency %f out of range", OBJECT_NAME, f);
+		return;
+	}
+	x->hifreq = f;
+	fftease_oscbank_setbins(x->fft, x->lofreq, x->hifreq);		
+}
+
+void do_pvwarp(t_pvwarp *x)
+{
+	t_fftease *fft = x->fft;
+	int lo_bin = fft->lo_bin;
+	int hi_bin = fft->hi_bin;
+	int chan, freq;
+	int funcoff = x->funcoff;
+	int N2 = fft->N2;
+	t_float *channel = fft->channel;
+	t_float *warpfunc = x->warpfunc;
+	
+	fftease_fold(fft);
+	fftease_rdft(fft,FFT_FORWARD);
+	fftease_convert(fft);
+
+	for ( chan = lo_bin; chan < hi_bin; chan++ ) {
+		freq = (chan << 1) + 1;
+		channel[freq] *= warpfunc[(chan + funcoff) % N2];
+	}
+	fftease_oscbank(fft);
+}
+
+t_int *pvwarp_perform(t_int *w)
+{
+	int 	i,j;
+	
+	t_float f;
+	t_pvwarp *x = (t_pvwarp *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *in1 = (t_float *)(w[3]);
+	t_float *in2 = (t_float *)(w[4]);
+	t_float *in3 = (t_float *)(w[5]);
+	t_float *in4 = (t_float *)(w[6]);
+	t_float *in5 = (t_float *)(w[7]);
+	t_float *in6 = (t_float *)(w[8]);
+	t_float *in7 = (t_float *)(w[9]);
+	t_float *in8 = (t_float *)(w[10]);
+	t_float *in9 = (t_float *)(w[11]);
+	t_float *MSPOutputVector = (t_float *)(w[12]);
+	
+	t_fftease *fft = x->fft;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	int N2 = fft->N2;
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	t_float mult = fft->mult;
+	int MSPVectorSize = fft->MSPVectorSize;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;		
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+
+	if(x->mute){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+13;
+	}
+
+	if(!x->automate) {
+        x->cf1  = *in1;
+        x->bw1 = *in2 ;
+        x->warpfac1 = *in3;
+        x->cf2  = *in4;
+        x->bw2 = *in5;
+        x->warpfac2 = *in6;
+	}
+	
+
+    f  = *in7 ;
+    if( f < 0 ) {
+        f = 0.0;
+    } else if (f > 1.0 ){
+        f = 1.0;
+    }
+    x->funcoff = (int) (f * (float) (N2 - 1));
+    fft->P = *in8 ;
+    fft->synt = *in9 ;
+
+	if( (x->please_update || x->always_update)  && ! x->automate){
+		update_warp_function(x);
+	}
+
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_pvwarp(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_pvwarp(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_pvwarp(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+13;
+}		
+
+
+int freq_to_bin( float target, float fundamental ){
+	float lastf = 0.0;
+	float testf = 0.0;
+	int thebin = 0;
+	while( testf < target ){
+		++thebin;
+		lastf = testf;
+		testf += fundamental;
+	}
+	
+	if(fabs(target - testf) < fabs(target - lastf) ){
+		return thebin;
+	} else {
+		return (thebin - 1);
+	}
+}
+
+void pvwarp_dsp(t_pvwarp *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        pvwarp_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(pvwarp_perform, 12, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec,
+                sp[4]->s_vec, sp[5]->s_vec, sp[6]->s_vec, sp[7]->s_vec,
+                sp[8]->s_vec, sp[9]->s_vec, sp[10]->s_vec);
+    }
+}
diff --git a/externals/fftease/qsortE.c b/externals/fftease/qsortE.c
new file mode 100644
index 0000000000000000000000000000000000000000..1eba468fd3b30079608e4f1acbb255259d9393df
--- /dev/null
+++ b/externals/fftease/qsortE.c
@@ -0,0 +1,241 @@
+/* Plug-compatible replacement for UNIX qsort.
+   Copyright (C) 1989 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt (schmidt@ics.uci.edu)
+
+This file is part of GNU CC.
+
+GNU QSORT is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU QSORT is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU QSORT; see the file COPYING.  If not, write to
+the Free the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Synched up with: FSF 19.28. */
+
+#ifdef sparc
+#include <alloca.h>
+#endif
+
+#include <stdlib.h>
+
+/* Invoke the comparison function, returns either 0, < 0, or > 0. */
+#define CMP(A,B) ((*cmp)((A),(B)))
+
+/* Byte-wise swap two items of size SIZE. */
+#define SWAP(A,B,SIZE) do {int sz = (SIZE); char *a = (A); char *b = (B); \
+    do { char _temp = *a;*a++ = *b;*b++ = _temp;} while (--sz);} while (0)
+
+/* Copy SIZE bytes from item B to item A. */
+#define COPY(A,B,SIZE) {int sz = (SIZE); do { *(A)++ = *(B)++; } while (--sz); }
+
+/* This should be replaced by a standard ANSI macro. */
+#define BYTES_PER_WORD 8
+
+/* The next 4 #defines implement a very fast in-line stack abstraction. */
+#define STACK_SIZE (BYTES_PER_WORD * sizeof (long))
+#define PUSH(LOW,HIGH) do {top->lo = LOW;top++->hi = HIGH;} while (0)
+#define POP(LOW,HIGH)  do {LOW = (--top)->lo;HIGH = top->hi;} while (0)
+#define STACK_NOT_EMPTY (stack < top)
+
+/* Discontinue quicksort algorithm when partition gets below this size.
+   This particular magic number was chosen to work best on a Sun 4/260. */
+#define MAX_THRESH 4
+
+
+/* requisite prototype */
+
+int qsortE (char *base_ptr, int total_elems, int size, int (*cmp)());
+
+
+
+/* Stack node declarations used to store unfulfilled partition obligations. */
+typedef struct
+{
+  char *lo;
+  char *hi;
+
+} stack_node;
+
+/* Order size using quicksort.  This implementation incorporates
+   four optimizations discussed in Sedgewick:
+
+   1. Non-recursive, using an explicit stack of pointer that store the
+      next array partition to sort.  To save time, this maximum amount
+      of space required to store an array of MAX_INT is allocated on the
+      stack.  Assuming a 32-bit integer, this needs only 32 *
+      sizeof (stack_node) == 136 bits.  Pretty cheap, actually.
+
+   2. Choose the pivot element using a median-of-three decision tree.
+      This reduces the probability of selecting a bad pivot value and
+      eliminates certain extraneous comparisons.
+
+   3. Only quicksorts TOTAL_ELEMS / MAX_THRESH partitions, leaving
+      insertion sort to order the MAX_THRESH items within each partition.
+      This is a big win, since insertion sort is faster for small, mostly
+      sorted array segments.
+
+   4. The larger of the two sub-partitions is always pushed onto the
+      stack first, with the algorithm then concentrating on the
+      smaller partition.  This *guarantees* no more than log (n)
+      stack size is needed (actually O(1) in this case)! */
+
+int qsortE (char *base_ptr, int total_elems, int size, int (*cmp)())
+{
+  /* Allocating SIZE bytes for a pivot buffer facilitates a better
+     algorithm below since we can do comparisons directly on the pivot. */
+  char *pivot_buffer = (char *)  malloc(size);
+  int   max_thresh   = MAX_THRESH * size;
+
+  if (total_elems > MAX_THRESH)
+    {
+      char       *lo = base_ptr;
+      char       *hi = lo + size * (total_elems - 1);
+      stack_node stack[STACK_SIZE]; /* Largest size needed for 32-bit int!!! */
+      stack_node *top = stack + 1;
+
+      while (STACK_NOT_EMPTY)
+        {
+          char *left_ptr;
+          char *right_ptr;
+          {
+            char *pivot = pivot_buffer;
+            {
+              /* Select median value from among LO, MID, and HI. Rearrange
+                 LO and HI so the three values are sorted. This lowers the
+                 probability of picking a pathological pivot value and
+                 skips a comparison for both the LEFT_PTR and RIGHT_PTR. */
+
+              char *mid = lo + size * ((hi - lo) / size >> 1);
+
+              if (CMP (mid, lo) < 0)
+                SWAP (mid, lo, size);
+              if (CMP (hi, mid) < 0)
+                SWAP (mid, hi, size);
+              else
+                goto jump_over;
+              if (CMP (mid, lo) < 0)
+                SWAP (mid, lo, size);
+            jump_over:
+              COPY (pivot, mid, size);
+              pivot = pivot_buffer;
+            }
+            left_ptr  = lo + size;
+            right_ptr = hi - size;
+
+            /* Here's the famous ``collapse the walls'' section of quicksort.
+               Gotta like those tight inner loops!  They are the main reason
+               that this algorithm runs much faster than others. */
+            do
+              {
+                while (CMP (left_ptr, pivot) < 0)
+                  left_ptr += size;
+
+                while (CMP (pivot, right_ptr) < 0)
+                  right_ptr -= size;
+
+                if (left_ptr < right_ptr)
+                  {
+                    SWAP (left_ptr, right_ptr, size);
+                    left_ptr += size;
+                    right_ptr -= size;
+                  }
+                else if (left_ptr == right_ptr)
+                  {
+                    left_ptr += size;
+                    right_ptr -= size;
+                    break;
+                  }
+              }
+            while (left_ptr <= right_ptr);
+
+          }
+
+          /* Set up pointers for next iteration.  First determine whether
+             left and right partitions are below the threshold size. If so,
+             ignore one or both.  Otherwise, push the larger partition's
+             bounds on the stack and continue sorting the smaller one. */
+
+          if ((right_ptr - lo) <= max_thresh)
+            {
+              if ((hi - left_ptr) <= max_thresh) /* Ignore both small partitions. */
+                POP (lo, hi);
+              else              /* Ignore small left partition. */
+                lo = left_ptr;
+            }
+          else if ((hi - left_ptr) <= max_thresh) /* Ignore small right partition. */
+            hi = right_ptr;
+          else if ((right_ptr - lo) > (hi - left_ptr)) /* Push larger left partition indices. */
+            {
+              PUSH (lo, right_ptr);
+              lo = left_ptr;
+            }
+          else                  /* Push larger right partition indices. */
+            {
+              PUSH (left_ptr, hi);
+              hi = right_ptr;
+            }
+        }
+    }
+
+  /* Once the BASE_PTR array is partially sorted by quicksort the rest
+     is completely sorted using insertion sort, since this is efficient
+     for partitions below MAX_THRESH size. BASE_PTR points to the beginning
+     of the array to sort, and END_PTR points at the very last element in
+     the array (*not* one beyond it!). */
+
+#define MINQS(X,Y) ((X) < (Y) ? (X) : (Y))
+
+  {
+    char *end_ptr = base_ptr + size * (total_elems - 1);
+    char *run_ptr;
+    char *tmp_ptr = base_ptr;
+    char *thresh  = MINQS (end_ptr, base_ptr + max_thresh);
+
+    /* Find smallest element in first threshold and place it at the
+       array's beginning.  This is the smallest array element,
+       and the operation speeds up insertion sort's inner loop. */
+
+    for (run_ptr = tmp_ptr + size; run_ptr <= thresh; run_ptr += size)
+      if (CMP (run_ptr, tmp_ptr) < 0)
+        tmp_ptr = run_ptr;
+
+    if (tmp_ptr != base_ptr)
+      SWAP (tmp_ptr, base_ptr, size);
+
+    /* Insertion sort, running from left-hand-side up to `right-hand-side.'
+       Pretty much straight out of the original GNU qsort routine. */
+
+    for (run_ptr = base_ptr + size; (tmp_ptr = run_ptr += size) <= end_ptr; )
+      {
+
+        while (CMP (run_ptr, tmp_ptr -= size) < 0)
+          ;
+
+        if ((tmp_ptr += size) != run_ptr)
+          {
+            char *trav;
+
+            for (trav = run_ptr + size; --trav >= run_ptr;)
+              {
+                char c = *trav;
+                char *hi, *lo;
+
+                for (hi = lo = trav; (lo -= size) >= tmp_ptr; hi = lo)
+                  *hi = *lo;
+                *hi = c;
+              }
+          }
+
+      }
+  }
+  return 1;
+}
diff --git a/externals/fftease/reanimator~.c b/externals/fftease/reanimator~.c
new file mode 100644
index 0000000000000000000000000000000000000000..2b2fb3d66be1a638485913a7767bc4b91fab6b4f
--- /dev/null
+++ b/externals/fftease/reanimator~.c
@@ -0,0 +1,548 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+#define THRESHOLD_MIN (.000001)
+
+static t_class *reanimator_class;
+
+#define OBJECT_NAME "reanimator~"
+
+typedef struct _reanimator
+{
+    t_object x_obj;
+    t_float x_f;
+	t_fftease *fft;
+	t_float **framebank;
+	t_float *normalized_frame;
+	t_float current_frame;
+	int framecount;
+	t_float frame_increment ;
+	t_float last_frame ;
+	t_float fpos;
+	t_float last_fpos;
+	t_float tadv;
+	int readme;
+	int total_frames;
+	short mute;
+	short initialized;
+	t_float threshold;
+	short inverse;
+	int top_comparator_bin;
+	short reanimator_mode;
+	int matchframe; // current found frame
+	t_float sample_len; /*duration of texture sample */
+	t_float sync;
+	int megs;
+} t_reanimator;
+
+void reanimator_dsp(t_reanimator *x, t_signal **sp);
+t_int *reanimator_perform(t_int *w);
+void *reanimator_new(t_symbol *msg, short argc, t_atom *argv);
+void reanimator_analyze (t_reanimator *x);
+void reanimator_mute(t_reanimator *x, t_floatarg flag);
+void reanimator_inverse(t_reanimator *x, t_floatarg toggle);
+void reanimator_topbin(t_reanimator *x, t_floatarg bin);
+void reanimator_startframe(t_reanimator *x, t_floatarg start);
+void reanimator_endframe(t_reanimator *x, t_floatarg end);
+void reanimator_framerange(t_reanimator *x, t_floatarg start, t_floatarg end);
+void reanimator_size(t_reanimator *x, t_floatarg size_ms);
+void reanimator_freeze_and_march(t_reanimator *x, t_floatarg f);
+void reanimator_resume( t_reanimator *x );
+void reanimator_threshold(t_reanimator *x, t_floatarg threshold);
+void reanimator_free( t_reanimator *x );
+void reanimator_framecount ( t_reanimator *x );
+void reanimator_init(t_reanimator *x);
+void reanimator_transpose(t_reanimator *x, t_floatarg tf);
+void reanimator_synthresh(t_reanimator *x, t_floatarg thresh);
+void reanimator_oscbank(t_reanimator *x, t_floatarg flag);
+
+void reanimator_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("reanimator~"), (t_newmethod)reanimator_new,
+                  (t_method)reanimator_free,sizeof(t_reanimator), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_reanimator, x_f);
+	class_addmethod(c,(t_method)reanimator_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)reanimator_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(c,(t_method)reanimator_oscbank,gensym("oscbank"),A_FLOAT,0);
+	class_addmethod(c,(t_method)reanimator_transpose,gensym("transpose"),A_FLOAT,0);
+	class_addmethod(c,(t_method)reanimator_synthresh,gensym("synthresh"),A_FLOAT,0);
+	class_addmethod(c,(t_method)reanimator_inverse,gensym("inverse"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)reanimator_topbin,gensym("topbin"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)reanimator_threshold,gensym("threshold"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)reanimator_analyze,gensym("analyze"), 0);
+	class_addmethod(c,(t_method)reanimator_framecount,gensym("framecount"), 0);
+	class_addmethod(c,(t_method)reanimator_freeze_and_march,gensym("freeze_and_march"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)reanimator_resume,gensym("resume"), 0);
+
+    reanimator_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void reanimator_transpose(t_reanimator *x, t_floatarg tf)
+{
+	x->fft->P = (float) tf;
+}
+
+void reanimator_synthresh(t_reanimator *x, t_floatarg thresh)
+{
+	x->fft->synt = (float) thresh;
+}
+
+void reanimator_oscbank(t_reanimator *x, t_floatarg flag)
+{
+	x->fft->obank_flag = (short) flag;
+}
+
+void reanimator_framecount ( t_reanimator *x )
+{	
+	post("%d frames stored", x->total_frames);
+}
+
+void reanimator_freeze_and_march(t_reanimator *x, t_floatarg f)
+{	
+	x->frame_increment = f;
+	x->reanimator_mode = 1;
+}
+
+void reanimator_resume( t_reanimator *x )
+{
+	x->reanimator_mode = 0;
+}
+
+void reanimator_free( t_reanimator *x ){
+	int i;
+    if(x->fft->initialized){
+        fftease_free(x->fft);
+        for(i = 0; i < x->framecount; i++){
+            free(x->framebank[i]) ;
+        }
+        free((char**)x->framebank);
+        free(x->normalized_frame);
+    }
+}
+
+void *reanimator_new(t_symbol *msg, short argc, t_atom *argv)
+{
+	t_fftease *fft;
+	t_reanimator *x = (t_reanimator *)pd_new(reanimator_class);
+
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+    
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+    fft->initialized = 0;
+	x->sample_len = 1000.0;
+    if(argc > 0){ x->sample_len = atom_getfloatarg(0, argc, argv); }
+	else { post("%s: must include duration argument",OBJECT_NAME); return NULL; }
+	x->sample_len *= .001; /* convert to seconds */
+	
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+    if(argc > 1){ fft->N = (int) atom_getfloatarg(1, argc, argv); }
+    if(argc > 2){ fft->overlap = (int) atom_getfloatarg(2, argc, argv); }
+	return x;
+}
+
+void reanimator_init(t_reanimator *x )
+{
+	t_fftease  *fft = x->fft;
+	t_float **framebank = x->framebank;
+	int framecount = x->framecount;
+	short initialized = fft->initialized;
+	
+	fftease_init(fft);
+	if(!fftease_msp_sanity_check(fft,OBJECT_NAME)){
+		return;
+	}
+	// sanity check here	
+	x->tadv = (float)fft->D/(float)fft->R;
+	x->current_frame = framecount = 0;
+	x->fpos = x->last_fpos = 0;
+	x->total_frames =  x->sample_len / x->tadv;	
+
+	if(!initialized){
+		x->sync = 0.0;
+		x->inverse = 0;
+		x->initialized = 0; // for perform
+		x->threshold = .0001;
+		x->top_comparator_bin = 10;
+		x->reanimator_mode = 0;
+		x->frame_increment = 1.0;
+		x->mute = 0;
+		x->readme = 0;
+		x->total_frames =  x->sample_len / x->tadv;
+		x->framebank = (t_float **) calloc(x->total_frames, sizeof(t_float *));
+		
+		while(framecount < x->total_frames ){
+			x->framebank[framecount] = (t_float *) calloc((fft->N+2),sizeof(t_float));
+			++framecount;
+		}
+		
+	}
+    else if(initialized == 1){
+	// danger: could be more frames this time!!!
+		while(framecount < x->total_frames ){
+			x->framebank[framecount] = (t_float *) realloc(framebank[framecount], (fft->N+2) * sizeof(t_float));
+			++framecount;
+		}
+	}
+
+	x->framecount = framecount;
+	x->megs = sizeof(t_float) * x->framecount * (fft->N+2);
+}
+
+void do_reanimator(t_reanimator *x)
+{
+	t_float ampsum, new_ampsum, rescale;
+	t_float min_difsum, difsum;
+	int	
+	i,j;
+	t_fftease *fft = x->fft;
+	
+	int framecount = x->framecount;
+	int total_frames = x->total_frames;
+	
+	float threshold = x->threshold;
+	int top_comparator_bin = x->top_comparator_bin ;
+	
+	t_float **framebank = x->framebank;
+	// for reanimator mode
+	t_float fframe = x->current_frame ;
+	t_float last_fpos = x->last_fpos ;
+	t_float fincr = x->frame_increment;
+	t_float fpos = x->fpos ;
+	t_float sync = x->sync;
+	t_float *channel = fft->channel;
+	t_float *output = fft->output;
+	int matchframe = x->matchframe;
+	int N = fft->N;
+	int D = fft->D;
+	float rescale_inv;
+	/***********************************/
+
+	if(total_frames <= 0)
+		return;
+	/* SAMPLE MODE */
+	if( x->readme ) {
+			
+		
+		if( framecount >= total_frames ){
+			sync = 1.0;
+			x->readme = 0;
+			post("reanimator~: data acquisition completed");
+			x->initialized = 1;
+			// clear input buffer
+			for( i = 0; i < fft->Nw; i++ ){
+				fft->input[i] = 0.0;
+			}
+		} else {
+			fftease_fold(fft);
+			fftease_rdft(fft,FFT_FORWARD);
+			fftease_convert(fft);
+			sync = (float) framecount / (float) total_frames;
+			
+			new_ampsum = ampsum = 0;
+			for(i = 0; i < N; i += 2 ){
+				ampsum += channel[i];
+			}
+			
+			if( ampsum > .000001 ){
+				rescale = 1.0 / ampsum ;
+				
+				// use more efficient memcpy
+				for(i = 0; i < N; i++){
+					framebank[framecount][i] = channel[i];
+				}
+				for( i = 0; i < N; i += 2 ){
+					framebank[framecount][i] *= rescale;
+				} 
+				++framecount;
+
+			} else {
+				post("amplitude for frame %d is too low\n", framecount);
+			}
+		}		
+		
+	} 	/* reanimator RESYNTHESIS */
+	else if(x->reanimator_mode) {   
+		if( fpos < 0 )
+			fpos = 0;
+		if( fpos > 1 )
+			fpos = 1;
+		if( fpos != last_fpos ){
+			fframe =  fpos * (float) framecount ;
+			last_fpos = fpos;
+		}
+		
+		
+		fframe += fincr;
+		while( fframe >= framecount ) {
+			fframe -= framecount;
+		} 
+		while( fframe < 0. ) {
+			fframe += framecount ;
+		}
+		matchframe = (int) fframe;
+		
+		// use memcopy
+		for(i = 0; i < N; i++){
+			channel[i] = framebank[matchframe][i];
+		}
+		if(fft->obank_flag){
+			fftease_oscbank(fft);
+		} else {
+			fftease_unconvert(fft);
+			fftease_rdft(fft,FFT_INVERSE);
+			fftease_overlapadd(fft);
+		}
+		
+		
+	}
+	/* REANIMATION HERE */
+	else {
+		fftease_fold(fft);
+		fftease_rdft(fft,FFT_FORWARD);
+		fftease_convert(fft);
+		ampsum = 0;
+		// NORMALIZE INPUT FRAME
+		for( i = 0; i < N; i += 2 ){
+			ampsum += channel[i];
+		}
+		
+		if( ampsum > threshold ){
+			rescale = 1.0 / ampsum;
+			for( i = 0; i < N; i += 2 ){
+				channel[i] *= rescale;
+			}
+		} 
+		else {
+			// AMPLITUDE OF INPUT WAS TOO LOW - OUTPUT SILENCE AND RETURN
+			for (i = 0; i < D; i++ ){
+				output[i] = 0.0;
+			}
+			matchframe = 0;		
+			x->current_frame = fframe;
+			x->frame_increment = fincr;
+			x->fpos = fpos;
+			x->sync = sync;
+			x->framecount = framecount;
+			x->matchframe = matchframe;
+			return;
+			
+		}
+		// NOW COMPARE TO STORED FRAMES
+		if( x->inverse ){ // INVERSE CASE
+			min_difsum = 0.0 ;
+			
+			for( j = 0; j < framecount; j++ ){
+				difsum = 0;
+				for( i = 0; i < top_comparator_bin * 2; i += 2 ){
+					difsum += fabs( channel[i] - framebank[j][i] ); 
+				}
+				//      fprintf(stderr,"bin 20: in %f compare %f\n", channel[40], frames[j][40]);
+				if( difsum > min_difsum ){
+					matchframe = j;
+					min_difsum = difsum;
+				}
+			}
+		} else { // NORMAL CASE
+			min_difsum = 1000000.0 ;
+			
+			for( j = 0; j < framecount; j++ ){
+				difsum = 0;
+				for( i = 0; i < top_comparator_bin * 2; i += 2 ){
+					difsum += fabs( channel[i] - framebank[j][i] ); 
+				}
+				//      fprintf(stderr,"bin 20: in %f compare %f\n", channel[40], frames[j][40]);
+				if( difsum < min_difsum ){
+					matchframe = j;
+					min_difsum = difsum;
+				}
+			}
+		}
+		// use memcopy
+		for(i = 0; i < N; i++){
+			channel[i] = framebank[matchframe][i];
+		}		
+		if(fft->obank_flag){
+			fftease_oscbank(fft);
+		} else {
+			fftease_unconvert(fft);
+			fftease_rdft(fft,FFT_INVERSE);
+			fftease_overlapadd(fft);
+		}
+		
+		// scale back to match
+		rescale_inv = 1.0 / rescale;
+		for (i = 0; i < D; i++){
+			output[i] *= rescale_inv;
+		}
+	}
+	
+	/* restore state variables */
+	x->current_frame = fframe;
+	x->frame_increment = fincr;
+	x->fpos = fpos;
+	x->sync = sync;
+	x->framecount = framecount;
+	x->matchframe = matchframe;
+}
+
+
+t_int *reanimator_perform(t_int *w)
+{
+	int		i,j;
+	
+	//////////////////////////////////////////////
+    t_reanimator *x = (t_reanimator *) (w[1]);
+	t_float *driver = (t_float *)(w[2]); // was driver
+	t_float *texture = (t_float *)(w[3]);
+	t_float *MSPOutputVector = (t_float *)(w[4]); // was soundout
+	t_float *matchout = (t_float *)(w[5]);
+	t_float *sync_vec = (t_float *)(w[6]);
+	
+	t_fftease *fft = x->fft;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	t_float mult = fft->mult;
+	int MSPVectorSize = fft->MSPVectorSize;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;		
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+
+	/***********************************/
+	if(x->mute || ! x->initialized){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+7;
+	}	
+
+	if( fft->obank_flag )
+		mult *= FFTEASE_OSCBANK_SCALAR;
+		
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+		if(x->readme){
+            memcpy(input + (Nw - D), texture, D * sizeof(t_float));
+		} else {
+            memcpy(input + (Nw - D), driver, D * sizeof(t_float));
+		}
+		do_reanimator(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}	
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+			if(x->readme){
+				memcpy(input + (Nw - D), texture + (D * i), D * sizeof(float));
+			} else {
+				memcpy(input + (Nw - D), driver + (D * i), D * sizeof(float));
+			}
+			do_reanimator(x);
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+		if(x->readme){
+			memcpy(internalInputVector + (operationCount * MSPVectorSize), texture, MSPVectorSize * sizeof(float));
+
+		} else {
+
+			memcpy(internalInputVector + (operationCount * MSPVectorSize), driver, MSPVectorSize * sizeof(float));
+		}
+		memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize), MSPVectorSize * sizeof(float));
+
+		operationCount = (operationCount + 1) % operationRepeat;
+
+		if( operationCount == 0 ) {
+            memcpy(input, input + D,  (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector,  D * sizeof(t_float));
+			do_reanimator( x );
+
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}	
+	// now load other output buffers
+	for(i = 0; i < MSPVectorSize; i++){
+		matchout[i] = x->matchframe;
+		sync_vec[i] = x->sync;
+	}
+    return w+7;
+}
+
+void reanimator_analyze ( t_reanimator *x )
+{
+	x->readme = 1;
+	x->initialized = 1;
+	x->framecount = 0;
+	post("reanimator: beginning spectral data acquisition");
+	return;
+	
+}
+
+void reanimator_mute(t_reanimator *x, t_floatarg flag)
+{
+	x->mute = (short)flag;	
+}
+void reanimator_topbin(t_reanimator *x, t_floatarg bin)
+{
+	if( bin > 1 && bin < x->fft->N2 )
+		x->top_comparator_bin = bin;
+}
+
+
+void reanimator_inverse(t_reanimator *x, t_floatarg toggle)
+{
+	x->inverse = (short)toggle;	
+}
+
+void reanimator_threshold(t_reanimator *x, t_floatarg threshold)
+{
+	if( threshold > THRESHOLD_MIN )
+		x->threshold = threshold;
+	else
+		x->threshold = THRESHOLD_MIN;	
+}
+
+void reanimator_dsp(t_reanimator *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        reanimator_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(reanimator_perform, 6, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec,sp[4]->s_vec);
+    }
+}
diff --git a/externals/fftease/resent~.c b/externals/fftease/resent~.c
new file mode 100644
index 0000000000000000000000000000000000000000..e84428e7e2d60921a7632da764e4411001881309
--- /dev/null
+++ b/externals/fftease/resent~.c
@@ -0,0 +1,669 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *resent_class;
+
+#define OBJECT_NAME "resent~"
+
+
+typedef struct _resent
+{
+    t_object x_obj;
+    t_float x_f;
+	t_fftease *fft;
+	t_float *frame_incr;
+	t_float *store_incr;
+	t_float *frame_phase;
+	t_float frameloc;
+	t_float **loveboat;
+	t_float current_frame;
+	long framecount;
+    long last_framecount;
+	t_float frame_increment ;
+	t_float fpos;
+	t_float last_fpos;
+	t_float tadv;
+	int read_me;
+	long frames_read;
+	short mute;
+	void *m_clock;
+	void *m_bang;
+	short playthrough;
+	short lock;
+	t_float duration;
+	t_float sync;
+    long interpolation_attr;
+} t_resent;
+
+void resent_dsp(t_resent *x, t_signal **sp);
+t_int *resent_perform(t_int *w);
+void *resent_new(t_symbol *msg, short argc, t_atom *argv);
+void resent_assist(t_resent *x, void *b, long m, long a, char *s);
+void resent_acquire_sample (t_resent *x) ;
+void resent_mute(t_resent *x, t_floatarg tog);
+void resent_bin(t_resent *x, t_floatarg fbin, t_floatarg speed);
+void resent_setphase(t_resent *x, t_floatarg phase);
+void resent_addphase(t_resent *x, t_floatarg phase);
+void resent_setspeed( t_resent *x,  t_floatarg speed );
+void resent_addspeed( t_resent *x,  t_floatarg speed );
+void resent_size( t_resent *x,  t_floatarg size_ms );
+void resent_free( t_resent *x );
+void resent_store_incr( t_resent *x );
+void resent_setspeed_and_phase( t_resent *x,  t_floatarg speed, t_floatarg phase );
+void resent_tick(t_resent *x);
+void resent_fftinfo(t_resent *x);
+void resent_init(t_resent *x);
+void resent_linephase(t_resent *x, t_symbol *msg, short argc, t_atom *argv);
+void resent_linespeed(t_resent *x, t_symbol *msg, short argc, t_atom *argv);
+void resent_randphase(t_resent *x, t_symbol *msg, short argc, t_atom *argv);
+void resent_randspeed(t_resent *x, t_symbol *msg, short argc, t_atom *argv);
+void resent_playthrough(t_resent *x, t_floatarg state);
+void resent_interpolation(t_resent *x,  t_floatarg tog);
+t_float fftease_randf(t_float min, t_float max);
+void resent_transpose(t_resent *x, t_floatarg tf);
+void resent_synthresh(t_resent *x, t_floatarg thresh);
+void resent_oscbank(t_resent *x, t_floatarg flag);
+
+void resent_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("resent~"), (t_newmethod)resent_new,
+                  (t_method)resent_free,sizeof(t_resent), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_resent, x_f);
+	class_addmethod(c,(t_method)resent_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)resent_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(c,(t_method)resent_oscbank,gensym("oscbank"),A_FLOAT,0);
+	class_addmethod(c,(t_method)resent_transpose,gensym("transpose"),A_FLOAT,0);
+	class_addmethod(c,(t_method)resent_synthresh,gensym("synthresh"),A_FLOAT,0);
+	class_addmethod(c,(t_method)resent_acquire_sample,gensym("acquire_sample"), 0);
+	class_addmethod(c,(t_method)resent_linespeed, gensym("linespeed"), A_GIMME, 0);
+	class_addmethod(c,(t_method)resent_linephase, gensym("linephase"), A_GIMME, 0);
+	class_addmethod(c,(t_method)resent_randspeed, gensym("randspeed"), A_GIMME, 0);
+	class_addmethod(c,(t_method)resent_randphase, gensym("randphase"), A_GIMME, 0);
+	class_addmethod(c,(t_method)resent_bin, gensym("bin"), A_FLOAT, A_FLOAT, 0);
+	class_addmethod(c,(t_method)resent_setphase, gensym("setphase"),  A_FLOAT, 0);
+	class_addmethod(c,(t_method)resent_addphase, gensym("addphase"),  A_FLOAT, 0);
+	class_addmethod(c,(t_method)resent_setspeed, gensym("setspeed"),  A_FLOAT, 0);
+	class_addmethod(c,(t_method)resent_addspeed, gensym("addspeed"),  A_FLOAT, 0);
+	class_addmethod(c,(t_method)resent_playthrough, gensym("playthrough"),  A_DEFFLOAT, 0);
+	class_addmethod(c,(t_method)resent_store_incr, gensym("store_incr"),0);
+	class_addmethod(c,(t_method)resent_setspeed_and_phase, gensym("setspeed_and_phase"),  A_FLOAT, A_FLOAT, 0);
+    class_addmethod(c,(t_method)resent_interpolation, gensym("interpolation"), A_FLOAT, 0);
+    resent_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void resent_transpose(t_resent *x, t_floatarg tf)
+{
+	x->fft->P = tf;
+}
+
+void resent_synthresh(t_resent *x, t_floatarg thresh)
+{
+	x->fft->synt = thresh;
+}
+
+void resent_oscbank(t_resent *x, t_floatarg flag)
+{
+	x->fft->obank_flag = (short) flag;
+}
+
+void resent_store_incr(t_resent *x)
+{
+	t_fftease *fft = x->fft;
+
+	int i;
+	t_float *store_incr = x->store_incr;
+	t_float *frame_incr = x->frame_incr;
+	
+	for(i = 0; i < fft->N2; i++){
+		store_incr[i] = frame_incr[i];
+	}
+}
+
+void resent_free(t_resent *x){
+	int i ;
+
+    if(x->fft->initialized){
+        for(i = 0; i < x->framecount; i++){
+            free(x->loveboat[i]) ;
+        }
+        free(x->loveboat);
+        free(x->frame_phase);
+        free(x->frame_incr);
+        free(x->store_incr);
+    }
+	fftease_free(x->fft);
+    free(x->fft);
+}
+
+void resent_bin(t_resent *x, t_floatarg fbin, t_floatarg speed)
+{
+	t_fftease *fft = x->fft;
+
+	int bin_num = (int) fbin;
+	
+	if(bin_num >= 0 && bin_num < fft->N2){
+		x->frame_incr[bin_num] = speed ;
+	} else {
+		post("resent~: bin %d is out of range", bin_num);
+	}
+}
+
+void resent_setphase( t_resent *x,  t_floatarg phase)
+{
+	t_fftease *fft = x->fft;
+
+	t_float scaled_phase;
+	int i;
+	
+	if( phase < 0. )
+		phase = 0. ;
+	if( phase > 1. )
+		phase = 1.;
+	scaled_phase = phase * (float) x->framecount ;
+	for( i = 0; i < fft->N2; i++ ){
+		x->frame_phase[i] = scaled_phase ;
+	}
+	
+}
+
+void resent_addphase( t_resent *x,  t_floatarg phase )
+{
+	t_fftease *fft = x->fft;
+
+	t_float scaled_phase ;
+	t_float *frame_phase = x->frame_phase;
+	int framecount =  x->framecount;
+	int i;
+	
+	
+	if( phase < 0. )
+		phase = 0. ;
+	if( phase > 1. )
+		phase = 1.;
+	scaled_phase = phase * (float) framecount ;
+	for( i = 0; i < fft->N2; i++ ){
+		frame_phase[i] += scaled_phase ;
+		while( frame_phase[i] < 0 )
+			frame_phase[i] += framecount;
+		while( frame_phase[i] > framecount - 1 )
+			frame_phase[i] -= framecount ;
+	}
+	
+	
+}
+
+void resent_setspeed( t_resent *x,  t_floatarg speed )
+{
+	t_fftease *fft = x->fft;
+	if(! x->fft->init_status)
+		return;
+		
+	int i;
+	
+	for( i = 0; i < fft->N2; i++ ){
+		
+		x->frame_incr[i] = speed ;
+	}
+	// post("speed reset to %f",speed);
+}
+
+void resent_addspeed( t_resent *x,  t_floatarg speed )
+{
+	t_fftease *fft = x->fft;
+
+	int i;
+	t_float *store_incr = x->store_incr;
+	t_float *frame_incr = x->frame_incr;
+	
+	for( i = 0; i < fft->N2; i++ ){	
+		frame_incr[i] = store_incr[i] + speed ;
+	}
+}
+
+void resent_interpolation( t_resent *x,  t_floatarg tog )
+{
+    x->interpolation_attr = (int) tog;
+}
+
+void resent_setspeed_and_phase( t_resent *x,  t_floatarg speed, t_floatarg phase )
+{
+	t_fftease *fft = x->fft;
+
+	t_float scaled_phase;
+	int i;
+	if( phase < 0. )
+		phase = 0. ;
+	if( phase > 1. )
+		phase = 1.;
+	
+	scaled_phase = phase * (t_float) x->framecount ;
+	for( i = 0; i < fft->N2; i++ ){
+		x->frame_phase[i] = scaled_phase ;
+		x->frame_incr[i] = speed ;
+	}
+	//  post("ssap: speed reset to %f, phase reset to %f",speed,phase);
+	
+}
+
+void resent_assist (t_resent *x, void *b, long msg, long arg, char *dst)
+{
+	if (msg==1) {
+		switch (arg) {
+			case 0:
+				sprintf(dst,"(signal/bang) Input, Sample Trigger");
+				break;
+		}
+	} else if (msg==2) {
+		switch( arg){
+			case 0: 
+				sprintf(dst,"(signal) Output ");
+				break;
+			case 1:
+				sprintf(dst,"(signal) Recording Sync");
+				break;
+		}
+		
+	}
+}
+
+void resent_tick(t_resent *x) {
+	outlet_bang(x->m_bang);
+}
+
+void resent_init(t_resent *x)
+{
+	int i;
+	short initialized = x->fft->initialized;
+	t_fftease  *fft = x->fft;
+	fftease_init(fft);
+	if(!fftease_msp_sanity_check(fft,OBJECT_NAME)){
+		return;
+	}
+		
+	x->current_frame = x->framecount = 0;
+	x->fpos = x->last_fpos = 0;
+	x->tadv = (float)fft->D/(float)fft->R;
+	if(x->duration < 0.1){
+		x->duration = 0.1;
+	}
+	x->framecount =  x->duration/x->tadv ;
+	x->read_me = 0;
+	
+	if(! initialized ){
+		x->frame_increment = 1.0 ;  
+		x->mute = 0;
+		x->playthrough = 0;
+		x->sync = 0;
+		x->frames_read = 0;
+		x->frame_incr = (t_float *) calloc(fft->N2, sizeof(t_float));
+		x->store_incr = (t_float *) calloc(fft->N2, sizeof(t_float));
+		x->frame_phase = (t_float *) calloc(fft->N2, sizeof(t_float));
+		x->loveboat = (t_float **) calloc(x->framecount, sizeof(t_float *));
+		for(i=0; i < x->framecount; i++){
+			x->loveboat[i] = (t_float *) calloc((fft->N+2), sizeof(t_float));
+			if(x->loveboat[i] == NULL){
+				error("%s: Insufficient Memory!",OBJECT_NAME);
+				return;
+			}
+		}
+	} 
+	else { /* this could fail or might not actually release memory - test it!! */
+		x->frame_incr = (t_float *) realloc(x->frame_incr, fft->N2 * sizeof(t_float));
+		x->store_incr = (t_float *) realloc(x->store_incr, fft->N2 * sizeof(t_float));
+		x->frame_phase = (t_float *) realloc(x->frame_phase, fft->N2 * sizeof(t_float));
+
+		for(i = 0; i < x->last_framecount; i++){
+			free(x->loveboat[i]) ;
+		}
+        x->loveboat = (t_float **)realloc(x->loveboat, x->framecount * sizeof(t_float*));
+		for(i=0; i < x->framecount; i++){
+			x->loveboat[i] = (t_float *) calloc((fft->N+2), sizeof(t_float));
+			if(x->loveboat[i] == NULL){
+				error("%s: Insufficient Memory!",OBJECT_NAME);
+				return;
+			}
+		}
+	}
+    x->last_framecount = x->framecount;
+}
+
+void *resent_new(t_symbol *msg, short argc, t_atom *argv)
+{
+t_fftease *fft;
+	t_resent *x = (t_resent *)pd_new(resent_class);
+
+    
+    outlet_new(&x->x_obj, gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+	x->fft = (t_fftease *) calloc(1, sizeof(t_fftease) );
+	fft = x->fft;
+	fft->initialized = 0;
+		
+	srand(clock()); // needed ?
+	x->interpolation_attr = 0;
+
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+    if(argc > 0){ x->duration = atom_getfloatarg(0, argc, argv) / 1000.0; }
+    else { post("%s: must give duration argument",OBJECT_NAME); return NULL; }
+    if(argc > 1){ fft->N = (int) atom_getfloatarg(1, argc, argv); }
+    if(argc > 2){ fft->overlap = (int) atom_getfloatarg(2, argc, argv); }
+	return x;
+}
+
+void do_resent(t_resent *x)
+{
+	t_fftease *fft = x->fft;
+	
+	int iphase, amp, freq, i;
+	int N = fft->N;
+	int N2 = fft->N2;
+	t_float fframe = x->current_frame ;
+	t_float last_fpos = x->last_fpos ;
+	int framecount = x->framecount;
+	t_float *frame_incr = x->frame_incr;
+	t_float *frame_phase = x->frame_phase;
+	t_float *channel = fft->channel;
+    t_float frak;
+    long iphase1, iphase2;
+    
+	if(x->read_me && x->framecount > 0){
+		
+		fftease_fold(fft);
+		fftease_rdft(fft,FFT_FORWARD);
+		fftease_convert(fft);
+		// use memcopy
+		for(i = 0; i < N; i++){
+			x->loveboat[x->frames_read][i] = channel[i];
+		}
+		x->frames_read++;		
+		if(x->frames_read >= x->framecount){
+			x->read_me = 0;
+			// post("sample acquisition completed");
+		} 	
+		x->sync = (t_float) x->frames_read / (t_float) x->framecount;
+	} 
+	else {
+        if(x->interpolation_attr == 1){
+            for( i = 0 ; i < N2; i++ ){
+                amp = i<<1;
+                freq = amp + 1;
+                iphase1 = floor( frame_phase[i] );
+                frak = frame_phase[i] - iphase1;
+                if( iphase1 < 0 )
+                    iphase1 = 0;
+                if( iphase1 > framecount - 1 )
+                    iphase1 = framecount - 1;
+                iphase2 = (iphase1 + 1) % framecount;
+                channel[amp] = x->loveboat[iphase1][amp] + (frak *
+                    (x->loveboat[iphase2][amp] - x->loveboat[iphase1][amp]));
+                channel[freq] = x->loveboat[iphase1][freq] + (frak *
+                    (x->loveboat[iphase2][freq] - x->loveboat[iphase1][freq]));
+                frame_phase[i] += frame_incr[i] ;
+                while( frame_phase[i] > framecount - 1)
+                    frame_phase[i] -= framecount;
+                while( frame_phase[i] < 0. )
+                    frame_phase[i] += framecount;
+            }
+        }
+        else {
+            for( i = 0 ; i < N2; i++ ){
+                amp = i<<1;
+                freq = amp + 1 ;
+                iphase = frame_phase[i];
+                if( iphase < 0 )
+                    iphase = 0;
+                if( iphase > framecount - 1 )
+                    iphase = framecount - 1;
+                channel[amp] = x->loveboat[iphase][amp];
+                channel[freq] = x->loveboat[iphase][freq];
+                frame_phase[i] += frame_incr[i] ;
+                while( frame_phase[i] > framecount - 1)
+                    frame_phase[i] -= framecount;
+                while( frame_phase[i] < 0. )
+                    frame_phase[i] += framecount;
+            }
+        }
+		if(fft->obank_flag){
+			fftease_oscbank(fft);
+		} else {
+			fftease_unconvert(fft);
+			fftease_rdft(fft,FFT_INVERSE);
+			fftease_overlapadd(fft);
+		}
+	}
+	
+	/* restore state variables */
+	
+	x->current_frame = fframe;
+	x->last_fpos = last_fpos;
+
+}
+
+t_int *resent_perform(t_int *w)
+{
+	int i, j;
+	//////////////////////////////////////////////
+    t_resent *x = (t_resent *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *MSPOutputVector = (t_float *)(w[3]);
+	t_float *sync_vec = (t_float *)(w[4]);
+
+	/* dereference structure */	
+	
+	t_fftease *fft = x->fft;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	t_float mult = fft->mult;
+	int MSPVectorSize = fft->MSPVectorSize;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;		
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+		
+
+	if(x->mute){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+        for(i=0; i < MSPVectorSize; i++){ sync_vec[i] = 0.0; }
+		return w+5;
+	}
+	if( fft->obank_flag )
+		mult *= FFTEASE_OSCBANK_SCALAR;
+	if(x->playthrough && x->read_me){
+		for (i = 0; i < MSPVectorSize; i++) {
+			MSPOutputVector[i] = MSPInputVector[i] * 0.5; // scale down
+		}
+        for(i=0; i < MSPVectorSize; i++){ sync_vec[i] = 0.0; }
+        return w+5;
+	}
+
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_resent(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_resent(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_resent(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+	for ( i = 0; i < MSPVectorSize; i++ ){
+		sync_vec[i] = x->sync;
+	}
+	return w+5;
+}
+
+void resent_acquire_sample(t_resent *x)
+{
+	x->read_me = 1;
+	x->frames_read = 0;
+	return;
+}
+
+void resent_mute(t_resent *x, t_floatarg tog)
+{
+	x->mute = tog;	
+}
+
+void resent_playthrough(t_resent *x, t_floatarg state)
+{
+	x->playthrough = state;
+}
+
+void resent_linephase(t_resent *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	t_fftease *fft = x->fft;
+	int bin1, bin2;
+	float phase1, phase2, bindiff;
+	int i;
+	float m1, m2;
+	
+	bin1 = (int) atom_getfloatarg(0, argc, argv);
+	phase1 = atom_getfloatarg(1, argc, argv) * x->framecount;
+	bin2 = (int) atom_getfloatarg(2, argc, argv);
+	phase2 = atom_getfloatarg(3, argc, argv) * x->framecount;
+	
+	if( bin1 > fft->N2 || bin2 > fft->N2 ){
+		error("too high bin number");
+		return;
+	}
+	bindiff = bin2 - bin1;
+	if( bindiff < 1 ){
+		error("make bin2 higher than bin 1, bye now");
+		return;
+	}
+	for( i = bin1; i < bin2; i++ ){
+		m2 = (float) i / bindiff;
+		m1 = 1. - m2;
+		x->frame_phase[i] = m1 * phase1 + m2 * phase2;
+	}
+}
+
+void resent_randphase(t_resent *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	t_fftease *fft = x->fft;
+	
+	float minphase, maxphase;
+	int i;
+	int framecount = x->framecount;
+	
+	minphase = atom_getfloatarg(0, argc, argv);
+	maxphase = atom_getfloatarg(1, argc, argv);
+	
+	//  post("minphase %f maxphase %f",minphase, maxphase);
+	if(minphase < 0.0)
+		minphase = 0.0;
+	if( maxphase > 1.0 )
+		maxphase = 1.0;
+  	
+	for( i = 0; i < fft->N2; i++ ){
+		x->frame_phase[i] = (int) (fftease_randf( minphase, maxphase ) * (float) (framecount - 1) ) ;	
+	} 
+}
+
+void resent_randspeed(t_resent *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	t_fftease *fft = x->fft;
+	
+	float minspeed, maxspeed;
+	int i;
+	
+	
+	minspeed = atom_getfloatarg(0, argc, argv);
+	maxspeed = atom_getfloatarg(1, argc, argv);
+	
+	for( i = 0; i < fft->N2; i++ ){
+		x->frame_incr[i] = fftease_randf(minspeed, maxspeed);
+	} 
+}
+
+void resent_linespeed(t_resent *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	t_fftease *fft = x->fft;
+	int bin1, bin2;
+	float speed1, speed2, bindiff;
+	int i;
+	float m1, m2;
+	
+	bin1 = (int) atom_getfloatarg(0, argc, argv);
+	speed1 = atom_getfloatarg(1, argc, argv);
+	bin2 = (int) atom_getfloatarg(2, argc, argv);
+	speed2 = atom_getfloatarg(3, argc, argv);
+	
+	if( bin1 > fft->N2 || bin2 > fft->N2 ){
+		error("too high bin number");
+		return;
+	}
+	bindiff = bin2 - bin1;
+	if( bindiff < 1 ){
+		error("make bin2 higher than bin 1, bye now");
+		return;
+	}
+	for( i = bin1; i < bin2; i++ ){
+		m2 = (float) i / bindiff;
+		m1 = 1. - m2;
+		x->frame_incr[i] = m1 * speed1 + m2 * speed2;
+	}
+}
+
+void resent_dsp(t_resent *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        resent_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(resent_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec);
+    }
+}
diff --git a/externals/fftease/residency_buffer~.c b/externals/fftease/residency_buffer~.c
new file mode 100644
index 0000000000000000000000000000000000000000..b13b9630ac1c83d39aadb12005137a1bdb77d679
--- /dev/null
+++ b/externals/fftease/residency_buffer~.c
@@ -0,0 +1,471 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *residency_buffer_class;
+
+#define OBJECT_NAME "residency_buffer~"
+
+typedef struct _residency_buffer
+{
+    t_object x_obj;
+    t_float x_f;
+	t_fftease *fft;
+    long b_frames;
+    long b_valid;
+    t_float *b_samples;
+	t_float current_frame;
+	int framecount;
+	//
+	t_float frame_increment ;
+	t_float fpos;
+	t_float last_fpos;
+	t_float tadv;
+	long read_me;
+	long frames_read;
+	long MAXFRAMES;
+	short mute;
+	long buffer_frame_count;
+	short initialized;
+	short playthrough;
+	t_float sync;
+	short buffer_is_hosed;
+    long interpolation_attr;
+    t_symbol *buffername;
+	void *size_outlet; // will send desired size in samples
+    
+} t_residency_buffer;
+
+void residency_buffer_dsp(t_residency_buffer *x, t_signal **sp);
+t_int *residency_buffer_perform(t_int *w);
+void *residency_buffer_new(t_symbol *msg, short argc, t_atom *argv);
+void residency_buffer_acquire_sample ( t_residency_buffer *x ) ;
+void residency_buffer_meminfo( t_residency_buffer *x ) ;
+void residency_buffer_mute(t_residency_buffer *x, t_floatarg toggle);
+void residency_buffer_interpolation(t_residency_buffer *x, t_floatarg toggle);
+void residency_buffer_calcbuf(t_residency_buffer *x, t_floatarg desired_duration);
+void residency_buffer_free( t_residency_buffer *x );
+void residency_buffer_playthrough(t_residency_buffer *x, t_floatarg f);
+void residency_buffer_init(t_residency_buffer *x);
+void residency_buffer_transpose(t_residency_buffer *x, t_floatarg tf);
+void residency_buffer_synthresh(t_residency_buffer *x, t_floatarg thresh);
+void residency_buffer_oscbank(t_residency_buffer *x, t_floatarg flag);
+void residency_buffer_attachbuf(t_residency_buffer *x);
+void residency_buffer_redraw(t_residency_buffer *x);
+
+void residency_buffer_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("residency_buffer~"), (t_newmethod)residency_buffer_new,
+                  (t_method)residency_buffer_free,sizeof(t_residency_buffer), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_residency_buffer, x_f);
+	class_addmethod(c,(t_method)residency_buffer_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)residency_buffer_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(c,(t_method)residency_buffer_interpolation,gensym("interpolation"),A_FLOAT,0);
+	class_addmethod(c,(t_method)residency_buffer_oscbank,gensym("oscbank"),A_FLOAT,0);
+	class_addmethod(c,(t_method)residency_buffer_transpose,gensym("transpose"),A_FLOAT,0);
+	class_addmethod(c,(t_method)residency_buffer_synthresh,gensym("synthresh"),A_FLOAT,0);
+	class_addmethod(c,(t_method)residency_buffer_calcbuf,gensym("calcbuf"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)residency_buffer_playthrough,gensym("playthrough"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)residency_buffer_acquire_sample,gensym("acquire_sample"), 0);
+    residency_buffer_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void residency_buffer_free( t_residency_buffer *x )
+{
+	fftease_free(x->fft);
+    free(x->fft);
+}
+
+void residency_buffer_calcbuf(t_residency_buffer *x, t_floatarg desired_duration)
+{
+	t_float ms_calc;
+	t_float seconds;
+	t_float frames;
+	t_float samples;
+	t_float tadv = x->tadv;
+	t_fftease *fft = x->fft;
+	
+	if(tadv == 0){
+		post("zero tadv!");
+		return;
+	}
+	if(fft->R == 0){
+		post("zero sampling rate!");
+		return;
+	}
+	seconds = desired_duration / 1000.0;
+	frames = seconds / tadv;
+	samples = frames * (t_float) (fft->N + 2);
+	ms_calc = (samples / fft->R) * 1000.0;
+	post("desired duration in ms: %f",desired_duration);
+	post("you need %.0f samples in buffer to get %.0f frames or %f secs", 
+		 samples, frames, seconds);
+	outlet_float(x->size_outlet, samples);
+	
+}
+
+void *residency_buffer_new(t_symbol *msg, short argc, t_atom *argv)
+{
+	t_residency_buffer *x = (t_residency_buffer *)pd_new(residency_buffer_class);
+	t_fftease *fft;
+
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+    x->size_outlet = outlet_new(&x->x_obj, gensym("float"));
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft->initialized = 0;
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+    if(argc > 0){ x->buffername = atom_getsymbolarg(0, argc, argv); }
+    else { post("%s: Must specify array name", OBJECT_NAME); return NULL; }
+    if(argc > 1){ fft->N = (int) atom_getfloatarg(1, argc, argv); }
+    if(argc > 2){ fft->overlap = (int) atom_getfloatarg(2, argc, argv); }
+	return x;
+}
+
+void residency_buffer_init(t_residency_buffer *x)
+{
+
+	t_fftease *fft = x->fft;
+	short initialized = x->fft->initialized;
+	if( fft->R <= 0 ){
+		post("bad SR");
+		return;
+	}
+	if( fft->MSPVectorSize <= 0 ){
+		post("bad vectorsize");
+		return;
+	}
+	fftease_init(fft);	
+	x->tadv = (t_float)fft->D / (t_float)fft->R;
+	if(!initialized){
+		x->mute = 0;
+		x->sync = 0;
+		x->initialized = 1;
+		x->current_frame = x->framecount = 0;
+		x->frame_increment = 1.0 ;
+		x->fpos = x->last_fpos = 0;
+	}
+}
+
+void do_residency_buffer(t_residency_buffer *x)
+{
+	t_fftease *fft = x->fft;
+	int N = x->fft->N;
+	int i,j,k;
+	t_float fframe = x->current_frame ;
+	t_float fincr = x->frame_increment;
+	t_float fpos = x->fpos;
+	t_float last_fpos = x->last_fpos ;
+	t_float *channel = fft->channel;
+	float *b_samples;
+	long b_frames = x->b_frames;
+    long b_valid = x->b_valid;
+	int frames_read = x->frames_read;
+	long index_offset;
+	long buffer_frame_count = x->buffer_frame_count;
+    long index1, index2;
+    t_float frak;
+    
+    residency_buffer_attachbuf(x);
+    b_samples = x->b_samples;
+    b_frames = x->b_frames;
+
+    buffer_frame_count = (int)((t_float) b_frames / (t_float)(x->fft->N + 2));
+    if(b_frames < 1 || ! b_valid){
+        post("%s: table too small or not valid",OBJECT_NAME);
+        return;
+    }
+	if( x->read_me ) {
+		fftease_fold(fft);
+		fftease_rdft(fft, FFT_FORWARD);
+		fftease_convert(fft);
+		
+		index_offset = (N+2) * frames_read;
+		
+		for(i = index_offset, j = 0; i < index_offset + N + 2; i++, j++){
+            if(i >= b_frames){
+                
+                post("hit end of buffer on frame %d", frames_read);
+                goto escape;
+            }
+			b_samples[i] = channel[j];
+		}
+		
+		++frames_read;
+		x->sync = (t_float)frames_read/(t_float)(buffer_frame_count);
+		
+		if( frames_read >= buffer_frame_count){
+			x->read_me = 0;
+            fpos = 0.0;
+            residency_buffer_redraw(x);
+		}
+        
+	} 
+	else {
+		if( fpos < 0 )
+			fpos = 0;
+		if( fpos > 1 )
+			fpos = 1;
+		if( fpos != last_fpos ){
+			fframe =  fpos * (t_float) buffer_frame_count;
+			last_fpos = fpos;
+		}
+		
+		fframe += fincr;
+        // post("fframe %f framecount %d", fframe, buffer_frame_count);
+        
+		while(fframe >= buffer_frame_count) {
+			fframe -= buffer_frame_count;
+		} 
+		while( fframe < 0. ) {
+			fframe += buffer_frame_count;
+		}
+		// goto escape;
+		
+		if(x->interpolation_attr == 1){
+            long iframe = floor(fframe);
+            index1 = (N+2) * iframe;
+            index2 = (N+2) * ((iframe + 1) % buffer_frame_count);
+            frak = fframe - iframe;
+            for( i = index1, j = index2, k = 0; i < index1 + N + 2; i++, j++, k++){
+                if(i >= b_frames || j >= b_frames){
+                    post("hit end of buffer on frame %d, index %d %d", index1,i,j);
+                    goto escape;
+                }
+                channel[k] = b_samples[i] + frak * (b_samples[j] - b_samples[i]);
+            }
+        }
+        else {
+            index_offset = (N+2) * (long) fframe;
+            for( i = index_offset, j = 0; i < index_offset + N + 2; i++, j++ ){
+                if(i >= b_frames){
+                    post("hit end of buffer on frame %d, index %d", index_offset,i);
+                    goto escape;
+                }
+                channel[j] = b_samples[i];
+            }
+        }
+		x->sync = fframe / (t_float) buffer_frame_count;
+		// REPLACE loveboat with buffer
+		if(fft->obank_flag){
+			fftease_oscbank(fft);
+		}
+        else {
+			fftease_unconvert(fft);
+			fftease_rdft(fft, FFT_INVERSE);
+			fftease_overlapadd(fft);
+		}
+        
+	}
+escape:
+    ;
+	/* restore state variables */
+	x->current_frame = fframe;
+	x->frame_increment = fincr;
+	x->fpos = fpos;
+	x->last_fpos = last_fpos;
+	x->frames_read = frames_read;
+}
+
+
+void residency_buffer_redraw(t_residency_buffer *x)
+{
+    t_garray *a;
+    if (!(a = (t_garray *)pd_findbyclass(x->buffername, garray_class))) {
+        if (*x->buffername->s_name) pd_error(x, "function~: %s: no such array", x->buffername->s_name);
+    }
+    else  {
+        garray_redraw(a);
+    }
+}
+
+void residency_buffer_attachbuf(t_residency_buffer *x)
+{
+  	int frames;
+    t_symbol *buffername = x->buffername;
+	t_garray *a;
+    
+	x->b_frames = 0;
+	x->b_valid = 0;
+	if (!(a = (t_garray *)pd_findbyclass(buffername, garray_class)))
+    {
+		if (*buffername->s_name) pd_error(x, "player~: %s: no such array",
+                                          buffername->s_name);
+    }
+	else if (!garray_getfloatarray(a, &frames, &x->b_samples))
+    {
+		pd_error(x, "%s: bad template for player~", buffername->s_name);
+    }
+	else  {
+		x->b_frames = frames;
+		x->b_valid = 1;
+		garray_usedindsp(a);
+	}
+}
+
+t_int *residency_buffer_perform(t_int *w)
+{
+	int i, j;
+	
+	//////////////////////////////////////////////
+    t_residency_buffer *x = (t_residency_buffer *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *increment = (t_float *)(w[3]);
+	t_float *position = (t_float *)(w[4]);
+	t_float *MSPOutputVector = (t_float *)(w[5]);
+	t_float *vec_sync = (t_float *)(w[6]);
+	t_fftease *fft = x->fft;
+	int MSPVectorSize = fft->MSPVectorSize;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	float mult = fft->mult;
+
+	
+	if( fft->obank_flag )
+		mult *= FFTEASE_OSCBANK_SCALAR;
+
+	residency_buffer_attachbuf(x);
+	/* quit before doing anything unless we're good to go */
+    
+	if( x->mute || ! x->b_valid) {
+		for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+        for(i=0; i < MSPVectorSize; i++){ vec_sync[i] = 0.0; }
+		return w+7;
+	}
+
+    x->frame_increment = *increment;
+    x->fpos = *position;
+
+	for ( i = 0; i < MSPVectorSize; i++ ){
+		vec_sync[i] = x->sync;
+	}
+	if(x->framecount > 0 && x->read_me ){
+		x->sync = (t_float)x->frames_read/(t_float)x->framecount;
+	}
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_residency_buffer(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_residency_buffer(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_residency_buffer(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+7;
+}	
+
+void residency_buffer_acquire_sample ( t_residency_buffer *x )
+{
+    residency_buffer_attachbuf(x);
+	x->read_me = 1;
+	x->frames_read = 0;
+    x->buffer_frame_count = (int)((t_float) (x->b_frames) / (t_float)(x->fft->N + 2));
+	post("storing %d FFT frames", x->buffer_frame_count);
+	post("%s: beginning spectral data acquisition",OBJECT_NAME);
+	return;
+	
+}
+
+void residency_buffer_mute(t_residency_buffer *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;	
+}
+
+void residency_buffer_interpolation(t_residency_buffer *x, t_floatarg toggle)
+{
+	x->interpolation_attr = (short)toggle;
+}
+
+void residency_buffer_playthrough(t_residency_buffer *x, t_floatarg toggle)
+{
+	x->playthrough = (short)toggle;	
+}
+
+
+void residency_buffer_transpose(t_residency_buffer *x, t_floatarg tf)
+{
+	x->fft->P = (float) tf;
+}
+
+void residency_buffer_synthresh(t_residency_buffer *x, t_floatarg thresh)
+{
+	x->fft->synt = (float) thresh;
+}
+
+void residency_buffer_oscbank(t_residency_buffer *x, t_floatarg flag)
+{
+	x->fft->obank_flag = (short) flag;
+}
+
+void residency_buffer_dsp(t_residency_buffer *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        residency_buffer_init(x);
+    }
+
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(residency_buffer_perform, 6, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec,
+                sp[4]->s_vec);
+    }
+}
diff --git a/externals/fftease/residency~.c b/externals/fftease/residency~.c
new file mode 100644
index 0000000000000000000000000000000000000000..8162bd0f067508f03244b69da50e1479429dc4c9
--- /dev/null
+++ b/externals/fftease/residency~.c
@@ -0,0 +1,491 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *residency_class;
+
+#define OBJECT_NAME "residency~"
+
+typedef struct _residency
+{
+    t_object x_obj;
+    t_float x_f;
+	t_fftease *fft;
+	t_float **loveboat;
+	t_float current_frame;
+	long framecount;
+    long last_framecount;
+	//
+	t_float frame_increment;
+	t_float fpos;
+	t_float last_fpos;
+	t_float tadv;
+	short acquire_stop; // flag to stop recording immediately
+	float force_pos; // force to this position on receiving message
+	int read_me;
+	int frames_read;
+	short mute;
+	short playthrough;
+	t_float duration;
+	short lock;
+	short verbose;
+	short override;
+	t_float *input_vec;
+	t_float sync;
+	short failed_init; // flag to check if init failed due to bad data from Max
+    t_float size_attr;
+    short interpolation_attr;
+} t_residency;
+
+void residency_dsp(t_residency *x, t_signal **sp);
+t_int *residency_perform(t_int *w);
+void *residency_new(t_symbol *s, int argc, t_atom *argv);
+void residency_bangname(t_residency *x) ;
+void residency_fftinfo(t_residency *x) ;
+void residency_playthrough( t_residency *x, t_floatarg tog) ;
+void residency_mute(t_residency *x, t_floatarg tog);
+void residency_interpolation(t_residency *x, t_floatarg tog);
+void residency_free(t_residency *x);
+void residency_init(t_residency *x);
+void residency_size(t_residency *x, t_floatarg newsize);
+void residency_verbose(t_residency *x, t_floatarg t);
+void residency_force_position(t_residency *x, t_floatarg position);
+void residency_acquire_sample(t_residency *x);
+void residency_meminfo( t_residency *x );
+void residency_acquire_stop(t_residency *x);
+void residency_transpose(t_residency *x, t_floatarg tf);
+void residency_synthresh(t_residency *x, t_floatarg thresh);
+void residency_oscbank(t_residency *x, t_floatarg flag);
+void do_residency(t_residency *x);
+
+void residency_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("residency~"), (t_newmethod)residency_new,
+                  (t_method)residency_free,sizeof(t_residency), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_residency, x_f);
+	class_addmethod(c,(t_method)residency_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)residency_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(c,(t_method)residency_interpolation,gensym("interpolation"),A_FLOAT,0);
+	class_addmethod(c,(t_method)residency_oscbank,gensym("oscbank"),A_FLOAT,0);
+	class_addmethod(c,(t_method)residency_transpose,gensym("transpose"),A_FLOAT,0);
+	class_addmethod(c,(t_method)residency_synthresh,gensym("synthresh"),A_FLOAT,0);
+	class_addmethod(c,(t_method)residency_acquire_sample,gensym("acquire_sample"),  0);
+	class_addmethod(c,(t_method)residency_acquire_stop,gensym("acquire_stop"),  0);
+	class_addmethod(c,(t_method)residency_playthrough,gensym("playthrough"), A_DEFFLOAT, 0);
+	class_addmethod(c,(t_method)residency_force_position,gensym("force_position"), A_FLOAT, 0);
+
+    residency_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void residency_force_position(t_residency *x, t_floatarg position)
+{
+	if( position >= 0.0 && position < 1.0 ){
+		x->force_pos = position;
+	}
+}
+
+void residency_meminfo( t_residency *x )
+{
+    t_fftease *fft = x->fft;
+    post("%d frames in buffer", x->framecount);
+    post("frame_duration: %f, actual time in buffer: %f", x->tadv, (float)(x->framecount) * x->tadv);
+	post("main storage chunk: %.2f MB", (x->framecount * (fft->N + 2) * sizeof(t_float)) / 1000000.0 );
+}
+
+void residency_transpose(t_residency *x, t_floatarg tf)
+{
+	x->fft->P = tf;
+}
+
+void residency_synthresh(t_residency *x, t_floatarg thresh)
+{
+	x->fft->synt = thresh;
+}
+
+void residency_oscbank(t_residency *x, t_floatarg flag)
+{
+	x->fft->obank_flag = (short) flag;
+}
+
+void residency_verbose(t_residency *x, t_floatarg t)
+{
+	x->verbose = t;
+}
+
+void residency_size(t_residency *x, t_floatarg newsize)
+{
+	if(newsize > 0.0){//could be horrendous size, but that's the user's problem
+		x->duration = newsize/1000.0;
+		residency_init(x);
+	}
+}
+
+void residency_playthrough (t_residency *x, t_floatarg tog)
+{
+	x->playthrough = tog;
+}
+
+void residency_acquire_stop(t_residency *x)
+{
+	x->acquire_stop = 1;
+	x->read_me = 0;
+}
+
+void residency_free(t_residency *x){
+	int i;
+    if(x->fft->initialized){
+        for(i = 0; i < x->framecount; i++){
+            free(x->loveboat[i]) ;
+        }
+        free(x->loveboat);
+    }
+	fftease_free(x->fft);
+    free(x->fft);
+}
+
+void *residency_new(t_symbol *s, int argc, t_atom *argv)
+{
+    t_fftease *fft;
+	t_residency *x = (t_residency *)pd_new(residency_class);
+
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+
+	x->fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	x->fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	x->fft->winfac = FFTEASE_DEFAULT_WINFAC;
+    x->last_framecount = x->framecount = 0;
+    
+    if(argc > 0){ x->duration = atom_getfloatarg(0, argc, argv) / 1000.0; }
+    else { post("%s: must give duration argument",OBJECT_NAME); return NULL; }
+    if(argc > 1){ fft->N = (int) atom_getfloatarg(1, argc, argv); }
+    if(argc > 2){ fft->overlap = (int) atom_getfloatarg(2, argc, argv); }
+	return x;
+}
+
+void residency_init(t_residency *x)
+{
+	int i;
+	t_fftease *fft = x->fft;
+    if(!fft->R){
+        return;
+    }
+	if(fft->initialized == -1){
+		return;
+	}
+    
+    fftease_init(x->fft);
+	
+	x->tadv = (t_float)fft->D/(t_float)fft->R;
+	if( x->duration <= 0 ){
+		x->duration = 1.0;
+	}
+    if(!x->tadv){
+        return;
+    }
+	x->framecount =  x->duration / x->tadv;
+	x->read_me = 0;
+	x->acquire_stop = 0;
+	if(x->verbose){
+		post("%s: will allocate %d frames",OBJECT_NAME, x->framecount);
+	}
+	// could probably improve memory management here
+    if(x->framecount <= 0){
+      //  post("bad framecount:%s",x->framecount);
+        return;
+    }
+	if(fft->initialized == 0){
+        // x->virgin = 1;
+        x->force_pos = -1.0;
+        x->current_frame = 0;
+        x->fpos = x->last_fpos = 0;
+        
+		x->sync = 0;
+		x->mute = 0;
+		x->playthrough = 0;
+		x->frame_increment = 0.0; // frozen by default
+		x->verbose = 0;
+        x->loveboat = (t_float **) calloc(x->framecount, sizeof(t_float *));
+		for(i=0;i < x->framecount; i++){
+			x->loveboat[i] = (t_float *) calloc((fft->N + 2), sizeof(t_float));
+			if(x->loveboat[i] == NULL){
+				error("%s: memory error",OBJECT_NAME);
+				return;
+			}
+		}
+	}
+    else if((x->framecount == x->last_framecount) && (fft->initialized != 0)){
+        return;
+    }
+    else if(fft->initialized == 1) {
+        if(x->framecount != x->last_framecount) {
+            // free individual oldies
+            for(i = 0; i < x->last_framecount; i++){
+                free(x->loveboat[i]);
+            }
+            x->loveboat = (t_float**)realloc(x->loveboat, x->framecount * sizeof(t_float *));
+            
+            for(i=0;i < x->framecount; i++){
+                x->loveboat[i] = (t_float *) calloc((fft->N + 2), sizeof(t_float));
+                if(x->loveboat[i] == NULL){
+                    error("%s: memory error",OBJECT_NAME);
+                    return;
+                }
+            }
+        }
+	}
+	
+	if(! fftease_msp_sanity_check(fft, OBJECT_NAME)){
+		// return 0;
+		post("residency~ failed sanity test in Init");
+		x->failed_init = 1;
+	} else {
+		x->failed_init = 0;
+	}
+	if (fft->D <= 0.0 || fft->R <= 0.0){
+		error("%s: bad decimation size or bad sampling rate - cannot proceed",OBJECT_NAME);
+		post("D: %d R: %d",fft->D, fft->R);
+		return;
+	}
+    x->last_framecount = x->framecount;
+}
+
+void do_residency(t_residency *x)
+{
+	int i;
+	t_float fframe = x->current_frame ;
+	t_float last_fpos = x->last_fpos ;
+	int framecount = x->framecount;
+	t_float fincr = x->frame_increment;
+	t_float fpos = x->fpos;
+	t_float force_pos = x->force_pos;
+    t_float frak;
+    long index1, index2;
+    
+	t_fftease *fft = x->fft;
+    
+	if(x->acquire_stop){
+		x->acquire_stop = 0;
+		fpos = (t_float) x->frames_read / (t_float) framecount;
+		last_fpos = fpos;
+		fframe = x->frames_read;
+		if(x->verbose){
+			post("residency: data acquisition stopped");
+		}
+	}
+	else if(x->read_me) { // state for sampling to buffer
+		if(x->frames_read >= framecount){ // termination condition
+			x->read_me = 0;
+			if(x->verbose){
+				post("residency: data acquisition completed");
+			}
+		}
+		else { // convert and store in one frame
+			fftease_fold(fft);
+			fftease_rdft(fft,1);
+			fftease_convert(fft);
+			for(i= 0; i < fft->N + 2; i++){
+				x->loveboat[x->frames_read][i] = fft->channel[i];
+			}
+			++(x->frames_read);
+            
+		}
+	}
+	else { // a sample is now in the buffer
+		if(fpos < 0)
+			fpos = 0;
+		if(fpos > 1)
+			fpos = 1;
+		
+		if(force_pos >= 0.0 && force_pos < 1.0){
+			//	post("forcing frame to %f", force_pos);
+			fframe =  force_pos * (float) framecount;
+			last_fpos = fpos = force_pos;
+			x->force_pos = -1.0;
+		}
+		else if(fpos != last_fpos){
+			fframe =  fpos * (float) framecount;
+			last_fpos = fpos;
+		}
+		fframe += fincr;
+        
+		while(fframe >= framecount) {
+			fframe -= framecount;
+		}
+		while( fframe < 0. ) {
+			fframe += framecount;
+		}
+		if(x->framecount > 0) {
+			x->sync = fframe/(float)x->framecount;
+		}
+        if(x->interpolation_attr == 1){
+            index1 = floor(fframe);
+            index2 = (index1+1) % x->framecount;
+            frak = fframe - (t_float)index1;
+            for(i= 0; i < fft->N + 2; i++){
+                fft->channel[i] =
+                x->loveboat[index1][i] + frak * (x->loveboat[index2][i] - x->loveboat[index1][i]);
+            }
+        }
+        else {
+            for(i= 0; i < fft->N + 2; i++){
+                fft->channel[i]= x->loveboat[(int)fframe][i];
+            }
+        }
+		if(fft->obank_flag){
+			fftease_oscbank(fft);
+		} else {
+			fftease_unconvert(fft);
+			fftease_rdft(fft,FFT_INVERSE);
+			fftease_overlapadd(fft);
+		}
+	}
+	/* restore state variables */
+	
+	x->current_frame = fframe;
+	x->frame_increment = fincr;
+	x->fpos = fpos;
+	x->last_fpos = last_fpos;
+}
+
+t_int *residency_perform(t_int *w)
+{
+	int i, j;
+	
+	//////////////////////////////////////////////
+    t_residency *x = (t_residency *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *increment = (t_float *)(w[3]);
+	t_float *position = (t_float *)(w[4]);
+	t_float *MSPOutputVector = (t_float *)(w[5]);
+	t_float *vec_sync = (t_float *)(w[6]);
+	t_fftease *fft = x->fft;
+	int MSPVectorSize = fft->MSPVectorSize;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	t_float mult = fft->mult;
+	
+    x->frame_increment = *increment;
+    x->fpos = *position;
+	if( fft->obank_flag )
+		mult *= FFTEASE_OSCBANK_SCALAR;
+	
+	if(x->mute){
+		for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+        for(i=0; i < MSPVectorSize; i++){ vec_sync[i] = 0.0; }
+		return w+7;
+	}
+	
+	if(x->acquire_stop){
+		// will reset flag inside do_residency
+        for(i=0; i < MSPVectorSize; i++){ output[i] = 0.0; }
+		x->read_me = 0;
+	}
+	for ( i = 0; i < MSPVectorSize; i++ ){
+		vec_sync[i] = x->sync;
+	}
+	if(x->framecount > 0 && x->read_me )
+		x->sync = (t_float)x->frames_read/(t_float)x->framecount;
+	
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_residency(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_residency(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_residency(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+return w+7;
+}
+
+void residency_acquire_sample(t_residency *x)
+{
+	x->read_me = 1;
+	x->frames_read = 0;
+	if(x->verbose)
+		post("beginning spectral data acquisition");
+	return;
+}
+
+void residency_mute(t_residency *x, t_floatarg tog)
+{
+	x->mute = (short) tog;
+}
+
+void residency_interpolation(t_residency *x, t_floatarg tog)
+{
+	x->interpolation_attr = (short) tog;
+}
+
+void residency_dsp(t_residency *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        residency_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(residency_perform, 6, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec,
+                sp[4]->s_vec);
+    }
+}
diff --git a/externals/fftease/schmear~.c b/externals/fftease/schmear~.c
new file mode 100644
index 0000000000000000000000000000000000000000..6277e967641ad46654b636577e007a14cd83e8f0
--- /dev/null
+++ b/externals/fftease/schmear~.c
@@ -0,0 +1,309 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *schmear_class;
+
+#define OBJECT_NAME "schmear~"
+#define MAXSCHMEAR (129)
+
+typedef struct _schmear
+{
+    t_object x_obj;
+    t_float x_f;
+	t_fftease *fft;
+	t_float schmearmult;
+	short mute;
+	t_float *spreader;
+	t_float *newamps;
+	int spreadlen;
+	t_float threshold;
+	short freakmode;
+	int shift;
+} t_schmear;
+
+void schmear_dsp(t_schmear *x, t_signal **sp);
+t_int *schmear_perform(t_int *w);
+void *schmear_new(t_symbol *s, int argc, t_atom *argv);
+void schmear_mute(t_schmear *x, t_floatarg toggle);
+void schmear_rel2peak(t_schmear *x, t_floatarg toggle);
+void schmear_free(t_schmear *x);
+void schmear_init(t_schmear *x);
+void schmear_threshold(t_schmear *x, t_floatarg f);
+void schmear_schmimp(t_schmear *x, t_symbol *msg, short argc, t_atom *argv);
+void schmear_shift(t_schmear *x, t_floatarg f);
+void schmear_oscbank(t_schmear *x, t_floatarg flag);
+
+void schmear_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("schmear~"), (t_newmethod)schmear_new,
+                  (t_method)schmear_free,sizeof(t_schmear), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_schmear, x_f);
+	class_addmethod(c,(t_method)schmear_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)schmear_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(c,(t_method)schmear_threshold,gensym("threshold"),A_FLOAT,0);
+	class_addmethod(c,(t_method)schmear_shift,gensym("shift"),A_FLOAT,0);
+	class_addmethod(c,(t_method)schmear_schmimp,gensym("schmimp"),A_GIMME,0);
+    
+    schmear_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void schmear_oscbank(t_schmear *x, t_floatarg flag)
+{
+	x->fft->obank_flag = (short) flag;
+}
+
+void schmear_mute(t_schmear *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;
+}
+
+void schmear_shift(t_schmear *x, t_floatarg f)
+{
+	x->shift = (int)f;
+}
+
+void schmear_schmimp(t_schmear *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	int i;
+	if(argc > MAXSCHMEAR){
+		post("%d is too long for schmear", argc);
+		return;
+	}
+	if(! (argc % 2) ){
+		post("%s: impulse length %d must be odd",OBJECT_NAME, argc);
+		return;
+	}
+	for( i = 0; i < argc; i++ ){
+		x->spreader[i] = atom_getfloatarg(i,argc,argv);
+	}
+	x->spreadlen = argc;
+}
+
+void schmear_threshold(t_schmear *x, t_floatarg t)
+{
+	x->threshold = (float)t;
+}
+
+void *schmear_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_fftease *fft;
+	t_schmear *x = (t_schmear *)pd_new(schmear_class);
+    outlet_new(&x->x_obj, gensym("signal"));
+
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft->initialized = 0;
+	x->threshold = 0.1;
+	x->schmearmult = 0.1;
+	x->mute = 0;
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+}
+
+void schmear_init(t_schmear *x)
+{
+
+	t_fftease  *fft = x->fft;
+	fftease_init(fft);
+	x->newamps = (t_float *) calloc((fft->N2+1), sizeof(t_float));
+	x->spreadlen = 7;
+	x->spreader = (t_float *) calloc(MAXSCHMEAR, sizeof(t_float));
+	x->spreader[0] = 0.6;
+	x->spreader[1] = 0.3;
+	x->spreader[2] = 0.15;
+	x->spreader[3] = 0.0;
+	x->spreader[4] = 0.15;
+	x->spreader[5] = 0.3;
+	x->spreader[6] = 0.6;
+	x->shift = 0;
+}
+
+void schmear_free(t_schmear *x)
+{
+    if(x->fft->initialized){
+        free(x->newamps);
+        free(x->spreader);
+    }
+	fftease_free(x->fft);
+    free(x->fft);
+}
+
+void do_schmear(t_schmear *x)
+{
+	int i, j;
+	t_fftease *fft = x->fft;
+	t_float *channel = fft->channel;
+	t_float frame_peak = 0.0, local_thresh;
+	t_float threshold = x->threshold;
+	int shift = x->shift;
+	int N = fft->N;
+	int N2 = fft->N2;
+	t_float *newamps = x->newamps;
+	t_float *spreader = x->spreader;
+	t_float curamp;
+	int spreadlen = x->spreadlen;
+	int spread_center = (spreadlen - 1) / 2;
+	int thisbin;
+	
+	fftease_fold(fft);
+	fftease_rdft(fft,1);
+	fftease_convert(fft);
+
+	for(i = 0; i < N; i += 2){	
+		if(frame_peak < channel[i])
+			frame_peak = channel[i];
+	}
+	local_thresh = frame_peak * threshold;
+	for(i = 0; i < N2; i++){
+		newamps[i] = 0.0;
+	}
+	/*
+	if( freakmode ){ // weird mistake version
+		for(i = 0; i < N2; i++){	
+			if(channel[i * 2] > local_thresh){
+				curamp = channel[i * 2];
+				for(j = i - spread_center; j <= i + spread_center; j++){
+					if(j >= 0 && j < N2){
+						newamps[j] += curamp * spreader[j + spread_center];
+					}
+				}
+			}
+		}  
+	} 
+	*/
+	// no spread for now
+	
+		for(i = 0; i < N2; i++){	
+			curamp = channel[i * 2];
+			if(curamp > local_thresh){
+
+				for(j = 0; j < spreadlen; j++){
+					thisbin = i + j - spread_center;
+					if(thisbin >= 0 && thisbin < N2){
+						newamps[thisbin] += curamp * spreader[j];
+					}
+				}
+			
+			} else {
+				newamps[i] = curamp;
+			}
+		}
+
+    if( shift > 0 ){
+        for( i = 0; i < N2; i++){
+            channel[i * 2] = newamps[i];
+        }
+        for( i = 0; i < N2; i++){
+            newamps[(i + shift) % N2] = channel[i * 2];
+        }
+    }
+	// move amps back where they belong
+	for(i = 0; i < N2; i++){
+		channel[i * 2] = newamps[i];
+	}
+	fftease_unconvert(fft);
+	fftease_rdft(fft,-1);
+	fftease_overlapadd(fft);
+
+}
+
+t_int *schmear_perform(t_int *w)
+{
+	int	i,j;
+    t_schmear *x = (t_schmear *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *MSPOutputVector = (t_float *)(w[3]);
+	t_fftease *fft = x->fft;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	t_float mult = fft->mult;
+	int MSPVectorSize = fft->MSPVectorSize;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;		
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	
+	if(x->mute){
+		for( j = 0; j < MSPVectorSize; j++) {
+			*MSPOutputVector++ = *MSPInputVector++ * FFTEASE_BYPASS_GAIN;
+		}
+		return w+4;
+	}
+
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_schmear(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_schmear(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_schmear(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+4;
+}		
+
+void schmear_dsp(t_schmear *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        schmear_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(schmear_perform, 3, x, sp[0]->s_vec, sp[1]->s_vec);
+    }
+}
diff --git a/externals/fftease/scrape~.c b/externals/fftease/scrape~.c
new file mode 100644
index 0000000000000000000000000000000000000000..addf00fcfc8280c9030cda9dd163c06fe80f7871
--- /dev/null
+++ b/externals/fftease/scrape~.c
@@ -0,0 +1,288 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *scrape_class;
+
+#define OBJECT_NAME "scrape~"
+
+typedef struct _scrape
+{
+    t_object x_obj;
+    t_float x_f;
+	t_fftease *fft;
+	t_float knee;
+	t_float cutoff;
+	t_float scrape_mult;
+	t_float thresh1;
+	t_float thresh2;
+	t_float *threshfunc;
+	short mute;
+} t_scrape;
+
+void scrape_dsp(t_scrape *x, t_signal **sp);
+t_int *scrape_perform(t_int *w);
+void *scrape_new(t_symbol *msg, short argc, t_atom *argv);
+void update_thresh_function( t_scrape *x );
+void scrape_frowned( float *S, float *C, float *threshfunc, float fmult, int N2 );
+void scrape_mute(t_scrape *x, t_floatarg toggle);
+void scrape_free( t_scrape *x );
+void update_thresh_function( t_scrape *x );
+void scrape_init(t_scrape *x);
+
+void scrape_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("scrape~"), (t_newmethod)scrape_new,
+                  (t_method)scrape_free,sizeof(t_scrape), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_scrape, x_f);
+	class_addmethod(c,(t_method)scrape_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)scrape_mute,gensym("mute"),A_FLOAT,0);
+
+    scrape_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void scrape_free( t_scrape *x )
+{
+    if(x->fft->initialized){
+        free(x->threshfunc);
+    }
+    fftease_free(x->fft);
+    free(x->fft);
+}
+
+void *scrape_new(t_symbol *msg, short argc, t_atom *argv)
+{
+    t_fftease *fft;
+	t_scrape *x = (t_scrape *)pd_new(scrape_class);
+
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+    
+	x->fft = (t_fftease *) calloc(1, sizeof(t_fftease) );
+	fft = x->fft;
+	fft->initialized = 0;
+	x->knee = 1000.0;
+	x->cutoff = 4000.0;
+	x->thresh1 = 0.001;
+	x->thresh2 = 0.09;
+	x->scrape_mult = 0.1;
+
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+}
+
+void scrape_init(t_scrape *x)
+{
+	t_fftease  *fft = x->fft;
+	short initialized = fft->initialized;
+	
+	fftease_init(fft);
+		
+	if(!initialized){
+		x->mute = 0;
+		x->threshfunc = (t_float *) calloc(fft->N2, sizeof(t_float));
+		update_thresh_function(x);
+	} else if(initialized == 1){
+		x->threshfunc = (t_float *) realloc(x->threshfunc, fft->N2 * sizeof(t_float));
+		update_thresh_function(x);
+	}
+}
+
+void update_thresh_function( t_scrape *x )
+{
+	t_float funda, curfreq, m1, m2;
+	int i;
+	int R = x->fft->R;
+	int N = x->fft->N;
+	int N2 = x->fft->N2;
+	
+	funda = (t_float)  R / ((t_float)N);
+	curfreq = funda ;
+	for( i = 0; i < N2; i++ ) {
+		if( curfreq  < x->knee ){
+			x->threshfunc[i] = 0.0 ;
+		} else if( curfreq >= x->knee && curfreq < x->cutoff ) {
+			m2 = (x->knee - curfreq) / (x->cutoff - x->knee) ;
+			m1 = 1.0 - m2 ;
+			x->threshfunc[i] = m1 * x->thresh1 + m2 * x->thresh2 ;
+		} else {
+			x->threshfunc[i] = x->thresh2;
+		}
+		curfreq += funda ;
+	}
+}
+
+void scrape_mute(t_scrape *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;	
+}
+
+void do_scrape(t_scrape *x)
+{
+	int real, imag, amp, phase;
+	t_float a, b;
+	int i;
+	t_float maxamp = 0.0;
+	t_fftease *fft = x->fft;
+	int N2 = fft->N2;
+	t_float scrape_mult = x->scrape_mult;
+	t_float *channel = fft->channel;
+	t_float *buffer = fft->buffer;
+	t_float *threshfunc = x->threshfunc;
+	
+	fftease_fold(fft);
+	fftease_rdft(fft,FFT_FORWARD);
+	
+	for( i = 0; i <= N2; i++ ){
+		amp = i<<1;
+		if( maxamp < channel[amp] ){
+			maxamp = channel[amp];
+		}
+	}
+	
+	for ( i = 0; i <= N2; i++ ) {
+		imag = phase = ( real = amp = i<<1 ) + 1;
+		a = ( i == N2 ? buffer[1] : buffer[real] );
+		b = ( i == 0 || i == N2 ? 0. : buffer[imag] );
+		channel[amp] = hypot( a, b );
+		
+		if ( (channel[amp]) < threshfunc[i] * maxamp ){
+			channel[amp] *= scrape_mult;
+		}
+		channel[phase] = -atan2( b, a );
+	}
+	
+	for ( i = 0; i <= N2; i++ ) {
+		imag = phase = ( real = amp = i<<1 ) + 1;
+		buffer[real] = *(channel+amp) * cos( *(channel+phase) );
+		if ( i != N2 )
+			buffer[imag] = -*(channel+amp) * sin( *(channel+phase) );
+	}
+
+	fftease_rdft(fft, FFT_INVERSE);
+	fftease_overlapadd(fft);
+}
+
+t_int *scrape_perform(t_int *w)
+{
+	int	i,j;
+	t_float tmp ;
+    t_scrape *x = (t_scrape *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *knee_freq = (t_float *)(w[3]);
+	t_float *cut_freq = (t_float *)(w[4]);
+	t_float *thresh1 = (t_float *)(w[5]);
+	t_float *thresh2 = (t_float *)(w[6]);
+	t_float *scrape_mult = (t_float *)(w[7]);
+	t_float *MSPOutputVector = (t_float *)(w[8]);
+	
+	t_fftease *fft = x->fft;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	t_float mult = fft->mult;
+	int MSPVectorSize = fft->MSPVectorSize;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;		
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;   
+	
+	if(x->mute){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+9;
+	}
+    tmp = *knee_freq++;
+    if( tmp > 50 && tmp < 20000 ){
+        x->knee = tmp;
+    }
+    tmp = *cut_freq++;
+    if( tmp > x->knee && tmp < 20000 ){
+        x->cutoff = *cut_freq++;
+    }
+    x->thresh1 = *thresh1;
+    x->thresh2 = *thresh2;
+    x->scrape_mult = *scrape_mult;
+    update_thresh_function( x );
+
+    // 
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_scrape(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_scrape(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_scrape(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+9;
+}		
+
+void scrape_dsp(t_scrape *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        scrape_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(scrape_perform, 8, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec,
+                sp[4]->s_vec, sp[5]->s_vec, sp[6]->s_vec);
+    }
+}
diff --git a/externals/fftease/shapee~.c b/externals/fftease/shapee~.c
new file mode 100644
index 0000000000000000000000000000000000000000..0be48cf280c07ba08c42c33af47db1f6b925811a
--- /dev/null
+++ b/externals/fftease/shapee~.c
@@ -0,0 +1,366 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *shapee_class;
+
+#define OBJECT_NAME "shapee~"
+
+typedef struct _shapee
+{
+	t_object x_obj;
+    float x_f;
+	t_fftease *fft,*fft2;
+    int widthConnected;    
+    t_float shapeWidth;
+	short mute;
+} t_shapee;
+
+
+/* msp function prototypes */
+
+void *shapee_new(t_symbol *s, int argc, t_atom *argv);
+void shapee_init(t_shapee *x);
+void shapee_mute(t_shapee *x, t_floatarg state);
+void shapee_free(t_shapee *x);
+void shapee_dsp(t_shapee *x, t_signal **sp);
+t_int *shapee_perform(t_int *w);
+void shapee_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("shapee~"), (t_newmethod)shapee_new,
+                  (t_method)shapee_free,sizeof(t_shapee), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_shapee, x_f);
+	class_addmethod(c,(t_method)shapee_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)shapee_mute,gensym("mute"),A_FLOAT,0);
+    shapee_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void *shapee_new(t_symbol *s, int argc, t_atom *argv)
+{
+
+	t_fftease *fft, *fft2;		
+	t_shapee *x = (t_shapee *)pd_new(shapee_class);
+
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	x->fft2 = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft2 = x->fft2;
+	fft->initialized = 0;
+	fft2->initialized = 0;
+	/* INITIALIZATIONS */
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+	fft2->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft2->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft2->winfac = FFTEASE_DEFAULT_WINFAC;
+	
+	fft2->R = fft->R = sys_getsr();
+	fft2->MSPVectorSize = fft->MSPVectorSize = sys_getblksize();
+	x->shapeWidth = 2.0;
+    if(argc > 0){ fft->N = fft2->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = fft2->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+}
+
+void shapee_init(t_shapee *x)
+{
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	short initialized = fft->initialized;
+	
+	fftease_init(fft);
+	fftease_init(fft2);
+	if(!initialized){
+		x->mute = 0;
+	}
+}
+
+void shapee_mute(t_shapee *x, t_floatarg state)
+{
+	x->mute = (short)state;
+}
+
+void do_shapee(t_shapee *x)
+{
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int		
+	i,j,
+
+	R,
+	N,
+	N2,
+	D,
+	Nw,
+	remainingWidth,
+	even, odd;
+
+	
+	t_float
+	a1, b1,
+	a2, b2,
+	*bufferOne,
+	*bufferTwo,
+	*channelOne,
+	*channelTwo;
+	
+
+int	shapeWidth = (int) x->shapeWidth;
+
+	bufferOne = fft->buffer;
+	bufferTwo = fft2->buffer;
+	R = fft->R;
+	N = fft->N;
+	N2 = fft->N2;
+	D = fft->D;
+	Nw = fft->Nw;
+
+	channelOne = fft->channel;
+	channelTwo = fft2->channel;
+
+    
+	
+	if(shapeWidth < 1 || shapeWidth > N2)
+		shapeWidth = 1;
+
+	/* apply hamming window and fold our window buffer into the fft buffer */ 
+	
+	fftease_fold(fft);
+	fftease_fold(fft2);
+	
+	/* do an fft */ 
+	
+	fftease_rdft(fft,FFT_FORWARD);
+	fftease_rdft(fft2,FFT_FORWARD);
+	
+	/* convert to polar coordinates from complex values */ 
+	
+	for ( i = 0; i <= N2; i++ ) {
+		odd = ( even = i<<1 ) + 1;
+		
+		a1 = ( i == N2 ? *(bufferOne+1) : *(bufferOne+even) );
+		b1 = ( i == 0 || i == N2 ? 0. : *(bufferOne+odd) );
+		
+		a2 = ( i == N2 ? *(bufferTwo+1) : *(bufferTwo+even) );
+		b2 = ( i == 0 || i == N2 ? 0. : *(bufferTwo+odd) );
+		
+		/* replace signal one's phases with those of signal two */
+		
+		*(channelOne+even) = hypot( a1, b1 );
+		*(channelOne+odd) = -atan2( b1, a1 );
+		
+		*(channelTwo+even) = hypot( a2, b2 );
+		*(channelTwo+odd) = -atan2( b2, a2 );       
+	}
+	
+	/* constrain our shapeWidth value */
+	
+	if ( shapeWidth > N2 )
+		shapeWidth = N2;
+  	
+	if ( shapeWidth < 1 )
+		shapeWidth = 1;
+	
+	
+	/* lets just shape the entire signal by the shape width */
+	
+	for ( i=0; i < N; i += shapeWidth << 1 ) {
+		
+		float       amplSum = 0.,
+		freqSum = 0.,
+		factor;
+		
+		for ( j = 0; j < shapeWidth << 1; j += 2 ) {
+			
+			amplSum += *(channelTwo+i+j);
+			freqSum += *(channelOne+i+j);
+		}
+		if(freqSum <= 0.001){
+			freqSum = 1.0;
+		}
+		if (amplSum < 0.000000001)
+			factor = 0.000000001;	
+		
+		else	
+			factor = amplSum / freqSum;
+		
+		for ( j = 0; j < shapeWidth * 2; j += 2 )
+			*(channelOne+i+j) *= factor;
+	}
+	
+	/* copy remaining magnitudes */
+	
+	if ( (remainingWidth = N2 % shapeWidth) ) {
+		
+		int			bindex = (N2 - remainingWidth) << 1;
+		
+		
+		float       amplSum = 0.,
+		freqSum = 0.,
+		factor;
+		
+		for ( j = 0; j < remainingWidth * 2; j += 2 ) {
+			
+	  		amplSum += *(channelTwo+bindex+j);
+	  		freqSum += *(channelOne+bindex+j);
+		}
+		if(freqSum <= 0.00001){
+			freqSum = 1.0;
+		}
+		if (amplSum < 0.000000001)
+			factor = 0.000000001;	
+		
+		else	
+			factor = amplSum / freqSum;
+		
+		for ( j = 0; j < remainingWidth * 2; j += 2 )
+	  		*(channelOne+bindex+j) *= factor;
+	}
+	
+	
+	/* convert from polar to cartesian */	
+	
+	for ( i = 0; i <= N2; i++ ) {
+		
+		odd = ( even = i<<1 ) + 1;
+		
+		*(bufferOne+even) = *(channelOne+even) * cos( *(channelOne+odd) );
+		
+		if ( i != N2 )
+			*(bufferOne+odd) = (*(channelOne+even)) * -sin( *(channelOne+odd) );
+	}
+
+	fftease_rdft(fft,FFT_INVERSE);
+	fftease_overlapadd(fft);
+}
+
+
+t_int *shapee_perform(t_int *w)
+{
+	int i,j;
+	/* get our inlets and outlets */
+	t_shapee *x = (t_shapee *) (w[1]);
+	t_float *MSPInputVector1 = (t_float *)(w[2]);
+	t_float *MSPInputVector2 = (t_float *)(w[3]);
+	t_float *inShape = (t_float *)(w[4]);
+	t_float *MSPOutputVector = (t_float *)(w[5]);
+
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	
+	int MSPVectorSize = fft->MSPVectorSize;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalInputVector1 = fft->internalInputVector;
+	t_float *internalInputVector2 = fft2->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	t_float *inputOne = fft->input;
+	t_float *inputTwo = fft2->input;
+	t_float *output = fft->output;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float mult = fft->mult;	
+	
+	if(x->mute){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+6;
+	}
+
+	x->shapeWidth =   *inShape;
+
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputOne + (Nw - D), MSPInputVector1, D * sizeof(t_float));
+        memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputTwo + (Nw - D), MSPInputVector2, D * sizeof(t_float));
+        
+		do_shapee(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw-D), MSPInputVector1 + (D*i), D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw-D), MSPInputVector2 + (D*i), D * sizeof(t_float));
+            
+			do_shapee(x);
+            
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector1 + (operationCount * MSPVectorSize), MSPInputVector1, MSPVectorSize * sizeof(t_float));
+        memcpy(internalInputVector2 + (operationCount * MSPVectorSize), MSPInputVector2, MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize), MSPVectorSize * sizeof(t_float));
+        
+		operationCount = (operationCount + 1) % operationRepeat;
+        
+        if( operationCount == 0 ) {
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw - D), internalInputVector1, D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw - D), internalInputVector2, D * sizeof(t_float));
+            
+            do_shapee(x);
+            
+            for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+6;
+}	
+	
+void shapee_free( t_shapee *x )
+{
+	fftease_free(x->fft);
+	fftease_free(x->fft2);
+    free(x->fft);
+    free(x->fft2);
+}
+
+void shapee_dsp(t_shapee *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    t_fftease *fft = x->fft;
+    t_fftease *fft2 = x->fft2;
+    
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(!samplerate)
+        return;
+    
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+		fft2->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft2);
+	}
+	if(fft->R != samplerate ){
+		fft->R = samplerate;
+        fft2->R = samplerate;
+	}
+    if(reset_required){
+        shapee_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(shapee_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec,sp[3]->s_vec);
+    }
+}
diff --git a/externals/fftease/smap.pd b/externals/fftease/smap.pd
new file mode 100644
index 0000000000000000000000000000000000000000..de9549d85d75a3e6dd1ed390fa0000f703877c49
--- /dev/null
+++ b/externals/fftease/smap.pd
@@ -0,0 +1,28 @@
+#N canvas 0 22 458 308 10;
+#X obj 88 84 inlet;
+#X obj 88 110 / 127;
+#X obj 265 144 - 0;
+#X obj 283 38 t b b;
+#X floatatom 128 161 5 0 0 0 - - -;
+#X obj 88 181 *;
+#X obj 88 210 +;
+#X floatatom 135 192 5 0 0 0 - - -;
+#X obj 88 237 outlet;
+#X obj 283 17 loadbang;
+#X floatatom 205 125 5 0 0 0 - - -;
+#X obj 227 66 float \$2;
+#X obj 304 67 float \$1;
+#X connect 0 0 1 0;
+#X connect 1 0 5 0;
+#X connect 2 0 4 0;
+#X connect 3 0 11 0;
+#X connect 3 1 12 0;
+#X connect 4 0 5 1;
+#X connect 5 0 6 0;
+#X connect 6 0 8 0;
+#X connect 7 0 6 1;
+#X connect 9 0 3 0;
+#X connect 10 0 2 0;
+#X connect 11 0 10 0;
+#X connect 12 0 2 1;
+#X connect 12 0 7 0;
diff --git a/externals/fftease/swinger~.c b/externals/fftease/swinger~.c
new file mode 100644
index 0000000000000000000000000000000000000000..346dafff2f331c08906fbe0a0f1135d4c4fe86c0
--- /dev/null
+++ b/externals/fftease/swinger~.c
@@ -0,0 +1,294 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *swinger_class;
+
+#define OBJECT_NAME "swinger~"
+
+typedef struct _swinger
+{
+	t_object x_obj;
+    float x_f;
+	t_fftease *fft;
+	t_fftease *fft2;
+	short mute;
+} t_swinger;
+
+void swinger_dsp(t_swinger *x, t_signal **sp);
+t_int *swinger_perform(t_int *w);
+void *swinger_new(t_symbol *s, int argc, t_atom *argv);
+void swinger_mute(t_swinger *x, t_floatarg state);
+void swinger_init(t_swinger *x);
+void swinger_free(t_swinger *x);
+
+void swinger_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("swinger~"), (t_newmethod)swinger_new,
+                  (t_method)swinger_free,sizeof(t_swinger), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_swinger, x_f);
+	class_addmethod(c,(t_method)swinger_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)swinger_mute,gensym("mute"),A_FLOAT,0);
+    swinger_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void swinger_mute(t_swinger *x, t_floatarg state)
+{
+	x->mute = state;	
+}
+
+void *swinger_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_fftease *fft, *fft2;
+	t_swinger *x = (t_swinger *)pd_new(swinger_class);
+
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+	
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	x->fft2 = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft2 = x->fft2;
+	fft->initialized = 0;
+	fft2->initialized = 0;
+
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+	fft2->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft2->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft2->winfac = FFTEASE_DEFAULT_WINFAC;
+	
+    if(argc > 0){ fft->N = fft2->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = fft2->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+}
+
+void swinger_init(t_swinger *x)
+{
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	
+	if(!fft->initialized){
+		x->mute = 0;
+	}	
+	fftease_init(fft);
+	fftease_init(fft2);
+
+}
+
+void do_swinger(t_swinger *x)
+{
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int		
+	i,
+	
+	R,
+	N,
+	N2,
+	D,
+	Nw,
+	
+	even, odd;
+	
+	t_float
+	a1, b1,
+	a2, b2,
+	*bufferOne,
+	*bufferTwo,
+	*channelOne,
+	*channelTwo;
+	bufferOne = fft->buffer;
+	bufferTwo = fft2->buffer;
+	R = fft->R;
+	N = fft->N;
+	N2 = fft->N2;
+	D = fft->D;
+	Nw = fft->Nw;
+	channelOne = fft->channel;
+	channelTwo = fft2->channel;
+	
+	
+	/* apply hamming window and fold our window buffer into the fft buffer */ 
+	
+	fftease_fold(fft);
+	fftease_fold(fft2);
+	
+	/* do an fft */ 
+	
+	fftease_rdft(fft,FFT_FORWARD);
+	fftease_rdft(fft2,FFT_FORWARD);
+	
+	/* use redundant coding for speed, even though moving the invert variable
+	 comparison outside of the for loop will give us only a minimal performance
+	 increase (hypot and atan2 are the most intensive portions of this code).
+	 consider adding a table lookup for atan2 instead.
+	 */
+	
+	/* convert to polar coordinates from complex values */
+	
+	for ( i = 0; i <= N2; i++ ) {
+		odd = ( even = i<<1 ) + 1;
+		
+		a1 = ( i == N2 ? *(bufferOne+1) : *(bufferOne+even) );
+		b1 = ( i == 0 || i == N2 ? 0. : *(bufferOne+odd) );
+		
+		a2 = ( i == N2 ? *(bufferTwo+1) : *(bufferTwo+even) );
+		b2 = ( i == 0 || i == N2 ? 0. : *(bufferTwo+odd) );
+		
+		/* replace signal one's phases with those of signal two */
+		
+		*(channelOne+even) = hypot( a1, b1 );
+		*(channelOne+odd) = -atan2( b2, a2 );        
+	}
+	
+	for ( i = 0; i <= N2; i++ ) {
+		
+		odd = ( even = i<<1 ) + 1;
+		
+		*(bufferOne+even) = *(channelOne+even) * cos( *(channelOne+odd) );
+		
+		if ( i != N2 )
+			*(bufferOne+odd) = -(*(channelOne+even)) * sin( *(channelOne+odd) );
+	}
+	
+	
+	/* do an inverse fft */
+	
+	fftease_rdft(fft,FFT_INVERSE);
+	
+	
+	
+	/* dewindow our result */
+	
+	fftease_overlapadd(fft);
+	
+	/* set our output and adjust our retaining output buffer */
+	
+	
+}
+
+t_int *swinger_perform(t_int *w)
+{
+	int i,j;
+    t_swinger *x = (t_swinger *) (w[1]);
+	t_float *MSPInputVector1 = (t_float *)(w[2]);
+	t_float *MSPInputVector2 = (t_float *)(w[3]);
+	t_float *MSPOutputVector = (t_float *)(w[4]);
+	
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	
+	int MSPVectorSize = fft->MSPVectorSize;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalInputVector1 = fft->internalInputVector;
+	t_float *internalInputVector2 = fft2->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	t_float *inputOne = fft->input;
+	t_float *inputTwo = fft2->input;
+	t_float *output = fft->output;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float mult = fft->mult;	
+	
+	/* no computation if muted */
+	
+	if(x->mute){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+5;
+	}
+	
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputOne + (Nw - D), MSPInputVector1, D * sizeof(t_float));
+        memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputTwo + (Nw - D), MSPInputVector2, D * sizeof(t_float));
+        
+		do_swinger(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw-D), MSPInputVector1 + (D*i), D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw-D), MSPInputVector2 + (D*i), D * sizeof(t_float));
+            
+			do_swinger(x);
+            
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector1 + (operationCount * MSPVectorSize), MSPInputVector1, MSPVectorSize * sizeof(t_float));
+        memcpy(internalInputVector2 + (operationCount * MSPVectorSize), MSPInputVector2, MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize), MSPVectorSize * sizeof(t_float));
+        
+		operationCount = (operationCount + 1) % operationRepeat;
+        
+        if( operationCount == 0 ) {
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw - D), internalInputVector1, D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw - D), internalInputVector2, D * sizeof(t_float));
+            
+            do_swinger(x);
+            
+            for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+5;
+}	
+
+void swinger_free( t_swinger *x )
+{
+	fftease_free(x->fft);
+	fftease_free(x->fft2);
+    free(x->fft);
+    free(x->fft2);
+}
+
+void swinger_dsp(t_swinger *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    t_fftease *fft = x->fft;
+    t_fftease *fft2 = x->fft2;
+    
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(!samplerate)
+        return;
+    
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+		fft2->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft2);
+	}
+	if(fft->R != samplerate ){
+		fft->R = samplerate;
+        fft2->R = samplerate;
+	}
+    if(reset_required){
+        swinger_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(swinger_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec);
+    }
+}
\ No newline at end of file
diff --git a/externals/fftease/taint~.c b/externals/fftease/taint~.c
new file mode 100644
index 0000000000000000000000000000000000000000..8d35ab7e5d9fd94d9e2417f708c28e1f9e47b4f2
--- /dev/null
+++ b/externals/fftease/taint~.c
@@ -0,0 +1,378 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *taint_class;
+
+#define OBJECT_NAME "taint~"
+
+typedef struct _taint
+{
+	t_object x_obj;
+    float x_f;
+	t_fftease *fft;
+	t_fftease *fft2;
+	t_float mult;
+	short mute;
+	int invert;
+	int invert_countdown; // delay onset of invert effect to avoid loud glitches
+	int invert_nextstate; // next state for invert   
+	t_float invert_pad;   
+	t_float threshold;
+	t_float exponent;
+} t_taint;
+
+/* msp function prototypes */
+
+void taint_dsp(t_taint *x, t_signal **sp);
+t_int *taint_perform(t_int *w);
+void *taint_new(t_symbol *s, int argc, t_atom *argv);
+void taint_invert(t_taint *x, t_floatarg toggle);
+void taint_free(t_taint *x);
+void taint_mute(t_taint *x, t_floatarg toggle);
+void taint_tilde_setup(void);
+void taint_init(t_taint *x);
+void taint_pad(t_taint *x, t_floatarg pad);
+
+void taint_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("taint~"), (t_newmethod)taint_new,
+                  (t_method)taint_free,sizeof(t_taint), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_taint, x_f);
+	class_addmethod(c,(t_method)taint_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)taint_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(c,(t_method)taint_invert,gensym("invert"), A_FLOAT, 0);
+    class_addmethod(c,(t_method)taint_pad,gensym("pad"), A_FLOAT, 0);
+    taint_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void taint_mute(t_taint *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;
+}
+
+void taint_free(t_taint *x)
+{
+	fftease_free(x->fft);
+	fftease_free(x->fft2);
+    free(x->fft);
+    free(x->fft2);
+}
+
+void taint_pad(t_taint *x, t_floatarg pad)
+{
+	x->invert_pad = pad;
+	taint_invert(x,x->invert);//resubmit to invert
+}
+
+void taint_invert(t_taint *x, t_floatarg toggle)
+{
+	t_fftease *fft = x->fft;
+	x->invert_nextstate = toggle;
+	x->invert_countdown = fft->overlap; // delay effect for "overlap" vectors
+	
+	if(x->invert_nextstate){ // lower gain immediately; delay going to invert
+		x->fft->mult = (1. / (t_float) x->fft->N) * x->invert_pad;
+	} else {
+		x->invert = 0; //immediately turn off invert; delay raising gain
+	}
+}
+
+void *taint_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_fftease *fft, *fft2;		
+
+	t_taint *x = (t_taint *)pd_new(taint_class);
+
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	x->fft2 = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft2 = x->fft2;
+	fft->initialized = 0;
+	fft2->initialized = 0;
+	x->exponent = 0.25;
+	x->threshold = 0.01;
+	
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+	fft2->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft2->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft2->winfac = FFTEASE_DEFAULT_WINFAC;
+	
+    if(argc > 0){ fft->N = fft2->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = fft2->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+}
+
+void taint_init(t_taint *x)
+{
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+
+	short initialized = fft->initialized;
+	
+	fftease_init(fft);
+	fftease_init(fft2);	
+	if(!initialized){
+		x->invert_pad = 0.025; // -32 dB
+		x->invert_countdown = 0;
+		x->mute = 0;
+		x->invert = 0;
+	} 
+	if(x->invert){
+		x->mult *= x->invert_pad;
+    }
+}
+
+void do_taint(t_taint *x)
+{
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int i;
+	int odd,even;
+	t_float a1,b1,a2,b2;
+	t_float *bufferOne = fft->buffer;
+	t_float *bufferTwo = fft2->buffer;
+	int N2 = fft->N2;
+	t_float *channelOne = fft->channel;
+	t_float *channelTwo = fft2->channel;
+	t_float threshold = x->threshold;
+	t_float exponent = x->exponent;
+	int invert = x->invert;
+	
+	
+	/* apply hamming window and fold our window buffer into the fft buffer */ 
+	
+	fftease_fold(fft);
+	fftease_fold(fft2);
+	
+	/* do an fft */ 
+	
+	fftease_rdft(fft,FFT_FORWARD);
+	fftease_rdft(fft2,FFT_FORWARD);
+	
+	/* convert to polar coordinates from complex values */
+	
+	if (invert) {
+		
+		for ( i = 0; i <= N2; i++ ) {
+			
+			t_float magnitude;	
+			
+			odd = ( even = i<<1 ) + 1;
+			
+			a1 = ( i == N2 ? *(bufferOne+1) : *(bufferOne+even) );
+			b1 = ( i == 0 || i == N2 ? 0. : *(bufferOne+odd) );
+			
+			a2 = ( i == N2 ? *(bufferTwo+1) : *(bufferTwo+even) );
+			b2 = ( i == 0 || i == N2 ? 0. : *(bufferTwo+odd) );
+			
+			*(channelOne+even) = hypot( a1, b1 );
+			*(channelOne+odd) = -atan2( b1, a1 );
+			
+			magnitude = *(channelTwo+even) = hypot( a2, b2 );
+			*(channelTwo+odd) = -atan2( b2, a2 );
+			
+			/* use threshold for inverse filtering to avoid division by zero */
+			
+			if ( magnitude < threshold )
+				magnitude = 0.;
+			
+			else  
+				magnitude = 1. / magnitude;
+			
+			*(channelOne+even) *= magnitude;
+			*(channelOne+even) = pow( *(channelOne+even), exponent );
+		}
+	}
+	
+	
+	else {
+		
+		for ( i = 0; i <= N2; i++ ) {
+			
+			odd = ( even = i<<1 ) + 1;
+			
+			a1 = ( i == N2 ? *(bufferOne+1) : *(bufferOne+even) );
+			b1 = ( i == 0 || i == N2 ? 0. : *(bufferOne+odd) );
+			
+			a2 = ( i == N2 ? *(bufferTwo+1) : *(bufferTwo+even) );
+			b2 = ( i == 0 || i == N2 ? 0. : *(bufferTwo+odd) );
+			
+			*(channelOne+even) = hypot( a1, b1 );
+			*(channelOne+odd) = -atan2( b1, a1 );
+			
+			*(channelTwo+even) = hypot( a2, b2 );
+			*(channelTwo+odd) = -atan2( b2, a2 );
+			
+			/* simple multiplication of magnitudes */
+			
+			*(channelOne+even) *= *(channelTwo+even);
+			
+			*(channelOne+even) = pow( *(channelOne+even), exponent );
+		}
+	}
+	
+	/* convert back to complex form, read for the inverse fft */
+	
+	for ( i = 0; i <= N2; i++ ) {
+		
+		odd = ( even = i<<1 ) + 1;
+		
+		*(bufferOne+even) = *(channelOne+even) * cos( *(channelOne+odd) );
+		
+		if ( i != N2 )
+			*(bufferOne+odd) = -(*(channelOne+even)) * sin( *(channelOne+odd) );
+	}
+	
+	
+	
+	fftease_rdft(fft,FFT_INVERSE);
+
+	fftease_overlapadd(fft);
+	
+}
+
+t_int *taint_perform(t_int *w)
+{
+	int		
+    i,j;
+	
+	/* get our inlets and outlets */
+	t_taint *x = (t_taint *) (w[1]);
+	t_float *MSPInputVector1 = (t_float *)(w[2]);
+	t_float *MSPInputVector2 = (t_float *)(w[3]);
+	t_float *vec_exponent = (t_float *)(w[4]);
+	t_float *vec_threshold = (t_float *)(w[5]);
+	t_float *MSPOutputVector = (t_float *)(w[6]);;
+	t_fftease *fft = x->fft;	
+	t_fftease *fft2 = x->fft2;
+	
+	int MSPVectorSize = fft->MSPVectorSize;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalInputVector1 = fft->internalInputVector;
+	t_float *internalInputVector2 = fft2->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	t_float *inputOne = fft->input;
+	t_float  *inputTwo = fft2->input;
+	t_float  *output = fft->output;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float mult = fft->mult;	
+	
+	//short *connected = x->connected;
+	/* dereference structure  */	
+
+    x->exponent = *vec_exponent;
+    x->threshold = *vec_threshold;
+
+	
+	if(x->mute){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+7;
+	}
+
+
+	if(x->invert_countdown > 0){
+
+		--(x->invert_countdown);
+		if(! x->invert_countdown){ // countdown just ended
+			if(x->invert_nextstate){ // moving to invert (gain is already down)
+				x->invert = x->invert_nextstate;
+			} else { // invert is already off - now reset gain
+				mult = x->fft->mult = 1. / (t_float) x->fft->N;
+			}
+		}
+	}
+//
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputOne + (Nw - D), MSPInputVector1, D * sizeof(t_float));
+        memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputTwo + (Nw - D), MSPInputVector2, D * sizeof(t_float));
+        
+		do_taint(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw-D), MSPInputVector1 + (D*i), D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw-D), MSPInputVector2 + (D*i), D * sizeof(t_float));
+            
+			do_taint(x);
+            
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector1 + (operationCount * MSPVectorSize), MSPInputVector1, MSPVectorSize * sizeof(t_float));
+        memcpy(internalInputVector2 + (operationCount * MSPVectorSize), MSPInputVector2, MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize), MSPVectorSize * sizeof(t_float));
+        
+		operationCount = (operationCount + 1) % operationRepeat;
+        
+        if( operationCount == 0 ) {
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw - D), internalInputVector1, D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw - D), internalInputVector2, D * sizeof(t_float));
+            
+            do_taint(x);
+            
+            for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+7;
+}		
+
+void taint_dsp(t_taint *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    t_fftease *fft = x->fft;
+    t_fftease *fft2 = x->fft2;
+    
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(!samplerate)
+        return;
+    
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+		fft2->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft2);
+	}
+	if(fft->R != samplerate ){
+		fft->R = samplerate;
+        fft2->R = samplerate;
+	}
+    if(reset_required){
+        taint_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(taint_perform, 6, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec,sp[3]->s_vec,
+                sp[4]->s_vec);
+    }
+}
\ No newline at end of file
diff --git a/externals/fftease/thresher~.c b/externals/fftease/thresher~.c
new file mode 100644
index 0000000000000000000000000000000000000000..4d992b82c8c71b07942f905f62a9c76150ade446
--- /dev/null
+++ b/externals/fftease/thresher~.c
@@ -0,0 +1,272 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *thresher_class;
+
+#define OBJECT_NAME "thresher~"
+#define DEFAULT_HOLD (40.0)
+
+typedef struct _thresher
+{
+    t_object x_obj;
+    t_float x_f;
+	t_fftease *fft;
+	t_float move_threshold;
+	t_float *composite_frame;
+	int *frames_left;
+	int max_hold_frames;
+	t_float max_hold_time;
+	int first_frame;
+	t_float damping_factor;
+	short thresh_connected;
+	short damping_connected;
+	short mute;
+	t_float tadv;
+} t_thresher;
+
+void thresher_dsp(t_thresher *x, t_signal **sp);
+t_int *thresher_perform(t_int *w);
+void *thresher_new(t_symbol *s, int argc, t_atom *argv);
+void thresher_mute(t_thresher *x, t_floatarg f);
+void thresher_free( t_thresher *x );
+void thresher_init(t_thresher *x);
+void thresher_transpose(t_thresher *x, t_floatarg tf);
+void thresher_synthresh(t_thresher *x, t_floatarg thresh);
+void thresher_oscbank(t_thresher *x, t_floatarg flag);
+
+void thresher_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("thresher~"), (t_newmethod)thresher_new,
+                  (t_method)thresher_free,sizeof(t_thresher), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_thresher, x_f);
+	class_addmethod(c,(t_method)thresher_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)thresher_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(c,(t_method)thresher_oscbank,gensym("oscbank"),A_FLOAT,0);
+	class_addmethod(c,(t_method)thresher_transpose,gensym("transpose"),A_FLOAT,0);
+	class_addmethod(c,(t_method)thresher_synthresh,gensym("synthresh"),A_FLOAT,0);
+    thresher_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void thresher_transpose(t_thresher *x, t_floatarg tf)
+{
+	x->fft->P = tf;
+}
+
+void thresher_synthresh(t_thresher *x, t_floatarg thresh)
+{
+	x->fft->synt = thresh;
+}
+
+void thresher_oscbank(t_thresher *x, t_floatarg flag)
+{
+	x->fft->obank_flag = (short) flag;
+}
+
+void thresher_free(t_thresher *x){
+    if(x->fft->initialized){
+        free(x->composite_frame);
+    }
+	fftease_free(x->fft);
+    free(x->fft);
+}
+
+void thresher_mute(t_thresher *x, t_floatarg f){
+	x->mute = (short)f;
+}
+
+void *thresher_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_fftease *fft;
+	t_thresher *x = (t_thresher *)pd_new(thresher_class);
+    
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease) );
+	fft = x->fft;
+	fft->initialized = 0;
+	x->move_threshold = 0.001;
+	x->damping_factor = 0.99;
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;	
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+}
+
+void thresher_init(t_thresher *x)
+{
+	t_fftease  *fft = x->fft;
+	short initialized = fft->initialized;
+
+	fftease_init(fft);
+	x->tadv = (t_float) fft->D / (t_float) fft->R ;
+
+	if(!initialized){
+		x->mute = 0;
+		if(!x->damping_factor){
+			x->damping_factor = .95;
+		}
+		x->first_frame = 1;
+		x->move_threshold = .00001 ;
+		x->max_hold_time = DEFAULT_HOLD ;
+		x->max_hold_frames = x->max_hold_time / x->tadv;
+		x->composite_frame = (t_float *) calloc( (fft->N+2), sizeof(t_float));
+		x->frames_left = (int *) calloc( (fft->N+2), sizeof(int) );
+		
+	} else if(initialized == 1){
+		x->composite_frame = (t_float *) realloc(x->composite_frame, (fft->N+2) * sizeof(t_float) );
+		x->frames_left = (int *) realloc(x->frames_left, (fft->N+2) * sizeof(int) );
+	}
+}
+
+void do_thresher(t_thresher *x)
+{
+	int i;
+	
+	t_fftease *fft = x->fft;
+	t_float *channel = fft->channel;
+	t_float damping_factor = x->damping_factor;
+	int max_hold_frames = x->max_hold_frames;
+	int *frames_left = x->frames_left;
+	t_float *composite_frame = x->composite_frame;
+	int N = fft->N;
+	t_float move_threshold = x->move_threshold;
+
+	fftease_fold(fft);
+	fftease_rdft(fft,FFT_FORWARD);
+	fftease_convert(fft);
+	
+	if( x->first_frame ){
+		for ( i = 0; i < N+2; i++ ){
+			composite_frame[i] = channel[i];
+			frames_left[i] = max_hold_frames;
+		}
+		x->first_frame = 0;
+	} else {
+		for( i = 0; i < N+2; i += 2 ){
+			if(fabs( composite_frame[i] - channel[i] ) > move_threshold || frames_left[i] <= 0 ){
+				composite_frame[i] = channel[i];
+				composite_frame[i+1] = channel[i+1];
+				frames_left[i] = max_hold_frames;
+			} else {
+				--(frames_left[i]);
+				composite_frame[i] *= damping_factor;
+			}
+		}
+	}
+	// try memcpy here
+	for ( i = 0; i < N+2; i++ ){
+		channel[i] = composite_frame[i];
+	}
+	if(fft->obank_flag){
+		fftease_oscbank(fft);
+	} else {
+		fftease_unconvert(fft);
+		fftease_rdft(fft,FFT_INVERSE);
+		fftease_overlapadd(fft);
+	}	
+}
+
+t_int *thresher_perform(t_int *w)
+{
+	int		    i,j;
+    t_thresher *x = (t_thresher *) (w[1]);
+	t_float *MSPInputVector = (t_float *)(w[2]);
+	t_float *inthresh = (t_float *)(w[3]);
+	t_float *damping = (t_float *)(w[4]);
+	t_float *MSPOutputVector = (t_float *)(w[5]);
+
+	t_fftease *fft = x->fft;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float *input = fft->input;
+	t_float *output = fft->output;
+	t_float mult = fft->mult;
+	int MSPVectorSize = fft->MSPVectorSize;
+	t_float *internalInputVector = fft->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;		
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;  
+	
+	if(x->mute){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+6;
+	}
+
+
+    x->move_threshold = *inthresh;
+    x->damping_factor = *damping;
+
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+        memcpy(input + (Nw - D), MSPInputVector, D * sizeof(t_float));
+        
+		do_thresher(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw-D), MSPInputVector + (D*i), D * sizeof(t_float));
+            
+			do_thresher(x);
+			
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector + (operationCount * MSPVectorSize), MSPInputVector,MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize),MSPVectorSize * sizeof(t_float));
+		operationCount = (operationCount + 1) % operationRepeat;
+		
+		if( operationCount == 0 ) {
+            memcpy(input, input + D, (Nw - D) * sizeof(t_float));
+            memcpy(input + (Nw - D), internalInputVector, D * sizeof(t_float));
+            
+			do_thresher(x);
+			
+			for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+6;
+}
+
+void thresher_dsp(t_thresher *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    if(!samplerate)
+        return;
+	t_fftease *fft = x->fft;
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+	}
+	if(fft->R != samplerate){
+		fft->R = samplerate;
+	}
+    if(reset_required){
+        thresher_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(thresher_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec);
+    }
+}
\ No newline at end of file
diff --git a/externals/fftease/unconvert.c b/externals/fftease/unconvert.c
new file mode 100644
index 0000000000000000000000000000000000000000..2a2f774c5faf1b4c424a833ebad73f8b5391ae0d
--- /dev/null
+++ b/externals/fftease/unconvert.c
@@ -0,0 +1,39 @@
+#include "fftease.h"
+
+
+
+//void fftease_unconvert( t_float *C, t_float *S, int N2, t_float *lastphase, t_float fundamental, t_float factor )
+//	fftease_unconvert( channel, buffer, N2, c_lastphase_out, c_fundamental, c_factor_out  );
+
+void fftease_unconvert(t_fftease *fft)
+
+{
+	t_float *channel = fft->channel;
+	t_float *buffer = fft->buffer;
+	int N2 = fft->N2;
+	t_float *lastphase = fft->c_lastphase_out;
+	t_float fundamental = fft->c_fundamental;
+	t_float factor = fft->c_factor_out;
+	
+	int 	i, real, imag, amp, freq;
+	t_float 	mag, phase;
+
+	
+    for ( i = 0; i <= N2; i++ ) {
+		
+		imag = freq = ( real = amp = i<<1 ) + 1;
+		
+		if ( i == N2 )
+			real = 1;
+		
+		mag = channel[amp];
+		lastphase[i] += channel[freq] - i*fundamental;
+		phase = lastphase[i]*factor;
+		buffer[real] = mag*cos( phase );
+		
+		if ( i != N2 )
+			buffer[imag] = -mag*sin( phase );
+		
+    }
+	
+}
diff --git a/externals/fftease/vacancy~.c b/externals/fftease/vacancy~.c
new file mode 100644
index 0000000000000000000000000000000000000000..c99d58154bd248e431724cea4fe4f3268cdc4ff3
--- /dev/null
+++ b/externals/fftease/vacancy~.c
@@ -0,0 +1,382 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *vacancy_class;
+
+#define OBJECT_NAME "vacancy~"
+
+typedef struct _vacancy
+{
+    t_object x_obj;
+    t_float x_f;
+	t_fftease *fft;
+	t_fftease *fft2;
+    int invert;
+    int useRms;
+    int swapPhase;
+	short mute;
+	t_float threshold;
+} t_vacancy;
+
+
+/* msp function prototypes */
+
+void vacancy_dsp(t_vacancy *x, t_signal **sp);
+t_int *vacancy_perform(t_int *w);
+void *vacancy_new(t_symbol *s, int argc, t_atom *argv);
+void vacancy_rms(t_vacancy *x, t_floatarg f);
+void vacancy_invert(t_vacancy *x, t_floatarg f);
+void vacancy_swapphase(t_vacancy *x, t_floatarg f);
+void vacancy_free(t_vacancy *x);
+void vacancy_mute(t_vacancy *x, t_floatarg toggle);
+void vacancy_tilde_setup(void);
+void vacancy_init(t_vacancy *x);
+
+void vacancy_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("vacancy~"), (t_newmethod)vacancy_new,
+                  (t_method)vacancy_free,sizeof(t_vacancy), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_vacancy, x_f);
+	class_addmethod(c,(t_method)vacancy_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)vacancy_mute,gensym("mute"),A_FLOAT,0);
+    
+    class_addmethod(c,(t_method)vacancy_rms,gensym("rms"), A_FLOAT, 0);
+    class_addmethod(c,(t_method)vacancy_invert,gensym("invert"), A_FLOAT, 0);
+	class_addmethod(c,(t_method)vacancy_swapphase,gensym("swapphase"), A_FLOAT, 0);
+    
+    vacancy_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void vacancy_rms(t_vacancy *x, t_floatarg f)
+{
+	x->useRms = (int) f;
+}
+
+void vacancy_invert(t_vacancy *x, t_floatarg f)
+{
+	x->invert = (int) f;
+}
+
+void vacancy_swapphase(t_vacancy *x, t_floatarg f)
+{
+	x->swapPhase = (int) f;
+}
+
+void vacancy_mute(t_vacancy *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;
+}
+
+void *vacancy_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_fftease *fft, *fft2;	
+
+	t_vacancy *x = (t_vacancy *)pd_new(vacancy_class);
+
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	x->fft2 = (t_fftease *) calloc(1,sizeof(t_fftease));
+	fft = x->fft;
+	fft2 = x->fft2;	
+	fft->initialized = 0;
+	fft2->initialized = 0;
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+	fft2->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft2->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft2->winfac = FFTEASE_DEFAULT_WINFAC;
+	
+	return x;
+}
+
+void vacancy_init(t_vacancy *x)
+{
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	short initialized = x->fft->initialized;
+
+	fftease_init(fft);
+	fftease_init(fft2);
+	
+	if(!initialized){
+		x->mute = 0;
+		x->invert = 0;
+		x->threshold = 0.01;
+		x->useRms = 1;
+		x->swapPhase = 0;
+	}
+}
+
+void vacancy_free(t_vacancy *x)
+{
+	fftease_free(x->fft);
+    fftease_free(x->fft2);
+    free(x->fft);
+    free(x->fft2);
+}
+
+void do_vacancy(t_vacancy *x)
+{
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int	
+	i,
+
+	even, odd;
+	float
+	useme,
+	rms = 0.,
+	a1, b1,
+	a2, b2;
+
+	
+	/* dereference structure  */	
+	
+	t_float *bufferOne = fft->buffer;
+	t_float *bufferTwo = fft2->buffer;
+	int N2 = fft->N2;
+	int Nw = fft->Nw;
+	t_float *channelOne = fft->channel;
+	t_float *channelTwo = fft2->channel;
+	t_float *inputOne = fft->input;
+	int invert = x->invert;
+	int useRms = x->useRms;
+	int swapPhase = x->swapPhase;
+	
+
+	
+	if (useRms) {
+		
+		rms = 0.;
+		
+		for ( i=0; i < Nw; i++ )
+			rms += *(inputOne+i) * *(inputOne+i);
+		
+		rms = sqrt( rms / Nw );
+		
+		useme = rms * x->threshold;
+	}
+	
+	else
+		useme = x->threshold;
+	
+	fftease_fold(fft);
+	fftease_fold(fft2);
+	
+	fftease_rdft(fft,FFT_FORWARD);
+	fftease_rdft(fft2,FFT_FORWARD);
+	
+
+	for ( i = 0; i <= N2; i++ ) {
+		
+		odd = ( even = i<<1 ) + 1;
+		
+		a1 = ( i == N2 ? *(bufferOne+1) : *(bufferOne+even) );
+		b1 = ( i == 0 || i == N2 ? 0. : *(bufferOne+odd) );
+		
+		a2 = ( i == N2 ? *(bufferTwo+1) : *(bufferTwo+even) );
+		b2 = ( i == 0 || i == N2 ? 0. : *(bufferTwo+odd) );
+		
+		*(channelOne+even) = hypot( a1, b1 );
+		*(channelOne+odd) = -atan2( b1, a1 );
+		
+		*(channelTwo+even) = hypot( a2, b2 );
+		*(channelTwo+odd) = -atan2( b2, a2 ); 
+	}
+	
+	
+
+
+	if (invert) {
+		
+		if (swapPhase) {
+			
+			for ( i=0; i < N2; i+=2 ) {
+				if ( *(channelOne+i) > useme && *(channelTwo+i) < *(channelOne+i) ) {
+					*(channelOne+i) = *(channelTwo+i);
+					*(channelOne+i+1) = *(channelTwo+i+1);
+				}
+			}
+		}
+		
+		else {
+			
+			for ( i=0; i < N2; i+=2 ) {
+				if ( *(channelOne+i) > useme && *(channelTwo+i) < *(channelOne+i) ) {
+					*(channelOne+i) = *(channelTwo+i);
+					
+					if ( *(channelOne+i+1) == 0. )
+						*(channelOne+i+1) = *(channelTwo+i+1);
+				}
+			}
+		}
+	}
+	
+	else {
+		
+		if (swapPhase) {
+			
+			for ( i=0; i < N2; i+=2 ) {
+				if ( *(channelOne+i) < useme && *(channelTwo+i) > *(channelOne+i) ) {
+					*(channelOne+i) = *(channelTwo+i);
+					*(channelOne+i+1) = *(channelTwo+i+1);
+				}
+			}
+		}
+		
+		else {
+			
+			for ( i=0; i < N2; i+=2 ) {
+				
+				if ( *(channelOne+i) < useme && *(channelTwo+i) > *(channelOne+i) ) {
+					*(channelOne+i) = *(channelTwo+i);
+					
+					if ( *(channelOne+i+1) == 0. )
+						*(channelOne+i+1) = *(channelTwo+i+1);
+				}
+			}
+		}
+	}
+	
+
+	
+	for ( i = 0; i <= N2; i++ ) {
+		
+		odd = ( even = i<<1 ) + 1;
+		
+		*(bufferOne+even) = *(channelOne+even) * cos( *(channelOne+odd) );
+		
+		if ( i != N2 )
+			*(bufferOne+odd) = -(*(channelOne+even)) * sin( *(channelOne+odd) );
+	}
+	
+
+	
+	fftease_rdft(fft,FFT_INVERSE);
+	fftease_overlapadd(fft);
+	
+}
+
+t_int *vacancy_perform(t_int *w)
+{
+	
+	int	
+	i,j;
+	
+	/* get our inlets and outlets */
+	t_vacancy *x = (t_vacancy *) (w[1]);
+	t_float *MSPInputVector1 = (t_float *)(w[2]);
+	t_float *MSPInputVector2 = (t_float *)(w[3]);
+	t_float *vec_threshold = (t_float *)(w[4]);
+	t_float *MSPOutputVector = (t_float *)(w[5]);
+	
+	t_fftease *fft = x->fft;	
+	t_fftease *fft2 = x->fft2;
+	int MSPVectorSize = fft->MSPVectorSize;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalInputVector1 = fft->internalInputVector;
+	t_float *internalInputVector2 = fft2->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	t_float *inputOne = fft->input;
+	t_float  *inputTwo = fft2->input;
+	t_float  *output = fft->output;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float mult = fft->mult;		
+	
+	if(x->mute){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+6;
+	}
+
+	x->threshold = *vec_threshold;
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputOne + (Nw - D), MSPInputVector1, D * sizeof(t_float));
+        memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputTwo + (Nw - D), MSPInputVector2, D * sizeof(t_float));
+        
+		do_vacancy(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw-D), MSPInputVector1 + (D*i), D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw-D), MSPInputVector2 + (D*i), D * sizeof(t_float));
+            
+			do_vacancy(x);
+            
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector1 + (operationCount * MSPVectorSize), MSPInputVector1, MSPVectorSize * sizeof(t_float));
+        memcpy(internalInputVector2 + (operationCount * MSPVectorSize), MSPInputVector2, MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize), MSPVectorSize * sizeof(t_float));
+        
+		operationCount = (operationCount + 1) % operationRepeat;
+        
+        if( operationCount == 0 ) {
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw - D), internalInputVector1, D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw - D), internalInputVector2, D * sizeof(t_float));
+            
+            do_vacancy(x);
+            
+            for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+6;
+}		
+
+void vacancy_dsp(t_vacancy *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    t_fftease *fft = x->fft;
+    t_fftease *fft2 = x->fft2;
+    
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(!samplerate)
+        return;
+    
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+		fft2->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft2);
+	}
+	if(fft->R != samplerate ){
+		fft->R = samplerate;
+        fft2->R = samplerate;
+	}
+    if(reset_required){
+        vacancy_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(vacancy_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec,sp[3]->s_vec);
+    }
+}
diff --git a/externals/fftease/xsyn~.c b/externals/fftease/xsyn~.c
new file mode 100644
index 0000000000000000000000000000000000000000..b5b412b45a3aa159c809b5a12f0dca1ffd717c90
--- /dev/null
+++ b/externals/fftease/xsyn~.c
@@ -0,0 +1,233 @@
+/* Pd 32-bit FFTease 3.0 */
+
+#include "fftease.h"
+
+static t_class *xsyn_class;
+
+#define OBJECT_NAME "xsyn~"
+
+typedef struct _xsyn
+{
+    t_object x_obj;
+    t_float x_f;
+	t_fftease *fft;
+	t_fftease *fft2;
+	short mute;
+} t_xsyn;
+
+void xsyn_dsp(t_xsyn *x, t_signal **sp);
+t_int *xsyn_perform(t_int *w);
+void *xsyn_new(t_symbol *s, int argc, t_atom *argv);
+t_int *offset_perform(t_int *w);
+void xsyn_free( t_xsyn *x );
+void xsyn_init(t_xsyn *x);
+void xsyn_mute(t_xsyn *x, t_floatarg toggle);
+
+void xsyn_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("xsyn~"), (t_newmethod)xsyn_new,
+                  (t_method)xsyn_free,sizeof(t_xsyn), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_xsyn, x_f);
+	class_addmethod(c,(t_method)xsyn_dsp,gensym("dsp"),0);
+	class_addmethod(c,(t_method)xsyn_mute,gensym("mute"),A_FLOAT,0);
+    xsyn_class = c;
+    fftease_announce(OBJECT_NAME);
+}
+
+void xsyn_free( t_xsyn *x )
+{
+    
+	fftease_free(x->fft);
+    free(x->fft);
+    fftease_free(x->fft2);
+    free(x->fft2);
+}
+
+void xsyn_mute(t_xsyn *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;
+}
+
+void *xsyn_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_xsyn *x = (t_xsyn *)pd_new(xsyn_class);
+    t_fftease *fft, *fft2;
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+	x->fft = (t_fftease *) calloc(1,sizeof(t_fftease));
+	x->fft2 = (t_fftease *) calloc(1,sizeof(t_fftease));
+    fft = x->fft;
+    fft2 = x->fft2;
+	fft->initialized = 0;
+	fft2->initialized = 0;
+    
+	fft->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft->winfac = FFTEASE_DEFAULT_WINFAC;
+	fft2->N = FFTEASE_DEFAULT_FFTSIZE;
+	fft2->overlap = FFTEASE_DEFAULT_OVERLAP;
+	fft2->winfac = FFTEASE_DEFAULT_WINFAC;
+	x->mute = 0;
+    if(argc > 0){ fft->N = (int) atom_getfloatarg(0, argc, argv); }
+    if(argc > 1){ fft->overlap = (int) atom_getfloatarg(1, argc, argv); }
+	return x;
+}
+
+void xsyn_init(t_xsyn *x)
+{
+	fftease_init(x->fft);
+	fftease_init(x->fft2);
+}
+
+void do_xsyn(t_xsyn *x)
+{
+    
+    int i;
+    t_fftease *fft = x->fft;
+    t_fftease *fft2 = x->fft2;
+    t_float *channel1 = fft->channel;
+    t_float *channel2 = fft2->channel;
+    int N = fft->N;
+    t_float maxamp;
+    
+	fftease_fold(fft);
+	fftease_fold(fft2);
+    
+	fftease_rdft(fft,FFT_FORWARD);
+	fftease_rdft(fft2,FFT_FORWARD);
+    
+	fftease_leanconvert(fft);
+	fftease_leanconvert(fft2);
+	
+	maxamp = 0;
+    
+	for( i = 0; i < N; i+= 2 ) {
+		if( channel2[i] > maxamp ) {
+			maxamp = channel2[i];
+		}
+	}
+    
+	if( maxamp >  0.000001 ){
+		for( i = 0; i < N; i+= 2 ) {
+			channel1[i] *= (channel2[i] / maxamp );
+		}
+	}
+    
+	fftease_leanunconvert(fft);
+    
+	fftease_rdft(fft,FFT_INVERSE);
+    
+	fftease_overlapadd(fft);
+}
+
+t_int *xsyn_perform(t_int *w)
+{
+    int i,j;
+	t_xsyn *x = (t_xsyn *) (w[1]);
+	t_float *MSPInputVector1 = (t_float *)(w[2]);
+	t_float *MSPInputVector2 = (t_float *)(w[3]);
+	t_float *MSPOutputVector = (t_float *)(w[4]);
+	
+	t_fftease *fft = x->fft;
+	t_fftease *fft2 = x->fft2;
+	int MSPVectorSize = fft->MSPVectorSize;
+	int operationRepeat = fft->operationRepeat;
+	int operationCount = fft->operationCount;
+	t_float *internalInputVector1 = fft->internalInputVector;
+	t_float *internalInputVector2 = fft2->internalInputVector;
+	t_float *internalOutputVector = fft->internalOutputVector;
+	t_float *inputOne = fft->input;
+	t_float *inputTwo = fft2->input;
+	t_float *output = fft->output;
+	int D = fft->D;
+	int Nw = fft->Nw;
+	t_float mult = fft->mult;
+	
+	if(x->mute){
+        for(i=0; i < MSPVectorSize; i++){ MSPOutputVector[i] = 0.0; }
+		return w+5;
+	}
+    
+	if( fft->bufferStatus == EQUAL_TO_MSP_VECTOR ){
+        memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputOne + (Nw - D), MSPInputVector1, D * sizeof(t_float));
+        memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+        memcpy(inputTwo + (Nw - D), MSPInputVector2, D * sizeof(t_float));
+        
+		do_xsyn(x);
+        
+		for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+        memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+        for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+	}
+	else if( fft->bufferStatus == SMALLER_THAN_MSP_VECTOR ) {
+		for( i = 0; i < operationRepeat; i++ ){
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw-D), MSPInputVector1 + (D*i), D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw-D), MSPInputVector2 + (D*i), D * sizeof(t_float));
+            
+			do_xsyn(x);
+            
+			for ( j = 0; j < D; j++ ){ *MSPOutputVector++ = output[j] * mult; }
+            memcpy(output, output + D, (Nw-D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+	}
+	else if( fft->bufferStatus == BIGGER_THAN_MSP_VECTOR ) {
+        memcpy(internalInputVector1 + (operationCount * MSPVectorSize), MSPInputVector1, MSPVectorSize * sizeof(t_float));
+        memcpy(internalInputVector2 + (operationCount * MSPVectorSize), MSPInputVector2, MSPVectorSize * sizeof(t_float));
+        memcpy(MSPOutputVector, internalOutputVector + (operationCount * MSPVectorSize), MSPVectorSize * sizeof(t_float));
+        
+		operationCount = (operationCount + 1) % operationRepeat;
+        
+        if( operationCount == 0 ) {
+            memcpy(inputOne, inputOne + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputOne + (Nw - D), internalInputVector1, D * sizeof(t_float));
+            memcpy(inputTwo, inputTwo + D, (Nw - D) * sizeof(t_float));
+            memcpy(inputTwo + (Nw - D), internalInputVector2, D * sizeof(t_float));
+            
+            do_xsyn(x);
+            
+            for ( j = 0; j < D; j++ ){ internalOutputVector[j] = output[j] * mult; }
+            memcpy(output, output + D, (Nw - D) * sizeof(t_float));
+            for(j = (Nw-D); j < Nw; j++){ output[j] = 0.0; }
+		}
+		fft->operationCount = operationCount;
+	}
+    return w+5;
+}
+
+void xsyn_dsp(t_xsyn *x, t_signal **sp)
+{
+    int reset_required = 0;
+    int maxvectorsize = sys_getblksize();
+    int samplerate = sys_getsr();
+    
+    t_fftease *fft = x->fft;
+    t_fftease *fft2 = x->fft2;
+    
+    if(fft->R != samplerate || fft->MSPVectorSize != maxvectorsize || fft->initialized == 0){
+        reset_required = 1;
+    }
+	if(!samplerate)
+        return;
+    
+	if(fft->MSPVectorSize != maxvectorsize){
+		fft->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft);
+		fft2->MSPVectorSize = maxvectorsize;
+		fftease_set_fft_buffers(fft2);
+	}
+	if(fft->R != samplerate ){
+		fft->R = samplerate;
+        fft2->R = samplerate;
+	}
+    if(reset_required){
+        xsyn_init(x);
+    }
+    if(fftease_msp_sanity_check(fft,OBJECT_NAME)) {
+        dsp_add(xsyn_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec);
+    }
+}
diff --git a/externals/lyonpotpourri b/externals/lyonpotpourri
deleted file mode 160000
index 530895321c94d446577272b3f99e35b2f2076498..0000000000000000000000000000000000000000
--- a/externals/lyonpotpourri
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 530895321c94d446577272b3f99e35b2f2076498
diff --git a/externals/lyonpotpourri/INSTALLATION.txt b/externals/lyonpotpourri/INSTALLATION.txt
new file mode 100755
index 0000000000000000000000000000000000000000..57f862abb0de394b3161830be5269d50bd1e6420
--- /dev/null
+++ b/externals/lyonpotpourri/INSTALLATION.txt
@@ -0,0 +1 @@
+This distribution comes with binaries for both OSX (10.9) and Linux (Ubuntu 64-bit). To install, move folders “lyonpotpourri-externals” and “lyonpotpourri-helpfiles” to a location within your Pd search path. If the shipped externals work with your computer hardware, you are good to go. Otherwise, you will need to recompile the externals by typing “make” in a Terminal window. If on OSX, you need to have the developer tools installed in order to run Make. 
diff --git a/externals/lyonpotpourri/LICENSE.txt b/externals/lyonpotpourri/LICENSE.txt
new file mode 100755
index 0000000000000000000000000000000000000000..5a1ec226f3c27008f3c1fa057b56cebdbd70d47c
--- /dev/null
+++ b/externals/lyonpotpourri/LICENSE.txt
@@ -0,0 +1,23 @@
+LyonPotpourri for Pd
+Copyright (c) 2007-2012 Eric Lyon
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/externals/lyonpotpourri/MSPd.h b/externals/lyonpotpourri/MSPd.h
new file mode 100755
index 0000000000000000000000000000000000000000..ed36b9604822db627cea02886a1ad5fd6c9e917c
--- /dev/null
+++ b/externals/lyonpotpourri/MSPd.h
@@ -0,0 +1,42 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <time.h>
+#include <strings.h>
+#include <string.h>
+
+
+#define LYONPOTPOURRI_MSG "-<LyonPotpourri 3.0>-"
+
+#define NO_FREE_FUNCTION 0
+
+
+/* because Max and Pd have different ideas of what A_FLOAT is, use t_floatarg
+to force consistency. Otherwise functions that look good will fail on some
+hardware. Also note that Pd messages cannot accept arguments of type A_LONG. */
+
+
+#include "m_pd.h"
+// #define t_floatarg float
+#define t_double double
+
+#define atom_getsymarg atom_getsymbolarg
+
+
+#ifndef PIOVERTWO
+#define PIOVERTWO 1.5707963268
+#endif
+#ifndef TWOPI
+#define TWOPI 6.2831853072
+#endif
+#ifndef PI
+#define PI 3.14159265358979
+#endif
+
+/*** MSP helper functions **/
+void atom_arg_getfloat(float *c, long idx, long ac, t_atom *av);
+void atom_arg_getsym(t_symbol **c, long idx, long ac, t_atom *av);
+
+// #define potpourri_announce(objname)  post("( %s )\t%s",objname,LYONPOTPOURRI_MSG)
+
+#define potpourri_announce(objname)  post("%s (  %s  )",LYONPOTPOURRI_MSG,objname)
\ No newline at end of file
diff --git a/externals/lyonpotpourri/Makefile b/externals/lyonpotpourri/Makefile
new file mode 100755
index 0000000000000000000000000000000000000000..a21a8cbebf7561b0d9753280a75700f99b0dc0a2
--- /dev/null
+++ b/externals/lyonpotpourri/Makefile
@@ -0,0 +1,448 @@
+## Pd library template version 1.0.14
+# For instructions on how to use this template, see:
+#  http://puredata.info/docs/developer/MakefileTemplate
+LIBRARY_NAME = lyonpotpourri
+
+# add your .c source files, one object per file, to the SOURCES
+# variable, help files will be included automatically, and for GUI
+# objects, the matching .tcl file too
+SOURCES = adsr~.c bashfest~.c buffet~.c bvplay~.c channel~.c chopper~.c clean_selector~.c click~.c click2bang~.c click2float~.c clickhold~.c distortion~.c dmach~.c expflam~.c flanjah~.c function~.c granola~.c granulesf~.c granule~.c kbuffer~.c killdc~.c magfreq_analysis~.c markov~.c mask~.c oscil~.c phasemod~.c player~.c pulser~.c rtrig~.c samm~.c sigseq~.c vdb~.c vdp~.c waveshape~.c epluribus~.c dynss~.c counter~.c latch~.c sarec~.c convolver~.c npan~.c shoehorn~.c rotapan~.c sel~.c squash~.c windowvec~.c cartopol~.c poltocar~.c arrayfilt~.c splitspec~.c stutter~.c vecdex~.c quadpan~.c splitbank~.c click~.c
+
+# list all pd objects (i.e. myobject.pd) files here, and their helpfiles will
+# be included automatically
+PDOBJECTS = smap.pd
+
+# example patches and related files, in the 'examples' subfolder
+EXAMPLES = BD0010.aif BT0AADA.aiff CP.aif KR55SNAR.aiff hi_c_12b.aiff hi_o_06e.aiff hi_o_15g.aiff kick_11d.aiff mar2.aif prettypad.aif soda-bd.aif trickhit.aif voice.wav
+
+# manuals and related files, in the 'manual' subfolder
+MANUAL = 
+
+# if you want to include any other files in the source and binary tarballs,
+# list them here.  This can be anything from header files, test patches,
+# documentation, etc.  README.txt and LICENSE.txt are required and therefore
+# automatically included
+EXTRA_DIST = MSPd.h PenroseOscil.h PenroseRand.h bashfest.h fftease.h ugens.h
+
+# unit tests and related files here, in the 'unittests' subfolder
+UNITTESTS = 
+
+
+SHARED_SOURCE = bashfest_dsp.c bashfest_helper.c ellipse.c PenroseOscil.c PenroseRand.c bloscbank.c convert.c fft.c fft4.c fftease_setup.c fold.c leanconvert.c leanunconvert.c makewindows.c overlapadd.c power_of_two.c qsortE.c unconvert.c from_msp.c
+SHARED_LIB = lib$(LIBRARY_NAME).$(SHARED_EXTENSION)
+
+#------------------------------------------------------------------------------#
+#
+# things you might need to edit if you are using other C libraries
+#
+#------------------------------------------------------------------------------#
+
+ALL_CFLAGS = -I"$(PD_INCLUDE)"
+ALL_LDFLAGS =  
+SHARED_LDFLAGS =
+ALL_LIBS = 
+
+
+#------------------------------------------------------------------------------#
+#
+# you shouldn't need to edit anything below here, if we did it right :)
+#
+#------------------------------------------------------------------------------#
+
+# these can be set from outside without (usually) breaking the build
+#CFLAGS = -Wall -W -g
+# Skip irritating warnings:
+CFLAGS = -w -g
+LDFLAGS =
+LIBS =
+
+# get library version from meta file
+LIBRARY_VERSION = $(shell sed -n 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' $(LIBRARY_NAME)-meta.pd)
+
+ALL_CFLAGS += -DPD -DVERSION='"$(LIBRARY_VERSION)"'
+
+PD_INCLUDE = $(PD_PATH)/include/pd
+# where to install the library, overridden below depending on platform
+prefix = /usr/local
+libdir = $(prefix)/lib
+pkglibdir = $(libdir)/pd-externals
+objectsdir = $(pkglibdir)
+
+INSTALL = install
+INSTALL_PROGRAM = $(INSTALL) -p -m 644
+INSTALL_DATA = $(INSTALL) -p -m 644
+INSTALL_DIR     = $(INSTALL) -p -m 755 -d
+
+ALLSOURCES := $(SOURCES) $(SOURCES_android) $(SOURCES_cygwin) $(SOURCES_macosx) \
+	         $(SOURCES_iphoneos) $(SOURCES_linux) $(SOURCES_windows)
+
+DISTDIR=$(LIBRARY_NAME)-$(LIBRARY_VERSION)
+ORIGDIR=pd-$(LIBRARY_NAME:~=)_$(LIBRARY_VERSION)
+
+UNAME := $(shell uname -s)
+ifeq ($(UNAME),Darwin)
+  CPU := $(shell uname -p)
+  ifeq ($(CPU),arm) # iPhone/iPod Touch
+    SOURCES += $(SOURCES_iphoneos)
+    EXTENSION = pd_darwin
+    SHARED_EXTENSION = dylib
+    OS = iphoneos
+    PD_PATH = /Applications/Pd-0.47-1.app/Contents/Resources
+    IPHONE_BASE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin
+    CC=$(IPHONE_BASE)/gcc
+    CPP=$(IPHONE_BASE)/cpp
+    CXX=$(IPHONE_BASE)/g++
+    ISYSROOT = -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk
+    IPHONE_CFLAGS = -miphoneos-version-min=3.0 $(ISYSROOT) -arch armv6
+    OPT_CFLAGS = -fast -funroll-loops -fomit-frame-pointer
+    ALL_CFLAGS := $(IPHONE_CFLAGS) $(ALL_CFLAGS)
+    ALL_LDFLAGS += -arch armv6 -bundle -undefined dynamic_lookup $(ISYSROOT)
+    SHARED_LDFLAGS += -arch armv6 -dynamiclib -undefined dynamic_lookup $(ISYSROOT)
+    ALL_LIBS += -lc $(LIBS_iphoneos)
+    STRIP = strip -x
+    DISTBINDIR=$(DISTDIR)-$(OS)
+  else # Mac OS X
+    SOURCES += $(SOURCES_macosx)
+    EXTENSION = pd_darwin
+    SHARED_EXTENSION = dylib
+    OS = macosx
+    PD_PATH = 
+    OPT_CFLAGS = -ftree-vectorize 
+# build universal 32-bit on 10.4 and 32/64 on newer
+    ifeq ($(shell uname -r | sed 's|\([0-9][0-9]*\)\.[0-9][0-9]*\.[0-9][0-9]*|\1|'), 8)
+      FAT_FLAGS = -arch ppc -arch i386 -mmacosx-version-min=10.4
+    else
+      SOURCES += $(SOURCES_iphoneos)
+# Starting with Xcode 4.0, the PowerPC compiler is not installed by default
+      ifeq ($(wildcard /usr/llvm-gcc-4.2/libexec/gcc/powerpc*), )
+        FAT_FLAGS = -arch i386 -arch x86_64 -mmacosx-version-min=10.5
+      else
+        FAT_FLAGS = -arch ppc -arch i386 -arch x86_64 -mmacosx-version-min=10.4
+      endif
+    endif
+    ALL_CFLAGS += $(FAT_FLAGS) -fPIC -I/sw/include
+    # if the 'pd' binary exists, check the linking against it to aid with stripping
+    BUNDLE_LOADER = $(shell test ! -e $(PD_PATH)/bin/pd || echo -bundle_loader $(PD_PATH)/bin/pd)
+    ALL_LDFLAGS += $(FAT_FLAGS) -headerpad_max_install_names -bundle $(BUNDLE_LOADER) \
+	-undefined dynamic_lookup 
+    SHARED_LDFLAGS += $(FAT_FLAGS) -dynamiclib -undefined dynamic_lookup \
+	-install_name @loader_path/$(SHARED_LIB) -compatibility_version 1 -current_version 1.0
+    ALL_LIBS += -lc $(LIBS_macosx)
+    STRIP = strip -x
+    DISTBINDIR=$(DISTDIR)-$(OS)
+# install into ~/Library/Pd on Mac OS X since /usr/local isn't used much
+    pkglibdir=$(HOME)/Library/Pd
+  endif
+endif
+# Tho Android uses Linux, we use this fake uname to provide an easy way to
+# setup all this things needed to cross-compile for Android using the NDK
+ifeq ($(UNAME),ANDROID)
+  CPU := arm
+  SOURCES += $(SOURCES_android)
+  EXTENSION = pd_linux
+  SHARED_EXTENSION = so
+  OS = android
+  PD_PATH = /usr
+  NDK_BASE := /usr/local/android-ndk
+  NDK_PLATFORM_VERSION := 5
+  NDK_SYSROOT=$(NDK_BASE)/platforms/android-$(NDK_PLATFORM_VERSION)/arch-arm
+  NDK_UNAME := $(shell uname -s | tr '[A-Z]' '[a-z]')
+  NDK_TOOLCHAIN_BASE=$(NDK_BASE)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/$(NDK_UNAME)-x86
+  CC := $(NDK_TOOLCHAIN_BASE)/bin/arm-linux-androideabi-gcc --sysroot=$(NDK_SYSROOT)
+  OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer
+  CFLAGS += 
+  LDFLAGS += -rdynamic -shared
+  SHARED_LDFLAGS += -Wl,-soname,$(SHARED_LIB) -shared
+  LIBS += -lc $(LIBS_android)
+  STRIP := $(NDK_TOOLCHAIN_BASE)/bin/arm-linux-androideabi-strip \
+	--strip-unneeded -R .note -R .comment
+  DISTBINDIR=$(DISTDIR)-$(OS)-$(shell uname -m)
+endif
+ifeq ($(UNAME),Linux)
+  CPU := $(shell uname -m)
+  SOURCES += $(SOURCES_linux)
+  EXTENSION = pd_linux
+  SHARED_EXTENSION = so
+  OS = linux
+  PD_PATH = /usr
+  OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer
+  ALL_CFLAGS += -fPIC
+  ALL_LDFLAGS += -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags
+  SHARED_LDFLAGS += -Wl,-soname,$(SHARED_LIB) -shared
+  ALL_LIBS += -lc $(LIBS_linux)
+  STRIP = strip --strip-unneeded -R .note -R .comment
+  DISTBINDIR=$(DISTDIR)-$(OS)-$(shell uname -m)
+endif
+ifeq ($(UNAME),GNU)
+  # GNU/Hurd, should work like GNU/Linux for basically all externals
+  CPU := $(shell uname -m)
+  SOURCES += $(SOURCES_linux)
+  EXTENSION = pd_linux
+  SHARED_EXTENSION = so
+  OS = linux
+  PD_PATH = /usr
+  OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer
+  ALL_CFLAGS += -fPIC
+  ALL_LDFLAGS += -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags
+  SHARED_LDFLAGS += -shared -Wl,-soname,$(SHARED_LIB)
+  ALL_LIBS += -lc $(LIBS_linux)
+  STRIP = strip --strip-unneeded -R .note -R .comment
+  DISTBINDIR=$(DISTDIR)-$(OS)-$(shell uname -m)
+endif
+ifeq ($(UNAME),GNU/kFreeBSD)
+  # Debian GNU/kFreeBSD, should work like GNU/Linux for basically all externals
+  CPU := $(shell uname -m)
+  SOURCES += $(SOURCES_linux)
+  EXTENSION = pd_linux
+  SHARED_EXTENSION = so
+  OS = linux
+  PD_PATH = /usr
+  OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer
+  ALL_CFLAGS += -fPIC
+  ALL_LDFLAGS += -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags
+  SHARED_LDFLAGS += -shared -Wl,-soname,$(SHARED_LIB)
+  ALL_LIBS += -lc $(LIBS_linux)
+  STRIP = strip --strip-unneeded -R .note -R .comment
+  DISTBINDIR=$(DISTDIR)-$(OS)-$(shell uname -m)
+endif
+ifeq (CYGWIN,$(findstring CYGWIN,$(UNAME)))
+  CPU := $(shell uname -m)
+  SOURCES += $(SOURCES_cygwin)
+  EXTENSION = dll
+  SHARED_EXTENSION = dll
+  OS = cygwin
+  PD_PATH = $(shell cygpath $$PROGRAMFILES)/pd
+  OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer
+  ALL_CFLAGS += 
+  ALL_LDFLAGS += -rdynamic -shared -L"$(PD_PATH)/src" -L"$(PD_PATH)/bin"
+  SHARED_LDFLAGS += -shared -Wl,-soname,$(SHARED_LIB)
+  ALL_LIBS += -lc -lpd $(LIBS_cygwin)
+  STRIP = strip --strip-unneeded -R .note -R .comment
+  DISTBINDIR=$(DISTDIR)-$(OS)
+endif
+ifeq (MINGW,$(findstring MINGW,$(UNAME)))
+  CPU := $(shell uname -m)
+  SOURCES += $(SOURCES_windows)
+  EXTENSION = dll
+  SHARED_EXTENSION = dll
+  OS = windows
+  PD_PATH = $(shell cd "$$PROGRAMFILES/pd" && pwd)
+  # MinGW doesn't seem to include cc so force gcc
+  CC=gcc
+  OPT_CFLAGS = -O3 -funroll-loops -fomit-frame-pointer
+  ALL_CFLAGS += -mms-bitfields
+  ALL_LDFLAGS += -s -shared -Wl,--enable-auto-import
+  SHARED_LDFLAGS += -shared
+  ALL_LIBS += -L"$(PD_PATH)/src" -L"$(PD_PATH)/bin" -L"$(PD_PATH)/obj" \
+	-lpd -lwsock32 -lkernel32 -luser32 -lgdi32 $(LIBS_windows)
+  STRIP = strip --strip-unneeded -R .note -R .comment
+  DISTBINDIR=$(DISTDIR)-$(OS)
+endif
+
+# in case somebody manually set the HELPPATCHES above
+HELPPATCHES ?= $(SOURCES:.c=-help.pd) $(PDOBJECTS:.pd=-help.pd)
+
+ALL_CFLAGS := $(ALL_CFLAGS) $(CFLAGS) $(OPT_CFLAGS)
+ALL_LDFLAGS := $(LDFLAGS) $(ALL_LDFLAGS)
+ALL_LIBS := $(LIBS) $(ALL_LIBS)
+
+SHARED_SOURCE ?= $(wildcard lib$(LIBRARY_NAME).c)
+SHARED_HEADER ?= $(shell test ! -e $(LIBRARY_NAME).h || echo $(LIBRARY_NAME).h)
+SHARED_LIB ?= $(SHARED_SOURCE:.c=.$(SHARED_EXTENSION))
+SHARED_TCL_LIB = $(wildcard lib$(LIBRARY_NAME).tcl)
+
+.PHONY = install libdir_install single_install install-doc install-examples install-manual install-unittests clean distclean dist etags $(LIBRARY_NAME)
+
+all: $(SOURCES:.c=.$(EXTENSION)) $(SHARED_LIB)
+
+%.o: %.c
+	$(CC) $(ALL_CFLAGS) -o "$*.o" -c "$*.c"
+
+%.$(EXTENSION): %.o $(SHARED_LIB)
+	$(CC) $(ALL_LDFLAGS) -o "$*.$(EXTENSION)" "$*.o"  $(ALL_LIBS) $(SHARED_LIB)
+	chmod a-x "$*.$(EXTENSION)"
+
+# this links everything into a single binary file
+$(LIBRARY_NAME): $(SOURCES:.c=.o) $(LIBRARY_NAME).o lib$(LIBRARY_NAME).o
+	$(CC) $(ALL_LDFLAGS) -o $(LIBRARY_NAME).$(EXTENSION) $(SOURCES:.c=.o) \
+		$(LIBRARY_NAME).o lib$(LIBRARY_NAME).o $(ALL_LIBS)
+	chmod a-x $(LIBRARY_NAME).$(EXTENSION)
+
+$(SHARED_LIB): $(SHARED_SOURCE:.c=.o)
+	$(CC) $(SHARED_LDFLAGS) -o $(SHARED_LIB) $(SHARED_SOURCE:.c=.o) $(ALL_LIBS)
+
+install: libdir_install
+
+# The meta and help files are explicitly installed to make sure they are
+# actually there.  Those files are not optional, then need to be there.
+libdir_install: $(SOURCES:.c=.$(EXTENSION)) $(SHARED_LIB) install-doc install-examples install-manual install-unittests
+	$(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+	$(INSTALL_DATA) $(LIBRARY_NAME)-meta.pd \
+		$(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+	test -z "$(strip $(SOURCES))" || (\
+		$(INSTALL_PROGRAM) $(SOURCES:.c=.$(EXTENSION)) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME) && \
+		$(STRIP) $(addprefix $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/,$(SOURCES:.c=.$(EXTENSION))))
+	test -z "$(strip $(SHARED_LIB))" || \
+		$(INSTALL_DATA) $(SHARED_LIB) \
+			$(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+	test -z "$(strip $(wildcard $(SOURCES:.c=.tcl)))" || \
+		$(INSTALL_DATA) $(wildcard $(SOURCES:.c=.tcl)) \
+			$(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+	test -z "$(strip $(PDOBJECTS))" || \
+		$(INSTALL_DATA) $(PDOBJECTS) \
+			$(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+	test -z "$(strip $(SHARED_TCL_LIB))" || \
+		$(INSTALL_DATA) $(SHARED_TCL_LIB) \
+			$(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+
+# install library linked as single binary
+single_install: $(LIBRARY_NAME) install-doc install-examples install-manual install-unittests
+	$(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+	$(INSTALL_PROGRAM) $(LIBRARY_NAME).$(EXTENSION) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+	$(STRIP) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/$(LIBRARY_NAME).$(EXTENSION)
+
+install-doc:
+	$(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+	test -z "$(strip $(SOURCES) $(PDOBJECTS))" || \
+		$(INSTALL_DATA) $(HELPPATCHES) \
+			$(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+	$(INSTALL_DATA) README.txt $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/README.txt
+	$(INSTALL_DATA) LICENSE.txt $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/LICENSE.txt
+
+install-examples:
+	test -z "$(strip $(EXAMPLES))" || \
+		$(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/examples && \
+		for file in $(EXAMPLES); do \
+			$(INSTALL_DATA) examples/$$file $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/examples; \
+		done
+
+install-manual:
+	test -z "$(strip $(MANUAL))" || \
+		$(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/manual && \
+		for file in $(MANUAL); do \
+			$(INSTALL_DATA) manual/$$file $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/manual; \
+		done
+
+install-unittests:
+	test -z "$(strip $(UNITTESTS))" || \
+		$(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/unittests && \
+		for file in $(UNITTESTS); do \
+			$(INSTALL_DATA) unittests/$$file $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/unittests; \
+		done
+
+clean:
+	-rm -f -- $(SOURCES:.c=.o) $(SOURCES_LIB:.c=.o) $(SHARED_SOURCE:.c=.o)
+	-rm -f -- $(SOURCES:.c=.$(EXTENSION))
+	-rm -f -- $(LIBRARY_NAME).o
+	-rm -f -- $(LIBRARY_NAME).$(EXTENSION)
+	-rm -f -- $(SHARED_LIB)
+
+distclean: clean
+	-rm -f -- $(DISTBINDIR).tar.gz
+	-rm -rf -- $(DISTBINDIR)
+	-rm -f -- $(DISTDIR).tar.gz
+	-rm -rf -- $(DISTDIR)
+	-rm -f -- $(ORIGDIR).tar.gz
+	-rm -rf -- $(ORIGDIR)
+
+
+$(DISTBINDIR):
+	$(INSTALL_DIR) $(DISTBINDIR)
+
+libdir: all $(DISTBINDIR)
+	$(INSTALL_DATA) $(LIBRARY_NAME)-meta.pd  $(DISTBINDIR)
+	$(INSTALL_DATA) $(SOURCES) $(SHARED_SOURCE) $(SHARED_HEADER) $(DISTBINDIR)
+	$(INSTALL_DATA) $(HELPPATCHES) $(DISTBINDIR)
+	test -z "$(strip $(EXTRA_DIST))" || \
+		$(INSTALL_DATA) $(EXTRA_DIST)    $(DISTBINDIR)
+#	tar --exclude-vcs -czpf $(DISTBINDIR).tar.gz $(DISTBINDIR)
+
+$(DISTDIR):
+	$(INSTALL_DIR) $(DISTDIR)
+
+$(ORIGDIR):
+	$(INSTALL_DIR) $(ORIGDIR)
+
+dist: $(DISTDIR)
+	$(INSTALL_DATA) Makefile  $(DISTDIR)
+	$(INSTALL_DATA) README.txt $(DISTDIR)
+	$(INSTALL_DATA) LICENSE.txt $(DISTDIR)
+	$(INSTALL_DATA) $(LIBRARY_NAME)-meta.pd  $(DISTDIR)
+	test -z "$(strip $(ALLSOURCES))" || \
+		$(INSTALL_DATA) $(ALLSOURCES)  $(DISTDIR)
+	test -z "$(strip $(wildcard $(ALLSOURCES:.c=.tcl)))" || \
+		$(INSTALL_DATA) $(wildcard $(ALLSOURCES:.c=.tcl))  $(DISTDIR)
+	test -z "$(strip $(wildcard $(LIBRARY_NAME).c))" || \
+		$(INSTALL_DATA) $(LIBRARY_NAME).c  $(DISTDIR)
+	test -z "$(strip $(SHARED_HEADER))" || \
+		$(INSTALL_DATA) $(SHARED_HEADER)  $(DISTDIR)
+	test -z "$(strip $(SHARED_SOURCE))" || \
+		$(INSTALL_DATA) $(SHARED_SOURCE)  $(DISTDIR)
+	test -z "$(strip $(SHARED_TCL_LIB))" || \
+		$(INSTALL_DATA) $(SHARED_TCL_LIB)  $(DISTDIR)
+	test -z "$(strip $(PDOBJECTS))" || \
+		$(INSTALL_DATA) $(PDOBJECTS)  $(DISTDIR)
+	test -z "$(strip $(HELPPATCHES))" || \
+		$(INSTALL_DATA) $(HELPPATCHES) $(DISTDIR)
+	test -z "$(strip $(EXTRA_DIST))" || \
+		$(INSTALL_DATA) $(EXTRA_DIST)    $(DISTDIR)
+	test -z "$(strip $(EXAMPLES))" || \
+		$(INSTALL_DIR) $(DISTDIR)/examples && \
+		for file in $(EXAMPLES); do \
+			$(INSTALL_DATA) examples/$$file $(DISTDIR)/examples; \
+		done
+	test -z "$(strip $(MANUAL))" || \
+		$(INSTALL_DIR) $(DISTDIR)/manual && \
+		for file in $(MANUAL); do \
+			$(INSTALL_DATA) manual/$$file $(DISTDIR)/manual; \
+		done
+	test -z "$(strip $(UNITTESTS))" || \
+		$(INSTALL_DIR) $(DISTDIR)/unittests && \
+		for file in $(UNITTESTS); do \
+			$(INSTALL_DATA) unittests/$$file $(DISTDIR)/unittests; \
+		done
+	tar --exclude-vcs -czpf $(DISTDIR).tar.gz $(DISTDIR)
+
+# make a Debian source package
+dpkg-source:
+	debclean
+	make distclean dist
+	mv $(DISTDIR) $(ORIGDIR)
+	tar --exclude-vcs -czpf ../$(ORIGDIR).orig.tar.gz $(ORIGDIR)
+	rm -f -- $(DISTDIR).tar.gz
+	rm -rf -- $(DISTDIR) $(ORIGDIR)
+	cd .. && dpkg-source -b $(LIBRARY_NAME)
+
+etags: TAGS
+
+TAGS: $(wildcard $(PD_INCLUDE)/*.h) $(SOURCES) $(SHARED_SOURCE) $(SHARED_HEADER)
+	etags $(wildcard $(PD_INCLUDE)/*.h)
+	etags -a *.h $(SOURCES) $(SHARED_SOURCE) $(SHARED_HEADER)
+	etags -a --language=none --regex="/proc[ \t]+\([^ \t]+\)/\1/" *.tcl
+
+showsetup:
+	@echo "CC: $(CC)"
+	@echo "CFLAGS: $(CFLAGS)"
+	@echo "LDFLAGS: $(LDFLAGS)"
+	@echo "LIBS: $(LIBS)"
+	@echo "ALL_CFLAGS: $(ALL_CFLAGS)"
+	@echo "ALL_LDFLAGS: $(ALL_LDFLAGS)"
+	@echo "ALL_LIBS: $(ALL_LIBS)"
+	@echo "PD_INCLUDE: $(PD_INCLUDE)"
+	@echo "PD_PATH: $(PD_PATH)"
+	@echo "objectsdir: $(objectsdir)"
+	@echo "LIBRARY_NAME: $(LIBRARY_NAME)"
+	@echo "LIBRARY_VERSION: $(LIBRARY_VERSION)"
+	@echo "SOURCES: $(SOURCES)"
+	@echo "SHARED_HEADER: $(SHARED_HEADER)"
+	@echo "SHARED_SOURCE: $(SHARED_SOURCE)"
+	@echo "SHARED_LIB: $(SHARED_LIB)"
+	@echo "SHARED_TCL_LIB: $(SHARED_TCL_LIB)"
+	@echo "PDOBJECTS: $(PDOBJECTS)"
+	@echo "ALLSOURCES: $(ALLSOURCES)"
+	@echo "ALLSOURCES TCL: $(wildcard $(ALLSOURCES:.c=.tcl))"
+	@echo "UNAME: $(UNAME)"
+	@echo "CPU: $(CPU)"
+	@echo "pkglibdir: $(pkglibdir)"
+	@echo "DISTDIR: $(DISTDIR)"
+	@echo "ORIGDIR: $(ORIGDIR)"
diff --git a/externals/lyonpotpourri/PenroseOscil.c b/externals/lyonpotpourri/PenroseOscil.c
new file mode 100755
index 0000000000000000000000000000000000000000..78cd7b68428b290cee4d6db4f2c2a601047e39e5
--- /dev/null
+++ b/externals/lyonpotpourri/PenroseOscil.c
@@ -0,0 +1,40 @@
+#include <math.h>
+#include "PenroseOscil.h"
+
+
+float frequencyToIncrement( float samplingRate, float frequency, int bufferLength ) {
+
+  return (frequency / samplingRate) * (float) bufferLength;
+} 
+
+void makeSineBuffer( float *buffer, int bufferLength ) {
+  
+  int   i;
+
+  float myTwoPi = 8. * atan(1.);
+
+  for ( i=0; i <= bufferLength; i++ )
+    *(buffer+i) = sin( myTwoPi * ((float) i / (float) bufferLength) );
+
+  return;
+}
+
+
+float bufferOscil( float *phase, float increment, float *buffer,
+                   int bufferLength )
+{
+
+  float sample;
+
+  while ( *phase > bufferLength )
+    *phase -= bufferLength;
+
+  while ( *phase < 0. )
+    *phase += bufferLength;
+
+  sample = *( buffer + (int) (*phase) );
+
+  *phase += increment;
+
+  return sample;
+}
diff --git a/externals/lyonpotpourri/PenroseOscil.h b/externals/lyonpotpourri/PenroseOscil.h
new file mode 100755
index 0000000000000000000000000000000000000000..a47414d21de8d7cf9b10be6888265b8fd2de01e0
--- /dev/null
+++ b/externals/lyonpotpourri/PenroseOscil.h
@@ -0,0 +1,8 @@
+
+float frequencyToIncrement( float samplingRate, float frequency,
+			    int bufferLength );
+
+void makeSineBuffer( float *buffer, int bufferLength );
+
+float bufferOscil( float *phase, float increment, float *buffer,
+                   int bufferLength );
diff --git a/externals/lyonpotpourri/PenroseRand.c b/externals/lyonpotpourri/PenroseRand.c
new file mode 100755
index 0000000000000000000000000000000000000000..98f396e6d580ac0106776de3d420715fdb0a1070
--- /dev/null
+++ b/externals/lyonpotpourri/PenroseRand.c
@@ -0,0 +1,13 @@
+#include "PenroseRand.h"
+
+float rrand(int *seed)
+{
+    int i = ((*seed = *seed * 1103515245 + 12345)>>16) & 077777;
+    return((float)i/16384. - 1.);
+}
+
+float prand(int *seed)
+{
+    int i = ((*seed = *seed * 1103515245 + 12345)>>16) & 077777;
+    return((float)i/32768.);
+}
diff --git a/externals/lyonpotpourri/PenroseRand.h b/externals/lyonpotpourri/PenroseRand.h
new file mode 100755
index 0000000000000000000000000000000000000000..fb06588a638dc8b4516db4872129fa9cb2ecf338
--- /dev/null
+++ b/externals/lyonpotpourri/PenroseRand.h
@@ -0,0 +1,3 @@
+
+float rrand(int *seed);
+float prand(int *seed);
diff --git a/externals/lyonpotpourri/README.md b/externals/lyonpotpourri/README.md
new file mode 100755
index 0000000000000000000000000000000000000000..7f2e92fbefaf01acdebf39d0a0cfd3f03624faa3
--- /dev/null
+++ b/externals/lyonpotpourri/README.md
@@ -0,0 +1,72 @@
+Welcome to LyonPotpourri, version 3.0 (64-bit version).
+
+http://disis.music.vt.edu/eric/LyonSoftware/Pd/LyonPotpourri/
+
+LyonPotpourri is a collection of externals developed for the creation and performance of computer music. The externals were originally developed for Max/MSP, and then extended into hybrid code that could compile for both Max/MSP and Pd. As of version 3.0, the code bases of Max/MSP and Pd have diverged to such an extent that I decided to split the LyonPotpourri code into separate Pd and Max/MSP versions. 
+
+The Pd platform tends toward minimalism. Therefore, it is particularly advantageous for Pd users to become adept at designing their own externals. It is hoped that in addition to the utility of specific externals in this collection, the source code will be helpful for computer musicians who wish to learn how to write their own externals. For further guidance on that subject, please see my book “Designing Audio Objects for Max/MSP and Pd.”
+
+LyonPotpourri 3.0 is Copyright Eric Lyon, 2007-2013, and is covered under the MIT license. Please see the accompanying License file for details. 
+
+
+Object Listing:
+
+- adsr~ a simple ADSR envelope that can be click triggered
+- arrayfilt~ fft-based filtering by drawing into an array
+- bashfest~ a click driven buffer player with randomized DSP
+- buffet~ provides operations on a stored buffer
+- bvplay~ selective playback from a stored buffer with enveloping and increment control
+- cartopol~ convert a spectral frame from cartesian to polar form
+- channel~ access to a precise address in the signal vector
+- chopper~ munging loop playback from a buffer
+- clean_selector~ like selector~ but crossfades when switching channels
+- click~ converts a bang to a click
+- click2float~ translates a signal click to a float message
+- clickhold~ sample and hold a click
+- convolver~ non-real-time convolution with impulses of arbitrary size
+- distortion~ lookup function distortion
+- dmach~ pattern based sample accurate drum machine prototype
+- expflam~ converts a click to an exponential flam click pattern
+- flanjah~ simple flanger
+- function~ write various functions into an array
+- granola~ granular pitch scaling
+- granulesf~ granular synthesis module reading from a soundfile in a buffer
+- granule~ granular synthesis module reading from a stored waveform in a buffer
+- kbuffer~ low sampling rate buffer to capture gestures
+- killdc~ DC block filter
+- latch~ sustain an incoming click with sample-accurate timing
+- magfreq_analysis~ transforms a time domain signal to a magnitude/frequency spectrum
+- markov~ implements a first order Markov chain
+- mask~ a click driven pattern sequencer
+- npan~ power-panning to an arbitrary number of output channels
+- oscil~ oscillator with flexible waveform specification
+- phasemod~ phase modulated waveform
+- player~ click driven buffer player that can sustain multiple iterations
+- poltocar~ convert spectral frame from polar to complex representation
+- pulser~ pulse wave generated by additive synthesis
+- quadpan~ pan an incoming sound within a quadraphonic plane
+- rotapan~ rotate an array of input channels to the same number of output channels
+- rtrig~ generates random click triggers
+- samm~ sample accurate multiple metronomes, with click signal articulation
+- sarec~ sample accurate recording
+- sel~ sample-accurate implementation of the sel algorithm  
+- shoehorn~ collapse from a larger number to a smaller number of audio channels
+- sigseq~ signal level numerical sequencer
+- splitbank~ - split an incoming sound into complementary, independently tunable spectra
+- splitspec~ split an incoming sound into complementary spectra
+- squash~ implementation of a compression algorithm by Chris Penrose
+- stutter~ stuttering playback from an array
+- vdb~ a delay line using an array for storage (no vector limit on feedback delaytime)
+- vdp~ a simple, self-contained delay unit
+- vecdex~ outputs the sample index within the current signal vector 
+- waveshape~ a Chebychev function lookup waveshaper
+- windowvec~ apply a Hann window to the input signal vector
+
+Best wishes for the success of your creative projects and explorations!
+
+Eric Lyon
+ericlyon@vt.edu
+Department of Music
+Institute for Creativity, Arts, and Technology
+Virginia Tech
+# lyonpotpourri3.0
diff --git a/externals/lyonpotpourri/README.txt b/externals/lyonpotpourri/README.txt
new file mode 100755
index 0000000000000000000000000000000000000000..2888613936d95ba54fe9967c347d5e1d7ccaa8ba
--- /dev/null
+++ b/externals/lyonpotpourri/README.txt
@@ -0,0 +1,71 @@
+Welcome to LyonPotpourri, version 3.0 (64-bit version).
+
+http://disis.music.vt.edu/eric/LyonSoftware/Pd/LyonPotpourri/
+
+LyonPotpourri is a collection of externals developed for the creation and performance of computer music. The externals were originally developed for Max/MSP, and then extended into hybrid code that could compile for both Max/MSP and Pd. As of version 3.0, the code bases of Max/MSP and Pd have diverged to such an extent that I decided to split the LyonPotpourri code into separate Pd and Max/MSP versions. 
+
+The Pd platform tends toward minimalism. Therefore, it is particularly advantageous for Pd users to become adept at designing their own externals. It is hoped that in addition to the utility of specific externals in this collection, the source code will be helpful for computer musicians who wish to learn how to write their own externals. For further guidance on that subject, please see my book “Designing Audio Objects for Max/MSP and Pd.”
+
+LyonPotpourri 3.0 is Copyright Eric Lyon, 2007-2013, and is covered under the MIT license. Please see the accompanying License file for details. 
+
+
+Object Listing:
+
+- adsr~ a simple ADSR envelope that can be click triggered
+- arrayfilt~ fft-based filtering by drawing into an array
+- bashfest~ a click driven buffer player with randomized DSP
+- buffet~ provides operations on a stored buffer
+- bvplay~ selective playback from a stored buffer with enveloping and increment control
+- cartopol~ convert a spectral frame from cartesian to polar form
+- channel~ access to a precise address in the signal vector
+- chopper~ munging loop playback from a buffer
+- clean_selector~ like selector~ but crossfades when switching channels
+- click~ converts a bang to a click
+- click2float~ translates a signal click to a float message
+- clickhold~ sample and hold a click
+- convolver~ non-real-time convolution with impulses of arbitrary size
+- distortion~ lookup function distortion
+- dmach~ pattern based sample accurate drum machine prototype
+- expflam~ converts a click to an exponential flam click pattern
+- flanjah~ simple flanger
+- function~ write various functions into an array
+- granola~ granular pitch scaling
+- granulesf~ granular synthesis module reading from a soundfile in a buffer
+- granule~ granular synthesis module reading from a stored waveform in a buffer
+- kbuffer~ low sampling rate buffer to capture gestures
+- killdc~ DC block filter
+- latch~ sustain an incoming click with sample-accurate timing
+- magfreq_analysis~ transforms a time domain signal to a magnitude/frequency spectrum
+- markov~ implements a first order Markov chain
+- mask~ a click driven pattern sequencer
+- npan~ power-panning to an arbitrary number of output channels
+- oscil~ oscillator with flexible waveform specification
+- phasemod~ phase modulated waveform
+- player~ click driven buffer player that can sustain multiple iterations
+- poltocar~ convert spectral frame from polar to complex representation
+- pulser~ pulse wave generated by additive synthesis
+- quadpan~ pan an incoming sound within a quadraphonic plane
+- rotapan~ rotate an array of input channels to the same number of output channels
+- rtrig~ generates random click triggers
+- samm~ sample accurate multiple metronomes, with click signal articulation
+- sarec~ sample accurate recording
+- sel~ sample-accurate implementation of the sel algorithm  
+- shoehorn~ collapse from a larger number to a smaller number of audio channels
+- sigseq~ signal level numerical sequencer
+- splitbank~ - split an incoming sound into complementary, independently tunable spectra
+- splitspec~ split an incoming sound into complementary spectra
+- squash~ implementation of a compression algorithm by Chris Penrose
+- stutter~ stuttering playback from an array
+- vdb~ a delay line using an array for storage (no vector limit on feedback delaytime)
+- vdp~ a simple, self-contained delay unit
+- vecdex~ outputs the sample index within the current signal vector 
+- waveshape~ a Chebychev function lookup waveshaper
+- windowvec~ apply a Hann window to the input signal vector
+
+Best wishes for the success of your creative projects and explorations!
+
+Eric Lyon
+ericlyon@vt.edu
+Department of Music
+Institute for Creativity, Arts, and Technology
+Virginia Tech
diff --git a/externals/lyonpotpourri/Updates.txt b/externals/lyonpotpourri/Updates.txt
new file mode 100755
index 0000000000000000000000000000000000000000..291cb7a41838963fd1181994ee4d34576b30dbd7
--- /dev/null
+++ b/externals/lyonpotpourri/Updates.txt
@@ -0,0 +1,4 @@
+Updates to LyonPotpourri 3.0
+
+12.22.2013
+Nothing yet!
\ No newline at end of file
diff --git a/externals/lyonpotpourri/adsr~-help.pd b/externals/lyonpotpourri/adsr~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..0ca845b3e9bb9b9f0b9df6e4f7789169ac3822c3
--- /dev/null
+++ b/externals/lyonpotpourri/adsr~-help.pd
@@ -0,0 +1,73 @@
+#N canvas 487 392 455 385 10;
+#X obj 115 233 adsr~;
+#X msg 115 94 bang;
+#X obj 35 187 osc~ 400;
+#X obj 97 274 *~;
+#X obj 97 304 *~ 0.1;
+#X obj 97 335 dac~;
+#X msg 175 112 10 50 50 50;
+#X text 254 115 adsr data as list;
+#X msg 182 137 100 50 100 500;
+#X obj 175 90 loadbang;
+#N canvas 0 22 673 325 individual-adsr-elements 0;
+#X obj 62 244 outlet;
+#X msg 62 158 set_a \$1;
+#X msg 135 159 set_d \$1;
+#X msg 210 158 set_s \$1;
+#X msg 283 159 set_r \$1;
+#X msg 353 159 set_gain1 \$1;
+#X msg 451 160 set_gain2 \$1;
+#X obj 353 110 vsl 15 30 0 1 0 0 empty empty empty 0 -8 0 8 -242048
+-1 -1 2900 1;
+#X obj 451 109 vsl 15 30 0 1 0 0 empty empty empty 0 -8 0 8 -242048
+-1 -1 2030 1;
+#X obj 62 106 vsl 15 30 1 100 0 0 empty empty empty 0 -8 0 8 -242048
+-1 -1 1435 1;
+#X obj 135 110 vsl 15 30 10 100 0 0 empty empty empty 0 -8 0 8 -242048
+-1 -1 1289 1;
+#X obj 210 107 vsl 15 30 50 500 0 0 empty empty empty 0 -8 0 8 -242048
+-1 -1 967 1;
+#X obj 283 109 vsl 15 30 50 1000 0 0 empty empty empty 0 -8 0 8 -242048
+-1 -1 458 1;
+#X msg 62 40 50 50 200 200 1 0.7;
+#X obj 62 64 unpack f f f f f f;
+#X obj 62 16 loadbang;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 7 0 5 0;
+#X connect 8 0 6 0;
+#X connect 9 0 1 0;
+#X connect 10 0 2 0;
+#X connect 11 0 3 0;
+#X connect 12 0 4 0;
+#X connect 13 0 14 0;
+#X connect 14 0 9 0;
+#X connect 14 1 10 0;
+#X connect 14 2 11 0;
+#X connect 14 3 12 0;
+#X connect 14 4 7 0;
+#X connect 14 5 8 0;
+#X connect 15 0 13 0;
+#X restore 194 163 pd individual-adsr-elements;
+#X obj 205 200 samm~ 40 1;
+#X text 30 39 adsr~ - An ADSR envelope triggered by signal clicks or
+bangs;
+#X obj 26 4 cnv 15 155 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 111 74 trigger ADSR;
+#X text 273 197 slow click metronome;
+#X connect 0 0 3 1;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 4 0 5 1;
+#X connect 6 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 6 0;
+#X connect 10 0 0 0;
+#X connect 11 0 0 0;
diff --git a/externals/lyonpotpourri/adsr~.c b/externals/lyonpotpourri/adsr~.c
new file mode 100755
index 0000000000000000000000000000000000000000..467187dd978cfad856265984cb5e678a9dc6252b
--- /dev/null
+++ b/externals/lyonpotpourri/adsr~.c
@@ -0,0 +1,334 @@
+#include "MSPd.h"
+/* internal metronome now redundant so disabled */
+// LyonPotpourri 3.0 - Max references removed
+
+
+static t_class *adsr_class;
+
+#define OBJECT_NAME "adsr~"
+
+typedef struct _adsr
+{
+	t_object x_obj;
+	float x_f;
+	// Variables Here
+	float a;
+	float d;
+	float s;
+	float r;
+	int ebreak1;
+	int ebreak2;
+	int ebreak3;
+	int asamps;
+	int dsamps;
+	int ssamps;
+	int rsamps;
+	int asamps_last;
+	int dsamps_last;
+	int ssamps_last;
+	int rsamps_last;
+	float tempo;
+	float egain1;
+	float egain2;
+	int tempomode;
+	int beat_subdiv;
+	int tsamps;
+	int counter;
+	float srate;
+	short manual_override;
+	float click_gain; // input click sets volume too
+	short mute;
+} t_adsr;
+
+static void *adsr_new(t_symbol *s, int argc, t_atom *argv);
+
+t_int *adsr_perform(t_int *w);
+void adsr_dsp(t_adsr *x, t_signal **sp);
+void adsr_assist(t_adsr *x, void *b, long m, long a, char *s);
+void adsr_bang(t_adsr *x);
+void adsr_manual_override(t_adsr *x, t_floatarg toggle);
+void adsr_list (t_adsr *x, t_atom *msg, short argc, t_atom *argv);
+void adsr_tempomode(t_adsr *x, t_atom *msg, short argc, t_atom *argv);
+void adsr_set_a(t_adsr *x, t_floatarg f);
+void adsr_set_d(t_adsr *x, t_floatarg f);
+void adsr_set_s(t_adsr *x, t_floatarg f);
+void adsr_set_r(t_adsr *x, t_floatarg f);
+void adsr_set_gain1(t_adsr *x, t_floatarg f);
+void adsr_set_gain2(t_adsr *x, t_floatarg f);
+void set_tempo(t_adsr *x, t_floatarg f);
+void adsr_mute(t_adsr *x, t_floatarg f);
+
+void atom_arg_getfloat(float *c, long idx, long ac, t_atom *av);
+void atom_arg_getsym(t_symbol **c, long idx, long ac, t_atom *av);
+
+void adsr_tilde_setup(void){
+	adsr_class = class_new(gensym("adsr~"), (t_newmethod)adsr_new, 
+						   0,sizeof(t_adsr), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(adsr_class, t_adsr, x_f);
+	class_addmethod(adsr_class,(t_method)adsr_dsp,gensym("dsp"),0);
+	class_addmethod(adsr_class,(t_method)adsr_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(adsr_class,(t_method)adsr_list,gensym("list"),A_GIMME,0);
+	class_addmethod(adsr_class,(t_method)adsr_set_a,gensym("set_a"),A_FLOAT,0);
+	class_addmethod(adsr_class,(t_method)adsr_set_d,gensym("set_d"),A_FLOAT,0);
+	class_addmethod(adsr_class,(t_method)adsr_set_s,gensym("set_s"),A_FLOAT,0);
+	class_addmethod(adsr_class,(t_method)adsr_set_r,gensym("set_r"),A_FLOAT,0);
+	class_addmethod(adsr_class,(t_method)adsr_set_gain1,gensym("set_gain1"),A_FLOAT,0);
+	class_addmethod(adsr_class,(t_method)adsr_set_gain2,gensym("set_gain2"),A_FLOAT,0);
+	class_addbang(adsr_class,(t_method)adsr_bang);
+	potpourri_announce(OBJECT_NAME);
+}
+
+
+void adsr_mute(t_adsr *x, t_floatarg f)
+{
+    x->mute = (short)f;
+}
+
+void adsr_set_gain1(t_adsr *x, t_floatarg f)
+{
+	x->egain1 = f;
+	return;
+}
+
+void adsr_set_gain2(t_adsr *x, t_floatarg f)
+{
+	x->egain2 = f;
+	return;
+}
+void adsr_bang(t_adsr *x) {
+	x->counter = 0;
+	return;
+}
+void adsr_set_a(t_adsr *x, t_floatarg f)
+{
+	
+	f /= 1000.0;
+	
+	x->a = f;
+	x->asamps = x->a * x->srate;
+	
+	if( x->tempomode) {
+		x->rsamps = x->tsamps - (x->asamps+x->dsamps+x->ssamps);	
+		if( x->rsamps < 0 ) {
+			x->rsamps = 0;
+		}
+	} else {	
+		x->tsamps = x->asamps+x->dsamps+x->ssamps+x->rsamps;
+	}
+	x->ebreak1 = x->asamps;
+	x->ebreak2 = x->asamps+x->dsamps;
+	x->ebreak3 = x->asamps+x->dsamps+x->ssamps;
+	return ;
+}
+
+void adsr_set_d(t_adsr *x, t_floatarg f)
+{
+	f /= 1000.0 ;
+	
+	x->d = f;
+	x->dsamps = x->d * x->srate;
+	
+	if( x->tempomode) {
+		x->rsamps = x->tsamps - (x->asamps+x->dsamps+x->ssamps);	
+		if( x->rsamps < 0 ) {
+			x->rsamps = 0;
+		}
+	} else {	
+		x->tsamps = x->asamps+x->dsamps+x->ssamps+x->rsamps;
+	}
+	x->ebreak2 = x->asamps+x->dsamps;
+	x->ebreak3 = x->asamps+x->dsamps+x->ssamps;
+	return ;
+}
+
+void adsr_set_s(t_adsr *x, t_floatarg f)
+{
+	
+	f /= 1000.0;
+	
+	x->s = f;
+	x->ssamps = x->s * x->srate;
+	
+	if( x->tempomode) {
+		x->rsamps = x->tsamps - (x->asamps+x->dsamps+x->ssamps);	
+		if( x->rsamps < 0 ) {
+			x->rsamps = 0;
+		}
+	} else {	
+		x->tsamps = x->asamps+x->dsamps+x->ssamps+x->rsamps;
+	}
+	
+	x->ebreak3 = x->asamps+x->dsamps+x->ssamps;
+	return ;
+}
+
+void adsr_set_r(t_adsr *x, t_floatarg f)
+{
+	
+	f /= 1000.0;
+	
+	if( x->tempomode) {
+		return;
+	} else {	
+		x->r = f;
+		x->rsamps = x->r * x->srate;		
+		x->tsamps = x->asamps+x->dsamps+x->ssamps+x->rsamps;
+	}
+	
+	return ;
+}
+
+void adsr_list (t_adsr *x, t_atom *msg, short argc, t_atom *argv)
+{
+    t_atom *fraud; // make compiler happy
+    fraud = msg;
+	x->rsamps = x->tsamps - (x->asamps+x->dsamps+x->ssamps);	
+	if( x->rsamps < 0 ) 
+		x->rsamps = 0;
+	
+	x->a = (atom_getfloatarg(0,argc,argv)) * .001;
+	x->d = (atom_getfloatarg(1,argc,argv)) * .001;
+	x->s = (atom_getfloatarg(2,argc,argv)) * .001;
+	x->r = (atom_getfloatarg(3,argc,argv)) * .001;
+	
+	x->asamps = x->a * x->srate;
+	x->dsamps = x->d * x->srate;
+	x->ssamps = x->s * x->srate;
+	x->rsamps = x->r * x->srate;
+	
+	
+    x->tsamps = x->asamps+x->dsamps+x->ssamps+x->rsamps;
+    x->ebreak1 = x->asamps;
+    x->ebreak2 = x->asamps+x->dsamps;
+    x->ebreak3 = x->asamps+x->dsamps+x->ssamps;
+	
+}
+
+static void *adsr_new(t_symbol *s, int argc, t_atom *argv)
+{
+
+	t_adsr *x = (t_adsr *)pd_new(adsr_class);
+    t_symbol *fraud; // make compiler happy
+    fraud = s;
+	outlet_new(&x->x_obj, gensym("signal"));
+	
+   
+	x->srate = sys_getsr();
+	if(!x->srate){
+		error("zero sampling rate, setting to 44100");
+		x->srate = 44100;
+	}
+	
+	x->a = 10;
+	x->d = 50;
+	x->s = 100;
+	x->r = 100;
+	x->egain1 = .7;
+	x->egain2 = .1;
+	atom_arg_getfloat(&x->a,0,argc,argv);
+	atom_arg_getfloat(&x->d,1,argc,argv);
+	atom_arg_getfloat(&x->s,2,argc,argv);
+	atom_arg_getfloat(&x->r,3,argc,argv);
+	atom_arg_getfloat(&x->egain1,4,argc,argv);
+	atom_arg_getfloat(&x->egain2,5,argc,argv);
+
+	x->a *= .001;
+	x->d *= .001;
+	x->s *= .001;
+	x->r *= .001;
+	
+	x->asamps = x->a * x->srate;
+	x->dsamps = x->d * x->srate;
+	x->ssamps = x->s * x->srate;
+	x->rsamps = x->r * x->srate;
+	x->tsamps = x->asamps+x->dsamps+x->ssamps+x->rsamps;
+	x->ebreak1 = x->asamps;
+	x->ebreak2 = x->asamps+x->dsamps;
+	x->ebreak3 = x->asamps+x->dsamps+x->ssamps;
+
+	x->counter = 0;
+	x->click_gain = 0.0;
+	x->mute = 0;
+	return x;
+}
+
+t_int *adsr_perform(t_int *w)
+{
+	t_adsr *x = (t_adsr *) (w[1]);
+	t_float *in = (t_float *)(w[2]);
+	t_float *out = (t_float *)(w[3]);
+	int  n = (int) w[4];
+	int tsamps = x->tsamps;
+	int counter = x->counter;
+	int ebreak1 = x->ebreak1;
+	int ebreak2 = x->ebreak2;
+	int ebreak3 = x->ebreak3;
+	float egain1 = x->egain1;
+	float egain2 = x->egain2;
+	int asamps = x->asamps;
+	int dsamps = x->dsamps;
+	int ssamps = x->ssamps;
+	int rsamps = x->rsamps;
+	//  short manual_override = x->manual_override;
+	float click_gain = x->click_gain;
+	float etmp;
+	float env_val;
+	float input_val;
+	/*********************************************/	
+	if(x->mute){
+		while(n--) *out++ = 0.0; 
+		return w+5;
+	}
+	while(n--) {
+		input_val = *in++;
+		if(input_val){
+			click_gain = input_val;
+			counter = 0;
+		}
+		
+		
+		if( counter < ebreak1 ){
+			env_val = (float) counter / (float) asamps;
+		} else if (counter < ebreak2) {
+			etmp = (float) (counter - ebreak1) / (float) dsamps;
+			env_val = (1.0 - etmp) + (egain1 * etmp);
+		} else if (counter < ebreak3) {
+			etmp = (float) (counter - ebreak2) / (float) ssamps;
+			env_val = (egain1 * (1.0 - etmp)) + (egain2 * etmp);
+		} else if( counter < tsamps ){
+			env_val = ((float)(tsamps-counter)/(float)rsamps) * egain2 ;
+		} else {
+			env_val = 0.0;
+		}
+		if(click_gain && env_val && (click_gain != 1.0) ){
+			env_val *= click_gain;
+		}
+		*out++ = env_val;
+		if(counter < tsamps)
+			counter++;
+	}
+	x->counter = counter;
+	x->click_gain = click_gain;
+	return (w+5);
+}		
+
+void adsr_dsp(t_adsr *x, t_signal **sp)
+{
+	if(x->srate != sp[0]->s_sr ){
+		x->srate = sp[0]->s_sr;
+		x->asamps = x->a * x->srate;
+		x->dsamps = x->d * x->srate;
+		x->ssamps = x->s * x->srate;
+		x->rsamps = x->r * x->srate;
+		x->tsamps = x->asamps+x->dsamps+x->ssamps+x->rsamps;
+		x->ebreak1 = x->asamps;
+		x->ebreak2 = x->asamps+x->dsamps;
+		x->ebreak3 = x->asamps+x->dsamps+x->ssamps;
+		x->counter = 0;	
+	}
+	dsp_add(adsr_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
+}
+
+
+
+
diff --git a/externals/lyonpotpourri/arrayfilt~-help.pd b/externals/lyonpotpourri/arrayfilt~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..c1718787041133aef0ff146ebe21d51f3c25870a
--- /dev/null
+++ b/externals/lyonpotpourri/arrayfilt~-help.pd
@@ -0,0 +1,145 @@
+#N canvas 814 114 449 293 10;
+#X obj 31 238 dac~;
+#X obj 31 81 noise~;
+#X text 32 36 arrayfilt~ filters a sound with the contents of an array
+\, so that filters can be drawn by hand;
+#X floatatom 70 144 5 0 0 0 gain - -, f 5;
+#X obj 31 178 *~ 0.05;
+#N canvas 172 134 1229 589 array-fft-block 0;
+#X obj 121 66 inlet~;
+#X obj 122 415 outlet~;
+#X obj 121 98 windowvec~;
+#X obj 121 136 rfft~, f 6;
+#X obj 187 464 block~ 1024 8;
+#X obj 121 171 cartopol~;
+#X obj 122 289 poltocar~;
+#X obj 122 319 rifft~;
+#X obj 122 382 windowvec~;
+#X obj 122 349 *~ 0;
+#X obj 290 185 *;
+#X msg 242 107 1 1024 8;
+#X obj 242 138 unpack f f f;
+#X obj 242 217 /;
+#X floatatom 242 249 12 0 0 0 - - -, f 12;
+#X text 323 250 rescale factor;
+#X obj 242 76 loadbang;
+#N canvas 0 22 450 278 (subpatch) 0;
+#X array arrayfilt1 513 float 3;
+#A 0 0.95 0.935714 0.914285 0.909523 0.921429 0.921429 0.921429 0.921429
+0.921429 0.921429 0.914286 0.907143 0.889286 0.885714 0.871429 0.850001
+0.842858 0.840477 0.838096 0.835715 0.832143 0.835714 0.835714 0.835714
+0.835714 0.835714 0.835714 0.835714 0.835714 0.835714 0.835714 0.835714
+0.835714 0.835714 0.842857 0.842857 0.753574 0.757146 0.760717 0.764289
+0.764289 0.764289 0.764289 0.764289 0.764289 0.764289 0.764289 0.757146
+0.757146 0.752384 0.747622 0.74286 0.74286 0.74286 0.74286 0.74286
+0.74286 0.737503 0.732146 0.726788 0.721431 0.714288 0.700002 0.69524
+0.690479 0.685717 0.664288 0.642859 0.624492 0.606124 0.587757 0.569389
+0.551022 0.532654 0.514287 0.428572 0.271429 0.271429 0.271429 0.271429
+0.271429 0.271429 0.271429 0.271429 0.271429 0.265714 0.26 0.254286
+0.248571 0.242857 0.235714 0.228571 0.214285 0.2 0.178571 0.171428
+0.160714 0.114285 0.107142 0.0571415 0.021427 0.0178556 0.0142841 0.00714123
+0.00714123 0.00714123 0.00714123 0.00714123 0.00714123 0.00714123 0.00624837
+0.00535551 0.00446264 0.00356978 0.00267692 0.00178406 0.000891194
+-1.66893e-06 -1.66893e-06 -1.66893e-06 -1.66893e-06 -1.66893e-06 -1.66893e-06
+-1.66893e-06 -1.66893e-06 -1.66893e-06 -1.66893e-06 -1.66893e-06 -1.66893e-06
+-1.66893e-06 -1.66893e-06 -1.66893e-06 -1.66893e-06 -1.66893e-06 -1.66893e-06
+-1.66893e-06 -1.66893e-06 -1.66893e-06 -1.66893e-06 -1.66893e-06 -1.66893e-06
+-1.66893e-06 -1.66893e-06 -1.66893e-06 -1.66893e-06 -1.66893e-06 -1.66893e-06
+-1.66893e-06 0.00714123 0.00714123 0.00714123 0.00714123 0.00714123
+0.00714123 0.00714123 0.00714123 0.00714123 0.0142841 0.0142841 0.0142841
+0.0178556 0.021427 0.021427 0.0285699 0.0285699 0.0321414 0.0357128
+0.0357128 0.0428557 0.0428557 0.0428557 0.0428557 0.0428557 0.0428557
+0.0428557 0.0428557 0.0428557 0.0428557 0.0285714 0.0285714 0.0285714
+0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714
+0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714
+0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714
+0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714
+0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714
+0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714
+0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714
+0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714
+0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714
+0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714
+0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714
+0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714
+0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714
+0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714
+0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0285714
+0.0285714 0.0285714 0.0285714 0.0285714 0.0285714 0.0290476 0.0295238
+0.03 0.0304762 0.0309524 0.0314286 0.0319048 0.032381 0.0328572 0.0333334
+0.0338096 0.0342858 0.0347619 0.0352381 0.0357143 0.0357143 0.0357143
+0.0357143 0.0357143 0.0357143 0.0357143 0.0357143 0.0357143 0.0363637
+0.037013 0.0376624 0.0383117 0.0389611 0.0396105 0.0402598 0.0409092
+0.0415585 0.0422079 0.0428572 0.0464287 0.0500001 0.0500001 0.0500001
+0.0500001 0.0500001 0.0500001 0.0500001 0.0500001 0.0517859 0.0535716
+0.0553573 0.057143 0.0607145 0.0642859 0.0642859 0.0642859 0.0642859
+0.0642859 0.0642859 0.0642859 0.0642859 0.0642859 0.0642859 0.0642859
+0.0642859 0.0642859 0.0660717 0.0678574 0.0696431 0.0714288 0.0726193
+0.0738098 0.0750003 0.0761908 0.0773813 0.0785717 0.0785717 0.0785717
+0.0785717 0.0785717 0.0785717 0.0785717 0.0785717 0.0785717 0.0797622
+0.0809527 0.0821432 0.0833337 0.0845242 0.0857146 0.086364 0.0870133
+0.0876627 0.088312 0.0889614 0.0896108 0.0902601 0.0909095 0.0915588
+0.0922082 0.0928575 0.0935069 0.0941562 0.0948056 0.095455 0.0961043
+0.0967537 0.097403 0.0980524 0.0987017 0.0993511 0.1 0.1 0.1 0.1 0.1
+0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
+0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
+0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
+0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.0928575 0.0928575
+0.0928575 0.0928575 0.0928575 0.0928575 0.0928575 0.0928575 0.0928575
+0.0928575 0.0928575 0.0928575 0.0928575 0.0928575 0.0928575 0.0928575
+0.0928575 0.0928575 0.0928575 0.0928575 0.0928575 0.0928575 0.0928575
+0.0928575 0.0928575 0.0928575 0.0928575 0.0928575 0.0928575 0.0928575
+0.0928575 0.0928575 0.0928575 0.0928575 0.0928575 0.0928575 0.0928575
+0.0928575 0.0928575 0.0928575 0.0928575 0.0928575 0.0928575 0.0928575
+0.0928575 1 1;
+#X coords 0 1 513 0 400 140 1 0 0;
+#X restore 525 133 graph;
+#X msg 428 432 \; arrayfilt1 const 0;
+#X obj 678 443 tabwrite arrayfilt1;
+#X msg 678 363 1 \$1;
+#X obj 678 400 unpack f f;
+#X floatatom 678 324 5 0 0 0 - - -, f 5;
+#X text 715 323 set a range of bin gains to 1;
+#X text 549 437 zero out array;
+#X obj 77 227 arrayfilt~ arrayfilt1;
+#X text 644 102 Size the filter to (FFT size / 2) + 1;
+#X text 879 103 in this case \, 513;
+#X text 934 214 draw into array to change filter properties;
+#X text 542 475 flat response;
+#X msg 427 469 \; arrayfilt1 const 1;
+#X text 120 444 set FFT size to 1024 \, with an overlap of 8;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 5 0;
+#X connect 3 1 5 1;
+#X connect 5 0 25 0;
+#X connect 5 1 25 1;
+#X connect 6 0 7 0;
+#X connect 6 1 7 1;
+#X connect 7 0 9 0;
+#X connect 8 0 1 0;
+#X connect 9 0 8 0;
+#X connect 10 0 13 1;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 12 1 10 0;
+#X connect 12 2 10 1;
+#X connect 13 0 14 0;
+#X connect 14 0 9 1;
+#X connect 16 0 11 0;
+#X connect 20 0 21 0;
+#X connect 21 0 19 0;
+#X connect 21 1 19 1;
+#X connect 22 0 20 0;
+#X connect 25 0 6 0;
+#X connect 25 1 6 1;
+#X restore 31 113 pd array-fft-block;
+#X obj 26 4 cnv 15 155 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 79 224 A demonstration of using fft primitives with a simple
+external that operates on bin magnitudes;
+#X connect 1 0 5 0;
+#X connect 3 0 4 1;
+#X connect 4 0 0 0;
+#X connect 4 0 0 1;
+#X connect 5 0 4 0;
diff --git a/externals/lyonpotpourri/arrayfilt~.c b/externals/lyonpotpourri/arrayfilt~.c
new file mode 100755
index 0000000000000000000000000000000000000000..01f17fc7add921df67827daf014d93baa24fee41
--- /dev/null
+++ b/externals/lyonpotpourri/arrayfilt~.c
@@ -0,0 +1,90 @@
+#include "MSPd.h"
+
+static t_class *arrayfilt_class;
+
+/* Pd version of arrayfilt~ */
+
+#define OBJECT_NAME "arrayfilt~"
+typedef struct _arrayfilt
+{
+	t_object x_obj;
+    t_float x_f;
+    t_word *a_samples;
+    int a_frames;
+    t_symbol *arrayname;
+} t_arrayfilt;
+
+void *arrayfilt_new(t_symbol *msg, short argc, t_atom *argv);
+void arrayfilt_dsp(t_arrayfilt *x, t_signal **sp);
+void arrayfilt_setarray(t_arrayfilt *x);
+
+void arrayfilt_tilde_setup(void){
+    arrayfilt_class = class_new(gensym("arrayfilt~"), (t_newmethod)arrayfilt_new,
+                              0, sizeof(t_arrayfilt),0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(arrayfilt_class, t_arrayfilt, x_f);
+    class_addmethod(arrayfilt_class, (t_method)arrayfilt_dsp, gensym("dsp"),0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+void *arrayfilt_new(t_symbol *msg, short argc, t_atom *argv)
+{
+	t_arrayfilt *x = (t_arrayfilt *)pd_new(arrayfilt_class);
+    // t_symbol *arrayname;
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+    x->arrayname = atom_getsymbolarg(0, argc, argv);
+    arrayfilt_setarray(x);
+	return x;
+}
+
+void arrayfilt_setarray(t_arrayfilt *x)
+{
+    t_garray *a;
+    t_symbol *arrayname = x->arrayname;
+	if (!(a = (t_garray *)pd_findbyclass(arrayname, garray_class))) {
+		if (*arrayname->s_name) pd_error(x, "arrayflt~: %s: no such array", arrayname->s_name);
+    }
+	else  {
+		garray_usedindsp(a);
+        if (!garray_getfloatwords(a, &x->a_frames, &x->a_samples))
+        {
+            pd_error(x, "%s: bad template for player~", arrayname->s_name);
+        }
+	}
+}
+
+t_int *arrayfilt_perform(t_int *w)
+{
+    int i;
+    t_arrayfilt *x = (t_arrayfilt *) w[1];
+    t_float *mag_in = (t_float *) w[2];
+    t_float *phase_in = (t_float *) w[3];
+    t_float *mag_out = (t_float *) w[4];
+    t_float *phase_out = (t_float *) w[5];
+    t_float mag, phase;
+    t_word *a_samples = x->a_samples;
+    int a_frames = x->a_frames;
+    int n = (int) w[6];
+    int N2 = n / 2;
+    
+    arrayfilt_setarray(x);
+    
+    if(a_frames < N2+1) {
+        goto exit;
+    }
+    for(i = 0; i < N2 + 1; i++){
+        mag = mag_in[i];
+        phase = phase_in[i];
+        mag_out[i] = mag * a_samples[i].w_float;
+        phase_out[i] = phase;
+    }
+exit:
+    return (w + 7);
+}
+
+void arrayfilt_dsp(t_arrayfilt *x, t_signal **sp)
+{
+    dsp_add(arrayfilt_perform,6, x,
+            sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, sp[0]->s_n);
+}
diff --git a/externals/lyonpotpourri/bashfest.h b/externals/lyonpotpourri/bashfest.h
new file mode 100755
index 0000000000000000000000000000000000000000..8cbb87b47d882dd3e5e220e8dcf4a6361ba2355b
--- /dev/null
+++ b/externals/lyonpotpourri/bashfest.h
@@ -0,0 +1,185 @@
+#include "MSPd.h"
+#include "ugens.h"
+#include <string.h>
+/* calling codes for DSP modules */
+#define TRANSPOSE 0
+#define RINGMOD 1
+#define FLANGE 2
+#define BUTTER 3
+#define TRUNCATE 4
+#define SWEEPRESON 5
+#define COMB 6
+#define SLIDECOMB 7
+#define REVERB1 8
+#define ELLIPSE 9
+#define COMPDIST 10
+#define FEED1 11
+#define RETRO 12
+#define FLAM1 13
+#define FLAM2 14
+#define EXPFLAM 15
+#define COMB4 16
+#define RINGFEED 17
+#define RESONADSR 18
+#define STV 19	
+//////
+#define ROOT2 (1.4142135623730950488)
+#define PI2 (6.2831853071795862319959)
+// #define BUFFER_SIZE (1<<15)
+#define LOPASS 0
+#define HIPASS 1
+#define BANDPASS 2
+#define COMBFADE (.04 )
+#define MAXFILTER 12 /*must be at least as big as see below */
+#define ELLIPSE_FILTER_COUNT 11 /*actual number of filters*/
+#define MAX_COEF 48
+#define MY_MAX 2147483647.0 /* for rand() */
+/*data types */
+
+typedef struct
+{
+	float *data;//contains cycle data
+	int len;//length of array
+	int p;//position pointer
+} t_cycle;
+
+typedef struct
+{
+  long phase; // current phase in frames
+  double phasef; // current phase in frames
+  float gain; // gain for this note
+  float gainL;// left gain
+  float gainR;// right gain
+  short status;// status of this event slot
+  float *workbuffer;//sample processing space (both input and output)
+  float *inbuf;//pointer to input part of workbuffer
+  float *outbuf;//pointer to output part of workbuffer
+  int in_start;// location in workbuffer to read from input
+  int out_start;// location in workbuffer to write output
+  int sample_frames;//actual size in frames of sample, which changes if it gets bigger
+  int countdown;//latency counter before we actually start sending out samples
+  int out_channels; //number of channels per frame of output
+  short completed;//did the defer call do its thing?
+
+
+} t_event;
+
+typedef struct _bashfest
+{
+  t_object x_obj;
+  float x_f;  
+  float sr; // sampling rate
+  t_symbol *wavename; // name of waveform buffer
+  short hosed; // buffers are bad
+  float fadeout; // fadeout time in sample frames (if truncation)
+  float sync; // input from groove sync signal
+  float increment; // read increment
+  int most_recent_event; // position in array where last note was initiated
+  long b_nchans; // channels of buffer
+  long b_valid; // state of buffer
+  long b_frames; // number of frames in sample buffer
+  t_word *b_samples; // pointer samples in buffer
+  int overlap_max; // max number of simultaneous plays 
+  t_event *events; //note attacks
+  int active_events; // how many currently activated notes?
+  int buf_samps;//total samples in workbuffer
+  int halfbuffer;//buf_samps / 2
+  int buf_frames;// number of sample frames in workbuffer
+  int latency_samples;// amount of samples to count down before playing sample
+  float *params; // parameter list
+  float *odds;// odds for each process happening
+  int max_process_per_note;//what it says
+  int min_process_per_note;//ditto
+  int new_slot;//position for newest note
+  float new_gain;//recently assigned gain
+  short verbose;//toggle Max window error reporting
+  float work_buffer_size;// size in ms of work buffers
+  t_cycle tcycle;//contains an optional transposition cycle
+  short block_dsp;//flag to turn off all dsp and play straight from MSP buffer
+  short sound_lock;//keep current processed sound in buffer
+  short grab;//flag to copy immediate processed buffer into MSP buffer
+  char sound_name[256];
+  float *trigger_vec;//stores incoming trigger vectors
+  int vs;//Max/MSP vector size
+  
+  /* stuff for bashfest DSP */
+  float *sinewave;
+  int sinelen;
+  short mute;
+  float maxdelay;
+  float *delayline1;
+  float *delayline2;
+  LSTRUCT *eel; // for ellipse processor
+  float *mini_delay[4]; // small delay lines for allpass filter
+  float max_mini_delay ;
+  float *transfer_function;
+  int tf_len; // length of transfer function
+  float *feedfunc1;
+  float *feedfunc2;
+  float *feedfunc3;
+  float *feedfunc4;
+  int feedfunclen;
+  int flamfunc1len;
+  float *flamfunc1;
+  CMIXCOMB *combies;
+  CMIXADSR *adsr;
+  float max_comb_lpt;
+  float *reverb_ellipse_data;
+  float **ellipse_data;
+  float *dcflt;
+  CMIXOSC oscar;
+  CMIXRESON resies[2];
+
+} t_bashfest;
+
+
+
+/*function prototypes*/
+void putsine (float *arr, int len);
+float boundrand(float min, float max);
+void mycombset(float loopt,float rvt,int init,float *a,float srate);
+float mycomb(float samp,float *a);
+void setweights(float *a, int len);
+void delset2(float *a,int *l,float xmax, float srate);
+void delput2(float x,float *a,int *l);
+float dliget2(float *a,float dwait,int *l,float srate);
+void butterLopass( float *in, float *out, float cutoff, int frames, int channels, float srate);
+void butterBandpass(float *in, float *out,  float center, float bandwidth, int frames,int  channels, float srate);
+void butterHipass(float *in, float *out,  float cutoff, int frames,int channels, float srate);
+void butset(float *a);
+void lobut(float *a, float cutoff,float SR);
+void hibut(float *a, float cutoff, float SR);
+void bpbut(float *a, float formant, float bandwidth, float SR);
+void butter_filter(float *in,float *out,float *a, int frames, int channels, int channel);
+void rsnset2(float cf,float bw,float scl,float xinit,float *a,float srate);
+float reson(float x,float *a);
+
+void ellipset(float *list, LSTRUCT *eel, int  *nsects, float *xnorm);
+float ellipse(float x, LSTRUCT *eel, int nsects, float xnorm);
+float allpass(float samp,float *a);
+void init_reverb_data(float *a);
+void init_ellipse_data(float **a);
+
+void setExpFlamFunc(float *arr, int flen, float v1,float v2,float alpha);
+void setflamfunc1(float *arr, int flen);
+void funcgen1(float *outArray, int outlen, float duration, float outMin, float outMax,
+	 float speed1, float speed2, float gain1, float gain2, float *phs1, float *phs2, 
+	 float *sine, int sinelen);
+void normtab(float *inarr,float *outarr, float min, float max, int len);
+float mapp(float in,float imin,float imax,float omin,float omax);
+float oscil(float amp,float si,float *farray,int len,float *phs);
+void set_dcflt(float *a);
+
+void set_distortion_table(float *arr, float cut, float max, int len);
+float dlookup(float samp,float *arr,int len);
+void do_compdist(float *in,float *out,int sampFrames,int nchans,int channel, 
+	    float cutoff,float maxmult,int lookupflag,float *table,int range,float bufMaxamp);
+float getmaxamp(float *arr, int len);
+void buildadsr(CMIXADSR *a);
+/*bashfest dsp functions */
+void feed1(float *inbuf, float *outbuf, int in_frames, int out_frames,int channels, float *functab1,
+	   float *functab2,float *functab3,float *functab4,int funclen, 
+	   float duration, float maxDelay, t_bashfest *x);
+void reverb1me(float *in, float *out, int inFrames, int out_frames, int nchans, 
+	       int channel, float revtime, float dry, t_bashfest *x);
+	       void killdc( float *inbuf, int in_frames, int channels, t_bashfest *x);
diff --git a/externals/lyonpotpourri/bashfest_dsp.c b/externals/lyonpotpourri/bashfest_dsp.c
new file mode 100755
index 0000000000000000000000000000000000000000..dfed186ce6d690d90214442087b24e574f42adbf
--- /dev/null
+++ b/externals/lyonpotpourri/bashfest_dsp.c
@@ -0,0 +1,1547 @@
+#include "bashfest.h"
+
+void transpose(t_bashfest *x, int slot, int *pcount)
+{
+  float *inbuf;
+  float *outbuf;
+  int i;
+  int iphs = 0;
+  int ip2;
+  float m1, m2;
+  float phs = 0;
+  int out_frames;
+  int in_start = x->events[slot].in_start;
+  int out_start = x->events[slot].out_start;  
+  int in_frames = x->events[slot].sample_frames;
+  int channels = x->events[slot].out_channels;
+  float *params = x->params; 
+//  float srate = x->sr;
+  int buflen = x->buf_samps;
+  int halfbuffer = x->halfbuffer;
+  int buf_frames = x->buf_frames;
+  float tfac;
+  
+  ++(*pcount);
+  tfac = params[ (*pcount)++ ];
+  // out_start MUST BE SET WITH RESPECT TO in_start
+  
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+
+  //  fprintf(stderr,"TRANSPOSE: in %d out %d\n", w->in_start, w->out_start);
+  out_frames = (float) in_frames / tfac ;
+  if( out_frames > buf_frames / 2 ){
+    out_frames = buf_frames / 2 ;
+  }
+
+  for( i = 0; i < out_frames * channels; i += channels ){
+    iphs = phs;
+    m2 = phs - iphs;
+    m1 = 1. - m2;
+
+    if( channels == 1 ){
+      *outbuf++ = inbuf[iphs] * m1 + inbuf[ iphs + 1] * m2 ; 
+
+    } else if( channels == 2 ){
+      ip2 = iphs * 2;
+      *outbuf++ = inbuf[ip2] * m1 + inbuf[ ip2 + 2] * m2 ; 
+      *outbuf++ = inbuf[ip2 + 1] * m1 + inbuf[ ip2 + 3] * m2 ; 
+    }
+    phs += tfac ;
+
+  }
+
+  x->events[slot].sample_frames =  out_frames;
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;
+  
+}
+
+
+void ringmod(t_bashfest *x, int slot, int *pcount)
+{
+  float *sinewave = x->sinewave;
+  float *inbuf, *outbuf;
+  int sinelen = x->sinelen;
+  int frames = x->events[slot].sample_frames;
+  int channels = x->events[slot].out_channels;
+  float *params = x->params; 
+  float srate = x->sr;
+  int in_start = x->events[slot].in_start;
+  int out_start = x->events[slot].out_start;
+//  int in_frames = x->events[slot].sample_frames;
+  int buflen = x->buf_samps;
+  int halfbuffer = x->halfbuffer;
+  int i;
+  float phase = 0.0;
+  float si;
+  float rmodFreq;
+
+  ++(*pcount);
+  rmodFreq = params[(*pcount)++];
+
+  //  fprintf(stderr,"-*-*- EXECUTING RINGMOD -*-*-\n");
+
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+
+
+  si = ((float) sinelen / srate) * rmodFreq ;
+
+//  inbuf = inbuf + in_start ;
+
+  for(i = 0; i < frames*channels; i += channels ){
+    *outbuf++ = *inbuf++ * sinewave[(int)phase];
+    if( channels == 2 ){
+      *outbuf++ = *inbuf++ * sinewave[(int)phase];
+    }
+    phase += si;
+    while( phase > sinelen )
+      phase -= sinelen;
+  } 
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;
+}
+
+void retrograde(t_bashfest *x, int slot, int *pcount)
+{
+
+  int frames = x->events[slot].sample_frames;
+  int channels = x->events[slot].out_channels;
+//  float *params = x->params;
+//  float srate = x->sr;
+  int i ;
+  int swap1, swap2;
+  float tmpsamp;
+
+  float *inbuf, *outbuf;
+  int in_start = x->events[slot].in_start;
+  int out_start = x->events[slot].out_start;
+  int in_frames = x->events[slot].sample_frames;
+  int buflen = x->buf_samps;
+  int halfbuffer = x->halfbuffer;
+      
+  ++(*pcount);
+  
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+
+  memcpy(outbuf, inbuf, in_frames * channels * sizeof(float) );
+    
+  if( channels == 1 ){
+    for(i = 0; i < (frames/2)  ; i++ ){
+      swap2 = (frames - 1 - i);
+      tmpsamp = outbuf[i];
+      outbuf[i] = outbuf[swap2];
+      outbuf[swap2] = tmpsamp;
+    }
+  }
+
+  /* this would also work for mono, but we'll save a few multiplies */
+  else {
+    for(i = 0; i < (frames/2)   ; i++ ){
+      swap1 = i * channels ;
+      swap2 = (frames - 1 - i) * channels;
+      tmpsamp = outbuf[swap1];
+      outbuf[swap1] = outbuf[swap2];
+      outbuf[swap2] = tmpsamp;
+      ++swap1;
+      ++swap2;  
+      tmpsamp = outbuf[swap1];
+      outbuf[swap1] = outbuf[swap2];
+      outbuf[swap2] = tmpsamp;
+    
+    }
+  } 
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;
+  
+}
+
+void comber(t_bashfest *x, int slot, int *pcount)
+{
+  int channels = x->events[slot].out_channels;
+  float *params = x->params; 
+  float srate = x->sr;
+  float *delayline1 = x->delayline1;  
+  float *delayline2 = x->delayline2;  
+  float max_delay = x->maxdelay ;
+  int buf_frames = x->buf_frames;
+  int out_frames ;
+  float overhang, revtime, delay ;
+  //  float *comb1, *comb2;
+  int combsamps;
+  int i;
+  int fade_frames;
+  float fadegain;
+  int fadestart;
+
+  float *inbuf, *outbuf;
+  int in_start = x->events[slot].in_start;
+  int out_start = x->events[slot].out_start;
+  int in_frames = x->events[slot].sample_frames;
+  int buflen = x->buf_samps;
+  int halfbuffer = x->halfbuffer;
+  /******************************/
+  ++(*pcount);
+  delay = params[(*pcount)++];
+  revtime = params[(*pcount)++];
+  overhang = params[(*pcount)++];
+
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+    
+  if( delay <= 0.0 ){
+    error("comber got bad delay value\n");
+    return;
+  }
+  if( delay > max_delay ){
+    delay = max_delay ;
+  }
+  if( overhang < COMBFADE )
+    overhang = COMBFADE;
+
+  out_frames = in_frames + overhang * srate ;
+  if( out_frames > buf_frames / 2 ){
+    out_frames = buf_frames / 2 ;
+  }
+  
+  combsamps = delay * srate + 20 ;
+  mycombset(delay,revtime,0,delayline1,srate);
+  if( channels == 2 )
+    mycombset(delay,revtime,0,delayline2,srate);
+
+  // ADD IN ORIGINAL SIGNAL
+  for( i = 0; i < in_frames*channels; i += channels){
+    *outbuf++ += mycomb(*inbuf++, delayline1);
+    if( channels == 2 ){
+      *outbuf++ += mycomb(*inbuf++,delayline2);
+    }
+  }
+
+  for( i = in_frames * channels; i < out_frames*channels; i += channels){
+    *outbuf++ = mycomb( 0.0 , delayline1);
+    if( channels == 2 ){
+      *outbuf++ = mycomb( 0.0 , delayline2);
+    }
+  }
+
+  fade_frames = COMBFADE * srate;
+  fadestart = (out_frames - fade_frames) * channels ;
+  for( i = 0; i < fade_frames * channels; i += channels ){
+    fadegain = 1.0 - (float) i / (float) (fade_frames * channels)  ;
+    *(inbuf + fadestart + i) *= fadegain;
+    if(channels == 2){
+      *(inbuf + fadestart + i + 1) *= fadegain;
+    }
+  }
+
+  x->events[slot].sample_frames = out_frames; 
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;
+  
+  
+}
+
+void flange(t_bashfest *x, int slot, int *pcount)
+{
+  int i;
+  float si;
+  float mindel, maxdel;
+  float fac1, fac2;
+  int dv1[2], dv2[2]; /* cmix bookkeeping */
+  float delsamp1, delsamp2 ;
+  float delay_time;
+  //  float dliget2();
+  float speed, feedback, phase, minres, maxres;
+  float hangover ;
+  int hangframes ;
+  
+//  float *inbuf = x->events[slot].workbuffer;
+//  int frames = x->events[slot].sample_frames;
+  int channels = x->events[slot].out_channels;
+//  int buflen = x->buf_samps;
+  float *params = x->params; 
+  float srate = x->sr;
+//  int in_start = x->events[slot].in_start;
+  float *delayline1 = x->delayline1;  
+  float *delayline2 = x->delayline2;  
+  float max_delay = x->maxdelay ;    
+  float *sinewave = x->sinewave;
+  int sinelen = x->sinelen ;
+
+  float *inbuf, *outbuf;
+  int in_start = x->events[slot].in_start;
+  int out_start;
+  int in_frames = x->events[slot].sample_frames;
+  int buflen = x->buf_samps;
+  int halfbuffer = x->halfbuffer;
+
+  ++(*pcount);
+  minres = params[(*pcount)++];
+  maxres = params[(*pcount)++];
+  speed = params[(*pcount)++];
+  feedback = params[(*pcount)++];
+  phase = params[(*pcount)++];
+
+  hangover = feedback * 0.25 ; // maybe log relation
+  hangframes = srate * hangover ;
+
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+
+
+  if( minres <= 0. || maxres <= 0. ){
+    error("flange: got zero frequency resonances as input");
+    return;
+  }
+  mindel = 1.0/maxres;
+  maxdel = 1.0/minres;
+
+  if( maxdel > max_delay ){
+    maxdel = max_delay;
+    error("flange: too large delay time shortened");
+  }
+
+  delset2(delayline1, dv1, maxdel,srate);
+  if( channels == 2 ){
+    delset2(delayline2, dv2, maxdel,srate);
+  }
+
+
+  si = ((float) sinelen/srate) * speed ;
+
+  if( phase > 1.0 ){
+    phase = 0;
+    error("flange: given > 1 initial phase");
+  }
+  delsamp1 = delsamp2 = 0;
+  phase *= sinelen;
+  fac2 = .5 * (maxdel - mindel) ;
+  fac1 = mindel + fac2;
+
+  for(i = 0; i < in_frames*channels; i += channels ){
+    /* homemade oscillator */
+    delay_time = fac1 + fac2 *  sinewave[(int) phase];
+    if( delay_time < .00001 ){
+      delay_time = .00001;
+    }
+    phase += si;
+    while( phase > sinelen )
+      phase -= sinelen;
+    delput2( *inbuf + delsamp1*feedback, delayline1, dv1);
+    delsamp1 = dliget2(delayline1, delay_time, dv1,srate);
+    *outbuf++ = (*inbuf++ + delsamp1) ;
+    if( channels == 2 ){
+      delput2( *inbuf+delsamp2*feedback, delayline2, dv2);
+      delsamp2 = dliget2(delayline2, delay_time, dv2,srate);
+      *outbuf++ = (*inbuf++ + delsamp2) ;
+    }
+  }
+  /* NOW DO HANGOVER */
+  for(i = 0; i < hangframes*channels; i += channels ){
+
+    delay_time = fac1 + fac2 *  sinewave[ (int) phase ];
+    if( delay_time < .00001 ){
+      delay_time = .00001;
+    }
+    phase += si;
+    while( phase > sinelen )
+      phase -= sinelen;
+    delput2( delsamp1*feedback, delayline1, dv1);
+    delsamp1 = dliget2(delayline1, delay_time, dv1,srate);
+    *outbuf++ = delsamp1 ;
+    if( channels == 2 ){
+      delput2( delsamp2*feedback, delayline2, dv2);
+      delsamp2 = dliget2(delayline2, delay_time, dv2,srate);
+      *outbuf++ = delsamp2 ;
+    }
+  }
+  x->events[slot].sample_frames += hangframes;   
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;
+
+}
+
+void butterme(t_bashfest *x, int slot, int *pcount)
+{
+
+  int ftype;
+  float cutoff, cf, bw;
+  int frames = x->events[slot].sample_frames;
+  int channels = x->events[slot].out_channels;
+  float *params = x->params; 
+  float srate = x->sr;
+  float *inbuf, *outbuf;
+  int in_start = x->events[slot].in_start;
+  int out_start = x->events[slot].out_start;
+//  int in_frames = x->events[slot].sample_frames;
+  int buflen = x->buf_samps;
+  int halfbuffer = x->halfbuffer;
+
+
+  ++(*pcount);
+  ftype = params[(*pcount)++];
+  
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+    
+  if(ftype == HIPASS){
+    cutoff = params[(*pcount)++];
+    butterHipass(inbuf, outbuf, cutoff, frames, channels, srate);
+  }
+  else if(ftype == LOPASS){
+    cutoff = params[(*pcount)++];
+    butterLopass(inbuf, outbuf, cutoff, frames, channels, srate);
+  }
+  else if(ftype == BANDPASS){
+    cf = params[(*pcount)++];
+    bw = params[(*pcount)++];
+    butterBandpass(inbuf, outbuf, cf, bw, frames, channels, srate);
+  } else {
+    error("%d not a valid Butterworth filter",ftype);
+    return;
+  }
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;
+}
+
+
+
+void truncateme(t_bashfest *x, int slot, int *pcount)
+{
+  float shortdur ;
+  int out_frames;
+  int i;
+  float fadegain ;
+  int fade_frames;
+  int fadestart;
+  float fadeout;
+  int channels = x->events[slot].out_channels;
+  float *params = x->params; 
+  float srate = x->sr;
+
+  float *inbuf, *outbuf;
+  int in_start;
+  int out_start;
+  int in_frames = x->events[slot].sample_frames;
+  int buflen = x->buf_samps;
+  int halfbuffer = x->halfbuffer;
+  
+  ++(*pcount);
+  shortdur = params[ (*pcount)++ ];
+  fadeout = params[ (*pcount)++ ];
+  fade_frames = fadeout * srate ;
+  out_frames = shortdur * srate ;
+  if( out_frames >= in_frames ){
+    // error("truncation requesting >= original duration, no truncation");
+    return;
+  }
+  
+  in_start = x->events[slot].in_start;
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+  
+
+  if( fade_frames <= 0 ){
+    error("truncation with 0 length fade!");
+    return;
+  }
+
+  if( fade_frames > out_frames ){
+    error("truncation requested fadeout > new duration, adjusting...");
+    fade_frames = out_frames;
+  }
+
+  memcpy(outbuf, inbuf, in_frames * sizeof(float) );
+  
+  fadestart = (out_frames - fade_frames) * channels ;
+
+  for( i = 0; i < fade_frames * channels; i += channels ){
+    fadegain = 1.0 - (float) i / (float) (fade_frames * channels)  ;
+    outbuf[fadestart + i]   *= fadegain;
+    if( channels == 2 ){
+      outbuf[ fadestart + i + 1] *= fadegain;
+    }
+  }
+
+  x->events[slot].sample_frames = out_frames ;
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;
+}
+
+// Pd only - not reentrant - appears that sine wave gets screwed up ???
+void sweepreson(t_bashfest *x, int slot, int *pcount)
+{
+  int i;
+  float bwfac;
+  float minfreq, maxfreq, speed, phase;
+  float q1[5], q2[5];
+  float cf, bw;
+  float si;
+  float fac1, fac2;
+//  float inmax, outmax, rescale ;
+//  int frames = x->events[slot].sample_frames;
+  int channels = x->events[slot].out_channels;
+  float *params = x->params; 
+  float srate = x->sr;
+  float *sinewave = x->sinewave;
+  int sinelen = x->sinelen ;
+
+  float *inbuf, *outbuf;
+  int in_start = x->events[slot].in_start;
+  int out_start = x->events[slot].out_start;
+  int in_frames = x->events[slot].sample_frames;
+  int buflen = x->buf_samps;
+  int halfbuffer = x->halfbuffer;  
+
+  
+  ++(*pcount);
+  minfreq = params[(*pcount)++];
+  maxfreq = params[(*pcount)++];
+  bwfac = params[(*pcount)++];
+  speed = params[(*pcount)++];
+  phase = params[(*pcount)++];
+
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+  
+  si = ((float) sinelen / srate) * speed ;
+
+  if( phase > 1.0 ){
+    phase = 0;
+    error("sweepreson: given > 1 initial phase");
+  }
+
+  phase *= sinelen;
+  fac2 = .5 * (maxfreq - minfreq) ;
+  fac1 = minfreq + fac2;
+
+  cf = fac1 + fac2 * sinewave[(int) phase];
+  bw = bwfac * cf;
+  rsnset2( cf, bw, 2.0, 0.0, q1, srate );
+  if( channels == 2 ){
+    rsnset2( cf, bw, 2.0, 0.0, q2, srate );
+  } 
+  
+  for(i = 0; i < in_frames; i++ ){
+    // homemade oscillator 
+
+    phase += si;
+    while( phase >= sinelen )
+      phase -= sinelen;
+	
+
+    fac2 = .5 * (maxfreq - minfreq) ;
+    fac1 = minfreq + fac2;
+
+    cf = fac1 + fac2 * sinewave[(int) phase];
+    bw = bwfac * cf; 
+	if(cf < 10 || cf > 8000 || bw < 1 || srate < 100){
+		post("danger values, cf %f bw %f sr %f",cf, bw, srate);
+	}
+   rsnset2( cf, bw, 2.0, 1.0, q1, srate );
+   // clicks stop if we don't apply filter above, and if attacks come too fast
+   *outbuf++ = reson(*inbuf++, q1);
+
+    if( channels == 2 ){
+	
+    //  rsnset2( cf, bw, 2.0, 1.0, q2, srate );
+	  *outbuf++ = reson(*inbuf++, q2); 
+      
+    }
+  }
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;
+
+}
+
+void slidecomb(t_bashfest *x, int slot, int *pcount)
+{
+  float overhang, feedback, delay1, delay2;
+//  int combsamps;
+  int i;
+  int fade_frames;
+  float fadegain;
+  int fadestart;
+  int dv1[2], dv2[2];		/* cmix bookkeeping */
+  float delsamp1 = 0, delsamp2 = 0;
+  float m1, m2;
+  float delay_time;
+  int out_frames ;
+    
+  int channels = x->events[slot].out_channels;
+  int buf_frames = x->buf_frames;
+  float *params = x->params; 
+  float srate = x->sr;
+//  float *sinewave = x->sinewave;
+//  int sinelen = x->sinelen ;
+  float max_delay = x->maxdelay;
+  float *delayline1 = x->delayline1;  
+  float *delayline2 = x->delayline2;  
+  
+  float *inbuf, *outbuf;
+  int in_start = x->events[slot].in_start;
+  int out_start = x->events[slot].out_start;
+  int in_frames = x->events[slot].sample_frames;
+  int buflen = x->buf_samps;
+  int halfbuffer = x->halfbuffer;  
+  
+  ++(*pcount);
+  delay1 = params[(*pcount)++];
+  delay2 = params[(*pcount)++];
+  feedback = params[(*pcount)++];
+  overhang = params[(*pcount)++];
+
+// post("del1 %f del2 %f srate %f",delay1,delay2, srate);
+
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+    
+  if( overhang < COMBFADE )
+    overhang = COMBFADE;
+
+  
+  out_frames = in_frames + overhang * srate ;
+  if( out_frames > buf_frames / 2 ){
+    out_frames = buf_frames / 2 ;
+  }
+  
+  delset2(delayline1, dv1, max_delay, srate);
+  if( channels == 2 ){
+    delset2(delayline2, dv2, max_delay, srate);
+  }
+
+
+
+  for( i = 0; i < in_frames*channels; i += channels){
+    m2 = (float) i / (float) (out_frames * channels) ;
+    m1 = 1. - m2;
+    delay_time = delay1 * m1 + delay2 * m2 ;
+    delput2(*inbuf +delsamp1*feedback, delayline1, dv1);
+    delsamp1 = dliget2(delayline1, delay_time, dv1, srate);
+    *outbuf++ = *inbuf++ + delsamp1;
+    if( channels == 2 ){
+      delput2( *inbuf + delsamp2*feedback, delayline2, dv2);
+      delsamp2 = dliget2(delayline2, delay_time, dv2, srate);
+      *outbuf++ = *inbuf++ + delsamp2 ;
+    }
+  }
+
+  for( i = in_frames * channels; i < out_frames*channels; i += channels){
+    m2 = (float) i / (float) (out_frames * channels) ;
+    m1 = 1. - m2;
+    delay_time = delay1 * m1 + delay2 * m2 ;
+    delput2( delsamp1*feedback, delayline1, dv1);
+    *outbuf++ = delsamp1 = dliget2( delayline1, delay_time, dv1, srate );
+    if( channels == 2 ){
+      delput2( delsamp2*feedback, delayline2, dv2);
+      *outbuf++ = delsamp2 = dliget2( delayline2, delay_time, dv2, srate );
+    }
+  }
+
+  fade_frames = COMBFADE * srate;
+  fadestart = (out_frames - fade_frames) * channels ;
+  for( i = 0; i < fade_frames * channels; i += channels ){
+    fadegain = 1.0 - (float) i / (float) (fade_frames * channels)  ;
+    *(outbuf + fadestart + i) *= fadegain;
+    if( channels == 2 ){
+      *(outbuf + fadestart + i + 1) *= fadegain;
+    }
+  }
+  x->events[slot].sample_frames = out_frames;  
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;
+
+}
+// still a crash whore in Pd: 
+
+void reverb1(t_bashfest *x, int slot, int *pcount)
+{
+
+  float revtime, overhang;
+  int channel_to_compute;
+  float drygain;
+  int out_frames;
+//  int frames = x->events[slot].sample_frames;
+  int channels = x->events[slot].out_channels;
+  int buf_frames = x->buf_frames;
+  float *params = x->params; 
+  float srate = x->sr;
+
+  float *inbuf, *outbuf;
+  int in_start = x->events[slot].in_start;
+  int out_start = x->events[slot].out_start;
+  int in_frames = x->events[slot].sample_frames;
+  int buflen = x->buf_samps;
+  int halfbuffer = x->halfbuffer;
+      
+  ++(*pcount);
+  revtime = params[(*pcount)++];
+  if( revtime >= 1. ){
+    error("reverb1 does not like feedback values over 1.");
+    revtime = .99 ;
+  }
+  overhang = params[(*pcount)++];
+  drygain = params[(*pcount)++];
+
+
+  out_frames = in_frames + srate * overhang;
+  if( out_frames > buf_frames / 2 ){
+    out_frames = buf_frames / 2 ;
+  }
+
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+  
+  
+  for( channel_to_compute = 0; channel_to_compute < channels; channel_to_compute++) {
+    reverb1me( inbuf, outbuf, in_frames, out_frames, channels, channel_to_compute, revtime, drygain, x);
+  }
+  
+
+  x->events[slot].sample_frames = out_frames;
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;
+  
+}
+
+void ellipseme(t_bashfest *x, int slot, int *pcount)
+{
+  int i,j;
+  int nsects;
+  float xnorm;
+  int filtercode ;
+  float *fltdata;
+
+//  int frames = x->events[slot].sample_frames;
+  int channels = x->events[slot].out_channels;
+//  int buf_frames = x->buf_frames;
+  float *params = x->params; 
+//  float srate = x->sr;
+  float **flts = x->ellipse_data;
+  LSTRUCT *eel = x->eel;
+
+  float *inbuf, *outbuf;
+  int in_start = x->events[slot].in_start;
+  int out_start = x->events[slot].out_start;
+  int in_frames = x->events[slot].sample_frames;
+  int buflen = x->buf_samps;
+  int halfbuffer = x->halfbuffer;
+    
+  ++(*pcount);
+  filtercode = params[(*pcount)++];
+
+  if( filtercode >= ELLIPSE_FILTER_COUNT ){
+    error("there is no %d ellipse data",filtercode);
+    return;
+  };
+  fltdata = flts[ filtercode ];
+
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+  
+  for( j = 0; j < channels; j++) {
+    ellipset(fltdata,eel,&nsects,&xnorm); 
+    for( i = j; i < in_frames * channels ; i += channels ){
+      outbuf[i] = ellipse(inbuf[i], eel, nsects,xnorm);
+    }
+  } 
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;
+
+}
+
+void feed1me(t_bashfest *x, int slot, int *pcount)
+{
+//  int i;
+  float mindelay, maxdelay, speed1, speed2;
+  float phz1 = .13, phz2 = .251;
+  float dur;
+  float minfeedback = .1, maxfeedback = .7;
+  float desired_dur;
+  float overhang;
+  /* main variables */
+
+//  int frames = x->events[slot].sample_frames;
+  int channels = x->events[slot].out_channels;
+  int buf_frames = x->buf_frames;
+  float *params = x->params; 
+  float srate = x->sr;
+  int out_frames;
+  /* process specfic*/
+  int flen = x->feedfunclen ;
+  float *func1 = x->feedfunc1;
+  float *func2 = x->feedfunc2;
+  float *func3 = x->feedfunc3;
+  float *func4 = x->feedfunc4;
+  float my_max_delay = x->max_mini_delay;
+  float *sinewave = x->sinewave;
+  int sinelen = x->sinelen ;
+
+  float *inbuf, *outbuf;
+  int in_start = x->events[slot].in_start;
+  int out_start = x->events[slot].out_start;
+  int in_frames = x->events[slot].sample_frames;
+  int buflen = x->buf_samps;
+  int halfbuffer = x->halfbuffer;
+  
+  ++(*pcount);
+  mindelay = params[ (*pcount)++ ];
+  maxdelay = params[ (*pcount)++ ];
+  speed1 = params[ (*pcount)++ ];
+  speed2 = params[ (*pcount)++ ];
+  overhang = params[ (*pcount)++ ];
+
+  if( maxdelay > my_max_delay ){
+    error("feed1: too high max delay, adjusted");
+    maxdelay = my_max_delay ;
+  }
+  dur = in_frames / srate ;
+  desired_dur = dur + overhang;
+  out_frames = srate * desired_dur ;
+  if( out_frames > buf_frames / 2 ){
+    out_frames = buf_frames / 2 ;
+  }
+  
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+
+  funcgen1( func1, flen, desired_dur, mindelay, maxdelay,
+	    speed1, speed2, 1.0, 1.0, &phz1, &phz2, sinewave, sinelen);
+
+  phz1 /= (float) flen; phz2 /= (float) flen;
+
+
+  funcgen1( func2, flen, desired_dur, mindelay*.5, maxdelay*2.0,
+	    speed1*1.25, speed2*.75, 1.0, 1.0, &phz1, &phz2, sinewave, sinelen);
+
+  phz1 /= (float) flen; phz2 /= (float) flen;
+
+
+  funcgen1( func3, flen, desired_dur, minfeedback, maxfeedback,
+	    speed1*.35, speed2*1.25, 1.0, 1.0, &phz1, &phz2, sinewave, sinelen);
+
+  phz1 /= (float) flen; phz2 /= (float) flen;
+
+  funcgen1( func4,flen, desired_dur, minfeedback, maxfeedback,
+	    speed1*.55, speed2*2.25, 1.0, 1.0, &phz1, &phz2, sinewave, sinelen);
+		
+  feed1( inbuf, outbuf, in_frames, out_frames, channels, func1, func2, func3, func4, flen, dur, my_max_delay, x);
+
+  x->events[slot].sample_frames = out_frames; 
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;
+
+}
+
+void flam1(t_bashfest *x, int slot, int *pcount)
+{
+//  int channel_to_compute;
+  int attacks;
+  float gain2;
+  float gainatten;
+  float delay;
+  float gain = 1.0;
+  int i, j, k, delaysamps, delayoffset = 0;
+//  float inputmax;
+  int delay_frames;
+  /* main variables */
+  float *inbuf;
+  float *outbuf;
+//  int frames = x->events[slot].sample_frames;
+  int channels = x->events[slot].out_channels;
+  int buflen = x->buf_samps;
+  int buf_frames = x->buf_frames;
+  float *params = x->params; 
+  float srate = x->sr;
+  int in_start = x->events[slot].in_start;
+  int out_start = x->events[slot].out_start;
+  int in_frames = x->events[slot].sample_frames;
+  int out_frames;
+  int halfbuffer = x->halfbuffer;
+  /* process specfic*/
+  ++(*pcount);  
+  attacks = params[(*pcount)++];
+  gain2 = params[(*pcount)++];
+  gainatten = params[(*pcount)++];
+  delay = params[(*pcount)++];
+
+
+
+  if( attacks <= 1 ){
+    error("flam1: too few attacks: %d",attacks);
+    return;
+  }
+
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+
+  delay_frames = srate * delay + 0.5;
+  delaysamps = channels * delay_frames;
+  out_frames = in_frames + (srate * delay * (float) (attacks - 1));
+  if( out_frames > buf_frames / 2 ){
+    out_frames = buf_frames / 2 ;
+  }
+
+  for( i = 0; i < out_frames * channels; i++ ){
+    outbuf[i] = 0.0 ;
+  }  
+
+  for(i = 0; i < attacks; i++ ){
+    if(in_frames + delay_frames * i >= out_frames){
+      // error("breaking at attack %d",i);
+      break;
+    }
+    for(j = 0; j < in_frames * channels; j += channels ){
+      for( k = 0; k < channels; k++ ){
+		outbuf[j + k + delayoffset] += *(inbuf +j + k) * gain;
+      }
+    }
+    delayoffset += delaysamps;
+    if( i == 0 ){
+      gain = gain2;
+    } else {
+      gain *= gainatten;
+    }    
+  }
+
+  x->events[slot].sample_frames = out_frames; 
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;    
+}
+
+void flam2(t_bashfest *x, int slot, int *pcount)
+{
+  //  int channel_to_compute;
+  int attacks;
+  float gain2;
+  float gainatten;
+  float delay1,delay2;
+  float gain = 1.0;
+  int i, j, k, delaysamps, delayoffset = 0;
+  int f_endpoint;
+//  float inputmax, outputmax, rescale;
+  int delay_frames;
+  float now = 0.0;
+  int findex;
+  float inval;
+  float curdelay;
+  /* main variables */
+  float *inbuf;
+  float *outbuf;
+  int out_frames;
+//  int frames = x->events[slot].sample_frames;
+  int channels = x->events[slot].out_channels;
+  int buflen = x->buf_samps;
+  int buf_frames = x->buf_frames;
+  float *params = x->params; 
+  float srate = x->sr;
+  int in_start = x->events[slot].in_start;
+  int out_start = x->events[slot].out_start;
+  int in_frames = x->events[slot].sample_frames;
+  int halfbuffer = x->halfbuffer;
+  float *flamfunc1 = x->flamfunc1;
+  int flamfunclen = x->flamfunc1len;
+  /* process specfic*/
+
+  ++(*pcount);
+  attacks = params[(*pcount)++];
+  gain2 = params[(*pcount)++];
+  gainatten = params[(*pcount)++];
+  delay1 = params[(*pcount)++];
+  delay2 = params[(*pcount)++];
+
+  if( attacks <= 1 ){
+    error("flam2: recieved too few attacks: %d",attacks);
+    return;
+  }
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+  
+  for( i = 0; i < attacks - 1; i++ ){
+    findex = ((float)i/(float)attacks) * (float)flamfunclen ;
+    inval = flamfunc1[findex];
+    curdelay = mapp(inval, 0., 1., delay2, delay1);
+    now += curdelay;
+  }
+  out_frames = in_frames + (srate * now);
+  if( out_frames > buf_frames / 2 ){
+    out_frames = buf_frames / 2 ;
+  }  
+  
+  for( i = 0; i < out_frames * channels; i++ ){
+    outbuf[i] = 0.0 ;
+  }  
+
+  f_endpoint = in_frames;
+  // first time delay_offset is zero
+  for( i = 0; i < attacks; i++ ){
+    findex = ((float)i/(float)attacks) * (float)flamfunclen ;
+    inval = flamfunc1[findex];
+    curdelay = mapp(inval, 0., 1., delay2, delay1);
+
+    delay_frames = srate * curdelay + 0.5;
+    delaysamps = delay_frames * channels;
+    if(f_endpoint >= out_frames){
+      // error("flam2: breaking at attack %d",i);
+      break;
+    }
+    for(j = 0; j < in_frames * channels; j += channels ){
+      for( k = 0; k < channels; k++ ){
+		outbuf[j + k + delayoffset] += *(inbuf + j + k) * gain;
+      }
+    }
+    delayoffset += delaysamps;
+    f_endpoint = in_frames + delayoffset/channels;
+    if( i == 0 ){
+      gain = gain2;
+    } else {
+      gain *= gainatten;
+    }    
+  }
+
+  x->events[slot].sample_frames = out_frames; 
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;    
+}
+
+void expflam(t_bashfest *x, int slot, int *pcount)
+{
+  int attacks;
+  float gain2;
+  float gainatten;
+  float delay1,delay2;
+  float gain = 1.0;
+  int i, j, k, delaysamps, delayoffset = 0, f_endpoint;
+//  float inputmax, outputmax, rescale;
+  int delay_frames;
+  float now = 0.0;
+//  int findex;
+//  float inval;
+  float curdelay;
+  float slope;
+  /* main variables */
+  float *inbuf;
+  float *outbuf;
+  int out_frames;
+//  int frames = x->events[slot].sample_frames;
+  int channels = x->events[slot].out_channels;
+  int buflen = x->buf_samps;
+  int buf_frames = x->buf_frames;
+  float *params = x->params; 
+  float srate = x->sr;
+  int in_start = x->events[slot].in_start;
+  int out_start = x->events[slot].out_start;
+  int in_frames = x->events[slot].sample_frames;
+  int halfbuffer = x->halfbuffer;
+  float *expfunc = x->feedfunc1;
+//  int funclen = x->feedfunclen;
+  /* process specfic*/
+
+  ++(*pcount);
+  attacks = params[(*pcount)++];
+  gain2 = params[(*pcount)++];
+  gainatten = params[(*pcount)++];
+  delay1 = params[(*pcount)++];
+  delay2 = params[(*pcount)++];
+  slope = params[(*pcount)++];
+
+  if( attacks <= 1 ){
+    error("expflam: recieved too few attacks: %d",attacks);
+    return;
+  }
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+
+  setExpFlamFunc(expfunc, attacks, delay1, delay2, slope);
+    
+  for( i = 0; i < attacks - 1; i++ ){
+    now += expfunc[i];
+  }
+  
+  out_frames = in_frames + (srate * now);
+  if( out_frames > buf_frames / 2 ){
+    out_frames = buf_frames / 2 ;
+  }  
+  
+  for( i = 0; i < out_frames * channels; i++ ){
+    outbuf[i] = 0.0 ;
+  }  
+
+  f_endpoint = in_frames;
+  
+  for( i = 0; i < attacks; i++ ){
+    curdelay = expfunc[i];
+    delay_frames = srate * curdelay + 0.5;
+    delaysamps = delay_frames * channels;
+    if(f_endpoint >= out_frames){
+   // error("expflam: breaking at attack %d",i);
+      break;
+    }
+    for(j = 0; j < in_frames * channels; j += channels ){
+      for( k = 0; k < channels; k++ ){
+		outbuf[j + k + delayoffset] += *(inbuf + j + k) * gain;
+      }
+    }
+    delayoffset += delaysamps;
+    f_endpoint = in_frames + delayoffset/channels;
+    if( i == 0 ){
+      gain = gain2;
+    } else {
+      gain *= gainatten;
+    }    
+  }
+
+  x->events[slot].sample_frames = out_frames; 
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;    
+}
+
+void comb4(t_bashfest *x, int slot, int *pcount)
+{
+  float overhang, revtime ;
+  int i, j, k;
+  int fadeFrames;
+  float fadegain;
+  int fadestart;
+  float input_sample;
+  float rez;
+  /* main variables */
+
+  int out_frames;
+//  int frames = x->events[slot].sample_frames;
+  int channels = x->events[slot].out_channels;
+  int buf_frames = x->buf_frames;
+  float *params = x->params; 
+  float srate = x->sr;
+
+  /* process specific */
+  CMIXCOMB *combies = x->combies;
+  float maxloop = x->max_comb_lpt;
+
+  float *inbuf, *outbuf;
+  int in_start = x->events[slot].in_start;
+  int out_start = x->events[slot].out_start;
+  int in_frames = x->events[slot].sample_frames;
+  int buflen = x->buf_samps;
+  int halfbuffer = x->halfbuffer;
+  
+  ++(*pcount);
+  
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+  
+  for( j = 0; j < 4; j++ ){
+    rez = params[(*pcount)++] ;
+    if( rez == 0.0){
+      error("comb4: 0 resonance frequency not allowed");
+      return;
+    }
+    if( 1./rez > maxloop ){
+      error("comb4: %f is too long loop",1./rez);
+      return;
+    }
+    combies[j].lpt = 1. / rez ;
+  }
+
+  revtime = params[(*pcount)++];
+  overhang = params[(*pcount)++];
+  if( overhang < COMBFADE )
+    overhang = COMBFADE;
+  out_frames = in_frames + overhang * srate;
+  if( out_frames > buf_frames / 2 ){
+    out_frames = buf_frames / 2 ;
+  }  
+  for( j = 0; j < 4; j++ ){
+    mycombset( combies[j].lpt, revtime, 0, combies[j].arr, srate);
+  }
+
+  inbuf = x->events[slot].workbuffer + in_start;
+  
+  for( j = 0; j < channels; j++ ){
+    for( i = 0; i < in_frames * channels; i += channels ){
+      input_sample = *(inbuf + i + j) ; // we can move inside loop
+      *(outbuf + i + j ) = 0.0; // comment out to leave original sound into it
+      for( k = 0; k < 4; k++ ){
+		*(outbuf + i + j) += mycomb(input_sample, combies[k].arr);
+      }
+    }
+  }
+  for( i = in_frames * channels; i < out_frames * channels; i += channels ){
+    for( j = 0; j < channels; j++ ){
+      *(outbuf + i + j) = 0.0;
+      for( k = 0; k < 4; k++ ){
+		*(outbuf +i+j) += mycomb(0.0,combies[k].arr);
+      }
+    }
+  } 
+  fadeFrames = COMBFADE * srate; // ok - this is just the fadeout
+  fadestart = (out_frames - fadeFrames) * channels ;
+  for( i = 0; i < fadeFrames * channels; i += channels ){
+    fadegain = 1.0 - (float) i / (float) (fadeFrames * channels)  ;
+    *(outbuf + fadestart + i) *= fadegain;
+    if( channels == 2 ){
+      *(outbuf + fadestart + i + 1) *= fadegain;
+    }
+  }
+  killdc(outbuf, out_frames, channels, x);
+  x->events[slot].sample_frames = out_frames;
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;
+     
+}
+
+void compdist(t_bashfest *x, int slot, int *pcount)
+{
+  float cutoff, maxmult;
+  int lookupflag;
+  int channel_to_compute;
+  float maxamp;
+  /* main variables */
+
+//  int out_frames;
+//  int frames = x->events[slot].sample_frames;
+  int channels = x->events[slot].out_channels;
+//  int buf_frames = x->buf_frames;
+  float *params = x->params; 
+//  float srate = x->sr;
+  /* function specific*/
+  int range = x->tf_len;
+  float *table = x->transfer_function;
+
+  float *inbuf, *outbuf;
+  int in_start = x->events[slot].in_start;
+  int out_start = x->events[slot].out_start;
+  int in_frames = x->events[slot].sample_frames;
+  int buflen = x->buf_samps;
+  int halfbuffer = x->halfbuffer;
+  
+  ++(*pcount);
+  cutoff = params[(*pcount)++];
+  maxmult = params[(*pcount)++];
+  lookupflag = params[(*pcount)++];
+  
+
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+  
+  maxamp = getmaxamp(inbuf, in_frames*channels) ;
+
+  if(lookupflag){
+    set_distortion_table(table, cutoff, maxmult, range);
+  }
+  
+  for( channel_to_compute = 0; channel_to_compute < channels; channel_to_compute++) {
+    do_compdist(inbuf, outbuf, in_frames, channels, channel_to_compute, 
+		cutoff, maxmult, lookupflag, table, range, maxamp);
+  }  
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;
+
+}
+
+void ringfeed(t_bashfest *x, int slot, int *pcount)
+{
+  float overhang;
+  int i, j;
+  int fade_frames;
+  float fadegain;
+  int fadestart;
+  float input_sample;
+  float rez ;
+  /* main variables */
+  int out_frames;
+//  int frames = x->events[slot].sample_frames;
+  int channels = x->events[slot].out_channels;
+  int buf_frames = x->buf_frames;
+  float *params = x->params; 
+  float srate = x->sr;
+  /*function specific*/
+  float *sinewave = x->sinewave;
+  int sinelen = x->sinelen ;
+  CMIXCOMB *combies = x->combies;
+  CMIXRESON *resies = x->resies;
+  CMIXOSC oscar = x->oscar;
+  float maxloop = x->max_comb_lpt;
+
+  float *inbuf, *outbuf;
+  int in_start = x->events[slot].in_start;
+  int out_start = x->events[slot].out_start;
+  int in_frames = x->events[slot].sample_frames;
+  int buflen = x->buf_samps;
+  int halfbuffer = x->halfbuffer;
+  
+  ++(*pcount);
+
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+  
+  oscar.func = sinewave;
+  oscar.len = sinelen;
+  oscar.si = params[(*pcount)++] * ((float)oscar.len / srate);
+  oscar.phs = 0;
+  rez = params[(*pcount)++] ;
+  if( rez > 0 )
+    combies[0].lpt = 1. / rez ;
+  else error("zero comb resonance is bad luck");
+  if(combies[0].lpt > maxloop)
+    error("ringfeed does not appreciate looptimes as large as %f",combies[0].lpt);
+
+  combies[0].rvbt = params[(*pcount)++] ;
+  if(combies[0].rvbt >= 1.0) {
+    error("ringfeed dislikes feedback values >= 1");
+    combies[0].rvbt = .99 ;
+  }
+  resies[0].cf = params[(*pcount)++];
+  resies[0].bw  = resies[0].cf * params[(*pcount)++];
+  overhang = params[(*pcount)++] ;
+  
+  inbuf = x->events[slot].workbuffer + in_start;
+
+  for( i = 0; i < channels ; i++ ){
+    mycombset( combies[0].lpt, combies[0].rvbt, 0, combies[i].arr,srate);
+    rsnset2(resies[0].cf, resies[0].bw, RESON_NO_SCL, 0., resies[i].q, srate);
+  }
+
+  /* MINIMUM OVERHANG */
+
+  if( overhang < COMBFADE )
+    overhang = COMBFADE;
+
+  out_frames = in_frames + overhang * srate ;
+  if( out_frames > buf_frames / 2 ){
+    out_frames = buf_frames / 2 ;
+  } 
+  /* INPUT LOOP */
+  for( i = 0; i < in_frames * channels; i += channels ){
+    for( j = 0; j < channels; j++ ){
+      input_sample = *(inbuf + i + j ) ;
+
+      input_sample *= oscil(1.0, oscar.si, oscar.func, oscar.len, &oscar.phs);
+      input_sample += mycomb(input_sample, combies[j].arr);
+      *(outbuf +i+j) = reson(input_sample, resies[j].q);
+    }
+  }
+  
+  /* COMB TAILS */
+
+  for( i = in_frames * channels; i < out_frames * channels; i += channels ){
+    for( j = 0; j < channels; j++ ){
+      *(outbuf +i+j) = reson(mycomb( 0.0, combies[j].arr), resies[j].q );
+    }
+  }
+
+  /* FADE OUT ON MIX */
+
+  fade_frames = COMBFADE * srate;
+  fadestart = (out_frames - fade_frames) * channels ;
+  for( i = 0; i < fade_frames * channels; i += channels ){
+    fadegain = 1.0 - (float) i / (float) (fade_frames * channels)  ;
+    *(outbuf + fadestart + i) *= fadegain;
+    if( channels == 2 ){
+      *(outbuf + fadestart + i + 1) *= fadegain;
+    }
+  }
+  x->events[slot].sample_frames = out_frames;
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;
+
+}
+
+void resonadsr(t_bashfest *x, int slot, int *pcount)
+{
+  int i;
+  float bwfac;
+  float q1[5], q2[5];
+  float cf, bw;
+  float si;
+  float notedur;
+  float phase = 0.;
+//  int j = 0;
+  /* main variables */
+
+//  int out_frames;
+//  int frames = x->events[slot].sample_frames;
+  int channels = x->events[slot].out_channels;
+//  int buf_frames = x->buf_frames;
+  float *params = x->params; 
+  float srate = x->sr;
+
+
+  float *inbuf, *outbuf;
+  int in_start = x->events[slot].in_start;
+  int out_start = x->events[slot].out_start;
+  int in_frames = x->events[slot].sample_frames;
+  int buflen = x->buf_samps;
+  int halfbuffer = x->halfbuffer;
+  
+  /*function specific*/
+  CMIXADSR *a = x->adsr;
+  int funclen = a->len;
+  float *adsrfunc = a->func;
+
+  ++(*pcount);
+  a->a = params[(*pcount)++];
+  a->d = params[(*pcount)++];
+  a->r = params[(*pcount)++];
+  a->v1 = params[(*pcount)++];
+  a->v2 = params[(*pcount)++];
+  a->v3 = params[(*pcount)++];
+  a->v4 = params[(*pcount)++];
+  bwfac = params[(*pcount)++];
+
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;
+  outbuf = x->events[slot].workbuffer + out_start;
+  
+  notedur = (float) in_frames / srate ;
+  a->s = notedur - (a->a+a->d+a->r);
+  if( a->s <= 0.0 ){
+    a->a=a->d=a->s=a->r= notedur/ 4. ;
+  }
+  buildadsr(a);
+  si = ((float) funclen / srate) / notedur ;
+
+  phase = 0;
+
+  rsnset2(adsrfunc[(int)phase], adsrfunc[(int) phase]*bwfac, 2.0, 0.0, q1, srate);
+  if( channels == 2 ){
+    rsnset2( adsrfunc[(int)phase], adsrfunc[(int) phase]*bwfac, 2.0, 0.0, q2, srate );
+  }
+  
+  for(i = 0; i < in_frames*channels; i += channels ){
+    phase += si;
+    if( phase > funclen - 1)
+      phase = funclen - 1;	/* stop at end of function */
+
+    cf = adsrfunc[ (int) phase ];
+    bw = bwfac * cf ;
+    rsnset2( cf, bw, 2.0, 1.0, q1, srate );
+    outbuf[i] = reson(inbuf[i], q1);
+    if( channels == 2 ){
+      rsnset2( cf, bw, 2.0, 1.0, q2, srate );
+      outbuf[i+1] = reson(inbuf[i+1], q2);
+    }
+  }
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;
+
+}
+
+void stv(t_bashfest *x, int slot, int *pcount)
+{
+  int i,j;
+  /* main variables */
+
+//  int out_frames;
+  int frames = x->events[slot].sample_frames;
+  int channels = x->events[slot].out_channels;
+//  int buf_frames = x->buf_frames;
+  float *params = x->params; 
+  float srate = x->sr;
+  /*function specific*/
+  float *sinewave = x->sinewave;
+  int sinelen = x->sinelen ;
+  float *delayline1 = x->delayline1;  
+  float *delayline2 = x->delayline2;  
+  float max_delay = x->maxdelay ;
+  CMIXOSC osc1, osc2; // put into main object structure
+  float mindel, maxdel;
+  float fac1, fac2;
+  int dv1[2], dv2[2]; /* cmix bookkeeping */
+  float delay_time;
+  float speed1, speed2, depth ;
+//  float max;
+
+  float *inbuf, *outbuf;
+  int in_start = x->events[slot].in_start;
+  int out_start = x->events[slot].out_start;
+//  int in_frames = x->events[slot].sample_frames;
+  int buflen = x->buf_samps;
+  int halfbuffer = x->halfbuffer;
+  
+  ++(*pcount);
+  speed1 = params[(*pcount)++];
+  speed2 = params[(*pcount)++];
+  depth = params[(*pcount)++];
+
+  out_start = (in_start + halfbuffer) % buflen ;
+  inbuf = x->events[slot].workbuffer + in_start;    
+  outbuf = x->events[slot].workbuffer + out_start;  
+
+  mindel = .001;
+  maxdel = depth;
+
+  if( maxdel > max_delay ){
+    maxdel = max_delay;
+  }
+
+  delset2(delayline1, dv1, max_delay,srate);
+  delset2(delayline2, dv2, max_delay,srate);
+
+  fac2 = .5 * (maxdel - mindel) ;
+  fac1 = mindel + fac2;
+
+  osc1.func = sinewave;
+  osc1.len = sinelen;
+  osc1.si = ((float) sinelen / srate ) * speed1 ;
+  osc1.phs = 0;
+  osc1.amp = fac2;
+
+  osc2.func = sinewave;
+  osc2.len = sinelen;
+  osc2.si = ((float) sinelen / srate ) * speed2 ;
+  osc2.phs = 0;
+  osc2.amp = fac2;
+
+  if( channels == 1 ){
+    for(i = 0, j = 0; i < frames; i++, j+=2 ){
+      
+      delay_time = fac1 +
+	oscil(osc1.amp, osc1.si, osc1.func, osc1.len, &osc1.phs);
+      delput2( inbuf[i], delayline1, dv1);
+      outbuf[j] = dliget2(delayline1, delay_time, dv1,srate);
+      
+      delay_time = fac1 +
+	oscil(osc2.amp, osc2.si, osc2.func, osc2.len, &osc2.phs);
+      delput2( inbuf[i], delayline2, dv2);
+      outbuf[j + 1] = dliget2(delayline2, delay_time, dv2,srate);    
+    }
+  }
+  else if( channels == 2 ){
+    for(i = 0; i < frames*2; i += 2 ){
+      delay_time = fac1 +
+	oscil(osc1.amp, osc1.si, osc1.func, osc1.len, &osc1.phs);
+      delput2( inbuf[i], delayline1, dv1);
+      outbuf[i] = dliget2(delayline1, delay_time, dv1,srate);
+      
+      delay_time = fac1 +
+	oscil(osc2.amp, osc2.si, osc2.func, osc2.len, &osc2.phs);
+      delput2( inbuf[i + 1], delayline2, dv2);
+      outbuf[i + 1] = dliget2(delayline2, delay_time, dv2,srate);    
+      
+    }
+  }
+  x->events[slot].out_start = in_start;
+  x->events[slot].in_start = (x->events[slot].out_start + halfbuffer) % buflen ;
+  x->events[slot].out_channels = 2; // we are now stereo, regardless of what we were before
+}
diff --git a/externals/lyonpotpourri/bashfest_helper.c b/externals/lyonpotpourri/bashfest_helper.c
new file mode 100755
index 0000000000000000000000000000000000000000..81061ecb41f35a11a978ec77f281a7e108cd178a
--- /dev/null
+++ b/externals/lyonpotpourri/bashfest_helper.c
@@ -0,0 +1,648 @@
+#include "bashfest.h"
+#include "stdlib.h"
+
+void putsine (float *arr, int len);
+float boundrand(float min, float max);
+
+
+void putsine (float *arr, int len) 
+{
+  int i;
+  double twopi;
+  twopi = 8.0 * atan2(1.,1.);
+
+  for ( i = 0; i < len ; i++) {
+    *(arr + i) = sin( twopi * i / len);
+  }
+}
+
+float boundrand(float min, float max)
+{
+  return min + (max-min) * ((float)rand()/MY_MAX);
+}
+
+
+void mycombset(float loopt,float rvt,int init,float *a,float srate)
+{
+  int j;
+  
+  a[0] =  (3.0 + (loopt * srate + .5));
+  a[1] = rvt;
+  if(!init) { 
+    for(j=3; j<(int)*a; j++)  
+      a[j] = 0;
+    a[2] = 3;
+  }
+}
+
+float mycomb(float samp,float *a)
+{
+  float temp,*aptr;
+  if ( a[2] >= (int) a[0]) 
+    a[2] = 3;
+  aptr = a + (int)a[2];
+  a[2]++; 
+  temp = *aptr;
+  *aptr = *aptr * a[1] + samp;
+  return(temp);
+}
+
+void setweights(float *a, int len)
+{
+  float sum = 0.0;
+  int i;
+  for(i=0;i<len;i++)
+    sum += a[i];
+  if(sum == 0.0){
+    error("zero odds sum");
+  }
+  for(i=0;i<len;i++)
+    a[i] /= sum;
+  for(i=1;i<len;i++)
+    a[i] += a[i-1];
+}
+
+void  delset2(float *a,int *l,float xmax, float srate)
+{
+  /* delay initialization.  a is address of float array, l is size-2 int 
+   * array for bookkeeping variables, xmax, is maximum expected delay */
+
+  int i;
+  *l = 0;
+  *(l+1) = (int)(xmax * srate + .5);
+  for(i = 0; i < *(l+1); i++) *(a+i) = 0;
+}
+
+void delput2(float x,float *a,int *l)
+{
+
+  /* put value in delay line. See delset. x is float */
+
+  *(a + (*l)++) = x;
+  if(*(l) >= *(l+1)) *l -= *(l+1);
+}                                                            
+
+float dliget2(float *a,float wait,int *l,float srate)
+{
+  /* get interpolated value from delay line, wait seconds old */
+  register int im1;
+  float x = wait * srate;
+  register int i = x;
+  float frac = x - i;
+  i = *l - i;
+  im1 = i - 1;
+  if(i <= 0) { 
+    if(i < 0) i += *(l+1);
+    if(i < 0) return(0.);
+    if(im1 < 0) im1 += *(l+1);
+  }
+  return(*(a+i) + frac * (*(a+im1) - *(a+i)));
+}
+
+void butterLopass( float *in, float *out, float cutoff, int frames, int channels, float srate)
+
+{
+  int channel_to_compute;
+  float data[8];
+
+  for( channel_to_compute = 0; channel_to_compute < channels; channel_to_compute++) {
+    butset( data );
+    lobut(data, cutoff, srate);
+    butter_filter( in, out, data, frames, channels, channel_to_compute);
+  }
+
+}
+
+void butterBandpass(float *in, float *out, float center, float bandwidth, int frames,int  channels, float srate)
+{
+  int channel_to_compute;
+  float data[8];
+
+  for( channel_to_compute = 0; channel_to_compute < channels; channel_to_compute++) {
+    butset( data );
+    bpbut(data, center, bandwidth, srate);
+    butter_filter( in, out, data, frames, channels, channel_to_compute);
+  }
+
+}
+
+
+void butterHipass(float *in, float *out, float cutoff, int frames,int channels, float srate)
+{
+  int channel_to_compute;
+  float data[8];
+
+  for( channel_to_compute = 0; channel_to_compute < channels; channel_to_compute++) {
+    butset( data );
+    hibut(data, cutoff, srate);
+    butter_filter( in, out, data, frames, channels, channel_to_compute);
+  }
+
+}
+
+void butset(float *a)		
+{
+  a[6] = a[7] = 0.0;
+}
+
+void lobut(float *a, float cutoff,float SR)			
+{
+  register float	 c;
+
+  c = 1.0 / tan( PI * cutoff / SR);
+  a[1] = 1.0 / ( 1.0 + ROOT2 * c + c * c);
+  a[2] = a[1] + a[1];
+  a[3] = a[1];
+  a[4] = 2.0 * ( 1.0 - c*c) * a[1];
+  a[5] = ( 1.0 - ROOT2 * c + c * c) * a[1];
+
+	
+}
+
+void hibut(float *a, float cutoff, float SR)			
+{
+
+  register float	c;
+
+  c = tan( PI * cutoff / SR);
+  a[1] = 1.0 / ( 1.0 + ROOT2 * c + c * c);
+  a[2] = -2.0 * a[1];
+  a[3] = a[1];
+  a[4] = 2.0 * ( c*c - 1.0) * a[1];
+  a[5] = ( 1.0 - ROOT2 * c + c * c) * a[1];
+
+}
+
+void bpbut(float *a, float formant, float bandwidth,float  SR)
+{
+  register float  c, d;
+
+  c = 1.0 / tan( PI * bandwidth / SR);
+  d = 2.0 * cos( 2.0 * PI * formant / SR);
+  a[1] = 1.0 / ( 1.0 + c);
+  a[2] = 0.0;
+  a[3] = -a[1];
+  a[4] = - c * d * a[1];
+  a[5] = ( c - 1.0) * a[1];
+	
+}
+/* in array can == out array */
+
+void butter_filter(float *in,float *out,float *a, int frames, int channels, int channel)
+{
+
+  int i;
+  float t ,y ;
+
+  for( i = channel ; i < frames * channels; i+= channels )
+    {
+      t = *(in + i) - a[4] * a[6] - a[5] * a[7];
+      y = t * a[1] + a[2] * a[6] + a[3] * a[7];
+      a[7] = a[6];
+      a[6] = t;
+      *(out + i) = y;
+    }
+}
+
+void rsnset2(float cf,float bw,float scl,float xinit,float *a,float srate)
+{
+//  double exp(),cos(),sqrt();
+  float c,temp;
+  if(!xinit) {
+    a[4] = 0;
+    a[3] = 0;
+  }
+  a[2] = exp(-PI2 * bw/srate);
+  temp = 1. - a[2];
+  c = a[2] + 1;
+  a[1] = 4. * a[2]/c * cos(PI2 * cf/srate);
+  if(scl < 0) a[0] = 1;
+  if(scl) a[0] = sqrt(temp/c*(c*c-a[1]*a[1]));
+  if(!scl) a[0] = temp*sqrt(1.-a[1]*a[1]/(4.*a[2]));
+}
+
+float reson(float x,float *a)
+{
+  float temp;
+  temp = *a * x + *(a+1) * *(a+3) - *(a+2) * *(a+4);
+  *(a+4) = *(a+3);
+  *(a+3) = temp;
+  return(temp);
+}
+
+float allpass(float samp,float *a)
+{
+  float temp,*aptr;
+  if ( a[STARTM1] >= (int) a[0]) a[STARTM1] = START;
+  aptr = a + (int)a[STARTM1];
+  a[STARTM1] ++; 
+  temp = *aptr;
+  *aptr = *aptr * a[1] + samp;
+  return(temp - a[1] * *aptr);
+}
+
+void init_reverb_data(float *a)
+{
+  a[0] = 2;
+  a[1] = -0.61043329;
+  a[2] = -1.4582246;
+  a[3] = 1;
+  a[4] = 0.75887003;
+  a[5] = 1;
+  a[6] = -0.6922953;
+  a[7] = 0;
+  a[8] = 0;
+  a[9] = 0.035888535;
+}
+
+void reverb1me(float *in, float *out, int inFrames, int out_frames, int nchans, 
+	       int channel, float revtime, float dry, t_bashfest *x)
+{
+  float dels[4];// stick into main structure
+  float **alpo = x->mini_delay ;
+  float a1,a2,a3,a4;
+  int i;
+//  int alsmp ;
+  float *fltdata = x->reverb_ellipse_data;
+
+  int nsects;
+  float xnorm;
+  LSTRUCT *eel = x->eel;
+
+  float wet;
+//  float max;
+  float srate = x->sr;
+//  float max_del = x->max_mini_delay ;
+
+  wet = cos(1.570796 * dry);
+  dry = sin(1.570796 * dry);
+
+  /* combset uses reverb time , mycombset uses feedback */
+  for( i = 0; i < 4; i++ ){
+    dels[i] = boundrand(.005, .1 );
+	if(dels[i] < .005 || dels[i] > 0.1) {
+		post("reverb1: bad random delay time: %f",dels[i]);
+		dels[i] = .05;
+	}
+    mycombset(dels[i], revtime, 0, alpo[i], srate);
+  }
+
+  ellipset(fltdata,eel,&nsects,&xnorm); 
+
+  for( i = channel ; i < inFrames * nchans; i += nchans ){
+
+    a1 = allpass(in[i], alpo[0]);
+    a2 = allpass(in[i], alpo[1]);
+    a3 = allpass(in[i], alpo[2]);
+    a4 = allpass(in[i], alpo[3]); 
+    
+
+    out[i] = in[i] * dry + ellipse((a1+a2+a3+a4), eel, nsects,xnorm) * wet;
+  }
+
+  for( i = channel + inFrames * nchans; i < out_frames * nchans; i += nchans ){
+
+    a1 = allpass(0.0, alpo[0]);
+    a2 = allpass(0.0, alpo[1]);
+    a3 = allpass(0.0, alpo[2]);
+    a4 = allpass(0.0, alpo[3]); 
+
+    out[i] =  ellipse((a1+a2+a3+a4), eel, nsects,xnorm) * wet;
+
+  }
+
+}
+
+void feed1(float *inbuf, float *outbuf, int in_frames, int out_frames,int channels, float *functab1,
+	   float *functab2,float *functab3,float *functab4,int funclen, 
+	   float duration, float maxDelay, t_bashfest *x)
+{
+  int i;
+  float srate = x->sr;
+  float *delayLine1a = x->mini_delay[0];
+  float *delayLine2a = x->mini_delay[1];
+  float *delayLine1b = x->mini_delay[2];
+  float *delayLine2b = x->mini_delay[3];
+  int dv1a[2], dv2a[2];		/* cmix bookkeeping */
+  int dv1b[2], dv2b[2];		/* cmix bookkeeping */
+  float delsamp1a=0, delsamp2a=0 ;
+  float delsamp1b=0, delsamp2b=0 ;
+  float delay1, delay2, feedback1, feedback2;
+  float funcSi, funcPhs;
+  float putsamp;
+
+  /***************************/
+
+  funcPhs = 0.;
+
+  // read once during note
+
+
+  funcSi = ((float) funclen / srate) / duration ;
+
+
+  delset2(delayLine1a, dv1a, maxDelay,srate);
+  delset2(delayLine2a, dv2a, maxDelay,srate);
+
+  if( channels == 2 ){
+    delset2(delayLine1b, dv1b, maxDelay,srate);
+    delset2(delayLine2b, dv2b, maxDelay,srate);
+  }
+
+
+  for(i = 0; i < out_frames*channels; i += channels ){
+    // buffer loop 
+
+    delay1 = functab1[ (int) funcPhs ];
+    delay2 = functab2[ (int) funcPhs ];
+    feedback1 = functab3[ (int) funcPhs ];
+    feedback2 = functab4[ (int) funcPhs ];
+
+    funcPhs += funcSi;
+    if( funcPhs >= (float) funclen )
+      funcPhs = 0;
+
+    putsamp = i < in_frames * channels ? inbuf[i] + delsamp1a*feedback1 : 0.0;
+	outbuf[i] = putsamp; // zero instead ??
+    
+    delput2( putsamp, delayLine1a, dv1a);
+    delsamp1a = dliget2(delayLine1a, delay1, dv1a,srate);
+
+    putsamp = delsamp1a+delsamp2a*feedback2 ;
+
+    delput2( putsamp, delayLine2a, dv2a);
+	delsamp2a = dliget2(delayLine2a, delay2, dv2a, srate);
+    outbuf[i] += delsamp2a;
+    
+
+    if( channels == 2 ){
+      putsamp = i < in_frames * channels ? inbuf[i+1] + delsamp1a*feedback1 : 0.0;
+	  outbuf[i+1] = putsamp;
+      delput2( putsamp, delayLine1b, dv1b);
+      delsamp1b = dliget2(delayLine1b, delay1, dv1b, srate);
+      putsamp = delsamp1b+delsamp2b*feedback2;
+      delput2( putsamp, delayLine2b, dv2b);
+	  delsamp2b = dliget2(delayLine2b, delay2, dv2b, srate);
+      outbuf[i+1] += delsamp2b;
+    }
+
+  }
+
+}
+
+void setflamfunc1(float *arr, int flen)
+{
+  int i;
+  float x;
+  for ( i = 0; i < flen; i++){
+    x = (float)i / (float) flen ;
+    *(arr + i) = ((x - 1) / (x + 1)) * -1.  ;
+
+  }
+}
+
+
+void setExpFlamFunc(float *arr, int flen, float v1,float v2,float alpha)
+{
+  int i;
+
+  if( alpha == 0 )
+    alpha = .00000001 ;
+
+  for ( i = 0; i < flen; i++){
+    *(arr + i) = v1 + (v2-v1) * ((1-exp((float)i*alpha/((float)flen-1.)))/(1-exp(alpha)));
+  }
+}
+
+void funcgen1(float *outArray, int outlen, float duration, float outMin, float outMax,
+	 float speed1, float speed2, float gain1, float gain2, float *phs1, float *phs2, 
+	 float *sine, int sinelen)
+{
+  float si1, si2;
+  float localSR;
+  int i;
+
+  localSR = duration * (float) outlen ;
+  *phs1 *= (float) sinelen;
+  *phs2 *= (float) sinelen;
+  si1 = ((float)sinelen/localSR)  * speed1;
+  si2 = ((float)sinelen/localSR)  * speed2;
+
+  for( i = 0; i < outlen; i++ ){
+    *(outArray + i) = oscil(gain1, si1, sine, sinelen, phs1) ;
+    *(outArray + i) += oscil(gain2, si2, sine, sinelen, phs2) ;
+  }
+  normtab( outArray, outArray, outMin, outMax, outlen);
+
+}
+
+
+void normtab(float *inarr,float *outarr, float min, float max, int len)
+{
+  int i;
+
+  float imin=9999999999., imax=-9999999999.;
+
+  for(i = 0; i < len ; i++){
+    if( imin > inarr[i] ) 
+      imin = inarr[i];
+    if( imax < inarr[i] ) 
+      imax = inarr[i];
+  }
+  for(i = 0; i < len; i++ )
+    outarr[i] = mapp(inarr[i], imin, imax, min, max);
+  
+}
+
+float mapp(float in,float imin,float imax,float omin,float omax)
+{
+  if( imax == 0.0 )
+    {
+      return 0.0 ;
+    }
+  return( omin+((omax-omin)*((in-imin)/(imax-imin))) );
+}
+
+float oscil(float amp,float si,float *farray,int len,float *phs)
+{
+  register int i =  *phs;   
+  *phs += si;            
+  while(*phs >= len)
+    *phs -= len;     
+  return(*(farray+i) * amp);
+}
+
+void killdc( float *inbuf, int in_frames, int channels, t_bashfest *x)
+{
+  int i,j=1;
+  LSTRUCT *eel = x->eel;
+  int nsects;
+  float xnorm;
+  float *dcflt = x->dcflt;
+  
+  /* float dcflt[64] =
+     {3, -1.9999924    , -1.9992482    ,  1.0000000 
+     ,  .99928019    ,
+     -1.9999956    , -1.9964080    ,  1.0000000    ,  .99645999    ,
+     -1.9999994    , -1.9805074    ,  1.0000000    ,  .98069401    ,
+     .98817413E+00};*/
+
+  for( j = 0; j < channels; j++) {
+    ellipset(dcflt,eel,&nsects,&xnorm); 
+    
+    for( i = j; i < in_frames * channels ; i += channels ){
+      inbuf[i] = ellipse(inbuf[i], eel, nsects,xnorm);
+    }
+  }
+}
+
+void set_dcflt(float *a)
+{
+  a[0] = 3;
+  a[1] = -1.9999924;
+  a[2] = -1.9992482;
+  a[3] = 1;
+  a[4] = 0.99928019;
+  a[5] = -1.9999956;
+  a[6] = -1.996408;
+  a[7] = 1;
+  a[8] = 0.99645999;
+  a[9] = -1.9999994;
+  a[10] = -1.9805074;
+  a[11] = 1;
+  a[12] = 0.98069401;
+  a[13] = 0.98817413;
+}
+
+void set_distortion_table(float *arr, float cut, float max, int len)
+{
+  int i, len2;
+  float samp;
+
+  len2 = len>>1 ;
+  for( i = len2; i < len; i++ ){
+    samp = (float)(i - len2) / (float) len2 ; 
+    if( samp > cut )
+      samp = mapp( samp, cut, 1.0,  cut, max );
+    *(arr + i) = samp;
+  }
+  for( i = 0; i < len2; i++ )
+    *(arr + i) = - *(arr + len - (i+1));
+}
+
+float dlookup(float samp,float *arr,int len) 
+{
+  return arr[(int) (((samp+1.0)/2.0) * (float) len)];
+
+}
+
+void do_compdist(float *in,float *out,int sampFrames,int nchans,int channel, 
+	    float cutoff,float maxmult,int lookupflag,float *table,int range,float bufMaxamp)
+{
+
+  int i;
+
+  float rectsamp;
+
+  for( i = channel ; i < sampFrames * nchans; i+= nchans )
+    {
+	
+      if( lookupflag){
+	*(out + i) = dlookup( *(in + i)/bufMaxamp, table, range );
+      } else {
+	rectsamp = fabs( *(in + i) ) / bufMaxamp;
+	if( rectsamp > cutoff ){
+	  *(in + i) = *(out + i) * 
+	    mapp( rectsamp, cutoff, 1.0, cutoff, maxmult);
+	}
+      }
+    }
+}
+
+float getmaxamp(float *arr, int len) 
+{
+  int i;
+  float max = 0;
+
+  for(i = 0; i < len; i++ ){
+    if( fabs(arr[i]) > max )
+      max = fabs(arr[i]);
+  }
+  return max;
+}
+
+void buildadsr(CMIXADSR *a)
+{
+  float A = a->a;
+  float D = a->d;
+  float S = a->s;
+  float R = a->r;
+  float f1 = a->v1;
+  float f2 = a->v2;
+  float f3 = a->v3;
+  float f4 = a->v4;
+
+  int funclen = a->len;
+  float *func = a->func;
+  float total;
+  int ipoint = 0;
+  int i;
+  int segs[4];
+  float m1,m2;
+  total = A + D + S + R ;
+
+  segs[0] = (A/total) * funclen;
+  segs[1] = (D/total) * funclen;
+  segs[2] = (S/total) * funclen;
+  segs[3] = funclen - (segs[0]+segs[1]+segs[2]);
+
+  if( f1 > 20000. || f1 < -20000. ){
+    f1 = 250.0;
+  }
+  if( f2 > 20000. || f2 < -20000. ){
+    f2 = 1250.0;
+  }
+  if( f3 > 20000. || f3 < -20000. ){
+    f3 = 950.0;
+  }
+  if( f4 > 20000. || f4 < -20000. ){
+    f4 = f1;
+  }
+
+  if( segs[0] <= 0 || segs[1] <= 0 || segs[2] <= 0 || segs[3] <= 0 ){
+
+    for( i = 0; i < 4; i++ ){
+      segs[i] = funclen / 4;
+    }
+  }
+
+  for( i = 0 ; i < segs[0]; i++ ){
+    m1 = 1.-(float)i/(float)(segs[0]);
+    m2 = 1. - m1;
+    *(func +i ) = f1 * m1 + f2 * m2;
+  }
+  ipoint = i;
+
+  for( i = 0 ; i < segs[1]; i++ ){
+    m1 = 1.-(float)i/(float)(segs[1]);
+    m2 = 1. - m1;
+    *(func + i + ipoint) = f2 * m1 + f3 * m2;
+  }
+  ipoint += i;
+
+  for( i = 0 ; i < segs[2]; i++ ){
+    m1 = 1.-(float)i/(float)(segs[2]);
+    m2 = 1. - m1;
+    *(func + i + ipoint) = f3;
+  }
+  ipoint += i;
+
+  for( i = 0 ; i < segs[3]; i++ ){
+    m1 = 1.-(float)i/(float)(segs[3]);
+    m2 = 1. - m1;
+    *(func + ipoint + i) = f3 * m1 + f4 * m2;
+  }
+  ipoint += i;
+
+}
+
diff --git a/externals/lyonpotpourri/bashfest~-help.pd b/externals/lyonpotpourri/bashfest~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..6af9f919faeb46ab414a51660eed071ecd517936
--- /dev/null
+++ b/externals/lyonpotpourri/bashfest~-help.pd
@@ -0,0 +1,312 @@
+#N canvas 405 213 512 342 10;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array bashdrum 16884 float 2;
+#X coords 0 1 16884 -1 60 20 1;
+#X restore 291 75 graph;
+#X obj 146 297 dac~;
+#N canvas 696 403 518 368 load-samples 0;
+#X obj 41 107 soundfiler;
+#X msg 41 39 bang;
+#X obj 41 65 openpanel;
+#X obj 158 26 loadbang;
+#X msg 41 87 read -resize \$1 bashdrum;
+#X obj 156 132 loadbang;
+#X msg 157 52 read -resize sound/kick_11d.aiff bashdrum;
+#X msg 111 161 read -resize sound/hi_c_12b.aiff hihat;
+#X msg 148 203 read -resize sound/KR55SNAR.aiff snare;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 3 0 6 0;
+#X connect 4 0 0 0;
+#X connect 5 0 7 0;
+#X connect 5 0 8 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X connect 8 0 0 0;
+#X restore 291 110 pd load-samples;
+#X floatatom 429 211 5 0 0 0 - - -, f 5;
+#X msg 429 183 0.5;
+#X obj 429 156 loadbang;
+#X obj 146 113 samm~ 120 4;
+#N canvas 525 461 474 324 hatter 0;
+#X obj 74 99 player~ hihat 1;
+#X obj 174 70 sig~ 1;
+#X obj 74 47 mask~ 1 0.7 0.7 0.7 1 0 0.5 0.6 1 0.7 1 0 1 0.7 0 0;
+#X obj 74 19 inlet~;
+#X obj 74 222 vdp~ 500;
+#X msg 311 123 44100;
+#X msg 266 122 16384;
+#X obj 278 148 /;
+#X obj 266 97 t b b;
+#X floatatom 99 196 10 0 0 0 - - -, f 10;
+#X obj 293 73 loadbang;
+#X obj 266 75 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 74 275 outlet~;
+#X text 137 223 compensate for bashfest latency;
+#X obj 279 179 * 1000;
+#X floatatom 135 253 5 0 0 0 - - -, f 5;
+#X obj 74 248 *~ 0.15;
+#X connect 0 0 4 0;
+#X connect 1 0 0 1;
+#X connect 2 0 0 0;
+#X connect 3 0 2 0;
+#X connect 4 0 16 0;
+#X connect 5 0 7 1;
+#X connect 6 0 7 0;
+#X connect 7 0 14 0;
+#X connect 8 0 6 0;
+#X connect 8 1 5 0;
+#X connect 9 0 4 1;
+#X connect 10 0 8 0;
+#X connect 11 0 8 0;
+#X connect 14 0 9 0;
+#X connect 15 0 16 1;
+#X connect 16 0 12 0;
+#X restore 82 201 pd hatter;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array hihat 9097 float 2;
+#X coords 0 1 9097 -1 60 20 1;
+#X restore 356 75 graph;
+#N canvas 0 22 462 312 metronome-control 0;
+#X floatatom 52 88 5 0 0 0 - - -, f 5;
+#X msg 51 112 tempo \$1;
+#X msg 127 59 120;
+#X msg 51 55 60;
+#X msg 138 114 pause;
+#X msg 190 114 resume;
+#X obj 81 150 outlet;
+#X msg 92 56 140;
+#X connect 0 0 1 0;
+#X connect 1 0 6 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 6 0;
+#X connect 5 0 6 0;
+#X connect 7 0 0 0;
+#X restore 146 73 pd metronome-control;
+#N canvas 441 424 622 472 processor-control 0;
+#X obj 169 182 outlet;
+#N canvas 301 93 925 625 set-processor-odds 0;
+#X obj 87 552 outlet;
+#X msg 392 170 setodds 0 0 0 0 0 1;
+#X text 543 169 sweepreson;
+#X msg 391 316 setodds 0 0 0 0 0 0 0 0 0 0 0 1;
+#X msg 388 481 setodds 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1;
+#X msg 391 447 setodds 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1;
+#X msg 388 509 setodds 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1;
+#X text 708 509 resonadsr;
+#X msg 387 535 setodds 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1;
+#X text 468 51 transpose;
+#X msg 393 54 setodds 1;
+#X text 485 75 ringmod;
+#X msg 394 76 setodds 0 1;
+#X text 518 145 truncate;
+#X msg 393 145 setodds 0 0 0 0 1;
+#X msg 393 239 setodds 0 0 0 0 0 0 0 0 1;
+#X msg 86 160 flatodds;
+#X text 362 8 Processors by position in list. Any list combination
+will select a set of processors in specified weighting for random selection.
+;
+#X text 493 99 flange;
+#X msg 392 100 setodds 0 0 1;
+#X text 514 121 butterworth filters;
+#X msg 394 120 setodds 0 0 0 1;
+#X msg 394 192 setodds 0 0 0 0 0 0 1;
+#X text 545 191 comb;
+#X text 565 214 slidecomb;
+#X msg 393 215 setodds 0 0 0 0 0 0 0 1;
+#X text 586 239 reverb;
+#X msg 392 265 setodds 0 0 0 0 0 0 0 0 0 1;
+#X text 590 268 elliptical filters;
+#X msg 392 291 setodds 0 0 0 0 0 0 0 0 0 0 1;
+#X text 608 293 distortion/compression;
+#X text 615 313 feedback;
+#X msg 390 343 setodds 0 0 0 0 0 0 0 0 0 0 0 0 1;
+#X text 624 342 reverse;
+#X msg 390 367 setodds 0 0 0 0 0 0 0 0 0 0 0 0 0 1;
+#X text 649 366 flam1;
+#X msg 390 391 setodds 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1;
+#X text 664 391 flam2;
+#X msg 390 417 setodds 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1;
+#X text 671 419 expflam;
+#X text 688 442 comb4;
+#X text 700 479 ringmod/feedback;
+#X text 722 535 stereo vdelay;
+#X msg -21 73 setodds 0.25 0.5 1 0 0 1 0.2 0 0 1 1 0.1 0.1 0 0 0.3
+;
+#X msg -12 96 setodds 1 1 1 1 1 1 1 1 0 1 1 0 1 0.2 0.2 0.2 1 1 1 1
+;
+#X text 2 53 a couple distributions;
+#X text 85 141 equal distribution;
+#X connect 1 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 8 0 0 0;
+#X connect 10 0 0 0;
+#X connect 12 0 0 0;
+#X connect 14 0 0 0;
+#X connect 15 0 0 0;
+#X connect 16 0 0 0;
+#X connect 19 0 0 0;
+#X connect 21 0 0 0;
+#X connect 22 0 0 0;
+#X connect 25 0 0 0;
+#X connect 27 0 0 0;
+#X connect 29 0 0 0;
+#X connect 32 0 0 0;
+#X connect 34 0 0 0;
+#X connect 36 0 0 0;
+#X connect 38 0 0 0;
+#X connect 43 0 0 0;
+#X connect 44 0 0 0;
+#X restore 170 80 pd set-processor-odds;
+#N canvas 0 22 466 316 efficiency 0;
+#X msg 53 138 mute \$1;
+#X obj 53 98 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1
+;
+#X msg 168 119 block_dsp \$1;
+#X obj 169 89 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 139 182 outlet;
+#X text 211 93 turn off dsp;
+#X text 54 81 mute object;
+#X connect 0 0 4 0;
+#X connect 1 0 0 0;
+#X connect 2 0 4 0;
+#X connect 3 0 2 0;
+#X restore 284 155 pd efficiency;
+#N canvas 415 474 641 390 process-amount 0;
+#X obj 78 207 outlet;
+#N canvas 680 241 454 304 setodds 0;
+#X msg 124 131 minimum_process \$1;
+#X obj 158 91 unpack f f;
+#X msg 294 131 maximum_process \$1;
+#X obj 125 163 outlet;
+#X obj 159 58 inlet;
+#X connect 0 0 3 0;
+#X connect 1 0 0 0;
+#X connect 1 1 2 0;
+#X connect 2 0 3 0;
+#X connect 4 0 1 0;
+#X restore 79 165 pd setodds;
+#X msg 79 130 0 1;
+#X msg 36 130 0 0;
+#X msg 120 131 1 1;
+#X msg 156 131 1 2;
+#X text 162 164 set minimum and maximum processing iterations.;
+#X text 164 185 More processing means cooler sounds \, but could;
+#X msg 194 131 2 4;
+#X text 163 205 also overtax your CPU.;
+#X obj 120 94 loadbang;
+#X msg 234 133 4 8;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 1 0;
+#X connect 5 0 1 0;
+#X connect 8 0 1 0;
+#X connect 10 0 4 0;
+#X connect 11 0 1 0;
+#X restore 207 116 pd process-amount;
+#X msg 75 135 grab;
+#X text 17 103 grab new sound from current processing;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X restore 6 74 pd processor-control;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array snare 9284 float 2;
+#X coords 0 1 9284 -1 60 20 1;
+#X restore 420 75 graph;
+#X obj 146 178 bashfest~ snare 2000 16384 12;
+#X obj 146 139 mask~ 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1;
+#N canvas 46 411 513 413 bassdrum 0;
+#X obj 156 100 sig~ 1;
+#X obj 35 7 inlet~;
+#X obj 35 270 vdp~ 500;
+#X msg 272 178 44100;
+#X msg 227 177 16384;
+#X obj 239 203 /;
+#X obj 227 152 t b b;
+#X floatatom 61 243 10 0 0 0 - - -, f 10;
+#X obj 254 128 loadbang;
+#X obj 227 130 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 35 353 outlet~;
+#X text 98 271 compensate for bashfest latency;
+#X floatatom 73 308 5 0 0 0 - - -, f 5;
+#X obj 239 226 * 1000;
+#X obj 35 147 player~ bashdrum 1;
+#X obj 35 36 mask~ 1 0 1 1 1 0 0 0 1 0 0 0 1 0 1 0;
+#X obj 35 327 *~ 0.4;
+#X obj 77 292 hsl 90 8 0 0.5 0 0 empty empty empty -2 -8 0 10 -261820
+-1 -1 0 1;
+#X connect 0 0 14 1;
+#X connect 1 0 15 0;
+#X connect 2 0 16 0;
+#X connect 3 0 5 1;
+#X connect 4 0 5 0;
+#X connect 5 0 13 0;
+#X connect 6 0 4 0;
+#X connect 6 1 3 0;
+#X connect 7 0 2 1;
+#X connect 8 0 6 0;
+#X connect 9 0 6 0;
+#X connect 12 0 16 1;
+#X connect 13 0 7 0;
+#X connect 14 0 2 0;
+#X connect 15 0 14 0;
+#X connect 16 0 10 0;
+#X connect 17 0 12 0;
+#X restore 7 202 pd bassdrum;
+#X obj 146 223 *~ 0.4;
+#X obj 200 224 *~ 0.4;
+#N canvas 0 22 458 308 stereo-mix 0;
+#X obj 91 54 inlet~;
+#X obj 186 60 inlet~;
+#X obj 91 166 outlet~;
+#X obj 186 160 outlet~;
+#X obj 91 107 *~ 0.2;
+#X obj 186 109 *~ 0.2;
+#X obj 301 47 inlet;
+#X floatatom 301 73 5 0 0 0 - - -, f 5;
+#X connect 0 0 4 0;
+#X connect 1 0 5 0;
+#X connect 4 0 2 0;
+#X connect 5 0 3 0;
+#X connect 6 0 7 0;
+#X connect 7 0 5 1;
+#X connect 7 0 4 1;
+#X restore 146 266 pd stereo-mix;
+#X obj 266 247 hsl 100 12 0 1 0 0 empty empty gain -2 -8 0 10 -261820
+-1 -1 0 1;
+#X text 3 41 bashfest~ is a click triggered soundfile player with random
+DSP., f 65;
+#X text 153 159 args: array \, maxdur \, latency \, voices;
+#X obj 3 5 cnv 15 155 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X connect 3 0 15 1;
+#X connect 3 0 16 1;
+#X connect 4 0 3 0;
+#X connect 5 0 4 0;
+#X connect 6 0 13 0;
+#X connect 6 0 7 0;
+#X connect 6 0 14 0;
+#X connect 7 0 17 1;
+#X connect 7 0 17 0;
+#X connect 9 0 6 0;
+#X connect 10 0 12 0;
+#X connect 12 0 15 0;
+#X connect 12 1 16 0;
+#X connect 13 0 12 0;
+#X connect 14 0 17 1;
+#X connect 14 0 17 0;
+#X connect 15 0 17 0;
+#X connect 16 0 17 1;
+#X connect 17 0 1 0;
+#X connect 17 1 1 1;
+#X connect 18 0 17 2;
diff --git a/externals/lyonpotpourri/bashfest~.c b/externals/lyonpotpourri/bashfest~.c
new file mode 100755
index 0000000000000000000000000000000000000000..8055eced3470d91a43e119c28727b581cf0a2dfc
--- /dev/null
+++ b/externals/lyonpotpourri/bashfest~.c
@@ -0,0 +1,1357 @@
+#import "MSPd.h"
+#include "bashfest.h"
+#include <string.h>
+
+/* THIS IS PROBABLY THE LIMITING FACTOR FOR LARGE BUFFER SIZES
+ SO, MAKE THIS A PARAMETER, -OR- BUFFER THE INPUT TRIGGER ITSELF!!!
+ */
+#define DEFAULT_MAX_OVERLAP (8) // number of overlapping instances allowed
+#define ACTIVE 0
+#define INACTIVE 1
+#define MAX_VEC 2048
+#define DEFAULT_BUFFER_SIZE 4000.0 // 4 second default buffer size * 2
+#define DEFAULT_LATENCY 8192 //latency in samples after a trigger for note to start
+#define MAX_PARAMETERS 2048
+#define PROCESS_COUNT 20
+#define CYCLE_MAX 1024
+
+#define OBJECT_NAME "bashfest~"
+
+
+static t_class *bashfest_class;
+
+void *bashfest_new(t_symbol *msg, short argc, t_atom *argv);
+t_int *bashfest_perform_hosed(t_int *w);
+void bashfest_dsp(t_bashfest *x, t_signal **sp);
+void bashfest_dsp_free(t_bashfest *x);
+int bashfest_set_parameters(t_bashfest *x,float *params);
+t_int *bashfest_perform(t_int *w);
+void bashfest_deploy_dsp(t_bashfest *x);
+void bashfest_copy_to_MSP_buffer(t_bashfest *x, int slot);
+/*user messages*/
+void bashfest_stop(t_bashfest *x);
+void bashfest_info(t_bashfest *x);
+void bashfest_mute(t_bashfest *x, t_floatarg t);
+void bashfest_maximum_process(t_bashfest *x, t_floatarg n);
+void bashfest_minimum_process(t_bashfest *x, t_floatarg n);
+void bashfest_setbuf(t_bashfest *x, t_symbol *wavename);
+void bashfest_flatodds(t_bashfest *x);
+void bashfest_killproc(t_bashfest *x, long p);
+void bashfest_soloproc(t_bashfest *x, long p);
+void bashfest_latency(t_bashfest *x, long n);
+void bashfest_verbose(t_bashfest *x, long t);
+void bashfest_block_dsp(t_bashfest *x, t_floatarg t);
+void bashfest_gozero(t_bashfest *x);
+void bashfest_grab(t_bashfest *x);
+void bashfest_setodds(t_bashfest *x,t_symbol *msg, short argc, t_atom *argv);
+void bashfest_tcycle(t_bashfest *x,t_symbol *msg, short argc, t_atom *argv);
+/* function code */
+
+void killdc( float *inbuf, int in_frames, int channels, t_bashfest *x);
+
+void ringmod(t_bashfest *x, int slot, int *pcount);
+void retrograde(t_bashfest *x, int slot, int *pcount);
+void comber(t_bashfest *x, int slot, int *pcount);
+void transpose(t_bashfest *x, int slot, int *pcount);
+void flange(t_bashfest *x, int slot, int *pcount);
+void butterme(t_bashfest *x, int slot, int *pcount);
+void truncateme(t_bashfest *x, int slot, int *pcount);
+void sweepreson(t_bashfest *x, int slot, int *pcount);
+void slidecomb(t_bashfest *x, int slot, int *pcount);
+void reverb1(t_bashfest *x, int slot, int *pcount);
+void ellipseme(t_bashfest *x, int slot, int *pcount);
+void feed1me(t_bashfest *x, int slot, int *pcount);
+void flam1(t_bashfest *x, int slot, int *pcount);
+void flam2(t_bashfest *x, int slot, int *pcount);
+void expflam(t_bashfest *x, int slot, int *pcount);
+void comb4(t_bashfest *x, int slot, int *pcount);
+void ringfeed(t_bashfest *x, int slot, int *pcount);
+void resonadsr(t_bashfest *x, int slot, int *pcount);
+void stv(t_bashfest *x, int slot, int *pcount);
+void compdist(t_bashfest *x, int slot, int *pcount);
+
+
+void atom_arg_getfloat(float *c, long idx, long ac, t_atom *av);
+void atom_arg_getsym(t_symbol **c, long idx, long ac, t_atom *av);
+
+
+
+
+void bashfest_tilde_setup(void)
+{
+    bashfest_class = class_new(gensym("bashfest~"),(t_newmethod)bashfest_new,(t_method)bashfest_dsp_free, sizeof(t_bashfest), 0, A_GIMME,0);
+    CLASS_MAINSIGNALIN(bashfest_class,t_bashfest, x_f );
+    class_addmethod(bashfest_class,(t_method)bashfest_dsp,gensym("dsp"),A_CANT,0);
+    class_addmethod(bashfest_class,(t_method)bashfest_setbuf,gensym("setbuf"),A_SYMBOL,0);
+    class_addmethod(bashfest_class,(t_method)bashfest_stop,gensym("stop"),0);
+    class_addmethod(bashfest_class,(t_method)bashfest_flatodds,gensym("flatodds"),0);
+    class_addmethod(bashfest_class,(t_method)bashfest_soloproc,gensym("soloproc"),A_FLOAT,0);
+    class_addmethod(bashfest_class,(t_method)bashfest_killproc,gensym("killproc"),A_FLOAT,0);
+    class_addmethod(bashfest_class,(t_method)bashfest_latency,gensym("latency"),A_FLOAT,0);
+    class_addmethod(bashfest_class,(t_method)bashfest_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(bashfest_class,(t_method)bashfest_verbose,gensym("verbose"),A_FLOAT,0);
+    class_addmethod(bashfest_class,(t_method)bashfest_setodds,gensym("setodds"),A_GIMME,0);
+    class_addmethod(bashfest_class,(t_method)bashfest_tcycle,gensym("tcycle"),A_GIMME,0);
+    class_addmethod(bashfest_class,(t_method)bashfest_gozero,gensym("gozero"),0);
+    class_addmethod(bashfest_class,(t_method)bashfest_grab,gensym("grab"),0);
+    class_addmethod(bashfest_class,(t_method)bashfest_maximum_process,gensym("maximum_process"),A_FLOAT,0);
+    class_addmethod(bashfest_class,(t_method)bashfest_minimum_process,gensym("minimum_process"),A_FLOAT,0);
+    class_addmethod(bashfest_class,(t_method)bashfest_block_dsp,gensym("block_dsp"),A_FLOAT,0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+
+void bashfest_block_dsp(t_bashfest *x, t_floatarg t)
+{
+    
+    x->block_dsp = (short)t;
+    
+}
+void bashfest_maximum_process(t_bashfest *x, t_floatarg n)
+{
+    if(n < 0){
+        error("illegal val to maximum_process");
+        return;
+    }
+    x->max_process_per_note = (int)n;
+}
+
+void bashfest_minimum_process(t_bashfest *x, t_floatarg n)
+{
+    if(n < 0){
+        error("illegal val to minimum_process");
+        return;
+    }
+    x->min_process_per_note = (int)n;
+}
+
+void bashfest_verbose(t_bashfest *x, long t)
+{
+    x->verbose = t;
+}
+void bashfest_latency(t_bashfest *x, long n)
+{
+    if(n < x->vs){
+        error("latency cannot be less than %d",x->vs);
+        return;
+    }
+    /*  if(n > x->latency_samples){
+     x->trigger_buffer = (float *) realloc(x->trigger_buffer, n * sizeof(float));
+     }
+     x->tb_inpt = 0;
+     x->tb_outpt = x->latency_samples - x->vs;*/
+    x->latency_samples = n;
+}
+
+void bashfest_stop(t_bashfest *x)
+{
+    int i;
+	
+    for(i = 0; i < x->overlap_max; i++){
+        x->events[i].status = INACTIVE;
+    }
+}
+
+
+void bashfest_mute(t_bashfest *x, t_floatarg t)
+{
+    x->mute = (short)t;
+}
+
+
+void bashfest_grab(t_bashfest *x)
+{
+    x->grab = 1;
+}
+
+void bashfest_tcycle(t_bashfest *x,t_symbol *msg, short argc, t_atom *argv)
+{
+    t_cycle tcycle = x->tcycle;
+    int i;
+    float data=1.0;
+	
+    if(argc < 1){
+        error("no data for tcycle!");
+        return;
+    } else if(argc > CYCLE_MAX){
+        error("%d is the maximum size tcycle",CYCLE_MAX);
+        return;
+    }
+    x->tcycle.len = argc;
+    x->tcycle.p = 0;
+    for(i=0;i<argc;i++){
+        atom_arg_getfloat(&data,i,argc,argv);
+        if(data <= 0.0){
+            error("bad data for tcycle:%f",data);
+        } else {
+            tcycle.data[i] = data;
+        }
+    }
+}
+
+void bashfest_gozero(t_bashfest *x)
+{
+    x->tcycle.p = 0;
+}
+
+void bashfest_setodds(t_bashfest *x,t_symbol *msg, short argc, t_atom *argv)
+{
+    int i;
+    
+    if(argc > PROCESS_COUNT){
+        error("there are only %d processes",PROCESS_COUNT);
+        return;
+    }
+    for(i=0;i<PROCESS_COUNT;i++){
+        x->odds[i] = 0.0;
+    }
+    
+    
+    for(i=0;i<argc;i++){
+        x->odds[i] = atom_getfloatarg(i,argc,argv);
+    }
+    
+    setweights(x->odds,PROCESS_COUNT);
+}
+
+void bashfest_soloproc(t_bashfest *x, long p)
+{
+    int i;
+    if(p < 0 || p >= PROCESS_COUNT){
+        error("bad %d",p);
+    }
+    for(i=0;i<PROCESS_COUNT;i++){
+        x->odds[i] = 0.0;
+    }
+    x->odds[p] = 1.0;
+    setweights(x->odds,PROCESS_COUNT);
+}
+
+void bashfest_killproc(t_bashfest *x, long p)
+{
+    int i;
+    if(p < 0 || p >= PROCESS_COUNT){
+        error("bad %d",p);
+    }
+    for(i=0;i<PROCESS_COUNT;i++){
+        x->odds[i] = 1.0;
+    }
+    x->odds[p] = 0.0;
+    setweights(x->odds,PROCESS_COUNT);
+}
+
+void bashfest_flatodds(t_bashfest *x)
+{
+    int i;
+    for(i=0;i<PROCESS_COUNT;i++){
+        x->odds[i] = 1.0;
+    }
+    setweights(x->odds,PROCESS_COUNT);
+}
+
+
+void *bashfest_new(t_symbol *msg, short argc, t_atom *argv)
+{
+
+    t_bashfest *x = (t_bashfest *)pd_new(bashfest_class);
+    //  outlet_new(&x->x_obj, gensym("signal"));
+    
+    int i;
+    long membytes = 0;
+    float tmpfloat;
+    srand(time(0));
+    
+    x->sr = sys_getsr();
+    x->vs = sys_getblksize();
+    if(! x->sr)
+        x->sr = 44100;
+    
+    
+    x->work_buffer_size = DEFAULT_BUFFER_SIZE;
+    //  x->latency_samples = DEFAULT_LATENCY;
+    //  x->overlap_max = DEFAULT_MAX_OVERLAP;
+	
+    /* argument list: buffer name, work buffer duration, latency in samples, number of overlaps */
+    atom_arg_getsym(&x->wavename,0,argc,argv);
+    atom_arg_getfloat(&x->work_buffer_size,1,argc,argv);
+    tmpfloat = DEFAULT_LATENCY;
+    atom_arg_getfloat(&tmpfloat,2,argc,argv);
+    x->latency_samples = tmpfloat;
+    tmpfloat = DEFAULT_MAX_OVERLAP;
+    atom_arg_getfloat(&tmpfloat,3,argc,argv);
+    x->overlap_max = tmpfloat;
+
+    outlet_new(&x->x_obj, gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+    
+    x->sinelen = 8192;
+    
+    x->verbose = 0;
+    x->most_recent_event = 0;
+    x->active_events = 0;
+    x->increment = 1.0;
+    x->block_dsp = 0;
+    x->grab = 0;
+    /*
+     x->tb_inpt = 0;
+     if(x->latency_samples < x->vs){
+     x->latency_samples = x->vs;//might need x->vs * 2 here
+     error("latency forced to %d samples",x->vs);
+     }
+     x->tb_outpt = x->latency_samples - x->vs;
+     */
+    /* buffer contains space for both input and output, thus factor of 2 */
+    x->buf_frames = 2 * x->work_buffer_size * .001 * x->sr;
+    
+    x->buf_samps = x->buf_frames * 2;
+    x->halfbuffer = x->buf_samps / 2;
+	
+    x->maxdelay = 1.0; // in seconds
+    /*memory allocation */
+    x->events = (t_event *) t_getbytes(x->overlap_max * sizeof(t_event));
+    x->trigger_vec = (float *) t_getbytes(MAX_VEC * sizeof(float));
+    x->sinewave = t_getbytes(x->sinelen * sizeof(float));
+    x->params = t_getbytes(MAX_PARAMETERS * sizeof(float));
+    x->odds = t_getbytes(64 * sizeof(float));
+    //  x->trigger_buffer = calloc(x->latency_samples, sizeof(float));
+    
+    for(i=0;i<64;i++)
+        x->odds[i] = 0;
+    putsine(x->sinewave, x->sinelen);
+    for(i=0;i<x->overlap_max;i++){
+        x->events[i].workbuffer = (float *) t_getbytes(x->buf_samps * sizeof(float));
+    }
+    x->delayline1 = (float *) t_getbytes(x->maxdelay * x->sr * sizeof(float));
+    x->delayline2 = (float *) t_getbytes(x->maxdelay * x->sr * sizeof(float));
+    x->max_mini_delay = .25;
+    x->eel = (LSTRUCT *) t_getbytes(MAXSECTS * sizeof(LSTRUCT));
+    for( i = 0; i < 4 ; i++ ){
+        x->mini_delay[i] =
+        (float *) t_getbytes(((int)(x->sr * x->max_mini_delay) + 1)  * sizeof(float));
+    }
+    x->reverb_ellipse_data = (float *) t_getbytes(16 * sizeof(float));
+    
+    x->ellipse_data = (float **) t_getbytes(MAXFILTER * sizeof(float *));
+    for(i=0;i<MAXFILTER;i++){
+        x->ellipse_data[i] = (float *) t_getbytes(MAX_COEF * sizeof(float));
+    }
+    x->tf_len = 1;
+    x->tf_len <<= 16;
+    x->transfer_function = (float *) t_getbytes(x->tf_len * sizeof(float) );
+    x->feedfunclen = 8192 ;
+    x->feedfunc1 = (float *) t_getbytes( x->feedfunclen * sizeof(float) );
+    x->feedfunc2 = (float *) t_getbytes( x->feedfunclen * sizeof(float) );
+    x->feedfunc3 = (float *) t_getbytes( x->feedfunclen * sizeof(float) );
+    x->feedfunc4 = (float *) t_getbytes( x->feedfunclen * sizeof(float) );
+    x->flamfunc1len = 8192 ;
+    x->flamfunc1 = (float *) t_getbytes( x->flamfunc1len * sizeof(float));
+    setflamfunc1(x->flamfunc1,x->flamfunc1len);
+    x->max_comb_lpt = 0.15 ;// watch out here
+    x->combies = (CMIXCOMB *) t_getbytes(4 * sizeof(CMIXCOMB));
+    for( i = 0; i < 4; i++ ){
+        x->combies[i].len = x->sr * x->max_comb_lpt + 2;
+        x->combies[i].arr = (float *) t_getbytes(x->combies[i].len * sizeof(float));
+    }
+    x->adsr = (CMIXADSR *) t_getbytes(1 * sizeof(CMIXADSR));
+    x->adsr->len = 32768 ;
+    x->adsr->func = (float *) t_getbytes(x->adsr->len * sizeof(float) );
+    x->dcflt = (float *) t_getbytes(16 * sizeof(float));
+    x->tcycle.data = (float *) t_getbytes(CYCLE_MAX * sizeof(float));
+    x->tcycle.len = 0;
+    for(i=0;i<x->overlap_max;i++){
+        x->events[i].phasef = x->events[i].phase = 0.0;
+    }
+    
+    membytes = x->overlap_max * sizeof(t_event);
+    membytes += x->sinelen * sizeof(float);
+    membytes += MAX_PARAMETERS * sizeof(float);
+    membytes += 64 * sizeof(float);
+    membytes += x->buf_samps * sizeof(float) * x->overlap_max;
+    membytes += x->maxdelay * x->sr * sizeof(float) * 2;
+    membytes += MAXSECTS * sizeof(LSTRUCT);
+    membytes += ((int)(x->sr * x->max_mini_delay) + 1)  * sizeof(float) * 4;
+    membytes += 16 * sizeof(float);
+    membytes += MAXFILTER * sizeof(float *);
+    membytes += MAX_COEF * sizeof(float) * MAXFILTER;
+    membytes += x->tf_len * sizeof(float);
+    membytes += x->feedfunclen * sizeof(float) * 4;
+    membytes += x->flamfunc1len * sizeof(float);
+    membytes += 4 * sizeof(CMIXCOMB);
+    membytes += x->combies[0].len * sizeof(float) * 4;
+    membytes += sizeof(CMIXADSR);
+    membytes += x->adsr->len * sizeof(float);
+    membytes += 16 * sizeof(float);
+    membytes += CYCLE_MAX * sizeof(float);
+    
+    // post("total memory for this bashfest %.2f MBytes",(float)membytes/1000000.);
+    
+    /* be sure to finish clearing memory */
+    set_dcflt(x->dcflt);
+    init_reverb_data(x->reverb_ellipse_data);
+    init_ellipse_data(x->ellipse_data);
+    
+    for(i=0;i<PROCESS_COUNT;i++){
+        x->odds[i] = 1;
+    }
+    
+    
+    x->max_process_per_note = 2;
+    setweights(x->odds,PROCESS_COUNT);
+    
+    
+    x->mute = 0;
+	
+    for(i = 0; i < x->overlap_max; i++){
+        x->events[i].status = INACTIVE;
+    }
+    
+    
+    return (x);
+}
+
+
+
+
+void bashfest_setbuf(t_bashfest *x, t_symbol *wavename)
+{
+    t_garray *a;
+	x->hosed = 0;
+    x->b_frames = 0;
+    x->b_nchans = 1;
+    x->b_valid = 0;
+    int b_frames;
+    if (!(a = (t_garray *)pd_findbyclass(wavename, garray_class))) {
+        if (*wavename->s_name) pd_error(x, "bashfest~: %s: no such array",
+                                        wavename->s_name);
+        x->b_samples = 0;
+        x->hosed = 1;
+    }
+    else if (!garray_getfloatwords(a, &b_frames, &x->b_samples)) {
+        pd_error(x, "%s: bad array for bashfest~", wavename->s_name);
+        x->b_samples = 0;
+        x->hosed = 1;
+    }
+    else  {
+        x->b_frames = (long)b_frames;
+        // post("%d frames in buffer %s",x->b_frames, wavename->s_name);
+        garray_usedindsp(a);
+        x->b_valid = 1;
+    }
+    
+}
+
+
+
+t_int *bashfest_perform_hosed(t_int *w)
+{
+    
+    //  t_bashfest *x = (t_bashfest *) (w[1]);
+    //  float *trigger = (t_float *)(w[2]);
+    float *outchanL = (t_float *)(w[3]);
+    float *outchanR = (t_float *)(w[4]);
+    int n = (int) w[5];
+    
+    // try bzero
+    //  while(n--) *outchanL++ = *outchanR++ = 0.0;
+    memset((char *)outchanL, 0, sizeof(float) * n);
+    memset((char *)outchanR, 0, sizeof(float) * n);
+    return(w+6);
+    
+}
+
+/* modified for dsp turnoff*/
+
+t_int *bashfest_perform(t_int *w)
+{
+    t_bashfest *x = (t_bashfest *) (w[1]);
+    float *t_vec = (t_float *)(w[2]);
+    float *outchanL = (t_float *)(w[3]);
+    float *outchanR = (t_float *)(w[4]);
+    int n = (int) w[5];
+
+    t_word *b_samples;
+    long b_nchans;
+//    long b_valid;
+    long b_frames;
+    
+    t_event *events = x->events;
+    //  int active_events = x->active_events;
+    float increment = x->increment;
+    int overlap_max = x->overlap_max;
+    int iphase;
+    int flimit;
+    short insert_success;
+    int new_insert;
+    int i,j,k;
+    t_cycle tcycle = x->tcycle;
+    float gain;
+    //  short bail;
+    float frac;
+    float samp1, samp2;
+    float maxphase;
+    int theft_candidate;
+    int out_channels;
+    float *processed_drum;
+    char *sound_name = x->sound_name;
+    
+    int latency_samples = x->latency_samples;
+    float *trigger_vec = x->trigger_vec;
+    
+	for(i = 0; i < n; i++)
+		trigger_vec[i] = t_vec[i];
+    
+    if(x->mute || x->hosed){
+        while(n--) {
+            *outchanL++ = *outchanR++ = 0.0;
+        }
+        return(w+6);
+    }
+    bashfest_setbuf(x, x->wavename);
+	
+    if(! x->b_valid) {
+        while(n--) {
+            *outchanL++ = *outchanR++ = 0.0;
+        }
+        return(w+6);
+    }
+    
+    b_samples = x->b_samples;
+    b_frames = x->b_frames;
+    b_nchans = 1; // for Pd
+    
+    if(x->block_dsp){
+        /* computation savings if processing is blocked */
+        
+        
+        /* preliminary transposition will be set here */
+        
+        if(tcycle.len > 0){
+            increment = tcycle.data[tcycle.p];
+            // post("position %d, increment %f",tcycle.p,increment );
+        } else {
+            increment = 1.0;
+            //error("increment default, len is zero");
+        }
+        // initial cleaning
+        for(i=0; i<n; i++){
+            outchanL[i] = outchanR[i] = 0.0;
+        }
+        flimit = (b_frames - 1) * 2;
+        for(i = 0; i < overlap_max; i++){
+            if(events[i].status == ACTIVE){
+                gain = events[i].gain;
+                
+                if(b_nchans == 1){ /* mono */
+                    
+                    flimit = (b_frames - 1);
+                    for(j = 0; j < n; j++){
+                        if(events[i].countdown > 0){
+                            --events[i].countdown;
+                        } else {
+                            
+                            iphase = events[i].phasef;
+                            frac = events[i].phasef - iphase;
+                            
+                            if(increment > 0){
+                                if(iphase == flimit || increment == 1.0){
+                                    outchanL[j] += b_samples[iphase].w_float * gain;
+                                    outchanR[j] += b_samples[iphase].w_float * gain;
+                                } else {
+                                    samp1 = b_samples[iphase].w_float;
+                                    samp2 = b_samples[iphase+1].w_float;
+                                    samp1 = gain * (samp1 + frac * (samp2-samp1));
+                                    outchanL[j] += samp1;
+                                    outchanR[j] += samp1;
+                                }
+                            } else { /*negative increment case (currently unused but might be useful)*/
+                                if(iphase == 0.0 || increment == -1.0 ){
+                                    outchanL[j] += b_samples[iphase].w_float * gain;
+                                    outchanR[j] += b_samples[iphase].w_float * gain;
+                                } else {
+                                    samp2 = b_samples[iphase].w_float;
+                                    samp1 = b_samples[iphase-1].w_float;
+                                    samp1 = gain * (samp1 + frac * (samp2-samp1));
+                                    outchanL[j] += samp1;
+                                    outchanR[j] += samp1;
+                                }
+                            }
+                            events[i].phasef += increment;
+                            
+                            if( events[i].phasef < 0.0 || events[i].phasef >= b_frames){
+                                events[i].status = INACTIVE;
+                                events[i].phasef = 0;
+                                // post("valid exit mono note");
+                                break;
+                            }
+                        }
+                    }
+                } else if(b_nchans == 2){
+/*
+                    
+                    for(j = 0; j < n; j++){
+                        if(events[i].countdown > 0){
+                            --events[i].countdown;
+                        } else {
+                            iphase = events[i].phasef;
+                            frac = events[i].phasef - iphase;
+                            iphase *= 2;
+                            if(increment > 0){
+                                if(iphase == flimit || increment == 1.0){
+                                    outchanL[j] += b_samples[iphase] * gain;
+                                    outchanR[j] += b_samples[iphase+1] * gain;
+                                } else {
+                                    samp1 = b_samples[iphase];
+                                    samp2 = b_samples[iphase+2];
+                                    outchanL[j] += gain * (samp1 + frac * (samp2-samp1));
+                                    samp1 = b_samples[iphase+1];
+                                    samp2 = b_samples[iphase+3];
+                                    outchanR[j] += gain * (samp1 + frac * (samp2-samp1));
+                                }
+                            } else {
+                                if(iphase == 0.0 || increment == -1.0 ){
+                                    outchanL[j] += b_samples[iphase] * gain;
+                                    outchanR[j] += b_samples[iphase+1] * gain;
+                                } else {
+                                    samp2 = b_samples[iphase];
+                                    samp1 = b_samples[iphase-2];
+                                    outchanL[j] += gain * (samp1 + frac * (samp2-samp1));
+                                    samp2 = b_samples[iphase+1];
+                                    samp1 = b_samples[iphase-1];
+                                    outchanR[j] += gain * (samp1 + frac * (samp2-samp1));
+                                }
+                            }
+                            events[i].phasef += increment;
+                            
+                            if( events[i].phasef < 0.0 || events[i].phasef >= b_frames){
+                                events[i].status = INACTIVE;
+                                break;
+                            }
+                        }
+                    }*/
+                }
+            }
+        }
+        
+        for(i=0; i<n; i++){
+            if(trigger_vec[i]){
+                gain = trigger_vec[i];
+                
+                insert_success = 0;
+                for(j=0; j<overlap_max; j++){
+                    if(events[j].status == INACTIVE){
+                        events[j].status = ACTIVE;
+                        events[j].gain = gain;
+                        if(increment > 0){
+                            events[j].phasef = 0.0;
+                        } else {
+                            events[j].phasef = b_frames - 1;
+                        }
+                        insert_success = 1;
+                        new_insert = j;
+                        break;
+                    }
+                }
+				
+                if(!insert_success){ // steal a note
+                    
+                    maxphase = 0;
+                    theft_candidate = 0;
+                    for(k = 0; k < overlap_max; k++){
+                        if(events[k].phasef > maxphase){
+                            maxphase = events[k].phasef;
+                            theft_candidate = k;
+                        }
+                    }
+                    new_insert = theft_candidate;
+                    events[new_insert].gain = gain;
+                    if(increment > 0){
+                        events[new_insert].phasef = 0.0;
+                    } else {
+                        events[new_insert].phasef = b_frames - 1;
+                    }
+                    insert_success = 1;
+                    post("stealing a note at %d for buffer %s", new_insert, sound_name);
+                }
+                events[new_insert].countdown = latency_samples;
+                events[new_insert].status = ACTIVE;
+                x->new_slot = new_insert;
+                x->new_gain = gain;
+                // post("new note at slot %d",new_insert);
+                if(tcycle.len > 0){
+                    increment = tcycle.data[tcycle.p++];
+                    if(tcycle.p >= tcycle.len){
+                        tcycle.p = 0;
+                    }
+                    x->tcycle.p = tcycle.p;
+                } else {
+                    increment = 1.0;
+                }
+                
+                for(k=i; k<n; k++){
+                    //roll out for remaining portion of vector
+                    if(events[new_insert].countdown > 0){
+                        --events[new_insert].countdown;
+                    } else {
+                        if(b_nchans == 1){
+                            
+                            iphase = events[new_insert].phasef;
+                            frac = events[new_insert].phasef - iphase;
+                            if(iphase < 0 || iphase >= b_frames){
+                                error("aborting on phase %f",events[new_insert].phasef);
+                                break;
+                            }
+                            if(increment > 0){
+                                if(iphase == flimit || increment == 1.0){
+                                    outchanL[k] += b_samples[iphase].w_float * gain;
+                                    outchanR[k] += b_samples[iphase].w_float * gain;
+                                } else {
+                                    samp1 = b_samples[iphase].w_float;
+                                    samp2 = b_samples[iphase+1].w_float;
+                                    samp1 = gain * (samp1 + frac * (samp2-samp1));
+                                    outchanL[k] += samp1;
+                                    outchanR[k] += samp1;
+                                }
+                            } else { /*negative increment case (currently unused but might be useful)*/
+                                if(iphase == 0.0 || increment == -1.0 ){
+                                    outchanL[k] += b_samples[iphase].w_float * gain;
+                                    outchanR[k] += b_samples[iphase].w_float * gain;
+                                } else {
+                                    samp2 = b_samples[iphase].w_float;
+                                    samp1 = b_samples[iphase-2].w_float;
+                                    samp1 = gain * (samp1 + frac * (samp2-samp1));
+                                    outchanL[k] += samp1;
+                                    outchanR[k] += samp1;
+                                }
+                            }
+                            events[new_insert].phasef += increment;
+                            
+                            if( events[new_insert].phasef < 0.0 || events[new_insert].phasef >= b_frames){
+                                events[new_insert].status = INACTIVE;
+                                break;
+                            }
+                        } else if(b_nchans == 2)
+                        { /*
+                            iphase = events[new_insert].phasef;
+                            frac = events[new_insert].phasef - iphase;
+                            iphase *= 2;
+                            if(increment > 0){
+                                if(iphase == flimit || increment == 1.0){
+                                    outchanL[k] += b_samples[iphase] * gain;
+                                    outchanR[k] += b_samples[iphase+1] * gain;
+                                } else {
+                                    samp1 = b_samples[iphase];
+                                    samp2 = b_samples[iphase+2];
+                                    outchanL[k] += gain * (samp1 + frac * (samp2-samp1));
+                                    samp1 = b_samples[iphase+1];
+                                    samp2 = b_samples[iphase+3];
+                                    outchanR[k] += gain * (samp1 + frac * (samp2-samp1));
+                                }
+                            } else {
+                                if(iphase == 0.0 || increment == -1.0 ){
+                                    outchanL[k] += b_samples[iphase] * gain;
+                                    outchanR[k] += b_samples[iphase+1] * gain;
+                                } else {
+                                    samp2 = b_samples[iphase];
+                                    samp1 = b_samples[iphase-2];
+                                    outchanL[k] += gain * (samp1 + frac * (samp2-samp1));
+                                    samp2 = b_samples[iphase+1];
+                                    samp1 = b_samples[iphase-1];
+                                    outchanR[k] += gain * (samp1 + frac * (samp2-samp1));
+                                }
+                            }
+                            events[new_insert].phasef += increment;
+                            
+                            if( events[new_insert].phasef < 0.0 || events[new_insert].phasef >= b_frames){
+                                events[new_insert].status = INACTIVE;
+                                break;
+                            } */
+                        }
+                    }
+                }
+            }
+        }
+        x->increment = increment;
+        /*    x->tb_inpt = tb_inpt;
+         x->tb_outpt = tb_outpt;*/
+        return(w+6);
+        /* end of block_dsp contingecy code */
+    }
+    
+    /* main body of bashfest processing */
+    
+    
+    for(i=0; i<n; i++){ /* pre-clean buffers*/
+        outchanL[i] = outchanR[i] = 0.0;
+    }
+    
+    /* add output from all active buffers into global outlet buffers */
+	
+	
+    for(i = 0; i < overlap_max; i++){
+        if( events[i].status == ACTIVE){
+            out_channels = events[i].out_channels;
+            /* assign the output part of work buffer to the local float buffer */
+            
+            processed_drum = events[i].workbuffer + events[i].in_start;
+            
+            for(j = 0; j < n; j++){
+                if(x->grab){
+                    x->grab = 0;
+                    // if too slow, defend with defer_low()
+                    bashfest_copy_to_MSP_buffer(x,i);
+                }
+                if(events[i].countdown > 0){
+                    --events[i].countdown;
+                } else {
+                    if(out_channels == 1){
+                        outchanL[j] += processed_drum[events[i].phase] * events[i].gainL;
+                        outchanR[j] += processed_drum[events[i].phase] * events[i].gainR;
+                    } else if(out_channels == 2){
+                        iphase = events[i].phase * 2;
+                        outchanL[j] += processed_drum[iphase] * events[i].gainL;
+                        outchanR[j] += processed_drum[iphase+1] * events[i].gainR;
+                    }
+                    
+                    events[i].phase++;
+                    
+                    if(events[i].phase >= events[i].sample_frames){
+                        events[i].status = INACTIVE;
+                        break;
+                    }
+				}
+            }
+        }
+    }
+	
+    /* now check for initiation click. If found,
+     add to list. If necessary, steal a note
+     */
+    for(i=0; i<n; i++){
+        if(trigger_vec[i]){
+            gain = trigger_vec[i];
+            
+            /*look for an open slot*/
+            insert_success = 0;
+            for(j=0; j<overlap_max; j++){
+                if(events[j].status == INACTIVE){
+                    events[j].status = ACTIVE;
+                    events[j].gain = gain;
+                    insert_success = 1;
+                    new_insert = j;
+                    break;
+                }
+            }
+			
+            if(!insert_success){ /* steal a note if necessary*/
+                maxphase = 0;
+                theft_candidate = 0;
+                for(k = 0; k < overlap_max; k++){
+                    if(events[k].phase > maxphase){
+                        maxphase = events[k].phase;
+                        theft_candidate = k;
+                    }
+                }
+                if(x->verbose){
+                    post("stealing note at slot %d", theft_candidate);
+                }
+                post("stealing a note at %d for buffer %s", theft_candidate, sound_name);
+                new_insert = theft_candidate;
+                events[new_insert].gain = gain;
+                insert_success = 1;
+            }
+            
+            events[new_insert].countdown = x->latency_samples;
+            x->new_slot = new_insert;
+            x->new_gain = gain;
+            
+            bashfest_deploy_dsp(x);
+            
+            
+            /* now begin output from the new note */
+            
+            out_channels = events[new_insert].out_channels;
+            processed_drum = events[new_insert].workbuffer + events[new_insert].in_start;
+ 			
+            /* processed_drum = events[new_insert].workbuffer;	*/
+            for(j = i; j < n; j++){
+                if(events[new_insert].countdown > 0){
+                    --events[new_insert].countdown;
+                } else{
+                    iphase = events[new_insert].phase;
+                    if(x->grab){
+                        x->grab = 0;
+                        // if too slow, defend with defer_low()
+                        bashfest_copy_to_MSP_buffer(x,i);
+                    }
+                    if(out_channels == 1){
+                        outchanL[j] += processed_drum[iphase] * events[new_insert].gainL;
+                        outchanR[j] += processed_drum[iphase] * events[new_insert].gainR;
+                    } else if(out_channels == 2){
+                        iphase = events[i].phase * 2;
+                        outchanL[j] += processed_drum[iphase] * events[new_insert].gainL;
+                        outchanR[j] += processed_drum[iphase+1] * events[new_insert].gainR;
+                    }
+                    
+                    events[new_insert].phase++;
+                    
+                    if(events[new_insert].phase >= events[new_insert].sample_frames){
+                        events[new_insert].status = INACTIVE;
+                        break;
+                    }
+                }
+            }
+        }
+    }
+    return (w+6);
+}
+
+void bashfest_copy_to_MSP_buffer(t_bashfest *x, int slot)
+{
+	int i; //,j;
+	t_event *events = x->events;
+	long b_nchans = x->b_nchans;
+	long b_frames = x->b_frames;
+	t_word *b_samples = x->b_samples;
+	float *processed_drum;
+    
+	processed_drum = events[slot].workbuffer + events[slot].in_start;
+    
+	if(events[slot].out_channels == b_nchans){
+		if(b_nchans == 1){
+			for(i=0;i<b_frames;i++){
+				b_samples[i].w_float = processed_drum[i];
+			}
+		} else if(b_nchans == 2){
+			/*for(i=0;i<b_frames*2;i+=2){
+				b_samples[i].w_float = processed_drum[i];
+				b_samples[i+1] = processed_drum[i+1];
+			}*/
+		}else{
+			error("bashfest copy: channel mismatch");
+			//fixable but first let's try these
+		}
+	}
+}
+void bashfest_deploy_dsp(t_bashfest *x)
+{
+    float *b_samples = x->b_samples;
+    long b_nchans = x->b_nchans;
+    long b_frames = x->b_frames;
+    t_event *events = x->events;
+    float pan;
+    int i; //,j;
+    float *params = x->params;
+    int pcount;
+    int buf_samps = x->buf_samps;
+    int curarg = 0;
+    float maxamp;
+    float rescale;
+    float *inbuf;
+    int slot = x->new_slot;
+    float gain = x->new_gain;
+	
+    events[slot].completed = 1;// for testing only
+	
+    if(b_nchans <1 || b_nchans > 2){
+        error("illegal channels in buffer:%d",b_nchans);
+        return;
+        x->hosed = 1;
+    }
+    if(b_frames > x->buf_frames / 2){
+        error("sample in buffer %s is to large for work buffer",x->sound_name);
+        return;
+        x->hosed = 1;
+    }
+    
+    pan = boundrand(0.1, 0.9);
+    events[slot].gainL = cos(PIOVERTWO * pan) * gain;
+    events[slot].gainR = sin(PIOVERTWO * pan) * gain;
+    events[slot].phase = 0;
+    events[slot].status = ACTIVE;
+    /*  if(x->verbose)
+     post("initiating note at slot %d, gain %f, pan %f,inchans %d",slot,gain,pan,b_nchans);
+     */
+    if(x->sound_lock){
+        return;// of course should finally copy good stuff to MSP buffer
+    }
+    events[slot].out_channels = b_nchans;
+    events[slot].sample_frames = b_frames;
+    for(i=0; i<b_frames*b_nchans; i++){
+        events[slot].workbuffer[i] = b_samples[i];
+    }
+    
+    // clean rest of work buffer
+    for(i=b_frames*b_nchans; i<buf_samps; i++){
+        events[slot].workbuffer[i] = 0.0;
+    }
+    events[slot].in_start = 0;
+    events[slot].out_start = x->halfbuffer;
+    pcount = bashfest_set_parameters(x, params);
+	
+    while(curarg < pcount){
+        if(params[curarg] == TRANSPOSE){
+            transpose(x, slot, &curarg);
+        }
+        else if(params[curarg] == RINGMOD){
+            ringmod(x, slot, &curarg);
+        }
+        else if(params[curarg] == RETRO){
+            retrograde(x, slot, &curarg);
+        }
+        else if(params[curarg] == COMB){
+            comber(x, slot, &curarg);
+        }
+        else if(params[curarg] == FLANGE){
+            flange(x, slot, &curarg);
+        }
+        else if(params[curarg] == BUTTER){
+            butterme(x, slot, &curarg);
+        }
+        else if(params[curarg] == TRUNCATE){
+            truncateme(x, slot, &curarg);
+        }
+        else if(params[curarg] == SWEEPRESON){
+            sweepreson(x, slot, &curarg);
+        }
+        else if(params[curarg] == SLIDECOMB){
+            slidecomb(x, slot, &curarg);
+        }
+        else if(params[curarg] == REVERB1){
+            reverb1(x, slot, &curarg);
+        }
+        else if(params[curarg] == ELLIPSE){
+            ellipseme(x, slot, &curarg);
+        }
+        else if(params[curarg] == FEED1){
+            feed1me(x, slot, &curarg);
+        }
+        else if(params[curarg] == FLAM1){
+            flam1(x, slot, &curarg);
+        }
+        else if(params[curarg] == FLAM2){
+            flam2(x, slot, &curarg);
+        }
+        else if(params[curarg] == EXPFLAM){
+            expflam(x, slot, &curarg);
+        }
+        else if(params[curarg] == COMB4){
+            comb4(x, slot, &curarg);
+        }
+        else if(params[curarg] == COMPDIST){
+            compdist(x, slot, &curarg);
+        }
+        else if(params[curarg] == RINGFEED){
+            ringfeed(x, slot, &curarg);
+        }
+        else if(params[curarg] == RESONADSR){
+            resonadsr(x, slot, &curarg);
+        }
+        else if(params[curarg] == STV){
+            stv(x, slot, &curarg);
+        }
+        else {
+            error("deploy missing branch");
+        }
+    }
+	
+    maxamp = 0.0;
+    inbuf = events[slot].workbuffer + events[slot].in_start;
+    b_nchans = events[slot].out_channels;
+    b_frames = events[slot].sample_frames;
+    for(i=0; i< b_frames * b_nchans; i++){
+        if(maxamp < fabs(inbuf[i])){
+            maxamp = fabs(inbuf[i]);
+        }
+    }
+    if(maxamp>0){
+        rescale = 1.0/maxamp;
+        for(i=0; i< b_frames * b_nchans; i++){
+            inbuf[i] *= rescale;
+        }
+    }
+    else{
+        if(x->verbose)
+            error("zero maxamp detected");
+    }
+	
+    if(events[slot].countdown <= 0)
+        error("deploy_dsp: failed to conclude in time; need more latency");
+}
+
+int bashfest_set_parameters(t_bashfest *x,float *params)
+{
+    float rval;
+    int pcount = 0;
+    int events;
+    int i, j;
+    int type;
+    float cf;//, bw;
+    float *odds = x->odds;
+    int maxproc  = x->max_process_per_note;
+    int minproc = x->min_process_per_note;
+    float tval;
+    t_cycle tcycle = x->tcycle;
+    
+    /* preliminary transposition will be set here */
+    
+    if(tcycle.len > 0){
+        params[pcount++] = TRANSPOSE;
+        params[pcount++] = tcycle.data[tcycle.p++];
+        if(tcycle.p >= tcycle.len){
+            tcycle.p = 0;
+        }
+        x->tcycle.p = tcycle.p;
+    }
+    
+    
+    if(maxproc <= 0){
+        return pcount;
+    }
+    
+    events = minproc + rand() % (1+(maxproc-minproc));
+	
+    for(i = 0; i < events; i++){
+        rval = boundrand(0.0,1.0);
+        j = 0;
+        while(rval > odds[j]){
+            j++;
+        }
+		
+        
+        if(j == RETRO){
+            params[pcount++] = RETRO;
+        } 
+        else if(j == COMB){
+            params[pcount++] = COMB;
+            params[pcount++] = boundrand(.001,.035);// delaytime
+            params[pcount++] = boundrand(.25,.98);//feedback
+            params[pcount++] = boundrand(.05,.5);//hangtime
+        } 
+        else if(j == RINGMOD) {
+            params[pcount++] = RINGMOD;
+            params[pcount++] = boundrand(100.0,2000.0); //need a log version
+        } 
+        else if(j == TRANSPOSE){
+            params[pcount++] = TRANSPOSE;
+            params[pcount++] = boundrand(0.25,3.0);
+        } 
+        else if(j == FLANGE){
+            params[pcount++] = FLANGE;
+            params[pcount++] = boundrand(100.0,400.0);
+            params[pcount++] = boundrand(600.0,4000.0);
+            params[pcount++] = boundrand(0.1,2.0);
+            params[pcount++] = boundrand(0.1,0.95);
+            params[pcount++] = boundrand(0.0,0.9);
+        } 	
+        else if(j == BUTTER){
+            params[pcount++] = BUTTER;
+            type = rand() % 3;
+            params[pcount++] = type;
+            cf = boundrand(70.0,3000.0);
+            params[pcount++] = cf;
+            if(type == BANDPASS){
+                params[pcount++] = cf * boundrand(0.05,0.6);
+            }		
+        }	
+        else if(j == TRUNCATE){
+            params[pcount++] = TRUNCATE;
+            params[pcount++] = boundrand(.05,.15);
+            params[pcount++] = boundrand(.01,.05);
+        }
+        else if(j == SWEEPRESON){
+            params[pcount++] = SWEEPRESON;
+            params[pcount++] = boundrand(100.0,300.0);
+            params[pcount++] = boundrand(600.0,6000.0);
+            params[pcount++] = boundrand(0.01,0.2);
+            params[pcount++] = boundrand(0.05,2.0);
+            params[pcount++] = boundrand(0.0,1.0);
+        }
+        else if(j == SLIDECOMB){
+            params[pcount++] = SLIDECOMB;
+            params[pcount++] = boundrand(.001,.03);
+            params[pcount++] = boundrand(.001,.03);
+            params[pcount++] = boundrand(0.05,0.95);
+            params[pcount++] = boundrand(0.05,0.5);
+        }
+        else if(j == REVERB1){
+            params[pcount++] = REVERB1;
+            params[pcount++] = boundrand(0.25,0.99);
+            params[pcount++] = boundrand(0.1,1.0);
+            params[pcount++] = boundrand(0.2,0.8);
+        }
+        else if(j == ELLIPSE){
+            params[pcount++] = ELLIPSE;
+            params[pcount++] = rand() % ELLIPSE_FILTER_COUNT;
+        }
+        else if(j == FEED1){
+            params[pcount++] = FEED1;
+            tval = boundrand(.001,0.1);
+            params[pcount++] = tval;
+            params[pcount++] = boundrand(tval,0.1);
+            tval = boundrand(.01,0.5);
+            params[pcount++] = tval;
+            params[pcount++] = boundrand(tval,0.5);
+            params[pcount++] = boundrand(.05,1.0);
+        }
+        else if(j == FLAM1){
+            params[pcount++] = FLAM1;
+            params[pcount++] = 4 + (rand() % 20);
+            params[pcount++] = boundrand(0.3,0.8);
+            params[pcount++] = boundrand(0.5,1.2);
+            params[pcount++] = boundrand(.025,0.15);
+        }
+        else if(j == FLAM2){
+            params[pcount++] = FLAM2;
+            params[pcount++] = 4 + (rand() % 20);
+            params[pcount++] = boundrand(0.1,0.9);
+            params[pcount++] = boundrand(0.2,1.2);
+            params[pcount++] = boundrand(.025,0.15);
+            params[pcount++] = boundrand(.025,0.15);
+        }
+        else if(j == EXPFLAM){
+            params[pcount++] = EXPFLAM;
+            params[pcount++] = 4 + (rand() % 20);
+            params[pcount++] = boundrand(0.1,0.9);
+            params[pcount++] = boundrand(0.2,1.2);
+            params[pcount++] = boundrand(.025,0.15);
+            params[pcount++] = boundrand(.025,0.15);
+            params[pcount++] = boundrand(-5.0,5.0);
+        }
+        else if(j == COMB4){
+            params[pcount++] = COMB4;
+            params[pcount++] = boundrand(100.0,900.0);
+            params[pcount++] = boundrand(100.0,900.0);
+            params[pcount++] = boundrand(100.0,900.0);
+            params[pcount++] = boundrand(100.0,900.0);
+            tval = boundrand(.5,0.99);
+            params[pcount++] = tval;
+            params[pcount++] = tval;
+        }
+        else if(j == COMPDIST){
+            params[pcount++] = COMPDIST;
+            params[pcount++] = tval = boundrand(.01,.25);
+            params[pcount++] = boundrand(tval,.9);
+            params[pcount++] = 1;
+        }
+        else if(j == RINGFEED){
+            params[pcount++] = RINGFEED;
+            params[pcount++] = boundrand(90.0,1500.0);
+            params[pcount++] = boundrand(90.0,1500.0);
+            params[pcount++] = boundrand(0.2,0.95);
+            params[pcount++] = boundrand(90.0,1500.0);
+            params[pcount++] = boundrand(.01,.4);
+            params[pcount++] = boundrand(.05,1.0);
+        }
+        else if(j == RESONADSR){
+            params[pcount++] = RESONADSR;
+            params[pcount++] = boundrand(.01,.1);
+            params[pcount++] = boundrand(.01,.05);
+            params[pcount++] = boundrand(.05,.5);
+            params[pcount++] = boundrand(150.0,4000.0);
+            params[pcount++] = boundrand(150.0,4000.0);
+            params[pcount++] = boundrand(150.0,4000.0);
+            params[pcount++] = boundrand(150.0,4000.0);
+            params[pcount++] = boundrand(.03,.7);
+        }
+        else if(j == STV){
+            params[pcount++] = STV;
+            params[pcount++] = boundrand(.025,0.5);
+            params[pcount++] = boundrand(.025,0.5);
+            params[pcount++] = boundrand(.001,.01);
+        }
+        else {
+            error("could not find a process for %d",j);
+            return 0;
+        }
+    }
+    return pcount;
+}
+
+void bashfest_dsp_free(t_bashfest *x)
+{
+    int i;
+	
+    t_freebytes(x->sinewave, x->sinelen * sizeof(float));
+    t_freebytes(x->params, MAX_PARAMETERS * sizeof(float));
+    t_freebytes(x->odds, 64 * sizeof(float));
+    t_freebytes(x->delayline1, x->maxdelay * x->sr * sizeof(float));
+    t_freebytes(x->delayline2, x->maxdelay * x->sr * sizeof(float));
+    
+    for(i=0;i<x->overlap_max;i++){
+        t_freebytes(x->events[i].workbuffer, x->buf_samps * sizeof(float));
+    }
+    t_freebytes(x->events, x->overlap_max * sizeof(t_event));
+	
+    t_freebytes(x->eel,MAXSECTS * sizeof(LSTRUCT));
+    for( i = 0; i < 4 ; i++ ){
+        t_freebytes(x->mini_delay[i], ((int)(x->sr * x->max_mini_delay) + 1) * sizeof(float));
+    }
+    t_freebytes(x->reverb_ellipse_data, 16 * sizeof(float));
+    for(i=0;i<MAXFILTER;i++){
+        t_freebytes(x->ellipse_data[i], MAX_COEF * sizeof(float));
+    } 	
+    t_freebytes(x->ellipse_data, MAXFILTER * sizeof(float *));
+    t_freebytes(x->transfer_function,x->tf_len * sizeof(float));
+    t_freebytes(x->feedfunc1, x->feedfunclen * sizeof(float));
+    t_freebytes(x->feedfunc2, x->feedfunclen * sizeof(float));
+    t_freebytes(x->feedfunc3, x->feedfunclen * sizeof(float));
+    t_freebytes(x->feedfunc4, x->feedfunclen * sizeof(float));
+    t_freebytes(x->flamfunc1, x->flamfunc1len * sizeof(float));
+    for( i = 0; i < 4; i++ ){
+        t_freebytes(x->combies[i].arr, x->combies[i].len * sizeof(float));
+    }
+    t_freebytes(x->combies,4 * sizeof(CMIXCOMB));
+    t_freebytes(x->adsr->func, x->adsr->len * sizeof(float));
+    t_freebytes(x->adsr,sizeof(CMIXADSR));
+    t_freebytes(x->tcycle.data,CYCLE_MAX * sizeof(float));
+    t_freebytes(x->trigger_vec, MAX_VEC * sizeof(float));
+}
+
+void bashfest_dsp(t_bashfest *x, t_signal **sp)
+{
+    bashfest_setbuf(x, x->wavename);
+	
+    if( x->hosed ){
+        error("bashfest~ needs a valid buffer");
+    }
+    /* if vector size changes, we also need to deal, thanks to
+     the trigger buffer inter-delay
+     */
+    if(x->sr != sp[0]->s_sr){
+        x->sr = sp[0]->s_sr;
+        if(!x->sr){
+            post("warning: zero sampling rate!");
+            x->sr = 44100;
+        }
+    } 
+    if(x->b_frames <= 0){
+        post("empty buffer, hosing down");
+        x->hosed = 1;
+    }
+	
+    if(x->hosed){
+        dsp_add(bashfest_perform_hosed, 5, x, 
+                sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);	
+    } else {
+        dsp_add(bashfest_perform, 5, x, 
+                sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);		
+    }
+}
+/*
+void bashfest_assist (t_bashfest *x, void *b, long msg, long arg, char *dst)
+{
+    if (msg==1) {
+        switch (arg) {
+            case 0: sprintf(dst,"(signal) Click Trigger"); break;
+        }
+    } 
+    else if (msg==2) {
+        switch(arg){
+            case 0: sprintf(dst,"(signal) Channel 1 Output"); break;
+            case 1: sprintf(dst,"(signal) Channel 2 Output"); break;
+        }
+    }
+}
+*/
+
+
diff --git a/externals/lyonpotpourri/bloscbank.c b/externals/lyonpotpourri/bloscbank.c
new file mode 100755
index 0000000000000000000000000000000000000000..c35ab0dee2007a6b87e18f635b89d4b488b147ea
--- /dev/null
+++ b/externals/lyonpotpourri/bloscbank.c
@@ -0,0 +1 @@
+
#include "fftease.h"

void bloscbank( float *S, float *O, int D, float iD, float *lf, float *la, float *index, float *tab, 
	int len, float synt, int lo, int hi )
{
  int    amp,freq,chan, i;

  float    a,ainc,f,finc,address;
  
  for ( chan = lo; chan < hi; chan++ ) {

    freq = ( amp = ( chan << 1 ) ) + 1;
    if ( S[amp] > synt ){ 
      finc = ( S[freq] - ( f = lf[chan] ) )* iD;
      ainc = ( S[amp] - ( a = la[chan] ) )* iD;
      address = index[chan];
      for ( i = 0; i < D ; i++ ) {
	O[i] += a*tab[ (int) address ];
	    
	address += f;
	while ( address >= len )
	  address -= len;
	while ( address < 0 )
	  address += len;
	a += ainc;
	f += finc;
      }
      lf[chan] = S[freq];
      la[chan] = S[amp];
      index[chan] = address;
    }    
  }
}
\ No newline at end of file
diff --git a/externals/lyonpotpourri/buffet~-help.pd b/externals/lyonpotpourri/buffet~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..16c521ce8f672106add943cecae5cf70551abd5b
--- /dev/null
+++ b/externals/lyonpotpourri/buffet~-help.pd
@@ -0,0 +1,201 @@
+#N canvas 586 296 617 462 10;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array dopey 62079 float 2;
+#X coords 0 1 62079 -1 200 140 1;
+#X restore 34 65 graph;
+#N canvas 742 412 538 388 load-samples 0;
+#X obj 36 151 soundfiler;
+#X msg 36 83 bang;
+#X obj 36 109 openpanel;
+#X obj 144 37 loadbang;
+#X msg 36 131 read -resize \$1 dopey;
+#X obj 117 17 inlet;
+#X msg 117 64 read -resize sound/voice.wav dopey;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 3 0 6 0;
+#X connect 4 0 0 0;
+#X connect 5 0 6 0;
+#X connect 6 0 0 0;
+#X restore 245 110 pd load-samples;
+#X obj 222 241 buffet~ dopey 100 300;
+#X obj 222 288 bng 15 100 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X floatatom 365 270 5 0 0 0 - - -, f 5;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array soapy 22050 float 2;
+#X coords 0 1 22050 -1 100 70 1;
+#X restore 34 234 graph;
+#N canvas 171 294 544 498 processing 0;
+#X obj 44 402 s buffet-msgs;
+#X msg 203 208 reverse;
+#X msg 171 150 normalize 0.95;
+#X msg 173 176 killdc;
+#X text 43 34 Destructive Buffer Edits;
+#X msg 182 386 autoredraw \$1;
+#X obj 182 364 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X text 199 363 turn off if redraw hurts performance;
+#X msg 182 345 1;
+#X obj 182 329 loadbang;
+#X msg 43 67 fadein 100;
+#X msg 89 92 fadeout 500;
+#X msg 112 121 rotatetozero 300;
+#X msg 221 247 erase 300 460;
+#X msg 223 285 internal_fadeout 500 800;
+#X msg 251 309 internal_fadein 200 500;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 5 0;
+#X connect 8 0 6 0;
+#X connect 9 0 8 0;
+#X connect 10 0 0 0;
+#X connect 11 0 0 0;
+#X connect 12 0 0 0;
+#X connect 13 0 0 0;
+#X connect 14 0 0 0;
+#X connect 15 0 0 0;
+#X coords 0 0 1 1 85 60 0;
+#X restore 33 341 pd processing;
+#X obj 222 214 r buffet-msgs;
+#N canvas 574 418 474 306 copying 0;
+#X obj 48 70 buffet~ soapy 100 200;
+#X text 46 30 clear receiver (optional);
+#X obj 50 236 s buffet-msgs;
+#X text 156 162 too long requests are truncated;
+#X msg 270 53 normalize 1;
+#X msg 47 50 erase 0 500;
+#X msg 49 112 copy_to_buffer soapy 0 500;
+#X msg 62 135 copy_to_buffer soapy 500 1000;
+#X msg 154 181 copy_to_buffer soapy 300 1200;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 2 0;
+#X connect 7 0 2 0;
+#X connect 8 0 2 0;
+#X restore 34 314 pd copying;
+#X text 229 301 operation completion indicator;
+#X text 412 269 rms report;
+#N canvas 151 375 470 320 analysis 0;
+#X obj 65 188 s buffet-msgs;
+#X text 66 88 get rms reading from a specified segment of buffer;
+#X msg 120 145 pevents 50 0.05;
+#X text 117 130 look for percussive events;
+#X msg 64 112 rmschunk 200 300;
+#X connect 2 0 0 0;
+#X connect 4 0 0 0;
+#X restore 33 393 pd analysis;
+#X obj 294 344 print;
+#X text 334 347 list of estimated onsets in buffer;
+#X obj 391 204 dac~;
+#X floatatom 416 151 5 0 1 0 - - -, f 5;
+#X obj 391 178 *~ 0;
+#X obj 419 138 hsl 32 8 0 1 0 0 empty empty empty -2 -8 0 10 -261197
+-1 -1 0 1;
+#X text 458 150 playback gain;
+#X obj 391 118 player~ dopey 1;
+#X msg 245 78 bang;
+#X text 282 80 reload;
+#X text 29 420 buffet~ - Various operations on contents of an array
+;
+#N canvas 34 269 705 565 scrambler 0;
+#X obj 57 356 s buffet-msgs;
+#X msg 57 153 minswap \$1;
+#X floatatom 57 123 5 0 0 0 - - -, f 5;
+#X floatatom 147 121 5 0 0 0 - - -, f 5;
+#X msg 146 151 maxswap \$1;
+#X floatatom 144 223 5 0 0 0 - - -, f 5;
+#X msg 143 253 overlap \$1;
+#X msg 145 194 30;
+#X msg 224 256 retroblock;
+#X msg 314 276 swap;
+#X msg 172 335 specswap 0 1000 250;
+#X obj 59 57 t b b b;
+#X obj 58 28 loadbang;
+#X text 187 120 minimum and maximum swap times in ms.;
+#X text 155 209 fade time for tapering swap blocks (20 ms. by default)
+;
+#X text 226 240 reverse a piece of the buffer;
+#X text 354 276 swap two pieces of the buffer;
+#X text 177 357 specify which parts of buffer to exchange. arguments
+are skip1 \, skip2 and duration. In this example the first 250 ms block
+of the buffer is swapped with the 250 ms block beginning 1000 ms into
+the buffer.;
+#X text 165 26 Destructive rearrangement of buffer;
+#X msg 200 479 autoredraw \$1;
+#X obj 200 453 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X text 217 452 turn off if redraw hurts performance;
+#X msg 200 434 1;
+#X obj 200 418 loadbang;
+#X obj 316 141 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 315 164 metro 250;
+#X msg 58 94 100;
+#X msg 148 92 200;
+#X obj 237 158 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 236 181 metro 500;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 4 0;
+#X connect 4 0 0 0;
+#X connect 5 0 6 0;
+#X connect 6 0 0 0;
+#X connect 7 0 5 0;
+#X connect 8 0 0 0;
+#X connect 9 0 0 0;
+#X connect 10 0 0 0;
+#X connect 11 0 26 0;
+#X connect 11 1 27 0;
+#X connect 11 2 7 0;
+#X connect 12 0 11 0;
+#X connect 19 0 0 0;
+#X connect 20 0 19 0;
+#X connect 22 0 20 0;
+#X connect 23 0 22 0;
+#X connect 24 0 25 0;
+#X connect 25 0 9 0;
+#X connect 26 0 2 0;
+#X connect 27 0 3 0;
+#X connect 28 0 29 0;
+#X connect 29 0 8 0;
+#X restore 33 367 pd scrambler;
+#N canvas 0 22 470 320 playback-controls 0;
+#X obj 18 59 impulse~;
+#X msg 19 31 bang;
+#X text 57 31 retrigger;
+#X msg 95 54 pause;
+#X msg 144 55 resume;
+#X msg 204 56 stop;
+#X obj 18 129 outlet~;
+#X obj 203 130 outlet;
+#X msg 238 103 static_increment 1;
+#X obj 238 84 loadbang;
+#X obj 18 89 samm~ 40 1;
+#X connect 0 0 10 0;
+#X connect 1 0 0 0;
+#X connect 3 0 10 0;
+#X connect 4 0 10 0;
+#X connect 5 0 7 0;
+#X connect 8 0 7 0;
+#X connect 9 0 8 0;
+#X connect 10 0 6 0;
+#X restore 391 74 pd playback-controls;
+#X obj 23 13 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X connect 2 0 3 0;
+#X connect 2 1 12 0;
+#X connect 2 2 4 0;
+#X connect 7 0 2 0;
+#X connect 15 0 16 1;
+#X connect 16 0 14 0;
+#X connect 16 0 14 1;
+#X connect 17 0 15 0;
+#X connect 19 0 16 0;
+#X connect 20 0 1 0;
+#X connect 24 0 19 0;
+#X connect 24 0 19 1;
+#X connect 24 1 19 0;
diff --git a/externals/lyonpotpourri/buffet~.c b/externals/lyonpotpourri/buffet~.c
new file mode 100755
index 0000000000000000000000000000000000000000..f85240ae89ea8a103e8a6375a15ce909c7bcab94
--- /dev/null
+++ b/externals/lyonpotpourri/buffet~.c
@@ -0,0 +1,2161 @@
+#include "MSPd.h"
+#include "fftease.h"
+
+// adapted for Pd
+
+#define CUSHION_FRAMES (128) // pad for grabbing
+#define MAX_CHANNELS (2)
+
+#define MAX_RMS_BUFFER (0.250)
+#define MIN_RMS_BUFFER (.001)
+#define MAX_EVENTS (1024)
+#define MAX_RMS_FRAMES (32768)
+
+#define OBJECT_NAME "buffet~"
+
+
+static t_class *buffet_class;
+
+
+typedef struct {
+	t_word *b_samples;
+	int b_valid;
+	int b_nchans;
+	int b_frames;
+} t_guffer; // stuff we care about from garrays and buffers
+
+typedef struct _buffet
+{
+    
+	t_object x_obj;
+	float x_f;
+	t_symbol *wavename; // name of waveform buffer
+	t_guffer *wavebuf; // holds waveform samples
+	t_guffer *destbuf; // for copying to another buffer
+	
+	float sr; // sampling rate
+	short hosed; // buffers are bad
+	float minframes; // minimum replacement block in sample frames
+	float maxframes; // maximum replacement block in sample frames
+	long storage_maxframes; // maxframe limit that current memory can handle
+	float *storage; //temporary memory to store replacement block (set to maxframes * channels)
+	long storage_bytes; // amount of currently allocated memory
+	float fade; // fadein/fadeout time in sample frames
+	float sync; // input from groove sync signal
+	long swapframes; // number of frames in swap block
+	long r1startframe; //start frame for block 1
+	long r2startframe; // start frame for block 2
+	float dc_coef; // filter coefficient
+	float dc_gain; // normalization factor
+	short initialized; // first time or not
+	float *rmsbuf;// for onset analysis
+	float rmschunk; // store lowest rms value in buffer
+	void *list; // for start/end list
+	void *bang; // completion bang
+	void *floater; // outputs noise floor
+	t_atom *listdata;// to report est. start/stop times of events in buffer
+	float *analbuf; // contain overall envelope
+	float *onset; // contain attack times for percussive evaluations
+	short autoredraw; // to kill redraw if it impacts performance
+} t_buffet;
+
+void buffet_setbuf(t_buffet *x, t_symbol *wavename);
+void *buffet_new(t_symbol *msg, short argc, t_atom *argv);
+t_int *buffet_perform(t_int *w);
+void buffet_dsp(t_buffet *x, t_signal **sp);
+float buffet_boundrand(float min, float max);
+void buffet_assist (t_buffet *x, void *b, long msg, long arg, char *dst);
+void buffet_dsp_free(t_buffet *x);
+void buffet_swap(t_buffet *x);
+void buffet_specswap(t_buffet *x, t_symbol *msg, short argc, t_atom *argv);
+void buffet_retroblock(t_buffet *x);
+void buffet_nakedswap(t_buffet *x);
+void buffet_overlap(t_buffet *x, t_floatarg f);
+void buffet_minswap(t_buffet *x, t_floatarg f);
+void buffet_maxswap(t_buffet *x, t_floatarg f);
+void buffet_nosync_setswap(t_buffet *x);
+void buffet_info(t_buffet *x);
+void buffet_killdc(t_buffet *x);
+void buffet_rmschunk(t_buffet *x, t_symbol *msg, short argc, t_atom *argv);
+void buffet_fadein(t_buffet *x, t_floatarg f);
+void buffet_fadeout(t_buffet *x, t_floatarg f);
+void buffet_internal_fadein(t_buffet *x, t_symbol *msg, short argc, t_atom *argv);
+void buffet_internal_fadeout(t_buffet *x, t_symbol *msg, short argc, t_atom *argv);
+void buffet_dc_gain(t_buffet *x, t_floatarg f);
+void buffet_dc_coef(t_buffet *x, t_floatarg f);
+void buffet_normalize(t_buffet *x, t_floatarg f);
+void buffet_rotatetozero(t_buffet *x, t_floatarg f);
+void buffet_autoredraw(t_buffet *x, t_floatarg f);
+void buffet_erase(t_buffet *x, t_symbol *msg, short argc, t_atom *argv);
+void buffet_events(t_buffet *x, t_symbol *msg, short argc, t_atom *argv);
+void buffet_pevents(t_buffet *x, t_symbol *msg, short argc, t_atom *argv);
+void buffet_detect_onsets(t_buffet *x, t_symbol *msg, short argc, t_atom *argv);
+void buffet_detect_subband_onsets(t_buffet *x, t_symbol *msg, short argc, t_atom *argv);
+void buffet_copy_to_buffer(t_buffet *x, t_symbol *msg, short argc, t_atom *argv);
+int buffet_setdestbuf(t_buffet *x, t_symbol *wavename);
+void buffet_init(t_buffet *x, short initialized);
+void buffet_reverse(t_buffet *x);
+void buffet_redraw(t_buffet *x);
+void buffet_redraw_named(t_buffet *x, t_symbol *arrayname);
+void buffet_update(t_buffet *x);
+
+
+void buffet_tilde_setup(void)
+{
+	
+	buffet_class = class_new(gensym("buffet~"),(t_newmethod)buffet_new,(t_method)buffet_dsp_free, sizeof(t_buffet),
+							 0, A_GIMME,0);
+	CLASS_MAINSIGNALIN(buffet_class,t_buffet, x_f );
+	
+	
+	class_addmethod(buffet_class,(t_method)buffet_dsp,gensym("dsp"),A_CANT,0);
+	class_addmethod(buffet_class,(t_method)buffet_swap,gensym("swap"),0);
+	class_addmethod(buffet_class,(t_method)buffet_specswap,gensym("specswap"),A_GIMME,0);
+	class_addmethod(buffet_class,(t_method)buffet_events,gensym("events"),A_GIMME,0);
+	class_addmethod(buffet_class,(t_method)buffet_pevents,gensym("pevents"),A_GIMME,0);
+	class_addmethod(buffet_class,(t_method)buffet_detect_onsets,gensym("detect_onsets"),A_GIMME,0);
+	class_addmethod(buffet_class,(t_method)buffet_detect_subband_onsets,gensym("detect_subband_onsets"),A_GIMME,0);
+	class_addmethod(buffet_class,(t_method)buffet_retroblock,gensym("retroblock"),0);
+	class_addmethod(buffet_class,(t_method)buffet_minswap,gensym("minswap"),A_FLOAT,0);
+	class_addmethod(buffet_class,(t_method)buffet_maxswap,gensym("maxswap"),A_FLOAT,0);
+	class_addmethod(buffet_class,(t_method)buffet_fadein,gensym("fadein"),A_FLOAT,0);
+	class_addmethod(buffet_class,(t_method)buffet_fadeout,gensym("fadeout"),A_FLOAT,0);
+	class_addmethod(buffet_class,(t_method)buffet_overlap,gensym("overlap"),A_FLOAT,0);
+	class_addmethod(buffet_class,(t_method)buffet_dc_gain,gensym("dc_gain"),A_FLOAT,0);
+	class_addmethod(buffet_class,(t_method)buffet_dc_coef,gensym("dc_coef"),A_FLOAT,0);
+	class_addmethod(buffet_class,(t_method)buffet_normalize,gensym("normalize"),A_FLOAT,0);
+	class_addmethod(buffet_class,(t_method)buffet_rotatetozero,gensym("rotatetozero"),A_FLOAT,0);
+	class_addmethod(buffet_class,(t_method)buffet_autoredraw,gensym("autoredraw"),A_FLOAT,0);
+	class_addmethod(buffet_class,(t_method)buffet_killdc,gensym("killdc"),0);
+	class_addmethod(buffet_class,(t_method)buffet_nakedswap,gensym("nakedswap"),0);
+	class_addmethod(buffet_class,(t_method)buffet_rmschunk,gensym("rmschunk"),A_GIMME,0);
+	class_addmethod(buffet_class,(t_method)buffet_erase,gensym("erase"),A_GIMME,0);
+	class_addmethod(buffet_class,(t_method)buffet_copy_to_buffer,gensym("copy_to_buffer"),A_GIMME,0);
+	class_addmethod(buffet_class,(t_method)buffet_internal_fadein,gensym("internal_fadein"),A_GIMME,0);
+	class_addmethod(buffet_class,(t_method)buffet_internal_fadeout,gensym("internal_fadeout"),A_GIMME,0);
+	class_addmethod(buffet_class,(t_method)buffet_setbuf,gensym("setbuf"),A_SYMBOL,0);
+	class_addmethod(buffet_class,(t_method)buffet_reverse,gensym("reverse"),0);
+	class_addmethod(buffet_class,(t_method)buffet_info,gensym("info"),0);
+	potpourri_announce(OBJECT_NAME);
+}
+
+
+
+void buffet_info(t_buffet *x)
+{
+	long totalframes;
+	buffet_setbuf(x, x->wavename);
+	
+	if( x->hosed ){
+		error("buffet~ needs a valid buffer");
+		return;
+	}
+	
+	if( ! x->sr){
+		error("zero sample rate!");
+		return;
+	}
+	totalframes = x->wavebuf->b_frames;
+	post("minswap: %f, maxswap: %f", 1000. * x->minframes / x->sr, 1000. * x->maxframes / x->sr);
+	post("buffer size: %f", 1000. * totalframes / x->sr);
+}
+
+void buffet_overlap(t_buffet *x, t_floatarg f)
+{
+	if( f < 0.01 ){
+		error("minimum fade time is 0.01 milliseconds");
+		return;
+	}
+	x->fade = f * .001 * x->sr;
+}
+
+void buffet_events(t_buffet *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	t_word *b_samples;
+	int b_nchans;
+	int b_frames;
+	t_atom *listdata = x->listdata;
+	
+	float bufsize;
+	float onthresh;
+	float offthresh;
+	long bufsamps;
+	long aframes; // frames to analyze
+	float tadv;
+    
+	long i,j;
+	float meansq;
+	float rmsval;
+	long bindex;
+	float ipos;
+	short activated = 0;
+	float realtime = 0.0;
+	int event_count = 0;
+	float buffer_duration;
+	
+	buffet_setbuf(x, x->wavename);
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	b_frames = x->wavebuf->b_frames;
+	
+	// duration in ms.
+	buffer_duration = 1000.0 * (float)b_frames / x->sr;
+	
+	bufsize = .001 * atom_getfloatarg(0,argc,argv);
+	if(bufsize > MAX_RMS_BUFFER){
+		bufsize = MAX_RMS_BUFFER;
+		post("%s: setting analysis buffer to maximum: %f",OBJECT_NAME, MAX_RMS_BUFFER * 1000.0);
+	} else if(bufsize < MIN_RMS_BUFFER){
+		bufsize = MIN_RMS_BUFFER;
+		post("%s: setting analysis buffer to maximum: %f",OBJECT_NAME, MIN_RMS_BUFFER * 1000.0);
+	}
+	
+	onthresh = atom_getfloatarg(1,argc,argv);
+	offthresh = atom_getfloatarg(2,argc,argv);
+	bufsamps = x->sr * bufsize;
+	
+	bufsamps = bufsize * x->sr;
+	tadv = (float)bufsamps / x->sr;
+	//	post("actual window size: %f",tadv);
+	aframes = (long) ( (float) b_frames / (float)bufsamps ) - 1;
+	if(aframes < 2){
+		error("%s: this buffer is too short to analyze",OBJECT_NAME);
+		return;
+	}
+	//	post("analyzing %d frames",aframes);
+	for(i = 0; i < aframes; i++){
+		meansq = 0.0;
+		ipos = b_nchans * i * bufsamps;
+		/* only analyze first channel */
+		for(j = 0; j < bufsamps; j+= b_nchans){
+			bindex = ipos + j;
+			meansq += b_samples[bindex].w_float * b_samples[bindex].w_float;
+		}
+		meansq /= (float) bufsamps;
+		rmsval = sqrt(meansq);
+		realtime += tadv;
+		if(rmsval > onthresh && ! activated) {
+			activated = 1;
+			
+			//			post("event %d starts at %f",event_count+1, realtime);
+			
+			if(event_count >= MAX_EVENTS){
+				error("%s: exceeded maximum of %d events",OBJECT_NAME, MAX_EVENTS);
+				break;
+			}
+			SETFLOAT(listdata+(event_count*2), realtime * 1000.0);
+			
+		}
+		else if( rmsval < offthresh && activated ){
+			activated = 0;
+			//			post("event %d ends at %f",event_count, realtime);
+			SETFLOAT(listdata+((event_count*2) + 1), realtime * 1000.0);
+			++event_count;
+		}
+	}
+	if(activated){
+		post("%s: missed the end of the last event; setting to end of buffer",OBJECT_NAME);
+		SETFLOAT(listdata+((event_count*2) + 1), buffer_duration);
+		++event_count;
+	}
+	outlet_list(x->list, 0, event_count * 2, listdata);
+}
+
+
+void buffet_pevents(t_buffet *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	t_word *b_samples;
+	int b_nchans;
+	int b_frames;
+	t_atom *listdata = x->listdata;
+	
+	float bufsize;
+	//float onthresh;
+	//float offthresh;
+	float diffthresh;
+	long bufsamps;
+	long aframes; // frames to analyze
+	float tadv;
+	//long current_frame = 0;
+	long i,j;
+	float meansq;
+	float rmsval;
+	long bindex;
+	float ipos;
+	//short activated = 0;
+	float realtime = 0.0;
+	int event_count = 0;
+	float buffer_duration;
+	float mindiff, maxdiff, absdiff,rmsdiff;
+	float *analbuf = x->analbuf;
+	float *onset = x->onset;
+	//float endtime;
+	
+	buffet_setbuf(x, x->wavename);
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	b_frames = x->wavebuf->b_frames;
+	
+	// duration in ms.
+	buffer_duration = 1000.0 * (float)b_frames / x->sr;
+	
+	bufsize = .001 * atom_getfloatarg(0,argc,argv);
+	if(bufsize > MAX_RMS_BUFFER){
+		bufsize = MAX_RMS_BUFFER;
+		post("%s: setting analysis buffer to maximum: %f",OBJECT_NAME, MAX_RMS_BUFFER * 1000.0);
+	} else if(bufsize < MIN_RMS_BUFFER){
+		bufsize = MIN_RMS_BUFFER;
+		post("%s: setting analysis buffer to maximum: %f",OBJECT_NAME, MIN_RMS_BUFFER * 1000.0);
+	}
+	
+	diffthresh = atom_getfloatarg(1,argc,argv);
+	bufsamps = x->sr * bufsize;
+	
+	bufsamps = bufsize * x->sr;
+	tadv = (float)bufsamps / x->sr;
+	
+	aframes = (long) ( (float) b_frames / (float)bufsamps );
+	if(aframes < 2){
+		error("%s: this buffer is too short to analyze",OBJECT_NAME);
+		return;
+	}
+	if(aframes > MAX_RMS_FRAMES){
+		post("too many frames: try a larger buffer size");
+		return;
+	}
+	analbuf[0] = 0; // for first comparison
+	for(i = 1; i < aframes; i++){
+		meansq = 0.0;
+		ipos = b_nchans * i * bufsamps;
+		/* only analyze first channel */
+		for(j = 0; j < bufsamps; j+= b_nchans){
+			bindex = ipos + j;
+			meansq += b_samples[bindex].w_float * b_samples[bindex].w_float;
+		}
+		meansq /= (float) bufsamps;
+		analbuf[i] = rmsval = sqrt(meansq);
+		realtime += tadv;
+		
+	}
+	
+	realtime = 0;
+	mindiff = 9999.;
+	maxdiff = 0.0;
+	/* LPF - use elsewhere?
+     for(i = 1; i < aframes; i++ ){
+     analbuf[i] = (analbuf[i] + analbuf[i-1]) * 0.5;
+     }
+     */
+	// look for big changes in direction
+	for(i = 1; i < aframes; i++ ){
+		rmsdiff = analbuf[i] - analbuf[i-1];
+		absdiff = fabs(rmsdiff);
+		if(absdiff > maxdiff)
+			maxdiff = absdiff;
+		if(absdiff < mindiff)
+			mindiff = absdiff;
+		
+		if( rmsdiff > diffthresh ){
+			// new
+			
+			onset[event_count] = (realtime + bufsize) * 1000.0;
+			if(onset[event_count] < 0)
+				onset[event_count] = 0;
+			++event_count;
+			//			post("rt %f diff %f",realtime * 1000.0,rmsdiff);
+		}
+		realtime += tadv;
+	}
+	//	post("mindiff %f maxdiff %f",mindiff,maxdiff);
+	if(event_count == 0){
+		post("%s: no events found",OBJECT_NAME);
+	}
+	
+	
+	for(i = 0; i < event_count; i++){
+		SETFLOAT(listdata + i, onset[i]);
+	}
+	outlet_list(x->list, 0, event_count, listdata);
+}
+
+void buffet_internal_fadeout(t_buffet *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	long fadeframes;
+	long totalframes;
+	int i,j,k;
+	float env;
+	t_word *b_samples;
+	long b_nchans;
+	long startframe;
+	long endframe;
+	
+	if( ! x->sr){
+		error("zero sample rate!");
+		return;
+	}
+	
+	
+	buffet_setbuf(x, x->wavename);
+	if(x->hosed){
+		return;
+	}
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	totalframes = x->wavebuf->b_frames;
+	
+	if(argc < 2){
+		post("%s: internal_fadeout requires start and end times",OBJECT_NAME);
+		return;
+	}
+	startframe = .001 * x->sr * atom_getfloatarg(0,argc,argv);
+	endframe = .001 * x->sr * atom_getfloatarg(1,argc,argv);
+	
+	if(startframe < 0 || endframe > totalframes || endframe <= startframe){
+		error("%s: bad frame boundaries to internal_fadeout: %ld and %ld",OBJECT_NAME,startframe, endframe);
+		return;
+	}
+	fadeframes = endframe - startframe;
+	
+	for(i = (endframe-1) * b_nchans , k = 0; k < fadeframes ; i -= b_nchans, k++ ){
+		env = (float) k / (float) fadeframes;
+		for(j = 0; j < b_nchans; j++){
+			b_samples[i + j].w_float *= env;
+		}
+	}
+	buffet_update(x);
+}
+
+void buffet_internal_fadein(t_buffet *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	long fadeframes;
+	long totalframes;
+	int i,j,k;
+	float env;
+	t_word *b_samples;
+	long b_nchans;
+	long startframe;
+	long endframe;
+	
+	if( ! x->sr){
+		error("zero sample rate!");
+		return;
+	}
+	
+	
+	buffet_setbuf(x, x->wavename);
+	if(x->hosed){
+		return;
+	}
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	totalframes = x->wavebuf->b_frames;
+	
+	if(argc < 2){
+		post("%s: internal_fadeout requires start and end times",OBJECT_NAME);
+		return;
+	}
+	startframe = .001 * x->sr * atom_getfloatarg(0,argc,argv);
+	endframe = .001 * x->sr * atom_getfloatarg(1,argc,argv);
+	
+	if(startframe < 0 || endframe > totalframes || endframe <= startframe){
+		error("%s: bad frame boundaries to internal_fadein: %ld and %ld",OBJECT_NAME,startframe, endframe);
+		return;
+	}
+	fadeframes = endframe - startframe;
+	
+	for(i = startframe * b_nchans , k = 0; k < fadeframes ; i += b_nchans, k++ ){
+		env = (float) k / (float) fadeframes;
+		for(j = 0; j < b_nchans; j++){
+			b_samples[i + j].w_float *= env;
+		}
+	}
+	buffet_update(x);
+}
+
+void buffet_reverse(t_buffet *x)
+{
+	
+	int i,j;
+	//	float env;
+	t_word *b_samples;
+	long b_nchans;
+	long b_frames;
+	float tmpsamp;
+	long lenm1;
+	
+	buffet_setbuf(x, x->wavename);
+	if(!x->wavebuf->b_valid){
+		return;
+	}
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	b_frames = x->wavebuf->b_frames;
+	lenm1 = (b_frames - 1) * b_nchans;
+	for( i = 0; i < (b_frames * b_nchans) / 2; i += b_nchans){
+		for(j = 0; j < b_nchans; j++){
+			tmpsamp = b_samples[(lenm1 - i) + j].w_float;
+			b_samples[(lenm1 - i) + j].w_float = b_samples[i + j].w_float;
+			b_samples[i + j].w_float = tmpsamp;
+		}
+	}
+    
+	buffet_update(x);
+}
+
+void buffet_update(t_buffet *x)
+{
+	outlet_bang(x->bang);
+	if(x->autoredraw){
+		buffet_redraw(x);
+	}
+}
+
+
+void buffet_redraw_named(t_buffet *x, t_symbol *arrayname)
+{
+	t_garray *a;
+	if (!(a = (t_garray *)pd_findbyclass(arrayname, garray_class))) {
+		if (*arrayname->s_name) pd_error(x, "%s: %s: no such array",OBJECT_NAME, arrayname->s_name);
+	}
+	else  {
+		garray_redraw(a);
+	}
+}
+
+void buffet_redraw(t_buffet *x)
+{
+	t_garray *a;
+	if (!(a = (t_garray *)pd_findbyclass(x->wavename, garray_class))) {
+		if (*x->wavename->s_name) pd_error(x, "%s: %s: no such array",OBJECT_NAME, x->wavename->s_name);
+		x->wavebuf->b_valid = 0;
+	}
+	else  {
+		garray_redraw(a);
+	}
+}
+
+void buffet_copy_to_buffer(t_buffet *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	t_symbol *destname;
+	
+	t_word *b_samples;
+	long b_nchans;
+	long b_frames;
+	
+	t_word *b_dest_samples;
+	long b_dest_nchans;
+	long b_dest_frames;
+	
+	long startframe;
+	long endframe;
+	long chunkframes;
+	
+	float fadein,fadeout;
+	int fadeframes;
+	// totalframes;
+	float env;
+	int i,j,k;
+	
+	buffet_setbuf(x, x->wavename);
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	b_frames = x->wavebuf->b_frames;
+	
+    
+	destname = atom_getsymbolarg(0,argc,argv);
+	
+	if(! buffet_setdestbuf(x, destname)){
+		post("%s: could not find buffer %s",OBJECT_NAME,destname->s_name);
+		return;
+	}
+	b_dest_samples = x->destbuf->b_samples;
+	b_dest_nchans = x->destbuf->b_nchans;
+	b_dest_frames = x->destbuf->b_frames;
+	
+	startframe = atom_getfloatarg(1,argc,argv) * .001 * x->sr;
+	endframe = atom_getfloatarg(2,argc,argv) * .001 * x->sr;
+	chunkframes = endframe - startframe;
+	if(chunkframes <= 0){
+		return;
+	}
+	if(b_nchans != b_dest_nchans){
+		error("%s: channel mismatch with buffer %s",OBJECT_NAME, destname->s_name);
+		return;
+	}
+	if(b_dest_frames < chunkframes ){
+		//		post("%s: %s is too small, truncating copy region",OBJECT_NAME, destname->s_name);
+		chunkframes = b_dest_frames;
+	}
+	if(startframe < 0 || endframe >= b_frames){
+		error("%s: bad frame range for source buffer: %ld %ld",OBJECT_NAME, startframe,endframe);
+		return;
+	}
+	/* first clean out destination */
+    for(i = 0; i < b_dest_frames; i++){
+        b_dest_samples[i].w_float = 0.0;
+    }
+	// memset((char *)b_dest_samples, 0, b_dest_frames * b_dest_nchans * sizeof(float));
+	
+	/* now copy segment */
+    for(i = 0; i < chunkframes; i++){
+        b_dest_samples[i].w_float = b_samples[i+startframe].w_float;
+    }
+    
+	/* memcpy(b_dest_samples, b_samples + (startframe * b_nchans),
+		   chunkframes * b_nchans * sizeof(float) ); */
+	
+	if(argc == 5){
+		//		post("enveloping");
+		fadein = atom_getfloatarg(3,argc,argv);
+		fadeout = atom_getfloatarg(4,argc,argv);
+		if(fadein > 0){
+			//			post("fading in");
+			fadeframes = fadein * .001 * x->sr;
+			
+			if( fadeframes > b_dest_frames){
+				error("%s: fadein is too long",OBJECT_NAME);
+				return;
+			}
+			
+			
+			for(i = 0 , k = 0; k < fadeframes ; i += b_dest_nchans, k++ ){
+				env = (float) k / (float) fadeframes;
+				for(j = 0; j < b_dest_nchans; j++){
+					b_dest_samples[i + j].w_float *= env;
+				}
+			}
+		}
+		
+		if(fadeout > 0){
+			//			post("fading out");
+			//			totalframes = chunkframes;
+			fadeframes = fadeout * .001 * x->sr;
+			startframe = chunkframes - fadeframes;
+			endframe = chunkframes;
+			
+			//		endframe = .001 * x->sr * atom_getfloatarg(1,argc,argv); // stays the same
+			
+			if(startframe < 0){
+				error("%s: bad frame boundaries to internal_fadeout: %ld and %ld",
+					  OBJECT_NAME,startframe, endframe);
+				return;
+			}
+			//	  fadeframes = endframe - startframe; // we already know this
+			
+			for(i = (chunkframes-1) * b_dest_nchans , k = 0; k < fadeframes ; i -= b_dest_nchans, k++ ){
+				env = (float) k / (float) fadeframes;
+				for(j = 0; j < b_dest_nchans; j++){
+					b_dest_samples[i + j].w_float *= env;
+				}
+			}
+		}
+	}
+	buffet_redraw_named(x, destname);
+	outlet_bang(x->bang);
+}
+
+int buffet_setdestbuf(t_buffet *x, t_symbol *wavename)
+{
+    
+	t_garray *a;
+	int b_frames;
+	t_word *b_samples;
+	if (!(a = (t_garray *)pd_findbyclass(wavename, garray_class))) {
+		if (*wavename->s_name) pd_error(x, "%s: %s: no such array",OBJECT_NAME,wavename->s_name);
+		x->destbuf->b_valid = 0;
+    }
+	else if (!garray_getfloatwords(a, &b_frames, &b_samples)) {
+		pd_error(x, "%s: bad array for %s", wavename->s_name,OBJECT_NAME);
+		x->destbuf->b_valid = 0;
+    }
+	else  {
+		x->destbuf->b_valid = 1;
+		x->destbuf->b_frames = (long)b_frames;
+		x->destbuf->b_nchans = 1;
+		x->destbuf->b_samples = b_samples;
+		garray_usedindsp(a);
+	}
+    /*We added this in linux - better check that it works */
+	return x->destbuf->b_valid;
+}
+
+void buffet_rmschunk(t_buffet *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	
+	t_word *b_samples;
+	long b_nchans;
+	long b_frames;
+    
+	long bufsamps;
+	long i;
+	float meansq;
+	float rmsval;
+	long bindex;
+    
+	float buffer_duration;
+	long startframe;
+	long endframe;
+	
+	buffet_setbuf(x, x->wavename);
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	b_frames = x->wavebuf->b_frames;
+	
+	// duration in ms.
+	buffer_duration = 1000.0 * (float)b_frames / x->sr;
+	
+	
+	startframe = .001 * x->sr * atom_getfloatarg(0,argc,argv);
+	endframe = .001 * x->sr * atom_getfloatarg(1,argc,argv);
+	if(startframe < 0 || startframe >= b_frames - 1){
+		error("%s: naughty start frame: %ld",OBJECT_NAME,startframe);
+		return;
+	}
+	if(endframe < 2 || endframe >= b_frames){
+		error("%s: naughty start frame: %ld",OBJECT_NAME,startframe);
+		return;
+	}
+	
+	
+	bufsamps = (endframe - startframe);
+	//  post("analyzing %d samples",bufsamps);
+	if(!bufsamps){
+		// 	post("%s: start and end are identical!",OBJECT_NAME);
+		// 	post("instantaneous sample value [ch 1 only]: %f", b_samples[startframe*b_nchans]);
+		return;
+	}
+	meansq = 0.0;
+	for(i = startframe; i < endframe; i++){
+		
+		bindex = b_nchans * i; 		/* only analyze first channel */
+		meansq += b_samples[bindex].w_float * b_samples[bindex].w_float;
+		
+	}
+	
+	meansq /= (float) bufsamps;
+	rmsval = sqrt(meansq);
+	
+	x->rmschunk = rmsval;
+	outlet_float(x->floater, (double)x->rmschunk);
+}
+
+
+void buffet_dc_gain(t_buffet *x, t_floatarg f)
+{
+	x->dc_gain = f;
+}
+
+void buffet_dc_coef(t_buffet *x, t_floatarg f)
+{
+	x->dc_coef = f;
+}
+
+void buffet_autoredraw(t_buffet *x, t_floatarg f)
+{
+	x->autoredraw = (short)f;
+}
+
+void buffet_minswap(t_buffet *x, t_floatarg f)
+{
+	if(f < 2.0 * 1000.0 * x->fade  / x->sr){
+		error("minimum must be at least twice fade time which is %f", 1000. * x->fade / x->sr);
+		return;
+	}
+	x->minframes = f * .001 * x->sr;
+	//	post("min set to %f samples",x->minframes);
+}
+
+void buffet_maxswap(t_buffet *x, t_floatarg f)
+{
+	long oldmem;
+	//	long framelimit;
+	long newframes;
+	
+	newframes = f * .001 * x->sr;
+	if(newframes <= x->minframes){
+		error("max blocksize must exceed minimum blocksize, which is %f", 1000. * x->minframes/ x->sr);
+	}
+	if(newframes > x->storage_maxframes ){
+		//	post("extending memory");
+		oldmem = x->storage_bytes;
+		//	post("old memory %d", oldmem);
+		x->storage_maxframes = newframes;
+		x->storage_bytes = (x->storage_maxframes + 1) * 2 * sizeof(float);
+		//	post("new memory %d", x->storage_bytes);
+		
+		x->storage = (float *) resizebytes((char *)x->storage, oldmem, x->storage_bytes);
+	}
+	x->maxframes = newframes;
+}
+
+void buffet_erase(t_buffet *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	t_word *b_samples;
+	long b_nchans;
+	long b_frames;
+	long startframe, endframe;
+	//int slab;
+	//int offset;
+	int i;
+	
+	if(argc < 2){
+		post("%s: erase requires start and end times",OBJECT_NAME);
+		return;
+	}
+	buffet_setbuf(x, x->wavename);
+	if(x->hosed){
+		return;
+	}
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	b_frames = x->wavebuf->b_frames;
+	
+	startframe = .001 * x->sr * atom_getfloatarg(0,argc,argv);
+	endframe = .001 * x->sr * atom_getfloatarg(1,argc,argv);
+	if(startframe < 0){
+		startframe = 0;
+	}
+	if(endframe > b_frames - 1){
+		endframe = b_frames - 1;
+	}
+	if(startframe >= b_frames - 1){
+		error("%s: naughty start frame: %ld",OBJECT_NAME,startframe);
+		return;
+	}
+	if(endframe < 2 || endframe <= startframe){
+		error("%s: naughty end frame: %ld",OBJECT_NAME,endframe);
+		return;
+	}
+	
+	for(i = startframe * b_nchans; i < endframe * b_nchans; i++){
+		b_samples[i].w_float = 0.0;
+	}
+	
+	buffet_update(x);
+}
+
+
+void buffet_rotatetozero(t_buffet *x, t_floatarg f)
+{
+	int i;
+	float target = (float) f;
+	long shiftframes = (long) (target * 0.001 * x->sr);
+	
+	t_word *b_samples;
+	long b_nchans;
+	long b_frames;
+	float *tmpmem;
+	
+	
+	
+	buffet_setbuf(x, x->wavename);
+	if(x->hosed){
+		return;
+	}
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	b_frames = x->wavebuf->b_frames;
+	
+	
+	if(shiftframes <= 0 || shiftframes >= b_frames){
+		error("%s: shift target %f is out of range",OBJECT_NAME,target);
+		return;
+	}
+	
+	tmpmem = (float *) malloc(shiftframes * b_nchans * sizeof(float));
+	
+	/* copy shift block to tmp */
+	for(i = 0; i < shiftframes; i++){
+        tmpmem[i] = b_samples[i].w_float;
+    }
+	// memcpy(tmpmem, b_samples, shiftframes * b_nchans * sizeof(float));
+	
+	
+	/* now shift the rest to the top */
+	for(i = 0; i < b_frames - shiftframes; i++){
+        b_samples[i].w_float =b_samples[i+shiftframes].w_float;
+    }
+    /*
+	memmove(b_samples, b_samples + (shiftframes * b_nchans),
+			(b_frames - shiftframes) * b_nchans * sizeof(float));
+	*/
+	
+	/* finally copy tmp to the tail */
+	
+	for(i = 0; i < shiftframes; i++){
+        b_samples[(b_frames - shiftframes)+i].w_float = tmpmem[i];
+    }
+	/* memcpy(b_samples + (b_frames - shiftframes) * b_nchans,tmpmem,
+		   shiftframes * b_nchans * sizeof(float ));
+	*/
+	free(tmpmem);
+	buffet_update(x);
+}
+
+void buffet_normalize(t_buffet *x, t_floatarg f)
+{
+	
+	float target = (float) f;
+	t_word *b_samples;
+	long b_nchans;
+	long b_frames;
+	long i;
+	float maxamp = 0.0;
+	float amptest;
+	float rescale;
+	
+	if(target <= 0.0){
+		error("%s: normalize target %f is too low",OBJECT_NAME,target);
+		return;
+	}
+	buffet_setbuf(x, x->wavename);
+	if(x->hosed){
+		return;
+	}
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	b_frames = x->wavebuf->b_frames;
+	for(i = 0; i < b_frames * b_nchans; i++){
+		amptest = fabs(b_samples[i].w_float);
+		if(maxamp < amptest)
+			maxamp = amptest;
+	}
+	
+	if(maxamp < .000000001){
+		post("%s: amplitude zero or too low to normalize in \"%s\"",OBJECT_NAME,x->wavename->s_name);
+		return;
+	}
+	rescale = target / maxamp;
+	if(rescale > .99 && rescale < 1.01){
+		post("%s: \"%s\" already normalized to %f",OBJECT_NAME,x->wavename->s_name,target);
+	}
+	else {
+		for(i = 0; i < b_frames * b_nchans; i++){
+			b_samples[i].w_float *= rescale;
+		}
+	}
+	buffet_update(x);
+}
+
+
+void buffet_fadein(t_buffet *x, t_floatarg f)
+{
+	long fadeframes;
+	long totalframes;
+	int i,j,k;
+	float env;
+	t_word *b_samples;
+	long b_nchans;
+	
+	
+	if( ! x->sr){
+		error("zero sample rate!");
+		return;
+	}
+	fadeframes = f * .001 * x->sr;
+	//post("fading in %d frames",fadeframes);
+	buffet_setbuf(x, x->wavename);
+	if(x->hosed){
+		return;
+	}
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	totalframes = x->wavebuf->b_frames;
+	
+	
+	
+	if( fadeframes > totalframes){
+		error("fadein is too long");
+		return;
+	}
+	for(i = 0, k = 0;i < fadeframes * b_nchans; i += b_nchans, k++ ){
+		env = (float) k / (float) fadeframes;
+		for(j = 0; j < b_nchans; j++){
+			b_samples[i + j].w_float *= env;
+		}
+	}
+	buffet_update(x);
+}
+
+void buffet_fadeout(t_buffet *x, t_floatarg f)
+{
+	long fadeframes;
+	long totalframes;
+	int i,j,k;
+	float env;
+	t_word *b_samples;
+	long b_nchans;
+	
+	
+	if( ! x->sr){
+		error("zero sample rate!");
+		return;
+	}
+	fadeframes = f * .001 * x->sr;
+	buffet_setbuf(x, x->wavename);
+	if(x->hosed){
+		return;
+	}
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	totalframes = x->wavebuf->b_frames;
+	
+	
+	
+	if( fadeframes > totalframes){
+		error("%s: fadein is too long",OBJECT_NAME);
+		return;
+	}
+	for(i = (totalframes-1) * b_nchans , k = 0; k < fadeframes ; i -= b_nchans, k++ ){
+		env = (float) k / (float) fadeframes;
+		for(j = 0; j < b_nchans; j++){
+			b_samples[i + j].w_float *= env;
+		}
+	}
+	buffet_update(x);
+}
+
+
+
+void buffet_killdc(t_buffet *x)
+{
+	//	long fadeframes;
+	long totalframes;
+	int i,j;
+	t_word *b_samples;
+	long b_nchans;
+	float dc_coef = x->dc_coef;
+	float a0[MAX_CHANNELS];
+	float a1[MAX_CHANNELS];
+	float b0[MAX_CHANNELS];
+	float b1[MAX_CHANNELS];
+	
+	buffet_setbuf(x, x->wavename);
+	if(x->hosed){
+		return;
+	}
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	totalframes = x->wavebuf->b_frames;
+	
+	if(b_nchans > MAX_CHANNELS) {
+		error("buffer has too many channels");
+		return;
+	}
+	for(j = 0; j < b_nchans; j++){
+		a0[j] = a1[j] = b0[j] = b1[j] = 0.0;
+	}
+	
+	for(i = 0; i < totalframes * b_nchans; i += b_nchans){
+		for(j = 0; j < b_nchans; j++){
+			a0[j] = b_samples[i + j].w_float;
+			b0[j] = a0[j] - a1[j] + dc_coef * b1[j];
+			b_samples[i + j].w_float = b0[j];
+			b1[j] = b0[j];
+			a1[j] = a0[j];
+		}
+	}
+	buffet_update(x);
+}
+
+
+void *buffet_new(t_symbol *msg, short argc, t_atom *argv)
+{
+	
+    
+	//	int i;
+	
+	srand(clock());
+    
+	t_buffet *x = (t_buffet *)pd_new(buffet_class);
+	x->bang = outlet_new(&x->x_obj, gensym("bang"));
+	x->list = outlet_new(&x->x_obj, gensym("list"));
+	x->floater = outlet_new(&x->x_obj, gensym("float"));
+    
+    x->sr = sys_getsr();
+    if(! x->sr )
+        x->sr = 44100;
+    
+    if(argc <= 1 || argv[0].a_type != A_SYMBOL) {
+        post("%s: warning: no array name provided: defaulting to empty symbol",
+            OBJECT_NAME);
+    }
+    atom_arg_getsym(&x->wavename,0,argc,argv);
+    atom_arg_getfloat(&x->minframes,1,argc,argv);
+    atom_arg_getfloat(&x->maxframes,2,argc,argv);
+    if(!x->minframes)
+        x->minframes = 100;
+    if(!x->maxframes)
+        x->maxframes = x->minframes + 10;
+    
+    buffet_init(x,0);
+    
+    
+    
+    return (x);
+}
+
+void buffet_init(t_buffet *x, short initialized)
+{
+	if(x->minframes <= 0)
+		x->minframes = 250;
+	if(x->maxframes <= 0)
+		x->maxframes = 1000;
+	
+	if(!initialized){
+		x->minframes *= .001 * x->sr;
+		x->storage_maxframes = x->maxframes *= .001 * x->sr;
+		x->fade = .001 * 20 * x->sr; // 20 ms fadetime to start
+		x->storage_bytes = (x->maxframes + 1) * 2 * sizeof(float); // stereo storage frames
+		x->storage = (float *) getbytes(x->storage_bytes);
+		x->dc_coef = .995; // for dc blocker
+		x->dc_gain = 4.0;
+		x->autoredraw = 1;
+		x->rmsbuf = (float *) getbytes(MAX_RMS_BUFFER * x->sr * sizeof(float));
+		memset((char *)x->rmsbuf, 0, MAX_RMS_BUFFER * x->sr * sizeof(float));
+		x->listdata = (t_atom *)getbytes(MAX_EVENTS * sizeof(t_atom));// lots of events
+		x->analbuf = (float *) getbytes(MAX_RMS_FRAMES * sizeof(float));
+		memset((char *)x->analbuf, 0, MAX_RMS_FRAMES * sizeof(float));
+		x->onset = (float *) getbytes(MAX_EVENTS * sizeof(float));
+		x->wavebuf = (t_guffer *) getbytes(1 * sizeof(t_guffer));
+		x->destbuf = (t_guffer *) getbytes(1 * sizeof(t_guffer));
+	} else {
+		x->minframes *= .001 * x->sr;
+		x->storage_maxframes = x->maxframes *= .001 * x->sr;
+		x->fade = .001 * 20 * x->sr; // 20 ms fadetime to start
+		x->storage_bytes = (x->maxframes + 1) * 2 * sizeof(float); // stereo storage frames
+		x->storage = (float *) resizebytes((char *)x->storage_bytes,0,x->storage_bytes);
+		x->rmsbuf = (float *)resizebytes((char *)x->rmsbuf,0,MAX_RMS_BUFFER * x->sr * sizeof(float));
+		memset((char *)x->rmsbuf, 0, MAX_RMS_BUFFER * x->sr * sizeof(float));
+	}
+}
+
+
+void buffet_nosync_setswap(t_buffet *x)
+{
+	long totalframes = x->wavebuf->b_frames;
+	
+	float minframes = x->minframes;
+	float maxframes = x->maxframes;
+	long swapframes = x->swapframes;
+	long r1startframe = x->r1startframe;
+	long r2startframe = x->r2startframe;
+	long r1endframe;
+	long r2endframe;
+	long region1;
+	long region2;
+	
+    
+	swapframes = buffet_boundrand(minframes, maxframes);
+	r1startframe = buffet_boundrand(0.0, (float)(totalframes-swapframes));
+	r1endframe = r1startframe + swapframes;
+	region1 = r1startframe;
+	region2 = totalframes - r1endframe;
+	if(swapframes > region1){
+		r2startframe = buffet_boundrand((float)r1endframe,(float)(totalframes-swapframes));
+	} else if(swapframes > region2) {
+		r2startframe = buffet_boundrand(0.0,(float)(r1startframe-swapframes));
+	} else { // either region ok
+		if(buffet_boundrand(0.0,1.0) > 0.5){
+			r2startframe = buffet_boundrand(0.0,(float)(r1startframe-swapframes));
+		} else {
+			r2startframe = buffet_boundrand((float)r1endframe,(float)(totalframes-swapframes));
+		}
+	}
+	r2endframe = r2startframe + swapframes;
+	
+	if(r2startframe < 0 || r1startframe < 0){
+		error("start frame less than zero!");
+		return;
+	}
+	if(r2endframe >= totalframes || r1endframe >= totalframes){
+		error("end frame reads beyond buffer!");
+		return;
+	}
+	x->swapframes = swapframes;
+	x->r1startframe = r1startframe;
+	x->r2startframe = r2startframe;
+	outlet_bang(x->bang);
+}
+
+
+void buffet_swap(t_buffet *x)
+{
+    
+	float maxframes = x->maxframes;
+	float fade = x->fade;
+	long totalframes;
+	long swapframes;
+	long start_sample1;
+	long start_sample2;
+	float *storage = x->storage;
+	t_word *b_samples;
+	float mix_sample;
+	float fadein_gain;
+	float fadeout_gain;
+	float fadephase;
+	long b_nchans;
+	int i,j,k;
+	buffet_setbuf(x, x->wavename);
+	if(x->hosed){
+		return;
+	}
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	totalframes = x->wavebuf->b_frames;
+	
+	if(totalframes < maxframes * 2 + 1){
+		error("buffer must contain at least twice as many samples as the maximum swap size");
+		return;
+	}
+	if(b_nchans > 2){
+		error("buffet~ only accepts mono or stereo buffers");
+		return;
+	}
+	
+	buffet_nosync_setswap(x);
+	
+	
+	start_sample1 = x->r1startframe * b_nchans;
+	start_sample2 = x->r2startframe * b_nchans;
+	swapframes = x->swapframes;
+	
+	// store block1 samples
+	for(i = 0; i < swapframes * b_nchans; i += b_nchans){
+		for(j = 0; j < b_nchans; j++){
+			storage[i+j] = b_samples[start_sample1 + i + j].w_float;
+		}
+	}
+	// swap block2 into block1 location, fadein
+	
+	for(i = 0, k = 0; i < fade * b_nchans; i += b_nchans, k++){
+		fadephase = ((float)k / (float) fade) * PIOVERTWO;
+		fadein_gain = sin(fadephase);
+		fadeout_gain = cos(fadephase);
+		for(j = 0; j < b_nchans; j++){
+			mix_sample = fadein_gain * b_samples[start_sample2 + i + j].w_float + fadeout_gain * b_samples[start_sample1 + i + j].w_float;
+			b_samples[start_sample1 + i + j].w_float = mix_sample;
+		}
+	}
+	// middle part, pure swap
+	
+	for(i = fade * b_nchans; i < (swapframes-fade) * b_nchans; i += b_nchans){
+		for(j = 0; j < b_nchans; j++){
+			b_samples[start_sample1 + i + j].w_float = b_samples[start_sample2 + i + j].w_float;
+		}
+	}
+	// fade out
+	
+	for(i = (swapframes-fade) * b_nchans, k = 0; i < swapframes * b_nchans; i += b_nchans, k++){
+		fadephase = ((float)k / (float) fade) * PIOVERTWO;
+		fadein_gain = sin(fadephase);
+		fadeout_gain = cos(fadephase);
+		for(j = 0; j < b_nchans; j++){
+			mix_sample = fadeout_gain * b_samples[start_sample2 + i + j].w_float + fadein_gain * b_samples[start_sample1 + i + j].w_float;
+			b_samples[start_sample1 + i + j].w_float = mix_sample;
+		}
+	}
+	// now mix stored block1 into block2 location
+	// swap block2 into block1 location, fadein
+	
+	for(i = 0, k = 0; i < fade * b_nchans; i += b_nchans, k++){
+		fadein_gain = (float)k / (float) fade;
+		fadeout_gain = 1.0 - fadein_gain;
+		for(j = 0; j < b_nchans; j++){
+			mix_sample = fadein_gain * storage[i + j] + fadeout_gain * b_samples[start_sample2 + i + j].w_float;
+			b_samples[start_sample2 + i + j].w_float = mix_sample;
+		}
+	}
+	// middle part, pure swap
+	
+	for(i = fade * b_nchans; i < (swapframes-fade) * b_nchans; i += b_nchans){
+		for(j = 0; j < b_nchans; j++){
+			b_samples[start_sample2 + i + j].w_float = storage[i + j];
+		}
+	}
+	// fade out
+	
+	for(i = (swapframes-fade) * b_nchans, k = 0; i < swapframes * b_nchans; i += b_nchans, k++){
+		fadein_gain = (float)k / (float) fade;
+		fadeout_gain = 1.0 - fadein_gain;
+		for(j = 0; j < b_nchans; j++){
+			mix_sample = fadeout_gain * storage[i + j] + fadein_gain * b_samples[start_sample2 + i + j].w_float;
+			b_samples[start_sample2 + i + j].w_float = mix_sample;
+		}
+	}
+	buffet_update(x);
+}
+
+
+void buffet_specswap(t_buffet *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	//	float minframes = x->minframes;
+	float maxframes = x->maxframes;
+	float fade = x->fade;
+	long totalframes;
+	long swapframes;
+	long r1startframe;
+	long r1endframe;
+	long r2startframe;
+	long r2endframe;
+	long region1;
+	long region2;
+	long start_sample1;
+	long start_sample2;
+	float *storage = x->storage;
+	t_word *b_samples;
+	float mix_sample;
+	float fadein_gain;
+	float fadeout_gain;
+	float fadephase;
+	long b_nchans;
+	int i,j,k;
+	buffet_setbuf(x, x->wavename);
+	if(x->hosed){
+		return;
+	}
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	totalframes = x->wavebuf->b_frames;
+	
+	if(totalframes < maxframes * 2 + 1){
+		error("buffer must contain at least twice as many samples as the maximum swap size");
+		return;
+	}
+	if(b_nchans > 2){
+		error("buffet~ only accepts mono or stereo buffers");
+		return;
+	}
+	
+	r1startframe = x->sr * .001 * atom_getfloatarg(0,argc,argv);
+	r2startframe = x->sr * .001 * atom_getfloatarg(1,argc,argv);
+	swapframes = x->sr * .001 * atom_getfloatarg(2,argc,argv);
+	if( r1startframe < 0 || r1startframe >= totalframes){
+		error("bad first skip time");
+		return;
+	}
+	if( r2startframe < 0 || r2startframe >= totalframes){
+		error("bad second skip time");
+		return;
+	}
+	//	post("start1 %d start2 %d swaps %d",r1startframe,r2startframe,swapframes );
+	
+	r1endframe = r1startframe + swapframes;
+	r2endframe = r2startframe + swapframes;
+	region1 = r1startframe;
+	region2 = totalframes - r1endframe;
+	/*
+     post("min: %.0f, max: %.0f, total: %d, swap: %d",minframes, maxframes,totalframes, swapframes);
+	 post("r1st %d, r1end %d, region1 %d, region2 %d",r1startframe, r1endframe, region1, region2);
+	 */
+	if(swapframes > x->storage_maxframes) {
+		error("swapsize %ld is larger than %ld; reset maximum swap.", swapframes,x->storage_maxframes );
+		return;
+	}
+	if(r1endframe >= totalframes){
+		error("block 1 reads beyond buffer!");
+		return;
+	}
+	if(r2endframe >= totalframes){
+		error("block 2 reads beyond buffer!");
+		return;
+	}
+	
+	// store block1 samples
+	start_sample1 = r1startframe * b_nchans;
+	start_sample2 = r2startframe * b_nchans;
+	for(i = 0; i < swapframes * b_nchans; i += b_nchans){
+		for(j = 0; j < b_nchans; j++){
+			storage[i+j] = b_samples[start_sample1 + i + j].w_float;
+		}
+	}
+	// swap block2 into block1 location, fadein
+	
+	for(i = 0, k = 0; i < fade * b_nchans; i += b_nchans, k++){
+		fadephase = ((float)k / (float) fade) * PIOVERTWO;
+		fadein_gain = sin(fadephase);
+		fadeout_gain = cos(fadephase);
+		for(j = 0; j < b_nchans; j++){
+			mix_sample = fadein_gain * b_samples[start_sample2 + i + j].w_float + fadeout_gain * b_samples[start_sample1 + i + j].w_float;
+			b_samples[start_sample1 + i + j].w_float = mix_sample;
+		}
+	}
+	// middle part, pure swap
+	
+	for(i = fade * b_nchans; i < (swapframes-fade) * b_nchans; i += b_nchans){
+		for(j = 0; j < b_nchans; j++){
+			b_samples[start_sample1 + i + j].w_float = b_samples[start_sample2 + i + j].w_float;
+		}
+	}
+	// fade out
+	
+	for(i = (swapframes-fade) * b_nchans, k = 0; i < swapframes * b_nchans; i += b_nchans, k++){
+		fadephase = ((float)k / (float) fade) * PIOVERTWO;
+		fadein_gain = sin(fadephase);
+		fadeout_gain = cos(fadephase);
+		for(j = 0; j < b_nchans; j++){
+			mix_sample = fadeout_gain * b_samples[start_sample2 + i + j].w_float + fadein_gain * b_samples[start_sample1 + i + j].w_float;
+			b_samples[start_sample1 + i + j].w_float = mix_sample;
+		}
+	}
+	// now mix stored block1 into block2 location
+	// swap block2 into block1 location, fadein
+	
+	for(i = 0, k = 0; i < fade * b_nchans; i += b_nchans, k++){
+		fadein_gain = (float)k / (float) fade;
+		fadeout_gain = 1.0 - fadein_gain;
+		for(j = 0; j < b_nchans; j++){
+			mix_sample = fadein_gain * storage[i + j] + fadeout_gain * b_samples[start_sample2 + i + j].w_float;
+			b_samples[start_sample2 + i + j].w_float = mix_sample;
+		}
+	}
+	// middle part, pure swap
+	
+	for(i = fade * b_nchans; i < (swapframes-fade) * b_nchans; i += b_nchans){
+		for(j = 0; j < b_nchans; j++){
+			b_samples[start_sample2 + i + j].w_float = storage[i + j];
+		}
+	}
+	// fade out
+	
+	for(i = (swapframes-fade) * b_nchans, k = 0; i < swapframes * b_nchans; i += b_nchans, k++){
+		fadein_gain = (float)k / (float) fade;
+		fadeout_gain = 1.0 - fadein_gain;
+		for(j = 0; j < b_nchans; j++){
+			mix_sample = fadeout_gain * storage[i + j] + fadein_gain * b_samples[start_sample2 + i + j].w_float;
+			b_samples[start_sample2 + i + j].w_float = mix_sample;
+		}
+	}
+	buffet_update(x);
+}
+
+
+void buffet_retroblock(t_buffet *x)
+{
+	float minframes = x->minframes;
+	float maxframes = x->maxframes;
+	float fade = x->fade;
+	long totalframes;
+	long swapframes;
+	long r1startframe;
+	long r1endframe;
+	long start_sample1;
+	float *storage = x->storage;
+	t_word *b_samples;
+	float mix_sample;
+	float fadein_gain;
+	float fadeout_gain;
+	//	float fadephase;
+	long ub1, lb1;
+	long ub2, lb2;
+	long block1size,block2size;
+	long b_nchans;
+	long syncframe;
+	int i,j,k;
+	buffet_setbuf(x, x->wavename);
+	if(x->hosed){
+		return;
+	}
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	totalframes = x->wavebuf->b_frames;
+	
+	if(totalframes < maxframes * b_nchans + 1){
+		error("buffer must contain at least twice as many samples as the maximum swap size");
+		return;
+	}
+	if(b_nchans > 2){
+		error("buffet~ only accepts mono or stereo buffers");
+		return;
+	}
+	syncframe = x->sync * totalframes;
+	swapframes = buffet_boundrand(minframes, maxframes);
+	if(x->sync <= 0.0 ){ // either no sync signal or it is zero
+		r1startframe = buffet_boundrand(0.0, (float)(totalframes-swapframes));
+		r1endframe = r1startframe + swapframes;
+	} else {
+		// avoid swapping where we are playing from buffer
+		lb1 = 0;
+		ub1 = syncframe - CUSHION_FRAMES; // could be reading buffer backwards
+		lb2 = ub1 + CUSHION_FRAMES;
+		ub2 = totalframes - 1;
+		block1size = ub1 - lb1;
+		block2size = ub2 - lb2;
+		
+		if(block1size < maxframes && block2size < maxframes ) {
+			error("could not reverse block");
+			return;
+		}
+		if(block1size >= maxframes && block2size >= maxframes){
+			if(buffet_boundrand(0.0,1.0) > 0.5){
+				r1startframe = buffet_boundrand(0.0, (float)(ub1-swapframes));
+			} else {
+				r1startframe = buffet_boundrand((float)lb2, (float)(ub2-swapframes));
+			}
+		} else if(block1size < maxframes) {
+			r1startframe = buffet_boundrand((float)lb2, (float)(ub2-swapframes));
+		} else {
+			r1startframe = buffet_boundrand(0.0, (float)(ub1-swapframes));
+		}
+		r1endframe = r1startframe + swapframes;
+	}
+	
+	
+	if(r1endframe >= totalframes){
+		error("%s: retro beyond bounds",OBJECT_NAME);
+		return;
+	}
+	
+	// store block1 samples
+	start_sample1 = r1startframe * b_nchans;
+	// start_sample2 = r2startframe * b_nchans;
+	// store block in reversed order
+	for(k = 0, i = (swapframes-1) * b_nchans; i > 0; i -= b_nchans, k += b_nchans){
+		for(j = 0; j < b_nchans; j++){
+			storage[i+j] = b_samples[start_sample1 + k + j].w_float;
+		}
+	}
+	// swap block2 into block1 location, fadein
+	
+	for(i = 0, k = 0; i < fade * b_nchans; i += b_nchans, k++){
+		fadein_gain = (float)k / (float) fade;
+		fadeout_gain = 1.0 - fadein_gain;
+		for(j = 0; j < b_nchans; j++){
+			mix_sample = fadein_gain * storage[i + j] + fadeout_gain * b_samples[start_sample1 + i + j].w_float;
+			b_samples[start_sample1 + i + j].w_float = mix_sample;
+		}
+	}
+	// middle part, pure swap
+	
+	
+	for(i = fade * b_nchans; i < (swapframes-fade) * b_nchans; i += b_nchans){
+		for(j = 0; j < b_nchans; j++){
+			b_samples[start_sample1 + i + j].w_float = storage[i + j];
+		}
+	}
+	// fade out
+	
+	for(i = (swapframes-fade) * b_nchans, k = 0; i < swapframes * b_nchans; i += b_nchans, k++){
+		fadein_gain = (float)k / (float) fade;
+		fadeout_gain = 1.0 - fadein_gain;
+		for(j = 0; j < b_nchans; j++){
+			mix_sample = fadeout_gain * storage[i + j] + fadein_gain * b_samples[start_sample1 + i + j].w_float;
+			b_samples[start_sample1 + i + j].w_float = mix_sample;
+		}
+	}
+	buffet_update(x);
+}
+
+// clicky version
+void buffet_nakedswap(t_buffet *x)
+{
+	//long
+	long minframes = x->minframes;
+	long maxframes = x->maxframes;
+	long totalframes;
+	long swapframes;
+	long r1startframe;
+	long r1endframe;
+	long r2startframe;
+	long r2endframe;
+	long region1;
+	long region2;
+	long start_sample1;
+	long start_sample2;
+	float *storage = x->storage;
+	t_word *b_samples;
+	long b_nchans;
+	int i,j;
+	buffet_setbuf(x, x->wavename);
+	
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	totalframes = x->wavebuf->b_frames;
+	
+	if(totalframes < maxframes * 2 + 1){
+		error("buffer must contain at least twice as many samples as the maximum swap size");
+		return;
+	}
+	if(b_nchans != 2){
+		error("buffet~ only accepts stereo buffers");
+		return;
+	}
+	swapframes = buffet_boundrand((float)minframes, (float)maxframes);
+	r1startframe = buffet_boundrand(0.0, (float)(totalframes-swapframes));
+	r1endframe = r1startframe + swapframes;
+	region1 = r1startframe;
+	region2 = totalframes - r1endframe;
+	
+	if(swapframes > region1){
+		r2startframe = buffet_boundrand((float)r1endframe,(float)(totalframes-swapframes));
+	} else if(swapframes > region2) {
+		r2startframe = buffet_boundrand(0.0,(float)(r1startframe-swapframes));
+	} else {
+		if(buffet_boundrand(0.0,1.0) > 0.5){
+			r2startframe = buffet_boundrand(0.0,(float)(r1startframe-swapframes));
+		} else {
+			r2startframe = buffet_boundrand((float)r1endframe,(float)(totalframes-swapframes));
+		}
+	}
+	r2endframe = r2startframe + swapframes;
+	if(r2startframe < 0 || r1startframe < 0){
+		error("start frame less than zero!");
+		return;
+	}
+	if(r2endframe >= totalframes || r1endframe >= totalframes){
+		error("end frame reads beyond buffer!");
+		return;
+	}
+	// Now swap the samples. For now no cross fade
+	start_sample1 = r1startframe * b_nchans;
+	start_sample2 = r2startframe * b_nchans;
+	for(i = 0; i < swapframes * b_nchans; i += b_nchans){
+		for(j = 0; j < b_nchans; j++){
+			storage[i+j] = b_samples[start_sample1 + i + j].w_float;
+		}
+	}
+	// swap block1 into block2
+	for(i = 0; i < swapframes * b_nchans; i += b_nchans){
+		for(j = 0; j < b_nchans; j++){
+			b_samples[start_sample1 + i + j].w_float = b_samples[start_sample2 + i + j].w_float;
+		}
+	}
+	// swap stored block into block1
+	for(i = 0; i < swapframes * b_nchans; i += b_nchans){
+		for(j = 0; j < b_nchans; j++){
+			b_samples[start_sample2 + i + j].w_float = storage[i + j];
+		}
+	}
+	buffet_update(x);
+}
+
+void buffet_setbuf(t_buffet *x, t_symbol *wavename)
+{
+    
+	t_garray *a;
+	int b_frames;
+	t_word *b_samples;
+	if (!(a = (t_garray *)pd_findbyclass(wavename, garray_class))) {
+		if (*wavename->s_name) pd_error(x, "%s: %s: no such array",OBJECT_NAME,wavename->s_name);
+		x->wavebuf->b_samples = 0;
+		x->wavebuf->b_valid = 0;
+    }
+	else if (!garray_getfloatwords(a, &b_frames, &b_samples)) {
+		pd_error(x, "%s: bad array for %s", wavename->s_name,OBJECT_NAME);
+		x->wavebuf->b_valid = 0;
+    }
+	else  {
+		x->wavebuf->b_valid = 1;
+		x->wavebuf->b_frames = b_frames;
+		x->wavebuf->b_nchans = 1;
+		x->wavebuf->b_samples = b_samples;
+		garray_usedindsp(a);
+	}
+	
+}
+
+
+t_int *buffet_perform(t_int *w)
+{
+	t_buffet *x = (t_buffet *) (w[1]);
+	float *sync = (t_float *)(w[2]);
+	int n = (int) w[3];
+	
+	while(n--){
+		x->sync = *sync++;
+	}
+	
+	return (w+4);
+}
+
+
+float buffet_boundrand(float min, float max)
+{
+	return min + (max-min) * ((float) (rand() % RAND_MAX)/ (float) RAND_MAX);
+}
+
+void buffet_detect_onsets(t_buffet *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	t_word *b_samples;
+	long b_nchans;
+	long b_frames;
+	t_atom *listdata = x->listdata;
+	long startframe;
+	long currentframe;
+	long endframe;
+	long sample_frames;
+	long fft_frames;
+	int R = x->sr;
+	int	N = 1024;
+	int	N2 = N / 2;
+	int	Nw = N;
+	int	Nw2 = Nw / 2;
+	int	D = N / 2;
+	int	i,j,k,m;
+	//	float sb1,sb2,sb3,sb4,energy=0,lastenergy;
+	float freqcenter=0;
+	float tmp;
+	float fave; // freq average
+	short first = 1;
+	float dsum;
+	short suppress = 0;
+	float suppressrt = 0;
+	
+	float rt, rtadv;
+	int	inCount;
+	float *Wanal;
+	float *Wsyn;
+	float *input;
+	float *Hwin;
+	float *buffer;
+	float *channel;
+	float *output;
+	float *input_vec;
+	float *specdiff;
+	float *freqdiff;
+	float *hfc;
+	float *freqs, *amps;
+	float lastfreqs[5];
+	float fdiffs[5];
+	float *onsets;
+	float **loveboat;
+	float *c_lastphase_in;
+	float *c_lastphase_out;
+	float c_fundamental;
+	float c_factor_in;
+	float *trigland;
+	int *bitshuffle;
+	int topanalbin;
+	float threshold;
+	int bytesize;
+	
+	int MAX_ONSETS = 2048;
+	int onset_count = 0;
+	
+	buffet_setbuf(x, x->wavename);
+	if( x->hosed ){
+		error("buffet~ needs a valid buffer");
+		return;
+	}
+	if(argc < 4){
+		post("%s: detect_onsets requires start and end times,threshold and FFTsize",OBJECT_NAME);
+		return;
+	}
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	b_frames = x->wavebuf->b_frames;
+	startframe = .001 * x->sr * atom_getfloatarg(0,argc,argv);
+	endframe = .001 * x->sr * atom_getfloatarg(1,argc,argv);
+	threshold = atom_getfloatarg(2,argc,argv);
+	N = atom_getfloatarg(3,argc,argv);
+	N2 = N / 2;
+	Nw = N;
+	Nw2 = Nw / 2;
+	D = N / 2;
+	
+	
+	sample_frames = endframe - startframe;
+	fft_frames = sample_frames / D;
+	
+	c_fundamental = (float)R / (float)N;
+	inCount = -Nw;
+	c_factor_in = (float)R/((float)D * TWOPI);
+	
+	rt = startframe * 1000.0 / x->sr;
+	rtadv = 1000. * (float)D/(float)R;
+	
+	post("we will analyze %d FFT frames",fft_frames);
+	
+	Wanal = (float *) getbytes(Nw * sizeof(float));
+	Wsyn = (float *) getbytes(Nw * sizeof(float));
+	Hwin = (float *) getbytes(Nw * sizeof(float));
+	input = (float *) getbytes(Nw * sizeof(float) );
+	output = (float *) getbytes(Nw * sizeof(float) );
+	buffer = (float *) getbytes(N * sizeof(float));
+	channel = (float *) getbytes((N+2) * sizeof(float) );
+	bitshuffle = (int *) getbytes(N * 2 * sizeof(int));
+	bytesize = N * 2 * sizeof(float);
+	//	post("allocing %d bytes to trigland",N * 2 * sizeof(float));
+	
+	trigland = (float *) getbytes(N * 2 * sizeof(float));
+	//  	post("cleaning %d bytes in trigland",N * 2 * sizeof(float));
+	
+	
+	c_lastphase_in = (float *) getbytes((N2+1) * sizeof(float));
+	c_lastphase_out = (float *) getbytes((N2+1) * sizeof(float));
+	
+	input_vec = (float *) getbytes(D * sizeof(float));
+	onsets = (float *) getbytes(MAX_ONSETS * sizeof(float));
+	specdiff = (float *) getbytes(fft_frames * sizeof(float));
+	freqdiff = (float *) getbytes(fft_frames * sizeof(float));
+	hfc = (float *) getbytes(fft_frames * sizeof(float));
+	loveboat = (float **) getbytes(fft_frames * sizeof(float *));
+	
+	freqs = (float *) getbytes(N * sizeof(float));
+	amps = (float *) getbytes(N * sizeof(float));
+	for(i = 0; i < fft_frames; i++){
+		loveboat[i] = (float *) getbytes((N+2) * sizeof(float));
+		if(loveboat[i] == NULL){
+			error("memory error");
+			return;
+		}
+		// memset((char *)loveboat[i],0,(N+2)*sizeof(float));
+	}
+	
+	memset((char *)trigland,0, N * 2 * sizeof(float));
+	memset((char *)input,0,Nw * sizeof(float));
+	memset((char *)output,0,Nw * sizeof(float));
+	memset((char *)c_lastphase_in,0,(N2+1) * sizeof(float));
+	memset((char *)c_lastphase_out,0,(N2+1) * sizeof(float));
+	memset((char *)bitshuffle,0, 2 * N * sizeof(int));
+	
+	
+	makewindows(Hwin, Wanal, Wsyn, Nw, N, D);
+	
+	
+	init_rdft(N, bitshuffle, trigland);
+	
+	currentframe = startframe;
+	
+	for(k = 0; k < fft_frames; k++){
+		for(j = 0; j < D; j++){
+			input_vec[j] = b_samples[(currentframe + j) * b_nchans].w_float;// only read first channel
+		}
+		currentframe += D;
+		
+		for ( j = 0 ; j < Nw - D ; j++ ){
+			input[j] = input[j+D];
+		}
+		for (i = 0, j = Nw - D; j < Nw; j++, i++) {
+			input[j] = input_vec[i];
+		}
+		fold(input, Wanal, Nw, buffer, N, inCount);
+		rdft(N, 1, buffer, bitshuffle, trigland);
+		convert(buffer, loveboat[k], N2, c_lastphase_in, c_fundamental, c_factor_in);
+	}
+	
+	topanalbin = 11000.0 / c_fundamental;
+	//	post("top bin %d",topanalbin);
+	
+	for(j = 0; j < 5; j++)
+		lastfreqs[j] = 0;
+	
+	for(i = 0, k = 1; i < fft_frames - 1; i++, k++){
+        
+		for(j = 0; j < 5; j++)
+			lastfreqs[j] = freqs[j];
+		
+		for(j = 2, m = 0; j < topanalbin * 2; j += 2, m++){  // skip lowest bin
+			freqcenter += fabs(loveboat[i][j]) * fabs(loveboat[i][j+1]);
+			amps[m] = fabs(loveboat[i][j]);
+			freqs[m] = loveboat[i][j+1];
+		}
+		/* swap top freqs to the top - but note there is a problem if some lower partials
+         vacillate over which is the weakest since it will swap places and generate spurious
+         change of frequency info. */
+		
+		for(j = 0; j < topanalbin-1; j++){
+			for(m = j + 1 ; m < topanalbin; m++){
+				if(amps[m]> amps[j]){
+					tmp = amps[j];
+					amps[j] = amps[m];
+					amps[m] = tmp;
+					tmp = freqs[j];
+					freqs[j] = freqs[m];
+					freqs[m] = tmp;
+				}
+			}
+		}
+        
+		if(first){
+			first = 0;
+			for(j = 0; j < 5; j++){
+				lastfreqs[j] = freqs[j];
+			}
+		}
+		for(j = 0; j < 5; j++){
+			fave = (lastfreqs[j] + freqs[j]) * 0.5;
+			if(fave > 0)
+				fdiffs[j] = fabs(lastfreqs[j] - freqs[j])/fave;
+			else
+				fdiffs[j] = 0;
+		}
+		dsum = fdiffs[0] + .5 * fdiffs[1] + .25 * fdiffs[2] + .125 * fdiffs[3] + .0625 * fdiffs[4];
+		if(dsum > threshold && ! suppress){
+			suppress = 1;
+			suppressrt = 0;
+			onsets[onset_count++] = rt;
+			/*
+             post("%.2f: f1 %.2f d1 %.2f f2 %.2f d2 %.2f f3 %.2f d3 %.2f f4 %.2f d4 %.2f f5 %.2f d5 %.2f, dsum: %f",
+             rt, freqs[0],fdiffs[0], freqs[1],fdiffs[1], freqs[2],fdiffs[2], freqs[3],fdiffs[3], freqs[4],fdiffs[4], dsum);
+             */
+			
+		} else {
+			suppressrt += rtadv;
+			if(suppressrt > 100){ // 100 ms latency
+				suppress = 0;
+			}
+			
+		}
+		rt += rtadv;
+	}
+	
+	post("%s: %d onsets detected",OBJECT_NAME,onset_count);
+	for(i = 0; i < onset_count; i++){
+		SETFLOAT(listdata + i, onsets[i]);
+	}
+	
+	outlet_list(x->list, 0, onset_count, listdata);
+	outlet_bang(x->bang);
+	// free memory at end of routine
+}
+
+void buffet_detect_subband_onsets(t_buffet *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	t_word *b_samples;
+	long b_nchans;
+	long b_frames;
+	long startframe;
+	long currentframe;
+	long endframe;
+	long sample_frames;
+	long fft_frames;
+	int R = x->sr;
+	int	N = 1024;
+	int	N2 = N / 2;
+	int	Nw = N;
+	int	Nw2 = Nw / 2;
+	int	D = N / 2;
+	int	i,j,k,l;
+	int minbin,maxbin;
+    
+	
+	float rt, rtadv;
+	int	inCount;
+	float *Wanal;
+	float *Wsyn;
+	float *input;
+	float *Hwin;
+	float *buffer;
+	float *channel;
+	float *output;
+	float *input_vec;
+	float *specdiff;
+	float *freqdiff;
+	float *hfc;
+	float *freqs, *amps;
+    
+	float subband_energy[5];
+	float subband_freqdiff[5];
+	int subband_bincuts[6];
+	
+	float *onsets;
+	float **loveboat;
+    
+	float *c_lastphase_in;
+	float *c_lastphase_out;
+	float c_fundamental;
+	float c_factor_in;
+    
+	float *trigland;
+	int *bitshuffle;
+    
+	
+	float threshold;
+    
+	
+	int MAX_ONSETS = 2048;
+    
+	buffet_setbuf(x, x->wavename);
+	if( x->hosed ){
+		error("buffet~ needs a valid buffer");
+		return;
+	}
+	if(argc < 4){
+		post("%s: detect_onsets requires start and end times,threshold and FFTsize",OBJECT_NAME);
+		return;
+	}
+	b_samples = x->wavebuf->b_samples;
+	b_nchans = x->wavebuf->b_nchans;
+	b_frames = x->wavebuf->b_frames;
+	startframe = .001 * x->sr * atom_getfloatarg(0,argc,argv);
+	endframe = .001 * x->sr * atom_getfloatarg(1,argc,argv);
+	threshold = atom_getfloatarg(2,argc,argv);
+	N = atom_getfloatarg(3,argc,argv);
+	N2 = N / 2;
+	Nw = N;
+	Nw2 = Nw / 2;
+	D = N / 2;
+	
+	if(!endframe)
+		endframe = b_frames;
+	
+	sample_frames = endframe - startframe;
+	fft_frames = sample_frames / D;
+	
+	c_fundamental = (float)R / (float)N;
+	inCount = -Nw;
+	c_factor_in = (float)R/((float)D * TWOPI);
+	
+	rt = startframe * 1000.0 / x->sr;
+	rtadv = 1000. * (float)D/(float)R;
+	
+	post("we will analyze %d FFT frames",fft_frames);
+	subband_bincuts[0] = 1;
+	subband_bincuts[1] = (int) (500.0 / c_fundamental);
+	subband_bincuts[2] = (int) (1000.0 / c_fundamental);
+	subband_bincuts[3] = (int) (2000.0 / c_fundamental);
+	subband_bincuts[4] = (int) (4000.0 / c_fundamental);
+	subband_bincuts[5] = (int) (8000.0 / c_fundamental);
+	
+	Wanal = (float *) getbytes(Nw * sizeof(float));
+	Wsyn = (float *) getbytes(Nw * sizeof(float));
+	Hwin = (float *) getbytes(Nw * sizeof(float));
+	input = (float *) getbytes(Nw * sizeof(float) );
+	output = (float *) getbytes(Nw * sizeof(float) );
+	buffer = (float *) getbytes(N * sizeof(float));
+	channel = (float *) getbytes((N+2) * sizeof(float) );
+	bitshuffle = (int *) getbytes(N * 2 * sizeof(int));
+	trigland = (float *) getbytes(N * 2 * sizeof(float));
+	c_lastphase_in = (float *) getbytes((N2+1) * sizeof(float));
+	c_lastphase_out = (float *) getbytes((N2+1) * sizeof(float));
+	
+	input_vec = (float *) getbytes(D * sizeof(float));
+	onsets = (float *) getbytes(MAX_ONSETS * sizeof(float));
+	specdiff = (float *) getbytes(fft_frames * sizeof(float));
+	freqdiff = (float *) getbytes(fft_frames * sizeof(float));
+	hfc = (float *) getbytes(fft_frames * sizeof(float));
+	loveboat = (float **) getbytes(fft_frames * sizeof(float *));
+	
+	freqs = (float *) getbytes(N * sizeof(float));
+	amps = (float *) getbytes(N * sizeof(float));
+	for(i = 0; i < fft_frames; i++){
+		loveboat[i] = (float *) getbytes((N+2) * sizeof(float));
+		if(loveboat[i] == NULL){
+			error("memory error");
+			return;
+		}
+		// memset((char *)loveboat[i],0,(N+2)*sizeof(float));
+	}
+	
+	memset((char *)trigland,0, N * 2 * sizeof(float));
+	memset((char *)input,0,Nw * sizeof(float));
+	memset((char *)output,0,Nw * sizeof(float));
+	memset((char *)c_lastphase_in,0,(N2+1) * sizeof(float));
+	memset((char *)c_lastphase_out,0,(N2+1) * sizeof(float));
+	memset((char *)bitshuffle,0, 2 * N * sizeof(int));
+	
+	
+	makewindows(Hwin, Wanal, Wsyn, Nw, N, D);
+	
+	
+	init_rdft(N, bitshuffle, trigland);
+	
+	currentframe = startframe;
+	
+	for(k= 0; k < 5; k++){
+		minbin = subband_bincuts[k]; maxbin = subband_bincuts[k+1];
+		post("%d: minbin %d maxbin %d",k, minbin,maxbin);
+	}
+	
+	for(k = 0; k < fft_frames; k++){
+		for(j = 0; j < D; j++){
+			input_vec[j] = b_samples[(currentframe + j) * b_nchans].w_float;// only read first channel
+		}
+		currentframe += D;
+		
+		for ( j = 0 ; j < Nw - D ; j++ ){
+			input[j] = input[j+D];
+		}
+		for (i = 0, j = Nw - D; j < Nw; j++, i++) {
+			input[j] = input_vec[i];
+		}
+		fold(input, Wanal, Nw, buffer, N, inCount);
+		rdft(N, 1, buffer, bitshuffle, trigland);
+		convert(buffer, loveboat[k], N2, c_lastphase_in, c_fundamental, c_factor_in);
+	}
+	
+	rt = rtadv;
+	for(i = 0, j = 1; i < fft_frames - 1; i++, j++){
+		
+		
+		for(k= 0; k < 5; k++){
+			minbin = subband_bincuts[k]; maxbin = subband_bincuts[k+1];
+			subband_energy[k] = 0;
+			subband_freqdiff[k] = 0;
+			/* maxamp = 0;
+             for(l = minbin * 2; l < maxbin * 2; l += 2){
+             } */
+			for(l = minbin * 2; l < maxbin * 2; l += 2){
+				//		subband_energy[k] += (loveboat[j][l] * loveboat[j][l])  - (loveboat[i][l] * loveboat[i][l]);
+				subband_freqdiff[k] += (fabs(loveboat[j][l+1] - loveboat[i][l+1])/loveboat[i][l+1]) *
+				loveboat[j][l] * loveboat[j][l] ;// scale by energy
+			}
+		}
+		/*
+		 post("rt: %.2f sb1 %f sb2 %f sb3 %f sb4 %f sb5 %f",
+         rt, subband_energy[0],subband_energy[1],subband_energy[2],subband_energy[3],subband_energy[4]
+         );
+		 */
+		post("rt:%f fb1 %f fb2 %f fb3 %f fb4 %f fb5 %f",
+			 rt, subband_freqdiff[0],subband_freqdiff[1],subband_freqdiff[2],subband_freqdiff[3],subband_freqdiff[4]
+			 );
+		/*
+         post("%.2f: f1 %.2f d1 %.2f f2 %.2f d2 %.2f f3 %.2f d3 %.2f f4 %.2f d4 %.2f f5 %.2f d5 %.2f, dsum: %f",
+         rt, freqs[0],fdiffs[0], freqs[1],fdiffs[1], freqs[2],fdiffs[2], freqs[3],fdiffs[3], freqs[4],fdiffs[4], dsum);
+         */
+		
+		
+		rt += rtadv;
+	}
+	/*
+	 post("%s: %d onsets detected",OBJECT_NAME,onset_count);
+	 for(i = 0; i < onset_count; i++){
+     SETFLOAT(listdata + i, onsets[i]);
+	 }
+	 
+	 outlet_list(x->list, 0, onset_count, listdata);
+	 
+	 outlet_bang(x->bang);
+	 */
+	// free memory at end of routine
+}
+
+
+/* should really be using malloc/free instead of annoying MSPd routines */
+void buffet_dsp_free(t_buffet *x)
+{
+    
+	freebytes(x->storage,0);
+	freebytes(x->listdata,0);
+	freebytes(x->rmsbuf,0);
+	freebytes(x->analbuf,0);
+	freebytes(x->onset,0);
+	freebytes(x->wavebuf,0);
+	freebytes(x->destbuf,0);
+}
+
+void buffet_dsp(t_buffet *x, t_signal **sp)
+{
+	
+	buffet_setbuf(x, x->wavename);
+	
+	if( x->hosed ){
+		error("buffet~ needs a valid buffer");
+		return;
+	}
+	if( x->sr != sp[0]->s_sr){
+		x->sr = sp[0]->s_sr;
+		
+		if(!x->sr){
+			post("%s: warning: zero sampling rate!",OBJECT_NAME);
+			x->sr = 44100;
+		}
+		buffet_init(x,1);
+	}
+	
+	dsp_add(buffet_perform, 3, x,
+			sp[0]->s_vec, sp[0]->s_n);
+	
+}
+
diff --git a/externals/lyonpotpourri/bvplay~-help.pd b/externals/lyonpotpourri/bvplay~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..103f6f1566ed2a26afdb3df9e750f2bb5b99ba16
--- /dev/null
+++ b/externals/lyonpotpourri/bvplay~-help.pd
@@ -0,0 +1,52 @@
+#N canvas 234 181 552 434 10;
+#N canvas 348 477 724 547 load-a-sound 0;
+#X obj 49 170 soundfiler;
+#X obj 49 119 openpanel;
+#X obj 49 92 inlet;
+#X msg 49 142 read -resize \$1 bvplay-demo-array;
+#X obj 354 89 loadbang;
+#X msg 354 125 read -resize sound/voice.wav bvplay-demo-array;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X connect 3 0 0 0;
+#X connect 4 0 5 0;
+#X connect 5 0 0 0;
+#X restore 9 86 pd load-a-sound;
+#X obj 9 57 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1
+;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array bvplay-demo-array 62079 float 2;
+#X coords 0 1 62079 -1 200 140 1;
+#X restore 10 140 graph;
+#X obj 250 217 bvplay~ bvplay-demo-array 1 30;
+#X obj 250 283 *~ 0.5;
+#X floatatom 289 263 5 0 0 0 - - -, f 5;
+#X obj 292 242 hsl 64 12 0 1 0 0 empty empty empty -2 -8 0 10 -180201
+-1 -1 0 1;
+#X obj 250 316 dac~;
+#X text 12 345 Send note statements to bvplay~ in list format: [skip
+duration increment amplitude], f 83;
+#X text 271 201 args: name \, chans \, taper;
+#X msg 225 101 taper \$1;
+#X floatatom 225 84 5 0 0 0 - - -, f 5;
+#X text 290 100 set fadein/fadeout for each note;
+#X text 12 369 bvplay~ will omit overlapped notes \, but multiple units
+can be used for polyphony., f 82;
+#X text 187 32 bvplay~ - Enveloped array playback;
+#X text 28 58 <- first load in a sound (recommend at least 5 secs.)
+;
+#X text 368 133 example notes;
+#X msg 250 133 0 500 1.2 1;
+#X msg 271 153 900 1000 -0.5 1;
+#X obj 8 22 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X connect 1 0 0 0;
+#X connect 3 0 4 0;
+#X connect 4 0 7 0;
+#X connect 4 0 7 1;
+#X connect 5 0 4 1;
+#X connect 6 0 5 0;
+#X connect 10 0 3 0;
+#X connect 11 0 10 0;
+#X connect 17 0 3 0;
+#X connect 18 0 3 0;
diff --git a/externals/lyonpotpourri/bvplay~.c b/externals/lyonpotpourri/bvplay~.c
new file mode 100755
index 0000000000000000000000000000000000000000..0f759f51300a4fcbcc9b6ef560416761be11be94
--- /dev/null
+++ b/externals/lyonpotpourri/bvplay~.c
@@ -0,0 +1,297 @@
+#include "MSPd.h"
+
+static t_class *bvplay_class;
+
+
+#define OBJECT_NAME "bvplay~"
+typedef struct {
+	t_word *b_samples;
+	long b_valid;
+	long b_nchans;
+	long b_frames;
+} t_guffer; // stuff we care about from garrays and buffers
+
+
+typedef struct _bvplay
+{
+    
+    t_object x_obj;
+	float x_f;
+    t_symbol *sfname; // name of soundfile
+	t_guffer *wavebuf; // store needed buffer or garray data
+    
+	long object_chans; // number of channels for a given instantiation
+    float taper_dur;
+    int R;
+    int framesize;
+    float *notedata;
+    int active;
+    float buffer_duration;
+    int taper_frames;
+    float amp;
+    int start_frame;
+    int note_frames;
+    int end_frame;
+    float increment;
+    float findex;
+    int index ;
+	short verbose;
+	short mute;
+} t_bvplay;
+
+t_int *bvplay_perform_mono(t_int *w);
+t_int *bvplay_perform_stereo(t_int *w);
+void bvplay_dsp(t_bvplay *x, t_signal **sp);
+void bvplay_set(t_bvplay *x, t_symbol *s);
+void *bvplay_new(t_symbol *s, t_floatarg taperdur);
+void bvplay_notelist(t_bvplay *x, t_symbol *msg, short argc, t_atom *argv );
+void bvplay_verbose(t_bvplay *x, t_floatarg t);
+void bvplay_mute(t_bvplay *x, t_floatarg t);
+void bvplay_taper(t_bvplay *x, t_floatarg t);
+void bvplay_dsp_free(t_bvplay *x);
+
+void bvplay_tilde_setup(void)
+{
+	bvplay_class = class_new(gensym("bvplay~"),(t_newmethod)bvplay_new,
+                             (t_method)bvplay_dsp_free, sizeof(t_bvplay), 0, A_SYMBOL, A_FLOAT,0);
+	CLASS_MAINSIGNALIN(bvplay_class,t_bvplay, x_f);
+	class_addmethod(bvplay_class,(t_method)bvplay_dsp,gensym("dsp"),A_CANT,0);
+	class_addmethod(bvplay_class,(t_method)bvplay_notelist,gensym("list"),A_GIMME,0);
+	class_addmethod(bvplay_class,(t_method)bvplay_verbose,gensym("verbose"),A_FLOAT,0);
+	class_addmethod(bvplay_class,(t_method)bvplay_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(bvplay_class,(t_method)bvplay_taper,gensym("taper"),A_FLOAT,0);
+    
+	potpourri_announce(OBJECT_NAME);
+}
+
+void bvplay_taper(t_bvplay *x, t_floatarg t)
+{
+	if(t>0){
+		x->taper_dur = (float)t/1000.0;
+		x->taper_frames = x->R * x->taper_dur;
+	}
+}
+
+
+void bvplay_mute(t_bvplay *x, t_floatarg f)
+{
+    x->mute = (short)f;
+}
+
+void bvplay_verbose(t_bvplay *x, t_floatarg f)
+{
+    x->verbose = (short)f;
+}
+
+
+void bvplay_notelist(t_bvplay *x, t_symbol *msg, short argc, t_atom *argv)
+{
+    
+	if( x->active ){
+		if( x->verbose )
+			error("object still playing - cannot add note!");
+		return;
+	}
+	bvplay_set(x, x->sfname);
+	if(! x->wavebuf->b_valid){
+		post("%s: no valid buffer yet",OBJECT_NAME);
+		return;
+	}
+    
+	// read note data
+	if( argc != 4 ){
+		if( x->verbose ){
+			post("improper note data");
+			post("notelist parameters: skiptime, duration, increment, amplitude");
+		}
+	}
+    
+	x->notedata[0] = atom_getfloatarg(0,argc,argv) / 1000.0;
+	x->notedata[1] = atom_getfloatarg(1,argc,argv) / 1000.0;
+	x->notedata[2] = atom_getfloatarg(2,argc,argv);
+	x->notedata[3] = atom_getfloatarg(3,argc,argv);
+    
+	x->start_frame = x->notedata[0] * x->R;
+	x->increment = x->notedata[2];
+	x->index = x->findex = x->start_frame;
+    
+	if( x->increment == 0.0 ){
+		if( x->verbose )
+			post("zero increment!");
+		return;
+	}
+	x->note_frames =  x->notedata[1] * x->increment  * x->R;
+	x->end_frame = x->start_frame + x->note_frames;
+    
+    x->amp = x->notedata[3];
+	if( x->start_frame < 0 || x->start_frame >= x->wavebuf->b_frames){
+		if( x->verbose )
+			post("%s: bad start time",OBJECT_NAME);
+		return;
+	}
+	if( x->end_frame < 0 || x->end_frame >= x->wavebuf->b_frames){
+		if( x->verbose )
+			post("%s: bad end time",OBJECT_NAME);
+		return;
+	}
+    
+	x->active = 1;
+}
+
+t_int *bvplay_perform_mono(t_int *w)
+{
+    t_bvplay *x = (t_bvplay *)(w[1]);
+    t_float *out = (t_float *)(w[2]);
+    int n = (int) w[3];
+	t_word *tab;
+	long iindex = x->index;
+	float findex = x->findex;
+	int end_frame = x->end_frame;
+	float increment = x->increment;
+	int start_frame = x->start_frame;
+	int taper_frames = x->taper_frames;
+	float noteamp = x->amp;
+	float frac, amp;
+    /**********************/
+    bvplay_set(x,x->sfname);
+    
+	if(!x->wavebuf->b_valid) {
+		post("invalid buffer");
+		memset(out, 0, sizeof(float) * n);
+		return (w+4);
+	}
+	tab = x->wavebuf->b_samples;
+	
+	if(x->active){
+		while(n--){
+            // post("index: %d endframe %d", iindex, end_frame);
+			if((increment > 0 && iindex < end_frame) || (increment < 0 && iindex > end_frame)) {
+				// envelope
+				if( increment > 0 ){
+					if( findex < start_frame + taper_frames ){
+						amp = noteamp * ((findex - (float) start_frame) / (float) taper_frames );
+					} else if ( findex > end_frame - taper_frames) {
+						amp = noteamp * (((float)end_frame - findex) / (float) taper_frames);
+					} else {
+						amp = noteamp;
+					}
+				} else { // negative increment case
+					if( findex > start_frame - taper_frames ){
+						amp =  noteamp * ( (start_frame - findex) / taper_frames );
+					} else if ( findex < end_frame + taper_frames) {
+						amp = noteamp * (( findex - end_frame ) / taper_frames) ;
+					} else {
+						amp = noteamp;
+					}
+                    
+				}
+				frac = findex - iindex ;
+				*out++ = amp * (tab[iindex].w_float + frac * (tab[iindex + 1].w_float - tab[iindex].w_float));
+				findex += increment;
+				iindex = findex ;
+			} else {
+				*out++ = 0;
+				x->active = 0;
+			}
+		}
+        
+	}
+	else{
+		while(n--){
+			*out++ = 0;
+		}
+	}
+    
+	x->index = iindex;
+	x->findex = findex;
+    
+	return (w+4);
+}
+
+void bvplay_set(t_bvplay *x, t_symbol *wavename)
+{
+    
+	t_garray *a;
+	int b_frames;
+	t_word *b_samples;
+	if (!(a = (t_garray *)pd_findbyclass(wavename, garray_class))) {
+		if (*wavename->s_name) pd_error(x, "%s: %s: no such array",OBJECT_NAME,wavename->s_name);
+		x->wavebuf->b_valid = 0;
+    }
+	else if (!garray_getfloatwords(a, &b_frames, &b_samples)) {
+		pd_error(x, "%s: bad array for %s", wavename->s_name,OBJECT_NAME);
+		x->wavebuf->b_valid = 0;
+    }
+	else  {
+		x->wavebuf->b_valid = 1;
+		x->wavebuf->b_frames = b_frames;
+		x->wavebuf->b_nchans = 1;
+		x->wavebuf->b_samples = b_samples;
+		garray_usedindsp(a);
+	}
+    
+}
+
+
+void *bvplay_new(t_symbol *s, t_floatarg taperdur)
+{
+    int ichan = 1;
+    
+	t_bvplay *x = (t_bvplay *)pd_new(bvplay_class);
+
+    outlet_new(&x->x_obj, gensym("signal"));
+
+    
+	x->object_chans = ichan;
+    taperdur /= 1000.0; // convert to seconds
+	if(taperdur <= 0)
+		taperdur = .005;
+	x->sfname = s;
+	x->R = sys_getsr();
+	if(! x->R){
+		error("zero sampling rate - set to 44100");
+		x->R = 44100;
+	}
+	x->notedata = (float *) calloc(4, sizeof(float));
+	x->wavebuf = (t_guffer *) calloc(1, sizeof(t_guffer));
+	x->taper_dur = taperdur;
+	x->taper_frames = x->R * x->taper_dur;
+	x->buffer_duration = 0.0 ;
+	x->framesize = 0;
+	x->active = 0;
+	x->verbose = 0;
+	x->mute = 0;
+	// post("channels %f, taper duration %.4f, taperframes %d", chan, taperdur, x->taper_frames );
+    
+	// post("arguments: channels, taper_duration(secs.)");
+	return x;
+}
+
+void bvplay_dsp_free(t_bvplay *x)
+{
+    
+	free(x->notedata);
+	free(x->wavebuf);
+}
+
+void bvplay_dsp(t_bvplay *x, t_signal **sp)
+{
+    bvplay_set(x,x->sfname);
+    
+    if(x->R != sp[0]->s_sr){
+    	x->R = sp[0]->s_sr;
+    	x->taper_frames = x->R * x->taper_dur;
+    }
+    // Pd buffers always mono ...
+    dsp_add(bvplay_perform_mono, 3, x, sp[0]->s_vec, sp[0]->s_n);
+    /*
+    if( x->wavebuf->b_nchans == 1 ) {
+    	// post("initiating mono processor");
+   	 	dsp_add(bvplay_perform_mono, 3, x, sp[0]->s_vec, sp[0]->s_n);
+    } else if( x->wavebuf->b_nchans == 2) {
+    	// post("initiating stereo processor");
+   	 	dsp_add(bvplay_perform_stereo,4,x,sp[0]->s_vec,sp[1]->s_vec,sp[0]->s_n);
+    } else {
+     	post("%s: bad channel spec: %d, cannot initiate dsp code",OBJECT_NAME,  x->wavebuf->b_nchans);
+    }*/
+}
diff --git a/externals/lyonpotpourri/cartopol~-help.pd b/externals/lyonpotpourri/cartopol~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..bd46bfb1f341f81009373bbb613d0e15a5605ffb
--- /dev/null
+++ b/externals/lyonpotpourri/cartopol~-help.pd
@@ -0,0 +1,58 @@
+#N canvas 506 441 450 300 10;
+#N canvas 91 32 532 393 basic-fft 0;
+#X obj 225 66 inlet~;
+#X obj 225 341 outlet~;
+#X obj 225 98 windowvec~;
+#X obj 225 136 rfft~, f 6;
+#X obj 75 341 block~ 1024 8;
+#X obj 225 171 cartopol~;
+#X obj 225 215 poltocar~;
+#X obj 225 245 rifft~;
+#X obj 225 308 windowvec~;
+#X obj 225 275 *~ 0;
+#X obj 394 185 *;
+#X msg 346 107 1 1024 8;
+#X obj 346 138 unpack f f f;
+#X obj 346 217 /;
+#X floatatom 346 249 12 0 0 0 - - -, f 12;
+#X text 427 250 rescale factor;
+#X obj 346 76 loadbang;
+#X text 28 195 Any processing would go here ->;
+#X text 44 321 sets FFT size and overlap;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 5 0;
+#X connect 3 1 5 1;
+#X connect 5 0 6 0;
+#X connect 5 1 6 1;
+#X connect 6 0 7 0;
+#X connect 6 1 7 1;
+#X connect 7 0 9 0;
+#X connect 8 0 1 0;
+#X connect 9 0 8 0;
+#X connect 10 0 13 1;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 12 1 10 0;
+#X connect 12 2 10 1;
+#X connect 13 0 14 0;
+#X connect 14 0 9 1;
+#X connect 16 0 11 0;
+#X restore 22 142 pd basic-fft;
+#X obj 22 115 osc~ 440;
+#X obj 22 216 dac~;
+#X obj 22 178 *~ 0.01;
+#X floatatom 22 92 5 0 0 0 - - -, f 5;
+#X obj 26 4 cnv 15 155 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 103 142 <- look here;
+#X floatatom 93 179 5 0 0 2 gain - -, f 5;
+#X text 23 36 cartopol~ converts Pd-style rfft~ frames to polar form.
+This help file demonstrates the structure of Max pfft~-style FFT processing
+for Pd.;
+#X connect 0 0 3 0;
+#X connect 1 0 0 0;
+#X connect 3 0 2 0;
+#X connect 3 0 2 1;
+#X connect 4 0 1 0;
+#X connect 7 0 3 1;
diff --git a/externals/lyonpotpourri/cartopol~.c b/externals/lyonpotpourri/cartopol~.c
new file mode 100755
index 0000000000000000000000000000000000000000..094eb208d1f860a6820a134372f73adf7163c82e
--- /dev/null
+++ b/externals/lyonpotpourri/cartopol~.c
@@ -0,0 +1,63 @@
+#include "MSPd.h"
+
+static t_class *cartopol_class;
+
+/* Pd version of cartopol~ */
+
+#define OBJECT_NAME "cartopol~"
+typedef struct _cartopol
+{
+	t_object x_obj;
+    t_float x_f;
+} t_cartopol;
+
+void *cartopol_new(t_symbol *msg, short argc, t_atom *argv);
+void cartopol_free(t_cartopol *x);
+void cartopol_dsp(t_cartopol *x, t_signal **sp);
+
+
+void cartopol_tilde_setup(void){
+    cartopol_class = class_new(gensym("cartopol~"), (t_newmethod)cartopol_new,
+                              0, sizeof(t_cartopol),0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(cartopol_class, t_cartopol, x_f);
+    class_addmethod(cartopol_class, (t_method)cartopol_dsp, gensym("dsp"),0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+void *cartopol_new(t_symbol *msg, short argc, t_atom *argv)
+{
+	t_cartopol *x = (t_cartopol *)pd_new(cartopol_class);
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+	return x;
+}
+
+t_int *cartopol_perform(t_int *w)
+{
+    int i;
+    t_cartopol *x = (t_cartopol *) w[1];
+    t_float *real_in = (t_float *) w[2];
+    t_float *imag_in = (t_float *) w[3];
+    t_float *mag_out = (t_float *) w[4];
+    t_float *phase_out = (t_float *) w[5];
+    t_float imag, real;
+
+    int n = (int) w[6]; // obj, func, 1 inlet
+    int N2 = n/2;
+    
+    for(i = 0; i < N2 + 1; i++){
+        real = (i == N2 ? real_in[1] : real_in[i]);
+        imag = (i == 0 || i == N2 ? 0.0 : imag_in[i]);
+        mag_out[i] = hypot(real,imag);
+        phase_out[i] = -atan2(imag,real);
+    }
+
+    return (w + 7);
+}
+
+void cartopol_dsp(t_cartopol *x, t_signal **sp)
+{
+    dsp_add(cartopol_perform,6, x,
+            sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, sp[0]->s_n);
+}
diff --git a/externals/lyonpotpourri/channel~-help.pd b/externals/lyonpotpourri/channel~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..c7c73209b823f0c58bdd04953475746b6d0c8eb5
--- /dev/null
+++ b/externals/lyonpotpourri/channel~-help.pd
@@ -0,0 +1,53 @@
+#N canvas 362 167 389 443 10;
+#X floatatom 30 409 5 0 0 0 - - -, f 5;
+#X obj 30 379 snapshot~;
+#X msg 30 98 44100;
+#X obj 30 118 / 64;
+#X floatatom 30 138 5 0 0 0 - - -, f 5;
+#X obj 30 210 osc~;
+#X obj 30 321 sqrt~;
+#X obj 30 284 *~;
+#X obj 80 284 *~;
+#X obj 30 348 channel~ 1;
+#X msg 166 299 channel \$1;
+#X floatatom 166 275 5 0 0 0 - - -, f 5;
+#X obj 30 235 rfft~;
+#X obj 178 363 metro 250;
+#X obj 30 178 *~ 1;
+#X floatatom 54 159 5 0 0 0 - - -, f 5;
+#X text 101 157 harmonic to synthesize;
+#X msg 166 222 2;
+#X obj 30 73 loadbang;
+#X text 209 273 index to monitor;
+#X obj 23 6 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X obj 178 322 loadbang;
+#X msg 178 343 1;
+#X obj 166 200 loadbang;
+#X text 210 258 signal vector;
+#X text 28 35 channel~ - utility to probe a specific position within
+a signal vector. Useful for examining FFT data.;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 14 0;
+#X connect 5 0 12 0;
+#X connect 6 0 9 0;
+#X connect 7 0 6 0;
+#X connect 8 0 6 0;
+#X connect 9 0 1 0;
+#X connect 10 0 9 0;
+#X connect 11 0 10 0;
+#X connect 12 0 7 0;
+#X connect 12 0 7 1;
+#X connect 12 1 8 1;
+#X connect 12 1 8 0;
+#X connect 13 0 1 0;
+#X connect 14 0 5 0;
+#X connect 15 0 14 1;
+#X connect 17 0 11 0;
+#X connect 17 0 15 0;
+#X connect 18 0 2 0;
+#X connect 21 0 22 0;
+#X connect 22 0 13 0;
+#X connect 23 0 17 0;
diff --git a/externals/lyonpotpourri/channel~.c b/externals/lyonpotpourri/channel~.c
new file mode 100755
index 0000000000000000000000000000000000000000..b281944d4446aa975f71596513e962e9f6446bb8
--- /dev/null
+++ b/externals/lyonpotpourri/channel~.c
@@ -0,0 +1,84 @@
+#include "MSPd.h"
+
+static t_class *channel_class;
+
+
+typedef struct _channel
+{
+    
+	t_object x_obj;
+	float x_f;
+	void *float_outlet;
+	int channel;
+    
+	
+} t_channel;
+
+#define OBJECT_NAME "channel~"
+
+void *channel_new(t_symbol *s, int argc, t_atom *argv);
+
+t_int *channel_perform(t_int *w);
+void channel_dsp(t_channel *x, t_signal **sp);
+void channel_channel(t_channel *x, t_floatarg chan) ;
+void channel_int(t_channel *x, long chan) ;
+
+#define NO_FREE_FUNCTION 0
+void channel_tilde_setup(void)
+{
+	channel_class = class_new(gensym("channel~"), (t_newmethod)channel_new,
+                              NO_FREE_FUNCTION,sizeof(t_channel), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(channel_class, t_channel, x_f);
+	class_addmethod(channel_class, (t_method)channel_dsp, gensym("dsp"), 0);
+	class_addmethod(channel_class,(t_method)channel_channel,gensym("channel"),A_FLOAT,0);
+	potpourri_announce(OBJECT_NAME);
+}
+
+void channel_channel(t_channel *x, t_floatarg chan)
+{
+	if(chan >= 0)
+		x->channel = (int) chan;
+}
+
+
+void channel_int(t_channel *x, long chan)
+{
+	if(chan >= 0)
+		x->channel = (int) chan;
+}
+
+void *channel_new(t_symbol *s, int argc, t_atom *argv)
+{
+    
+	t_channel *x = (t_channel *)pd_new(channel_class);
+	outlet_new(&x->x_obj, gensym("signal"));
+    
+	x->channel = (int)atom_getfloatarg(0,argc,argv);
+	return (x);
+}
+
+t_int *channel_perform(t_int *w)
+{
+	t_channel *x = (t_channel *) (w[1]);
+	t_float *in_vec = (t_float *)(w[2]);
+	t_float *out_vec = (t_float *)(w[3]);
+	int n = (int) w[4];
+	int channel = x->channel;
+	float value;
+	
+	if(channel < 0 || channel > n){
+		return w + 5;
+	}
+	value = in_vec[channel];
+	
+	while( n-- ) {
+		*out_vec++ = value;
+	}
+	return w + 5;
+}
+
+void channel_dsp(t_channel *x, t_signal **sp)
+{
+    dsp_add(channel_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
+}
+
diff --git a/externals/lyonpotpourri/chopper~-help.pd b/externals/lyonpotpourri/chopper~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..793c4a2799d1c1e7551f4540b53094dd62b6d453
--- /dev/null
+++ b/externals/lyonpotpourri/chopper~-help.pd
@@ -0,0 +1,202 @@
+#N canvas 543 159 539 382 10;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array sound1 62079 float 2;
+#X coords 0 1 62079 -1 100 70 1;
+#X restore 21 88 graph;
+#X obj 103 218 chopper~ sound1;
+#X obj 103 295 dac~;
+#N canvas 745 473 502 352 messages 0;
+#N canvas 128 60 560 676 basic 0;
+#X obj 49 335 outlet;
+#X msg 49 106 force_new;
+#X msg 128 107 lockme \$1;
+#X obj 128 69 tgl 30 0 empty empty empty 0 -6 0 8 -257985 -1 -1 0 1
+;
+#X floatatom 200 132 5 0 0 0 - minincr -, f 5;
+#X floatatom 322 130 5 0 0 0 - maxincr -, f 5;
+#X floatatom 329 228 5 0 0 0 - minseg -, f 5;
+#X floatatom 432 228 5 0 0 0 - maxseg -, f 5;
+#X msg 329 249 set_minseg \$1;
+#X msg 432 249 set_maxseg \$1;
+#X msg 322 151 set_maxincr \$1;
+#X msg 200 153 set_minincr \$1;
+#X obj 53 380 hsl 128 15 0.1 0.9999 0 0 minincr minincr-init minincr
+-2 -6 0 8 -252672 -1 -1 5645 1;
+#X obj 53 411 hsl 128 15 1.0001 10 0 0 maxincr maxincr-init maxincr
+-2 -6 0 8 -252672 -1 -1 1411 1;
+#N canvas 0 22 470 320 init 0;
+#X obj 27 150 s minincr-init;
+#X msg 27 123 0.5;
+#X obj 134 149 s maxincr-init;
+#X msg 134 122 2;
+#X obj 27 4 loadbang;
+#X obj 245 147 s minseg-init;
+#X obj 352 146 s maxseg-init;
+#X msg 245 120 100;
+#X obj 323 91 s fixed-incr-init;
+#X msg 323 64 1;
+#X msg 352 119 2000;
+#X connect 1 0 0 0;
+#X connect 3 0 2 0;
+#X connect 4 0 3 0;
+#X connect 4 0 1 0;
+#X connect 4 0 7 0;
+#X connect 4 0 10 0;
+#X connect 4 0 9 0;
+#X connect 7 0 5 0;
+#X connect 9 0 8 0;
+#X connect 10 0 6 0;
+#X restore 275 51 pd init;
+#X obj 55 445 hsl 128 15 3 300 0 0 minseg minseg-init minseg -2 -6
+0 8 -252672 -1 -1 4148 1;
+#X obj 55 476 hsl 128 15 20 2000 0 0 maxseg maxseg-init maxseg -2 -6
+0 8 -252672 -1 -1 12700 1;
+#X msg 311 383 fixed_increment \$1;
+#X obj 49 8 tgl 30 0 empty empty empty 0 -6 0 8 -257985 -1 -1 0 1;
+#X obj 49 52 metro 120000;
+#X obj 314 350 hsl 50 10 0.1 5 0 0 empty empty empty -2 -8 0 10 -174016
+-1 -1 0 1;
+#X floatatom 311 366 5 0 0 0 - - -, f 5;
+#X obj 382 349 r fixed-incr-init;
+#X obj 278 309 t b;
+#X msg 278 330 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 2 0;
+#X connect 4 0 11 0;
+#X connect 5 0 10 0;
+#X connect 6 0 8 0;
+#X connect 7 0 9 0;
+#X connect 8 0 0 0;
+#X connect 9 0 0 0;
+#X connect 10 0 0 0;
+#X connect 10 0 23 0;
+#X connect 11 0 0 0;
+#X connect 11 0 23 0;
+#X connect 17 0 0 0;
+#X connect 18 0 19 0;
+#X connect 19 0 1 0;
+#X connect 20 0 21 0;
+#X connect 21 0 17 0;
+#X connect 22 0 21 0;
+#X connect 23 0 24 0;
+#X connect 24 0 21 0;
+#X restore 53 44 pd basic controls;
+#N canvas 480 42 593 551 deviations 0;
+#X obj 224 188 outlet;
+#X msg 224 134 rdur \$1;
+#X floatatom 224 110 5 0 0 0 - rdur -, f 5;
+#X obj 222 250 hsl 128 15 0 1 0 0 rdur rdur-init rdur -2 -6 0 8 -252672
+-1 -1 0 1;
+#X obj 222 282 hsl 128 15 0 1 0 0 rinc rinc-init rinc -2 -6 0 8 -252672
+-1 -1 0 1;
+#X floatatom 288 110 5 0 0 0 - rinc -, f 5;
+#X msg 288 134 rinc \$1;
+#X floatatom 356 110 5 0 0 0 - jitter -, f 5;
+#X msg 356 134 jitter \$1;
+#X obj 222 316 hsl 128 15 0 1 0 0 jitter jitter-init jitter -2 -6 0
+8 -252672 -1 -1 0 1;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 5 0 6 0;
+#X connect 6 0 0 0;
+#X connect 7 0 8 0;
+#X connect 8 0 0 0;
+#X restore 104 82 pd deviations;
+#N canvas 257 591 482 332 memory 0;
+#X obj 167 217 outlet;
+#X text 233 32 1024 locations available;
+#X msg 142 30 store_loop 1;
+#X msg 156 49 recall_loop 1;
+#X msg 182 93 store_loop 2;
+#X msg 195 113 recall_loop 2;
+#X msg 74 87 show_loop;
+#X text 208 170 use numbers that come from show_loop;
+#X msg 35 144 force_new;
+#X msg 281 188 set_loop 1000 25000 1.62;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 0 0;
+#X restore 88 62 pd memory;
+#N canvas 0 22 490 340 refinements 0;
+#X obj 38 149 outlet;
+#X obj 38 29 tgl 30 0 empty empty empty 0 -6 0 8 -257985 -1 -1 0 1
+;
+#X msg 38 74 adjust_inverse \$1;
+#X msg 95 123 taper \$1;
+#X floatatom 95 100 5 0 0 0 - taper-dur -, f 5;
+#X obj 41 185 hsl 128 15 1 100 0 0 taper-dur taper-dur-init taper-dur
+-2 -6 0 8 -252672 -1 -1 0 1;
+#X text 78 29 maintains loop duration;
+#X text 77 43 under increment change;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
+#X restore 125 104 pd refinements;
+#N canvas 0 22 462 312 system 0;
+#X obj 38 138 outlet;
+#X obj 38 29 tgl 30 0 empty empty empty 0 -6 0 8 -257985 -1 -1 0 1
+;
+#X msg 38 74 mute \$1;
+#X msg 111 105 seed 6331;
+#X text 110 88 set seed (might be helpful for stereo);
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X restore 140 131 pd system;
+#X obj 54 201 s chopper.demo.msgs;
+#X connect 0 0 5 0;
+#X connect 1 0 5 0;
+#X connect 2 0 5 0;
+#X connect 3 0 5 0;
+#X connect 4 0 5 0;
+#X restore 236 85 pd messages;
+#N canvas 9 465 466 316 load-soundfile 0;
+#X obj 31 177 soundfiler;
+#X msg 30 103 bang;
+#X obj 30 129 openpanel;
+#X msg 30 151 read -resize \$1 sound1;
+#X obj 11 57 loadbang;
+#X obj 105 40 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X msg 10 82 read -resize sound/voice.wav sound1;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 0 0;
+#X connect 4 0 6 0;
+#X connect 5 0 6 0;
+#X connect 6 0 0 0;
+#X restore 285 330 pd load-soundfile;
+#X obj 103 265 *~ 0.1;
+#X obj 240 116 hsl 100 14 0 0.5 0 0 empty empty empty -2 -8 0 10 -174016
+-1 -1 0 1;
+#X obj 18 8 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 17 38 chopper~ - an algorithmic array chopper;
+#X obj 103 195 r chopper.demo.msgs;
+#X obj 291 215 chopper~ sound1;
+#X obj 291 192 r chopper.demo.msgs;
+#X obj 291 265 *~ 0.1;
+#X obj 330 243 r chopper.demo.gain;
+#X obj 142 242 r chopper.demo.gain;
+#X obj 237 141 s chopper.demo.gain;
+#X text 323 86 <- open this for more info;
+#X text 346 118 set master gain;
+#X msg 24 171 sync_out;
+#X text 88 170 sync instances;
+#X text 25 330 use a fairly long and varied sound here ->;
+#X connect 1 0 5 0;
+#X connect 5 0 2 0;
+#X connect 6 0 15 0;
+#X connect 9 0 1 0;
+#X connect 10 0 12 0;
+#X connect 11 0 10 0;
+#X connect 12 0 2 1;
+#X connect 13 0 12 1;
+#X connect 14 0 5 1;
+#X connect 18 0 1 0;
diff --git a/externals/lyonpotpourri/chopper~.c b/externals/lyonpotpourri/chopper~.c
new file mode 100755
index 0000000000000000000000000000000000000000..71550cc4f719d695e45ea2b9223d9ec4912bcc1b
--- /dev/null
+++ b/externals/lyonpotpourri/chopper~.c
@@ -0,0 +1,909 @@
+#include "MSPd.h"
+
+static t_class *chopper_class;
+
+#define MAXSTORE 1024
+#define OBJECT_NAME "chopper~"
+	
+typedef struct _chopper
+{
+
+  t_object x_obj;
+  float x_f;
+  t_symbol *l_sym;
+  long l_chan;
+  float increment;
+  double fbindex;
+  float buffer_duration;
+  float minseg;
+  float maxseg;
+  float segdur;
+  float minincr;
+  float maxincr;
+  int loop_samps;
+  int samps_to_go ;
+  int loop_start;
+  int bindex ;
+  int taper_samps;
+  int loop_min_samps;
+  int loop_max_samps;
+  float R;
+  float ldev;
+  float st_dev ;
+  int lock_loop;
+  int force_new_loop;
+  int framesize;
+  short mute;
+  short disabled;
+  int setup_chans;
+  int *stored_starts;
+  int *stored_samps;   
+  float *stored_increments;
+  short preempt;
+  short loop_engaged;
+  short data_recalled;
+  short initialize_loop;
+  short fixed_increment_on;
+  float fixed_increment;
+  float retro_odds;
+  float fade_level;
+  int transp_loop_samps;
+  float taper_duration;
+  short lock_terminated;
+  int preempt_samps;
+  int preempt_count;
+  short recalling_loop;
+  float jitter_factor;
+  float rdur_factor;
+  float rinc_factor;
+  short increment_adjusts_loop ;
+  short loop_adjust_inverse;
+  long b_frames;
+  long b_nchans;
+  t_word *b_samples;
+} t_chopper;
+
+
+t_int *chopper_perform_stereo(t_int *w);
+t_int *choppermono_perform(t_int *w);
+t_int *chopper_perform_stereo_nointerpol(t_int *w);
+t_int *chopper_perform_mono(t_int *w);
+t_int *chopper_pd_perform(t_int *w);
+void chopper_dsp(t_chopper *x, t_signal **sp);
+void chopper_set(t_chopper *x, t_symbol *s);
+void chopper_mute(t_chopper *x, t_floatarg toggle);
+void chopper_increment_adjust(t_chopper *x, t_floatarg toggle);
+void chopper_adjust_inverse(t_chopper *x, t_floatarg toggle);
+void *chopper_new(t_symbol *msg, short argc, t_atom *argv);
+void chopper_in1(t_chopper *x, long n);
+void chopper_set_minincr(t_chopper *x, t_floatarg n);
+void chopper_set_maxincr(t_chopper *x, t_floatarg n);
+void chopper_set_minseg(t_chopper *x, t_floatarg n);
+void chopper_set_maxseg(t_chopper *x, t_floatarg n);
+void chopper_taper(t_chopper *x, t_floatarg f);
+void chopper_fixed_increment(t_chopper *x, t_floatarg f);
+void chopper_lockme(t_chopper *x, t_floatarg n);
+void chopper_force_new(t_chopper *x);
+float chopper_boundrand(float min, float max);
+void chopper_assist(t_chopper *x, void *b, long m, long a, char *s);
+void chopper_dblclick(t_chopper *x);
+void chopper_show_loop(t_chopper *x);
+void chopper_set_loop(t_chopper *x, t_symbol *msg, short argc, t_atom *argv);
+void chopper_randloop( t_chopper *x);
+void chopper_store_loop(t_chopper *x, t_floatarg loop_bindex);
+void chopper_recall_loop(t_chopper *x,  t_floatarg loop_bindex);
+void chopper_free(t_chopper *x) ;
+void chopper_retro_odds(t_chopper *x, t_floatarg f);
+void chopper_jitter(t_chopper *x, t_floatarg f);
+void chopper_jitterme(t_chopper *x);
+void chopper_rdur(t_chopper *x, t_floatarg f);
+void chopper_rdurme(t_chopper *x);
+void chopper_rinc(t_chopper *x, t_floatarg f);
+void chopper_rincme(t_chopper *x);
+void chopper_adjust_inverse(t_chopper *x, t_floatarg toggle);
+t_int *chopper_performtest(t_int *w);
+void chopper_init(t_chopper *x, short initialized);
+void chopper_seed(t_chopper *x, t_floatarg seed);
+void chopper_testrand(t_chopper *x);
+
+t_symbol *ps_buffer;
+
+
+void chopper_testrand(t_chopper *x)
+{
+	float rval = chopper_boundrand(0.0, 1.0);
+	post("random btwn 0.0 1.0: %f",rval);
+}
+
+void chopper_mute(t_chopper *x, t_floatarg toggle)
+{
+	x->mute = (short) toggle;
+}
+
+void chopper_seed(t_chopper *x, t_floatarg seed)
+{
+	srand((long)seed);
+}
+
+void chopper_tilde_setup(void){
+  chopper_class = class_new(gensym("chopper~"), (t_newmethod)chopper_new, 
+      (t_method)chopper_free ,sizeof(t_chopper), 0,A_GIMME,0);
+  CLASS_MAINSIGNALIN(chopper_class, t_chopper, x_f);
+  class_addmethod(chopper_class,(t_method)chopper_dsp,gensym("dsp"),0);
+  class_addmethod(chopper_class,(t_method)chopper_mute,gensym("mute"),A_FLOAT,0);
+  class_addmethod(chopper_class,(t_method)chopper_taper,gensym("taper"),A_FLOAT,0);
+  class_addmethod(chopper_class,(t_method)chopper_fixed_increment,gensym("fixed_increment"),A_FLOAT,0);
+  class_addmethod(chopper_class,(t_method)chopper_retro_odds,gensym("retro_odds"),A_FLOAT,0);
+  class_addmethod(chopper_class,(t_method)chopper_show_loop,gensym("show_loop"),0);
+  class_addmethod(chopper_class,(t_method)chopper_set_loop,gensym("set_loop"),A_GIMME,0);
+  class_addmethod(chopper_class,(t_method)chopper_store_loop,gensym("store_loop"),A_FLOAT,0);
+  class_addmethod(chopper_class,(t_method)chopper_recall_loop,gensym("recall_loop"),A_FLOAT,0);
+  class_addmethod(chopper_class,(t_method)chopper_increment_adjust,gensym("increment_adjust"),A_FLOAT,0);
+  class_addmethod(chopper_class,(t_method)chopper_adjust_inverse,gensym("adjust_inverse"),A_FLOAT,0);
+  class_addmethod(chopper_class,(t_method)chopper_jitter,gensym("jitter"),A_FLOAT,0);
+  class_addmethod(chopper_class,(t_method)chopper_rdur,gensym("rdur"),A_FLOAT,0);
+  class_addmethod(chopper_class,(t_method)chopper_rinc,gensym("rinc"),A_FLOAT,0);
+  class_addmethod(chopper_class,(t_method)chopper_set_minincr,gensym("set_minincr"),A_FLOAT,0);
+  class_addmethod(chopper_class,(t_method)chopper_set_maxincr,gensym("set_maxincr"),A_FLOAT,0);
+  class_addmethod(chopper_class,(t_method)chopper_set_minseg,gensym("set_minseg"),A_FLOAT,0);
+  class_addmethod(chopper_class,(t_method)chopper_set_maxseg,gensym("set_maxseg"),A_FLOAT,0);
+  class_addmethod(chopper_class,(t_method)chopper_lockme,gensym("lockme"),A_FLOAT,0);
+  class_addmethod(chopper_class,(t_method)chopper_force_new,gensym("force_new"),0);
+  class_addmethod(chopper_class,(t_method)chopper_seed,gensym("seed"),A_FLOAT,0);
+  class_addmethod(chopper_class,(t_method)chopper_testrand,gensym("testrand"),0);
+  potpourri_announce(OBJECT_NAME);
+}
+
+
+void chopper_increment_adjust(t_chopper *x, t_floatarg toggle)
+{
+  x->increment_adjusts_loop = (short)toggle;
+  
+}
+
+void chopper_adjust_inverse(t_chopper *x, t_floatarg toggle)
+{
+  x->loop_adjust_inverse = (short)toggle;
+}
+
+void chopper_fixed_increment(t_chopper *x, t_floatarg f)
+{
+  float new_samps = 0;
+  float rectf;
+
+  x->fixed_increment = f;
+  if( f ){
+    x->fixed_increment_on = 1;
+  } else {
+    x->fixed_increment_on = 0;
+  }
+  
+  rectf = fabs(f);
+  
+  if( x->lock_loop && rectf > 0.0 ){
+
+    if( x->loop_adjust_inverse ){
+      new_samps = (float) x->loop_samps * rectf ;
+    } else {
+      new_samps = (float) x->loop_samps / rectf ;
+    }
+    if( f > 0 ){
+      if( x->loop_start + new_samps >= x->framesize ){
+		return;
+      } else {
+		x->increment = x->fixed_increment;
+      }
+    } else {
+      if( x->loop_start - new_samps < 0) {
+		return;
+      } else {
+		x->increment = x->fixed_increment;
+      }
+    }
+		
+  }
+  
+  if( x->increment_adjusts_loop ){
+    x->transp_loop_samps = new_samps;
+  }
+  
+
+}
+
+void chopper_jitter(t_chopper *x, t_floatarg f)
+{
+  f *= 0.1; // scale down a bit
+  if( f >= 0. && f <= 1.0 )
+    x->jitter_factor = f;
+}
+
+void chopper_rdur(t_chopper *x, t_floatarg f)
+{
+
+  if( f >= 0. && f <= 1.0 )
+    x->rdur_factor = f;
+}
+
+void chopper_rinc(t_chopper *x, t_floatarg f)
+{
+  // f *= 0.1; // scale down a bit
+
+  if( f >= 0. && f <= 1.0 )
+    x->rinc_factor = f;
+}
+
+
+void chopper_retro_odds(t_chopper *x, t_floatarg f)
+{
+
+  if( f < 0 )
+    f = 0;
+  if( f > 1 )
+    f = 1;
+		
+  x->retro_odds = f;
+
+}
+
+void chopper_show_loop(t_chopper *x)
+{
+  post("start: %d, samps: %d, increment: %f", x->loop_start, x->transp_loop_samps, x->increment);
+  post("minloop %f, maxloop %f", x->minseg, x->maxseg);
+}
+
+void chopper_store_loop(t_chopper *x, t_floatarg f)
+{
+  int loop_bindex = (int) f;
+
+  if( loop_bindex < 0 || loop_bindex >= MAXSTORE ){
+    error("bindex %d out of range", loop_bindex);
+    return;
+  }
+	
+  x->stored_starts[ loop_bindex ] = x->loop_start;
+  x->stored_samps[ loop_bindex ] = x->transp_loop_samps;
+  x->stored_increments[ loop_bindex ] = x->increment;
+
+  post("storing loop %d: %d %d %f",loop_bindex, 
+       x->stored_starts[ loop_bindex ],x->stored_samps[ loop_bindex ],  x->stored_increments[ loop_bindex ] );
+
+}
+
+void chopper_recall_loop(t_chopper *x, t_floatarg f)
+{
+  // bug warning: recall preceding store will crash program
+  // need to add warning
+int loop_bindex = (int) f;
+
+  if( loop_bindex < 0 || loop_bindex >= MAXSTORE ){
+    error("bindex %d out of range", loop_bindex);
+    return;
+  }
+	
+  if( ! x->stored_samps[ loop_bindex ] ){
+    error("no loop stored at position %d!", loop_bindex);
+    return;
+  }
+
+	
+  x->loop_start = x->stored_starts[ loop_bindex ];
+  x->samps_to_go = x->transp_loop_samps = x->stored_samps[ loop_bindex ];
+	 
+  if( x->loop_min_samps > x->transp_loop_samps )
+    x->loop_min_samps = x->transp_loop_samps ;
+  if( x->loop_max_samps < x->transp_loop_samps )
+    x->loop_max_samps = x->transp_loop_samps ;
+  x->increment = x->stored_increments[ loop_bindex ];
+  x->preempt_count = x->preempt_samps;
+  // post("preempt samps:%d", x->preempt_count);
+  x->recalling_loop = 1;
+  //  x->data_recalled = 1;
+}
+
+void chopper_set_loop(t_chopper *x, t_symbol *msg, short argc, t_atom *argv)
+{
+  if( argc < 3 ){
+    error("format: start samples increment");
+    return;
+  }
+  x->loop_start = atom_getintarg(0,argc,argv);
+  x->loop_samps = atom_getintarg(1,argc,argv);
+  x->increment = atom_getfloatarg(2,argc,argv);
+  x->data_recalled = 1;
+
+  x->samps_to_go = x->loop_samps;
+  x->fbindex = x->bindex = x->loop_start;
+//  post("loop set to: st %d samps %d incr %f", x->loop_start, x->loop_samps,x->increment);
+}
+
+void chopper_taper(t_chopper *x, t_floatarg f)
+{
+  f /= 1000.0;
+	
+  if( f > 0 ){
+    x->taper_samps = (float) x->R * f ;
+  }
+  if( x->taper_samps < 2 )
+    x->taper_samps = 2;
+}
+
+
+
+void *chopper_new(t_symbol *msg, short argc, t_atom *argv)
+{
+  t_chopper *x = (t_chopper *)pd_new(chopper_class);
+  outlet_new(&x->x_obj, gensym("signal"));
+  x->R = sys_getsr();
+  x->l_sym = atom_getsymbolarg(0,argc,argv);
+  chopper_init(x,0);
+  return (x);
+}
+
+
+void chopper_init(t_chopper *x, short initialized) 
+{
+	if(!initialized){
+
+		srand(time(0));
+	
+	  if(!x->R) {
+		error("zero sampling rate - set to 44100");
+		x->R = 44100;
+	  }
+	  x->minseg = 0.1;
+	  x->maxseg = 0.8 ;
+	  x->minincr = 0.5 ;
+	  x->maxincr = 2.0 ;
+	  x->data_recalled = 0;		
+	  x->segdur = 0;
+	  x->bindex = 0 ;
+	  x->taper_duration /= 1000.0;
+	  if( x->taper_duration < .0001 || x->taper_duration > 10.0 )
+		x->taper_duration = .0001;
+		x->increment_adjusts_loop = 0;
+	  x->taper_samps = x->R * x->taper_duration;
+	  if(x->taper_samps < 2)
+		x->taper_samps = 2;
+		
+	  x->preempt_samps = 5;
+	  x->loop_adjust_inverse = 0;
+	  x->preempt = 1;
+	  x->recalling_loop = 0;	
+	  x->ldev = 0;
+	  x->lock_loop = 0;
+	  x->buffer_duration = 0.0 ;
+	  x->st_dev = 0.0;
+	  x->framesize = 0;
+	  x->force_new_loop = 0;
+	  x->mute = 0;
+	  x->disabled = 1;
+	  x->initialize_loop = 1;
+	  x->loop_engaged = 0;
+	  x->fixed_increment_on = 0;
+	  x->retro_odds = 0.5;
+	  x->fade_level = 1.0;
+	  x->lock_terminated = 0;
+		
+	  x->stored_starts = calloc(MAXSTORE, sizeof(int));
+	  x->stored_samps = calloc(MAXSTORE, sizeof(int));
+	  x->stored_increments = calloc(MAXSTORE, sizeof(int));
+		
+	} else {
+		x->taper_samps = x->R * x->taper_duration;
+		if(x->taper_samps < 2)
+		  x->taper_samps = 2;
+	}
+}
+
+void chopper_free(t_chopper *x) 
+{
+  free(x->stored_increments);
+  free(x->stored_samps);
+  free(x->stored_starts);
+}
+
+void chopper_jitterme(t_chopper *x)
+{
+  float new_start;
+  float jitter_factor = x->jitter_factor;
+  new_start = (1.0 + chopper_boundrand(-jitter_factor, jitter_factor) ) * (float) x->loop_start ;
+	
+  if( new_start < 0 ){
+//    error("jitter loop %d out of range", new_start);
+    new_start = 0;
+
+  }
+  else if( new_start + x->transp_loop_samps >= x->framesize ){
+//    error("jitter loop %d out of range", new_start);
+    new_start = x->framesize - x->transp_loop_samps ;
+  }
+  if( new_start >= 0 )
+    x->loop_start = new_start;
+}
+
+void chopper_rdurme(t_chopper *x)
+{
+  float new_dur;
+  float rdur_factor = x->rdur_factor;
+	
+  new_dur = (1.0 + chopper_boundrand( -rdur_factor, rdur_factor)) * (float) x->transp_loop_samps;
+  if( new_dur > x->loop_max_samps )
+    new_dur = x->loop_max_samps;
+  if( new_dur < x->loop_min_samps )
+    new_dur = x->loop_min_samps;
+
+  x->transp_loop_samps = new_dur;
+}
+
+void chopper_rincme(t_chopper *x )
+{
+  float new_inc = 0;
+//  int count = 0;
+  int new_samps;
+  float rinc_factor = x->rinc_factor;
+	
+  /* test generate a new increment */
+  new_inc = (1.0 + chopper_boundrand( 0.0, rinc_factor)) ;
+  if( chopper_boundrand(0.0,1.0) > 0.5 ){
+    new_inc = 1.0 / new_inc;
+  }
+	
+  // test for transgression
+	
+//	post("increment adjust:%d",x->increment_adjusts_loop);
+	
+  if( fabs(new_inc * x->increment) < x->minincr ) {
+    new_inc = x->minincr / fabs(x->increment) ; // now when we multiply - increment is set to minincr
+  }
+  else if ( fabs(new_inc * x->increment) > x->maxincr ){
+    new_inc = x->maxincr / fabs(x->increment) ; // now when we multiply - increment is set to maxincr
+  }
+
+ if(x->increment_adjusts_loop){
+ 	 new_samps = (float) x->transp_loop_samps / new_inc ; 
+  } else {
+  	new_samps = x->transp_loop_samps;
+  }
+    
+  new_inc *= x->increment ;
+  if( x->increment > 0 ){
+    if( x->loop_start + new_samps >= x->framesize ){
+      new_samps = (x->framesize - 1) - x->loop_start ;
+    }
+  } else {
+    if( x->loop_start - new_samps < 0) {
+      new_samps = x->loop_start + 1;
+    }
+  }
+  x->transp_loop_samps = new_samps;
+  x->increment = new_inc;		
+}
+
+void chopper_randloop( t_chopper *x )
+{
+  int framesize = x->b_frames;//test
+//  long bindex = x->fbindex;
+  float segdur = x->segdur;
+  int loop_start = x->loop_start;
+  int loop_samps = x->loop_samps;
+  int transp_loop_samps = x->transp_loop_samps;
+  int samps_to_go = x->samps_to_go;
+  float increment = x->increment;
+//  int taper_samps = x->taper_samps ;
+//  float taper_duration = x->taper_duration;
+  float minincr = x->minincr;
+  float maxincr = x->maxincr;
+  float minseg = x->minseg;
+  float maxseg = x->maxseg;
+  float buffer_duration = x->buffer_duration;
+  float R = x->R;
+  float fixed_increment = x->fixed_increment;
+
+  short fixed_increment_on = x->fixed_increment_on;
+  float retro_odds = x->retro_odds;
+	
+  if(fixed_increment_on){
+    increment = fixed_increment;
+  } else {
+    increment = chopper_boundrand(minincr,maxincr);
+  }
+  segdur = chopper_boundrand( minseg, maxseg );
+  loop_samps = segdur * R * increment; // total samples in segment
+//  post("rand: segdur %f R %f increment %f lsamps %d",segdur,R,increment,loop_samps);
+  transp_loop_samps = segdur * R ; // actual count of samples to play back
+  samps_to_go = transp_loop_samps;  
+  if( loop_samps >= framesize ){
+    loop_samps = framesize - 1;
+    loop_start = 0;
+  } else {
+//    post("rand: bufdur %f segdur %f",buffer_duration, segdur);
+    loop_start = R * chopper_boundrand( 0.0, buffer_duration - segdur );
+    if( loop_start + loop_samps >= framesize ){
+      loop_start = framesize - loop_samps;
+      if( loop_start < 0 ){
+				loop_start = 0;
+				error("negative starttime");
+      }
+    }
+  }
+  if( chopper_boundrand(0.0,1.0) < retro_odds ){
+    increment *= -1.0 ;
+    loop_start += (loop_samps - 1);
+  }
+
+//	post("randset: lstart %d lsamps %d incr %f segdur %f",loop_start,loop_samps,increment,segdur);
+  x->samps_to_go = samps_to_go;
+  x->fbindex = x->bindex = loop_start;
+  x->loop_start = loop_start;
+  x->loop_samps = loop_samps;
+  x->transp_loop_samps = transp_loop_samps;
+  x->increment = increment;
+  x->segdur = segdur;
+}
+
+t_int *chopper_pd_perform(t_int *w)
+{
+  int bindex, bindex2;
+  float sample1, m1, m2;	
+  t_chopper *x = (t_chopper *)(w[1]);
+  t_float *out1 = (t_float *)(w[2]);
+  int n = (int) w[3];
+  
+
+  /*********************************************/
+  t_word *tab = x->b_samples;
+  long b_frames = x->b_frames;
+  long nc = x->b_nchans;
+  float segdur = x->segdur;
+  int taper_samps = x->taper_samps ;
+  float taper_duration = x->taper_duration;
+  float minseg = x->minseg;
+  float maxseg = x->maxseg;
+  int lock_loop = x->lock_loop;
+  int force_new_loop = x->force_new_loop;
+  float R = x->R;
+  short initialize_loop = x->initialize_loop;
+  float fade_level = x->fade_level;
+  short preempt = x->preempt;
+  int preempt_count = x->preempt_count;
+  int preempt_samps = x->preempt_samps;
+  short recalling_loop = x->recalling_loop;
+  float preempt_gain;
+  float jitter_factor = x->jitter_factor;
+  float rdur_factor = x->rdur_factor;
+  float rinc_factor = x->rinc_factor;
+
+  if(x->mute){
+      while(n--) { *out1++ = 0.0; }
+      return (w+4);
+  }
+	
+  /* SAFETY CHECKS */
+  if( b_frames <= 0 || nc != 1) {
+    x->disabled = 1;
+  }
+	
+  if(x->mute || x->disabled){
+    while(n--){
+      *out1++ = 0.0;
+    }
+    return (w+4);
+  }
+	
+  if(x->framesize != b_frames) {
+    x->framesize = b_frames ;
+    x->buffer_duration = (float)  b_frames / R ;
+    initialize_loop = 1;
+  }	
+  else if(x->buffer_duration <= 0.0) { /* THIS WILL HAPPEN THE FIRST TIME */
+    x->framesize = b_frames ;
+    x->buffer_duration = (float)  b_frames / R ;
+    initialize_loop = 1;
+//	post("initializing from perform method");
+  }
+  if(maxseg > x->buffer_duration){
+    maxseg = x->buffer_duration ;
+  }
+	
+  if(minseg < 2. * taper_duration)
+    minseg = taper_duration;
+
+  /* SET INITIAL SEGMENT */
+	
+  bindex = x->fbindex;
+  
+  if(initialize_loop){ /* FIRST TIME ONLY */
+    chopper_randloop(x);
+    bindex = x->fbindex;
+    initialize_loop = 0;
+  }
+
+  while(n--){
+    if( lock_loop )  {
+      if ( recalling_loop ) { 
+        bindex = x->fbindex ;
+		x->fbindex += x->increment;
+		--preempt_count;
+		preempt_gain = fade_level  * ((float) preempt_count / (float) preempt_samps);
+		*out1++ = tab[bindex].w_float * preempt_gain;
+		if( preempt_count <= 0) {
+		  bindex = x->fbindex = x->loop_start;
+		  recalling_loop = 0;
+		}
+      }
+		
+      else if(force_new_loop){
+
+		if( bindex < 0 || bindex >= b_frames ){
+		  x->fbindex = bindex = b_frames/2; // start in the middle
+		}
+		// should switch to <
+		if( preempt && preempt_samps > x->samps_to_go ){ /* PREEMPT FADE */
+
+		  --preempt_count;
+		  preempt_gain = fade_level  * ( (float) preempt_count / (float) preempt_samps );
+		  bindex = x->fbindex ;
+		  x->fbindex += x->increment;
+			 
+						
+		  *out1++ = tab[ bindex ].w_float * preempt_gain;
+		  if(! preempt_count) {
+			chopper_randloop(x);
+			bindex = x->fbindex;
+			force_new_loop = 0;
+		  }
+		} 
+		else { 
+		  /* IMMEDIATE FORCE NEW LOOP AFTER PREEMPT FADE */
+		  chopper_randloop(x);
+		  
+		  force_new_loop = 0;
+		  bindex = x->fbindex ;
+		  bindex2 = bindex << 1;	
+		  x->fbindex += x->increment;
+		  
+		  --(x->samps_to_go);
+		  if( x->samps_to_go <= 0 ){
+			x->fbindex = x->loop_start;
+			bindex = x->fbindex;
+			x->samps_to_go = x->transp_loop_samps;
+		  }
+		  if( x->samps_to_go > x->transp_loop_samps - taper_samps ){
+			fade_level =  (float)(x->transp_loop_samps - x->samps_to_go)/(float)taper_samps ;
+			*out1++ = tab[bindex].w_float * fade_level;
+		  } else if( x->samps_to_go < taper_samps ) {
+			fade_level = (float)(x->samps_to_go)/(float)taper_samps;
+			*out1++ = tab[bindex].w_float * fade_level;
+		  } else {	
+			fade_level = 1.0;
+			*out1++ = tab[bindex].w_float;
+		  }
+		}
+				
+      } 
+      /* REGULAR PLAYBACK */
+      else { 
+
+		if( bindex < 0 || bindex >= b_frames ){
+		  error("lock_loop: bindex %d is out of range", bindex);
+		  x->fbindex = bindex = b_frames / 2;
+		}
+		bindex = floor( (double) x->fbindex );
+		m2 = x->fbindex - bindex ;
+		m1 = 1.0 - m2;
+		
+	//	bindex2 = bindex << 1;
+		x->fbindex += x->increment;
+		
+		--(x->samps_to_go);
+		if( x->samps_to_go <= 0 ){
+		  if( rdur_factor ){
+			chopper_rdurme( x );
+		  }
+		  if( jitter_factor ){
+			chopper_jitterme( x );
+		  }
+		  if( rinc_factor ) {
+			chopper_rincme( x );
+		  }
+		  x->fbindex = x->loop_start;
+		  // x->fbindex -= x->transp_loop_samps;
+		  bindex = x->fbindex;
+		  x->samps_to_go = x->transp_loop_samps;
+		}
+		
+		if( bindex >= b_frames ){
+		  sample1 = tab[bindex].w_float;
+		} else {
+		  sample1 = m1 * tab[bindex].w_float + m2 * tab[bindex + 1].w_float;
+		}
+		if( x->samps_to_go > x->transp_loop_samps - taper_samps ){
+		  fade_level =  (float)(x->transp_loop_samps - x->samps_to_go)/(float)taper_samps ;
+		  *out1++ = sample1 * fade_level;
+		} 
+		else if( x->samps_to_go < taper_samps ) {
+		  fade_level = (float)(x->samps_to_go)/(float)taper_samps;
+		  *out1++ = sample1 * fade_level;
+		} 
+		else {	
+		  fade_level = 1.0;
+		  *out1++ = sample1;
+		}
+      }
+    } /* END OF LOCK LOOP */
+    /* RECALL STORED LOOP */
+    
+    else if (recalling_loop) { 
+      bindex = x->fbindex ;
+      x->fbindex += x->increment;
+      --preempt_count;
+      preempt_gain = fade_level  * ( (float) preempt_count / (float) preempt_samps );
+					
+      *out1++ = tab[bindex].w_float * preempt_gain;
+      if( preempt_count <= 0) {
+		x->fbindex = x->loop_start;
+		bindex = x->fbindex;
+		recalling_loop = 0;
+      }
+    }
+    
+    else {
+      if( force_new_loop ){
+	/* FORCE LOOP CODE : MUST PREEMPT */
+		force_new_loop = 0;
+	/* NEED CODE HERE*/
+      } 
+      else {  /* NORMAL OPERATION */
+		fade_level = 1.0; /* default level */
+
+		if( bindex < 0 || bindex >= b_frames ){
+		  error("force loop: bindex %d is out of range", bindex);
+		  post("frames:%d start:%d, samps2go:%d, tloopsamps:%d, increment:%f", 
+			   x->framesize, bindex, x->samps_to_go, x->transp_loop_samps, x->increment);
+		  chopper_randloop(x);
+		  bindex = x->fbindex;
+		}
+		bindex = x->fbindex ;
+		x->fbindex += x->increment;
+		
+		if( x->samps_to_go > x->transp_loop_samps - taper_samps ){
+		  fade_level =  (float)(x->transp_loop_samps - x->samps_to_go)/(float)taper_samps ;
+		  *out1++ = tab[bindex].w_float * fade_level;
+		} 
+		else if(x->samps_to_go < taper_samps) {
+		  fade_level = (float)(x->samps_to_go)/(float)taper_samps;
+		  *out1++ = tab[bindex].w_float * fade_level;
+		} 
+		else {	
+		  fade_level = 1.0;
+		  *out1++ = tab[bindex].w_float;
+		}
+		--(x->samps_to_go);
+		if( x->samps_to_go <= 0 ){
+		  chopper_randloop( x );
+		  bindex = x->fbindex;
+		}
+      }
+    }
+  }
+
+  x->recalling_loop = recalling_loop;
+  x->fade_level = fade_level;
+  x->initialize_loop = initialize_loop;
+  x->maxseg = maxseg;
+  x->minseg = minseg;	
+  x->segdur = segdur;
+  x->force_new_loop = force_new_loop;
+  return (w+4);
+  
+}
+
+void chopper_force_new(t_chopper *x)
+{
+  x->preempt_count = x->preempt_samps;
+  x->force_new_loop = 1;
+
+}
+
+void chopper_lockme(t_chopper *x, t_floatarg n)
+{
+	x->lock_loop = (short) n;
+//	post("lock loop set to %d from %f",x->lock_loop,n);
+}
+
+//set min time for loop
+void chopper_set_minincr(t_chopper *x, t_floatarg n)
+{
+//  post("set minincr to %f", n);
+	
+  if( n < .005 ){
+    n = .005;
+  }
+  //x->minincr = n ;
+}
+
+// set deviation factor
+void chopper_set_maxseg(t_chopper *x, t_floatarg n)
+{
+
+  n /= 1000.0 ; // convert to seconds
+  if( n > 120. )
+    n = 120.;
+  //post("set maxseg to %f", n);
+  x->maxseg = n;
+  x->loop_max_samps = x->maxseg * x->R;
+}
+
+void chopper_set_minseg(t_chopper *x, t_floatarg n)
+{
+
+  n /= 1000.0 ; // convert to seconds
+	
+  if( n < 0.03 )
+    n = 0.03;
+  //post("set minseg to %f", n);
+  x->minseg = n;
+  x->loop_min_samps = x->minseg * x->R;
+}
+
+// set max time for loop
+void chopper_set_maxincr(t_chopper *x, t_floatarg n)
+{
+  if( n > 4 ){
+    n = 4;
+  }
+  //post("set maxincr to %f", n);
+  x->maxincr =  n ;
+}
+
+
+
+void chopper_set(t_chopper *x, t_symbol *wavename)
+{
+  int frames;
+  t_garray *a;
+  x->disabled = 0;
+
+  x->b_frames = 0;
+  x->b_nchans = 1;
+  if (!(a = (t_garray *)pd_findbyclass(wavename, garray_class))) {
+      if (*wavename->s_name) pd_error(x, "chopper~: %s: no such array",
+				      wavename->s_name);
+      x->b_samples = 0;
+      x->disabled = 1;
+    }
+  else if (!garray_getfloatwords(a, &frames, &x->b_samples)) {
+      pd_error(x, "%s: bad template for chopper~", wavename->s_name);
+      x->b_samples = 0;
+      x->disabled = 1;
+    }
+  else  {
+    x->b_frames = frames;
+//    post("%d frames in buffer",x->b_frames);
+    garray_usedindsp(a);
+  }
+}
+
+
+
+void chopper_dsp(t_chopper *x, t_signal **sp)
+{
+  chopper_set(x,x->l_sym);
+  if(x->R != sp[0]->s_sr){
+    x->R = sp[0]->s_sr;
+  	chopper_init(x,1);
+  }
+  if(x->disabled){
+    return;
+  }
+
+	dsp_add(chopper_pd_perform, 3, x, sp[0]->s_vec, sp[0]->s_n);
+
+}
+
+
+float chopper_boundrand(float min, float max)
+{
+   return min + (max-min) * ((float) (rand() % RAND_MAX)/(float)RAND_MAX);
+
+}
diff --git a/externals/lyonpotpourri/clean_selector~-help.pd b/externals/lyonpotpourri/clean_selector~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..b076686a8835f210247df9251e862632bc82f44f
--- /dev/null
+++ b/externals/lyonpotpourri/clean_selector~-help.pd
@@ -0,0 +1,42 @@
+#N canvas 601 262 479 367 10;
+#X msg 123 146 channel \$1;
+#X floatatom 123 116 5 0 0 0 - - -, f 5;
+#X obj 138 182 osc~ 440;
+#X obj 202 183 osc~ 777;
+#X obj 267 183 noise~;
+#X obj 316 183 osc~ 899;
+#X obj 123 307 dac~;
+#X obj 123 269 *~ 0.02;
+#X msg 29 143 fadetime \$1;
+#X msg 29 115 20;
+#X msg 155 81 1;
+#X msg 189 81 2;
+#X msg 221 82 3;
+#X text 253 82 select channel;
+#X text 25 95 set fadetime;
+#X msg 74 115 1000;
+#X msg 123 82 0;
+#X obj 123 224 clean_selector~ 4 250;
+#X text 278 223 args: inputs \, fadetime;
+#X obj 23 16 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 22 52 clean_selector~ - Cross fade between multiple sources
+;
+#X floatatom 198 273 5 0 0 2 gain - -, f 5;
+#X connect 0 0 17 0;
+#X connect 1 0 0 0;
+#X connect 2 0 17 0;
+#X connect 3 0 17 1;
+#X connect 4 0 17 2;
+#X connect 5 0 17 3;
+#X connect 7 0 6 0;
+#X connect 7 0 6 1;
+#X connect 8 0 17 0;
+#X connect 9 0 8 0;
+#X connect 10 0 1 0;
+#X connect 11 0 1 0;
+#X connect 12 0 1 0;
+#X connect 15 0 8 0;
+#X connect 16 0 1 0;
+#X connect 17 0 7 0;
+#X connect 21 0 7 1;
diff --git a/externals/lyonpotpourri/clean_selector~.c b/externals/lyonpotpourri/clean_selector~.c
new file mode 100755
index 0000000000000000000000000000000000000000..8ca0a9ddb467a4ccdb0893c2ff392f796a149e02
--- /dev/null
+++ b/externals/lyonpotpourri/clean_selector~.c
@@ -0,0 +1,241 @@
+#include "MSPd.h"
+#define MAX_CHANS (64)
+#define CS_LINEAR (0)
+#define CS_POWER (1)
+
+
+static t_class *clean_selector_class;
+
+typedef struct _clean_selector
+{
+    
+	t_object x_obj;
+	float x_f;
+	// Variables Here
+	short input_chans;
+	short active_chan;
+	short last_chan;
+	int samps_to_fade;
+	int fadesamps;
+	float fadetime;
+	float pi_over_two;
+	short fadetype;
+	short *connected_list;
+	float **bulk ; // array to point to all input audio channels
+	float sr;
+	float vs;
+	int inlet_count;
+} t_clean_selector;
+
+#define OBJECT_NAME "clean_selector~"
+
+void *clean_selector_new(t_symbol *s, int argc, t_atom *argv);
+
+t_int *clean_selector_perform(t_int *w);
+void clean_selector_dsp(t_clean_selector *x, t_signal **sp);
+void clean_selector_float(t_clean_selector *x, t_float f);
+void clean_selector_fadetime(t_clean_selector *x, t_floatarg f);
+void clean_selector_int(t_clean_selector *x, t_int i);
+void clean_selector_channel(t_clean_selector *x, t_floatarg i);
+void clean_selector_dsp_free(t_clean_selector *x);
+
+
+
+void clean_selector_tilde_setup(void) {
+	clean_selector_class = class_new(gensym("clean_selector~"), (t_newmethod)clean_selector_new,
+									 (t_method)clean_selector_dsp_free,sizeof(t_clean_selector), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(clean_selector_class, t_clean_selector, x_f);
+	class_addmethod(clean_selector_class,(t_method)clean_selector_dsp,gensym("dsp"),0);
+	class_addmethod(clean_selector_class,(t_method)clean_selector_fadetime,gensym("fadetime"),A_FLOAT,0);
+	class_addmethod(clean_selector_class,(t_method)clean_selector_channel,gensym("channel"),A_FLOAT,0);
+	potpourri_announce(OBJECT_NAME);
+}
+
+
+
+void *clean_selector_new(t_symbol *s, int argc, t_atom *argv)
+{
+	int i;
+	t_clean_selector *x;
+	x = (t_clean_selector *)pd_new(clean_selector_class);
+    x->fadetime = 0.05;
+    x->inlet_count = 8;
+    if(argc >= 1){
+        x->inlet_count = (int)atom_getfloatarg(0,argc,argv);
+        if(x->inlet_count < 2 || x->inlet_count > MAX_CHANS){
+            error("%s: %d is illegal number of inlets",OBJECT_NAME,x->inlet_count);
+            return (void *) NULL;
+        }
+        
+    }
+    if(argc >= 2){
+        x->fadetime = atom_getfloatarg(1,argc,argv) / 1000.0;
+    }
+    
+    //		post("argc %d inlet count %d fadetime %f",argc, x->inlet_count, x->fadetime);
+    
+	for(i=0; i< x->inlet_count - 1; i++){// create 16 inlets in total
+		inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	}
+	outlet_new(&x->x_obj, gensym("signal"));
+	
+	
+	x->sr = sys_getsr();
+	if(!x->sr){
+		x->sr = 44100.0;
+		error("zero sampling rate - set to 44100");
+	}
+	x->fadetype = CS_POWER;
+	x->pi_over_two = 1.57079632679;
+	
+	
+    
+    if(x->fadetime <= 0.0)
+    	x->fadetime = .05;
+    x->fadesamps = x->fadetime * x->sr;
+    
+    x->connected_list = (short *) t_getbytes(MAX_CHANS * sizeof(short));
+    for(i=0;i<16;i++){
+    	x->connected_list[i] = 0;
+    }
+    x->active_chan = x->last_chan = 0;
+    x->bulk = (t_float **) t_getbytes(16 * sizeof(t_float *));
+    x->samps_to_fade = 0;
+	return (x);
+}
+
+void clean_selector_dsp_free(t_clean_selector *x)
+{
+	t_freebytes(x->bulk, 16 * sizeof(t_float *));
+}
+
+
+void clean_selector_fadetime(t_clean_selector *x, t_floatarg f)
+{
+	float fades = (float)f / 1000.0;
+	
+	if( fades < .0001 || fades > 1000.0 ){
+		error("fade time is constrained to 0.1 - 1000000, but you wanted %f",f );
+		return;
+	}
+	x->fadetime = fades;
+	x->fadesamps = x->sr * x->fadetime;
+	x->samps_to_fade = 0;
+}
+
+t_int *clean_selector_perform(t_int *w)
+{
+	
+	t_clean_selector *x = (t_clean_selector *) (w[1]);
+	int i;
+	int n;
+	t_float *out;
+	
+	int fadesamps = x->fadesamps;
+	short active_chan = x->active_chan;
+	short last_chan = x->last_chan;
+	int samps_to_fade = x->samps_to_fade;
+	float m1, m2;
+	float **bulk = x->bulk;
+	float pi_over_two = x->pi_over_two;
+	short fadetype = x->fadetype;
+	float phase;
+	int inlet_count = x->inlet_count;
+	
+	for ( i = 0; i < inlet_count; i++ ) {
+		bulk[i] = (t_float *)(w[2 + i]);
+	}
+	out = (t_float *)(w[inlet_count + 2]);
+	n = (int) w[inlet_count + 3];
+	
+	/********************************************/
+	if ( active_chan >= 0 ) {
+		while( n-- ) {
+			if ( samps_to_fade >= 0 ) {
+				if( fadetype == CS_POWER ){
+					phase = pi_over_two * (1.0 - (samps_to_fade / (float) fadesamps)) ;
+					m1 = sin( phase );
+					m2 = cos( phase );
+					--samps_to_fade;
+					*out++ = (*(bulk[active_chan])++ * m1) + (*(bulk[last_chan])++ * m2);
+				}
+			}
+			else {
+				*out++ =  *(bulk[active_chan])++;
+			}
+		}
+	}
+  	else  {
+  		while( n-- ) {
+			*out++ = 0.0;
+		}
+  	}
+    
+	x->samps_to_fade = samps_to_fade;
+	return (w + (inlet_count + 4));
+}
+
+void clean_selector_dsp(t_clean_selector *x, t_signal **sp)
+{
+	long i;
+	t_int **sigvec;
+	int pointer_count;
+	
+	pointer_count = x->inlet_count + 3; // all inlets, 1 outlet, object pointer and vec-samps
+	sigvec  = (t_int **) calloc(pointer_count, sizeof(t_int *));
+	for(i = 0; i < pointer_count; i++){
+		sigvec[i] = (t_int *) calloc(sizeof(t_int),1);
+	}
+	sigvec[0] = (t_int *)x; // first pointer is to the object
+	
+	sigvec[pointer_count - 1] = (t_int *)sp[0]->s_n; // last pointer is to vector size (N)
+    
+	for(i = 1; i < pointer_count - 1; i++){ // now attach the inlet and all outlets
+		sigvec[i] = (t_int *)sp[i-1]->s_vec;
+	}
+    
+	if(x->sr != sp[0]->s_sr){
+		x->sr = sp[0]->s_sr;
+		x->fadesamps = x->fadetime * x->sr;
+		x->samps_to_fade = 0;
+	}
+    
+    
+	dsp_addv(clean_selector_perform, pointer_count, (t_int *) sigvec);
+	free(sigvec);
+    
+    for (i = 0; i < MAX_CHANS; i++) {
+        x->connected_list[i] = 1;
+    }
+    
+    
+    
+}
+
+
+void clean_selector_channel(t_clean_selector *x, t_floatarg i) // Look at int at inlets
+{
+	int chan = i;
+	if(chan < 0 || chan > x->inlet_count - 1){
+		post("%s: channel %d out of range",OBJECT_NAME, chan);
+		return;
+	}
+	if(chan != x->active_chan) {
+		
+		x->last_chan = x->active_chan;
+		x->active_chan = chan;
+		x->samps_to_fade = x->fadesamps;
+		if( x->active_chan < 0)
+			x->active_chan = 0;
+		if( x->active_chan > MAX_CHANS - 1) {
+			x->active_chan = MAX_CHANS - 1;
+		}
+		if(! x->connected_list[chan]) {
+            // do it anyway - it's user-stupidity
+            /*
+             post("warning: channel %d not connected",chan);
+             x->active_chan = 1; */
+		}
+		// post("last: %d active %d", x->last_chan, x->active_chan);
+	}	
+}
diff --git a/externals/lyonpotpourri/click2bang~-help.pd b/externals/lyonpotpourri/click2bang~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..ea965ff54cb424fd10103832c35587b1dfd27554
--- /dev/null
+++ b/externals/lyonpotpourri/click2bang~-help.pd
@@ -0,0 +1,10 @@
+#N canvas 514 317 333 242 10;
+#X obj 30 90 samm~ 60 1;
+#X obj 30 125 click2bang~;
+#X obj 30 162 bng 40 100 50 0 empty empty empty 17 7 0 10 -216994 -1
+-1;
+#X obj 23 13 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 24 45 click2bang~ - Convert click trigger to a bang;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
diff --git a/externals/lyonpotpourri/click2bang~.c b/externals/lyonpotpourri/click2bang~.c
new file mode 100755
index 0000000000000000000000000000000000000000..a95a6e995d8961d2e429917b56f1662595baf7ab
--- /dev/null
+++ b/externals/lyonpotpourri/click2bang~.c
@@ -0,0 +1,64 @@
+#include "MSPd.h"
+
+#define OBJECT_NAME "click2bang~"
+
+static t_class *click2bang_class;
+
+typedef struct _click2bang
+{
+	t_object x_obj;
+	float x_f;
+	void *bang;
+	void *clock;
+} t_click2bang;
+
+void *click2bang_new(void);
+
+t_int *click2bang_perform(t_int *w);
+void click2bang_dsp(t_click2bang *x, t_signal **sp);
+void click2bang_tick(t_click2bang *x) ;
+
+void click2bang_tilde_setup(void)
+{
+	click2bang_class = class_new(gensym("click2bang~"), (t_newmethod)click2bang_new,
+								 NO_FREE_FUNCTION,sizeof(t_click2bang), 0,0);
+	CLASS_MAINSIGNALIN(click2bang_class, t_click2bang, x_f);
+	class_addmethod(click2bang_class, (t_method)click2bang_dsp, gensym("dsp"), 0);
+	potpourri_announce(OBJECT_NAME);
+}
+
+
+void click2bang_tick(t_click2bang *x)
+{
+    outlet_bang(x->bang);
+}
+
+
+
+void *click2bang_new(void)
+{
+    
+	t_click2bang *x = (t_click2bang *)pd_new(click2bang_class);
+	x->bang = outlet_new(&x->x_obj, gensym("bang"));
+	x->clock = clock_new(x,(void *)click2bang_tick);
+	return x;
+}
+
+t_int *click2bang_perform(t_int *w)
+{
+	t_click2bang *x = (t_click2bang *) (w[1]);
+	t_float *in_vec = (t_float *)(w[2]);
+	int n = (int) w[3];
+    
+	while( n-- ) {
+		if(*in_vec++)
+			clock_delay(x->clock, 0);
+	}
+	return (w+4);
+}
+
+void click2bang_dsp(t_click2bang *x, t_signal **sp)
+{
+    dsp_add(click2bang_perform, 3, x, sp[0]->s_vec,sp[0]->s_n);
+}
+
diff --git a/externals/lyonpotpourri/click2float~-help.pd b/externals/lyonpotpourri/click2float~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..5f365c56bec42512f8a27c3c5399c8250d1793ba
--- /dev/null
+++ b/externals/lyonpotpourri/click2float~-help.pd
@@ -0,0 +1,11 @@
+#N canvas 719 335 316 238 10;
+#X floatatom 34 177 5 0 0 0 - - -, f 5;
+#X obj 34 77 samm~ 120 1;
+#X obj 34 143 click2float~;
+#X obj 34 109 mask~ 2 4 6.333 8;
+#X obj 23 13 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 21 47 click2float~ - Convert a click to a float;
+#X connect 1 0 3 0;
+#X connect 2 0 0 0;
+#X connect 3 0 2 0;
diff --git a/externals/lyonpotpourri/click2float~.c b/externals/lyonpotpourri/click2float~.c
new file mode 100755
index 0000000000000000000000000000000000000000..f5671cdd65922b7c18dab1231ffe3593244e32a9
--- /dev/null
+++ b/externals/lyonpotpourri/click2float~.c
@@ -0,0 +1,68 @@
+#include "MSPd.h"
+
+
+static t_class *click2float_class;
+
+
+typedef struct _click2float
+{
+    
+	t_object x_obj;
+	float x_f;
+	void *float_outlet;
+	void *clock;
+	double float_value;
+} t_click2float;
+
+#define OBJECT_NAME "click2float~"
+
+void *click2float_new(void);
+t_int *click2float_perform(t_int *w);
+void click2float_dsp(t_click2float *x, t_signal **sp);
+void click2float_tick(t_click2float *x) ;
+
+
+void click2float_tilde_setup(void)
+{
+	click2float_class = class_new(gensym("click2float~"), (t_newmethod)click2float_new, NO_FREE_FUNCTION,sizeof(t_click2float), 0,0);
+	CLASS_MAINSIGNALIN(click2float_class, t_click2float, x_f);
+	class_addmethod(click2float_class, (t_method)click2float_dsp, gensym("dsp"), 0);
+	potpourri_announce(OBJECT_NAME);
+}
+
+void click2float_tick(t_click2float *x)
+{
+    outlet_float(x->float_outlet,x->float_value);
+}
+
+
+void *click2float_new(void)
+{
+
+	t_click2float *x = (t_click2float *)pd_new(click2float_class);
+	x->float_outlet = outlet_new(&x->x_obj, gensym("float"));
+	x->clock = clock_new(x,(void *)click2float_tick);
+	return x;
+}
+
+t_int *click2float_perform(t_int *w)
+{
+	t_click2float *x = (t_click2float *) (w[1]);
+	t_float *in_vec = (t_float *)(w[2]);
+	int n = (int) w[3];
+    
+	while( n-- ) {
+		if(*in_vec){
+			x->float_value = *in_vec;
+			clock_delay(x->clock, 0);
+		}
+		*in_vec++;
+	}
+	return (w+4);
+}
+
+void click2float_dsp(t_click2float *x, t_signal **sp)
+{
+    dsp_add(click2float_perform, 3, x, sp[0]->s_vec,sp[0]->s_n);
+}
+
diff --git a/externals/lyonpotpourri/clickhold~-help.pd b/externals/lyonpotpourri/clickhold~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..74c5e5d5e21eaff487192d857b65e34c7d61cf0a
--- /dev/null
+++ b/externals/lyonpotpourri/clickhold~-help.pd
@@ -0,0 +1,16 @@
+#N canvas 643 117 374 266 10;
+#X obj 38 74 samm~ 120 1;
+#X obj 38 103 mask~ 440 550 660 880;
+#X obj 38 155 osc~;
+#X obj 38 132 clickhold~;
+#X obj 38 215 dac~;
+#X obj 38 184 *~ 0.025;
+#X obj 23 13 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 23 48 clickhold~ - convert click to sustained signal;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 2 0 5 0;
+#X connect 3 0 2 0;
+#X connect 5 0 4 0;
+#X connect 5 0 4 1;
diff --git a/externals/lyonpotpourri/clickhold~.c b/externals/lyonpotpourri/clickhold~.c
new file mode 100755
index 0000000000000000000000000000000000000000..279dac57325fe91d3615a6dc5ceac683e1594eb8
--- /dev/null
+++ b/externals/lyonpotpourri/clickhold~.c
@@ -0,0 +1,61 @@
+#include "MSPd.h"
+
+static t_class *clickhold_class;
+
+#define OBJECT_NAME "clickhold~"
+
+typedef struct _clickhold
+{
+	t_object x_obj;
+	float x_f;
+	float hold_value;
+} t_clickhold;
+
+void *clickhold_new(void);
+t_int *clickhold_perform(t_int *w);
+void clickhold_dsp(t_clickhold *x, t_signal **sp);
+
+
+void clickhold_tilde_setup(void)
+{
+	clickhold_class = class_new(gensym("clickhold~"), (t_newmethod)clickhold_new,
+                                NO_FREE_FUNCTION,sizeof(t_clickhold), 0,0);
+	CLASS_MAINSIGNALIN(clickhold_class, t_clickhold, x_f);
+	class_addmethod(clickhold_class, (t_method)clickhold_dsp, gensym("dsp"), 0);
+	potpourri_announce(OBJECT_NAME);
+}
+
+void *clickhold_new(void)
+{
+	t_clickhold *x = (t_clickhold *)pd_new(clickhold_class);
+	outlet_new(&x->x_obj, gensym("signal"));
+	x->hold_value = 0;
+	return x;
+}
+
+t_int *clickhold_perform(t_int *w)
+{
+	t_clickhold *x = (t_clickhold *) (w[1]);
+	t_float *in_vec = (t_float *)(w[2]);
+	t_float *out_vec = (t_float *)(w[3]);
+	int n = (int) w[4];
+    
+	float hold_value = x->hold_value;
+	
+	while( n-- ) {
+		if(*in_vec){
+			hold_value = *in_vec;
+		}
+		*in_vec++;
+		*out_vec++ = hold_value;
+        
+	}
+	x->hold_value = hold_value;
+	return (w+5);
+}
+
+void clickhold_dsp(t_clickhold *x, t_signal **sp)
+{
+    dsp_add(clickhold_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
+}
+
diff --git a/externals/lyonpotpourri/click~-help.pd b/externals/lyonpotpourri/click~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..00b1125ba2533d92585fbfdb9c0778b9b8cc1bb1
--- /dev/null
+++ b/externals/lyonpotpourri/click~-help.pd
@@ -0,0 +1,26 @@
+#N canvas 780 485 450 300 10;
+#X obj 69 187 click~;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array click-array 8 float 2;
+#X coords 0 1 8 -1 140 70 1;
+#X restore 218 100 graph;
+#X obj 69 249 tabwrite~ click-array;
+#X obj 34 104 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 23 13 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X obj 92 220 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X text 52 104 record click;
+#X msg 69 156 set 0.333;
+#X text 112 221 clear array;
+#X msg 145 155 set 1;
+#X text 25 44 click~ - convert a bang into a click. the default value
+is 1 but the click can be set to any value except zero.;
+#X text 66 137 set click value;
+#X connect 0 0 2 0;
+#X connect 3 0 0 0;
+#X connect 3 0 2 0;
+#X connect 5 0 2 0;
+#X connect 7 0 0 0;
+#X connect 9 0 0 0;
diff --git a/externals/lyonpotpourri/click~.c b/externals/lyonpotpourri/click~.c
new file mode 100755
index 0000000000000000000000000000000000000000..bea1af97e0e2f2a0bac289049de3a4e35a1d6e70
--- /dev/null
+++ b/externals/lyonpotpourri/click~.c
@@ -0,0 +1,78 @@
+#include "MSPd.h"
+
+static t_class *click_class;
+
+typedef struct _click
+{
+	t_object x_obj;
+	float x_f;
+	void *float_outlet;
+	float float_value;	
+	long status;
+} t_click;
+
+#define OBJECT_NAME "click~"
+
+void *click_new(t_symbol *s, int argc, t_atom *argv);
+void click_bang(t_click *x);
+t_int *click_perform(t_int *w);
+void click_dsp(t_click *x, t_signal **sp);
+void click_set(t_click *x, t_floatarg f);
+
+#define NO_FREE_FUNCTION 0
+void click_tilde_setup(void)
+{
+	click_class = class_new(gensym("click~"), (t_newmethod)click_new, 
+								 NO_FREE_FUNCTION,sizeof(t_click), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(click_class, t_click, x_f);
+	class_addmethod(click_class, (t_method)click_dsp, gensym("dsp"), 0);
+	class_addmethod(click_class, (t_method)click_bang, gensym("bang"), 0);
+	class_addmethod(click_class, (t_method)click_set, gensym("set"), A_FLOAT, 0);
+	potpourri_announce(OBJECT_NAME);
+}
+
+void click_bang(t_click *x) 
+{
+  x->status = 1;
+}
+
+void click_set(t_click *x, t_floatarg f)
+{
+	x->float_value = f;
+}
+
+void *click_new(t_symbol *s, int argc, t_atom *argv)
+{
+	t_click *x = (t_click *)pd_new(click_class);
+	x->float_outlet = outlet_new(&x->x_obj, gensym("signal"));
+	x->float_value = 1.0;
+	x->status = 0;
+	return x;
+}
+
+t_int *click_perform(t_int *w)
+{
+	t_click *x = (t_click *) (w[1]);
+	t_float *output = (t_float *)(w[2]);
+	int n = (int) w[3];
+	int i;
+	if(x->status){
+		x->status = 0;
+		output[0] = x->float_value;
+		for(i = 1; i < n; i++){
+			output[i] = 0.0;
+		}
+	} 
+	else {
+		for(i = 0; i < n; i++){
+			output[i] = 0.0;
+		}
+	}
+	return w+4;
+}		
+
+void click_dsp(t_click *x, t_signal **sp)
+{
+    dsp_add(click_perform, 3, x, sp[0]->s_vec, sp[0]->s_n);
+}
+
diff --git a/externals/lyonpotpourri/collect.pl b/externals/lyonpotpourri/collect.pl
new file mode 100755
index 0000000000000000000000000000000000000000..1a3d0e29a36841256f94e09764b0e5632fa1ac29
--- /dev/null
+++ b/externals/lyonpotpourri/collect.pl
@@ -0,0 +1,6 @@
+while(<*>){
+    chomp;
+    if(/darwin$/ | /liblyonpotpourri.dylib/){
+	`mv $_ darwin_bin64`;
+    }
+}
diff --git a/externals/lyonpotpourri/convert.c b/externals/lyonpotpourri/convert.c
new file mode 100755
index 0000000000000000000000000000000000000000..01317746e6d47ff9d6da607ab224c2809c4e735a
--- /dev/null
+++ b/externals/lyonpotpourri/convert.c
@@ -0,0 +1 @@
+#include "fftease.h"


/* S is a spectrum in rfft format, i.e., it contains N real values
   arranged as real followed by imaginary values, except for first
   two values, which are real parts of 0 and Nyquist frequencies;
   convert first changes these into N/2+1 PAIRS of magnitude and
   phase values to be stored in output array C; the phases are then
   unwrapped and successive phase differences are used to compute
   estimates of the instantaneous frequencies for each phase vocoder
   analysis channel; decimation rate D and sampling rate R are used
   to render these frequency values directly in Hz. */

void convert(float *S, float *C, int N2, float *lastphase, float fundamental, float factor )
{
  float 	phase,
		phasediff;
  int 		real,
		imag,
		amp,
		freq;
  float 	a,
		b;
  int 		i;

/*  float myTWOPI, myPI; */
/*  double sin(), cos(), atan(), hypot();*/
  
/*  myTWOPI = 8.*atan(1.);
  myPI = 4.*atan(1.); */


    for ( i = 0; i <= N2; i++ ) {
      imag = freq = ( real = amp = i<<1 ) + 1;
      a = ( i == N2 ? S[1] : S[real] );
      b = ( i == 0 || i == N2 ? 0. : S[imag] );

      C[amp] = hypot( a, b );
      if ( C[amp] == 0. )
	phasediff = 0.;
      else {
	phasediff = ( phase = -atan2( b, a ) ) - lastphase[i];
	lastphase[i] = phase;
	
	while ( phasediff > PI )
	  phasediff -= TWOPI;
	while ( phasediff < -PI )
	  phasediff += TWOPI;
      }
      C[freq] = phasediff*factor + i*fundamental;
    }
}
\ No newline at end of file
diff --git a/externals/lyonpotpourri/convolver~-help.pd b/externals/lyonpotpourri/convolver~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..660142260cf2051dd80db8f47b3d8f143823cf73
--- /dev/null
+++ b/externals/lyonpotpourri/convolver~-help.pd
@@ -0,0 +1,88 @@
+#N canvas 555 371 681 515 10;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array cdemo_impulse 66162 float 2;
+#X coords 0 1 66162 -1 200 140 1;
+#X restore 268 41 graph;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array cdemo_source 62079 float 2;
+#X coords 0 1 62079 -1 200 140 1;
+#X restore 24 89 graph;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array cdemo_dest 131072 float 2;
+#X coords 0 1 131072 -1 200 140 1;
+#X restore 25 243 graph;
+#X obj 269 222 convolver~ cdemo_source cdemo_impulse cdemo_dest;
+#X obj 269 241 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 434 427 s convo_demo_msg;
+#X obj 269 203 r convo_demo_msg;
+#X msg 271 400 convolve;
+#X obj 473 65 tabplay~ cdemo_dest;
+#X obj 473 139 *~ 0.1;
+#X obj 473 161 dac~;
+#X obj 473 41 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X floatatom 512 121 5 0 0 0 - - -, f 5;
+#X msg 24 397 bang;
+#X obj 515 106 hsl 100 12 0 1 0 0 empty empty gain -2 -8 0 8 -261570
+-1 -1 0 1;
+#X msg 434 398 noiseimp \$1;
+#X floatatom 434 380 5 0 0 0 - - -, f 5;
+#X msg 526 398 spikeimp \$1;
+#X floatatom 526 382 5 0 0 0 - - -, f 5;
+#X obj 271 421 s convo_demo_msg;
+#X text 288 242 operation completion bang;
+#X obj 432 325 soundfiler;
+#X obj 432 289 openpanel;
+#X msg 432 270 bang;
+#X msg 432 307 read -resize \$1 cdemo_impulse;
+#X msg 573 155 \; pd dsp \$1;
+#X obj 573 131 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X text 430 351 ... or build a synthetic impulse;
+#N canvas 715 441 450 300 sound-source 0;
+#X obj 104 159 soundfiler;
+#X obj 104 120 loadbang;
+#X obj 104 88 soundfiler;
+#X obj 104 52 openpanel;
+#X msg 104 70 read -resize \$1 cdemo_source;
+#X obj 104 34 inlet;
+#X text 175 122 default sound;
+#X obj 44 242 s convo_demo_msg;
+#X msg 44 218 noiseimp -5;
+#X obj 44 193 loadbang;
+#X text 112 195 default impulse;
+#X msg 104 141 read -resize sound/voice.wav cdemo_source;
+#X connect 1 0 11 0;
+#X connect 3 0 4 0;
+#X connect 4 0 2 0;
+#X connect 5 0 3 0;
+#X connect 8 0 7 0;
+#X connect 9 0 8 0;
+#X connect 11 0 0 0;
+#X restore 24 421 pd sound-source;
+#X obj 23 8 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 22 41 convolver~ - non-real-time convolution;
+#X text 64 398 1 find a soundfile to convolve;
+#X text 471 271 2 find an impulse response;
+#X text 269 380 3 perform convolution;
+#X text 492 41 4 play convolution result;
+#X connect 3 0 4 0;
+#X connect 6 0 3 0;
+#X connect 7 0 19 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 9 0 10 1;
+#X connect 11 0 8 0;
+#X connect 12 0 9 1;
+#X connect 13 0 28 0;
+#X connect 14 0 12 0;
+#X connect 15 0 5 0;
+#X connect 16 0 15 0;
+#X connect 17 0 5 0;
+#X connect 18 0 17 0;
+#X connect 22 0 24 0;
+#X connect 23 0 22 0;
+#X connect 24 0 21 0;
+#X connect 26 0 25 0;
diff --git a/externals/lyonpotpourri/convolver~.c b/externals/lyonpotpourri/convolver~.c
new file mode 100755
index 0000000000000000000000000000000000000000..ce60801e1d3fc710da1b4b865ec09401b80132ea
--- /dev/null
+++ b/externals/lyonpotpourri/convolver~.c
@@ -0,0 +1,1009 @@
+#include "m_pd.h"
+//#include "lpp.h"
+#include "fftease_oldskool.h"
+#include "MSPd.h"
+
+#define OBJECT_NAME "convolver~"
+#define DENORM_WANT_FIX		1	
+
+#define COMPILE_DATE "1.7.08"
+#define OBJECT_VERSION "2.02"
+
+#define FIX_DENORM_FLOAT(v)	(v=(fabs(v) < 0.000001 ? 0.f : (v)))
+static t_class *convolver_class;
+
+#define CBUF_SIZE 32768
+#define NCMAX 52428800
+
+typedef struct _buffy {
+	t_word *b_samples;
+	long b_frames;
+	long b_nchans;
+	long b_valid;
+	t_garray *b;
+	t_symbol *myname;
+} t_buffy;
+
+
+typedef struct _convolver
+{
+	t_object x_obj;
+	float x_f;
+	t_buffy *impulse; // impulse buffer
+	t_buffy *source; // source buffer
+	t_buffy *dest; // output buffer
+	void *bang; // completion bang
+	float sr;
+	// convolution stuff
+	float *tbuf;
+	float *sbuf;
+	float *filt;
+	long N;
+	long N2;
+	long last_N;
+	// for fast fft
+	float mult; 
+	float *trigland;
+	int *bitshuffle;
+	short static_memory; // flag to avoid dynamic memory manipulation
+} t_convolver;
+
+// maybe no dsp method
+float boundrand(float min, float max);
+void convolver_setbuf(t_buffy *trybuf);
+
+void *convolver_new(t_symbol *msg, short argc, t_atom *argv);
+t_int *convolver_perform(t_int *w);
+
+void convolver_mute(t_convolver *x, t_floatarg toggle);
+void convolver_assist (t_convolver *x, void *b, long msg, long arg, char *dst);
+void convolver_dsp_free(t_convolver *x);
+void convolver_seed(t_convolver *x, t_floatarg seed);
+// void convolver_dsp(t_convolver *x, t_signal **sp, short *count);
+void convolver_attach_buffers(t_convolver *x) ;
+void convolver_spikeimp(t_convolver *x, t_floatarg density);
+void convolver_convolve(t_convolver *x);
+void convolver_convolvechans(t_convolver *x, t_symbol *msg, short argc, t_atom *argv);
+void convolver_version(t_convolver *x);
+void convolver_noiseimp(t_convolver *x, t_floatarg curve);
+
+void rfft( float *x, int N, int forward );
+void cfft( float *x, int NC, int forward );
+void bitreverse( float *x, int N );
+void convolver_static_memory(t_convolver *x, t_floatarg toggle);
+
+
+void convolver_tilde_setup(void){
+	convolver_class = class_new(gensym("convolver~"), (t_newmethod)convolver_new, 
+								(t_method)convolver_dsp_free,sizeof(t_convolver), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(convolver_class, t_convolver, x_f);
+	// class_addmethod(convolver_class,(t_method)convolver_dsp,gensym("dsp"),0);
+	class_addmethod(convolver_class,(t_method)convolver_spikeimp,gensym("spikeimp"), A_FLOAT, 0);
+	class_addmethod(convolver_class,(t_method)convolver_noiseimp, gensym("noiseimp"),A_FLOAT, 0);
+	class_addmethod(convolver_class,(t_method)convolver_convolve, gensym("convolve"),0);
+	class_addmethod(convolver_class,(t_method)convolver_static_memory, gensym("static_memory"),A_FLOAT, 0);
+	potpourri_announce(OBJECT_NAME);
+}
+
+void convolver_static_memory(t_convolver *x, t_floatarg toggle)
+{
+	
+	long memcount = 0;
+	float *tbuf = x->tbuf;
+	float *sbuf = x->sbuf;
+	float *filt = x->filt;
+	int *bitshuffle = x->bitshuffle;
+	float *trigland = x->trigland;	
+	t_buffy *impulse = x->impulse;
+	long N, N2;
+	
+	x->static_memory = (short) toggle;
+	
+	if( x->static_memory ){
+		convolver_attach_buffers( x );
+		
+		for( N2 = 2; N2 < NCMAX; N2 *= 2){
+			if( N2 >= impulse->b_frames ){
+				// post("%s: Exceeded Impulse Maximum: %d",OBJECT_NAME, NCMAX);
+				break;
+			}
+		}
+		N = 2 * N2;
+		
+		post("%s: memory is now static - do not reload your impulse buffer",OBJECT_NAME);
+		
+		if ((sbuf = (float *) calloc(N+2, sizeof(float))) == NULL)
+			error("%s: insufficient memory", OBJECT_NAME);
+		memcount += (N+2) * sizeof(float);
+		if ((tbuf = (float *) calloc(N2, sizeof(float))) == NULL)
+			error("%s: insufficient memory",OBJECT_NAME);
+		memcount += (N2) * sizeof(float);
+		if ((filt = (float *) calloc(N+2, sizeof(float))) == NULL)
+			error("%s: insufficient memory",OBJECT_NAME);
+		memcount += (N+2) * sizeof(float);
+		if( (bitshuffle = (int *) calloc(N * 2, sizeof(int))) == NULL)
+			error("%s: insufficient memory",OBJECT_NAME);
+		memcount += (N2) * sizeof(float);
+		if( (trigland = (float *) calloc(N * 2, sizeof(float))) == NULL)
+			error("%s: insufficient memory",OBJECT_NAME);	
+		memcount += (N2) * sizeof(float);
+		post("%s: allocated %f Megabytes for %s", OBJECT_NAME, (float)memcount / 1000000.0, impulse->myname->s_name);
+	}
+}
+
+
+
+void convolver_seed(t_convolver *x, t_floatarg seed)
+{
+    t_convolver *fraud;
+    fraud = x;
+	srand((long)seed);
+}
+
+void convolver_convolve(t_convolver *x)
+{
+	int i;
+	t_symbol *mymsg;
+	short myargc = 3;
+	t_atom data[3];
+	mymsg = (t_symbol *) calloc(1, sizeof(t_symbol));
+	convolver_attach_buffers( x );
+	if(x->source->b_nchans == x->impulse->b_nchans && x->impulse->b_nchans == x->dest->b_nchans){
+		// post("case 1");
+		for(i = 0; i < x->source->b_nchans; i++){
+			SETFLOAT(data, i+1); // source
+			SETFLOAT(data+1, i+1); // impulse
+			SETFLOAT(data+2, i+1); // destination
+			convolver_convolvechans(x, mymsg, myargc, data);
+		}
+	} 
+	else if(x->source->b_nchans == 1 && x->impulse->b_nchans == x->dest->b_nchans){
+		//post("case 2");
+		for(i = 0; i < x->impulse->b_nchans; i++){
+			SETFLOAT(data, 1); // source
+			SETFLOAT(data+1, i+1); // impulse
+			SETFLOAT(data+2, i+1); // destination
+			convolver_convolvechans(x, mymsg, myargc, data);
+		}
+	}
+	else if(x->impulse->b_nchans == 1 && x->source->b_nchans == x->dest->b_nchans){
+		//post("case 3");
+		for(i = 0; i < x->impulse->b_nchans; i++){
+			SETFLOAT(data, i+1); // source
+			SETFLOAT(data+1, 1); // impulse
+			SETFLOAT(data+2, i+1); // destination
+			convolver_convolvechans(x, mymsg, myargc, data);
+		}
+	} else {
+		post("%s: \"convolve\" is not smart enough to figure out what you want to do. Try \"convolvechans\"",OBJECT_NAME);
+		post("source chans: %d, impulse chans: %d, dest chans: %d",x->source->b_nchans, x->impulse->b_nchans, x->dest->b_nchans );
+	}
+	outlet_bang(x->bang);
+}
+
+void convolver_convolvechans(t_convolver *x, t_symbol *msg, short argc, t_atom *argv)
+{
+    t_symbol *fraud;
+	float *tbuf = x->tbuf;
+	float *sbuf = x->sbuf;
+	float *filt = x->filt;
+	long N = x->N;
+	long N2 = x->N2;
+	long i, j, ip, ip1;
+	long ifr_cnt = 0, ofr_cnt = 0;
+	long inframes, outframes;
+	int target_frames = 2;
+	short copacetic; // loop enabler
+	float a,b,temp,max=0.0,gain=1.0; //,thresh=.0000000001,fmag;
+	int readframes, writeframes;
+	t_buffy *impulse = x->impulse;
+	t_buffy *source = x->source;
+	t_buffy *dest = x->dest;
+	int *bitshuffle = x->bitshuffle;
+	float *trigland = x->trigland;	
+	long source_chan, impulse_chan, dest_chan;
+	float rescale = 0.5 / (float) N;
+    fraud = msg;
+//	t_atom newsize;
+	
+	convolver_attach_buffers( x );
+	
+	source_chan = atom_getfloatarg(0,argc,argv);
+	impulse_chan = atom_getfloatarg(1,argc,argv);
+	dest_chan = atom_getfloatarg(2,argc,argv);
+//	post("chans %d %d %d", source_chan, impulse_chan, dest_chan);
+	if( source_chan <= 0 || impulse_chan <= 0 || dest_chan <= 0){
+		error("%s: channels are counted starting from 1",OBJECT_NAME);
+		return;
+	}
+	if( source_chan > source->b_nchans ){
+		error("%s: source channel %d out of range", OBJECT_NAME, source_chan);
+		return;
+	}
+	if( impulse_chan > impulse->b_nchans ){
+		error("%s: impulse channel %d out of range", OBJECT_NAME, impulse_chan);
+		return;
+	}
+	if( dest_chan > dest->b_nchans ){
+		error("%s: dest channel %d out of range", OBJECT_NAME, dest_chan);
+		return;
+	}
+	--source_chan;
+	--impulse_chan;
+	--dest_chan;
+	inframes = source->b_frames;
+	outframes = dest->b_frames;
+	// initialization routine (move out and only do once)
+	for( N2 = 2; N2 < NCMAX; N2 *= 2){
+		if( N2 >= impulse->b_frames )
+			break;
+	}
+	N = 2 * N2;
+	// be more careful with memory
+	// also be sure to clear destination buffer
+	
+	
+	if(! x->static_memory ){
+		if ((sbuf = (float *) calloc(N+2, sizeof(float))) == NULL)
+			error("%s: insufficient memory", OBJECT_NAME);
+		if ((tbuf = (float *) calloc(N2, sizeof(float))) == NULL)
+			error("%s: insufficient memory",OBJECT_NAME);
+		if ((filt = (float *) calloc(N+2, sizeof(float))) == NULL)
+			error("%s: insufficient memory",OBJECT_NAME);
+		if( (bitshuffle = (int *) calloc(N * 2, sizeof(int))) == NULL)
+			error("%s: insufficient memory",OBJECT_NAME);
+		if( (trigland = (float *) calloc(N * 2, sizeof(float))) == NULL)
+			error("%s: insufficient memory",OBJECT_NAME);
+	}
+	
+	x->mult = 1. / (float) N;
+	x->last_N = N;
+	init_rdft( N, bitshuffle, trigland);
+	
+	
+	
+	for(i = 0, j = 0; i < impulse->b_frames; i+= impulse->b_nchans, j++){
+		filt[j] = impulse->b_samples[i + impulse_chan].w_float;
+	}
+	
+	rdft( N, 1, filt, bitshuffle, trigland );
+
+	for (i=0; i <= N; i += 2){
+		
+		a = filt[i];
+		b = filt[i + 1];
+		temp = a*a + b*b;
+		if (temp > max)
+			max = temp;
+	}
+	
+	if (max != 0.) {
+		max = gain/(sqrt(max));
+	} 
+	else {
+		error("%s: impulse response is all zeros",OBJECT_NAME);
+		return;
+	}
+	// make normalization optional
+	for (i=0; i< N+2; i++)
+		filt[i] *= max;
+	
+	ifr_cnt = ofr_cnt = 0;
+	
+	if(source->b_frames - ifr_cnt >= N2)
+		readframes = N2;
+	else readframes = source->b_frames - ifr_cnt;
+	// read desired channel from multichannel source buffer into sbuf
+	for(i = 0, j = ifr_cnt * dest->b_nchans; i < readframes; i++, ifr_cnt++, j += source->b_nchans)
+		sbuf[i] = source->b_samples[j + source_chan].w_float;
+	// zero pad source buffer
+	for (i = readframes; i<N+2; i++)
+		sbuf[i] = 0.;
+	copacetic = 1;
+
+	while( target_frames < source->b_frames + impulse->b_frames ){
+		target_frames *= 2;
+	}
+	//post("src frames + imp frames %d dest frames %d",source->b_frames + impulse->b_frames, dest->b_frames);
+
+	if( dest->b_frames < target_frames){
+		
+		
+		//SETFLOAT(&newsize, (float) target_frames);
+		// typedmess((void *) x->dest->b, gensym("sizeinsamps"),1, &newsize);
+		garray_resize(x->dest->b,(float)target_frames );
+		post("%s: destination buffer was too small and has been resized",OBJECT_NAME);
+		convolver_attach_buffers( x );
+	}
+	
+	while(copacetic && ofr_cnt < ifr_cnt + N2){
+		// post("ofr %d ifr %d, N %d",ofr_cnt, ifr_cnt, N);
+		
+		// convolve source buffer with filter buffer
+		rdft( N, 1, sbuf, bitshuffle, trigland );
+		for (i=0; i<=N2; i++) {
+			ip = 2*i;
+			ip1 = ip + 1;
+			a = sbuf[ip] * filt[ip] - sbuf[ip1] * filt[ip1];
+			b = sbuf[ip] * filt[ip1] + sbuf[ip1] * filt[ip];
+			sbuf[ip] = a;
+			sbuf[ip1] = b;
+		}
+		// inverse fft
+		
+		rdft( N, -1, sbuf, bitshuffle, trigland );
+		
+		//accumulate to output buffer
+		// denormals fix is in
+		for (i=0; i<N2; i++){
+			FIX_DENORM_FLOAT(sbuf[i]);
+			tbuf[i] += sbuf[i];
+		}
+		
+		// write to msp buffer
+		if(dest->b_frames - ofr_cnt >= N2)
+			writeframes = N2;
+		else {
+			writeframes = source->b_frames - ofr_cnt;
+			// post("cutting off with N2 %d dest frames - ofr %d", N2, dest->b_frames - ofr_cnt );
+			copacetic = 0; // reached end of dest buffer
+		}
+		//shift samples to desired channel of multichannel output buffer
+		for(i = 0, j = ofr_cnt * dest->b_nchans; i < writeframes; i++, ofr_cnt++, j += dest->b_nchans)
+			dest->b_samples[j + dest_chan].w_float = tbuf[i];
+		
+		// shift over remaining convolved samples
+		for (i=0; i<N2; i++){
+			FIX_DENORM_FLOAT(sbuf[N2 + i]);
+			tbuf[i] = sbuf[N2+i];
+		}
+		// read in next batch
+		if(source->b_frames - ifr_cnt >= N2)
+			readframes = N2;
+		else {
+			readframes = source->b_frames - ifr_cnt;
+		}
+		// arbitrary input channel read
+		for(i = 0, j = ifr_cnt * source->b_nchans; i < readframes; i++, ifr_cnt++, j += source->b_nchans)
+			sbuf[i] = source->b_samples[j + source_chan].w_float;
+		// zero pad
+		for (i = readframes; i<N+2; i++)
+			sbuf[i] = 0.;
+	}
+	// now normalize output buffer
+  	
+
+	// OK 
+//	post("first rescale: %f", rescale);
+	max = 0.0;
+	for(i = 0, j = 0; i < dest->b_frames; i++, j += dest->b_nchans){
+		if(max < fabs(dest->b_samples[j + dest_chan].w_float) )
+			max = fabs(dest->b_samples[j + dest_chan].w_float);
+	}	
+	if(max <= 0.0){
+		post("convolvesf: zero output");
+		return;
+	}
+	rescale = 1.0 / max;
+	// post("max: %f, second rescale: %f", max, rescale);
+	
+	for(i = 0, j = 0; i < dest->b_frames; i++, j+= dest->b_nchans){
+		dest->b_samples[j + dest_chan].w_float *= rescale;
+	}
+	// FAILED BY HERE
+	// post("rescale done");
+//	return;
+
+	if(! x->static_memory ){
+		free(sbuf);
+		free(tbuf);
+		free(filt);
+		free(bitshuffle);
+		free(trigland);
+		
+	}
+	outlet_bang(x->bang);
+	garray_redraw(x->dest->b);
+}
+
+void convolver_noiseimp(t_convolver *x, t_floatarg curve)
+{
+	long b_nchans;
+	long b_frames;
+	t_word *b_samples;
+	float sr = x->sr;
+	int i;
+	int count;
+//	int position;
+	float gain, guess;
+	float dur;
+	float level = 1.0, endLevel = 0.001;
+	float grow, a1, a2, b1;
+
+	if(fabs(curve) < 0.001){
+		curve = 0.001;
+	}
+	// let's be current
+	convolver_attach_buffers(x);
+	b_nchans = x->impulse->b_nchans;
+	b_frames = x->impulse->b_frames;
+	b_samples = x->impulse->b_samples;
+	// chan test
+	if( sr == 0. ){
+		error("zero sample rate");
+		return;
+	}
+	// zero out buffer
+	dur = (float) b_frames / sr;
+	count = b_frames;
+	if(b_frames < 20){
+		post("impulse buffer too small!");
+		return;
+	}
+
+	
+//	memset((char *)b_samples, 0, b_nchans * b_frames * sizeof(float));
+	// return;
+
+	level = 1.0;
+	endLevel = 0.001;
+	grow = exp(curve / (count - 1) );
+	a1 = (endLevel - level) / (1.0 - exp(curve));
+	a2 = level + a1;
+	b1 = a1;	
+	for( i = 0; i < b_frames; i++ ){
+		guess = boundrand(-1.0, 1.0);
+		gain = 1. - guess;
+
+		b1 = b1 * grow;
+		level = a2 - b1;
+		b_samples[i].w_float = level * guess;
+	}
+
+	garray_redraw(x->impulse->b);
+	outlet_bang(x->bang);
+	
+}
+
+void convolver_spikeimp(t_convolver *x, t_floatarg density)
+{
+	long b_nchans;
+	long b_frames;
+	t_word *b_samples;
+	float sr = x->sr;
+	int i, j;
+	int count;
+	int position;
+	float gain, guess;
+	float dur;
+	
+	// let's be current
+	convolver_attach_buffers(x);
+	b_nchans = x->impulse->b_nchans;
+	b_frames = x->impulse->b_frames;
+	b_samples = x->impulse->b_samples;
+	// chan test
+	if( sr == 0. ){
+		error("zero sample rate");
+		return;
+	}
+	// zero out buffer
+	dur = (float) b_frames / sr;
+	count = density * dur;
+	memset((char *)b_samples, 0, b_nchans * b_frames * sizeof(float));
+	// return;
+	for( j = 0; j < b_nchans; j++ ){
+		for( i = 0; i < count; i++ ){
+			guess = boundrand(0., 1.);
+			gain = 1. - guess;
+			gain = gain * gain;
+			if( boundrand(0.0,1.0) > 0.5 ){
+				gain = gain * -1.0; // randomly invert signs to remove DC
+			}
+			position = (int) (dur * guess * guess * sr) * b_nchans + j;
+			if( position >= b_frames * b_nchans ){
+				error("%d exceeds %d",position, b_frames * b_nchans);
+			} else{
+				b_samples[ position ].w_float = gain;
+			}
+		}
+	}
+	garray_redraw(x->impulse->b);
+	outlet_bang(x->bang);
+}
+
+float boundrand(float min, float max)
+{
+	return min + (max-min) * ((float) (rand() % RAND_MAX)/ (float) RAND_MAX);
+}
+
+
+void *convolver_new(t_symbol *msg, short argc, t_atom *argv)
+{
+
+	t_convolver *x = (t_convolver *)pd_new(convolver_class);
+    t_symbol *fraud;
+    fraud = msg;
+	x->bang = outlet_new(&x->x_obj, gensym("bang"));  
+	srand(time(0)); //need "seed" message
+	x->impulse = (t_buffy *)malloc(sizeof(t_buffy));
+	x->source = (t_buffy *)malloc(sizeof(t_buffy));
+	x->dest = (t_buffy *)malloc(sizeof(t_buffy));
+	x->static_memory = 0;
+	
+	// default names
+	x->impulse->myname = gensym("impulse_buf");
+	x->source->myname = gensym("source_buf");
+	x->dest->myname = gensym("dest_buf");
+	
+	x->last_N = -1;
+	
+	x->source->myname = atom_getsymbolarg(0,argc,argv);
+	x->impulse->myname = atom_getsymbolarg(1,argc,argv);
+	x->dest->myname = atom_getsymbolarg(2,argc,argv);
+
+	x->sr = sys_getsr();
+    return (x);
+}
+
+
+void convolver_attach_buffers(t_convolver *x) 
+{
+	convolver_setbuf(x->source);
+	convolver_setbuf(x->impulse);
+	convolver_setbuf(x->dest);
+}
+
+
+void convolver_setbuf(t_buffy *trybuf)
+{
+	t_garray *a;
+	int b_frames;
+	/* load up sample array */
+	if (!(a = (t_garray *)pd_findbyclass(trybuf->myname, garray_class))) {
+		if (*trybuf->myname->s_name) pd_error("%s: %s: no such array", OBJECT_NAME, trybuf->myname->s_name);
+	}
+	else if (!garray_getfloatwords(a, &b_frames, &trybuf->b_samples)) { // possible crash worry?
+		pd_error("%s: bad template for %s", trybuf->myname->s_name,OBJECT_NAME);
+		trybuf->b_valid = 0;
+	}
+	else  {
+		trybuf->b_frames = b_frames;
+		trybuf->b_nchans = 1; // Pd buffers are always mono (so far)
+		trybuf->b = a; // link to array
+		garray_usedindsp(a);
+	}
+}
+
+
+t_int *convolver_perform(t_int *w)
+{
+	return w + 4; // maybe we don't need this guy at all
+}
+
+void convolver_dsp_free(t_convolver *x)
+{
+	if( x->static_memory ){
+		free(x->sbuf);
+		free(x->tbuf);
+		free(x->filt);
+		free(x->bitshuffle);
+		free(x->trigland);
+		outlet_bang(x->bang);
+	}
+}
+
+/*
+void convolver_dsp(t_convolver *x, t_signal **sp, short *count)
+{
+// never actually do anything here	
+}
+*/
+
+
+// old FFT stuff, soon to be replaced
+
+
+
+
+void cfft( float *x, int NC, int forward )
+
+{
+	float 	wr,wi,
+	wpr,wpi,
+	theta,
+	scale;
+	int 		mmax,
+		ND,
+		m,
+		i,j,
+		delta;
+	
+	// void bitreverse();
+	
+    ND = NC<<1;
+    bitreverse( x, ND );
+    for ( mmax = 2; mmax < ND; mmax = delta ) {
+		delta = mmax<<1;
+		theta = TWOPI/( forward? mmax : -mmax );
+		wpr = -2.*pow( sin( 0.5*theta ), 2. );
+		wpi = sin( theta );
+		wr = 1.;
+		wi = 0.;
+		for ( m = 0; m < mmax; m += 2 ) {
+			register float rtemp, itemp;
+			for ( i = m; i < ND; i += delta ) {
+				j = i + mmax;
+				rtemp = wr*x[j] - wi*x[j+1];
+				itemp = wr*x[j+1] + wi*x[j];
+				x[j] = x[i] - rtemp;
+				x[j+1] = x[i+1] - itemp;
+				x[i] += rtemp;
+				x[i+1] += itemp;
+			}
+			wr = (rtemp = wr)*wpr - wi*wpi + wr;
+			wi = wi*wpr + rtemp*wpi + wi;
+		}
+    }
+	
+	/* scale output */
+	
+    scale = forward ? 1./ND : 2.;
+    { register float *xi=x, *xe=x+ND;
+		while ( xi < xe )
+			*xi++ *= scale;
+    }
+}
+
+/* bitreverse places float array x containing N/2 complex values
+into bit-reversed order */
+
+void bitreverse( float *x, int N )
+
+{
+	float 	rtemp,itemp;
+	int 		i,j,
+		m;
+	
+    for ( i = j = 0; i < N; i += 2, j += m ) {
+		if ( j > i ) {
+			rtemp = x[j]; itemp = x[j+1]; /* complex exchange */
+			x[j] = x[i]; x[j+1] = x[i+1];
+			x[i] = rtemp; x[i+1] = itemp;
+		}
+		for ( m = N>>1; m >= 2 && j >= m; m >>= 1 )
+			j -= m;
+    }
+}
+
+void init_rdft(int n, int *ip, float *w)
+{
+
+  int	nw,
+	nc;
+
+//  void	makewt(int nw, int *ip, float *w);
+//  void	makect(int nc, int *ip, float *c);
+
+  nw = n >> 2;
+  makewt(nw, ip, w);
+
+  nc = n >> 2;
+  makect(nc, ip, w + nw);
+
+  return;
+}
+
+
+void rdft(int n, int isgn, float *a, int *ip, float *w)
+{
+
+  int		j,
+		nw,
+		nc;
+
+  float		xi;
+
+ // void		bitrv2(int n, int *ip, float *a),
+//		cftsub(int n, float *a, float *w),
+//		rftsub(int n, float *a, int nc, float *c);
+
+    
+  nw = ip[0];
+  nc = ip[1];
+  
+  if (isgn < 0) {
+    a[1] = 0.5 * (a[1] - a[0]);
+    a[0] += a[1];
+
+    for (j = 3; j <= n - 1; j += 2) {
+      a[j] = -a[j];
+    }
+
+    if (n > 4) {
+      rftsub(n, a, nc, w + nw);
+      bitrv2(n, ip + 2, a);
+    }
+
+    cftsub(n, a, w);
+
+    for (j = 1; j <= n - 1; j += 2) {
+      a[j] = -a[j];
+    }
+  }
+
+  else {
+
+    if (n > 4) {
+      bitrv2(n, ip + 2, a);
+    }
+
+    cftsub(n, a, w);
+
+    if (n > 4) {
+      rftsub(n, a, nc, w + nw);
+    }
+
+    xi = a[0] - a[1];
+    a[0] += a[1];
+    a[1] = xi;
+  }
+}
+
+
+void bitrv2(int n, int *ip, float *a)
+{
+  int j, jj1, k, k1, l, m, m2;
+  float xr, xi;
+    
+  ip[0] = 0;
+  l = n;
+  m = 1;
+
+  while ((m << 2) < l) {
+    l >>= 1;
+    for (j = 0; j <= m - 1; j++) {
+      ip[m + j] = ip[j] + l;
+    }
+    m <<= 1;
+  }
+
+  if ((m << 2) > l) {
+
+    for (k = 1; k <= m - 1; k++) {
+
+      for (j = 0; j <= k - 1; j++) {
+	jj1 = (j << 1) + ip[k];
+	k1 = (k << 1) + ip[j];
+	xr = a[jj1];
+	xi = a[jj1 + 1];
+	a[jj1] = a[k1];
+	a[jj1 + 1] = a[k1 + 1];
+	a[k1] = xr;
+	a[k1 + 1] = xi;
+      }
+    }
+  }
+
+  else {
+    m2 = m << 1;
+
+    for (k = 1; k <= m - 1; k++) {
+
+      for (j = 0; j <= k - 1; j++) {
+	jj1 = (j << 1) + ip[k];
+	k1 = (k << 1) + ip[j];
+	xr = a[jj1];
+	xi = a[jj1 + 1];
+	a[jj1] = a[k1];
+	a[jj1 + 1] = a[k1 + 1];
+	a[k1] = xr;
+	a[k1 + 1] = xi;
+	jj1 += m2;
+	k1 += m2;
+	xr = a[jj1];
+	xi = a[jj1 + 1];
+	a[jj1] = a[k1];
+	a[jj1 + 1] = a[k1 + 1];
+	a[k1] = xr;
+	a[k1 + 1] = xi;
+      }
+    }
+  }
+}
+
+
+void cftsub(int n, float *a, float *w)
+{
+  int j, jj1, j2, j3, k, k1, ks, l, m;
+  float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
+  float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+    
+  l = 2;
+
+  while ((l << 1) < n) {
+    m = l << 2;
+
+    for (j = 0; j <= l - 2; j += 2) {
+      jj1 = j + l;
+      j2 = jj1 + l;
+      j3 = j2 + l;
+      x0r = a[j] + a[jj1];
+      x0i = a[j + 1] + a[jj1 + 1];
+      x1r = a[j] - a[jj1];
+      x1i = a[j + 1] - a[jj1 + 1];
+      x2r = a[j2] + a[j3];
+      x2i = a[j2 + 1] + a[j3 + 1];
+      x3r = a[j2] - a[j3];
+      x3i = a[j2 + 1] - a[j3 + 1];
+      a[j] = x0r + x2r;
+      a[j + 1] = x0i + x2i;
+      a[j2] = x0r - x2r;
+      a[j2 + 1] = x0i - x2i;
+      a[jj1] = x1r - x3i;
+      a[jj1 + 1] = x1i + x3r;
+      a[j3] = x1r + x3i;
+      a[j3 + 1] = x1i - x3r;
+    }
+
+    if (m < n) {
+      wk1r = w[2];
+
+      for (j = m; j <= l + m - 2; j += 2) {
+	jj1 = j + l;
+	j2 = jj1 + l;
+	j3 = j2 + l;
+	x0r = a[j] + a[jj1];
+	x0i = a[j + 1] + a[jj1 + 1];
+	x1r = a[j] - a[jj1];
+	x1i = a[j + 1] - a[jj1 + 1];
+	x2r = a[j2] + a[j3];
+	x2i = a[j2 + 1] + a[j3 + 1];
+	x3r = a[j2] - a[j3];
+	x3i = a[j2 + 1] - a[j3 + 1];
+	a[j] = x0r + x2r;
+	a[j + 1] = x0i + x2i;
+	a[j2] = x2i - x0i;
+	a[j2 + 1] = x0r - x2r;
+	x0r = x1r - x3i;
+	x0i = x1i + x3r;
+	a[jj1] = wk1r * (x0r - x0i);
+	a[jj1 + 1] = wk1r * (x0r + x0i);
+	x0r = x3i + x1r;
+	x0i = x3r - x1i;
+	a[j3] = wk1r * (x0i - x0r);
+	a[j3 + 1] = wk1r * (x0i + x0r);
+      }
+
+      k1 = 1;
+      ks = -1;
+
+      for (k = (m << 1); k <= n - m; k += m) {
+	k1++;
+	ks = -ks;
+	wk1r = w[k1 << 1];
+	wk1i = w[(k1 << 1) + 1];
+	wk2r = ks * w[k1];
+	wk2i = w[k1 + ks];
+	wk3r = wk1r - 2 * wk2i * wk1i;
+	wk3i = 2 * wk2i * wk1r - wk1i;
+
+	for (j = k; j <= l + k - 2; j += 2) {
+	  jj1 = j + l;
+	  j2 = jj1 + l;
+	  j3 = j2 + l;
+	  x0r = a[j] + a[jj1];
+	  x0i = a[j + 1] + a[jj1 + 1];
+	  x1r = a[j] - a[jj1];
+	  x1i = a[j + 1] - a[jj1 + 1];
+	  x2r = a[j2] + a[j3];
+	  x2i = a[j2 + 1] + a[j3 + 1];
+	  x3r = a[j2] - a[j3];
+	  x3i = a[j2 + 1] - a[j3 + 1];
+	  a[j] = x0r + x2r;
+	  a[j + 1] = x0i + x2i;
+	  x0r -= x2r;
+	  x0i -= x2i;
+	  a[j2] = wk2r * x0r - wk2i * x0i;
+	  a[j2 + 1] = wk2r * x0i + wk2i * x0r;
+	  x0r = x1r - x3i;
+	  x0i = x1i + x3r;
+	  a[jj1] = wk1r * x0r - wk1i * x0i;
+	  a[jj1 + 1] = wk1r * x0i + wk1i * x0r;
+	  x0r = x1r + x3i;
+	  x0i = x1i - x3r;
+	  a[j3] = wk3r * x0r - wk3i * x0i;
+	  a[j3 + 1] = wk3r * x0i + wk3i * x0r;
+	}
+      }
+    }
+
+    l = m;
+  }
+
+  if (l < n) {
+
+    for (j = 0; j <= l - 2; j += 2) {
+      jj1 = j + l;
+      x0r = a[j] - a[jj1];
+      x0i = a[j + 1] - a[jj1 + 1];
+      a[j] += a[jj1];
+      a[j + 1] += a[jj1 + 1];
+      a[jj1] = x0r;
+      a[jj1 + 1] = x0i;
+    }
+  }
+}
+
+
+void rftsub(int n, float *a, int nc, float *c)
+{
+  int j, k, kk, ks;
+  float wkr, wki, xr, xi, yr, yi;
+    
+  ks = (nc << 2) / n;
+  kk = 0;
+
+  for (k = (n >> 1) - 2; k >= 2; k -= 2) {
+    j = n - k;
+    kk += ks;
+    wkr = 0.5 - c[kk];
+    wki = c[nc - kk];
+    xr = a[k] - a[j];
+    xi = a[k + 1] + a[j + 1];
+    yr = wkr * xr - wki * xi;
+    yi = wkr * xi + wki * xr;
+    a[k] -= yr;
+    a[k + 1] -= yi;
+    a[j] += yr;
+    a[j + 1] -= yi;
+  }
+}
+
+
+void makewt(int nw, int *ip, float *w)
+{
+//    void bitrv2(int n, int *ip, float *a);
+    int nwh, j;
+    float delta, x, y;
+    
+    ip[0] = nw;
+    ip[1] = 1;
+    if (nw > 2) {
+        nwh = nw >> 1;
+        delta = atan(1.0) / nwh;
+        w[0] = 1;
+        w[1] = 0;
+        w[nwh] = cos(delta * nwh);
+        w[nwh + 1] = w[nwh];
+        for (j = 2; j <= nwh - 2; j += 2) {
+            x = cos(delta * j);
+            y = sin(delta * j);
+            w[j] = x;
+            w[j + 1] = y;
+            w[nw - j] = y;
+            w[nw - j + 1] = x;
+        }
+        bitrv2(nw, ip + 2, w);
+    }
+}
+
+
+void makect(int nc, int *ip, float *c)
+{
+    int nch, j;
+    float delta;
+    
+    ip[1] = nc;
+    if (nc > 1) {
+        nch = nc >> 1;
+        delta = atan(1.0) / nch;
+        c[0] = 0.5;
+        c[nch] = 0.5 * cos(delta * nch);
+        for (j = 1; j <= nch - 1; j++) {
+            c[j] = 0.5 * cos(delta * j);
+            c[nc - j] = 0.5 * sin(delta * j);
+        }
+    }
+}
+
diff --git a/externals/lyonpotpourri/counter~-help.pd b/externals/lyonpotpourri/counter~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..3cd4e7de03fccb6ce85bf63ad7753c20513dd897
--- /dev/null
+++ b/externals/lyonpotpourri/counter~-help.pd
@@ -0,0 +1,32 @@
+#N canvas 617 472 355 264 10;
+#X obj 32 143 counter~ 1 10;
+#X obj 32 169 click2float~;
+#X floatatom 32 204 5 0 0 0 - - -, f 5;
+#X obj 23 13 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 26 49 counter~ - click-driven counter;
+#X obj 32 81 samm~ 60 2;
+#N canvas 539 566 450 300 messages 0;
+#X obj 86 215 s counter.msgs;
+#X msg 87 118 minmax 20 30;
+#X msg 217 120 direction \$1;
+#X msg 218 58 1;
+#X msg 262 84 -1;
+#X text 248 58 forward;
+#X text 291 83 backward;
+#X msg 191 174 setnext 25;
+#X text 76 99 reset boundaries;
+#X text 269 174 set next value;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 2 0;
+#X connect 4 0 2 0;
+#X connect 7 0 0 0;
+#X restore 149 177 pd messages;
+#X obj 40 114 r counter.msgs;
+#X text 155 136 args: minimum \, maximum;
+#X text 234 178 <- more here;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 5 0 0 0;
+#X connect 7 0 0 0;
diff --git a/externals/lyonpotpourri/counter~.c b/externals/lyonpotpourri/counter~.c
new file mode 100755
index 0000000000000000000000000000000000000000..2c529b4309de0fc9284b91d004789863a5add578
--- /dev/null
+++ b/externals/lyonpotpourri/counter~.c
@@ -0,0 +1,127 @@
+#include "MSPd.h"
+
+static t_class *counter_class;
+
+#define OBJECT_NAME "counter~"
+
+#define COUNTER_UP (1)
+#define COUNTER_DOWN (-1)
+
+typedef struct _counter
+{
+	t_object x_obj;
+	float x_f;
+	long current;
+	long min;
+	long max;
+	short direction;	
+} t_counter;
+
+static void *counter_new(t_symbol *s, int argc, t_atom *argv);
+static t_int *counter_perform(t_int *w);
+static void counter_dsp(t_counter *x, t_signal **sp);
+static void counter_setnext(t_counter *x, t_floatarg val);
+static void counter_direction(t_counter *x, t_floatarg d);
+static void counter_minmax(t_counter *x, t_floatarg min, t_floatarg max);
+static void counter_version(t_counter *x);
+
+void counter_tilde_setup(void)
+{
+    t_class *c;
+	c = class_new(gensym("counter~"), (t_newmethod)counter_new,0,sizeof(t_counter), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_counter, x_f);
+    class_addmethod(c, (t_method)counter_minmax,gensym("minmax"),A_FLOAT,A_FLOAT,0);
+    class_addmethod(c, (t_method)counter_direction,gensym("direction"),A_FLOAT,0);
+    class_addmethod(c, (t_method)counter_setnext,gensym("setnext"),A_FLOAT,0);
+	class_addmethod(c, (t_method)counter_dsp, gensym("dsp"), 0);
+    counter_class = c;
+	potpourri_announce(OBJECT_NAME);
+}
+
+static void counter_setnext(t_counter *x, t_floatarg val)
+{
+	if( val < x->min || val > x->max)
+		return;
+	x->current = (long) val;
+}
+
+static void counter_direction(t_counter *x, t_floatarg d)
+{
+	if( (d != COUNTER_UP) && (d != COUNTER_DOWN) )
+		return;
+	x->direction = (short) d;
+}
+
+static void counter_minmax(t_counter *x, t_floatarg min, t_floatarg max)
+{
+	if(min < 1){
+		return;
+	}
+	if(min >= max){
+		return;
+	}
+	x->min = min;
+	x->max = max;
+}
+
+static void *counter_new(t_symbol *s, int argc, t_atom *argv)
+{
+    float farg;
+    t_symbol *fraud;
+	t_counter *x = (t_counter *)pd_new(counter_class);
+    fraud = s;
+	outlet_new(&x->x_obj, gensym("signal"));
+	x->direction = COUNTER_UP;
+    farg = 1.0;
+	atom_arg_getfloat(&farg,0,argc,argv);
+    x->min = farg;
+    farg = 10.0;
+	atom_arg_getfloat(&farg,1,argc,argv);
+    x->max = farg;
+	if(x->min <= 1)
+		x->min = 1;
+	if(x->max <= x->min)
+		x->max = 10;
+
+	return x;
+}
+
+static t_int *counter_perform(t_int *w)
+{
+	t_counter *x = (t_counter *) (w[1]);
+	t_float *in_vec = (t_float *)(w[2]);
+	t_float *out_vec = (t_float *)(w[3]);
+	int n = (int) w[4];
+	
+	int i;
+	long min = x->min;
+	long max = x->max;
+	long current = x->current;
+	short direction = x->direction;
+	
+	for(i = 0; i < n; i++){
+		if(in_vec[i]){
+			out_vec[i] = current;
+			current = current + direction;
+			if( direction == COUNTER_UP ){
+				if( current > max ){
+					current = min; 
+				}
+			} else if( direction == COUNTER_DOWN ){
+				if( current < min ){
+					current = max;
+				}
+			}
+		} else {
+			out_vec[i] = 0.0;
+		}
+	}
+	
+	x->current = current;
+	return w + 5;
+}		
+
+static void counter_dsp(t_counter *x, t_signal **sp)
+{
+    dsp_add(counter_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
+}
diff --git a/externals/lyonpotpourri/distortion~-help.pd b/externals/lyonpotpourri/distortion~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..f5df2901afae1744c917eb73687265446b03ad5e
--- /dev/null
+++ b/externals/lyonpotpourri/distortion~-help.pd
@@ -0,0 +1,41 @@
+#N canvas 178 231 501 301 10;
+#X obj 30 154 distortion~;
+#X floatatom 66 131 5 0 0 0 - knee -, f 5;
+#X floatatom 102 117 5 0 0 0 - cut -, f 5;
+#X obj 30 112 osc~ 270;
+#X floatatom 30 90 5 0 0 0 - - -, f 5;
+#X obj 30 224 *~ 0.1;
+#X obj 30 252 dac~;
+#X msg 156 139 \; pd dsp \$1;
+#X obj 156 118 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 158 184 hsl 128 15 0.001 0.4 0 0 knee knee-input knee -2 -6
+0 8 -259157 -1 -1 1560 1;
+#X obj 157 216 hsl 128 15 0.01 1 0 0 cut cut-input cut -2 -6 0 8 -259157
+-1 -1 1796 1;
+#X obj 30 191 lop~ 8000;
+#N canvas 0 22 180 162 initialize 0;
+#X obj 2 23 loadbang;
+#X msg 58 64 0.15;
+#X msg 3 58 0.05;
+#X obj 3 108 s knee-input;
+#X obj 34 89 s cut-input;
+#X connect 0 0 1 0;
+#X connect 0 0 2 0;
+#X connect 1 0 4 0;
+#X connect 2 0 3 0;
+#X restore 154 246 pd initialize;
+#X obj 23 13 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 25 49 distortion~ uses an internal transfer function to shape
+the wave. "knee" is where the transfer function starts to bend and
+"cut" is the clipping point., f 79;
+#X connect 0 0 11 0;
+#X connect 1 0 0 1;
+#X connect 2 0 0 2;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
+#X connect 5 0 6 0;
+#X connect 5 0 6 1;
+#X connect 8 0 7 0;
+#X connect 11 0 5 0;
diff --git a/externals/lyonpotpourri/distortion~.c b/externals/lyonpotpourri/distortion~.c
new file mode 100755
index 0000000000000000000000000000000000000000..498989740ffb316b66d4b0a6f30750565a520191
--- /dev/null
+++ b/externals/lyonpotpourri/distortion~.c
@@ -0,0 +1,226 @@
+#include "MSPd.h"
+
+
+static t_class *distortion_class;
+
+
+#define OBJECT_NAME "distortion~"
+
+typedef struct _distortion
+{
+    
+    t_object x_obj;
+    float x_f;
+	float knee;
+	float cut;
+	float rescale ;
+	short mute ;
+	short case1;
+} t_distortion;
+
+void *distortion_new(t_floatarg knee, t_floatarg cut);
+t_int *distortion1_perform(t_int *w);
+t_int *distortion2_perform(t_int *w);
+t_int *distortion3_perform(t_int *w);
+void distortion_dsp(t_distortion *x, t_signal **sp);
+void distortion_float(t_distortion *x, double f);
+void distortion_mute(t_distortion *x, t_floatarg f);
+
+
+// no freeing function needed
+
+void distortion_tilde_setup(void){
+    distortion_class = class_new(gensym("distortion~"), (t_newmethod)distortion_new,
+                                 0,sizeof(t_distortion), 0,A_DEFFLOAT,A_DEFFLOAT,0);
+    CLASS_MAINSIGNALIN(distortion_class, t_distortion, x_f);
+    class_addmethod(distortion_class,(t_method)distortion_dsp,gensym("dsp"),0);
+    class_addmethod(distortion_class,(t_method)distortion_mute,gensym("mute"),A_FLOAT,0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+void *distortion_new(t_floatarg knee, t_floatarg cut)
+{
+
+    t_distortion *x = (t_distortion *)pd_new(distortion_class);
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+	if( knee >= cut || knee <= 0 || cut <= 0 ) {
+		// post("setting defaults");
+		x->knee = .1;
+		x->cut = .3 ;
+	} else {
+		x->knee = knee;
+		x->cut = cut;
+		// post("User defined values: knee %f cut %f", knee, cut);
+        
+	}
+	x->rescale = 1.0 / x->cut ;
+	x->mute = 0;
+    return x;
+}
+
+
+// use when neither signal is connected
+
+t_int *distortion1_perform(t_int *w)
+{
+    
+	float rectified_sample, in_sample;
+    
+	t_distortion *x = (t_distortion *) (w[1]);
+	float *in = (t_float *)(w[2]);
+	float *out = (t_float *)(w[5]);
+	int n = (int)(w[6]);
+	
+	float knee = x->knee;
+	float cut = x->cut;
+	float rescale = x->rescale;
+    
+	
+	if( x->mute ){
+		while( n-- ){
+			*out++ = 0;
+		}
+		return (w+7);
+	}
+	
+	while (n--) {
+		in_sample = *in++;
+		rectified_sample = fabs( in_sample );
+		if( rectified_sample < knee ){
+			*out++ = in_sample;
+		} else {
+			if( in_sample > 0.0 ){
+				*out++ = rescale * (knee + (rectified_sample - knee) * (cut - knee));
+			} else {
+				*out++ = rescale * (-(knee + (rectified_sample - knee) * (cut - knee)));
+			}
+		}
+        
+	}
+	return (w+7);
+}
+
+// use when both signals are connected
+
+t_int *distortion2_perform(t_int *w)
+{
+    
+	float rectified_sample, in_sample;
+    
+	t_distortion *x = (t_distortion *) (w[1]);
+	float *in = (t_float *)(w[2]);
+	float *data1 = (t_float *)(w[3]);
+	float *data2 = (t_float *)(w[4]);
+	float *out = (t_float *)(w[5]);
+	int n = (int)(w[6]);
+    //	double fabs();
+    
+	float knee = x->knee;
+	float cut = x->cut;
+	float rescale = x->rescale;
+    
+	
+	if( x->mute ){
+		while( n-- ){
+			*out++ = 0;
+		}
+		return (w+7);
+	}
+	
+	while (n--) {
+		in_sample = *in++;
+		knee = *data1++;
+		cut = *data2++;
+		if( cut > 0.000001 )
+			rescale = 1.0 / cut;
+		else
+			rescale = 1.0;
+		
+		rectified_sample = fabs( in_sample );
+		if( rectified_sample < knee ){
+			*out++ = in_sample;
+		} else {
+			if( in_sample > 0.0 ){
+				*out++ = rescale * (knee + (rectified_sample - knee) * (cut - knee));
+			} else {
+				*out++ = rescale * (-(knee + (rectified_sample - knee) * (cut - knee)));
+			}
+		}
+        
+	}
+	x->knee = knee;
+	x->cut = cut;
+	x->rescale = rescale;
+	return (w+7);
+}
+
+t_int *distortion3_perform(t_int *w)
+{
+    
+	float rectified_sample, in_sample;
+    
+	t_distortion *x = (t_distortion *) (w[1]);
+	float *in = (t_float *)(w[2]);
+	float *data1 = (t_float *)(w[3]);
+	float *data2 = (t_float *)(w[4]);
+	float *out = (t_float *)(w[5]);
+	int n = (int)(w[6]);
+    //	double fabs();
+    
+	float knee = x->knee;
+	float cut = x->cut;
+	float rescale = x->rescale;
+	short case1 = x->case1;
+	
+	if( x->mute ){
+		while( n-- ){
+			*out++ = 0;
+		}
+		return (w+7);
+	}
+	
+	while (n--) {
+        // first case, knee is connected, otherwise cut is connected
+		in_sample = *in++;
+		if( case1 ){
+			knee = *data1++;
+		}
+		else {
+			cut = *data2++;
+		}
+		if( cut > 0.000001 )
+			rescale = 1.0 / cut;
+		else
+			rescale = 1.0;
+		
+		rectified_sample = fabs( in_sample );
+		if( rectified_sample < knee ){
+			*out++ = in_sample;
+		} else {
+			if( in_sample > 0.0 ){
+				*out++ = rescale * (knee + (rectified_sample - knee) * (cut - knee));
+			} else {
+				*out++ = rescale * (-(knee + (rectified_sample - knee) * (cut - knee)));
+			}
+		}
+        
+	}
+	x->knee = knee;
+	x->cut = cut;
+	x->rescale = rescale;
+	return (w+7);
+}
+void distortion_mute(t_distortion *x, t_floatarg f) {
+	x->mute = f;
+}
+
+
+void distortion_dsp(t_distortion *x, t_signal **sp)
+{
+
+	dsp_add(distortion2_perform, 6, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec,sp[0]->s_n);
+
+}
+
diff --git a/externals/lyonpotpourri/dmach~-help.pd b/externals/lyonpotpourri/dmach~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7f7f4bb25dd01218636f1aee7908e8b9e1c10e89
--- /dev/null
+++ b/externals/lyonpotpourri/dmach~-help.pd
@@ -0,0 +1,1304 @@
+#N canvas 103 332 573 397 10;
+#X obj 194 182 click2bang~;
+#X obj 194 205 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 24 253 *~ 0.05;
+#X obj 24 282 dac~;
+#X obj 24 85 r dmach-msgs;
+#N canvas 476 235 592 383 operation 0;
+#X obj 29 285 s dmach-msgs;
+#X msg 69 40 arm 1;
+#X msg 89 70 mute 0;
+#X msg 28 15 show 1;
+#X msg 115 149 tempo \$1;
+#X floatatom 115 128 5 0 0 0 - - -, f 5;
+#X msg 115 106 60;
+#X msg 155 105 134;
+#X text 171 130 change the tempo;
+#X text 114 39 prepare to play ptn 1;
+#X text 137 67 now play it;
+#X text 78 18 show sequence data;
+#X msg 105 257 instant_recall \$1;
+#X obj 106 233 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X text 125 206 by default patterns are recalled in rhythm at the end
+of the last pattern. Setting instant_recall to 1 means you can instantly
+loop or play a sequence.;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 4 0;
+#X connect 6 0 5 0;
+#X connect 7 0 5 0;
+#X connect 12 0 0 0;
+#X connect 13 0 12 0;
+#X restore 386 153 pd operation;
+#X obj 66 234 hsl 60 12 0 0.25 0 0 empty empty gain -2 -8 1 12 -228928
+-1 -1 0 1;
+#X obj 144 259 s bassgain;
+#X obj 277 182 s raw-dmach-data;
+#N canvas 569 435 578 329 saved-patterns 0;
+#X obj 63 37 r raw-dmach-data;
+#X msg 130 105 listraw;
+#X obj 131 141 s dmach-msgs;
+#N canvas 0 22 466 316 saved 0;
+#X msg 10 54 readraw 0 4 0 4 1 1 0 1 0.8 1.49998 1 1 1.99997 1 0.8
+3.49995 1 7 1 1 0 0.7 1 0.499993 1 0.8333 0.999986 1 1.111 1.74995
+1 1.111 2.49997 1 1.333 2.99996 0.666 1.653 3.49995 2 9 1 1 0.499993
+0.7 1 0.749964 1 1 1.49998 0.7 1 1.74995 1 1 2.49997 0.7 1 2.74999
+0.5 1 3.24998 1 1 3.49995 0.7 1 3.74997 3 2 1 1 0.999986 1 1 2.99996
+5 4 1 1.05 0 1 1.05 0.999986 1 1 1.99997 1 0.9 2.99996;
+#X obj 10 148 s dmach-msgs;
+#X connect 0 0 1 0;
+#X restore 356 50 pd saved;
+#X obj 63 72 print;
+#X text 196 107 report current pattern to list outlet;
+#X text 67 208 The resulting readraw message will load the entire pattern.
+if you have a prepend you could send this data directly into a list.
+Otherwise cut and paste from the Pd window.;
+#X connect 0 0 4 0;
+#X connect 1 0 2 0;
+#X restore 386 207 pd saved-patterns;
+#X obj 147 234 hsl 64 12 0 2 0 0 empty s_bassgain empty -2 -8 0 10
+-261756 -1 -1 3150 1;
+#X obj 24 112 dmach~ 134 9, f 35;
+#N canvas 16 184 1268 473 playback 0;
+#X obj 9 52 inlet~;
+#X obj 75 52 inlet~;
+#X obj 143 52 inlet~;
+#X obj 209 52 inlet~;
+#X obj 273 52 inlet~;
+#X obj 339 52 inlet~;
+#X obj 404 52 inlet~;
+#X obj 470 52 inlet~;
+#X obj 537 52 inlet~;
+#X obj 603 52 inlet~;
+#X obj 10 122 player~ dmach1;
+#X obj 43 145 player~ dmach2;
+#X obj 56 168 player~ dmach3;
+#X obj 81 195 player~ dmach4;
+#X obj 117 381 outlet~;
+#N canvas 509 23 498 587 bass-synth 0;
+#X obj 396 334 adsr~;
+#X obj 304 369 *~;
+#X obj 127 544 outlet~;
+#X obj 117 18 inlet~;
+#X obj 183 20 inlet~;
+#X obj 128 513 *~ 0;
+#X floatatom 347 387 5 0 0 0 - - -, f 5;
+#X obj 285 198 +~ 1400;
+#X obj 285 177 *~ 1000;
+#X obj 284 156 osc~ 0.25;
+#X obj 278 422 vcf~ 4;
+#X obj 349 422 r bassgain;
+#X floatatom 350 445 5 0 0 0 - - -, f 5;
+#X obj 247 334 distortion~ 0.1 0.2;
+#X floatatom 311 285 5 0 0 0 - - -, f 5;
+#X floatatom 375 285 5 0 0 0 - - -, f 5;
+#X obj 52 131 oscil~ 440 8192 square 4;
+#X obj 237 131 oscil~ 440 8192 buzz 16;
+#X obj 358 49 osc~ 5;
+#X obj 346 80 *~ 0.005;
+#X obj 305 95 +~;
+#X obj 285 61 sig~ 1;
+#X obj 56 76 *~;
+#N canvas 0 22 462 312 init 0;
+#X obj 97 195 outlet;
+#X obj 106 221 outlet;
+#X obj 158 231 outlet;
+#X obj 137 137 unpack f f;
+#X obj 149 29 loadbang;
+#X msg 83 147 4;
+#X msg 149 109 0.025 0.05;
+#X msg 205 194 10 30 600 100;
+#X obj 209 235 outlet;
+#X connect 3 0 1 0;
+#X connect 3 1 2 0;
+#X connect 4 0 6 0;
+#X connect 4 0 5 0;
+#X connect 4 0 7 0;
+#X connect 5 0 0 0;
+#X connect 6 0 3 0;
+#X connect 7 0 8 0;
+#X restore 352 247 pd init;
+#X obj 230 60 *~ 0.5;
+#X obj 118 462 distortion~;
+#X floatatom 90 378 5 0 0 0 - - -, f 5;
+#X floatatom 154 378 5 0 0 0 - - -, f 5;
+#N canvas 0 22 466 316 init 0;
+#X obj 106 221 outlet;
+#X obj 158 231 outlet;
+#X obj 137 137 unpack f f;
+#X obj 149 29 loadbang;
+#X msg 149 109 0.1 0.3;
+#X connect 2 0 0 0;
+#X connect 2 1 1 0;
+#X connect 3 0 4 0;
+#X connect 4 0 2 0;
+#X restore 131 340 pd init;
+#X obj 121 483 lop~ 3000;
+#X floatatom 227 474 5 0 0 0 - - -, f 5;
+#X obj 24 448 osc~;
+#X obj 94 313 *~ 0.5;
+#X msg 150 293 0.666;
+#X obj 27 482 *~ 0.2;
+#X msg 103 262 0.5;
+#X msg 144 261 0.25;
+#X obj 316 499 loadbang;
+#X msg 316 520 1;
+#X obj 315 544 s s_bassgain;
+#X connect 0 0 1 1;
+#X connect 1 0 10 0;
+#X connect 3 0 0 0;
+#X connect 4 0 22 0;
+#X connect 4 0 24 0;
+#X connect 5 0 2 0;
+#X connect 6 0 10 2;
+#X connect 7 0 10 1;
+#X connect 8 0 7 0;
+#X connect 9 0 8 0;
+#X connect 10 0 25 0;
+#X connect 11 0 12 0;
+#X connect 12 0 5 1;
+#X connect 13 0 1 0;
+#X connect 14 0 13 1;
+#X connect 15 0 13 2;
+#X connect 16 0 13 0;
+#X connect 17 0 13 0;
+#X connect 18 0 19 0;
+#X connect 19 0 20 1;
+#X connect 20 0 22 1;
+#X connect 21 0 20 0;
+#X connect 22 0 16 0;
+#X connect 22 0 32 0;
+#X connect 23 0 6 0;
+#X connect 23 1 14 0;
+#X connect 23 2 15 0;
+#X connect 23 3 0 0;
+#X connect 24 0 17 0;
+#X connect 25 0 29 0;
+#X connect 26 0 25 1;
+#X connect 27 0 25 2;
+#X connect 28 0 26 0;
+#X connect 28 1 27 0;
+#X connect 29 0 5 0;
+#X connect 30 0 29 1;
+#X connect 31 0 34 0;
+#X connect 32 0 31 0;
+#X connect 33 0 32 1;
+#X connect 34 0 5 0;
+#X connect 35 0 32 1;
+#X connect 36 0 32 1;
+#X connect 37 0 38 0;
+#X connect 38 0 39 0;
+#X restore 238 224 pd bass-synth;
+#N canvas 215 196 532 615 load-waveforms 0;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array dmach1 21988 float 2;
+#X coords 0 1 21988 -1 30 20 1;
+#X restore 100 20 graph;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array dmach2 25652 float 2;
+#X coords 0 1 25652 -1 30 20 1;
+#X restore 100 60 graph;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array dmach3 11171 float 2;
+#X coords 0 1 11171 -1 30 20 1;
+#X restore 181 20 graph;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array dmach4 9284 float 2;
+#X coords 0 1 9284 -1 30 20 1;
+#X restore 181 60 graph;
+#X obj 18 408 soundfiler;
+#X obj 14 77 loadbang;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array dmach5 42964 float 2;
+#X coords 0 1 42964 -1 30 20 1;
+#X restore 252 22 graph;
+#X obj 14 103 t b b b b b b b b;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array dmach6 44614 float 2;
+#X coords 0 1 44614 -1 30 20 1;
+#X restore 253 61 graph;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array dmach7 9097 float 2;
+#X coords 0 1 9097 -1 30 20 1;
+#X restore 317 23 graph;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array dmach8 10741 float 2;
+#X coords 0 1 10741 -1 30 20 1;
+#X restore 319 59 graph;
+#X obj 32 50 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 165 137 read -resize sound/BT0AADA.aiff dmach1;
+#X msg 196 156 read -resize sound/trickhit.aif dmach2;
+#X msg 229 176 read -resize sound/hi_o_15g.aiff dmach3;
+#X msg 240 202 read -resize sound/KR55SNAR.aiff dmach4;
+#X msg 255 240 read -resize sound/soda-bd.aif dmach5;
+#X msg 267 282 read -resize sound/BD0010.aif dmach6;
+#X msg 257 338 read -resize sound/hi_c_12b.aiff dmach7;
+#X msg 262 358 read -resize sound/CP.aif dmach8;
+#X connect 5 0 7 0;
+#X connect 7 0 12 0;
+#X connect 7 1 13 0;
+#X connect 7 2 14 0;
+#X connect 7 3 15 0;
+#X connect 7 4 16 0;
+#X connect 7 5 17 0;
+#X connect 7 6 18 0;
+#X connect 7 7 19 0;
+#X connect 11 0 7 0;
+#X connect 12 0 4 0;
+#X connect 13 0 4 0;
+#X connect 14 0 4 0;
+#X connect 15 0 4 0;
+#X connect 16 0 4 0;
+#X connect 17 0 4 0;
+#X connect 18 0 4 0;
+#X connect 19 0 4 0;
+#X restore 940 21 pd load-waveforms;
+#X msg 113 18 static_increment 1;
+#X obj 113 -2 loadbang;
+#X obj 694 51 inlet~;
+#X obj 760 51 inlet~;
+#X obj 826 51 inlet~;
+#X obj 892 51 inlet~;
+#X obj 959 50 inlet~;
+#X obj 1025 50 inlet~;
+#X obj 363 240 player~ dmach5;
+#X obj 1085 49 inlet~;
+#X obj 1151 49 inlet~;
+#X obj 462 264 player~ dmach6;
+#X obj 573 264 player~ dmach7;
+#X obj 681 266 player~ dmach8;
+#X obj 890 282 snapshot~;
+#X obj 1008 253 metro 150;
+#X msg 1029 222 1;
+#X floatatom 905 313 5 0 0 0 - - -, f 5;
+#N canvas 172 230 208 286 assignments 0;
+#X text 41 123 4 bassline;
+#X text 41 25 0 bassdrum;
+#X text 41 48 1 trick hit;
+#X text 41 73 2 open hihat;
+#X text 41 98 3 snare drum;
+#X text 41 148 5 soda bd;
+#X text 41 173 6 808 bd;
+#X text 41 198 7 closed hihat;
+#X text 41 223 8 claps;
+#X restore 471 407 pd assignments;
+#X connect 0 0 10 0;
+#X connect 1 0 10 1;
+#X connect 2 0 11 0;
+#X connect 3 0 11 1;
+#X connect 4 0 12 0;
+#X connect 5 0 12 1;
+#X connect 6 0 13 0;
+#X connect 7 0 13 1;
+#X connect 8 0 15 0;
+#X connect 9 0 15 1;
+#X connect 10 0 14 0;
+#X connect 11 0 14 0;
+#X connect 12 0 14 0;
+#X connect 13 0 14 0;
+#X connect 15 0 14 0;
+#X connect 17 0 10 0;
+#X connect 17 0 11 0;
+#X connect 17 0 12 0;
+#X connect 17 0 13 0;
+#X connect 17 0 25 0;
+#X connect 17 0 28 0;
+#X connect 17 0 29 0;
+#X connect 17 0 30 0;
+#X connect 18 0 17 0;
+#X connect 19 0 25 0;
+#X connect 20 0 25 1;
+#X connect 21 0 28 0;
+#X connect 22 0 28 1;
+#X connect 23 0 29 0;
+#X connect 24 0 29 1;
+#X connect 25 0 14 0;
+#X connect 26 0 30 0;
+#X connect 27 0 30 1;
+#X connect 27 0 31 0;
+#X connect 28 0 14 0;
+#X connect 29 0 14 0;
+#X connect 30 0 14 0;
+#X connect 31 0 34 0;
+#X connect 32 0 31 0;
+#X connect 33 0 32 0;
+#X restore 24 182 pd playback, f 26;
+#N canvas 515 23 653 793 pattern-tutorial 0;
+#X text 31 19 You can build up patterns 1 line at a time. Here's how.
+;
+#X text 16 62 1 make sure the sequencer is off;
+#X obj 31 116 s dmach-msgs;
+#X msg 32 91 nosequence;
+#X text 21 149 2 Define the bar. First number is the bar number. Second
+number is the quarternote count. 4 would be 4/4. 3 would be 3/4. 3.5
+would be 7/8. Since you can use any fraction you like there is considerable
+time flexibility.;
+#X msg 26 213 store 5 4;
+#X text 103 215 put a 4/4 into bar number 5;
+#X obj 26 241 s dmach-msgs;
+#X text 27 285 3 Write your bass drum part - 4 on the floor in this
+case.;
+#X msg 34 324 slotamps 5 6 4 1 0.7 0.7 0.7;
+#X obj 34 349 s dmach-msgs;
+#X obj 38 496 s dmach-msgs;
+#X msg 38 471 slotamps 5 3 8 0 0 1 0 0 0 0 1;
+#X obj 38 598 s dmach-msgs;
+#X msg 38 564 slotamps 5 7 16 1 0.5 0.7 0 1 0.5 0.7 0 1 0.5 0.7 0.9
+1 0 0.7 0.7;
+#X obj 42 690 s dmach-msgs;
+#X text 38 629 6 Now we'll add a line with pitch variation. First we
+write the rhythm.;
+#X text 44 721 Here's the interval pattern:;
+#X obj 38 786 s dmach-msgs;
+#X text 132 783 after the bar number and slot \, we give one transposition
+value for each attack;
+#X obj 40 903 s dmach-msgs;
+#X msg 40 878 slotamps 5 2 10 1 0.7 0.7 0.7 0.7 1 0.7 0.7 1 0.7;
+#X msg 38 761 slotincrs 5 1 0.8333 1 0.8333 1.25 1 1.11;
+#X msg 42 665 slotamps 5 1 8 1 0 1 0.7 0 1 1 0.7;
+#X text 42 933 8 We'll emphasize the pattern with transposition;
+#X obj 45 982 s dmach-msgs;
+#X obj 49 1061 s dmach-msgs;
+#X msg 49 1036 slotamps 5 8 8 0 0 1 0 0 1 0 0.8;
+#X obj 50 1195 s dmach-msgs;
+#X msg 49 1142 slotincrs 5 4 150 133 125 133;
+#X msg 269 1143 slotamps 5 4 4 1 1 1 1;
+#X obj 220 1115 t b b;
+#X obj 221 1089 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 36 444 4 Now let's add a snare part.;
+#X text 35 378 The arguments are: bar number \, slot number (in this
+patch slot 6 is driving a bass drum) \, bar subdivision (this must
+be an integer) and an attack pattern with numbers corresponding to
+amplitude (zero of course is a rest).;
+#X text 38 847 7 Let's add some quintuplet cymbals.;
+#X text 43 1005 9 A couple claps.;
+#X text 45 1089 10 Finally a bass line.;
+#X text 164 1186 Note the order of messaging. A slotamps message sets
+all its increments to 1 so the slotincrs message must come after it.
+;
+#X text 36 528 5 Add the hihat fill.;
+#X msg 44 957 slotincrs 5 2 1.1 0.8 0.8 0.8 0.8 1 0.8 0.8 1.2 0.8;
+#X text 47 1252 If you want to effect more complex subdivisions of
+the bar \, read my paper for instructions on how to do that.;
+#X connect 3 0 2 0;
+#X connect 5 0 7 0;
+#X connect 9 0 10 0;
+#X connect 12 0 11 0;
+#X connect 14 0 13 0;
+#X connect 21 0 20 0;
+#X connect 22 0 18 0;
+#X connect 23 0 15 0;
+#X connect 27 0 26 0;
+#X connect 29 0 28 0;
+#X connect 30 0 28 0;
+#X connect 31 0 29 0;
+#X connect 31 1 30 0;
+#X connect 32 0 31 0;
+#X connect 40 0 25 0;
+#X restore 386 235 pd pattern-tutorial;
+#X text 215 205 pattern downbeat;
+#N canvas 0 22 677 332 playback 0;
+#X obj 10 285 s dmach-msgs;
+#X msg 218 97 recall \$1;
+#X msg 219 41 0;
+#X msg 256 41 1;
+#X msg 300 97 nosequence;
+#X msg 299 41 2;
+#X msg 335 41 3;
+#X msg 373 41 4;
+#X msg 195 193 loopsequence 0 0 0 1 0 0 1 1 2 2 2 2 3 0 0 0 0 3 3 4
+2 2 3 4 4 4 1 4 3 3 3;
+#X obj 195 148 loadbang;
+#X msg 11 203 playsequence 3 4 3 4;
+#X text 11 175 play one time only;
+#X text 337 73 select a stored pattern;
+#X text 283 170 loop a pattern sequence;
+#X obj 217 122 s dmach-msgs;
+#X obj 218 73 t f b;
+#X text 170 252 another sequence;
+#X text 378 98 this turns off sequencer mode;
+#X msg 152 267 loopsequence 1 1 1 3 1 1 4 6 4 6 6 3 4 1 1 1 6 6 6 6
+6 6 6 6 6;
+#X obj 195 169 delay 100;
+#X msg 406 41 5;
+#X msg 439 41 6;
+#X connect 1 0 14 0;
+#X connect 2 0 15 0;
+#X connect 3 0 15 0;
+#X connect 4 0 14 0;
+#X connect 5 0 15 0;
+#X connect 6 0 15 0;
+#X connect 7 0 15 0;
+#X connect 8 0 0 0;
+#X connect 9 0 19 0;
+#X connect 10 0 0 0;
+#X connect 15 0 1 0;
+#X connect 15 1 4 0;
+#X connect 18 0 0 0;
+#X connect 19 0 8 0;
+#X connect 20 0 15 0;
+#X connect 21 0 15 0;
+#X restore 386 99 pd playback;
+#N canvas 180 306 425 213 stored-patterns 0;
+#X msg 264 79 printraw 0;
+#X msg 142 78 listraw 0;
+#N canvas 0 22 1033 649 pat0 0;
+#X obj 92 588 s dmach-msgs;
+#X msg 210 111 store 0 4;
+#X msg 15 188 slotamps 0 0 8 1 0 0 1 1 0 0 1;
+#X msg 14 164 slotincrs 0 0 1 0.8 1 0.8;
+#X msg 268 151 slotamps 0 2 16 0 0 1 0.7 0 0 1 0.7 0 0 1 0.7 0 0.5
+1 0.7;
+#X msg 252 211 slotamps 0 3 4 0 1 0 1;
+#X obj 15 142 t b b;
+#X obj 86 54 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 339 289 t b b;
+#X msg 341 344 slotamps 0 1 16 1 0 0.7 0 1 0 0 1 0 0 1 0 1 0 0.666
+;
+#X msg 339 325 slotincrs 0 1 1 1 0.8333 1.111 1.111 1.333 1.653;
+#X msg 238 454 slotamps 0 4 8 1 0 0 1 1 0 0 1;
+#X msg 231 432 slotincrs 0 4 60 222 66.6 88.65;
+#X msg 179 491 slotamps 0 5 4 1 1 1 1;
+#X msg 155 511 slotincrs 0 5 1.05 1.05 1 0.9;
+#X msg 424 225 slotamps 0 3 16 0 0 0 0 1 1 0 1 1 0 0.5 0.7 0.9 1 1
+1;
+#X obj 162 435 t b b;
+#X obj 145 55 loadbang;
+#X obj 221 372 t b b;
+#X obj 67 84 t b b b b b b;
+#X text 444 210 snare rush;
+#X text 263 194 normal snare;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 3 0;
+#X connect 6 1 2 0;
+#X connect 7 0 19 0;
+#X connect 8 0 10 0;
+#X connect 8 1 9 0;
+#X connect 9 0 0 0;
+#X connect 10 0 0 0;
+#X connect 11 0 0 0;
+#X connect 12 0 0 0;
+#X connect 13 0 0 0;
+#X connect 14 0 0 0;
+#X connect 15 0 0 0;
+#X connect 16 0 14 0;
+#X connect 16 1 13 0;
+#X connect 17 0 7 0;
+#X connect 18 0 12 0;
+#X connect 18 1 11 0;
+#X connect 19 0 6 0;
+#X connect 19 1 5 0;
+#X connect 19 1 16 0;
+#X connect 19 2 4 0;
+#X connect 19 3 8 0;
+#X connect 19 4 18 0;
+#X connect 19 5 1 0;
+#X restore 20 30 pd pat0;
+#N canvas 551 229 733 551 pat1 0;
+#X msg 165 57 store 1 3.5;
+#X obj 178 229 s dmach-msgs;
+#X msg 373 203 slotamps 1 3 14 0 0 0 0 1 0 0 0 0 0 1 1 1 0;
+#X msg 405 290 slotamps 1 7 14 1 1 1 1 1 0 0 0 1 0 1 0 1 0;
+#X msg 450 339 slotamps 1 2 7 0 0 0 1 0 0 0;
+#X msg 341 153 slotamps 1 6 7 1 0 0 1 0 0.6 0;
+#X msg 264 73 slotincrs 1 6 1 0.9 0.6;
+#X msg 5 448 slotamps 1 4 14 1 0 0 1 1 1 1 0 1 1 1 1 1 0;
+#X msg 6 427 slotincrs 1 4 80 90 300 120 600 70 111 131 210 60;
+#X msg 398 249 slotamps 1 8 7 0 1 0.7 0 1 0.7 0;
+#X msg 272 92 slotamps 1 1 0 0 0 1 0 1 0 1;
+#X obj 148 401 t b b;
+#X obj 278 46 t b b;
+#X obj 140 22 t b b b b b b b b b;
+#X obj 93 27 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 53 0 loadbang;
+#X msg 424 392 slotamps 1 8 7 1 1 1 0 0 0 0;
+#X connect 0 0 1 0;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 1 0;
+#X connect 5 0 1 0;
+#X connect 6 0 1 0;
+#X connect 7 0 1 0;
+#X connect 8 0 1 0;
+#X connect 9 0 1 0;
+#X connect 10 0 1 0;
+#X connect 11 0 8 0;
+#X connect 11 1 7 0;
+#X connect 12 0 6 0;
+#X connect 12 1 10 0;
+#X connect 13 0 11 0;
+#X connect 13 1 16 0;
+#X connect 13 2 4 0;
+#X connect 13 3 3 0;
+#X connect 13 4 9 0;
+#X connect 13 5 2 0;
+#X connect 13 6 5 0;
+#X connect 13 7 12 0;
+#X connect 13 8 0 0;
+#X connect 14 0 13 0;
+#X connect 15 0 14 0;
+#X connect 16 0 1 0;
+#X restore 19 55 pd pat1;
+#N canvas 85 193 1049 665 pat2 0;
+#X obj 92 588 s dmach-msgs;
+#X obj 15 142 t b b;
+#X obj 86 54 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 339 289 t b b;
+#X obj 162 435 t b b;
+#X obj 145 55 loadbang;
+#X obj 221 372 t b b;
+#X text 444 210 snare rush;
+#X text 263 194 normal snare;
+#X msg 210 111 store 2 4;
+#X msg 268 151 slotamps 2 2 16 0 0 1 0.7 0 0 1 0.7 0 0 1 0.7 0 0.5
+1 0.7;
+#X msg 245 249 slotamps 2 3 4 0 1 0 1;
+#X msg 424 225 slotamps 2 3 16 0 0 0 0 1 1 0 1 1 0 0.5 0.7 0.9 1 1
+1;
+#X msg 339 325 slotincrs 2 1 1 1 0.8333 1.111 1.111 1.333 1.653;
+#X msg 341 345 slotamps 2 1 16 1 0 0.7 0 1 0 0 1 0 0 1 0 1 0 0.666
+;
+#X msg 15 188 slotamps 2 0 8 1 0 0 1 1 0 0 1;
+#X msg 14 164 slotincrs 2 0 1 0.8 1 0.8;
+#X obj 67 84 t b b b b b b b b;
+#X msg 142 521 slotincrs 2 6 1.05 1.05 0.9 1 0.8;
+#X msg 177 492 slotamps 2 6 16 1 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0;
+#X msg 532 470 slotamps 2 8 16 1 0.9 0.8 0.6 1 0.9 0.8 0.6 1 0.9 0.8
+0.6 1 0.9 0.8 0.6;
+#X msg 283 455 slotamps 2 4 2 1 1;
+#X msg 229 431 slotincrs 2 4 555 597;
+#X connect 1 0 16 0;
+#X connect 1 1 15 0;
+#X connect 2 0 17 0;
+#X connect 3 0 13 0;
+#X connect 3 1 14 0;
+#X connect 4 0 18 0;
+#X connect 4 1 19 0;
+#X connect 5 0 2 0;
+#X connect 6 0 22 0;
+#X connect 6 1 21 0;
+#X connect 9 0 0 0;
+#X connect 10 0 0 0;
+#X connect 11 0 0 0;
+#X connect 12 0 0 0;
+#X connect 13 0 0 0;
+#X connect 14 0 0 0;
+#X connect 15 0 0 0;
+#X connect 16 0 0 0;
+#X connect 17 0 1 0;
+#X connect 17 1 4 0;
+#X connect 17 2 10 0;
+#X connect 17 3 3 0;
+#X connect 17 4 6 0;
+#X connect 17 5 11 0;
+#X connect 17 6 20 0;
+#X connect 17 7 9 0;
+#X connect 18 0 0 0;
+#X connect 19 0 0 0;
+#X connect 20 0 0 0;
+#X connect 21 0 0 0;
+#X connect 22 0 0 0;
+#X restore 19 85 pd pat2;
+#N canvas 368 153 785 643 pat3 0;
+#X obj 154 226 s dmach-msgs;
+#X msg 177 120 store 3 3;
+#X msg 338 153 slotamps 3 0 9 1 0 0.7 1 0 0.7 1 0 0;
+#X msg 398 213 slotamps 3 8 9 0 1 0.5 0 1 0.5 0 0.5 1;
+#X msg 399 249 slotincrs 3 8 0.7 0.7 0.7 0.7 0.7 0.6;
+#X msg 347 323 slotamps 3 7 18 0 0 1 1 1 0 0 0 1 0 1 0 1 0 1 1 1 0
+;
+#X msg 414 356 slotamps 3 2 3 1 1 1;
+#X msg 264 423 slotamps 3 4 9 1 1 1 1 1 1 1 1 1;
+#X msg 272 466 slotincrs 3 4 89 111 127 76 140 222 997 560 56;
+#X obj 250 60 t b b b b b b;
+#X obj 374 189 t b b;
+#X obj 304 375 t b b;
+#X obj 221 53 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 124 63 loadbang;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 11 0;
+#X connect 9 1 6 0;
+#X connect 9 2 5 0;
+#X connect 9 3 10 0;
+#X connect 9 4 2 0;
+#X connect 9 5 1 0;
+#X connect 10 0 4 0;
+#X connect 10 1 3 0;
+#X connect 11 0 8 0;
+#X connect 11 1 7 0;
+#X connect 12 0 9 0;
+#X connect 13 0 12 0;
+#X restore 17 110 pd pat3;
+#N canvas 383 180 805 663 pat4 0;
+#X obj 134 585 s dmach-msgs;
+#X msg 177 119 store 4 3.33333;
+#X msg 361 513 slotamps 4 4 10 1 1 1 1 1 1 1 1 1 1;
+#X msg 338 153 slotamps 4 0 10 1 0 0.7 1 0 0.7 1 0 1 0;
+#X msg 385 243 slotamps 4 8 10 0 1 0.5 0 1 0.5 0 0.5 1 1;
+#X msg 355 221 slotincrs 4 8 0.7 0.7 0.7 0.7 0.7 0.6 0.55;
+#X msg 347 322 slotamps 4 7 20 0 0 1 1 1 0 0 0 1 0 1 0 1 0 1 1 1 0
+1 1;
+#X msg 420 356 slotamps 4 2 10 1 0 0 1 0 0 1 0 0 1 0 1 0;
+#X msg 337 490 slotincrs 4 4 89 111 127 76 140 222 997 560 333 1444
+;
+#X obj 359 189 t b b;
+#X obj 349 459 t b b;
+#X obj 184 43 t b b b b b b;
+#X text 314 111 A bar with 10 triplets (hard to notate!);
+#X obj 135 56 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 110 25 loadbang;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 5 0;
+#X connect 9 1 4 0;
+#X connect 10 0 8 0;
+#X connect 10 1 2 0;
+#X connect 11 0 10 0;
+#X connect 11 1 7 0;
+#X connect 11 2 6 0;
+#X connect 11 3 9 0;
+#X connect 11 4 3 0;
+#X connect 11 5 1 0;
+#X connect 13 0 11 0;
+#X connect 14 0 13 0;
+#X restore 18 137 pd pat4;
+#X text 271 63 print ptn 0;
+#X text 85 60 send ptn 0 to list outlet;
+#X text 11 12 pattern assembly;
+#X obj 265 106 s dmach-msgs;
+#N canvas 328 128 821 601 pat6 0;
+#X obj -9 526 s dmach-msgs;
+#X msg 571 34 store 6 3.25;
+#X msg 37 76 slotamps 6 0 13 1 0 0 0 1 0 0 1 0 0 1 0 0;
+#X msg 31 221 slotamps 6 2 13 1 0 0 0 1 0 0 1 0 0 1 0 0;
+#X msg 108 30 slotamps 6 6 13 1 0 0 0 0 0 0 0 0 1 0 1 0;
+#X msg 35 366 slotamps 6 1 13 1 0 1 0 0 0 1 0 0 0 1 0 0;
+#X msg 30 337 slotincrs 6 1 0.5 1.5 2 1;
+#X msg 118 493 slotamps 6 4 13 1 0.7 0.7 0.7 1 0.5 0.5 1 0.5 0.5 1
+0.5 0.5;
+#X msg 143 457 slotincrs 6 4 80 160 320 640 160 320 640 80 160 320
+160 320 640;
+#X msg 156 140 slotamps 6 3 13 0 0 1 1 0 0 0 1 0 1 0 0 1.5;
+#X msg 67 259 slotamps 6 7 13 0 0 1 1 0 1 1 0 1 1 0 1 1.3;
+#X msg 149 191 slotamps 6 5 13 0 0 0 0 1 0 0 0 0 0 0 0 1.2;
+#X msg 424 264 slotamps 6 8 13 0 0 0 0 1 0 0 0 0 0 0 0 1.2;
+#X msg 405 242 slotincrs 6 8 1 1.06;
+#X obj 22 -51 loadbang;
+#X obj 246 424 t b b;
+#X obj 138 304 t b b;
+#X obj 414 219 t b b;
+#X text 573 9 13/16 bar;
+#X obj 24 -12 t b b b b b b b b b b;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 0 0;
+#X connect 10 0 0 0;
+#X connect 11 0 0 0;
+#X connect 12 0 0 0;
+#X connect 13 0 0 0;
+#X connect 14 0 19 0;
+#X connect 15 0 8 0;
+#X connect 15 1 7 0;
+#X connect 16 0 6 0;
+#X connect 16 1 5 0;
+#X connect 17 0 13 0;
+#X connect 17 1 12 0;
+#X connect 19 0 15 0;
+#X connect 19 1 16 0;
+#X connect 19 2 10 0;
+#X connect 19 3 3 0;
+#X connect 19 4 17 0;
+#X connect 19 5 11 0;
+#X connect 19 6 9 0;
+#X connect 19 7 4 0;
+#X connect 19 8 2 0;
+#X connect 19 9 1 0;
+#X restore 141 163 pd pat6;
+#X connect 0 0 10 0;
+#X connect 1 0 10 0;
+#X restore 386 126 pd stored-patterns;
+#N canvas 252 329 755 357 playback-adjustments 0;
+#X obj 606 67 s dmach-msgs;
+#X obj 77 168 vsl 10 55 0 127 0 0 empty empty empty 0 -9 0 10 -93493
+-1 -1 0 1;
+#X obj 101 168 vsl 10 55 0 127 0 0 empty empty empty 0 -9 0 10 -93493
+-1 -1 0 1;
+#X obj 125 168 vsl 10 55 0 127 0 0 empty empty empty 0 -9 0 10 -93493
+-1 -1 0 1;
+#X obj 149 168 vsl 10 55 0 127 0 0 empty empty empty 0 -9 0 10 -93493
+-1 -1 0 1;
+#X obj 172 168 vsl 10 55 0 127 0 0 empty empty empty 0 -9 0 10 -93493
+-1 -1 0 1;
+#X obj 220 35 vsl 10 55 0 127 0 0 empty empty empty 0 -9 0 10 -215152
+-1 -1 0 1;
+#X obj 251 35 vsl 10 55 0 127 0 0 empty empty empty 0 -9 0 10 -215152
+-1 -1 0 1;
+#X obj 282 35 vsl 10 55 0 127 0 0 empty empty empty 0 -9 0 10 -215152
+-1 -1 0 1;
+#X obj 315 35 vsl 10 55 0 127 0 0 empty empty empty 0 -9 0 10 -215152
+-1 -1 0 1;
+#X obj 345 35 vsl 10 55 0 127 0 0 empty empty empty 0 -9 0 10 -215152
+-1 -1 0 1;
+#X msg 55 140 1;
+#X obj 376 35 vsl 10 55 0 127 0 0 empty empty empty 0 -9 0 10 -215152
+-1 -1 0 1;
+#X obj 194 168 vsl 10 55 0 127 0 0 empty empty empty 0 -9 0 10 -93493
+-1 -1 0 1;
+#X obj 408 35 vsl 10 55 0 127 0 0 empty empty empty 0 -9 0 10 -215152
+-1 -1 0 1;
+#X obj 441 35 vsl 10 55 0 127 0 0 empty empty empty 0 -9 0 10 -215152
+-1 -1 0 1;
+#X obj 470 35 vsl 10 55 0 127 0 0 empty empty empty 0 -9 0 10 -215152
+-1 -1 0 1;
+#N canvas 19 93 1162 506 adjust-gains__________________________ 0;
+#X obj 81 215 outlet;
+#X obj 83 71 inlet;
+#X floatatom 82 128 5 0 0 0 - - -, f 5;
+#X msg 82 156 gain 0 \$1;
+#X obj 169 67 inlet;
+#X floatatom 168 124 5 0 0 0 - - -, f 5;
+#X obj 258 67 inlet;
+#X floatatom 257 124 5 0 0 0 - - -, f 5;
+#X obj 352 68 inlet;
+#X floatatom 351 125 5 0 0 0 - - -, f 5;
+#X obj 447 71 inlet;
+#X floatatom 446 128 5 0 0 0 - - -, f 5;
+#X msg 168 152 gain 1 \$1;
+#X msg 257 152 gain 2 \$1;
+#X msg 351 153 gain 3 \$1;
+#X msg 446 156 gain 4 \$1;
+#X obj 532 72 inlet;
+#X floatatom 531 129 5 0 0 0 - - -, f 5;
+#X msg 532 157 gain 5 \$1;
+#X obj 531 103 smap 0 4;
+#X obj 626 74 inlet;
+#X floatatom 625 131 5 0 0 0 - - -, f 5;
+#X obj 625 105 smap 0 4;
+#X msg 626 159 gain 6 \$1;
+#X obj 704 75 inlet;
+#X floatatom 703 132 5 0 0 0 - - -, f 5;
+#X obj 703 106 smap 0 4;
+#X msg 704 159 gain 7 \$1;
+#X obj 788 77 inlet;
+#X floatatom 787 134 5 0 0 0 - - -, f 5;
+#X obj 787 108 smap 0 4;
+#X msg 788 161 gain 8 \$1;
+#X obj 888 78 inlet;
+#X obj 447 102 smap 0 4;
+#X obj 352 99 smap 0 4;
+#X obj 258 98 smap 0 4;
+#X obj 169 98 smap 0 4;
+#X obj 83 102 smap 0 4;
+#X connect 1 0 37 0;
+#X connect 2 0 3 0;
+#X connect 3 0 0 0;
+#X connect 4 0 36 0;
+#X connect 5 0 12 0;
+#X connect 6 0 35 0;
+#X connect 7 0 13 0;
+#X connect 8 0 34 0;
+#X connect 9 0 14 0;
+#X connect 10 0 33 0;
+#X connect 11 0 15 0;
+#X connect 12 0 0 0;
+#X connect 13 0 0 0;
+#X connect 14 0 0 0;
+#X connect 15 0 0 0;
+#X connect 16 0 19 0;
+#X connect 17 0 18 0;
+#X connect 18 0 0 0;
+#X connect 19 0 17 0;
+#X connect 20 0 22 0;
+#X connect 21 0 23 0;
+#X connect 22 0 21 0;
+#X connect 23 0 0 0;
+#X connect 24 0 26 0;
+#X connect 25 0 27 0;
+#X connect 26 0 25 0;
+#X connect 27 0 0 0;
+#X connect 28 0 30 0;
+#X connect 29 0 31 0;
+#X connect 30 0 29 0;
+#X connect 31 0 0 0;
+#X connect 32 0 29 0;
+#X connect 32 0 25 0;
+#X connect 32 0 21 0;
+#X connect 32 0 17 0;
+#X connect 32 0 11 0;
+#X connect 32 0 9 0;
+#X connect 32 0 7 0;
+#X connect 32 0 5 0;
+#X connect 32 0 2 0;
+#X connect 33 0 11 0;
+#X connect 34 0 9 0;
+#X connect 35 0 7 0;
+#X connect 36 0 5 0;
+#X connect 37 0 2 0;
+#X restore 221 101 pd adjust-gains__________________________;
+#X msg 503 49 1;
+#X obj 220 128 s dmach-msgs;
+#X obj 53 267 s dmach-msgs;
+#N canvas 241 125 1002 464 gates 0;
+#X obj 96 342 outlet;
+#X obj 136 58 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X msg 134 99 muteslot 1 \$1;
+#X obj 238 65 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X msg 237 99 muteslot 2 \$1;
+#X obj 34 56 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1
+;
+#X msg 33 97 muteslot 0 \$1;
+#X obj 343 64 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 447 64 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 547 63 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X msg 342 98 muteslot 3 \$1;
+#X msg 445 98 muteslot 4 \$1;
+#X msg 546 97 muteslot 5 \$1;
+#X obj 561 176 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 665 176 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 765 175 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X msg 560 209 muteslot 6 \$1;
+#X msg 663 210 muteslot 7 \$1;
+#X msg 764 209 muteslot 8 \$1;
+#X text 247 363 turn slots on or off;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 3 0 4 0;
+#X connect 4 0 0 0;
+#X connect 5 0 6 0;
+#X connect 6 0 0 0;
+#X connect 7 0 10 0;
+#X connect 8 0 11 0;
+#X connect 9 0 12 0;
+#X connect 10 0 0 0;
+#X connect 11 0 0 0;
+#X connect 12 0 0 0;
+#X connect 13 0 16 0;
+#X connect 14 0 17 0;
+#X connect 15 0 18 0;
+#X connect 16 0 0 0;
+#X connect 17 0 0 0;
+#X connect 18 0 0 0;
+#X restore 606 37 pd gates;
+#X obj 218 168 vsl 10 55 0 127 0 0 empty empty empty 0 -9 0 10 -93493
+-1 -1 0 1;
+#X obj 243 168 vsl 10 55 0 127 0 0 empty empty empty 0 -9 0 10 -93493
+-1 -1 0 1;
+#X obj 265 168 vsl 10 55 0 127 0 0 empty empty empty 0 -9 0 10 -93493
+-1 -1 0 1;
+#N canvas 0 156 1248 402 transposers_________________ 0;
+#X obj 49 49 inlet;
+#N canvas 1157 45 458 308 zmap 0;
+#X obj 56 34 inlet;
+#X obj 56 60 / 127;
+#X msg 139 43 0.5;
+#X msg 181 43 1.5;
+#X obj 138 78 - 0;
+#X obj 140 20 t b b;
+#X floatatom 96 111 5 0 0 0 - - -, f 5;
+#X obj 56 131 *;
+#X obj 56 160 +;
+#X floatatom 103 142 5 0 0 0 - - -, f 5;
+#X obj 56 187 outlet;
+#X obj 140 -1 loadbang;
+#X connect 0 0 1 0;
+#X connect 1 0 7 0;
+#X connect 2 0 4 1;
+#X connect 2 0 9 0;
+#X connect 3 0 4 0;
+#X connect 4 0 6 0;
+#X connect 5 0 2 0;
+#X connect 5 1 3 0;
+#X connect 6 0 7 1;
+#X connect 7 0 8 0;
+#X connect 8 0 10 0;
+#X connect 9 0 8 1;
+#X connect 11 0 5 0;
+#X restore 49 80 pd zmap;
+#X floatatom 48 106 5 0 0 0 - - -, f 5;
+#X msg 48 134 transpose 0 \$1;
+#X obj 47 180 outlet;
+#X obj 168 48 inlet;
+#N canvas 1157 45 454 304 zmap 0;
+#X obj 56 34 inlet;
+#X obj 56 60 / 127;
+#X msg 139 43 0.5;
+#X msg 181 43 1.5;
+#X obj 138 78 - 0;
+#X obj 140 20 t b b;
+#X floatatom 96 111 5 0 0 0 - - -, f 5;
+#X obj 56 131 *;
+#X obj 56 160 +;
+#X floatatom 103 142 5 0 0 0 - - -, f 5;
+#X obj 56 187 outlet;
+#X obj 140 -1 loadbang;
+#X connect 0 0 1 0;
+#X connect 1 0 7 0;
+#X connect 2 0 4 1;
+#X connect 2 0 9 0;
+#X connect 3 0 4 0;
+#X connect 4 0 6 0;
+#X connect 5 0 2 0;
+#X connect 5 1 3 0;
+#X connect 6 0 7 1;
+#X connect 7 0 8 0;
+#X connect 8 0 10 0;
+#X connect 9 0 8 1;
+#X connect 11 0 5 0;
+#X restore 168 79 pd zmap;
+#X floatatom 167 105 5 0 0 0 - - -, f 5;
+#X obj 284 46 inlet;
+#N canvas 1157 45 454 304 zmap 0;
+#X obj 56 34 inlet;
+#X obj 56 60 / 127;
+#X msg 139 43 0.5;
+#X msg 181 43 1.5;
+#X obj 138 78 - 0;
+#X obj 140 20 t b b;
+#X floatatom 96 111 5 0 0 0 - - -, f 5;
+#X obj 56 131 *;
+#X obj 56 160 +;
+#X floatatom 103 142 5 0 0 0 - - -, f 5;
+#X obj 56 187 outlet;
+#X obj 140 -1 loadbang;
+#X connect 0 0 1 0;
+#X connect 1 0 7 0;
+#X connect 2 0 4 1;
+#X connect 2 0 9 0;
+#X connect 3 0 4 0;
+#X connect 4 0 6 0;
+#X connect 5 0 2 0;
+#X connect 5 1 3 0;
+#X connect 6 0 7 1;
+#X connect 7 0 8 0;
+#X connect 8 0 10 0;
+#X connect 9 0 8 1;
+#X connect 11 0 5 0;
+#X restore 284 77 pd zmap;
+#X floatatom 283 103 5 0 0 0 - - -, f 5;
+#X obj 394 48 inlet;
+#N canvas 1157 45 454 304 zmap 0;
+#X obj 56 34 inlet;
+#X obj 56 60 / 127;
+#X msg 139 43 0.5;
+#X msg 181 43 1.5;
+#X obj 138 78 - 0;
+#X obj 140 20 t b b;
+#X floatatom 96 111 5 0 0 0 - - -, f 5;
+#X obj 56 131 *;
+#X obj 56 160 +;
+#X floatatom 103 142 5 0 0 0 - - -, f 5;
+#X obj 56 187 outlet;
+#X obj 140 -1 loadbang;
+#X connect 0 0 1 0;
+#X connect 1 0 7 0;
+#X connect 2 0 4 1;
+#X connect 2 0 9 0;
+#X connect 3 0 4 0;
+#X connect 4 0 6 0;
+#X connect 5 0 2 0;
+#X connect 5 1 3 0;
+#X connect 6 0 7 1;
+#X connect 7 0 8 0;
+#X connect 8 0 10 0;
+#X connect 9 0 8 1;
+#X connect 11 0 5 0;
+#X restore 394 79 pd zmap;
+#X floatatom 393 105 5 0 0 0 - - -, f 5;
+#X obj 509 49 inlet;
+#N canvas 1157 45 454 304 zmap 0;
+#X obj 56 34 inlet;
+#X obj 56 60 / 127;
+#X msg 139 43 0.5;
+#X msg 181 43 1.5;
+#X obj 138 78 - 0;
+#X obj 140 20 t b b;
+#X floatatom 96 111 5 0 0 0 - - -, f 5;
+#X obj 56 131 *;
+#X obj 56 160 +;
+#X floatatom 103 142 5 0 0 0 - - -, f 5;
+#X obj 56 187 outlet;
+#X obj 140 -1 loadbang;
+#X connect 0 0 1 0;
+#X connect 1 0 7 0;
+#X connect 2 0 4 1;
+#X connect 2 0 9 0;
+#X connect 3 0 4 0;
+#X connect 4 0 6 0;
+#X connect 5 0 2 0;
+#X connect 5 1 3 0;
+#X connect 6 0 7 1;
+#X connect 7 0 8 0;
+#X connect 8 0 10 0;
+#X connect 9 0 8 1;
+#X connect 11 0 5 0;
+#X restore 509 80 pd zmap;
+#X floatatom 509 106 5 0 0 0 - - -, f 5;
+#X msg 167 133 transpose 1 \$1;
+#X msg 283 131 transpose 2 \$1;
+#X msg 393 133 transpose 3 \$1;
+#X msg 509 134 transpose 4 \$1;
+#X obj 3 47 inlet;
+#X obj 622 48 inlet;
+#N canvas 1157 45 454 304 zmap 0;
+#X obj 56 34 inlet;
+#X obj 56 60 / 127;
+#X msg 139 43 0.5;
+#X msg 181 43 1.5;
+#X obj 138 78 - 0;
+#X obj 140 20 t b b;
+#X floatatom 96 111 5 0 0 0 - - -, f 5;
+#X obj 56 131 *;
+#X obj 56 160 +;
+#X floatatom 103 142 5 0 0 0 - - -, f 5;
+#X obj 56 187 outlet;
+#X obj 140 -1 loadbang;
+#X connect 0 0 1 0;
+#X connect 1 0 7 0;
+#X connect 2 0 4 1;
+#X connect 2 0 9 0;
+#X connect 3 0 4 0;
+#X connect 4 0 6 0;
+#X connect 5 0 2 0;
+#X connect 5 1 3 0;
+#X connect 6 0 7 1;
+#X connect 7 0 8 0;
+#X connect 8 0 10 0;
+#X connect 9 0 8 1;
+#X connect 11 0 5 0;
+#X restore 622 79 pd zmap;
+#X floatatom 622 105 5 0 0 0 - - -, f 5;
+#X msg 622 134 transpose 5 \$1;
+#X obj 732 48 inlet;
+#N canvas 1157 45 454 304 zmap 0;
+#X obj 56 34 inlet;
+#X obj 56 60 / 127;
+#X msg 139 43 0.5;
+#X msg 181 43 1.5;
+#X obj 138 78 - 0;
+#X obj 140 20 t b b;
+#X floatatom 96 111 5 0 0 0 - - -, f 5;
+#X obj 56 131 *;
+#X obj 56 160 +;
+#X floatatom 103 142 5 0 0 0 - - -, f 5;
+#X obj 56 187 outlet;
+#X obj 140 -1 loadbang;
+#X connect 0 0 1 0;
+#X connect 1 0 7 0;
+#X connect 2 0 4 1;
+#X connect 2 0 9 0;
+#X connect 3 0 4 0;
+#X connect 4 0 6 0;
+#X connect 5 0 2 0;
+#X connect 5 1 3 0;
+#X connect 6 0 7 1;
+#X connect 7 0 8 0;
+#X connect 8 0 10 0;
+#X connect 9 0 8 1;
+#X connect 11 0 5 0;
+#X restore 732 79 pd zmap;
+#X floatatom 732 105 5 0 0 0 - - -, f 5;
+#X obj 846 54 inlet;
+#N canvas 1157 45 454 304 zmap 0;
+#X obj 56 34 inlet;
+#X obj 56 60 / 127;
+#X msg 139 43 0.5;
+#X msg 181 43 1.5;
+#X obj 138 78 - 0;
+#X obj 140 20 t b b;
+#X floatatom 96 111 5 0 0 0 - - -, f 5;
+#X obj 56 131 *;
+#X obj 56 160 +;
+#X floatatom 103 142 5 0 0 0 - - -, f 5;
+#X obj 56 187 outlet;
+#X obj 140 -1 loadbang;
+#X connect 0 0 1 0;
+#X connect 1 0 7 0;
+#X connect 2 0 4 1;
+#X connect 2 0 9 0;
+#X connect 3 0 4 0;
+#X connect 4 0 6 0;
+#X connect 5 0 2 0;
+#X connect 5 1 3 0;
+#X connect 6 0 7 1;
+#X connect 7 0 8 0;
+#X connect 8 0 10 0;
+#X connect 9 0 8 1;
+#X connect 11 0 5 0;
+#X restore 846 85 pd zmap;
+#X floatatom 846 111 5 0 0 0 - - -, f 5;
+#X obj 967 52 inlet;
+#N canvas 1157 45 454 304 zmap 0;
+#X obj 56 34 inlet;
+#X obj 56 60 / 127;
+#X msg 139 43 0.5;
+#X msg 181 43 1.5;
+#X obj 138 78 - 0;
+#X obj 140 20 t b b;
+#X floatatom 96 111 5 0 0 0 - - -, f 5;
+#X obj 56 131 *;
+#X obj 56 160 +;
+#X floatatom 103 142 5 0 0 0 - - -, f 5;
+#X obj 56 187 outlet;
+#X obj 140 -1 loadbang;
+#X connect 0 0 1 0;
+#X connect 1 0 7 0;
+#X connect 2 0 4 1;
+#X connect 2 0 9 0;
+#X connect 3 0 4 0;
+#X connect 4 0 6 0;
+#X connect 5 0 2 0;
+#X connect 5 1 3 0;
+#X connect 6 0 7 1;
+#X connect 7 0 8 0;
+#X connect 8 0 10 0;
+#X connect 9 0 8 1;
+#X connect 11 0 5 0;
+#X restore 967 83 pd zmap;
+#X floatatom 967 109 5 0 0 0 - - -, f 5;
+#X msg 732 134 transpose 6 \$1;
+#X msg 846 140 transpose 7 \$1;
+#X msg 967 138 transpose 8 \$1;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 17 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 18 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 13 0 19 0;
+#X connect 14 0 15 0;
+#X connect 15 0 16 0;
+#X connect 16 0 20 0;
+#X connect 17 0 4 0;
+#X connect 18 0 4 0;
+#X connect 19 0 4 0;
+#X connect 20 0 4 0;
+#X connect 21 0 2 0;
+#X connect 21 0 7 0;
+#X connect 21 0 10 0;
+#X connect 21 0 13 0;
+#X connect 21 0 16 0;
+#X connect 21 0 24 0;
+#X connect 22 0 23 0;
+#X connect 23 0 24 0;
+#X connect 24 0 25 0;
+#X connect 25 0 4 0;
+#X connect 26 0 27 0;
+#X connect 27 0 28 0;
+#X connect 28 0 35 0;
+#X connect 29 0 30 0;
+#X connect 30 0 31 0;
+#X connect 31 0 36 0;
+#X connect 32 0 33 0;
+#X connect 33 0 34 0;
+#X connect 34 0 37 0;
+#X connect 35 0 4 0;
+#X connect 36 0 4 0;
+#X connect 37 0 4 0;
+#X restore 54 239 pd transposers_________________;
+#X connect 1 0 25 1;
+#X connect 2 0 25 2;
+#X connect 3 0 25 3;
+#X connect 4 0 25 4;
+#X connect 5 0 25 5;
+#X connect 6 0 17 0;
+#X connect 7 0 17 1;
+#X connect 8 0 17 2;
+#X connect 9 0 17 3;
+#X connect 10 0 17 4;
+#X connect 11 0 25 0;
+#X connect 12 0 17 5;
+#X connect 13 0 25 6;
+#X connect 14 0 17 6;
+#X connect 15 0 17 7;
+#X connect 16 0 17 8;
+#X connect 17 0 19 0;
+#X connect 18 0 17 9;
+#X connect 21 0 0 0;
+#X connect 22 0 25 7;
+#X connect 23 0 25 8;
+#X connect 24 0 25 9;
+#X connect 25 0 20 0;
+#X restore 386 180 pd playback-adjustments;
+#X text 20 48 dmach~ coordinates click triggers and increment signals
+for pattern-based sequencing., f 91;
+#X text 243 110 args: tempo \, voices;
+#X obj 23 13 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 24 336 http://disis.music.vt.edu/eric/LyonPapers/SampleAccurate-Lyon-ICMC2006.pdf
+, f 75;
+#X text 23 319 See this paper for more information:;
+#X connect 0 0 1 0;
+#X connect 2 0 3 0;
+#X connect 2 0 3 1;
+#X connect 4 0 11 0;
+#X connect 6 0 2 1;
+#X connect 10 0 7 0;
+#X connect 11 0 12 0;
+#X connect 11 1 12 1;
+#X connect 11 2 12 2;
+#X connect 11 3 12 3;
+#X connect 11 4 12 4;
+#X connect 11 5 12 5;
+#X connect 11 6 12 6;
+#X connect 11 7 12 7;
+#X connect 11 8 12 8;
+#X connect 11 9 12 9;
+#X connect 11 10 12 10;
+#X connect 11 11 12 11;
+#X connect 11 12 12 12;
+#X connect 11 13 12 13;
+#X connect 11 14 12 14;
+#X connect 11 15 12 15;
+#X connect 11 16 12 16;
+#X connect 11 17 12 17;
+#X connect 11 18 0 0;
+#X connect 11 19 8 0;
+#X connect 12 0 2 0;
diff --git a/externals/lyonpotpourri/dmach~.c b/externals/lyonpotpourri/dmach~.c
new file mode 100755
index 0000000000000000000000000000000000000000..1bf1422ac0ff11ccdcdb04b44edd18136593c2c0
--- /dev/null
+++ b/externals/lyonpotpourri/dmach~.c
@@ -0,0 +1,1225 @@
+#include "MSPd.h"
+
+#define MAX_ATTACKS (512)
+#define MAX_PATTERNS (1024)
+
+
+#define OBJECT_NAME "dmach~"
+
+
+static t_class *dmach_class;
+
+
+typedef struct
+{
+    float trigger_point;
+    float increment;
+    float amplitude;
+} t_attack;
+
+typedef struct
+{
+    short active; // flag for if this drum slot is used in current pattern
+    int attack_count; // number of attacks in this pattern
+    int adex; // index to current attack
+    t_attack *attacks; // array containing attack data
+} t_drumline;
+
+typedef struct
+{
+    float beats; // how many beats in this pattern
+    float dsamps; //duration of pattern in samples
+    t_drumline *drumlines;
+} t_pattern;
+
+typedef struct _dmach
+{
+    
+    t_object x_obj;
+    float x_f;
+    
+	short mute; // global mute
+	float clocker; // global sample counter clock
+	float tempo;
+	float tempo_factor; // multiplier to get actual beat duration
+	t_pattern *patterns; // contains all drum patterns
+	short *stored_patterns;// which locations contain a pattern
+	float *gtranspose;// transpose factor for each individual drum slot
+	float *gains; // gain factor for each individual drum slot
+	float *current_increment;// maintains increment for sustained output
+	int this_pattern; // number of current pattern
+	int next_pattern; // number of pattern to call at end of current pattern
+	float global_gain;
+	float global_transpose;
+	float sr;
+	int drum_count; // number of drum slots to instantiate
+	int outlet_count; // number of outlets on object
+	short virgin; // no patterns stored - turn off performance
+	/* sequencer */
+	short playsequence; // flag to play through a stored sequence once
+	short loopsequence; // flag to loop repeatedly through sequence
+	int *sequence; // contains the sequence of bars to play
+	int sequence_length; // how many bars are stored in sequence
+	int seqptr; // keep track of current sequencer position
+	float zeroalias; // use this to send a coded "zero" message (i.e. bar number is zero)
+	t_atom *listdata; // for list output
+	void *listraw_outlet;// send a list
+	short clickincr; //flag that click increment is on (i.e. no sample and hold)
+	short *attackpattern; // holds full attack sequence including zeros (for list output)
+	int attackpattern_count;// how many ticks in attack pattern
+	t_attack *tmpatks; // hold local copy of new slot pattern
+	short *connected; // list of vector connections
+	short *muted; // state of each slot
+	short instant_recall; // flag that pattern gets loaded immediately (loops only)
+} t_dmach;
+
+void dmach_store(t_dmach *x, t_symbol *s, int argc, t_atom *argv);
+void *dmach_new(t_symbol *s, int argc, t_atom *argv);
+t_int *dmach_perform(t_int *w);
+void dmach_mute(t_dmach *x, t_floatarg toggle);
+void dmach_dsp(t_dmach *x, t_signal **sp);
+void dmach_dsp_free(t_dmach *x);
+void dmach_init_pattern(t_dmach *x, int pnum);
+void dmach_show(t_dmach *x, t_floatarg fn);
+void dmach_tempo(t_dmach *x, t_floatarg new_tempo);
+void dmach_recall(t_dmach *x, t_floatarg pnf);
+void dmach_transpose(t_dmach *x, t_floatarg slotf, t_floatarg new_transpose_factor);
+void dmach_gain(t_dmach *x, t_floatarg slotf, t_floatarg new_gain_factor);
+void dmach_arm(t_dmach *x, t_floatarg pnf);
+void dmach_playsequence(t_dmach *x, t_symbol *s, int argc, t_atom *argv);
+void dmach_slotamps(t_dmach *x, t_symbol *s, int argc, t_atom *argv);
+void dmach_printraw(t_dmach *x, t_floatarg fn);
+void dmach_readraw(t_dmach *x, t_symbol *s, int argc, t_atom *argv);
+void dmach_slotincrs(t_dmach *x, t_symbol *s, int argc, t_atom *argv);
+void dmach_loopsequence(t_dmach *x, t_symbol *s, int argc, t_atom *argv);
+void dmach_muteslot(t_dmach *x, t_symbol *s, int argc, t_atom *argv);
+void dmach_slotampsfull(t_dmach *x, t_symbol *s, int argc, t_atom *argv);
+void dmach_nosequence(t_dmach *x);
+void dmach_copypattern(t_dmach *x, t_floatarg pn1, t_floatarg pn2);
+void dmach_listraw(t_dmach *x, t_symbol *s, int argc, t_atom *argv);
+void dmach_clickincr(t_dmach *x, t_floatarg toggle);
+void dmach_instant_recall(t_dmach *x, t_floatarg toggle);
+
+
+
+
+void dmach_tilde_setup(void){
+	dmach_class = class_new(gensym("dmach~"), (t_newmethod)dmach_new,
+							(t_method)dmach_dsp_free,sizeof(t_dmach), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(dmach_class, t_dmach, x_f);
+	class_addmethod(dmach_class,(t_method)dmach_dsp,gensym("dsp"),0);
+	class_addmethod(dmach_class,(t_method)dmach_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(dmach_class,(t_method)dmach_show,gensym("show"),A_FLOAT,0);
+	class_addmethod(dmach_class,(t_method)dmach_tempo,gensym("tempo"),A_FLOAT,0);
+	class_addmethod(dmach_class,(t_method)dmach_store,gensym("store"),A_GIMME,0);
+	class_addmethod(dmach_class,(t_method)dmach_recall,gensym("recall"),A_FLOAT,0);
+	class_addmethod(dmach_class,(t_method)dmach_transpose,gensym("transpose"),A_FLOAT,A_FLOAT, 0);
+	class_addmethod(dmach_class,(t_method)dmach_gain,gensym("gain"),A_FLOAT,A_FLOAT, 0);
+	class_addmethod(dmach_class,(t_method)dmach_printraw,gensym("printraw"),A_FLOAT,0);
+	class_addmethod(dmach_class,(t_method)dmach_arm,gensym("arm"),A_FLOAT,0);
+	class_addmethod(dmach_class,(t_method)dmach_readraw,gensym("readraw"),A_GIMME,0);
+	class_addmethod(dmach_class,(t_method)dmach_listraw,gensym("listraw"),A_GIMME,0);
+	class_addmethod(dmach_class,(t_method)dmach_playsequence,gensym("playsequence"),A_GIMME,0);
+	class_addmethod(dmach_class,(t_method)dmach_slotamps,gensym("slotamps"),A_GIMME,0);
+	class_addmethod(dmach_class,(t_method)dmach_slotampsfull,gensym("slotampsfull"),A_GIMME,0);
+	class_addmethod(dmach_class,(t_method)dmach_slotincrs,gensym("slotincrs"),A_GIMME,0);
+	class_addmethod(dmach_class,(t_method)dmach_loopsequence,gensym("loopsequence"),A_GIMME,0);
+	class_addmethod(dmach_class,(t_method)dmach_muteslot,gensym("muteslot"),A_GIMME,0);
+	class_addmethod(dmach_class,(t_method)dmach_nosequence,gensym("nosequence"),0);
+	class_addmethod(dmach_class,(t_method)dmach_copypattern,gensym("copypattern"),A_FLOAT,A_FLOAT, 0);
+	class_addmethod(dmach_class,(t_method)dmach_clickincr,gensym("clickincr"),A_FLOAT,0);
+	class_addmethod(dmach_class,(t_method)dmach_instant_recall,gensym("instant_recall"),A_FLOAT,0);
+	
+ 	potpourri_announce(OBJECT_NAME);
+}
+
+
+void dmach_muteslot(t_dmach *x, t_symbol *s, int argc, t_atom *argv)
+{
+	int slot;
+	int drum_count = x->drum_count;
+	short mutestate;
+	
+	if(argc < 2){
+		post("muteslot: pattern number, slot number");
+		return;
+	}
+	
+	slot = (int)atom_getfloatarg(0,argc,argv);
+	mutestate = (short)atom_getfloatarg(1,argc,argv);
+	
+	
+	if(slot < 0 || slot > drum_count - 1){
+		error("muteslot: illegal slot index: %d",slot);
+		return;
+	}
+	x->muted[slot] = mutestate;
+}
+
+void dmach_nosequence(t_dmach *x)
+{
+	x->playsequence = 0;
+	x->loopsequence = 0;
+}
+
+void dmach_playsequence(t_dmach *x, t_symbol *s, int argc, t_atom *argv)
+{
+	int i;
+	int pnum;
+	
+	if(argc < 1){
+		error("%s: zero length sequence",OBJECT_NAME);
+		return;
+	}
+	/* need safety check here */
+	for(i = 0; i < argc; i++){
+		pnum = (int) atom_getfloatarg(i,argc,argv);
+		if(! x->stored_patterns[pnum]){
+			error("%d is not currently stored",pnum);
+			return;
+		}
+	}
+    
+	for(i = 0; i < argc; i++){
+		x->sequence[i] = (int) atom_getfloatarg(i,argc,argv);
+	}
+    
+	//
+	
+	
+	if(x->instant_recall){
+		x->this_pattern = x->sequence[0];
+		x->clocker = x->patterns[x->this_pattern].dsamps;
+	} else {
+		x->next_pattern = x->sequence[0];
+	}
+	
+	x->mute = 0;
+	x->playsequence = 1;
+	x->loopsequence = 0;
+	x->sequence_length = argc;
+	x->seqptr = 0;
+}
+void dmach_loopsequence(t_dmach *x, t_symbol *s, int argc, t_atom *argv)
+{
+	int i;
+	int pnum;
+	
+	if(argc < 1){
+		error("%s: zero length sequence",OBJECT_NAME);
+		return;
+	}
+	
+	for(i = 0; i < argc; i++){
+		pnum = (int) atom_getfloatarg(i,argc,argv);
+		if(! x->stored_patterns[pnum]){
+			error("%d is not currently stored",pnum);
+			return;
+		}
+	}
+	
+	for(i = 0; i < argc; i++){
+		x->sequence[i] = (int) atom_getfloatarg(i,argc,argv);
+	}
+    
+	if(x->instant_recall){
+		x->this_pattern = x->sequence[0];
+		x->clocker = x->patterns[x->this_pattern].dsamps;
+	} else {
+		x->next_pattern = x->sequence[0];
+	}
+	
+	x->mute = 0;
+	x->playsequence = 1;
+	x->loopsequence = 1;
+	x->sequence_length = argc;
+	x->seqptr = 0;
+}
+
+void dmach_gain(t_dmach *x, t_floatarg slotf, t_floatarg new_gain_factor)
+{
+	int slot = slotf;
+    //	float ratio;
+    //	float gain_factor;
+    //	short *stored_patterns = x->stored_patterns;
+	float *gains = x->gains;
+    //	t_pattern *p = x->patterns;
+	int drum_count = x->drum_count;
+    //	int i,j,k;
+	
+	if(slot < 0 || slot > drum_count - 1){
+		error("illegal slot index: %d",slot);
+		return;
+	}
+	/* if(new_gain_factor <= 0){
+     error("illegal gain factor %f", new_gain_factor);
+     return;
+     } */
+    //	gain_factor = gains[slot];
+    //	ratio = new_gain_factor / gain_factor;
+	gains[slot] = new_gain_factor;
+}
+
+void dmach_transpose(t_dmach *x, t_floatarg slotf, t_floatarg new_transpose_factor)
+{
+	int slot = slotf;
+	float *gtranspose = x->gtranspose;
+	int drum_count = x->drum_count;
+	
+	if(slot < 0 || slot > drum_count - 1){
+		error("%s: transpose given illegal slot index: %d",OBJECT_NAME, slot);
+		return;
+	}
+	if(new_transpose_factor == 0){
+		error("illegal transpose factor %f", new_transpose_factor);
+		return;
+	}
+	gtranspose[slot] = new_transpose_factor;
+	
+}
+
+
+void dmach_recall(t_dmach *x, t_floatarg pnf)
+{
+	int pnum = pnf;
+	
+	/* post("requested recall of %d, ignored",pnum);
+     return;*/
+	if(pnum < 0){
+		error("requested index is less than zero");
+		return;
+	}
+	if(pnum >= MAX_PATTERNS){
+		error("requested index is greater than the maximum of %d",MAX_PATTERNS-1);
+		return;
+	}
+	if(! x->stored_patterns[pnum]){
+		error("%d is not currently stored",pnum);
+		return;
+	}
+    //	x->this_pattern = x->next_pattern = pnum;
+	x->mute = 0;
+	x->next_pattern = pnum;
+}
+
+void dmach_arm(t_dmach *x, t_floatarg pnf)
+{
+	int pnum = pnf;
+	int i;
+	t_pattern *p = x->patterns;
+    
+	if(pnum < 0){
+		error("requested index is less than zero");
+		return;
+	}
+	if(pnum > MAX_PATTERNS){
+		error("%s: requested index is greater than the maximum of %d",OBJECT_NAME,MAX_PATTERNS-1);
+		return;
+	}
+	if(! x->stored_patterns[pnum]){
+		error("%s: %d is not currently stored",OBJECT_NAME,pnum);
+		return;
+	}
+	x->mute = 1;
+	x->clocker = 0;
+	x->next_pattern = x->this_pattern = pnum;
+	for(i = 0; i < x->drum_count; i++){ /* reset pointers */
+		p[x->this_pattern].drumlines[i].adex = 0;
+	}
+}
+
+
+void dmach_tempo(t_dmach *x, t_floatarg new_tempo)
+{
+	float ratio;
+	int i, j, k;
+	short *stored_patterns = x->stored_patterns;
+	t_pattern *p = x->patterns;
+	int drum_count = x->drum_count;
+	float sr = x->sr;
+	float tempo_factor = x->tempo_factor;
+	if(new_tempo <= 0.0){
+		error("tempo must be greater than zero, but was %f",new_tempo);
+		return;
+	}
+	ratio = x->tempo / new_tempo;
+	x->clocker *= ratio;
+	x->tempo = new_tempo;
+    tempo_factor = (60.0/new_tempo);
+    
+	for(i = 0; i < MAX_PATTERNS; i++){
+		if(stored_patterns[i]){
+            p[i].dsamps = p[i].beats * tempo_factor * sr;
+			for(j = 0; j < drum_count; j++){
+			    if(p[i].drumlines[j].active){
+                    for(k = 0; k < p[i].drumlines[j].attack_count; k++){
+                        p[i].drumlines[j].attacks[k].trigger_point *= ratio;
+                    }
+			    }
+			}
+		}
+	}
+	x->tempo_factor = tempo_factor;
+}
+void dmach_show(t_dmach *x, t_floatarg fn)
+{
+	int i,j;
+	int pnum = (int) fn;
+    t_pattern *p = x->patterns;
+    t_attack *ptr;
+    int drum_count = x->drum_count;
+    
+    if(pnum < 0 || pnum > MAX_PATTERNS-1){
+    	error("illegal pattern number: %d",pnum);
+    	return;
+    }
+    
+	if(! x->stored_patterns[pnum]){
+		error("%d is not currently stored",pnum);
+		return;
+	}
+	post("showing pattern %d",pnum);
+    /* need to check if pattern is valid */
+    
+    for(j = 0; j < drum_count; j++){
+        if(p[pnum].drumlines[j].active){
+            post("*** drum line for slot %d ***",j);
+            ptr = p[pnum].drumlines[j].attacks;
+            post("there are %d attacks",p[pnum].drumlines[j].attack_count);
+            for(i = 0; i < p[pnum].drumlines[j].attack_count; i++){
+                post("amp: %f, transp: %f, trigger: %f",
+                     ptr->amplitude, ptr->increment, ptr->trigger_point);
+                ptr++;
+            }
+        }
+    }
+}
+
+void dmach_printraw(t_dmach *x, t_floatarg fn)
+{
+	int i,j;
+	int pnum = (int) fn;
+    t_pattern *p = x->patterns;
+    t_attack *ptr;
+    int drum_count = x->drum_count;
+    float normalized_trigger;
+    float tempo_factor = x->tempo_factor;
+    float sr = x->sr;
+    
+    if(pnum < 0 || pnum > MAX_PATTERNS-1){
+    	error("illegal pattern number: %d",pnum);
+    	return;
+    }
+    
+	if(! x->stored_patterns[pnum]){
+		error("%d is not currently stored",pnum);
+		return;
+	}
+    if(!tempo_factor){
+        error("tempo factor is zero!");
+        return;
+    }
+    
+	post("readraw %d %f",pnum, p[pnum].beats);
+    for(j = 0; j < drum_count; j++){
+        if(p[pnum].drumlines[j].active){
+            ptr = p[pnum].drumlines[j].attacks;
+            post("%d %d",j, p[pnum].drumlines[j].attack_count);
+            
+            for(i = 0; i < p[pnum].drumlines[j].attack_count; i++){
+                /* scale attack times to factor out sample rate and tempo */
+                normalized_trigger = ptr->trigger_point / (tempo_factor * sr);
+                post("%f %f %f",
+                     ptr->amplitude, ptr->increment, normalized_trigger);
+                ptr++;
+            }
+        }
+    }
+}
+
+void dmach_listraw(t_dmach *x, t_symbol *s, int argc, t_atom *argv)
+{
+	int i,j;
+	int pnum;
+    t_pattern *p = x->patterns;
+    t_attack *ptr;
+    int drum_count = x->drum_count;
+    float normalized_trigger;
+    float tempo_factor = x->tempo_factor;
+    float sr = x->sr;
+    int ldex = 0;
+    t_atom *listdata = x->listdata;
+    
+    if(argc < 1){
+        pnum = x->this_pattern;
+    } else {
+  		pnum = (int) atom_getfloatarg(0,argc,argv);
+    }
+    if(pnum < 0 || pnum > MAX_PATTERNS-1){
+        error("illegal pattern number: %d",pnum);
+        return;
+    }
+    
+	if(! x->stored_patterns[pnum]){
+		error("%d is not currently stored",pnum);
+		return;
+	}
+    if(!tempo_factor){
+        error("tempo factor is zero!");
+        return;
+    }
+    
+    /* note: format of MACROS requires that ldex be incremented outside of
+     call. Also note that traditional indexing A[x] cannot be used; instead must
+     use A+x format. */
+
+    SETSYMBOL(listdata + ldex, gensym("readraw")); ++ldex;
+    
+    SETFLOAT(listdata + ldex, (float)pnum);  ++ldex;
+	SETFLOAT(listdata + ldex, p[pnum].beats);  ++ldex;
+    
+    for(j = 0; j < drum_count; j++){
+        if(p[pnum].drumlines[j].active){
+            ptr = p[pnum].drumlines[j].attacks;
+            SETFLOAT(listdata + ldex, (float)j); ++ldex;
+            SETFLOAT(listdata + ldex, (float)(p[pnum].drumlines[j].attack_count)); ++ldex;
+            
+            for(i = 0; i < p[pnum].drumlines[j].attack_count; i++){
+                normalized_trigger = ptr->trigger_point / (tempo_factor * sr);
+                SETFLOAT(listdata + ldex, ptr->amplitude); ++ldex;
+                SETFLOAT(listdata + ldex, ptr->increment); ++ldex;
+                SETFLOAT(listdata + ldex, normalized_trigger); ++ldex;
+                ptr++;
+            }
+        }
+    }
+    outlet_list(x->listraw_outlet,0,ldex,listdata);
+}
+
+void dmach_copypattern(t_dmach *x, t_floatarg pn1, t_floatarg pn2)
+{
+	int i,j;
+	int pnum_from = (int) pn1;
+	int pnum_to = (int) pn2;
+    t_pattern *p = x->patterns;
+    t_attack *ptr_from, *ptr_to;
+    int drum_count = x->drum_count;
+    
+    if(pnum_from < 0 || pnum_from > MAX_PATTERNS-1){
+    	error("illegal source pattern number: %d",pnum_from);
+    	return;
+    }
+    if(pnum_to < 0 || pnum_to > MAX_PATTERNS-1){
+    	error("illegal dest pattern number: %d",pnum_to);
+    	return;
+    }
+    if(pnum_from == pnum_to){
+        error("source and dest patterns are the same");
+        return;
+    }
+	if(! x->stored_patterns[pnum_from]){
+		error("%d is not currently stored",pnum_from);
+		return;
+	}
+	dmach_init_pattern(x,pnum_to);
+    //	post("readraw %d %f %f",pnum, p[pnum].beats, p[pnum].dsamps);
+    
+	p[pnum_to].beats = p[pnum_from].beats;
+	p[pnum_to].dsamps = p[pnum_from].dsamps;
+	
+    for(j = 0; j < drum_count; j++){
+        p[pnum_to].drumlines[j].active = p[pnum_from].drumlines[j].active;
+        if(p[pnum_from].drumlines[j].active){
+            ptr_from = p[pnum_from].drumlines[j].attacks;
+            ptr_to = p[pnum_to].drumlines[j].attacks;
+            p[pnum_to].drumlines[j].attack_count = p[pnum_from].drumlines[j].attack_count;
+            for(i = 0; i < p[pnum_from].drumlines[j].attack_count; i++){
+                ptr_to->amplitude = ptr_from->amplitude;
+                ptr_to->increment = ptr_from->increment;
+                ptr_to->trigger_point = ptr_from->trigger_point;
+                ptr_from++;
+                ptr_to++;
+            }
+        }
+    }
+    x->stored_patterns[pnum_to] = 1;// assert that a legal pattern is now stored there
+}
+
+void dmach_readraw(t_dmach *x, t_symbol *s, int argc, t_atom *argv)
+{
+	int i;
+	int pnum;
+	int pdex = 0;
+	int slot;
+    t_pattern *p = x->patterns;
+    t_attack *ptr;
+    //  int drum_count = x->drum_count;
+	float tempo_factor = x->tempo_factor;
+	float sr = x->sr;
+	short mutein;
+	
+	mutein = x->mute;
+	x->mute = 1;
+	pnum = (int) atom_getfloatarg(pdex++,argc,argv);
+    
+    
+    if(pnum < 0 || pnum > MAX_PATTERNS-1){
+    	error("%s: illegal pattern number: %d",OBJECT_NAME,pnum);
+    	return;
+    }
+    
+	if(! x->stored_patterns[pnum]){
+        x->stored_patterns[pnum] = 1; // means there's something there now
+        dmach_init_pattern(x,pnum);
+        post("readraw: loading pattern %d",pnum);
+        
+	} else {
+		post("readraw: reloading pattern %d",pnum);
+	}
+	p[pnum].beats = atom_getfloatarg(pdex++,argc,argv);
+    //	p[pnum].dsamps = atom_getfloatarg(pdex++,argc,argv);
+	p[pnum].dsamps = p[pnum].beats * tempo_factor * sr;
+    //	post("dsamps calculated to be %f", p[pnum].dsamps);
+	while(pdex < argc){
+		slot = (int) atom_getfloatarg(pdex++,argc,argv);
+		p[pnum].drumlines[slot].active = 1;
+		p[pnum].drumlines[slot].attack_count = (int) atom_getfloatarg(pdex++,argc,argv);
+		p[pnum].drumlines[slot].adex = 0;
+		ptr = p[pnum].drumlines[slot].attacks;
+		for(i = 0; i < p[pnum].drumlines[slot].attack_count; i++){
+            ptr->amplitude = atom_getfloatarg(pdex++,argc,argv);
+            ptr->increment = atom_getfloatarg(pdex++,argc,argv);
+            ptr->trigger_point = (sr * tempo_factor) * atom_getfloatarg(pdex++,argc,argv);
+			ptr++;
+		}
+		
+	}
+	x->this_pattern = x->next_pattern = pnum;
+	x->virgin = 0;
+	x->mute = mutein;
+}
+
+void dmach_slotamps(t_dmach *x, t_symbol *s, int argc, t_atom *argv)
+{
+	int pdex,i;
+	int slot = 0;
+	float beatseg;
+    //	float tmpbeats;
+	float subdiv;
+	float beat_samps;
+	float tempo_factor;
+	int attack_count;
+	int local_attacks;
+	float trigger_point;
+	float val;
+	int pnum;
+	t_pattern *p = x->patterns;
+	float tempo = x->tempo;
+	float sr = x->sr;
+	t_attack *tmpatks = x->tmpatks;
+	
+    
+	
+	pdex = 0;
+	pnum = atom_getfloatarg(pdex++,argc,argv);
+    /*
+     post("skipping slotamps for %d",pnum);
+     return;*/
+    
+	if(pnum < 0 || pnum > MAX_PATTERNS - 1){
+		error("%s: invalid pattern number: %d",OBJECT_NAME,pnum);
+		return;
+	}
+	
+	if(!x->stored_patterns[pnum]){
+		error("%s: no pattern found at location : %d",OBJECT_NAME,pnum);
+		return;
+	}
+    
+	slot = (int) atom_getfloatarg(pdex++,argc,argv);
+	if(slot < 0 || slot >= x->drum_count){
+		post("%s: %d is an illegal slot",OBJECT_NAME,slot);
+		return;
+	}
+    //	post("filling slotamps %d for %d",slot, pnum);
+	if(tempo <= 0){
+		tempo = 60;
+		error("zero tempo found");
+	}
+	tempo_factor = (60.0/tempo);
+	
+	beatseg = p[pnum].beats; // less general but we're going for ease here
+	subdiv = atom_getfloatarg(pdex++,argc,argv);
+	beat_samps = (beatseg/subdiv) * tempo_factor * sr;
+    trigger_point = 0;
+    attack_count = 0;
+	/* read attack cycle and store any non-zero attacks */
+	local_attacks = 0;
+	// clean me
+	memset((void *)tmpatks, 0, MAX_ATTACKS * sizeof(t_attack) );
+	
+	for(i = 0; i < subdiv; i++){
+		val = atom_getfloatarg(pdex++,argc,argv);
+		if(val){
+			tmpatks[local_attacks].amplitude = val;
+			// force to integer sample point
+			tmpatks[local_attacks].trigger_point = (int)trigger_point;
+			++local_attacks;
+		}
+		trigger_point += beat_samps;
+	}
+    
+	/* initialize with increment of 1.0 for each non-zero amplitude attack. */
+	for(i = 0; i < local_attacks; i++){
+		if(tmpatks[i].amplitude) {
+			tmpatks[i].increment = 1.0;
+		} else {
+			tmpatks[i].increment = 0.0;
+		}
+	}
+	p[pnum].drumlines[slot].active = 0;
+	memcpy((void *)p[pnum].drumlines[slot].attacks,(void *)tmpatks,
+           MAX_ATTACKS * sizeof(t_attack));
+	p[pnum].drumlines[slot].attack_count = local_attacks;
+	p[pnum].drumlines[slot].adex = 0;
+	p[pnum].drumlines[slot].active = 1;
+	x->this_pattern = x->next_pattern = pnum; // set pattern to what we're working on
+    
+    
+}
+
+
+
+/* more general version */
+void dmach_slotampsfull(t_dmach *x, t_symbol *s, int argc, t_atom *argv)
+{
+	int pdex,i;
+	int slot = 0;
+	float beatseg;
+	float tmpbeats;
+	float subdiv;
+	float beat_samps;
+	float tempo_factor;
+	int attack_count;
+	int local_attacks;
+	float trigger_point;
+	float val;
+	int pnum;
+	t_pattern *p = x->patterns;
+	float tempo = x->tempo;
+	float sr = x->sr;
+	
+	if(argc > MAX_ATTACKS + 1){
+		post("%s: %d is too long an atk message",OBJECT_NAME,argc);
+		return;
+	}
+	pdex = 0;
+	pnum = atom_getfloatarg(pdex++,argc,argv);
+	
+	if(pnum < 0 || pnum > MAX_PATTERNS - 1){
+		error("%s: invalid pattern number: %d",OBJECT_NAME,pnum);
+		return;
+	}
+	
+	if(!x->stored_patterns[pnum]){
+		error("%s: no pattern found at location : %d",OBJECT_NAME,pnum);
+		return;
+	}
+	
+	x->this_pattern = x->next_pattern = pnum; // set current pattern to what we're working on
+	
+	slot = (int) atom_getfloatarg(pdex++,argc,argv);
+	p[pnum].drumlines[slot].active = 1;
+	tempo_factor = (60.0/tempo);
+	tmpbeats = p[pnum].beats;
+	
+	
+    trigger_point = 0;
+    attack_count = 0;
+    while(tmpbeats > 0){
+		local_attacks = 0;
+		beatseg = atom_getfloatarg(pdex++,argc,argv);
+		subdiv = atom_getfloatarg(pdex++,argc,argv);
+		beat_samps = (beatseg/subdiv) * tempo_factor * sr;
+		/* read attack cycle and store any non-zero attacks */
+		local_attacks = 0;
+		for(i = 0; i < subdiv; i++){
+			val = atom_getfloatarg(pdex++,argc,argv);
+			if(val){
+				p[pnum].drumlines[slot].attacks[attack_count + local_attacks].amplitude = val;
+				/* force to integer sample point (couldn't get round() to work) */
+				p[pnum].drumlines[slot].attacks[attack_count + local_attacks].trigger_point = (int)trigger_point;
+				++local_attacks;
+			}
+			trigger_point += beat_samps;
+		}
+        for(i = 0; i < local_attacks; i++){
+			p[pnum].drumlines[slot].attacks[i + attack_count].increment = 1.0;
+        }
+        tmpbeats -= beatseg;
+        attack_count += local_attacks;
+	}
+	p[pnum].drumlines[slot].attack_count = attack_count;
+    
+}
+
+void dmach_slotincrs(t_dmach *x, t_symbol *s, int argc, t_atom *argv)
+{
+    int pdex,i;
+    int slot = 0;
+    int local_attacks;
+	int pnum;
+    t_pattern *p = x->patterns;
+
+	if(argc > MAX_ATTACKS + 1){
+		post("%s: %d is too long a slotincrs message",OBJECT_NAME,argc);
+		return;
+	}
+    pdex = 0;
+	pnum = (int) atom_getfloatarg(pdex++,argc,argv);
+    slot = (int) atom_getfloatarg(pdex++,argc,argv);
+	if(slot < 0 || slot >= x->drum_count){
+		post("%s: %d is an illegal slot",OBJECT_NAME,slot);
+		return;
+	}
+    local_attacks = p[pnum].drumlines[slot].attack_count;
+    if(argc != local_attacks + 2){
+        // post("rejected slotincrs with %d local atks, argc = %d",local_attacks, argc - 2);
+        return;
+    }
+    //  post("%d local atks, argc = %d",local_attacks, argc);
+    
+    
+    if(pnum < 0 || pnum >= MAX_PATTERNS){
+        error("%s: slotincrs sent invalid pattern number: %d",OBJECT_NAME,pnum);
+        return;
+    }
+    
+    if(!x->stored_patterns[pnum]){
+        error("%s: slotincrs: no pattern found at location : %d",OBJECT_NAME,pnum);
+		return;
+    }
+	
+    
+    
+    
+    
+    //  post("filling slotincr for slot %d pnum %d",slot, pnum);
+    
+    
+    
+    for(i = 0; i < local_attacks; i++){
+		p[pnum].drumlines[slot].attacks[i].increment = atom_getfloatarg(pdex++,argc,argv);
+    }
+    x->this_pattern = x->next_pattern = pnum; // set current pattern to what we're working on
+    
+    //  x->mute = mutein;
+}
+
+void dmach_store(t_dmach *x, t_symbol *s, int argc, t_atom *argv)
+{
+    int pdex,i;
+    int slot = 0;
+    float beatseg;
+    float tmpbeats;
+    float subdiv;
+    float beat_samps;
+    float tempo_factor = x->tempo_factor;
+    int attack_count;
+    int local_attacks;
+    float trigger_point;
+    float val;
+	int pnum;
+    t_pattern *p = x->patterns;
+    float tempo = x->tempo;
+    float sr = x->sr;
+    
+    
+    
+    pnum = atom_getfloatarg(0,argc,argv);
+    if(pnum < 0 || pnum > MAX_PATTERNS - 1){
+        error("invalid pattern number: %d",pnum);
+        return;
+    }
+    //  post("%d arguments to \"store\" at pattern %d",argc,pnum);
+    
+    dmach_init_pattern(x,pnum);
+    
+    p[pnum].beats = atom_getfloatarg(1,argc,argv);
+    if(p[pnum].beats <= 0){
+        post("illegal beats at pnum %d: %f",pnum,p[pnum].beats);
+        p[pnum].beats = 4;
+    }
+    if(tempo <= 0){
+        error("zero tempo in store msg");
+        tempo = 60;
+    }
+    tempo_factor = (60.0/tempo);
+    p[pnum].dsamps = p[pnum].beats * tempo_factor * sr;
+    pdex = 2;
+    
+    //  post("%f beats %f samps in this pattern",p[pnum].beats,p[pnum].dsamps );
+    while(pdex < argc){
+        slot = atom_getfloatarg(pdex++,argc,argv);
+        p[pnum].drumlines[slot].active = 1;
+        tmpbeats = p[pnum].beats;
+        
+        trigger_point = 0;
+        attack_count = 0;
+        while(tmpbeats > 0){
+            local_attacks = 0;
+            beatseg = atom_getfloatarg(pdex++,argc,argv);
+            subdiv = atom_getfloatarg(pdex++,argc,argv);
+            beat_samps = (beatseg/subdiv) * tempo_factor * sr;
+            
+            /* read attack cycle and store any non-zero attacks */
+            for(i = 0; i < subdiv; i++){
+				val = atom_getfloatarg(pdex++,argc,argv);
+				if(val){
+                    p[pnum].drumlines[slot].attacks[attack_count + local_attacks].amplitude = val;
+                    /* force to integer sample point (couldn't get round() to work) */
+                    p[pnum].drumlines[slot].attacks[attack_count + local_attacks].trigger_point = (int)trigger_point;
+                    ++local_attacks;
+				}
+				trigger_point += beat_samps;
+            }
+            /* we now know number of attacks and read that many transpose factors */
+            
+            for(i = 0; i < local_attacks; i++){
+				p[pnum].drumlines[slot].attacks[i + attack_count].increment = atom_getfloatarg(pdex++,argc,argv);
+            }
+            tmpbeats -= beatseg;
+            attack_count += local_attacks;
+        }
+        p[pnum].drumlines[slot].attack_count = attack_count;
+        //	post("%d attacks in slot %d for pattern %d",attack_count, slot, pnum);
+    }
+    // new - set internal pointer to start of array
+    p[pnum].drumlines[slot].adex = 0;
+    // set current pattern to this (to avoid crash if pnum 0 is uninitialized)
+    x->this_pattern = x->next_pattern = pnum;
+    x->virgin = 0; // now at least one pattern is stored
+    x->stored_patterns[pnum] = 1; // means there's something there now
+    x->tempo_factor = tempo_factor;//restore this value
+    //  post("pattern stored at %d with %f beats",pnum,p[pnum].beats);
+}
+
+
+void dmach_init_pattern(t_dmach *x, int pnum)
+{
+    int i;
+    int drum_count = x->drum_count;
+    t_pattern *p = x->patterns;
+    if(pnum < 0 || pnum >= MAX_PATTERNS){
+        error("invalid pattern number: %d",pnum);
+        return;
+    }
+    
+    
+    
+    if( x->stored_patterns[pnum] ){
+        // post("replacing pattern stored at %d",pnum);
+    }
+    
+    if(p[pnum].drumlines == NULL){
+        // post("initializing drumline memory at location %d",pnum);
+        p[pnum].drumlines = (t_drumline *)malloc(drum_count * sizeof(t_drumline));
+    }
+    
+    
+    for(i = 0; i < drum_count; i++){
+        p[pnum].drumlines[i].attacks = (t_attack *)calloc(MAX_ATTACKS, sizeof(t_attack));
+        p[pnum].drumlines[i].adex = 0;
+        p[pnum].drumlines[i].active = 0;
+        p[pnum].drumlines[i].attack_count = 0;
+    }
+    
+    
+}
+
+void dmach_dsp_free( t_dmach *x )
+{
+    /* need some freeing action here! */
+	free(x->patterns);
+	free(x->stored_patterns);
+	free(x->current_increment);
+	free(x->gtranspose);
+	free(x->gains);
+	free(x->sequence);
+	free(x->listdata);
+	free(x->connected);
+	free(x->tmpatks);
+	free(x->muted);
+}
+
+void dmach_mute(t_dmach *x, t_floatarg toggle)
+{
+	x->mute = (short)toggle;
+}
+
+void dmach_instant_recall(t_dmach *x, t_floatarg toggle)
+{
+	x->instant_recall = (short)toggle;
+}
+
+void dmach_clickincr(t_dmach *x, t_floatarg toggle)
+{
+	x->clickincr = (short)toggle;
+}
+
+
+
+void *dmach_new(t_symbol *s, int argc, t_atom *argv)
+{
+  	int i;
+	t_dmach *x;
+	x = (t_dmach *)pd_new(dmach_class);
+	
+	if(argc >= 1)
+		x->tempo = atom_getfloatarg(0,argc,argv);
+	else
+		x->tempo = 120;
+	if(argc >= 2)
+		x->drum_count = atom_getfloatarg(1,argc,argv);
+	else
+		x->drum_count = 8;
+	
+	x->outlet_count = x->drum_count * 2 + 1; // one extra for pattern start click
+
+    for(i = 0; i < x->outlet_count; i++){
+        outlet_new(&x->x_obj, gensym("signal"));
+    }
+	x->listraw_outlet = outlet_new(&x->x_obj, gensym("list"));
+	x->patterns = (t_pattern *) malloc(MAX_PATTERNS * sizeof(t_pattern));
+	x->stored_patterns = (short *) malloc(MAX_PATTERNS * sizeof(short));
+	x->current_increment = (float *) malloc(x->drum_count * sizeof(float)); // for sample + hold of increment
+	x->gtranspose = (float *) malloc(x->drum_count * sizeof(float));
+	x->gains = (float *) malloc(x->drum_count * sizeof(float));
+	x->sequence = (int *) malloc(1024 * sizeof(int));
+	x->listdata = (t_atom *) malloc(1024 * sizeof(t_atom));
+	x->connected = (short *) malloc(1024 * sizeof(short));
+	x->tmpatks = (t_attack *)calloc(MAX_ATTACKS, sizeof(t_attack));
+	x->muted = (short *)calloc(x->drum_count, sizeof(short)); // by default mute is off on each slot
+    
+	x->seqptr = 0;
+	x->sequence_length = 0;
+	x->playsequence = 0;
+	x->loopsequence = 0;
+	x->zeroalias = -1.0;
+	x->clickincr = 0;
+	x->instant_recall = 0;
+	
+	
+	if(x->tempo <= 0 || x->tempo > 6666)
+		x->tempo = 60.0;
+    
+    //	post("initial tempo is %f",x->tempo);
+	for(i = 0; i < MAX_PATTERNS; i++){
+		x->patterns[i].drumlines = NULL;
+		x->stored_patterns[i] = 0;
+	}
+	x->this_pattern = x->next_pattern = 0;
+	x->mute = 0;
+    
+	x->clocker = 0;
+	x->sr = sys_getsr();
+	x->tempo_factor = 60.0 / x->tempo ;
+    
+	for(i = 0; i < x->drum_count; i++){
+		x->gains[i] = 1.0;
+		x->gtranspose[i] = 1.0;
+		x->current_increment[i] = 1.0;
+	}
+	// safety - init memory for all drum patterns
+	for(i = 0; i < MAX_PATTERNS; i++){
+		dmach_init_pattern(x,i);
+	}
+	x->virgin = 1;
+    return (x);
+}
+
+
+
+t_int *dmach_perform(t_int *w)
+{
+    int i,j;
+    t_float *trig_outlet, *incr_outlet;
+    
+	t_dmach *x = (t_dmach *) w[1];
+	int outlet_count = x->outlet_count;
+    //	t_float *in_sync = (t_float *) w[2]; // input for sync trigger (not implemented yet)
+	t_float *sync = (t_float *) w[outlet_count + 2];
+	int n = (int) w[outlet_count + 3];
+    
+	int this_pattern = x->this_pattern;
+	int next_pattern = x->next_pattern;
+	t_pattern *p = x->patterns;
+	float *current_increment = x->current_increment;
+	float clocker = x->clocker;
+	float dsamps = p[this_pattern].dsamps;
+	int drum_count = x->drum_count;
+	int adex;
+	/* sequence stuff */
+	int *sequence = x->sequence;
+	short playsequence = x->playsequence;
+	short loopsequence = x->loopsequence;
+	short clickincr = x->clickincr;
+	int seqptr = x->seqptr;
+	int sequence_length = x->sequence_length;
+	short *connected = x->connected;
+	short *muted = x->muted;
+	float *gtranspose = x->gtranspose;
+	float *gains = x->gains;
+	
+	/* clean pnum click outlet */
+	memset((void *)sync, 0, n * sizeof(float));
+	
+	if( x->mute || x->virgin ){
+		for(i = 0; i < drum_count; i++){
+			if(connected[i * 2 + 1]){
+				// post("cleaning outlet pair %d", i);
+				trig_outlet = (t_float *) w[i * 2 + 3];
+				memset((void *)trig_outlet, 0, n * sizeof(float));
+			}
+		}
+		return w + (outlet_count + 4);
+	}
+	
+	/* pre-clean all connected trigger vectors */
+	for(i = 0; i < drum_count; i++){
+		if(connected[i * 2 + 1]){
+			trig_outlet = (t_float *) w[i * 2 + 3];
+			memset((void *)trig_outlet, 0, n * sizeof(float));
+		}
+	}
+	
+	for(j = 0; j < n; j++){
+		if(clocker >= dsamps){ // ready for next pattern now
+			clocker -= dsamps;
+ 			/* this is the pattern sequencer */
+ 			if(playsequence){
+  				if (seqptr >= sequence_length){
+					if(loopsequence){
+						seqptr = 0;
+					} else {
+						/* this is fine, the playthrough has concluded and we now mute external */
+						x->mute = 1;
+						goto escape;
+					}
+ 				}
+ 				this_pattern = sequence[seqptr++];
+                
+ 			}
+ 			/* we do this if we're not pattern sequencing: */
+			else if(next_pattern != this_pattern){
+				this_pattern = next_pattern;
+			}
+			
+			for(i = 0; i < drum_count; i++){ /* reset pointers */
+				p[this_pattern].drumlines[i].adex = 0;
+			}
+			/* send current bar number if in sequence. Note kludge for if
+             bar is 0. We cannot send a 0 click so we alias it to something else.
+             */
+			if(playsequence){
+				if(this_pattern){
+					sync[j] = this_pattern;
+				} else {
+					sync[j] = x->zeroalias;
+				}
+			} else{
+				sync[j] = 1; /* send a sync click */
+			}
+		}
+		else {
+			sync[j] = 0;
+		}
+		for(i = 0; i < drum_count; i++){
+			// float locamp;
+			if(p[this_pattern].drumlines[i].active && ! muted[i]){
+				trig_outlet = (t_float *) w[i * 2 + 3];
+				incr_outlet = (t_float *) w[i * 2 + 4];
+				
+				adex = p[this_pattern].drumlines[i].adex; // overflow danger ???
+                
+				if((int)clocker == (int)p[this_pattern].drumlines[i].attacks[adex].trigger_point){
+					current_increment[i] =
+                    p[this_pattern].drumlines[i].attacks[adex].increment * gtranspose[i];
+					/* put sync click into sample j of the output vector */
+                    
+					trig_outlet[j] =
+                    p[this_pattern].drumlines[i].attacks[adex].amplitude * gains[i];
+					++adex;
+					p[this_pattern].drumlines[i].adex = adex;
+					incr_outlet[j] = current_increment[i];
+					/*
+                     post("t: sample %d, slot %d, amp: %f, incr: %f",
+                     (int)clocker, i, locamp, current_increment[i]); */
+				}
+				else {
+					trig_outlet[j] = 0; // not sure we need these assignments ??
+					if(clickincr){
+						incr_outlet[j] = 0;
+					} else {
+						incr_outlet[j] = current_increment[i]; // samp + hold the increment to outlet
+					}
+				}
+				
+			} 
+		}
+		++clocker;
+	}
+	
+escape:
+	
+	x->clocker = clocker;
+	x->this_pattern = this_pattern;
+	x->seqptr = seqptr;
+	
+	return w + (outlet_count + 4);
+}		
+
+void dmach_dsp(t_dmach *x, t_signal **sp)
+{
+	long i;
+	t_int **sigvec;
+	int pointer_count;
+	
+    
+	if(x->virgin){
+		post("%s: no patterns are stored",OBJECT_NAME);
+        //		return;
+	}
+	if(x->sr != sp[0]->s_sr){
+		x->sr = sp[0]->s_sr;
+        /* still need to adjust every stored pattern dsamps variable */
+	}
+	
+	pointer_count = x->outlet_count + 3; // all outlets, 1 inlet, object and s_n
+	
+    //	post("pointer count %d", pointer_count);
+    
+    
+    // copy vector to be safe
+
+	for(i = 0; i < pointer_count - 2; i++){
+		x->connected[i] = 1;
+	}
+
+    
+	sigvec  = (t_int **) calloc(pointer_count, sizeof(t_int *));	
+	for(i = 0; i < pointer_count; i++){
+		sigvec[i] = (t_int *) calloc(sizeof(t_int),1);
+	}
+	sigvec[0] = (t_int *)x; // first pointer is to the object
+    
+	sigvec[pointer_count - 1] = (t_int *)sp[0]->s_n; // last pointer is to vector size (N)
+	
+	for(i = 1; i < pointer_count - 1; i++){ // now attach the inlet and all outlets
+		sigvec[i] = (t_int *)sp[i-1]->s_vec;
+	}	
+
+	dsp_addv(dmach_perform, pointer_count, (t_int *) sigvec); 
+	free(sigvec);
+}
+
diff --git a/externals/lyonpotpourri/dynss~-help.pd b/externals/lyonpotpourri/dynss~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..92499b50d9cbdc32d84c9f17cc0f53fb1c739bba
--- /dev/null
+++ b/externals/lyonpotpourri/dynss~-help.pd
@@ -0,0 +1,54 @@
+#N canvas 804 342 414 292 10;
+#X obj 33 212 *~ 0.1;
+#X obj 33 244 dac~;
+#X obj 23 13 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X msg 93 107 devx \$1;
+#X obj 270 140 hsl 70 12 0 1 0 0 dynss-devx dynss-devx-in devx -2 -8
+0 10 -261682 -1 -1 0 1;
+#X floatatom 93 89 5 0 0 0 - dynss-devx -, f 5;
+#X obj 270 165 hsl 70 12 0 1 0 0 dynss-devy dynss-devy-in devy -2 -8
+0 10 -261682 -1 -1 0 1;
+#X floatatom 154 88 5 0 0 0 - dynss-devy -, f 5;
+#X msg 154 106 devy \$1;
+#X obj 270 191 hsl 70 12 0 1 0 0 dynss-gain dynss-gain-in gain -2 -8
+0 10 -261682 -1 -1 0 1;
+#X floatatom 66 194 5 0 0 1 gain dynss-gain -, f 5;
+#X msg 34 106 freq \$1;
+#X obj 270 115 hsl 70 12 50 600 0 0 dynss-freq dynss-freq-in frequency
+-2 -8 0 10 -261682 -1 -1 0 1;
+#X floatatom 34 89 5 0 0 0 - dynss-freq -, f 5;
+#X obj 33 172 dynss~;
+#X obj 120 144 r dynss.messages;
+#N canvas 23 22 686 335 messages 0;
+#X msg 177 130 new_wave;
+#X msg 179 153 new_amps;
+#X msg 176 105 printwave;
+#X obj 107 225 s dynss.messages;
+#X msg 172 77 pointcount \$1;
+#X msg 172 40 4;
+#X msg 220 38 15;
+#X text 279 78 set the number of breakpoints in the waveform;
+#X text 250 111 print the breakpoints to the Pd window;
+#X text 245 137 generate a new waveform;
+#X text 245 154 generate new amplitudes \, but keep the y-values;
+#X connect 0 0 3 0;
+#X connect 2 0 3 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 0;
+#X connect 6 0 4 0;
+#X restore 71 243 pd messages;
+#X text 153 244 <- more info here;
+#X text 21 42 dynss~ - dynamic stochastic synthesis as described by
+Iannis Xenakis in "Formalized Music";
+#X connect 0 0 1 0;
+#X connect 0 0 1 1;
+#X connect 3 0 14 0;
+#X connect 5 0 3 0;
+#X connect 7 0 8 0;
+#X connect 8 0 14 0;
+#X connect 10 0 0 1;
+#X connect 11 0 14 0;
+#X connect 13 0 11 0;
+#X connect 14 0 0 0;
+#X connect 15 0 14 0;
diff --git a/externals/lyonpotpourri/dynss~.c b/externals/lyonpotpourri/dynss~.c
new file mode 100755
index 0000000000000000000000000000000000000000..70e9c9a39b56dadd9c661302895933695ea19730
--- /dev/null
+++ b/externals/lyonpotpourri/dynss~.c
@@ -0,0 +1,324 @@
+#include "MSPd.h"
+
+static t_class *dynss_class;
+
+#define MAXPOINTS (64)
+#define OBJECT_NAME "dynss~"
+#define COMPILE_DATE "9.02.07"
+#define OBJECT_VERSION "2.01"
+
+//pd version
+
+
+typedef struct _dynss
+{
+
+	t_object x_obj;
+    t_float x_f;
+    
+	long point_count; // how many points in waveform (including beginning and end point)
+	t_double freq; // frequency
+	long counter; // count samples
+	long period_samples; // how many samples in a period
+	float srate; // sampling rate
+	long current_point; // which point are we on
+	t_double *values;
+	long *point_breaks;
+	t_double *norm_breaks;
+	t_double *xdevs;
+	t_double *ydevs;
+	t_double devscale_x;
+	t_double devscale_y;
+} t_dynss;
+
+void dynss_tilde_setup(void);
+void *dynss_new(void);
+t_int *dynss_perform(t_int *w);
+void dynss_dsp(t_dynss *x, t_signal **sp);
+void version(void);
+float boundrand(float min, float max);
+void dynss_init(t_dynss *x,short initialized);
+void dynss_devx(t_dynss *x, t_floatarg f);
+void dynss_devy(t_dynss *x, t_floatarg f);
+void dynss_freq(t_dynss *x, t_floatarg f);
+void dynss_printwave(t_dynss *x);
+void dynss_new_wave(t_dynss *x);
+void dynss_pointcount(t_dynss *x, t_floatarg f);
+void dynss_new_amps(t_dynss *x);
+
+void dynss_tilde_setup(void)
+{
+	t_class *c;
+	c = class_new(gensym("dynss~"), (t_newmethod)dynss_new, 0, sizeof(t_dynss), 0,0);
+    CLASS_MAINSIGNALIN(c,t_dynss,x_f);
+	class_addmethod(c,(t_method)dynss_dsp, gensym("dsp"), A_CANT, 0);
+    
+	class_addmethod(c,(t_method)version,gensym("version"),0);
+	class_addmethod(c,(t_method)dynss_devx,gensym("devx"),A_FLOAT,0);
+	class_addmethod(c,(t_method)dynss_devy,gensym("devy"),A_FLOAT,0);
+	class_addmethod(c,(t_method)dynss_freq,gensym("freq"),A_FLOAT,0);
+	class_addmethod(c,(t_method)dynss_printwave,gensym("printwave"),0);
+	class_addmethod(c,(t_method)dynss_new_wave,gensym("new_wave"),0);
+	class_addmethod(c,(t_method)dynss_new_amps,gensym("new_amps"),0);
+	class_addmethod(c,(t_method)dynss_pointcount,gensym("pointcount"),A_FLOAT,0);
+	potpourri_announce(OBJECT_NAME);
+	dynss_class = c;
+}
+
+
+void dynss_pointcount(t_dynss *x, t_floatarg f)
+{
+	if(f >= 2 && f <= MAXPOINTS ){
+		x->point_count = (long) f;
+		dynss_init(x,0);
+	}
+}
+
+void dynss_freq(t_dynss *x, t_floatarg f)
+{
+	x->freq = fabs(f);
+}
+
+void dynss_devx(t_dynss *x, t_floatarg f)
+{
+	x->devscale_x = f;
+}
+
+void dynss_devy(t_dynss *x, t_floatarg f)
+{
+	x->devscale_y = f;
+}
+
+void version(void)
+{
+	post("%s version %s, compiled %s",OBJECT_NAME, OBJECT_VERSION, COMPILE_DATE);
+}
+
+void dynss_printwave(t_dynss *x)
+{
+	int i;
+	for(i = 0; i < x->point_count; i++){
+		post("point %d break %d norm break %f value %f",i, x->point_breaks[i], x->norm_breaks[i], x->values[i]);
+	}
+}
+
+void dynss_new_wave(t_dynss *x)
+{
+	dynss_init(x,0);
+}
+
+void dynss_new_amps(t_dynss *x)
+{
+	int i;
+	for(i = 1; i < x->point_count - 1; i++){
+		x->values[i] = boundrand(-0.95, 0.95);
+	}
+}
+
+
+void *dynss_new(void)
+{
+	t_dynss *x = (t_dynss *)pd_new(dynss_class);
+    outlet_new(&x->x_obj, gensym("signal"));
+	x->srate = sys_getsr();
+	x->point_count = 6; // including fixed start and endpoint, so just 4 dynamic points
+	
+	x->values = (t_double *) calloc(MAXPOINTS + 2, sizeof(t_double));
+	x->point_breaks = (long *) calloc(MAXPOINTS + 2, sizeof(long));
+	x->norm_breaks = (t_double *) calloc(MAXPOINTS + 2, sizeof(t_double));
+	x->xdevs = (t_double *) calloc(MAXPOINTS + 2, sizeof(t_double));
+	x->ydevs = (t_double *) calloc(MAXPOINTS + 2, sizeof(t_double));
+	
+	if(! x->srate ){
+		x->srate = 44100;
+		post("sr autoset to 44100");
+	}
+	x->freq = 100.0;
+	
+	srand(time(0));
+
+	dynss_init(x,0); 
+	
+	return (x);
+}
+
+
+float boundrand(float min, float max)
+{
+	return min + (max-min) * ((float) (rand() % RAND_MAX)/ (float) RAND_MAX);
+}
+
+void dynss_init(t_dynss *x,short initialized)
+{
+	int i,j;
+	float findex;
+	long point_count = x->point_count;
+	t_double *values = x->values;
+	t_double *norm_breaks = x->norm_breaks;
+	long *point_breaks = x->point_breaks;
+	t_double *ydevs = x->ydevs;
+	t_double *xdevs =x->xdevs;
+
+	
+    if(!initialized){
+		x->period_samples = (long)(x->srate / x->freq);
+		x->counter = 0;
+		x->current_point = 0;
+		x->devscale_x = 0.0; // no evolution by default
+		x->devscale_y = 0.0;
+		// post("there are %d samples per period, srate %f freq %f", x->period_samples, x->srate, x->freq);
+		norm_breaks[0] = 0.0;
+		norm_breaks[point_count - 1] = 1.0;
+		values[0] = values[point_count - 1] = 0.0;
+		for(i = 1; i < point_count - 1; i++){
+			values[i] = boundrand(-1.0, 1.0);
+			norm_breaks[i] = boundrand(0.05,0.95);
+		}
+		// now sort into order (insertion sort)
+
+		for(i = 1; i < point_count; i++){
+			findex = norm_breaks[i];
+			j = i;
+			while( j > 0 && norm_breaks[j-1] > findex){
+				norm_breaks[j] = norm_breaks[j-1];
+				j = j - 1;
+			}
+			norm_breaks[j] = findex;
+				
+		}
+		// now generate sample break points;
+		for(i = 0; i < point_count; i++){
+			point_breaks[i] = (long) ( (float)x->period_samples * norm_breaks[i] );
+			// post("%i %f %f",point_breaks[i], norm_breaks[i], values[i]);
+		}
+		// set y deviation maxes
+		for(i = 0; i < point_count; i++){
+			ydevs[i] = boundrand(0.0,0.99);
+			xdevs[i] = boundrand(0.0,0.99);
+			// post("rands: %f %f",ydevs[i],xdevs[i]);
+		}
+    } else {
+		
+    }
+}
+
+
+t_int *dynss_perform(t_int *w)
+{
+	//int i, j, k;
+	//	float outval;
+	int i,j;
+	float findex1,findex2;
+	t_dynss *x = (t_dynss *) (w[1]);
+//	t_float *inlet = (t_float *) (w[2]);
+	t_float *outlet = (t_float *) (w[3]);
+	int n = (int) w[4];
+	t_double *values = x->values;
+	t_double *norm_breaks = x->norm_breaks;
+	long *point_breaks = x->point_breaks;
+	t_double *ydevs = x->ydevs;
+	t_double *xdevs = x->xdevs;
+	long counter = x->counter;
+	long period_samples = x->period_samples;
+	long current_point = x->current_point;
+	long point_count = x->point_count;
+	float sample;
+	float frak;
+	float dev, newval;
+	long segsamps;
+	
+	while(n--){
+		if( counter == point_breaks[current_point + 1]){
+			sample = values[current_point + 1];
+			++current_point;
+			if(current_point > point_count - 1){
+				current_point = 0;
+				counter = 0;
+			}
+		} 
+	
+		else {
+			segsamps = point_breaks[current_point + 1] - point_breaks[current_point];
+			if( segsamps <= 1){
+				frak = 0.0;
+			} 
+			else {
+				frak = (float)(counter - point_breaks[current_point]) / (float)segsamps;
+				//post("frak %f counter %d point break %d diff %d",frak, counter, point_breaks[current_point],counter - point_breaks[current_point] );
+				if( frak < 0.0 || frak > 1.0 ){
+					post("bad fraction: %f",frak);
+					post("current point: %d", current_point);
+					post("segsamps %d counter %d current break %d next break %d", segsamps, counter, point_breaks[current_point], point_breaks[current_point + 1]);
+				}
+			}
+			if(current_point < 0 || current_point > point_count - 1){
+				post("ERROR: dss had bad current point!");
+				sample = 0;
+			} else {
+				sample = values[current_point] + (values[current_point+1] - values[current_point]) * frak;
+				
+			}
+		}
+		++counter;
+		if(counter >= period_samples){
+			counter = 0;
+			current_point = 0;
+			if( x->freq > 0.0 ){
+				period_samples = x->srate / x->freq;
+			}
+			// nudge waveform
+			for(i = 1; i < point_count - 1; i++){
+				dev = boundrand(-1.0,1.0) * ydevs[i] * x->devscale_y;
+				newval = values[i] + dev;
+				// clip
+				newval = newval > 0.95 ? 0.95 : newval;
+				newval = newval < -0.95 ? -0.95 : newval;
+				values[i] = newval;
+			}
+			for(i = 1; i < point_count - 1; i++){
+				dev = boundrand(-1.0,1.0) * xdevs[i] * x->devscale_x;
+				newval = norm_breaks[i] + dev;
+				// clip
+				newval = newval < 0.05 ? 0.05 : newval;
+				newval = newval > 0.95 ? 0.95: newval;
+				norm_breaks[i] = newval;
+				/* if(norm_breaks[i] < norm_breaks[i-1]){
+					norm_breaks[i] = norm_breaks[i-1] + 0.03; // disallow point jumps for now
+				} */
+			}
+			// now sort them
+			
+			for(i = 1; i < point_count; i++){
+				findex1 = norm_breaks[i];
+				findex2 = values[i];
+				j = i;
+				while( j > 0 && norm_breaks[j-1] > findex1){
+					norm_breaks[j] = norm_breaks[j-1];
+					values[j] = values[j-1];
+					j = j - 1;
+				}
+				norm_breaks[j] = findex1;
+				values[j] = findex2;
+			}
+			
+			// now generate sample breaks
+			for(i = 0; i < point_count; i++){
+				point_breaks[i] = (long) ( (float)period_samples * norm_breaks[i] );
+			}
+		}
+		*outlet++ = sample;
+	}
+	x->counter = counter;
+	x->current_point = current_point;	
+	x->period_samples = period_samples;
+	return (w + 5);
+}
+
+
+void dynss_dsp(t_dynss *x, t_signal **sp)
+{
+	if(x->srate != sp[0]->s_sr) {
+		x->srate = sp[0]->s_sr;
+	}
+	dsp_add(dynss_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec,sp[0]->s_n);
+}
diff --git a/externals/lyonpotpourri/ellipse.c b/externals/lyonpotpourri/ellipse.c
new file mode 100755
index 0000000000000000000000000000000000000000..358333210beb0e59e8874c494998c798ab370a89
--- /dev/null
+++ b/externals/lyonpotpourri/ellipse.c
@@ -0,0 +1,250 @@
+#include "bashfest.h"
+
+float ellipse(float x, LSTRUCT *eel, int nsects, float xnorm)
+{
+  register int m;
+  float op;
+  
+  for(m=0;m<nsects;m++) {
+    op = x + eel[m].c0 * eel[m].ps0 + eel[m].c2 * eel[m].ps1
+      - eel[m].c1 * eel[m].ps2 - eel[m].c3 * eel[m].ps3;
+    eel[m].ps1 = eel[m].ps0;
+    eel[m].ps0 = x;
+    eel[m].ps3 = eel[m].ps2;
+    eel[m].ps2 = op;
+    x = op;
+  }
+  return(x*xnorm);
+}
+
+void ellipset(float *list, LSTRUCT *eel, int  *nsects, float *xnorm)
+{
+/* the first argument in the list is the number of sections */
+  int m,i;
+  *nsects = (int)list[0];
+  if(*nsects > MAXSECTS) { 
+    error("sorry, only configured for %d sections",MAXSECTS); 
+    return;
+  }
+  i=1;
+  for(m=0;m<*nsects;m++) {
+    eel[m].c0 = list[i++];
+    eel[m].c1 = list[i++];
+    eel[m].c2 = list[i++];
+    eel[m].c3 = list[i++];
+    eel[m].ps0 = eel[m].ps1 = eel[m].ps2 = eel[m].ps3 = 0;
+  }
+  *xnorm = list[i];
+}
+/*set biquad coefficients one time*/
+void init_ellipse_data(float **a)
+{
+    /* 0: hipass at 200 */
+        a[0][0] = 4;
+        a[0][1] = 1.5156562;
+        a[0][2] = -1.9958239;
+        a[0][3] = 1;
+        a[0][4] = 0.9965234;
+        a[0][5] = -1.9996996;
+        a[0][6] = 0.97229244;
+        a[0][7] = 1;
+        a[0][8] = 0.89313463;
+        a[0][9] = 1.8828678;
+        a[0][10] = -1.9561138;
+        a[0][11] = 1;
+        a[0][12] = 0.95845959;
+        a[0][13] = -1.9999342;
+        a[0][14] = -0.065893592;
+        a[0][15] = 1;
+        a[0][16] = 0.39565826;
+        a[0][17] = 0.26225143;
+    /* 1: hipass at 500 */
+        a[1][0] = 3;
+        a[1][1] = -1.9950633;
+        a[1][2] = -1.9910746;
+        a[1][3] = 1;
+        a[1][4] = 0.99729187;
+        a[1][5] = -1.9964182;
+        a[1][6] = -1.9742933;
+        a[1][7] = 1;
+        a[1][8] = 0.98250468;
+        a[1][9] = -1.999304;
+        a[1][10] = -1.8149534;
+        a[1][11] = 1;
+        a[1][12] = 0.84353385;
+        a[1][13] = 0.90419364;
+    /* 2: bandpass 280 - 700 */
+        a[2][0] = 4;
+        a[2][1] = -1.9989934;
+        a[2][2] = -1.9946771;
+        a[2][3] = 1;
+        a[2][4] = 0.99626146;
+        a[2][5] = -1.9843098;
+        a[2][6] = -1.9807532;
+        a[2][7] = 1;
+        a[2][8] = 0.99066977;
+        a[2][9] = -1.9996779;
+        a[2][10] = -1.9795816;
+        a[2][11] = 1;
+        a[2][12] = 0.9820447;
+        a[2][13] = -1.9513627;
+        a[2][14] = -1.965153;
+        a[2][15] = 1;
+        a[2][16] = 0.97142923;
+        a[2][17] = 0.013949928;
+    /* 3: lopass at 500 */
+        a[3][0] = 3;
+        a[3][1] = -1.9922858;
+        a[3][2] = -1.9903447;
+        a[3][3] = 1;
+        a[3][4] = 0.99525722;
+        a[3][5] = -1.9849712;
+        a[3][6] = -1.9765264;
+        a[3][7] = 1;
+        a[3][8] = 0.97923558;
+        a[3][9] = 1;
+        a[3][10] = -0.98180316;
+        a[3][11] = 0;
+        a[3][12] = 0;
+        a[3][13] = 0.0014021298;
+    /* 4: lopass at 2K */
+        a[4][0] = 3;
+        a[4][1] = -1.9170388;
+        a[4][2] = -1.9264647;
+        a[4][3] = 1;
+        a[4][4] = 0.99064223;
+        a[4][5] = -1.8850187;
+        a[4][6] = -1.9092573;
+        a[4][7] = 1;
+        a[4][8] = 0.95627234;
+        a[4][9] = -1.4613313;
+        a[4][10] = -1.8821271;
+        a[4][11] = 0.99999996;
+        a[4][12] = 0.89422169;
+        a[4][13] = 0.0071020706;
+    /* 5: 
+       f1,f2,f3= 400.0     900.0     2500.     ripple= 1.000     db= 40.00    */            
+        a[5][0] = 4;
+        a[5][1] = -1.9594111;
+        a[5][2] = -1.9900446;
+        a[5][3] = 1;
+        a[5][4] = 0.9932218;
+        a[5][5] = -1.9986938;
+        a[5][6] = -1.967975;
+        a[5][7] = 1;
+        a[5][8] = 0.98456911;
+        a[5][9] = -1.8436241;
+        a[5][10] = -1.9696535;
+        a[5][11] = 1;
+        a[5][12] = 0.9745592;
+        a[5][13] = -1.9996708;
+        a[5][14] = -1.9523041;
+        a[5][15] = 1;
+        a[5][16] = 0.96284515;
+        a[5][17] = 0.0027629927;
+    /* 6:  hipass at 500 */        
+        a[6][0] = 3;
+        a[6][1] = -1.9950633;
+        a[6][2] = -1.9910746;
+        a[6][3] = 1;
+        a[6][4] = 0.99729187;
+        a[6][5] = -1.9964182;
+        a[6][6] = -1.9742933;
+        a[6][7] = 1;
+        a[6][8] = 0.98250468;
+        a[6][9] = -1.999304;
+        a[6][10] = -1.8149534;
+        a[6][11] = 1;
+        a[6][12] = 0.84353385;
+        a[6][13] = 0.90419364;
+    /* 7: bandpass 1000-4000-6000 */
+        a[7][0] = 4;
+        a[7][1] = -1.9924766;
+        a[7][2] = -1.9573893;
+        a[7][3] = 1;
+        a[7][4] = 0.97714717;
+        a[7][5] = -1.2471186;
+        a[7][6] = -1.6082873;
+        a[7][7] = 1;
+        a[7][8] = 0.91482231;
+        a[7][9] = -1.9983103;
+        a[7][10] = -1.8512918;
+        a[7][11] = 1;
+        a[7][12] = 0.88910013;
+        a[7][13] = 0.033335148;
+        a[7][14] = -1.6413378;
+        a[7][15] = 0.99999998;
+        a[7][16] = 0.78964041;
+        a[7][17] = 0.0087452226;            
+    /* 8: hipass 4000-10000 */
+        a[8][0] = 1;
+        a[8][1] = -1.9896868;
+        a[8][2] = -1.3953066;
+        a[8][3] = 1;
+        a[8][4] = 0.58943112;
+        a[8][5] = 0.74811328;
+     /* 9: bandpass 500-2500-3500 */
+        a[9][0] = 6;
+        a[9][1] = -1.9975736;
+        a[9][2] = -1.9902167;
+        a[9][3] = 1;
+        a[9][4] = 0.99529287;
+        a[9][5] = -1.7460823;
+        a[9][6] = -1.853476;
+        a[9][7] = 1;
+        a[9][8] = 0.97721553;
+        a[9][9] = -1.9984481;
+        a[9][10] = -1.9737545;
+        a[9][11] = 1;
+        a[9][12] = 0.98056598;
+        a[9][13] = -1.6166383;
+        a[9][14] = -1.8408836;
+        a[9][15] = 0.99999999;
+        a[9][16] = 0.93097271;
+        a[9][17] = -1.9997426;
+        a[9][18] = -1.9320458;
+        a[9][19] = 1;
+        a[9][20] = 0.94629262;
+        a[9][21] = -0.44018748;
+        a[9][22] = -1.8664352;
+        a[9][23] = 0.99999993;
+        a[9][24] = 0.90871633;
+        a[9][25] = 0.00044746789;     
+    /* 10: bp-300-400-2500-70dB */
+        a[10][0] = 8;
+        a[10][1] = -1.7823256;
+        a[10][2] = -1.9938863;
+        a[10][3] = 1;
+        a[10][4] = 0.99712611;
+        a[10][5] = -1.9981713;
+        a[10][6] = -1.8579881;
+        a[10][7] = 1;
+        a[10][8] = 0.9825214;
+        a[10][9] = -1.7151492;
+        a[10][10] = -1.9844167;
+        a[10][11] = 1;
+        a[10][12] = 0.9884184;
+        a[10][13] = -1.9986272;
+        a[10][14] = -1.8447412;
+        a[10][15] = 1;
+        a[10][16] = 0.94374559;
+        a[10][17] = -1.3382862;
+        a[10][18] = -1.9602273;
+        a[10][19] = 1;
+        a[10][20] = 0.96717992;
+        a[10][21] = -1.9994689;
+        a[10][22] = -1.8529558;
+        a[10][23] = 1;
+        a[10][24] = 0.90889168;
+        a[10][25] = 1;
+        a[10][26] = -1.903171;
+        a[10][27] = 0;
+        a[10][28] = 0.92280038;
+        a[10][29] = -1;
+        a[10][30] = 0;
+        a[10][31] = 0;
+        a[10][32] = 0;
+        a[10][33] = 0.00022546378;
+}
+
+
diff --git a/externals/lyonpotpourri/epluribus~-help.pd b/externals/lyonpotpourri/epluribus~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..0558a68b6039f8aff0d6c59381d8b808e316c7c2
--- /dev/null
+++ b/externals/lyonpotpourri/epluribus~-help.pd
@@ -0,0 +1,32 @@
+#N canvas 732 505 416 313 10;
+#X obj 129 165 epluribus~ 3;
+#X obj 210 191 click2float~;
+#X obj 129 224 *~ 0.1;
+#X obj 129 256 dac~;
+#X obj 205 256 hsl 70 12 0 1 0 0 epluribus-gain epluribus-gain-in gain
+-2 -8 0 10 -261443 -1 -1 0 1;
+#X floatatom 167 206 5 0 0 0 - epluribus-gain -, f 5;
+#X obj 23 13 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X obj 25 108 phasor~ 620;
+#X obj 25 131 killdc~;
+#X obj 120 131 killdc~;
+#X obj 120 108 phasor~ 620.77;
+#X obj 233 130 killdc~;
+#X floatatom 211 224 5 0 0 0 - - -, f 5;
+#X text 254 221 selected channel;
+#X obj 233 107 phasor~ 600.9;
+#X text 25 47 epluribus~ selects the highest absolute-valued sample
+from all its inputs \, on a pre-sample basis;
+#X connect 0 0 2 0;
+#X connect 0 1 1 0;
+#X connect 1 0 12 0;
+#X connect 2 0 3 0;
+#X connect 2 0 3 1;
+#X connect 5 0 2 1;
+#X connect 7 0 8 0;
+#X connect 8 0 0 0;
+#X connect 9 0 0 1;
+#X connect 10 0 9 0;
+#X connect 11 0 0 2;
+#X connect 14 0 11 0;
diff --git a/externals/lyonpotpourri/epluribus~.c b/externals/lyonpotpourri/epluribus~.c
new file mode 100755
index 0000000000000000000000000000000000000000..6c4200ab666cccbbb0057c46a46e0e5fd32e9bd4
--- /dev/null
+++ b/externals/lyonpotpourri/epluribus~.c
@@ -0,0 +1,149 @@
+#include "MSPd.h"
+
+static t_class *epluribus_class;
+
+#define MAXBEATS (256)
+#define OBJECT_NAME "epluribus~"
+#define COMPILE_DATE "5.3.08"
+#define OBJECT_VERSION "2.0"
+
+typedef struct _epluribus
+{
+	t_object x_obj;
+    float x_f;
+	int incount; // how many inlets (must be at least 2)
+	short inverse; // flag to look for minimum instead
+} t_epluribus;
+
+void *epluribus_new(t_symbol *msg, int argc, t_atom *argv);
+t_int *epluribus_perform(t_int *w);
+void epluribus_dsp(t_epluribus *x, t_signal **sp);
+void epluribus_inverse(t_epluribus *x, t_floatarg tog);
+
+void epluribus_tilde_setup(void)
+{
+    t_class *c;
+	c = class_new(gensym("epluribus~"), (t_newmethod)epluribus_new,
+                                0,sizeof(t_epluribus), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(c, t_epluribus, x_f);
+	class_addmethod(c, (t_method)epluribus_dsp, gensym("dsp"), 0);
+    class_addmethod(c, (t_method)epluribus_inverse, gensym("inverse"),A_FLOAT, 0);
+    epluribus_class = c;
+	potpourri_announce(OBJECT_NAME);
+}
+
+void epluribus_inverse(t_epluribus *x, t_floatarg tog)
+{
+	x->inverse = (short) tog;
+}
+
+
+void *epluribus_new(t_symbol *msg, int argc, t_atom *argv)
+{
+    t_epluribus *x;
+    int i;
+    x = (t_epluribus *)pd_new(epluribus_class);
+    x->incount = (int) atom_getfloatarg(0,argc,argv);
+    if(x->incount < 2 || x->incount > 256 ){
+        int defcount = x->incount < 2 ? 2 : 256;
+        post("%s: warning: there must be between 2 and 256 input vectors",
+            OBJECT_NAME);
+        post("defaulting to %d", defcount);
+        x->incount = defcount;
+    }
+
+    for(i = 0; i < x->incount - 1; i++){
+        inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("signal"),gensym("signal"));
+    }
+    outlet_new(&x->x_obj, gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+	x->inverse = 0; // by default don't do inverse behaviour
+	return (x);
+}
+
+
+t_int *epluribus_perform(t_int *w)
+{
+	int i,j,k;
+	t_epluribus *x = (t_epluribus *) (w[1]);
+	t_float *inlet;
+	t_float *outlet;
+	t_float *selection;
+	t_int n;
+	t_float maxamp = 0.0;
+	t_float maxout = 0.0;
+	int maxloc;
+	int incount = x->incount;
+	int next_pointer = incount + 5;
+	
+	outlet = (t_float *) w[incount + 2];
+	selection = (t_float *) w[incount + 3];
+	n = (int) w[incount + 4];
+	
+	if( x->inverse ){
+		for(k = 0; k < n; k ++ ){
+			maxamp = 99999999.0;
+			maxloc = 0;
+			for(i = 0, j=2; i < incount ; i++, j++){
+				inlet = (t_float *) (w[j]);
+				if( maxamp > fabs( inlet[k] ) ){
+					maxamp = fabs( inlet[k] ); 
+					maxout = inlet[k]; // don't actually change signal
+					maxloc = i + 1; // record location of max amp
+				}
+			}
+			outlet[k] = maxout;
+			selection[k] = maxloc;
+		}
+	} 
+	else {
+		for(k = 0; k < n; k ++ ){
+			maxamp = 0.0;
+			maxloc = 0;
+			for(i = 0, j=2; i < incount ; i++, j++){
+				inlet = (t_float *) (w[j]);
+				if( maxamp < fabs( inlet[k] ) ){
+					maxamp = fabs( inlet[k] );
+					maxout = inlet[k]; // don't actually change signal
+					maxloc = i + 1; // record location of max amp
+				}
+			}
+			outlet[k] = maxout;
+			selection[k] = maxloc;
+		}
+	}
+		
+	return w + next_pointer;
+}
+
+
+void epluribus_dsp(t_epluribus *x, t_signal **sp)
+{
+	long i;
+	t_int **sigvec;
+	int pointer_count;
+
+	
+	if( x->incount < 2 || x->incount > 256 ){
+		post("bad vector count");
+		return;
+	}
+	pointer_count = x->incount + 4; // all metros, plus 2 outlets, plus the object pointer, plus N
+
+	sigvec  = (t_int **) calloc(pointer_count, sizeof(t_int *));	
+	for(i = 0; i < pointer_count; i++){
+		sigvec[i] = (t_int *) calloc(sizeof(t_int),1);
+	}
+	sigvec[0] = (t_int *)x; // first pointer is to the object
+	
+	sigvec[pointer_count - 1] = (t_int *)sp[0]->s_n; // last pointer is to vector size (N)
+	
+	for(i = 1; i < pointer_count - 1; i++){ // now attach the inlet and all outlets
+		sigvec[i] = (t_int *)sp[i-1]->s_vec;
+	}
+
+	dsp_addv(epluribus_perform, pointer_count, (t_int *) sigvec); 
+	free(sigvec);
+	
+}
+
diff --git a/externals/lyonpotpourri/examples/BD0010.aif b/externals/lyonpotpourri/examples/BD0010.aif
new file mode 100755
index 0000000000000000000000000000000000000000..66781e2b2a65df7e9e94e0c6ae6d8bb12ae166f8
Binary files /dev/null and b/externals/lyonpotpourri/examples/BD0010.aif differ
diff --git a/externals/lyonpotpourri/examples/BT0AADA.aiff b/externals/lyonpotpourri/examples/BT0AADA.aiff
new file mode 100755
index 0000000000000000000000000000000000000000..1c4f5f5b1d894fa19bc463e657475119818461b7
Binary files /dev/null and b/externals/lyonpotpourri/examples/BT0AADA.aiff differ
diff --git a/externals/lyonpotpourri/examples/CP.aif b/externals/lyonpotpourri/examples/CP.aif
new file mode 100755
index 0000000000000000000000000000000000000000..e90b1bedb51cfa2670ebbc4b595f408e54f00d8a
Binary files /dev/null and b/externals/lyonpotpourri/examples/CP.aif differ
diff --git a/externals/lyonpotpourri/examples/KR55SNAR.aiff b/externals/lyonpotpourri/examples/KR55SNAR.aiff
new file mode 100755
index 0000000000000000000000000000000000000000..81760c15f4dc93326307a52d6b7eb9e1389086de
Binary files /dev/null and b/externals/lyonpotpourri/examples/KR55SNAR.aiff differ
diff --git a/externals/lyonpotpourri/examples/bell.aiff b/externals/lyonpotpourri/examples/bell.aiff
new file mode 100755
index 0000000000000000000000000000000000000000..4b2a49aecc442e6bc31ad0db85de26b56d3dc905
Binary files /dev/null and b/externals/lyonpotpourri/examples/bell.aiff differ
diff --git a/externals/lyonpotpourri/examples/hi_c_12b.aiff b/externals/lyonpotpourri/examples/hi_c_12b.aiff
new file mode 100755
index 0000000000000000000000000000000000000000..e51d0602ee666a207cc3bd00d7ef63dfe978305f
Binary files /dev/null and b/externals/lyonpotpourri/examples/hi_c_12b.aiff differ
diff --git a/externals/lyonpotpourri/examples/hi_o_06e.aiff b/externals/lyonpotpourri/examples/hi_o_06e.aiff
new file mode 100755
index 0000000000000000000000000000000000000000..44775561afaad47ef117566fd6fd4900d7e713e8
Binary files /dev/null and b/externals/lyonpotpourri/examples/hi_o_06e.aiff differ
diff --git a/externals/lyonpotpourri/examples/hi_o_15g.aiff b/externals/lyonpotpourri/examples/hi_o_15g.aiff
new file mode 100755
index 0000000000000000000000000000000000000000..3d1fe42b9388478b39566c3ded58c76574952369
Binary files /dev/null and b/externals/lyonpotpourri/examples/hi_o_15g.aiff differ
diff --git a/externals/lyonpotpourri/examples/kick_11d.aiff b/externals/lyonpotpourri/examples/kick_11d.aiff
new file mode 100755
index 0000000000000000000000000000000000000000..c067b7ebd898e5c161a33fd3d1ec3b7f855eae9a
Binary files /dev/null and b/externals/lyonpotpourri/examples/kick_11d.aiff differ
diff --git a/externals/lyonpotpourri/examples/mar2.aif b/externals/lyonpotpourri/examples/mar2.aif
new file mode 100755
index 0000000000000000000000000000000000000000..2d9430552bfc5b15b709541c9eebc47ee6e5dd9c
Binary files /dev/null and b/externals/lyonpotpourri/examples/mar2.aif differ
diff --git a/externals/lyonpotpourri/examples/prettypad.aif b/externals/lyonpotpourri/examples/prettypad.aif
new file mode 100755
index 0000000000000000000000000000000000000000..dc7582b648dd858de331e3823f022caab15fe628
Binary files /dev/null and b/externals/lyonpotpourri/examples/prettypad.aif differ
diff --git a/externals/lyonpotpourri/examples/soda-bd.aif b/externals/lyonpotpourri/examples/soda-bd.aif
new file mode 100755
index 0000000000000000000000000000000000000000..f9848dec8aff14e5cacf455457b61e706e445005
Binary files /dev/null and b/externals/lyonpotpourri/examples/soda-bd.aif differ
diff --git a/externals/lyonpotpourri/examples/trickhit.aif b/externals/lyonpotpourri/examples/trickhit.aif
new file mode 100755
index 0000000000000000000000000000000000000000..944beac2788f375e29edb8cc170c4362b94a6620
Binary files /dev/null and b/externals/lyonpotpourri/examples/trickhit.aif differ
diff --git a/externals/lyonpotpourri/examples/voice.wav b/externals/lyonpotpourri/examples/voice.wav
new file mode 100755
index 0000000000000000000000000000000000000000..8b7f1acc7300e7fbbd142e4b6a3f2e92c1e5955c
Binary files /dev/null and b/externals/lyonpotpourri/examples/voice.wav differ
diff --git a/externals/lyonpotpourri/expflam~-help.pd b/externals/lyonpotpourri/expflam~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..cb8ceea4e50ba1ec8424e37b6bdae461a023bebe
--- /dev/null
+++ b/externals/lyonpotpourri/expflam~-help.pd
@@ -0,0 +1,136 @@
+#N canvas 609 102 594 535 10;
+#N canvas 774 592 522 372 load-samples 0;
+#X obj 41 107 soundfiler;
+#X msg 41 39 bang;
+#X obj 41 65 openpanel;
+#X obj 154 29 loadbang;
+#X msg 41 87 read -resize \$1 expflam-drum;
+#X msg 154 54 read -resize examples/kick_11d.aiff expflam-drum;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 3 0 5 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X restore 307 282 pd load-samples;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array expflam-drum 16884 float 2;
+#X coords 0 1 16884 -1 100 70 1;
+#X restore 296 410 graph;
+#X obj 58 370 player~ expflam-drum 1 8;
+#X obj 83 321 loadbang;
+#X obj 58 453 *~ 0.1;
+#X obj 58 487 dac~;
+#X obj 58 271 expflam~;
+#X floatatom 95 428 5 0 0 0 - - -, f 5;
+#X obj 27 166 r expflam-msg;
+#N canvas 461 254 635 324 expflam-controls 0;
+#X msg 27 143 bypass \$1;
+#X obj 26 118 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 26 226 s expflam-msg;
+#X msg 153 209 setflam \$1 \$2 \$3 \$4 \$5;
+#X floatatom 152 129 5 0 0 0 - - -, f 5;
+#X floatatom 192 130 5 0 0 0 - - -, f 5;
+#X floatatom 233 130 5 0 0 0 - - -, f 5;
+#X floatatom 273 131 5 0 0 0 - - -, f 5;
+#X floatatom 314 131 5 0 0 0 - - -, f 5;
+#N canvas 701 481 454 304 pak 0;
+#X obj 63 60 inlet;
+#X obj 65 150 pack f f f f f;
+#X obj 112 59 inlet;
+#X obj 110 85 t b f;
+#X obj 167 54 inlet;
+#X obj 165 80 t b f;
+#X obj 216 53 inlet;
+#X obj 214 79 t b f;
+#X obj 267 53 inlet;
+#X obj 265 79 t b f;
+#X obj 68 184 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 10 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 3 1 1 1;
+#X connect 4 0 5 0;
+#X connect 5 0 1 0;
+#X connect 5 1 1 2;
+#X connect 6 0 7 0;
+#X connect 7 0 1 0;
+#X connect 7 1 1 3;
+#X connect 8 0 9 0;
+#X connect 9 0 1 0;
+#X connect 9 1 1 4;
+#X restore 153 170 pd pak;
+#X obj 372 -16 hsl 115 15 20 90 0 0 empty empty start-delay -2 -8 0
+10 -162854 -1 -1 0 1;
+#X obj 372 14 hsl 115 15 50 150 0 0 empty empty end-delay -2 -8 0 10
+-162854 -1 -1 0 1;
+#X obj 373 46 hsl 115 15 3 32 0 0 empty empty attack-count -2 -8 0
+10 -162854 -1 -1 0 1;
+#X obj 233 114 int;
+#X obj 373 83 hsl 115 15 -6 6 0 0 empty empty slope -2 -8 0 10 -162854
+-1 -1 0 1;
+#X obj 373 116 hsl 115 15 0.05 0.99 0 0 empty empty attenuation -2
+-8 0 10 -162854 -1 -1 0 1;
+#X obj 75 56 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1
+;
+#X msg 76 81 flamall \$1;
+#X text 96 58 flam everything;
+#X text 43 114 flam nothing;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 3 0 2 0;
+#X connect 4 0 9 0;
+#X connect 5 0 9 1;
+#X connect 6 0 9 2;
+#X connect 7 0 9 3;
+#X connect 8 0 9 4;
+#X connect 9 0 3 0;
+#X connect 10 0 4 0;
+#X connect 11 0 5 0;
+#X connect 12 0 13 0;
+#X connect 13 0 6 0;
+#X connect 14 0 7 0;
+#X connect 15 0 8 0;
+#X connect 16 0 17 0;
+#X connect 17 0 2 0;
+#X restore 304 327 pd expflam-controls;
+#X msg 84 341 static_increment 0;
+#X obj 223 318 sig~ 1;
+#X obj 97 402 hsl 115 15 0 0.99 0 0 empty empty gain -2 -8 0 10 -162854
+-1 -1 0 1;
+#X obj 172 187 mask~ 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0;
+#X floatatom 224 299 5 0 0 0 - - -, f 5;
+#X obj 227 281 hsl 64 12 0.5 2.5 0 0 empty empty increment -2 -8 0
+10 -244920 -1 -1 0 1;
+#X obj 58 237 mask~ 1 0.5 0.5 0.5 1 0 0.5 0.5 1 0.5 1 0 0 0.5 1 0.125
+;
+#X obj 172 116 samm~ 98 4;
+#X text 25 47 expflam~ replaces a click trigger with a sequence of
+triggers to create a flam., f 83;
+#X text 180 147 flam gate signal - flams only occur where a 1 in gate
+aligns with the attack pattern below;
+#X text 224 220 attack pattern;
+#X text 304 307 open this for more controls:;
+#X msg 172 93 tempo \$1;
+#X floatatom 172 74 5 20 200 0 - - -, f 5;
+#X obj 23 11 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X connect 2 0 4 0;
+#X connect 3 0 10 0;
+#X connect 4 0 5 0;
+#X connect 4 0 5 1;
+#X connect 6 0 2 0;
+#X connect 7 0 4 1;
+#X connect 8 0 6 0;
+#X connect 10 0 2 0;
+#X connect 11 0 2 1;
+#X connect 12 0 7 0;
+#X connect 13 0 6 1;
+#X connect 14 0 11 0;
+#X connect 15 0 14 0;
+#X connect 16 0 6 0;
+#X connect 17 0 13 0;
+#X connect 17 0 16 0;
+#X connect 22 0 17 0;
+#X connect 23 0 22 0;
diff --git a/externals/lyonpotpourri/expflam~.c b/externals/lyonpotpourri/expflam~.c
new file mode 100755
index 0000000000000000000000000000000000000000..78bd5593fd95bc90274f68946bac9d4743072cc8
--- /dev/null
+++ b/externals/lyonpotpourri/expflam~.c
@@ -0,0 +1 @@
+#include "MSPd.h"


static t_class *expflam_class;

#define OBJECT_NAME "expflam~"

#define MAXFLAMS (64)
#define MAXATTACKS (128)
#define STOPGAIN (.001)


typedef struct
{
	int attack_count; // number of triggers per flam event
	float *attack_times; // trigger times in seconds
	int *attack_points; // trigger times in samples
	int fdex; // current flam
	float gainatten; // attenuation factor
	float amp; // current amp
	int atks;// number of attacks per flam
	long counter; // internal clock
	short active; // flag that flam is turned on


} t_flam;

typedef struct _expflam
{

	t_object x_obj;
	float x_f;
	t_flam *flams; // contain flams
	float start_delay; // initial flam delay
	float end_delay;// end delay
	float atten; // attenuation factor
	float slope;// slope of curve
	int atks;// number of attacks per flam
	float sr;
	float *trigvec; // hold input vector (to protect from memory sharing)
	float *bypvec; // ditto for flamgate vector
	short flamall; // flag to put a flam on everything
	short bypass; // flag to copy input to output without flam
	short flamgate_connected; // flag that a flamgate logical signal is connected to inlet 2

} t_expflam;


void *expflam_new(void);
t_int *expflam_perform(t_int *w);
void expflam_dsp(t_expflam *x, t_signal **sp);
void expflam_setflam(t_expflam *x, t_symbol *msg, short argc, t_atom *argv);
void expflam_free(t_expflam *x);
void expflam_assist(t_expflam *x, void *b, long msg, long arg, char *dst);
void expflam_flamall(t_expflam *x, t_floatarg tog);
void expflam_bypass(t_expflam *x, t_floatarg tog);


void expflam_tilde_setup(void)
{
expflam_class = class_new(gensym("expflam~"),(t_newmethod)expflam_new,
(t_method)expflam_free, sizeof(t_expflam), 0, 0);
	CLASS_MAINSIGNALIN(expflam_class,t_expflam, x_f );
	class_addmethod(expflam_class,(t_method)expflam_dsp,gensym("dsp"),A_CANT,0);
	class_addmethod(expflam_class,(t_method)expflam_setflam,gensym("setflam"),A_GIMME,0);
	class_addmethod(expflam_class,(t_method)expflam_flamall,gensym("flamall"),A_FLOAT,0);
	class_addmethod(expflam_class,(t_method)expflam_bypass,gensym("bypass"),A_FLOAT,0);
    potpourri_announce(OBJECT_NAME);
}

void expflam_flamall(t_expflam *x, t_floatarg tog)
{
	x->flamall = (short) tog;
}

void expflam_bypass(t_expflam *x, t_floatarg tog)
{
	x->bypass = (short) tog;
}

void expflam_assist(t_expflam *x, void *b, long msg, long arg, char *dst)
{
  if (msg==1) {
    switch (arg) {
    	case 0: sprintf(dst,"(signal) Trigger Click"); break;
		case 1: sprintf(dst,"(signal) Flam Gate"); break;
    }
  } else if (msg==2) {
    sprintf(dst,"(signal) Flam Clicks");
  }
}

void *expflam_new(void)
{
	int i;
	t_expflam *x = (t_expflam *)pd_new(expflam_class);
	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
	outlet_new(&x->x_obj, gensym("signal"));
	x->flams = (t_flam *) calloc(MAXFLAMS, sizeof(t_flam));   
	for(i = 0; i < MAXFLAMS; i++){
	  	x->flams[i].attack_times = (float *) calloc(MAXATTACKS, sizeof(float));
	  	x->flams[i].attack_points = (int *) calloc(MAXATTACKS, sizeof(int));
	}
	   
	x->trigvec = malloc(8192 * sizeof(float)); // maximum vector size
	x->bypvec = malloc(8192 * sizeof(float)); // maximum vector size
    x->sr = sys_getsr();
    x->start_delay = .025;
    x->end_delay = 0.1;
    x->slope = -3.0;
    x->atks = 8;
    x->atten = 0.8;
	x->bypass = 0;
	x->flamall = 0;
	
    return x;
}

void expflam_setflam(t_expflam *x, t_symbol *msg, short argc, t_atom *argv)
{
  if( argc != 5 ){
    error("%s: setflam format: startdelay enddelay attacks slope gainatten",OBJECT_NAME);
    return;
  }
  x->start_delay = atom_getfloatarg(0,argc,argv) * 0.001;
  x->end_delay = atom_getfloatarg(1,argc,argv) * 0.001;
  x->atks = (int) atom_getfloatarg(2,argc,argv);
  x->slope = atom_getfloatarg(3,argc,argv);
  x->atten = atom_getfloatarg(4,argc,argv);
  if(x->slope == 0)
  	x->slope = .0001;
  if(x->start_delay <= 0)
  	x->start_delay = .00001;
  if(x->end_delay <= 0)
  	x->end_delay = .00001;
  if(x->atks < 2)
  	x->atks = 2;
  if(x->atks > MAXATTACKS){
  	post("%s: exceeded maximum of %d attacks",OBJECT_NAME, MAXATTACKS);
  	x->atks = MAXATTACKS;
  }
}

void expflam_free(t_expflam *x)
{
int i;

	free(x->trigvec);
	free(x->bypvec);
  for(i = 0; i < MAXFLAMS; i++){
  	free(x->flams[i].attack_times);
  	free(x->flams[i].attack_points);
  }
  free(x->flams);
	
}

t_int *expflam_perform(t_int *w)
{
	int i,j,k;
	t_expflam *x = (t_expflam *) (w[1]);
	float *in_vec = (t_float *)(w[2]);
	float *in2_vec = (t_float *)(w[3]);
	float *out_vec = (t_float *)(w[4]);
	int n = (int) w[5];
	
	float *trigvec = x->trigvec;
	float *flamgate_vec = x->bypvec;
	t_flam *flams = x->flams;
	int atks = x->atks;
	float atten = x->atten;
	float slope = x->slope;
	float start_delay = x->start_delay;
	float end_delay = x->end_delay;
	float sr = x->sr;
	short flamgate_connected = x->flamgate_connected;
	short flamall = x->flamall;
	
	/* in flamgate mode copy input to output and return */
	if(x->bypass){
		memcpy( (void *)out_vec, (void *)in_vec, n * sizeof(float) );
		return (w+6);
	}
	/* copy input vectors */
	memcpy( (void *)flamgate_vec, (void *)in2_vec, n * sizeof(float) );// the order of these mcopies matters
	memcpy( (void *)trigvec, (void *)in_vec, n * sizeof(float) );
	memcpy( (void *)out_vec, (void *)in_vec, n * sizeof(float) );// copy triggers to output for a start
		
	/* look for activation triggers */
	for(i = 0; i < n; i++){
		if(trigvec[i] && (flamgate_vec[i] || ! flamgate_connected || flamall ) ){	
//		post("triggered with t %f and flamgate %f",trigvec[i],flamgate_vec[i]);
			j = 0;  
			while(flams[j].active && j < MAXFLAMS){
				++j;
			}
			if(j >= MAXFLAMS){
				post("too many flams");				
			}
			else {
//				post("inserting flam at location %d",j);
				flams[j].active = 1;
				flams[j].attack_times[0] = 0.0;
				flams[j].attack_points[0] = i;
				flams[j].gainatten = atten;
				flams[j].amp = trigvec[i];
				flams[j].counter = 0;
				flams[j].fdex = 0;
				flams[j].atks = atks;
				
				for(k = 1; k < atks; k++){
					flams[j].attack_times[k] = start_delay + (end_delay - start_delay) * ((1.0 - exp((float)k * slope/((float)atks-1.0)))/(1.0-exp(slope)));
					flams[j].attack_times[k] += flams[j].attack_times[k - 1];
					flams[j].attack_points[k] = flams[j].attack_times[k] * sr + i;
				}						
			}
		}
	}
	/* now iterate through active flams */
	for( i = 0; i < n; i++){
		for(j = 0; j < MAXFLAMS; j++){
			if(flams[j].active){
				if(flams[j].counter >= flams[j].attack_points[flams[j].fdex]){
					out_vec[i] += flams[j].amp;
					flams[j].amp *= flams[j].gainatten;
					if( flams[j].amp <= STOPGAIN ){
						flams[j].active = 0;
					}
					flams[j].fdex++;
					if(flams[j].fdex >= flams[j].atks){
						flams[j].active = 0;
					}
				}
				flams[j].counter++;
			}
		}
	}

	return w+6;
}

void expflam_dsp(t_expflam *x, t_signal **sp)
{

	x->flamgate_connected = 1;
	dsp_add(expflam_perform, 5, x,
			sp[0]->s_vec, 
			sp[1]->s_vec,
			sp[2]->s_vec,  
			sp[0]->s_n
	);
}

\ No newline at end of file
diff --git a/externals/lyonpotpourri/fft.c b/externals/lyonpotpourri/fft.c
new file mode 100755
index 0000000000000000000000000000000000000000..d6bb1bc0bdaed96e6060c29615f615e38d15fbc4
--- /dev/null
+++ b/externals/lyonpotpourri/fft.c
@@ -0,0 +1 @@
+#include "fftease.h"




/* If forward is true, rfft replaces 2*N real data points in x with
   N complex values representing the positive frequency half of their
   Fourier spectrum, with x[1] replaced with the real part of the Nyquist
   frequency value.  If forward is false, rfft expects x to contain a
   positive frequency spectrum arranged as before, and replaces it with
   2*N real values.  N MUST be a power of 2. */

void rfft( float *x, int N, int forward )

{
  float 	c1,c2,
  		h1r,h1i,
		h2r,h2i,
		wr,wi,
		wpr,wpi,
  		temp,
		theta;
  float 	xr,xi;
  int 		i,
		i1,i2,i3,i4,
		N2p1;
  static int 	first = 1;
/*float PI, TWOPI;*/
void cfft();

    if ( first ) {

	first = 0;
    }
    theta = PI/N;
    wr = 1.;
    wi = 0.;
    c1 = 0.5;
    if ( forward ) {
	c2 = -0.5;
	cfft( x, N, forward );
	xr = x[0];
	xi = x[1];
    } else {
	c2 = 0.5;
	theta = -theta;
	xr = x[1];
	xi = 0.;
	x[1] = 0.;
    }
    wpr = -2.*pow( sin( 0.5*theta ), 2. );
    wpi = sin( theta );
    N2p1 = (N<<1) + 1;
    for ( i = 0; i <= N>>1; i++ ) {
	i1 = i<<1;
	i2 = i1 + 1;
	i3 = N2p1 - i2;
	i4 = i3 + 1;
	if ( i == 0 ) {
	    h1r =  c1*(x[i1] + xr );
	    h1i =  c1*(x[i2] - xi );
	    h2r = -c2*(x[i2] + xi );
	    h2i =  c2*(x[i1] - xr );
	    x[i1] =  h1r + wr*h2r - wi*h2i;
	    x[i2] =  h1i + wr*h2i + wi*h2r;
	    xr =  h1r - wr*h2r + wi*h2i;
	    xi = -h1i + wr*h2i + wi*h2r;
	} else {
	    h1r =  c1*(x[i1] + x[i3] );
	    h1i =  c1*(x[i2] - x[i4] );
	    h2r = -c2*(x[i2] + x[i4] );
	    h2i =  c2*(x[i1] - x[i3] );
	    x[i1] =  h1r + wr*h2r - wi*h2i;
	    x[i2] =  h1i + wr*h2i + wi*h2r;
	    x[i3] =  h1r - wr*h2r + wi*h2i;
	    x[i4] = -h1i + wr*h2i + wi*h2r;
	}
	wr = (temp = wr)*wpr - wi*wpi + wr;
	wi = wi*wpr + temp*wpi + wi;
    }
    if ( forward )
	x[1] = xr;
    else
	cfft( x, N, forward );
}

/* cfft replaces float array x containing NC complex values
   (2*NC float values alternating real, imagininary, etc.)
   by its Fourier transform if forward is true, or by its
   inverse Fourier transform if forward is false, using a
   recursive Fast Fourier transform method due to Danielson
   and Lanczos.  NC MUST be a power of 2. */

void cfft( float *x, int NC, int forward )

{
  float 	wr,wi,
		wpr,wpi,
		theta,
		scale;
  int 		mmax,
		ND,
		m,
		i,j,
		delta;

void bitreverse();

    ND = NC<<1;
    bitreverse( x, ND );
    for ( mmax = 2; mmax < ND; mmax = delta ) {
	delta = mmax<<1;
	theta = TWOPI/( forward? mmax : -mmax );
	wpr = -2.*pow( sin( 0.5*theta ), 2. );
	wpi = sin( theta );
	wr = 1.;
	wi = 0.;
	for ( m = 0; m < mmax; m += 2 ) {
	 register float rtemp, itemp;
	    for ( i = m; i < ND; i += delta ) {
		j = i + mmax;
		rtemp = wr*x[j] - wi*x[j+1];
		itemp = wr*x[j+1] + wi*x[j];
		x[j] = x[i] - rtemp;
		x[j+1] = x[i+1] - itemp;
		x[i] += rtemp;
		x[i+1] += itemp;
	    }
	    wr = (rtemp = wr)*wpr - wi*wpi + wr;
	    wi = wi*wpr + rtemp*wpi + wi;
	}
    }

/* scale output */

    scale = forward ? 1./ND : 2.;
    { register float *xi=x, *xe=x+ND;
	while ( xi < xe )
	    *xi++ *= scale;
    }
}

/* bitreverse places float array x containing N/2 complex values
   into bit-reversed order */

void bitreverse( float *x, int N )

{
  float 	rtemp,itemp;
  int 		i,j,
		m;

    for ( i = j = 0; i < N; i += 2, j += m ) {
	if ( j > i ) {
	    rtemp = x[j]; itemp = x[j+1]; /* complex exchange */
	    x[j] = x[i]; x[j+1] = x[i+1];
	    x[i] = rtemp; x[i+1] = itemp;
	}
	for ( m = N>>1; m >= 2 && j >= m; m >>= 1 )
	    j -= m;
    }
}
\ No newline at end of file
diff --git a/externals/lyonpotpourri/fft4.c b/externals/lyonpotpourri/fft4.c
new file mode 100755
index 0000000000000000000000000000000000000000..fb221181cf4b31971e75c21eedd7bdb61bb41c04
--- /dev/null
+++ b/externals/lyonpotpourri/fft4.c
@@ -0,0 +1 @@
+#include <math.h>
#include "fftease.h"

void init_rdft(int n, int *ip, float *w)
{

  int	nw,
	nc;

  void	makewt(int nw, int *ip, float *w);
  void	makect(int nc, int *ip, float *c);

  nw = n >> 2;
  makewt(nw, ip, w);

  nc = n >> 2;
  makect(nc, ip, w + nw);

  return;
}


void rdft(int n, int isgn, float *a, int *ip, float *w)
{

  int		j,
		nw,
		nc;

  float		xi;

  void		bitrv2(int n, int *ip, float *a),
		cftsub(int n, float *a, float *w),
		rftsub(int n, float *a, int nc, float *c);

    
  nw = ip[0];
  nc = ip[1];
  
  if (isgn < 0) {
    a[1] = 0.5 * (a[1] - a[0]);
    a[0] += a[1];

    for (j = 3; j <= n - 1; j += 2) {
      a[j] = -a[j];
    }

    if (n > 4) {
      rftsub(n, a, nc, w + nw);
      bitrv2(n, ip + 2, a);
    }

    cftsub(n, a, w);

    for (j = 1; j <= n - 1; j += 2) {
      a[j] = -a[j];
    }
  }

  else {

    if (n > 4) {
      bitrv2(n, ip + 2, a);
    }

    cftsub(n, a, w);

    if (n > 4) {
      rftsub(n, a, nc, w + nw);
    }

    xi = a[0] - a[1];
    a[0] += a[1];
    a[1] = xi;
  }
}


void bitrv2(int n, int *ip, float *a)
{
  int j, j1, k, k1, l, m, m2;
  float xr, xi;
    
  ip[0] = 0;
  l = n;
  m = 1;

  while ((m << 2) < l) {
    l >>= 1;
    for (j = 0; j <= m - 1; j++) {
      ip[m + j] = ip[j] + l;
    }
    m <<= 1;
  }

  if ((m << 2) > l) {

    for (k = 1; k <= m - 1; k++) {

      for (j = 0; j <= k - 1; j++) {
	j1 = (j << 1) + ip[k];
	k1 = (k << 1) + ip[j];
	xr = a[j1];
	xi = a[j1 + 1];
	a[j1] = a[k1];
	a[j1 + 1] = a[k1 + 1];
	a[k1] = xr;
	a[k1 + 1] = xi;
      }
    }
  }

  else {
    m2 = m << 1;

    for (k = 1; k <= m - 1; k++) {

      for (j = 0; j <= k - 1; j++) {
	j1 = (j << 1) + ip[k];
	k1 = (k << 1) + ip[j];
	xr = a[j1];
	xi = a[j1 + 1];
	a[j1] = a[k1];
	a[j1 + 1] = a[k1 + 1];
	a[k1] = xr;
	a[k1 + 1] = xi;
	j1 += m2;
	k1 += m2;
	xr = a[j1];
	xi = a[j1 + 1];
	a[j1] = a[k1];
	a[j1 + 1] = a[k1 + 1];
	a[k1] = xr;
	a[k1 + 1] = xi;
      }
    }
  }
}


void cftsub(int n, float *a, float *w)
{
  int j, j1, j2, j3, k, k1, ks, l, m;
  float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
  float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
    
  l = 2;

  while ((l << 1) < n) {
    m = l << 2;

    for (j = 0; j <= l - 2; j += 2) {
      j1 = j + l;
      j2 = j1 + l;
      j3 = j2 + l;
      x0r = a[j] + a[j1];
      x0i = a[j + 1] + a[j1 + 1];
      x1r = a[j] - a[j1];
      x1i = a[j + 1] - a[j1 + 1];
      x2r = a[j2] + a[j3];
      x2i = a[j2 + 1] + a[j3 + 1];
      x3r = a[j2] - a[j3];
      x3i = a[j2 + 1] - a[j3 + 1];
      a[j] = x0r + x2r;
      a[j + 1] = x0i + x2i;
      a[j2] = x0r - x2r;
      a[j2 + 1] = x0i - x2i;
      a[j1] = x1r - x3i;
      a[j1 + 1] = x1i + x3r;
      a[j3] = x1r + x3i;
      a[j3 + 1] = x1i - x3r;
    }

    if (m < n) {
      wk1r = w[2];

      for (j = m; j <= l + m - 2; j += 2) {
	j1 = j + l;
	j2 = j1 + l;
	j3 = j2 + l;
	x0r = a[j] + a[j1];
	x0i = a[j + 1] + a[j1 + 1];
	x1r = a[j] - a[j1];
	x1i = a[j + 1] - a[j1 + 1];
	x2r = a[j2] + a[j3];
	x2i = a[j2 + 1] + a[j3 + 1];
	x3r = a[j2] - a[j3];
	x3i = a[j2 + 1] - a[j3 + 1];
	a[j] = x0r + x2r;
	a[j + 1] = x0i + x2i;
	a[j2] = x2i - x0i;
	a[j2 + 1] = x0r - x2r;
	x0r = x1r - x3i;
	x0i = x1i + x3r;
	a[j1] = wk1r * (x0r - x0i);
	a[j1 + 1] = wk1r * (x0r + x0i);
	x0r = x3i + x1r;
	x0i = x3r - x1i;
	a[j3] = wk1r * (x0i - x0r);
	a[j3 + 1] = wk1r * (x0i + x0r);
      }

      k1 = 1;
      ks = -1;

      for (k = (m << 1); k <= n - m; k += m) {
	k1++;
	ks = -ks;
	wk1r = w[k1 << 1];
	wk1i = w[(k1 << 1) + 1];
	wk2r = ks * w[k1];
	wk2i = w[k1 + ks];
	wk3r = wk1r - 2 * wk2i * wk1i;
	wk3i = 2 * wk2i * wk1r - wk1i;

	for (j = k; j <= l + k - 2; j += 2) {
	  j1 = j + l;
	  j2 = j1 + l;
	  j3 = j2 + l;
	  x0r = a[j] + a[j1];
	  x0i = a[j + 1] + a[j1 + 1];
	  x1r = a[j] - a[j1];
	  x1i = a[j + 1] - a[j1 + 1];
	  x2r = a[j2] + a[j3];
	  x2i = a[j2 + 1] + a[j3 + 1];
	  x3r = a[j2] - a[j3];
	  x3i = a[j2 + 1] - a[j3 + 1];
	  a[j] = x0r + x2r;
	  a[j + 1] = x0i + x2i;
	  x0r -= x2r;
	  x0i -= x2i;
	  a[j2] = wk2r * x0r - wk2i * x0i;
	  a[j2 + 1] = wk2r * x0i + wk2i * x0r;
	  x0r = x1r - x3i;
	  x0i = x1i + x3r;
	  a[j1] = wk1r * x0r - wk1i * x0i;
	  a[j1 + 1] = wk1r * x0i + wk1i * x0r;
	  x0r = x1r + x3i;
	  x0i = x1i - x3r;
	  a[j3] = wk3r * x0r - wk3i * x0i;
	  a[j3 + 1] = wk3r * x0i + wk3i * x0r;
	}
      }
    }

    l = m;
  }

  if (l < n) {

    for (j = 0; j <= l - 2; j += 2) {
      j1 = j + l;
      x0r = a[j] - a[j1];
      x0i = a[j + 1] - a[j1 + 1];
      a[j] += a[j1];
      a[j + 1] += a[j1 + 1];
      a[j1] = x0r;
      a[j1 + 1] = x0i;
    }
  }
}


void rftsub(int n, float *a, int nc, float *c)
{
  int j, k, kk, ks;
  float wkr, wki, xr, xi, yr, yi;
    
  ks = (nc << 2) / n;
  kk = 0;

  for (k = (n >> 1) - 2; k >= 2; k -= 2) {
    j = n - k;
    kk += ks;
    wkr = 0.5 - c[kk];
    wki = c[nc - kk];
    xr = a[k] - a[j];
    xi = a[k + 1] + a[j + 1];
    yr = wkr * xr - wki * xi;
    yi = wkr * xi + wki * xr;
    a[k] -= yr;
    a[k + 1] -= yi;
    a[j] += yr;
    a[j + 1] -= yi;
  }
}


void makewt(int nw, int *ip, float *w)
{
    void bitrv2(int n, int *ip, float *a);
    int nwh, j;
    float delta, x, y;
    
    ip[0] = nw;
    ip[1] = 1;
    if (nw > 2) {
        nwh = nw >> 1;
        delta = atan(1.0) / nwh;
        w[0] = 1;
        w[1] = 0;
        w[nwh] = cos(delta * nwh);
        w[nwh + 1] = w[nwh];
        for (j = 2; j <= nwh - 2; j += 2) {
            x = cos(delta * j);
            y = sin(delta * j);
            w[j] = x;
            w[j + 1] = y;
            w[nw - j] = y;
            w[nw - j + 1] = x;
        }
        bitrv2(nw, ip + 2, w);
    }
}


void makect(int nc, int *ip, float *c)
{
    int nch, j;
    float delta;
    
    ip[1] = nc;
    if (nc > 1) {
        nch = nc >> 1;
        delta = atan(1.0) / nch;
        c[0] = 0.5;
        c[nch] = 0.5 * cos(delta * nch);
        for (j = 1; j <= nch - 1; j++) {
            c[j] = 0.5 * cos(delta * j);
            c[nc - j] = 0.5 * sin(delta * j);
        }
    }
}

\ No newline at end of file
diff --git a/externals/lyonpotpourri/fftease.h b/externals/lyonpotpourri/fftease.h
new file mode 100755
index 0000000000000000000000000000000000000000..9d6e9cff4f367c2e8170cf050bce7c7e56795641
--- /dev/null
+++ b/externals/lyonpotpourri/fftease.h
@@ -0,0 +1,61 @@
+#include <stdio.h>
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+/*
+The new improved fftease.h
+*/
+
+#define getbytes t_getbytes
+#define freebytes t_freebytes
+#define resizebytes t_resizebytes
+
+#define FFTEASE_ANNOUNCEMENT "- a member of FFTease 2.52"
+
+#ifndef PI
+#define PI 3.141592653589793115997963468544185161590576171875
+#endif
+
+#ifndef TWOPI
+#define TWOPI 6.28318530717958623199592693708837032318115234375
+#endif
+
+#define MAX_N (16384)
+#define MAX_N2 (MAX_N/2)
+#define MAX_Nw (MAX_N * 4)
+
+void convert(float *S, float *C, int N2, float *lastphase, float fundamental, float factor );
+void unconvert( float *C, float *S, int N2, float *lastphase, float fundamental,  float factor );
+void rfft( float *x, int N, int forward );
+void cfft( float *x, int NC, int forward );
+void bitreverse( float *x, int N );
+void fold( float *I, float *W, int Nw, float *O, int N, int n );
+void init_rdft(int n, int *ip, float *w);
+void rdft(int n, int isgn, float *a, int *ip, float *w);
+void bitrv2(int n, int *ip, float *a);
+void cftsub(int n, float *a, float *w);
+void rftsub(int n, float *a, int nc, float *c);
+void makewt(int nw, int *ip, float *w);
+void makect(int nc, int *ip, float *c);
+void leanconvert( float *S, float *C, int N2 );
+void leanunconvert( float *C, float *S, int N2 );
+void makewindows( float *H, float *A, float *S, int Nw, int N, int I );
+void makehamming( float *H, float *A, float *S, int Nw, int N, int I,int odd );
+void makehanning( float *H, float *A, float *S, int Nw, int N, int I,int odd );
+void overlapadd( float *I, int N, float *W, float *O, int Nw, int n );
+void bloscbank( float *S, float *O, int D, float iD, float *lf, float *la,
+	float *bindex, float *tab, int len, float synt, int lo, int hi );
+
+float randf( float min, float max );
+int randi( int min, int max );
+int power_of_two(int test);
+
+
+void freebytes2(void *fatso, size_t nbytes);
+void *getbytes2(size_t nbytes);
+void *resizebytes2(void *old, size_t oldsize, size_t newsize);
+void limit_fftsize(int *N, int *Nw, char *OBJECT_NAME);
+
+/* THE FUNCTIONS */
diff --git a/externals/lyonpotpourri/fftease_oldskool.h b/externals/lyonpotpourri/fftease_oldskool.h
new file mode 100755
index 0000000000000000000000000000000000000000..65a382da2d018a86068580ac94bbfdf67f7c5bfe
--- /dev/null
+++ b/externals/lyonpotpourri/fftease_oldskool.h
@@ -0,0 +1,58 @@
+#include <stdio.h>
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+/*
+The new improved fftease.h
+*/
+
+
+#define FFTEASE_ANNOUNCEMENT "- a member of FFTease 2.52"
+
+#ifndef PI
+#define PI 3.141592653589793115997963468544185161590576171875
+#endif
+
+#ifndef TWOPI
+#define TWOPI 6.28318530717958623199592693708837032318115234375
+#endif
+
+#define MAX_N (16384)
+#define MAX_N2 (MAX_N/2)
+#define MAX_Nw (MAX_N * 4)
+
+void convert(float *S, float *C, int N2, float *lastphase, float fundamental, float factor );
+void unconvert( float *C, float *S, int N2, float *lastphase, float fundamental,  float factor );
+void rfft( float *x, int N, int forward );
+void cfft( float *x, int NC, int forward );
+void bitreverse( float *x, int N );
+void fold( float *I, float *W, int Nw, float *O, int N, int n );
+void init_rdft(int n, int *ip, float *w);
+void rdft(int n, int isgn, float *a, int *ip, float *w);
+void bitrv2(int n, int *ip, float *a);
+void cftsub(int n, float *a, float *w);
+void rftsub(int n, float *a, int nc, float *c);
+void makewt(int nw, int *ip, float *w);
+void makect(int nc, int *ip, float *c);
+void leanconvert( float *S, float *C, int N2 );
+void leanunconvert( float *C, float *S, int N2 );
+void makewindows( float *H, float *A, float *S, int Nw, int N, int I );
+void makehamming( float *H, float *A, float *S, int Nw, int N, int I,int odd );
+void makehanning( float *H, float *A, float *S, int Nw, int N, int I,int odd );
+void overlapadd( float *I, int N, float *W, float *O, int Nw, int n );
+void bloscbank( float *S, float *O, int D, float iD, float *lf, float *la,
+	float *bindex, float *tab, int len, float synt, int lo, int hi );
+
+float randf( float min, float max );
+int randi( int min, int max );
+int power_of_two(int test);
+
+
+void freebytes2(void *fatso, size_t nbytes);
+void *getbytes2(size_t nbytes);
+void *resizebytes2(void *old, size_t oldsize, size_t newsize);
+void limit_fftsize(int *N, int *Nw, char *OBJECT_NAME);
+
+/* THE FUNCTIONS */
diff --git a/externals/lyonpotpourri/fftease_setup.c b/externals/lyonpotpourri/fftease_setup.c
new file mode 100755
index 0000000000000000000000000000000000000000..3243f09129b98ec7a4d6a3975af922e61770d5c3
--- /dev/null
+++ b/externals/lyonpotpourri/fftease_setup.c
@@ -0,0 +1,5 @@
+void fftease_setup(void)
+{
+  //   post("Loaded FFTease Library");
+  //  printf("Loaded FFTease Library(2)");
+}
diff --git a/externals/lyonpotpourri/flanjah~-help.pd b/externals/lyonpotpourri/flanjah~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..2c59f9a5a7b132a7a2e827660e8babd90d230a4e
--- /dev/null
+++ b/externals/lyonpotpourri/flanjah~-help.pd
@@ -0,0 +1,62 @@
+#N canvas 698 193 450 406 10;
+#X obj 26 104 phasor~ 350;
+#X obj 124 294 *~ 0.1;
+#X obj 124 341 dac~;
+#X obj 124 79 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X floatatom 135 154 5 -0.5 0.5 2 feedback feedback -, f 5;
+#X floatatom 195 153 5 0 0 2 speed1 speed1 -, f 5;
+#X floatatom 244 151 5 0 0 2 speed2 speed2 -, f 5;
+#X floatatom 295 152 5 0 1 2 depth depth -, f 5;
+#X floatatom 189 320 5 0 0 0 - - -, f 5;
+#X msg 124 106 protect \$1;
+#X obj 124 259 flanjah~;
+#X obj 258 264 hsl 128 15 -0.425 0.425 0 0 feedback feedback-in feedback
+-2 -6 0 8 -167887 -1 -1 12326 1;
+#X obj 258 293 hsl 128 15 0 4 0 0 speed1 speed1-in speed1 -2 -6 0 8
+-167887 -1 -1 1048 1;
+#X obj 258 322 hsl 128 15 0 4 0 0 speed2 speed2-in speed2 -2 -6 0 8
+-167887 -1 -1 794 1;
+#X obj 258 350 hsl 128 15 0 1 0 0 depth depth-in depth -2 -6 0 8 -167887
+-1 -1 1524 1;
+#X text 145 76 protect from dangerous feedback;
+#X obj 189 276 vsl 15 32 0 0.5 0 0 empty empty gain 0 -8 0 8 -261728
+-1 -1 0 1;
+#X obj 26 129 killdc~;
+#X obj 23 9 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X floatatom 26 82 5 0 0 0 - - -, f 5;
+#X text 22 45 flanjah~ - A simple flanger;
+#N canvas 339 464 318 192 initialize 0;
+#X msg 172 66 0.33;
+#X msg 187 87 0.25;
+#X obj 207 22 loadbang;
+#X msg 207 107 0.12;
+#X msg 163 45 0.4;
+#X obj 37 62 s feedback-in;
+#X obj 39 82 s speed1-in;
+#X obj 39 104 s speed2-in;
+#X obj 40 123 s depth-in;
+#X connect 0 0 6 0;
+#X connect 1 0 7 0;
+#X connect 2 0 4 0;
+#X connect 2 0 0 0;
+#X connect 2 0 1 0;
+#X connect 2 0 3 0;
+#X connect 3 0 8 0;
+#X connect 4 0 5 0;
+#X restore 303 218 pd initialize;
+#X connect 0 0 17 0;
+#X connect 1 0 2 0;
+#X connect 1 0 2 1;
+#X connect 3 0 9 0;
+#X connect 4 0 10 1;
+#X connect 5 0 10 2;
+#X connect 6 0 10 3;
+#X connect 7 0 10 4;
+#X connect 8 0 1 1;
+#X connect 9 0 10 0;
+#X connect 10 0 1 0;
+#X connect 16 0 8 0;
+#X connect 17 0 10 0;
+#X connect 19 0 0 0;
diff --git a/externals/lyonpotpourri/flanjah~.c b/externals/lyonpotpourri/flanjah~.c
new file mode 100755
index 0000000000000000000000000000000000000000..f3c2d06a3f8e8e047cc2933bc1e7690728fac20a
--- /dev/null
+++ b/externals/lyonpotpourri/flanjah~.c
@@ -0,0 +1,333 @@
+#include "MSPd.h"
+
+/* pointless comment */
+
+#define F_LEN 65536
+
+
+static t_class *flanjah_class;
+
+
+#define OBJECT_NAME "flanjah~"
+
+typedef struct _flanjah
+{
+    
+    t_object x_obj;
+    float x_f;
+    //
+    float *sinetab;
+    float si_factor;
+    float osc1_phs;
+    float osc1_si;
+    float si1;
+    float osc2_phs;
+    float osc2_si;
+    float si2;
+    //
+    float speed1;
+    float speed2;
+    float feedback;
+    float maxdel;
+    float depth;
+    //
+    float *ddl1 ;
+    int ddl1_len;
+    int ddl1_phs;
+    float *ddl2 ;
+    int ddl2_len;
+    int ddl2_phs;
+    //
+    float tap1;
+    float tap2;
+    //
+    int feedback_connected;
+    int speed1_connected;
+    int speed2_connected;
+    int depth_connected;
+    short connected[8];
+    int feedback_protect;
+    short mute;
+    float sr;
+} t_flanjah;
+
+t_int *flanjah_perform(t_int *w);
+
+void flanjah_protect(t_flanjah *x, t_floatarg state);
+void flanjah_mute(t_flanjah *x, t_floatarg state);
+void flanjah_dsp(t_flanjah *x, t_signal **sp);
+void *flanjah_new(t_symbol *s, int argc, t_atom *argv);
+void flanjah_dsp_free( t_flanjah *x );
+void flanjah_report( t_flanjah *x );
+void flanjah_float(t_flanjah *x, double f);
+void flanjah_init(t_flanjah *x,short initialized);
+
+void flanjah_tilde_setup(void){
+    flanjah_class = class_new(gensym("flanjah~"), (t_newmethod)flanjah_new,
+                              (t_method)flanjah_dsp_free,sizeof(t_flanjah), 0,A_GIMME,0);
+    CLASS_MAINSIGNALIN(flanjah_class, t_flanjah, x_f);
+    class_addmethod(flanjah_class,(t_method)flanjah_dsp,gensym("dsp"),0);
+    class_addmethod(flanjah_class,(t_method)flanjah_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(flanjah_class,(t_method)flanjah_protect,gensym("protect"),A_FLOAT,0);
+    class_addmethod(flanjah_class,(t_method)flanjah_report,gensym("report"),0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+void flanjah_report( t_flanjah *x ){
+    post("feedback: %f", x->feedback);
+    post("depth: %f", x->depth);
+    post("si1: %f", x->osc1_si);
+    post("si2: %f", x->osc2_si);
+    post("speed1: %f", x->speed1);
+    post("speed2: %f", x->speed2);
+    post("phase1: %f", x->osc1_phs);
+    post("phase2: %f", x->osc2_phs);
+}
+
+void flanjah_dsp_free( t_flanjah *x ){
+    free(x->sinetab);
+    free(x->ddl1);
+    free(x->ddl2);
+}
+
+
+t_int *flanjah_perform(t_int *w)
+{
+    t_flanjah *x = (t_flanjah *)(w[1]);
+    t_float *in1 = (t_float *)(w[2]);
+    t_float *feedback_vec = (t_float *)(w[3]);
+    t_float *speed1_vec = (t_float *)(w[4]);
+    t_float *speed2_vec = (t_float *)(w[5]);
+    t_float *depth_vec = (t_float *)(w[6]);
+    t_float *out1 = (t_float *)(w[7]);
+    int n = (int) w[8];
+    float fdelay1, fdelay2;
+    int idelay1, idelay2;
+    float insamp1;//, insamp2;
+    float frac;
+    int index1, index2;
+    float m1, m2;
+    //
+    float osc2_phs = x->osc2_phs;
+    int ddl2_len = x->ddl2_len;
+    float osc2_si = x->osc2_si;
+    float *ddl2 = x->ddl2;
+    int ddl2_phs = x->ddl2_phs;
+    float *ddl1 = x->ddl1;
+    float *sinetab = x->sinetab;
+    int ddl1_phs = x->ddl1_phs;
+    int ddl1_len = x->ddl1_len;
+    float osc1_phs = x->osc1_phs;
+    float osc1_si = x->osc1_si;
+    float tap1 = x->tap1;
+    float tap2 = x->tap2;
+    float feedback = x->feedback;
+    int feedback_connected = x->feedback_connected;
+    int speed1_connected = x->speed1_connected;
+    int speed2_connected = x->speed2_connected;
+    int depth_connected = x->depth_connected;
+    float si_factor = x->si_factor;
+    int feedback_protect = x->feedback_protect;
+    float depth_factor = x->depth;
+    /**********************/
+    
+    if( x->mute ){
+        while( n-- ){
+            *out1++ = 0.0;
+        }
+        return (w+9);
+    }
+    while( n-- ){
+        // Pull Data off Signal buffers
+        insamp1 = *in1++;
+        if( feedback_connected ){
+            feedback = *feedback_vec++;
+            
+        }
+        if( feedback_protect ) {
+            if( feedback > 0.425){
+                feedback = 0.425;
+            }
+            if( feedback < -0.425 )
+                feedback = -0.425;
+        }
+        
+        if( speed1_connected ){
+            osc1_si = *speed1_vec++ * si_factor;
+        }
+        if( speed2_connected ){
+            osc2_si = *speed2_vec++ * si_factor;
+        }
+        if( depth_connected ){
+            depth_factor = *depth_vec++;
+        }
+        
+        if( depth_factor < .0001 ){
+            depth_factor = .0001;
+        }
+        if( depth_factor > 1. ){
+            depth_factor = 1.;
+        }
+        
+        fdelay1 = sinetab[ (int) osc1_phs ] * (float) ddl1_len * depth_factor;
+        fdelay2 = sinetab[ (int) osc2_phs ] * (float) ddl2_len * depth_factor;
+        
+        // DSP Proper
+		
+        idelay1 = fdelay1;
+        osc1_phs += osc1_si;
+        while( osc1_phs >= F_LEN )
+            osc1_phs -= F_LEN;
+        while( osc1_phs < 0 )
+            osc1_phs += F_LEN;
+        
+        
+        
+        
+        idelay2 = fdelay2;
+        osc2_phs += osc2_si;
+        while( osc2_phs >= F_LEN )
+            osc2_phs -= F_LEN;
+        while( osc1_phs < 0 )
+            osc2_phs += F_LEN;
+		
+        ddl1[ ddl1_phs++ ] = insamp1 + feedback * (tap1+tap2);
+        ddl1_phs = ddl1_phs % ddl1_len;
+        // linear interpolated lookup
+        index1 = (ddl1_phs + idelay1) % ddl1_len;
+        index2 = (index1 + 1) % ddl1_len ;
+        frac = fdelay1 - idelay1 ;
+        m1 = 1. - frac;
+        m2 = frac;
+        tap1 = m1 * ddl1[ index1 ] + m2 * ddl1[ index2 ];
+        
+        ddl2[ ddl2_phs++ ] = tap1;
+        ddl2_phs = ddl2_phs % ddl2_len;
+        index1 = (ddl2_phs + idelay2) % ddl2_len;
+        index2 = (index1 + 1) % ddl2_len ;
+        frac = fdelay2 - idelay2 ;
+        m1 = 1. - frac;
+        m2 = frac;
+        tap2 = m1 * ddl2[ index1 ] + m2 * ddl2[ index2 ];
+        *out1++ = (insamp1+tap2) * 0.2;
+        
+        
+        ///
+        
+    }
+    x->ddl1_phs = ddl1_phs;
+    x->osc1_phs = osc1_phs;
+    x->ddl2_phs = ddl2_phs;
+    x->osc2_phs = osc2_phs;
+    x->tap1 = tap1;
+    x->tap2 = tap2;
+    // DSP CONFIG
+    return (w+9);
+}
+
+
+// void lop_dsp(t_lop *x, t_signal **sp, short *count)
+void flanjah_dsp(t_flanjah *x, t_signal **sp)
+{
+
+    x->feedback_connected = 1;
+    x->speed1_connected = 1;
+    x->speed2_connected = 1;
+    x->depth_connected = 1;
+    
+    if(x->sr != sp[0]->s_sr){
+        x->sr = sp[0]->s_sr;
+        flanjah_init(x,1);
+    }
+    dsp_add(flanjah_perform, 8, x,
+            sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, sp[4]->s_vec, sp[5]->s_vec,
+            sp[0]->s_n);
+}
+
+void flanjah_mute(t_flanjah *x, t_floatarg state)
+{
+    x->mute = state;
+}
+
+void flanjah_protect(t_flanjah *x, t_floatarg state)
+{
+    x->feedback_protect = state;
+    //  post("feedback proctection set to %d",x->feedback_protect);
+}
+
+void flanjah_init(t_flanjah *x,short initialized)
+{
+    int i;
+    if( x->maxdel < .0001 ){
+        x->maxdel = .0001;
+        error("below minimum of 0.01 ms");
+    }
+    if( x->maxdel > 360000. ){
+        x->maxdel = 360000.;
+        error("above maximum of 360 seconds");
+    }
+	
+    x->si_factor = (float)F_LEN / x->sr;
+    x->ddl1_len = x->maxdel * x->sr ;
+    x->ddl1_phs = 0;
+    x->ddl2_len = x->maxdel * x->sr ;
+    x->ddl2_phs = 0;
+    x->osc1_si = x->si_factor * x->speed1;
+    x->osc1_phs = 0;
+    x->osc2_si = x->si_factor * x->speed2;
+    x->osc2_phs = 0;
+	
+    x->tap1 = x->tap2 = 0;
+    if(!initialized){
+        x->ddl1 = (float *) calloc(x->ddl1_len + 2, sizeof(float));
+        x->ddl2 = (float *) calloc(x->ddl2_len + 2, sizeof(float));
+        x->sinetab = (float *) calloc(F_LEN,sizeof(float));
+        for( i = 0; i < F_LEN ; i++ ){
+            x->sinetab[i] = 0.51 - 0.47 * cos( TWOPI * (float) i / (float) F_LEN);
+        }
+    } else {
+        x->ddl1 = (float *) realloc(x->ddl1,(x->ddl1_len + 2) * sizeof(float));
+        x->ddl2 = (float *) realloc(x->ddl2,(x->ddl2_len + 2) * sizeof(float));
+    }
+}
+
+void *flanjah_new(t_symbol *s, int argc, t_atom *argv)
+{
+
+    t_flanjah *x = (t_flanjah *)pd_new(flanjah_class);
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+    
+    x->sr = sys_getsr();
+    if(!x->sr){
+        error("zero sampling rate - set to 44100");
+        x->sr = 44100;
+    }
+    
+    // SET DEFAULTS
+    
+    x->maxdel = .05; // in seconds
+    x->feedback = 0.7;
+    x->speed1 = 0.136;
+    x->speed2 = 0.183;
+    x->feedback_protect = 1;
+    x->depth = 1.0;
+    
+    if( argc > 0 )
+        x->maxdel = atom_getfloatarg(0,argc,argv)/1000.0;
+    if( argc > 1 )
+        x->feedback = atom_getfloatarg(1,argc,argv);
+    if( argc > 2 )
+        x->speed1 = atom_getfloatarg(2,argc,argv);
+    if( argc > 3 )
+        x->speed2 = atom_getfloatarg(3,argc,argv);
+    if( argc > 4 )
+        x->depth = atom_getfloatarg(4,argc,argv);	
+    
+    flanjah_init(x,0);
+    return (x);
+}
+
diff --git a/externals/lyonpotpourri/fold.c b/externals/lyonpotpourri/fold.c
new file mode 100755
index 0000000000000000000000000000000000000000..0523d28fcb31c26d83ac44be7891b4886c14f7cc
--- /dev/null
+++ b/externals/lyonpotpourri/fold.c
@@ -0,0 +1 @@
+#include "fftease.h"

/*
 * multiply current input I by window W (both of length Nw);
 * using modulus arithmetic, fold and rotate windowed input
 * into output array O of (FFT) length N according to current
 * input time n
 */
void fold( float *I, float *W, int Nw, float *O, int N, int n )

{
 
    int i;

    for ( i = 0; i < N; i++ )
	O[i] = 0.;

    while ( n < 0 )
      	n += N;
    n %= N;
    for ( i = 0; i < Nw; i++ ) {
	      O[n] += I[i]*W[i];
      	if ( ++n == N )
	      n = 0;
    }
}

\ No newline at end of file
diff --git a/externals/lyonpotpourri/from_msp.c b/externals/lyonpotpourri/from_msp.c
new file mode 100755
index 0000000000000000000000000000000000000000..04ab90461e87c388e9f3a83a8b122908d5218ddd
--- /dev/null
+++ b/externals/lyonpotpourri/from_msp.c
@@ -0,0 +1 @@
+
#include "MSPd.h"
void atom_arg_getfloat(float *c, long idx, long ac, t_atom *av)
{
    if (c&&ac&&av&&(idx<ac)) {
        *c = atom_getfloat(av+idx);
    }
}
void atom_arg_getsym(t_symbol **c, long idx, long ac, t_atom *av)
{
	if (c&&ac&&av&&(idx<ac)) {
		*c = atom_getsymbol(av+idx);
	}
}
\ No newline at end of file
diff --git a/externals/lyonpotpourri/function~-help.pd b/externals/lyonpotpourri/function~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..03baceb914aee7e8a1b575d4009ca82f9c0a1cc4
--- /dev/null
+++ b/externals/lyonpotpourri/function~-help.pd
@@ -0,0 +1,1308 @@
+#N canvas 345 100 446 350 10;
+#X obj 65 126 function~ putty;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array putty 8192 float 3;
+#A 0 1.52302e-08 1.53646e-08 1.55002e-08 1.56369e-08 1.57749e-08 1.5914e-08
+1.60543e-08 1.61957e-08 1.63385e-08 1.64824e-08 1.66276e-08 1.6774e-08
+1.69216e-08 1.70705e-08 1.72207e-08 1.73722e-08 1.7525e-08 1.76791e-08
+1.78345e-08 1.79912e-08 1.81493e-08 1.83087e-08 1.84695e-08 1.86316e-08
+1.87951e-08 1.896e-08 1.91264e-08 1.92941e-08 1.94633e-08 1.96339e-08
+1.9806e-08 1.99795e-08 2.01545e-08 2.0331e-08 2.0509e-08 2.06886e-08
+2.08696e-08 2.10522e-08 2.12363e-08 2.1422e-08 2.16093e-08 2.17981e-08
+2.19886e-08 2.21807e-08 2.23744e-08 2.25698e-08 2.27668e-08 2.29655e-08
+2.31659e-08 2.33679e-08 2.35718e-08 2.37773e-08 2.39845e-08 2.41935e-08
+2.44043e-08 2.46168e-08 2.48312e-08 2.50473e-08 2.52654e-08 2.54852e-08
+2.57069e-08 2.59305e-08 2.61559e-08 2.63833e-08 2.66126e-08 2.68437e-08
+2.70769e-08 2.73121e-08 2.75492e-08 2.77883e-08 2.80294e-08 2.82726e-08
+2.85178e-08 2.8765e-08 2.90144e-08 2.92659e-08 2.95194e-08 2.97752e-08
+3.0033e-08 3.0293e-08 3.05552e-08 3.08196e-08 3.10863e-08 3.13552e-08
+3.16263e-08 3.18997e-08 3.21754e-08 3.24534e-08 3.27337e-08 3.30164e-08
+3.33015e-08 3.3589e-08 3.38788e-08 3.41711e-08 3.44659e-08 3.4763e-08
+3.50628e-08 3.53649e-08 3.56697e-08 3.5977e-08 3.62868e-08 3.65993e-08
+3.69143e-08 3.7232e-08 3.75523e-08 3.78753e-08 3.82011e-08 3.85295e-08
+3.88606e-08 3.91946e-08 3.95313e-08 3.98708e-08 4.02131e-08 4.05583e-08
+4.09064e-08 4.12574e-08 4.16113e-08 4.19681e-08 4.2328e-08 4.26907e-08
+4.30566e-08 4.34254e-08 4.37974e-08 4.41724e-08 4.45505e-08 4.49318e-08
+4.53163e-08 4.57039e-08 4.60948e-08 4.64888e-08 4.68862e-08 4.72869e-08
+4.76908e-08 4.80982e-08 4.85089e-08 4.89229e-08 4.93405e-08 4.97615e-08
+5.0186e-08 5.0614e-08 5.10455e-08 5.14806e-08 5.19193e-08 5.23616e-08
+5.28076e-08 5.32572e-08 5.37106e-08 5.41677e-08 5.46286e-08 5.50933e-08
+5.55619e-08 5.60342e-08 5.65105e-08 5.69907e-08 5.74749e-08 5.79631e-08
+5.84552e-08 5.89515e-08 5.94518e-08 5.99562e-08 6.04648e-08 6.09775e-08
+6.14946e-08 6.20158e-08 6.25413e-08 6.30711e-08 6.36053e-08 6.41438e-08
+6.46869e-08 6.52343e-08 6.57863e-08 6.63428e-08 6.69038e-08 6.74694e-08
+6.80397e-08 6.86146e-08 6.91943e-08 6.97786e-08 7.03679e-08 7.09619e-08
+7.15607e-08 7.21645e-08 7.27733e-08 7.33868e-08 7.40056e-08 7.46293e-08
+7.52582e-08 7.58922e-08 7.65314e-08 7.71757e-08 7.78254e-08 7.84803e-08
+7.91406e-08 7.98062e-08 8.04774e-08 8.11539e-08 8.1836e-08 8.25236e-08
+8.32169e-08 8.39157e-08 8.46203e-08 8.53305e-08 8.60467e-08 8.67685e-08
+8.74963e-08 8.823e-08 8.89696e-08 8.97152e-08 9.04669e-08 9.12247e-08
+9.19887e-08 9.27589e-08 9.35352e-08 9.43179e-08 9.5107e-08 9.59023e-08
+9.67043e-08 9.75126e-08 9.83276e-08 9.91491e-08 9.99773e-08 1.00812e-07
+1.01654e-07 1.02502e-07 1.03357e-07 1.0422e-07 1.05089e-07 1.05965e-07
+1.06848e-07 1.07739e-07 1.08636e-07 1.09541e-07 1.10453e-07 1.11373e-07
+1.123e-07 1.13234e-07 1.14176e-07 1.15125e-07 1.16083e-07 1.17047e-07
+1.1802e-07 1.19e-07 1.19989e-07 1.20985e-07 1.21989e-07 1.23002e-07
+1.24022e-07 1.25051e-07 1.26088e-07 1.27133e-07 1.28187e-07 1.29249e-07
+1.30319e-07 1.31399e-07 1.32486e-07 1.33583e-07 1.34688e-07 1.35803e-07
+1.36926e-07 1.38058e-07 1.39199e-07 1.4035e-07 1.41509e-07 1.42678e-07
+1.43856e-07 1.45044e-07 1.46241e-07 1.47447e-07 1.48664e-07 1.4989e-07
+1.51125e-07 1.52371e-07 1.53627e-07 1.54892e-07 1.56168e-07 1.57454e-07
+1.5875e-07 1.60056e-07 1.61373e-07 1.627e-07 1.64038e-07 1.65387e-07
+1.66746e-07 1.68116e-07 1.69497e-07 1.70889e-07 1.72292e-07 1.73706e-07
+1.75131e-07 1.76568e-07 1.78016e-07 1.79476e-07 1.80947e-07 1.8243e-07
+1.83924e-07 1.85431e-07 1.86949e-07 1.8848e-07 1.90022e-07 1.91577e-07
+1.93144e-07 1.94723e-07 1.96315e-07 1.9792e-07 1.99537e-07 2.01167e-07
+2.0281e-07 2.04466e-07 2.06135e-07 2.07817e-07 2.09512e-07 2.11221e-07
+2.12943e-07 2.14679e-07 2.16429e-07 2.18192e-07 2.19969e-07 2.2176e-07
+2.23565e-07 2.25385e-07 2.27219e-07 2.29067e-07 2.3093e-07 2.32807e-07
+2.34699e-07 2.36606e-07 2.38529e-07 2.40466e-07 2.42418e-07 2.44386e-07
+2.46369e-07 2.48368e-07 2.50382e-07 2.52412e-07 2.54458e-07 2.5652e-07
+2.58599e-07 2.60693e-07 2.62804e-07 2.64932e-07 2.67076e-07 2.69237e-07
+2.71414e-07 2.73609e-07 2.75821e-07 2.7805e-07 2.80297e-07 2.82561e-07
+2.84843e-07 2.87143e-07 2.89461e-07 2.91797e-07 2.9415e-07 2.96523e-07
+2.98914e-07 3.01323e-07 3.03751e-07 3.06198e-07 3.08665e-07 3.1115e-07
+3.13655e-07 3.16179e-07 3.18723e-07 3.21286e-07 3.2387e-07 3.26474e-07
+3.29098e-07 3.31742e-07 3.34406e-07 3.37092e-07 3.39798e-07 3.42525e-07
+3.45274e-07 3.48043e-07 3.50835e-07 3.53647e-07 3.56482e-07 3.59338e-07
+3.62217e-07 3.65118e-07 3.68041e-07 3.70987e-07 3.73956e-07 3.76948e-07
+3.79963e-07 3.83001e-07 3.86062e-07 3.89147e-07 3.92256e-07 3.95389e-07
+3.98547e-07 4.01728e-07 4.04934e-07 4.08165e-07 4.11421e-07 4.14701e-07
+4.18007e-07 4.21339e-07 4.24696e-07 4.28079e-07 4.31488e-07 4.34923e-07
+4.38385e-07 4.41873e-07 4.45388e-07 4.4893e-07 4.52499e-07 4.56095e-07
+4.5972e-07 4.63372e-07 4.67052e-07 4.7076e-07 4.74496e-07 4.78262e-07
+4.82056e-07 4.85879e-07 4.89731e-07 4.93613e-07 4.97525e-07 5.01466e-07
+5.05438e-07 5.0944e-07 5.13473e-07 5.17536e-07 5.2163e-07 5.25756e-07
+5.29914e-07 5.34102e-07 5.38323e-07 5.42576e-07 5.46862e-07 5.5118e-07
+5.55531e-07 5.59915e-07 5.64333e-07 5.68784e-07 5.73269e-07 5.77789e-07
+5.82343e-07 5.86931e-07 5.91554e-07 5.96212e-07 6.00906e-07 6.05635e-07
+6.104e-07 6.15202e-07 6.2004e-07 6.24914e-07 6.29826e-07 6.34775e-07
+6.39761e-07 6.44785e-07 6.49847e-07 6.54948e-07 6.60087e-07 6.65265e-07
+6.70482e-07 6.75739e-07 6.81035e-07 6.86371e-07 6.91748e-07 6.97166e-07
+7.02624e-07 7.08123e-07 7.13664e-07 7.19247e-07 7.24873e-07 7.3054e-07
+7.3625e-07 7.42003e-07 7.478e-07 7.5364e-07 7.59524e-07 7.65452e-07
+7.71426e-07 7.77443e-07 7.83506e-07 7.89615e-07 7.95771e-07 8.01971e-07
+8.08219e-07 8.14513e-07 8.20856e-07 8.27245e-07 8.33682e-07 8.40168e-07
+8.46702e-07 8.53285e-07 8.59918e-07 8.666e-07 8.73333e-07 8.80116e-07
+8.86949e-07 8.93834e-07 9.0077e-07 9.07758e-07 9.14798e-07 9.21891e-07
+9.29038e-07 9.36237e-07 9.4349e-07 9.50797e-07 9.58159e-07 9.65576e-07
+9.73048e-07 9.80576e-07 9.8816e-07 9.958e-07 1.0035e-06 1.01125e-06
+1.01906e-06 1.02693e-06 1.03486e-06 1.04285e-06 1.0509e-06 1.05901e-06
+1.06717e-06 1.0754e-06 1.08369e-06 1.09204e-06 1.10046e-06 1.10893e-06
+1.11747e-06 1.12607e-06 1.13474e-06 1.14347e-06 1.15226e-06 1.16112e-06
+1.17004e-06 1.17904e-06 1.18809e-06 1.19722e-06 1.20641e-06 1.21567e-06
+1.225e-06 1.2344e-06 1.24386e-06 1.2534e-06 1.26301e-06 1.27269e-06
+1.28243e-06 1.29226e-06 1.30215e-06 1.31212e-06 1.32216e-06 1.33227e-06
+1.34246e-06 1.35272e-06 1.36306e-06 1.37348e-06 1.38397e-06 1.39454e-06
+1.40519e-06 1.41591e-06 1.42672e-06 1.4376e-06 1.44856e-06 1.45961e-06
+1.47073e-06 1.48194e-06 1.49323e-06 1.5046e-06 1.51605e-06 1.52759e-06
+1.53921e-06 1.55092e-06 1.56272e-06 1.57459e-06 1.58656e-06 1.59862e-06
+1.61076e-06 1.62299e-06 1.63531e-06 1.64772e-06 1.66022e-06 1.67282e-06
+1.6855e-06 1.69828e-06 1.71115e-06 1.72411e-06 1.73717e-06 1.75032e-06
+1.76357e-06 1.77692e-06 1.79036e-06 1.8039e-06 1.81754e-06 1.83128e-06
+1.84512e-06 1.85906e-06 1.8731e-06 1.88724e-06 1.90149e-06 1.91584e-06
+1.93029e-06 1.94485e-06 1.95951e-06 1.97428e-06 1.98916e-06 2.00414e-06
+2.01924e-06 2.03444e-06 2.04975e-06 2.06517e-06 2.08071e-06 2.09635e-06
+2.11212e-06 2.12799e-06 2.14398e-06 2.16008e-06 2.1763e-06 2.19264e-06
+2.2091e-06 2.22567e-06 2.24237e-06 2.25918e-06 2.27611e-06 2.29317e-06
+2.31035e-06 2.32766e-06 2.34508e-06 2.36264e-06 2.38032e-06 2.39813e-06
+2.41606e-06 2.43413e-06 2.45232e-06 2.47065e-06 2.4891e-06 2.50769e-06
+2.52642e-06 2.54527e-06 2.56426e-06 2.58339e-06 2.60266e-06 2.62206e-06
+2.6416e-06 2.66129e-06 2.68111e-06 2.70107e-06 2.72118e-06 2.74143e-06
+2.76183e-06 2.78237e-06 2.80306e-06 2.8239e-06 2.84488e-06 2.86602e-06
+2.8873e-06 2.90874e-06 2.93034e-06 2.95208e-06 2.97398e-06 2.99604e-06
+3.01825e-06 3.04062e-06 3.06315e-06 3.08584e-06 3.10869e-06 3.13171e-06
+3.15489e-06 3.17823e-06 3.20174e-06 3.22541e-06 3.24926e-06 3.27327e-06
+3.29746e-06 3.32181e-06 3.34634e-06 3.37104e-06 3.39592e-06 3.42097e-06
+3.4462e-06 3.47161e-06 3.4972e-06 3.52297e-06 3.54892e-06 3.57506e-06
+3.60138e-06 3.62788e-06 3.65458e-06 3.68146e-06 3.70853e-06 3.73579e-06
+3.76325e-06 3.7909e-06 3.81874e-06 3.84678e-06 3.87502e-06 3.90346e-06
+3.9321e-06 3.96093e-06 3.98997e-06 4.01922e-06 4.04867e-06 4.07833e-06
+4.1082e-06 4.13828e-06 4.16856e-06 4.19906e-06 4.22978e-06 4.26071e-06
+4.29186e-06 4.32322e-06 4.35481e-06 4.38662e-06 4.41865e-06 4.4509e-06
+4.48338e-06 4.51609e-06 4.54903e-06 4.58219e-06 4.61559e-06 4.64922e-06
+4.68309e-06 4.71719e-06 4.75153e-06 4.78612e-06 4.82094e-06 4.856e-06
+4.89131e-06 4.92687e-06 4.96268e-06 4.99873e-06 5.03503e-06 5.07159e-06
+5.10841e-06 5.14547e-06 5.1828e-06 5.22038e-06 5.25823e-06 5.29634e-06
+5.33472e-06 5.37336e-06 5.41227e-06 5.45145e-06 5.4909e-06 5.53062e-06
+5.57063e-06 5.6109e-06 5.65146e-06 5.6923e-06 5.73342e-06 5.77482e-06
+5.81652e-06 5.8585e-06 5.90077e-06 5.94333e-06 5.98619e-06 6.02934e-06
+6.07279e-06 6.11654e-06 6.1606e-06 6.20495e-06 6.24962e-06 6.29459e-06
+6.33987e-06 6.38546e-06 6.43137e-06 6.47759e-06 6.52414e-06 6.571e-06
+6.61819e-06 6.66569e-06 6.71353e-06 6.76169e-06 6.81019e-06 6.85902e-06
+6.90818e-06 6.95768e-06 7.00752e-06 7.0577e-06 7.10823e-06 7.1591e-06
+7.21033e-06 7.2619e-06 7.31382e-06 7.36611e-06 7.41875e-06 7.47174e-06
+7.52511e-06 7.57883e-06 7.63293e-06 7.68739e-06 7.74223e-06 7.79744e-06
+7.85303e-06 7.90899e-06 7.96534e-06 8.02207e-06 8.07919e-06 8.1367e-06
+8.19459e-06 8.25289e-06 8.31158e-06 8.37067e-06 8.43016e-06 8.49006e-06
+8.55037e-06 8.61108e-06 8.6722e-06 8.73375e-06 8.79571e-06 8.85809e-06
+8.92089e-06 8.98412e-06 9.04778e-06 9.11187e-06 9.17639e-06 9.24135e-06
+9.30676e-06 9.3726e-06 9.43888e-06 9.50562e-06 9.57281e-06 9.64045e-06
+9.70855e-06 9.77712e-06 9.84614e-06 9.91563e-06 9.98559e-06 1.0056e-05
+1.01269e-05 1.01983e-05 1.02702e-05 1.03425e-05 1.04154e-05 1.04887e-05
+1.05625e-05 1.06368e-05 1.07116e-05 1.0787e-05 1.08628e-05 1.09391e-05
+1.1016e-05 1.10933e-05 1.11712e-05 1.12496e-05 1.13286e-05 1.1408e-05
+1.1488e-05 1.15685e-05 1.16496e-05 1.17312e-05 1.18134e-05 1.18961e-05
+1.19794e-05 1.20632e-05 1.21476e-05 1.22325e-05 1.2318e-05 1.24041e-05
+1.24908e-05 1.2578e-05 1.26658e-05 1.27542e-05 1.28432e-05 1.29328e-05
+1.3023e-05 1.31138e-05 1.32052e-05 1.32972e-05 1.33898e-05 1.3483e-05
+1.35768e-05 1.36713e-05 1.37664e-05 1.38621e-05 1.39585e-05 1.40555e-05
+1.41532e-05 1.42514e-05 1.43504e-05 1.445e-05 1.45503e-05 1.46512e-05
+1.47528e-05 1.48551e-05 1.4958e-05 1.50616e-05 1.51659e-05 1.52709e-05
+1.53766e-05 1.5483e-05 1.55901e-05 1.56979e-05 1.58065e-05 1.59157e-05
+1.60256e-05 1.61363e-05 1.62477e-05 1.63599e-05 1.64727e-05 1.65864e-05
+1.67007e-05 1.68159e-05 1.69317e-05 1.70484e-05 1.71658e-05 1.7284e-05
+1.74029e-05 1.75227e-05 1.76432e-05 1.77645e-05 1.78866e-05 1.80095e-05
+1.81333e-05 1.82578e-05 1.83831e-05 1.85093e-05 1.86363e-05 1.87641e-05
+1.88928e-05 1.90223e-05 1.91526e-05 1.92838e-05 1.94158e-05 1.95488e-05
+1.96826e-05 1.98172e-05 1.99527e-05 2.00892e-05 2.02265e-05 2.03647e-05
+2.05038e-05 2.06438e-05 2.07847e-05 2.09266e-05 2.10693e-05 2.1213e-05
+2.13576e-05 2.15032e-05 2.16497e-05 2.17972e-05 2.19456e-05 2.2095e-05
+2.22453e-05 2.23966e-05 2.2549e-05 2.27022e-05 2.28565e-05 2.30118e-05
+2.31681e-05 2.33254e-05 2.34837e-05 2.36431e-05 2.38035e-05 2.39649e-05
+2.41273e-05 2.42908e-05 2.44554e-05 2.4621e-05 2.47877e-05 2.49554e-05
+2.51243e-05 2.52942e-05 2.54652e-05 2.56374e-05 2.58106e-05 2.5985e-05
+2.61604e-05 2.6337e-05 2.65148e-05 2.66937e-05 2.68737e-05 2.70549e-05
+2.72372e-05 2.74207e-05 2.76054e-05 2.77913e-05 2.79784e-05 2.81667e-05
+2.83561e-05 2.85468e-05 2.87387e-05 2.89319e-05 2.91262e-05 2.93219e-05
+2.95187e-05 2.97168e-05 2.99162e-05 3.01169e-05 3.03189e-05 3.05221e-05
+3.07266e-05 3.09324e-05 3.11396e-05 3.13481e-05 3.15579e-05 3.1769e-05
+3.19815e-05 3.21953e-05 3.24105e-05 3.2627e-05 3.2845e-05 3.30643e-05
+3.3285e-05 3.35071e-05 3.37306e-05 3.39555e-05;
+#A 1000 3.41819e-05 3.44097e-05 3.4639e-05 3.48696e-05 3.51018e-05
+3.53354e-05 3.55705e-05 3.58071e-05 3.60452e-05 3.62848e-05 3.65259e-05
+3.67685e-05 3.70127e-05 3.72584e-05 3.75057e-05 3.77545e-05 3.80049e-05
+3.82568e-05 3.85104e-05 3.87655e-05 3.90223e-05 3.92807e-05 3.95407e-05
+3.98023e-05 4.00656e-05 4.03305e-05 4.05971e-05 4.08654e-05 4.11353e-05
+4.1407e-05 4.16804e-05 4.19554e-05 4.22322e-05 4.25107e-05 4.2791e-05
+4.3073e-05 4.33568e-05 4.36424e-05 4.39298e-05 4.42189e-05 4.45099e-05
+4.48027e-05 4.50973e-05 4.53937e-05 4.5692e-05 4.59922e-05 4.62943e-05
+4.65982e-05 4.6904e-05 4.72117e-05 4.75214e-05 4.78329e-05 4.81464e-05
+4.84619e-05 4.87793e-05 4.90987e-05 4.942e-05 4.97434e-05 5.00688e-05
+5.03962e-05 5.07256e-05 5.10571e-05 5.13907e-05 5.17263e-05 5.20639e-05
+5.24037e-05 5.27456e-05 5.30896e-05 5.34357e-05 5.3784e-05 5.41344e-05
+5.4487e-05 5.48417e-05 5.51987e-05 5.55579e-05 5.59192e-05 5.62828e-05
+5.66487e-05 5.70168e-05 5.73872e-05 5.77598e-05 5.81348e-05 5.8512e-05
+5.88916e-05 5.92735e-05 5.96578e-05 6.00444e-05 6.04334e-05 6.08248e-05
+6.12186e-05 6.16148e-05 6.20135e-05 6.24145e-05 6.28181e-05 6.32241e-05
+6.36326e-05 6.40436e-05 6.44572e-05 6.48733e-05 6.52918e-05 6.5713e-05
+6.61367e-05 6.65631e-05 6.6992e-05 6.74235e-05 6.78577e-05 6.82946e-05
+6.87341e-05 6.91763e-05 6.96211e-05 7.00688e-05 7.0519e-05 7.09721e-05
+7.14279e-05 7.18865e-05 7.23479e-05 7.2812e-05 7.32791e-05 7.37489e-05
+7.42216e-05 7.46971e-05 7.51756e-05 7.5657e-05 7.61412e-05 7.66284e-05
+7.71186e-05 7.76117e-05 7.81078e-05 7.86069e-05 7.9109e-05 7.96142e-05
+8.01224e-05 8.06337e-05 8.11481e-05 8.16656e-05 8.21862e-05 8.271e-05
+8.32369e-05 8.3767e-05 8.43002e-05 8.48367e-05 8.53765e-05 8.59195e-05
+8.64657e-05 8.70152e-05 8.75681e-05 8.81243e-05 8.86837e-05 8.92466e-05
+8.98128e-05 9.03825e-05 9.09555e-05 9.1532e-05 9.2112e-05 9.26954e-05
+9.32823e-05 9.38727e-05 9.44667e-05 9.50643e-05 9.56654e-05 9.627e-05
+9.68784e-05 9.74903e-05 9.81059e-05 9.87252e-05 9.93481e-05 9.99749e-05
+0.000100605 0.000101239 0.000101877 0.000102519 0.000103165 0.000103814
+0.000104467 0.000105125 0.000105786 0.000106451 0.00010712 0.000107793
+0.00010847 0.00010915 0.000109835 0.000110525 0.000111218 0.000111915
+0.000112616 0.000113322 0.000114031 0.000114745 0.000115463 0.000116186
+0.000116912 0.000117643 0.000118379 0.000119118 0.000119862 0.00012061
+0.000121363 0.00012212 0.000122882 0.000123648 0.000124419 0.000125194
+0.000125974 0.000126758 0.000127547 0.00012834 0.000129139 0.000129941
+0.000130749 0.000131561 0.000132378 0.0001332 0.000134027 0.000134859
+0.000135695 0.000136536 0.000137383 0.000138234 0.00013909 0.000139951
+0.000140817 0.000141689 0.000142565 0.000143446 0.000144333 0.000145225
+0.000146122 0.000147024 0.000147931 0.000148844 0.000149762 0.000150685
+0.000151614 0.000152548 0.000153488 0.000154433 0.000155383 0.000156339
+0.000157301 0.000158268 0.00015924 0.000160219 0.000161203 0.000162193
+0.000163188 0.000164189 0.000165196 0.000166209 0.000167228 0.000168252
+0.000169283 0.000170319 0.000171361 0.00017241 0.000173464 0.000174525
+0.000175591 0.000176664 0.000177743 0.000178828 0.00017992 0.000181017
+0.000182121 0.000183231 0.000184348 0.000185471 0.000186601 0.000187737
+0.000188879 0.000190028 0.000191184 0.000192346 0.000193515 0.00019469
+0.000195873 0.000197062 0.000198258 0.00019946 0.00020067 0.000201886
+0.00020311 0.00020434 0.000205577 0.000206822 0.000208073 0.000209332
+0.000210597 0.00021187 0.000213151 0.000214438 0.000215733 0.000217035
+0.000218345 0.000219662 0.000220986 0.000222318 0.000223658 0.000225005
+0.000226359 0.000227722 0.000229092 0.00023047 0.000231855 0.000233249
+0.00023465 0.000236059 0.000237476 0.000238902 0.000240335 0.000241776
+0.000243226 0.000244683 0.000246149 0.000247623 0.000249105 0.000250596
+0.000252095 0.000253603 0.000255119 0.000256643 0.000258176 0.000259718
+0.000261268 0.000262827 0.000264395 0.000265971 0.000267556 0.000269151
+0.000270754 0.000272366 0.000273987 0.000275617 0.000277256 0.000278905
+0.000280562 0.000282229 0.000283905 0.00028559 0.000287285 0.000288989
+0.000290703 0.000292427 0.000294159 0.000295902 0.000297654 0.000299416
+0.000301188 0.000302969 0.000304761 0.000306562 0.000308373 0.000310195
+0.000312026 0.000313868 0.00031572 0.000317582 0.000319454 0.000321337
+0.00032323 0.000325133 0.000327047 0.000328972 0.000330907 0.000332853
+0.00033481 0.000336777 0.000338756 0.000340745 0.000342745 0.000344756
+0.000346778 0.000348811 0.000350856 0.000352911 0.000354978 0.000357056
+0.000359146 0.000361247 0.00036336 0.000365484 0.00036762 0.000369767
+0.000371927 0.000374098 0.000376281 0.000378475 0.000380682 0.000382901
+0.000385132 0.000387375 0.000389631 0.000391899 0.000394179 0.000396471
+0.000398776 0.000401093 0.000403424 0.000405766 0.000408122 0.00041049
+0.000412871 0.000415265 0.000417672 0.000420092 0.000422525 0.000424972
+0.000427431 0.000429904 0.000432391 0.00043489 0.000437404 0.000439931
+0.000442471 0.000445025 0.000447593 0.000450175 0.000452771 0.000455381
+0.000458004 0.000460642 0.000463295 0.000465961 0.000468642 0.000471337
+0.000474047 0.000476771 0.00047951 0.000482263 0.000485031 0.000487815
+0.000490613 0.000493426 0.000496254 0.000499097 0.000501956 0.000504829
+0.000507719 0.000510623 0.000513543 0.000516479 0.00051943 0.000522397
+0.00052538 0.000528379 0.000531394 0.000534425 0.000537472 0.000540535
+0.000543614 0.00054671 0.000549822 0.000552951 0.000556097 0.000559259
+0.000562438 0.000565633 0.000568846 0.000572076 0.000575323 0.000578587
+0.000581868 0.000585166 0.000588483 0.000591816 0.000595167 0.000598536
+0.000601923 0.000605327 0.00060875 0.00061219 0.000615649 0.000619126
+0.000622621 0.000626135 0.000629667 0.000633217 0.000636786 0.000640374
+0.000643981 0.000647607 0.000651252 0.000654915 0.000658599 0.000662301
+0.000666023 0.000669764 0.000673525 0.000677305 0.000681105 0.000684925
+0.000688765 0.000692625 0.000696506 0.000700406 0.000704327 0.000708268
+0.00071223 0.000716212 0.000720215 0.000724239 0.000728284 0.000732349
+0.000736436 0.000740544 0.000744674 0.000748825 0.000752997 0.000757191
+0.000761407 0.000765644 0.000769904 0.000774185 0.000778489 0.000782815
+0.000787163 0.000791534 0.000795927 0.000800343 0.000804782 0.000809244
+0.000813728 0.000818236 0.000822767 0.000827321 0.000831899 0.0008365
+0.000841125 0.000845773 0.000850446 0.000855142 0.000859863 0.000864607
+0.000869376 0.00087417 0.000878988 0.00088383 0.000888698 0.00089359
+0.000898508 0.00090345 0.000908418 0.000913411 0.000918429 0.000923473
+0.000928543 0.000933639 0.00093876 0.000943908 0.000949082 0.000954282
+0.000959509 0.000964762 0.000970042 0.000975348 0.000980682 0.000986042
+0.00099143 0.000996845 0.00100229 0.00100776 0.00101326 0.00101878
+0.00102433 0.00102992 0.00103553 0.00104116 0.00104683 0.00105253 0.00105825
+0.001064 0.00106978 0.00107559 0.00108143 0.0010873 0.0010932 0.00109913
+0.00110509 0.00111108 0.0011171 0.00112314 0.00112922 0.00113533 0.00114147
+0.00114764 0.00115384 0.00116008 0.00116634 0.00117263 0.00117896 0.00118532
+0.00119171 0.00119813 0.00120458 0.00121107 0.00121759 0.00122414 0.00123072
+0.00123734 0.00124399 0.00125067 0.00125738 0.00126413 0.00127091 0.00127773
+0.00128458 0.00129146 0.00129838 0.00130533 0.00131232 0.00131934 0.00132639
+0.00133348 0.00134061 0.00134777 0.00135496 0.00136219 0.00136946 0.00137676
+0.0013841 0.00139148 0.00139889 0.00140633 0.00141382 0.00142134 0.0014289
+0.00143649 0.00144412 0.00145179 0.0014595 0.00146725 0.00147503 0.00148285
+0.00149071 0.00149861 0.00150654 0.00151452 0.00152253 0.00153059 0.00153868
+0.00154681 0.00155498 0.00156319 0.00157144 0.00157974 0.00158807 0.00159644
+0.00160485 0.00161331 0.0016218 0.00163034 0.00163892 0.00164753 0.0016562
+0.0016649 0.00167364 0.00168243 0.00169126 0.00170013 0.00170905 0.00171801
+0.00172701 0.00173605 0.00174514 0.00175428 0.00176345 0.00177267 0.00178194
+0.00179125 0.0018006 0.00181 0.00181945 0.00182894 0.00183847 0.00184806
+0.00185768 0.00186736 0.00187708 0.00188684 0.00189666 0.00190652 0.00191642
+0.00192638 0.00193638 0.00194643 0.00195653 0.00196667 0.00197687 0.00198711
+0.0019974 0.00200774 0.00201814 0.00202857 0.00203906 0.0020496 0.00206019
+0.00207083 0.00208152 0.00209226 0.00210305 0.00211389 0.00212479 0.00213573
+0.00214673 0.00215778 0.00216888 0.00218003 0.00219124 0.0022025 0.00221381
+0.00222518 0.0022366 0.00224807 0.0022596 0.00227118 0.00228282 0.00229451
+0.00230625 0.00231805 0.00232991 0.00234182 0.00235379 0.00236581 0.00237789
+0.00239003 0.00240222 0.00241447 0.00242678 0.00243914 0.00245156 0.00246404
+0.00247658 0.00248918 0.00250184 0.00251455 0.00252733 0.00254016 0.00255305
+0.00256601 0.00257902 0.00259209 0.00260523 0.00261842 0.00263168 0.002645
+0.00265838 0.00267182 0.00268532 0.00269889 0.00271252 0.00272621 0.00273997
+0.00275378 0.00276767 0.00278161 0.00279563 0.0028097 0.00282384 0.00283805
+0.00285232 0.00286665 0.00288105 0.00289552 0.00291006 0.00292466 0.00293933
+0.00295406 0.00296887 0.00298374 0.00299868 0.00301368 0.00302876 0.0030439
+0.00305912 0.0030744 0.00308975 0.00310518 0.00312067 0.00313623 0.00315187
+0.00316757 0.00318335 0.0031992 0.00321512 0.00323111 0.00324718 0.00326332
+0.00327953 0.00329582 0.00331218 0.00332861 0.00334512 0.0033617 0.00337836
+0.00339509 0.0034119 0.00342878 0.00344574 0.00346278 0.00347989 0.00349708
+0.00351435 0.00353169 0.00354912 0.00356662 0.0035842 0.00360186 0.0036196
+0.00363742 0.00365531 0.00367329 0.00369135 0.00370949 0.00372771 0.00374601
+0.0037644 0.00378286 0.00380141 0.00382004 0.00383876 0.00385755 0.00387644
+0.0038954 0.00391445 0.00393358 0.0039528 0.00397211 0.0039915 0.00401098
+0.00403054 0.00405019 0.00406993 0.00408975 0.00410966 0.00412966 0.00414975
+0.00416993 0.00419019 0.00421055 0.004231 0.00425153 0.00427216 0.00429287
+0.00431368 0.00433458 0.00435558 0.00437666 0.00439784 0.00441911 0.00444047
+0.00446193 0.00448348 0.00450512 0.00452686 0.0045487 0.00457063 0.00459265
+0.00461478 0.004637 0.00465931 0.00468173 0.00470424 0.00472685 0.00474956
+0.00477236 0.00479527 0.00481828 0.00484138 0.00486459 0.00488789 0.0049113
+0.00493481 0.00495842 0.00498214 0.00500595 0.00502987 0.0050539 0.00507802
+0.00510225 0.00512659 0.00515103 0.00517558 0.00520023 0.00522499 0.00524985
+0.00527482 0.0052999 0.00532509 0.00535038 0.00537579 0.0054013 0.00542692
+0.00545265 0.0054785 0.00550445 0.00553051 0.00555669 0.00558298 0.00560937
+0.00563589 0.00566251 0.00568925 0.0057161 0.00574307 0.00577015 0.00579735
+0.00582467 0.0058521 0.00587964 0.00590731 0.00593509 0.00596298 0.005991
+0.00601914 0.00604739 0.00607577 0.00610426 0.00613287 0.00616161 0.00619047
+0.00621944 0.00624855 0.00627777 0.00630712 0.00633659 0.00636618 0.0063959
+0.00642574 0.00645571 0.00648581 0.00651603 0.00654638 0.00657685 0.00660746
+0.00663819 0.00666905 0.00670004 0.00673116 0.0067624 0.00679378 0.00682529
+0.00685693 0.00688871 0.00692061 0.00695265 0.00698482 0.00701713 0.00704957
+0.00708214 0.00711485 0.0071477 0.00718068 0.0072138 0.00724706 0.00728045
+0.00731398 0.00734765 0.00738146 0.00741541 0.0074495 0.00748373 0.0075181
+0.00755261 0.00758727 0.00762207 0.00765701 0.00769209 0.00772732 0.0077627
+0.00779821 0.00783388 0.00786969 0.00790565 0.00794175 0.007978 0.0080144
+0.00805095 0.00808765 0.0081245 0.0081615 0.00819865 0.00823595 0.0082734
+0.00831101 0.00834877 0.00838668 0.00842475 0.00846297 0.00850134 0.00853988
+0.00857856 0.00861741 0.00865641 0.00869557 0.00873489 0.00877437 0.008814
+0.0088538 0.00889376 0.00893388;
+#A 2000 0.00897416 0.0090146 0.00905521 0.00909598 0.00913691 0.00917801
+0.00921927 0.0092607 0.00930229 0.00934405 0.00938598 0.00942808 0.00947034
+0.00951278 0.00955538 0.00959815 0.0096411 0.00968421 0.0097275 0.00977096
+0.00981459 0.0098584 0.00990238 0.00994654 0.00999087 0.0100354 0.0100801
+0.0101249 0.01017 0.0102152 0.0102606 0.0103062 0.0103519 0.0103979
+0.010444 0.0104903 0.0105368 0.0105834 0.0106303 0.0106773 0.0107245
+0.0107719 0.0108195 0.0108673 0.0109153 0.0109634 0.0110118 0.0110603
+0.011109 0.0111579 0.0112071 0.0112563 0.0113058 0.0113555 0.0114054
+0.0114555 0.0115057 0.0115562 0.0116069 0.0116577 0.0117088 0.01176
+0.0118115 0.0118631 0.011915 0.011967 0.0120193 0.0120717 0.0121244
+0.0121773 0.0122303 0.0122836 0.0123371 0.0123908 0.0124446 0.0124987
+0.0125531 0.0126076 0.0126623 0.0127172 0.0127724 0.0128277 0.0128833
+0.0129391 0.0129951 0.0130513 0.0131077 0.0131644 0.0132212 0.0132783
+0.0133356 0.0133931 0.0134508 0.0135088 0.0135669 0.0136253 0.013684
+0.0137428 0.0138018 0.0138611 0.0139206 0.0139804 0.0140403 0.0141005
+0.0141609 0.0142216 0.0142825 0.0143436 0.0144049 0.0144665 0.0145282
+0.0145903 0.0146525 0.014715 0.0147778 0.0148407 0.0149039 0.0149674
+0.0150311 0.015095 0.0151591 0.0152235 0.0152882 0.015353 0.0154182
+0.0154835 0.0155491 0.015615 0.0156811 0.0157474 0.015814 0.0158808
+0.0159479 0.0160153 0.0160828 0.0161507 0.0162188 0.0162871 0.0163557
+0.0164245 0.0164936 0.016563 0.0166326 0.0167025 0.0167726 0.016843
+0.0169136 0.0169845 0.0170557 0.0171271 0.0171988 0.0172707 0.0173429
+0.0174154 0.0174881 0.0175612 0.0176344 0.017708 0.0177818 0.0178559
+0.0179302 0.0180048 0.0180797 0.0181549 0.0182303 0.018306 0.018382
+0.0184583 0.0185348 0.0186117 0.0186888 0.0187661 0.0188438 0.0189217
+0.0189999 0.0190784 0.0191572 0.0192363 0.0193156 0.0193953 0.0194752
+0.0195554 0.0196359 0.0197167 0.0197978 0.0198792 0.0199608 0.0200428
+0.020125 0.0202076 0.0202904 0.0203735 0.020457 0.0205407 0.0206247
+0.020709 0.0207937 0.0208786 0.0209638 0.0210493 0.0211352 0.0212213
+0.0213078 0.0213945 0.0214816 0.0215689 0.0216566 0.0217446 0.0218329
+0.0219215 0.0220104 0.0220996 0.0221892 0.022279 0.0223692 0.0224597
+0.0225505 0.0226416 0.0227331 0.0228249 0.022917 0.0230094 0.0231021
+0.0231952 0.0232885 0.0233823 0.0234763 0.0235707 0.0236654 0.0237604
+0.0238557 0.0239514 0.0240474 0.0241438 0.0242405 0.0243375 0.0244348
+0.0245325 0.0246306 0.0247289 0.0248276 0.0249267 0.0250261 0.0251258
+0.0252259 0.0253263 0.0254271 0.0255282 0.0256296 0.0257314 0.0258336
+0.0259361 0.0260389 0.0261421 0.0262457 0.0263496 0.0264539 0.0265585
+0.0266635 0.0267688 0.0268745 0.0269806 0.027087 0.0271938 0.0273009
+0.0274084 0.0275163 0.0276245 0.0277331 0.0278421 0.0279514 0.0280611
+0.0281712 0.0282816 0.0283924 0.0285036 0.0286152 0.0287271 0.0288395
+0.0289521 0.0290652 0.0291787 0.0292925 0.0294067 0.0295213 0.0296363
+0.0297516 0.0298674 0.0299835 0.0301 0.0302169 0.0303342 0.0304519
+0.03057 0.0306884 0.0308073 0.0309265 0.0310462 0.0311662 0.0312867
+0.0314075 0.0315288 0.0316504 0.0317724 0.0318949 0.0320177 0.032141
+0.0322646 0.0323887 0.0325131 0.032638 0.0327633 0.032889 0.0330151
+0.0331416 0.0332686 0.0333959 0.0335237 0.0336518 0.0337804 0.0339095
+0.0340389 0.0341687 0.034299 0.0344297 0.0345608 0.0346924 0.0348244
+0.0349568 0.0350896 0.0352229 0.0353566 0.0354907 0.0356252 0.0357602
+0.0358956 0.0360315 0.0361678 0.0363045 0.0364417 0.0365793 0.0367173
+0.0368558 0.0369948 0.0371341 0.037274 0.0374142 0.037555 0.0376961
+0.0378377 0.0379798 0.0381223 0.0382653 0.0384087 0.0385526 0.0386969
+0.0388417 0.038987 0.0391327 0.0392789 0.0394255 0.0395726 0.0397201
+0.0398682 0.0400166 0.0401656 0.040315 0.0404649 0.0406153 0.0407661
+0.0409174 0.0410692 0.0412214 0.0413742 0.0415274 0.0416811 0.0418352
+0.0419899 0.042145 0.0423006 0.0424567 0.0426133 0.0427703 0.0429279
+0.0430859 0.0432444 0.0434034 0.0435629 0.0437229 0.0438834 0.0440444
+0.0442059 0.0443679 0.0445303 0.0446933 0.0448568 0.0450208 0.0451852
+0.0453502 0.0455157 0.0456817 0.0458482 0.0460152 0.0461827 0.0463508
+0.0465193 0.0466883 0.0468579 0.047028 0.0471986 0.0473697 0.0475413
+0.0477135 0.0478862 0.0480593 0.0482331 0.0484073 0.0485821 0.0487574
+0.0489332 0.0491095 0.0492864 0.0494638 0.0496418 0.0498202 0.0499992
+0.0501788 0.0503589 0.0505395 0.0507206 0.0509023 0.0510846 0.0512674
+0.0514507 0.0516345 0.051819 0.0520039 0.0521894 0.0523755 0.0525621
+0.0527493 0.052937 0.0531253 0.0533141 0.0535035 0.0536934 0.0538839
+0.054075 0.0542666 0.0544588 0.0546515 0.0548448 0.0550387 0.0552331
+0.0554281 0.0556237 0.0558198 0.0560166 0.0562139 0.0564117 0.0566102
+0.0568092 0.0570088 0.057209 0.0574097 0.057611 0.0578129 0.0580155
+0.0582185 0.0584222 0.0586265 0.0588313 0.0590367 0.0592428 0.0594494
+0.0596566 0.0598644 0.0600728 0.0602817 0.0604913 0.0607015 0.0609123
+0.0611237 0.0613357 0.0615483 0.0617615 0.0619753 0.0621897 0.0624047
+0.0626203 0.0628366 0.0630534 0.0632709 0.063489 0.0637076 0.0639269
+0.0641469 0.0643674 0.0645886 0.0648103 0.0650327 0.0652558 0.0654794
+0.0657037 0.0659286 0.0661541 0.0663803 0.0666071 0.0668345 0.0670626
+0.0672912 0.0675206 0.0677505 0.0679811 0.0682123 0.0684442 0.0686767
+0.0689099 0.0691437 0.0693781 0.0696132 0.069849 0.0700853 0.0703224
+0.0705601 0.0707984 0.0710374 0.071277 0.0715173 0.0717583 0.0719999
+0.0722422 0.0724851 0.0727287 0.0729729 0.0732178 0.0734634 0.0737097
+0.0739566 0.0742042 0.0744524 0.0747013 0.0749509 0.0752012 0.0754521
+0.0757037 0.075956 0.076209 0.0764626 0.0767169 0.0769719 0.0772276
+0.077484 0.077741 0.0779988 0.0782572 0.0785163 0.0787761 0.0790366
+0.0792978 0.0795596 0.0798222 0.0800855 0.0803494 0.0806141 0.0808794
+0.0811455 0.0814123 0.0816797 0.0819479 0.0822167 0.0824863 0.0827566
+0.0830275 0.0832992 0.0835716 0.0838447 0.0841186 0.0843931 0.0846683
+0.0849443 0.085221 0.0854984 0.0857765 0.0860553 0.0863349 0.0866152
+0.0868962 0.0871779 0.0874604 0.0877435 0.0880275 0.0883121 0.0885975
+0.0888836 0.0891704 0.089458 0.0897463 0.0900353 0.0903251 0.0906156
+0.0909069 0.0911988 0.0914916 0.091785 0.0920793 0.0923742 0.0926699
+0.0929664 0.0932636 0.0935616 0.0938603 0.0941597 0.0944599 0.0947609
+0.0950626 0.0953651 0.0956683 0.0959723 0.0962771 0.0965826 0.0968889
+0.0971959 0.0975037 0.0978123 0.0981216 0.0984317 0.0987426 0.0990542
+0.0993666 0.0996798 0.0999937 0.100308 0.100624 0.10094 0.101257 0.101575
+0.101894 0.102213 0.102533 0.102854 0.103176 0.103498 0.103822 0.104146
+0.104471 0.104796 0.105123 0.10545 0.105778 0.106107 0.106437 0.106767
+0.107098 0.10743 0.107763 0.108097 0.108431 0.108766 0.109102 0.109439
+0.109777 0.110115 0.110454 0.110794 0.111135 0.111477 0.111819 0.112163
+0.112507 0.112852 0.113197 0.113544 0.113891 0.114239 0.114588 0.114938
+0.115289 0.11564 0.115993 0.116346 0.1167 0.117054 0.11741 0.117766
+0.118123 0.118482 0.11884 0.1192 0.119561 0.119922 0.120284 0.120647
+0.121011 0.121376 0.121741 0.122108 0.122475 0.122843 0.123212 0.123582
+0.123953 0.124324 0.124696 0.125069 0.125443 0.125818 0.126194 0.12657
+0.126948 0.127326 0.127705 0.128085 0.128466 0.128848 0.12923 0.129614
+0.129998 0.130383 0.130769 0.131156 0.131543 0.131932 0.132321 0.132712
+0.133103 0.133495 0.133888 0.134281 0.134676 0.135071 0.135468 0.135865
+0.136263 0.136662 0.137062 0.137462 0.137864 0.138267 0.13867 0.139074
+0.139479 0.139885 0.140292 0.1407 0.141108 0.141518 0.141928 0.14234
+0.142752 0.143165 0.143579 0.143994 0.144409 0.144826 0.145243 0.145662
+0.146081 0.146501 0.146922 0.147344 0.147767 0.148191 0.148615 0.149041
+0.149467 0.149895 0.150323 0.150752 0.151182 0.151613 0.152045 0.152478
+0.152911 0.153346 0.153781 0.154218 0.154655 0.155093 0.155532 0.155972
+0.156413 0.156855 0.157297 0.157741 0.158186 0.158631 0.159077 0.159525
+0.159973 0.160422 0.160872 0.161323 0.161775 0.162228 0.162681 0.163136
+0.163591 0.164048 0.164505 0.164963 0.165423 0.165883 0.166344 0.166806
+0.167269 0.167733 0.168197 0.168663 0.16913 0.169597 0.170066 0.170535
+0.171005 0.171477 0.171949 0.172422 0.172896 0.173371 0.173847 0.174324
+0.174801 0.17528 0.17576 0.17624 0.176722 0.177204 0.177688 0.178172
+0.178657 0.179143 0.17963 0.180118 0.180607 0.181097 0.181588 0.18208
+0.182573 0.183067 0.183561 0.184057 0.184553 0.185051 0.185549 0.186048
+0.186549 0.18705 0.187552 0.188055 0.188559 0.189064 0.18957 0.190077
+0.190585 0.191094 0.191604 0.192114 0.192626 0.193139 0.193652 0.194167
+0.194682 0.195198 0.195716 0.196234 0.196753 0.197273 0.197795 0.198317
+0.19884 0.199364 0.199889 0.200415 0.200941 0.201469 0.201998 0.202528
+0.203058 0.20359 0.204122 0.204656 0.20519 0.205726 0.206262 0.2068
+0.207338 0.207877 0.208417 0.208959 0.209501 0.210044 0.210588 0.211133
+0.211679 0.212226 0.212773 0.213322 0.213872 0.214423 0.214974 0.215527
+0.216081 0.216635 0.217191 0.217747 0.218305 0.218863 0.219422 0.219983
+0.220544 0.221106 0.221669 0.222233 0.222798 0.223364 0.223931 0.224499
+0.225068 0.225638 0.226209 0.226781 0.227354 0.227927 0.228502 0.229078
+0.229654 0.230232 0.23081 0.23139 0.23197 0.232551 0.233134 0.233717
+0.234301 0.234886 0.235472 0.23606 0.236648 0.237237 0.237827 0.238417
+0.239009 0.239602 0.240196 0.240791 0.241386 0.241983 0.242581 0.243179
+0.243779 0.244379 0.244981 0.245583 0.246186 0.246791 0.247396 0.248002
+0.248609 0.249217 0.249826 0.250436 0.251047 0.251659 0.252272 0.252886
+0.2535 0.254116 0.254733 0.25535 0.255969 0.256588 0.257209 0.25783
+0.258452 0.259076 0.2597 0.260325 0.260951 0.261578 0.262206 0.262835
+0.263465 0.264096 0.264728 0.26536 0.265994 0.266629 0.267264 0.2679
+0.268538 0.269176 0.269816 0.270456 0.271097 0.271739 0.272382 0.273026
+0.273671 0.274317 0.274963;
+#A 3000 0.275611 0.27626 0.276909 0.27756 0.278211 0.278864 0.279517
+0.280171 0.280826 0.281482 0.282139 0.282797 0.283456 0.284116 0.284777
+0.285438 0.286101 0.286764 0.287429 0.288094 0.28876 0.289428 0.290096
+0.290765 0.291435 0.292105 0.292777 0.29345 0.294123 0.294798 0.295473
+0.29615 0.296827 0.297505 0.298184 0.298864 0.299545 0.300227 0.300909
+0.301593 0.302277 0.302963 0.303649 0.304336 0.305024 0.305713 0.306403
+0.307094 0.307786 0.308478 0.309172 0.309866 0.310561 0.311258 0.311955
+0.312653 0.313351 0.314051 0.314752 0.315453 0.316156 0.316859 0.317563
+0.318268 0.318974 0.319681 0.320388 0.321097 0.321806 0.322517 0.323228
+0.32394 0.324653 0.325366 0.326081 0.326797 0.327513 0.32823 0.328948
+0.329667 0.330387 0.331108 0.33183 0.332552 0.333275 0.333999 0.334724
+0.33545 0.336177 0.336904 0.337633 0.338362 0.339092 0.339823 0.340555
+0.341288 0.342021 0.342755 0.343491 0.344227 0.344963 0.345701 0.34644
+0.347179 0.347919 0.34866 0.349402 0.350145 0.350888 0.351632 0.352377
+0.353123 0.35387 0.354618 0.355366 0.356115 0.356865 0.357616 0.358368
+0.35912 0.359874 0.360628 0.361383 0.362138 0.362895 0.363652 0.36441
+0.365169 0.365929 0.366689 0.36745 0.368212 0.368975 0.369739 0.370503
+0.371268 0.372034 0.372801 0.373569 0.374337 0.375106 0.375876 0.376647
+0.377418 0.37819 0.378963 0.379737 0.380511 0.381287 0.382063 0.382839
+0.383617 0.384395 0.385174 0.385954 0.386734 0.387516 0.388298 0.38908
+0.389864 0.390648 0.391433 0.392219 0.393005 0.393792 0.39458 0.395369
+0.396158 0.396948 0.397739 0.39853 0.399323 0.400116 0.400909 0.401704
+0.402499 0.403295 0.404091 0.404888 0.405686 0.406485 0.407284 0.408084
+0.408885 0.409686 0.410488 0.411291 0.412094 0.412899 0.413703 0.414509
+0.415315 0.416122 0.416929 0.417738 0.418546 0.419356 0.420166 0.420977
+0.421789 0.422601 0.423414 0.424227 0.425041 0.425856 0.426671 0.427487
+0.428304 0.429121 0.429939 0.430758 0.431577 0.432397 0.433218 0.434039
+0.434861 0.435683 0.436506 0.43733 0.438154 0.438979 0.439804 0.44063
+0.441457 0.442284 0.443112 0.44394 0.444769 0.445599 0.446429 0.44726
+0.448092 0.448923 0.449756 0.450589 0.451423 0.452257 0.453092 0.453928
+0.454764 0.4556 0.456437 0.457275 0.458113 0.458952 0.459791 0.460631
+0.461471 0.462312 0.463154 0.463996 0.464839 0.465682 0.466525 0.467369
+0.468214 0.469059 0.469905 0.470751 0.471598 0.472445 0.473293 0.474141
+0.47499 0.475839 0.476689 0.477539 0.47839 0.479241 0.480093 0.480945
+0.481798 0.482651 0.483504 0.484359 0.485213 0.486068 0.486924 0.48778
+0.488636 0.489493 0.49035 0.491208 0.492066 0.492925 0.493784 0.494643
+0.495503 0.496364 0.497224 0.498086 0.498947 0.499809 0.500672 0.501535
+0.502398 0.503262 0.504126 0.50499 0.505855 0.50672 0.507586 0.508452
+0.509319 0.510186 0.511053 0.51192 0.512788 0.513657 0.514525 0.515394
+0.516264 0.517134 0.518004 0.518874 0.519745 0.520616 0.521488 0.52236
+0.523232 0.524104 0.524977 0.52585 0.526724 0.527598 0.528472 0.529346
+0.530221 0.531096 0.531972 0.532847 0.533723 0.534599 0.535476 0.536353
+0.53723 0.538107 0.538985 0.539863 0.540741 0.54162 0.542498 0.543377
+0.544257 0.545136 0.546016 0.546896 0.547776 0.548657 0.549537 0.550418
+0.5513 0.552181 0.553063 0.553945 0.554827 0.555709 0.556591 0.557474
+0.558357 0.55924 0.560123 0.561007 0.561891 0.562774 0.563658 0.564543
+0.565427 0.566312 0.567196 0.568081 0.568966 0.569852 0.570737 0.571622
+0.572508 0.573394 0.57428 0.575166 0.576052 0.576938 0.577825 0.578711
+0.579598 0.580485 0.581372 0.582259 0.583146 0.584033 0.58492 0.585808
+0.586695 0.587583 0.588471 0.589358 0.590246 0.591134 0.592022 0.59291
+0.593798 0.594686 0.595574 0.596462 0.597351 0.598239 0.599127 0.600016
+0.600904 0.601792 0.602681 0.603569 0.604458 0.605346 0.606235 0.607123
+0.608012 0.6089 0.609789 0.610677 0.611565 0.612454 0.613342 0.614231
+0.615119 0.616007 0.616895 0.617784 0.618672 0.61956 0.620448 0.621336
+0.622224 0.623112 0.623999 0.624887 0.625775 0.626662 0.62755 0.628437
+0.629324 0.630211 0.631098 0.631985 0.632872 0.633759 0.634645 0.635532
+0.636418 0.637304 0.638191 0.639076 0.639962 0.640848 0.641733 0.642619
+0.643504 0.644389 0.645274 0.646158 0.647043 0.647927 0.648811 0.649695
+0.650579 0.651463 0.652346 0.653229 0.654112 0.654995 0.655877 0.65676
+0.657642 0.658524 0.659405 0.660287 0.661168 0.662049 0.662929 0.66381
+0.66469 0.66557 0.666449 0.667329 0.668208 0.669087 0.669965 0.670843
+0.671721 0.672599 0.673476 0.674353 0.67523 0.676106 0.676982 0.677858
+0.678734 0.679609 0.680484 0.681358 0.682232 0.683106 0.683979 0.684853
+0.685725 0.686598 0.68747 0.688341 0.689213 0.690083 0.690954 0.691824
+0.692694 0.693563 0.694432 0.6953 0.696169 0.697036 0.697904 0.69877
+0.699637 0.700503 0.701368 0.702234 0.703098 0.703963 0.704826 0.70569
+0.706553 0.707415 0.708277 0.709138 0.71 0.71086 0.71172 0.71258 0.713439
+0.714297 0.715155 0.716013 0.71687 0.717726 0.718583 0.719438 0.720293
+0.721147 0.722001 0.722855 0.723707 0.72456 0.725411 0.726263 0.727113
+0.727963 0.728813 0.729662 0.73051 0.731358 0.732205 0.733051 0.733897
+0.734743 0.735587 0.736432 0.737275 0.738118 0.73896 0.739802 0.740643
+0.741483 0.742323 0.743162 0.744001 0.744838 0.745676 0.746512 0.747348
+0.748183 0.749018 0.749851 0.750684 0.751517 0.752349 0.75318 0.75401
+0.75484 0.755669 0.756497 0.757324 0.758151 0.758977 0.759803 0.760627
+0.761451 0.762274 0.763097 0.763918 0.764739 0.765559 0.766378 0.767197
+0.768015 0.768832 0.769648 0.770463 0.771278 0.772092 0.772905 0.773717
+0.774529 0.775339 0.776149 0.776958 0.777766 0.778574 0.77938 0.780186
+0.780991 0.781795 0.782598 0.7834 0.784201 0.785002 0.785802 0.7866
+0.787398 0.788195 0.788991 0.789787 0.790581 0.791375 0.792167 0.792959
+0.793749 0.794539 0.795328 0.796116 0.796903 0.797689 0.798475 0.799259
+0.800042 0.800824 0.801606 0.802386 0.803166 0.803944 0.804722 0.805498
+0.806274 0.807048 0.807822 0.808595 0.809366 0.810137 0.810906 0.811675
+0.812442 0.813209 0.813975 0.814739 0.815503 0.816265 0.817026 0.817787
+0.818546 0.819304 0.820061 0.820818 0.821573 0.822327 0.823079 0.823831
+0.824582 0.825332 0.82608 0.826828 0.827574 0.828319 0.829064 0.829807
+0.830549 0.831289 0.832029 0.832768 0.833505 0.834241 0.834977 0.835711
+0.836443 0.837175 0.837906 0.838635 0.839363 0.84009 0.840816 0.841541
+0.842264 0.842987 0.843708 0.844428 0.845147 0.845864 0.84658 0.847296
+0.848009 0.848722 0.849434 0.850144 0.850853 0.851561 0.852267 0.852972
+0.853676 0.854379 0.855081 0.855781 0.85648 0.857178 0.857874 0.858569
+0.859263 0.859956 0.860647 0.861337 0.862026 0.862713 0.8634 0.864084
+0.864768 0.86545 0.866131 0.866811 0.867489 0.868166 0.868841 0.869515
+0.870188 0.87086 0.87153 0.872199 0.872866 0.873532 0.874197 0.87486
+0.875522 0.876183 0.876842 0.8775 0.878157 0.878812 0.879465 0.880117
+0.880768 0.881418 0.882066 0.882712 0.883358 0.884001 0.884644 0.885284
+0.885924 0.886562 0.887199 0.887834 0.888467 0.889099 0.88973 0.89036
+0.890987 0.891614 0.892239 0.892862 0.893484 0.894104 0.894723 0.895341
+0.895957 0.896571 0.897184 0.897796 0.898405 0.899014 0.899621 0.900226
+0.90083 0.901432 0.902033 0.902632 0.90323 0.903826 0.904421 0.905014
+0.905605 0.906195 0.906784 0.907371 0.907956 0.90854 0.909122 0.909702
+0.910281 0.910859 0.911434 0.912009 0.912581 0.913152 0.913722 0.914289
+0.914855 0.91542 0.915983 0.916544 0.917104 0.917662 0.918218 0.918773
+0.919326 0.919878 0.920428 0.920976 0.921523 0.922068 0.922611 0.923152
+0.923692 0.924231 0.924767 0.925302 0.925835 0.926367 0.926897 0.927425
+0.927952 0.928476 0.929 0.929521 0.930041 0.930559 0.931075 0.93159
+0.932103 0.932614 0.933123 0.933631 0.934137 0.934641 0.935144 0.935644
+0.936143 0.936641 0.937136 0.93763 0.938122 0.938612 0.939101 0.939588
+0.940073 0.940556 0.941037 0.941517 0.941995 0.942471 0.942946 0.943418
+0.943889 0.944358 0.944825 0.94529 0.945754 0.946216 0.946676 0.947134
+0.94759 0.948045 0.948498 0.948949 0.949398 0.949845 0.95029 0.950734
+0.951176 0.951616 0.952054 0.95249 0.952924 0.953357 0.953788 0.954217
+0.954644 0.955069 0.955492 0.955913 0.956333 0.956751 0.957166 0.95758
+0.957992 0.958403 0.958811 0.959217 0.959622 0.960025 0.960425 0.960824
+0.961221 0.961616 0.962009 0.962401 0.96279 0.963177 0.963563 0.963947
+0.964328 0.964708 0.965086 0.965462 0.965836 0.966208 0.966578 0.966946
+0.967313 0.967677 0.968039 0.9684 0.968758 0.969115 0.969469 0.969822
+0.970173 0.970522 0.970868 0.971213 0.971556 0.971897 0.972236 0.972573
+0.972908 0.973241 0.973572 0.973901 0.974228 0.974553 0.974876 0.975198
+0.975517 0.975834 0.976149 0.976462 0.976774 0.977083 0.97739 0.977695
+0.977998 0.9783 0.978599 0.978896 0.979191 0.979484 0.979775 0.980064
+0.980352 0.980637 0.98092 0.981201 0.98148 0.981757 0.982032 0.982305
+0.982575 0.982844 0.983111 0.983376 0.983639 0.983899 0.984158 0.984415
+0.984669 0.984922 0.985172 0.985421 0.985667 0.985911 0.986154 0.986394
+0.986632 0.986868 0.987102 0.987334 0.987564 0.987792 0.988017 0.988241
+0.988463 0.988682 0.9889 0.989115 0.989329 0.98954 0.989749 0.989956
+;
+#A 4000 0.990161 0.990364 0.990565 0.990764 0.99096 0.991155 0.991347
+0.991538 0.991726 0.991912 0.992096 0.992278 0.992458 0.992636 0.992812
+0.992986 0.993157 0.993326 0.993494 0.993659 0.993822 0.993983 0.994142
+0.994299 0.994454 0.994606 0.994757 0.994905 0.995051 0.995195 0.995337
+0.995477 0.995615 0.995751 0.995884 0.996016 0.996145 0.996272 0.996397
+0.99652 0.996641 0.99676 0.996876 0.996991 0.997103 0.997213 0.997321
+0.997427 0.997531 0.997633 0.997732 0.99783 0.997925 0.998018 0.998109
+0.998198 0.998285 0.998369 0.998452 0.998532 0.99861 0.998687 0.998761
+0.998832 0.998902 0.998969 0.999035 0.999098 0.999159 0.999218 0.999275
+0.99933 0.999382 0.999433 0.999481 0.999527 0.999571 0.999613 0.999652
+0.99969 0.999725 0.999759 0.99979 0.999819 0.999846 0.99987 0.999893
+0.999913 0.999931 0.999947 0.999961 0.999973 0.999983 0.99999 0.999996
+0.999999 1 0.999999 0.999996 0.99999 0.999983 0.999973 0.999961 0.999947
+0.999931 0.999913 0.999893 0.99987 0.999846 0.999819 0.99979 0.999759
+0.999725 0.99969 0.999652 0.999613 0.999571 0.999527 0.999481 0.999433
+0.999382 0.99933 0.999275 0.999218 0.999159 0.999098 0.999035 0.998969
+0.998902 0.998832 0.998761 0.998687 0.99861 0.998532 0.998452 0.998369
+0.998285 0.998198 0.998109 0.998018 0.997925 0.99783 0.997732 0.997633
+0.997531 0.997427 0.997321 0.997213 0.997103 0.996991 0.996876 0.99676
+0.996641 0.99652 0.996397 0.996272 0.996145 0.996016 0.995884 0.995751
+0.995615 0.995477 0.995337 0.995195 0.995051 0.994905 0.994757 0.994606
+0.994454 0.994299 0.994142 0.993983 0.993822 0.993659 0.993494 0.993326
+0.993157 0.992986 0.992812 0.992636 0.992458 0.992278 0.992096 0.991912
+0.991726 0.991538 0.991347 0.991155 0.99096 0.990764 0.990565 0.990364
+0.990161 0.989956 0.989749 0.98954 0.989329 0.989115 0.9889 0.988682
+0.988463 0.988241 0.988017 0.987792 0.987564 0.987334 0.987102 0.986868
+0.986632 0.986394 0.986154 0.985911 0.985667 0.985421 0.985172 0.984922
+0.984669 0.984415 0.984158 0.983899 0.983639 0.983376 0.983111 0.982844
+0.982575 0.982305 0.982032 0.981757 0.98148 0.981201 0.98092 0.980637
+0.980352 0.980064 0.979775 0.979484 0.979191 0.978896 0.978599 0.9783
+0.977998 0.977695 0.97739 0.977083 0.976774 0.976462 0.976149 0.975834
+0.975517 0.975198 0.974876 0.974553 0.974228 0.973901 0.973572 0.973241
+0.972908 0.972573 0.972236 0.971897 0.971556 0.971213 0.970868 0.970522
+0.970173 0.969822 0.969469 0.969115 0.968758 0.9684 0.968039 0.967677
+0.967313 0.966946 0.966578 0.966208 0.965836 0.965462 0.965086 0.964708
+0.964328 0.963947 0.963563 0.963177 0.96279 0.962401 0.962009 0.961616
+0.961221 0.960824 0.960425 0.960025 0.959622 0.959217 0.958811 0.958403
+0.957992 0.95758 0.957166 0.956751 0.956333 0.955913 0.955492 0.955069
+0.954644 0.954217 0.953788 0.953357 0.952924 0.95249 0.952054 0.951616
+0.951176 0.950734 0.95029 0.949845 0.949398 0.948949 0.948498 0.948045
+0.94759 0.947134 0.946676 0.946216 0.945754 0.94529 0.944825 0.944358
+0.943889 0.943418 0.942946 0.942471 0.941995 0.941517 0.941037 0.940556
+0.940073 0.939588 0.939101 0.938612 0.938122 0.93763 0.937136 0.936641
+0.936143 0.935644 0.935144 0.934641 0.934137 0.933631 0.933123 0.932614
+0.932103 0.93159 0.931075 0.930559 0.930041 0.929521 0.929 0.928476
+0.927952 0.927425 0.926897 0.926367 0.925835 0.925302 0.924767 0.924231
+0.923692 0.923152 0.922611 0.922068 0.921523 0.920976 0.920428 0.919878
+0.919326 0.918773 0.918218 0.917662 0.917104 0.916544 0.915983 0.91542
+0.914855 0.914289 0.913722 0.913152 0.912581 0.912009 0.911434 0.910859
+0.910281 0.909702 0.909122 0.90854 0.907956 0.907371 0.906784 0.906195
+0.905605 0.905014 0.904421 0.903826 0.90323 0.902632 0.902033 0.901432
+0.90083 0.900226 0.899621 0.899014 0.898405 0.897796 0.897184 0.896571
+0.895957 0.895341 0.894723 0.894104 0.893484 0.892862 0.892239 0.891614
+0.890987 0.89036 0.88973 0.889099 0.888467 0.887834 0.887199 0.886562
+0.885924 0.885284 0.884644 0.884001 0.883358 0.882712 0.882066 0.881418
+0.880768 0.880117 0.879465 0.878812 0.878157 0.8775 0.876842 0.876183
+0.875522 0.87486 0.874197 0.873532 0.872866 0.872199 0.87153 0.87086
+0.870188 0.869515 0.868841 0.868166 0.867489 0.866811 0.866131 0.86545
+0.864768 0.864084 0.8634 0.862713 0.862026 0.861337 0.860647 0.859956
+0.859263 0.858569 0.857874 0.857178 0.85648 0.855781 0.855081 0.854379
+0.853676 0.852972 0.852267 0.851561 0.850853 0.850144 0.849434 0.848722
+0.848009 0.847296 0.84658 0.845864 0.845147 0.844428 0.843708 0.842987
+0.842264 0.841541 0.840816 0.84009 0.839363 0.838635 0.837906 0.837175
+0.836443 0.835711 0.834977 0.834241 0.833505 0.832768 0.832029 0.831289
+0.830549 0.829807 0.829064 0.828319 0.827574 0.826828 0.82608 0.825332
+0.824582 0.823831 0.823079 0.822327 0.821573 0.820818 0.820061 0.819304
+0.818546 0.817787 0.817026 0.816265 0.815503 0.814739 0.813975 0.813209
+0.812442 0.811675 0.810906 0.810137 0.809366 0.808595 0.807822 0.807048
+0.806274 0.805498 0.804722 0.803944 0.803166 0.802386 0.801606 0.800824
+0.800042 0.799259 0.798475 0.797689 0.796903 0.796116 0.795328 0.794539
+0.793749 0.792959 0.792167 0.791375 0.790581 0.789787 0.788991 0.788195
+0.787398 0.7866 0.785802 0.785002 0.784201 0.7834 0.782598 0.781795
+0.780991 0.780186 0.77938 0.778574 0.777766 0.776958 0.776149 0.775339
+0.774529 0.773717 0.772905 0.772092 0.771278 0.770463 0.769648 0.768832
+0.768015 0.767197 0.766378 0.765559 0.764739 0.763918 0.763097 0.762274
+0.761451 0.760627 0.759803 0.758977 0.758151 0.757324 0.756497 0.755669
+0.75484 0.75401 0.75318 0.752349 0.751517 0.750684 0.749851 0.749018
+0.748183 0.747348 0.746512 0.745676 0.744838 0.744001 0.743162 0.742323
+0.741483 0.740643 0.739802 0.73896 0.738118 0.737275 0.736432 0.735587
+0.734743 0.733897 0.733051 0.732205 0.731358 0.73051 0.729662 0.728813
+0.727963 0.727113 0.726263 0.725411 0.72456 0.723707 0.722855 0.722001
+0.721147 0.720293 0.719438 0.718583 0.717726 0.71687 0.716013 0.715155
+0.714297 0.713439 0.71258 0.71172 0.71086 0.71 0.709138 0.708277 0.707415
+0.706553 0.70569 0.704826 0.703963 0.703098 0.702234 0.701368 0.700503
+0.699637 0.69877 0.697904 0.697036 0.696169 0.6953 0.694432 0.693563
+0.692694 0.691824 0.690954 0.690083 0.689213 0.688341 0.68747 0.686598
+0.685725 0.684853 0.683979 0.683106 0.682232 0.681358 0.680484 0.679609
+0.678734 0.677858 0.676982 0.676106 0.67523 0.674353 0.673476 0.672599
+0.671721 0.670843 0.669965 0.669087 0.668208 0.667329 0.666449 0.66557
+0.66469 0.66381 0.662929 0.662049 0.661168 0.660287 0.659405 0.658524
+0.657642 0.65676 0.655877 0.654995 0.654112 0.653229 0.652346 0.651463
+0.650579 0.649695 0.648811 0.647927 0.647043 0.646158 0.645274 0.644389
+0.643504 0.642619 0.641733 0.640848 0.639962 0.639076 0.638191 0.637304
+0.636418 0.635532 0.634645 0.633759 0.632872 0.631985 0.631098 0.630211
+0.629324 0.628437 0.62755 0.626662 0.625775 0.624887 0.623999 0.623112
+0.622224 0.621336 0.620448 0.61956 0.618672 0.617784 0.616895 0.616007
+0.615119 0.614231 0.613342 0.612454 0.611565 0.610677 0.609789 0.6089
+0.608012 0.607123 0.606235 0.605346 0.604458 0.603569 0.602681 0.601792
+0.600904 0.600016 0.599127 0.598239 0.597351 0.596462 0.595574 0.594686
+0.593798 0.59291 0.592022 0.591134 0.590246 0.589358 0.588471 0.587583
+0.586695 0.585808 0.58492 0.584033 0.583146 0.582259 0.581372 0.580485
+0.579598 0.578711 0.577825 0.576938 0.576052 0.575166 0.57428 0.573394
+0.572508 0.571622 0.570737 0.569852 0.568966 0.568081 0.567196 0.566312
+0.565427 0.564543 0.563658 0.562774 0.561891 0.561007 0.560123 0.55924
+0.558357 0.557474 0.556591 0.555709 0.554827 0.553945 0.553063 0.552181
+0.5513 0.550418 0.549537 0.548657 0.547776 0.546896 0.546016 0.545136
+0.544257 0.543377 0.542498 0.54162 0.540741 0.539863 0.538985 0.538107
+0.53723 0.536353 0.535476 0.534599 0.533723 0.532847 0.531972 0.531096
+0.530221 0.529346 0.528472 0.527598 0.526724 0.52585 0.524977 0.524104
+0.523232 0.52236 0.521488 0.520616 0.519745 0.518874 0.518004 0.517134
+0.516264 0.515394 0.514525 0.513657 0.512788 0.51192 0.511053 0.510186
+0.509319 0.508452 0.507586 0.50672 0.505855 0.50499 0.504126 0.503262
+0.502398 0.501535 0.500672 0.499809 0.498947 0.498086 0.497224 0.496364
+0.495503 0.494643 0.493784 0.492925 0.492066 0.491208 0.49035 0.489493
+0.488636 0.48778 0.486924 0.486068 0.485213 0.484359 0.483504 0.482651
+0.481798 0.480945 0.480093 0.479241 0.47839 0.477539 0.476689 0.475839
+0.47499 0.474141 0.473293 0.472445 0.471598 0.470751 0.469905 0.469059
+0.468214 0.467369 0.466525 0.465682 0.464839 0.463996 0.463154 0.462312
+0.461471 0.460631 0.459791 0.458952 0.458113 0.457275 0.456437 0.4556
+0.454764 0.453928 0.453092 0.452257 0.451423 0.450589 0.449756 0.448923
+0.448092 0.44726 0.446429 0.445599 0.444769 0.44394 0.443112 0.442284
+0.441457 0.44063 0.439804 0.438979 0.438154 0.43733 0.436506 0.435683
+0.434861 0.434039 0.433218 0.432397 0.431577 0.430758 0.429939 0.429121
+0.428304 0.427487 0.426671 0.425856 0.425041 0.424227 0.423414 0.422601
+0.421789 0.420977 0.420166 0.419356 0.418546 0.417738 0.416929;
+#A 5000 0.416122 0.415315 0.414509 0.413703 0.412899 0.412094 0.411291
+0.410488 0.409686 0.408885 0.408084 0.407284 0.406485 0.405686 0.404888
+0.404091 0.403295 0.402499 0.401704 0.400909 0.400116 0.399323 0.39853
+0.397739 0.396948 0.396158 0.395369 0.39458 0.393792 0.393005 0.392219
+0.391433 0.390648 0.389864 0.38908 0.388298 0.387516 0.386734 0.385954
+0.385174 0.384395 0.383617 0.382839 0.382063 0.381287 0.380511 0.379737
+0.378963 0.37819 0.377418 0.376647 0.375876 0.375106 0.374337 0.373569
+0.372801 0.372034 0.371268 0.370503 0.369739 0.368975 0.368212 0.36745
+0.366689 0.365929 0.365169 0.36441 0.363652 0.362895 0.362138 0.361383
+0.360628 0.359874 0.35912 0.358368 0.357616 0.356865 0.356115 0.355366
+0.354618 0.35387 0.353123 0.352377 0.351632 0.350888 0.350145 0.349402
+0.34866 0.347919 0.347179 0.34644 0.345701 0.344963 0.344227 0.343491
+0.342755 0.342021 0.341288 0.340555 0.339823 0.339092 0.338362 0.337633
+0.336904 0.336177 0.33545 0.334724 0.333999 0.333275 0.332552 0.33183
+0.331108 0.330387 0.329667 0.328948 0.32823 0.327513 0.326797 0.326081
+0.325366 0.324653 0.32394 0.323228 0.322517 0.321806 0.321097 0.320388
+0.319681 0.318974 0.318268 0.317563 0.316859 0.316156 0.315453 0.314752
+0.314051 0.313351 0.312653 0.311955 0.311258 0.310561 0.309866 0.309172
+0.308478 0.307786 0.307094 0.306403 0.305713 0.305024 0.304336 0.303649
+0.302963 0.302277 0.301593 0.300909 0.300227 0.299545 0.298864 0.298184
+0.297505 0.296827 0.29615 0.295473 0.294798 0.294123 0.29345 0.292777
+0.292105 0.291435 0.290765 0.290096 0.289428 0.28876 0.288094 0.287429
+0.286764 0.286101 0.285438 0.284777 0.284116 0.283456 0.282797 0.282139
+0.281482 0.280826 0.280171 0.279517 0.278864 0.278211 0.27756 0.276909
+0.27626 0.275611 0.274963 0.274317 0.273671 0.273026 0.272382 0.271739
+0.271097 0.270456 0.269816 0.269176 0.268538 0.2679 0.267264 0.266629
+0.265994 0.26536 0.264728 0.264096 0.263465 0.262835 0.262206 0.261578
+0.260951 0.260325 0.2597 0.259076 0.258452 0.25783 0.257209 0.256588
+0.255969 0.25535 0.254733 0.254116 0.2535 0.252886 0.252272 0.251659
+0.251047 0.250436 0.249826 0.249217 0.248609 0.248002 0.247396 0.246791
+0.246186 0.245583 0.244981 0.244379 0.243779 0.243179 0.242581 0.241983
+0.241386 0.240791 0.240196 0.239602 0.239009 0.238417 0.237827 0.237237
+0.236648 0.23606 0.235472 0.234886 0.234301 0.233717 0.233134 0.232551
+0.23197 0.23139 0.23081 0.230232 0.229654 0.229078 0.228502 0.227927
+0.227354 0.226781 0.226209 0.225638 0.225068 0.224499 0.223931 0.223364
+0.222798 0.222233 0.221669 0.221106 0.220544 0.219983 0.219422 0.218863
+0.218305 0.217747 0.217191 0.216635 0.216081 0.215527 0.214974 0.214423
+0.213872 0.213322 0.212773 0.212226 0.211679 0.211133 0.210588 0.210044
+0.209501 0.208959 0.208417 0.207877 0.207338 0.2068 0.206262 0.205726
+0.20519 0.204656 0.204122 0.20359 0.203058 0.202528 0.201998 0.201469
+0.200941 0.200415 0.199889 0.199364 0.19884 0.198317 0.197795 0.197273
+0.196753 0.196234 0.195716 0.195198 0.194682 0.194167 0.193652 0.193139
+0.192626 0.192114 0.191604 0.191094 0.190585 0.190077 0.18957 0.189064
+0.188559 0.188055 0.187552 0.18705 0.186549 0.186048 0.185549 0.185051
+0.184553 0.184057 0.183561 0.183067 0.182573 0.18208 0.181588 0.181097
+0.180607 0.180118 0.17963 0.179143 0.178657 0.178172 0.177688 0.177204
+0.176722 0.17624 0.17576 0.17528 0.174801 0.174324 0.173847 0.173371
+0.172896 0.172422 0.171949 0.171477 0.171005 0.170535 0.170066 0.169597
+0.16913 0.168663 0.168197 0.167733 0.167269 0.166806 0.166344 0.165883
+0.165423 0.164963 0.164505 0.164048 0.163591 0.163136 0.162681 0.162228
+0.161775 0.161323 0.160872 0.160422 0.159973 0.159525 0.159077 0.158631
+0.158186 0.157741 0.157297 0.156855 0.156413 0.155972 0.155532 0.155093
+0.154655 0.154218 0.153781 0.153346 0.152911 0.152478 0.152045 0.151613
+0.151182 0.150752 0.150323 0.149895 0.149467 0.149041 0.148615 0.148191
+0.147767 0.147344 0.146922 0.146501 0.146081 0.145662 0.145243 0.144826
+0.144409 0.143994 0.143579 0.143165 0.142752 0.14234 0.141928 0.141518
+0.141108 0.1407 0.140292 0.139885 0.139479 0.139074 0.13867 0.138267
+0.137864 0.137462 0.137062 0.136662 0.136263 0.135865 0.135468 0.135071
+0.134676 0.134281 0.133888 0.133495 0.133103 0.132712 0.132321 0.131932
+0.131543 0.131156 0.130769 0.130383 0.129998 0.129614 0.12923 0.128848
+0.128466 0.128085 0.127705 0.127326 0.126948 0.12657 0.126194 0.125818
+0.125443 0.125069 0.124696 0.124324 0.123953 0.123582 0.123212 0.122843
+0.122475 0.122108 0.121741 0.121376 0.121011 0.120647 0.120284 0.119922
+0.119561 0.1192 0.11884 0.118482 0.118123 0.117766 0.11741 0.117054
+0.1167 0.116346 0.115993 0.11564 0.115289 0.114938 0.114588 0.114239
+0.113891 0.113544 0.113197 0.112852 0.112507 0.112163 0.111819 0.111477
+0.111135 0.110794 0.110454 0.110115 0.109777 0.109439 0.109102 0.108766
+0.108431 0.108097 0.107763 0.10743 0.107098 0.106767 0.106437 0.106107
+0.105778 0.10545 0.105123 0.104796 0.104471 0.104146 0.103822 0.103498
+0.103176 0.102854 0.102533 0.102213 0.101894 0.101575 0.101257 0.10094
+0.100624 0.100308 0.0999937 0.0996798 0.0993666 0.0990542 0.0987426
+0.0984317 0.0981216 0.0978123 0.0975037 0.0971959 0.0968889 0.0965826
+0.0962771 0.0959723 0.0956683 0.0953651 0.0950626 0.0947609 0.0944599
+0.0941597 0.0938603 0.0935616 0.0932636 0.0929664 0.0926699 0.0923742
+0.0920793 0.091785 0.0914916 0.0911988 0.0909069 0.0906156 0.0903251
+0.0900353 0.0897463 0.089458 0.0891704 0.0888836 0.0885975 0.0883121
+0.0880275 0.0877435 0.0874604 0.0871779 0.0868962 0.0866152 0.0863349
+0.0860553 0.0857765 0.0854984 0.085221 0.0849443 0.0846683 0.0843931
+0.0841186 0.0838447 0.0835716 0.0832992 0.0830275 0.0827566 0.0824863
+0.0822167 0.0819479 0.0816797 0.0814123 0.0811455 0.0808794 0.0806141
+0.0803494 0.0800855 0.0798222 0.0795596 0.0792978 0.0790366 0.0787761
+0.0785163 0.0782572 0.0779988 0.077741 0.077484 0.0772276 0.0769719
+0.0767169 0.0764626 0.076209 0.075956 0.0757037 0.0754521 0.0752012
+0.0749509 0.0747013 0.0744524 0.0742042 0.0739566 0.0737097 0.0734634
+0.0732178 0.0729729 0.0727287 0.0724851 0.0722422 0.0719999 0.0717583
+0.0715173 0.071277 0.0710374 0.0707984 0.0705601 0.0703224 0.0700853
+0.069849 0.0696132 0.0693781 0.0691437 0.0689099 0.0686767 0.0684442
+0.0682123 0.0679811 0.0677505 0.0675206 0.0672912 0.0670626 0.0668345
+0.0666071 0.0663803 0.0661541 0.0659286 0.0657037 0.0654794 0.0652558
+0.0650327 0.0648103 0.0645886 0.0643674 0.0641469 0.0639269 0.0637076
+0.063489 0.0632709 0.0630534 0.0628366 0.0626203 0.0624047 0.0621897
+0.0619753 0.0617615 0.0615483 0.0613357 0.0611237 0.0609123 0.0607015
+0.0604913 0.0602817 0.0600728 0.0598644 0.0596566 0.0594494 0.0592428
+0.0590367 0.0588313 0.0586265 0.0584222 0.0582185 0.0580155 0.0578129
+0.057611 0.0574097 0.057209 0.0570088 0.0568092 0.0566102 0.0564117
+0.0562139 0.0560166 0.0558198 0.0556237 0.0554281 0.0552331 0.0550387
+0.0548448 0.0546515 0.0544588 0.0542666 0.054075 0.0538839 0.0536934
+0.0535035 0.0533141 0.0531253 0.052937 0.0527493 0.0525621 0.0523755
+0.0521894 0.0520039 0.051819 0.0516345 0.0514507 0.0512674 0.0510846
+0.0509023 0.0507206 0.0505395 0.0503589 0.0501788 0.0499992 0.0498202
+0.0496418 0.0494638 0.0492864 0.0491095 0.0489332 0.0487574 0.0485821
+0.0484073 0.0482331 0.0480593 0.0478862 0.0477135 0.0475413 0.0473697
+0.0471986 0.047028 0.0468579 0.0466883 0.0465193 0.0463508 0.0461827
+0.0460152 0.0458482 0.0456817 0.0455157 0.0453502 0.0451852 0.0450208
+0.0448568 0.0446933 0.0445303 0.0443679 0.0442059 0.0440444 0.0438834
+0.0437229 0.0435629 0.0434034 0.0432444 0.0430859 0.0429279 0.0427703
+0.0426133 0.0424567 0.0423006 0.042145 0.0419899 0.0418352 0.0416811
+0.0415274 0.0413742 0.0412214 0.0410692 0.0409174 0.0407661 0.0406153
+0.0404649 0.040315 0.0401656 0.0400166 0.0398682 0.0397201 0.0395726
+0.0394255 0.0392789 0.0391327 0.038987 0.0388417 0.0386969 0.0385526
+0.0384087 0.0382653 0.0381223 0.0379798 0.0378377 0.0376961 0.037555
+0.0374142 0.037274 0.0371341 0.0369948 0.0368558 0.0367173 0.0365793
+0.0364417 0.0363045 0.0361678 0.0360315 0.0358956 0.0357602 0.0356252
+0.0354907 0.0353566 0.0352229 0.0350896 0.0349568 0.0348244 0.0346924
+0.0345608 0.0344297 0.034299 0.0341687 0.0340389 0.0339095 0.0337804
+0.0336518 0.0335237 0.0333959 0.0332686 0.0331416 0.0330151 0.032889
+0.0327633 0.032638 0.0325131 0.0323887 0.0322646 0.032141 0.0320177
+0.0318949 0.0317724 0.0316504 0.0315288 0.0314075 0.0312867 0.0311662
+0.0310462 0.0309265 0.0308073 0.0306884 0.03057 0.0304519 0.0303342
+0.0302169 0.0301 0.0299835 0.0298674 0.0297516 0.0296363 0.0295213
+0.0294067 0.0292925 0.0291787 0.0290652 0.0289521 0.0288395 0.0287271
+0.0286152 0.0285036 0.0283924 0.0282816 0.0281712 0.0280611 0.0279514
+0.0278421 0.0277331 0.0276245 0.0275163 0.0274084 0.0273009 0.0271938
+0.027087 0.0269806 0.0268745 0.0267688 0.0266635 0.0265585 0.0264539
+0.0263496 0.0262457 0.0261421 0.0260389 0.0259361 0.0258336 0.0257314
+0.0256296 0.0255282 0.0254271 0.0253263 0.0252259 0.0251258 0.0250261
+0.0249267 0.0248276 0.0247289 0.0246306 0.0245325 0.0244348 0.0243375
+0.0242405 0.0241438 0.0240474 0.0239514 0.0238557 0.0237604 0.0236654
+0.0235707 0.0234763 0.0233823 0.0232885 0.0231952 0.0231021 0.0230094
+0.022917 0.0228249 0.0227331 0.0226416 0.0225505 0.0224597 0.0223692
+0.022279 0.0221892 0.0220996 0.0220104 0.0219215 0.0218329 0.0217446
+0.0216566 0.0215689 0.0214816 0.0213945 0.0213078 0.0212213 0.0211352
+0.0210493 0.0209638 0.0208786 0.0207937 0.020709 0.0206247 0.0205407
+;
+#A 6000 0.020457 0.0203735 0.0202904 0.0202076 0.020125 0.0200428 0.0199608
+0.0198792 0.0197978 0.0197167 0.0196359 0.0195554 0.0194752 0.0193953
+0.0193156 0.0192363 0.0191572 0.0190784 0.0189999 0.0189217 0.0188438
+0.0187661 0.0186888 0.0186117 0.0185348 0.0184583 0.018382 0.018306
+0.0182303 0.0181549 0.0180797 0.0180048 0.0179302 0.0178559 0.0177818
+0.017708 0.0176344 0.0175612 0.0174881 0.0174154 0.0173429 0.0172707
+0.0171988 0.0171271 0.0170557 0.0169845 0.0169136 0.016843 0.0167726
+0.0167025 0.0166326 0.016563 0.0164936 0.0164245 0.0163557 0.0162871
+0.0162188 0.0161507 0.0160828 0.0160153 0.0159479 0.0158808 0.015814
+0.0157474 0.0156811 0.015615 0.0155491 0.0154835 0.0154182 0.015353
+0.0152882 0.0152235 0.0151591 0.015095 0.0150311 0.0149674 0.0149039
+0.0148407 0.0147778 0.014715 0.0146525 0.0145903 0.0145282 0.0144665
+0.0144049 0.0143436 0.0142825 0.0142216 0.0141609 0.0141005 0.0140403
+0.0139804 0.0139206 0.0138611 0.0138018 0.0137428 0.013684 0.0136253
+0.0135669 0.0135088 0.0134508 0.0133931 0.0133356 0.0132783 0.0132212
+0.0131644 0.0131077 0.0130513 0.0129951 0.0129391 0.0128833 0.0128277
+0.0127724 0.0127172 0.0126623 0.0126076 0.0125531 0.0124987 0.0124446
+0.0123908 0.0123371 0.0122836 0.0122303 0.0121773 0.0121244 0.0120717
+0.0120193 0.011967 0.011915 0.0118631 0.0118115 0.01176 0.0117088 0.0116577
+0.0116069 0.0115562 0.0115057 0.0114555 0.0114054 0.0113555 0.0113058
+0.0112563 0.0112071 0.0111579 0.011109 0.0110603 0.0110118 0.0109634
+0.0109153 0.0108673 0.0108195 0.0107719 0.0107245 0.0106773 0.0106303
+0.0105834 0.0105368 0.0104903 0.010444 0.0103979 0.0103519 0.0103062
+0.0102606 0.0102152 0.01017 0.0101249 0.0100801 0.0100354 0.00999087
+0.00994654 0.00990238 0.0098584 0.00981459 0.00977096 0.0097275 0.00968421
+0.0096411 0.00959815 0.00955538 0.00951278 0.00947034 0.00942808 0.00938598
+0.00934405 0.00930229 0.0092607 0.00921927 0.00917801 0.00913691 0.00909598
+0.00905521 0.0090146 0.00897416 0.00893388 0.00889376 0.0088538 0.008814
+0.00877437 0.00873489 0.00869557 0.00865641 0.00861741 0.00857856 0.00853988
+0.00850134 0.00846297 0.00842475 0.00838668 0.00834877 0.00831101 0.0082734
+0.00823595 0.00819865 0.0081615 0.0081245 0.00808765 0.00805095 0.0080144
+0.007978 0.00794175 0.00790565 0.00786969 0.00783388 0.00779821 0.0077627
+0.00772732 0.00769209 0.00765701 0.00762207 0.00758727 0.00755261 0.0075181
+0.00748373 0.0074495 0.00741541 0.00738146 0.00734765 0.00731398 0.00728045
+0.00724706 0.0072138 0.00718068 0.0071477 0.00711485 0.00708214 0.00704957
+0.00701713 0.00698482 0.00695265 0.00692061 0.00688871 0.00685693 0.00682529
+0.00679378 0.0067624 0.00673116 0.00670004 0.00666905 0.00663819 0.00660746
+0.00657685 0.00654638 0.00651603 0.00648581 0.00645571 0.00642574 0.0063959
+0.00636618 0.00633659 0.00630712 0.00627777 0.00624855 0.00621944 0.00619047
+0.00616161 0.00613287 0.00610426 0.00607577 0.00604739 0.00601914 0.005991
+0.00596298 0.00593509 0.00590731 0.00587964 0.0058521 0.00582467 0.00579735
+0.00577015 0.00574307 0.0057161 0.00568925 0.00566251 0.00563589 0.00560937
+0.00558298 0.00555669 0.00553051 0.00550445 0.0054785 0.00545265 0.00542692
+0.0054013 0.00537579 0.00535038 0.00532509 0.0052999 0.00527482 0.00524985
+0.00522499 0.00520023 0.00517558 0.00515103 0.00512659 0.00510225 0.00507802
+0.0050539 0.00502987 0.00500595 0.00498214 0.00495842 0.00493481 0.0049113
+0.00488789 0.00486459 0.00484138 0.00481828 0.00479527 0.00477236 0.00474956
+0.00472685 0.00470424 0.00468173 0.00465931 0.004637 0.00461478 0.00459265
+0.00457063 0.0045487 0.00452686 0.00450512 0.00448348 0.00446193 0.00444047
+0.00441911 0.00439784 0.00437666 0.00435558 0.00433458 0.00431368 0.00429287
+0.00427216 0.00425153 0.004231 0.00421055 0.00419019 0.00416993 0.00414975
+0.00412966 0.00410966 0.00408975 0.00406993 0.00405019 0.00403054 0.00401098
+0.0039915 0.00397211 0.0039528 0.00393358 0.00391445 0.0038954 0.00387644
+0.00385755 0.00383876 0.00382004 0.00380141 0.00378286 0.0037644 0.00374601
+0.00372771 0.00370949 0.00369135 0.00367329 0.00365531 0.00363742 0.0036196
+0.00360186 0.0035842 0.00356662 0.00354912 0.00353169 0.00351435 0.00349708
+0.00347989 0.00346278 0.00344574 0.00342878 0.0034119 0.00339509 0.00337836
+0.0033617 0.00334512 0.00332861 0.00331218 0.00329582 0.00327953 0.00326332
+0.00324718 0.00323111 0.00321512 0.0031992 0.00318335 0.00316757 0.00315187
+0.00313623 0.00312067 0.00310518 0.00308975 0.0030744 0.00305912 0.0030439
+0.00302876 0.00301368 0.00299868 0.00298374 0.00296887 0.00295406 0.00293933
+0.00292466 0.00291006 0.00289552 0.00288105 0.00286665 0.00285232 0.00283805
+0.00282384 0.0028097 0.00279563 0.00278161 0.00276767 0.00275378 0.00273997
+0.00272621 0.00271252 0.00269889 0.00268532 0.00267182 0.00265838 0.002645
+0.00263168 0.00261842 0.00260523 0.00259209 0.00257902 0.00256601 0.00255305
+0.00254016 0.00252733 0.00251455 0.00250184 0.00248918 0.00247658 0.00246404
+0.00245156 0.00243914 0.00242678 0.00241447 0.00240222 0.00239003 0.00237789
+0.00236581 0.00235379 0.00234182 0.00232991 0.00231805 0.00230625 0.00229451
+0.00228282 0.00227118 0.0022596 0.00224807 0.0022366 0.00222518 0.00221381
+0.0022025 0.00219124 0.00218003 0.00216888 0.00215778 0.00214673 0.00213573
+0.00212479 0.00211389 0.00210305 0.00209226 0.00208152 0.00207083 0.00206019
+0.0020496 0.00203906 0.00202857 0.00201814 0.00200774 0.0019974 0.00198711
+0.00197687 0.00196667 0.00195653 0.00194643 0.00193638 0.00192638 0.00191642
+0.00190652 0.00189666 0.00188684 0.00187708 0.00186736 0.00185768 0.00184806
+0.00183847 0.00182894 0.00181945 0.00181 0.0018006 0.00179125 0.00178194
+0.00177267 0.00176345 0.00175428 0.00174514 0.00173605 0.00172701 0.00171801
+0.00170905 0.00170013 0.00169126 0.00168243 0.00167364 0.0016649 0.0016562
+0.00164753 0.00163892 0.00163034 0.0016218 0.00161331 0.00160485 0.00159644
+0.00158807 0.00157974 0.00157144 0.00156319 0.00155498 0.00154681 0.00153868
+0.00153059 0.00152253 0.00151452 0.00150654 0.00149861 0.00149071 0.00148285
+0.00147503 0.00146725 0.0014595 0.00145179 0.00144412 0.00143649 0.0014289
+0.00142134 0.00141382 0.00140633 0.00139889 0.00139148 0.0013841 0.00137676
+0.00136946 0.00136219 0.00135496 0.00134777 0.00134061 0.00133348 0.00132639
+0.00131934 0.00131232 0.00130533 0.00129838 0.00129146 0.00128458 0.00127773
+0.00127091 0.00126413 0.00125738 0.00125067 0.00124399 0.00123734 0.00123072
+0.00122414 0.00121759 0.00121107 0.00120458 0.00119813 0.00119171 0.00118532
+0.00117896 0.00117263 0.00116634 0.00116008 0.00115384 0.00114764 0.00114147
+0.00113533 0.00112922 0.00112314 0.0011171 0.00111108 0.00110509 0.00109913
+0.0010932 0.0010873 0.00108143 0.00107559 0.00106978 0.001064 0.00105825
+0.00105253 0.00104683 0.00104116 0.00103553 0.00102992 0.00102433 0.00101878
+0.00101326 0.00100776 0.00100229 0.000996845 0.00099143 0.000986042
+0.000980682 0.000975348 0.000970042 0.000964762 0.000959509 0.000954282
+0.000949082 0.000943908 0.00093876 0.000933639 0.000928543 0.000923473
+0.000918429 0.000913411 0.000908418 0.00090345 0.000898508 0.00089359
+0.000888698 0.00088383 0.000878988 0.00087417 0.000869376 0.000864607
+0.000859863 0.000855142 0.000850446 0.000845773 0.000841125 0.0008365
+0.000831899 0.000827321 0.000822767 0.000818236 0.000813728 0.000809244
+0.000804782 0.000800343 0.000795927 0.000791534 0.000787163 0.000782815
+0.000778489 0.000774185 0.000769904 0.000765644 0.000761407 0.000757191
+0.000752997 0.000748825 0.000744674 0.000740544 0.000736436 0.000732349
+0.000728284 0.000724239 0.000720215 0.000716212 0.00071223 0.000708268
+0.000704327 0.000700406 0.000696506 0.000692625 0.000688765 0.000684925
+0.000681105 0.000677305 0.000673525 0.000669764 0.000666023 0.000662301
+0.000658599 0.000654915 0.000651252 0.000647607 0.000643981 0.000640374
+0.000636786 0.000633217 0.000629667 0.000626135 0.000622621 0.000619126
+0.000615649 0.00061219 0.00060875 0.000605327 0.000601923 0.000598536
+0.000595167 0.000591816 0.000588483 0.000585166 0.000581868 0.000578587
+0.000575323 0.000572076 0.000568846 0.000565633 0.000562438 0.000559259
+0.000556097 0.000552951 0.000549822 0.00054671 0.000543614 0.000540535
+0.000537472 0.000534425 0.000531394 0.000528379 0.00052538 0.000522397
+0.00051943 0.000516479 0.000513543 0.000510623 0.000507719 0.000504829
+0.000501956 0.000499097 0.000496254 0.000493426 0.000490613 0.000487815
+0.000485031 0.000482263 0.00047951 0.000476771 0.000474047 0.000471337
+0.000468642 0.000465961 0.000463295 0.000460642 0.000458004 0.000455381
+0.000452771 0.000450175 0.000447593 0.000445025 0.000442471 0.000439931
+0.000437404 0.00043489 0.000432391 0.000429904 0.000427431 0.000424972
+0.000422525 0.000420092 0.000417672 0.000415265 0.000412871 0.00041049
+0.000408122 0.000405766 0.000403424 0.000401093 0.000398776 0.000396471
+0.000394179 0.000391899 0.000389631 0.000387375 0.000385132 0.000382901
+0.000380682 0.000378475 0.000376281 0.000374098 0.000371927 0.000369767
+0.00036762 0.000365484 0.00036336 0.000361247 0.000359146 0.000357056
+0.000354978 0.000352911 0.000350856 0.000348811 0.000346778 0.000344756
+0.000342745 0.000340745 0.000338756 0.000336777 0.00033481 0.000332853
+0.000330907 0.000328972 0.000327047 0.000325133 0.00032323 0.000321337
+0.000319454 0.000317582 0.00031572 0.000313868 0.000312026 0.000310195
+0.000308373 0.000306562 0.000304761 0.000302969 0.000301188 0.000299416
+0.000297654 0.000295902 0.000294159 0.000292427 0.000290703 0.000288989
+0.000287285 0.00028559 0.000283905 0.000282229 0.000280562 0.000278905
+0.000277256 0.000275617 0.000273987 0.000272366 0.000270754 0.000269151
+0.000267556 0.000265971 0.000264395 0.000262827 0.000261268 0.000259718
+0.000258176 0.000256643 0.000255119 0.000253603 0.000252095 0.000250596
+0.000249105 0.000247623 0.000246149 0.000244683 0.000243226 0.000241776
+0.000240335 0.000238902 0.000237476 0.000236059 0.00023465 0.000233249
+0.000231855 0.00023047 0.000229092 0.000227722 0.000226359 0.000225005
+0.000223658 0.000222318 0.000220986 0.000219662 0.000218345 0.000217035
+0.000215733 0.000214438 0.000213151 0.00021187 0.000210597 0.000209332
+0.000208073 0.000206822 0.000205577 0.00020434 0.00020311 0.000201886
+0.00020067 0.00019946 0.000198258 0.000197062 0.000195873 0.00019469
+0.000193515 0.000192346 0.000191184 0.000190028 0.000188879 0.000187737
+0.000186601 0.000185471 0.000184348 0.000183231 0.000182121 0.000181017
+0.00017992 0.000178828 0.000177743 0.000176664 0.000175591 0.000174525
+0.000173464 0.00017241 0.000171361 0.000170319 0.000169283 0.000168252
+0.000167228 0.000166209 0.000165196 0.000164189 0.000163188 0.000162193
+0.000161203 0.000160219 0.00015924 0.000158268 0.000157301 0.000156339
+0.000155383 0.000154433 0.000153488 0.000152548 0.000151614 0.000150685
+0.000149762 0.000148844 0.000147931 0.000147024 0.000146122 0.000145225
+0.000144333 0.000143446 0.000142565 0.000141689 0.000140817 0.000139951
+0.00013909 0.000138234 0.000137383 0.000136536 0.000135695 0.000134859
+0.000134027 0.0001332 0.000132378 0.000131561 0.000130749 0.000129941
+0.000129139 0.00012834 0.000127547 0.000126758 0.000125974 0.000125194
+0.000124419 0.000123648 0.000122882 0.00012212 0.000121363 0.00012061
+0.000119862 0.000119118 0.000118379;
+#A 7000 0.000117643 0.000116912 0.000116186 0.000115463 0.000114745
+0.000114031 0.000113322 0.000112616 0.000111915 0.000111218 0.000110525
+0.000109835 0.00010915 0.00010847 0.000107793 0.00010712 0.000106451
+0.000105786 0.000105125 0.000104467 0.000103814 0.000103165 0.000102519
+0.000101877 0.000101239 0.000100605 9.99749e-05 9.93481e-05 9.87252e-05
+9.81059e-05 9.74903e-05 9.68784e-05 9.627e-05 9.56654e-05 9.50643e-05
+9.44667e-05 9.38727e-05 9.32823e-05 9.26954e-05 9.2112e-05 9.1532e-05
+9.09555e-05 9.03825e-05 8.98128e-05 8.92466e-05 8.86837e-05 8.81243e-05
+8.75681e-05 8.70152e-05 8.64657e-05 8.59195e-05 8.53765e-05 8.48367e-05
+8.43002e-05 8.3767e-05 8.32369e-05 8.271e-05 8.21862e-05 8.16656e-05
+8.11481e-05 8.06337e-05 8.01224e-05 7.96142e-05 7.9109e-05 7.86069e-05
+7.81078e-05 7.76117e-05 7.71186e-05 7.66284e-05 7.61412e-05 7.5657e-05
+7.51756e-05 7.46971e-05 7.42216e-05 7.37489e-05 7.32791e-05 7.2812e-05
+7.23479e-05 7.18865e-05 7.14279e-05 7.09721e-05 7.0519e-05 7.00688e-05
+6.96211e-05 6.91763e-05 6.87341e-05 6.82946e-05 6.78577e-05 6.74235e-05
+6.6992e-05 6.65631e-05 6.61367e-05 6.5713e-05 6.52918e-05 6.48733e-05
+6.44572e-05 6.40436e-05 6.36326e-05 6.32241e-05 6.28181e-05 6.24145e-05
+6.20135e-05 6.16148e-05 6.12186e-05 6.08248e-05 6.04334e-05 6.00444e-05
+5.96578e-05 5.92735e-05 5.88916e-05 5.8512e-05 5.81348e-05 5.77598e-05
+5.73872e-05 5.70168e-05 5.66487e-05 5.62828e-05 5.59192e-05 5.55579e-05
+5.51987e-05 5.48417e-05 5.4487e-05 5.41344e-05 5.3784e-05 5.34357e-05
+5.30896e-05 5.27456e-05 5.24037e-05 5.20639e-05 5.17263e-05 5.13907e-05
+5.10571e-05 5.07256e-05 5.03962e-05 5.00688e-05 4.97434e-05 4.942e-05
+4.90987e-05 4.87793e-05 4.84619e-05 4.81464e-05 4.78329e-05 4.75214e-05
+4.72117e-05 4.6904e-05 4.65982e-05 4.62943e-05 4.59922e-05 4.5692e-05
+4.53937e-05 4.50973e-05 4.48027e-05 4.45099e-05 4.42189e-05 4.39298e-05
+4.36424e-05 4.33568e-05 4.3073e-05 4.2791e-05 4.25107e-05 4.22322e-05
+4.19554e-05 4.16804e-05 4.1407e-05 4.11353e-05 4.08654e-05 4.05971e-05
+4.03305e-05 4.00656e-05 3.98023e-05 3.95407e-05 3.92807e-05 3.90223e-05
+3.87655e-05 3.85104e-05 3.82568e-05 3.80049e-05 3.77545e-05 3.75057e-05
+3.72584e-05 3.70127e-05 3.67685e-05 3.65259e-05 3.62848e-05 3.60452e-05
+3.58071e-05 3.55705e-05 3.53354e-05 3.51018e-05 3.48696e-05 3.4639e-05
+3.44097e-05 3.41819e-05 3.39555e-05 3.37306e-05 3.35071e-05 3.3285e-05
+3.30643e-05 3.2845e-05 3.2627e-05 3.24105e-05 3.21953e-05 3.19815e-05
+3.1769e-05 3.15579e-05 3.13481e-05 3.11396e-05 3.09324e-05 3.07266e-05
+3.05221e-05 3.03189e-05 3.01169e-05 2.99162e-05 2.97168e-05 2.95187e-05
+2.93219e-05 2.91262e-05 2.89319e-05 2.87387e-05 2.85468e-05 2.83561e-05
+2.81667e-05 2.79784e-05 2.77913e-05 2.76054e-05 2.74207e-05 2.72372e-05
+2.70549e-05 2.68737e-05 2.66937e-05 2.65148e-05 2.6337e-05 2.61604e-05
+2.5985e-05 2.58106e-05 2.56374e-05 2.54652e-05 2.52942e-05 2.51243e-05
+2.49554e-05 2.47877e-05 2.4621e-05 2.44554e-05 2.42908e-05 2.41273e-05
+2.39649e-05 2.38035e-05 2.36431e-05 2.34837e-05 2.33254e-05 2.31681e-05
+2.30118e-05 2.28565e-05 2.27022e-05 2.2549e-05 2.23966e-05 2.22453e-05
+2.2095e-05 2.19456e-05 2.17972e-05 2.16497e-05 2.15032e-05 2.13576e-05
+2.1213e-05 2.10693e-05 2.09266e-05 2.07847e-05 2.06438e-05 2.05038e-05
+2.03647e-05 2.02265e-05 2.00892e-05 1.99527e-05 1.98172e-05 1.96826e-05
+1.95488e-05 1.94158e-05 1.92838e-05 1.91526e-05 1.90223e-05 1.88928e-05
+1.87641e-05 1.86363e-05 1.85093e-05 1.83831e-05 1.82578e-05 1.81333e-05
+1.80095e-05 1.78866e-05 1.77645e-05 1.76432e-05 1.75227e-05 1.74029e-05
+1.7284e-05 1.71658e-05 1.70484e-05 1.69317e-05 1.68159e-05 1.67007e-05
+1.65864e-05 1.64727e-05 1.63599e-05 1.62477e-05 1.61363e-05 1.60256e-05
+1.59157e-05 1.58065e-05 1.56979e-05 1.55901e-05 1.5483e-05 1.53766e-05
+1.52709e-05 1.51659e-05 1.50616e-05 1.4958e-05 1.48551e-05 1.47528e-05
+1.46512e-05 1.45503e-05 1.445e-05 1.43504e-05 1.42514e-05 1.41532e-05
+1.40555e-05 1.39585e-05 1.38621e-05 1.37664e-05 1.36713e-05 1.35768e-05
+1.3483e-05 1.33898e-05 1.32972e-05 1.32052e-05 1.31138e-05 1.3023e-05
+1.29328e-05 1.28432e-05 1.27542e-05 1.26658e-05 1.2578e-05 1.24908e-05
+1.24041e-05 1.2318e-05 1.22325e-05 1.21476e-05 1.20632e-05 1.19794e-05
+1.18961e-05 1.18134e-05 1.17312e-05 1.16496e-05 1.15685e-05 1.1488e-05
+1.1408e-05 1.13286e-05 1.12496e-05 1.11712e-05 1.10933e-05 1.1016e-05
+1.09391e-05 1.08628e-05 1.0787e-05 1.07116e-05 1.06368e-05 1.05625e-05
+1.04887e-05 1.04154e-05 1.03425e-05 1.02702e-05 1.01983e-05 1.01269e-05
+1.0056e-05 9.98559e-06 9.91563e-06 9.84614e-06 9.77712e-06 9.70855e-06
+9.64045e-06 9.57281e-06 9.50562e-06 9.43888e-06 9.3726e-06 9.30676e-06
+9.24135e-06 9.17639e-06 9.11187e-06 9.04778e-06 8.98412e-06 8.92089e-06
+8.85809e-06 8.79571e-06 8.73375e-06 8.6722e-06 8.61108e-06 8.55037e-06
+8.49006e-06 8.43016e-06 8.37067e-06 8.31158e-06 8.25289e-06 8.19459e-06
+8.1367e-06 8.07919e-06 8.02207e-06 7.96534e-06 7.90899e-06 7.85303e-06
+7.79744e-06 7.74223e-06 7.68739e-06 7.63293e-06 7.57883e-06 7.52511e-06
+7.47174e-06 7.41875e-06 7.36611e-06 7.31382e-06 7.2619e-06 7.21033e-06
+7.1591e-06 7.10823e-06 7.0577e-06 7.00752e-06 6.95768e-06 6.90818e-06
+6.85902e-06 6.81019e-06 6.76169e-06 6.71353e-06 6.66569e-06 6.61819e-06
+6.571e-06 6.52414e-06 6.47759e-06 6.43137e-06 6.38546e-06 6.33987e-06
+6.29459e-06 6.24962e-06 6.20495e-06 6.1606e-06 6.11654e-06 6.07279e-06
+6.02934e-06 5.98619e-06 5.94333e-06 5.90077e-06 5.8585e-06 5.81652e-06
+5.77482e-06 5.73342e-06 5.6923e-06 5.65146e-06 5.6109e-06 5.57063e-06
+5.53062e-06 5.4909e-06 5.45145e-06 5.41227e-06 5.37336e-06 5.33472e-06
+5.29634e-06 5.25823e-06 5.22038e-06 5.1828e-06 5.14547e-06 5.10841e-06
+5.07159e-06 5.03503e-06 4.99873e-06 4.96268e-06 4.92687e-06 4.89131e-06
+4.856e-06 4.82094e-06 4.78612e-06 4.75153e-06 4.71719e-06 4.68309e-06
+4.64922e-06 4.61559e-06 4.58219e-06 4.54903e-06 4.51609e-06 4.48338e-06
+4.4509e-06 4.41865e-06 4.38662e-06 4.35481e-06 4.32322e-06 4.29186e-06
+4.26071e-06 4.22978e-06 4.19906e-06 4.16856e-06 4.13828e-06 4.1082e-06
+4.07833e-06 4.04867e-06 4.01922e-06 3.98997e-06 3.96093e-06 3.9321e-06
+3.90346e-06 3.87502e-06 3.84678e-06 3.81874e-06 3.7909e-06 3.76325e-06
+3.73579e-06 3.70853e-06 3.68146e-06 3.65458e-06 3.62788e-06 3.60138e-06
+3.57506e-06 3.54892e-06 3.52297e-06 3.4972e-06 3.47161e-06 3.4462e-06
+3.42097e-06 3.39592e-06 3.37104e-06 3.34634e-06 3.32181e-06 3.29746e-06
+3.27327e-06 3.24926e-06 3.22541e-06 3.20174e-06 3.17823e-06 3.15489e-06
+3.13171e-06 3.10869e-06 3.08584e-06 3.06315e-06 3.04062e-06 3.01825e-06
+2.99604e-06 2.97398e-06 2.95208e-06 2.93034e-06 2.90874e-06 2.8873e-06
+2.86602e-06 2.84488e-06 2.8239e-06 2.80306e-06 2.78237e-06 2.76183e-06
+2.74143e-06 2.72118e-06 2.70107e-06 2.68111e-06 2.66129e-06 2.6416e-06
+2.62206e-06 2.60266e-06 2.58339e-06 2.56426e-06 2.54527e-06 2.52642e-06
+2.50769e-06 2.4891e-06 2.47065e-06 2.45232e-06 2.43413e-06 2.41606e-06
+2.39813e-06 2.38032e-06 2.36264e-06 2.34508e-06 2.32766e-06 2.31035e-06
+2.29317e-06 2.27611e-06 2.25918e-06 2.24237e-06 2.22567e-06 2.2091e-06
+2.19264e-06 2.1763e-06 2.16008e-06 2.14398e-06 2.12799e-06 2.11212e-06
+2.09635e-06 2.08071e-06 2.06517e-06 2.04975e-06 2.03444e-06 2.01924e-06
+2.00414e-06 1.98916e-06 1.97428e-06 1.95951e-06 1.94485e-06 1.93029e-06
+1.91584e-06 1.90149e-06 1.88724e-06 1.8731e-06 1.85906e-06 1.84512e-06
+1.83128e-06 1.81754e-06 1.8039e-06 1.79036e-06 1.77692e-06 1.76357e-06
+1.75032e-06 1.73717e-06 1.72411e-06 1.71115e-06 1.69828e-06 1.6855e-06
+1.67282e-06 1.66022e-06 1.64772e-06 1.63531e-06 1.62299e-06 1.61076e-06
+1.59862e-06 1.58656e-06 1.57459e-06 1.56272e-06 1.55092e-06 1.53921e-06
+1.52759e-06 1.51605e-06 1.5046e-06 1.49323e-06 1.48194e-06 1.47073e-06
+1.45961e-06 1.44856e-06 1.4376e-06 1.42672e-06 1.41591e-06 1.40519e-06
+1.39454e-06 1.38397e-06 1.37348e-06 1.36306e-06 1.35272e-06 1.34246e-06
+1.33227e-06 1.32216e-06 1.31212e-06 1.30215e-06 1.29226e-06 1.28243e-06
+1.27269e-06 1.26301e-06 1.2534e-06 1.24386e-06 1.2344e-06 1.225e-06
+1.21567e-06 1.20641e-06 1.19722e-06 1.18809e-06 1.17904e-06 1.17004e-06
+1.16112e-06 1.15226e-06 1.14347e-06 1.13474e-06 1.12607e-06 1.11747e-06
+1.10893e-06 1.10046e-06 1.09204e-06 1.08369e-06 1.0754e-06 1.06717e-06
+1.05901e-06 1.0509e-06 1.04285e-06 1.03486e-06 1.02693e-06 1.01906e-06
+1.01125e-06 1.0035e-06 9.958e-07 9.8816e-07 9.80576e-07 9.73048e-07
+9.65576e-07 9.58159e-07 9.50797e-07 9.4349e-07 9.36237e-07 9.29038e-07
+9.21891e-07 9.14798e-07 9.07758e-07 9.0077e-07 8.93834e-07 8.86949e-07
+8.80116e-07 8.73333e-07 8.666e-07 8.59918e-07 8.53285e-07 8.46702e-07
+8.40168e-07 8.33682e-07 8.27245e-07 8.20856e-07 8.14513e-07 8.08219e-07
+8.01971e-07 7.95771e-07 7.89615e-07 7.83506e-07 7.77443e-07 7.71426e-07
+7.65452e-07 7.59524e-07 7.5364e-07 7.478e-07 7.42003e-07 7.3625e-07
+7.3054e-07 7.24873e-07 7.19247e-07 7.13664e-07 7.08123e-07 7.02624e-07
+6.97166e-07 6.91748e-07 6.86371e-07 6.81035e-07 6.75739e-07 6.70482e-07
+6.65265e-07 6.60087e-07 6.54948e-07 6.49847e-07 6.44785e-07 6.39761e-07
+6.34775e-07 6.29826e-07 6.24914e-07 6.2004e-07 6.15202e-07 6.104e-07
+6.05635e-07 6.00906e-07 5.96212e-07 5.91554e-07 5.86931e-07 5.82343e-07
+5.77789e-07 5.73269e-07 5.68784e-07 5.64333e-07 5.59915e-07 5.55531e-07
+5.5118e-07 5.46862e-07 5.42576e-07 5.38323e-07 5.34102e-07 5.29914e-07
+5.25756e-07 5.2163e-07 5.17536e-07 5.13473e-07 5.0944e-07 5.05438e-07
+5.01466e-07 4.97525e-07 4.93613e-07 4.89731e-07 4.85879e-07 4.82056e-07
+4.78262e-07 4.74496e-07 4.7076e-07 4.67052e-07 4.63372e-07 4.5972e-07
+4.56095e-07 4.52499e-07 4.4893e-07 4.45388e-07 4.41873e-07 4.38385e-07
+4.34923e-07 4.31488e-07 4.28079e-07 4.24696e-07 4.21339e-07 4.18007e-07
+4.14701e-07 4.11421e-07 4.08165e-07 4.04934e-07 4.01728e-07 3.98547e-07
+3.95389e-07 3.92256e-07 3.89147e-07 3.86062e-07 3.83001e-07 3.79963e-07
+3.76948e-07 3.73956e-07 3.70987e-07 3.68041e-07 3.65118e-07 3.62217e-07
+3.59338e-07 3.56482e-07 3.53647e-07 3.50835e-07 3.48043e-07 3.45274e-07
+3.42525e-07 3.39798e-07 3.37092e-07 3.34406e-07 3.31742e-07 3.29098e-07
+3.26474e-07 3.2387e-07 3.21286e-07 3.18723e-07 3.16179e-07 3.13655e-07
+3.1115e-07 3.08665e-07 3.06198e-07 3.03751e-07 3.01323e-07 2.98914e-07
+2.96523e-07 2.9415e-07 2.91797e-07 2.89461e-07 2.87143e-07 2.84843e-07
+2.82561e-07 2.80297e-07 2.7805e-07 2.75821e-07 2.73609e-07 2.71414e-07
+2.69237e-07 2.67076e-07 2.64932e-07 2.62804e-07 2.60693e-07 2.58599e-07
+2.5652e-07 2.54458e-07 2.52412e-07 2.50382e-07 2.48368e-07 2.46369e-07
+2.44386e-07 2.42418e-07 2.40466e-07 2.38529e-07 2.36606e-07 2.34699e-07
+2.32807e-07 2.3093e-07 2.29067e-07 2.27219e-07 2.25385e-07 2.23565e-07
+2.2176e-07 2.19969e-07 2.18192e-07 2.16429e-07 2.14679e-07 2.12943e-07
+2.11221e-07 2.09512e-07 2.07817e-07 2.06135e-07 2.04466e-07 2.0281e-07
+2.01167e-07 1.99537e-07 1.9792e-07 1.96315e-07 1.94723e-07 1.93144e-07
+1.91577e-07 1.90022e-07 1.8848e-07 1.86949e-07 1.85431e-07 1.83924e-07
+1.8243e-07 1.80947e-07 1.79476e-07 1.78016e-07 1.76568e-07 1.75131e-07
+1.73706e-07 1.72292e-07 1.70889e-07 1.69497e-07 1.68116e-07 1.66746e-07
+1.65387e-07 1.64038e-07 1.627e-07 1.61373e-07 1.60056e-07 1.5875e-07
+1.57454e-07 1.56168e-07 1.54892e-07 1.53627e-07 1.52371e-07 1.51125e-07
+1.4989e-07 1.48664e-07 1.47447e-07 1.46241e-07 1.45044e-07 1.43856e-07
+1.42678e-07 1.41509e-07 1.4035e-07 1.39199e-07 1.38058e-07 1.36926e-07
+1.35803e-07 1.34688e-07 1.33583e-07 1.32486e-07 1.31399e-07 1.30319e-07
+1.29249e-07 1.28187e-07 1.27133e-07 1.26088e-07 1.25051e-07 1.24022e-07
+1.23002e-07 1.21989e-07 1.20985e-07 1.19989e-07 1.19e-07 1.1802e-07
+1.17047e-07 1.16083e-07 1.15125e-07 1.14176e-07 1.13234e-07 1.123e-07
+1.11373e-07 1.10453e-07 1.09541e-07 1.08636e-07 1.07739e-07 1.06848e-07
+1.05965e-07 1.05089e-07 1.0422e-07 1.03357e-07 1.02502e-07 1.01654e-07
+1.00812e-07 9.99773e-08 9.91491e-08 9.83276e-08 9.75126e-08 9.67043e-08
+9.59023e-08 9.5107e-08 9.43179e-08 9.35352e-08 9.27589e-08 9.19887e-08
+9.12247e-08 9.04669e-08 8.97152e-08 8.89696e-08 8.823e-08 8.74963e-08
+8.67685e-08 8.60467e-08 8.53305e-08 8.46203e-08 8.39157e-08 8.32169e-08
+8.25236e-08 8.1836e-08 8.11539e-08 8.04774e-08 7.98062e-08;
+#A 8000 7.91406e-08 7.84803e-08 7.78254e-08 7.71757e-08 7.65314e-08
+7.58922e-08 7.52582e-08 7.46293e-08 7.40056e-08 7.33868e-08 7.27733e-08
+7.21645e-08 7.15607e-08 7.09619e-08 7.03679e-08 6.97786e-08 6.91943e-08
+6.86146e-08 6.80397e-08 6.74694e-08 6.69038e-08 6.63428e-08 6.57863e-08
+6.52343e-08 6.46869e-08 6.41438e-08 6.36053e-08 6.30711e-08 6.25413e-08
+6.20158e-08 6.14946e-08 6.09775e-08 6.04648e-08 5.99562e-08 5.94518e-08
+5.89515e-08 5.84552e-08 5.79631e-08 5.74749e-08 5.69907e-08 5.65105e-08
+5.60342e-08 5.55619e-08 5.50933e-08 5.46286e-08 5.41677e-08 5.37106e-08
+5.32572e-08 5.28076e-08 5.23616e-08 5.19193e-08 5.14806e-08 5.10455e-08
+5.0614e-08 5.0186e-08 4.97615e-08 4.93405e-08 4.89229e-08 4.85089e-08
+4.80982e-08 4.76908e-08 4.72869e-08 4.68862e-08 4.64888e-08 4.60948e-08
+4.57039e-08 4.53163e-08 4.49318e-08 4.45505e-08 4.41724e-08 4.37974e-08
+4.34254e-08 4.30566e-08 4.26907e-08 4.2328e-08 4.19681e-08 4.16113e-08
+4.12574e-08 4.09064e-08 4.05583e-08 4.02131e-08 3.98708e-08 3.95313e-08
+3.91946e-08 3.88606e-08 3.85295e-08 3.82011e-08 3.78753e-08 3.75523e-08
+3.7232e-08 3.69143e-08 3.65993e-08 3.62868e-08 3.5977e-08 3.56697e-08
+3.53649e-08 3.50628e-08 3.4763e-08 3.44659e-08 3.41711e-08 3.38788e-08
+3.3589e-08 3.33015e-08 3.30164e-08 3.27337e-08 3.24534e-08 3.21754e-08
+3.18997e-08 3.16263e-08 3.13552e-08 3.10863e-08 3.08196e-08 3.05552e-08
+3.0293e-08 3.0033e-08 2.97752e-08 2.95194e-08 2.92659e-08 2.90144e-08
+2.8765e-08 2.85178e-08 2.82726e-08 2.80294e-08 2.77883e-08 2.75492e-08
+2.73121e-08 2.70769e-08 2.68437e-08 2.66126e-08 2.63833e-08 2.61559e-08
+2.59305e-08 2.57069e-08 2.54852e-08 2.52654e-08 2.50473e-08 2.48312e-08
+2.46168e-08 2.44043e-08 2.41935e-08 2.39845e-08 2.37773e-08 2.35718e-08
+2.33679e-08 2.31659e-08 2.29655e-08 2.27668e-08 2.25698e-08 2.23744e-08
+2.21807e-08 2.19886e-08 2.17981e-08 2.16093e-08 2.1422e-08 2.12363e-08
+2.10522e-08 2.08696e-08 2.06886e-08 2.0509e-08 2.0331e-08 2.01545e-08
+1.99795e-08 1.9806e-08 1.96339e-08 1.94633e-08 1.92941e-08 1.91264e-08
+1.896e-08 1.87951e-08 1.86316e-08 1.84695e-08 1.83087e-08 1.81493e-08
+1.79912e-08 1.78345e-08 1.76791e-08 1.7525e-08 1.73722e-08 1.72207e-08
+1.70705e-08 1.69216e-08 1.6774e-08 1.66276e-08 1.64824e-08 1.63385e-08
+1.61957e-08 1.60543e-08 1.5914e-08 1.57749e-08 1.56369e-08 1.55002e-08
+1.53646e-08;
+#X coords 0 1 8191 -1 200 140 1;
+#X restore 62 180 graph;
+#N canvas 603 425 305 177 messages 0;
+#X obj 108 126 outlet;
+#X msg 219 110 clear;
+#N canvas 516 517 705 388 addsyn 0;
+#X obj 39 47 tgl 40 0 empty empty empty 0 -6 0 8 -188364 -1 -1 0 1
+;
+#X msg 39 93 normalize \$1;
+#X text 84 73 on by default;
+#X msg 194 88 addsyn 0.5 0.5;
+#X msg 194 45 addsyn 0 1;
+#X text 272 47 sine;
+#X text 299 88 raised sine;
+#X msg 134 190 addsyn 0 1 0 0.333 0 0.2 0 0.143 0 0.111 0 0.091 0 0.077
+0 0.067;
+#X obj 39 296 outlet;
+#X msg 133 222 addsyn 0 1 0 -0.111 0 0.04 0 -0.02 0 0.012 0 -0.008
+0 0.006 0 -0.004;
+#X msg 135 256 addsyn 0 1 0.5 0.333 0.25 0.2 0.167 0.143 0.125;
+#X text 568 197 square;
+#X text 554 226 triangle;
+#X text 532 258 sawtooth;
+#X msg 135 280 addsyn 0 1 -0.5 0.5 -0.25;
+#X text 319 280 or whatever;
+#X msg 194 66 addsyn 0.35;
+#X text 286 66 DC (turn off normalization first);
+#X connect 0 0 1 0;
+#X connect 1 0 8 0;
+#X connect 3 0 8 0;
+#X connect 4 0 8 0;
+#X connect 7 0 8 0;
+#X connect 9 0 8 0;
+#X connect 10 0 8 0;
+#X connect 14 0 8 0;
+#X connect 16 0 8 0;
+#X restore 108 16 pd addsyn;
+#N canvas 713 435 486 336 envelopes 0;
+#X obj 12 295 outlet;
+#X msg 78 121 aenv 0.5;
+#X msg 70 103 aenv 0.025;
+#X msg 20 50 adenv 0.05 0.15;
+#X msg 12 31 adenv 0.05 0.15 0.7;
+#X text 9 8 all time values relative to 1;
+#X text 159 31 optional 3rd arg: secondary gain;
+#X msg 233 126 adrenv 0.05 0.1 0.3;
+#X msg 237 145 adrenv 0.05 0.1 0.3 0.7;
+#X msg 83 141 aenv 0.95;
+#X msg 238 169 adrenv 0.15 0.05 0.55 0.5;
+#X msg 223 218 rcos;
+#X msg 223 238 gaussian;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 7 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 0 0;
+#X connect 10 0 0 0;
+#X connect 11 0 0 0;
+#X connect 12 0 0 0;
+#X restore 14 64 pd envelopes;
+#N canvas 752 285 474 324 graphic-harm 0;
+#X obj 134 270 outlet;
+#X obj 134 11 vsl 15 64 0.0001 1 0 0 empty empty empty 0 -8 0 8 -101888
+-1 -1 0 1;
+#X msg 134 127 0;
+#X obj 134 84 t b f;
+#X obj 176 11 vsl 15 64 0 1 0 0 empty empty empty 0 -8 0 8 -101888
+-1 -1 0 1;
+#X obj 176 84 t b f;
+#X obj 220 11 vsl 15 64 0 1 0 0 empty empty empty 0 -8 0 8 -101888
+-1 -1 0 1;
+#X obj 220 84 t b f;
+#X obj 264 11 vsl 15 64 0 1 0 0 empty empty empty 0 -8 0 8 -101888
+-1 -1 0 1;
+#X obj 264 84 t b f;
+#X obj 134 188 pack f f f f f;
+#X msg 134 227 addsyn \$1 \$2 \$3 \$4 \$5;
+#X connect 1 0 3 0;
+#X connect 2 0 10 0;
+#X connect 3 0 2 0;
+#X connect 3 1 10 1;
+#X connect 4 0 5 0;
+#X connect 5 0 2 0;
+#X connect 5 1 10 2;
+#X connect 6 0 7 0;
+#X connect 7 0 2 0;
+#X connect 7 1 10 3;
+#X connect 8 0 9 0;
+#X connect 9 0 2 0;
+#X connect 9 1 10 4;
+#X connect 10 0 11 0;
+#X connect 11 0 0 0;
+#X restore 160 48 pd graphic-harm;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X restore 65 101 pd messages;
+#X obj 23 9 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 24 50 function~ provides different tools for writing functions
+into an array.;
+#X text 148 97 <- click here for details;
+#X connect 2 0 0 0;
diff --git a/externals/lyonpotpourri/function~.c b/externals/lyonpotpourri/function~.c
new file mode 100755
index 0000000000000000000000000000000000000000..d875e06e7e8184322310a1f02d26a0e91809f05a
--- /dev/null
+++ b/externals/lyonpotpourri/function~.c
@@ -0,0 +1,380 @@
+#include "MSPd.h"
+
+/* comment */
+
+static t_class *function_class;
+#define OBJECT_NAME "function~"
+
+typedef struct _function
+{
+    t_object x_obj;
+    t_float x_f;
+    t_symbol *wavename; // name of waveform buffer
+    
+    int b_frames;
+    int b_nchans;
+    t_word *b_samples;
+    short normalize;
+} t_function;
+
+void function_setbuf(t_function *x, t_symbol *wavename);
+void *function_new(t_symbol *msg, int argc, t_atom *argv);
+void function_dsp(t_function *x, t_signal **sp);
+void function_redraw(t_function *x);
+void function_clear(t_function *x);
+void function_addsyn(t_function *x, t_symbol *msg, int argc, t_atom *argv);
+void function_aenv(t_function *x, t_symbol *msg, int argc, t_atom *argv);
+void function_adenv(t_function *x, t_symbol *msg, int argc, t_atom *argv);
+void function_normalize(t_function *x, t_floatarg f);
+void function_adrenv(t_function *x, t_symbol *msg, int argc, t_atom *argv);
+void function_rcos(t_function *x);
+void function_gaussian(t_function *x);
+void function_print(t_function *x);
+
+void function_tilde_setup(void)
+{
+    function_class = class_new(gensym("function~"), (t_newmethod)function_new,
+                               NO_FREE_FUNCTION,sizeof(t_function), 0,A_GIMME,0);
+    CLASS_MAINSIGNALIN(function_class, t_function, x_f);
+    class_addmethod(function_class,(t_method)function_dsp,gensym("dsp"),0);
+    class_addmethod(function_class,(t_method)function_addsyn,gensym("addsyn"),A_GIMME,0);
+    class_addmethod(function_class,(t_method)function_aenv,gensym("aenv"),A_GIMME,0);
+    class_addmethod(function_class,(t_method)function_adenv,gensym("adenv"),A_GIMME,0);
+    class_addmethod(function_class,(t_method)function_adrenv,gensym("adrenv"),A_GIMME,0);
+    class_addmethod(function_class,(t_method)function_clear,gensym("clear"),0);
+    class_addmethod(function_class,(t_method)function_normalize,gensym("normalize"),A_FLOAT,0);
+    class_addmethod(function_class,(t_method)function_rcos,gensym("rcos"),0);
+    class_addmethod(function_class,(t_method)function_gaussian,gensym("gaussian"),0);
+    class_addmethod(function_class,(t_method)function_print,gensym("print"),0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+void function_rcos(t_function *x)
+{
+    int i;
+    long b_frames;
+    t_word *b_samples;
+    function_setbuf(x, x->wavename);
+    b_samples = x->b_samples;
+    b_frames = x->b_frames;
+    if(b_frames == 0){
+        return;
+    }
+    for(i=0;i<b_frames;i++){
+        x->b_samples[i].w_float = (t_float) (0.5 - 0.5 * cos(TWOPI * (t_float)i/(t_float)b_frames));
+    }
+    function_redraw(x);
+    /* for(i=0;i<b_frames;i++){
+        post("%f", x->b_samples[i].w_float);
+    } */
+}
+
+/*
+void function_rcos(t_function *x)
+{
+    int i;
+    long b_frames;
+    t_word *b_samples;
+    t_symbol *wavename = x->wavename;
+    int frames;
+    t_garray *a;
+    
+    x->b_frames = 0;
+    x->b_nchans = 1;
+    // open array
+    if (!(a = (t_garray *)pd_findbyclass(wavename, garray_class))) {
+        if (*wavename->s_name) pd_error(x, "function~: %s: no such array", wavename->s_name);
+    }
+    else if (!garray_getfloatwords(a, &frames, &x->b_samples)) {
+        pd_error(x, "%s: bad template for function~", wavename->s_name);
+    }
+    else  {
+        x->b_frames = frames;
+        garray_usedindsp(a);
+    }
+    b_frames = x->b_frames;
+    post("rcos generating %d frames", b_frames); // correct
+    // put samples into array
+    for(i=0;i<b_frames;i++){
+        x->b_samples[i].w_float = (t_float) (0.5 - 0.5 * cos(TWOPI * (t_float)i/(t_float)b_frames));
+    }
+    if (!(a = (t_garray *)pd_findbyclass(x->wavename, garray_class))) {
+        if (*x->wavename->s_name) pd_error(x, "function~: %s: no such array", x->wavename->s_name);
+    }
+    else  {
+        garray_redraw(a);
+    }
+    // printed samples are correct
+    for(i=0;i<b_frames;i++){
+        post("%f", x->b_samples[i].w_float);
+    }
+}
+*/
+void function_print(t_function *x)
+{
+    int frames;
+    t_garray *a;
+    int i;
+    x->b_frames = 0;
+    x->b_nchans = 1;
+    if (!(a = (t_garray *)pd_findbyclass(x->wavename, garray_class))) {
+        if (*x->wavename->s_name) pd_error(x, "function~: %s: no such array", x->wavename->s_name);
+    }
+    else if (!garray_getfloatwords(a, &frames, &x->b_samples)) {
+        pd_error(x, "%s: bad template for function~", x->wavename->s_name);
+    }
+    else  {
+        x->b_frames = frames;
+        garray_usedindsp(a);
+        for(i = 0; i < frames; i++){
+            post("%d: %f",i, x->b_samples[i].w_float);
+        }
+    }
+}
+
+
+void function_gaussian(t_function *x)
+{
+    int i;
+    long b_frames;
+    t_word *b_samples;
+    t_float arg, xarg,in;
+    
+    if(!b_frames){
+        post("* zero length function!");
+        return;
+    }
+    function_setbuf(x, x->wavename);
+    b_frames = x->b_frames;
+    b_samples = x->b_samples;
+    arg = 12.0 / (t_float)b_frames;
+    xarg = 1.0;
+    in = -6.0;
+    
+    for(i=0;i<b_frames;i++){
+        b_samples[i].w_float = xarg * pow(2.71828, -(in*in)/2.0);
+        in += arg;
+    }
+    function_redraw(x);
+}
+
+void function_normalize(t_function *x, t_floatarg f)
+{
+    x->normalize = (short)f;
+}
+
+void function_clear(t_function *x)
+{
+    int i;
+    long b_frames = x->b_frames;
+    t_word *b_samples = x->b_samples;
+    
+    function_setbuf(x, x->wavename);
+    b_frames = x->b_frames;
+    b_samples = x->b_samples;
+    for(i=0;i<b_frames;i++)
+        b_samples[i].w_float = 0.0;
+    function_redraw(x);
+}
+
+void function_adrenv(t_function *x, t_symbol *msg, int argc, t_atom *argv)
+{
+    int i,j;
+    int al, dl, sl, rl;
+    long b_frames = x->b_frames;
+    t_word *b_samples = x->b_samples;
+    t_float downgain = 0.33;
+    
+    function_setbuf(x, x->wavename);
+    al = (t_float) b_frames * atom_getfloatarg(0,argc,argv);
+    dl = (t_float) b_frames * atom_getfloatarg(1,argc,argv);
+    rl = (t_float) b_frames * atom_getfloatarg(2,argc,argv);
+    downgain = atom_getfloatarg(3,argc,argv);
+    if(downgain <= 0)
+        downgain = 0.333;
+    if(al+dl+rl >= b_frames){
+        post("atk and dk and release are too long");
+        return;
+    }
+    sl = b_frames - (al+dl+rl);
+    
+    for(i=0;i<al;i++){
+        b_samples[i].w_float = (t_float)i/(t_float)al;
+    }
+    for(i=al, j=dl;i<al+dl;i++,j--){
+        b_samples[i].w_float = downgain + (1.-downgain)*(t_float)j/(t_float)dl;
+    }
+    for(i=al+dl;i<al+dl+sl;i++){
+        b_samples[i].w_float = downgain;
+    }
+    for(i=al+dl+sl,j=rl;i<b_frames;i++,j--){
+        b_samples[i].w_float = downgain * (t_float)j/(t_float)rl;
+    }
+    function_redraw(x);
+}
+
+void function_adenv(t_function *x, t_symbol *msg, int argc, t_atom *argv)
+{
+    int i,j;
+    int al, dl, rl;
+    long b_frames = x->b_frames;
+    t_word *b_samples = x->b_samples;
+    t_float downgain = 0.33;
+    
+    function_setbuf(x, x->wavename);
+    al = (t_float) b_frames * atom_getfloatarg(0,argc,argv);
+    dl = (t_float) b_frames * atom_getfloatarg(1,argc,argv);
+    downgain = atom_getfloatarg(2,argc,argv);
+    if(downgain <= 0)
+        downgain = 0.333;
+    if(al+dl >= b_frames){
+        post("atk and dk are too long");
+        return;
+    }
+    rl = b_frames - (al+dl);
+    
+    for(i=0;i<al;i++){
+        b_samples[i].w_float = (t_float)i/(t_float)al;
+    }
+    for(i=al, j=dl;i<al+dl;i++,j--){
+        b_samples[i].w_float = downgain + (1.-downgain)*(t_float)j/(t_float)dl;
+    }
+    for(i=al+dl,j=rl;i<b_frames;i++,j--){
+        b_samples[i].w_float = downgain * (t_float)j/(t_float)rl;
+    }
+    function_redraw(x);
+}
+
+void function_aenv(t_function *x, t_symbol *msg, int argc, t_atom *argv)
+{
+    int i,j;
+    int al, dl;
+    long b_frames = x->b_frames;
+    t_word *b_samples = x->b_samples;
+    t_float frac;
+    frac = atom_getfloatarg(0,argc,argv);
+    
+    function_setbuf(x, x->wavename);
+    if(frac <= 0 || frac >= 1){
+        post("* attack time must range from 0.0 - 1.0, rather than %f",frac);
+    }
+    
+    al = b_frames * frac;
+    
+    dl = b_frames - al;
+    for(i=0;i<al;i++){
+        b_samples[i].w_float = (t_float)i/(t_float)al;
+    }
+    for(i=al, j=dl;i<b_frames;i++,j--){
+        b_samples[i].w_float = (t_float)j/(t_float)dl;
+    }
+    function_redraw(x);
+}
+
+void function_addsyn(t_function *x, t_symbol *msg, int argc, t_atom *argv)
+{
+    int i,j;
+    long b_frames;
+    t_word *b_samples;
+    t_float amp;
+    t_float maxamp, rescale;
+    t_float theSample;
+    
+    /* for(i = 0; i < argc; i++){
+        post("argument %d: %f",i, atom_getfloatarg(i,argc,argv));
+    }*/
+    
+    function_setbuf(x, x->wavename);
+    b_samples = x->b_samples;
+    b_frames = x->b_frames;
+    amp = atom_getfloatarg(0,argc,argv);
+    // post("harmonic: 0, weight: %.12f", (float)amp);
+    for(i=0;i<b_frames;i++){
+        b_samples[i].w_float = amp;
+    }
+    for(j=1;j<argc;j++){
+        amp = atom_getfloatarg(j,argc,argv);
+        if(amp){
+           // post("harmonic: %d, weight: %.12f", j, (t_float)amp);
+            for(i=0;i<b_frames;i++){
+                theSample = amp * sin(TWOPI * (t_float) j * (t_float)i/(t_float)b_frames);
+                b_samples[i].w_float += theSample;
+               // post("%d: %f", i, (t_float)b_samples[i].w_float);
+            }
+        }
+    }
+    
+    if(x->normalize){
+        maxamp = 0;
+        for(i=0;i<b_frames;i++){
+            if(maxamp < fabs(b_samples[i].w_float))
+                maxamp = fabs(b_samples[i].w_float);
+        }
+        if(!maxamp){
+            post("* zero maxamp!");
+            return;
+        }
+        rescale = 1.0 / maxamp;
+        for(i=0;i<b_frames;i++){
+            b_samples[i].w_float *= rescale;
+        }
+    }
+    
+    /*
+    for(i=0;i<b_frames;i++){
+        post("%f", x->b_samples[i].w_float);
+    }
+    */
+    function_redraw(x);
+}
+
+
+void *function_new(t_symbol *msg, int argc, t_atom *argv)
+{
+    
+    t_function *x = (t_function *)pd_new(function_class);
+    outlet_new(&x->x_obj, gensym("signal"));
+    x->wavename = atom_getsymbolarg(0,argc,argv);
+    x->normalize = 1;
+//    post("float size: %d, t_float size: %d, t_word size %d", sizeof(float), sizeof(t_float), sizeof(t_word));
+//    post("latest version");
+    return x;
+}
+
+void function_setbuf(t_function *x, t_symbol *wavename)
+{
+    int frames;
+    t_garray *a;
+    
+    x->b_frames = 0;
+    x->b_nchans = 1;
+    if (!(a = (t_garray *)pd_findbyclass(wavename, garray_class))) {
+        if (*wavename->s_name) pd_error(x, "function~: %s: no such array", wavename->s_name);
+    }
+    else if (!garray_getfloatwords(a, &frames, &x->b_samples)) {
+        pd_error(x, "%s: bad template for function~", wavename->s_name);
+    }
+    else  {
+        x->b_frames = frames;
+        garray_usedindsp(a);
+        // post("%d frames in buffer", x->b_frames);
+    }
+}
+
+void function_redraw(t_function *x)
+{
+    t_garray *a;
+    if (!(a = (t_garray *)pd_findbyclass(x->wavename, garray_class))) {
+        if (*x->wavename->s_name) pd_error(x, "function~: %s: no such array", x->wavename->s_name);
+    }
+    else  {
+        garray_redraw(a);
+    }
+}
+
+
+
+void function_dsp(t_function *x, t_signal **sp)
+{
+}
+
diff --git a/externals/lyonpotpourri/granola~-help.pd b/externals/lyonpotpourri/granola~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..ede6eb0be1036a11c9f03b874a8246f4a40a048a
--- /dev/null
+++ b/externals/lyonpotpourri/granola~-help.pd
@@ -0,0 +1,40 @@
+#N canvas 316 98 349 304 10;
+#X obj 96 238 dac~;
+#X obj 96 83 phasor~ 450;
+#X floatatom 186 105 5 0 0 2 - g-transpose -, f 5;
+#X obj 96 212 *~ 0.05;
+#X obj 189 83 hsl 128 15 0.1 3 0 0 g-transpose granola-transpose-in
+transpose_factor -2 -6 0 10 -4075 -1 -1 3941 1;
+#X obj 25 79 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X msg 25 111 mute \$1;
+#X obj 145 178 hsl 90 12 0 0.1 0 0 empty granola-gain-in gain -2 -8
+0 10 -212981 -1 -1 4450 1;
+#X floatatom 142 192 5 0 0 0 - - -, f 5;
+#X obj 23 9 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X obj 96 142 granola~ 100;
+#X obj 96 114 killdc~;
+#N canvas 235 115 191 186 initialize 0;
+#X msg 3 111 1;
+#X obj 3 88 loadbang;
+#X obj 3 133 s granola-transpose-in;
+#X obj 3 63 s granola-gain-in;
+#X obj 3 18 loadbang;
+#X msg 3 41 0.05;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 4 0 5 0;
+#X connect 5 0 3 0;
+#X restore 135 238 pd initialize;
+#X text 24 42 granola~ - a granular pitch transposer;
+#X connect 1 0 11 0;
+#X connect 2 0 10 1;
+#X connect 3 0 0 0;
+#X connect 3 0 0 1;
+#X connect 5 0 6 0;
+#X connect 6 0 10 0;
+#X connect 7 0 8 0;
+#X connect 8 0 3 1;
+#X connect 10 0 3 0;
+#X connect 11 0 10 0;
diff --git a/externals/lyonpotpourri/granola~.c b/externals/lyonpotpourri/granola~.c
new file mode 100755
index 0000000000000000000000000000000000000000..adb6735b3d91b51aa282bf07725dea1b860fe2f8
--- /dev/null
+++ b/externals/lyonpotpourri/granola~.c
@@ -0,0 +1,330 @@
+#include "MSPd.h"
+
+
+static t_class *granola_class;
+
+#define OBJECT_NAME "granola~"
+
+typedef struct _granola
+{
+    
+    t_object x_obj;
+    float x_f;
+    float *gbuf;
+    long grainsamps;
+    long buflen ; // length of buffer
+    int maxgrainsamps; // set maximum delay in ms.
+    float grain_duration; // user grain duration in seconds
+    float sr;
+    float *grainenv;
+    long gpt1; // grain pointer 1
+    long gpt2; // grain pointer 2
+    long gpt3; // grain pointer 3
+    float phs1; // phase 1
+    float phs2; // phase 2
+    float phs3; // phase 3
+    float incr;
+    long curdel;
+    short mute_me;
+    short iconnect;
+    
+} t_granola;
+
+
+
+void *granola_new(t_floatarg val);
+t_int *offset_perform(t_int *w);
+t_int *granola_perform(t_int *w);
+void granola_dsp(t_granola *x, t_signal **sp);
+void granola_mute(t_granola *x, t_floatarg toggle);
+void granola_float(t_granola *x, double f ) ;
+void granola_dsp_free(t_granola *x);
+void granola_size(t_granola *x, t_floatarg newsize);
+void granola_clear(t_granola *x);
+void granola_init(t_granola *x);
+
+void granola_tilde_setup(void){
+    granola_class = class_new(gensym("granola~"), (t_newmethod)granola_new,
+                              (t_method)granola_dsp_free ,sizeof(t_granola), 0,A_FLOAT,0);
+    CLASS_MAINSIGNALIN(granola_class, t_granola, x_f);
+    class_addmethod(granola_class,(t_method)granola_dsp,gensym("dsp"),0);
+    class_addmethod(granola_class,(t_method)granola_clear,gensym("clear"),0);
+    class_addmethod(granola_class,(t_method)granola_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(granola_class,(t_method)granola_size,gensym("size"),A_FLOAT,0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+
+void granola_float(t_granola *x, double f) {
+    x->incr = f;
+}
+
+void granola_dsp_free(t_granola *x)
+{
+    
+    free(x->gbuf);
+    free(x->grainenv);
+}
+
+
+void granola_mute(t_granola *x, t_floatarg toggle)
+{
+    x->mute_me = (short)toggle;
+}
+
+void granola_clear(t_granola *x) {
+	memset((char *)x->gbuf, 0, x->buflen);
+}
+
+void granola_size(t_granola *x, t_floatarg newsize) {
+	int newsamps, i;
+	newsamps = newsize * 0.001 * sys_getsr();
+	if( newsamps >= x->maxgrainsamps ){
+		error("granola~: specified size over preset maximum, no action taken");
+		return;
+	}
+	if( newsamps < 8 ){
+		error("granola~: grainsize too small");
+		return;
+	}
+	x->grainsamps = newsamps; // will use for shrinkage
+	x->buflen = x->grainsamps * 4;
+	for(i = 0; i < x->grainsamps; i++ ){
+		x->grainenv[i] = .5 + (-.5 * cos( TWOPI * ((float)i/(float)x->grainsamps) ) );
+	}
+	x->gpt1 = 0;
+	x->gpt2 = x->grainsamps / 3.;
+	x->gpt3 = 2. * x->grainsamps / 3.;
+	x->phs1 = 0;
+	x->phs2 = x->grainsamps / 3. ;
+	x->phs3 = 2. * x->grainsamps / 3. ;
+	x->curdel = 0;
+}
+
+void *granola_new(t_floatarg val)
+{
+    
+    t_granola *x = (t_granola *)pd_new(granola_class);
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+    
+    // INITIALIZATIONS
+	x->sr = sys_getsr();
+	x->grain_duration = val * 0.001; // convert to seconds
+	x->gbuf = NULL;
+	x->grainenv = NULL;
+	
+	granola_init(x);
+    return x;
+    /*
+     
+     
+    if( val > 0 ) {
+        x->grainsamps = val;
+        //    post( "grainsize set to %.0f", val );
+    } else {
+        x->grainsamps = 2048;
+        // post( "grainsize defaults to %d, val was %.0f", x->grainsamps, val );
+        
+    }
+    x->buflen = x->grainsamps * 4;
+    x->gbuf = (float *) calloc( x->buflen, sizeof(float) ) ;
+    x->grainenv = (float *) calloc( x->grainsamps, sizeof(float) );
+    for(i = 0; i < x->grainsamps; i++ ){
+        x->grainenv[i] = .5 + (-.5 * cos( TWOPI * ((float)i/(float)x->grainsamps) ) );
+    }
+    x->gpt1 = 0;
+    x->gpt2 = x->grainsamps / 3.;
+    x->gpt3 = 2. * x->grainsamps / 3.;
+    x->phs1 = 0;
+    x->phs2 = x->grainsamps / 3. ;
+    x->phs3 = 2. * x->grainsamps / 3. ;
+    x->incr = .5 ;
+    x->curdel = 0;
+    x->mute_me = 0;
+    
+    return (x);
+    */
+}
+
+void granola_init(t_granola *x)
+{
+	int i;
+	if(x->sr == 0){
+		post("granola~: dodging zero sampling rate!");
+		return;
+	}
+	x->grainsamps = x->grain_duration * x->sr;
+	if(x->grainsamps <= 5 || x->grainsamps > 4410000) {
+		x->grainsamps = 2048;
+		post( "granola~: grainsize autoset to %d samples, rather than user-specified length %.0f", x->grainsamps, x->grain_duration * x->sr);
+	}
+	x->maxgrainsamps = x->grainsamps; // will use for shrinkage
+	x->buflen = x->grainsamps * 4;
+	// first time only
+	if(x->gbuf == NULL){
+		x->gbuf = (float *) calloc(x->buflen, sizeof(float));
+		x->grainenv = (float *) calloc(x->grainsamps, sizeof(float));
+		x->incr = .5;
+		x->mute_me = 0;
+	}
+	// or realloc if necessary
+	else {
+		x->gbuf = (float *) realloc(x->gbuf, x->buflen * sizeof(float));
+		x->grainenv = (float *) realloc(x->grainenv, x->grainsamps * sizeof(float));
+	}
+	for(i = 0; i < x->grainsamps; i++ ){
+		x->grainenv[i] = .5 + (-.5 * cos(TWOPI * ((float)i/(float)x->grainsamps)));
+	}
+	x->gpt1 = 0;
+	x->gpt2 = x->grainsamps / 3.;
+	x->gpt3 = 2. * x->grainsamps / 3.;
+	x->phs1 = 0;
+	x->phs2 = x->grainsamps / 3. ;
+	x->phs3 = 2. * x->grainsamps / 3. ;
+	x->curdel = 0;
+}
+
+
+t_int *granola_perform(t_int *w)
+{
+	float  outsamp ;
+	int iphs_a, iphs_b;
+	float frac;
+    
+	
+	/****/
+	t_granola *x = (t_granola *) (w[1]);
+	t_float *in = (t_float *)(w[2]);
+	t_float *increment = (t_float *)(w[3]);
+	t_float *out = (t_float *)(w[4]);
+	int n = (int)(w[5]);
+	
+	long gpt1 = x->gpt1;
+	long gpt2 = x->gpt2;
+	long gpt3 = x->gpt3;
+	float phs1 = x->phs1;
+	float phs2 = x->phs2;
+	float phs3 = x->phs3;
+	long curdel = x->curdel;
+	long buflen = x->buflen;
+	long grainsamps = x->grainsamps;
+	float *grainenv = x->grainenv;
+	float *gbuf = x->gbuf;
+	float incr = x->incr;
+	
+	if( x->mute_me ) {
+		while( n-- ){
+			*out++ = 0.0;
+		}
+		return (w+6);
+	}
+	
+	while (n--) {
+        
+		x->incr = *increment++;
+        
+		if( x->incr <= 0. ) {
+			x->incr = .5 ;
+		}
+		
+		if( curdel >= buflen ){
+			curdel = 0 ;
+		}
+		gbuf[ curdel ] = *in++;
+    	
+		// grain 1
+		iphs_a = floor( phs1 );
+		iphs_b = iphs_a + 1;
+		
+		frac = phs1 - iphs_a;
+		while( iphs_a >= buflen ) {
+			iphs_a -= buflen;
+		}
+		while( iphs_b >= buflen ) {
+			iphs_b -= buflen;
+		}
+		outsamp = (gbuf[ iphs_a ] + frac * ( gbuf[ iphs_b ] - gbuf[ iphs_a ])) * grainenv[ gpt1++ ];
+        
+		if( gpt1 >= grainsamps ) {
+			
+			gpt1 = 0;
+			phs1 = curdel;
+		}
+		phs1 += incr;
+		while( phs1 >= buflen ) {
+			phs1 -= buflen;
+		}
+		
+		// now add second grain
+		
+		
+		iphs_a = floor( phs2 );
+		
+		iphs_b = iphs_a + 1;
+		
+		frac = phs2 - iphs_a;
+        
+		
+		while( iphs_a >= buflen ) {
+			iphs_a -= buflen;
+		}
+		while( iphs_b >= buflen ) {
+			iphs_b -= buflen;
+		}
+		outsamp += (gbuf[ iphs_a ] + frac * ( gbuf[ iphs_b ] - gbuf[ iphs_a ])) * grainenv[ gpt2++ ];
+		if( gpt2 >= grainsamps ) {
+			gpt2 = 0;
+			phs2 = curdel ;
+		}
+		phs2 += incr ;
+		while( phs2 >= buflen ) {
+			phs2 -= buflen ;
+		}
+		
+		// now add third grain
+		
+		iphs_a = floor( phs3 );
+		iphs_b = iphs_a + 1;
+		
+		frac = phs3 - iphs_a;
+        
+		while( iphs_a >= buflen ) {
+			iphs_a -= buflen;
+		}
+		while( iphs_b >= buflen ) {
+			iphs_b -= buflen;
+		}
+		outsamp += (gbuf[ iphs_a ] + frac * ( gbuf[ iphs_b ] - gbuf[ iphs_a ])) * grainenv[ gpt3++ ];
+		if( gpt3 >= grainsamps ) {
+			gpt3 = 0;
+			phs3 = curdel ;
+		}
+		phs3 += incr ;
+		while( phs3 >= buflen ) {
+			phs3 -= buflen ;
+		}
+		
+		
+		++curdel;
+		
+		*out++ = outsamp;
+		/* output may well need to attenuated */
+	}
+	x->phs1 = phs1;
+	x->phs2 = phs2;
+	x->phs3 = phs3;
+	x->gpt1 = gpt1;
+	x->gpt2 = gpt2;
+	x->gpt3 = gpt3;
+	x->curdel = curdel;
+	return (w+6);
+	
+}		
+
+void granola_dsp(t_granola *x, t_signal **sp)
+{
+    
+    dsp_add(granola_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec,  sp[0]->s_n);
+}
+
diff --git a/externals/lyonpotpourri/granulesf~-help.pd b/externals/lyonpotpourri/granulesf~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..cf122987f1ff280ebe72ac04da69d26cf4477f6d
--- /dev/null
+++ b/externals/lyonpotpourri/granulesf~-help.pd
@@ -0,0 +1,4519 @@
+#N canvas 660 123 698 511 10;
+#X obj 25 302 granulesf~ gsf_wavetable gsf_window;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array gsf_window 32768 float 3;
+#A 0 0 9.19179e-09 3.67671e-08 8.27261e-08 1.47069e-07 2.29795e-07
+3.30904e-07 4.50397e-07 5.88274e-07 7.44534e-07 9.19178e-07 1.11221e-06
+1.32362e-06 1.55341e-06 1.80159e-06 2.06815e-06 2.3531e-06 2.65642e-06
+2.97814e-06 3.31823e-06 3.67671e-06 4.05357e-06 4.44882e-06 4.86245e-06
+5.29446e-06 5.74485e-06 6.21363e-06 6.7008e-06 7.20634e-06 7.73027e-06
+8.27258e-06 8.83328e-06 9.41236e-06 1.00098e-05 1.06257e-05 1.12599e-05
+1.19125e-05 1.25835e-05 1.32729e-05 1.39806e-05 1.47068e-05 1.54513e-05
+1.62142e-05 1.69955e-05 1.77952e-05 1.86132e-05 1.94497e-05 2.03045e-05
+2.11777e-05 2.20693e-05 2.29793e-05 2.39076e-05 2.48544e-05 2.58195e-05
+2.6803e-05 2.78049e-05 2.88252e-05 2.98638e-05 3.09208e-05 3.19963e-05
+3.30901e-05 3.42022e-05 3.53328e-05 3.64818e-05 3.76491e-05 3.88348e-05
+4.00389e-05 4.12614e-05 4.25022e-05 4.37615e-05 4.50391e-05 4.63351e-05
+4.76495e-05 4.89822e-05 5.03334e-05 5.17029e-05 5.30908e-05 5.44971e-05
+5.59218e-05 5.73648e-05 5.88263e-05 6.03061e-05 6.18043e-05 6.33209e-05
+6.48558e-05 6.64092e-05 6.79809e-05 6.9571e-05 7.11795e-05 7.28064e-05
+7.44516e-05 7.61152e-05 7.77973e-05 7.94976e-05 8.12164e-05 8.29536e-05
+8.47091e-05 8.6483e-05 8.82753e-05 9.0086e-05 9.1915e-05 9.37625e-05
+9.56283e-05 9.75125e-05 9.94151e-05 0.000101336 0.000103275 0.000105233
+0.000107209 0.000109204 0.000111216 0.000113248 0.000115297 0.000117365
+0.000119452 0.000121556 0.00012368 0.000125821 0.000127981 0.000130159
+0.000132356 0.000134571 0.000136804 0.000139056 0.000141326 0.000143615
+0.000145922 0.000148247 0.000150591 0.000152953 0.000155333 0.000157732
+0.000160149 0.000162585 0.000165039 0.000167511 0.000170002 0.000172511
+0.000175038 0.000177584 0.000180148 0.000182731 0.000185332 0.000187951
+0.000190589 0.000193245 0.000195919 0.000198612 0.000201323 0.000204053
+0.000206801 0.000209567 0.000212352 0.000215155 0.000217977 0.000220816
+0.000223675 0.000226551 0.000229446 0.00023236 0.000235291 0.000238241
+0.00024121 0.000244197 0.000247202 0.000250225 0.000253267 0.000256328
+0.000259407 0.000262504 0.000265619 0.000268753 0.000271905 0.000275076
+0.000278265 0.000281472 0.000284698 0.000287942 0.000291204 0.000294485
+0.000297784 0.000301102 0.000304438 0.000307792 0.000311165 0.000314556
+0.000317965 0.000321393 0.000324839 0.000328304 0.000331787 0.000335288
+0.000338808 0.000342346 0.000345902 0.000349477 0.00035307 0.000356682
+0.000360311 0.00036396 0.000367626 0.000371311 0.000375015 0.000378736
+0.000382477 0.000386235 0.000390012 0.000393807 0.000397621 0.000401453
+0.000405303 0.000409172 0.000413059 0.000416964 0.000420888 0.00042483
+0.000428791 0.00043277 0.000436767 0.000440782 0.000444816 0.000448869
+0.00045294 0.000457029 0.000461136 0.000465262 0.000469406 0.000473569
+0.00047775 0.000481949 0.000486167 0.000490403 0.000494657 0.00049893
+0.000503221 0.00050753 0.000511858 0.000516205 0.000520569 0.000524952
+0.000529353 0.000533773 0.000538211 0.000542668 0.000547142 0.000551635
+0.000556147 0.000560677 0.000565225 0.000569792 0.000574377 0.00057898
+0.000583602 0.000588242 0.0005929 0.000597577 0.000602272 0.000606985
+0.000611717 0.000616467 0.000621236 0.000626023 0.000630828 0.000635652
+0.000640494 0.000645354 0.000650233 0.00065513 0.000660046 0.000664979
+0.000669931 0.000674902 0.000679891 0.000684898 0.000689924 0.000694968
+0.00070003 0.000705111 0.00071021 0.000715327 0.000720463 0.000725617
+0.000730789 0.00073598 0.000741189 0.000746417 0.000751663 0.000756927
+0.00076221 0.000767511 0.00077283 0.000778168 0.000783524 0.000788898
+0.000794291 0.000799702 0.000805131 0.000810579 0.000816045 0.00082153
+0.000827033 0.000832554 0.000838093 0.000843651 0.000849228 0.000854822
+0.000860435 0.000866066 0.000871716 0.000877384 0.000883071 0.000888775
+0.000894498 0.00090024 0.000906 0.000911778 0.000917574 0.000923389
+0.000929222 0.000935074 0.000940944 0.000946832 0.000952738 0.000958663
+0.000964607 0.000970568 0.000976548 0.000982546 0.000988563 0.000994598
+0.00100065 0.00100672 0.00101281 0.00101892 0.00102505 0.00103119 0.00103736
+0.00104354 0.00104974 0.00105596 0.00106219 0.00106845 0.00107472 0.00108101
+0.00108732 0.00109365 0.0011 0.00110637 0.00111275 0.00111915 0.00112557
+0.00113201 0.00113847 0.00114494 0.00115144 0.00115795 0.00116448 0.00117103
+0.00117759 0.00118418 0.00119078 0.0011974 0.00120404 0.0012107 0.00121738
+0.00122408 0.00123079 0.00123752 0.00124427 0.00125104 0.00125783 0.00126463
+0.00127146 0.0012783 0.00128516 0.00129204 0.00129894 0.00130585 0.00131278
+0.00131974 0.00132671 0.0013337 0.0013407 0.00134773 0.00135477 0.00136183
+0.00136891 0.00137601 0.00138313 0.00139027 0.00139742 0.00140459 0.00141178
+0.00141899 0.00142622 0.00143346 0.00144073 0.00144801 0.00145531 0.00146263
+0.00146996 0.00147732 0.00148469 0.00149209 0.0014995 0.00150693 0.00151437
+0.00152184 0.00152932 0.00153682 0.00154434 0.00155188 0.00155944 0.00156701
+0.00157461 0.00158222 0.00158985 0.0015975 0.00160517 0.00161285 0.00162055
+0.00162828 0.00163602 0.00164378 0.00165155 0.00165935 0.00166716 0.00167499
+0.00168284 0.00169071 0.0016986 0.0017065 0.00171443 0.00172237 0.00173033
+0.00173831 0.0017463 0.00175432 0.00176235 0.0017704 0.00177847 0.00178656
+0.00179467 0.00180279 0.00181094 0.0018191 0.00182728 0.00183548 0.00184369
+0.00185193 0.00186018 0.00186845 0.00187674 0.00188505 0.00189338 0.00190172
+0.00191009 0.00191847 0.00192687 0.00193528 0.00194372 0.00195218 0.00196065
+0.00196914 0.00197765 0.00198618 0.00199472 0.00200329 0.00201187 0.00202047
+0.00202909 0.00203773 0.00204639 0.00205506 0.00206375 0.00207246 0.00208119
+0.00208994 0.00209871 0.00210749 0.00211629 0.00212511 0.00213395 0.00214281
+0.00215169 0.00216058 0.00216949 0.00217842 0.00218737 0.00219634 0.00220532
+0.00221433 0.00222335 0.00223239 0.00224145 0.00225053 0.00225962 0.00226874
+0.00227787 0.00228702 0.00229619 0.00230537 0.00231458 0.0023238 0.00233304
+0.0023423 0.00235158 0.00236088 0.00237019 0.00237953 0.00238888 0.00239825
+0.00240764 0.00241704 0.00242647 0.00243591 0.00244537 0.00245485 0.00246435
+0.00247387 0.0024834 0.00249295 0.00250252 0.00251211 0.00252172 0.00253135
+0.00254099 0.00255065 0.00256033 0.00257003 0.00257975 0.00258949 0.00259924
+0.00260901 0.0026188 0.00262861 0.00263844 0.00264828 0.00265815 0.00266803
+0.00267793 0.00268785 0.00269779 0.00270774 0.00271771 0.00272771 0.00273772
+0.00274774 0.00275779 0.00276786 0.00277794 0.00278804 0.00279816 0.0028083
+0.00281845 0.00282863 0.00283882 0.00284903 0.00285926 0.00286951 0.00287978
+0.00289006 0.00290036 0.00291068 0.00292102 0.00293138 0.00294175 0.00295215
+0.00296256 0.00297299 0.00298344 0.00299391 0.00300439 0.00301489 0.00302542
+0.00303596 0.00304651 0.00305709 0.00306769 0.0030783 0.00308893 0.00309958
+0.00311025 0.00312093 0.00313164 0.00314236 0.0031531 0.00316386 0.00317464
+0.00318544 0.00319625 0.00320708 0.00321793 0.0032288 0.00323969 0.00325059
+0.00326152 0.00327246 0.00328342 0.0032944 0.00330539 0.00331641 0.00332744
+0.00333849 0.00334956 0.00336065 0.00337176 0.00338288 0.00339403 0.00340519
+0.00341637 0.00342756 0.00343878 0.00345001 0.00346127 0.00347254 0.00348382
+0.00349513 0.00350646 0.0035178 0.00352916 0.00354054 0.00355194 0.00356336
+0.00357479 0.00358625 0.00359772 0.00360921 0.00362071 0.00363224 0.00364379
+0.00365535 0.00366693 0.00367853 0.00369015 0.00370178 0.00371343 0.00372511
+0.0037368 0.00374851 0.00376023 0.00377198 0.00378374 0.00379552 0.00380732
+0.00381914 0.00383098 0.00384283 0.0038547 0.0038666 0.0038785 0.00389043
+0.00390238 0.00391434 0.00392632 0.00393832 0.00395034 0.00396238 0.00397444
+0.00398651 0.0039986 0.00401071 0.00402284 0.00403499 0.00404715 0.00405933
+0.00407153 0.00408375 0.00409599 0.00410825 0.00412052 0.00413281 0.00414512
+0.00415745 0.0041698 0.00418216 0.00419455 0.00420695 0.00421937 0.00423181
+0.00424426 0.00425674 0.00426923 0.00428174 0.00429427 0.00430682 0.00431938
+0.00433197 0.00434457 0.00435719 0.00436983 0.00438249 0.00439516 0.00440785
+0.00442057 0.0044333 0.00444604 0.00445881 0.00447159 0.0044844 0.00449722
+0.00451006 0.00452291 0.00453579 0.00454868 0.00456159 0.00457452 0.00458747
+0.00460044 0.00461342 0.00462643 0.00463945 0.00465249 0.00466554 0.00467862
+0.00469171 0.00470483 0.00471796 0.00473111 0.00474427 0.00475746 0.00477066
+0.00478388 0.00479712 0.00481038 0.00482366 0.00483695 0.00485026 0.00486359
+0.00487694 0.00489031 0.0049037 0.0049171 0.00493052 0.00494396 0.00495742
+0.00497089 0.00498439 0.0049979 0.00501143 0.00502498 0.00503855 0.00505214
+0.00506574 0.00507936 0.005093 0.00510666 0.00512034 0.00513403 0.00514774
+0.00516147 0.00517522 0.00518899 0.00520278 0.00521658 0.0052304 0.00524424
+0.0052581 0.00527198 0.00528587 0.00529979 0.00531372 0.00532767 0.00534163
+0.00535562 0.00536962 0.00538365 0.00539769 0.00541175 0.00542582 0.00543992
+0.00545403 0.00546816 0.00548231 0.00549648 0.00551066 0.00552487 0.00553909
+0.00555333 0.00556759 0.00558187 0.00559616 0.00561047 0.0056248 0.00563915
+0.00565352 0.00566791 0.00568231 0.00569673 0.00571117 0.00572563 0.00574011
+0.0057546 0.00576912 0.00578365 0.0057982 0.00581276 0.00582735 0.00584195
+0.00585658 0.00587122 0.00588587 0.00590055 0.00591525 0.00592996 0.00594469
+0.00595944 0.00597421 0.00598899 0.0060038 0.00601862 0.00603346 0.00604832
+0.00606319 0.00607809 0.006093 0.00610793 0.00612288 0.00613785 0.00615283
+0.00616783 0.00618286 0.0061979 0.00621295 0.00622803 0.00624312 0.00625824
+0.00627337 0.00628851 0.00630368 0.00631887 0.00633407 0.00634929 0.00636453
+0.00637979 0.00639506 0.00641036 0.00642567 0.006441 0.00645635 0.00647171
+0.0064871 0.0065025 0.00651792 0.00653336 0.00654882 0.00656429 0.00657979
+0.0065953 0.00661083 0.00662638 0.00664194 0.00665753 0.00667313 0.00668875
+0.00670439 0.00672004 0.00673572 0.00675141 0.00676712 0.00678285 0.0067986
+0.00681437 0.00683015 0.00684595 0.00686177 0.00687761 0.00689347 0.00690934
+0.00692523 0.00694114 0.00695707 0.00697302 0.00698898 0.00700497 0.00702097
+0.00703699 0.00705302 0.00706908 0.00708515 0.00710125 0.00711736 0.00713348
+0.00714963 0.00716579 0.00718198 0.00719818 0.0072144 0.00723063 0.00724689
+0.00726316 0.00727945 0.00729576 0.00731209 0.00732843 0.0073448 0.00736118
+0.00737758 0.007394 0.00741043 0.00742689 0.00744336 0.00745985 0.00747636
+0.00749288 0.00750943 0.00752599 0.00754257 0.00755917 0.00757579 0.00759242
+0.00760908 0.00762575 0.00764244 0.00765915 0.00767587 0.00769262 0.00770938
+0.00772616 0.00774296 0.00775977 0.00777661 0.00779346 0.00781033 0.00782722
+0.00784412 0.00786105 0.00787799 0.00789495 0.00791193 0.00792893 0.00794595
+0.00796298 0.00798003 0.0079971 0.00801419 0.00803129 0.00804842 0.00806556
+0.00808272 0.0080999 0.00811709 0.00813431 0.00815154 0.00816879 0.00818606
+0.00820335 0.00822065 0.00823797 0.00825531 0.00827267 0.00829005 0.00830744
+0.00832486 0.00834229 0.00835974 0.00837721 0.00839469 0.0084122 0.00842972
+0.00844726 0.00846481 0.00848239 0.00849998 0.0085176 0.00853523 0.00855287
+0.00857054 0.00858822 0.00860593 0.00862365 0.00864139 0.00865914 0.00867692
+0.00869471 0.00871252 0.00873035 0.0087482 0.00876606 0.00878394 0.00880184
+0.00881976 0.0088377 0.00885566 0.00887363 0.00889162 0.00890963 0.00892766
+0.0089457 0.00896377 0.00898185 0.00899995 0.00901807 0.0090362 0.00905436
+0.00907253 0.00909072 0.00910892 0.00912715 0.00914539;
+#A 1000 0.00916366 0.00918194 0.00920023 0.00921855 0.00923689 0.00925524
+0.00927361 0.009292 0.0093104 0.00932883 0.00934727 0.00936573 0.00938421
+0.00940271 0.00942122 0.00943975 0.0094583 0.00947687 0.00949546 0.00951406
+0.00953269 0.00955133 0.00956999 0.00958866 0.00960736 0.00962607 0.0096448
+0.00966355 0.00968232 0.00970111 0.00971991 0.00973873 0.00975757 0.00977643
+0.0097953 0.0098142 0.00983311 0.00985204 0.00987098 0.00988995 0.00990893
+0.00992793 0.00994695 0.00996599 0.00998505 0.0100041 0.0100232 0.0100423
+0.0100614 0.0100806 0.0100998 0.0101189 0.0101381 0.0101574 0.0101766
+0.0101958 0.0102151 0.0102344 0.0102537 0.010273 0.0102924 0.0103117
+0.0103311 0.0103505 0.0103699 0.0103894 0.0104088 0.0104283 0.0104478
+0.0104673 0.0104868 0.0105064 0.0105259 0.0105455 0.0105651 0.0105847
+0.0106043 0.010624 0.0106436 0.0106633 0.010683 0.0107028 0.0107225
+0.0107423 0.010762 0.0107818 0.0108016 0.0108215 0.0108413 0.0108612
+0.0108811 0.010901 0.0109209 0.0109408 0.0109608 0.0109808 0.0110007
+0.0110208 0.0110408 0.0110608 0.0110809 0.011101 0.0111211 0.0111412
+0.0111613 0.0111815 0.0112016 0.0112218 0.011242 0.0112623 0.0112825
+0.0113028 0.011323 0.0113433 0.0113637 0.011384 0.0114043 0.0114247
+0.0114451 0.0114655 0.0114859 0.0115064 0.0115268 0.0115473 0.0115678
+0.0115883 0.0116088 0.0116294 0.01165 0.0116705 0.0116911 0.0117118
+0.0117324 0.0117531 0.0117737 0.0117944 0.0118151 0.0118359 0.0118566
+0.0118774 0.0118982 0.011919 0.0119398 0.0119606 0.0119815 0.0120023
+0.0120232 0.0120441 0.0120651 0.012086 0.012107 0.0121279 0.0121489
+0.0121699 0.012191 0.012212 0.0122331 0.0122542 0.0122753 0.0122964
+0.0123176 0.0123387 0.0123599 0.0123811 0.0124023 0.0124235 0.0124448
+0.012466 0.0124873 0.0125086 0.0125299 0.0125513 0.0125726 0.012594
+0.0126154 0.0126368 0.0126582 0.0126797 0.0127012 0.0127226 0.0127441
+0.0127657 0.0127872 0.0128087 0.0128303 0.0128519 0.0128735 0.0128951
+0.0129168 0.0129384 0.0129601 0.0129818 0.0130035 0.0130253 0.013047
+0.0130688 0.0130906 0.0131124 0.0131342 0.013156 0.0131779 0.0131998
+0.0132216 0.0132436 0.0132655 0.0132874 0.0133094 0.0133314 0.0133534
+0.0133754 0.0133974 0.0134195 0.0134416 0.0134636 0.0134858 0.0135079
+0.01353 0.0135522 0.0135744 0.0135966 0.0136188 0.013641 0.0136633
+0.0136855 0.0137078 0.0137301 0.0137524 0.0137748 0.0137971 0.0138195
+0.0138419 0.0138643 0.0138868 0.0139092 0.0139317 0.0139541 0.0139766
+0.0139992 0.0140217 0.0140443 0.0140668 0.0140894 0.014112 0.0141347
+0.0141573 0.01418 0.0142026 0.0142253 0.0142481 0.0142708 0.0142935
+0.0143163 0.0143391 0.0143619 0.0143847 0.0144076 0.0144304 0.0144533
+0.0144762 0.0144991 0.014522 0.014545 0.0145679 0.0145909 0.0146139
+0.0146369 0.01466 0.014683 0.0147061 0.0147292 0.0147523 0.0147754
+0.0147986 0.0148217 0.0148449 0.0148681 0.0148913 0.0149146 0.0149378
+0.0149611 0.0149844 0.0150077 0.015031 0.0150543 0.0150777 0.0151011
+0.0151245 0.0151479 0.0151713 0.0151948 0.0152182 0.0152417 0.0152652
+0.0152887 0.0153123 0.0153358 0.0153594 0.015383 0.0154066 0.0154302
+0.0154538 0.0154775 0.0155012 0.0155249 0.0155486 0.0155723 0.0155961
+0.0156198 0.0156436 0.0156674 0.0156913 0.0157151 0.015739 0.0157628
+0.0157867 0.0158106 0.0158346 0.0158585 0.0158825 0.0159064 0.0159304
+0.0159545 0.0159785 0.0160026 0.0160266 0.0160507 0.0160748 0.0160989
+0.0161231 0.0161472 0.0161714 0.0161956 0.0162198 0.0162441 0.0162683
+0.0162926 0.0163169 0.0163412 0.0163655 0.0163898 0.0164142 0.0164385
+0.0164629 0.0164873 0.0165118 0.0165362 0.0165607 0.0165851 0.0166096
+0.0166342 0.0166587 0.0166832 0.0167078 0.0167324 0.016757 0.0167816
+0.0168063 0.0168309 0.0168556 0.0168803 0.016905 0.0169297 0.0169545
+0.0169792 0.017004 0.0170288 0.0170536 0.0170785 0.0171033 0.0171282
+0.0171531 0.017178 0.0172029 0.0172278 0.0172528 0.0172778 0.0173028
+0.0173278 0.0173528 0.0173779 0.0174029 0.017428 0.0174531 0.0174782
+0.0175034 0.0175285 0.0175537 0.0175789 0.0176041 0.0176293 0.0176546
+0.0176798 0.0177051 0.0177304 0.0177557 0.017781 0.0178064 0.0178318
+0.0178571 0.0178825 0.017908 0.0179334 0.0179589 0.0179843 0.0180098
+0.0180353 0.0180609 0.0180864 0.018112 0.0181375 0.0181631 0.0181888
+0.0182144 0.01824 0.0182657 0.0182914 0.0183171 0.0183428 0.0183686
+0.0183943 0.0184201 0.0184459 0.0184717 0.0184975 0.0185234 0.0185492
+0.0185751 0.018601 0.0186269 0.0186529 0.0186788 0.0187048 0.0187308
+0.0187568 0.0187828 0.0188088 0.0188349 0.018861 0.0188871 0.0189132
+0.0189393 0.0189654 0.0189916 0.0190178 0.019044 0.0190702 0.0190964
+0.0191227 0.019149 0.0191753 0.0192016 0.0192279 0.0192542 0.0192806
+0.019307 0.0193333 0.0193598 0.0193862 0.0194126 0.0194391 0.0194656
+0.0194921 0.0195186 0.0195451 0.0195717 0.0195983 0.0196248 0.0196514
+0.0196781 0.0197047 0.0197314 0.019758 0.0197847 0.0198115 0.0198382
+0.0198649 0.0198917 0.0199185 0.0199453 0.0199721 0.0199989 0.0200258
+0.0200527 0.0200795 0.0201064 0.0201334 0.0201603 0.0201873 0.0202142
+0.0202412 0.0202682 0.0202953 0.0203223 0.0203494 0.0203765 0.0204036
+0.0204307 0.0204578 0.020485 0.0205121 0.0205393 0.0205665 0.0205938
+0.020621 0.0206483 0.0206755 0.0207028 0.0207301 0.0207575 0.0207848
+0.0208122 0.0208396 0.020867 0.0208944 0.0209218 0.0209493 0.0209767
+0.0210042 0.0210317 0.0210593 0.0210868 0.0211144 0.0211419 0.0211695
+0.0211971 0.0212248 0.0212524 0.0212801 0.0213077 0.0213354 0.0213632
+0.0213909 0.0214186 0.0214464 0.0214742 0.021502 0.0215298 0.0215577
+0.0215855 0.0216134 0.0216413 0.0216692 0.0216971 0.0217251 0.021753
+0.021781 0.021809 0.021837 0.0218651 0.0218931 0.0219212 0.0219493
+0.0219774 0.0220055 0.0220336 0.0220618 0.02209 0.0221182 0.0221464
+0.0221746 0.0222028 0.0222311 0.0222594 0.0222877 0.022316 0.0223443
+0.0223727 0.022401 0.0224294 0.0224578 0.0224862 0.0225147 0.0225431
+0.0225716 0.0226001 0.0226286 0.0226571 0.0226857 0.0227142 0.0227428
+0.0227714 0.0228 0.0228286 0.0228573 0.022886 0.0229146 0.0229433 0.0229721
+0.0230008 0.0230295 0.0230583 0.0230871 0.0231159 0.0231447 0.0231736
+0.0232024 0.0232313 0.0232602 0.0232891 0.023318 0.023347 0.0233759
+0.0234049 0.0234339 0.0234629 0.023492 0.023521 0.0235501 0.0235792
+0.0236083 0.0236374 0.0236665 0.0236957 0.0237249 0.0237541 0.0237833
+0.0238125 0.0238417 0.023871 0.0239003 0.0239296 0.0239589 0.0239882
+0.0240176 0.0240469 0.0240763 0.0241057 0.0241351 0.0241646 0.024194
+0.0242235 0.024253 0.0242825 0.024312 0.0243416 0.0243711 0.0244007
+0.0244303 0.0244599 0.0244895 0.0245192 0.0245488 0.0245785 0.0246082
+0.0246379 0.0246677 0.0246974 0.0247272 0.024757 0.0247868 0.0248166
+0.0248464 0.0248763 0.0249062 0.024936 0.024966 0.0249959 0.0250258
+0.0250558 0.0250858 0.0251158 0.0251458 0.0251758 0.0252058 0.0252359
+0.025266 0.0252961 0.0253262 0.0253563 0.0253865 0.0254167 0.0254469
+0.0254771 0.0255073 0.0255375 0.0255678 0.0255981 0.0256283 0.0256587
+0.025689 0.0257193 0.0257497 0.0257801 0.0258105 0.0258409 0.0258713
+0.0259018 0.0259322 0.0259627 0.0259932 0.0260237 0.0260543 0.0260848
+0.0261154 0.026146 0.0261766 0.0262072 0.0262378 0.0262685 0.0262992
+0.0263299 0.0263606 0.0263913 0.0264221 0.0264528 0.0264836 0.0265144
+0.0265452 0.026576 0.0266069 0.0266378 0.0266686 0.0266995 0.0267305
+0.0267614 0.0267924 0.0268233 0.0268543 0.0268853 0.0269163 0.0269474
+0.0269784 0.0270095 0.0270406 0.0270717 0.0271028 0.027134 0.0271652
+0.0271963 0.0272275 0.0272588 0.02729 0.0273212 0.0273525 0.0273838
+0.0274151 0.0274464 0.0274777 0.0275091 0.0275405 0.0275719 0.0276033
+0.0276347 0.0276661 0.0276976 0.0277291 0.0277606 0.0277921 0.0278236
+0.0278551 0.0278867 0.0279183 0.0279499 0.0279815 0.0280131 0.0280448
+0.0280764 0.0281081 0.0281398 0.0281715 0.0282033 0.028235 0.0282668
+0.0282986 0.0283304 0.0283622 0.028394 0.0284259 0.0284578 0.0284897
+0.0285216 0.0285535 0.0285855 0.0286174 0.0286494 0.0286814 0.0287134
+0.0287454 0.0287775 0.0288095 0.0288416 0.0288737 0.0289058 0.028938
+0.0289701 0.0290023 0.0290345 0.0290667 0.0290989 0.0291311 0.0291634
+0.0291957 0.029228 0.0292603 0.0292926 0.0293249 0.0293573 0.0293897
+0.0294221 0.0294545 0.0294869 0.0295194 0.0295518 0.0295843 0.0296168
+0.0296493 0.0296818 0.0297144 0.029747 0.0297795 0.0298122 0.0298448
+0.0298774 0.0299101 0.0299427 0.0299754 0.0300081 0.0300408 0.0300736
+0.0301063 0.0301391 0.0301719 0.0302047 0.0302375 0.0302704 0.0303032
+0.0303361 0.030369 0.0304019 0.0304349 0.0304678 0.0305008 0.0305338
+0.0305668 0.0305998 0.0306328 0.0306659 0.0306989 0.030732 0.0307651
+0.0307982 0.0308314 0.0308645 0.0308977 0.0309309 0.0309641 0.0309973
+0.0310306 0.0310638 0.0310971 0.0311304 0.0311637 0.031197 0.0312304
+0.0312637 0.0312971 0.0313305 0.0313639 0.0313973 0.0314308 0.0314642
+0.0314977 0.0315312 0.0315647 0.0315983 0.0316318 0.0316654 0.031699
+0.0317326 0.0317662 0.0317998 0.0318335 0.0318672 0.0319009 0.0319346
+0.0319683 0.032002 0.0320358 0.0320696 0.0321033 0.0321372 0.032171
+0.0322048 0.0322387 0.0322726 0.0323065 0.0323404 0.0323743 0.0324082
+0.0324422 0.0324762 0.0325102 0.0325442 0.0325782 0.0326123 0.0326464
+0.0326804 0.0327145 0.0327487 0.0327828 0.0328169 0.0328511 0.0328853
+0.0329195 0.0329537 0.032988 0.0330222 0.0330565 0.0330908 0.0331251
+0.0331594 0.0331938 0.0332281 0.0332625 0.0332969 0.0333313 0.0333657
+0.0334002 0.0334346 0.0334691 0.0335036 0.0335381 0.0335726 0.0336072
+0.0336418 0.0336763 0.0337109 0.0337456 0.0337802 0.0338148 0.0338495
+0.0338842 0.0339189 0.0339536 0.0339883 0.0340231 0.0340579 0.0340927
+0.0341275 0.0341623 0.0341971 0.034232 0.0342668 0.0343017 0.0343366
+0.0343716 0.0344065 0.0344415 0.0344764 0.0345114 0.0345464 0.0345815
+0.0346165 0.0346516 0.0346867 0.0347218 0.0347569 0.034792 0.0348271
+0.0348623 0.0348975 0.0349327 0.0349679 0.0350031 0.0350384 0.0350736
+0.0351089 0.0351442 0.0351796 0.0352149 0.0352502 0.0352856 0.035321
+0.0353564 0.0353918 0.0354273 0.0354627 0.0354982 0.0355337 0.0355692
+0.0356047 0.0356402 0.0356758 0.0357114 0.035747 0.0357826 0.0358182
+0.0358538 0.0358895 0.0359252 0.0359609 0.0359966 0.0360323 0.036068
+0.0361038 0.0361396 0.0361754 0.0362112 0.036247 0.0362829;
+#A 2000 0.0363187 0.0363546 0.0363905 0.0364264 0.0364624 0.0364983
+0.0365343 0.0365703 0.0366063 0.0366423 0.0366783 0.0367144 0.0367504
+0.0367865 0.0368226 0.0368587 0.0368949 0.036931 0.0369672 0.0370034
+0.0370396 0.0370758 0.0371121 0.0371483 0.0371846 0.0372209 0.0372572
+0.0372935 0.0373298 0.0373662 0.0374026 0.037439 0.0374754 0.0375118
+0.0375482 0.0375847 0.0376212 0.0376577 0.0376942 0.0377307 0.0377673
+0.0378038 0.0378404 0.037877 0.0379136 0.0379502 0.0379869 0.0380236
+0.0380602 0.0380969 0.0381336 0.0381704 0.0382071 0.0382439 0.0382807
+0.0383175 0.0383543 0.0383911 0.038428 0.0384648 0.0385017 0.0385386
+0.0385755 0.0386125 0.0386494 0.0386864 0.0387234 0.0387604 0.0387974
+0.0388345 0.0388715 0.0389086 0.0389457 0.0389828 0.0390199 0.039057
+0.0390942 0.0391314 0.0391686 0.0392058 0.039243 0.0392802 0.0393175
+0.0393548 0.039392 0.0394294 0.0394667 0.039504 0.0395414 0.0395788
+0.0396161 0.0396536 0.039691 0.0397284 0.0397659 0.0398034 0.0398409
+0.0398784 0.0399159 0.0399534 0.039991 0.0400286 0.0400662 0.0401038
+0.0401414 0.0401791 0.0402167 0.0402544 0.0402921 0.0403298 0.0403676
+0.0404053 0.0404431 0.0404809 0.0405187 0.0405565 0.0405943 0.0406322
+0.04067 0.0407079 0.0407458 0.0407837 0.0408217 0.0408596 0.0408976
+0.0409356 0.0409736 0.0410116 0.0410496 0.0410877 0.0411257 0.0411638
+0.0412019 0.04124 0.0412782 0.0413163 0.0413545 0.0413927 0.0414309
+0.0414691 0.0415074 0.0415456 0.0415839 0.0416222 0.0416605 0.0416988
+0.0417371 0.0417755 0.0418139 0.0418522 0.0418907 0.0419291 0.0419675
+0.042006 0.0420444 0.0420829 0.0421214 0.04216 0.0421985 0.0422371
+0.0422756 0.0423142 0.0423528 0.0423915 0.0424301 0.0424688 0.0425074
+0.0425461 0.0425848 0.0426236 0.0426623 0.0427011 0.0427398 0.0427786
+0.0428175 0.0428563 0.0428951 0.042934 0.0429729 0.0430118 0.0430507
+0.0430896 0.0431285 0.0431675 0.0432065 0.0432455 0.0432845 0.0433235
+0.0433626 0.0434016 0.0434407 0.0434798 0.0435189 0.043558 0.0435972
+0.0436363 0.0436755 0.0437147 0.0437539 0.0437932 0.0438324 0.0438717
+0.043911 0.0439502 0.0439896 0.0440289 0.0440682 0.0441076 0.044147
+0.0441864 0.0442258 0.0442652 0.0443047 0.0443441 0.0443836 0.0444231
+0.0444626 0.0445022 0.0445417 0.0445813 0.0446209 0.0446605 0.0447001
+0.0447397 0.0447794 0.044819 0.0448587 0.0448984 0.0449381 0.0449778
+0.0450176 0.0450574 0.0450971 0.0451369 0.0451768 0.0452166 0.0452564
+0.0452963 0.0453362 0.0453761 0.045416 0.0454559 0.0454959 0.0455359
+0.0455758 0.0456158 0.0456559 0.0456959 0.0457359 0.045776 0.0458161
+0.0458562 0.0458963 0.0459364 0.0459766 0.0460168 0.0460569 0.0460971
+0.0461374 0.0461776 0.0462178 0.0462581 0.0462984 0.0463387 0.046379
+0.0464193 0.0464597 0.0465001 0.0465404 0.0465808 0.0466213 0.0466617
+0.0467021 0.0467426 0.0467831 0.0468236 0.0468641 0.0469046 0.0469452
+0.0469858 0.0470264 0.047067 0.0471076 0.0471482 0.0471889 0.0472295
+0.0472702 0.0473109 0.0473516 0.0473924 0.0474331 0.0474739 0.0475147
+0.0475555 0.0475963 0.0476371 0.047678 0.0477188 0.0477597 0.0478006
+0.0478415 0.0478825 0.0479234 0.0479644 0.0480054 0.0480464 0.0480874
+0.0481284 0.0481695 0.0482105 0.0482516 0.0482927 0.0483338 0.0483749
+0.0484161 0.0484573 0.0484984 0.0485396 0.0485809 0.0486221 0.0486633
+0.0487046 0.0487459 0.0487872 0.0488285 0.0488698 0.0489112 0.0489525
+0.0489939 0.0490353 0.0490767 0.0491182 0.0491596 0.0492011 0.0492426
+0.0492841 0.0493256 0.0493671 0.0494087 0.0494502 0.0494918 0.0495334
+0.049575 0.0496166 0.0496583 0.0496999 0.0497416 0.0497833 0.049825
+0.0498668 0.0499085 0.0499503 0.0499921 0.0500338 0.0500757 0.0501175
+0.0501593 0.0502012 0.0502431 0.050285 0.0503269 0.0503688 0.0504108
+0.0504527 0.0504947 0.0505367 0.0505787 0.0506207 0.0506628 0.0507048
+0.0507469 0.050789 0.0508311 0.0508732 0.0509154 0.0509575 0.0509997
+0.0510419 0.0510841 0.0511263 0.0511686 0.0512108 0.0512531 0.0512954
+0.0513377 0.05138 0.0514224 0.0514647 0.0515071 0.0515495 0.0515919
+0.0516343 0.0516768 0.0517192 0.0517617 0.0518042 0.0518467 0.0518892
+0.0519318 0.0519743 0.0520169 0.0520595 0.0521021 0.0521447 0.0521873
+0.05223 0.0522727 0.0523153 0.052358 0.0524008 0.0524435 0.0524862
+0.052529 0.0525718 0.0526146 0.0526574 0.0527003 0.0527431 0.052786
+0.0528289 0.0528718 0.0529147 0.0529576 0.0530006 0.0530435 0.0530865
+0.0531295 0.0531725 0.0532156 0.0532586 0.0533017 0.0533448 0.0533879
+0.053431 0.0534741 0.0535172 0.0535604 0.0536036 0.0536468 0.05369
+0.0537332 0.0537765 0.0538197 0.053863 0.0539063 0.0539496 0.0539929
+0.0540363 0.0540796 0.054123 0.0541664 0.0542098 0.0542533 0.0542967
+0.0543402 0.0543836 0.0544271 0.0544706 0.0545142 0.0545577 0.0546012
+0.0546448 0.0546884 0.054732 0.0547756 0.0548193 0.0548629 0.0549066
+0.0549503 0.054994 0.0550377 0.0550815 0.0551252 0.055169 0.0552128
+0.0552566 0.0553004 0.0553442 0.0553881 0.0554319 0.0554758 0.0555197
+0.0555636 0.0556076 0.0556515 0.0556955 0.0557395 0.0557835 0.0558275
+0.0558715 0.0559156 0.0559596 0.0560037 0.0560478 0.0560919 0.056136
+0.0561802 0.0562243 0.0562685 0.0563127 0.0563569 0.0564012 0.0564454
+0.0564897 0.0565339 0.0565782 0.0566225 0.0566669 0.0567112 0.0567556
+0.0567999 0.0568443 0.0568887 0.0569332 0.0569776 0.0570221 0.0570665
+0.057111 0.0571555 0.0572 0.0572446 0.0572891 0.0573337 0.0573783 0.0574229
+0.0574675 0.0575121 0.0575568 0.0576015 0.0576461 0.0576908 0.0577355
+0.0577803 0.057825 0.0578698 0.0579146 0.0579594 0.0580042 0.058049
+0.0580939 0.0581387 0.0581836 0.0582285 0.0582734 0.0583183 0.0583633
+0.0584082 0.0584532 0.0584982 0.0585432 0.0585882 0.0586333 0.0586783
+0.0587234 0.0587685 0.0588136 0.0588587 0.0589039 0.058949 0.0589942
+0.0590394 0.0590846 0.0591298 0.059175 0.0592203 0.0592655 0.0593108
+0.0593561 0.0594014 0.0594468 0.0594921 0.0595375 0.0595829 0.0596283
+0.0596737 0.0597191 0.0597646 0.05981 0.0598555 0.059901 0.0599465
+0.059992 0.0600376 0.0600831 0.0601287 0.0601743 0.0602199 0.0602655
+0.0603112 0.0603568 0.0604025 0.0604482 0.0604939 0.0605396 0.0605853
+0.0606311 0.0606769 0.0607227 0.0607685 0.0608143 0.0608601 0.060906
+0.0609518 0.0609977 0.0610436 0.0610895 0.0611354 0.0611814 0.0612274
+0.0612733 0.0613193 0.0613653 0.0614114 0.0614574 0.0615035 0.0615495
+0.0615956 0.0616417 0.0616879 0.061734 0.0617802 0.0618263 0.0618725
+0.0619187 0.061965 0.0620112 0.0620574 0.0621037 0.06215 0.0621963
+0.0622426 0.0622889 0.0623353 0.0623817 0.062428 0.0624744 0.0625209
+0.0625673 0.0626137 0.0626602 0.0627067 0.0627532 0.0627997 0.0628462
+0.0628927 0.0629393 0.0629859 0.0630325 0.0630791 0.0631257 0.0631723
+0.063219 0.0632657 0.0633124 0.0633591 0.0634058 0.0634525 0.0634993
+0.063546 0.0635928 0.0636396 0.0636864 0.0637333 0.0637801 0.063827
+0.0638738 0.0639207 0.0639677 0.0640146 0.0640615 0.0641085 0.0641555
+0.0642025 0.0642495 0.0642965 0.0643435 0.0643906 0.0644377 0.0644847
+0.0645318 0.064579 0.0646261 0.0646733 0.0647204 0.0647676 0.0648148
+0.064862 0.0649093 0.0649565 0.0650038 0.065051 0.0650983 0.0651457
+0.065193 0.0652403 0.0652877 0.0653351 0.0653825 0.0654299 0.0654773
+0.0655247 0.0655722 0.0656197 0.0656671 0.0657146 0.0657622 0.0658097
+0.0658573 0.0659048 0.0659524 0.066 0.0660476 0.0660953 0.0661429 0.0661906
+0.0662382 0.0662859 0.0663337 0.0663814 0.0664291 0.0664769 0.0665247
+0.0665724 0.0666203 0.0666681 0.0667159 0.0667638 0.0668116 0.0668595
+0.0669074 0.0669553 0.0670033 0.0670512 0.0670992 0.0671472 0.0671952
+0.0672432 0.0672912 0.0673393 0.0673873 0.0674354 0.0674835 0.0675316
+0.0675797 0.0676279 0.067676 0.0677242 0.0677724 0.0678206 0.0678688
+0.067917 0.0679653 0.0680136 0.0680619 0.0681102 0.0681585 0.0682068
+0.0682551 0.0683035 0.0683519 0.0684003 0.0684487 0.0684971 0.0685456
+0.068594 0.0686425 0.068691 0.0687395 0.068788 0.0688366 0.0688851
+0.0689337 0.0689823 0.0690309 0.0690795 0.0691281 0.0691768 0.0692254
+0.0692741 0.0693228 0.0693715 0.0694202 0.069469 0.0695178 0.0695665
+0.0696153 0.0696641 0.069713 0.0697618 0.0698106 0.0698595 0.0699084
+0.0699573 0.0700062 0.0700552 0.0701041 0.0701531 0.0702021 0.070251
+0.0703001 0.0703491 0.0703981 0.0704472 0.0704963 0.0705454 0.0705945
+0.0706436 0.0706927 0.0707419 0.0707911 0.0708402 0.0708895 0.0709387
+0.0709879 0.0710372 0.0710864 0.0711357 0.071185 0.0712343 0.0712836
+0.071333 0.0713823 0.0714317 0.0714811 0.0715305 0.0715799 0.0716294
+0.0716788 0.0717283 0.0717778 0.0718273 0.0718768 0.0719263 0.0719759
+0.0720254 0.072075 0.0721246 0.0721742 0.0722239 0.0722735 0.0723232
+0.0723728 0.0724225 0.0724722 0.072522 0.0725717 0.0726214 0.0726712
+0.072721 0.0727708 0.0728206 0.0728705 0.0729203 0.0729702 0.07302
+0.0730699 0.0731198 0.0731698 0.0732197 0.0732697 0.0733197 0.0733696
+0.0734196 0.0734697 0.0735197 0.0735698 0.0736198 0.0736699 0.07372
+0.0737701 0.0738202 0.0738704 0.0739205 0.0739707 0.0740209 0.0740711
+0.0741213 0.0741716 0.0742218 0.0742721 0.0743224 0.0743727 0.074423
+0.0744734 0.0745237 0.0745741 0.0746244 0.0746748 0.0747253 0.0747757
+0.0748261 0.0748766 0.0749271 0.0749776 0.0750281 0.0750786 0.0751291
+0.0751797 0.0752302 0.0752808 0.0753314 0.075382 0.0754327 0.0754833
+0.075534 0.0755847 0.0756353 0.0756861 0.0757368 0.0757875 0.0758383
+0.075889 0.0759398 0.0759906 0.0760414 0.0760923 0.0761431 0.076194
+0.0762449 0.0762958 0.0763467 0.0763976 0.0764486 0.0764995 0.0765505
+0.0766015 0.0766525 0.0767035 0.0767545 0.0768056 0.0768567 0.0769077
+0.0769588 0.0770099 0.0770611 0.0771122 0.0771634 0.0772146 0.0772657
+0.0773169 0.0773682 0.0774194 0.0774707 0.0775219 0.0775732 0.0776245
+0.0776758 0.0777272 0.0777785 0.0778299 0.0778812 0.0779326 0.077984
+0.0780355 0.0780869 0.0781384 0.0781898 0.0782413 0.0782928 0.0783443
+0.0783959 0.0784474 0.078499 0.0785506 0.0786022 0.0786538 0.0787054
+0.078757 0.0788087 0.0788604 0.0789121 0.0789638 0.0790155 0.0790672
+0.079119 0.0791707 0.0792225 0.0792743 0.0793261 0.0793779 0.0794298
+0.0794816 0.0795335 0.0795854 0.0796373 0.0796892 0.0797412 0.0797931
+0.0798451 0.0798971 0.0799491 0.0800011 0.0800531 0.0801051 0.0801572
+0.0802093 0.0802614 0.0803135 0.0803656 0.0804177;
+#A 3000 0.0804699 0.080522 0.0805742 0.0806264 0.0806786 0.0807309
+0.0807831 0.0808354 0.0808876 0.0809399 0.0809922 0.0810446 0.0810969
+0.0811493 0.0812016 0.081254 0.0813064 0.0813588 0.0814112 0.0814637
+0.0815161 0.0815686 0.0816211 0.0816736 0.0817261 0.0817787 0.0818312
+0.0818838 0.0819364 0.081989 0.0820416 0.0820942 0.0821469 0.0821995
+0.0822522 0.0823049 0.0823576 0.0824103 0.082463 0.0825158 0.0825686
+0.0826213 0.0826741 0.082727 0.0827798 0.0828326 0.0828855 0.0829384
+0.0829912 0.0830442 0.0830971 0.08315 0.083203 0.0832559 0.0833089
+0.0833619 0.0834149 0.0834679 0.083521 0.083574 0.0836271 0.0836802
+0.0837333 0.0837864 0.0838396 0.0838927 0.0839459 0.0839991 0.0840523
+0.0841055 0.0841587 0.0842119 0.0842652 0.0843185 0.0843718 0.0844251
+0.0844784 0.0845317 0.0845851 0.0846384 0.0846918 0.0847452 0.0847986
+0.084852 0.0849055 0.0849589 0.0850124 0.0850659 0.0851194 0.0851729
+0.0852264 0.08528 0.0853335 0.0853871 0.0854407 0.0854943 0.0855479
+0.0856016 0.0856552 0.0857089 0.0857626 0.0858163 0.08587 0.0859237
+0.0859775 0.0860312 0.086085 0.0861388 0.0861926 0.0862464 0.0863003
+0.0863541 0.086408 0.0864619 0.0865158 0.0865697 0.0866236 0.0866776
+0.0867315 0.0867855 0.0868395 0.0868935 0.0869475 0.0870015 0.0870556
+0.0871096 0.0871637 0.0872178 0.0872719 0.087326 0.0873802 0.0874343
+0.0874885 0.0875427 0.0875969 0.0876511 0.0877054 0.0877596 0.0878139
+0.0878681 0.0879224 0.0879767 0.0880311 0.0880854 0.0881397 0.0881941
+0.0882485 0.0883029 0.0883573 0.0884117 0.0884662 0.0885206 0.0885751
+0.0886296 0.0886841 0.0887386 0.0887932 0.0888477 0.0889023 0.0889568
+0.0890114 0.0890661 0.0891207 0.0891753 0.08923 0.0892846 0.0893393
+0.089394 0.0894487 0.0895035 0.0895582 0.089613 0.0896678 0.0897225
+0.0897774 0.0898322 0.089887 0.0899419 0.0899967 0.0900516 0.0901065
+0.0901614 0.0902163 0.0902713 0.0903262 0.0903812 0.0904362 0.0904912
+0.0905462 0.0906013 0.0906563 0.0907114 0.0907664 0.0908215 0.0908766
+0.0909318 0.0909869 0.091042 0.0910972 0.0911524 0.0912076 0.0912628
+0.091318 0.0913733 0.0914285 0.0914838 0.0915391 0.0915944 0.0916497
+0.091705 0.0917604 0.0918158 0.0918711 0.0919265 0.0919819 0.0920374
+0.0920928 0.0921482 0.0922037 0.0922592 0.0923147 0.0923702 0.0924257
+0.0924813 0.0925368 0.0925924 0.092648 0.0927036 0.0927592 0.0928148
+0.0928705 0.0929262 0.0929818 0.0930375 0.0930932 0.093149 0.0932047
+0.0932604 0.0933162 0.093372 0.0934278 0.0934836 0.0935394 0.0935953
+0.0936511 0.093707 0.0937629 0.0938188 0.0938747 0.0939306 0.0939866
+0.0940425 0.0940985 0.0941545 0.0942105 0.0942665 0.0943226 0.0943786
+0.0944347 0.0944908 0.0945469 0.094603 0.0946591 0.0947152 0.0947714
+0.0948276 0.0948838 0.09494 0.0949962 0.0950524 0.0951086 0.0951649
+0.0952212 0.0952775 0.0953338 0.0953901 0.0954464 0.0955028 0.0955591
+0.0956155 0.0956719 0.0957283 0.0957847 0.0958412 0.0958976 0.0959541
+0.0960106 0.0960671 0.0961236 0.0961801 0.0962367 0.0962932 0.0963498
+0.0964064 0.096463 0.0965196 0.0965762 0.0966329 0.0966895 0.0967462
+0.0968029 0.0968596 0.0969163 0.0969731 0.0970298 0.0970866 0.0971433
+0.0972001 0.097257 0.0973138 0.0973706 0.0974275 0.0974843 0.0975412
+0.0975981 0.097655 0.097712 0.0977689 0.0978259 0.0978828 0.0979398
+0.0979968 0.0980538 0.0981109 0.0981679 0.098225 0.098282 0.0983391
+0.0983962 0.0984534 0.0985105 0.0985676 0.0986248 0.098682 0.0987392
+0.0987964 0.0988536 0.0989108 0.0989681 0.0990254 0.0990826 0.0991399
+0.0991972 0.0992546 0.0993119 0.0993693 0.0994266 0.099484 0.0995414
+0.0995988 0.0996563 0.0997137 0.0997712 0.0998286 0.0998861 0.0999436
+0.100001 0.100059 0.100116 0.100174 0.100231 0.100289 0.100347 0.100404
+0.100462 0.100519 0.100577 0.100635 0.100693 0.10075 0.100808 0.100866
+0.100923 0.100981 0.101039 0.101097 0.101155 0.101212 0.10127 0.101328
+0.101386 0.101444 0.101502 0.10156 0.101618 0.101676 0.101733 0.101791
+0.101849 0.101907 0.101965 0.102024 0.102082 0.10214 0.102198 0.102256
+0.102314 0.102372 0.10243 0.102488 0.102546 0.102605 0.102663 0.102721
+0.102779 0.102837 0.102896 0.102954 0.103012 0.103071 0.103129 0.103187
+0.103246 0.103304 0.103362 0.103421 0.103479 0.103537 0.103596 0.103654
+0.103713 0.103771 0.10383 0.103888 0.103947 0.104005 0.104064 0.104122
+0.104181 0.104239 0.104298 0.104357 0.104415 0.104474 0.104533 0.104591
+0.10465 0.104709 0.104767 0.104826 0.104885 0.104944 0.105002 0.105061
+0.10512 0.105179 0.105238 0.105297 0.105355 0.105414 0.105473 0.105532
+0.105591 0.10565 0.105709 0.105768 0.105827 0.105886 0.105945 0.106004
+0.106063 0.106122 0.106181 0.10624 0.106299 0.106358 0.106417 0.106476
+0.106536 0.106595 0.106654 0.106713 0.106772 0.106832 0.106891 0.10695
+0.107009 0.107069 0.107128 0.107187 0.107247 0.107306 0.107365 0.107425
+0.107484 0.107543 0.107603 0.107662 0.107722 0.107781 0.107841 0.1079
+0.10796 0.108019 0.108079 0.108138 0.108198 0.108257 0.108317 0.108376
+0.108436 0.108496 0.108555 0.108615 0.108675 0.108734 0.108794 0.108854
+0.108914 0.108973 0.109033 0.109093 0.109153 0.109212 0.109272 0.109332
+0.109392 0.109452 0.109512 0.109571 0.109631 0.109691 0.109751 0.109811
+0.109871 0.109931 0.109991 0.110051 0.110111 0.110171 0.110231 0.110291
+0.110351 0.110411 0.110472 0.110532 0.110592 0.110652 0.110712 0.110772
+0.110832 0.110893 0.110953 0.111013 0.111073 0.111134 0.111194 0.111254
+0.111314 0.111375 0.111435 0.111495 0.111556 0.111616 0.111677 0.111737
+0.111797 0.111858 0.111918 0.111979 0.112039 0.1121 0.11216 0.112221
+0.112281 0.112342 0.112402 0.112463 0.112523 0.112584 0.112645 0.112705
+0.112766 0.112827 0.112887 0.112948 0.113009 0.113069 0.11313 0.113191
+0.113252 0.113312 0.113373 0.113434 0.113495 0.113556 0.113616 0.113677
+0.113738 0.113799 0.11386 0.113921 0.113982 0.114043 0.114104 0.114165
+0.114226 0.114287 0.114348 0.114409 0.11447 0.114531 0.114592 0.114653
+0.114714 0.114775 0.114836 0.114897 0.114959 0.11502 0.115081 0.115142
+0.115203 0.115265 0.115326 0.115387 0.115448 0.11551 0.115571 0.115632
+0.115694 0.115755 0.115816 0.115878 0.115939 0.116 0.116062 0.116123
+0.116185 0.116246 0.116308 0.116369 0.116431 0.116492 0.116554 0.116615
+0.116677 0.116738 0.1168 0.116861 0.116923 0.116985 0.117046 0.117108
+0.11717 0.117231 0.117293 0.117355 0.117416 0.117478 0.11754 0.117602
+0.117663 0.117725 0.117787 0.117849 0.117911 0.117972 0.118034 0.118096
+0.118158 0.11822 0.118282 0.118344 0.118406 0.118468 0.11853 0.118592
+0.118654 0.118716 0.118778 0.11884 0.118902 0.118964 0.119026 0.119088
+0.11915 0.119212 0.119274 0.119337 0.119399 0.119461 0.119523 0.119585
+0.119648 0.11971 0.119772 0.119834 0.119897 0.119959 0.120021 0.120084
+0.120146 0.120208 0.120271 0.120333 0.120395 0.120458 0.12052 0.120583
+0.120645 0.120708 0.12077 0.120833 0.120895 0.120958 0.12102 0.121083
+0.121145 0.121208 0.12127 0.121333 0.121396 0.121458 0.121521 0.121584
+0.121646 0.121709 0.121772 0.121834 0.121897 0.12196 0.122022 0.122085
+0.122148 0.122211 0.122274 0.122336 0.122399 0.122462 0.122525 0.122588
+0.122651 0.122714 0.122777 0.12284 0.122903 0.122965 0.123028 0.123091
+0.123154 0.123217 0.12328 0.123344 0.123407 0.12347 0.123533 0.123596
+0.123659 0.123722 0.123785 0.123848 0.123912 0.123975 0.124038 0.124101
+0.124164 0.124228 0.124291 0.124354 0.124417 0.124481 0.124544 0.124607
+0.124671 0.124734 0.124797 0.124861 0.124924 0.124988 0.125051 0.125114
+0.125178 0.125241 0.125305 0.125368 0.125432 0.125495 0.125559 0.125622
+0.125686 0.12575 0.125813 0.125877 0.12594 0.126004 0.126068 0.126131
+0.126195 0.126259 0.126322 0.126386 0.12645 0.126513 0.126577 0.126641
+0.126705 0.126769 0.126832 0.126896 0.12696 0.127024 0.127088 0.127152
+0.127215 0.127279 0.127343 0.127407 0.127471 0.127535 0.127599 0.127663
+0.127727 0.127791 0.127855 0.127919 0.127983 0.128047 0.128111 0.128175
+0.128239 0.128304 0.128368 0.128432 0.128496 0.12856 0.128624 0.128689
+0.128753 0.128817 0.128881 0.128946 0.12901 0.129074 0.129138 0.129203
+0.129267 0.129331 0.129396 0.12946 0.129524 0.129589 0.129653 0.129718
+0.129782 0.129847 0.129911 0.129975 0.13004 0.130104 0.130169 0.130233
+0.130298 0.130363 0.130427 0.130492 0.130556 0.130621 0.130686 0.13075
+0.130815 0.13088 0.130944 0.131009 0.131074 0.131138 0.131203 0.131268
+0.131333 0.131397 0.131462 0.131527 0.131592 0.131657 0.131721 0.131786
+0.131851 0.131916 0.131981 0.132046 0.132111 0.132176 0.132241 0.132306
+0.132371 0.132436 0.132501 0.132566 0.132631 0.132696 0.132761 0.132826
+0.132891 0.132956 0.133021 0.133086 0.133151 0.133216 0.133282 0.133347
+0.133412 0.133477 0.133542 0.133608 0.133673 0.133738 0.133803 0.133869
+0.133934 0.133999 0.134065 0.13413 0.134195 0.134261 0.134326 0.134391
+0.134457 0.134522 0.134588 0.134653 0.134719 0.134784 0.13485 0.134915
+0.134981 0.135046 0.135112 0.135177 0.135243 0.135308 0.135374 0.13544
+0.135505 0.135571 0.135636 0.135702 0.135768 0.135833 0.135899 0.135965
+0.136031 0.136096 0.136162 0.136228 0.136294 0.136359 0.136425 0.136491
+0.136557 0.136623 0.136689 0.136755 0.13682 0.136886 0.136952 0.137018
+0.137084 0.13715 0.137216 0.137282 0.137348 0.137414 0.13748 0.137546
+0.137612 0.137678 0.137744 0.13781 0.137876 0.137943 0.138009 0.138075
+0.138141 0.138207 0.138273 0.13834 0.138406 0.138472 0.138538 0.138604
+0.138671 0.138737 0.138803 0.13887 0.138936 0.139002 0.139069 0.139135
+0.139201 0.139268 0.139334 0.1394 0.139467 0.139533 0.1396 0.139666
+0.139733 0.139799 0.139866 0.139932;
+#A 4000 0.139999 0.140065 0.140132 0.140198 0.140265 0.140332 0.140398
+0.140465 0.140531 0.140598 0.140665 0.140731 0.140798 0.140865 0.140932
+0.140998 0.141065 0.141132 0.141199 0.141265 0.141332 0.141399 0.141466
+0.141533 0.141599 0.141666 0.141733 0.1418 0.141867 0.141934 0.142001
+0.142068 0.142135 0.142202 0.142269 0.142336 0.142403 0.14247 0.142537
+0.142604 0.142671 0.142738 0.142805 0.142872 0.142939 0.143006 0.143073
+0.14314 0.143208 0.143275 0.143342 0.143409 0.143476 0.143544 0.143611
+0.143678 0.143745 0.143813 0.14388 0.143947 0.144015 0.144082 0.144149
+0.144217 0.144284 0.144351 0.144419 0.144486 0.144554 0.144621 0.144688
+0.144756 0.144823 0.144891 0.144958 0.145026 0.145093 0.145161 0.145228
+0.145296 0.145364 0.145431 0.145499 0.145566 0.145634 0.145702 0.145769
+0.145837 0.145905 0.145972 0.14604 0.146108 0.146176 0.146243 0.146311
+0.146379 0.146447 0.146514 0.146582 0.14665 0.146718 0.146786 0.146854
+0.146921 0.146989 0.147057 0.147125 0.147193 0.147261 0.147329 0.147397
+0.147465 0.147533 0.147601 0.147669 0.147737 0.147805 0.147873 0.147941
+0.148009 0.148077 0.148145 0.148214 0.148282 0.14835 0.148418 0.148486
+0.148554 0.148623 0.148691 0.148759 0.148827 0.148896 0.148964 0.149032
+0.1491 0.149169 0.149237 0.149305 0.149374 0.149442 0.14951 0.149579
+0.149647 0.149716 0.149784 0.149852 0.149921 0.149989 0.150058 0.150126
+0.150195 0.150263 0.150332 0.1504 0.150469 0.150538 0.150606 0.150675
+0.150743 0.150812 0.150881 0.150949 0.151018 0.151086 0.151155 0.151224
+0.151293 0.151361 0.15143 0.151499 0.151567 0.151636 0.151705 0.151774
+0.151843 0.151911 0.15198 0.152049 0.152118 0.152187 0.152256 0.152325
+0.152394 0.152462 0.152531 0.1526 0.152669 0.152738 0.152807 0.152876
+0.152945 0.153014 0.153083 0.153152 0.153221 0.15329 0.15336 0.153429
+0.153498 0.153567 0.153636 0.153705 0.153774 0.153844 0.153913 0.153982
+0.154051 0.15412 0.15419 0.154259 0.154328 0.154397 0.154467 0.154536
+0.154605 0.154675 0.154744 0.154813 0.154883 0.154952 0.155021 0.155091
+0.15516 0.15523 0.155299 0.155369 0.155438 0.155508 0.155577 0.155647
+0.155716 0.155786 0.155855 0.155925 0.155994 0.156064 0.156133 0.156203
+0.156273 0.156342 0.156412 0.156482 0.156551 0.156621 0.156691 0.15676
+0.15683 0.1569 0.15697 0.157039 0.157109 0.157179 0.157249 0.157319
+0.157388 0.157458 0.157528 0.157598 0.157668 0.157738 0.157808 0.157877
+0.157947 0.158017 0.158087 0.158157 0.158227 0.158297 0.158367 0.158437
+0.158507 0.158577 0.158647 0.158717 0.158787 0.158857 0.158928 0.158998
+0.159068 0.159138 0.159208 0.159278 0.159348 0.159419 0.159489 0.159559
+0.159629 0.159699 0.15977 0.15984 0.15991 0.159981 0.160051 0.160121
+0.160192 0.160262 0.160332 0.160403 0.160473 0.160543 0.160614 0.160684
+0.160755 0.160825 0.160895 0.160966 0.161036 0.161107 0.161177 0.161248
+0.161318 0.161389 0.161459 0.16153 0.161601 0.161671 0.161742 0.161812
+0.161883 0.161954 0.162024 0.162095 0.162166 0.162236 0.162307 0.162378
+0.162448 0.162519 0.16259 0.162661 0.162731 0.162802 0.162873 0.162944
+0.163015 0.163086 0.163156 0.163227 0.163298 0.163369 0.16344 0.163511
+0.163582 0.163653 0.163724 0.163795 0.163865 0.163936 0.164007 0.164078
+0.164149 0.164221 0.164292 0.164363 0.164434 0.164505 0.164576 0.164647
+0.164718 0.164789 0.16486 0.164932 0.165003 0.165074 0.165145 0.165216
+0.165287 0.165359 0.16543 0.165501 0.165572 0.165644 0.165715 0.165786
+0.165858 0.165929 0.166 0.166072 0.166143 0.166214 0.166286 0.166357
+0.166429 0.1665 0.166571 0.166643 0.166714 0.166786 0.166857 0.166929
+0.167 0.167072 0.167143 0.167215 0.167287 0.167358 0.16743 0.167501
+0.167573 0.167645 0.167716 0.167788 0.167859 0.167931 0.168003 0.168074
+0.168146 0.168218 0.16829 0.168361 0.168433 0.168505 0.168577 0.168648
+0.16872 0.168792 0.168864 0.168936 0.169008 0.169079 0.169151 0.169223
+0.169295 0.169367 0.169439 0.169511 0.169583 0.169655 0.169727 0.169799
+0.169871 0.169943 0.170015 0.170087 0.170159 0.170231 0.170303 0.170375
+0.170447 0.170519 0.170591 0.170664 0.170736 0.170808 0.17088 0.170952
+0.171024 0.171097 0.171169 0.171241 0.171313 0.171386 0.171458 0.17153
+0.171602 0.171675 0.171747 0.171819 0.171892 0.171964 0.172036 0.172109
+0.172181 0.172254 0.172326 0.172398 0.172471 0.172543 0.172616 0.172688
+0.172761 0.172833 0.172906 0.172978 0.173051 0.173123 0.173196 0.173268
+0.173341 0.173414 0.173486 0.173559 0.173631 0.173704 0.173777 0.173849
+0.173922 0.173995 0.174067 0.17414 0.174213 0.174286 0.174358 0.174431
+0.174504 0.174577 0.174649 0.174722 0.174795 0.174868 0.174941 0.175014
+0.175086 0.175159 0.175232 0.175305 0.175378 0.175451 0.175524 0.175597
+0.17567 0.175743 0.175816 0.175889 0.175962 0.176035 0.176108 0.176181
+0.176254 0.176327 0.1764 0.176473 0.176546 0.176619 0.176693 0.176766
+0.176839 0.176912 0.176985 0.177058 0.177132 0.177205 0.177278 0.177351
+0.177424 0.177498 0.177571 0.177644 0.177718 0.177791 0.177864 0.177938
+0.178011 0.178084 0.178158 0.178231 0.178304 0.178378 0.178451 0.178525
+0.178598 0.178671 0.178745 0.178818 0.178892 0.178965 0.179039 0.179112
+0.179186 0.179259 0.179333 0.179407 0.17948 0.179554 0.179627 0.179701
+0.179775 0.179848 0.179922 0.179996 0.180069 0.180143 0.180217 0.18029
+0.180364 0.180438 0.180512 0.180585 0.180659 0.180733 0.180807 0.18088
+0.180954 0.181028 0.181102 0.181176 0.18125 0.181323 0.181397 0.181471
+0.181545 0.181619 0.181693 0.181767 0.181841 0.181915 0.181989 0.182063
+0.182137 0.182211 0.182285 0.182359 0.182433 0.182507 0.182581 0.182655
+0.182729 0.182803 0.182877 0.182952 0.183026 0.1831 0.183174 0.183248
+0.183322 0.183397 0.183471 0.183545 0.183619 0.183694 0.183768 0.183842
+0.183916 0.183991 0.184065 0.184139 0.184214 0.184288 0.184362 0.184437
+0.184511 0.184585 0.18466 0.184734 0.184809 0.184883 0.184957 0.185032
+0.185106 0.185181 0.185255 0.18533 0.185404 0.185479 0.185553 0.185628
+0.185703 0.185777 0.185852 0.185926 0.186001 0.186076 0.18615 0.186225
+0.186299 0.186374 0.186449 0.186523 0.186598 0.186673 0.186748 0.186822
+0.186897 0.186972 0.187047 0.187121 0.187196 0.187271 0.187346 0.187421
+0.187495 0.18757 0.187645 0.18772 0.187795 0.18787 0.187945 0.18802
+0.188094 0.188169 0.188244 0.188319 0.188394 0.188469 0.188544 0.188619
+0.188694 0.188769 0.188844 0.188919 0.188995 0.18907 0.189145 0.18922
+0.189295 0.18937 0.189445 0.18952 0.189595 0.189671 0.189746 0.189821
+0.189896 0.189971 0.190047 0.190122 0.190197 0.190272 0.190348 0.190423
+0.190498 0.190573 0.190649 0.190724 0.190799 0.190875 0.19095 0.191026
+0.191101 0.191176 0.191252 0.191327 0.191403 0.191478 0.191553 0.191629
+0.191704 0.19178 0.191855 0.191931 0.192006 0.192082 0.192158 0.192233
+0.192309 0.192384 0.19246 0.192535 0.192611 0.192687 0.192762 0.192838
+0.192914 0.192989 0.193065 0.193141 0.193216 0.193292 0.193368 0.193443
+0.193519 0.193595 0.193671 0.193747 0.193822 0.193898 0.193974 0.19405
+0.194126 0.194201 0.194277 0.194353 0.194429 0.194505 0.194581 0.194657
+0.194733 0.194809 0.194885 0.194961 0.195036 0.195112 0.195188 0.195264
+0.19534 0.195416 0.195493 0.195569 0.195645 0.195721 0.195797 0.195873
+0.195949 0.196025 0.196101 0.196177 0.196254 0.19633 0.196406 0.196482
+0.196558 0.196634 0.196711 0.196787 0.196863 0.196939 0.197016 0.197092
+0.197168 0.197244 0.197321 0.197397 0.197473 0.19755 0.197626 0.197702
+0.197779 0.197855 0.197932 0.198008 0.198084 0.198161 0.198237 0.198314
+0.19839 0.198467 0.198543 0.19862 0.198696 0.198773 0.198849 0.198926
+0.199002 0.199079 0.199155 0.199232 0.199309 0.199385 0.199462 0.199538
+0.199615 0.199692 0.199768 0.199845 0.199922 0.199998 0.200075 0.200152
+0.200229 0.200305 0.200382 0.200459 0.200536 0.200612 0.200689 0.200766
+0.200843 0.20092 0.200996 0.201073 0.20115 0.201227 0.201304 0.201381
+0.201458 0.201535 0.201612 0.201688 0.201765 0.201842 0.201919 0.201996
+0.202073 0.20215 0.202227 0.202304 0.202381 0.202458 0.202536 0.202613
+0.20269 0.202767 0.202844 0.202921 0.202998 0.203075 0.203152 0.20323
+0.203307 0.203384 0.203461 0.203538 0.203615 0.203693 0.20377 0.203847
+0.203924 0.204002 0.204079 0.204156 0.204234 0.204311 0.204388 0.204465
+0.204543 0.20462 0.204698 0.204775 0.204852 0.20493 0.205007 0.205084
+0.205162 0.205239 0.205317 0.205394 0.205472 0.205549 0.205627 0.205704
+0.205782 0.205859 0.205937 0.206014 0.206092 0.206169 0.206247 0.206325
+0.206402 0.20648 0.206557 0.206635 0.206713 0.20679 0.206868 0.206946
+0.207023 0.207101 0.207179 0.207256 0.207334 0.207412 0.20749 0.207567
+0.207645 0.207723 0.207801 0.207879 0.207956 0.208034 0.208112 0.20819
+0.208268 0.208346 0.208424 0.208501 0.208579 0.208657 0.208735 0.208813
+0.208891 0.208969 0.209047 0.209125 0.209203 0.209281 0.209359 0.209437
+0.209515 0.209593 0.209671 0.209749 0.209827 0.209905 0.209983 0.210061
+0.21014 0.210218 0.210296 0.210374 0.210452 0.21053 0.210608 0.210687
+0.210765 0.210843 0.210921 0.211 0.211078 0.211156 0.211234 0.211313
+0.211391 0.211469 0.211547 0.211626 0.211704 0.211782 0.211861 0.211939
+0.212018 0.212096 0.212174 0.212253 0.212331 0.21241 0.212488 0.212566
+0.212645;
+#A 5000 0.212723 0.212802 0.21288 0.212959 0.213037 0.213116 0.213194
+0.213273 0.213351 0.21343 0.213509 0.213587 0.213666 0.213744 0.213823
+0.213902 0.21398 0.214059 0.214137 0.214216 0.214295 0.214374 0.214452
+0.214531 0.21461 0.214688 0.214767 0.214846 0.214925 0.215003 0.215082
+0.215161 0.21524 0.215319 0.215397 0.215476 0.215555 0.215634 0.215713
+0.215792 0.215871 0.215949 0.216028 0.216107 0.216186 0.216265 0.216344
+0.216423 0.216502 0.216581 0.21666 0.216739 0.216818 0.216897 0.216976
+0.217055 0.217134 0.217213 0.217292 0.217371 0.21745 0.21753 0.217609
+0.217688 0.217767 0.217846 0.217925 0.218004 0.218084 0.218163 0.218242
+0.218321 0.2184 0.21848 0.218559 0.218638 0.218717 0.218797 0.218876
+0.218955 0.219034 0.219114 0.219193 0.219272 0.219352 0.219431 0.21951
+0.21959 0.219669 0.219749 0.219828 0.219907 0.219987 0.220066 0.220146
+0.220225 0.220305 0.220384 0.220464 0.220543 0.220623 0.220702 0.220782
+0.220861 0.220941 0.22102 0.2211 0.221179 0.221259 0.221339 0.221418
+0.221498 0.221577 0.221657 0.221737 0.221816 0.221896 0.221976 0.222055
+0.222135 0.222215 0.222295 0.222374 0.222454 0.222534 0.222614 0.222693
+0.222773 0.222853 0.222933 0.223013 0.223092 0.223172 0.223252 0.223332
+0.223412 0.223492 0.223572 0.223651 0.223731 0.223811 0.223891 0.223971
+0.224051 0.224131 0.224211 0.224291 0.224371 0.224451 0.224531 0.224611
+0.224691 0.224771 0.224851 0.224931 0.225011 0.225091 0.225171 0.225251
+0.225332 0.225412 0.225492 0.225572 0.225652 0.225732 0.225812 0.225893
+0.225973 0.226053 0.226133 0.226213 0.226294 0.226374 0.226454 0.226534
+0.226615 0.226695 0.226775 0.226856 0.226936 0.227016 0.227096 0.227177
+0.227257 0.227338 0.227418 0.227498 0.227579 0.227659 0.227739 0.22782
+0.2279 0.227981 0.228061 0.228142 0.228222 0.228303 0.228383 0.228464
+0.228544 0.228625 0.228705 0.228786 0.228866 0.228947 0.229027 0.229108
+0.229189 0.229269 0.22935 0.22943 0.229511 0.229592 0.229672 0.229753
+0.229834 0.229914 0.229995 0.230076 0.230156 0.230237 0.230318 0.230399
+0.230479 0.23056 0.230641 0.230722 0.230802 0.230883 0.230964 0.231045
+0.231126 0.231206 0.231287 0.231368 0.231449 0.23153 0.231611 0.231692
+0.231773 0.231854 0.231934 0.232015 0.232096 0.232177 0.232258 0.232339
+0.23242 0.232501 0.232582 0.232663 0.232744 0.232825 0.232906 0.232987
+0.233068 0.233149 0.233231 0.233312 0.233393 0.233474 0.233555 0.233636
+0.233717 0.233798 0.23388 0.233961 0.234042 0.234123 0.234204 0.234286
+0.234367 0.234448 0.234529 0.23461 0.234692 0.234773 0.234854 0.234936
+0.235017 0.235098 0.235179 0.235261 0.235342 0.235424 0.235505 0.235586
+0.235668 0.235749 0.23583 0.235912 0.235993 0.236075 0.236156 0.236238
+0.236319 0.2364 0.236482 0.236563 0.236645 0.236726 0.236808 0.236889
+0.236971 0.237052 0.237134 0.237216 0.237297 0.237379 0.23746 0.237542
+0.237624 0.237705 0.237787 0.237868 0.23795 0.238032 0.238113 0.238195
+0.238277 0.238358 0.23844 0.238522 0.238604 0.238685 0.238767 0.238849
+0.238931 0.239012 0.239094 0.239176 0.239258 0.23934 0.239421 0.239503
+0.239585 0.239667 0.239749 0.239831 0.239912 0.239994 0.240076 0.240158
+0.24024 0.240322 0.240404 0.240486 0.240568 0.24065 0.240732 0.240814
+0.240896 0.240978 0.24106 0.241142 0.241224 0.241306 0.241388 0.24147
+0.241552 0.241634 0.241716 0.241798 0.24188 0.241963 0.242045 0.242127
+0.242209 0.242291 0.242373 0.242455 0.242538 0.24262 0.242702 0.242784
+0.242866 0.242949 0.243031 0.243113 0.243195 0.243278 0.24336 0.243442
+0.243524 0.243607 0.243689 0.243771 0.243854 0.243936 0.244018 0.244101
+0.244183 0.244266 0.244348 0.24443 0.244513 0.244595 0.244678 0.24476
+0.244842 0.244925 0.245007 0.24509 0.245172 0.245255 0.245337 0.24542
+0.245502 0.245585 0.245667 0.24575 0.245833 0.245915 0.245998 0.24608
+0.246163 0.246246 0.246328 0.246411 0.246493 0.246576 0.246659 0.246741
+0.246824 0.246907 0.246989 0.247072 0.247155 0.247237 0.24732 0.247403
+0.247486 0.247568 0.247651 0.247734 0.247817 0.2479 0.247982 0.248065
+0.248148 0.248231 0.248314 0.248396 0.248479 0.248562 0.248645 0.248728
+0.248811 0.248894 0.248977 0.24906 0.249143 0.249225 0.249308 0.249391
+0.249474 0.249557 0.24964 0.249723 0.249806 0.249889 0.249972 0.250055
+0.250138 0.250221 0.250304 0.250388 0.250471 0.250554 0.250637 0.25072
+0.250803 0.250886 0.250969 0.251052 0.251136 0.251219 0.251302 0.251385
+0.251468 0.251551 0.251635 0.251718 0.251801 0.251884 0.251968 0.252051
+0.252134 0.252217 0.252301 0.252384 0.252467 0.252551 0.252634 0.252717
+0.2528 0.252884 0.252967 0.253051 0.253134 0.253217 0.253301 0.253384
+0.253468 0.253551 0.253634 0.253718 0.253801 0.253885 0.253968 0.254052
+0.254135 0.254219 0.254302 0.254386 0.254469 0.254553 0.254636 0.25472
+0.254803 0.254887 0.25497 0.255054 0.255138 0.255221 0.255305 0.255388
+0.255472 0.255556 0.255639 0.255723 0.255807 0.25589 0.255974 0.256058
+0.256141 0.256225 0.256309 0.256392 0.256476 0.25656 0.256644 0.256727
+0.256811 0.256895 0.256979 0.257062 0.257146 0.25723 0.257314 0.257398
+0.257482 0.257565 0.257649 0.257733 0.257817 0.257901 0.257985 0.258069
+0.258153 0.258236 0.25832 0.258404 0.258488 0.258572 0.258656 0.25874
+0.258824 0.258908 0.258992 0.259076 0.25916 0.259244 0.259328 0.259412
+0.259496 0.25958 0.259664 0.259748 0.259833 0.259917 0.260001 0.260085
+0.260169 0.260253 0.260337 0.260421 0.260506 0.26059 0.260674 0.260758
+0.260842 0.260926 0.261011 0.261095 0.261179 0.261263 0.261348 0.261432
+0.261516 0.2616 0.261685 0.261769 0.261853 0.261938 0.262022 0.262106
+0.262191 0.262275 0.262359 0.262444 0.262528 0.262612 0.262697 0.262781
+0.262865 0.26295 0.263034 0.263119 0.263203 0.263288 0.263372 0.263457
+0.263541 0.263625 0.26371 0.263794 0.263879 0.263963 0.264048 0.264133
+0.264217 0.264302 0.264386 0.264471 0.264555 0.26464 0.264724 0.264809
+0.264894 0.264978 0.265063 0.265148 0.265232 0.265317 0.265402 0.265486
+0.265571 0.265656 0.26574 0.265825 0.26591 0.265994 0.266079 0.266164
+0.266249 0.266333 0.266418 0.266503 0.266588 0.266672 0.266757 0.266842
+0.266927 0.267012 0.267097 0.267181 0.267266 0.267351 0.267436 0.267521
+0.267606 0.267691 0.267776 0.26786 0.267945 0.26803 0.268115 0.2682
+0.268285 0.26837 0.268455 0.26854 0.268625 0.26871 0.268795 0.26888
+0.268965 0.26905 0.269135 0.26922 0.269305 0.26939 0.269475 0.26956
+0.269646 0.269731 0.269816 0.269901 0.269986 0.270071 0.270156 0.270241
+0.270327 0.270412 0.270497 0.270582 0.270667 0.270752 0.270838 0.270923
+0.271008 0.271093 0.271179 0.271264 0.271349 0.271434 0.27152 0.271605
+0.27169 0.271776 0.271861 0.271946 0.272031 0.272117 0.272202 0.272287
+0.272373 0.272458 0.272544 0.272629 0.272714 0.2728 0.272885 0.272971
+0.273056 0.273141 0.273227 0.273312 0.273398 0.273483 0.273569 0.273654
+0.27374 0.273825 0.273911 0.273996 0.274082 0.274167 0.274253 0.274338
+0.274424 0.27451 0.274595 0.274681 0.274766 0.274852 0.274937 0.275023
+0.275109 0.275194 0.27528 0.275366 0.275451 0.275537 0.275623 0.275708
+0.275794 0.27588 0.275965 0.276051 0.276137 0.276223 0.276308 0.276394
+0.27648 0.276566 0.276651 0.276737 0.276823 0.276909 0.276995 0.27708
+0.277166 0.277252 0.277338 0.277424 0.27751 0.277595 0.277681 0.277767
+0.277853 0.277939 0.278025 0.278111 0.278197 0.278283 0.278369 0.278454
+0.27854 0.278626 0.278712 0.278798 0.278884 0.27897 0.279056 0.279142
+0.279228 0.279314 0.2794 0.279486 0.279572 0.279659 0.279745 0.279831
+0.279917 0.280003 0.280089 0.280175 0.280261 0.280347 0.280433 0.28052
+0.280606 0.280692 0.280778 0.280864 0.28095 0.281037 0.281123 0.281209
+0.281295 0.281381 0.281468 0.281554 0.28164 0.281726 0.281813 0.281899
+0.281985 0.282071 0.282158 0.282244 0.28233 0.282417 0.282503 0.282589
+0.282676 0.282762 0.282848 0.282935 0.283021 0.283107 0.283194 0.28328
+0.283367 0.283453 0.28354 0.283626 0.283712 0.283799 0.283885 0.283972
+0.284058 0.284145 0.284231 0.284318 0.284404 0.284491 0.284577 0.284664
+0.28475 0.284837 0.284923 0.28501 0.285096 0.285183 0.28527 0.285356
+0.285443 0.285529 0.285616 0.285703 0.285789 0.285876 0.285962 0.286049
+0.286136 0.286222 0.286309 0.286396 0.286482 0.286569 0.286656 0.286743
+0.286829 0.286916 0.287003 0.28709 0.287176 0.287263 0.28735 0.287437
+0.287523 0.28761 0.287697 0.287784 0.287871 0.287957 0.288044 0.288131
+0.288218 0.288305 0.288392 0.288478 0.288565 0.288652 0.288739 0.288826
+0.288913 0.289 0.289087 0.289174 0.289261 0.289348 0.289435 0.289522
+0.289608 0.289695 0.289782 0.289869 0.289956 0.290043 0.29013 0.290217
+0.290305 0.290392 0.290479 0.290566 0.290653 0.29074 0.290827 0.290914
+0.291001 0.291088 0.291175 0.291262 0.29135 0.291437 0.291524 0.291611
+0.291698 0.291785 0.291872 0.29196 0.292047 0.292134 0.292221 0.292308
+0.292396 0.292483 0.29257 0.292657 0.292744 0.292832 0.292919 0.293006
+0.293094 0.293181 0.293268 0.293355 0.293443 0.29353 0.293617 0.293705
+0.293792 0.293879 0.293967 0.294054 0.294141 0.294229 0.294316 0.294404
+0.294491 0.294578 0.294666 0.294753 0.294841 0.294928 0.295016 0.295103
+0.29519 0.295278 0.295365 0.295453 0.29554 0.295628 0.295715 0.295803
+0.29589;
+#A 6000 0.295978 0.296065 0.296153 0.296241 0.296328 0.296416 0.296503
+0.296591 0.296678 0.296766 0.296854 0.296941 0.297029 0.297116 0.297204
+0.297292 0.297379 0.297467 0.297555 0.297642 0.29773 0.297818 0.297905
+0.297993 0.298081 0.298168 0.298256 0.298344 0.298432 0.298519 0.298607
+0.298695 0.298783 0.29887 0.298958 0.299046 0.299134 0.299222 0.299309
+0.299397 0.299485 0.299573 0.299661 0.299749 0.299836 0.299924 0.300012
+0.3001 0.300188 0.300276 0.300364 0.300452 0.300539 0.300627 0.300715
+0.300803 0.300891 0.300979 0.301067 0.301155 0.301243 0.301331 0.301419
+0.301507 0.301595 0.301683 0.301771 0.301859 0.301947 0.302035 0.302123
+0.302211 0.302299 0.302387 0.302475 0.302563 0.302652 0.30274 0.302828
+0.302916 0.303004 0.303092 0.30318 0.303268 0.303357 0.303445 0.303533
+0.303621 0.303709 0.303797 0.303886 0.303974 0.304062 0.30415 0.304238
+0.304327 0.304415 0.304503 0.304591 0.30468 0.304768 0.304856 0.304944
+0.305033 0.305121 0.305209 0.305298 0.305386 0.305474 0.305562 0.305651
+0.305739 0.305827 0.305916 0.306004 0.306093 0.306181 0.306269 0.306358
+0.306446 0.306534 0.306623 0.306711 0.3068 0.306888 0.306977 0.307065
+0.307154 0.307242 0.30733 0.307419 0.307507 0.307596 0.307684 0.307773
+0.307861 0.30795 0.308038 0.308127 0.308215 0.308304 0.308393 0.308481
+0.30857 0.308658 0.308747 0.308835 0.308924 0.309013 0.309101 0.30919
+0.309278 0.309367 0.309456 0.309544 0.309633 0.309722 0.30981 0.309899
+0.309988 0.310076 0.310165 0.310254 0.310342 0.310431 0.31052 0.310609
+0.310697 0.310786 0.310875 0.310964 0.311052 0.311141 0.31123 0.311319
+0.311408 0.311496 0.311585 0.311674 0.311763 0.311852 0.31194 0.312029
+0.312118 0.312207 0.312296 0.312385 0.312474 0.312562 0.312651 0.31274
+0.312829 0.312918 0.313007 0.313096 0.313185 0.313274 0.313363 0.313452
+0.313541 0.313629 0.313718 0.313807 0.313896 0.313985 0.314074 0.314163
+0.314252 0.314341 0.31443 0.314519 0.314608 0.314698 0.314787 0.314876
+0.314965 0.315054 0.315143 0.315232 0.315321 0.31541 0.315499 0.315588
+0.315677 0.315767 0.315856 0.315945 0.316034 0.316123 0.316212 0.316301
+0.316391 0.31648 0.316569 0.316658 0.316747 0.316837 0.316926 0.317015
+0.317104 0.317194 0.317283 0.317372 0.317461 0.317551 0.31764 0.317729
+0.317818 0.317908 0.317997 0.318086 0.318175 0.318265 0.318354 0.318443
+0.318533 0.318622 0.318711 0.318801 0.31889 0.31898 0.319069 0.319158
+0.319248 0.319337 0.319427 0.319516 0.319605 0.319695 0.319784 0.319874
+0.319963 0.320052 0.320142 0.320231 0.320321 0.32041 0.3205 0.320589
+0.320679 0.320768 0.320858 0.320947 0.321037 0.321126 0.321216 0.321305
+0.321395 0.321485 0.321574 0.321664 0.321753 0.321843 0.321932 0.322022
+0.322112 0.322201 0.322291 0.32238 0.32247 0.32256 0.322649 0.322739
+0.322829 0.322918 0.323008 0.323098 0.323187 0.323277 0.323367 0.323456
+0.323546 0.323636 0.323725 0.323815 0.323905 0.323995 0.324084 0.324174
+0.324264 0.324354 0.324443 0.324533 0.324623 0.324713 0.324803 0.324892
+0.324982 0.325072 0.325162 0.325252 0.325341 0.325431 0.325521 0.325611
+0.325701 0.325791 0.325881 0.32597 0.32606 0.32615 0.32624 0.32633
+0.32642 0.32651 0.3266 0.32669 0.32678 0.32687 0.326959 0.327049 0.327139
+0.327229 0.327319 0.327409 0.327499 0.327589 0.327679 0.327769 0.327859
+0.327949 0.328039 0.328129 0.328219 0.328309 0.328399 0.32849 0.32858
+0.32867 0.32876 0.32885 0.32894 0.32903 0.32912 0.32921 0.3293 0.32939
+0.329481 0.329571 0.329661 0.329751 0.329841 0.329931 0.330021 0.330112
+0.330202 0.330292 0.330382 0.330472 0.330562 0.330653 0.330743 0.330833
+0.330923 0.331014 0.331104 0.331194 0.331284 0.331375 0.331465 0.331555
+0.331645 0.331736 0.331826 0.331916 0.332006 0.332097 0.332187 0.332277
+0.332368 0.332458 0.332548 0.332639 0.332729 0.332819 0.33291 0.333
+0.333091 0.333181 0.333271 0.333362 0.333452 0.333542 0.333633 0.333723
+0.333814 0.333904 0.333995 0.334085 0.334175 0.334266 0.334356 0.334447
+0.334537 0.334628 0.334718 0.334809 0.334899 0.33499 0.33508 0.335171
+0.335261 0.335352 0.335442 0.335533 0.335623 0.335714 0.335805 0.335895
+0.335986 0.336076 0.336167 0.336257 0.336348 0.336439 0.336529 0.33662
+0.33671 0.336801 0.336892 0.336982 0.337073 0.337164 0.337254 0.337345
+0.337436 0.337526 0.337617 0.337708 0.337798 0.337889 0.33798 0.33807
+0.338161 0.338252 0.338342 0.338433 0.338524 0.338615 0.338705 0.338796
+0.338887 0.338978 0.339068 0.339159 0.33925 0.339341 0.339432 0.339522
+0.339613 0.339704 0.339795 0.339886 0.339976 0.340067 0.340158 0.340249
+0.34034 0.340431 0.340522 0.340612 0.340703 0.340794 0.340885 0.340976
+0.341067 0.341158 0.341249 0.34134 0.341431 0.341521 0.341612 0.341703
+0.341794 0.341885 0.341976 0.342067 0.342158 0.342249 0.34234 0.342431
+0.342522 0.342613 0.342704 0.342795 0.342886 0.342977 0.343068 0.343159
+0.34325 0.343341 0.343432 0.343523 0.343614 0.343705 0.343797 0.343888
+0.343979 0.34407 0.344161 0.344252 0.344343 0.344434 0.344525 0.344616
+0.344708 0.344799 0.34489 0.344981 0.345072 0.345163 0.345254 0.345346
+0.345437 0.345528 0.345619 0.34571 0.345802 0.345893 0.345984 0.346075
+0.346166 0.346258 0.346349 0.34644 0.346531 0.346623 0.346714 0.346805
+0.346896 0.346988 0.347079 0.34717 0.347261 0.347353 0.347444 0.347535
+0.347627 0.347718 0.347809 0.347901 0.347992 0.348083 0.348175 0.348266
+0.348357 0.348449 0.34854 0.348631 0.348723 0.348814 0.348906 0.348997
+0.349088 0.34918 0.349271 0.349363 0.349454 0.349546 0.349637 0.349728
+0.34982 0.349911 0.350003 0.350094 0.350186 0.350277 0.350369 0.35046
+0.350552 0.350643 0.350735 0.350826 0.350918 0.351009 0.351101 0.351192
+0.351284 0.351375 0.351467 0.351558 0.35165 0.351741 0.351833 0.351925
+0.352016 0.352108 0.352199 0.352291 0.352382 0.352474 0.352566 0.352657
+0.352749 0.352841 0.352932 0.353024 0.353115 0.353207 0.353299 0.35339
+0.353482 0.353574 0.353665 0.353757 0.353849 0.35394 0.354032 0.354124
+0.354216 0.354307 0.354399 0.354491 0.354582 0.354674 0.354766 0.354858
+0.354949 0.355041 0.355133 0.355225 0.355316 0.355408 0.3555 0.355592
+0.355684 0.355775 0.355867 0.355959 0.356051 0.356143 0.356234 0.356326
+0.356418 0.35651 0.356602 0.356694 0.356785 0.356877 0.356969 0.357061
+0.357153 0.357245 0.357337 0.357429 0.357521 0.357612 0.357704 0.357796
+0.357888 0.35798 0.358072 0.358164 0.358256 0.358348 0.35844 0.358532
+0.358624 0.358716 0.358808 0.3589 0.358992 0.359084 0.359176 0.359268
+0.35936 0.359452 0.359544 0.359636 0.359728 0.35982 0.359912 0.360004
+0.360096 0.360188 0.36028 0.360372 0.360464 0.360556 0.360648 0.36074
+0.360832 0.360924 0.361016 0.361109 0.361201 0.361293 0.361385 0.361477
+0.361569 0.361661 0.361753 0.361845 0.361938 0.36203 0.362122 0.362214
+0.362306 0.362398 0.362491 0.362583 0.362675 0.362767 0.362859 0.362952
+0.363044 0.363136 0.363228 0.36332 0.363413 0.363505 0.363597 0.363689
+0.363782 0.363874 0.363966 0.364058 0.364151 0.364243 0.364335 0.364427
+0.36452 0.364612 0.364704 0.364797 0.364889 0.364981 0.365074 0.365166
+0.365258 0.36535 0.365443 0.365535 0.365627 0.36572 0.365812 0.365905
+0.365997 0.366089 0.366182 0.366274 0.366366 0.366459 0.366551 0.366644
+0.366736 0.366828 0.366921 0.367013 0.367106 0.367198 0.367291 0.367383
+0.367475 0.367568 0.36766 0.367753 0.367845 0.367938 0.36803 0.368123
+0.368215 0.368308 0.3684 0.368493 0.368585 0.368678 0.36877 0.368863
+0.368955 0.369048 0.36914 0.369233 0.369325 0.369418 0.36951 0.369603
+0.369695 0.369788 0.369881 0.369973 0.370066 0.370158 0.370251 0.370344
+0.370436 0.370529 0.370621 0.370714 0.370807 0.370899 0.370992 0.371084
+0.371177 0.37127 0.371362 0.371455 0.371548 0.37164 0.371733 0.371826
+0.371918 0.372011 0.372104 0.372196 0.372289 0.372382 0.372474 0.372567
+0.37266 0.372753 0.372845 0.372938 0.373031 0.373123 0.373216 0.373309
+0.373402 0.373494 0.373587 0.37368 0.373773 0.373866 0.373958 0.374051
+0.374144 0.374237 0.374329 0.374422 0.374515 0.374608 0.374701 0.374793
+0.374886 0.374979 0.375072 0.375165 0.375258 0.375351 0.375443 0.375536
+0.375629 0.375722 0.375815 0.375908 0.376001 0.376093 0.376186 0.376279
+0.376372 0.376465 0.376558 0.376651 0.376744 0.376837 0.37693 0.377022
+0.377115 0.377208 0.377301 0.377394 0.377487 0.37758 0.377673 0.377766
+0.377859 0.377952 0.378045 0.378138 0.378231 0.378324 0.378417 0.37851
+0.378603 0.378696 0.378789 0.378882 0.378975 0.379068 0.379161 0.379254
+0.379347 0.37944 0.379533 0.379626 0.379719 0.379812 0.379905 0.379998
+0.380092 0.380185 0.380278 0.380371 0.380464 0.380557 0.38065 0.380743
+0.380836 0.380929 0.381023 0.381116 0.381209 0.381302 0.381395 0.381488
+0.381581 0.381674 0.381768 0.381861 0.381954 0.382047 0.38214 0.382233
+0.382327 0.38242 0.382513 0.382606 0.382699 0.382793 0.382886 0.382979
+0.383072 0.383165 0.383259 0.383352 0.383445 0.383538 0.383632 0.383725
+0.383818 0.383911 0.384005 0.384098 0.384191 0.384284 0.384378 0.384471
+0.384564 0.384658 0.384751 0.384844 0.384937 0.385031 0.385124 0.385217
+0.385311 0.385404 0.385497 0.385591 0.385684 0.385777 0.385871 0.385964
+0.386057 0.386151 0.386244 0.386337 0.386431 0.386524 0.386617;
+#A 7000 0.386711 0.386804 0.386898 0.386991 0.387084 0.387178 0.387271
+0.387365 0.387458 0.387551 0.387645 0.387738 0.387832 0.387925 0.388019
+0.388112 0.388205 0.388299 0.388392 0.388486 0.388579 0.388673 0.388766
+0.38886 0.388953 0.389047 0.38914 0.389234 0.389327 0.389421 0.389514
+0.389608 0.389701 0.389795 0.389888 0.389982 0.390075 0.390169 0.390262
+0.390356 0.390449 0.390543 0.390636 0.39073 0.390824 0.390917 0.391011
+0.391104 0.391198 0.391291 0.391385 0.391479 0.391572 0.391666 0.391759
+0.391853 0.391947 0.39204 0.392134 0.392227 0.392321 0.392415 0.392508
+0.392602 0.392696 0.392789 0.392883 0.392977 0.39307 0.393164 0.393257
+0.393351 0.393445 0.393539 0.393632 0.393726 0.39382 0.393913 0.394007
+0.394101 0.394194 0.394288 0.394382 0.394475 0.394569 0.394663 0.394757
+0.39485 0.394944 0.395038 0.395132 0.395225 0.395319 0.395413 0.395507
+0.3956 0.395694 0.395788 0.395882 0.395975 0.396069 0.396163 0.396257
+0.396351 0.396444 0.396538 0.396632 0.396726 0.39682 0.396913 0.397007
+0.397101 0.397195 0.397289 0.397382 0.397476 0.39757 0.397664 0.397758
+0.397852 0.397946 0.398039 0.398133 0.398227 0.398321 0.398415 0.398509
+0.398603 0.398696 0.39879 0.398884 0.398978 0.399072 0.399166 0.39926
+0.399354 0.399448 0.399542 0.399636 0.399729 0.399823 0.399917 0.400011
+0.400105 0.400199 0.400293 0.400387 0.400481 0.400575 0.400669 0.400763
+0.400857 0.400951 0.401045 0.401139 0.401233 0.401327 0.401421 0.401515
+0.401609 0.401703 0.401797 0.401891 0.401985 0.402079 0.402173 0.402267
+0.402361 0.402455 0.402549 0.402643 0.402737 0.402831 0.402925 0.403019
+0.403113 0.403207 0.403301 0.403395 0.403489 0.403583 0.403678 0.403772
+0.403866 0.40396 0.404054 0.404148 0.404242 0.404336 0.40443 0.404524
+0.404619 0.404713 0.404807 0.404901 0.404995 0.405089 0.405183 0.405277
+0.405372 0.405466 0.40556 0.405654 0.405748 0.405842 0.405936 0.406031
+0.406125 0.406219 0.406313 0.406407 0.406501 0.406596 0.40669 0.406784
+0.406878 0.406972 0.407067 0.407161 0.407255 0.407349 0.407443 0.407538
+0.407632 0.407726 0.40782 0.407915 0.408009 0.408103 0.408197 0.408292
+0.408386 0.40848 0.408574 0.408669 0.408763 0.408857 0.408951 0.409046
+0.40914 0.409234 0.409328 0.409423 0.409517 0.409611 0.409706 0.4098
+0.409894 0.409989 0.410083 0.410177 0.410271 0.410366 0.41046 0.410554
+0.410649 0.410743 0.410837 0.410932 0.411026 0.41112 0.411215 0.411309
+0.411404 0.411498 0.411592 0.411687 0.411781 0.411875 0.41197 0.412064
+0.412158 0.412253 0.412347 0.412442 0.412536 0.41263 0.412725 0.412819
+0.412914 0.413008 0.413102 0.413197 0.413291 0.413386 0.41348 0.413575
+0.413669 0.413763 0.413858 0.413952 0.414047 0.414141 0.414236 0.41433
+0.414425 0.414519 0.414614 0.414708 0.414802 0.414897 0.414991 0.415086
+0.41518 0.415275 0.415369 0.415464 0.415558 0.415653 0.415747 0.415842
+0.415936 0.416031 0.416125 0.41622 0.416314 0.416409 0.416503 0.416598
+0.416693 0.416787 0.416882 0.416976 0.417071 0.417165 0.41726 0.417354
+0.417449 0.417543 0.417638 0.417733 0.417827 0.417922 0.418016 0.418111
+0.418205 0.4183 0.418395 0.418489 0.418584 0.418678 0.418773 0.418868
+0.418962 0.419057 0.419151 0.419246 0.419341 0.419435 0.41953 0.419625
+0.419719 0.419814 0.419908 0.420003 0.420098 0.420192 0.420287 0.420382
+0.420476 0.420571 0.420666 0.42076 0.420855 0.42095 0.421044 0.421139
+0.421234 0.421328 0.421423 0.421518 0.421612 0.421707 0.421802 0.421896
+0.421991 0.422086 0.422181 0.422275 0.42237 0.422465 0.422559 0.422654
+0.422749 0.422844 0.422938 0.423033 0.423128 0.423222 0.423317 0.423412
+0.423507 0.423601 0.423696 0.423791 0.423886 0.42398 0.424075 0.42417
+0.424265 0.424359 0.424454 0.424549 0.424644 0.424739 0.424833 0.424928
+0.425023 0.425118 0.425213 0.425307 0.425402 0.425497 0.425592 0.425687
+0.425781 0.425876 0.425971 0.426066 0.426161 0.426255 0.42635 0.426445
+0.42654 0.426635 0.42673 0.426824 0.426919 0.427014 0.427109 0.427204
+0.427299 0.427394 0.427488 0.427583 0.427678 0.427773 0.427868 0.427963
+0.428058 0.428152 0.428247 0.428342 0.428437 0.428532 0.428627 0.428722
+0.428817 0.428912 0.429006 0.429101 0.429196 0.429291 0.429386 0.429481
+0.429576 0.429671 0.429766 0.429861 0.429956 0.430051 0.430146 0.43024
+0.430335 0.43043 0.430525 0.43062 0.430715 0.43081 0.430905 0.431 0.431095
+0.43119 0.431285 0.43138 0.431475 0.43157 0.431665 0.43176 0.431855
+0.43195 0.432045 0.43214 0.432235 0.43233 0.432425 0.43252 0.432615
+0.43271 0.432805 0.4329 0.432995 0.43309 0.433185 0.43328 0.433375
+0.43347 0.433565 0.43366 0.433755 0.43385 0.433945 0.43404 0.434135
+0.43423 0.434325 0.43442 0.434515 0.43461 0.434705 0.4348 0.434895
+0.43499 0.435085 0.435181 0.435276 0.435371 0.435466 0.435561 0.435656
+0.435751 0.435846 0.435941 0.436036 0.436131 0.436226 0.436321 0.436417
+0.436512 0.436607 0.436702 0.436797 0.436892 0.436987 0.437082 0.437177
+0.437273 0.437368 0.437463 0.437558 0.437653 0.437748 0.437843 0.437938
+0.438034 0.438129 0.438224 0.438319 0.438414 0.438509 0.438604 0.4387
+0.438795 0.43889 0.438985 0.43908 0.439175 0.43927 0.439366 0.439461
+0.439556 0.439651 0.439746 0.439841 0.439937 0.440032 0.440127 0.440222
+0.440317 0.440413 0.440508 0.440603 0.440698 0.440793 0.440889 0.440984
+0.441079 0.441174 0.441269 0.441365 0.44146 0.441555 0.44165 0.441745
+0.441841 0.441936 0.442031 0.442126 0.442222 0.442317 0.442412 0.442507
+0.442603 0.442698 0.442793 0.442888 0.442984 0.443079 0.443174 0.443269
+0.443365 0.44346 0.443555 0.44365 0.443746 0.443841 0.443936 0.444031
+0.444127 0.444222 0.444317 0.444412 0.444508 0.444603 0.444698 0.444794
+0.444889 0.444984 0.445079 0.445175 0.44527 0.445365 0.445461 0.445556
+0.445651 0.445747 0.445842 0.445937 0.446033 0.446128 0.446223 0.446318
+0.446414 0.446509 0.446604 0.4467 0.446795 0.44689 0.446986 0.447081
+0.447176 0.447272 0.447367 0.447462 0.447558 0.447653 0.447748 0.447844
+0.447939 0.448035 0.44813 0.448225 0.448321 0.448416 0.448511 0.448607
+0.448702 0.448797 0.448893 0.448988 0.449084 0.449179 0.449274 0.44937
+0.449465 0.44956 0.449656 0.449751 0.449847 0.449942 0.450037 0.450133
+0.450228 0.450324 0.450419 0.450514 0.45061 0.450705 0.450801 0.450896
+0.450991 0.451087 0.451182 0.451278 0.451373 0.451469 0.451564 0.451659
+0.451755 0.45185 0.451946 0.452041 0.452137 0.452232 0.452327 0.452423
+0.452518 0.452614 0.452709 0.452805 0.4529 0.452995 0.453091 0.453186
+0.453282 0.453377 0.453473 0.453568 0.453664 0.453759 0.453855 0.45395
+0.454046 0.454141 0.454236 0.454332 0.454427 0.454523 0.454618 0.454714
+0.454809 0.454905 0.455 0.455096 0.455191 0.455287 0.455382 0.455478
+0.455573 0.455669 0.455764 0.45586 0.455955 0.456051 0.456146 0.456242
+0.456337 0.456433 0.456528 0.456624 0.456719 0.456815 0.45691 0.457006
+0.457101 0.457197 0.457292 0.457388 0.457483 0.457579 0.457675 0.45777
+0.457866 0.457961 0.458057 0.458152 0.458248 0.458343 0.458439 0.458534
+0.45863 0.458725 0.458821 0.458917 0.459012 0.459108 0.459203 0.459299
+0.459394 0.45949 0.459585 0.459681 0.459777 0.459872 0.459968 0.460063
+0.460159 0.460254 0.46035 0.460445 0.460541 0.460637 0.460732 0.460828
+0.460923 0.461019 0.461115 0.46121 0.461306 0.461401 0.461497 0.461592
+0.461688 0.461784 0.461879 0.461975 0.46207 0.462166 0.462262 0.462357
+0.462453 0.462548 0.462644 0.46274 0.462835 0.462931 0.463026 0.463122
+0.463218 0.463313 0.463409 0.463505 0.4636 0.463696 0.463791 0.463887
+0.463983 0.464078 0.464174 0.46427 0.464365 0.464461 0.464556 0.464652
+0.464748 0.464843 0.464939 0.465035 0.46513 0.465226 0.465322 0.465417
+0.465513 0.465608 0.465704 0.4658 0.465895 0.465991 0.466087 0.466182
+0.466278 0.466374 0.466469 0.466565 0.466661 0.466756 0.466852 0.466948
+0.467043 0.467139 0.467235 0.46733 0.467426 0.467522 0.467617 0.467713
+0.467809 0.467904 0.468 0.468096 0.468191 0.468287 0.468383 0.468478
+0.468574 0.46867 0.468765 0.468861 0.468957 0.469053 0.469148 0.469244
+0.46934 0.469435 0.469531 0.469627 0.469722 0.469818 0.469914 0.47001
+0.470105 0.470201 0.470297 0.470392 0.470488 0.470584 0.470679 0.470775
+0.470871 0.470967 0.471062 0.471158 0.471254 0.471349 0.471445 0.471541
+0.471637 0.471732 0.471828 0.471924 0.472019 0.472115 0.472211 0.472307
+0.472402 0.472498 0.472594 0.47269 0.472785 0.472881 0.472977 0.473072
+0.473168 0.473264 0.47336 0.473455 0.473551 0.473647 0.473743 0.473838
+0.473934 0.47403 0.474126 0.474221 0.474317 0.474413 0.474509 0.474604
+0.4747 0.474796 0.474892 0.474987 0.475083 0.475179 0.475275 0.47537
+0.475466 0.475562 0.475658 0.475753 0.475849 0.475945 0.476041 0.476137
+0.476232 0.476328 0.476424 0.47652 0.476615 0.476711 0.476807 0.476903
+0.476998 0.477094 0.47719 0.477286 0.477381 0.477477 0.477573 0.477669
+0.477765 0.47786 0.477956 0.478052 0.478148 0.478244 0.478339 0.478435
+0.478531 0.478627 0.478722 0.478818 0.478914 0.47901 0.479106 0.479201
+0.479297 0.479393 0.479489 0.479585 0.47968 0.479776 0.479872 0.479968
+0.480064 0.480159 0.480255 0.480351 0.480447 0.480543 0.480638 0.480734
+0.48083 0.480926 0.481022 0.481117 0.481213 0.481309 0.481405 0.481501
+;
+#A 8000 0.481596 0.481692 0.481788 0.481884 0.48198 0.482075 0.482171
+0.482267 0.482363 0.482459 0.482554 0.48265 0.482746 0.482842 0.482938
+0.483034 0.483129 0.483225 0.483321 0.483417 0.483513 0.483609 0.483704
+0.4838 0.483896 0.483992 0.484088 0.484183 0.484279 0.484375 0.484471
+0.484567 0.484663 0.484758 0.484854 0.48495 0.485046 0.485142 0.485238
+0.485333 0.485429 0.485525 0.485621 0.485717 0.485813 0.485908 0.486004
+0.4861 0.486196 0.486292 0.486388 0.486483 0.486579 0.486675 0.486771
+0.486867 0.486963 0.487058 0.487154 0.48725 0.487346 0.487442 0.487538
+0.487634 0.487729 0.487825 0.487921 0.488017 0.488113 0.488209 0.488304
+0.4884 0.488496 0.488592 0.488688 0.488784 0.48888 0.488975 0.489071
+0.489167 0.489263 0.489359 0.489455 0.489551 0.489646 0.489742 0.489838
+0.489934 0.49003 0.490126 0.490222 0.490317 0.490413 0.490509 0.490605
+0.490701 0.490797 0.490892 0.490988 0.491084 0.49118 0.491276 0.491372
+0.491468 0.491563 0.491659 0.491755 0.491851 0.491947 0.492043 0.492139
+0.492235 0.49233 0.492426 0.492522 0.492618 0.492714 0.49281 0.492906
+0.493001 0.493097 0.493193 0.493289 0.493385 0.493481 0.493577 0.493672
+0.493768 0.493864 0.49396 0.494056 0.494152 0.494248 0.494344 0.494439
+0.494535 0.494631 0.494727 0.494823 0.494919 0.495015 0.495111 0.495206
+0.495302 0.495398 0.495494 0.49559 0.495686 0.495782 0.495877 0.495973
+0.496069 0.496165 0.496261 0.496357 0.496453 0.496549 0.496644 0.49674
+0.496836 0.496932 0.497028 0.497124 0.49722 0.497316 0.497411 0.497507
+0.497603 0.497699 0.497795 0.497891 0.497987 0.498083 0.498178 0.498274
+0.49837 0.498466 0.498562 0.498658 0.498754 0.49885 0.498945 0.499041
+0.499137 0.499233 0.499329 0.499425 0.499521 0.499617 0.499712 0.499808
+0.499904 0.5 0.500096 0.500192 0.500288 0.500383 0.500479 0.500575
+0.500671 0.500767 0.500863 0.500959 0.501055 0.50115 0.501246 0.501342
+0.501438 0.501534 0.50163 0.501726 0.501822 0.501917 0.502013 0.502109
+0.502205 0.502301 0.502397 0.502493 0.502589 0.502684 0.50278 0.502876
+0.502972 0.503068 0.503164 0.50326 0.503356 0.503451 0.503547 0.503643
+0.503739 0.503835 0.503931 0.504027 0.504123 0.504218 0.504314 0.50441
+0.504506 0.504602 0.504698 0.504794 0.504889 0.504985 0.505081 0.505177
+0.505273 0.505369 0.505465 0.505561 0.505656 0.505752 0.505848 0.505944
+0.50604 0.506136 0.506232 0.506328 0.506423 0.506519 0.506615 0.506711
+0.506807 0.506903 0.506999 0.507094 0.50719 0.507286 0.507382 0.507478
+0.507574 0.50767 0.507765 0.507861 0.507957 0.508053 0.508149 0.508245
+0.508341 0.508437 0.508532 0.508628 0.508724 0.50882 0.508916 0.509012
+0.509108 0.509203 0.509299 0.509395 0.509491 0.509587 0.509683 0.509778
+0.509874 0.50997 0.510066 0.510162 0.510258 0.510354 0.510449 0.510545
+0.510641 0.510737 0.510833 0.510929 0.511025 0.51112 0.511216 0.511312
+0.511408 0.511504 0.5116 0.511696 0.511791 0.511887 0.511983 0.512079
+0.512175 0.512271 0.512366 0.512462 0.512558 0.512654 0.51275 0.512846
+0.512942 0.513037 0.513133 0.513229 0.513325 0.513421 0.513517 0.513612
+0.513708 0.513804 0.5139 0.513996 0.514092 0.514187 0.514283 0.514379
+0.514475 0.514571 0.514667 0.514762 0.514858 0.514954 0.51505 0.515146
+0.515242 0.515337 0.515433 0.515529 0.515625 0.515721 0.515817 0.515912
+0.516008 0.516104 0.5162 0.516296 0.516391 0.516487 0.516583 0.516679
+0.516775 0.516871 0.516966 0.517062 0.517158 0.517254 0.51735 0.517446
+0.517541 0.517637 0.517733 0.517829 0.517925 0.51802 0.518116 0.518212
+0.518308 0.518404 0.518499 0.518595 0.518691 0.518787 0.518883 0.518978
+0.519074 0.51917 0.519266 0.519362 0.519457 0.519553 0.519649 0.519745
+0.519841 0.519936 0.520032 0.520128 0.520224 0.52032 0.520415 0.520511
+0.520607 0.520703 0.520799 0.520894 0.52099 0.521086 0.521182 0.521278
+0.521373 0.521469 0.521565 0.521661 0.521756 0.521852 0.521948 0.522044
+0.52214 0.522235 0.522331 0.522427 0.522523 0.522618 0.522714 0.52281
+0.522906 0.523002 0.523097 0.523193 0.523289 0.523385 0.52348 0.523576
+0.523672 0.523768 0.523863 0.523959 0.524055 0.524151 0.524247 0.524342
+0.524438 0.524534 0.52463 0.524725 0.524821 0.524917 0.525013 0.525108
+0.525204 0.5253 0.525396 0.525491 0.525587 0.525683 0.525779 0.525874
+0.52597 0.526066 0.526162 0.526257 0.526353 0.526449 0.526545 0.52664
+0.526736 0.526832 0.526928 0.527023 0.527119 0.527215 0.52731 0.527406
+0.527502 0.527598 0.527693 0.527789 0.527885 0.527981 0.528076 0.528172
+0.528268 0.528363 0.528459 0.528555 0.528651 0.528746 0.528842 0.528938
+0.529033 0.529129 0.529225 0.529321 0.529416 0.529512 0.529608 0.529703
+0.529799 0.529895 0.52999 0.530086 0.530182 0.530278 0.530373 0.530469
+0.530565 0.53066 0.530756 0.530852 0.530947 0.531043 0.531139 0.531235
+0.53133 0.531426 0.531522 0.531617 0.531713 0.531809 0.531904 0.532
+0.532096 0.532191 0.532287 0.532383 0.532478 0.532574 0.53267 0.532765
+0.532861 0.532957 0.533052 0.533148 0.533244 0.533339 0.533435 0.533531
+0.533626 0.533722 0.533818 0.533913 0.534009 0.534105 0.5342 0.534296
+0.534392 0.534487 0.534583 0.534678 0.534774 0.53487 0.534965 0.535061
+0.535157 0.535252 0.535348 0.535444 0.535539 0.535635 0.53573 0.535826
+0.535922 0.536017 0.536113 0.536209 0.536304 0.5364 0.536495 0.536591
+0.536687 0.536782 0.536878 0.536974 0.537069 0.537165 0.53726 0.537356
+0.537452 0.537547 0.537643 0.537738 0.537834 0.53793 0.538025 0.538121
+0.538216 0.538312 0.538408 0.538503 0.538599 0.538694 0.53879 0.538885
+0.538981 0.539077 0.539172 0.539268 0.539363 0.539459 0.539554 0.53965
+0.539746 0.539841 0.539937 0.540032 0.540128 0.540223 0.540319 0.540415
+0.54051 0.540606 0.540701 0.540797 0.540892 0.540988 0.541084 0.541179
+0.541275 0.54137 0.541466 0.541561 0.541657 0.541752 0.541848 0.541943
+0.542039 0.542134 0.54223 0.542325 0.542421 0.542517 0.542612 0.542708
+0.542803 0.542899 0.542994 0.54309 0.543185 0.543281 0.543376 0.543472
+0.543567 0.543663 0.543758 0.543854 0.543949 0.544045 0.54414 0.544236
+0.544331 0.544427 0.544522 0.544618 0.544713 0.544809 0.544904 0.545
+0.545095 0.545191 0.545286 0.545382 0.545477 0.545573 0.545668 0.545764
+0.545859 0.545954 0.54605 0.546145 0.546241 0.546336 0.546432 0.546527
+0.546623 0.546718 0.546814 0.546909 0.547005 0.5471 0.547195 0.547291
+0.547386 0.547482 0.547577 0.547673 0.547768 0.547863 0.547959 0.548054
+0.54815 0.548245 0.548341 0.548436 0.548531 0.548627 0.548722 0.548818
+0.548913 0.549009 0.549104 0.549199 0.549295 0.54939 0.549486 0.549581
+0.549676 0.549772 0.549867 0.549963 0.550058 0.550153 0.550249 0.550344
+0.55044 0.550535 0.55063 0.550726 0.550821 0.550916 0.551012 0.551107
+0.551203 0.551298 0.551393 0.551489 0.551584 0.551679 0.551775 0.55187
+0.551965 0.552061 0.552156 0.552252 0.552347 0.552442 0.552538 0.552633
+0.552728 0.552824 0.552919 0.553014 0.55311 0.553205 0.5533 0.553396
+0.553491 0.553586 0.553682 0.553777 0.553872 0.553967 0.554063 0.554158
+0.554253 0.554349 0.554444 0.554539 0.554635 0.55473 0.554825 0.55492
+0.555016 0.555111 0.555206 0.555302 0.555397 0.555492 0.555588 0.555683
+0.555778 0.555873 0.555969 0.556064 0.556159 0.556254 0.55635 0.556445
+0.55654 0.556635 0.556731 0.556826 0.556921 0.557016 0.557112 0.557207
+0.557302 0.557397 0.557493 0.557588 0.557683 0.557778 0.557874 0.557969
+0.558064 0.558159 0.558255 0.55835 0.558445 0.55854 0.558635 0.558731
+0.558826 0.558921 0.559016 0.559111 0.559207 0.559302 0.559397 0.559492
+0.559587 0.559683 0.559778 0.559873 0.559968 0.560063 0.560159 0.560254
+0.560349 0.560444 0.560539 0.560634 0.56073 0.560825 0.56092 0.561015
+0.56111 0.561205 0.561301 0.561396 0.561491 0.561586 0.561681 0.561776
+0.561871 0.561966 0.562062 0.562157 0.562252 0.562347 0.562442 0.562537
+0.562632 0.562728 0.562823 0.562918 0.563013 0.563108 0.563203 0.563298
+0.563393 0.563488 0.563583 0.563679 0.563774 0.563869 0.563964 0.564059
+0.564154 0.564249 0.564344 0.564439 0.564534 0.564629 0.564724 0.56482
+0.564915 0.56501 0.565105 0.5652 0.565295 0.56539 0.565485 0.56558
+0.565675 0.56577 0.565865 0.56596 0.566055 0.56615 0.566245 0.56634
+0.566435 0.56653 0.566625 0.56672 0.566815 0.56691 0.567005 0.5671
+0.567195 0.56729 0.567385 0.56748 0.567575 0.56767 0.567765 0.56786
+0.567955 0.56805 0.568145 0.56824 0.568335 0.56843 0.568525 0.56862
+0.568715 0.56881 0.568905 0.569 0.569095 0.56919 0.569285 0.56938 0.569475
+0.56957 0.569665 0.56976 0.569854 0.569949 0.570044 0.570139 0.570234
+0.570329 0.570424 0.570519 0.570614 0.570709 0.570804 0.570899 0.570993
+0.571088 0.571183 0.571278 0.571373 0.571468 0.571563 0.571658 0.571753
+0.571847 0.571942 0.572037 0.572132 0.572227 0.572322 0.572417 0.572512
+0.572606 0.572701 0.572796 0.572891 0.572986 0.573081 0.573176 0.57327
+0.573365 0.57346 0.573555 0.57365 0.573745 0.573839 0.573934 0.574029
+0.574124 0.574219 0.574313 0.574408 0.574503 0.574598 0.574693 0.574787
+0.574882 0.574977 0.575072 0.575167 0.575261 0.575356 0.575451 0.575546
+0.57564 0.575735 0.57583 0.575925 0.57602 0.576114 0.576209 0.576304
+0.576399 0.576493 0.576588 0.576683 0.576778 0.576872 0.576967 0.577062
+;
+#A 9000 0.577156 0.577251 0.577346 0.577441 0.577535 0.57763 0.577725
+0.577819 0.577914 0.578009 0.578104 0.578198 0.578293 0.578388 0.578482
+0.578577 0.578672 0.578766 0.578861 0.578956 0.57905 0.579145 0.57924
+0.579334 0.579429 0.579524 0.579618 0.579713 0.579808 0.579902 0.579997
+0.580092 0.580186 0.580281 0.580375 0.58047 0.580565 0.580659 0.580754
+0.580849 0.580943 0.581038 0.581132 0.581227 0.581322 0.581416 0.581511
+0.581605 0.5817 0.581795 0.581889 0.581984 0.582078 0.582173 0.582267
+0.582362 0.582457 0.582551 0.582646 0.58274 0.582835 0.582929 0.583024
+0.583118 0.583213 0.583308 0.583402 0.583497 0.583591 0.583686 0.58378
+0.583875 0.583969 0.584064 0.584158 0.584253 0.584347 0.584442 0.584536
+0.584631 0.584725 0.58482 0.584914 0.585009 0.585103 0.585198 0.585292
+0.585386 0.585481 0.585575 0.58567 0.585764 0.585859 0.585953 0.586048
+0.586142 0.586237 0.586331 0.586425 0.58652 0.586614 0.586709 0.586803
+0.586898 0.586992 0.587086 0.587181 0.587275 0.58737 0.587464 0.587558
+0.587653 0.587747 0.587842 0.587936 0.58803 0.588125 0.588219 0.588313
+0.588408 0.588502 0.588596 0.588691 0.588785 0.58888 0.588974 0.589068
+0.589163 0.589257 0.589351 0.589446 0.58954 0.589634 0.589729 0.589823
+0.589917 0.590011 0.590106 0.5902 0.590294 0.590389 0.590483 0.590577
+0.590672 0.590766 0.59086 0.590954 0.591049 0.591143 0.591237 0.591331
+0.591426 0.59152 0.591614 0.591708 0.591803 0.591897 0.591991 0.592085
+0.59218 0.592274 0.592368 0.592462 0.592557 0.592651 0.592745 0.592839
+0.592933 0.593028 0.593122 0.593216 0.59331 0.593404 0.593499 0.593593
+0.593687 0.593781 0.593875 0.593969 0.594064 0.594158 0.594252 0.594346
+0.59444 0.594534 0.594628 0.594723 0.594817 0.594911 0.595005 0.595099
+0.595193 0.595287 0.595381 0.595476 0.59557 0.595664 0.595758 0.595852
+0.595946 0.59604 0.596134 0.596228 0.596322 0.596417 0.596511 0.596605
+0.596699 0.596793 0.596887 0.596981 0.597075 0.597169 0.597263 0.597357
+0.597451 0.597545 0.597639 0.597733 0.597827 0.597921 0.598015 0.598109
+0.598203 0.598297 0.598391 0.598485 0.598579 0.598673 0.598767 0.598861
+0.598955 0.599049 0.599143 0.599237 0.599331 0.599425 0.599519 0.599613
+0.599707 0.599801 0.599895 0.599989 0.600083 0.600177 0.600271 0.600365
+0.600458 0.600552 0.600646 0.60074 0.600834 0.600928 0.601022 0.601116
+0.60121 0.601304 0.601397 0.601491 0.601585 0.601679 0.601773 0.601867
+0.601961 0.602054 0.602148 0.602242 0.602336 0.60243 0.602524 0.602618
+0.602711 0.602805 0.602899 0.602993 0.603087 0.60318 0.603274 0.603368
+0.603462 0.603556 0.603649 0.603743 0.603837 0.603931 0.604025 0.604118
+0.604212 0.604306 0.6044 0.604493 0.604587 0.604681 0.604775 0.604868
+0.604962 0.605056 0.60515 0.605243 0.605337 0.605431 0.605525 0.605618
+0.605712 0.605806 0.605899 0.605993 0.606087 0.60618 0.606274 0.606368
+0.606461 0.606555 0.606649 0.606743 0.606836 0.60693 0.607023 0.607117
+0.607211 0.607304 0.607398 0.607492 0.607585 0.607679 0.607773 0.607866
+0.60796 0.608053 0.608147 0.608241 0.608334 0.608428 0.608521 0.608615
+0.608709 0.608802 0.608896 0.608989 0.609083 0.609176 0.60927 0.609363
+0.609457 0.609551 0.609644 0.609738 0.609831 0.609925 0.610018 0.610112
+0.610205 0.610299 0.610392 0.610486 0.610579 0.610673 0.610766 0.61086
+0.610953 0.611047 0.61114 0.611234 0.611327 0.611421 0.611514 0.611608
+0.611701 0.611795 0.611888 0.611981 0.612075 0.612168 0.612262 0.612355
+0.612449 0.612542 0.612635 0.612729 0.612822 0.612916 0.613009 0.613102
+0.613196 0.613289 0.613383 0.613476 0.613569 0.613663 0.613756 0.613849
+0.613943 0.614036 0.614129 0.614223 0.614316 0.614409 0.614503 0.614596
+0.614689 0.614783 0.614876 0.614969 0.615063 0.615156 0.615249 0.615342
+0.615436 0.615529 0.615622 0.615716 0.615809 0.615902 0.615995 0.616089
+0.616182 0.616275 0.616368 0.616462 0.616555 0.616648 0.616741 0.616835
+0.616928 0.617021 0.617114 0.617207 0.617301 0.617394 0.617487 0.61758
+0.617673 0.617767 0.61786 0.617953 0.618046 0.618139 0.618232 0.618326
+0.618419 0.618512 0.618605 0.618698 0.618791 0.618884 0.618977 0.619071
+0.619164 0.619257 0.61935 0.619443 0.619536 0.619629 0.619722 0.619815
+0.619908 0.620001 0.620095 0.620188 0.620281 0.620374 0.620467 0.62056
+0.620653 0.620746 0.620839 0.620932 0.621025 0.621118 0.621211 0.621304
+0.621397 0.62149 0.621583 0.621676 0.621769 0.621862 0.621955 0.622048
+0.622141 0.622234 0.622327 0.62242 0.622513 0.622606 0.622699 0.622792
+0.622885 0.622978 0.62307 0.623163 0.623256 0.623349 0.623442 0.623535
+0.623628 0.623721 0.623814 0.623907 0.623999 0.624092 0.624185 0.624278
+0.624371 0.624464 0.624557 0.62465 0.624742 0.624835 0.624928 0.625021
+0.625114 0.625207 0.625299 0.625392 0.625485 0.625578 0.625671 0.625763
+0.625856 0.625949 0.626042 0.626134 0.626227 0.62632 0.626413 0.626505
+0.626598 0.626691 0.626784 0.626876 0.626969 0.627062 0.627155 0.627247
+0.62734 0.627433 0.627526 0.627618 0.627711 0.627804 0.627896 0.627989
+0.628082 0.628174 0.628267 0.62836 0.628452 0.628545 0.628638 0.62873
+0.628823 0.628916 0.629008 0.629101 0.629193 0.629286 0.629379 0.629471
+0.629564 0.629656 0.629749 0.629842 0.629934 0.630027 0.630119 0.630212
+0.630305 0.630397 0.63049 0.630582 0.630675 0.630767 0.63086 0.630952
+0.631045 0.631137 0.63123 0.631322 0.631415 0.631507 0.6316 0.631692
+0.631785 0.631877 0.63197 0.632062 0.632155 0.632247 0.63234 0.632432
+0.632525 0.632617 0.632709 0.632802 0.632894 0.632987 0.633079 0.633172
+0.633264 0.633356 0.633449 0.633541 0.633634 0.633726 0.633818 0.633911
+0.634003 0.634095 0.634188 0.63428 0.634372 0.634465 0.634557 0.63465
+0.634742 0.634834 0.634926 0.635019 0.635111 0.635203 0.635296 0.635388
+0.63548 0.635573 0.635665 0.635757 0.635849 0.635942 0.636034 0.636126
+0.636218 0.636311 0.636403 0.636495 0.636587 0.63668 0.636772 0.636864
+0.636956 0.637048 0.637141 0.637233 0.637325 0.637417 0.637509 0.637602
+0.637694 0.637786 0.637878 0.63797 0.638062 0.638155 0.638247 0.638339
+0.638431 0.638523 0.638615 0.638707 0.638799 0.638891 0.638984 0.639076
+0.639168 0.63926 0.639352 0.639444 0.639536 0.639628 0.63972 0.639812
+0.639904 0.639996 0.640088 0.64018 0.640272 0.640364 0.640456 0.640548
+0.64064 0.640732 0.640824 0.640916 0.641008 0.6411 0.641192 0.641284
+0.641376 0.641468 0.64156 0.641652 0.641744 0.641836 0.641928 0.64202
+0.642112 0.642204 0.642296 0.642388 0.642479 0.642571 0.642663 0.642755
+0.642847 0.642939 0.643031 0.643123 0.643215 0.643306 0.643398 0.64349
+0.643582 0.643674 0.643766 0.643857 0.643949 0.644041 0.644133 0.644225
+0.644316 0.644408 0.6445 0.644592 0.644684 0.644775 0.644867 0.644959
+0.645051 0.645142 0.645234 0.645326 0.645418 0.645509 0.645601 0.645693
+0.645784 0.645876 0.645968 0.64606 0.646151 0.646243 0.646335 0.646426
+0.646518 0.64661 0.646701 0.646793 0.646885 0.646976 0.647068 0.647159
+0.647251 0.647343 0.647434 0.647526 0.647618 0.647709 0.647801 0.647892
+0.647984 0.648075 0.648167 0.648259 0.64835 0.648442 0.648533 0.648625
+0.648716 0.648808 0.648899 0.648991 0.649082 0.649174 0.649265 0.649357
+0.649448 0.64954 0.649631 0.649723 0.649814 0.649906 0.649997 0.650089
+0.65018 0.650272 0.650363 0.650455 0.650546 0.650637 0.650729 0.65082
+0.650912 0.651003 0.651094 0.651186 0.651277 0.651368 0.65146 0.651551
+0.651643 0.651734 0.651825 0.651917 0.652008 0.652099 0.652191 0.652282
+0.652373 0.652465 0.652556 0.652647 0.652739 0.65283 0.652921 0.653012
+0.653104 0.653195 0.653286 0.653377 0.653469 0.65356 0.653651 0.653742
+0.653834 0.653925 0.654016 0.654107 0.654198 0.65429 0.654381 0.654472
+0.654563 0.654654 0.654746 0.654837 0.654928 0.655019 0.65511 0.655201
+0.655292 0.655384 0.655475 0.655566 0.655657 0.655748 0.655839 0.65593
+0.656021 0.656112 0.656204 0.656295 0.656386 0.656477 0.656568 0.656659
+0.65675 0.656841 0.656932 0.657023 0.657114 0.657205 0.657296 0.657387
+0.657478 0.657569 0.65766 0.657751 0.657842 0.657933 0.658024 0.658115
+0.658206 0.658297 0.658388 0.658479 0.65857 0.65866 0.658751 0.658842
+0.658933 0.659024 0.659115 0.659206 0.659297 0.659388 0.659478 0.659569
+0.65966 0.659751 0.659842 0.659933 0.660024 0.660114 0.660205 0.660296
+0.660387 0.660478 0.660568 0.660659 0.66075 0.660841 0.660932 0.661022
+0.661113 0.661204 0.661295 0.661385 0.661476 0.661567 0.661658 0.661748
+0.661839 0.66193 0.66202 0.662111 0.662202 0.662292 0.662383 0.662474
+0.662564 0.662655 0.662746 0.662836 0.662927 0.663018 0.663108 0.663199
+0.66329 0.66338 0.663471 0.663561 0.663652 0.663743 0.663833 0.663924
+0.664014 0.664105 0.664195 0.664286 0.664377 0.664467 0.664558 0.664648
+0.664739 0.664829 0.66492 0.66501 0.665101 0.665191 0.665282 0.665372
+0.665463 0.665553 0.665644 0.665734 0.665825 0.665915 0.666005 0.666096
+0.666186 0.666277 0.666367 0.666458 0.666548 0.666638 0.666729 0.666819
+0.666909 0.667 0.66709 0.667181 0.667271 0.667361 0.667452 0.667542
+0.667632 0.667723 0.667813 0.667903 0.667993 0.668084 0.668174 0.668264
+0.668355 0.668445 0.668535 0.668625 0.668716 0.668806 0.668896 0.668986
+0.669077 0.669167 0.669257 0.669347 0.669438 0.669528 0.669618 0.669708
+0.669798;
+#A 10000 0.669888 0.669979 0.670069 0.670159 0.670249 0.670339 0.670429
+0.670519 0.67061 0.6707 0.67079 0.67088 0.67097 0.67106 0.67115 0.67124
+0.67133 0.67142 0.67151 0.671601 0.671691 0.671781 0.671871 0.671961
+0.672051 0.672141 0.672231 0.672321 0.672411 0.672501 0.672591 0.672681
+0.672771 0.672861 0.672951 0.673041 0.673131 0.67322 0.67331 0.6734
+0.67349 0.67358 0.67367 0.67376 0.67385 0.67394 0.67403 0.674119 0.674209
+0.674299 0.674389 0.674479 0.674569 0.674659 0.674748 0.674838 0.674928
+0.675018 0.675108 0.675197 0.675287 0.675377 0.675467 0.675557 0.675646
+0.675736 0.675826 0.675916 0.676005 0.676095 0.676185 0.676275 0.676364
+0.676454 0.676544 0.676633 0.676723 0.676813 0.676902 0.676992 0.677082
+0.677171 0.677261 0.677351 0.67744 0.67753 0.67762 0.677709 0.677799
+0.677888 0.677978 0.678068 0.678157 0.678247 0.678336 0.678426 0.678515
+0.678605 0.678695 0.678784 0.678874 0.678963 0.679053 0.679142 0.679232
+0.679321 0.679411 0.6795 0.67959 0.679679 0.679769 0.679858 0.679947
+0.680037 0.680126 0.680216 0.680305 0.680395 0.680484 0.680574 0.680663
+0.680752 0.680842 0.680931 0.68102 0.68111 0.681199 0.681289 0.681378
+0.681467 0.681557 0.681646 0.681735 0.681825 0.681914 0.682003 0.682092
+0.682182 0.682271 0.68236 0.68245 0.682539 0.682628 0.682717 0.682806
+0.682896 0.682985 0.683074 0.683163 0.683253 0.683342 0.683431 0.68352
+0.683609 0.683699 0.683788 0.683877 0.683966 0.684055 0.684144 0.684233
+0.684323 0.684412 0.684501 0.68459 0.684679 0.684768 0.684857 0.684946
+0.685035 0.685124 0.685213 0.685302 0.685391 0.685481 0.68557 0.685659
+0.685748 0.685837 0.685926 0.686015 0.686104 0.686193 0.686282 0.686371
+0.686459 0.686548 0.686637 0.686726 0.686815 0.686904 0.686993 0.687082
+0.687171 0.68726 0.687349 0.687438 0.687527 0.687615 0.687704 0.687793
+0.687882 0.687971 0.68806 0.688148 0.688237 0.688326 0.688415 0.688504
+0.688592 0.688681 0.68877 0.688859 0.688948 0.689036 0.689125 0.689214
+0.689303 0.689391 0.68948 0.689569 0.689658 0.689746 0.689835 0.689924
+0.690012 0.690101 0.69019 0.690278 0.690367 0.690456 0.690544 0.690633
+0.690722 0.69081 0.690899 0.690987 0.691076 0.691165 0.691253 0.691342
+0.69143 0.691519 0.691607 0.691696 0.691785 0.691873 0.691962 0.69205
+0.692139 0.692227 0.692316 0.692404 0.692493 0.692581 0.69267 0.692758
+0.692846 0.692935 0.693023 0.693112 0.6932 0.693289 0.693377 0.693466
+0.693554 0.693642 0.693731 0.693819 0.693907 0.693996 0.694084 0.694173
+0.694261 0.694349 0.694438 0.694526 0.694614 0.694703 0.694791 0.694879
+0.694967 0.695056 0.695144 0.695232 0.69532 0.695409 0.695497 0.695585
+0.695673 0.695762 0.69585 0.695938 0.696026 0.696114 0.696203 0.696291
+0.696379 0.696467 0.696555 0.696643 0.696732 0.69682 0.696908 0.696996
+0.697084 0.697172 0.69726 0.697348 0.697437 0.697525 0.697613 0.697701
+0.697789 0.697877 0.697965 0.698053 0.698141 0.698229 0.698317 0.698405
+0.698493 0.698581 0.698669 0.698757 0.698845 0.698933 0.699021 0.699109
+0.699197 0.699285 0.699373 0.699461 0.699548 0.699636 0.699724 0.699812
+0.6999 0.699988 0.700076 0.700164 0.700251 0.700339 0.700427 0.700515
+0.700603 0.700691 0.700778 0.700866 0.700954 0.701042 0.70113 0.701217
+0.701305 0.701393 0.701481 0.701568 0.701656 0.701744 0.701832 0.701919
+0.702007 0.702095 0.702182 0.70227 0.702358 0.702445 0.702533 0.702621
+0.702708 0.702796 0.702884 0.702971 0.703059 0.703146 0.703234 0.703322
+0.703409 0.703497 0.703584 0.703672 0.703759 0.703847 0.703935 0.704022
+0.70411 0.704197 0.704285 0.704372 0.70446 0.704547 0.704635 0.704722
+0.70481 0.704897 0.704984 0.705072 0.705159 0.705247 0.705334 0.705422
+0.705509 0.705596 0.705684 0.705771 0.705859 0.705946 0.706033 0.706121
+0.706208 0.706295 0.706383 0.70647 0.706557 0.706645 0.706732 0.706819
+0.706906 0.706994 0.707081 0.707168 0.707255 0.707343 0.70743 0.707517
+0.707604 0.707692 0.707779 0.707866 0.707953 0.70804 0.708128 0.708215
+0.708302 0.708389 0.708476 0.708563 0.708651 0.708738 0.708825 0.708912
+0.708999 0.709086 0.709173 0.70926 0.709347 0.709434 0.709521 0.709608
+0.709695 0.709783 0.70987 0.709957 0.710044 0.710131 0.710218 0.710305
+0.710392 0.710478 0.710565 0.710652 0.710739 0.710826 0.710913 0.711
+0.711087 0.711174 0.711261 0.711348 0.711435 0.711522 0.711608 0.711695
+0.711782 0.711869 0.711956 0.712043 0.712129 0.712216 0.712303 0.71239
+0.712477 0.712563 0.71265 0.712737 0.712824 0.71291 0.712997 0.713084
+0.713171 0.713257 0.713344 0.713431 0.713517 0.713604 0.713691 0.713778
+0.713864 0.713951 0.714038 0.714124 0.714211 0.714297 0.714384 0.714471
+0.714557 0.714644 0.71473 0.714817 0.714904 0.71499 0.715077 0.715163
+0.71525 0.715336 0.715423 0.715509 0.715596 0.715682 0.715769 0.715855
+0.715942 0.716028 0.716115 0.716201 0.716288 0.716374 0.71646 0.716547
+0.716633 0.71672 0.716806 0.716892 0.716979 0.717065 0.717152 0.717238
+0.717324 0.717411 0.717497 0.717583 0.71767 0.717756 0.717842 0.717929
+0.718015 0.718101 0.718187 0.718274 0.71836 0.718446 0.718532 0.718619
+0.718705 0.718791 0.718877 0.718963 0.71905 0.719136 0.719222 0.719308
+0.719394 0.71948 0.719567 0.719653 0.719739 0.719825 0.719911 0.719997
+0.720083 0.720169 0.720255 0.720341 0.720428 0.720514 0.7206 0.720686
+0.720772 0.720858 0.720944 0.72103 0.721116 0.721202 0.721288 0.721374
+0.72146 0.721546 0.721631 0.721717 0.721803 0.721889 0.721975 0.722061
+0.722147 0.722233 0.722319 0.722405 0.72249 0.722576 0.722662 0.722748
+0.722834 0.72292 0.723005 0.723091 0.723177 0.723263 0.723349 0.723434
+0.72352 0.723606 0.723692 0.723777 0.723863 0.723949 0.724035 0.72412
+0.724206 0.724292 0.724377 0.724463 0.724549 0.724634 0.72472 0.724806
+0.724891 0.724977 0.725063 0.725148 0.725234 0.725319 0.725405 0.725491
+0.725576 0.725662 0.725747 0.725833 0.725918 0.726004 0.726089 0.726175
+0.72626 0.726346 0.726431 0.726517 0.726602 0.726688 0.726773 0.726859
+0.726944 0.727029 0.727115 0.7272 0.727286 0.727371 0.727456 0.727542
+0.727627 0.727713 0.727798 0.727883 0.727969 0.728054 0.728139 0.728225
+0.72831 0.728395 0.72848 0.728566 0.728651 0.728736 0.728821 0.728907
+0.728992 0.729077 0.729162 0.729248 0.729333 0.729418 0.729503 0.729588
+0.729673 0.729759 0.729844 0.729929 0.730014 0.730099 0.730184 0.730269
+0.730354 0.73044 0.730525 0.73061 0.730695 0.73078 0.730865 0.73095
+0.731035 0.73112 0.731205 0.73129 0.731375 0.73146 0.731545 0.73163
+0.731715 0.7318 0.731885 0.73197 0.732055 0.73214 0.732224 0.732309
+0.732394 0.732479 0.732564 0.732649 0.732734 0.732819 0.732903 0.732988
+0.733073 0.733158 0.733243 0.733328 0.733412 0.733497 0.733582 0.733667
+0.733751 0.733836 0.733921 0.734006 0.73409 0.734175 0.73426 0.734344
+0.734429 0.734514 0.734598 0.734683 0.734768 0.734852 0.734937 0.735022
+0.735106 0.735191 0.735276 0.73536 0.735445 0.735529 0.735614 0.735698
+0.735783 0.735867 0.735952 0.736037 0.736121 0.736206 0.73629 0.736374
+0.736459 0.736543 0.736628 0.736712 0.736797 0.736881 0.736966 0.73705
+0.737135 0.737219 0.737303 0.737388 0.737472 0.737556 0.737641 0.737725
+0.737809 0.737894 0.737978 0.738062 0.738147 0.738231 0.738315 0.7384
+0.738484 0.738568 0.738652 0.738737 0.738821 0.738905 0.738989 0.739074
+0.739158 0.739242 0.739326 0.73941 0.739494 0.739579 0.739663 0.739747
+0.739831 0.739915 0.739999 0.740083 0.740167 0.740252 0.740336 0.74042
+0.740504 0.740588 0.740672 0.740756 0.74084 0.740924 0.741008 0.741092
+0.741176 0.74126 0.741344 0.741428 0.741512 0.741596 0.74168 0.741764
+0.741847 0.741931 0.742015 0.742099 0.742183 0.742267 0.742351 0.742435
+0.742518 0.742602 0.742686 0.74277 0.742854 0.742938 0.743021 0.743105
+0.743189 0.743273 0.743356 0.74344 0.743524 0.743608 0.743691 0.743775
+0.743859 0.743942 0.744026 0.74411 0.744193 0.744277 0.744361 0.744444
+0.744528 0.744612 0.744695 0.744779 0.744862 0.744946 0.74503 0.745113
+0.745197 0.74528 0.745364 0.745447 0.745531 0.745614 0.745698 0.745781
+0.745865 0.745948 0.746032 0.746115 0.746199 0.746282 0.746366 0.746449
+0.746532 0.746616 0.746699 0.746783 0.746866 0.746949 0.747033 0.747116
+0.747199 0.747283 0.747366 0.747449 0.747533 0.747616 0.747699 0.747783
+0.747866 0.747949 0.748032 0.748116 0.748199 0.748282 0.748365 0.748449
+0.748532 0.748615 0.748698 0.748781 0.748864 0.748948 0.749031 0.749114
+0.749197 0.74928 0.749363 0.749446 0.749529 0.749612 0.749695 0.749779
+0.749862 0.749945 0.750028 0.750111 0.750194 0.750277 0.75036 0.750443
+0.750526 0.750609 0.750692 0.750775 0.750857 0.75094 0.751023 0.751106
+0.751189 0.751272 0.751355 0.751438 0.751521 0.751603 0.751686 0.751769
+0.751852 0.751935 0.752018 0.7521 0.752183 0.752266 0.752349 0.752432
+0.752514 0.752597 0.75268 0.752762 0.752845 0.752928 0.753011 0.753093
+0.753176 0.753259 0.753341 0.753424 0.753507 0.753589 0.753672 0.753754
+0.753837 0.75392 0.754002 0.754085 0.754167 0.75425 0.754333 0.754415
+0.754498 0.75458 0.754663 0.754745 0.754828 0.75491 0.754993 0.755075
+0.755158 0.75524 0.755322 0.755405 0.755487 0.75557 0.755652 0.755734
+0.755817 0.755899 0.755982 0.756064 0.756146 0.756229 0.756311;
+#A 11000 0.756393 0.756476 0.756558 0.75664 0.756722 0.756805 0.756887
+0.756969 0.757051 0.757134 0.757216 0.757298 0.75738 0.757462 0.757545
+0.757627 0.757709 0.757791 0.757873 0.757955 0.758038 0.75812 0.758202
+0.758284 0.758366 0.758448 0.75853 0.758612 0.758694 0.758776 0.758858
+0.75894 0.759022 0.759104 0.759186 0.759268 0.75935 0.759432 0.759514
+0.759596 0.759678 0.75976 0.759842 0.759924 0.760006 0.760088 0.760169
+0.760251 0.760333 0.760415 0.760497 0.760579 0.76066 0.760742 0.760824
+0.760906 0.760988 0.761069 0.761151 0.761233 0.761315 0.761396 0.761478
+0.76156 0.761642 0.761723 0.761805 0.761887 0.761968 0.76205 0.762132
+0.762213 0.762295 0.762376 0.762458 0.76254 0.762621 0.762703 0.762784
+0.762866 0.762947 0.763029 0.763111 0.763192 0.763274 0.763355 0.763437
+0.763518 0.7636 0.763681 0.763762 0.763844 0.763925 0.764007 0.764088
+0.76417 0.764251 0.764332 0.764414 0.764495 0.764576 0.764658 0.764739
+0.764821 0.764902 0.764983 0.765064 0.765146 0.765227 0.765308 0.76539
+0.765471 0.765552 0.765633 0.765714 0.765796 0.765877 0.765958 0.766039
+0.76612 0.766202 0.766283 0.766364 0.766445 0.766526 0.766607 0.766688
+0.766769 0.76685 0.766932 0.767013 0.767094 0.767175 0.767256 0.767337
+0.767418 0.767499 0.76758 0.767661 0.767742 0.767823 0.767904 0.767985
+0.768066 0.768147 0.768227 0.768308 0.768389 0.76847 0.768551 0.768632
+0.768713 0.768794 0.768874 0.768955 0.769036 0.769117 0.769198 0.769278
+0.769359 0.76944 0.769521 0.769601 0.769682 0.769763 0.769844 0.769924
+0.770005 0.770086 0.770166 0.770247 0.770328 0.770408 0.770489 0.77057
+0.77065 0.770731 0.770811 0.770892 0.770973 0.771053 0.771134 0.771214
+0.771295 0.771375 0.771456 0.771536 0.771617 0.771697 0.771778 0.771858
+0.771939 0.772019 0.7721 0.77218 0.772261 0.772341 0.772421 0.772502
+0.772582 0.772663 0.772743 0.772823 0.772904 0.772984 0.773064 0.773144
+0.773225 0.773305 0.773385 0.773466 0.773546 0.773626 0.773706 0.773787
+0.773867 0.773947 0.774027 0.774107 0.774188 0.774268 0.774348 0.774428
+0.774508 0.774588 0.774668 0.774749 0.774829 0.774909 0.774989 0.775069
+0.775149 0.775229 0.775309 0.775389 0.775469 0.775549 0.775629 0.775709
+0.775789 0.775869 0.775949 0.776029 0.776109 0.776189 0.776269 0.776349
+0.776428 0.776508 0.776588 0.776668 0.776748 0.776828 0.776908 0.776987
+0.777067 0.777147 0.777227 0.777307 0.777386 0.777466 0.777546 0.777626
+0.777705 0.777785 0.777865 0.777945 0.778024 0.778104 0.778184 0.778263
+0.778343 0.778423 0.778502 0.778582 0.778661 0.778741 0.778821 0.7789
+0.77898 0.779059 0.779139 0.779218 0.779298 0.779377 0.779457 0.779536
+0.779616 0.779695 0.779775 0.779854 0.779934 0.780013 0.780093 0.780172
+0.780251 0.780331 0.78041 0.78049 0.780569 0.780648 0.780728 0.780807
+0.780886 0.780966 0.781045 0.781124 0.781203 0.781283 0.781362 0.781441
+0.78152 0.7816 0.781679 0.781758 0.781837 0.781916 0.781996 0.782075
+0.782154 0.782233 0.782312 0.782391 0.78247 0.78255 0.782629 0.782708
+0.782787 0.782866 0.782945 0.783024 0.783103 0.783182 0.783261 0.78334
+0.783419 0.783498 0.783577 0.783656 0.783735 0.783814 0.783893 0.783972
+0.784051 0.78413 0.784208 0.784287 0.784366 0.784445 0.784524 0.784603
+0.784681 0.78476 0.784839 0.784918 0.784997 0.785075 0.785154 0.785233
+0.785312 0.78539 0.785469 0.785548 0.785626 0.785705 0.785784 0.785863
+0.785941 0.78602 0.786098 0.786177 0.786256 0.786334 0.786413 0.786491
+0.78657 0.786649 0.786727 0.786806 0.786884 0.786963 0.787041 0.78712
+0.787198 0.787277 0.787355 0.787434 0.787512 0.78759 0.787669 0.787747
+0.787826 0.787904 0.787982 0.788061 0.788139 0.788218 0.788296 0.788374
+0.788453 0.788531 0.788609 0.788687 0.788766 0.788844 0.788922 0.789
+0.789079 0.789157 0.789235 0.789313 0.789392 0.78947 0.789548 0.789626
+0.789704 0.789782 0.78986 0.789939 0.790017 0.790095 0.790173 0.790251
+0.790329 0.790407 0.790485 0.790563 0.790641 0.790719 0.790797 0.790875
+0.790953 0.791031 0.791109 0.791187 0.791265 0.791343 0.791421 0.791499
+0.791576 0.791654 0.791732 0.79181 0.791888 0.791966 0.792044 0.792121
+0.792199 0.792277 0.792355 0.792433 0.79251 0.792588 0.792666 0.792744
+0.792821 0.792899 0.792977 0.793054 0.793132 0.79321 0.793287 0.793365
+0.793443 0.79352 0.793598 0.793675 0.793753 0.793831 0.793908 0.793986
+0.794063 0.794141 0.794218 0.794296 0.794373 0.794451 0.794528 0.794606
+0.794683 0.794761 0.794838 0.794915 0.794993 0.79507 0.795148 0.795225
+0.795303 0.79538 0.795457 0.795535 0.795612 0.795689 0.795766 0.795844
+0.795921 0.795998 0.796076 0.796153 0.79623 0.796307 0.796385 0.796462
+0.796539 0.796616 0.796693 0.796771 0.796848 0.796925 0.797002 0.797079
+0.797156 0.797233 0.79731 0.797387 0.797464 0.797542 0.797619 0.797696
+0.797773 0.79785 0.797927 0.798004 0.798081 0.798158 0.798235 0.798311
+0.798388 0.798465 0.798542 0.798619 0.798696 0.798773 0.79885 0.798927
+0.799004 0.79908 0.799157 0.799234 0.799311 0.799388 0.799464 0.799541
+0.799618 0.799695 0.799771 0.799848 0.799925 0.800002 0.800078 0.800155
+0.800232 0.800308 0.800385 0.800462 0.800538 0.800615 0.800691 0.800768
+0.800845 0.800921 0.800998 0.801074 0.801151 0.801227 0.801304 0.80138
+0.801457 0.801533 0.80161 0.801686 0.801763 0.801839 0.801916 0.801992
+0.802068 0.802145 0.802221 0.802298 0.802374 0.80245 0.802527 0.802603
+0.802679 0.802756 0.802832 0.802908 0.802984 0.803061 0.803137 0.803213
+0.803289 0.803366 0.803442 0.803518 0.803594 0.80367 0.803746 0.803823
+0.803899 0.803975 0.804051 0.804127 0.804203 0.804279 0.804355 0.804431
+0.804507 0.804583 0.80466 0.804736 0.804812 0.804888 0.804964 0.80504
+0.805115 0.805191 0.805267 0.805343 0.805419 0.805495 0.805571 0.805647
+0.805723 0.805799 0.805874 0.80595 0.806026 0.806102 0.806178 0.806253
+0.806329 0.806405 0.806481 0.806557 0.806632 0.806708 0.806784 0.806859
+0.806935 0.807011 0.807086 0.807162 0.807238 0.807313 0.807389 0.807465
+0.80754 0.807616 0.807691 0.807767 0.807842 0.807918 0.807994 0.808069
+0.808145 0.80822 0.808296 0.808371 0.808447 0.808522 0.808597 0.808673
+0.808748 0.808824 0.808899 0.808974 0.80905 0.809125 0.809201 0.809276
+0.809351 0.809426 0.809502 0.809577 0.809652 0.809728 0.809803 0.809878
+0.809953 0.810029 0.810104 0.810179 0.810254 0.810329 0.810405 0.81048
+0.810555 0.81063 0.810705 0.81078 0.810855 0.81093 0.811005 0.811081
+0.811156 0.811231 0.811306 0.811381 0.811456 0.811531 0.811606 0.811681
+0.811756 0.811831 0.811906 0.81198 0.812055 0.81213 0.812205 0.81228
+0.812355 0.81243 0.812505 0.812579 0.812654 0.812729 0.812804 0.812879
+0.812953 0.813028 0.813103 0.813178 0.813252 0.813327 0.813402 0.813477
+0.813551 0.813626 0.813701 0.813775 0.81385 0.813924 0.813999 0.814074
+0.814148 0.814223 0.814297 0.814372 0.814447 0.814521 0.814596 0.81467
+0.814745 0.814819 0.814894 0.814968 0.815042 0.815117 0.815191 0.815266
+0.81534 0.815415 0.815489 0.815563 0.815638 0.815712 0.815786 0.815861
+0.815935 0.816009 0.816084 0.816158 0.816232 0.816306 0.816381 0.816455
+0.816529 0.816603 0.816678 0.816752 0.816826 0.8169 0.816974 0.817048
+0.817123 0.817197 0.817271 0.817345 0.817419 0.817493 0.817567 0.817641
+0.817715 0.817789 0.817863 0.817937 0.818011 0.818085 0.818159 0.818233
+0.818307 0.818381 0.818455 0.818529 0.818603 0.818677 0.81875 0.818824
+0.818898 0.818972 0.819046 0.81912 0.819193 0.819267 0.819341 0.819415
+0.819488 0.819562 0.819636 0.81971 0.819783 0.819857 0.819931 0.820004
+0.820078 0.820152 0.820225 0.820299 0.820373 0.820446 0.82052 0.820593
+0.820667 0.820741 0.820814 0.820888 0.820961 0.821035 0.821108 0.821182
+0.821255 0.821329 0.821402 0.821475 0.821549 0.821622 0.821696 0.821769
+0.821842 0.821916 0.821989 0.822062 0.822136 0.822209 0.822282 0.822356
+0.822429 0.822502 0.822576 0.822649 0.822722 0.822795 0.822868 0.822942
+0.823015 0.823088 0.823161 0.823234 0.823307 0.823381 0.823454 0.823527
+0.8236 0.823673 0.823746 0.823819 0.823892 0.823965 0.824038 0.824111
+0.824184 0.824257 0.82433 0.824403 0.824476 0.824549 0.824622 0.824695
+0.824768 0.824841 0.824914 0.824986 0.825059 0.825132 0.825205 0.825278
+0.825351 0.825423 0.825496 0.825569 0.825642 0.825714 0.825787 0.82586
+0.825933 0.826005 0.826078 0.826151 0.826223 0.826296 0.826369 0.826441
+0.826514 0.826586 0.826659 0.826732 0.826804 0.826877 0.826949 0.827022
+0.827094 0.827167 0.827239 0.827312 0.827384 0.827457 0.827529 0.827602
+0.827674 0.827746 0.827819 0.827891 0.827964 0.828036 0.828108 0.828181
+0.828253 0.828325 0.828398 0.82847 0.828542 0.828614 0.828687 0.828759
+0.828831 0.828903 0.828976 0.829048 0.82912 0.829192 0.829264 0.829336
+0.829409 0.829481 0.829553 0.829625 0.829697 0.829769 0.829841 0.829913
+0.829985 0.830057 0.830129 0.830201 0.830273 0.830345 0.830417 0.830489
+0.830561 0.830633 0.830705 0.830777 0.830849 0.830921 0.830992 0.831064
+0.831136 0.831208 0.83128 0.831352 0.831423 0.831495 0.831567 0.831639
+0.83171 0.831782 0.831854 0.831926 0.831997 0.832069 0.832141 0.832212
+0.832284 0.832355 0.832427 0.832499 0.83257 0.832642 0.832713 0.832785
+0.832857 0.832928 0.833 0.833071 0.833143 0.833214 0.833286 0.833357
+0.833429;
+#A 12000 0.8335 0.833571 0.833643 0.833714 0.833786 0.833857 0.833928
+0.834 0.834071 0.834142 0.834214 0.834285 0.834356 0.834428 0.834499
+0.83457 0.834641 0.834713 0.834784 0.834855 0.834926 0.834997 0.835068
+0.83514 0.835211 0.835282 0.835353 0.835424 0.835495 0.835566 0.835637
+0.835708 0.835779 0.835851 0.835922 0.835993 0.836064 0.836134 0.836205
+0.836276 0.836347 0.836418 0.836489 0.83656 0.836631 0.836702 0.836773
+0.836844 0.836914 0.836985 0.837056 0.837127 0.837198 0.837269 0.837339
+0.83741 0.837481 0.837552 0.837622 0.837693 0.837764 0.837834 0.837905
+0.837976 0.838046 0.838117 0.838188 0.838258 0.838329 0.838399 0.83847
+0.838541 0.838611 0.838682 0.838752 0.838823 0.838893 0.838964 0.839034
+0.839105 0.839175 0.839245 0.839316 0.839386 0.839457 0.839527 0.839597
+0.839668 0.839738 0.839809 0.839879 0.839949 0.840019 0.84009 0.84016
+0.84023 0.840301 0.840371 0.840441 0.840511 0.840581 0.840652 0.840722
+0.840792 0.840862 0.840932 0.841002 0.841072 0.841143 0.841213 0.841283
+0.841353 0.841423 0.841493 0.841563 0.841633 0.841703 0.841773 0.841843
+0.841913 0.841983 0.842053 0.842123 0.842192 0.842262 0.842332 0.842402
+0.842472 0.842542 0.842612 0.842681 0.842751 0.842821 0.842891 0.842961
+0.84303 0.8431 0.84317 0.84324 0.843309 0.843379 0.843449 0.843518
+0.843588 0.843658 0.843727 0.843797 0.843867 0.843936 0.844006 0.844075
+0.844145 0.844214 0.844284 0.844353 0.844423 0.844492 0.844562 0.844631
+0.844701 0.84477 0.84484 0.844909 0.844979 0.845048 0.845117 0.845187
+0.845256 0.845325 0.845395 0.845464 0.845533 0.845603 0.845672 0.845741
+0.84581 0.84588 0.845949 0.846018 0.846087 0.846156 0.846226 0.846295
+0.846364 0.846433 0.846502 0.846571 0.84664 0.846709 0.846779 0.846848
+0.846917 0.846986 0.847055 0.847124 0.847193 0.847262 0.847331 0.8474
+0.847469 0.847538 0.847606 0.847675 0.847744 0.847813 0.847882 0.847951
+0.84802 0.848089 0.848157 0.848226 0.848295 0.848364 0.848433 0.848501
+0.84857 0.848639 0.848707 0.848776 0.848845 0.848914 0.848982 0.849051
+0.849119 0.849188 0.849257 0.849325 0.849394 0.849463 0.849531 0.8496
+0.849668 0.849737 0.849805 0.849874 0.849942 0.850011 0.850079 0.850148
+0.850216 0.850284 0.850353 0.850421 0.85049 0.850558 0.850626 0.850695
+0.850763 0.850831 0.8509 0.850968 0.851036 0.851104 0.851173 0.851241
+0.851309 0.851377 0.851446 0.851514 0.851582 0.85165 0.851718 0.851786
+0.851855 0.851923 0.851991 0.852059 0.852127 0.852195 0.852263 0.852331
+0.852399 0.852467 0.852535 0.852603 0.852671 0.852739 0.852807 0.852875
+0.852943 0.853011 0.853079 0.853146 0.853214 0.853282 0.85335 0.853418
+0.853486 0.853553 0.853621 0.853689 0.853757 0.853824 0.853892 0.85396
+0.854028 0.854095 0.854163 0.854231 0.854298 0.854366 0.854434 0.854501
+0.854569 0.854636 0.854704 0.854772 0.854839 0.854907 0.854974 0.855042
+0.855109 0.855177 0.855244 0.855312 0.855379 0.855447 0.855514 0.855581
+0.855649 0.855716 0.855783 0.855851 0.855918 0.855986 0.856053 0.85612
+0.856187 0.856255 0.856322 0.856389 0.856456 0.856524 0.856591 0.856658
+0.856725 0.856792 0.85686 0.856927 0.856994 0.857061 0.857128 0.857195
+0.857262 0.857329 0.857396 0.857463 0.85753 0.857597 0.857664 0.857731
+0.857798 0.857865 0.857932 0.857999 0.858066 0.858133 0.8582 0.858267
+0.858334 0.858401 0.858467 0.858534 0.858601 0.858668 0.858735 0.858801
+0.858868 0.858935 0.859002 0.859069 0.859135 0.859202 0.859269 0.859335
+0.859402 0.859469 0.859535 0.859602 0.859668 0.859735 0.859802 0.859868
+0.859935 0.860001 0.860068 0.860134 0.860201 0.860267 0.860334 0.8604
+0.860467 0.860533 0.8606 0.860666 0.860732 0.860799 0.860865 0.860931
+0.860998 0.861064 0.86113 0.861197 0.861263 0.861329 0.861396 0.861462
+0.861528 0.861594 0.86166 0.861727 0.861793 0.861859 0.861925 0.861991
+0.862057 0.862124 0.86219 0.862256 0.862322 0.862388 0.862454 0.86252
+0.862586 0.862652 0.862718 0.862784 0.86285 0.862916 0.862982 0.863048
+0.863114 0.86318 0.863245 0.863311 0.863377 0.863443 0.863509 0.863575
+0.863641 0.863706 0.863772 0.863838 0.863904 0.863969 0.864035 0.864101
+0.864166 0.864232 0.864298 0.864364 0.864429 0.864495 0.86456 0.864626
+0.864692 0.864757 0.864823 0.864888 0.864954 0.865019 0.865085 0.86515
+0.865216 0.865281 0.865347 0.865412 0.865478 0.865543 0.865609 0.865674
+0.865739 0.865805 0.86587 0.865935 0.866001 0.866066 0.866131 0.866197
+0.866262 0.866327 0.866392 0.866458 0.866523 0.866588 0.866653 0.866718
+0.866784 0.866849 0.866914 0.866979 0.867044 0.867109 0.867174 0.867239
+0.867304 0.867369 0.867434 0.867499 0.867564 0.867629 0.867694 0.867759
+0.867824 0.867889 0.867954 0.868019 0.868084 0.868149 0.868214 0.868279
+0.868343 0.868408 0.868473 0.868538 0.868603 0.868667 0.868732 0.868797
+0.868862 0.868926 0.868991 0.869056 0.86912 0.869185 0.86925 0.869314
+0.869379 0.869444 0.869508 0.869573 0.869637 0.869702 0.869767 0.869831
+0.869896 0.86996 0.870025 0.870089 0.870153 0.870218 0.870282 0.870347
+0.870411 0.870476 0.87054 0.870604 0.870669 0.870733 0.870797 0.870862
+0.870926 0.87099 0.871054 0.871119 0.871183 0.871247 0.871311 0.871376
+0.87144 0.871504 0.871568 0.871632 0.871696 0.871761 0.871825 0.871889
+0.871953 0.872017 0.872081 0.872145 0.872209 0.872273 0.872337 0.872401
+0.872465 0.872529 0.872593 0.872657 0.872721 0.872785 0.872848 0.872912
+0.872976 0.87304 0.873104 0.873168 0.873231 0.873295 0.873359 0.873423
+0.873487 0.87355 0.873614 0.873678 0.873741 0.873805 0.873869 0.873932
+0.873996 0.87406 0.874123 0.874187 0.87425 0.874314 0.874378 0.874441
+0.874505 0.874568 0.874632 0.874695 0.874759 0.874822 0.874886 0.874949
+0.875012 0.875076 0.875139 0.875203 0.875266 0.875329 0.875393 0.875456
+0.875519 0.875583 0.875646 0.875709 0.875772 0.875836 0.875899 0.875962
+0.876025 0.876088 0.876152 0.876215 0.876278 0.876341 0.876404 0.876467
+0.87653 0.876593 0.876656 0.87672 0.876783 0.876846 0.876909 0.876972
+0.877035 0.877097 0.87716 0.877223 0.877286 0.877349 0.877412 0.877475
+0.877538 0.877601 0.877664 0.877726 0.877789 0.877852 0.877915 0.877977
+0.87804 0.878103 0.878166 0.878228 0.878291 0.878354 0.878416 0.878479
+0.878542 0.878604 0.878667 0.87873 0.878792 0.878855 0.878917 0.87898
+0.879042 0.879105 0.879167 0.87923 0.879292 0.879355 0.879417 0.87948
+0.879542 0.879605 0.879667 0.879729 0.879792 0.879854 0.879916 0.879979
+0.880041 0.880103 0.880166 0.880228 0.88029 0.880352 0.880415 0.880477
+0.880539 0.880601 0.880663 0.880726 0.880788 0.88085 0.880912 0.880974
+0.881036 0.881098 0.88116 0.881222 0.881284 0.881346 0.881408 0.88147
+0.881532 0.881594 0.881656 0.881718 0.88178 0.881842 0.881904 0.881966
+0.882028 0.882089 0.882151 0.882213 0.882275 0.882337 0.882398 0.88246
+0.882522 0.882584 0.882645 0.882707 0.882769 0.88283 0.882892 0.882954
+0.883015 0.883077 0.883139 0.8832 0.883262 0.883323 0.883385 0.883446
+0.883508 0.883569 0.883631 0.883692 0.883754 0.883815 0.883877 0.883938
+0.884 0.884061 0.884122 0.884184 0.884245 0.884306 0.884368 0.884429
+0.88449 0.884552 0.884613 0.884674 0.884735 0.884797 0.884858 0.884919
+0.88498 0.885041 0.885103 0.885164 0.885225 0.885286 0.885347 0.885408
+0.885469 0.88553 0.885591 0.885652 0.885713 0.885774 0.885835 0.885896
+0.885957 0.886018 0.886079 0.88614 0.886201 0.886262 0.886323 0.886384
+0.886444 0.886505 0.886566 0.886627 0.886688 0.886748 0.886809 0.88687
+0.886931 0.886991 0.887052 0.887113 0.887173 0.887234 0.887295 0.887355
+0.887416 0.887477 0.887537 0.887598 0.887658 0.887719 0.887779 0.88784
+0.8879 0.887961 0.888021 0.888082 0.888142 0.888203 0.888263 0.888323
+0.888384 0.888444 0.888505 0.888565 0.888625 0.888686 0.888746 0.888806
+0.888866 0.888927 0.888987 0.889047 0.889107 0.889168 0.889228 0.889288
+0.889348 0.889408 0.889468 0.889529 0.889589 0.889649 0.889709 0.889769
+0.889829 0.889889 0.889949 0.890009 0.890069 0.890129 0.890189 0.890249
+0.890309 0.890369 0.890429 0.890488 0.890548 0.890608 0.890668 0.890728
+0.890788 0.890847 0.890907 0.890967 0.891027 0.891086 0.891146 0.891206
+0.891266 0.891325 0.891385 0.891445 0.891504 0.891564 0.891623 0.891683
+0.891743 0.891802 0.891862 0.891921 0.891981 0.89204 0.8921 0.892159
+0.892219 0.892278 0.892338 0.892397 0.892457 0.892516 0.892575 0.892635
+0.892694 0.892753 0.892813 0.892872 0.892931 0.892991 0.89305 0.893109
+0.893168 0.893228 0.893287 0.893346 0.893405 0.893464 0.893524 0.893583
+0.893642 0.893701 0.89376 0.893819 0.893878 0.893937 0.893996 0.894055
+0.894114 0.894173 0.894232 0.894291 0.89435 0.894409 0.894468 0.894527
+0.894586 0.894645 0.894704 0.894762 0.894821 0.89488 0.894939 0.894998
+0.895056 0.895115 0.895174 0.895233 0.895291 0.89535 0.895409 0.895467
+0.895526 0.895585 0.895643 0.895702 0.895761 0.895819 0.895878 0.895936
+0.895995 0.896053 0.896112 0.89617 0.896229 0.896287 0.896346 0.896404
+0.896463 0.896521 0.896579 0.896638 0.896696 0.896755 0.896813 0.896871
+0.896929 0.896988 0.897046 0.897104 0.897163 0.897221 0.897279 0.897337
+0.897395 0.897454 0.897512 0.89757 0.897628 0.897686 0.897744 0.897802
+0.89786 0.897918 0.897977 0.898035 0.898093 0.898151 0.898209 0.898266
+0.898324;
+#A 13000 0.898382 0.89844 0.898498 0.898556 0.898614 0.898672 0.89873
+0.898788 0.898845 0.898903 0.898961 0.899019 0.899077 0.899134 0.899192
+0.89925 0.899307 0.899365 0.899423 0.899481 0.899538 0.899596 0.899653
+0.899711 0.899769 0.899826 0.899884 0.899941 0.899999 0.900056 0.900114
+0.900171 0.900229 0.900286 0.900344 0.900401 0.900459 0.900516 0.900573
+0.900631 0.900688 0.900745 0.900803 0.90086 0.900917 0.900975 0.901032
+0.901089 0.901146 0.901204 0.901261 0.901318 0.901375 0.901432 0.901489
+0.901547 0.901604 0.901661 0.901718 0.901775 0.901832 0.901889 0.901946
+0.902003 0.90206 0.902117 0.902174 0.902231 0.902288 0.902345 0.902402
+0.902459 0.902516 0.902573 0.902629 0.902686 0.902743 0.9028 0.902857
+0.902913 0.90297 0.903027 0.903084 0.90314 0.903197 0.903254 0.90331
+0.903367 0.903424 0.90348 0.903537 0.903594 0.90365 0.903707 0.903763
+0.90382 0.903876 0.903933 0.903989 0.904046 0.904102 0.904159 0.904215
+0.904272 0.904328 0.904384 0.904441 0.904497 0.904554 0.90461 0.904666
+0.904723 0.904779 0.904835 0.904891 0.904948 0.905004 0.90506 0.905116
+0.905172 0.905229 0.905285 0.905341 0.905397 0.905453 0.905509 0.905565
+0.905621 0.905677 0.905733 0.905789 0.905845 0.905901 0.905957 0.906013
+0.906069 0.906125 0.906181 0.906237 0.906293 0.906349 0.906405 0.906461
+0.906516 0.906572 0.906628 0.906684 0.90674 0.906795 0.906851 0.906907
+0.906962 0.907018 0.907074 0.90713 0.907185 0.907241 0.907296 0.907352
+0.907408 0.907463 0.907519 0.907574 0.90763 0.907685 0.907741 0.907796
+0.907852 0.907907 0.907963 0.908018 0.908073 0.908129 0.908184 0.90824
+0.908295 0.90835 0.908406 0.908461 0.908516 0.908571 0.908627 0.908682
+0.908737 0.908792 0.908848 0.908903 0.908958 0.909013 0.909068 0.909123
+0.909178 0.909234 0.909289 0.909344 0.909399 0.909454 0.909509 0.909564
+0.909619 0.909674 0.909729 0.909784 0.909839 0.909894 0.909948 0.910003
+0.910058 0.910113 0.910168 0.910223 0.910277 0.910332 0.910387 0.910442
+0.910497 0.910551 0.910606 0.910661 0.910715 0.91077 0.910825 0.910879
+0.910934 0.910989 0.911043 0.911098 0.911152 0.911207 0.911261 0.911316
+0.91137 0.911425 0.911479 0.911534 0.911588 0.911643 0.911697 0.911752
+0.911806 0.91186 0.911915 0.911969 0.912023 0.912078 0.912132 0.912186
+0.91224 0.912295 0.912349 0.912403 0.912457 0.912511 0.912566 0.91262
+0.912674 0.912728 0.912782 0.912836 0.91289 0.912944 0.912998 0.913052
+0.913107 0.913161 0.913215 0.913269 0.913322 0.913376 0.91343 0.913484
+0.913538 0.913592 0.913646 0.9137 0.913754 0.913807 0.913861 0.913915
+0.913969 0.914023 0.914076 0.91413 0.914184 0.914237 0.914291 0.914345
+0.914398 0.914452 0.914506 0.914559 0.914613 0.914666 0.91472 0.914774
+0.914827 0.914881 0.914934 0.914988 0.915041 0.915095 0.915148 0.915201
+0.915255 0.915308 0.915362 0.915415 0.915468 0.915522 0.915575 0.915628
+0.915682 0.915735 0.915788 0.915841 0.915895 0.915948 0.916001 0.916054
+0.916107 0.91616 0.916214 0.916267 0.91632 0.916373 0.916426 0.916479
+0.916532 0.916585 0.916638 0.916691 0.916744 0.916797 0.91685 0.916903
+0.916956 0.917009 0.917062 0.917114 0.917167 0.91722 0.917273 0.917326
+0.917379 0.917431 0.917484 0.917537 0.91759 0.917642 0.917695 0.917748
+0.9178 0.917853 0.917906 0.917958 0.918011 0.918064 0.918116 0.918169
+0.918221 0.918274 0.918326 0.918379 0.918431 0.918484 0.918536 0.918589
+0.918641 0.918694 0.918746 0.918798 0.918851 0.918903 0.918955 0.919008
+0.91906 0.919112 0.919165 0.919217 0.919269 0.919321 0.919374 0.919426
+0.919478 0.91953 0.919582 0.919634 0.919687 0.919739 0.919791 0.919843
+0.919895 0.919947 0.919999 0.920051 0.920103 0.920155 0.920207 0.920259
+0.920311 0.920363 0.920415 0.920466 0.920518 0.92057 0.920622 0.920674
+0.920726 0.920777 0.920829 0.920881 0.920933 0.920985 0.921036 0.921088
+0.92114 0.921191 0.921243 0.921295 0.921346 0.921398 0.921449 0.921501
+0.921553 0.921604 0.921656 0.921707 0.921759 0.92181 0.921862 0.921913
+0.921965 0.922016 0.922067 0.922119 0.92217 0.922221 0.922273 0.922324
+0.922376 0.922427 0.922478 0.922529 0.922581 0.922632 0.922683 0.922734
+0.922785 0.922837 0.922888 0.922939 0.92299 0.923041 0.923092 0.923143
+0.923194 0.923245 0.923297 0.923348 0.923399 0.92345 0.9235 0.923551
+0.923602 0.923653 0.923704 0.923755 0.923806 0.923857 0.923908 0.923959
+0.924009 0.92406 0.924111 0.924162 0.924212 0.924263 0.924314 0.924365
+0.924415 0.924466 0.924517 0.924567 0.924618 0.924669 0.924719 0.92477
+0.92482 0.924871 0.924921 0.924972 0.925022 0.925073 0.925123 0.925174
+0.925224 0.925275 0.925325 0.925376 0.925426 0.925476 0.925527 0.925577
+0.925627 0.925678 0.925728 0.925778 0.925828 0.925879 0.925929 0.925979
+0.926029 0.926079 0.92613 0.92618 0.92623 0.92628 0.92633 0.92638 0.92643
+0.92648 0.92653 0.92658 0.92663 0.92668 0.92673 0.92678 0.92683 0.92688
+0.92693 0.92698 0.92703 0.92708 0.92713 0.927179 0.927229 0.927279
+0.927329 0.927379 0.927428 0.927478 0.927528 0.927577 0.927627 0.927677
+0.927727 0.927776 0.927826 0.927875 0.927925 0.927975 0.928024 0.928074
+0.928123 0.928173 0.928222 0.928272 0.928321 0.928371 0.92842 0.928469
+0.928519 0.928568 0.928618 0.928667 0.928716 0.928766 0.928815 0.928864
+0.928914 0.928963 0.929012 0.929061 0.929111 0.92916 0.929209 0.929258
+0.929307 0.929356 0.929406 0.929455 0.929504 0.929553 0.929602 0.929651
+0.9297 0.929749 0.929798 0.929847 0.929896 0.929945 0.929994 0.930043
+0.930092 0.93014 0.930189 0.930238 0.930287 0.930336 0.930385 0.930433
+0.930482 0.930531 0.93058 0.930628 0.930677 0.930726 0.930775 0.930823
+0.930872 0.930921 0.930969 0.931018 0.931066 0.931115 0.931163 0.931212
+0.931261 0.931309 0.931358 0.931406 0.931454 0.931503 0.931551 0.9316
+0.931648 0.931696 0.931745 0.931793 0.931842 0.93189 0.931938 0.931986
+0.932035 0.932083 0.932131 0.932179 0.932228 0.932276 0.932324 0.932372
+0.93242 0.932468 0.932517 0.932565 0.932613 0.932661 0.932709 0.932757
+0.932805 0.932853 0.932901 0.932949 0.932997 0.933045 0.933093 0.93314
+0.933188 0.933236 0.933284 0.933332 0.93338 0.933428 0.933475 0.933523
+0.933571 0.933619 0.933666 0.933714 0.933762 0.933809 0.933857 0.933905
+0.933952 0.934 0.934048 0.934095 0.934143 0.93419 0.934238 0.934285
+0.934333 0.93438 0.934428 0.934475 0.934523 0.93457 0.934618 0.934665
+0.934712 0.93476 0.934807 0.934854 0.934902 0.934949 0.934996 0.935044
+0.935091 0.935138 0.935185 0.935232 0.93528 0.935327 0.935374 0.935421
+0.935468 0.935515 0.935562 0.935609 0.935656 0.935704 0.935751 0.935798
+0.935845 0.935892 0.935938 0.935985 0.936032 0.936079 0.936126 0.936173
+0.93622 0.936267 0.936314 0.93636 0.936407 0.936454 0.936501 0.936548
+0.936594 0.936641 0.936688 0.936734 0.936781 0.936828 0.936874 0.936921
+0.936968 0.937014 0.937061 0.937107 0.937154 0.9372 0.937247 0.937293
+0.93734 0.937386 0.937433 0.937479 0.937526 0.937572 0.937618 0.937665
+0.937711 0.937757 0.937804 0.93785 0.937896 0.937943 0.937989 0.938035
+0.938081 0.938127 0.938174 0.93822 0.938266 0.938312 0.938358 0.938404
+0.93845 0.938497 0.938543 0.938589 0.938635 0.938681 0.938727 0.938773
+0.938819 0.938865 0.93891 0.938956 0.939002 0.939048 0.939094 0.93914
+0.939186 0.939232 0.939277 0.939323 0.939369 0.939415 0.93946 0.939506
+0.939552 0.939597 0.939643 0.939689 0.939734 0.93978 0.939826 0.939871
+0.939917 0.939962 0.940008 0.940054 0.940099 0.940144 0.94019 0.940235
+0.940281 0.940326 0.940372 0.940417 0.940463 0.940508 0.940553 0.940599
+0.940644 0.940689 0.940734 0.94078 0.940825 0.94087 0.940915 0.940961
+0.941006 0.941051 0.941096 0.941141 0.941186 0.941231 0.941277 0.941322
+0.941367 0.941412 0.941457 0.941502 0.941547 0.941592 0.941637 0.941682
+0.941727 0.941772 0.941816 0.941861 0.941906 0.941951 0.941996 0.942041
+0.942085 0.94213 0.942175 0.94222 0.942264 0.942309 0.942354 0.942399
+0.942443 0.942488 0.942532 0.942577 0.942622 0.942666 0.942711 0.942755
+0.9428 0.942845 0.942889 0.942933 0.942978 0.943022 0.943067 0.943111
+0.943156 0.9432 0.943244 0.943289 0.943333 0.943377 0.943422 0.943466
+0.94351 0.943555 0.943599 0.943643 0.943687 0.943731 0.943776 0.94382
+0.943864 0.943908 0.943952 0.943996 0.94404 0.944084 0.944129 0.944173
+0.944217 0.944261 0.944305 0.944348 0.944392 0.944436 0.94448 0.944524
+0.944568 0.944612 0.944656 0.9447 0.944743 0.944787 0.944831 0.944875
+0.944919 0.944962 0.945006 0.94505 0.945093 0.945137 0.945181 0.945224
+0.945268 0.945312 0.945355 0.945399 0.945442 0.945486 0.945529 0.945573
+0.945616 0.94566 0.945703 0.945747 0.94579 0.945834 0.945877 0.94592
+0.945964 0.946007 0.94605 0.946094 0.946137 0.94618 0.946224 0.946267
+0.94631 0.946353 0.946396 0.94644 0.946483 0.946526 0.946569 0.946612
+0.946655 0.946698 0.946741 0.946784 0.946827 0.946871 0.946913 0.946956
+0.946999 0.947042 0.947085 0.947128 0.947171 0.947214 0.947257 0.9473
+0.947343 0.947385 0.947428 0.947471 0.947514 0.947556 0.947599 0.947642
+0.947685 0.947727 0.94777 0.947813 0.947855 0.947898 0.947941 0.947983
+0.948026 0.948068 0.948111 0.948153 0.948196 0.948238 0.948281 0.948323
+0.948366 0.948408 0.948451 0.948493 0.948535 0.948578 0.94862;
+#A 14000 0.948662 0.948705 0.948747 0.948789 0.948831 0.948874 0.948916
+0.948958 0.949 0.949042 0.949085 0.949127 0.949169 0.949211 0.949253
+0.949295 0.949337 0.949379 0.949421 0.949463 0.949505 0.949547 0.949589
+0.949631 0.949673 0.949715 0.949757 0.949799 0.949841 0.949883 0.949924
+0.949966 0.950008 0.95005 0.950091 0.950133 0.950175 0.950217 0.950258
+0.9503 0.950342 0.950383 0.950425 0.950467 0.950508 0.95055 0.950591
+0.950633 0.950674 0.950716 0.950757 0.950799 0.95084 0.950882 0.950923
+0.950965 0.951006 0.951047 0.951089 0.95113 0.951172 0.951213 0.951254
+0.951295 0.951337 0.951378 0.951419 0.95146 0.951502 0.951543 0.951584
+0.951625 0.951666 0.951707 0.951748 0.951789 0.951831 0.951872 0.951913
+0.951954 0.951995 0.952036 0.952077 0.952118 0.952158 0.952199 0.95224
+0.952281 0.952322 0.952363 0.952404 0.952445 0.952485 0.952526 0.952567
+0.952608 0.952648 0.952689 0.95273 0.95277 0.952811 0.952852 0.952892
+0.952933 0.952974 0.953014 0.953055 0.953095 0.953136 0.953176 0.953217
+0.953257 0.953298 0.953338 0.953379 0.953419 0.95346 0.9535 0.95354
+0.953581 0.953621 0.953661 0.953702 0.953742 0.953782 0.953822 0.953863
+0.953903 0.953943 0.953983 0.954023 0.954064 0.954104 0.954144 0.954184
+0.954224 0.954264 0.954304 0.954344 0.954384 0.954424 0.954464 0.954504
+0.954544 0.954584 0.954624 0.954664 0.954704 0.954744 0.954783 0.954823
+0.954863 0.954903 0.954943 0.954982 0.955022 0.955062 0.955102 0.955141
+0.955181 0.955221 0.95526 0.9553 0.95534 0.955379 0.955419 0.955458
+0.955498 0.955537 0.955577 0.955616 0.955656 0.955695 0.955735 0.955774
+0.955814 0.955853 0.955892 0.955932 0.955971 0.95601 0.95605 0.956089
+0.956128 0.956168 0.956207 0.956246 0.956285 0.956324 0.956364 0.956403
+0.956442 0.956481 0.95652 0.956559 0.956598 0.956637 0.956676 0.956716
+0.956755 0.956794 0.956833 0.956871 0.95691 0.956949 0.956988 0.957027
+0.957066 0.957105 0.957144 0.957183 0.957221 0.95726 0.957299 0.957338
+0.957376 0.957415 0.957454 0.957493 0.957531 0.95757 0.957609 0.957647
+0.957686 0.957724 0.957763 0.957801 0.95784 0.957879 0.957917 0.957956
+0.957994 0.958032 0.958071 0.958109 0.958148 0.958186 0.958225 0.958263
+0.958301 0.95834 0.958378 0.958416 0.958454 0.958493 0.958531 0.958569
+0.958607 0.958646 0.958684 0.958722 0.95876 0.958798 0.958836 0.958874
+0.958912 0.95895 0.958988 0.959026 0.959064 0.959102 0.95914 0.959178
+0.959216 0.959254 0.959292 0.95933 0.959368 0.959406 0.959444 0.959481
+0.959519 0.959557 0.959595 0.959632 0.95967 0.959708 0.959746 0.959783
+0.959821 0.959859 0.959896 0.959934 0.959971 0.960009 0.960047 0.960084
+0.960122 0.960159 0.960197 0.960234 0.960272 0.960309 0.960346 0.960384
+0.960421 0.960459 0.960496 0.960533 0.960571 0.960608 0.960645 0.960683
+0.96072 0.960757 0.960794 0.960831 0.960869 0.960906 0.960943 0.96098
+0.961017 0.961054 0.961091 0.961128 0.961166 0.961203 0.96124 0.961277
+0.961314 0.961351 0.961388 0.961424 0.961461 0.961498 0.961535 0.961572
+0.961609 0.961646 0.961682 0.961719 0.961756 0.961793 0.96183 0.961866
+0.961903 0.96194 0.961976 0.962013 0.96205 0.962086 0.962123 0.96216
+0.962196 0.962233 0.962269 0.962306 0.962342 0.962379 0.962415 0.962452
+0.962488 0.962525 0.962561 0.962597 0.962634 0.96267 0.962707 0.962743
+0.962779 0.962815 0.962852 0.962888 0.962924 0.96296 0.962997 0.963033
+0.963069 0.963105 0.963141 0.963177 0.963214 0.96325 0.963286 0.963322
+0.963358 0.963394 0.96343 0.963466 0.963502 0.963538 0.963574 0.963609
+0.963645 0.963681 0.963717 0.963753 0.963789 0.963825 0.96386 0.963896
+0.963932 0.963968 0.964003 0.964039 0.964075 0.96411 0.964146 0.964182
+0.964217 0.964253 0.964289 0.964324 0.96436 0.964395 0.964431 0.964466
+0.964502 0.964537 0.964573 0.964608 0.964644 0.964679 0.964714 0.96475
+0.964785 0.96482 0.964856 0.964891 0.964926 0.964962 0.964997 0.965032
+0.965067 0.965102 0.965138 0.965173 0.965208 0.965243 0.965278 0.965313
+0.965348 0.965383 0.965419 0.965454 0.965489 0.965524 0.965559 0.965594
+0.965628 0.965663 0.965698 0.965733 0.965768 0.965803 0.965838 0.965873
+0.965907 0.965942 0.965977 0.966012 0.966046 0.966081 0.966116 0.966151
+0.966185 0.96622 0.966254 0.966289 0.966324 0.966358 0.966393 0.966427
+0.966462 0.966496 0.966531 0.966565 0.9666 0.966634 0.966669 0.966703
+0.966738 0.966772 0.966806 0.966841 0.966875 0.966909 0.966944 0.966978
+0.967012 0.967046 0.96708 0.967115 0.967149 0.967183 0.967217 0.967251
+0.967285 0.96732 0.967354 0.967388 0.967422 0.967456 0.96749 0.967524
+0.967558 0.967592 0.967626 0.96766 0.967694 0.967727 0.967761 0.967795
+0.967829 0.967863 0.967897 0.96793 0.967964 0.967998 0.968032 0.968065
+0.968099 0.968133 0.968167 0.9682 0.968234 0.968267 0.968301 0.968335
+0.968368 0.968402 0.968435 0.968469 0.968502 0.968536 0.968569 0.968603
+0.968636 0.96867 0.968703 0.968736 0.96877 0.968803 0.968836 0.96887
+0.968903 0.968936 0.968969 0.969003 0.969036 0.969069 0.969102 0.969135
+0.969169 0.969202 0.969235 0.969268 0.969301 0.969334 0.969367 0.9694
+0.969433 0.969466 0.969499 0.969532 0.969565 0.969598 0.969631 0.969664
+0.969697 0.96973 0.969762 0.969795 0.969828 0.969861 0.969894 0.969926
+0.969959 0.969992 0.970025 0.970057 0.97009 0.970123 0.970155 0.970188
+0.97022 0.970253 0.970286 0.970318 0.970351 0.970383 0.970416 0.970448
+0.970481 0.970513 0.970546 0.970578 0.97061 0.970643 0.970675 0.970707
+0.97074 0.970772 0.970804 0.970837 0.970869 0.970901 0.970933 0.970966
+0.970998 0.97103 0.971062 0.971094 0.971126 0.971158 0.97119 0.971223
+0.971255 0.971287 0.971319 0.971351 0.971383 0.971415 0.971447 0.971478
+0.97151 0.971542 0.971574 0.971606 0.971638 0.97167 0.971701 0.971733
+0.971765 0.971797 0.971828 0.97186 0.971892 0.971924 0.971955 0.971987
+0.972019 0.97205 0.972082 0.972113 0.972145 0.972176 0.972208 0.972239
+0.972271 0.972302 0.972334 0.972365 0.972397 0.972428 0.97246 0.972491
+0.972522 0.972554 0.972585 0.972616 0.972647 0.972679 0.97271 0.972741
+0.972772 0.972804 0.972835 0.972866 0.972897 0.972928 0.972959 0.97299
+0.973022 0.973053 0.973084 0.973115 0.973146 0.973177 0.973208 0.973239
+0.97327 0.9733 0.973331 0.973362 0.973393 0.973424 0.973455 0.973486
+0.973516 0.973547 0.973578 0.973609 0.973639 0.97367 0.973701 0.973732
+0.973762 0.973793 0.973823 0.973854 0.973885 0.973915 0.973946 0.973976
+0.974007 0.974037 0.974068 0.974098 0.974129 0.974159 0.97419 0.97422
+0.97425 0.974281 0.974311 0.974341 0.974372 0.974402 0.974432 0.974462
+0.974493 0.974523 0.974553 0.974583 0.974613 0.974644 0.974674 0.974704
+0.974734 0.974764 0.974794 0.974824 0.974854 0.974884 0.974914 0.974944
+0.974974 0.975004 0.975034 0.975064 0.975094 0.975124 0.975154 0.975183
+0.975213 0.975243 0.975273 0.975303 0.975332 0.975362 0.975392 0.975421
+0.975451 0.975481 0.97551 0.97554 0.97557 0.975599 0.975629 0.975658
+0.975688 0.975717 0.975747 0.975776 0.975806 0.975835 0.975865 0.975894
+0.975924 0.975953 0.975982 0.976012 0.976041 0.97607 0.9761 0.976129
+0.976158 0.976188 0.976217 0.976246 0.976275 0.976304 0.976333 0.976363
+0.976392 0.976421 0.97645 0.976479 0.976508 0.976537 0.976566 0.976595
+0.976624 0.976653 0.976682 0.976711 0.97674 0.976769 0.976798 0.976826
+0.976855 0.976884 0.976913 0.976942 0.97697 0.976999 0.977028 0.977057
+0.977085 0.977114 0.977143 0.977171 0.9772 0.977229 0.977257 0.977286
+0.977314 0.977343 0.977371 0.9774 0.977428 0.977457 0.977485 0.977514
+0.977542 0.977571 0.977599 0.977627 0.977656 0.977684 0.977712 0.977741
+0.977769 0.977797 0.977825 0.977854 0.977882 0.97791 0.977938 0.977966
+0.977995 0.978023 0.978051 0.978079 0.978107 0.978135 0.978163 0.978191
+0.978219 0.978247 0.978275 0.978303 0.978331 0.978359 0.978387 0.978414
+0.978442 0.97847 0.978498 0.978526 0.978554 0.978581 0.978609 0.978637
+0.978665 0.978692 0.97872 0.978748 0.978775 0.978803 0.97883 0.978858
+0.978886 0.978913 0.978941 0.978968 0.978996 0.979023 0.979051 0.979078
+0.979106 0.979133 0.97916 0.979188 0.979215 0.979243 0.97927 0.979297
+0.979324 0.979352 0.979379 0.979406 0.979433 0.979461 0.979488 0.979515
+0.979542 0.979569 0.979596 0.979624 0.979651 0.979678 0.979705 0.979732
+0.979759 0.979786 0.979813 0.97984 0.979867 0.979894 0.97992 0.979947
+0.979974 0.980001 0.980028 0.980055 0.980081 0.980108 0.980135 0.980162
+0.980189 0.980215 0.980242 0.980269 0.980295 0.980322 0.980349 0.980375
+0.980402 0.980428 0.980455 0.980481 0.980508 0.980534 0.980561 0.980587
+0.980614 0.98064 0.980667 0.980693 0.980719 0.980746 0.980772 0.980798
+0.980825 0.980851 0.980877 0.980904 0.98093 0.980956 0.980982 0.981008
+0.981035 0.981061 0.981087 0.981113 0.981139 0.981165 0.981191 0.981217
+0.981243 0.981269 0.981295 0.981321 0.981347 0.981373 0.981399 0.981425
+0.981451 0.981477 0.981502 0.981528 0.981554 0.98158 0.981606 0.981631
+0.981657 0.981683 0.981709 0.981734 0.98176 0.981786 0.981811 0.981837
+0.981862 0.981888 0.981914 0.981939 0.981965 0.98199 0.982016 0.982041
+0.982067 0.982092 0.982117 0.982143 0.982168 0.982194 0.982219 0.982244
+0.98227 0.982295 0.98232 0.982345 0.982371 0.982396 0.982421 0.982446
+0.982471;
+#A 15000 0.982497 0.982522 0.982547 0.982572 0.982597 0.982622 0.982647
+0.982672 0.982697 0.982722 0.982747 0.982772 0.982797 0.982822 0.982847
+0.982872 0.982897 0.982922 0.982946 0.982971 0.982996 0.983021 0.983046
+0.98307 0.983095 0.98312 0.983144 0.983169 0.983194 0.983218 0.983243
+0.983268 0.983292 0.983317 0.983341 0.983366 0.98339 0.983415 0.983439
+0.983464 0.983488 0.983513 0.983537 0.983561 0.983586 0.98361 0.983635
+0.983659 0.983683 0.983707 0.983732 0.983756 0.98378 0.983804 0.983829
+0.983853 0.983877 0.983901 0.983925 0.983949 0.983973 0.983997 0.984021
+0.984046 0.98407 0.984094 0.984118 0.984141 0.984165 0.984189 0.984213
+0.984237 0.984261 0.984285 0.984309 0.984333 0.984356 0.98438 0.984404
+0.984428 0.984451 0.984475 0.984499 0.984523 0.984546 0.98457 0.984593
+0.984617 0.984641 0.984664 0.984688 0.984711 0.984735 0.984758 0.984782
+0.984805 0.984829 0.984852 0.984876 0.984899 0.984922 0.984946 0.984969
+0.984992 0.985016 0.985039 0.985062 0.985085 0.985109 0.985132 0.985155
+0.985178 0.985201 0.985225 0.985248 0.985271 0.985294 0.985317 0.98534
+0.985363 0.985386 0.985409 0.985432 0.985455 0.985478 0.985501 0.985524
+0.985547 0.98557 0.985592 0.985615 0.985638 0.985661 0.985684 0.985706
+0.985729 0.985752 0.985775 0.985797 0.98582 0.985843 0.985865 0.985888
+0.985911 0.985933 0.985956 0.985978 0.986001 0.986023 0.986046 0.986068
+0.986091 0.986113 0.986136 0.986158 0.98618 0.986203 0.986225 0.986248
+0.98627 0.986292 0.986314 0.986337 0.986359 0.986381 0.986403 0.986426
+0.986448 0.98647 0.986492 0.986514 0.986536 0.986558 0.98658 0.986603
+0.986625 0.986647 0.986669 0.986691 0.986713 0.986735 0.986756 0.986778
+0.9868 0.986822 0.986844 0.986866 0.986888 0.986909 0.986931 0.986953
+0.986975 0.986996 0.987018 0.98704 0.987062 0.987083 0.987105 0.987126
+0.987148 0.98717 0.987191 0.987213 0.987234 0.987256 0.987277 0.987299
+0.98732 0.987342 0.987363 0.987385 0.987406 0.987427 0.987449 0.98747
+0.987491 0.987513 0.987534 0.987555 0.987576 0.987598 0.987619 0.98764
+0.987661 0.987682 0.987704 0.987725 0.987746 0.987767 0.987788 0.987809
+0.98783 0.987851 0.987872 0.987893 0.987914 0.987935 0.987956 0.987977
+0.987998 0.988019 0.988039 0.98806 0.988081 0.988102 0.988123 0.988143
+0.988164 0.988185 0.988206 0.988226 0.988247 0.988268 0.988288 0.988309
+0.988329 0.98835 0.988371 0.988391 0.988412 0.988432 0.988453 0.988473
+0.988494 0.988514 0.988535 0.988555 0.988575 0.988596 0.988616 0.988636
+0.988657 0.988677 0.988697 0.988717 0.988738 0.988758 0.988778 0.988798
+0.988819 0.988839 0.988859 0.988879 0.988899 0.988919 0.988939 0.988959
+0.988979 0.988999 0.989019 0.989039 0.989059 0.989079 0.989099 0.989119
+0.989139 0.989159 0.989179 0.989198 0.989218 0.989238 0.989258 0.989277
+0.989297 0.989317 0.989337 0.989356 0.989376 0.989396 0.989415 0.989435
+0.989455 0.989474 0.989494 0.989513 0.989533 0.989552 0.989572 0.989591
+0.989611 0.98963 0.989649 0.989669 0.989688 0.989708 0.989727 0.989746
+0.989766 0.989785 0.989804 0.989823 0.989843 0.989862 0.989881 0.9899
+0.989919 0.989939 0.989958 0.989977 0.989996 0.990015 0.990034 0.990053
+0.990072 0.990091 0.99011 0.990129 0.990148 0.990167 0.990186 0.990205
+0.990224 0.990242 0.990261 0.99028 0.990299 0.990318 0.990336 0.990355
+0.990374 0.990393 0.990411 0.99043 0.990449 0.990467 0.990486 0.990505
+0.990523 0.990542 0.99056 0.990579 0.990597 0.990616 0.990634 0.990653
+0.990671 0.99069 0.990708 0.990726 0.990745 0.990763 0.990781 0.9908
+0.990818 0.990836 0.990855 0.990873 0.990891 0.990909 0.990927 0.990946
+0.990964 0.990982 0.991 0.991018 0.991036 0.991054 0.991072 0.99109
+0.991108 0.991126 0.991144 0.991162 0.99118 0.991198 0.991216 0.991234
+0.991252 0.99127 0.991287 0.991305 0.991323 0.991341 0.991359 0.991376
+0.991394 0.991412 0.991429 0.991447 0.991465 0.991482 0.9915 0.991518
+0.991535 0.991553 0.99157 0.991588 0.991605 0.991623 0.99164 0.991658
+0.991675 0.991693 0.99171 0.991727 0.991745 0.991762 0.991779 0.991797
+0.991814 0.991831 0.991848 0.991866 0.991883 0.9919 0.991917 0.991934
+0.991952 0.991969 0.991986 0.992003 0.99202 0.992037 0.992054 0.992071
+0.992088 0.992105 0.992122 0.992139 0.992156 0.992173 0.99219 0.992207
+0.992223 0.99224 0.992257 0.992274 0.992291 0.992307 0.992324 0.992341
+0.992358 0.992374 0.992391 0.992408 0.992424 0.992441 0.992457 0.992474
+0.992491 0.992507 0.992524 0.99254 0.992557 0.992573 0.99259 0.992606
+0.992622 0.992639 0.992655 0.992672 0.992688 0.992704 0.992721 0.992737
+0.992753 0.992769 0.992786 0.992802 0.992818 0.992834 0.99285 0.992867
+0.992883 0.992899 0.992915 0.992931 0.992947 0.992963 0.992979 0.992995
+0.993011 0.993027 0.993043 0.993059 0.993075 0.993091 0.993107 0.993122
+0.993138 0.993154 0.99317 0.993186 0.993201 0.993217 0.993233 0.993249
+0.993264 0.99328 0.993296 0.993311 0.993327 0.993342 0.993358 0.993374
+0.993389 0.993405 0.99342 0.993436 0.993451 0.993467 0.993482 0.993497
+0.993513 0.993528 0.993544 0.993559 0.993574 0.99359 0.993605 0.99362
+0.993635 0.993651 0.993666 0.993681 0.993696 0.993711 0.993727 0.993742
+0.993757 0.993772 0.993787 0.993802 0.993817 0.993832 0.993847 0.993862
+0.993877 0.993892 0.993907 0.993922 0.993937 0.993952 0.993967 0.993981
+0.993996 0.994011 0.994026 0.994041 0.994055 0.99407 0.994085 0.994099
+0.994114 0.994129 0.994143 0.994158 0.994173 0.994187 0.994202 0.994216
+0.994231 0.994245 0.99426 0.994274 0.994289 0.994303 0.994318 0.994332
+0.994346 0.994361 0.994375 0.99439 0.994404 0.994418 0.994432 0.994447
+0.994461 0.994475 0.994489 0.994503 0.994518 0.994532 0.994546 0.99456
+0.994574 0.994588 0.994602 0.994616 0.99463 0.994644 0.994658 0.994672
+0.994686 0.9947 0.994714 0.994728 0.994742 0.994756 0.99477 0.994783
+0.994797 0.994811 0.994825 0.994839 0.994852 0.994866 0.99488 0.994893
+0.994907 0.994921 0.994934 0.994948 0.994961 0.994975 0.994989 0.995002
+0.995016 0.995029 0.995043 0.995056 0.99507 0.995083 0.995096 0.99511
+0.995123 0.995136 0.99515 0.995163 0.995176 0.99519 0.995203 0.995216
+0.995229 0.995243 0.995256 0.995269 0.995282 0.995295 0.995308 0.995321
+0.995334 0.995347 0.995361 0.995374 0.995387 0.9954 0.995413 0.995425
+0.995438 0.995451 0.995464 0.995477 0.99549 0.995503 0.995516 0.995528
+0.995541 0.995554 0.995567 0.995579 0.995592 0.995605 0.995618 0.99563
+0.995643 0.995655 0.995668 0.995681 0.995693 0.995706 0.995718 0.995731
+0.995743 0.995756 0.995768 0.995781 0.995793 0.995805 0.995818 0.99583
+0.995843 0.995855 0.995867 0.995879 0.995892 0.995904 0.995916 0.995928
+0.995941 0.995953 0.995965 0.995977 0.995989 0.996001 0.996013 0.996026
+0.996038 0.99605 0.996062 0.996074 0.996086 0.996098 0.99611 0.996121
+0.996133 0.996145 0.996157 0.996169 0.996181 0.996193 0.996204 0.996216
+0.996228 0.99624 0.996252 0.996263 0.996275 0.996287 0.996298 0.99631
+0.996321 0.996333 0.996345 0.996356 0.996368 0.996379 0.996391 0.996402
+0.996414 0.996425 0.996437 0.996448 0.996459 0.996471 0.996482 0.996494
+0.996505 0.996516 0.996527 0.996539 0.99655 0.996561 0.996572 0.996584
+0.996595 0.996606 0.996617 0.996628 0.996639 0.99665 0.996661 0.996673
+0.996684 0.996695 0.996706 0.996717 0.996728 0.996738 0.996749 0.99676
+0.996771 0.996782 0.996793 0.996804 0.996815 0.996825 0.996836 0.996847
+0.996858 0.996868 0.996879 0.99689 0.9969 0.996911 0.996922 0.996932
+0.996943 0.996953 0.996964 0.996975 0.996985 0.996996 0.997006 0.997017
+0.997027 0.997037 0.997048 0.997058 0.997069 0.997079 0.997089 0.9971
+0.99711 0.99712 0.997131 0.997141 0.997151 0.997161 0.997171 0.997182
+0.997192 0.997202 0.997212 0.997222 0.997232 0.997242 0.997252 0.997262
+0.997272 0.997282 0.997292 0.997302 0.997312 0.997322 0.997332 0.997342
+0.997352 0.997362 0.997371 0.997381 0.997391 0.997401 0.997411 0.99742
+0.99743 0.99744 0.997449 0.997459 0.997469 0.997478 0.997488 0.997497
+0.997507 0.997517 0.997526 0.997536 0.997545 0.997555 0.997564 0.997574
+0.997583 0.997592 0.997602 0.997611 0.99762 0.99763 0.997639 0.997648
+0.997658 0.997667 0.997676 0.997685 0.997695 0.997704 0.997713 0.997722
+0.997731 0.99774 0.997749 0.997759 0.997768 0.997777 0.997786 0.997795
+0.997804 0.997813 0.997822 0.997831 0.997839 0.997848 0.997857 0.997866
+0.997875 0.997884 0.997892 0.997901 0.99791 0.997919 0.997928 0.997936
+0.997945 0.997954 0.997962 0.997971 0.99798 0.997988 0.997997 0.998005
+0.998014 0.998022 0.998031 0.998039 0.998048 0.998056 0.998065 0.998073
+0.998082 0.99809 0.998098 0.998107 0.998115 0.998123 0.998132 0.99814
+0.998148 0.998156 0.998165 0.998173 0.998181 0.998189 0.998197 0.998205
+0.998213 0.998222 0.99823 0.998238 0.998246 0.998254 0.998262 0.99827
+0.998278 0.998286 0.998294 0.998301 0.998309 0.998317 0.998325 0.998333
+0.998341 0.998348 0.998356 0.998364 0.998372 0.998379 0.998387 0.998395
+0.998402 0.99841 0.998418 0.998425 0.998433 0.998441 0.998448 0.998456
+0.998463 0.998471 0.998478 0.998486 0.998493 0.998501 0.998508 0.998515
+0.998523 0.99853 0.998537 0.998545 0.998552 0.998559 0.998567 0.998574
+0.998581 0.998588 0.998595 0.998603 0.99861 0.998617 0.998624 0.998631
+0.998638;
+#A 16000 0.998645 0.998652 0.998659 0.998666 0.998673 0.99868 0.998687
+0.998694 0.998701 0.998708 0.998715 0.998722 0.998729 0.998735 0.998742
+0.998749 0.998756 0.998762 0.998769 0.998776 0.998783 0.998789 0.998796
+0.998803 0.998809 0.998816 0.998822 0.998829 0.998836 0.998842 0.998849
+0.998855 0.998862 0.998868 0.998874 0.998881 0.998887 0.998894 0.9989
+0.998906 0.998913 0.998919 0.998925 0.998932 0.998938 0.998944 0.99895
+0.998956 0.998963 0.998969 0.998975 0.998981 0.998987 0.998993 0.998999
+0.999005 0.999011 0.999017 0.999023 0.999029 0.999035 0.999041 0.999047
+0.999053 0.999059 0.999065 0.999071 0.999077 0.999082 0.999088 0.999094
+0.9991 0.999106 0.999111 0.999117 0.999123 0.999128 0.999134 0.99914
+0.999145 0.999151 0.999156 0.999162 0.999167 0.999173 0.999178 0.999184
+0.999189 0.999195 0.9992 0.999206 0.999211 0.999216 0.999222 0.999227
+0.999232 0.999238 0.999243 0.999248 0.999254 0.999259 0.999264 0.999269
+0.999274 0.99928 0.999285 0.99929 0.999295 0.9993 0.999305 0.99931
+0.999315 0.99932 0.999325 0.99933 0.999335 0.99934 0.999345 0.99935
+0.999355 0.999359 0.999364 0.999369 0.999374 0.999379 0.999384 0.999388
+0.999393 0.999398 0.999402 0.999407 0.999412 0.999416 0.999421 0.999426
+0.99943 0.999435 0.999439 0.999444 0.999448 0.999453 0.999457 0.999462
+0.999466 0.999471 0.999475 0.999479 0.999484 0.999488 0.999492 0.999497
+0.999501 0.999505 0.99951 0.999514 0.999518 0.999522 0.999526 0.999531
+0.999535 0.999539 0.999543 0.999547 0.999551 0.999555 0.999559 0.999563
+0.999567 0.999571 0.999575 0.999579 0.999583 0.999587 0.999591 0.999595
+0.999599 0.999602 0.999606 0.99961 0.999614 0.999618 0.999621 0.999625
+0.999629 0.999632 0.999636 0.99964 0.999643 0.999647 0.999651 0.999654
+0.999658 0.999661 0.999665 0.999668 0.999672 0.999675 0.999679 0.999682
+0.999685 0.999689 0.999692 0.999696 0.999699 0.999702 0.999705 0.999709
+0.999712 0.999715 0.999719 0.999722 0.999725 0.999728 0.999731 0.999734
+0.999738 0.999741 0.999744 0.999747 0.99975 0.999753 0.999756 0.999759
+0.999762 0.999765 0.999768 0.999771 0.999773 0.999776 0.999779 0.999782
+0.999785 0.999788 0.99979 0.999793 0.999796 0.999799 0.999801 0.999804
+0.999807 0.999809 0.999812 0.999815 0.999817 0.99982 0.999822 0.999825
+0.999828 0.99983 0.999833 0.999835 0.999837 0.99984 0.999842 0.999845
+0.999847 0.999849 0.999852 0.999854 0.999856 0.999859 0.999861 0.999863
+0.999865 0.999868 0.99987 0.999872 0.999874 0.999876 0.999878 0.999881
+0.999883 0.999885 0.999887 0.999889 0.999891 0.999893 0.999895 0.999897
+0.999899 0.999901 0.999902 0.999904 0.999906 0.999908 0.99991 0.999912
+0.999914 0.999915 0.999917 0.999919 0.99992 0.999922 0.999924 0.999926
+0.999927 0.999929 0.99993 0.999932 0.999934 0.999935 0.999937 0.999938
+0.99994 0.999941 0.999943 0.999944 0.999946 0.999947 0.999948 0.99995
+0.999951 0.999952 0.999954 0.999955 0.999956 0.999958 0.999959 0.99996
+0.999961 0.999962 0.999964 0.999965 0.999966 0.999967 0.999968 0.999969
+0.99997 0.999971 0.999972 0.999973 0.999974 0.999975 0.999976 0.999977
+0.999978 0.999979 0.99998 0.999981 0.999981 0.999982 0.999983 0.999984
+0.999985 0.999985 0.999986 0.999987 0.999987 0.999988 0.999989 0.999989
+0.99999 0.999991 0.999991 0.999992 0.999992 0.999993 0.999993 0.999994
+0.999994 0.999995 0.999995 0.999996 0.999996 0.999996 0.999997 0.999997
+0.999997 0.999998 0.999998 0.999998 0.999998 0.999999 0.999999 0.999999
+0.999999 0.999999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0.999999 0.999999 0.999999
+0.999999 0.999999 0.999998 0.999998 0.999998 0.999998 0.999997 0.999997
+0.999997 0.999996 0.999996 0.999996 0.999995 0.999995 0.999994 0.999994
+0.999993 0.999993 0.999992 0.999992 0.999991 0.999991 0.99999 0.999989
+0.999989 0.999988 0.999987 0.999987 0.999986 0.999985 0.999985 0.999984
+0.999983 0.999982 0.999981 0.999981 0.99998 0.999979 0.999978 0.999977
+0.999976 0.999975 0.999974 0.999973 0.999972 0.999971 0.99997 0.999969
+0.999968 0.999967 0.999966 0.999965 0.999964 0.999962 0.999961 0.99996
+0.999959 0.999958 0.999956 0.999955 0.999954 0.999952 0.999951 0.99995
+0.999948 0.999947 0.999946 0.999944 0.999943 0.999941 0.99994 0.999938
+0.999937 0.999935 0.999934 0.999932 0.99993 0.999929 0.999927 0.999926
+0.999924 0.999922 0.99992 0.999919 0.999917 0.999915 0.999914 0.999912
+0.99991 0.999908 0.999906 0.999904 0.999902 0.999901 0.999899 0.999897
+0.999895 0.999893 0.999891 0.999889 0.999887 0.999885 0.999883 0.999881
+0.999878 0.999876 0.999874 0.999872 0.99987 0.999868 0.999865 0.999863
+0.999861 0.999859 0.999856 0.999854 0.999852 0.999849 0.999847 0.999845
+0.999842 0.99984 0.999837 0.999835 0.999833 0.99983 0.999828 0.999825
+0.999822 0.99982 0.999817 0.999815 0.999812 0.999809 0.999807 0.999804
+0.999801 0.999799 0.999796 0.999793 0.99979 0.999788 0.999785 0.999782
+0.999779 0.999776 0.999773 0.999771 0.999768 0.999765 0.999762 0.999759
+0.999756 0.999753 0.99975 0.999747 0.999744 0.999741 0.999738 0.999734
+0.999731 0.999728 0.999725 0.999722 0.999719 0.999715 0.999712 0.999709
+0.999705 0.999702 0.999699 0.999696 0.999692 0.999689 0.999685 0.999682
+0.999679 0.999675 0.999672 0.999668 0.999665 0.999661 0.999658 0.999654
+0.999651 0.999647 0.999643 0.99964 0.999636 0.999632 0.999629 0.999625
+0.999621 0.999618 0.999614 0.99961 0.999606 0.999602 0.999599 0.999595
+0.999591 0.999587 0.999583 0.999579 0.999575 0.999571 0.999567 0.999563
+0.999559 0.999555 0.999551 0.999547 0.999543 0.999539 0.999535 0.999531
+0.999526 0.999522 0.999518 0.999514 0.99951 0.999505 0.999501 0.999497
+0.999492 0.999488 0.999484 0.999479 0.999475 0.999471 0.999466 0.999462
+0.999457 0.999453 0.999448 0.999444 0.999439 0.999435 0.99943 0.999426
+0.999421 0.999416 0.999412 0.999407 0.999402 0.999398 0.999393 0.999388
+0.999384 0.999379 0.999374 0.999369 0.999364 0.999359 0.999355 0.99935
+0.999345 0.99934 0.999335 0.99933 0.999325 0.99932 0.999315 0.99931
+0.999305 0.9993 0.999295 0.99929 0.999285 0.99928 0.999274 0.999269
+0.999264 0.999259 0.999254 0.999248 0.999243 0.999238 0.999232 0.999227
+0.999222 0.999216 0.999211 0.999206 0.9992 0.999195 0.999189 0.999184
+0.999178 0.999173 0.999167 0.999162 0.999156 0.999151 0.999145 0.99914
+0.999134 0.999128 0.999123 0.999117 0.999111 0.999106 0.9991 0.999094
+0.999088 0.999082 0.999077 0.999071 0.999065 0.999059 0.999053 0.999047
+0.999041 0.999035 0.999029 0.999023 0.999017 0.999011 0.999005 0.998999
+0.998993 0.998987 0.998981 0.998975 0.998969 0.998963 0.998956 0.99895
+0.998944 0.998938 0.998932 0.998925 0.998919 0.998913 0.998906 0.9989
+0.998894 0.998887 0.998881 0.998874 0.998868 0.998862 0.998855 0.998849
+0.998842 0.998836 0.998829 0.998822 0.998816 0.998809 0.998803 0.998796
+0.998789 0.998783 0.998776 0.998769 0.998762 0.998756 0.998749 0.998742
+0.998735 0.998729 0.998722 0.998715 0.998708 0.998701 0.998694 0.998687
+0.99868 0.998673 0.998666 0.998659 0.998652 0.998645 0.998638 0.998631
+0.998624 0.998617 0.99861 0.998603 0.998595 0.998588 0.998581 0.998574
+0.998567 0.998559 0.998552 0.998545 0.998537 0.99853 0.998523 0.998515
+0.998508 0.998501 0.998493 0.998486 0.998478 0.998471 0.998463 0.998456
+0.998448 0.998441 0.998433 0.998425 0.998418 0.99841 0.998402 0.998395
+0.998387 0.998379 0.998372 0.998364 0.998356 0.998348 0.998341 0.998333
+0.998325 0.998317 0.998309 0.998301 0.998294 0.998286 0.998278 0.99827
+0.998262 0.998254 0.998246 0.998238 0.99823 0.998222 0.998213 0.998205
+0.998197 0.998189 0.998181 0.998173 0.998165 0.998156 0.998148 0.99814
+0.998132 0.998123 0.998115 0.998107 0.998098 0.99809 0.998082 0.998073
+0.998065 0.998056 0.998048 0.998039 0.998031 0.998022 0.998014 0.998005
+0.997997 0.997988 0.99798 0.997971 0.997962 0.997954 0.997945 0.997936
+0.997928 0.997919 0.99791 0.997901 0.997892 0.997884 0.997875 0.997866
+0.997857 0.997848 0.997839 0.997831 0.997822 0.997813 0.997804 0.997795
+0.997786 0.997777 0.997768 0.997759 0.997749 0.99774 0.997731 0.997722
+0.997713 0.997704 0.997695 0.997685 0.997676 0.997667 0.997658 0.997648
+0.997639 0.99763 0.99762 0.997611 0.997602 0.997592 0.997583 0.997574
+0.997564 0.997555 0.997545 0.997536 0.997526 0.997517 0.997507 0.997497
+0.997488 0.997478 0.997469 0.997459 0.997449 0.99744 0.99743 0.99742
+0.997411 0.997401 0.997391 0.997381 0.997371 0.997362 0.997352 0.997342
+0.997332 0.997322 0.997312 0.997302 0.997292 0.997282 0.997272 0.997262
+0.997252 0.997242 0.997232 0.997222 0.997212 0.997202 0.997192 0.997182
+0.997171 0.997161 0.997151 0.997141 0.997131 0.99712 0.99711 0.9971
+0.997089 0.997079 0.997069 0.997058 0.997048 0.997037 0.997027 0.997017
+0.997006 0.996996 0.996985 0.996975 0.996964 0.996953 0.996943 0.996932
+0.996922 0.996911 0.9969 0.99689 0.996879 0.996868 0.996858 0.996847
+0.996836 0.996825 0.996815 0.996804 0.996793 0.996782 0.996771 0.99676
+0.996749 0.996738 0.996728 0.996717 0.996706 0.996695 0.996684 0.996673
+0.996661 0.99665 0.996639 0.996628 0.996617 0.996606 0.996595 0.996584
+0.996572 0.996561 0.99655 0.996539 0.996527;
+#A 17000 0.996516 0.996505 0.996494 0.996482 0.996471 0.996459 0.996448
+0.996437 0.996425 0.996414 0.996402 0.996391 0.996379 0.996368 0.996356
+0.996345 0.996333 0.996321 0.99631 0.996298 0.996287 0.996275 0.996263
+0.996252 0.99624 0.996228 0.996216 0.996204 0.996193 0.996181 0.996169
+0.996157 0.996145 0.996133 0.996121 0.99611 0.996098 0.996086 0.996074
+0.996062 0.99605 0.996038 0.996026 0.996013 0.996001 0.995989 0.995977
+0.995965 0.995953 0.995941 0.995928 0.995916 0.995904 0.995892 0.995879
+0.995867 0.995855 0.995843 0.99583 0.995818 0.995805 0.995793 0.995781
+0.995768 0.995756 0.995743 0.995731 0.995718 0.995706 0.995693 0.995681
+0.995668 0.995655 0.995643 0.99563 0.995618 0.995605 0.995592 0.995579
+0.995567 0.995554 0.995541 0.995528 0.995516 0.995503 0.99549 0.995477
+0.995464 0.995451 0.995438 0.995425 0.995413 0.9954 0.995387 0.995374
+0.995361 0.995347 0.995334 0.995321 0.995308 0.995295 0.995282 0.995269
+0.995256 0.995243 0.995229 0.995216 0.995203 0.99519 0.995176 0.995163
+0.99515 0.995136 0.995123 0.99511 0.995096 0.995083 0.99507 0.995056
+0.995043 0.995029 0.995016 0.995002 0.994989 0.994975 0.994961 0.994948
+0.994934 0.994921 0.994907 0.994893 0.99488 0.994866 0.994852 0.994839
+0.994825 0.994811 0.994797 0.994783 0.99477 0.994756 0.994742 0.994728
+0.994714 0.9947 0.994686 0.994672 0.994658 0.994644 0.99463 0.994616
+0.994602 0.994588 0.994574 0.99456 0.994546 0.994532 0.994518 0.994503
+0.994489 0.994475 0.994461 0.994447 0.994432 0.994418 0.994404 0.99439
+0.994375 0.994361 0.994346 0.994332 0.994318 0.994303 0.994289 0.994274
+0.99426 0.994245 0.994231 0.994216 0.994202 0.994187 0.994173 0.994158
+0.994143 0.994129 0.994114 0.994099 0.994085 0.99407 0.994055 0.994041
+0.994026 0.994011 0.993996 0.993981 0.993967 0.993952 0.993937 0.993922
+0.993907 0.993892 0.993877 0.993862 0.993847 0.993832 0.993817 0.993802
+0.993787 0.993772 0.993757 0.993742 0.993727 0.993711 0.993696 0.993681
+0.993666 0.993651 0.993635 0.99362 0.993605 0.99359 0.993574 0.993559
+0.993544 0.993528 0.993513 0.993497 0.993482 0.993467 0.993451 0.993436
+0.99342 0.993405 0.993389 0.993374 0.993358 0.993342 0.993327 0.993311
+0.993296 0.99328 0.993264 0.993249 0.993233 0.993217 0.993201 0.993186
+0.99317 0.993154 0.993138 0.993122 0.993107 0.993091 0.993075 0.993059
+0.993043 0.993027 0.993011 0.992995 0.992979 0.992963 0.992947 0.992931
+0.992915 0.992899 0.992883 0.992867 0.99285 0.992834 0.992818 0.992802
+0.992786 0.992769 0.992753 0.992737 0.992721 0.992704 0.992688 0.992672
+0.992655 0.992639 0.992622 0.992606 0.99259 0.992573 0.992557 0.99254
+0.992524 0.992507 0.992491 0.992474 0.992457 0.992441 0.992424 0.992408
+0.992391 0.992374 0.992358 0.992341 0.992324 0.992307 0.992291 0.992274
+0.992257 0.99224 0.992223 0.992207 0.99219 0.992173 0.992156 0.992139
+0.992122 0.992105 0.992088 0.992071 0.992054 0.992037 0.99202 0.992003
+0.991986 0.991969 0.991952 0.991934 0.991917 0.9919 0.991883 0.991866
+0.991848 0.991831 0.991814 0.991797 0.991779 0.991762 0.991745 0.991727
+0.99171 0.991693 0.991675 0.991658 0.99164 0.991623 0.991605 0.991588
+0.99157 0.991553 0.991535 0.991518 0.9915 0.991482 0.991465 0.991447
+0.991429 0.991412 0.991394 0.991376 0.991359 0.991341 0.991323 0.991305
+0.991287 0.99127 0.991252 0.991234 0.991216 0.991198 0.99118 0.991162
+0.991144 0.991126 0.991108 0.99109 0.991072 0.991054 0.991036 0.991018
+0.991 0.990982 0.990964 0.990946 0.990927 0.990909 0.990891 0.990873
+0.990855 0.990836 0.990818 0.9908 0.990781 0.990763 0.990745 0.990726
+0.990708 0.99069 0.990671 0.990653 0.990634 0.990616 0.990597 0.990579
+0.99056 0.990542 0.990523 0.990505 0.990486 0.990467 0.990449 0.99043
+0.990411 0.990393 0.990374 0.990355 0.990336 0.990318 0.990299 0.99028
+0.990261 0.990242 0.990224 0.990205 0.990186 0.990167 0.990148 0.990129
+0.99011 0.990091 0.990072 0.990053 0.990034 0.990015 0.989996 0.989977
+0.989958 0.989939 0.989919 0.9899 0.989881 0.989862 0.989843 0.989823
+0.989804 0.989785 0.989766 0.989746 0.989727 0.989708 0.989688 0.989669
+0.989649 0.98963 0.989611 0.989591 0.989572 0.989552 0.989533 0.989513
+0.989494 0.989474 0.989455 0.989435 0.989415 0.989396 0.989376 0.989356
+0.989337 0.989317 0.989297 0.989277 0.989258 0.989238 0.989218 0.989198
+0.989179 0.989159 0.989139 0.989119 0.989099 0.989079 0.989059 0.989039
+0.989019 0.988999 0.988979 0.988959 0.988939 0.988919 0.988899 0.988879
+0.988859 0.988839 0.988819 0.988798 0.988778 0.988758 0.988738 0.988717
+0.988697 0.988677 0.988657 0.988636 0.988616 0.988596 0.988575 0.988555
+0.988535 0.988514 0.988494 0.988473 0.988453 0.988432 0.988412 0.988391
+0.988371 0.98835 0.988329 0.988309 0.988288 0.988268 0.988247 0.988226
+0.988206 0.988185 0.988164 0.988143 0.988123 0.988102 0.988081 0.98806
+0.988039 0.988019 0.987998 0.987977 0.987956 0.987935 0.987914 0.987893
+0.987872 0.987851 0.98783 0.987809 0.987788 0.987767 0.987746 0.987725
+0.987704 0.987682 0.987661 0.98764 0.987619 0.987598 0.987576 0.987555
+0.987534 0.987513 0.987491 0.98747 0.987449 0.987427 0.987406 0.987385
+0.987363 0.987342 0.98732 0.987299 0.987277 0.987256 0.987234 0.987213
+0.987191 0.98717 0.987148 0.987126 0.987105 0.987083 0.987062 0.98704
+0.987018 0.986996 0.986975 0.986953 0.986931 0.986909 0.986888 0.986866
+0.986844 0.986822 0.9868 0.986778 0.986756 0.986735 0.986713 0.986691
+0.986669 0.986647 0.986625 0.986603 0.98658 0.986558 0.986536 0.986514
+0.986492 0.98647 0.986448 0.986426 0.986403 0.986381 0.986359 0.986337
+0.986314 0.986292 0.98627 0.986248 0.986225 0.986203 0.98618 0.986158
+0.986136 0.986113 0.986091 0.986068 0.986046 0.986023 0.986001 0.985978
+0.985956 0.985933 0.985911 0.985888 0.985865 0.985843 0.98582 0.985797
+0.985775 0.985752 0.985729 0.985706 0.985684 0.985661 0.985638 0.985615
+0.985592 0.98557 0.985547 0.985524 0.985501 0.985478 0.985455 0.985432
+0.985409 0.985386 0.985363 0.98534 0.985317 0.985294 0.985271 0.985248
+0.985225 0.985201 0.985178 0.985155 0.985132 0.985109 0.985085 0.985062
+0.985039 0.985016 0.984992 0.984969 0.984946 0.984922 0.984899 0.984876
+0.984852 0.984829 0.984805 0.984782 0.984758 0.984735 0.984711 0.984688
+0.984664 0.984641 0.984617 0.984593 0.98457 0.984546 0.984523 0.984499
+0.984475 0.984451 0.984428 0.984404 0.98438 0.984356 0.984333 0.984309
+0.984285 0.984261 0.984237 0.984213 0.984189 0.984165 0.984141 0.984118
+0.984094 0.98407 0.984046 0.984021 0.983997 0.983973 0.983949 0.983925
+0.983901 0.983877 0.983853 0.983829 0.983804 0.98378 0.983756 0.983732
+0.983707 0.983683 0.983659 0.983635 0.98361 0.983586 0.983561 0.983537
+0.983513 0.983488 0.983464 0.983439 0.983415 0.98339 0.983366 0.983341
+0.983317 0.983292 0.983268 0.983243 0.983218 0.983194 0.983169 0.983144
+0.98312 0.983095 0.98307 0.983046 0.983021 0.982996 0.982971 0.982946
+0.982922 0.982897 0.982872 0.982847 0.982822 0.982797 0.982772 0.982747
+0.982722 0.982697 0.982672 0.982647 0.982622 0.982597 0.982572 0.982547
+0.982522 0.982497 0.982471 0.982446 0.982421 0.982396 0.982371 0.982345
+0.98232 0.982295 0.98227 0.982244 0.982219 0.982194 0.982168 0.982143
+0.982117 0.982092 0.982067 0.982041 0.982016 0.98199 0.981965 0.981939
+0.981914 0.981888 0.981862 0.981837 0.981811 0.981786 0.98176 0.981734
+0.981709 0.981683 0.981657 0.981631 0.981606 0.98158 0.981554 0.981528
+0.981502 0.981477 0.981451 0.981425 0.981399 0.981373 0.981347 0.981321
+0.981295 0.981269 0.981243 0.981217 0.981191 0.981165 0.981139 0.981113
+0.981087 0.981061 0.981035 0.981008 0.980982 0.980956 0.98093 0.980904
+0.980877 0.980851 0.980825 0.980798 0.980772 0.980746 0.980719 0.980693
+0.980667 0.98064 0.980614 0.980587 0.980561 0.980534 0.980508 0.980481
+0.980455 0.980428 0.980402 0.980375 0.980349 0.980322 0.980295 0.980269
+0.980242 0.980215 0.980189 0.980162 0.980135 0.980108 0.980081 0.980055
+0.980028 0.980001 0.979974 0.979947 0.97992 0.979894 0.979867 0.97984
+0.979813 0.979786 0.979759 0.979732 0.979705 0.979678 0.979651 0.979624
+0.979596 0.979569 0.979542 0.979515 0.979488 0.979461 0.979433 0.979406
+0.979379 0.979352 0.979324 0.979297 0.97927 0.979243 0.979215 0.979188
+0.97916 0.979133 0.979106 0.979078 0.979051 0.979023 0.978996 0.978968
+0.978941 0.978913 0.978886 0.978858 0.97883 0.978803 0.978775 0.978748
+0.97872 0.978692 0.978665 0.978637 0.978609 0.978581 0.978554 0.978526
+0.978498 0.97847 0.978442 0.978414 0.978387 0.978359 0.978331 0.978303
+0.978275 0.978247 0.978219 0.978191 0.978163 0.978135 0.978107 0.978079
+0.978051 0.978023 0.977995 0.977966 0.977938 0.97791 0.977882 0.977854
+0.977825 0.977797 0.977769 0.977741 0.977712 0.977684 0.977656 0.977627
+0.977599 0.977571 0.977542 0.977514 0.977485 0.977457 0.977428 0.9774
+0.977371 0.977343 0.977314 0.977286 0.977257 0.977229 0.9772 0.977171
+0.977143 0.977114 0.977085 0.977057 0.977028 0.976999 0.97697 0.976942
+0.976913 0.976884 0.976855 0.976826 0.976798 0.976769 0.97674 0.976711
+0.976682 0.976653 0.976624 0.976595 0.976566 0.976537 0.976508 0.976479
+0.97645 0.976421 0.976392 0.976363 0.976333 0.976304 0.976275 0.976246
+0.976217;
+#A 18000 0.976188 0.976158 0.976129 0.9761 0.97607 0.976041 0.976012
+0.975982 0.975953 0.975924 0.975894 0.975865 0.975835 0.975806 0.975776
+0.975747 0.975717 0.975688 0.975658 0.975629 0.975599 0.97557 0.97554
+0.97551 0.975481 0.975451 0.975421 0.975392 0.975362 0.975332 0.975303
+0.975273 0.975243 0.975213 0.975183 0.975154 0.975124 0.975094 0.975064
+0.975034 0.975004 0.974974 0.974944 0.974914 0.974884 0.974854 0.974824
+0.974794 0.974764 0.974734 0.974704 0.974674 0.974644 0.974613 0.974583
+0.974553 0.974523 0.974493 0.974462 0.974432 0.974402 0.974372 0.974341
+0.974311 0.974281 0.97425 0.97422 0.97419 0.974159 0.974129 0.974098
+0.974068 0.974037 0.974007 0.973976 0.973946 0.973915 0.973885 0.973854
+0.973823 0.973793 0.973762 0.973732 0.973701 0.97367 0.973639 0.973609
+0.973578 0.973547 0.973516 0.973486 0.973455 0.973424 0.973393 0.973362
+0.973331 0.9733 0.97327 0.973239 0.973208 0.973177 0.973146 0.973115
+0.973084 0.973053 0.973022 0.97299 0.972959 0.972928 0.972897 0.972866
+0.972835 0.972804 0.972772 0.972741 0.97271 0.972679 0.972647 0.972616
+0.972585 0.972554 0.972522 0.972491 0.97246 0.972428 0.972397 0.972365
+0.972334 0.972302 0.972271 0.972239 0.972208 0.972176 0.972145 0.972113
+0.972082 0.97205 0.972019 0.971987 0.971955 0.971924 0.971892 0.97186
+0.971828 0.971797 0.971765 0.971733 0.971701 0.97167 0.971638 0.971606
+0.971574 0.971542 0.97151 0.971478 0.971447 0.971415 0.971383 0.971351
+0.971319 0.971287 0.971255 0.971223 0.97119 0.971158 0.971126 0.971094
+0.971062 0.97103 0.970998 0.970966 0.970933 0.970901 0.970869 0.970837
+0.970804 0.970772 0.97074 0.970707 0.970675 0.970643 0.97061 0.970578
+0.970546 0.970513 0.970481 0.970448 0.970416 0.970383 0.970351 0.970318
+0.970286 0.970253 0.97022 0.970188 0.970155 0.970123 0.97009 0.970057
+0.970025 0.969992 0.969959 0.969926 0.969894 0.969861 0.969828 0.969795
+0.969762 0.96973 0.969697 0.969664 0.969631 0.969598 0.969565 0.969532
+0.969499 0.969466 0.969433 0.9694 0.969367 0.969334 0.969301 0.969268
+0.969235 0.969202 0.969169 0.969135 0.969102 0.969069 0.969036 0.969003
+0.968969 0.968936 0.968903 0.96887 0.968836 0.968803 0.96877 0.968736
+0.968703 0.96867 0.968636 0.968603 0.968569 0.968536 0.968502 0.968469
+0.968435 0.968402 0.968368 0.968335 0.968301 0.968267 0.968234 0.9682
+0.968167 0.968133 0.968099 0.968065 0.968032 0.967998 0.967964 0.96793
+0.967897 0.967863 0.967829 0.967795 0.967761 0.967727 0.967694 0.96766
+0.967626 0.967592 0.967558 0.967524 0.96749 0.967456 0.967422 0.967388
+0.967354 0.96732 0.967285 0.967251 0.967217 0.967183 0.967149 0.967115
+0.96708 0.967046 0.967012 0.966978 0.966944 0.966909 0.966875 0.966841
+0.966806 0.966772 0.966738 0.966703 0.966669 0.966634 0.9666 0.966565
+0.966531 0.966496 0.966462 0.966427 0.966393 0.966358 0.966324 0.966289
+0.966254 0.96622 0.966185 0.966151 0.966116 0.966081 0.966046 0.966012
+0.965977 0.965942 0.965907 0.965873 0.965838 0.965803 0.965768 0.965733
+0.965698 0.965663 0.965628 0.965594 0.965559 0.965524 0.965489 0.965454
+0.965419 0.965383 0.965348 0.965313 0.965278 0.965243 0.965208 0.965173
+0.965138 0.965102 0.965067 0.965032 0.964997 0.964962 0.964926 0.964891
+0.964856 0.96482 0.964785 0.96475 0.964714 0.964679 0.964644 0.964608
+0.964573 0.964537 0.964502 0.964466 0.964431 0.964395 0.96436 0.964324
+0.964289 0.964253 0.964217 0.964182 0.964146 0.96411 0.964075 0.964039
+0.964003 0.963968 0.963932 0.963896 0.96386 0.963825 0.963789 0.963753
+0.963717 0.963681 0.963645 0.963609 0.963574 0.963538 0.963502 0.963466
+0.96343 0.963394 0.963358 0.963322 0.963286 0.96325 0.963214 0.963177
+0.963141 0.963105 0.963069 0.963033 0.962997 0.96296 0.962924 0.962888
+0.962852 0.962815 0.962779 0.962743 0.962707 0.96267 0.962634 0.962597
+0.962561 0.962525 0.962488 0.962452 0.962415 0.962379 0.962342 0.962306
+0.962269 0.962233 0.962196 0.96216 0.962123 0.962086 0.96205 0.962013
+0.961976 0.96194 0.961903 0.961866 0.96183 0.961793 0.961756 0.961719
+0.961682 0.961646 0.961609 0.961572 0.961535 0.961498 0.961461 0.961424
+0.961388 0.961351 0.961314 0.961277 0.96124 0.961203 0.961166 0.961128
+0.961091 0.961054 0.961017 0.96098 0.960943 0.960906 0.960869 0.960831
+0.960794 0.960757 0.96072 0.960683 0.960645 0.960608 0.960571 0.960533
+0.960496 0.960459 0.960421 0.960384 0.960346 0.960309 0.960272 0.960234
+0.960197 0.960159 0.960122 0.960084 0.960047 0.960009 0.959971 0.959934
+0.959896 0.959859 0.959821 0.959783 0.959746 0.959708 0.95967 0.959632
+0.959595 0.959557 0.959519 0.959481 0.959444 0.959406 0.959368 0.95933
+0.959292 0.959254 0.959216 0.959178 0.95914 0.959102 0.959064 0.959026
+0.958988 0.95895 0.958912 0.958874 0.958836 0.958798 0.95876 0.958722
+0.958684 0.958646 0.958607 0.958569 0.958531 0.958493 0.958454 0.958416
+0.958378 0.95834 0.958301 0.958263 0.958225 0.958186 0.958148 0.958109
+0.958071 0.958032 0.957994 0.957956 0.957917 0.957879 0.95784 0.957801
+0.957763 0.957724 0.957686 0.957647 0.957609 0.95757 0.957531 0.957493
+0.957454 0.957415 0.957376 0.957338 0.957299 0.95726 0.957221 0.957183
+0.957144 0.957105 0.957066 0.957027 0.956988 0.956949 0.95691 0.956871
+0.956833 0.956794 0.956755 0.956716 0.956676 0.956637 0.956598 0.956559
+0.95652 0.956481 0.956442 0.956403 0.956364 0.956324 0.956285 0.956246
+0.956207 0.956168 0.956128 0.956089 0.95605 0.95601 0.955971 0.955932
+0.955892 0.955853 0.955814 0.955774 0.955735 0.955695 0.955656 0.955616
+0.955577 0.955537 0.955498 0.955458 0.955419 0.955379 0.95534 0.9553
+0.95526 0.955221 0.955181 0.955141 0.955102 0.955062 0.955022 0.954982
+0.954943 0.954903 0.954863 0.954823 0.954783 0.954744 0.954704 0.954664
+0.954624 0.954584 0.954544 0.954504 0.954464 0.954424 0.954384 0.954344
+0.954304 0.954264 0.954224 0.954184 0.954144 0.954104 0.954064 0.954023
+0.953983 0.953943 0.953903 0.953863 0.953822 0.953782 0.953742 0.953702
+0.953661 0.953621 0.953581 0.95354 0.9535 0.95346 0.953419 0.953379
+0.953338 0.953298 0.953257 0.953217 0.953176 0.953136 0.953095 0.953055
+0.953014 0.952974 0.952933 0.952892 0.952852 0.952811 0.95277 0.95273
+0.952689 0.952648 0.952608 0.952567 0.952526 0.952485 0.952445 0.952404
+0.952363 0.952322 0.952281 0.95224 0.952199 0.952158 0.952118 0.952077
+0.952036 0.951995 0.951954 0.951913 0.951872 0.951831 0.951789 0.951748
+0.951707 0.951666 0.951625 0.951584 0.951543 0.951502 0.95146 0.951419
+0.951378 0.951337 0.951295 0.951254 0.951213 0.951172 0.95113 0.951089
+0.951047 0.951006 0.950965 0.950923 0.950882 0.95084 0.950799 0.950757
+0.950716 0.950674 0.950633 0.950591 0.95055 0.950508 0.950467 0.950425
+0.950383 0.950342 0.9503 0.950258 0.950217 0.950175 0.950133 0.950091
+0.95005 0.950008 0.949966 0.949924 0.949883 0.949841 0.949799 0.949757
+0.949715 0.949673 0.949631 0.949589 0.949547 0.949505 0.949463 0.949421
+0.949379 0.949337 0.949295 0.949253 0.949211 0.949169 0.949127 0.949085
+0.949042 0.949 0.948958 0.948916 0.948874 0.948831 0.948789 0.948747
+0.948705 0.948662 0.94862 0.948578 0.948535 0.948493 0.948451 0.948408
+0.948366 0.948323 0.948281 0.948238 0.948196 0.948153 0.948111 0.948068
+0.948026 0.947983 0.947941 0.947898 0.947855 0.947813 0.94777 0.947727
+0.947685 0.947642 0.947599 0.947556 0.947514 0.947471 0.947428 0.947385
+0.947343 0.9473 0.947257 0.947214 0.947171 0.947128 0.947085 0.947042
+0.946999 0.946956 0.946913 0.946871 0.946827 0.946784 0.946741 0.946698
+0.946655 0.946612 0.946569 0.946526 0.946483 0.94644 0.946396 0.946353
+0.94631 0.946267 0.946224 0.94618 0.946137 0.946094 0.94605 0.946007
+0.945964 0.94592 0.945877 0.945834 0.94579 0.945747 0.945703 0.94566
+0.945616 0.945573 0.945529 0.945486 0.945442 0.945399 0.945355 0.945312
+0.945268 0.945224 0.945181 0.945137 0.945093 0.94505 0.945006 0.944962
+0.944919 0.944875 0.944831 0.944787 0.944743 0.9447 0.944656 0.944612
+0.944568 0.944524 0.94448 0.944436 0.944392 0.944348 0.944305 0.944261
+0.944217 0.944173 0.944129 0.944084 0.94404 0.943996 0.943952 0.943908
+0.943864 0.94382 0.943776 0.943731 0.943687 0.943643 0.943599 0.943555
+0.94351 0.943466 0.943422 0.943377 0.943333 0.943289 0.943244 0.9432
+0.943156 0.943111 0.943067 0.943022 0.942978 0.942933 0.942889 0.942845
+0.9428 0.942755 0.942711 0.942666 0.942622 0.942577 0.942532 0.942488
+0.942443 0.942399 0.942354 0.942309 0.942264 0.94222 0.942175 0.94213
+0.942085 0.942041 0.941996 0.941951 0.941906 0.941861 0.941816 0.941772
+0.941727 0.941682 0.941637 0.941592 0.941547 0.941502 0.941457 0.941412
+0.941367 0.941322 0.941277 0.941231 0.941186 0.941141 0.941096 0.941051
+0.941006 0.940961 0.940915 0.94087 0.940825 0.94078 0.940734 0.940689
+0.940644 0.940599 0.940553 0.940508 0.940463 0.940417 0.940372 0.940326
+0.940281 0.940235 0.94019 0.940144 0.940099 0.940054 0.940008 0.939962
+0.939917 0.939871 0.939826 0.93978 0.939734 0.939689 0.939643 0.939597
+0.939552 0.939506 0.93946 0.939415 0.939369 0.939323 0.939277 0.939232
+0.939186 0.93914 0.939094 0.939048 0.939002 0.938956 0.93891 0.938865
+0.938819 0.938773 0.938727 0.938681 0.938635 0.938589 0.938543 0.938497
+0.93845;
+#A 19000 0.938404 0.938358 0.938312 0.938266 0.93822 0.938174 0.938127
+0.938081 0.938035 0.937989 0.937943 0.937896 0.93785 0.937804 0.937757
+0.937711 0.937665 0.937618 0.937572 0.937526 0.937479 0.937433 0.937386
+0.93734 0.937293 0.937247 0.9372 0.937154 0.937107 0.937061 0.937014
+0.936968 0.936921 0.936874 0.936828 0.936781 0.936734 0.936688 0.936641
+0.936594 0.936548 0.936501 0.936454 0.936407 0.93636 0.936314 0.936267
+0.93622 0.936173 0.936126 0.936079 0.936032 0.935985 0.935938 0.935892
+0.935845 0.935798 0.935751 0.935704 0.935656 0.935609 0.935562 0.935515
+0.935468 0.935421 0.935374 0.935327 0.93528 0.935232 0.935185 0.935138
+0.935091 0.935044 0.934996 0.934949 0.934902 0.934854 0.934807 0.93476
+0.934712 0.934665 0.934618 0.93457 0.934523 0.934475 0.934428 0.93438
+0.934333 0.934285 0.934238 0.93419 0.934143 0.934095 0.934048 0.934
+0.933952 0.933905 0.933857 0.933809 0.933762 0.933714 0.933666 0.933619
+0.933571 0.933523 0.933475 0.933428 0.93338 0.933332 0.933284 0.933236
+0.933188 0.93314 0.933093 0.933045 0.932997 0.932949 0.932901 0.932853
+0.932805 0.932757 0.932709 0.932661 0.932613 0.932565 0.932517 0.932468
+0.93242 0.932372 0.932324 0.932276 0.932228 0.932179 0.932131 0.932083
+0.932035 0.931986 0.931938 0.93189 0.931842 0.931793 0.931745 0.931696
+0.931648 0.9316 0.931551 0.931503 0.931454 0.931406 0.931358 0.931309
+0.931261 0.931212 0.931163 0.931115 0.931066 0.931018 0.930969 0.930921
+0.930872 0.930823 0.930775 0.930726 0.930677 0.930628 0.93058 0.930531
+0.930482 0.930433 0.930385 0.930336 0.930287 0.930238 0.930189 0.93014
+0.930092 0.930043 0.929994 0.929945 0.929896 0.929847 0.929798 0.929749
+0.9297 0.929651 0.929602 0.929553 0.929504 0.929455 0.929406 0.929356
+0.929307 0.929258 0.929209 0.92916 0.929111 0.929061 0.929012 0.928963
+0.928914 0.928864 0.928815 0.928766 0.928716 0.928667 0.928618 0.928568
+0.928519 0.928469 0.92842 0.928371 0.928321 0.928272 0.928222 0.928173
+0.928123 0.928074 0.928024 0.927975 0.927925 0.927875 0.927826 0.927776
+0.927727 0.927677 0.927627 0.927577 0.927528 0.927478 0.927428 0.927379
+0.927329 0.927279 0.927229 0.927179 0.92713 0.92708 0.92703 0.92698
+0.92693 0.92688 0.92683 0.92678 0.92673 0.92668 0.92663 0.92658 0.92653
+0.92648 0.92643 0.92638 0.92633 0.92628 0.92623 0.92618 0.92613 0.926079
+0.926029 0.925979 0.925929 0.925879 0.925828 0.925778 0.925728 0.925678
+0.925627 0.925577 0.925527 0.925476 0.925426 0.925376 0.925325 0.925275
+0.925224 0.925174 0.925123 0.925073 0.925022 0.924972 0.924921 0.924871
+0.92482 0.92477 0.924719 0.924669 0.924618 0.924567 0.924517 0.924466
+0.924415 0.924365 0.924314 0.924263 0.924212 0.924162 0.924111 0.92406
+0.924009 0.923959 0.923908 0.923857 0.923806 0.923755 0.923704 0.923653
+0.923602 0.923551 0.9235 0.92345 0.923399 0.923348 0.923297 0.923245
+0.923194 0.923143 0.923092 0.923041 0.92299 0.922939 0.922888 0.922837
+0.922785 0.922734 0.922683 0.922632 0.922581 0.922529 0.922478 0.922427
+0.922376 0.922324 0.922273 0.922221 0.92217 0.922119 0.922067 0.922016
+0.921965 0.921913 0.921862 0.92181 0.921759 0.921707 0.921656 0.921604
+0.921553 0.921501 0.921449 0.921398 0.921346 0.921295 0.921243 0.921191
+0.92114 0.921088 0.921036 0.920985 0.920933 0.920881 0.920829 0.920777
+0.920726 0.920674 0.920622 0.92057 0.920518 0.920466 0.920415 0.920363
+0.920311 0.920259 0.920207 0.920155 0.920103 0.920051 0.919999 0.919947
+0.919895 0.919843 0.919791 0.919739 0.919687 0.919634 0.919582 0.91953
+0.919478 0.919426 0.919374 0.919321 0.919269 0.919217 0.919165 0.919112
+0.91906 0.919008 0.918955 0.918903 0.918851 0.918798 0.918746 0.918694
+0.918641 0.918589 0.918536 0.918484 0.918431 0.918379 0.918326 0.918274
+0.918221 0.918169 0.918116 0.918064 0.918011 0.917958 0.917906 0.917853
+0.9178 0.917748 0.917695 0.917642 0.91759 0.917537 0.917484 0.917431
+0.917379 0.917326 0.917273 0.91722 0.917167 0.917114 0.917062 0.917009
+0.916956 0.916903 0.91685 0.916797 0.916744 0.916691 0.916638 0.916585
+0.916532 0.916479 0.916426 0.916373 0.91632 0.916267 0.916214 0.91616
+0.916107 0.916054 0.916001 0.915948 0.915895 0.915841 0.915788 0.915735
+0.915682 0.915628 0.915575 0.915522 0.915468 0.915415 0.915362 0.915308
+0.915255 0.915201 0.915148 0.915095 0.915041 0.914988 0.914934 0.914881
+0.914827 0.914774 0.91472 0.914666 0.914613 0.914559 0.914506 0.914452
+0.914398 0.914345 0.914291 0.914237 0.914184 0.91413 0.914076 0.914023
+0.913969 0.913915 0.913861 0.913807 0.913754 0.9137 0.913646 0.913592
+0.913538 0.913484 0.91343 0.913376 0.913322 0.913269 0.913215 0.913161
+0.913107 0.913052 0.912998 0.912944 0.91289 0.912836 0.912782 0.912728
+0.912674 0.91262 0.912566 0.912511 0.912457 0.912403 0.912349 0.912295
+0.91224 0.912186 0.912132 0.912078 0.912023 0.911969 0.911915 0.91186
+0.911806 0.911752 0.911697 0.911643 0.911588 0.911534 0.911479 0.911425
+0.91137 0.911316 0.911261 0.911207 0.911152 0.911098 0.911043 0.910989
+0.910934 0.910879 0.910825 0.91077 0.910715 0.910661 0.910606 0.910551
+0.910497 0.910442 0.910387 0.910332 0.910277 0.910223 0.910168 0.910113
+0.910058 0.910003 0.909948 0.909894 0.909839 0.909784 0.909729 0.909674
+0.909619 0.909564 0.909509 0.909454 0.909399 0.909344 0.909289 0.909234
+0.909178 0.909123 0.909068 0.909013 0.908958 0.908903 0.908848 0.908792
+0.908737 0.908682 0.908627 0.908571 0.908516 0.908461 0.908406 0.90835
+0.908295 0.90824 0.908184 0.908129 0.908073 0.908018 0.907963 0.907907
+0.907852 0.907796 0.907741 0.907685 0.90763 0.907574 0.907519 0.907463
+0.907408 0.907352 0.907296 0.907241 0.907185 0.90713 0.907074 0.907018
+0.906962 0.906907 0.906851 0.906795 0.90674 0.906684 0.906628 0.906572
+0.906516 0.906461 0.906405 0.906349 0.906293 0.906237 0.906181 0.906125
+0.906069 0.906013 0.905957 0.905901 0.905845 0.905789 0.905733 0.905677
+0.905621 0.905565 0.905509 0.905453 0.905397 0.905341 0.905285 0.905229
+0.905172 0.905116 0.90506 0.905004 0.904948 0.904891 0.904835 0.904779
+0.904723 0.904666 0.90461 0.904554 0.904497 0.904441 0.904384 0.904328
+0.904272 0.904215 0.904159 0.904102 0.904046 0.903989 0.903933 0.903876
+0.90382 0.903763 0.903707 0.90365 0.903594 0.903537 0.90348 0.903424
+0.903367 0.90331 0.903254 0.903197 0.90314 0.903084 0.903027 0.90297
+0.902913 0.902857 0.9028 0.902743 0.902686 0.902629 0.902573 0.902516
+0.902459 0.902402 0.902345 0.902288 0.902231 0.902174 0.902117 0.90206
+0.902003 0.901946 0.901889 0.901832 0.901775 0.901718 0.901661 0.901604
+0.901547 0.901489 0.901432 0.901375 0.901318 0.901261 0.901204 0.901146
+0.901089 0.901032 0.900975 0.900917 0.90086 0.900803 0.900745 0.900688
+0.900631 0.900573 0.900516 0.900459 0.900401 0.900344 0.900286 0.900229
+0.900171 0.900114 0.900056 0.899999 0.899941 0.899884 0.899826 0.899769
+0.899711 0.899653 0.899596 0.899538 0.899481 0.899423 0.899365 0.899307
+0.89925 0.899192 0.899134 0.899077 0.899019 0.898961 0.898903 0.898845
+0.898788 0.89873 0.898672 0.898614 0.898556 0.898498 0.89844 0.898382
+0.898324 0.898266 0.898209 0.898151 0.898093 0.898035 0.897977 0.897918
+0.89786 0.897802 0.897744 0.897686 0.897628 0.89757 0.897512 0.897454
+0.897395 0.897337 0.897279 0.897221 0.897163 0.897104 0.897046 0.896988
+0.896929 0.896871 0.896813 0.896755 0.896696 0.896638 0.896579 0.896521
+0.896463 0.896404 0.896346 0.896287 0.896229 0.89617 0.896112 0.896053
+0.895995 0.895936 0.895878 0.895819 0.895761 0.895702 0.895643 0.895585
+0.895526 0.895467 0.895409 0.89535 0.895291 0.895233 0.895174 0.895115
+0.895056 0.894998 0.894939 0.89488 0.894821 0.894762 0.894704 0.894645
+0.894586 0.894527 0.894468 0.894409 0.89435 0.894291 0.894232 0.894173
+0.894114 0.894055 0.893996 0.893937 0.893878 0.893819 0.89376 0.893701
+0.893642 0.893583 0.893524 0.893464 0.893405 0.893346 0.893287 0.893228
+0.893168 0.893109 0.89305 0.892991 0.892931 0.892872 0.892813 0.892753
+0.892694 0.892635 0.892575 0.892516 0.892457 0.892397 0.892338 0.892278
+0.892219 0.892159 0.8921 0.89204 0.891981 0.891921 0.891862 0.891802
+0.891743 0.891683 0.891623 0.891564 0.891504 0.891445 0.891385 0.891325
+0.891266 0.891206 0.891146 0.891086 0.891027 0.890967 0.890907 0.890847
+0.890788 0.890728 0.890668 0.890608 0.890548 0.890488 0.890429 0.890369
+0.890309 0.890249 0.890189 0.890129 0.890069 0.890009 0.889949 0.889889
+0.889829 0.889769 0.889709 0.889649 0.889589 0.889529 0.889468 0.889408
+0.889348 0.889288 0.889228 0.889168 0.889107 0.889047 0.888987 0.888927
+0.888866 0.888806 0.888746 0.888686 0.888625 0.888565 0.888505 0.888444
+0.888384 0.888323 0.888263 0.888203 0.888142 0.888082 0.888021 0.887961
+0.8879 0.88784 0.887779 0.887719 0.887658 0.887598 0.887537 0.887477
+0.887416 0.887355 0.887295 0.887234 0.887173 0.887113 0.887052 0.886991
+0.886931 0.88687 0.886809 0.886748 0.886688 0.886627 0.886566 0.886505
+0.886444 0.886384 0.886323 0.886262 0.886201 0.88614 0.886079 0.886018
+0.885957 0.885896 0.885835 0.885774 0.885713 0.885652 0.885591 0.88553
+0.885469 0.885408 0.885347 0.885286 0.885225 0.885164 0.885103 0.885041
+0.88498 0.884919 0.884858 0.884797 0.884735 0.884674 0.884613;
+#A 20000 0.884552 0.88449 0.884429 0.884368 0.884306 0.884245 0.884184
+0.884122 0.884061 0.884 0.883938 0.883877 0.883815 0.883754 0.883692
+0.883631 0.883569 0.883508 0.883446 0.883385 0.883323 0.883262 0.8832
+0.883139 0.883077 0.883015 0.882954 0.882892 0.88283 0.882769 0.882707
+0.882645 0.882584 0.882522 0.88246 0.882398 0.882337 0.882275 0.882213
+0.882151 0.882089 0.882028 0.881966 0.881904 0.881842 0.88178 0.881718
+0.881656 0.881594 0.881532 0.88147 0.881408 0.881346 0.881284 0.881222
+0.88116 0.881098 0.881036 0.880974 0.880912 0.88085 0.880788 0.880726
+0.880663 0.880601 0.880539 0.880477 0.880415 0.880352 0.88029 0.880228
+0.880166 0.880103 0.880041 0.879979 0.879916 0.879854 0.879792 0.879729
+0.879667 0.879605 0.879542 0.87948 0.879417 0.879355 0.879292 0.87923
+0.879167 0.879105 0.879042 0.87898 0.878917 0.878855 0.878792 0.87873
+0.878667 0.878604 0.878542 0.878479 0.878416 0.878354 0.878291 0.878228
+0.878166 0.878103 0.87804 0.877977 0.877915 0.877852 0.877789 0.877726
+0.877664 0.877601 0.877538 0.877475 0.877412 0.877349 0.877286 0.877223
+0.87716 0.877097 0.877035 0.876972 0.876909 0.876846 0.876783 0.87672
+0.876656 0.876593 0.87653 0.876467 0.876404 0.876341 0.876278 0.876215
+0.876152 0.876088 0.876025 0.875962 0.875899 0.875836 0.875772 0.875709
+0.875646 0.875583 0.875519 0.875456 0.875393 0.875329 0.875266 0.875203
+0.875139 0.875076 0.875012 0.874949 0.874886 0.874822 0.874759 0.874695
+0.874632 0.874568 0.874505 0.874441 0.874378 0.874314 0.87425 0.874187
+0.874123 0.87406 0.873996 0.873932 0.873869 0.873805 0.873741 0.873678
+0.873614 0.87355 0.873487 0.873423 0.873359 0.873295 0.873231 0.873168
+0.873104 0.87304 0.872976 0.872912 0.872848 0.872785 0.872721 0.872657
+0.872593 0.872529 0.872465 0.872401 0.872337 0.872273 0.872209 0.872145
+0.872081 0.872017 0.871953 0.871889 0.871825 0.871761 0.871696 0.871632
+0.871568 0.871504 0.87144 0.871376 0.871311 0.871247 0.871183 0.871119
+0.871054 0.87099 0.870926 0.870862 0.870797 0.870733 0.870669 0.870604
+0.87054 0.870476 0.870411 0.870347 0.870282 0.870218 0.870153 0.870089
+0.870025 0.86996 0.869896 0.869831 0.869767 0.869702 0.869637 0.869573
+0.869508 0.869444 0.869379 0.869314 0.86925 0.869185 0.86912 0.869056
+0.868991 0.868926 0.868862 0.868797 0.868732 0.868667 0.868603 0.868538
+0.868473 0.868408 0.868343 0.868279 0.868214 0.868149 0.868084 0.868019
+0.867954 0.867889 0.867824 0.867759 0.867694 0.867629 0.867564 0.867499
+0.867434 0.867369 0.867304 0.867239 0.867174 0.867109 0.867044 0.866979
+0.866914 0.866849 0.866784 0.866718 0.866653 0.866588 0.866523 0.866458
+0.866392 0.866327 0.866262 0.866197 0.866131 0.866066 0.866001 0.865935
+0.86587 0.865805 0.865739 0.865674 0.865609 0.865543 0.865478 0.865412
+0.865347 0.865281 0.865216 0.86515 0.865085 0.865019 0.864954 0.864888
+0.864823 0.864757 0.864692 0.864626 0.86456 0.864495 0.864429 0.864364
+0.864298 0.864232 0.864166 0.864101 0.864035 0.863969 0.863904 0.863838
+0.863772 0.863706 0.863641 0.863575 0.863509 0.863443 0.863377 0.863311
+0.863245 0.86318 0.863114 0.863048 0.862982 0.862916 0.86285 0.862784
+0.862718 0.862652 0.862586 0.86252 0.862454 0.862388 0.862322 0.862256
+0.86219 0.862124 0.862057 0.861991 0.861925 0.861859 0.861793 0.861727
+0.86166 0.861594 0.861528 0.861462 0.861396 0.861329 0.861263 0.861197
+0.86113 0.861064 0.860998 0.860931 0.860865 0.860799 0.860732 0.860666
+0.8606 0.860533 0.860467 0.8604 0.860334 0.860267 0.860201 0.860134
+0.860068 0.860001 0.859935 0.859868 0.859802 0.859735 0.859668 0.859602
+0.859535 0.859469 0.859402 0.859335 0.859269 0.859202 0.859135 0.859069
+0.859002 0.858935 0.858868 0.858801 0.858735 0.858668 0.858601 0.858534
+0.858467 0.858401 0.858334 0.858267 0.8582 0.858133 0.858066 0.857999
+0.857932 0.857865 0.857798 0.857731 0.857664 0.857597 0.85753 0.857463
+0.857396 0.857329 0.857262 0.857195 0.857128 0.857061 0.856994 0.856927
+0.85686 0.856792 0.856725 0.856658 0.856591 0.856524 0.856456 0.856389
+0.856322 0.856255 0.856187 0.85612 0.856053 0.855986 0.855918 0.855851
+0.855783 0.855716 0.855649 0.855581 0.855514 0.855447 0.855379 0.855312
+0.855244 0.855177 0.855109 0.855042 0.854974 0.854907 0.854839 0.854772
+0.854704 0.854636 0.854569 0.854501 0.854434 0.854366 0.854298 0.854231
+0.854163 0.854095 0.854028 0.85396 0.853892 0.853824 0.853757 0.853689
+0.853621 0.853553 0.853486 0.853418 0.85335 0.853282 0.853214 0.853146
+0.853079 0.853011 0.852943 0.852875 0.852807 0.852739 0.852671 0.852603
+0.852535 0.852467 0.852399 0.852331 0.852263 0.852195 0.852127 0.852059
+0.851991 0.851923 0.851855 0.851786 0.851718 0.85165 0.851582 0.851514
+0.851446 0.851377 0.851309 0.851241 0.851173 0.851104 0.851036 0.850968
+0.8509 0.850831 0.850763 0.850695 0.850626 0.850558 0.85049 0.850421
+0.850353 0.850284 0.850216 0.850148 0.850079 0.850011 0.849942 0.849874
+0.849805 0.849737 0.849668 0.8496 0.849531 0.849463 0.849394 0.849325
+0.849257 0.849188 0.849119 0.849051 0.848982 0.848914 0.848845 0.848776
+0.848707 0.848639 0.84857 0.848501 0.848433 0.848364 0.848295 0.848226
+0.848157 0.848089 0.84802 0.847951 0.847882 0.847813 0.847744 0.847675
+0.847606 0.847538 0.847469 0.8474 0.847331 0.847262 0.847193 0.847124
+0.847055 0.846986 0.846917 0.846848 0.846779 0.846709 0.84664 0.846571
+0.846502 0.846433 0.846364 0.846295 0.846226 0.846156 0.846087 0.846018
+0.845949 0.84588 0.84581 0.845741 0.845672 0.845603 0.845533 0.845464
+0.845395 0.845325 0.845256 0.845187 0.845117 0.845048 0.844979 0.844909
+0.84484 0.84477 0.844701 0.844631 0.844562 0.844492 0.844423 0.844353
+0.844284 0.844214 0.844145 0.844075 0.844006 0.843936 0.843867 0.843797
+0.843727 0.843658 0.843588 0.843518 0.843449 0.843379 0.843309 0.84324
+0.84317 0.8431 0.84303 0.842961 0.842891 0.842821 0.842751 0.842681
+0.842612 0.842542 0.842472 0.842402 0.842332 0.842262 0.842192 0.842123
+0.842053 0.841983 0.841913 0.841843 0.841773 0.841703 0.841633 0.841563
+0.841493 0.841423 0.841353 0.841283 0.841213 0.841143 0.841072 0.841002
+0.840932 0.840862 0.840792 0.840722 0.840652 0.840581 0.840511 0.840441
+0.840371 0.840301 0.84023 0.84016 0.84009 0.840019 0.839949 0.839879
+0.839809 0.839738 0.839668 0.839597 0.839527 0.839457 0.839386 0.839316
+0.839245 0.839175 0.839105 0.839034 0.838964 0.838893 0.838823 0.838752
+0.838682 0.838611 0.838541 0.83847 0.838399 0.838329 0.838258 0.838188
+0.838117 0.838046 0.837976 0.837905 0.837834 0.837764 0.837693 0.837622
+0.837552 0.837481 0.83741 0.837339 0.837269 0.837198 0.837127 0.837056
+0.836985 0.836914 0.836844 0.836773 0.836702 0.836631 0.83656 0.836489
+0.836418 0.836347 0.836276 0.836205 0.836134 0.836064 0.835993 0.835922
+0.835851 0.835779 0.835708 0.835637 0.835566 0.835495 0.835424 0.835353
+0.835282 0.835211 0.83514 0.835068 0.834997 0.834926 0.834855 0.834784
+0.834713 0.834641 0.83457 0.834499 0.834428 0.834356 0.834285 0.834214
+0.834142 0.834071 0.834 0.833928 0.833857 0.833786 0.833714 0.833643
+0.833571 0.8335 0.833429 0.833357 0.833286 0.833214 0.833143 0.833071
+0.833 0.832928 0.832857 0.832785 0.832713 0.832642 0.83257 0.832499
+0.832427 0.832355 0.832284 0.832212 0.832141 0.832069 0.831997 0.831926
+0.831854 0.831782 0.83171 0.831639 0.831567 0.831495 0.831423 0.831352
+0.83128 0.831208 0.831136 0.831064 0.830992 0.830921 0.830849 0.830777
+0.830705 0.830633 0.830561 0.830489 0.830417 0.830345 0.830273 0.830201
+0.830129 0.830057 0.829985 0.829913 0.829841 0.829769 0.829697 0.829625
+0.829553 0.829481 0.829409 0.829336 0.829264 0.829192 0.82912 0.829048
+0.828976 0.828903 0.828831 0.828759 0.828687 0.828614 0.828542 0.82847
+0.828398 0.828325 0.828253 0.828181 0.828108 0.828036 0.827964 0.827891
+0.827819 0.827746 0.827674 0.827602 0.827529 0.827457 0.827384 0.827312
+0.827239 0.827167 0.827094 0.827022 0.826949 0.826877 0.826804 0.826732
+0.826659 0.826586 0.826514 0.826441 0.826369 0.826296 0.826223 0.826151
+0.826078 0.826005 0.825933 0.82586 0.825787 0.825714 0.825642 0.825569
+0.825496 0.825423 0.825351 0.825278 0.825205 0.825132 0.825059 0.824986
+0.824914 0.824841 0.824768 0.824695 0.824622 0.824549 0.824476 0.824403
+0.82433 0.824257 0.824184 0.824111 0.824038 0.823965 0.823892 0.823819
+0.823746 0.823673 0.8236 0.823527 0.823454 0.823381 0.823307 0.823234
+0.823161 0.823088 0.823015 0.822942 0.822868 0.822795 0.822722 0.822649
+0.822576 0.822502 0.822429 0.822356 0.822282 0.822209 0.822136 0.822062
+0.821989 0.821916 0.821842 0.821769 0.821696 0.821622 0.821549 0.821475
+0.821402 0.821329 0.821255 0.821182 0.821108 0.821035 0.820961 0.820888
+0.820814 0.820741 0.820667 0.820593 0.82052 0.820446 0.820373 0.820299
+0.820225 0.820152 0.820078 0.820004 0.819931 0.819857 0.819783 0.81971
+0.819636 0.819562 0.819488 0.819415 0.819341 0.819267 0.819193 0.81912
+0.819046 0.818972 0.818898 0.818824 0.81875 0.818677 0.818603 0.818529
+0.818455 0.818381 0.818307 0.818233 0.818159 0.818085 0.818011 0.817937
+0.817863 0.817789 0.817715 0.817641 0.817567 0.817493 0.817419 0.817345
+0.817271 0.817197 0.817123 0.817048 0.816974 0.8169 0.816826 0.816752
+0.816678;
+#A 21000 0.816603 0.816529 0.816455 0.816381 0.816306 0.816232 0.816158
+0.816084 0.816009 0.815935 0.815861 0.815786 0.815712 0.815638 0.815563
+0.815489 0.815415 0.81534 0.815266 0.815191 0.815117 0.815042 0.814968
+0.814894 0.814819 0.814745 0.81467 0.814596 0.814521 0.814447 0.814372
+0.814297 0.814223 0.814148 0.814074 0.813999 0.813924 0.81385 0.813775
+0.813701 0.813626 0.813551 0.813477 0.813402 0.813327 0.813252 0.813178
+0.813103 0.813028 0.812953 0.812879 0.812804 0.812729 0.812654 0.812579
+0.812505 0.81243 0.812355 0.81228 0.812205 0.81213 0.812055 0.81198
+0.811906 0.811831 0.811756 0.811681 0.811606 0.811531 0.811456 0.811381
+0.811306 0.811231 0.811156 0.811081 0.811005 0.81093 0.810855 0.81078
+0.810705 0.81063 0.810555 0.81048 0.810405 0.810329 0.810254 0.810179
+0.810104 0.810029 0.809953 0.809878 0.809803 0.809728 0.809652 0.809577
+0.809502 0.809426 0.809351 0.809276 0.809201 0.809125 0.80905 0.808974
+0.808899 0.808824 0.808748 0.808673 0.808597 0.808522 0.808447 0.808371
+0.808296 0.80822 0.808145 0.808069 0.807994 0.807918 0.807842 0.807767
+0.807691 0.807616 0.80754 0.807465 0.807389 0.807313 0.807238 0.807162
+0.807086 0.807011 0.806935 0.806859 0.806784 0.806708 0.806632 0.806557
+0.806481 0.806405 0.806329 0.806253 0.806178 0.806102 0.806026 0.80595
+0.805874 0.805799 0.805723 0.805647 0.805571 0.805495 0.805419 0.805343
+0.805267 0.805191 0.805115 0.80504 0.804964 0.804888 0.804812 0.804736
+0.80466 0.804583 0.804507 0.804431 0.804355 0.804279 0.804203 0.804127
+0.804051 0.803975 0.803899 0.803823 0.803746 0.80367 0.803594 0.803518
+0.803442 0.803366 0.803289 0.803213 0.803137 0.803061 0.802984 0.802908
+0.802832 0.802756 0.802679 0.802603 0.802527 0.80245 0.802374 0.802298
+0.802221 0.802145 0.802068 0.801992 0.801916 0.801839 0.801763 0.801686
+0.80161 0.801533 0.801457 0.80138 0.801304 0.801227 0.801151 0.801074
+0.800998 0.800921 0.800845 0.800768 0.800691 0.800615 0.800538 0.800462
+0.800385 0.800308 0.800232 0.800155 0.800078 0.800002 0.799925 0.799848
+0.799771 0.799695 0.799618 0.799541 0.799464 0.799388 0.799311 0.799234
+0.799157 0.79908 0.799004 0.798927 0.79885 0.798773 0.798696 0.798619
+0.798542 0.798465 0.798388 0.798311 0.798235 0.798158 0.798081 0.798004
+0.797927 0.79785 0.797773 0.797696 0.797619 0.797542 0.797464 0.797387
+0.79731 0.797233 0.797156 0.797079 0.797002 0.796925 0.796848 0.796771
+0.796693 0.796616 0.796539 0.796462 0.796385 0.796307 0.79623 0.796153
+0.796076 0.795998 0.795921 0.795844 0.795766 0.795689 0.795612 0.795535
+0.795457 0.79538 0.795303 0.795225 0.795148 0.79507 0.794993 0.794915
+0.794838 0.794761 0.794683 0.794606 0.794528 0.794451 0.794373 0.794296
+0.794218 0.794141 0.794063 0.793986 0.793908 0.793831 0.793753 0.793675
+0.793598 0.79352 0.793443 0.793365 0.793287 0.79321 0.793132 0.793054
+0.792977 0.792899 0.792821 0.792744 0.792666 0.792588 0.79251 0.792433
+0.792355 0.792277 0.792199 0.792121 0.792044 0.791966 0.791888 0.79181
+0.791732 0.791654 0.791576 0.791499 0.791421 0.791343 0.791265 0.791187
+0.791109 0.791031 0.790953 0.790875 0.790797 0.790719 0.790641 0.790563
+0.790485 0.790407 0.790329 0.790251 0.790173 0.790095 0.790017 0.789939
+0.78986 0.789782 0.789704 0.789626 0.789548 0.78947 0.789392 0.789313
+0.789235 0.789157 0.789079 0.789 0.788922 0.788844 0.788766 0.788687
+0.788609 0.788531 0.788453 0.788374 0.788296 0.788218 0.788139 0.788061
+0.787982 0.787904 0.787826 0.787747 0.787669 0.78759 0.787512 0.787434
+0.787355 0.787277 0.787198 0.78712 0.787041 0.786963 0.786884 0.786806
+0.786727 0.786649 0.78657 0.786491 0.786413 0.786334 0.786256 0.786177
+0.786098 0.78602 0.785941 0.785863 0.785784 0.785705 0.785626 0.785548
+0.785469 0.78539 0.785312 0.785233 0.785154 0.785075 0.784997 0.784918
+0.784839 0.78476 0.784681 0.784603 0.784524 0.784445 0.784366 0.784287
+0.784208 0.78413 0.784051 0.783972 0.783893 0.783814 0.783735 0.783656
+0.783577 0.783498 0.783419 0.78334 0.783261 0.783182 0.783103 0.783024
+0.782945 0.782866 0.782787 0.782708 0.782629 0.78255 0.78247 0.782391
+0.782312 0.782233 0.782154 0.782075 0.781996 0.781916 0.781837 0.781758
+0.781679 0.7816 0.78152 0.781441 0.781362 0.781283 0.781203 0.781124
+0.781045 0.780966 0.780886 0.780807 0.780728 0.780648 0.780569 0.78049
+0.78041 0.780331 0.780251 0.780172 0.780093 0.780013 0.779934 0.779854
+0.779775 0.779695 0.779616 0.779536 0.779457 0.779377 0.779298 0.779218
+0.779139 0.779059 0.77898 0.7789 0.778821 0.778741 0.778661 0.778582
+0.778502 0.778423 0.778343 0.778263 0.778184 0.778104 0.778024 0.777945
+0.777865 0.777785 0.777705 0.777626 0.777546 0.777466 0.777386 0.777307
+0.777227 0.777147 0.777067 0.776987 0.776908 0.776828 0.776748 0.776668
+0.776588 0.776508 0.776428 0.776349 0.776269 0.776189 0.776109 0.776029
+0.775949 0.775869 0.775789 0.775709 0.775629 0.775549 0.775469 0.775389
+0.775309 0.775229 0.775149 0.775069 0.774989 0.774909 0.774829 0.774749
+0.774668 0.774588 0.774508 0.774428 0.774348 0.774268 0.774188 0.774107
+0.774027 0.773947 0.773867 0.773787 0.773706 0.773626 0.773546 0.773466
+0.773385 0.773305 0.773225 0.773144 0.773064 0.772984 0.772904 0.772823
+0.772743 0.772663 0.772582 0.772502 0.772421 0.772341 0.772261 0.77218
+0.7721 0.772019 0.771939 0.771858 0.771778 0.771697 0.771617 0.771536
+0.771456 0.771375 0.771295 0.771214 0.771134 0.771053 0.770973 0.770892
+0.770811 0.770731 0.77065 0.77057 0.770489 0.770408 0.770328 0.770247
+0.770166 0.770086 0.770005 0.769924 0.769844 0.769763 0.769682 0.769601
+0.769521 0.76944 0.769359 0.769278 0.769198 0.769117 0.769036 0.768955
+0.768874 0.768794 0.768713 0.768632 0.768551 0.76847 0.768389 0.768308
+0.768227 0.768147 0.768066 0.767985 0.767904 0.767823 0.767742 0.767661
+0.76758 0.767499 0.767418 0.767337 0.767256 0.767175 0.767094 0.767013
+0.766932 0.76685 0.766769 0.766688 0.766607 0.766526 0.766445 0.766364
+0.766283 0.766202 0.76612 0.766039 0.765958 0.765877 0.765796 0.765714
+0.765633 0.765552 0.765471 0.76539 0.765308 0.765227 0.765146 0.765064
+0.764983 0.764902 0.764821 0.764739 0.764658 0.764576 0.764495 0.764414
+0.764332 0.764251 0.76417 0.764088 0.764007 0.763925 0.763844 0.763762
+0.763681 0.7636 0.763518 0.763437 0.763355 0.763274 0.763192 0.763111
+0.763029 0.762947 0.762866 0.762784 0.762703 0.762621 0.76254 0.762458
+0.762376 0.762295 0.762213 0.762132 0.76205 0.761968 0.761887 0.761805
+0.761723 0.761642 0.76156 0.761478 0.761396 0.761315 0.761233 0.761151
+0.761069 0.760988 0.760906 0.760824 0.760742 0.76066 0.760579 0.760497
+0.760415 0.760333 0.760251 0.760169 0.760088 0.760006 0.759924 0.759842
+0.75976 0.759678 0.759596 0.759514 0.759432 0.75935 0.759268 0.759186
+0.759104 0.759022 0.75894 0.758858 0.758776 0.758694 0.758612 0.75853
+0.758448 0.758366 0.758284 0.758202 0.75812 0.758038 0.757955 0.757873
+0.757791 0.757709 0.757627 0.757545 0.757462 0.75738 0.757298 0.757216
+0.757134 0.757051 0.756969 0.756887 0.756805 0.756722 0.75664 0.756558
+0.756476 0.756393 0.756311 0.756229 0.756146 0.756064 0.755982 0.755899
+0.755817 0.755734 0.755652 0.75557 0.755487 0.755405 0.755322 0.75524
+0.755158 0.755075 0.754993 0.75491 0.754828 0.754745 0.754663 0.75458
+0.754498 0.754415 0.754333 0.75425 0.754167 0.754085 0.754002 0.75392
+0.753837 0.753754 0.753672 0.753589 0.753507 0.753424 0.753341 0.753259
+0.753176 0.753093 0.753011 0.752928 0.752845 0.752762 0.75268 0.752597
+0.752514 0.752432 0.752349 0.752266 0.752183 0.7521 0.752018 0.751935
+0.751852 0.751769 0.751686 0.751603 0.751521 0.751438 0.751355 0.751272
+0.751189 0.751106 0.751023 0.75094 0.750857 0.750775 0.750692 0.750609
+0.750526 0.750443 0.75036 0.750277 0.750194 0.750111 0.750028 0.749945
+0.749862 0.749779 0.749695 0.749612 0.749529 0.749446 0.749363 0.74928
+0.749197 0.749114 0.749031 0.748948 0.748864 0.748781 0.748698 0.748615
+0.748532 0.748449 0.748365 0.748282 0.748199 0.748116 0.748032 0.747949
+0.747866 0.747783 0.747699 0.747616 0.747533 0.747449 0.747366 0.747283
+0.747199 0.747116 0.747033 0.746949 0.746866 0.746783 0.746699 0.746616
+0.746532 0.746449 0.746366 0.746282 0.746199 0.746115 0.746032 0.745948
+0.745865 0.745781 0.745698 0.745614 0.745531 0.745447 0.745364 0.74528
+0.745197 0.745113 0.74503 0.744946 0.744862 0.744779 0.744695 0.744612
+0.744528 0.744444 0.744361 0.744277 0.744193 0.74411 0.744026 0.743942
+0.743859 0.743775 0.743691 0.743608 0.743524 0.74344 0.743356 0.743273
+0.743189 0.743105 0.743021 0.742938 0.742854 0.74277 0.742686 0.742602
+0.742518 0.742435 0.742351 0.742267 0.742183 0.742099 0.742015 0.741931
+0.741847 0.741764 0.74168 0.741596 0.741512 0.741428 0.741344 0.74126
+0.741176 0.741092 0.741008 0.740924 0.74084 0.740756 0.740672 0.740588
+0.740504 0.74042 0.740336 0.740252 0.740167 0.740083 0.739999 0.739915
+0.739831 0.739747 0.739663 0.739579 0.739494 0.73941 0.739326 0.739242
+0.739158 0.739074 0.738989 0.738905 0.738821 0.738737 0.738652 0.738568
+0.738484 0.7384 0.738315 0.738231 0.738147 0.738062 0.737978 0.737894
+0.737809 0.737725 0.737641 0.737556 0.737472 0.737388 0.737303 0.737219
+0.737135;
+#A 22000 0.73705 0.736966 0.736881 0.736797 0.736712 0.736628 0.736543
+0.736459 0.736374 0.73629 0.736206 0.736121 0.736037 0.735952 0.735867
+0.735783 0.735698 0.735614 0.735529 0.735445 0.73536 0.735276 0.735191
+0.735106 0.735022 0.734937 0.734852 0.734768 0.734683 0.734598 0.734514
+0.734429 0.734344 0.73426 0.734175 0.73409 0.734006 0.733921 0.733836
+0.733751 0.733667 0.733582 0.733497 0.733412 0.733328 0.733243 0.733158
+0.733073 0.732988 0.732903 0.732819 0.732734 0.732649 0.732564 0.732479
+0.732394 0.732309 0.732224 0.73214 0.732055 0.73197 0.731885 0.7318
+0.731715 0.73163 0.731545 0.73146 0.731375 0.73129 0.731205 0.73112
+0.731035 0.73095 0.730865 0.73078 0.730695 0.73061 0.730525 0.73044
+0.730354 0.730269 0.730184 0.730099 0.730014 0.729929 0.729844 0.729759
+0.729673 0.729588 0.729503 0.729418 0.729333 0.729248 0.729162 0.729077
+0.728992 0.728907 0.728821 0.728736 0.728651 0.728566 0.72848 0.728395
+0.72831 0.728225 0.728139 0.728054 0.727969 0.727883 0.727798 0.727713
+0.727627 0.727542 0.727456 0.727371 0.727286 0.7272 0.727115 0.727029
+0.726944 0.726859 0.726773 0.726688 0.726602 0.726517 0.726431 0.726346
+0.72626 0.726175 0.726089 0.726004 0.725918 0.725833 0.725747 0.725662
+0.725576 0.725491 0.725405 0.725319 0.725234 0.725148 0.725063 0.724977
+0.724891 0.724806 0.72472 0.724634 0.724549 0.724463 0.724377 0.724292
+0.724206 0.72412 0.724035 0.723949 0.723863 0.723777 0.723692 0.723606
+0.72352 0.723434 0.723349 0.723263 0.723177 0.723091 0.723005 0.72292
+0.722834 0.722748 0.722662 0.722576 0.72249 0.722405 0.722319 0.722233
+0.722147 0.722061 0.721975 0.721889 0.721803 0.721717 0.721631 0.721546
+0.72146 0.721374 0.721288 0.721202 0.721116 0.72103 0.720944 0.720858
+0.720772 0.720686 0.7206 0.720514 0.720428 0.720341 0.720255 0.720169
+0.720083 0.719997 0.719911 0.719825 0.719739 0.719653 0.719567 0.71948
+0.719394 0.719308 0.719222 0.719136 0.71905 0.718963 0.718877 0.718791
+0.718705 0.718619 0.718532 0.718446 0.71836 0.718274 0.718187 0.718101
+0.718015 0.717929 0.717842 0.717756 0.71767 0.717583 0.717497 0.717411
+0.717324 0.717238 0.717152 0.717065 0.716979 0.716892 0.716806 0.71672
+0.716633 0.716547 0.71646 0.716374 0.716288 0.716201 0.716115 0.716028
+0.715942 0.715855 0.715769 0.715682 0.715596 0.715509 0.715423 0.715336
+0.71525 0.715163 0.715077 0.71499 0.714904 0.714817 0.71473 0.714644
+0.714557 0.714471 0.714384 0.714297 0.714211 0.714124 0.714038 0.713951
+0.713864 0.713778 0.713691 0.713604 0.713517 0.713431 0.713344 0.713257
+0.713171 0.713084 0.712997 0.71291 0.712824 0.712737 0.71265 0.712563
+0.712477 0.71239 0.712303 0.712216 0.712129 0.712043 0.711956 0.711869
+0.711782 0.711695 0.711608 0.711522 0.711435 0.711348 0.711261 0.711174
+0.711087 0.711 0.710913 0.710826 0.710739 0.710652 0.710565 0.710478
+0.710392 0.710305 0.710218 0.710131 0.710044 0.709957 0.70987 0.709783
+0.709695 0.709608 0.709521 0.709434 0.709347 0.70926 0.709173 0.709086
+0.708999 0.708912 0.708825 0.708738 0.708651 0.708563 0.708476 0.708389
+0.708302 0.708215 0.708128 0.70804 0.707953 0.707866 0.707779 0.707692
+0.707604 0.707517 0.70743 0.707343 0.707255 0.707168 0.707081 0.706994
+0.706906 0.706819 0.706732 0.706645 0.706557 0.70647 0.706383 0.706295
+0.706208 0.706121 0.706033 0.705946 0.705859 0.705771 0.705684 0.705596
+0.705509 0.705422 0.705334 0.705247 0.705159 0.705072 0.704984 0.704897
+0.70481 0.704722 0.704635 0.704547 0.70446 0.704372 0.704285 0.704197
+0.70411 0.704022 0.703935 0.703847 0.703759 0.703672 0.703584 0.703497
+0.703409 0.703322 0.703234 0.703146 0.703059 0.702971 0.702884 0.702796
+0.702708 0.702621 0.702533 0.702445 0.702358 0.70227 0.702182 0.702095
+0.702007 0.701919 0.701832 0.701744 0.701656 0.701568 0.701481 0.701393
+0.701305 0.701217 0.70113 0.701042 0.700954 0.700866 0.700778 0.700691
+0.700603 0.700515 0.700427 0.700339 0.700251 0.700164 0.700076 0.699988
+0.6999 0.699812 0.699724 0.699636 0.699548 0.699461 0.699373 0.699285
+0.699197 0.699109 0.699021 0.698933 0.698845 0.698757 0.698669 0.698581
+0.698493 0.698405 0.698317 0.698229 0.698141 0.698053 0.697965 0.697877
+0.697789 0.697701 0.697613 0.697525 0.697437 0.697348 0.69726 0.697172
+0.697084 0.696996 0.696908 0.69682 0.696732 0.696643 0.696555 0.696467
+0.696379 0.696291 0.696203 0.696114 0.696026 0.695938 0.69585 0.695762
+0.695673 0.695585 0.695497 0.695409 0.69532 0.695232 0.695144 0.695056
+0.694967 0.694879 0.694791 0.694703 0.694614 0.694526 0.694438 0.694349
+0.694261 0.694173 0.694084 0.693996 0.693907 0.693819 0.693731 0.693642
+0.693554 0.693466 0.693377 0.693289 0.6932 0.693112 0.693023 0.692935
+0.692846 0.692758 0.69267 0.692581 0.692493 0.692404 0.692316 0.692227
+0.692139 0.69205 0.691962 0.691873 0.691785 0.691696 0.691607 0.691519
+0.69143 0.691342 0.691253 0.691165 0.691076 0.690987 0.690899 0.69081
+0.690722 0.690633 0.690544 0.690456 0.690367 0.690278 0.69019 0.690101
+0.690012 0.689924 0.689835 0.689746 0.689658 0.689569 0.68948 0.689391
+0.689303 0.689214 0.689125 0.689036 0.688948 0.688859 0.68877 0.688681
+0.688592 0.688504 0.688415 0.688326 0.688237 0.688148 0.68806 0.687971
+0.687882 0.687793 0.687704 0.687615 0.687527 0.687438 0.687349 0.68726
+0.687171 0.687082 0.686993 0.686904 0.686815 0.686726 0.686637 0.686548
+0.686459 0.686371 0.686282 0.686193 0.686104 0.686015 0.685926 0.685837
+0.685748 0.685659 0.68557 0.685481 0.685391 0.685302 0.685213 0.685124
+0.685035 0.684946 0.684857 0.684768 0.684679 0.68459 0.684501 0.684412
+0.684323 0.684233 0.684144 0.684055 0.683966 0.683877 0.683788 0.683699
+0.683609 0.68352 0.683431 0.683342 0.683253 0.683163 0.683074 0.682985
+0.682896 0.682806 0.682717 0.682628 0.682539 0.68245 0.68236 0.682271
+0.682182 0.682092 0.682003 0.681914 0.681825 0.681735 0.681646 0.681557
+0.681467 0.681378 0.681289 0.681199 0.68111 0.68102 0.680931 0.680842
+0.680752 0.680663 0.680574 0.680484 0.680395 0.680305 0.680216 0.680126
+0.680037 0.679947 0.679858 0.679769 0.679679 0.67959 0.6795 0.679411
+0.679321 0.679232 0.679142 0.679053 0.678963 0.678874 0.678784 0.678695
+0.678605 0.678515 0.678426 0.678336 0.678247 0.678157 0.678068 0.677978
+0.677888 0.677799 0.677709 0.67762 0.67753 0.67744 0.677351 0.677261
+0.677171 0.677082 0.676992 0.676902 0.676813 0.676723 0.676633 0.676544
+0.676454 0.676364 0.676275 0.676185 0.676095 0.676005 0.675916 0.675826
+0.675736 0.675646 0.675557 0.675467 0.675377 0.675287 0.675197 0.675108
+0.675018 0.674928 0.674838 0.674748 0.674659 0.674569 0.674479 0.674389
+0.674299 0.674209 0.674119 0.67403 0.67394 0.67385 0.67376 0.67367
+0.67358 0.67349 0.6734 0.67331 0.67322 0.673131 0.673041 0.672951 0.672861
+0.672771 0.672681 0.672591 0.672501 0.672411 0.672321 0.672231 0.672141
+0.672051 0.671961 0.671871 0.671781 0.671691 0.671601 0.67151 0.67142
+0.67133 0.67124 0.67115 0.67106 0.67097 0.67088 0.67079 0.6707 0.67061
+0.670519 0.670429 0.670339 0.670249 0.670159 0.670069 0.669979 0.669888
+0.669798 0.669708 0.669618 0.669528 0.669438 0.669347 0.669257 0.669167
+0.669077 0.668986 0.668896 0.668806 0.668716 0.668625 0.668535 0.668445
+0.668355 0.668264 0.668174 0.668084 0.667993 0.667903 0.667813 0.667723
+0.667632 0.667542 0.667452 0.667361 0.667271 0.667181 0.66709 0.667
+0.666909 0.666819 0.666729 0.666638 0.666548 0.666458 0.666367 0.666277
+0.666186 0.666096 0.666005 0.665915 0.665825 0.665734 0.665644 0.665553
+0.665463 0.665372 0.665282 0.665191 0.665101 0.66501 0.66492 0.664829
+0.664739 0.664648 0.664558 0.664467 0.664377 0.664286 0.664195 0.664105
+0.664014 0.663924 0.663833 0.663743 0.663652 0.663561 0.663471 0.66338
+0.66329 0.663199 0.663108 0.663018 0.662927 0.662836 0.662746 0.662655
+0.662564 0.662474 0.662383 0.662292 0.662202 0.662111 0.66202 0.66193
+0.661839 0.661748 0.661658 0.661567 0.661476 0.661385 0.661295 0.661204
+0.661113 0.661022 0.660932 0.660841 0.66075 0.660659 0.660568 0.660478
+0.660387 0.660296 0.660205 0.660114 0.660024 0.659933 0.659842 0.659751
+0.65966 0.659569 0.659478 0.659388 0.659297 0.659206 0.659115 0.659024
+0.658933 0.658842 0.658751 0.65866 0.65857 0.658479 0.658388 0.658297
+0.658206 0.658115 0.658024 0.657933 0.657842 0.657751 0.65766 0.657569
+0.657478 0.657387 0.657296 0.657205 0.657114 0.657023 0.656932 0.656841
+0.65675 0.656659 0.656568 0.656477 0.656386 0.656295 0.656204 0.656112
+0.656021 0.65593 0.655839 0.655748 0.655657 0.655566 0.655475 0.655384
+0.655292 0.655201 0.65511 0.655019 0.654928 0.654837 0.654746 0.654654
+0.654563 0.654472 0.654381 0.65429 0.654198 0.654107 0.654016 0.653925
+0.653834 0.653742 0.653651 0.65356 0.653469 0.653377 0.653286 0.653195
+0.653104 0.653012 0.652921 0.65283 0.652739 0.652647 0.652556 0.652465
+0.652373 0.652282 0.652191 0.652099 0.652008 0.651917 0.651825 0.651734
+0.651643 0.651551 0.65146 0.651368 0.651277 0.651186 0.651094 0.651003
+0.650912 0.65082 0.650729 0.650637 0.650546 0.650455 0.650363 0.650272
+0.65018 0.650089 0.649997 0.649906 0.649814 0.649723 0.649631 0.64954
+0.649448 0.649357 0.649265 0.649174 0.649082 0.648991 0.648899;
+#A 23000 0.648808 0.648716 0.648625 0.648533 0.648442 0.64835 0.648259
+0.648167 0.648075 0.647984 0.647892 0.647801 0.647709 0.647618 0.647526
+0.647434 0.647343 0.647251 0.647159 0.647068 0.646976 0.646885 0.646793
+0.646701 0.64661 0.646518 0.646426 0.646335 0.646243 0.646151 0.64606
+0.645968 0.645876 0.645784 0.645693 0.645601 0.645509 0.645418 0.645326
+0.645234 0.645142 0.645051 0.644959 0.644867 0.644775 0.644684 0.644592
+0.6445 0.644408 0.644316 0.644225 0.644133 0.644041 0.643949 0.643857
+0.643766 0.643674 0.643582 0.64349 0.643398 0.643306 0.643215 0.643123
+0.643031 0.642939 0.642847 0.642755 0.642663 0.642571 0.642479 0.642388
+0.642296 0.642204 0.642112 0.64202 0.641928 0.641836 0.641744 0.641652
+0.64156 0.641468 0.641376 0.641284 0.641192 0.6411 0.641008 0.640916
+0.640824 0.640732 0.64064 0.640548 0.640456 0.640364 0.640272 0.64018
+0.640088 0.639996 0.639904 0.639812 0.63972 0.639628 0.639536 0.639444
+0.639352 0.63926 0.639168 0.639076 0.638984 0.638891 0.638799 0.638707
+0.638615 0.638523 0.638431 0.638339 0.638247 0.638155 0.638062 0.63797
+0.637878 0.637786 0.637694 0.637602 0.637509 0.637417 0.637325 0.637233
+0.637141 0.637048 0.636956 0.636864 0.636772 0.63668 0.636587 0.636495
+0.636403 0.636311 0.636218 0.636126 0.636034 0.635942 0.635849 0.635757
+0.635665 0.635573 0.63548 0.635388 0.635296 0.635203 0.635111 0.635019
+0.634926 0.634834 0.634742 0.63465 0.634557 0.634465 0.634372 0.63428
+0.634188 0.634095 0.634003 0.633911 0.633818 0.633726 0.633634 0.633541
+0.633449 0.633356 0.633264 0.633172 0.633079 0.632987 0.632894 0.632802
+0.632709 0.632617 0.632525 0.632432 0.63234 0.632247 0.632155 0.632062
+0.63197 0.631877 0.631785 0.631692 0.6316 0.631507 0.631415 0.631322
+0.63123 0.631137 0.631045 0.630952 0.63086 0.630767 0.630675 0.630582
+0.63049 0.630397 0.630305 0.630212 0.630119 0.630027 0.629934 0.629842
+0.629749 0.629656 0.629564 0.629471 0.629379 0.629286 0.629193 0.629101
+0.629008 0.628916 0.628823 0.62873 0.628638 0.628545 0.628452 0.62836
+0.628267 0.628174 0.628082 0.627989 0.627896 0.627804 0.627711 0.627618
+0.627526 0.627433 0.62734 0.627247 0.627155 0.627062 0.626969 0.626876
+0.626784 0.626691 0.626598 0.626505 0.626413 0.62632 0.626227 0.626134
+0.626042 0.625949 0.625856 0.625763 0.625671 0.625578 0.625485 0.625392
+0.625299 0.625207 0.625114 0.625021 0.624928 0.624835 0.624742 0.62465
+0.624557 0.624464 0.624371 0.624278 0.624185 0.624092 0.623999 0.623907
+0.623814 0.623721 0.623628 0.623535 0.623442 0.623349 0.623256 0.623163
+0.62307 0.622978 0.622885 0.622792 0.622699 0.622606 0.622513 0.62242
+0.622327 0.622234 0.622141 0.622048 0.621955 0.621862 0.621769 0.621676
+0.621583 0.62149 0.621397 0.621304 0.621211 0.621118 0.621025 0.620932
+0.620839 0.620746 0.620653 0.62056 0.620467 0.620374 0.620281 0.620188
+0.620095 0.620001 0.619908 0.619815 0.619722 0.619629 0.619536 0.619443
+0.61935 0.619257 0.619164 0.619071 0.618977 0.618884 0.618791 0.618698
+0.618605 0.618512 0.618419 0.618326 0.618232 0.618139 0.618046 0.617953
+0.61786 0.617767 0.617673 0.61758 0.617487 0.617394 0.617301 0.617207
+0.617114 0.617021 0.616928 0.616835 0.616741 0.616648 0.616555 0.616462
+0.616368 0.616275 0.616182 0.616089 0.615995 0.615902 0.615809 0.615716
+0.615622 0.615529 0.615436 0.615342 0.615249 0.615156 0.615063 0.614969
+0.614876 0.614783 0.614689 0.614596 0.614503 0.614409 0.614316 0.614223
+0.614129 0.614036 0.613943 0.613849 0.613756 0.613663 0.613569 0.613476
+0.613383 0.613289 0.613196 0.613102 0.613009 0.612916 0.612822 0.612729
+0.612635 0.612542 0.612449 0.612355 0.612262 0.612168 0.612075 0.611981
+0.611888 0.611795 0.611701 0.611608 0.611514 0.611421 0.611327 0.611234
+0.61114 0.611047 0.610953 0.61086 0.610766 0.610673 0.610579 0.610486
+0.610392 0.610299 0.610205 0.610112 0.610018 0.609925 0.609831 0.609738
+0.609644 0.609551 0.609457 0.609363 0.60927 0.609176 0.609083 0.608989
+0.608896 0.608802 0.608709 0.608615 0.608521 0.608428 0.608334 0.608241
+0.608147 0.608053 0.60796 0.607866 0.607773 0.607679 0.607585 0.607492
+0.607398 0.607304 0.607211 0.607117 0.607023 0.60693 0.606836 0.606743
+0.606649 0.606555 0.606461 0.606368 0.606274 0.60618 0.606087 0.605993
+0.605899 0.605806 0.605712 0.605618 0.605525 0.605431 0.605337 0.605243
+0.60515 0.605056 0.604962 0.604868 0.604775 0.604681 0.604587 0.604493
+0.6044 0.604306 0.604212 0.604118 0.604025 0.603931 0.603837 0.603743
+0.603649 0.603556 0.603462 0.603368 0.603274 0.60318 0.603087 0.602993
+0.602899 0.602805 0.602711 0.602618 0.602524 0.60243 0.602336 0.602242
+0.602148 0.602054 0.601961 0.601867 0.601773 0.601679 0.601585 0.601491
+0.601397 0.601304 0.60121 0.601116 0.601022 0.600928 0.600834 0.60074
+0.600646 0.600552 0.600458 0.600365 0.600271 0.600177 0.600083 0.599989
+0.599895 0.599801 0.599707 0.599613 0.599519 0.599425 0.599331 0.599237
+0.599143 0.599049 0.598955 0.598861 0.598767 0.598673 0.598579 0.598485
+0.598391 0.598297 0.598203 0.598109 0.598015 0.597921 0.597827 0.597733
+0.597639 0.597545 0.597451 0.597357 0.597263 0.597169 0.597075 0.596981
+0.596887 0.596793 0.596699 0.596605 0.596511 0.596417 0.596322 0.596228
+0.596134 0.59604 0.595946 0.595852 0.595758 0.595664 0.59557 0.595476
+0.595381 0.595287 0.595193 0.595099 0.595005 0.594911 0.594817 0.594723
+0.594628 0.594534 0.59444 0.594346 0.594252 0.594158 0.594064 0.593969
+0.593875 0.593781 0.593687 0.593593 0.593499 0.593404 0.59331 0.593216
+0.593122 0.593028 0.592933 0.592839 0.592745 0.592651 0.592557 0.592462
+0.592368 0.592274 0.59218 0.592085 0.591991 0.591897 0.591803 0.591708
+0.591614 0.59152 0.591426 0.591331 0.591237 0.591143 0.591049 0.590954
+0.59086 0.590766 0.590672 0.590577 0.590483 0.590389 0.590294 0.5902
+0.590106 0.590011 0.589917 0.589823 0.589729 0.589634 0.58954 0.589446
+0.589351 0.589257 0.589163 0.589068 0.588974 0.58888 0.588785 0.588691
+0.588596 0.588502 0.588408 0.588313 0.588219 0.588125 0.58803 0.587936
+0.587842 0.587747 0.587653 0.587558 0.587464 0.58737 0.587275 0.587181
+0.587086 0.586992 0.586898 0.586803 0.586709 0.586614 0.58652 0.586425
+0.586331 0.586237 0.586142 0.586048 0.585953 0.585859 0.585764 0.58567
+0.585575 0.585481 0.585386 0.585292 0.585198 0.585103 0.585009 0.584914
+0.58482 0.584725 0.584631 0.584536 0.584442 0.584347 0.584253 0.584158
+0.584064 0.583969 0.583875 0.58378 0.583686 0.583591 0.583497 0.583402
+0.583308 0.583213 0.583118 0.583024 0.582929 0.582835 0.58274 0.582646
+0.582551 0.582457 0.582362 0.582267 0.582173 0.582078 0.581984 0.581889
+0.581795 0.5817 0.581605 0.581511 0.581416 0.581322 0.581227 0.581132
+0.581038 0.580943 0.580849 0.580754 0.580659 0.580565 0.58047 0.580375
+0.580281 0.580186 0.580092 0.579997 0.579902 0.579808 0.579713 0.579618
+0.579524 0.579429 0.579334 0.57924 0.579145 0.57905 0.578956 0.578861
+0.578766 0.578672 0.578577 0.578482 0.578388 0.578293 0.578198 0.578104
+0.578009 0.577914 0.577819 0.577725 0.57763 0.577535 0.577441 0.577346
+0.577251 0.577156 0.577062 0.576967 0.576872 0.576778 0.576683 0.576588
+0.576493 0.576399 0.576304 0.576209 0.576114 0.57602 0.575925 0.57583
+0.575735 0.57564 0.575546 0.575451 0.575356 0.575261 0.575167 0.575072
+0.574977 0.574882 0.574787 0.574693 0.574598 0.574503 0.574408 0.574313
+0.574219 0.574124 0.574029 0.573934 0.573839 0.573745 0.57365 0.573555
+0.57346 0.573365 0.57327 0.573176 0.573081 0.572986 0.572891 0.572796
+0.572701 0.572606 0.572512 0.572417 0.572322 0.572227 0.572132 0.572037
+0.571942 0.571847 0.571753 0.571658 0.571563 0.571468 0.571373 0.571278
+0.571183 0.571088 0.570993 0.570899 0.570804 0.570709 0.570614 0.570519
+0.570424 0.570329 0.570234 0.570139 0.570044 0.569949 0.569854 0.56976
+0.569665 0.56957 0.569475 0.56938 0.569285 0.56919 0.569095 0.569 0.568905
+0.56881 0.568715 0.56862 0.568525 0.56843 0.568335 0.56824 0.568145
+0.56805 0.567955 0.56786 0.567765 0.56767 0.567575 0.56748 0.567385
+0.56729 0.567195 0.5671 0.567005 0.56691 0.566815 0.56672 0.566625
+0.56653 0.566435 0.56634 0.566245 0.56615 0.566055 0.56596 0.565865
+0.56577 0.565675 0.56558 0.565485 0.56539 0.565295 0.5652 0.565105
+0.56501 0.564915 0.56482 0.564724 0.564629 0.564534 0.564439 0.564344
+0.564249 0.564154 0.564059 0.563964 0.563869 0.563774 0.563679 0.563583
+0.563488 0.563393 0.563298 0.563203 0.563108 0.563013 0.562918 0.562823
+0.562728 0.562632 0.562537 0.562442 0.562347 0.562252 0.562157 0.562062
+0.561966 0.561871 0.561776 0.561681 0.561586 0.561491 0.561396 0.561301
+0.561205 0.56111 0.561015 0.56092 0.560825 0.56073 0.560634 0.560539
+0.560444 0.560349 0.560254 0.560159 0.560063 0.559968 0.559873 0.559778
+0.559683 0.559587 0.559492 0.559397 0.559302 0.559207 0.559111 0.559016
+0.558921 0.558826 0.558731 0.558635 0.55854 0.558445 0.55835 0.558255
+0.558159 0.558064 0.557969 0.557874 0.557778 0.557683 0.557588 0.557493
+0.557397 0.557302 0.557207 0.557112 0.557016 0.556921 0.556826 0.556731
+0.556635 0.55654 0.556445 0.55635 0.556254 0.556159 0.556064 0.555969
+0.555873 0.555778 0.555683 0.555588 0.555492 0.555397 0.555302 0.555206
+;
+#A 24000 0.555111 0.555016 0.55492 0.554825 0.55473 0.554635 0.554539
+0.554444 0.554349 0.554253 0.554158 0.554063 0.553967 0.553872 0.553777
+0.553682 0.553586 0.553491 0.553396 0.5533 0.553205 0.55311 0.553014
+0.552919 0.552824 0.552728 0.552633 0.552538 0.552442 0.552347 0.552252
+0.552156 0.552061 0.551965 0.55187 0.551775 0.551679 0.551584 0.551489
+0.551393 0.551298 0.551203 0.551107 0.551012 0.550916 0.550821 0.550726
+0.55063 0.550535 0.55044 0.550344 0.550249 0.550153 0.550058 0.549963
+0.549867 0.549772 0.549676 0.549581 0.549486 0.54939 0.549295 0.549199
+0.549104 0.549009 0.548913 0.548818 0.548722 0.548627 0.548531 0.548436
+0.548341 0.548245 0.54815 0.548054 0.547959 0.547863 0.547768 0.547673
+0.547577 0.547482 0.547386 0.547291 0.547195 0.5471 0.547005 0.546909
+0.546814 0.546718 0.546623 0.546527 0.546432 0.546336 0.546241 0.546145
+0.54605 0.545954 0.545859 0.545764 0.545668 0.545573 0.545477 0.545382
+0.545286 0.545191 0.545095 0.545 0.544904 0.544809 0.544713 0.544618
+0.544522 0.544427 0.544331 0.544236 0.54414 0.544045 0.543949 0.543854
+0.543758 0.543663 0.543567 0.543472 0.543376 0.543281 0.543185 0.54309
+0.542994 0.542899 0.542803 0.542708 0.542612 0.542517 0.542421 0.542325
+0.54223 0.542134 0.542039 0.541943 0.541848 0.541752 0.541657 0.541561
+0.541466 0.54137 0.541275 0.541179 0.541084 0.540988 0.540892 0.540797
+0.540701 0.540606 0.54051 0.540415 0.540319 0.540223 0.540128 0.540032
+0.539937 0.539841 0.539746 0.53965 0.539554 0.539459 0.539363 0.539268
+0.539172 0.539077 0.538981 0.538885 0.53879 0.538694 0.538599 0.538503
+0.538408 0.538312 0.538216 0.538121 0.538025 0.53793 0.537834 0.537738
+0.537643 0.537547 0.537452 0.537356 0.53726 0.537165 0.537069 0.536974
+0.536878 0.536782 0.536687 0.536591 0.536495 0.5364 0.536304 0.536209
+0.536113 0.536017 0.535922 0.535826 0.53573 0.535635 0.535539 0.535444
+0.535348 0.535252 0.535157 0.535061 0.534965 0.53487 0.534774 0.534678
+0.534583 0.534487 0.534392 0.534296 0.5342 0.534105 0.534009 0.533913
+0.533818 0.533722 0.533626 0.533531 0.533435 0.533339 0.533244 0.533148
+0.533052 0.532957 0.532861 0.532765 0.53267 0.532574 0.532478 0.532383
+0.532287 0.532191 0.532096 0.532 0.531904 0.531809 0.531713 0.531617
+0.531522 0.531426 0.53133 0.531235 0.531139 0.531043 0.530947 0.530852
+0.530756 0.53066 0.530565 0.530469 0.530373 0.530278 0.530182 0.530086
+0.52999 0.529895 0.529799 0.529703 0.529608 0.529512 0.529416 0.529321
+0.529225 0.529129 0.529033 0.528938 0.528842 0.528746 0.528651 0.528555
+0.528459 0.528363 0.528268 0.528172 0.528076 0.527981 0.527885 0.527789
+0.527693 0.527598 0.527502 0.527406 0.52731 0.527215 0.527119 0.527023
+0.526928 0.526832 0.526736 0.52664 0.526545 0.526449 0.526353 0.526257
+0.526162 0.526066 0.52597 0.525874 0.525779 0.525683 0.525587 0.525491
+0.525396 0.5253 0.525204 0.525108 0.525013 0.524917 0.524821 0.524725
+0.52463 0.524534 0.524438 0.524342 0.524247 0.524151 0.524055 0.523959
+0.523863 0.523768 0.523672 0.523576 0.52348 0.523385 0.523289 0.523193
+0.523097 0.523002 0.522906 0.52281 0.522714 0.522618 0.522523 0.522427
+0.522331 0.522235 0.52214 0.522044 0.521948 0.521852 0.521756 0.521661
+0.521565 0.521469 0.521373 0.521278 0.521182 0.521086 0.52099 0.520894
+0.520799 0.520703 0.520607 0.520511 0.520415 0.52032 0.520224 0.520128
+0.520032 0.519936 0.519841 0.519745 0.519649 0.519553 0.519457 0.519362
+0.519266 0.51917 0.519074 0.518978 0.518883 0.518787 0.518691 0.518595
+0.518499 0.518404 0.518308 0.518212 0.518116 0.51802 0.517925 0.517829
+0.517733 0.517637 0.517541 0.517446 0.51735 0.517254 0.517158 0.517062
+0.516966 0.516871 0.516775 0.516679 0.516583 0.516487 0.516391 0.516296
+0.5162 0.516104 0.516008 0.515912 0.515817 0.515721 0.515625 0.515529
+0.515433 0.515337 0.515242 0.515146 0.51505 0.514954 0.514858 0.514762
+0.514667 0.514571 0.514475 0.514379 0.514283 0.514187 0.514092 0.513996
+0.5139 0.513804 0.513708 0.513612 0.513517 0.513421 0.513325 0.513229
+0.513133 0.513037 0.512942 0.512846 0.51275 0.512654 0.512558 0.512462
+0.512366 0.512271 0.512175 0.512079 0.511983 0.511887 0.511791 0.511696
+0.5116 0.511504 0.511408 0.511312 0.511216 0.51112 0.511025 0.510929
+0.510833 0.510737 0.510641 0.510545 0.510449 0.510354 0.510258 0.510162
+0.510066 0.50997 0.509874 0.509778 0.509683 0.509587 0.509491 0.509395
+0.509299 0.509203 0.509108 0.509012 0.508916 0.50882 0.508724 0.508628
+0.508532 0.508437 0.508341 0.508245 0.508149 0.508053 0.507957 0.507861
+0.507765 0.50767 0.507574 0.507478 0.507382 0.507286 0.50719 0.507094
+0.506999 0.506903 0.506807 0.506711 0.506615 0.506519 0.506423 0.506328
+0.506232 0.506136 0.50604 0.505944 0.505848 0.505752 0.505656 0.505561
+0.505465 0.505369 0.505273 0.505177 0.505081 0.504985 0.504889 0.504794
+0.504698 0.504602 0.504506 0.50441 0.504314 0.504218 0.504123 0.504027
+0.503931 0.503835 0.503739 0.503643 0.503547 0.503451 0.503356 0.50326
+0.503164 0.503068 0.502972 0.502876 0.50278 0.502684 0.502589 0.502493
+0.502397 0.502301 0.502205 0.502109 0.502013 0.501917 0.501822 0.501726
+0.50163 0.501534 0.501438 0.501342 0.501246 0.50115 0.501055 0.500959
+0.500863 0.500767 0.500671 0.500575 0.500479 0.500383 0.500288 0.500192
+0.500096 0.5 0.499904 0.499808 0.499712 0.499617 0.499521 0.499425
+0.499329 0.499233 0.499137 0.499041 0.498945 0.49885 0.498754 0.498658
+0.498562 0.498466 0.49837 0.498274 0.498178 0.498083 0.497987 0.497891
+0.497795 0.497699 0.497603 0.497507 0.497411 0.497316 0.49722 0.497124
+0.497028 0.496932 0.496836 0.49674 0.496644 0.496549 0.496453 0.496357
+0.496261 0.496165 0.496069 0.495973 0.495877 0.495782 0.495686 0.49559
+0.495494 0.495398 0.495302 0.495206 0.495111 0.495015 0.494919 0.494823
+0.494727 0.494631 0.494535 0.494439 0.494344 0.494248 0.494152 0.494056
+0.49396 0.493864 0.493768 0.493672 0.493577 0.493481 0.493385 0.493289
+0.493193 0.493097 0.493001 0.492906 0.49281 0.492714 0.492618 0.492522
+0.492426 0.49233 0.492235 0.492139 0.492043 0.491947 0.491851 0.491755
+0.491659 0.491563 0.491468 0.491372 0.491276 0.49118 0.491084 0.490988
+0.490892 0.490797 0.490701 0.490605 0.490509 0.490413 0.490317 0.490222
+0.490126 0.49003 0.489934 0.489838 0.489742 0.489646 0.489551 0.489455
+0.489359 0.489263 0.489167 0.489071 0.488975 0.48888 0.488784 0.488688
+0.488592 0.488496 0.4884 0.488304 0.488209 0.488113 0.488017 0.487921
+0.487825 0.487729 0.487634 0.487538 0.487442 0.487346 0.48725 0.487154
+0.487058 0.486963 0.486867 0.486771 0.486675 0.486579 0.486483 0.486388
+0.486292 0.486196 0.4861 0.486004 0.485908 0.485813 0.485717 0.485621
+0.485525 0.485429 0.485333 0.485238 0.485142 0.485046 0.48495 0.484854
+0.484758 0.484663 0.484567 0.484471 0.484375 0.484279 0.484183 0.484088
+0.483992 0.483896 0.4838 0.483704 0.483609 0.483513 0.483417 0.483321
+0.483225 0.483129 0.483034 0.482938 0.482842 0.482746 0.48265 0.482554
+0.482459 0.482363 0.482267 0.482171 0.482075 0.48198 0.481884 0.481788
+0.481692 0.481596 0.481501 0.481405 0.481309 0.481213 0.481117 0.481022
+0.480926 0.48083 0.480734 0.480638 0.480543 0.480447 0.480351 0.480255
+0.480159 0.480064 0.479968 0.479872 0.479776 0.47968 0.479585 0.479489
+0.479393 0.479297 0.479201 0.479106 0.47901 0.478914 0.478818 0.478722
+0.478627 0.478531 0.478435 0.478339 0.478244 0.478148 0.478052 0.477956
+0.47786 0.477765 0.477669 0.477573 0.477477 0.477381 0.477286 0.47719
+0.477094 0.476998 0.476903 0.476807 0.476711 0.476615 0.47652 0.476424
+0.476328 0.476232 0.476137 0.476041 0.475945 0.475849 0.475753 0.475658
+0.475562 0.475466 0.47537 0.475275 0.475179 0.475083 0.474987 0.474892
+0.474796 0.4747 0.474604 0.474509 0.474413 0.474317 0.474221 0.474126
+0.47403 0.473934 0.473838 0.473743 0.473647 0.473551 0.473455 0.47336
+0.473264 0.473168 0.473072 0.472977 0.472881 0.472785 0.47269 0.472594
+0.472498 0.472402 0.472307 0.472211 0.472115 0.472019 0.471924 0.471828
+0.471732 0.471637 0.471541 0.471445 0.471349 0.471254 0.471158 0.471062
+0.470967 0.470871 0.470775 0.470679 0.470584 0.470488 0.470392 0.470297
+0.470201 0.470105 0.47001 0.469914 0.469818 0.469722 0.469627 0.469531
+0.469435 0.46934 0.469244 0.469148 0.469053 0.468957 0.468861 0.468765
+0.46867 0.468574 0.468478 0.468383 0.468287 0.468191 0.468096 0.468
+0.467904 0.467809 0.467713 0.467617 0.467522 0.467426 0.46733 0.467235
+0.467139 0.467043 0.466948 0.466852 0.466756 0.466661 0.466565 0.466469
+0.466374 0.466278 0.466182 0.466087 0.465991 0.465895 0.4658 0.465704
+0.465608 0.465513 0.465417 0.465322 0.465226 0.46513 0.465035 0.464939
+0.464843 0.464748 0.464652 0.464556 0.464461 0.464365 0.46427 0.464174
+0.464078 0.463983 0.463887 0.463791 0.463696 0.4636 0.463505 0.463409
+0.463313 0.463218 0.463122 0.463026 0.462931 0.462835 0.46274 0.462644
+0.462548 0.462453 0.462357 0.462262 0.462166 0.46207 0.461975 0.461879
+0.461784 0.461688 0.461592 0.461497 0.461401 0.461306 0.46121 0.461115
+0.461019 0.460923 0.460828 0.460732 0.460637 0.460541 0.460445 0.46035
+0.460254 0.460159 0.460063 0.459968 0.459872 0.459777 0.459681 0.459585
+0.45949;
+#A 25000 0.459394 0.459299 0.459203 0.459108 0.459012 0.458917 0.458821
+0.458725 0.45863 0.458534 0.458439 0.458343 0.458248 0.458152 0.458057
+0.457961 0.457866 0.45777 0.457675 0.457579 0.457483 0.457388 0.457292
+0.457197 0.457101 0.457006 0.45691 0.456815 0.456719 0.456624 0.456528
+0.456433 0.456337 0.456242 0.456146 0.456051 0.455955 0.45586 0.455764
+0.455669 0.455573 0.455478 0.455382 0.455287 0.455191 0.455096 0.455
+0.454905 0.454809 0.454714 0.454618 0.454523 0.454427 0.454332 0.454236
+0.454141 0.454046 0.45395 0.453855 0.453759 0.453664 0.453568 0.453473
+0.453377 0.453282 0.453186 0.453091 0.452995 0.4529 0.452805 0.452709
+0.452614 0.452518 0.452423 0.452327 0.452232 0.452137 0.452041 0.451946
+0.45185 0.451755 0.451659 0.451564 0.451469 0.451373 0.451278 0.451182
+0.451087 0.450991 0.450896 0.450801 0.450705 0.45061 0.450514 0.450419
+0.450324 0.450228 0.450133 0.450037 0.449942 0.449847 0.449751 0.449656
+0.44956 0.449465 0.44937 0.449274 0.449179 0.449084 0.448988 0.448893
+0.448797 0.448702 0.448607 0.448511 0.448416 0.448321 0.448225 0.44813
+0.448035 0.447939 0.447844 0.447748 0.447653 0.447558 0.447462 0.447367
+0.447272 0.447176 0.447081 0.446986 0.44689 0.446795 0.4467 0.446604
+0.446509 0.446414 0.446318 0.446223 0.446128 0.446033 0.445937 0.445842
+0.445747 0.445651 0.445556 0.445461 0.445365 0.44527 0.445175 0.445079
+0.444984 0.444889 0.444794 0.444698 0.444603 0.444508 0.444412 0.444317
+0.444222 0.444127 0.444031 0.443936 0.443841 0.443746 0.44365 0.443555
+0.44346 0.443365 0.443269 0.443174 0.443079 0.442984 0.442888 0.442793
+0.442698 0.442603 0.442507 0.442412 0.442317 0.442222 0.442126 0.442031
+0.441936 0.441841 0.441745 0.44165 0.441555 0.44146 0.441365 0.441269
+0.441174 0.441079 0.440984 0.440889 0.440793 0.440698 0.440603 0.440508
+0.440413 0.440317 0.440222 0.440127 0.440032 0.439937 0.439841 0.439746
+0.439651 0.439556 0.439461 0.439366 0.43927 0.439175 0.43908 0.438985
+0.43889 0.438795 0.4387 0.438604 0.438509 0.438414 0.438319 0.438224
+0.438129 0.438034 0.437938 0.437843 0.437748 0.437653 0.437558 0.437463
+0.437368 0.437273 0.437177 0.437082 0.436987 0.436892 0.436797 0.436702
+0.436607 0.436512 0.436417 0.436321 0.436226 0.436131 0.436036 0.435941
+0.435846 0.435751 0.435656 0.435561 0.435466 0.435371 0.435276 0.435181
+0.435085 0.43499 0.434895 0.4348 0.434705 0.43461 0.434515 0.43442
+0.434325 0.43423 0.434135 0.43404 0.433945 0.43385 0.433755 0.43366
+0.433565 0.43347 0.433375 0.43328 0.433185 0.43309 0.432995 0.4329
+0.432805 0.43271 0.432615 0.43252 0.432425 0.43233 0.432235 0.43214
+0.432045 0.43195 0.431855 0.43176 0.431665 0.43157 0.431475 0.43138
+0.431285 0.43119 0.431095 0.431 0.430905 0.43081 0.430715 0.43062 0.430525
+0.43043 0.430335 0.43024 0.430146 0.430051 0.429956 0.429861 0.429766
+0.429671 0.429576 0.429481 0.429386 0.429291 0.429196 0.429101 0.429006
+0.428912 0.428817 0.428722 0.428627 0.428532 0.428437 0.428342 0.428247
+0.428152 0.428058 0.427963 0.427868 0.427773 0.427678 0.427583 0.427488
+0.427394 0.427299 0.427204 0.427109 0.427014 0.426919 0.426824 0.42673
+0.426635 0.42654 0.426445 0.42635 0.426255 0.426161 0.426066 0.425971
+0.425876 0.425781 0.425687 0.425592 0.425497 0.425402 0.425307 0.425213
+0.425118 0.425023 0.424928 0.424833 0.424739 0.424644 0.424549 0.424454
+0.424359 0.424265 0.42417 0.424075 0.42398 0.423886 0.423791 0.423696
+0.423601 0.423507 0.423412 0.423317 0.423222 0.423128 0.423033 0.422938
+0.422844 0.422749 0.422654 0.422559 0.422465 0.42237 0.422275 0.422181
+0.422086 0.421991 0.421896 0.421802 0.421707 0.421612 0.421518 0.421423
+0.421328 0.421234 0.421139 0.421044 0.42095 0.420855 0.42076 0.420666
+0.420571 0.420476 0.420382 0.420287 0.420192 0.420098 0.420003 0.419908
+0.419814 0.419719 0.419625 0.41953 0.419435 0.419341 0.419246 0.419151
+0.419057 0.418962 0.418868 0.418773 0.418678 0.418584 0.418489 0.418395
+0.4183 0.418205 0.418111 0.418016 0.417922 0.417827 0.417733 0.417638
+0.417543 0.417449 0.417354 0.41726 0.417165 0.417071 0.416976 0.416882
+0.416787 0.416693 0.416598 0.416503 0.416409 0.416314 0.41622 0.416125
+0.416031 0.415936 0.415842 0.415747 0.415653 0.415558 0.415464 0.415369
+0.415275 0.41518 0.415086 0.414991 0.414897 0.414802 0.414708 0.414614
+0.414519 0.414425 0.41433 0.414236 0.414141 0.414047 0.413952 0.413858
+0.413763 0.413669 0.413575 0.41348 0.413386 0.413291 0.413197 0.413102
+0.413008 0.412914 0.412819 0.412725 0.41263 0.412536 0.412442 0.412347
+0.412253 0.412158 0.412064 0.41197 0.411875 0.411781 0.411687 0.411592
+0.411498 0.411404 0.411309 0.411215 0.41112 0.411026 0.410932 0.410837
+0.410743 0.410649 0.410554 0.41046 0.410366 0.410271 0.410177 0.410083
+0.409989 0.409894 0.4098 0.409706 0.409611 0.409517 0.409423 0.409328
+0.409234 0.40914 0.409046 0.408951 0.408857 0.408763 0.408669 0.408574
+0.40848 0.408386 0.408292 0.408197 0.408103 0.408009 0.407915 0.40782
+0.407726 0.407632 0.407538 0.407443 0.407349 0.407255 0.407161 0.407067
+0.406972 0.406878 0.406784 0.40669 0.406596 0.406501 0.406407 0.406313
+0.406219 0.406125 0.406031 0.405936 0.405842 0.405748 0.405654 0.40556
+0.405466 0.405372 0.405277 0.405183 0.405089 0.404995 0.404901 0.404807
+0.404713 0.404619 0.404524 0.40443 0.404336 0.404242 0.404148 0.404054
+0.40396 0.403866 0.403772 0.403678 0.403583 0.403489 0.403395 0.403301
+0.403207 0.403113 0.403019 0.402925 0.402831 0.402737 0.402643 0.402549
+0.402455 0.402361 0.402267 0.402173 0.402079 0.401985 0.401891 0.401797
+0.401703 0.401609 0.401515 0.401421 0.401327 0.401233 0.401139 0.401045
+0.400951 0.400857 0.400763 0.400669 0.400575 0.400481 0.400387 0.400293
+0.400199 0.400105 0.400011 0.399917 0.399823 0.399729 0.399636 0.399542
+0.399448 0.399354 0.39926 0.399166 0.399072 0.398978 0.398884 0.39879
+0.398696 0.398603 0.398509 0.398415 0.398321 0.398227 0.398133 0.398039
+0.397946 0.397852 0.397758 0.397664 0.39757 0.397476 0.397382 0.397289
+0.397195 0.397101 0.397007 0.396913 0.39682 0.396726 0.396632 0.396538
+0.396444 0.396351 0.396257 0.396163 0.396069 0.395975 0.395882 0.395788
+0.395694 0.3956 0.395507 0.395413 0.395319 0.395225 0.395132 0.395038
+0.394944 0.39485 0.394757 0.394663 0.394569 0.394475 0.394382 0.394288
+0.394194 0.394101 0.394007 0.393913 0.39382 0.393726 0.393632 0.393539
+0.393445 0.393351 0.393257 0.393164 0.39307 0.392977 0.392883 0.392789
+0.392696 0.392602 0.392508 0.392415 0.392321 0.392227 0.392134 0.39204
+0.391947 0.391853 0.391759 0.391666 0.391572 0.391479 0.391385 0.391291
+0.391198 0.391104 0.391011 0.390917 0.390824 0.39073 0.390636 0.390543
+0.390449 0.390356 0.390262 0.390169 0.390075 0.389982 0.389888 0.389795
+0.389701 0.389608 0.389514 0.389421 0.389327 0.389234 0.38914 0.389047
+0.388953 0.38886 0.388766 0.388673 0.388579 0.388486 0.388392 0.388299
+0.388205 0.388112 0.388019 0.387925 0.387832 0.387738 0.387645 0.387551
+0.387458 0.387365 0.387271 0.387178 0.387084 0.386991 0.386898 0.386804
+0.386711 0.386617 0.386524 0.386431 0.386337 0.386244 0.386151 0.386057
+0.385964 0.385871 0.385777 0.385684 0.385591 0.385497 0.385404 0.385311
+0.385217 0.385124 0.385031 0.384937 0.384844 0.384751 0.384658 0.384564
+0.384471 0.384378 0.384284 0.384191 0.384098 0.384005 0.383911 0.383818
+0.383725 0.383632 0.383538 0.383445 0.383352 0.383259 0.383165 0.383072
+0.382979 0.382886 0.382793 0.382699 0.382606 0.382513 0.38242 0.382327
+0.382233 0.38214 0.382047 0.381954 0.381861 0.381768 0.381674 0.381581
+0.381488 0.381395 0.381302 0.381209 0.381116 0.381023 0.380929 0.380836
+0.380743 0.38065 0.380557 0.380464 0.380371 0.380278 0.380185 0.380092
+0.379998 0.379905 0.379812 0.379719 0.379626 0.379533 0.37944 0.379347
+0.379254 0.379161 0.379068 0.378975 0.378882 0.378789 0.378696 0.378603
+0.37851 0.378417 0.378324 0.378231 0.378138 0.378045 0.377952 0.377859
+0.377766 0.377673 0.37758 0.377487 0.377394 0.377301 0.377208 0.377115
+0.377022 0.37693 0.376837 0.376744 0.376651 0.376558 0.376465 0.376372
+0.376279 0.376186 0.376093 0.376001 0.375908 0.375815 0.375722 0.375629
+0.375536 0.375443 0.375351 0.375258 0.375165 0.375072 0.374979 0.374886
+0.374793 0.374701 0.374608 0.374515 0.374422 0.374329 0.374237 0.374144
+0.374051 0.373958 0.373866 0.373773 0.37368 0.373587 0.373494 0.373402
+0.373309 0.373216 0.373123 0.373031 0.372938 0.372845 0.372753 0.37266
+0.372567 0.372474 0.372382 0.372289 0.372196 0.372104 0.372011 0.371918
+0.371826 0.371733 0.37164 0.371548 0.371455 0.371362 0.37127 0.371177
+0.371084 0.370992 0.370899 0.370807 0.370714 0.370621 0.370529 0.370436
+0.370344 0.370251 0.370158 0.370066 0.369973 0.369881 0.369788 0.369695
+0.369603 0.36951 0.369418 0.369325 0.369233 0.36914 0.369048 0.368955
+0.368863 0.36877 0.368678 0.368585 0.368493 0.3684 0.368308 0.368215
+0.368123 0.36803 0.367938 0.367845 0.367753 0.36766 0.367568 0.367475
+0.367383 0.367291 0.367198 0.367106 0.367013 0.366921 0.366828 0.366736
+0.366644 0.366551 0.366459 0.366366 0.366274 0.366182 0.366089 0.365997
+0.365905 0.365812 0.36572 0.365627 0.365535 0.365443 0.36535 0.365258
+;
+#A 26000 0.365166 0.365074 0.364981 0.364889 0.364797 0.364704 0.364612
+0.36452 0.364427 0.364335 0.364243 0.364151 0.364058 0.363966 0.363874
+0.363782 0.363689 0.363597 0.363505 0.363413 0.36332 0.363228 0.363136
+0.363044 0.362952 0.362859 0.362767 0.362675 0.362583 0.362491 0.362398
+0.362306 0.362214 0.362122 0.36203 0.361938 0.361845 0.361753 0.361661
+0.361569 0.361477 0.361385 0.361293 0.361201 0.361109 0.361016 0.360924
+0.360832 0.36074 0.360648 0.360556 0.360464 0.360372 0.36028 0.360188
+0.360096 0.360004 0.359912 0.35982 0.359728 0.359636 0.359544 0.359452
+0.35936 0.359268 0.359176 0.359084 0.358992 0.3589 0.358808 0.358716
+0.358624 0.358532 0.35844 0.358348 0.358256 0.358164 0.358072 0.35798
+0.357888 0.357796 0.357704 0.357612 0.357521 0.357429 0.357337 0.357245
+0.357153 0.357061 0.356969 0.356877 0.356785 0.356694 0.356602 0.35651
+0.356418 0.356326 0.356234 0.356143 0.356051 0.355959 0.355867 0.355775
+0.355684 0.355592 0.3555 0.355408 0.355316 0.355225 0.355133 0.355041
+0.354949 0.354858 0.354766 0.354674 0.354582 0.354491 0.354399 0.354307
+0.354216 0.354124 0.354032 0.35394 0.353849 0.353757 0.353665 0.353574
+0.353482 0.35339 0.353299 0.353207 0.353115 0.353024 0.352932 0.352841
+0.352749 0.352657 0.352566 0.352474 0.352382 0.352291 0.352199 0.352108
+0.352016 0.351925 0.351833 0.351741 0.35165 0.351558 0.351467 0.351375
+0.351284 0.351192 0.351101 0.351009 0.350918 0.350826 0.350735 0.350643
+0.350552 0.35046 0.350369 0.350277 0.350186 0.350094 0.350003 0.349911
+0.34982 0.349728 0.349637 0.349546 0.349454 0.349363 0.349271 0.34918
+0.349088 0.348997 0.348906 0.348814 0.348723 0.348631 0.34854 0.348449
+0.348357 0.348266 0.348175 0.348083 0.347992 0.347901 0.347809 0.347718
+0.347627 0.347535 0.347444 0.347353 0.347261 0.34717 0.347079 0.346988
+0.346896 0.346805 0.346714 0.346623 0.346531 0.34644 0.346349 0.346258
+0.346166 0.346075 0.345984 0.345893 0.345802 0.34571 0.345619 0.345528
+0.345437 0.345346 0.345254 0.345163 0.345072 0.344981 0.34489 0.344799
+0.344708 0.344616 0.344525 0.344434 0.344343 0.344252 0.344161 0.34407
+0.343979 0.343888 0.343797 0.343705 0.343614 0.343523 0.343432 0.343341
+0.34325 0.343159 0.343068 0.342977 0.342886 0.342795 0.342704 0.342613
+0.342522 0.342431 0.34234 0.342249 0.342158 0.342067 0.341976 0.341885
+0.341794 0.341703 0.341612 0.341521 0.341431 0.34134 0.341249 0.341158
+0.341067 0.340976 0.340885 0.340794 0.340703 0.340612 0.340522 0.340431
+0.34034 0.340249 0.340158 0.340067 0.339976 0.339886 0.339795 0.339704
+0.339613 0.339522 0.339432 0.339341 0.33925 0.339159 0.339068 0.338978
+0.338887 0.338796 0.338705 0.338615 0.338524 0.338433 0.338342 0.338252
+0.338161 0.33807 0.33798 0.337889 0.337798 0.337708 0.337617 0.337526
+0.337436 0.337345 0.337254 0.337164 0.337073 0.336982 0.336892 0.336801
+0.33671 0.33662 0.336529 0.336439 0.336348 0.336257 0.336167 0.336076
+0.335986 0.335895 0.335805 0.335714 0.335623 0.335533 0.335442 0.335352
+0.335261 0.335171 0.33508 0.33499 0.334899 0.334809 0.334718 0.334628
+0.334537 0.334447 0.334356 0.334266 0.334175 0.334085 0.333995 0.333904
+0.333814 0.333723 0.333633 0.333542 0.333452 0.333362 0.333271 0.333181
+0.333091 0.333 0.33291 0.332819 0.332729 0.332639 0.332548 0.332458
+0.332368 0.332277 0.332187 0.332097 0.332006 0.331916 0.331826 0.331736
+0.331645 0.331555 0.331465 0.331375 0.331284 0.331194 0.331104 0.331014
+0.330923 0.330833 0.330743 0.330653 0.330562 0.330472 0.330382 0.330292
+0.330202 0.330112 0.330021 0.329931 0.329841 0.329751 0.329661 0.329571
+0.329481 0.32939 0.3293 0.32921 0.32912 0.32903 0.32894 0.32885 0.32876
+0.32867 0.32858 0.32849 0.328399 0.328309 0.328219 0.328129 0.328039
+0.327949 0.327859 0.327769 0.327679 0.327589 0.327499 0.327409 0.327319
+0.327229 0.327139 0.327049 0.326959 0.32687 0.32678 0.32669 0.3266
+0.32651 0.32642 0.32633 0.32624 0.32615 0.32606 0.32597 0.325881 0.325791
+0.325701 0.325611 0.325521 0.325431 0.325341 0.325252 0.325162 0.325072
+0.324982 0.324892 0.324803 0.324713 0.324623 0.324533 0.324443 0.324354
+0.324264 0.324174 0.324084 0.323995 0.323905 0.323815 0.323725 0.323636
+0.323546 0.323456 0.323367 0.323277 0.323187 0.323098 0.323008 0.322918
+0.322829 0.322739 0.322649 0.32256 0.32247 0.32238 0.322291 0.322201
+0.322112 0.322022 0.321932 0.321843 0.321753 0.321664 0.321574 0.321485
+0.321395 0.321305 0.321216 0.321126 0.321037 0.320947 0.320858 0.320768
+0.320679 0.320589 0.3205 0.32041 0.320321 0.320231 0.320142 0.320052
+0.319963 0.319874 0.319784 0.319695 0.319605 0.319516 0.319427 0.319337
+0.319248 0.319158 0.319069 0.31898 0.31889 0.318801 0.318711 0.318622
+0.318533 0.318443 0.318354 0.318265 0.318175 0.318086 0.317997 0.317908
+0.317818 0.317729 0.31764 0.317551 0.317461 0.317372 0.317283 0.317194
+0.317104 0.317015 0.316926 0.316837 0.316747 0.316658 0.316569 0.31648
+0.316391 0.316301 0.316212 0.316123 0.316034 0.315945 0.315856 0.315767
+0.315677 0.315588 0.315499 0.31541 0.315321 0.315232 0.315143 0.315054
+0.314965 0.314876 0.314787 0.314698 0.314608 0.314519 0.31443 0.314341
+0.314252 0.314163 0.314074 0.313985 0.313896 0.313807 0.313718 0.313629
+0.313541 0.313452 0.313363 0.313274 0.313185 0.313096 0.313007 0.312918
+0.312829 0.31274 0.312651 0.312562 0.312474 0.312385 0.312296 0.312207
+0.312118 0.312029 0.31194 0.311852 0.311763 0.311674 0.311585 0.311496
+0.311408 0.311319 0.31123 0.311141 0.311052 0.310964 0.310875 0.310786
+0.310697 0.310609 0.31052 0.310431 0.310342 0.310254 0.310165 0.310076
+0.309988 0.309899 0.30981 0.309722 0.309633 0.309544 0.309456 0.309367
+0.309278 0.30919 0.309101 0.309013 0.308924 0.308835 0.308747 0.308658
+0.30857 0.308481 0.308393 0.308304 0.308215 0.308127 0.308038 0.30795
+0.307861 0.307773 0.307684 0.307596 0.307507 0.307419 0.30733 0.307242
+0.307154 0.307065 0.306977 0.306888 0.3068 0.306711 0.306623 0.306534
+0.306446 0.306358 0.306269 0.306181 0.306093 0.306004 0.305916 0.305827
+0.305739 0.305651 0.305562 0.305474 0.305386 0.305298 0.305209 0.305121
+0.305033 0.304944 0.304856 0.304768 0.30468 0.304591 0.304503 0.304415
+0.304327 0.304238 0.30415 0.304062 0.303974 0.303886 0.303797 0.303709
+0.303621 0.303533 0.303445 0.303357 0.303268 0.30318 0.303092 0.303004
+0.302916 0.302828 0.30274 0.302652 0.302563 0.302475 0.302387 0.302299
+0.302211 0.302123 0.302035 0.301947 0.301859 0.301771 0.301683 0.301595
+0.301507 0.301419 0.301331 0.301243 0.301155 0.301067 0.300979 0.300891
+0.300803 0.300715 0.300627 0.300539 0.300452 0.300364 0.300276 0.300188
+0.3001 0.300012 0.299924 0.299836 0.299749 0.299661 0.299573 0.299485
+0.299397 0.299309 0.299222 0.299134 0.299046 0.298958 0.29887 0.298783
+0.298695 0.298607 0.298519 0.298432 0.298344 0.298256 0.298168 0.298081
+0.297993 0.297905 0.297818 0.29773 0.297642 0.297555 0.297467 0.297379
+0.297292 0.297204 0.297116 0.297029 0.296941 0.296854 0.296766 0.296678
+0.296591 0.296503 0.296416 0.296328 0.296241 0.296153 0.296065 0.295978
+0.29589 0.295803 0.295715 0.295628 0.29554 0.295453 0.295365 0.295278
+0.29519 0.295103 0.295016 0.294928 0.294841 0.294753 0.294666 0.294578
+0.294491 0.294404 0.294316 0.294229 0.294141 0.294054 0.293967 0.293879
+0.293792 0.293705 0.293617 0.29353 0.293443 0.293355 0.293268 0.293181
+0.293094 0.293006 0.292919 0.292832 0.292744 0.292657 0.29257 0.292483
+0.292396 0.292308 0.292221 0.292134 0.292047 0.29196 0.291872 0.291785
+0.291698 0.291611 0.291524 0.291437 0.29135 0.291262 0.291175 0.291088
+0.291001 0.290914 0.290827 0.29074 0.290653 0.290566 0.290479 0.290392
+0.290305 0.290217 0.29013 0.290043 0.289956 0.289869 0.289782 0.289695
+0.289608 0.289522 0.289435 0.289348 0.289261 0.289174 0.289087 0.289
+0.288913 0.288826 0.288739 0.288652 0.288565 0.288478 0.288392 0.288305
+0.288218 0.288131 0.288044 0.287957 0.287871 0.287784 0.287697 0.28761
+0.287523 0.287437 0.28735 0.287263 0.287176 0.28709 0.287003 0.286916
+0.286829 0.286743 0.286656 0.286569 0.286482 0.286396 0.286309 0.286222
+0.286136 0.286049 0.285962 0.285876 0.285789 0.285703 0.285616 0.285529
+0.285443 0.285356 0.28527 0.285183 0.285096 0.28501 0.284923 0.284837
+0.28475 0.284664 0.284577 0.284491 0.284404 0.284318 0.284231 0.284145
+0.284058 0.283972 0.283885 0.283799 0.283712 0.283626 0.28354 0.283453
+0.283367 0.28328 0.283194 0.283107 0.283021 0.282935 0.282848 0.282762
+0.282676 0.282589 0.282503 0.282417 0.28233 0.282244 0.282158 0.282071
+0.281985 0.281899 0.281813 0.281726 0.28164 0.281554 0.281468 0.281381
+0.281295 0.281209 0.281123 0.281037 0.28095 0.280864 0.280778 0.280692
+0.280606 0.28052 0.280433 0.280347 0.280261 0.280175 0.280089 0.280003
+0.279917 0.279831 0.279745 0.279659 0.279572 0.279486 0.2794 0.279314
+0.279228 0.279142 0.279056 0.27897 0.278884 0.278798 0.278712 0.278626
+0.27854 0.278454 0.278369 0.278283 0.278197 0.278111 0.278025 0.277939
+0.277853 0.277767 0.277681 0.277595 0.27751 0.277424 0.277338 0.277252
+0.277166 0.27708 0.276995 0.276909 0.276823 0.276737 0.276651 0.276566
+0.27648 0.276394 0.276308 0.276223 0.276137 0.276051 0.275965;
+#A 27000 0.27588 0.275794 0.275708 0.275623 0.275537 0.275451 0.275366
+0.27528 0.275194 0.275109 0.275023 0.274937 0.274852 0.274766 0.274681
+0.274595 0.27451 0.274424 0.274338 0.274253 0.274167 0.274082 0.273996
+0.273911 0.273825 0.27374 0.273654 0.273569 0.273483 0.273398 0.273312
+0.273227 0.273141 0.273056 0.272971 0.272885 0.2728 0.272714 0.272629
+0.272544 0.272458 0.272373 0.272287 0.272202 0.272117 0.272031 0.271946
+0.271861 0.271776 0.27169 0.271605 0.27152 0.271434 0.271349 0.271264
+0.271179 0.271093 0.271008 0.270923 0.270838 0.270752 0.270667 0.270582
+0.270497 0.270412 0.270327 0.270241 0.270156 0.270071 0.269986 0.269901
+0.269816 0.269731 0.269646 0.26956 0.269475 0.26939 0.269305 0.26922
+0.269135 0.26905 0.268965 0.26888 0.268795 0.26871 0.268625 0.26854
+0.268455 0.26837 0.268285 0.2682 0.268115 0.26803 0.267945 0.26786
+0.267776 0.267691 0.267606 0.267521 0.267436 0.267351 0.267266 0.267181
+0.267097 0.267012 0.266927 0.266842 0.266757 0.266672 0.266588 0.266503
+0.266418 0.266333 0.266249 0.266164 0.266079 0.265994 0.26591 0.265825
+0.26574 0.265656 0.265571 0.265486 0.265402 0.265317 0.265232 0.265148
+0.265063 0.264978 0.264894 0.264809 0.264724 0.26464 0.264555 0.264471
+0.264386 0.264302 0.264217 0.264133 0.264048 0.263963 0.263879 0.263794
+0.26371 0.263625 0.263541 0.263457 0.263372 0.263288 0.263203 0.263119
+0.263034 0.26295 0.262865 0.262781 0.262697 0.262612 0.262528 0.262444
+0.262359 0.262275 0.262191 0.262106 0.262022 0.261938 0.261853 0.261769
+0.261685 0.2616 0.261516 0.261432 0.261348 0.261263 0.261179 0.261095
+0.261011 0.260926 0.260842 0.260758 0.260674 0.26059 0.260506 0.260421
+0.260337 0.260253 0.260169 0.260085 0.260001 0.259917 0.259833 0.259748
+0.259664 0.25958 0.259496 0.259412 0.259328 0.259244 0.25916 0.259076
+0.258992 0.258908 0.258824 0.25874 0.258656 0.258572 0.258488 0.258404
+0.25832 0.258236 0.258153 0.258069 0.257985 0.257901 0.257817 0.257733
+0.257649 0.257565 0.257482 0.257398 0.257314 0.25723 0.257146 0.257062
+0.256979 0.256895 0.256811 0.256727 0.256644 0.25656 0.256476 0.256392
+0.256309 0.256225 0.256141 0.256058 0.255974 0.25589 0.255807 0.255723
+0.255639 0.255556 0.255472 0.255388 0.255305 0.255221 0.255138 0.255054
+0.25497 0.254887 0.254803 0.25472 0.254636 0.254553 0.254469 0.254386
+0.254302 0.254219 0.254135 0.254052 0.253968 0.253885 0.253801 0.253718
+0.253634 0.253551 0.253468 0.253384 0.253301 0.253217 0.253134 0.253051
+0.252967 0.252884 0.2528 0.252717 0.252634 0.252551 0.252467 0.252384
+0.252301 0.252217 0.252134 0.252051 0.251968 0.251884 0.251801 0.251718
+0.251635 0.251551 0.251468 0.251385 0.251302 0.251219 0.251136 0.251052
+0.250969 0.250886 0.250803 0.25072 0.250637 0.250554 0.250471 0.250388
+0.250304 0.250221 0.250138 0.250055 0.249972 0.249889 0.249806 0.249723
+0.24964 0.249557 0.249474 0.249391 0.249308 0.249225 0.249143 0.24906
+0.248977 0.248894 0.248811 0.248728 0.248645 0.248562 0.248479 0.248396
+0.248314 0.248231 0.248148 0.248065 0.247982 0.2479 0.247817 0.247734
+0.247651 0.247568 0.247486 0.247403 0.24732 0.247237 0.247155 0.247072
+0.246989 0.246907 0.246824 0.246741 0.246659 0.246576 0.246493 0.246411
+0.246328 0.246246 0.246163 0.24608 0.245998 0.245915 0.245833 0.24575
+0.245667 0.245585 0.245502 0.24542 0.245337 0.245255 0.245172 0.24509
+0.245007 0.244925 0.244842 0.24476 0.244678 0.244595 0.244513 0.24443
+0.244348 0.244266 0.244183 0.244101 0.244018 0.243936 0.243854 0.243771
+0.243689 0.243607 0.243524 0.243442 0.24336 0.243278 0.243195 0.243113
+0.243031 0.242949 0.242866 0.242784 0.242702 0.24262 0.242538 0.242455
+0.242373 0.242291 0.242209 0.242127 0.242045 0.241963 0.24188 0.241798
+0.241716 0.241634 0.241552 0.24147 0.241388 0.241306 0.241224 0.241142
+0.24106 0.240978 0.240896 0.240814 0.240732 0.24065 0.240568 0.240486
+0.240404 0.240322 0.24024 0.240158 0.240076 0.239994 0.239912 0.239831
+0.239749 0.239667 0.239585 0.239503 0.239421 0.23934 0.239258 0.239176
+0.239094 0.239012 0.238931 0.238849 0.238767 0.238685 0.238604 0.238522
+0.23844 0.238358 0.238277 0.238195 0.238113 0.238032 0.23795 0.237868
+0.237787 0.237705 0.237624 0.237542 0.23746 0.237379 0.237297 0.237216
+0.237134 0.237052 0.236971 0.236889 0.236808 0.236726 0.236645 0.236563
+0.236482 0.2364 0.236319 0.236238 0.236156 0.236075 0.235993 0.235912
+0.23583 0.235749 0.235668 0.235586 0.235505 0.235424 0.235342 0.235261
+0.235179 0.235098 0.235017 0.234936 0.234854 0.234773 0.234692 0.23461
+0.234529 0.234448 0.234367 0.234286 0.234204 0.234123 0.234042 0.233961
+0.23388 0.233798 0.233717 0.233636 0.233555 0.233474 0.233393 0.233312
+0.233231 0.233149 0.233068 0.232987 0.232906 0.232825 0.232744 0.232663
+0.232582 0.232501 0.23242 0.232339 0.232258 0.232177 0.232096 0.232015
+0.231934 0.231854 0.231773 0.231692 0.231611 0.23153 0.231449 0.231368
+0.231287 0.231206 0.231126 0.231045 0.230964 0.230883 0.230802 0.230722
+0.230641 0.23056 0.230479 0.230399 0.230318 0.230237 0.230156 0.230076
+0.229995 0.229914 0.229834 0.229753 0.229672 0.229592 0.229511 0.22943
+0.22935 0.229269 0.229189 0.229108 0.229027 0.228947 0.228866 0.228786
+0.228705 0.228625 0.228544 0.228464 0.228383 0.228303 0.228222 0.228142
+0.228061 0.227981 0.2279 0.22782 0.227739 0.227659 0.227579 0.227498
+0.227418 0.227338 0.227257 0.227177 0.227096 0.227016 0.226936 0.226856
+0.226775 0.226695 0.226615 0.226534 0.226454 0.226374 0.226294 0.226213
+0.226133 0.226053 0.225973 0.225893 0.225812 0.225732 0.225652 0.225572
+0.225492 0.225412 0.225332 0.225251 0.225171 0.225091 0.225011 0.224931
+0.224851 0.224771 0.224691 0.224611 0.224531 0.224451 0.224371 0.224291
+0.224211 0.224131 0.224051 0.223971 0.223891 0.223811 0.223731 0.223651
+0.223572 0.223492 0.223412 0.223332 0.223252 0.223172 0.223092 0.223013
+0.222933 0.222853 0.222773 0.222693 0.222614 0.222534 0.222454 0.222374
+0.222295 0.222215 0.222135 0.222055 0.221976 0.221896 0.221816 0.221737
+0.221657 0.221577 0.221498 0.221418 0.221339 0.221259 0.221179 0.2211
+0.22102 0.220941 0.220861 0.220782 0.220702 0.220623 0.220543 0.220464
+0.220384 0.220305 0.220225 0.220146 0.220066 0.219987 0.219907 0.219828
+0.219749 0.219669 0.21959 0.21951 0.219431 0.219352 0.219272 0.219193
+0.219114 0.219034 0.218955 0.218876 0.218797 0.218717 0.218638 0.218559
+0.21848 0.2184 0.218321 0.218242 0.218163 0.218084 0.218004 0.217925
+0.217846 0.217767 0.217688 0.217609 0.21753 0.21745 0.217371 0.217292
+0.217213 0.217134 0.217055 0.216976 0.216897 0.216818 0.216739 0.21666
+0.216581 0.216502 0.216423 0.216344 0.216265 0.216186 0.216107 0.216028
+0.215949 0.215871 0.215792 0.215713 0.215634 0.215555 0.215476 0.215397
+0.215319 0.21524 0.215161 0.215082 0.215003 0.214925 0.214846 0.214767
+0.214688 0.21461 0.214531 0.214452 0.214374 0.214295 0.214216 0.214137
+0.214059 0.21398 0.213902 0.213823 0.213744 0.213666 0.213587 0.213509
+0.21343 0.213351 0.213273 0.213194 0.213116 0.213037 0.212959 0.21288
+0.212802 0.212723 0.212645 0.212566 0.212488 0.21241 0.212331 0.212253
+0.212174 0.212096 0.212018 0.211939 0.211861 0.211782 0.211704 0.211626
+0.211547 0.211469 0.211391 0.211313 0.211234 0.211156 0.211078 0.211
+0.210921 0.210843 0.210765 0.210687 0.210608 0.21053 0.210452 0.210374
+0.210296 0.210218 0.21014 0.210061 0.209983 0.209905 0.209827 0.209749
+0.209671 0.209593 0.209515 0.209437 0.209359 0.209281 0.209203 0.209125
+0.209047 0.208969 0.208891 0.208813 0.208735 0.208657 0.208579 0.208501
+0.208424 0.208346 0.208268 0.20819 0.208112 0.208034 0.207956 0.207879
+0.207801 0.207723 0.207645 0.207567 0.20749 0.207412 0.207334 0.207256
+0.207179 0.207101 0.207023 0.206946 0.206868 0.20679 0.206713 0.206635
+0.206557 0.20648 0.206402 0.206325 0.206247 0.206169 0.206092 0.206014
+0.205937 0.205859 0.205782 0.205704 0.205627 0.205549 0.205472 0.205394
+0.205317 0.205239 0.205162 0.205084 0.205007 0.20493 0.204852 0.204775
+0.204698 0.20462 0.204543 0.204465 0.204388 0.204311 0.204234 0.204156
+0.204079 0.204002 0.203924 0.203847 0.20377 0.203693 0.203615 0.203538
+0.203461 0.203384 0.203307 0.20323 0.203152 0.203075 0.202998 0.202921
+0.202844 0.202767 0.20269 0.202613 0.202536 0.202458 0.202381 0.202304
+0.202227 0.20215 0.202073 0.201996 0.201919 0.201842 0.201765 0.201688
+0.201612 0.201535 0.201458 0.201381 0.201304 0.201227 0.20115 0.201073
+0.200996 0.20092 0.200843 0.200766 0.200689 0.200612 0.200536 0.200459
+0.200382 0.200305 0.200229 0.200152 0.200075 0.199998 0.199922 0.199845
+0.199768 0.199692 0.199615 0.199538 0.199462 0.199385 0.199309 0.199232
+0.199155 0.199079 0.199002 0.198926 0.198849 0.198773 0.198696 0.19862
+0.198543 0.198467 0.19839 0.198314 0.198237 0.198161 0.198084 0.198008
+0.197932 0.197855 0.197779 0.197702 0.197626 0.19755 0.197473 0.197397
+0.197321 0.197244 0.197168 0.197092 0.197016 0.196939 0.196863 0.196787
+0.196711 0.196634 0.196558 0.196482 0.196406 0.19633 0.196254 0.196177
+0.196101 0.196025 0.195949 0.195873 0.195797 0.195721 0.195645 0.195569
+0.195493 0.195416 0.19534 0.195264 0.195188 0.195112 0.195036 0.194961
+0.194885;
+#A 28000 0.194809 0.194733 0.194657 0.194581 0.194505 0.194429 0.194353
+0.194277 0.194201 0.194126 0.19405 0.193974 0.193898 0.193822 0.193747
+0.193671 0.193595 0.193519 0.193443 0.193368 0.193292 0.193216 0.193141
+0.193065 0.192989 0.192914 0.192838 0.192762 0.192687 0.192611 0.192535
+0.19246 0.192384 0.192309 0.192233 0.192158 0.192082 0.192006 0.191931
+0.191855 0.19178 0.191704 0.191629 0.191553 0.191478 0.191403 0.191327
+0.191252 0.191176 0.191101 0.191026 0.19095 0.190875 0.190799 0.190724
+0.190649 0.190573 0.190498 0.190423 0.190348 0.190272 0.190197 0.190122
+0.190047 0.189971 0.189896 0.189821 0.189746 0.189671 0.189595 0.18952
+0.189445 0.18937 0.189295 0.18922 0.189145 0.18907 0.188995 0.188919
+0.188844 0.188769 0.188694 0.188619 0.188544 0.188469 0.188394 0.188319
+0.188244 0.188169 0.188094 0.18802 0.187945 0.18787 0.187795 0.18772
+0.187645 0.18757 0.187495 0.187421 0.187346 0.187271 0.187196 0.187121
+0.187047 0.186972 0.186897 0.186822 0.186748 0.186673 0.186598 0.186523
+0.186449 0.186374 0.186299 0.186225 0.18615 0.186076 0.186001 0.185926
+0.185852 0.185777 0.185703 0.185628 0.185553 0.185479 0.185404 0.18533
+0.185255 0.185181 0.185106 0.185032 0.184957 0.184883 0.184809 0.184734
+0.18466 0.184585 0.184511 0.184437 0.184362 0.184288 0.184214 0.184139
+0.184065 0.183991 0.183916 0.183842 0.183768 0.183694 0.183619 0.183545
+0.183471 0.183397 0.183322 0.183248 0.183174 0.1831 0.183026 0.182952
+0.182877 0.182803 0.182729 0.182655 0.182581 0.182507 0.182433 0.182359
+0.182285 0.182211 0.182137 0.182063 0.181989 0.181915 0.181841 0.181767
+0.181693 0.181619 0.181545 0.181471 0.181397 0.181323 0.18125 0.181176
+0.181102 0.181028 0.180954 0.18088 0.180807 0.180733 0.180659 0.180585
+0.180512 0.180438 0.180364 0.18029 0.180217 0.180143 0.180069 0.179996
+0.179922 0.179848 0.179775 0.179701 0.179627 0.179554 0.17948 0.179407
+0.179333 0.179259 0.179186 0.179112 0.179039 0.178965 0.178892 0.178818
+0.178745 0.178671 0.178598 0.178525 0.178451 0.178378 0.178304 0.178231
+0.178158 0.178084 0.178011 0.177938 0.177864 0.177791 0.177718 0.177644
+0.177571 0.177498 0.177424 0.177351 0.177278 0.177205 0.177132 0.177058
+0.176985 0.176912 0.176839 0.176766 0.176693 0.176619 0.176546 0.176473
+0.1764 0.176327 0.176254 0.176181 0.176108 0.176035 0.175962 0.175889
+0.175816 0.175743 0.17567 0.175597 0.175524 0.175451 0.175378 0.175305
+0.175232 0.175159 0.175086 0.175014 0.174941 0.174868 0.174795 0.174722
+0.174649 0.174577 0.174504 0.174431 0.174358 0.174286 0.174213 0.17414
+0.174067 0.173995 0.173922 0.173849 0.173777 0.173704 0.173631 0.173559
+0.173486 0.173414 0.173341 0.173268 0.173196 0.173123 0.173051 0.172978
+0.172906 0.172833 0.172761 0.172688 0.172616 0.172543 0.172471 0.172398
+0.172326 0.172254 0.172181 0.172109 0.172036 0.171964 0.171892 0.171819
+0.171747 0.171675 0.171602 0.17153 0.171458 0.171386 0.171313 0.171241
+0.171169 0.171097 0.171024 0.170952 0.17088 0.170808 0.170736 0.170664
+0.170591 0.170519 0.170447 0.170375 0.170303 0.170231 0.170159 0.170087
+0.170015 0.169943 0.169871 0.169799 0.169727 0.169655 0.169583 0.169511
+0.169439 0.169367 0.169295 0.169223 0.169151 0.169079 0.169008 0.168936
+0.168864 0.168792 0.16872 0.168648 0.168577 0.168505 0.168433 0.168361
+0.16829 0.168218 0.168146 0.168074 0.168003 0.167931 0.167859 0.167788
+0.167716 0.167645 0.167573 0.167501 0.16743 0.167358 0.167287 0.167215
+0.167143 0.167072 0.167 0.166929 0.166857 0.166786 0.166714 0.166643
+0.166571 0.1665 0.166429 0.166357 0.166286 0.166214 0.166143 0.166072
+0.166 0.165929 0.165858 0.165786 0.165715 0.165644 0.165572 0.165501
+0.16543 0.165359 0.165287 0.165216 0.165145 0.165074 0.165003 0.164932
+0.16486 0.164789 0.164718 0.164647 0.164576 0.164505 0.164434 0.164363
+0.164292 0.164221 0.164149 0.164078 0.164007 0.163936 0.163865 0.163795
+0.163724 0.163653 0.163582 0.163511 0.16344 0.163369 0.163298 0.163227
+0.163156 0.163086 0.163015 0.162944 0.162873 0.162802 0.162731 0.162661
+0.16259 0.162519 0.162448 0.162378 0.162307 0.162236 0.162166 0.162095
+0.162024 0.161954 0.161883 0.161812 0.161742 0.161671 0.161601 0.16153
+0.161459 0.161389 0.161318 0.161248 0.161177 0.161107 0.161036 0.160966
+0.160895 0.160825 0.160755 0.160684 0.160614 0.160543 0.160473 0.160403
+0.160332 0.160262 0.160192 0.160121 0.160051 0.159981 0.15991 0.15984
+0.15977 0.159699 0.159629 0.159559 0.159489 0.159419 0.159348 0.159278
+0.159208 0.159138 0.159068 0.158998 0.158928 0.158857 0.158787 0.158717
+0.158647 0.158577 0.158507 0.158437 0.158367 0.158297 0.158227 0.158157
+0.158087 0.158017 0.157947 0.157877 0.157808 0.157738 0.157668 0.157598
+0.157528 0.157458 0.157388 0.157319 0.157249 0.157179 0.157109 0.157039
+0.15697 0.1569 0.15683 0.15676 0.156691 0.156621 0.156551 0.156482
+0.156412 0.156342 0.156273 0.156203 0.156133 0.156064 0.155994 0.155925
+0.155855 0.155786 0.155716 0.155647 0.155577 0.155508 0.155438 0.155369
+0.155299 0.15523 0.15516 0.155091 0.155021 0.154952 0.154883 0.154813
+0.154744 0.154675 0.154605 0.154536 0.154467 0.154397 0.154328 0.154259
+0.15419 0.15412 0.154051 0.153982 0.153913 0.153844 0.153774 0.153705
+0.153636 0.153567 0.153498 0.153429 0.15336 0.15329 0.153221 0.153152
+0.153083 0.153014 0.152945 0.152876 0.152807 0.152738 0.152669 0.1526
+0.152531 0.152462 0.152394 0.152325 0.152256 0.152187 0.152118 0.152049
+0.15198 0.151911 0.151843 0.151774 0.151705 0.151636 0.151567 0.151499
+0.15143 0.151361 0.151293 0.151224 0.151155 0.151086 0.151018 0.150949
+0.150881 0.150812 0.150743 0.150675 0.150606 0.150538 0.150469 0.1504
+0.150332 0.150263 0.150195 0.150126 0.150058 0.149989 0.149921 0.149852
+0.149784 0.149716 0.149647 0.149579 0.14951 0.149442 0.149374 0.149305
+0.149237 0.149169 0.1491 0.149032 0.148964 0.148896 0.148827 0.148759
+0.148691 0.148623 0.148554 0.148486 0.148418 0.14835 0.148282 0.148214
+0.148145 0.148077 0.148009 0.147941 0.147873 0.147805 0.147737 0.147669
+0.147601 0.147533 0.147465 0.147397 0.147329 0.147261 0.147193 0.147125
+0.147057 0.146989 0.146921 0.146854 0.146786 0.146718 0.14665 0.146582
+0.146514 0.146447 0.146379 0.146311 0.146243 0.146176 0.146108 0.14604
+0.145972 0.145905 0.145837 0.145769 0.145702 0.145634 0.145566 0.145499
+0.145431 0.145364 0.145296 0.145228 0.145161 0.145093 0.145026 0.144958
+0.144891 0.144823 0.144756 0.144688 0.144621 0.144554 0.144486 0.144419
+0.144351 0.144284 0.144217 0.144149 0.144082 0.144015 0.143947 0.14388
+0.143813 0.143745 0.143678 0.143611 0.143544 0.143476 0.143409 0.143342
+0.143275 0.143208 0.14314 0.143073 0.143006 0.142939 0.142872 0.142805
+0.142738 0.142671 0.142604 0.142537 0.14247 0.142403 0.142336 0.142269
+0.142202 0.142135 0.142068 0.142001 0.141934 0.141867 0.1418 0.141733
+0.141666 0.141599 0.141533 0.141466 0.141399 0.141332 0.141265 0.141199
+0.141132 0.141065 0.140998 0.140932 0.140865 0.140798 0.140731 0.140665
+0.140598 0.140531 0.140465 0.140398 0.140332 0.140265 0.140198 0.140132
+0.140065 0.139999 0.139932 0.139866 0.139799 0.139733 0.139666 0.1396
+0.139533 0.139467 0.1394 0.139334 0.139268 0.139201 0.139135 0.139069
+0.139002 0.138936 0.13887 0.138803 0.138737 0.138671 0.138604 0.138538
+0.138472 0.138406 0.13834 0.138273 0.138207 0.138141 0.138075 0.138009
+0.137943 0.137876 0.13781 0.137744 0.137678 0.137612 0.137546 0.13748
+0.137414 0.137348 0.137282 0.137216 0.13715 0.137084 0.137018 0.136952
+0.136886 0.13682 0.136755 0.136689 0.136623 0.136557 0.136491 0.136425
+0.136359 0.136294 0.136228 0.136162 0.136096 0.136031 0.135965 0.135899
+0.135833 0.135768 0.135702 0.135636 0.135571 0.135505 0.13544 0.135374
+0.135308 0.135243 0.135177 0.135112 0.135046 0.134981 0.134915 0.13485
+0.134784 0.134719 0.134653 0.134588 0.134522 0.134457 0.134391 0.134326
+0.134261 0.134195 0.13413 0.134065 0.133999 0.133934 0.133869 0.133803
+0.133738 0.133673 0.133608 0.133542 0.133477 0.133412 0.133347 0.133282
+0.133216 0.133151 0.133086 0.133021 0.132956 0.132891 0.132826 0.132761
+0.132696 0.132631 0.132566 0.132501 0.132436 0.132371 0.132306 0.132241
+0.132176 0.132111 0.132046 0.131981 0.131916 0.131851 0.131786 0.131721
+0.131657 0.131592 0.131527 0.131462 0.131397 0.131333 0.131268 0.131203
+0.131138 0.131074 0.131009 0.130944 0.13088 0.130815 0.13075 0.130686
+0.130621 0.130556 0.130492 0.130427 0.130363 0.130298 0.130233 0.130169
+0.130104 0.13004 0.129975 0.129911 0.129847 0.129782 0.129718 0.129653
+0.129589 0.129524 0.12946 0.129396 0.129331 0.129267 0.129203 0.129138
+0.129074 0.12901 0.128946 0.128881 0.128817 0.128753 0.128689 0.128624
+0.12856 0.128496 0.128432 0.128368 0.128304 0.128239 0.128175 0.128111
+0.128047 0.127983 0.127919 0.127855 0.127791 0.127727 0.127663 0.127599
+0.127535 0.127471 0.127407 0.127343 0.127279 0.127215 0.127152 0.127088
+0.127024 0.12696 0.126896 0.126832 0.126769 0.126705 0.126641 0.126577
+0.126513 0.12645 0.126386 0.126322 0.126259 0.126195 0.126131 0.126068
+0.126004 0.12594 0.125877 0.125813 0.12575 0.125686 0.125622 0.125559
+0.125495 0.125432 0.125368 0.125305 0.125241 0.125178 0.125114 0.125051
+0.124988;
+#A 29000 0.124924 0.124861 0.124797 0.124734 0.124671 0.124607 0.124544
+0.124481 0.124417 0.124354 0.124291 0.124228 0.124164 0.124101 0.124038
+0.123975 0.123912 0.123848 0.123785 0.123722 0.123659 0.123596 0.123533
+0.12347 0.123407 0.123344 0.12328 0.123217 0.123154 0.123091 0.123028
+0.122965 0.122903 0.12284 0.122777 0.122714 0.122651 0.122588 0.122525
+0.122462 0.122399 0.122336 0.122274 0.122211 0.122148 0.122085 0.122022
+0.12196 0.121897 0.121834 0.121772 0.121709 0.121646 0.121584 0.121521
+0.121458 0.121396 0.121333 0.12127 0.121208 0.121145 0.121083 0.12102
+0.120958 0.120895 0.120833 0.12077 0.120708 0.120645 0.120583 0.12052
+0.120458 0.120395 0.120333 0.120271 0.120208 0.120146 0.120084 0.120021
+0.119959 0.119897 0.119834 0.119772 0.11971 0.119648 0.119585 0.119523
+0.119461 0.119399 0.119337 0.119274 0.119212 0.11915 0.119088 0.119026
+0.118964 0.118902 0.11884 0.118778 0.118716 0.118654 0.118592 0.11853
+0.118468 0.118406 0.118344 0.118282 0.11822 0.118158 0.118096 0.118034
+0.117972 0.117911 0.117849 0.117787 0.117725 0.117663 0.117602 0.11754
+0.117478 0.117416 0.117355 0.117293 0.117231 0.11717 0.117108 0.117046
+0.116985 0.116923 0.116861 0.1168 0.116738 0.116677 0.116615 0.116554
+0.116492 0.116431 0.116369 0.116308 0.116246 0.116185 0.116123 0.116062
+0.116 0.115939 0.115878 0.115816 0.115755 0.115694 0.115632 0.115571
+0.11551 0.115448 0.115387 0.115326 0.115265 0.115203 0.115142 0.115081
+0.11502 0.114959 0.114897 0.114836 0.114775 0.114714 0.114653 0.114592
+0.114531 0.11447 0.114409 0.114348 0.114287 0.114226 0.114165 0.114104
+0.114043 0.113982 0.113921 0.11386 0.113799 0.113738 0.113677 0.113616
+0.113556 0.113495 0.113434 0.113373 0.113312 0.113252 0.113191 0.11313
+0.113069 0.113009 0.112948 0.112887 0.112827 0.112766 0.112705 0.112645
+0.112584 0.112523 0.112463 0.112402 0.112342 0.112281 0.112221 0.11216
+0.1121 0.112039 0.111979 0.111918 0.111858 0.111797 0.111737 0.111677
+0.111616 0.111556 0.111495 0.111435 0.111375 0.111314 0.111254 0.111194
+0.111134 0.111073 0.111013 0.110953 0.110893 0.110832 0.110772 0.110712
+0.110652 0.110592 0.110532 0.110472 0.110411 0.110351 0.110291 0.110231
+0.110171 0.110111 0.110051 0.109991 0.109931 0.109871 0.109811 0.109751
+0.109691 0.109631 0.109571 0.109512 0.109452 0.109392 0.109332 0.109272
+0.109212 0.109153 0.109093 0.109033 0.108973 0.108914 0.108854 0.108794
+0.108734 0.108675 0.108615 0.108555 0.108496 0.108436 0.108376 0.108317
+0.108257 0.108198 0.108138 0.108079 0.108019 0.10796 0.1079 0.107841
+0.107781 0.107722 0.107662 0.107603 0.107543 0.107484 0.107425 0.107365
+0.107306 0.107247 0.107187 0.107128 0.107069 0.107009 0.10695 0.106891
+0.106832 0.106772 0.106713 0.106654 0.106595 0.106536 0.106476 0.106417
+0.106358 0.106299 0.10624 0.106181 0.106122 0.106063 0.106004 0.105945
+0.105886 0.105827 0.105768 0.105709 0.10565 0.105591 0.105532 0.105473
+0.105414 0.105355 0.105297 0.105238 0.105179 0.10512 0.105061 0.105002
+0.104944 0.104885 0.104826 0.104767 0.104709 0.10465 0.104591 0.104533
+0.104474 0.104415 0.104357 0.104298 0.104239 0.104181 0.104122 0.104064
+0.104005 0.103947 0.103888 0.10383 0.103771 0.103713 0.103654 0.103596
+0.103537 0.103479 0.103421 0.103362 0.103304 0.103246 0.103187 0.103129
+0.103071 0.103012 0.102954 0.102896 0.102837 0.102779 0.102721 0.102663
+0.102605 0.102546 0.102488 0.10243 0.102372 0.102314 0.102256 0.102198
+0.10214 0.102082 0.102024 0.101965 0.101907 0.101849 0.101791 0.101733
+0.101676 0.101618 0.10156 0.101502 0.101444 0.101386 0.101328 0.10127
+0.101212 0.101155 0.101097 0.101039 0.100981 0.100923 0.100866 0.100808
+0.10075 0.100693 0.100635 0.100577 0.100519 0.100462 0.100404 0.100347
+0.100289 0.100231 0.100174 0.100116 0.100059 0.100001 0.0999436 0.0998861
+0.0998286 0.0997712 0.0997137 0.0996563 0.0995988 0.0995414 0.099484
+0.0994266 0.0993693 0.0993119 0.0992546 0.0991972 0.0991399 0.0990826
+0.0990254 0.0989681 0.0989108 0.0988536 0.0987964 0.0987392 0.098682
+0.0986248 0.0985676 0.0985105 0.0984534 0.0983962 0.0983391 0.098282
+0.098225 0.0981679 0.0981109 0.0980538 0.0979968 0.0979398 0.0978828
+0.0978259 0.0977689 0.097712 0.097655 0.0975981 0.0975412 0.0974843
+0.0974275 0.0973706 0.0973138 0.097257 0.0972001 0.0971433 0.0970866
+0.0970298 0.0969731 0.0969163 0.0968596 0.0968029 0.0967462 0.0966895
+0.0966329 0.0965762 0.0965196 0.096463 0.0964064 0.0963498 0.0962932
+0.0962367 0.0961801 0.0961236 0.0960671 0.0960106 0.0959541 0.0958976
+0.0958412 0.0957847 0.0957283 0.0956719 0.0956155 0.0955591 0.0955028
+0.0954464 0.0953901 0.0953338 0.0952775 0.0952212 0.0951649 0.0951086
+0.0950524 0.0949962 0.09494 0.0948838 0.0948276 0.0947714 0.0947152
+0.0946591 0.094603 0.0945469 0.0944908 0.0944347 0.0943786 0.0943226
+0.0942665 0.0942105 0.0941545 0.0940985 0.0940425 0.0939866 0.0939306
+0.0938747 0.0938188 0.0937629 0.093707 0.0936511 0.0935953 0.0935394
+0.0934836 0.0934278 0.093372 0.0933162 0.0932604 0.0932047 0.093149
+0.0930932 0.0930375 0.0929818 0.0929262 0.0928705 0.0928148 0.0927592
+0.0927036 0.092648 0.0925924 0.0925368 0.0924813 0.0924257 0.0923702
+0.0923147 0.0922592 0.0922037 0.0921482 0.0920928 0.0920374 0.0919819
+0.0919265 0.0918711 0.0918158 0.0917604 0.091705 0.0916497 0.0915944
+0.0915391 0.0914838 0.0914285 0.0913733 0.091318 0.0912628 0.0912076
+0.0911524 0.0910972 0.091042 0.0909869 0.0909318 0.0908766 0.0908215
+0.0907664 0.0907114 0.0906563 0.0906013 0.0905462 0.0904912 0.0904362
+0.0903812 0.0903262 0.0902713 0.0902163 0.0901614 0.0901065 0.0900516
+0.0899967 0.0899419 0.089887 0.0898322 0.0897774 0.0897225 0.0896678
+0.089613 0.0895582 0.0895035 0.0894487 0.089394 0.0893393 0.0892846
+0.08923 0.0891753 0.0891207 0.0890661 0.0890114 0.0889568 0.0889023
+0.0888477 0.0887932 0.0887386 0.0886841 0.0886296 0.0885751 0.0885206
+0.0884662 0.0884117 0.0883573 0.0883029 0.0882485 0.0881941 0.0881397
+0.0880854 0.0880311 0.0879767 0.0879224 0.0878681 0.0878139 0.0877596
+0.0877054 0.0876511 0.0875969 0.0875427 0.0874885 0.0874343 0.0873802
+0.087326 0.0872719 0.0872178 0.0871637 0.0871096 0.0870556 0.0870015
+0.0869475 0.0868935 0.0868395 0.0867855 0.0867315 0.0866776 0.0866236
+0.0865697 0.0865158 0.0864619 0.086408 0.0863541 0.0863003 0.0862464
+0.0861926 0.0861388 0.086085 0.0860312 0.0859775 0.0859237 0.08587
+0.0858163 0.0857626 0.0857089 0.0856552 0.0856016 0.0855479 0.0854943
+0.0854407 0.0853871 0.0853335 0.08528 0.0852264 0.0851729 0.0851194
+0.0850659 0.0850124 0.0849589 0.0849055 0.084852 0.0847986 0.0847452
+0.0846918 0.0846384 0.0845851 0.0845317 0.0844784 0.0844251 0.0843718
+0.0843185 0.0842652 0.0842119 0.0841587 0.0841055 0.0840523 0.0839991
+0.0839459 0.0838927 0.0838396 0.0837864 0.0837333 0.0836802 0.0836271
+0.083574 0.083521 0.0834679 0.0834149 0.0833619 0.0833089 0.0832559
+0.083203 0.08315 0.0830971 0.0830442 0.0829912 0.0829384 0.0828855
+0.0828326 0.0827798 0.082727 0.0826741 0.0826213 0.0825686 0.0825158
+0.082463 0.0824103 0.0823576 0.0823049 0.0822522 0.0821995 0.0821469
+0.0820942 0.0820416 0.081989 0.0819364 0.0818838 0.0818312 0.0817787
+0.0817261 0.0816736 0.0816211 0.0815686 0.0815161 0.0814637 0.0814112
+0.0813588 0.0813064 0.081254 0.0812016 0.0811493 0.0810969 0.0810446
+0.0809922 0.0809399 0.0808876 0.0808354 0.0807831 0.0807309 0.0806786
+0.0806264 0.0805742 0.080522 0.0804699 0.0804177 0.0803656 0.0803135
+0.0802614 0.0802093 0.0801572 0.0801051 0.0800531 0.0800011 0.0799491
+0.0798971 0.0798451 0.0797931 0.0797412 0.0796892 0.0796373 0.0795854
+0.0795335 0.0794816 0.0794298 0.0793779 0.0793261 0.0792743 0.0792225
+0.0791707 0.079119 0.0790672 0.0790155 0.0789638 0.0789121 0.0788604
+0.0788087 0.078757 0.0787054 0.0786538 0.0786022 0.0785506 0.078499
+0.0784474 0.0783959 0.0783443 0.0782928 0.0782413 0.0781898 0.0781384
+0.0780869 0.0780355 0.077984 0.0779326 0.0778812 0.0778299 0.0777785
+0.0777272 0.0776758 0.0776245 0.0775732 0.0775219 0.0774707 0.0774194
+0.0773682 0.0773169 0.0772657 0.0772146 0.0771634 0.0771122 0.0770611
+0.0770099 0.0769588 0.0769077 0.0768567 0.0768056 0.0767545 0.0767035
+0.0766525 0.0766015 0.0765505 0.0764995 0.0764486 0.0763976 0.0763467
+0.0762958 0.0762449 0.076194 0.0761431 0.0760923 0.0760414 0.0759906
+0.0759398 0.075889 0.0758383 0.0757875 0.0757368 0.0756861 0.0756353
+0.0755847 0.075534 0.0754833 0.0754327 0.075382 0.0753314 0.0752808
+0.0752302 0.0751797 0.0751291 0.0750786 0.0750281 0.0749776 0.0749271
+0.0748766 0.0748261 0.0747757 0.0747253 0.0746748 0.0746244 0.0745741
+0.0745237 0.0744734 0.074423 0.0743727 0.0743224 0.0742721 0.0742218
+0.0741716 0.0741213 0.0740711 0.0740209 0.0739707 0.0739205 0.0738704
+0.0738202 0.0737701 0.07372 0.0736699 0.0736198 0.0735698 0.0735197
+0.0734697 0.0734196 0.0733696 0.0733197 0.0732697 0.0732197 0.0731698
+0.0731198 0.0730699 0.07302 0.0729702 0.0729203 0.0728705 0.0728206
+0.0727708 0.072721 0.0726712 0.0726214 0.0725717 0.072522 0.0724722
+0.0724225 0.0723728 0.0723232 0.0722735 0.0722239 0.0721742 0.0721246
+0.072075 0.0720254 0.0719759 0.0719263 0.0718768 0.0718273 0.0717778
+0.0717283 0.0716788 0.0716294 0.0715799 0.0715305 0.0714811 0.0714317
+0.0713823 0.071333 0.0712836 0.0712343 0.071185 0.0711357 0.0710864
+0.0710372 0.0709879 0.0709387 0.0708895 0.0708402 0.0707911 0.0707419
+0.0706927 0.0706436 0.0705945 0.0705454 0.0704963 0.0704472 0.0703981
+0.0703491 0.0703001 0.070251 0.0702021 0.0701531 0.0701041 0.0700552
+0.0700062 0.0699573 0.0699084 0.0698595 0.0698106 0.0697618 0.069713
+0.0696641 0.0696153 0.0695665 0.0695178 0.069469 0.0694202 0.0693715
+0.0693228 0.0692741 0.0692254 0.0691768 0.0691281 0.0690795 0.0690309
+0.0689823 0.0689337 0.0688851 0.0688366;
+#A 30000 0.068788 0.0687395 0.068691 0.0686425 0.068594 0.0685456 0.0684971
+0.0684487 0.0684003 0.0683519 0.0683035 0.0682551 0.0682068 0.0681585
+0.0681102 0.0680619 0.0680136 0.0679653 0.067917 0.0678688 0.0678206
+0.0677724 0.0677242 0.067676 0.0676279 0.0675797 0.0675316 0.0674835
+0.0674354 0.0673873 0.0673393 0.0672912 0.0672432 0.0671952 0.0671472
+0.0670992 0.0670512 0.0670033 0.0669553 0.0669074 0.0668595 0.0668116
+0.0667638 0.0667159 0.0666681 0.0666203 0.0665724 0.0665247 0.0664769
+0.0664291 0.0663814 0.0663337 0.0662859 0.0662382 0.0661906 0.0661429
+0.0660953 0.0660476 0.066 0.0659524 0.0659048 0.0658573 0.0658097 0.0657622
+0.0657146 0.0656671 0.0656197 0.0655722 0.0655247 0.0654773 0.0654299
+0.0653825 0.0653351 0.0652877 0.0652403 0.065193 0.0651457 0.0650983
+0.065051 0.0650038 0.0649565 0.0649093 0.064862 0.0648148 0.0647676
+0.0647204 0.0646733 0.0646261 0.064579 0.0645318 0.0644847 0.0644377
+0.0643906 0.0643435 0.0642965 0.0642495 0.0642025 0.0641555 0.0641085
+0.0640615 0.0640146 0.0639677 0.0639207 0.0638738 0.063827 0.0637801
+0.0637333 0.0636864 0.0636396 0.0635928 0.063546 0.0634993 0.0634525
+0.0634058 0.0633591 0.0633124 0.0632657 0.063219 0.0631723 0.0631257
+0.0630791 0.0630325 0.0629859 0.0629393 0.0628927 0.0628462 0.0627997
+0.0627532 0.0627067 0.0626602 0.0626137 0.0625673 0.0625209 0.0624744
+0.062428 0.0623817 0.0623353 0.0622889 0.0622426 0.0621963 0.06215
+0.0621037 0.0620574 0.0620112 0.061965 0.0619187 0.0618725 0.0618263
+0.0617802 0.061734 0.0616879 0.0616417 0.0615956 0.0615495 0.0615035
+0.0614574 0.0614114 0.0613653 0.0613193 0.0612733 0.0612274 0.0611814
+0.0611354 0.0610895 0.0610436 0.0609977 0.0609518 0.060906 0.0608601
+0.0608143 0.0607685 0.0607227 0.0606769 0.0606311 0.0605853 0.0605396
+0.0604939 0.0604482 0.0604025 0.0603568 0.0603112 0.0602655 0.0602199
+0.0601743 0.0601287 0.0600831 0.0600376 0.059992 0.0599465 0.059901
+0.0598555 0.05981 0.0597646 0.0597191 0.0596737 0.0596283 0.0595829
+0.0595375 0.0594921 0.0594468 0.0594014 0.0593561 0.0593108 0.0592655
+0.0592203 0.059175 0.0591298 0.0590846 0.0590394 0.0589942 0.058949
+0.0589039 0.0588587 0.0588136 0.0587685 0.0587234 0.0586783 0.0586333
+0.0585882 0.0585432 0.0584982 0.0584532 0.0584082 0.0583633 0.0583183
+0.0582734 0.0582285 0.0581836 0.0581387 0.0580939 0.058049 0.0580042
+0.0579594 0.0579146 0.0578698 0.057825 0.0577803 0.0577355 0.0576908
+0.0576461 0.0576015 0.0575568 0.0575121 0.0574675 0.0574229 0.0573783
+0.0573337 0.0572891 0.0572446 0.0572 0.0571555 0.057111 0.0570665 0.0570221
+0.0569776 0.0569332 0.0568887 0.0568443 0.0567999 0.0567556 0.0567112
+0.0566669 0.0566225 0.0565782 0.0565339 0.0564897 0.0564454 0.0564012
+0.0563569 0.0563127 0.0562685 0.0562243 0.0561802 0.056136 0.0560919
+0.0560478 0.0560037 0.0559596 0.0559156 0.0558715 0.0558275 0.0557835
+0.0557395 0.0556955 0.0556515 0.0556076 0.0555636 0.0555197 0.0554758
+0.0554319 0.0553881 0.0553442 0.0553004 0.0552566 0.0552128 0.055169
+0.0551252 0.0550815 0.0550377 0.054994 0.0549503 0.0549066 0.0548629
+0.0548193 0.0547756 0.054732 0.0546884 0.0546448 0.0546012 0.0545577
+0.0545142 0.0544706 0.0544271 0.0543836 0.0543402 0.0542967 0.0542533
+0.0542098 0.0541664 0.054123 0.0540796 0.0540363 0.0539929 0.0539496
+0.0539063 0.053863 0.0538197 0.0537765 0.0537332 0.05369 0.0536468
+0.0536036 0.0535604 0.0535172 0.0534741 0.053431 0.0533879 0.0533448
+0.0533017 0.0532586 0.0532156 0.0531725 0.0531295 0.0530865 0.0530435
+0.0530006 0.0529576 0.0529147 0.0528718 0.0528289 0.052786 0.0527431
+0.0527003 0.0526574 0.0526146 0.0525718 0.052529 0.0524862 0.0524435
+0.0524008 0.052358 0.0523153 0.0522727 0.05223 0.0521873 0.0521447
+0.0521021 0.0520595 0.0520169 0.0519743 0.0519318 0.0518892 0.0518467
+0.0518042 0.0517617 0.0517192 0.0516768 0.0516343 0.0515919 0.0515495
+0.0515071 0.0514647 0.0514224 0.05138 0.0513377 0.0512954 0.0512531
+0.0512108 0.0511686 0.0511263 0.0510841 0.0510419 0.0509997 0.0509575
+0.0509154 0.0508732 0.0508311 0.050789 0.0507469 0.0507048 0.0506628
+0.0506207 0.0505787 0.0505367 0.0504947 0.0504527 0.0504108 0.0503688
+0.0503269 0.050285 0.0502431 0.0502012 0.0501593 0.0501175 0.0500757
+0.0500338 0.0499921 0.0499503 0.0499085 0.0498668 0.049825 0.0497833
+0.0497416 0.0496999 0.0496583 0.0496166 0.049575 0.0495334 0.0494918
+0.0494502 0.0494087 0.0493671 0.0493256 0.0492841 0.0492426 0.0492011
+0.0491596 0.0491182 0.0490767 0.0490353 0.0489939 0.0489525 0.0489112
+0.0488698 0.0488285 0.0487872 0.0487459 0.0487046 0.0486633 0.0486221
+0.0485809 0.0485396 0.0484984 0.0484573 0.0484161 0.0483749 0.0483338
+0.0482927 0.0482516 0.0482105 0.0481695 0.0481284 0.0480874 0.0480464
+0.0480054 0.0479644 0.0479234 0.0478825 0.0478415 0.0478006 0.0477597
+0.0477188 0.047678 0.0476371 0.0475963 0.0475555 0.0475147 0.0474739
+0.0474331 0.0473924 0.0473516 0.0473109 0.0472702 0.0472295 0.0471889
+0.0471482 0.0471076 0.047067 0.0470264 0.0469858 0.0469452 0.0469046
+0.0468641 0.0468236 0.0467831 0.0467426 0.0467021 0.0466617 0.0466213
+0.0465808 0.0465404 0.0465001 0.0464597 0.0464193 0.046379 0.0463387
+0.0462984 0.0462581 0.0462178 0.0461776 0.0461374 0.0460971 0.0460569
+0.0460168 0.0459766 0.0459364 0.0458963 0.0458562 0.0458161 0.045776
+0.0457359 0.0456959 0.0456559 0.0456158 0.0455758 0.0455359 0.0454959
+0.0454559 0.045416 0.0453761 0.0453362 0.0452963 0.0452564 0.0452166
+0.0451768 0.0451369 0.0450971 0.0450574 0.0450176 0.0449778 0.0449381
+0.0448984 0.0448587 0.044819 0.0447794 0.0447397 0.0447001 0.0446605
+0.0446209 0.0445813 0.0445417 0.0445022 0.0444626 0.0444231 0.0443836
+0.0443441 0.0443047 0.0442652 0.0442258 0.0441864 0.044147 0.0441076
+0.0440682 0.0440289 0.0439896 0.0439502 0.043911 0.0438717 0.0438324
+0.0437932 0.0437539 0.0437147 0.0436755 0.0436363 0.0435972 0.043558
+0.0435189 0.0434798 0.0434407 0.0434016 0.0433626 0.0433235 0.0432845
+0.0432455 0.0432065 0.0431675 0.0431285 0.0430896 0.0430507 0.0430118
+0.0429729 0.042934 0.0428951 0.0428563 0.0428175 0.0427786 0.0427398
+0.0427011 0.0426623 0.0426236 0.0425848 0.0425461 0.0425074 0.0424688
+0.0424301 0.0423915 0.0423528 0.0423142 0.0422756 0.0422371 0.0421985
+0.04216 0.0421214 0.0420829 0.0420444 0.042006 0.0419675 0.0419291
+0.0418907 0.0418522 0.0418139 0.0417755 0.0417371 0.0416988 0.0416605
+0.0416222 0.0415839 0.0415456 0.0415074 0.0414691 0.0414309 0.0413927
+0.0413545 0.0413163 0.0412782 0.04124 0.0412019 0.0411638 0.0411257
+0.0410877 0.0410496 0.0410116 0.0409736 0.0409356 0.0408976 0.0408596
+0.0408217 0.0407837 0.0407458 0.0407079 0.04067 0.0406322 0.0405943
+0.0405565 0.0405187 0.0404809 0.0404431 0.0404053 0.0403676 0.0403298
+0.0402921 0.0402544 0.0402167 0.0401791 0.0401414 0.0401038 0.0400662
+0.0400286 0.039991 0.0399534 0.0399159 0.0398784 0.0398409 0.0398034
+0.0397659 0.0397284 0.039691 0.0396536 0.0396161 0.0395788 0.0395414
+0.039504 0.0394667 0.0394294 0.039392 0.0393548 0.0393175 0.0392802
+0.039243 0.0392058 0.0391686 0.0391314 0.0390942 0.039057 0.0390199
+0.0389828 0.0389457 0.0389086 0.0388715 0.0388345 0.0387974 0.0387604
+0.0387234 0.0386864 0.0386494 0.0386125 0.0385755 0.0385386 0.0385017
+0.0384648 0.038428 0.0383911 0.0383543 0.0383175 0.0382807 0.0382439
+0.0382071 0.0381704 0.0381336 0.0380969 0.0380602 0.0380236 0.0379869
+0.0379502 0.0379136 0.037877 0.0378404 0.0378038 0.0377673 0.0377307
+0.0376942 0.0376577 0.0376212 0.0375847 0.0375482 0.0375118 0.0374754
+0.037439 0.0374026 0.0373662 0.0373298 0.0372935 0.0372572 0.0372209
+0.0371846 0.0371483 0.0371121 0.0370758 0.0370396 0.0370034 0.0369672
+0.036931 0.0368949 0.0368587 0.0368226 0.0367865 0.0367504 0.0367144
+0.0366783 0.0366423 0.0366063 0.0365703 0.0365343 0.0364983 0.0364624
+0.0364264 0.0363905 0.0363546 0.0363187 0.0362829 0.036247 0.0362112
+0.0361754 0.0361396 0.0361038 0.036068 0.0360323 0.0359966 0.0359609
+0.0359252 0.0358895 0.0358538 0.0358182 0.0357826 0.035747 0.0357114
+0.0356758 0.0356402 0.0356047 0.0355692 0.0355337 0.0354982 0.0354627
+0.0354273 0.0353918 0.0353564 0.035321 0.0352856 0.0352502 0.0352149
+0.0351796 0.0351442 0.0351089 0.0350736 0.0350384 0.0350031 0.0349679
+0.0349327 0.0348975 0.0348623 0.0348271 0.034792 0.0347569 0.0347218
+0.0346867 0.0346516 0.0346165 0.0345815 0.0345464 0.0345114 0.0344764
+0.0344415 0.0344065 0.0343716 0.0343366 0.0343017 0.0342668 0.034232
+0.0341971 0.0341623 0.0341275 0.0340927 0.0340579 0.0340231 0.0339883
+0.0339536 0.0339189 0.0338842 0.0338495 0.0338148 0.0337802 0.0337456
+0.0337109 0.0336763 0.0336418 0.0336072 0.0335726 0.0335381 0.0335036
+0.0334691 0.0334346 0.0334002 0.0333657 0.0333313 0.0332969 0.0332625
+0.0332281 0.0331938 0.0331594 0.0331251 0.0330908 0.0330565 0.0330222
+0.032988 0.0329537 0.0329195 0.0328853 0.0328511 0.0328169 0.0327828
+0.0327487 0.0327145 0.0326804 0.0326464 0.0326123 0.0325782 0.0325442
+0.0325102 0.0324762 0.0324422 0.0324082 0.0323743 0.0323404 0.0323065
+0.0322726 0.0322387 0.0322048 0.032171 0.0321372 0.0321033 0.0320696
+0.0320358 0.032002 0.0319683 0.0319346 0.0319009 0.0318672 0.0318335
+0.0317998 0.0317662 0.0317326 0.031699 0.0316654 0.0316318 0.0315983
+0.0315647 0.0315312 0.0314977 0.0314642 0.0314308 0.0313973 0.0313639
+0.0313305 0.0312971 0.0312637 0.0312304 0.031197 0.0311637 0.0311304
+0.0310971 0.0310638 0.0310306 0.0309973 0.0309641 0.0309309 0.0308977
+0.0308645 0.0308314 0.0307982 0.0307651 0.030732 0.0306989 0.0306659
+0.0306328 0.0305998 0.0305668 0.0305338 0.0305008 0.0304678 0.0304349
+0.0304019 0.030369 0.0303361 0.0303032 0.0302704 0.0302375 0.0302047
+0.0301719 0.0301391 0.0301063 0.0300736 0.0300408 0.0300081 0.0299754
+0.0299427 0.0299101 0.0298774 0.0298448 0.0298122 0.0297795 0.029747
+0.0297144 0.0296818 0.0296493 0.0296168 0.0295843 0.0295518 0.0295194
+0.0294869 0.0294545 0.0294221 0.0293897 0.0293573 0.0293249 0.0292926
+0.0292603 0.029228 0.0291957 0.0291634 0.0291311 0.0290989 0.0290667
+0.0290345 0.0290023 0.0289701 0.028938 0.0289058 0.0288737 0.0288416
+0.0288095 0.0287775 0.0287454 0.0287134 0.0286814 0.0286494 0.0286174
+0.0285855 0.0285535 0.0285216 0.0284897;
+#A 31000 0.0284578 0.0284259 0.028394 0.0283622 0.0283304 0.0282986
+0.0282668 0.028235 0.0282033 0.0281715 0.0281398 0.0281081 0.0280764
+0.0280448 0.0280131 0.0279815 0.0279499 0.0279183 0.0278867 0.0278551
+0.0278236 0.0277921 0.0277606 0.0277291 0.0276976 0.0276661 0.0276347
+0.0276033 0.0275719 0.0275405 0.0275091 0.0274777 0.0274464 0.0274151
+0.0273838 0.0273525 0.0273212 0.02729 0.0272588 0.0272275 0.0271963
+0.0271652 0.027134 0.0271028 0.0270717 0.0270406 0.0270095 0.0269784
+0.0269474 0.0269163 0.0268853 0.0268543 0.0268233 0.0267924 0.0267614
+0.0267305 0.0266995 0.0266686 0.0266378 0.0266069 0.026576 0.0265452
+0.0265144 0.0264836 0.0264528 0.0264221 0.0263913 0.0263606 0.0263299
+0.0262992 0.0262685 0.0262378 0.0262072 0.0261766 0.026146 0.0261154
+0.0260848 0.0260543 0.0260237 0.0259932 0.0259627 0.0259322 0.0259018
+0.0258713 0.0258409 0.0258105 0.0257801 0.0257497 0.0257193 0.025689
+0.0256587 0.0256283 0.0255981 0.0255678 0.0255375 0.0255073 0.0254771
+0.0254469 0.0254167 0.0253865 0.0253563 0.0253262 0.0252961 0.025266
+0.0252359 0.0252058 0.0251758 0.0251458 0.0251158 0.0250858 0.0250558
+0.0250258 0.0249959 0.024966 0.024936 0.0249062 0.0248763 0.0248464
+0.0248166 0.0247868 0.024757 0.0247272 0.0246974 0.0246677 0.0246379
+0.0246082 0.0245785 0.0245488 0.0245192 0.0244895 0.0244599 0.0244303
+0.0244007 0.0243711 0.0243416 0.024312 0.0242825 0.024253 0.0242235
+0.024194 0.0241646 0.0241351 0.0241057 0.0240763 0.0240469 0.0240176
+0.0239882 0.0239589 0.0239296 0.0239003 0.023871 0.0238417 0.0238125
+0.0237833 0.0237541 0.0237249 0.0236957 0.0236665 0.0236374 0.0236083
+0.0235792 0.0235501 0.023521 0.023492 0.0234629 0.0234339 0.0234049
+0.0233759 0.023347 0.023318 0.0232891 0.0232602 0.0232313 0.0232024
+0.0231736 0.0231447 0.0231159 0.0230871 0.0230583 0.0230295 0.0230008
+0.0229721 0.0229433 0.0229146 0.022886 0.0228573 0.0228286 0.0228 0.0227714
+0.0227428 0.0227142 0.0226857 0.0226571 0.0226286 0.0226001 0.0225716
+0.0225431 0.0225147 0.0224862 0.0224578 0.0224294 0.022401 0.0223727
+0.0223443 0.022316 0.0222877 0.0222594 0.0222311 0.0222028 0.0221746
+0.0221464 0.0221182 0.02209 0.0220618 0.0220336 0.0220055 0.0219774
+0.0219493 0.0219212 0.0218931 0.0218651 0.021837 0.021809 0.021781
+0.021753 0.0217251 0.0216971 0.0216692 0.0216413 0.0216134 0.0215855
+0.0215577 0.0215298 0.021502 0.0214742 0.0214464 0.0214186 0.0213909
+0.0213632 0.0213354 0.0213077 0.0212801 0.0212524 0.0212248 0.0211971
+0.0211695 0.0211419 0.0211144 0.0210868 0.0210593 0.0210317 0.0210042
+0.0209767 0.0209493 0.0209218 0.0208944 0.020867 0.0208396 0.0208122
+0.0207848 0.0207575 0.0207301 0.0207028 0.0206755 0.0206483 0.020621
+0.0205938 0.0205665 0.0205393 0.0205121 0.020485 0.0204578 0.0204307
+0.0204036 0.0203765 0.0203494 0.0203223 0.0202953 0.0202682 0.0202412
+0.0202142 0.0201873 0.0201603 0.0201334 0.0201064 0.0200795 0.0200527
+0.0200258 0.0199989 0.0199721 0.0199453 0.0199185 0.0198917 0.0198649
+0.0198382 0.0198115 0.0197847 0.019758 0.0197314 0.0197047 0.0196781
+0.0196514 0.0196248 0.0195983 0.0195717 0.0195451 0.0195186 0.0194921
+0.0194656 0.0194391 0.0194126 0.0193862 0.0193598 0.0193333 0.019307
+0.0192806 0.0192542 0.0192279 0.0192016 0.0191753 0.019149 0.0191227
+0.0190964 0.0190702 0.019044 0.0190178 0.0189916 0.0189654 0.0189393
+0.0189132 0.0188871 0.018861 0.0188349 0.0188088 0.0187828 0.0187568
+0.0187308 0.0187048 0.0186788 0.0186529 0.0186269 0.018601 0.0185751
+0.0185492 0.0185234 0.0184975 0.0184717 0.0184459 0.0184201 0.0183943
+0.0183686 0.0183428 0.0183171 0.0182914 0.0182657 0.01824 0.0182144
+0.0181888 0.0181631 0.0181375 0.018112 0.0180864 0.0180609 0.0180353
+0.0180098 0.0179843 0.0179589 0.0179334 0.017908 0.0178825 0.0178571
+0.0178318 0.0178064 0.017781 0.0177557 0.0177304 0.0177051 0.0176798
+0.0176546 0.0176293 0.0176041 0.0175789 0.0175537 0.0175285 0.0175034
+0.0174782 0.0174531 0.017428 0.0174029 0.0173779 0.0173528 0.0173278
+0.0173028 0.0172778 0.0172528 0.0172278 0.0172029 0.017178 0.0171531
+0.0171282 0.0171033 0.0170785 0.0170536 0.0170288 0.017004 0.0169792
+0.0169545 0.0169297 0.016905 0.0168803 0.0168556 0.0168309 0.0168063
+0.0167816 0.016757 0.0167324 0.0167078 0.0166832 0.0166587 0.0166342
+0.0166096 0.0165851 0.0165607 0.0165362 0.0165118 0.0164873 0.0164629
+0.0164385 0.0164142 0.0163898 0.0163655 0.0163412 0.0163169 0.0162926
+0.0162683 0.0162441 0.0162198 0.0161956 0.0161714 0.0161472 0.0161231
+0.0160989 0.0160748 0.0160507 0.0160266 0.0160026 0.0159785 0.0159545
+0.0159304 0.0159064 0.0158825 0.0158585 0.0158346 0.0158106 0.0157867
+0.0157628 0.015739 0.0157151 0.0156913 0.0156674 0.0156436 0.0156198
+0.0155961 0.0155723 0.0155486 0.0155249 0.0155012 0.0154775 0.0154538
+0.0154302 0.0154066 0.015383 0.0153594 0.0153358 0.0153123 0.0152887
+0.0152652 0.0152417 0.0152182 0.0151948 0.0151713 0.0151479 0.0151245
+0.0151011 0.0150777 0.0150543 0.015031 0.0150077 0.0149844 0.0149611
+0.0149378 0.0149146 0.0148913 0.0148681 0.0148449 0.0148217 0.0147986
+0.0147754 0.0147523 0.0147292 0.0147061 0.014683 0.01466 0.0146369
+0.0146139 0.0145909 0.0145679 0.014545 0.014522 0.0144991 0.0144762
+0.0144533 0.0144304 0.0144076 0.0143847 0.0143619 0.0143391 0.0143163
+0.0142935 0.0142708 0.0142481 0.0142253 0.0142026 0.01418 0.0141573
+0.0141347 0.014112 0.0140894 0.0140668 0.0140443 0.0140217 0.0139992
+0.0139766 0.0139541 0.0139317 0.0139092 0.0138868 0.0138643 0.0138419
+0.0138195 0.0137971 0.0137748 0.0137524 0.0137301 0.0137078 0.0136855
+0.0136633 0.013641 0.0136188 0.0135966 0.0135744 0.0135522 0.01353
+0.0135079 0.0134858 0.0134636 0.0134416 0.0134195 0.0133974 0.0133754
+0.0133534 0.0133314 0.0133094 0.0132874 0.0132655 0.0132436 0.0132216
+0.0131998 0.0131779 0.013156 0.0131342 0.0131124 0.0130906 0.0130688
+0.013047 0.0130253 0.0130035 0.0129818 0.0129601 0.0129384 0.0129168
+0.0128951 0.0128735 0.0128519 0.0128303 0.0128087 0.0127872 0.0127657
+0.0127441 0.0127226 0.0127012 0.0126797 0.0126582 0.0126368 0.0126154
+0.012594 0.0125726 0.0125513 0.0125299 0.0125086 0.0124873 0.012466
+0.0124448 0.0124235 0.0124023 0.0123811 0.0123599 0.0123387 0.0123176
+0.0122964 0.0122753 0.0122542 0.0122331 0.012212 0.012191 0.0121699
+0.0121489 0.0121279 0.012107 0.012086 0.0120651 0.0120441 0.0120232
+0.0120023 0.0119815 0.0119606 0.0119398 0.011919 0.0118982 0.0118774
+0.0118566 0.0118359 0.0118151 0.0117944 0.0117737 0.0117531 0.0117324
+0.0117118 0.0116911 0.0116705 0.01165 0.0116294 0.0116088 0.0115883
+0.0115678 0.0115473 0.0115268 0.0115064 0.0114859 0.0114655 0.0114451
+0.0114247 0.0114043 0.011384 0.0113637 0.0113433 0.011323 0.0113028
+0.0112825 0.0112623 0.011242 0.0112218 0.0112016 0.0111815 0.0111613
+0.0111412 0.0111211 0.011101 0.0110809 0.0110608 0.0110408 0.0110208
+0.0110007 0.0109808 0.0109608 0.0109408 0.0109209 0.010901 0.0108811
+0.0108612 0.0108413 0.0108215 0.0108016 0.0107818 0.010762 0.0107423
+0.0107225 0.0107028 0.010683 0.0106633 0.0106436 0.010624 0.0106043
+0.0105847 0.0105651 0.0105455 0.0105259 0.0105064 0.0104868 0.0104673
+0.0104478 0.0104283 0.0104088 0.0103894 0.0103699 0.0103505 0.0103311
+0.0103117 0.0102924 0.010273 0.0102537 0.0102344 0.0102151 0.0101958
+0.0101766 0.0101574 0.0101381 0.0101189 0.0100998 0.0100806 0.0100614
+0.0100423 0.0100232 0.0100041 0.00998505 0.00996599 0.00994695 0.00992793
+0.00990893 0.00988995 0.00987098 0.00985204 0.00983311 0.0098142 0.0097953
+0.00977643 0.00975757 0.00973873 0.00971991 0.00970111 0.00968232 0.00966355
+0.0096448 0.00962607 0.00960736 0.00958866 0.00956999 0.00955133 0.00953269
+0.00951406 0.00949546 0.00947687 0.0094583 0.00943975 0.00942122 0.00940271
+0.00938421 0.00936573 0.00934727 0.00932883 0.0093104 0.009292 0.00927361
+0.00925524 0.00923689 0.00921855 0.00920023 0.00918194 0.00916366 0.00914539
+0.00912715 0.00910892 0.00909072 0.00907253 0.00905436 0.0090362 0.00901807
+0.00899995 0.00898185 0.00896377 0.0089457 0.00892766 0.00890963 0.00889162
+0.00887363 0.00885566 0.0088377 0.00881976 0.00880184 0.00878394 0.00876606
+0.0087482 0.00873035 0.00871252 0.00869471 0.00867692 0.00865914 0.00864139
+0.00862365 0.00860593 0.00858822 0.00857054 0.00855287 0.00853523 0.0085176
+0.00849998 0.00848239 0.00846481 0.00844726 0.00842972 0.0084122 0.00839469
+0.00837721 0.00835974 0.00834229 0.00832486 0.00830744 0.00829005 0.00827267
+0.00825531 0.00823797 0.00822065 0.00820335 0.00818606 0.00816879 0.00815154
+0.00813431 0.00811709 0.0080999 0.00808272 0.00806556 0.00804842 0.00803129
+0.00801419 0.0079971 0.00798003 0.00796298 0.00794595 0.00792893 0.00791193
+0.00789495 0.00787799 0.00786105 0.00784412 0.00782722 0.00781033 0.00779346
+0.00777661 0.00775977 0.00774296 0.00772616 0.00770938 0.00769262 0.00767587
+0.00765915 0.00764244 0.00762575 0.00760908 0.00759242 0.00757579 0.00755917
+0.00754257 0.00752599 0.00750943 0.00749288 0.00747636 0.00745985 0.00744336
+0.00742689 0.00741043 0.007394 0.00737758 0.00736118 0.0073448 0.00732843
+0.00731209 0.00729576 0.00727945 0.00726316 0.00724689 0.00723063 0.0072144
+0.00719818 0.00718198 0.00716579 0.00714963 0.00713348 0.00711736 0.00710125
+0.00708515 0.00706908 0.00705302 0.00703699 0.00702097 0.00700497 0.00698898
+0.00697302 0.00695707 0.00694114 0.00692523 0.00690934 0.00689347 0.00687761
+0.00686177 0.00684595 0.00683015 0.00681437 0.0067986 0.00678285 0.00676712
+0.00675141 0.00673572 0.00672004 0.00670439 0.00668875 0.00667313 0.00665753
+0.00664194 0.00662638 0.00661083 0.0065953 0.00657979 0.00656429 0.00654882
+0.00653336 0.00651792 0.0065025 0.0064871 0.00647171 0.00645635 0.006441
+0.00642567 0.00641036 0.00639506 0.00637979 0.00636453 0.00634929 0.00633407
+0.00631887 0.00630368 0.00628851 0.00627337 0.00625824 0.00624312 0.00622803
+0.00621295 0.0061979 0.00618286 0.00616783 0.00615283 0.00613785 0.00612288
+0.00610793 0.006093 0.00607809 0.00606319 0.00604832 0.00603346 0.00601862
+0.0060038 0.00598899 0.00597421 0.00595944 0.00594469 0.00592996 0.00591525
+0.00590055 0.00588587 0.00587122 0.00585658 0.00584195 0.00582735 0.00581276
+0.0057982 0.00578365 0.00576912 0.0057546 0.00574011 0.00572563 0.00571117
+0.00569673 0.00568231 0.00566791 0.00565352 0.00563915 0.0056248 0.00561047
+0.00559616 0.00558187 0.00556759 0.00555333 0.00553909 0.00552487 0.00551066
+0.00549648 0.00548231 0.00546816 0.00545403 0.00543992 0.00542582;
+#A 32000 0.00541175 0.00539769 0.00538365 0.00536962 0.00535562 0.00534163
+0.00532767 0.00531372 0.00529979 0.00528587 0.00527198 0.0052581 0.00524424
+0.0052304 0.00521658 0.00520278 0.00518899 0.00517522 0.00516147 0.00514774
+0.00513403 0.00512034 0.00510666 0.005093 0.00507936 0.00506574 0.00505214
+0.00503855 0.00502498 0.00501143 0.0049979 0.00498439 0.00497089 0.00495742
+0.00494396 0.00493052 0.0049171 0.0049037 0.00489031 0.00487694 0.00486359
+0.00485026 0.00483695 0.00482366 0.00481038 0.00479712 0.00478388 0.00477066
+0.00475746 0.00474427 0.00473111 0.00471796 0.00470483 0.00469171 0.00467862
+0.00466554 0.00465249 0.00463945 0.00462643 0.00461342 0.00460044 0.00458747
+0.00457452 0.00456159 0.00454868 0.00453579 0.00452291 0.00451006 0.00449722
+0.0044844 0.00447159 0.00445881 0.00444604 0.0044333 0.00442057 0.00440785
+0.00439516 0.00438249 0.00436983 0.00435719 0.00434457 0.00433197 0.00431938
+0.00430682 0.00429427 0.00428174 0.00426923 0.00425674 0.00424426 0.00423181
+0.00421937 0.00420695 0.00419455 0.00418216 0.0041698 0.00415745 0.00414512
+0.00413281 0.00412052 0.00410825 0.00409599 0.00408375 0.00407153 0.00405933
+0.00404715 0.00403499 0.00402284 0.00401071 0.0039986 0.00398651 0.00397444
+0.00396238 0.00395034 0.00393832 0.00392632 0.00391434 0.00390238 0.00389043
+0.0038785 0.0038666 0.0038547 0.00384283 0.00383098 0.00381914 0.00380732
+0.00379552 0.00378374 0.00377198 0.00376023 0.00374851 0.0037368 0.00372511
+0.00371343 0.00370178 0.00369015 0.00367853 0.00366693 0.00365535 0.00364379
+0.00363224 0.00362071 0.00360921 0.00359772 0.00358625 0.00357479 0.00356336
+0.00355194 0.00354054 0.00352916 0.0035178 0.00350646 0.00349513 0.00348382
+0.00347254 0.00346127 0.00345001 0.00343878 0.00342756 0.00341637 0.00340519
+0.00339403 0.00338288 0.00337176 0.00336065 0.00334956 0.00333849 0.00332744
+0.00331641 0.00330539 0.0032944 0.00328342 0.00327246 0.00326152 0.00325059
+0.00323969 0.0032288 0.00321793 0.00320708 0.00319625 0.00318544 0.00317464
+0.00316386 0.0031531 0.00314236 0.00313164 0.00312093 0.00311025 0.00309958
+0.00308893 0.0030783 0.00306769 0.00305709 0.00304651 0.00303596 0.00302542
+0.00301489 0.00300439 0.00299391 0.00298344 0.00297299 0.00296256 0.00295215
+0.00294175 0.00293138 0.00292102 0.00291068 0.00290036 0.00289006 0.00287978
+0.00286951 0.00285926 0.00284903 0.00283882 0.00282863 0.00281845 0.0028083
+0.00279816 0.00278804 0.00277794 0.00276786 0.00275779 0.00274774 0.00273772
+0.00272771 0.00271771 0.00270774 0.00269779 0.00268785 0.00267793 0.00266803
+0.00265815 0.00264828 0.00263844 0.00262861 0.0026188 0.00260901 0.00259924
+0.00258949 0.00257975 0.00257003 0.00256033 0.00255065 0.00254099 0.00253135
+0.00252172 0.00251211 0.00250252 0.00249295 0.0024834 0.00247387 0.00246435
+0.00245485 0.00244537 0.00243591 0.00242647 0.00241704 0.00240764 0.00239825
+0.00238888 0.00237953 0.00237019 0.00236088 0.00235158 0.0023423 0.00233304
+0.0023238 0.00231458 0.00230537 0.00229619 0.00228702 0.00227787 0.00226874
+0.00225962 0.00225053 0.00224145 0.00223239 0.00222335 0.00221433 0.00220532
+0.00219634 0.00218737 0.00217842 0.00216949 0.00216058 0.00215169 0.00214281
+0.00213395 0.00212511 0.00211629 0.00210749 0.00209871 0.00208994 0.00208119
+0.00207246 0.00206375 0.00205506 0.00204639 0.00203773 0.00202909 0.00202047
+0.00201187 0.00200329 0.00199472 0.00198618 0.00197765 0.00196914 0.00196065
+0.00195218 0.00194372 0.00193528 0.00192687 0.00191847 0.00191009 0.00190172
+0.00189338 0.00188505 0.00187674 0.00186845 0.00186018 0.00185193 0.00184369
+0.00183548 0.00182728 0.0018191 0.00181094 0.00180279 0.00179467 0.00178656
+0.00177847 0.0017704 0.00176235 0.00175432 0.0017463 0.00173831 0.00173033
+0.00172237 0.00171443 0.0017065 0.0016986 0.00169071 0.00168284 0.00167499
+0.00166716 0.00165935 0.00165155 0.00164378 0.00163602 0.00162828 0.00162055
+0.00161285 0.00160517 0.0015975 0.00158985 0.00158222 0.00157461 0.00156701
+0.00155944 0.00155188 0.00154434 0.00153682 0.00152932 0.00152184 0.00151437
+0.00150693 0.0014995 0.00149209 0.00148469 0.00147732 0.00146996 0.00146263
+0.00145531 0.00144801 0.00144073 0.00143346 0.00142622 0.00141899 0.00141178
+0.00140459 0.00139742 0.00139027 0.00138313 0.00137601 0.00136891 0.00136183
+0.00135477 0.00134773 0.0013407 0.0013337 0.00132671 0.00131974 0.00131278
+0.00130585 0.00129894 0.00129204 0.00128516 0.0012783 0.00127146 0.00126463
+0.00125783 0.00125104 0.00124427 0.00123752 0.00123079 0.00122408 0.00121738
+0.0012107 0.00120404 0.0011974 0.00119078 0.00118418 0.00117759 0.00117103
+0.00116448 0.00115795 0.00115144 0.00114494 0.00113847 0.00113201 0.00112557
+0.00111915 0.00111275 0.00110637 0.0011 0.00109365 0.00108732 0.00108101
+0.00107472 0.00106845 0.00106219 0.00105596 0.00104974 0.00104354 0.00103736
+0.00103119 0.00102505 0.00101892 0.00101281 0.00100672 0.00100065 0.000994598
+0.000988563 0.000982546 0.000976548 0.000970568 0.000964607 0.000958663
+0.000952738 0.000946832 0.000940944 0.000935074 0.000929222 0.000923389
+0.000917574 0.000911778 0.000906 0.00090024 0.000894498 0.000888775
+0.000883071 0.000877384 0.000871716 0.000866066 0.000860435 0.000854822
+0.000849228 0.000843651 0.000838093 0.000832554 0.000827033 0.00082153
+0.000816045 0.000810579 0.000805131 0.000799702 0.000794291 0.000788898
+0.000783524 0.000778168 0.00077283 0.000767511 0.00076221 0.000756927
+0.000751663 0.000746417 0.000741189 0.00073598 0.000730789 0.000725617
+0.000720463 0.000715327 0.00071021 0.000705111 0.00070003 0.000694968
+0.000689924 0.000684898 0.000679891 0.000674902 0.000669931 0.000664979
+0.000660046 0.00065513 0.000650233 0.000645354 0.000640494 0.000635652
+0.000630828 0.000626023 0.000621236 0.000616467 0.000611717 0.000606985
+0.000602272 0.000597577 0.0005929 0.000588242 0.000583602 0.00057898
+0.000574377 0.000569792 0.000565225 0.000560677 0.000556147 0.000551635
+0.000547142 0.000542668 0.000538211 0.000533773 0.000529353 0.000524952
+0.000520569 0.000516205 0.000511858 0.00050753 0.000503221 0.00049893
+0.000494657 0.000490403 0.000486167 0.000481949 0.00047775 0.000473569
+0.000469406 0.000465262 0.000461136 0.000457029 0.00045294 0.000448869
+0.000444816 0.000440782 0.000436767 0.00043277 0.000428791 0.00042483
+0.000420888 0.000416964 0.000413059 0.000409172 0.000405303 0.000401453
+0.000397621 0.000393807 0.000390012 0.000386235 0.000382477 0.000378736
+0.000375015 0.000371311 0.000367626 0.00036396 0.000360311 0.000356682
+0.00035307 0.000349477 0.000345902 0.000342346 0.000338808 0.000335288
+0.000331787 0.000328304 0.000324839 0.000321393 0.000317965 0.000314556
+0.000311165 0.000307792 0.000304438 0.000301102 0.000297784 0.000294485
+0.000291204 0.000287942 0.000284698 0.000281472 0.000278265 0.000275076
+0.000271905 0.000268753 0.000265619 0.000262504 0.000259407 0.000256328
+0.000253267 0.000250225 0.000247202 0.000244197 0.00024121 0.000238241
+0.000235291 0.00023236 0.000229446 0.000226551 0.000223675 0.000220816
+0.000217977 0.000215155 0.000212352 0.000209567 0.000206801 0.000204053
+0.000201323 0.000198612 0.000195919 0.000193245 0.000190589 0.000187951
+0.000185332 0.000182731 0.000180148 0.000177584 0.000175038 0.000172511
+0.000170002 0.000167511 0.000165039 0.000162585 0.000160149 0.000157732
+0.000155333 0.000152953 0.000150591 0.000148247 0.000145922 0.000143615
+0.000141326 0.000139056 0.000136804 0.000134571 0.000132356 0.000130159
+0.000127981 0.000125821 0.00012368 0.000121556 0.000119452 0.000117365
+0.000115297 0.000113248 0.000111216 0.000109204 0.000107209 0.000105233
+0.000103275 0.000101336 9.94151e-05 9.75125e-05 9.56283e-05 9.37625e-05
+9.1915e-05 9.0086e-05 8.82753e-05 8.6483e-05 8.47091e-05 8.29536e-05
+8.12164e-05 7.94976e-05 7.77973e-05 7.61152e-05 7.44516e-05 7.28064e-05
+7.11795e-05 6.9571e-05 6.79809e-05 6.64092e-05 6.48558e-05 6.33209e-05
+6.18043e-05 6.03061e-05 5.88263e-05 5.73648e-05 5.59218e-05 5.44971e-05
+5.30908e-05 5.17029e-05 5.03334e-05 4.89822e-05 4.76495e-05 4.63351e-05
+4.50391e-05 4.37615e-05 4.25022e-05 4.12614e-05 4.00389e-05 3.88348e-05
+3.76491e-05 3.64818e-05 3.53328e-05 3.42022e-05 3.30901e-05 3.19963e-05
+3.09208e-05 2.98638e-05 2.88252e-05 2.78049e-05 2.6803e-05 2.58195e-05
+2.48544e-05 2.39076e-05 2.29793e-05 2.20693e-05 2.11777e-05 2.03045e-05
+1.94497e-05 1.86132e-05 1.77952e-05 1.69955e-05 1.62142e-05 1.54513e-05
+1.47068e-05 1.39806e-05 1.32729e-05 1.25835e-05 1.19125e-05 1.12599e-05
+1.06257e-05 1.00098e-05 9.41236e-06 8.83328e-06 8.27258e-06 7.73027e-06
+7.20634e-06 6.7008e-06 6.21363e-06 5.74485e-06 5.29446e-06 4.86245e-06
+4.44882e-06 4.05357e-06 3.67671e-06 3.31823e-06 2.97814e-06 2.65642e-06
+2.3531e-06 2.06815e-06 1.80159e-06 1.55341e-06 1.32362e-06 1.11221e-06
+9.19178e-07 7.44534e-07 5.88274e-07 4.50397e-07 3.30904e-07 2.29795e-07
+1.47069e-07 8.27261e-08 3.67671e-08 9.19178e-09;
+#X coords 0 1 32767 -1 200 140 1;
+#X restore 431 29 graph;
+#X obj 25 156 function~ gsf_window;
+#X msg 25 133 rcos;
+#N canvas 10 37 581 367 sprayclouds 0;
+#X obj 9 231 outlet;
+#X msg 9 153 spray;
+#X obj 116 108 metro 1000;
+#X obj 116 87 tgl 15 0 empty dac-toggle empty 0 -6 0 8 -262144 -1 -1
+0 1;
+#X floatatom 9 65 5 0 0 0 - - -, f 5;
+#X msg 116 155 pitchspray;
+#X msg 9 32 1;
+#X obj 9 12 loadbang;
+#X msg 47 33 2;
+#X obj 116 63 r dac-toggle;
+#X text 77 35 <- select cloud method (1=spray \, 2=pitchspray);
+#X text 197 108 <- time interval is the cloud horizon (also latency)
+;
+#X text 196 158 <- either of these triggers a "cloud" of grains;
+#N canvas 666 199 458 308 select-method 0;
+#X obj 64 35 inlet;
+#X obj 138 25 inlet;
+#X obj 26 13 loadbang;
+#X obj 138 223 spigot;
+#X obj 193 224 spigot;
+#X obj 230 188 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 175 185 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 64 132 unpack f f;
+#X obj 64 65 sel 1 2;
+#X msg 64 102 1 0;
+#X msg 97 102 0 1;
+#X obj 138 255 outlet;
+#X obj 193 254 outlet;
+#X connect 0 0 8 0;
+#X connect 1 0 3 0;
+#X connect 1 0 4 0;
+#X connect 2 0 9 0;
+#X connect 3 0 11 0;
+#X connect 4 0 12 0;
+#X connect 5 0 4 1;
+#X connect 6 0 3 1;
+#X connect 7 0 6 0;
+#X connect 7 1 5 0;
+#X connect 8 0 9 0;
+#X connect 8 1 10 0;
+#X connect 9 0 7 0;
+#X connect 10 0 7 0;
+#X restore 9 131 pd select-method;
+#X connect 1 0 0 0;
+#X connect 2 0 13 1;
+#X connect 3 0 2 0;
+#X connect 4 0 13 0;
+#X connect 5 0 0 0;
+#X connect 6 0 4 0;
+#X connect 7 0 6 0;
+#X connect 8 0 4 0;
+#X connect 9 0 3 0;
+#X connect 13 0 1 0;
+#X connect 13 1 5 0;
+#X restore 25 181 pd sprayclouds;
+#N canvas 0 22 454 304 amp 0;
+#X obj 89 108 inlet~;
+#X obj 89 149 *~;
+#X obj 89 198 outlet~;
+#X obj 176 110 inlet~;
+#X obj 176 151 *~;
+#X obj 176 200 outlet~;
+#X obj 256 109 inlet;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 6 0 4 1;
+#X connect 6 0 1 1;
+#X restore 25 389 pd amp;
+#X obj 223 344 hsl 128 15 0 1 0 0 empty empty gain -2 -6 0 8 -81528
+-1 -1 0 1;
+#X obj 25 419 dac~;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array gsf_wavetable 4e+06 float 2;
+#X coords 0 1 4e+06 -1 200 140 1;
+#X restore 431 169 graph;
+#X text 99 431 your sound here - it should be at least 20 seconds long
+->;
+#N canvas 181 44 551 550 grist 0;
+#X obj 87 481 outlet;
+#X msg 86 91 grist 25 1000 0.25 3 0.1 0.9 0.1 0.9 50 200;
+#X msg 98 124 grist 2 1000 0.25 2 0.1 0.9 0.1 0.9 4000 8000;
+#X text 15 41 args: events horizon min_incr max_incr minpan maxpan
+minamp maxamp mindur maxdur;
+#X msg 211 439 events \$1;
+#X floatatom 211 416 5 0 0 0 - - -, f 5;
+#X text 255 417 directly set events per "cloud";
+#X msg 108 152 grist 5 1000 1 1 0.1 0.9 0.1 0.9 1000 2000;
+#X msg 120 193 grist 8 1000 0.25 3 0.1 0.9 1 1 200 200;
+#X msg 133 222 grist 1 1000 1 1 0.1 0.9 0.1 0.9 1000 1000;
+#X msg 148 250 grist 200 1000 0.2 4 0.1 0.9 0.1 0.9 50 80;
+#X obj 86 71 loadbang;
+#X msg 161 277 grist 150 1000 0.2 4 0.1 0.9 0.1 0.9 150 250;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 4 0;
+#X connect 7 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 0 0;
+#X connect 10 0 0 0;
+#X connect 11 0 1 0;
+#X connect 12 0 0 0;
+#X restore 40 200 pd grist;
+#X obj 25 107 loadbang;
+#N canvas 0 22 498 348 scales 0;
+#X obj 110 246 outlet;
+#X text 66 43 these get used when you drive with "pitchspray";
+#X msg 38 94 setscale 1 1.25 1.5 2;
+#X msg 157 156 setscale 0.5 1 2;
+#X obj 38 70 loadbang;
+#X msg 104 116 setscale 1 1.25 1.33333 1.5 1.875 2;
+#X msg 264 220 setscale 1 1.06 1.09;
+#X msg 257 185 setscale 1 1.5 2.25;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 2 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X restore 51 219 pd scales;
+#N canvas 287 22 749 764 more-messages 0;
+#X obj 40 615 outlet;
+#X msg 40 49 nopan \$1;
+#X obj 40 25 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X text 59 26 turn off panning effect;
+#X obj 70 79 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X msg 70 103 interpolate \$1;
+#X text 89 80 set interpolation (on by default);
+#X obj 139 223 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X msg 139 247 steady \$1;
+#X text 158 224 set steady rhythm;
+#X obj 102 144 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X msg 102 168 interpolate_envelope \$1;
+#X text 121 145 set envelope interpolation (off by default);
+#X floatatom 147 280 5 0 0 0 - - -, f 5;
+#X msg 147 302 retro_odds \$1;
+#X text 186 280 odds for backwards grain (0-1);
+#X floatatom 222 324 5 0 0 0 - - -, f 5;
+#X msg 222 346 transpose \$1;
+#X text 255 382 reseed random generator;
+#X msg 216 402 seed \$1;
+#X floatatom 216 384 5 0 0 0 - - -, f 5;
+#X floatatom 229 428 5 0 0 0 - - -, f 5;
+#X msg 229 446 pitchdev \$1;
+#X text 268 426 detune factor for "pitchspray";
+#X msg 220 491 grain 3300 -1 1 0.2 15000;
+#X text 219 476 specify a single grain directly:;
+#X text 218 509 args: dur \, incr \, amp \, pan \, skip;
+#X msg 218 541 info;
+#X obj 345 309 hsl 128 15 0.1 2 0 0 empty empty transpose -2 -6 0 8
+-81528 -1 -1 0 1;
+#X text 260 324 comment;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 4 0 5 0;
+#X connect 5 0 0 0;
+#X connect 7 0 8 0;
+#X connect 8 0 0 0;
+#X connect 10 0 11 0;
+#X connect 11 0 0 0;
+#X connect 13 0 14 0;
+#X connect 14 0 0 0;
+#X connect 16 0 17 0;
+#X connect 17 0 0 0;
+#X connect 19 0 0 0;
+#X connect 20 0 19 0;
+#X connect 21 0 22 0;
+#X connect 22 0 0 0;
+#X connect 24 0 0 0;
+#X connect 27 0 0 0;
+#X connect 28 0 16 0;
+#X restore 69 261 pd more-messages;
+#X text 136 181 <- triggering;
+#X text 103 200 <- parameters;
+#X text 125 221 <- optional tunings;
+#X text 189 262 <- etc.;
+#X text 25 52 granulesf~ creates granular textures by mixing together
+enveloped grains taken from a soundfile stored in an array.;
+#X msg 60 133 adrenv 0.05 0.1 0.3 1;
+#N canvas 0 22 828 525 skiptimes 0;
+#X msg 282 152 maxskip -1;
+#X msg 209 151 minskip 0;
+#X obj 60 385 outlet;
+#X text 363 153 set to full buffer (default);
+#X obj 209 124 t b b;
+#X obj 209 101 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 19 31 t b b;
+#X obj 19 8 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1
+;
+#X text 69 15 constrain min & max skiptimes \; in this case each grain
+starts (or ends) at the same time;
+#X msg 263 326 minskip \$1;
+#X msg 357 326 maxskip \$1;
+#X obj 266 224 hsl 128 15 0 20000 0 0 empty empty skiptime -2 -6 0
+8 -81528 -1 -1 0 1;
+#X obj 263 268 t f f;
+#X floatatom 263 247 5 0 0 0 - - -, f 5;
+#X text 403 225 slide it!;
+#X floatatom 357 256 5 0 0 0 - - -, f 5;
+#X obj 357 300 + 0;
+#X text 398 255 optional offset;
+#X msg 19 54 minskip 5000;
+#X msg 120 52 maxskip 5000;
+#X obj 357 274 t b f;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 4 0 1 0;
+#X connect 4 1 0 0;
+#X connect 5 0 4 0;
+#X connect 6 0 18 0;
+#X connect 6 1 19 0;
+#X connect 7 0 6 0;
+#X connect 9 0 2 0;
+#X connect 10 0 2 0;
+#X connect 11 0 13 0;
+#X connect 12 0 9 0;
+#X connect 12 1 16 0;
+#X connect 13 0 12 0;
+#X connect 15 0 20 0;
+#X connect 16 0 10 0;
+#X connect 18 0 2 0;
+#X connect 19 0 2 0;
+#X connect 20 0 16 0;
+#X connect 20 1 16 1;
+#X restore 60 239 pd skiptimes;
+#X text 150 238 <- constrain grain selection;
+#X obj 466 452 soundfiler;
+#X obj 466 401 openpanel;
+#X msg 466 377 bang;
+#X msg 466 424 read -resize \$1 gsf_wavetable;
+#X obj 23 10 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 100 113 grain envelope;
+#X connect 0 0 5 0;
+#X connect 0 1 5 1;
+#X connect 3 0 2 0;
+#X connect 4 0 0 0;
+#X connect 5 0 7 0;
+#X connect 5 1 7 1;
+#X connect 6 0 5 2;
+#X connect 10 0 0 0;
+#X connect 11 0 3 0;
+#X connect 12 0 0 0;
+#X connect 13 0 0 0;
+#X connect 19 0 2 0;
+#X connect 20 0 0 0;
+#X connect 23 0 25 0;
+#X connect 24 0 23 0;
+#X connect 25 0 22 0;
diff --git a/externals/lyonpotpourri/granulesf~.c b/externals/lyonpotpourri/granulesf~.c
new file mode 100755
index 0000000000000000000000000000000000000000..63ac71b61afa38add8d40b9fe67c107833c269da
--- /dev/null
+++ b/externals/lyonpotpourri/granulesf~.c
@@ -0,0 +1,1076 @@
+#include "MSPd.h"
+
+#define MAXGRAINS (512) // just for present to get lower overhead
+
+#define MAXSCALE (8192)
+#define OBJECT_NAME "granulesf~"
+
+static t_class *granulesf_class;
+
+typedef struct {
+    float amplitude;
+    float panL;
+    float panR;
+    long delay; // samples to wait until event starts
+    long duration;// length in samples of event
+    float phase; // phase for frequency oscillator
+    float ephase; // phase for envelope
+    float si; // sampling increment for frequency
+    float esi; // sampling increment for envelope
+    float endframe;//boundary frame (extremes are 0 or size-1); approach depends on sign of si
+    short active;//status of this slot (inactives are available for new grains)
+} t_grain;
+
+typedef struct {
+	t_word *b_samples;
+	long b_frames;
+	long b_nchans;//not needed here
+} t_pdbuffer;
+
+
+typedef struct _granulesf
+{
+    
+    t_object x_obj;
+    float x_f;
+    t_pdbuffer *wavebuf; // holds waveform samples
+    t_pdbuffer *windowbuf; // holds window samples
+	t_symbol *wavename; // name of waveform buffer
+	t_symbol *windowname; // name of window buffer
+    
+	float sr; // sampling rate
+	short mute;
+	short hosed; // buffers are bad
+	/* Global grain data*/
+	long events; // number of events in a block
+	long horizon; // length of block for random events
+	float min_incr; // minimum frequency for a grain
+	float max_incr; // maximum frequency for a grain
+	float minpan; // minimum pan for a grain
+	float maxpan; // maxium pan for a grain
+	float minamp; // minimum amplitude for a grain
+	float maxamp; // maximum amplitude for a grain
+	float mindur; // minumum duration for a grain
+	float maxdur; // maximum duration for a grain
+	t_grain *grains; // stores grain data
+	float *pitchscale; // contains a frequency grid for pitch constraint
+	int pitchsteps; // number of members in scale
+	float transpose; // factor for scaling all pitches
+	float pitch_deviation; // factor to adjust scaled pitches
+	short steady; // toggles pulsed rhythmic activity
+	float lowblock_increment; //lowest allowed frequency
+	float highblock_increment;// highest allowed frequency
+	float mindur_ms;//store duration in ms
+	float maxdur_ms;//ditto
+	float horizon_ms;//ditto
+	short constrain_scale;//flag to only use bounded portion of scale rather than all of it
+	short nopan;//stereo channels go straight out, mono goes to center
+	long minskip;//minimum inskip in samples (default = zero)
+	long maxskip;//maximum inskip in samples (default = maximum possible given dur/increment of note)
+	long b_nchans;//channels in buffer (always 1 for Pd, at least today)
+	long b_frames;//frames in waveform buffer
+	float retro_odds;//odds to play sample backwards
+	short interpolate;//flag to interpolate samples - on by default
+	short interpolate_envelope;//flag to interpolate envelope
+} t_granulesf;
+
+void granulesf_setbuf(t_granulesf *x, t_symbol *wavename, t_symbol *windowname);
+void *granulesf_new(t_symbol *msg, short argc, t_atom *argv);
+t_int *granulesf_perform(t_int *w);
+t_int *granulesf_perform_no_interpolation(t_int *w);
+t_int *granulesf_performhose(t_int *w);
+void granulesf_dsp(t_granulesf *x, t_signal **sp);
+void granulesf_reload(t_granulesf *x);
+void granulesf_spray(t_granulesf *x);
+void granulesf_pitchspray(t_granulesf *x);
+void granulesf_transpose(t_granulesf *x, t_floatarg t);
+void granulesf_pitchdev(t_granulesf *x, t_floatarg d);
+void granulesf_lowblock(t_granulesf *x, t_floatarg f);
+void granulesf_highblock(t_granulesf *x, t_floatarg f);
+void granulesf_events(t_granulesf *x, t_floatarg e);
+float granulesf_boundrand(float min, float max);
+void *granulesf_grist(t_granulesf *x, t_symbol *msg, short argc, t_atom *argv);
+void *granulesf_grain(t_granulesf *x, t_symbol *msg, short argc, t_atom *argv);
+void *granulesf_setscale(t_granulesf *x, t_symbol *msg, short argc, t_atom *argv);
+void granulesf_info(t_granulesf *x);
+void granulesf_mute(t_granulesf *x, t_floatarg toggle);
+void granulesf_steady(t_granulesf *x, t_floatarg toggle);
+void granulesf_constrain_scale(t_granulesf *x, t_floatarg toggle);
+void granulesf_dsp_free(t_granulesf *x);
+void granulesf_init(t_granulesf *x,short initialized);
+void granulesf_constrain(int *index_min, int *index_max, float min_incr, float max_incr, float *scale, int steps);
+void granulesf_interpolate(t_granulesf *x, t_floatarg toggle);
+void granulesf_nopan(t_granulesf *x, t_floatarg toggle);
+void granulesf_retro_odds(t_granulesf *x, t_floatarg o);
+void granulesf_seed(t_granulesf *x, t_floatarg seed);
+void granulesf_interpolate_envelope(t_granulesf *x, t_floatarg toggle);
+
+
+void granulesf_tilde_setup(void){
+    granulesf_class = class_new(gensym("granulesf~"), (t_newmethod)granulesf_new,
+                                (t_method)granulesf_dsp_free,sizeof(t_granulesf), 0,A_GIMME,0);
+    CLASS_MAINSIGNALIN(granulesf_class, t_granulesf, x_f);
+    class_addmethod(granulesf_class,(t_method)granulesf_dsp,gensym("dsp"),0);
+    class_addmethod(granulesf_class,(t_method)granulesf_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(granulesf_class,(t_method)granulesf_setbuf,gensym("setbuf"),A_DEFSYM,A_DEFSYM,0);
+    class_addmethod(granulesf_class,(t_method)granulesf_spray,gensym("spray"),0);
+    class_addmethod(granulesf_class,(t_method)granulesf_info,gensym("info"),0);
+    class_addmethod(granulesf_class,(t_method)granulesf_pitchspray,gensym("pitchspray"),0);
+    class_addmethod(granulesf_class,(t_method)granulesf_transpose,gensym("transpose"),A_FLOAT,0);
+    class_addmethod(granulesf_class,(t_method)granulesf_events,gensym("events"),A_FLOAT,0);
+    class_addmethod(granulesf_class,(t_method)granulesf_pitchdev,gensym("pitchdev"),A_FLOAT,0);
+    class_addmethod(granulesf_class,(t_method)granulesf_lowblock,gensym("lowblock"),A_FLOAT,0);
+    class_addmethod(granulesf_class,(t_method)granulesf_highblock,gensym("highblock"),A_FLOAT,0);
+    class_addmethod(granulesf_class,(t_method)granulesf_steady,gensym("steady"),A_FLOAT,0);
+    class_addmethod(granulesf_class,(t_method)granulesf_constrain_scale,gensym("constrain_scale"),A_FLOAT,0);
+    class_addmethod(granulesf_class,(t_method)granulesf_grist,gensym("grist"),A_GIMME,0);
+    class_addmethod(granulesf_class,(t_method)granulesf_grain,gensym("grain"),A_GIMME,0);
+    class_addmethod(granulesf_class,(t_method)granulesf_setscale,gensym("setscale"),A_GIMME,0);
+    class_addmethod(granulesf_class,(t_method)granulesf_interpolate,gensym("interpolate"),A_FLOAT,0);
+    class_addmethod(granulesf_class,(t_method)granulesf_nopan,gensym("nopan"),A_FLOAT,0);
+    class_addmethod(granulesf_class,(t_method)granulesf_retro_odds,gensym("retro_odds"),A_FLOAT,0);
+    class_addmethod(granulesf_class,(t_method)granulesf_seed,gensym("seed"),A_FLOAT,0);
+    class_addmethod(granulesf_class,(t_method)granulesf_interpolate_envelope,gensym("interpolate_envelope"),A_FLOAT,0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+void granulesf_interpolate_envelope(t_granulesf *x, t_floatarg toggle)
+{
+	x->interpolate_envelope = toggle;
+}
+
+void granulesf_seed(t_granulesf *x, t_floatarg seed)
+{
+	srand((long)seed);
+}
+
+void granulesf_retro_odds(t_granulesf *x, t_floatarg o)
+{
+	if(o < 0 || o > 1){
+		error("retro odds must be within [0.0 - 1.0]");
+		return;
+	}
+	x->retro_odds = 0;
+}
+
+void granulesf_interpolate(t_granulesf *x, t_floatarg toggle)
+{
+	x->interpolate = toggle;
+	post("toggle DACs to change interpolation status");
+}
+
+void granulesf_nopan(t_granulesf *x, t_floatarg toggle)
+{
+	x->nopan = toggle;
+}
+
+void granulesf_constrain_scale(t_granulesf *x, t_floatarg toggle)
+{
+	x->constrain_scale = toggle;
+}
+void granulesf_lowblock(t_granulesf *x, t_floatarg f)
+{
+	if(f > 0){
+		x->lowblock_increment = f;
+	}
+}
+
+void granulesf_highblock(t_granulesf *x, t_floatarg f)
+{
+	if(f > 0){
+		x->highblock_increment = f;
+	}
+}
+
+void granulesf_pitchdev(t_granulesf *x, t_floatarg d)
+{
+	if(d < 0 ){
+		error("pitch deviation must be positive");
+		return;
+	}
+	x->pitch_deviation = d;
+}
+
+void granulesf_mute(t_granulesf *x, t_floatarg toggle)
+{
+	x->mute = toggle;
+}
+
+void granulesf_steady(t_granulesf *x, t_floatarg toggle)
+{
+	x->steady = toggle;
+}
+
+void granulesf_events(t_granulesf *x, t_floatarg e)
+{
+	if( e <= 0 ){
+		post("events must be positive!");
+		return;
+	}
+	x->events = e;
+}
+
+void granulesf_transpose(t_granulesf *x, t_floatarg t)
+{
+	if( t <= 0 ){
+		error("transpose factor must be greater than zero!");
+		return;
+	}
+	x->transpose = t;
+}
+
+void *granulesf_setscale(t_granulesf *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	int i;
+	float *pitchscale = x->pitchscale;
+	if( argc >= MAXSCALE ){
+		error("%d is the maximum size scale", MAXSCALE);
+		return 0;
+	}
+	if( argc < 2 ){
+		error("there must be at least 2 members in scale");
+		return 0;
+	}
+	for(i=0; i < argc; i++){
+		pitchscale[i] = atom_getfloatarg(i,argc,argv);
+	}
+	x->pitchsteps = argc;
+    return 0;
+}
+
+void granulesf_constrain(int *index_min, int *index_max, float min_incr, float max_incr, float *scale, int steps)
+{
+	int imax = steps - 1;
+	int imin = 0;
+	while(scale[imin] < min_incr && imin < imax){
+		++imin;
+	}
+	if(imin == imax){
+		post("could not constrain minimum index  - your grist parameters are out of range for this scale");
+		*index_min = 0;
+		*index_max = steps - 1;
+		return;
+	}
+    while(scale[imax] > max_incr && imax > 0){
+		--imax;
+	}
+	if(imax < 1 || imax <= imin){
+		post("could not constrain maximum index - your grist parameters are out of range for this scale");
+		*index_min = 0;
+		*index_max = steps - 1;
+		return;
+	}
+	*index_min = imin;
+	*index_max = imax;
+}
+
+void granulesf_pitchspray(t_granulesf *x)
+{
+	int i,j;
+	long grainframes;
+	long b_frames = x->wavebuf->b_frames;
+	long eframes = x->windowbuf->b_frames;
+	long minskip = x->minskip;
+	long maxskip = x->maxskip;
+	float retro_odds = x->retro_odds;
+	long horizon = x->horizon; // length of block for random events
+	float mindur = x->mindur;
+	float maxdur = x->maxdur;
+	float min_incr = x->min_incr; // minimum frequency for a grain
+	float max_incr = x->max_incr; // maximum frequency for a grain
+	float minpan = x->minpan; // minimum pan for a grain
+	float maxpan = x->maxpan; // maxium pan for a grain
+	float minamp = x->minamp; // minimum amplitude for a grain
+	float maxamp = x->maxamp; // maximum amplitude for a grain
+	float transpose = x->transpose; // pitch scalar
+	float lowblock_increment = x->lowblock_increment;
+	float highblock_increment = x->highblock_increment;
+	short steady = x->steady;
+	float pitch_deviation = x->pitch_deviation;
+	float pdev = 0;
+	float pdev_invert = 0;
+    //	float pscale;
+	float pan;
+	int index_min, index_max;
+	int steps = x->pitchsteps;
+	float *scale = x->pitchscale;
+	int windex;
+	short inserted = 0;
+	short constrain_scale = x->constrain_scale;
+	t_grain *grains = x->grains;
+	float tmp;
+    
+	if( steps < 2 ){
+		error("scale is undefined");
+		return;
+	}
+	if( pitch_deviation ){
+		pdev = 1.0 + pitch_deviation;
+		pdev_invert = 1.0 / pdev;
+	}
+	for( i = 0; i < x->events; i++ ){
+		inserted = 0;
+		for(j = 0; j < MAXGRAINS; j++ ){
+			if(!grains[j].active){
+                if(steady){
+                    grains[j].delay = (float)(i * horizon) / (float) x->events ;
+                } else {
+                    grains[j].delay = granulesf_boundrand(0.0,(float) horizon);
+    			}
+    			grains[j].duration = (long) granulesf_boundrand(mindur, maxdur);
+    			grains[j].phase = 0.0;
+    			grains[j].ephase = 0.0;
+    			pan = granulesf_boundrand(minpan, maxpan);
+                
+    			grains[j].amplitude = granulesf_boundrand(minamp, maxamp);
+    			grains[j].panL = grains[j].amplitude * cos(pan * PIOVERTWO);
+    			grains[j].panR = grains[j].amplitude * sin(pan * PIOVERTWO);
+    			grains[j].amplitude *= .707;//used directly only for "nopan"
+    			
+                if(constrain_scale){
+                    granulesf_constrain(&index_min,&index_max,min_incr, max_incr, scale, steps);
+                    windex = (int) granulesf_boundrand((float)index_min, (float)index_max);
+                } else {
+                    windex = (int) granulesf_boundrand(0.0, (float)(steps));
+                }
+    			grains[j].si = transpose * scale[windex];
+                //	post("windex %d scale[w] %f transpose %f si %f",windex, scale[windex], transpose, grains[j].si );
+    			grainframes = grains[j].duration * grains[j].si;
+    			grains[j].esi =  (float) eframes / (float) grains[j].duration;
+    			
+    			if( pitch_deviation ){
+    				grains[j].si *= granulesf_boundrand(pdev_invert,pdev);
+    			}
+    			// post("new si: %f", grains[j].si);
+    			/* must add this code to spray, and also do for high frequencies
+                 */
+    			if(lowblock_increment > 0.0) {
+    				if(grains[j].si < lowblock_increment){
+    					post("lowblock: aborted grain with %f frequency",grains[j].si);
+    					grains[j].active = 0; // abort grain
+    					goto nextgrain;
+    				}
+    			}
+    			if(highblock_increment > 0.0) {
+    				if(grains[j].si > highblock_increment){
+    					post("highblock: aborted grain with %f frequency, greater than %f",
+                             grains[j].si, highblock_increment);
+    					grains[j].active = 0; // abort grain
+    					goto nextgrain;
+    				}
+    			}
+                /* set skip time into sample */
+                if(grainframes >= b_frames ){
+				  	error("grain size %.0ld is too long for buffer which is %ld",grainframes, b_frames);
+				  	grains[j].active = 0;
+				  	goto nextgrain;
+                }
+                if(minskip > b_frames - grainframes){//bad minskip
+				  	error("minskip time is illegal");
+				  	grains[j].phase = 0.0;
+				  	grains[j].endframe = grainframes - 1;
+                } else {
+                    if(maxskip > b_frames - grainframes){
+					  	grains[j].phase = granulesf_boundrand((float)minskip, (float) (b_frames - grainframes));
+					  	//post("1. minskip %d maxskip %d",minskip,b_frames - grainframes);
+                    } else {
+					  	grains[j].phase = granulesf_boundrand((float)minskip, (float)maxskip);
+					  	//post("2. minskip %d maxskip %d",minskip,maxskip);
+                    }
+                    grains[j].endframe = grains[j].phase + grainframes - 1;
+                }
+                
+                
+                if( granulesf_boundrand(0.0,1.0) < retro_odds){//go backwards - make sure to test both boundaries
+				  	grains[j].si *= -1.0;
+				  	tmp = grains[j].phase;
+				  	grains[j].phase = grains[j].endframe;
+				  	grains[j].endframe = tmp;
+                }
+                /*post("grain: grainframes %d phase %f endframe %f amp %f",
+                 grainframes, grains[j].phase, grains[j].endframe, grains[j].amplitude);*/
+                grains[j].active = 1;
+    			inserted = 1;
+    			goto nextgrain;
+    		}
+		}
+		if(!inserted){
+			error("could not insert grain with increment %f",grains[j].si);
+			return;
+		}
+    nextgrain: ;
+	}
+}
+
+void granulesf_spray(t_granulesf *x)
+{
+	int i,j;
+	long grainframes;
+	long eframes = x->windowbuf->b_frames;
+	long b_frames = x->wavebuf->b_frames;
+    //	long b_nchans = x->wavebuf->b_nchans;
+    //	float sr = x->sr;
+	long horizon = x->horizon; // length of block for random events
+	float mindur = x->mindur;
+	float maxdur = x->maxdur;
+	float min_incr = x->min_incr; // minimum incr for a grain (must be positive!)
+	float max_incr = x->max_incr; // maximum incr for a grain (must be positive!)
+	float minpan = x->minpan; // minimum pan for a grain
+	float maxpan = x->maxpan; // maxium pan for a grain
+	float minamp = x->minamp; // minimum amplitude for a grain
+	float maxamp = x->maxamp; // maximum amplitude for a grain
+	float transpose = x->transpose; // pitch scalar
+	long minskip = x->minskip;
+	long maxskip = x->maxskip;
+	short steady = x->steady;
+	float retro_odds = x->retro_odds;
+	float pan;
+	t_grain *grains = x->grains;
+	short inserted;
+	float tmp;
+
+	for( i = 0; i < x->events; i++ ){
+		inserted = 0;
+		for(j = 0; j < MAXGRAINS; j++ ){
+			if(!grains[j].active){
+				grains[j].active = 1;
+				if(steady){
+					grains[j].delay = (float)(i * horizon) / (float) x->events ;
+				} else {
+    				grains[j].delay = granulesf_boundrand(0.0,(float) horizon);
+    			}
+   				grains[j].duration = (long) granulesf_boundrand(mindur, maxdur);//frames for this grain
+    			grains[j].ephase = 0.0;
+    			pan = granulesf_boundrand(minpan, maxpan);
+     			grains[j].amplitude = granulesf_boundrand(minamp, maxamp);
+    			grains[j].panL = grains[j].amplitude * cos(pan * PIOVERTWO);
+    			grains[j].panR = grains[j].amplitude * sin(pan * PIOVERTWO);
+    			grains[j].amplitude *= .707;//used directly only for "nopan"
+                grains[j].si = transpose * granulesf_boundrand(min_incr, max_incr);
+                
+                grainframes = grains[j].duration * grains[j].si;//frames to be read from buffer
+                // grains[j].esi =  (float) eframes / (float) grainframes;
+                grains[j].esi =  (float) eframes / (float) grains[j].duration;
+                if(grainframes >= b_frames ){
+				  	error("grain size %.0ld is too long for buffer which is %ld",grainframes, b_frames);
+				  	grains[j].active = 0;
+				  	goto nextgrain;
+                }
+                if(minskip > b_frames - grainframes){//bad minskip
+				  	error("minskip time is illegal");
+				  	grains[j].phase = 0.0;
+				  	grains[j].endframe = grainframes - 1;
+                } else {
+                    if(maxskip > b_frames - grainframes){
+					  	grains[j].phase = granulesf_boundrand((float)minskip, (float) (b_frames - grainframes));
+					  	//post("1. minskip %d maxskip %d",minskip,b_frames - grainframes);
+                    } else {
+					  	grains[j].phase = granulesf_boundrand((float)minskip, (float)maxskip);
+					  	//post("2. minskip %d maxskip %d",minskip,maxskip);
+                    }
+                    grains[j].endframe = grains[j].phase + grainframes - 1;
+                }
+                
+                if( granulesf_boundrand(0.0,1.0) < retro_odds){//go backwards - make sure to test both boundaries
+				  	grains[j].si *= -1.0;
+				  	tmp = grains[j].phase;
+				  	grains[j].phase = grains[j].endframe;
+				  	grains[j].endframe = tmp;
+                }
+    			inserted = 1;
+                /*	post("startframe %f endframe %f increment %f e-incr %f grainframes %d bframes %d",
+                 grains[j].phase,grains[j].endframe,grains[j].si,grains[j].esi,grainframes, b_frames);*/
+    			
+    			goto nextgrain;
+    		}
+		}
+		if(! inserted){
+			error("granulesf~: could not insert grain");
+			return;
+		}
+    nextgrain: ;
+	}
+}
+
+void *granulesf_grain(t_granulesf *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	short inserted;
+	int j;
+	float duration, incr, amplitude, pan;
+	t_grain *grains;
+	long eframes;
+	long frames;
+	float sr;
+	float skip;
+
+	grains = x->grains;
+	eframes = x->windowbuf->b_frames;
+	frames = x->wavebuf->b_frames;
+	sr = x->sr;
+	
+	if(argc < 5){
+		error("grain takes 5 arguments, not %d",argc);
+		post("duration increment amplitude pan skip(in ms)");
+		return 0;
+	}
+	duration = atom_getintarg(0,argc,argv);
+	incr = atom_getfloatarg(1,argc,argv); // in ms
+	amplitude = atom_getfloatarg(2,argc,argv);
+	pan = atom_getfloatarg(3,argc,argv);
+	skip = atom_getfloatarg(4,argc,argv) * .001 * sr;
+	if(skip < 0){
+		error("negative skip is illegal");
+		return 0;
+	}
+	if(skip >= frames){
+		error("skip exceeds length of buffer");
+		return 0;
+	}
+	if(incr == 0.0){
+		error("zero increment prohibited");
+		return 0;
+	}
+	if(duration <= 0.0){
+		error("illegal duration:%f",duration);
+		return 0;
+	}
+	if(pan < 0.0 || pan > 1.0){
+		error("illegal pan:%f",pan);
+		return 0;
+	}
+    inserted = 0;
+    for(j = 0; j < MAXGRAINS; j++ ){
+        if(!grains[j].active){
+            grains[j].delay = 0.0;// immediate deployment
+            grains[j].duration = (long) (.001 * x->sr * duration);
+            grains[j].phase = skip;
+            grains[j].ephase = 0.0;
+            grains[j].amplitude = amplitude * .707;
+            grains[j].panL = amplitude * cos(pan * PIOVERTWO);
+            grains[j].panR = amplitude * sin(pan * PIOVERTWO);
+            grains[j].esi =  (float)eframes / (float)grains[j].duration;
+            grains[j].si = incr;
+            grains[j].active = 1;
+            return 0;
+        }
+    }
+    
+    error("could not insert grain");
+    return 0;
+    
+}
+
+float granulesf_boundrand(float min, float max)
+{
+	return min + (max-min) * ((float) (rand() % RAND_MAX)/ (float) RAND_MAX);
+}
+
+
+void *granulesf_new(t_symbol *msg, short argc, t_atom *argv)
+{
+
+    t_granulesf *x = (t_granulesf *)pd_new(granulesf_class);
+    outlet_new(&x->x_obj, gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+    x->wavebuf = (t_pdbuffer*)malloc(sizeof(t_pdbuffer));
+    x->windowbuf = (t_pdbuffer*)malloc(sizeof(t_pdbuffer));
+	srand(time(0)); //need "seed" message
+    
+	x->pitchscale = (float *) t_getbytes(MAXSCALE * sizeof(float));
+	x->grains = (t_grain *) t_getbytes(MAXGRAINS * sizeof(t_grain));
+	
+    
+	// default names
+	x->wavename = gensym("waveform");
+	x->windowname = gensym("window");
+
+    
+    // apparently Pd lacks this Max/MSP bug
+	x->wavename = atom_getsymbolarg(0,argc,argv);
+	x->windowname = atom_getsymbolarg(1,argc,argv);
+
+    
+	x->sr = sys_getsr();
+	if(! x->sr )
+		x->sr = 44100;
+    
+	granulesf_init(x,0);
+    
+    
+    return (x);
+}
+
+void granulesf_init(t_granulesf *x,short initialized)
+{
+	int i;
+	
+	if(!initialized){
+		x->pitchsteps = 0; // we could predefine a 12t scale
+		x->mute = 0;
+		x->steady = 0;
+		x->events = 1; // set to 10 LATER
+		x->horizon_ms = 1000;
+		x->min_incr = 0.5;
+		x->max_incr = 2.0;
+		x->minpan = .1;
+		x->maxpan = .9;
+		x->minamp = .1;
+		x->maxamp = 1.0;
+		x->mindur_ms = 150;
+		x->maxdur_ms = 750;
+		x->transpose = 1.0;
+		x->pitch_deviation = 0.0;
+		x->lowblock_increment = 0.0; // by default we do not block any increments
+		x->highblock_increment = 0.0; // ditto
+		x->constrain_scale = 0;
+		x->retro_odds = 0.5;// after testing, set this to zero
+		x->maxskip = -1;//flag to reset in setbuf SHOULD BE -1
+		x->nopan = 0;//panning is on by default
+		x->interpolate = 1;
+		x->interpolate_envelope = 0;
+	}
+	x->horizon = x->horizon_ms * .001 * x->sr;
+	x->mindur = x->mindur_ms * .001 * x->sr;
+	x->maxdur = x->maxdur_ms * .001 * x->sr;
+	for( i = 0; i < MAXGRAINS; i++ ){ // this is what we test for a legal place to insert grain
+		x->grains[i].active = 0;
+	}
+}
+
+void granulesf_info(t_granulesf *x)
+{
+	int tcount = 0;
+	t_grain *grains = x->grains;
+    //	long eframes = x->windowbuf->b_frames;
+	int i;
+	
+	for(i = 0; i < MAXGRAINS; i++ ){
+		if(grains[i].active)
+			++tcount;
+	}
+	post("%d active grains", tcount);
+	post("wavename %s", x->wavename->s_name);
+	post("windowname %s", x->windowname->s_name);
+	post("sample size: %d",x->wavebuf->b_frames);
+}
+
+
+void *granulesf_grist(t_granulesf *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	if(argc < 10 ){
+		error("grist takes 10 arguments:");
+		post("events horizon min_incr max_incr minpan maxpan minamp maxamp mindur maxdur");
+		return 0;
+	}
+	x->events = atom_getintarg(0,argc,argv);
+	x->horizon_ms = atom_getfloatarg(1,argc,argv);
+	x->min_incr = atom_getfloatarg(2,argc,argv);
+	x->max_incr = atom_getfloatarg(3,argc,argv);
+	x->minpan = atom_getfloatarg(4,argc,argv);
+	x->maxpan = atom_getfloatarg(5,argc,argv);
+	x->minamp = atom_getfloatarg(6,argc,argv);
+	x->maxamp = atom_getfloatarg(7,argc,argv);
+	x->mindur_ms = atom_getfloatarg(8,argc,argv);
+	x->maxdur_ms = atom_getfloatarg(9,argc,argv);
+	
+	x->mindur = .001 * x->sr * x->mindur_ms ;
+	x->maxdur = .001 * x->sr * x->maxdur_ms;
+	x->horizon = .001 * x->sr * x->horizon_ms;
+	
+	if(x->min_incr < 0){
+		x->min_incr *= -1.0;
+	}
+	if(x->max_incr < 0){
+		x->max_incr *= -1.0;
+	}
+	if(x->minpan < 0.0) {
+		x->minpan = 0.0;
+	}
+	if(x->maxpan > 1.0) {
+		x->maxpan = 1.0;
+	}
+	if(x->events < 0){
+		x->events = 0;
+	}
+	return 0;
+}
+
+
+void granulesf_reload(t_granulesf *x)
+{
+	granulesf_setbuf(x, x->wavename, x->windowname);
+}
+
+
+void granulesf_setbuf(t_granulesf *x, t_symbol *wavename, t_symbol *windowname)
+{
+    t_garray *a;
+    int frames;
+    
+    x->hosed = 0;
+    x->wavebuf->b_frames = 0;
+    x->windowbuf->b_frames = 0;
+    x->wavebuf->b_nchans = 1;//unused, should kill
+    x->windowbuf->b_nchans = 1;  //unused, should kill
+    x->b_nchans = 1;
+    
+    /* load up sample array */
+    if (!(a = (t_garray *)pd_findbyclass(wavename, garray_class))) {
+        if (*wavename->s_name) pd_error(x, "granulesf~: %s: no such array", wavename->s_name);
+        x->hosed = 1;
+    }
+    else if (!garray_getfloatwords(a, &frames, &x->wavebuf->b_samples)) {
+        pd_error(x, "%s: bad template for granulesf~", wavename->s_name);
+        x->hosed = 1;
+    }
+    else  {
+        x->wavebuf->b_frames = frames;
+        x->b_nchans = 1; // Pd buffers are always mono (so far)
+        garray_usedindsp(a);
+    }
+    
+    /* load up envelope array*/
+    if (!(a = (t_garray *)pd_findbyclass(windowname, garray_class))) {
+        if (*wavename->s_name) pd_error(x, "granulesf~: %s: no such array", windowname->s_name);
+        x->hosed = 1;
+    }
+    else if (!garray_getfloatwords(a, &frames, &x->windowbuf->b_samples)) {
+        pd_error(x, "%s: bad template for granulesf~", windowname->s_name);
+        x->hosed = 1;
+    }
+    else  {
+        x->windowbuf->b_frames = frames;
+        garray_usedindsp(a);
+    }
+    
+    x->maxskip = x->wavebuf->b_frames - 1;
+}
+
+
+t_int *granulesf_performhose(t_int *w)
+{
+    //	t_granulesf *x = (t_granulesf *) (w[1]);
+	float *outputL = (t_float *)(w[3]);
+	float *outputR = (t_float *)(w[4]);
+	int n = (int) w[5];
+	while(n--) *outputL++ = *outputR++ = 0;
+	return (w+6);
+}
+
+t_int *granulesf_perform_no_interpolation(t_int *w)
+{
+	t_granulesf *x = (t_granulesf *) (w[1]);
+    //	float *in = (t_float *)(w[2]); // ignoring input
+	float *outputL = (t_float *)(w[3]);
+	float *outputR = (t_float *)(w[4]);
+	int n = (int) w[5];
+
+	t_pdbuffer *wavebuf = x->wavebuf;
+	t_pdbuffer *windowbuf = x->windowbuf;
+	t_word *wavetable = wavebuf->b_samples;
+	t_word *window = windowbuf->b_samples;
+	t_grain *grains = x->grains;
+	long b_nchans = x->b_nchans;
+	long b_frames = wavebuf->b_frames;
+	short nopan = x->nopan;
+	float sample1, sample2;
+	float envelope;
+	float amplitude;
+	float panL, panR;
+	float si;
+	float esi;
+	float phase;
+	float ephase;
+	long delay;
+	long eframes = windowbuf->b_frames;
+	long current_index;
+	int i,j;
+	
+    
+	/* grain parameters */
+    
+    
+	if( x->mute ){
+		while(n--) *outputL++ = *outputR++ = 0;
+		return (w+6);
+	}
+    
+    // pre-clean buffer
+	for( i = 0; i < n; i++ ){
+		outputL[i] = outputR[i] = 0;
+	}
+    
+	for (j=0; j<MAXGRAINS; j++) {
+        
+		if(!grains[j].active){
+			goto nextgrain;
+		}
+		amplitude = grains[j].amplitude;
+		si =  grains[j].si;
+		esi = grains[j].esi;
+		phase =  grains[j].phase;
+		ephase = grains[j].ephase;
+		delay =  grains[j].delay;
+		panL = grains[j].panL;
+		panR = grains[j].panR;
+        
+		
+		for(i = 0; i < n; i++ ){
+			if( delay > 0 ){
+				--delay;
+			}
+			if( delay <= 0 && ephase < eframes){
+                
+				envelope = amplitude * window[(int)ephase].w_float;// interpolate please!
+				
+				if(b_nchans == 1){
+					sample1 = wavetable[(int)phase].w_float;
+					sample1 *= envelope;
+					if(nopan){
+						sample1 *= amplitude; // center it
+						outputL[i] += sample1;
+						outputR[i] += sample1;
+					} else {
+						outputL[i] += panL * sample1;
+						outputR[i] += panR * sample1;
+					}
+				} else if(b_nchans == 2){
+                    if(phase < 0 || phase >= b_frames){
+                        error("phase %f is out of bounds",phase);
+                        goto nextgrain;
+                    }
+					current_index = (long)(phase * 2.0);
+					sample1 = wavetable[current_index].w_float;
+					sample2 = wavetable[current_index+1].w_float;
+					sample1 *= envelope;
+					sample2 *= envelope;
+					if(nopan){
+						outputL[i] += sample1 * amplitude;
+						outputR[i] += sample2 * amplitude;
+					} else {
+						outputL[i] += panL * sample1;
+						outputR[i] += panR * sample2;
+					}
+				}
+                
+                /*this will be gritty so be sure to interpolate both envelope and sample-lookup */
+				
+                
+				phase += si;
+				if(phase < 0 || phase >= b_frames){
+					error("phase %f out of bounds",phase);
+					grains[j].active = 0;
+					goto nextgrain;
+				}
+				ephase += esi;
+                
+                
+				if( ephase >= eframes ){
+					grains[j].active = 0;
+					goto nextgrain; // must escape loop now
+				}
+                
+			}
+		}
+		grains[j].phase = phase;
+		grains[j].ephase = ephase;
+		grains[j].delay = delay;
+		
+    nextgrain: ;
+	}
+    
+	return (w+6);
+}
+
+t_int *granulesf_perform(t_int *w)
+{
+	t_granulesf *x = (t_granulesf *) (w[1]);
+    //	float *in = (t_float *)(w[2]); // ignoring input
+	float *outputL = (t_float *)(w[3]);
+	float *outputR = (t_float *)(w[4]);
+	int n = (int) w[5];
+
+	t_pdbuffer *wavebuf = x->wavebuf;
+	t_pdbuffer *windowbuf = x->windowbuf;
+	t_word *wavetable = wavebuf->b_samples;
+	t_word *window = windowbuf->b_samples;
+	t_grain *grains = x->grains;
+	long b_nchans = x->b_nchans;
+	long b_frames = wavebuf->b_frames;
+	short nopan = x->nopan;
+	short interpolate_envelope = x->interpolate_envelope;
+	float sample1, sample2;
+	float envelope;
+	float amplitude;
+	float panL, panR;
+	float si;
+	float esi;
+	float phase;
+	float ephase;
+	long delay;
+	long eframes = windowbuf->b_frames;
+	long current_index;
+	float tsmp1, tsmp2;
+	float frac;
+	int i,j;
+	
+	if( x->mute ){
+		while(n--) *outputL++ = *outputR++ = 0;
+		return (w+6);
+	}
+    
+    // pre-clean buffer
+	for( i = 0; i < n; i++ ){
+		outputL[i] = outputR[i] = 0;
+	}
+    
+	for (j=0; j<MAXGRAINS; j++) {
+        
+		if(!grains[j].active){
+			goto nextgrain;
+		}
+		amplitude = grains[j].amplitude;
+		si =  grains[j].si;
+		esi = grains[j].esi;
+		phase =  grains[j].phase;
+		ephase = grains[j].ephase;
+		delay =  grains[j].delay;
+		panL = grains[j].panL;
+		panR = grains[j].panR;
+        
+		
+		for(i = 0; i < n; i++ ){
+			if( delay > 0 ){
+				--delay;
+			}
+			if( delay <= 0 && ephase < eframes){
+                
+                if(interpolate_envelope){
+                    current_index = floor((double)ephase);
+                    frac = ephase - current_index;
+                    if(current_index == 0 || current_index == eframes - 1 || frac == 0.0){// boundary conditions
+                        envelope = window[current_index].w_float;
+                    } else {
+                        tsmp1 = window[current_index].w_float;
+                        tsmp2 = window[current_index + 1].w_float;
+                        envelope = tsmp1 + frac * (tsmp2 - tsmp1);
+                    }
+                } else {
+					// envelope = amplitude * window[(int)ephase];
+					envelope = window[(int)ephase].w_float;// amplitude built into panL and panR
+				}
+				if(b_nchans == 1){
+                    if(phase < 0 || phase >= b_frames){
+                        error("phase %f is out of bounds",phase);
+                        goto nextgrain;
+                    }
+                    current_index = floor((double)phase);
+                    frac = phase - current_index;
+                    if(current_index == 0 || current_index == b_frames - 1 || frac == 0.0){// boundary conditions
+                        sample1 = wavetable[current_index].w_float;
+                    } else {
+                        tsmp1 = wavetable[current_index].w_float;
+                        tsmp2 = wavetable[current_index + 1].w_float;
+                        sample1 = tsmp1 + frac * (tsmp2 - tsmp1);
+                    }
+					sample1 *= envelope;
+					if(nopan){
+						sample1 *= amplitude; // center it
+						/* accumulate grain samples into output buffer */
+						outputL[i] += sample1;
+						outputR[i] += sample1;
+					} else {
+						outputL[i] += panL * sample1;
+						outputR[i] += panR * sample1;
+					}
+				} else if(b_nchans == 2){
+                    if(phase < 0 || phase >= b_frames){
+                        error("phase %f is out of bounds",phase);
+                        goto nextgrain;
+                    }
+                    current_index = floor((double)phase);
+                    frac = phase - current_index;
+                    current_index <<= 1;// double it
+					if(current_index == 0 || current_index == b_frames - 1 || frac == 0.0){
+						sample1 = wavetable[current_index].w_float;
+						sample2 = wavetable[current_index+1].w_float;
+					} else {
+                        tsmp1 = wavetable[current_index].w_float;
+                        tsmp2 = wavetable[current_index + 2].w_float;
+                        sample1 = tsmp1 + frac * (tsmp2 - tsmp1);
+                        tsmp1 = wavetable[current_index + 1].w_float;
+                        tsmp2 = wavetable[current_index + 3].w_float;
+                        sample2 = tsmp1 + frac * (tsmp2 - tsmp1);
+					}
+                    
+					sample1 *= envelope;
+					sample2 *= envelope;
+					
+					if(nopan){
+						outputL[i] += sample1 * amplitude;
+						outputR[i] += sample2 * amplitude;
+					} else {
+						outputL[i] += panL * sample1;
+						outputR[i] += panR * sample2;
+					}
+				}
+				
+				phase += si;
+				if(phase < 0 || phase >= b_frames){
+					error("phase %f out of bounds",phase);
+					grains[j].active = 0;
+					goto nextgrain;
+				}
+				ephase += esi;
+                
+                
+				if( ephase >= eframes ){
+					grains[j].active = 0;
+					goto nextgrain; // must escape loop now
+				}
+                
+			} 
+		} 		
+		grains[j].phase = phase;
+		grains[j].ephase = ephase;
+		grains[j].delay = delay;
+		
+    nextgrain: ;
+	}
+	return (w+6);
+}
+
+void granulesf_dsp_free(t_granulesf *x)
+{
+	t_freebytes(x->grains, MAXGRAINS * sizeof(t_grain));
+	t_freebytes(x->pitchscale, MAXSCALE * sizeof(float));
+}
+
+void granulesf_dsp(t_granulesf *x, t_signal **sp)
+{
+    
+	granulesf_reload(x);
+	
+	if( x->hosed ){
+		post("You need some valid buffers");
+		dsp_add(granulesf_performhose, 5, x, 
+                sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
+		return;
+	}
+	if( x->sr != sp[0]->s_sr){
+		x->sr = sp[0]->s_sr;
+		if( !x->sr ){
+			post("warning: zero sampling rate!");
+			x->sr = 44100;
+		}
+		granulesf_init(x,1);
+	} 
+	if(x->interpolate){
+		dsp_add(granulesf_perform, 5, x, 
+                sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
+	} else {
+		dsp_add(granulesf_perform_no_interpolation, 5, x, 
+                sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
+	}
+}
+
diff --git a/externals/lyonpotpourri/granule~-help.pd b/externals/lyonpotpourri/granule~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..76c0ff9f19c8eff85e48b4ba825c3d6c14c23c12
--- /dev/null
+++ b/externals/lyonpotpourri/granule~-help.pd
@@ -0,0 +1,2387 @@
+#N canvas 205 39 516 500 10;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array waveform 8192 float 3;
+#A 0 0 0.00262835 0.00525669 0.00788498 0.0105132 0.0131414 0.0157695
+0.0183974 0.0210252 0.0236529 0.0262804 0.0289077 0.0315348 0.0341617
+0.0367883 0.0394147 0.0420408 0.0446666 0.047292 0.0499172 0.0525419
+0.0551663 0.0577903 0.0604139 0.063037 0.0656597 0.0682819 0.0709036
+0.0735248 0.0761455 0.0787656 0.0813852 0.0840042 0.0866226 0.0892403
+0.0918574 0.0944739 0.0970896 0.0997047 0.102319 0.104933 0.107546
+0.110158 0.112769 0.115379 0.117989 0.120598 0.123206 0.125813 0.128419
+0.131024 0.133629 0.136232 0.138834 0.141436 0.144036 0.146635 0.149234
+0.151831 0.154427 0.157022 0.159616 0.162208 0.1648 0.16739 0.169979
+0.172567 0.175154 0.177739 0.180323 0.182906 0.185488 0.188068 0.190647
+0.193224 0.195801 0.198375 0.200948 0.20352 0.206091 0.20866 0.211227
+0.213793 0.216357 0.21892 0.221481 0.224041 0.226599 0.229155 0.23171
+0.234263 0.236814 0.239364 0.241912 0.244458 0.247003 0.249546 0.252086
+0.254626 0.257163 0.259698 0.262232 0.264764 0.267293 0.269821 0.272347
+0.274871 0.277393 0.279913 0.282432 0.284948 0.287462 0.289973 0.292483
+0.294991 0.297497 0.3 0.302502 0.305001 0.307498 0.309993 0.312485
+0.314976 0.317464 0.319949 0.322433 0.324914 0.327393 0.32987 0.332344
+0.334816 0.337285 0.339752 0.342217 0.344679 0.347139 0.349596 0.35205
+0.354503 0.356952 0.359399 0.361844 0.364286 0.366725 0.369162 0.371596
+0.374027 0.376456 0.378882 0.381306 0.383726 0.386144 0.388559 0.390972
+0.393381 0.395788 0.398192 0.400593 0.402991 0.405387 0.407779 0.410169
+0.412555 0.414939 0.41732 0.419698 0.422072 0.424444 0.426813 0.429179
+0.431541 0.433901 0.436257 0.438611 0.440961 0.443308 0.445652 0.447993
+0.45033 0.452665 0.454996 0.457324 0.459649 0.46197 0.464288 0.466603
+0.468915 0.471223 0.473528 0.475829 0.478127 0.480422 0.482713 0.485001
+0.487285 0.489566 0.491844 0.494118 0.496388 0.498655 0.500919 0.503179
+0.505435 0.507688 0.509937 0.512182 0.514424 0.516662 0.518897 0.521128
+0.523355 0.525578 0.527798 0.530014 0.532226 0.534435 0.53664 0.53884
+0.541038 0.543231 0.54542 0.547606 0.549788 0.551965 0.554139 0.556309
+0.558475 0.560637 0.562796 0.56495 0.5671 0.569246 0.571388 0.573526
+0.575661 0.577791 0.579917 0.582038 0.584156 0.58627 0.588379 0.590485
+0.592586 0.594683 0.596776 0.598864 0.600949 0.603029 0.605105 0.607176
+0.609244 0.611307 0.613366 0.61542 0.61747 0.619516 0.621558 0.623595
+0.625628 0.627656 0.62968 0.631699 0.633714 0.635725 0.637731 0.639733
+0.64173 0.643723 0.645711 0.647694 0.649673 0.651648 0.653618 0.655583
+0.657544 0.6595 0.661452 0.663399 0.665341 0.667279 0.669212 0.67114
+0.673064 0.674983 0.676897 0.678806 0.680711 0.682611 0.684506 0.686396
+0.688282 0.690163 0.692039 0.69391 0.695776 0.697638 0.699494 0.701346
+0.703193 0.705035 0.706872 0.708704 0.710531 0.712353 0.714171 0.715983
+0.71779 0.719593 0.72139 0.723182 0.72497 0.726752 0.728529 0.730301
+0.732068 0.73383 0.735587 0.737339 0.739086 0.740827 0.742564 0.744295
+0.746021 0.747742 0.749458 0.751168 0.752874 0.754574 0.756269 0.757959
+0.759643 0.761322 0.762996 0.764665 0.766328 0.767986 0.769639 0.771287
+0.772929 0.774566 0.776197 0.777823 0.779444 0.78106 0.78267 0.784274
+0.785873 0.787467 0.789056 0.790639 0.792216 0.793788 0.795355 0.796916
+0.798472 0.800022 0.801567 0.803106 0.80464 0.806168 0.807691 0.809208
+0.810719 0.812225 0.813726 0.81522 0.81671 0.818194 0.819672 0.821144
+0.822611 0.824072 0.825528 0.826978 0.828422 0.829861 0.831294 0.832721
+0.834143 0.835559 0.836969 0.838374 0.839773 0.841166 0.842553 0.843935
+0.845311 0.846681 0.848045 0.849404 0.850757 0.852104 0.853445 0.854781
+0.85611 0.857434 0.858752 0.860065 0.861371 0.862672 0.863966 0.865255
+0.866538 0.867815 0.869087 0.870352 0.871612 0.872865 0.874113 0.875355
+0.876591 0.877821 0.879045 0.880263 0.881475 0.882682 0.883882 0.885076
+0.886265 0.887447 0.888624 0.889794 0.890959 0.892117 0.89327 0.894416
+0.895557 0.896691 0.89782 0.898942 0.900059 0.901169 0.902274 0.903372
+0.904464 0.90555 0.906631 0.907705 0.908773 0.909835 0.910891 0.911941
+0.912984 0.914022 0.915054 0.916079 0.917098 0.918112 0.919119 0.92012
+0.921115 0.922103 0.923086 0.924062 0.925033 0.925997 0.926955 0.927907
+0.928853 0.929792 0.930726 0.931653 0.932574 0.933489 0.934398 0.935301
+0.936197 0.937087 0.937971 0.938849 0.939721 0.940586 0.941445 0.942298
+0.943145 0.943986 0.94482 0.945648 0.94647 0.947286 0.948096 0.948899
+0.949696 0.950487 0.951271 0.95205 0.952822 0.953588 0.954347 0.955101
+0.955848 0.956589 0.957323 0.958052 0.958774 0.95949 0.960199 0.960903
+0.9616 0.962291 0.962975 0.963654 0.964325 0.964991 0.965651 0.966304
+0.966951 0.967591 0.968226 0.968854 0.969476 0.970091 0.9707 0.971303
+0.9719 0.97249 0.973074 0.973652 0.974224 0.974789 0.975348 0.975901
+0.976447 0.976987 0.977521 0.978049 0.97857 0.979085 0.979593 0.980096
+0.980592 0.981082 0.981565 0.982042 0.982513 0.982978 0.983436 0.983888
+0.984334 0.984773 0.985206 0.985633 0.986054 0.986468 0.986876 0.987278
+0.987674 0.988063 0.988446 0.988822 0.989193 0.989557 0.989915 0.990266
+0.990612 0.990951 0.991283 0.99161 0.99193 0.992244 0.992552 0.992853
+0.993148 0.993437 0.993719 0.993996 0.994266 0.99453 0.994787 0.995039
+0.995284 0.995523 0.995755 0.995982 0.996202 0.996416 0.996624 0.996825
+0.99702 0.997209 0.997392 0.997569 0.997739 0.997903 0.998061 0.998213
+0.998358 0.998498 0.998631 0.998758 0.998878 0.998993 0.999101 0.999203
+0.999299 0.999389 0.999473 0.99955 0.999622 0.999687 0.999746 0.999798
+0.999845 0.999886 0.99992 0.999948 0.99997 0.999986 0.999996 1 0.999998
+0.999989 0.999974 0.999954 0.999927 0.999894 0.999855 0.99981 0.999759
+0.999701 0.999638 0.999569 0.999493 0.999412 0.999324 0.99923 0.999131
+0.999025 0.998913 0.998795 0.998672 0.998542 0.998406 0.998264 0.998116
+0.997962 0.997802 0.997636 0.997464 0.997287 0.997103 0.996913 0.996717
+0.996516 0.996308 0.996094 0.995875 0.995649 0.995418 0.995181 0.994938
+0.994688 0.994433 0.994172 0.993906 0.993633 0.993354 0.99307 0.99278
+0.992483 0.992182 0.991874 0.99156 0.99124 0.990915 0.990584 0.990247
+0.989904 0.989556 0.989201 0.988841 0.988475 0.988103 0.987726 0.987343
+0.986954 0.986559 0.986158 0.985752 0.98534 0.984923 0.9845 0.98407
+0.983636 0.983195 0.982749 0.982298 0.98184 0.981377 0.980909 0.980434
+0.979954 0.979469 0.978978 0.978481 0.977979 0.977471 0.976957 0.976438
+0.975913 0.975383 0.974847 0.974306 0.973759 0.973207 0.972649 0.972086
+0.971517 0.970942 0.970363 0.969777 0.969187 0.96859 0.967989 0.967382
+0.966769 0.966151 0.965528 0.964899 0.964265 0.963625 0.962981 0.96233
+0.961675 0.961014 0.960348 0.959676 0.958999 0.958317 0.957629 0.956937
+0.956239 0.955535 0.954827 0.954113 0.953394 0.952669 0.95194 0.951205
+0.950465 0.94972 0.94897 0.948214 0.947454 0.946688 0.945917 0.945141
+0.944359 0.943573 0.942782 0.941985 0.941184 0.940377 0.939565 0.938749
+0.937927 0.9371 0.936268 0.935431 0.934589 0.933743 0.932891 0.932034
+0.931172 0.930306 0.929434 0.928558 0.927676 0.92679 0.925898 0.925002
+0.924101 0.923196 0.922285 0.921369 0.920449 0.919524 0.918594 0.917659
+0.91672 0.915775 0.914826 0.913873 0.912914 0.911951 0.910983 0.91001
+0.909033 0.908051 0.907064 0.906073 0.905077 0.904076 0.903071 0.902061
+0.901047 0.900028 0.899004 0.897976 0.896943 0.895906 0.894864 0.893818
+0.892767 0.891712 0.890652 0.889588 0.888519 0.887446 0.886369 0.885287
+0.8842 0.883109 0.882014 0.880915 0.879811 0.878703 0.87759 0.876473
+0.875352 0.874227 0.873097 0.871963 0.870825 0.869682 0.868536 0.867385
+0.86623 0.86507 0.863907 0.862739 0.861567 0.860391 0.859211 0.858027
+0.856839 0.855646 0.85445 0.853249 0.852045 0.850836 0.849623 0.848406
+0.847186 0.845961 0.844732 0.8435 0.842263 0.841023 0.839778 0.83853
+0.837278 0.836022 0.834762 0.833498 0.83223 0.830959 0.829683 0.828404
+0.827121 0.825835 0.824544 0.82325 0.821952 0.82065 0.819345 0.818036
+0.816723 0.815407 0.814087 0.812763 0.811436 0.810105 0.80877 0.807432
+0.80609 0.804745 0.803396 0.802044 0.800688 0.799329 0.797966 0.796599
+0.79523 0.793856 0.79248 0.7911 0.789716 0.788329 0.786939 0.785545
+0.784148 0.782748 0.781344 0.779937 0.778527 0.777113 0.775697 0.774277
+0.772853 0.771427 0.769997 0.768564 0.767128 0.765689 0.764246 0.762801
+0.761352 0.7599 0.758445 0.756987 0.755526 0.754062 0.752595 0.751125
+0.749652 0.748175 0.746696 0.745214 0.743729 0.742241 0.74075 0.739256
+0.737759 0.73626 0.734757 0.733252 0.731744 0.730233 0.728719 0.727202
+0.725683 0.724161 0.722636 0.721108 0.719578 0.718045 0.716509 0.71497
+0.713429 0.711885 0.710339 0.70879 0.707238 0.705684 0.704127 0.702568
+0.701006 0.699442 0.697875 0.696305 0.694733 0.693159 0.691582 0.690003
+0.688421 0.686837 0.68525 0.683661 0.68207 0.680476 0.67888 0.677282
+0.675681 0.674078 0.672473 0.670866 0.669256 0.667644 0.66603 0.664413
+0.662795 0.661174 0.659551 0.657926 0.656299 0.65467 0.653038 0.651405
+0.649769 0.648131 0.646492 0.64485 0.643206 0.64156 0.639913 0.638263
+0.636611 0.634958 0.633302 0.631645 0.629985 0.628324 0.626661 0.624996
+0.62333 0.621661 0.619991 0.618318 0.616645;
+#A 1000 0.614969 0.613292 0.611612 0.609931 0.608249 0.606565 0.604879
+0.603191 0.601502 0.599811 0.598118 0.596424 0.594729 0.593032 0.591333
+0.589632 0.587931 0.586227 0.584522 0.582816 0.581108 0.579399 0.577689
+0.575976 0.574263 0.572548 0.570832 0.569114 0.567395 0.565675 0.563954
+0.562231 0.560507 0.558781 0.557054 0.555327 0.553597 0.551867 0.550136
+0.548403 0.546669 0.544934 0.543198 0.54146 0.539722 0.537983 0.536242
+0.5345 0.532758 0.531014 0.529269 0.527523 0.525777 0.524029 0.52228
+0.520531 0.51878 0.517029 0.515276 0.513523 0.511769 0.510014 0.508258
+0.506502 0.504744 0.502986 0.501227 0.499467 0.497707 0.495946 0.494184
+0.492421 0.490658 0.488893 0.487129 0.485363 0.483597 0.481831 0.480063
+0.478296 0.476527 0.474758 0.472989 0.471218 0.469448 0.467677 0.465905
+0.464133 0.462361 0.460588 0.458814 0.45704 0.455266 0.453491 0.451716
+0.449941 0.448165 0.446389 0.444613 0.442836 0.441059 0.439282 0.437504
+0.435727 0.433949 0.43217 0.430392 0.428613 0.426835 0.425056 0.423277
+0.421497 0.419718 0.417938 0.416159 0.414379 0.4126 0.41082 0.40904
+0.40726 0.40548 0.4037 0.401921 0.400141 0.398361 0.396581 0.394802
+0.393022 0.391243 0.389464 0.387685 0.385905 0.384127 0.382348 0.380569
+0.378791 0.377013 0.375235 0.373457 0.37168 0.369903 0.368126 0.36635
+0.364573 0.362797 0.361022 0.359246 0.357472 0.355697 0.353923 0.352149
+0.350376 0.348603 0.346831 0.345059 0.343287 0.341516 0.339746 0.337976
+0.336206 0.334437 0.332669 0.330901 0.329134 0.327367 0.325601 0.323835
+0.32207 0.320306 0.318543 0.31678 0.315018 0.313256 0.311495 0.309735
+0.307976 0.306217 0.304459 0.302702 0.300946 0.29919 0.297435 0.295682
+0.293928 0.292176 0.290425 0.288674 0.286925 0.285176 0.283428 0.281681
+0.279935 0.27819 0.276446 0.274703 0.272961 0.27122 0.26948 0.267741
+0.266003 0.264266 0.26253 0.260795 0.259061 0.257328 0.255597 0.253866
+0.252137 0.250409 0.248682 0.246956 0.245231 0.243507 0.241785 0.240064
+0.238344 0.236626 0.234908 0.233192 0.231477 0.229764 0.228051 0.22634
+0.224631 0.222922 0.221215 0.21951 0.217806 0.216103 0.214401 0.212701
+0.211003 0.209305 0.20761 0.205915 0.204222 0.202531 0.200841 0.199153
+0.197466 0.19578 0.194096 0.192414 0.190733 0.189054 0.187376 0.1857
+0.184026 0.182353 0.180682 0.179012 0.177344 0.175678 0.174013 0.17235
+0.170689 0.169029 0.167371 0.165715 0.16406 0.162408 0.160757 0.159107
+0.15746 0.155814 0.15417 0.152528 0.150888 0.149249 0.147613 0.145978
+0.144345 0.142714 0.141084 0.139457 0.137831 0.136208 0.134586 0.132966
+0.131349 0.129733 0.128119 0.126507 0.124897 0.123289 0.121683 0.120079
+0.118477 0.116877 0.115279 0.113683 0.112089 0.110497 0.108908 0.10732
+0.105734 0.104151 0.10257 0.10099 0.0994133 0.0978384 0.0962655 0.0946949
+0.0931263 0.09156 0.0899959 0.0884339 0.0868741 0.0853166 0.0837613
+0.0822082 0.0806573 0.0791087 0.0775624 0.0760183 0.0744765 0.0729369
+0.0713997 0.0698647 0.0683321 0.0668018 0.0652738 0.0637482 0.0622248
+0.0607039 0.0591853 0.0576691 0.0561552 0.0546438 0.0531347 0.051628
+0.0501238 0.048622 0.0471225 0.0456256 0.0441311 0.042639 0.0411494
+0.0396623 0.0381776 0.0366954 0.0352157 0.0337386 0.0322639 0.0307917
+0.0293221 0.027855 0.0263905 0.0249285 0.023469 0.0220122 0.0205579
+0.0191061 0.017657 0.0162105 0.0147665 0.0133252 0.0118865 0.0104504
+0.00901695 0.00758612 0.00615795 0.00473244 0.00330959 0.0018894 0.000471906
+-0.00094293 -0.00235504 -0.00376449 -0.00517121 -0.00657521 -0.00797651
+-0.0093751 -0.0107709 -0.012164 -0.0135544 -0.014942 -0.0163268 -0.0177089
+-0.0190882 -0.0204647 -0.0218384 -0.0232094 -0.0245775 -0.0259428 -0.0273054
+-0.0286651 -0.030022 -0.031376 -0.0327272 -0.0340756 -0.035421 -0.0367637
+-0.0381035 -0.0394404 -0.0407745 -0.0421056 -0.0434339 -0.0447593 -0.0460817
+-0.0474013 -0.048718 -0.0500317 -0.0513425 -0.0526504 -0.0539554 -0.0552574
+-0.0565565 -0.0578526 -0.0591457 -0.0604359 -0.0617231 -0.0630074 -0.0642887
+-0.065567 -0.0668423 -0.0681145 -0.0693838 -0.0706501 -0.0719134 -0.0731736
+-0.0744309 -0.0756851 -0.0769363 -0.0781844 -0.0794295 -0.0806716 -0.0819105
+-0.0831465 -0.0843793 -0.0856092 -0.0868359 -0.0880595 -0.0892801 -0.0904976
+-0.091712 -0.0929233 -0.0941315 -0.0953366 -0.0965386 -0.0977375 -0.0989332
+-0.100126 -0.101315 -0.102502 -0.103685 -0.104865 -0.106042 -0.107216
+-0.108386 -0.109554 -0.110718 -0.111879 -0.113037 -0.114192 -0.115344
+-0.116492 -0.117638 -0.11878 -0.119919 -0.121054 -0.122187 -0.123316
+-0.124442 -0.125565 -0.126685 -0.127801 -0.128914 -0.130024 -0.131131
+-0.132235 -0.133335 -0.134432 -0.135526 -0.136616 -0.137704 -0.138788
+-0.139869 -0.140946 -0.142021 -0.143092 -0.144159 -0.145224 -0.146285
+-0.147343 -0.148398 -0.149449 -0.150497 -0.151542 -0.152583 -0.153622
+-0.154657 -0.155688 -0.156717 -0.157742 -0.158763 -0.159782 -0.160797
+-0.161809 -0.162817 -0.163822 -0.164824 -0.165823 -0.166818 -0.16781
+-0.168798 -0.169784 -0.170765 -0.171744 -0.172719 -0.173691 -0.174659
+-0.175625 -0.176586 -0.177545 -0.1785 -0.179452 -0.1804 -0.181345 -0.182287
+-0.183226 -0.184161 -0.185092 -0.18602 -0.186945 -0.187867 -0.188785
+-0.1897 -0.190611 -0.19152 -0.192424 -0.193326 -0.194224 -0.195118
+-0.196009 -0.196897 -0.197782 -0.198663 -0.19954 -0.200415 -0.201286
+-0.202153 -0.203017 -0.203878 -0.204736 -0.20559 -0.20644 -0.207288
+-0.208131 -0.208972 -0.209809 -0.210643 -0.211473 -0.2123 -0.213123
+-0.213943 -0.21476 -0.215573 -0.216383 -0.21719 -0.217993 -0.218793
+-0.219589 -0.220382 -0.221172 -0.221958 -0.222741 -0.22352 -0.224296
+-0.225069 -0.225838 -0.226604 -0.227366 -0.228125 -0.228881 -0.229633
+-0.230382 -0.231127 -0.231869 -0.232608 -0.233343 -0.234075 -0.234804
+-0.235529 -0.23625 -0.236969 -0.237684 -0.238395 -0.239103 -0.239808
+-0.240509 -0.241207 -0.241902 -0.242593 -0.243281 -0.243965 -0.244647
+-0.245324 -0.245999 -0.246669 -0.247337 -0.248001 -0.248662 -0.249319
+-0.249973 -0.250624 -0.251271 -0.251915 -0.252556 -0.253193 -0.253827
+-0.254457 -0.255084 -0.255708 -0.256329 -0.256946 -0.257559 -0.25817
+-0.258777 -0.25938 -0.25998 -0.260577 -0.261171 -0.261761 -0.262348
+-0.262932 -0.263512 -0.264089 -0.264662 -0.265232 -0.265799 -0.266363
+-0.266923 -0.26748 -0.268033 -0.268583 -0.26913 -0.269674 -0.270214
+-0.270751 -0.271285 -0.271815 -0.272342 -0.272866 -0.273386 -0.273903
+-0.274417 -0.274928 -0.275435 -0.275939 -0.276439 -0.276937 -0.277431
+-0.277922 -0.278409 -0.278893 -0.279374 -0.279852 -0.280326 -0.280798
+-0.281265 -0.28173 -0.282191 -0.28265 -0.283105 -0.283556 -0.284005
+-0.28445 -0.284892 -0.28533 -0.285766 -0.286198 -0.286627 -0.287053
+-0.287475 -0.287895 -0.288311 -0.288724 -0.289133 -0.28954 -0.289943
+-0.290343 -0.29074 -0.291134 -0.291524 -0.291912 -0.292296 -0.292677
+-0.293055 -0.293429 -0.293801 -0.294169 -0.294534 -0.294896 -0.295255
+-0.295611 -0.295963 -0.296313 -0.296659 -0.297002 -0.297342 -0.297679
+-0.298013 -0.298344 -0.298671 -0.298996 -0.299317 -0.299635 -0.29995
+-0.300262 -0.300571 -0.300877 -0.30118 -0.30148 -0.301776 -0.30207
+-0.30236 -0.302648 -0.302932 -0.303214 -0.303492 -0.303767 -0.304039
+-0.304308 -0.304575 -0.304838 -0.305098 -0.305355 -0.305609 -0.30586
+-0.306108 -0.306353 -0.306595 -0.306834 -0.30707 -0.307303 -0.307533
+-0.307761 -0.307985 -0.308206 -0.308424 -0.308639 -0.308852 -0.309061
+-0.309268 -0.309471 -0.309672 -0.309869 -0.310064 -0.310256 -0.310445
+-0.310631 -0.310814 -0.310994 -0.311172 -0.311346 -0.311518 -0.311687
+-0.311852 -0.312015 -0.312175 -0.312333 -0.312487 -0.312639 -0.312787
+-0.312933 -0.313076 -0.313216 -0.313354 -0.313488 -0.31362 -0.313749
+-0.313875 -0.313999 -0.314119 -0.314237 -0.314352 -0.314465 -0.314574
+-0.314681 -0.314785 -0.314886 -0.314985 -0.31508 -0.315173 -0.315264
+-0.315351 -0.315436 -0.315518 -0.315598 -0.315675 -0.315749 -0.31582
+-0.315889 -0.315955 -0.316018 -0.316079 -0.316137 -0.316192 -0.316245
+-0.316295 -0.316342 -0.316387 -0.316429 -0.316469 -0.316506 -0.31654
+-0.316572 -0.316601 -0.316628 -0.316651 -0.316673 -0.316692 -0.316708
+-0.316722 -0.316733 -0.316741 -0.316747 -0.316751 -0.316752 -0.31675
+-0.316746 -0.31674 -0.316731 -0.316719 -0.316705 -0.316688 -0.316669
+-0.316648 -0.316624 -0.316597 -0.316568 -0.316537 -0.316503 -0.316467
+-0.316428 -0.316387 -0.316344 -0.316298 -0.316249 -0.316199 -0.316146
+-0.31609 -0.316032 -0.315972 -0.315909 -0.315844 -0.315777 -0.315707
+-0.315635 -0.315561 -0.315484 -0.315405 -0.315323 -0.31524 -0.315154
+-0.315065 -0.314975 -0.314882 -0.314787 -0.314689 -0.31459 -0.314488
+-0.314384 -0.314277 -0.314168 -0.314057 -0.313944 -0.313829 -0.313711
+-0.313592 -0.313469 -0.313345 -0.313219 -0.31309 -0.31296 -0.312827
+-0.312692 -0.312554 -0.312415 -0.312274 -0.31213 -0.311984 -0.311836
+-0.311686 -0.311534 -0.31138 -0.311224 -0.311065 -0.310905 -0.310742
+-0.310577 -0.310411 -0.310242 -0.310071 -0.309898 -0.309724 -0.309547
+-0.309368 -0.309187 -0.309004 -0.308819 -0.308632 -0.308443 -0.308252
+-0.308059 -0.307865 -0.307668 -0.307469 -0.307268 -0.307066 -0.306861
+-0.306655 -0.306446 -0.306236 -0.306024 -0.30581 -0.305594 -0.305376
+-0.305156 -0.304934 -0.304711 -0.304485 -0.304258 -0.304029 -0.303798
+-0.303566 -0.303331 -0.303095 -0.302856 -0.302617 -0.302375 -0.302131
+-0.301886 -0.301639 -0.30139 -0.301139 -0.300887 -0.300633 -0.300377
+-0.300119 -0.29986 -0.299599 -0.299336 -0.299072 -0.298806 -0.298538
+-0.298268 -0.297997 -0.297724 -0.29745 -0.297173 -0.296896 -0.296616
+-0.296335 -0.296052 -0.295768 -0.295482 -0.295194 -0.294905 -0.294614
+-0.294322 -0.294028 -0.293733 -0.293436 -0.293137 -0.292837 -0.292535
+-0.292232 -0.291927 -0.291621 -0.291313 -0.291003 -0.290693 -0.29038
+-0.290066 -0.289751 -0.289434 -0.289116 -0.288796 -0.288475 -0.288153
+-0.287829 -0.287503 -0.287176 -0.286848 -0.286518 -0.286187 -0.285854
+-0.28552 -0.285185 -0.284848 -0.28451 -0.284171 -0.28383 -0.283488
+-0.283145 -0.2828 -0.282454 -0.282106;
+#A 2000 -0.281757 -0.281407 -0.281056 -0.280703 -0.280349 -0.279994
+-0.279637 -0.27928 -0.278921 -0.27856 -0.278199 -0.277836 -0.277472
+-0.277107 -0.27674 -0.276372 -0.276004 -0.275633 -0.275262 -0.27489
+-0.274516 -0.274141 -0.273765 -0.273388 -0.27301 -0.27263 -0.27225
+-0.271868 -0.271485 -0.271101 -0.270716 -0.27033 -0.269943 -0.269555
+-0.269165 -0.268775 -0.268383 -0.267991 -0.267597 -0.267202 -0.266806
+-0.266409 -0.266012 -0.265613 -0.265213 -0.264812 -0.26441 -0.264007
+-0.263603 -0.263199 -0.262793 -0.262386 -0.261978 -0.261569 -0.26116
+-0.260749 -0.260338 -0.259925 -0.259512 -0.259097 -0.258682 -0.258266
+-0.257849 -0.257431 -0.257012 -0.256593 -0.256172 -0.255751 -0.255329
+-0.254905 -0.254481 -0.254057 -0.253631 -0.253205 -0.252777 -0.252349
+-0.25192 -0.251491 -0.25106 -0.250629 -0.250197 -0.249764 -0.249331
+-0.248896 -0.248461 -0.248025 -0.247589 -0.247151 -0.246713 -0.246275
+-0.245835 -0.245395 -0.244954 -0.244513 -0.24407 -0.243627 -0.243184
+-0.242739 -0.242294 -0.241849 -0.241403 -0.240956 -0.240508 -0.24006
+-0.239611 -0.239162 -0.238711 -0.238261 -0.23781 -0.237358 -0.236905
+-0.236452 -0.235998 -0.235544 -0.23509 -0.234634 -0.234178 -0.233722
+-0.233265 -0.232807 -0.232349 -0.231891 -0.231432 -0.230972 -0.230512
+-0.230051 -0.22959 -0.229129 -0.228667 -0.228204 -0.227741 -0.227278
+-0.226814 -0.226349 -0.225885 -0.225419 -0.224954 -0.224487 -0.224021
+-0.223554 -0.223086 -0.222619 -0.22215 -0.221682 -0.221213 -0.220744
+-0.220274 -0.219804 -0.219333 -0.218862 -0.218391 -0.21792 -0.217448
+-0.216975 -0.216503 -0.21603 -0.215557 -0.215083 -0.214609 -0.214135
+-0.213661 -0.213186 -0.212711 -0.212236 -0.21176 -0.211284 -0.210808
+-0.210332 -0.209855 -0.209378 -0.208901 -0.208424 -0.207946 -0.207469
+-0.206991 -0.206512 -0.206034 -0.205555 -0.205076 -0.204597 -0.204118
+-0.203639 -0.203159 -0.202679 -0.202199 -0.201719 -0.201239 -0.200758
+-0.200278 -0.199797 -0.199316 -0.198835 -0.198354 -0.197873 -0.197391
+-0.19691 -0.196428 -0.195946 -0.195465 -0.194983 -0.194501 -0.194019
+-0.193537 -0.193054 -0.192572 -0.19209 -0.191607 -0.191125 -0.190642
+-0.19016 -0.189677 -0.189195 -0.188712 -0.188229 -0.187747 -0.187264
+-0.186781 -0.186298 -0.185816 -0.185333 -0.18485 -0.184368 -0.183885
+-0.183402 -0.18292 -0.182437 -0.181954 -0.181472 -0.180989 -0.180507
+-0.180025 -0.179542 -0.17906 -0.178578 -0.178096 -0.177614 -0.177132
+-0.17665 -0.176168 -0.175687 -0.175205 -0.174724 -0.174242 -0.173761
+-0.17328 -0.172799 -0.172318 -0.171837 -0.171357 -0.170876 -0.170396
+-0.169916 -0.169436 -0.168956 -0.168476 -0.167997 -0.167517 -0.167038
+-0.166559 -0.16608 -0.165601 -0.165123 -0.164645 -0.164166 -0.163689
+-0.163211 -0.162733 -0.162256 -0.161779 -0.161302 -0.160826 -0.160349
+-0.159873 -0.159397 -0.158922 -0.158446 -0.157971 -0.157496 -0.157021
+-0.156547 -0.156073 -0.155599 -0.155125 -0.154652 -0.154179 -0.153706
+-0.153234 -0.152762 -0.15229 -0.151818 -0.151347 -0.150876 -0.150405
+-0.149935 -0.149465 -0.148995 -0.148525 -0.148056 -0.147587 -0.147119
+-0.146651 -0.146183 -0.145716 -0.145249 -0.144782 -0.144315 -0.143849
+-0.143384 -0.142918 -0.142453 -0.141989 -0.141525 -0.141061 -0.140597
+-0.140134 -0.139671 -0.139209 -0.138747 -0.138286 -0.137825 -0.137364
+-0.136903 -0.136444 -0.135984 -0.135525 -0.135066 -0.134608 -0.13415
+-0.133693 -0.133236 -0.132779 -0.132323 -0.131867 -0.131412 -0.130957
+-0.130503 -0.130049 -0.129595 -0.129142 -0.12869 -0.128238 -0.127786
+-0.127335 -0.126884 -0.126434 -0.125984 -0.125535 -0.125086 -0.124638
+-0.12419 -0.123743 -0.123296 -0.122849 -0.122403 -0.121958 -0.121513
+-0.121069 -0.120625 -0.120181 -0.119739 -0.119296 -0.118854 -0.118413
+-0.117972 -0.117532 -0.117092 -0.116653 -0.116214 -0.115776 -0.115338
+-0.114901 -0.114465 -0.114029 -0.113593 -0.113158 -0.112724 -0.11229
+-0.111857 -0.111424 -0.110992 -0.11056 -0.110129 -0.109698 -0.109268
+-0.108839 -0.10841 -0.107982 -0.107554 -0.107127 -0.1067 -0.106274
+-0.105849 -0.105424 -0.105 -0.104576 -0.104153 -0.103731 -0.103309
+-0.102888 -0.102467 -0.102047 -0.101628 -0.101209 -0.10079 -0.100373
+-0.0999556 -0.0995391 -0.0991233 -0.098708 -0.0982934 -0.0978793 -0.0974659
+-0.0970532 -0.096641 -0.0962294 -0.0958185 -0.0954082 -0.0949985 -0.0945894
+-0.094181 -0.0937732 -0.0933661 -0.0929595 -0.0925536 -0.0921484 -0.0917437
+-0.0913398 -0.0909364 -0.0905337 -0.0901317 -0.0897302 -0.0893295 -0.0889293
+-0.0885299 -0.088131 -0.0877329 -0.0873353 -0.0869384 -0.0865422 -0.0861467
+-0.0857518 -0.0853575 -0.0849639 -0.084571 -0.0841787 -0.0837871 -0.0833962
+-0.0830059 -0.0826163 -0.0822274 -0.0818391 -0.0814515 -0.0810646 -0.0806783
+-0.0802927 -0.0799078 -0.0795236 -0.07914 -0.0787571 -0.0783749 -0.0779934
+-0.0776125 -0.0772324 -0.0768529 -0.0764741 -0.0760959 -0.0757185 -0.0753417
+-0.0749657 -0.0745903 -0.0742156 -0.0738416 -0.0734682 -0.0730956 -0.0727237
+-0.0723524 -0.0719818 -0.071612 -0.0712428 -0.0708743 -0.0705065 -0.0701394
+-0.069773 -0.0694073 -0.0690423 -0.068678 -0.0683144 -0.0679515 -0.0675893
+-0.0672278 -0.0668669 -0.0665068 -0.0661474 -0.0657887 -0.0654307 -0.0650734
+-0.0647167 -0.0643609 -0.0640056 -0.0636512 -0.0632973 -0.0629443 -0.0625919
+-0.0622402 -0.0618892 -0.061539 -0.0611894 -0.0608406 -0.0604924 -0.060145
+-0.0597983 -0.0594522 -0.0591069 -0.0587623 -0.0584184 -0.0580752 -0.0577328
+-0.057391 -0.0570499 -0.0567096 -0.0563699 -0.056031 -0.0556928 -0.0553553
+-0.0550185 -0.0546824 -0.054347 -0.0540123 -0.0536784 -0.0533451 -0.0530126
+-0.0526808 -0.0523496 -0.0520192 -0.0516895 -0.0513605 -0.0510323 -0.0507047
+-0.0503778 -0.0500517 -0.0497262 -0.0494015 -0.0490775 -0.0487542 -0.0484316
+-0.0481097 -0.0477886 -0.0474681 -0.0471483 -0.0468293 -0.0465109 -0.0461933
+-0.0458763 -0.0455601 -0.0452446 -0.0449298 -0.0446157 -0.0443023 -0.0439897
+-0.0436777 -0.0433664 -0.0430558 -0.042746 -0.0424368 -0.0421284 -0.0418206
+-0.0415136 -0.0412072 -0.0409016 -0.0405966 -0.0402924 -0.0399889 -0.0396861
+-0.0393839 -0.0390825 -0.0387818 -0.0384818 -0.0381824 -0.0378838 -0.0375859
+-0.0372886 -0.0369921 -0.0366963 -0.0364011 -0.0361067 -0.0358129 -0.0355199
+-0.0352275 -0.0349358 -0.0346448 -0.0343546 -0.034065 -0.0337761 -0.0334878
+-0.0332003 -0.0329135 -0.0326274 -0.0323419 -0.0320571 -0.031773 -0.0314896
+-0.0312069 -0.0309249 -0.0306435 -0.0303629 -0.0300829 -0.0298036 -0.0295249
+-0.029247 -0.0289697 -0.0286932 -0.0284172 -0.028142 -0.0278675 -0.0275936
+-0.0273204 -0.0270479 -0.026776 -0.0265048 -0.0262343 -0.0259644 -0.0256953
+-0.0254268 -0.0251589 -0.0248917 -0.0246252 -0.0243594 -0.0240942 -0.0238297
+-0.0235659 -0.0233027 -0.0230401 -0.0227782 -0.022517 -0.0222565 -0.0219966
+-0.0217373 -0.0214787 -0.0212208 -0.0209635 -0.0207069 -0.0204509 -0.0201956
+-0.0199409 -0.0196868 -0.0194334 -0.0191807 -0.0189286 -0.0186771 -0.0184263
+-0.0181761 -0.0179266 -0.0176777 -0.0174294 -0.0171818 -0.0169348 -0.0166885
+-0.0164428 -0.0161977 -0.0159532 -0.0157094 -0.0154662 -0.0152236 -0.0149817
+-0.0147404 -0.0144997 -0.0142596 -0.0140202 -0.0137814 -0.0135432 -0.0133056
+-0.0130686 -0.0128323 -0.0125965 -0.0123614 -0.0121269 -0.011893 -0.0116597
+-0.011427 -0.0111949 -0.0109635 -0.0107326 -0.0105023 -0.0102727 -0.0100437
+-0.00981519 -0.00958733 -0.0093601 -0.00913343 -0.00890737 -0.00868189
+-0.00845702 -0.00823273 -0.00800903 -0.00778593 -0.00756341 -0.00734148
+-0.00712013 -0.00689937 -0.00667918 -0.00645957 -0.00624055 -0.00602211
+-0.00580423 -0.00558695 -0.00537023 -0.00515408 -0.00493852 -0.00472352
+-0.00450907 -0.00429521 -0.00408192 -0.00386917 -0.003657 -0.00344538
+-0.00323433 -0.00302386 -0.00281391 -0.00260454 -0.00239571 -0.00218744
+-0.00197973 -0.00177256 -0.00156595 -0.00135988 -0.00115436 -0.00094938
+-0.00074496 -0.000541066 -0.00033771 -0.000134914 6.73617e-05 0.000269101
+0.000470301 0.000670969 0.000871101 0.00107069 0.00126976 0.00146832
+0.00166633 0.00186383 0.00206079 0.00225723 0.00245315 0.00264857 0.00284346
+0.00303783 0.00323169 0.00342502 0.00361785 0.00381017 0.00400199 0.0041933
+0.00438408 0.00457438 0.00476416 0.00495345 0.00514224 0.00533054 0.00551832
+0.00570561 0.00589241 0.00607872 0.00626455 0.00644987 0.00663471 0.00681906
+0.00700291 0.0071863 0.00736919 0.00755162 0.00773356 0.00791502 0.00809601
+0.00827651 0.00845654 0.0086361 0.00881518 0.00899382 0.00917198 0.00934966
+0.00952689 0.00970364 0.00987995 0.0100558 0.0102312 0.0104061 0.0105806
+0.0107546 0.0109281 0.0111012 0.0112739 0.0114461 0.0116179 0.0117892
+0.0119601 0.0121305 0.0123005 0.0124701 0.0126392 0.0128079 0.0129761
+0.0131439 0.0133113 0.0134783 0.0136448 0.0138109 0.0139766 0.0141418
+0.0143066 0.014471 0.014635 0.0147986 0.0149617 0.0151245 0.0152868
+0.0154487 0.0156102 0.0157713 0.015932 0.0160923 0.0162521 0.0164116
+0.0165707 0.0167293 0.0168876 0.0170455 0.0172029 0.01736 0.0175167
+0.017673 0.0178289 0.0179844 0.0181395 0.0182943 0.0184486 0.0186026
+0.0187562 0.0189094 0.0190622 0.0192147 0.0193668 0.0195185 0.0196698
+0.0198208 0.0199714 0.0201216 0.0202715 0.020421 0.0205701 0.0207189
+0.0208673 0.0210153 0.021163 0.0213104 0.0214574 0.021604 0.0217503
+0.0218962 0.0220417 0.022187 0.0223318 0.0224764 0.0226206 0.0227644
+0.0229079 0.0230511 0.0231939 0.0233364 0.0234785 0.0236203 0.0237618
+0.023903 0.0240438 0.0241843 0.0243245 0.0244643 0.0246038 0.024743
+0.0248819 0.0250204 0.0251587 0.0252966 0.0254342 0.0255715 0.0257084
+0.0258451 0.0259814 0.0261175 0.0262532 0.0263886 0.0265237 0.0266585
+0.026793 0.0269272 0.0270611 0.0271947 0.027328 0.027461 0.0275937
+0.0277261 0.0278583 0.0279901 0.0281216 0.0282529 0.0283839 0.0285145
+0.0286449 0.028775 0.0289049 0.0290344 0.0291637 0.0292926 0.0294214
+0.0295498 0.0296779 0.0298058 0.0299334 0.0300607 0.0301878 0.0303146
+0.0304411 0.0305674 0.0306934 0.0308191 0.0309445 0.0310698 0.0311947
+0.0313194 0.0314438 0.0315679 0.0316919 0.0318155 0.0319389 0.032062
+0.0321849 0.0323076 0.0324299 0.0325521 0.032674 0.0327956 0.032917
+0.0330382 0.0331591 0.0332798 0.0334002 0.0335204 0.0336403 0.0337601
+0.0338795 0.0339988 0.0341178 0.0342365 0.0343551 0.0344734 0.0345915
+0.0347093 0.034827 0.0349444 0.0350615 0.0351785 0.0352952 0.0354117
+0.035528 0.035644 0.0357598 0.0358755 0.0359908 0.036106 0.036221 0.0363357
+0.0364503 0.0365646 0.0366787 0.0367926 0.0369063 0.0370197 0.037133
+0.037246 0.0373589 0.0374715 0.037584 0.0376962 0.0378082 0.0379201
+0.0380317 0.0381431 0.0382543 0.0383654 0.0384762 0.0385868 0.0386972
+0.0388075 0.0389175 0.0390274 0.039137 0.0392465 0.0393558 0.0394648
+0.0395737;
+#A 3000 0.0396824 0.039791 0.0398993 0.0400074 0.0401154 0.0402231
+0.0403307 0.0404381 0.0405453 0.0406524 0.0407592 0.0408659 0.0409724
+0.0410787 0.0411848 0.0412908 0.0413966 0.0415022 0.0416076 0.0417129
+0.0418179 0.0419228 0.0420276 0.0421321 0.0422365 0.0423407 0.0424448
+0.0425486 0.0426523 0.0427559 0.0428592 0.0429624 0.0430655 0.0431683
+0.043271 0.0433736 0.0434759 0.0435781 0.0436802 0.0437821 0.0438838
+0.0439854 0.0440868 0.044188 0.0442891 0.04439 0.0444907 0.0445913
+0.0446918 0.0447921 0.0448922 0.0449922 0.045092 0.0451916 0.0452911
+0.0453905 0.0454897 0.0455887 0.0456876 0.0457863 0.0458849 0.0459834
+0.0460816 0.0461798 0.0462777 0.0463756 0.0464732 0.0465708 0.0466681
+0.0467654 0.0468625 0.0469594 0.0470562 0.0471528 0.0472493 0.0473456
+0.0474418 0.0475379 0.0476338 0.0477296 0.0478252 0.0479207 0.048016
+0.0481112 0.0482062 0.0483011 0.0483959 0.0484905 0.0485849 0.0486793
+0.0487734 0.0488675 0.0489614 0.0490552 0.0491487 0.0492422 0.0493356
+0.0494288 0.0495218 0.0496147 0.0497075 0.0498001 0.0498926 0.049985
+0.0500772 0.0501693 0.0502612 0.050353 0.0504447 0.0505362 0.0506276
+0.0507188 0.0508099 0.0509009 0.0509917 0.0510824 0.051173 0.0512634
+0.0513537 0.0514438 0.0515338 0.0516237 0.0517134 0.051803 0.0518924
+0.0519817 0.0520709 0.05216 0.0522489 0.0523376 0.0524263 0.0525148
+0.0526031 0.0526913 0.0527794 0.0528674 0.0529552 0.0530428 0.0531304
+0.0532178 0.053305 0.0533921 0.0534791 0.053566 0.0536527 0.0537392
+0.0538257 0.053912 0.0539981 0.0540841 0.05417 0.0542557 0.0543413
+0.0544268 0.0545121 0.0545973 0.0546824 0.0547673 0.054852 0.0549367
+0.0550211 0.0551055 0.0551897 0.0552738 0.0553577 0.0554415 0.0555251
+0.0556086 0.055692 0.0557752 0.0558583 0.0559412 0.056024 0.0561067
+0.0561892 0.0562716 0.0563538 0.0564359 0.0565178 0.0565996 0.0566812
+0.0567627 0.0568441 0.0569253 0.0570064 0.0570873 0.0571681 0.0572487
+0.0573292 0.0574095 0.0574897 0.0575698 0.0576497 0.0577294 0.057809
+0.0578885 0.0579678 0.0580469 0.0581259 0.0582048 0.0582835 0.058362
+0.0584404 0.0585187 0.0585968 0.0586747 0.0587525 0.0588301 0.0589076
+0.0589849 0.0590621 0.0591391 0.059216 0.0592927 0.0593692 0.0594456
+0.0595218 0.0595979 0.0596738 0.0597496 0.0598251 0.0599006 0.0599759
+0.060051 0.0601259 0.0602007 0.0602753 0.0603498 0.0604241 0.0604982
+0.0605722 0.060646 0.0607197 0.0607932 0.0608665 0.0609396 0.0610126
+0.0610854 0.061158 0.0612305 0.0613028 0.0613749 0.0614469 0.0615187
+0.0615903 0.0616617 0.061733 0.0618041 0.061875 0.0619457 0.0620163
+0.0620867 0.0621569 0.0622269 0.0622968 0.0623665 0.062436 0.0625053
+0.0625744 0.0626434 0.0627121 0.0627807 0.0628491 0.0629174 0.0629854
+0.0630533 0.0631209 0.0631884 0.0632557 0.0633228 0.0633897 0.0634564
+0.063523 0.0635893 0.0636555 0.0637214 0.0637872 0.0638528 0.0639182
+0.0639833 0.0640483 0.0641131 0.0641777 0.0642421 0.0643063 0.0643703
+0.0644341 0.0644977 0.0645611 0.0646243 0.0646873 0.0647501 0.0648126
+0.064875 0.0649372 0.0649991 0.0650609 0.0651225 0.0651838 0.0652449
+0.0653058 0.0653665 0.065427 0.0654873 0.0655474 0.0656072 0.0656668
+0.0657263 0.0657855 0.0658444 0.0659032 0.0659618 0.0660201 0.0660782
+0.066136 0.0661937 0.0662511 0.0663084 0.0663653 0.0664221 0.0664786
+0.0665349 0.066591 0.0666468 0.0667024 0.0667578 0.066813 0.0668679
+0.0669225 0.066977 0.0670312 0.0670852 0.0671389 0.0671924 0.0672457
+0.0672987 0.0673515 0.067404 0.0674563 0.0675084 0.0675602 0.0676118
+0.0676631 0.0677141 0.067765 0.0678155 0.0678658 0.0679159 0.0679658
+0.0680153 0.0680647 0.0681137 0.0681625 0.0682111 0.0682594 0.0683074
+0.0683552 0.0684027 0.06845 0.068497 0.0685437 0.0685902 0.0686364
+0.0686823 0.068728 0.0687734 0.0688186 0.0688635 0.0689081 0.0689524
+0.0689965 0.0690403 0.0690838 0.069127 0.06917 0.0692127 0.0692551
+0.0692973 0.0693391 0.0693807 0.069422 0.0694631 0.0695038 0.0695443
+0.0695844 0.0696243 0.0696639 0.0697033 0.0697423 0.069781 0.0698195
+0.0698577 0.0698955 0.0699331 0.0699704 0.0700074 0.0700441 0.0700805
+0.0701166 0.0701524 0.0701879 0.0702231 0.070258 0.0702926 0.0703269
+0.0703609 0.0703946 0.070428 0.0704611 0.0704938 0.0705263 0.0705585
+0.0705903 0.0706219 0.0706531 0.070684 0.0707146 0.0707449 0.0707748
+0.0708045 0.0708338 0.0708629 0.0708916 0.0709199 0.070948 0.0709757
+0.0710031 0.0710302 0.071057 0.0710834 0.0711095 0.0711353 0.0711608
+0.0711859 0.0712107 0.0712351 0.0712593 0.0712831 0.0713065 0.0713297
+0.0713525 0.0713749 0.071397 0.0714188 0.0714403 0.0714614 0.0714821
+0.0715026 0.0715226 0.0715424 0.0715617 0.0715808 0.0715995 0.0716178
+0.0716358 0.0716535 0.0716708 0.0716877 0.0717043 0.0717206 0.0717365
+0.071752 0.0717672 0.071782 0.0717965 0.0718106 0.0718243 0.0718377
+0.0718507 0.0718634 0.0718757 0.0718877 0.0718993 0.0719104 0.0719213
+0.0719318 0.0719419 0.0719516 0.071961 0.07197 0.0719787 0.0719869
+0.0719948 0.0720023 0.0720095 0.0720162 0.0720226 0.0720286 0.0720343
+0.0720395 0.0720444 0.0720489 0.072053 0.0720568 0.0720601 0.0720631
+0.0720657 0.0720679 0.0720697 0.0720711 0.0720721 0.0720728 0.0720731
+0.072073 0.0720724 0.0720715 0.0720702 0.0720685 0.0720664 0.072064
+0.0720611 0.0720578 0.0720541 0.0720501 0.0720456 0.0720407 0.0720355
+0.0720298 0.0720238 0.0720173 0.0720104 0.0720031 0.0719955 0.0719874
+0.0719789 0.07197 0.0719607 0.071951 0.0719409 0.0719304 0.0719194
+0.0719081 0.0718963 0.0718841 0.0718716 0.0718586 0.0718452 0.0718313
+0.0718171 0.0718024 0.0717874 0.0717719 0.071756 0.0717396 0.0717229
+0.0717057 0.0716881 0.0716701 0.0716517 0.0716328 0.0716136 0.0715939
+0.0715737 0.0715532 0.0715322 0.0715108 0.071489 0.0714667 0.071444
+0.0714209 0.0713973 0.0713734 0.071349 0.0713241 0.0712989 0.0712732
+0.071247 0.0712205 0.0711935 0.071166 0.0711382 0.0711099 0.0710811
+0.0710519 0.0710223 0.0709923 0.0709617 0.0709308 0.0708994 0.0708676
+0.0708354 0.0708027 0.0707695 0.070736 0.070702 0.0706675 0.0706326
+0.0705972 0.0705614 0.0705252 0.0704885 0.0704514 0.0704138 0.0703758
+0.0703373 0.0702984 0.070259 0.0702192 0.070179 0.0701382 0.0700971
+0.0700555 0.0700134 0.0699709 0.0699279 0.0698845 0.0698407 0.0697963
+0.0697516 0.0697063 0.0696606 0.0696145 0.0695679 0.0695209 0.0694734
+0.0694254 0.069377 0.0693282 0.0692788 0.0692291 0.0691788 0.0691281
+0.069077 0.0690254 0.0689733 0.0689208 0.0688678 0.0688144 0.0687605
+0.0687061 0.0686513 0.068596 0.0685403 0.068484 0.0684274 0.0683702
+0.0683127 0.0682546 0.0681961 0.0681372 0.0680777 0.0680178 0.0679575
+0.0678966 0.0678353 0.0677736 0.0677114 0.0676487 0.0675856 0.067522
+0.0674579 0.0673934 0.0673284 0.067263 0.067197 0.0671306 0.0670638
+0.0669965 0.0669287 0.0668604 0.0667917 0.0667225 0.0666529 0.0665828
+0.0665122 0.0664412 0.0663697 0.0662977 0.0662253 0.0661523 0.066079
+0.0660051 0.0659309 0.0658561 0.0657808 0.0657051 0.065629 0.0655523
+0.0654752 0.0653977 0.0653197 0.0652412 0.0651622 0.0650828 0.0650029
+0.0649225 0.0648417 0.0647604 0.0646786 0.0645964 0.0645137 0.0644306
+0.064347 0.0642629 0.0641783 0.0640933 0.0640078 0.0639219 0.0638355
+0.0637486 0.0636612 0.0635734 0.0634852 0.0633964 0.0633073 0.0632176
+0.0631275 0.0630369 0.0629458 0.0628543 0.0627623 0.0626699 0.062577
+0.0624836 0.0623898 0.0622955 0.0622008 0.0621056 0.0620099 0.0619138
+0.0618172 0.0617201 0.0616226 0.0615246 0.0614262 0.0613273 0.061228
+0.0611282 0.0610279 0.0609272 0.060826 0.0607244 0.0606223 0.0605197
+0.0604167 0.0603132 0.0602093 0.0601049 0.0600001 0.0598948 0.0597891
+0.0596829 0.0595762 0.0594691 0.0593616 0.0592536 0.0591451 0.0590362
+0.0589268 0.058817 0.0587068 0.058596 0.0584849 0.0583733 0.0582612
+0.0581487 0.0580358 0.0579224 0.0578085 0.0576942 0.0575795 0.0574643
+0.0573487 0.0572326 0.0571161 0.0569992 0.0568817 0.0567639 0.0566456
+0.0565269 0.0564077 0.0562882 0.0561681 0.0560476 0.0559267 0.0558054
+0.0556836 0.0555613 0.0554387 0.0553156 0.0551921 0.0550681 0.0549437
+0.0548189 0.0546936 0.0545679 0.0544418 0.0543152 0.0541883 0.0540609
+0.053933 0.0538047 0.0536761 0.0535469 0.0534174 0.0532874 0.0531571
+0.0530263 0.052895 0.0527634 0.0526313 0.0524988 0.0523659 0.0522326
+0.0520988 0.0519646 0.0518301 0.0516951 0.0515597 0.0514238 0.0512876
+0.051151 0.0510139 0.0508764 0.0507385 0.0506003 0.0504616 0.0503225
+0.050183 0.050043 0.0499027 0.049762 0.0496209 0.0494794 0.0493374
+0.0491951 0.0490524 0.0489093 0.0487657 0.0486218 0.0484775 0.0483328
+0.0481877 0.0480422 0.0478963 0.04775 0.0476034 0.0474563 0.0473089
+0.047161 0.0470128 0.0468642 0.0467152 0.0465659 0.0464161 0.046266
+0.0461155 0.0459646 0.0458133 0.0456617 0.0455096 0.0453572 0.0452045
+0.0450513 0.0448978 0.0447439 0.0445897 0.044435 0.04428 0.0441247
+0.043969 0.0438129 0.0436564 0.0434996 0.0433424 0.0431849 0.043027
+0.0428688 0.0427102 0.0425512 0.0423919 0.0422322 0.0420722 0.0419118
+0.0417511 0.04159 0.0414286 0.0412668 0.0411047 0.0409423 0.0407795
+0.0406163 0.0404528 0.040289 0.0401249 0.0399604 0.0397955 0.0396304
+0.0394649 0.0392991 0.0391329 0.0389664 0.0387996 0.0386325 0.038465
+0.0382972 0.0381291 0.0379606 0.0377919 0.0376228 0.0374534 0.0372837
+0.0371137 0.0369433 0.0367727 0.0366017 0.0364304 0.0362589 0.036087
+0.0359148 0.0357423 0.0355695 0.0353964 0.035223 0.0350492 0.0348752
+0.0347009 0.0345263 0.0343514 0.0341762 0.0340008 0.033825 0.033649
+0.0334726 0.033296 0.0331191 0.0329419 0.0327644 0.0325867 0.0324086
+0.0322303 0.0320517 0.0318729 0.0316937 0.0315143 0.0313346 0.0311547
+0.0309745 0.030794 0.0306133 0.0304322 0.030251 0.0300695 0.0298877
+0.0297056 0.0295233 0.0293408 0.029158 0.0289749 0.0287916 0.0286081
+0.0284243 0.0282402 0.0280559 0.0278714 0.0276866 0.0275016 0.0273164
+0.0271309 0.0269452 0.0267592 0.026573 0.0263866 0.0262 0.0260131 0.025826
+0.0256387 0.0254512 0.0252634 0.0250754 0.0248872 0.0246988 0.0245102
+0.0243213 0.0241323 0.023943 0.0237536 0.0235639 0.023374 0.0231839
+0.0229937 0.0228032 0.0226125 0.0224216 0.0222305 0.0220393 0.0218478
+0.0216562 0.0214643 0.0212723 0.0210801 0.0208877 0.0206951 0.0205024
+0.0203094 0.0201163 0.019923 0.0197296 0.019536 0.0193422;
+#A 4000 0.0191482 0.018954 0.0187597 0.0185653 0.0183706 0.0181758
+0.0179809 0.0177858 0.0175905 0.0173951 0.0171995 0.0170038 0.0168079
+0.0166119 0.0164158 0.0162195 0.016023 0.0158264 0.0156297 0.0154328
+0.0152358 0.0150387 0.0148414 0.014644 0.0144465 0.0142489 0.0140511
+0.0138532 0.0136552 0.013457 0.0132588 0.0130604 0.0128619 0.0126633
+0.0124646 0.0122658 0.0120668 0.0118678 0.0116686 0.0114694 0.0112701
+0.0110706 0.0108711 0.0106714 0.0104717 0.0102719 0.010072 0.00987196
+0.00967187 0.0094717 0.00927144 0.0090711 0.00887068 0.00867019 0.00846961
+0.00826896 0.00806824 0.00786745 0.00766659 0.00746566 0.00726467 0.00706361
+0.00686249 0.0066613 0.00646006 0.00625877 0.00605741 0.00585601 0.00565455
+0.00545304 0.00525149 0.00504989 0.00484824 0.00464655 0.00444482 0.00424305
+0.00404125 0.0038394 0.00363753 0.00343562 0.00323368 0.00303172 0.00282972
+0.0026277 0.00242566 0.0022236 0.00202152 0.00181941 0.0016173 0.00141517
+0.00121302 0.00101087 0.000808706 0.000606536 0.00040436 0.000202181
+-2.69055e-12 -0.000202181 -0.00040436 -0.000606536 -0.000808706 -0.00101087
+-0.00121302 -0.00141517 -0.0016173 -0.00181941 -0.00202152 -0.0022236
+-0.00242566 -0.0026277 -0.00282972 -0.00303172 -0.00323368 -0.00343562
+-0.00363753 -0.0038394 -0.00404125 -0.00424305 -0.00444482 -0.00464655
+-0.00484824 -0.00504989 -0.00525149 -0.00545304 -0.00565455 -0.00585601
+-0.00605741 -0.00625877 -0.00646006 -0.0066613 -0.00686249 -0.00706361
+-0.00726467 -0.00746566 -0.00766659 -0.00786745 -0.00806824 -0.00826896
+-0.00846961 -0.00867019 -0.00887068 -0.0090711 -0.00927144 -0.0094717
+-0.00967187 -0.00987196 -0.010072 -0.0102719 -0.0104717 -0.0106714
+-0.0108711 -0.0110706 -0.0112701 -0.0114694 -0.0116686 -0.0118678 -0.0120668
+-0.0122658 -0.0124646 -0.0126633 -0.0128619 -0.0130604 -0.0132588 -0.013457
+-0.0136552 -0.0138532 -0.0140511 -0.0142489 -0.0144465 -0.014644 -0.0148414
+-0.0150387 -0.0152358 -0.0154328 -0.0156297 -0.0158264 -0.016023 -0.0162195
+-0.0164158 -0.0166119 -0.0168079 -0.0170038 -0.0171995 -0.0173951 -0.0175905
+-0.0177858 -0.0179809 -0.0181758 -0.0183706 -0.0185653 -0.0187597 -0.018954
+-0.0191482 -0.0193422 -0.019536 -0.0197296 -0.019923 -0.0201163 -0.0203094
+-0.0205024 -0.0206951 -0.0208877 -0.0210801 -0.0212723 -0.0214643 -0.0216562
+-0.0218478 -0.0220393 -0.0222305 -0.0224216 -0.0226125 -0.0228032 -0.0229937
+-0.0231839 -0.023374 -0.0235639 -0.0237536 -0.023943 -0.0241323 -0.0243213
+-0.0245102 -0.0246988 -0.0248872 -0.0250754 -0.0252634 -0.0254512 -0.0256387
+-0.025826 -0.0260131 -0.0262 -0.0263866 -0.026573 -0.0267592 -0.0269452
+-0.0271309 -0.0273164 -0.0275016 -0.0276866 -0.0278714 -0.0280559 -0.0282402
+-0.0284243 -0.0286081 -0.0287916 -0.0289749 -0.029158 -0.0293408 -0.0295233
+-0.0297056 -0.0298877 -0.0300695 -0.030251 -0.0304322 -0.0306133 -0.030794
+-0.0309745 -0.0311547 -0.0313346 -0.0315143 -0.0316937 -0.0318729 -0.0320517
+-0.0322303 -0.0324086 -0.0325867 -0.0327644 -0.0329419 -0.0331191 -0.033296
+-0.0334726 -0.033649 -0.033825 -0.0340008 -0.0341762 -0.0343514 -0.0345263
+-0.0347009 -0.0348752 -0.0350492 -0.035223 -0.0353964 -0.0355695 -0.0357423
+-0.0359148 -0.036087 -0.0362589 -0.0364304 -0.0366017 -0.0367727 -0.0369433
+-0.0371137 -0.0372837 -0.0374534 -0.0376228 -0.0377919 -0.0379606 -0.0381291
+-0.0382972 -0.038465 -0.0386325 -0.0387996 -0.0389664 -0.0391329 -0.0392991
+-0.0394649 -0.0396304 -0.0397955 -0.0399604 -0.0401249 -0.040289 -0.0404528
+-0.0406163 -0.0407795 -0.0409423 -0.0411047 -0.0412668 -0.0414286 -0.04159
+-0.0417511 -0.0419118 -0.0420722 -0.0422322 -0.0423919 -0.0425512 -0.0427102
+-0.0428688 -0.043027 -0.0431849 -0.0433424 -0.0434996 -0.0436564 -0.0438129
+-0.043969 -0.0441247 -0.04428 -0.044435 -0.0445897 -0.0447439 -0.0448978
+-0.0450513 -0.0452045 -0.0453572 -0.0455096 -0.0456617 -0.0458133 -0.0459646
+-0.0461155 -0.046266 -0.0464161 -0.0465659 -0.0467152 -0.0468642 -0.0470128
+-0.047161 -0.0473089 -0.0474563 -0.0476034 -0.04775 -0.0478963 -0.0480422
+-0.0481877 -0.0483328 -0.0484775 -0.0486218 -0.0487657 -0.0489093 -0.0490524
+-0.0491951 -0.0493374 -0.0494794 -0.0496209 -0.049762 -0.0499027 -0.050043
+-0.050183 -0.0503225 -0.0504616 -0.0506003 -0.0507385 -0.0508764 -0.0510139
+-0.051151 -0.0512876 -0.0514238 -0.0515597 -0.0516951 -0.0518301 -0.0519646
+-0.0520988 -0.0522326 -0.0523659 -0.0524988 -0.0526313 -0.0527634 -0.052895
+-0.0530263 -0.0531571 -0.0532874 -0.0534174 -0.0535469 -0.0536761 -0.0538047
+-0.053933 -0.0540609 -0.0541883 -0.0543152 -0.0544418 -0.0545679 -0.0546936
+-0.0548189 -0.0549437 -0.0550681 -0.0551921 -0.0553156 -0.0554387 -0.0555613
+-0.0556836 -0.0558054 -0.0559267 -0.0560476 -0.0561681 -0.0562882 -0.0564077
+-0.0565269 -0.0566456 -0.0567639 -0.0568817 -0.0569992 -0.0571161 -0.0572326
+-0.0573487 -0.0574643 -0.0575795 -0.0576942 -0.0578085 -0.0579224 -0.0580358
+-0.0581487 -0.0582612 -0.0583733 -0.0584849 -0.058596 -0.0587068 -0.058817
+-0.0589268 -0.0590362 -0.0591451 -0.0592536 -0.0593616 -0.0594691 -0.0595762
+-0.0596829 -0.0597891 -0.0598948 -0.0600001 -0.0601049 -0.0602093 -0.0603132
+-0.0604167 -0.0605197 -0.0606223 -0.0607244 -0.060826 -0.0609272 -0.0610279
+-0.0611282 -0.061228 -0.0613273 -0.0614262 -0.0615246 -0.0616226 -0.0617201
+-0.0618172 -0.0619138 -0.0620099 -0.0621056 -0.0622008 -0.0622955 -0.0623898
+-0.0624836 -0.062577 -0.0626699 -0.0627623 -0.0628543 -0.0629458 -0.0630369
+-0.0631275 -0.0632176 -0.0633073 -0.0633964 -0.0634852 -0.0635734 -0.0636612
+-0.0637486 -0.0638355 -0.0639219 -0.0640078 -0.0640933 -0.0641783 -0.0642629
+-0.064347 -0.0644306 -0.0645137 -0.0645964 -0.0646786 -0.0647604 -0.0648417
+-0.0649225 -0.0650029 -0.0650828 -0.0651622 -0.0652412 -0.0653197 -0.0653977
+-0.0654752 -0.0655523 -0.065629 -0.0657051 -0.0657808 -0.0658561 -0.0659309
+-0.0660051 -0.066079 -0.0661523 -0.0662253 -0.0662977 -0.0663697 -0.0664412
+-0.0665122 -0.0665828 -0.0666529 -0.0667225 -0.0667917 -0.0668604 -0.0669287
+-0.0669965 -0.0670638 -0.0671306 -0.067197 -0.067263 -0.0673284 -0.0673934
+-0.0674579 -0.067522 -0.0675856 -0.0676487 -0.0677114 -0.0677736 -0.0678353
+-0.0678966 -0.0679575 -0.0680178 -0.0680777 -0.0681372 -0.0681961 -0.0682546
+-0.0683127 -0.0683702 -0.0684274 -0.068484 -0.0685403 -0.068596 -0.0686513
+-0.0687061 -0.0687605 -0.0688144 -0.0688678 -0.0689208 -0.0689733 -0.0690254
+-0.069077 -0.0691281 -0.0691788 -0.0692291 -0.0692788 -0.0693282 -0.069377
+-0.0694254 -0.0694734 -0.0695209 -0.0695679 -0.0696145 -0.0696606 -0.0697063
+-0.0697516 -0.0697963 -0.0698407 -0.0698845 -0.0699279 -0.0699709 -0.0700134
+-0.0700555 -0.0700971 -0.0701382 -0.070179 -0.0702192 -0.070259 -0.0702984
+-0.0703373 -0.0703758 -0.0704138 -0.0704514 -0.0704885 -0.0705252 -0.0705614
+-0.0705972 -0.0706326 -0.0706675 -0.070702 -0.070736 -0.0707695 -0.0708027
+-0.0708354 -0.0708676 -0.0708994 -0.0709308 -0.0709617 -0.0709923 -0.0710223
+-0.0710519 -0.0710811 -0.0711099 -0.0711382 -0.071166 -0.0711935 -0.0712205
+-0.071247 -0.0712732 -0.0712989 -0.0713241 -0.071349 -0.0713734 -0.0713973
+-0.0714209 -0.071444 -0.0714667 -0.071489 -0.0715108 -0.0715322 -0.0715532
+-0.0715737 -0.0715939 -0.0716136 -0.0716328 -0.0716517 -0.0716701 -0.0716881
+-0.0717057 -0.0717229 -0.0717396 -0.071756 -0.0717719 -0.0717874 -0.0718024
+-0.0718171 -0.0718313 -0.0718452 -0.0718586 -0.0718716 -0.0718841 -0.0718963
+-0.0719081 -0.0719194 -0.0719304 -0.0719409 -0.071951 -0.0719607 -0.07197
+-0.0719789 -0.0719874 -0.0719955 -0.0720031 -0.0720104 -0.0720173 -0.0720238
+-0.0720298 -0.0720355 -0.0720407 -0.0720456 -0.0720501 -0.0720541 -0.0720578
+-0.0720611 -0.072064 -0.0720664 -0.0720685 -0.0720702 -0.0720715 -0.0720724
+-0.072073 -0.0720731 -0.0720728 -0.0720721 -0.0720711 -0.0720697 -0.0720679
+-0.0720657 -0.0720631 -0.0720601 -0.0720568 -0.072053 -0.0720489 -0.0720444
+-0.0720395 -0.0720343 -0.0720286 -0.0720226 -0.0720162 -0.0720095 -0.0720023
+-0.0719948 -0.0719869 -0.0719787 -0.07197 -0.071961 -0.0719516 -0.0719419
+-0.0719318 -0.0719213 -0.0719104 -0.0718993 -0.0718877 -0.0718757 -0.0718634
+-0.0718507 -0.0718377 -0.0718243 -0.0718106 -0.0717965 -0.071782 -0.0717672
+-0.071752 -0.0717365 -0.0717206 -0.0717043 -0.0716877 -0.0716708 -0.0716535
+-0.0716358 -0.0716178 -0.0715995 -0.0715808 -0.0715617 -0.0715424 -0.0715226
+-0.0715026 -0.0714821 -0.0714614 -0.0714403 -0.0714188 -0.071397 -0.0713749
+-0.0713525 -0.0713297 -0.0713065 -0.0712831 -0.0712593 -0.0712351 -0.0712107
+-0.0711859 -0.0711608 -0.0711353 -0.0711095 -0.0710834 -0.071057 -0.0710302
+-0.0710031 -0.0709757 -0.070948 -0.0709199 -0.0708916 -0.0708629 -0.0708338
+-0.0708045 -0.0707748 -0.0707449 -0.0707146 -0.070684 -0.0706531 -0.0706219
+-0.0705903 -0.0705585 -0.0705263 -0.0704938 -0.0704611 -0.070428 -0.0703946
+-0.0703609 -0.0703269 -0.0702926 -0.070258 -0.0702231 -0.0701879 -0.0701524
+-0.0701166 -0.0700805 -0.0700441 -0.0700074 -0.0699704 -0.0699331 -0.0698955
+-0.0698577 -0.0698195 -0.069781 -0.0697423 -0.0697033 -0.0696639 -0.0696243
+-0.0695844 -0.0695443 -0.0695038 -0.0694631 -0.069422 -0.0693807 -0.0693391
+-0.0692973 -0.0692551 -0.0692127 -0.06917 -0.069127 -0.0690838 -0.0690403
+-0.0689965 -0.0689524 -0.0689081 -0.0688635 -0.0688186 -0.0687734 -0.068728
+-0.0686823 -0.0686364 -0.0685902 -0.0685437 -0.068497 -0.06845 -0.0684027
+-0.0683552 -0.0683074 -0.0682594 -0.0682111 -0.0681625 -0.0681137 -0.0680647
+-0.0680153 -0.0679658 -0.0679159 -0.0678658 -0.0678155 -0.067765 -0.0677141
+-0.0676631 -0.0676118 -0.0675602 -0.0675084 -0.0674563 -0.067404 -0.0673515
+-0.0672987 -0.0672457 -0.0671924 -0.0671389 -0.0670852 -0.0670312 -0.066977
+-0.0669225 -0.0668679 -0.066813 -0.0667578 -0.0667024 -0.0666468 -0.066591
+-0.0665349 -0.0664786 -0.0664221 -0.0663653 -0.0663084 -0.0662511 -0.0661937
+-0.066136 -0.0660782 -0.0660201 -0.0659618 -0.0659032 -0.0658444 -0.0657855
+-0.0657263 -0.0656668 -0.0656072 -0.0655474 -0.0654873 -0.065427 -0.0653665
+-0.0653058 -0.0652449 -0.0651838 -0.0651225 -0.0650609 -0.0649991 -0.0649372
+-0.064875 -0.0648126 -0.0647501 -0.0646873 -0.0646243 -0.0645611 -0.0644977
+-0.0644341 -0.0643703 -0.0643063 -0.0642421 -0.0641777 -0.0641131 -0.0640483
+-0.0639833 -0.0639182 -0.0638528 -0.0637872 -0.0637214 -0.0636555 -0.0635893
+-0.063523 -0.0634564 -0.0633897 -0.0633228 -0.0632557 -0.0631884 -0.0631209
+-0.0630533 -0.0629854 -0.0629174 -0.0628491 -0.0627807 -0.0627121 -0.0626434
+-0.0625744 -0.0625053 -0.062436 -0.0623665 -0.0622968 -0.0622269 -0.0621569
+-0.0620867 -0.0620163 -0.0619457 -0.061875 -0.0618041 -0.061733 -0.0616617
+-0.0615903 -0.0615187 -0.0614469 -0.0613749 -0.0613028 -0.0612305 -0.061158
+-0.0610854 -0.0610126 -0.0609396 -0.0608665 -0.0607932 -0.0607197 -0.060646
+-0.0605722 -0.0604982 -0.0604241 -0.0603498 -0.0602753 -0.0602007 -0.0601259
+-0.060051 -0.0599759 -0.0599006 -0.0598251 -0.0597496 -0.0596738 -0.0595979
+-0.0595218 -0.0594456 -0.0593692 -0.0592927 -0.059216 -0.0591391 -0.0590621
+-0.0589849 -0.0589076 -0.0588301 -0.0587525 -0.0586747 -0.0585968 -0.0585187
+-0.0584404 -0.058362 -0.0582835 -0.0582048 -0.0581259 -0.0580469 -0.0579678
+-0.0578885 -0.057809 -0.0577294;
+#A 5000 -0.0576497 -0.0575698 -0.0574897 -0.0574095 -0.0573292 -0.0572487
+-0.0571681 -0.0570873 -0.0570064 -0.0569253 -0.0568441 -0.0567627 -0.0566812
+-0.0565996 -0.0565178 -0.0564359 -0.0563538 -0.0562716 -0.0561892 -0.0561067
+-0.056024 -0.0559412 -0.0558583 -0.0557752 -0.055692 -0.0556086 -0.0555251
+-0.0554415 -0.0553577 -0.0552738 -0.0551897 -0.0551055 -0.0550211 -0.0549367
+-0.054852 -0.0547673 -0.0546824 -0.0545973 -0.0545121 -0.0544268 -0.0543413
+-0.0542558 -0.05417 -0.0540841 -0.0539981 -0.053912 -0.0538257 -0.0537392
+-0.0536527 -0.053566 -0.0534791 -0.0533921 -0.053305 -0.0532178 -0.0531304
+-0.0530428 -0.0529552 -0.0528674 -0.0527794 -0.0526913 -0.0526031 -0.0525148
+-0.0524263 -0.0523376 -0.0522489 -0.05216 -0.0520709 -0.0519817 -0.0518924
+-0.051803 -0.0517134 -0.0516237 -0.0515338 -0.0514438 -0.0513537 -0.0512634
+-0.051173 -0.0510824 -0.0509917 -0.0509009 -0.0508099 -0.0507188 -0.0506276
+-0.0505362 -0.0504447 -0.050353 -0.0502612 -0.0501693 -0.0500772 -0.049985
+-0.0498926 -0.0498001 -0.0497075 -0.0496147 -0.0495218 -0.0494288 -0.0493356
+-0.0492422 -0.0491487 -0.0490552 -0.0489614 -0.0488675 -0.0487734 -0.0486793
+-0.0485849 -0.0484905 -0.0483959 -0.0483011 -0.0482062 -0.0481112 -0.048016
+-0.0479207 -0.0478252 -0.0477296 -0.0476338 -0.0475379 -0.0474418 -0.0473456
+-0.0472493 -0.0471528 -0.0470562 -0.0469594 -0.0468625 -0.0467654 -0.0466681
+-0.0465708 -0.0464732 -0.0463756 -0.0462777 -0.0461798 -0.0460816 -0.0459834
+-0.0458849 -0.0457863 -0.0456876 -0.0455887 -0.0454897 -0.0453905 -0.0452911
+-0.0451916 -0.045092 -0.0449922 -0.0448922 -0.0447921 -0.0446918 -0.0445913
+-0.0444907 -0.04439 -0.0442891 -0.044188 -0.0440868 -0.0439854 -0.0438838
+-0.0437821 -0.0436802 -0.0435781 -0.0434759 -0.0433736 -0.043271 -0.0431683
+-0.0430655 -0.0429624 -0.0428592 -0.0427559 -0.0426523 -0.0425486 -0.0424448
+-0.0423407 -0.0422365 -0.0421321 -0.0420276 -0.0419228 -0.0418179 -0.0417129
+-0.0416076 -0.0415022 -0.0413966 -0.0412908 -0.0411848 -0.0410787 -0.0409724
+-0.0408659 -0.0407592 -0.0406524 -0.0405453 -0.0404381 -0.0403307 -0.0402231
+-0.0401154 -0.0400074 -0.0398993 -0.039791 -0.0396824 -0.0395737 -0.0394648
+-0.0393558 -0.0392465 -0.039137 -0.0390274 -0.0389175 -0.0388075 -0.0386972
+-0.0385868 -0.0384762 -0.0383654 -0.0382543 -0.0381431 -0.0380317 -0.0379201
+-0.0378082 -0.0376962 -0.037584 -0.0374715 -0.0373589 -0.037246 -0.037133
+-0.0370197 -0.0369063 -0.0367926 -0.0366787 -0.0365646 -0.0364503 -0.0363357
+-0.036221 -0.036106 -0.0359908 -0.0358755 -0.0357598 -0.035644 -0.035528
+-0.0354117 -0.0352952 -0.0351785 -0.0350615 -0.0349444 -0.034827 -0.0347093
+-0.0345915 -0.0344734 -0.0343551 -0.0342365 -0.0341178 -0.0339988 -0.0338795
+-0.0337601 -0.0336403 -0.0335204 -0.0334002 -0.0332798 -0.0331591 -0.0330382
+-0.032917 -0.0327956 -0.032674 -0.0325521 -0.0324299 -0.0323076 -0.0321849
+-0.032062 -0.0319389 -0.0318155 -0.0316919 -0.0315679 -0.0314438 -0.0313194
+-0.0311947 -0.0310698 -0.0309445 -0.0308191 -0.0306934 -0.0305674 -0.0304411
+-0.0303146 -0.0301878 -0.0300607 -0.0299334 -0.0298058 -0.0296779 -0.0295498
+-0.0294214 -0.0292926 -0.0291637 -0.0290344 -0.0289049 -0.028775 -0.0286449
+-0.0285145 -0.0283839 -0.0282529 -0.0281216 -0.0279901 -0.0278583 -0.0277261
+-0.0275937 -0.027461 -0.027328 -0.0271947 -0.0270611 -0.0269272 -0.026793
+-0.0266585 -0.0265237 -0.0263886 -0.0262532 -0.0261175 -0.0259814 -0.0258451
+-0.0257084 -0.0255715 -0.0254342 -0.0252966 -0.0251587 -0.0250204 -0.0248819
+-0.024743 -0.0246038 -0.0244643 -0.0243245 -0.0241843 -0.0240438 -0.023903
+-0.0237618 -0.0236203 -0.0234785 -0.0233364 -0.0231939 -0.0230511 -0.0229079
+-0.0227644 -0.0226206 -0.0224764 -0.0223318 -0.022187 -0.0220417 -0.0218962
+-0.0217503 -0.021604 -0.0214574 -0.0213104 -0.021163 -0.0210153 -0.0208673
+-0.0207189 -0.0205701 -0.020421 -0.0202715 -0.0201216 -0.0199714 -0.0198208
+-0.0196698 -0.0195185 -0.0193668 -0.0192147 -0.0190622 -0.0189094 -0.0187562
+-0.0186026 -0.0184486 -0.0182943 -0.0181395 -0.0179844 -0.0178289 -0.017673
+-0.0175167 -0.01736 -0.0172029 -0.0170455 -0.0168876 -0.0167293 -0.0165707
+-0.0164116 -0.0162521 -0.0160923 -0.015932 -0.0157713 -0.0156102 -0.0154487
+-0.0152868 -0.0151245 -0.0149617 -0.0147986 -0.014635 -0.014471 -0.0143066
+-0.0141418 -0.0139766 -0.0138109 -0.0136448 -0.0134783 -0.0133113 -0.0131439
+-0.0129761 -0.0128079 -0.0126392 -0.0124701 -0.0123005 -0.0121305 -0.0119601
+-0.0117892 -0.0116179 -0.0114461 -0.0112739 -0.0111012 -0.0109281 -0.0107546
+-0.0105806 -0.0104061 -0.0102312 -0.0100558 -0.00987995 -0.00970364
+-0.00952689 -0.00934966 -0.00917198 -0.00899382 -0.00881518 -0.0086361
+-0.00845654 -0.00827651 -0.00809601 -0.00791502 -0.00773356 -0.00755162
+-0.00736919 -0.0071863 -0.00700291 -0.00681906 -0.00663471 -0.00644987
+-0.00626455 -0.00607872 -0.00589241 -0.00570561 -0.00551832 -0.00533054
+-0.00514224 -0.00495345 -0.00476416 -0.00457438 -0.00438408 -0.0041933
+-0.00400199 -0.00381017 -0.00361785 -0.00342502 -0.00323169 -0.00303783
+-0.00284346 -0.00264857 -0.00245315 -0.00225723 -0.00206079 -0.00186383
+-0.00166633 -0.00146832 -0.00126976 -0.00107069 -0.000871101 -0.000670969
+-0.000470301 -0.000269102 -6.73617e-05 0.000134914 0.00033771 0.000541066
+0.00074496 0.00094938 0.00115436 0.00135988 0.00156595 0.00177256 0.00197973
+0.00218744 0.00239571 0.00260454 0.00281391 0.00302386 0.00323433 0.00344538
+0.003657 0.00386917 0.00408192 0.00429521 0.00450907 0.00472352 0.00493852
+0.00515408 0.00537023 0.00558695 0.00580423 0.00602211 0.00624055 0.00645957
+0.00667918 0.00689937 0.00712013 0.00734148 0.00756341 0.00778593 0.00800903
+0.00823273 0.00845702 0.00868189 0.00890737 0.00913343 0.0093601 0.00958733
+0.00981519 0.0100437 0.0102727 0.0105023 0.0107326 0.0109635 0.0111949
+0.011427 0.0116597 0.011893 0.0121269 0.0123614 0.0125965 0.0128323
+0.0130686 0.0133056 0.0135432 0.0137814 0.0140202 0.0142596 0.0144997
+0.0147404 0.0149817 0.0152236 0.0154662 0.0157094 0.0159532 0.0161977
+0.0164428 0.0166885 0.0169348 0.0171818 0.0174294 0.0176777 0.0179266
+0.0181761 0.0184263 0.0186771 0.0189286 0.0191807 0.0194334 0.0196868
+0.0199409 0.0201956 0.0204509 0.0207069 0.0209635 0.0212208 0.0214787
+0.0217373 0.0219966 0.0222565 0.022517 0.0227782 0.0230401 0.0233027
+0.0235659 0.0238297 0.0240942 0.0243594 0.0246252 0.0248917 0.0251589
+0.0254268 0.0256953 0.0259644 0.0262343 0.0265048 0.026776 0.0270479
+0.0273204 0.0275936 0.0278675 0.028142 0.0284172 0.0286932 0.0289697
+0.029247 0.0295249 0.0298036 0.0300829 0.0303629 0.0306435 0.0309249
+0.0312069 0.0314896 0.031773 0.0320571 0.0323419 0.0326274 0.0329135
+0.0332003 0.0334878 0.0337761 0.034065 0.0343546 0.0346448 0.0349358
+0.0352275 0.0355199 0.0358129 0.0361067 0.0364011 0.0366963 0.0369921
+0.0372886 0.0375859 0.0378838 0.0381824 0.0384818 0.0387818 0.0390825
+0.0393839 0.0396861 0.0399889 0.0402924 0.0405966 0.0409016 0.0412072
+0.0415136 0.0418206 0.0421284 0.0424368 0.042746 0.0430558 0.0433664
+0.0436777 0.0439897 0.0443023 0.0446157 0.0449298 0.0452446 0.0455601
+0.0458763 0.0461933 0.0465109 0.0468293 0.0471483 0.0474681 0.0477886
+0.0481097 0.0484316 0.0487542 0.0490775 0.0494015 0.0497262 0.0500517
+0.0503778 0.0507047 0.0510323 0.0513605 0.0516895 0.0520192 0.0523496
+0.0526808 0.0530126 0.0533451 0.0536784 0.0540123 0.054347 0.0546824
+0.0550185 0.0553553 0.0556928 0.056031 0.0563699 0.0567096 0.0570499
+0.057391 0.0577328 0.0580752 0.0584184 0.0587623 0.0591069 0.0594522
+0.0597983 0.060145 0.0604924 0.0608406 0.0611894 0.061539 0.0618892
+0.0622402 0.0625919 0.0629443 0.0632973 0.0636512 0.0640056 0.0643609
+0.0647167 0.0650734 0.0654307 0.0657887 0.0661474 0.0665068 0.0668669
+0.0672278 0.0675893 0.0679515 0.0683144 0.068678 0.0690423 0.0694073
+0.069773 0.0701394 0.0705065 0.0708743 0.0712428 0.071612 0.0719818
+0.0723524 0.0727237 0.0730956 0.0734682 0.0738416 0.0742156 0.0745903
+0.0749657 0.0753417 0.0757185 0.0760959 0.0764741 0.0768529 0.0772324
+0.0776125 0.0779934 0.0783749 0.0787571 0.07914 0.0795236 0.0799078
+0.0802927 0.0806783 0.0810646 0.0814515 0.0818391 0.0822274 0.0826163
+0.0830059 0.0833962 0.0837871 0.0841787 0.084571 0.0849639 0.0853575
+0.0857518 0.0861467 0.0865422 0.0869384 0.0873353 0.0877329 0.088131
+0.0885299 0.0889293 0.0893295 0.0897302 0.0901317 0.0905337 0.0909364
+0.0913398 0.0917437 0.0921484 0.0925536 0.0929595 0.0933661 0.0937732
+0.094181 0.0945894 0.0949985 0.0954082 0.0958185 0.0962294 0.096641
+0.0970532 0.0974659 0.0978793 0.0982934 0.098708 0.0991233 0.0995391
+0.0999556 0.100373 0.10079 0.101209 0.101628 0.102047 0.102467 0.102888
+0.103309 0.103731 0.104153 0.104576 0.105 0.105424 0.105849 0.106274
+0.1067 0.107127 0.107554 0.107982 0.10841 0.108839 0.109268 0.109698
+0.110129 0.11056 0.110992 0.111424 0.111857 0.11229 0.112724 0.113158
+0.113593 0.114029 0.114465 0.114901 0.115338 0.115776 0.116214 0.116653
+0.117092 0.117532 0.117972 0.118413 0.118854 0.119296 0.119739 0.120181
+0.120625 0.121069 0.121513 0.121958 0.122403 0.122849 0.123296 0.123743
+0.12419 0.124638 0.125086 0.125535 0.125984 0.126434 0.126884 0.127335
+0.127786 0.128238 0.12869 0.129142 0.129595 0.130049 0.130503 0.130957
+0.131412 0.131867 0.132323 0.132779 0.133236 0.133693 0.13415 0.134608
+0.135066 0.135525 0.135984 0.136444 0.136903 0.137364 0.137825 0.138286
+0.138747 0.139209 0.139671 0.140134 0.140597 0.141061 0.141525 0.141989
+0.142453 0.142918 0.143384 0.143849 0.144315 0.144782 0.145249 0.145716
+0.146183 0.146651 0.147119 0.147587 0.148056 0.148525 0.148995 0.149465
+0.149935 0.150405 0.150876 0.151347 0.151818 0.15229 0.152762 0.153234
+0.153706 0.154179 0.154652 0.155125 0.155599 0.156073 0.156547 0.157021
+0.157496 0.157971 0.158446 0.158922 0.159397 0.159873 0.160349 0.160826
+0.161302 0.161779 0.162256 0.162733 0.163211 0.163689 0.164166 0.164645
+0.165123 0.165601 0.16608 0.166559 0.167038 0.167517 0.167997 0.168476
+0.168956 0.169436 0.169916 0.170396 0.170876 0.171357 0.171837 0.172318
+0.172799 0.17328 0.173761 0.174242 0.174724 0.175205 0.175687 0.176168
+0.17665 0.177132 0.177614 0.178096 0.178578 0.17906 0.179542 0.180025
+0.180507 0.180989 0.181472 0.181954 0.182437 0.18292 0.183402 0.183885
+0.184368 0.18485 0.185333 0.185816 0.186298 0.186781 0.187264 0.187747
+0.188229 0.188712 0.189195 0.189677 0.19016 0.190642 0.191125 0.191607
+0.19209 0.192572 0.193054 0.193537 0.194019 0.194501 0.194983 0.195465
+0.195946 0.196428 0.19691 0.197391 0.197873;
+#A 6000 0.198354 0.198835 0.199316 0.199797 0.200278 0.200758 0.201239
+0.201719 0.202199 0.202679 0.203159 0.203639 0.204118 0.204597 0.205076
+0.205555 0.206034 0.206512 0.206991 0.207469 0.207946 0.208424 0.208901
+0.209378 0.209855 0.210332 0.210808 0.211284 0.21176 0.212236 0.212711
+0.213186 0.213661 0.214135 0.214609 0.215083 0.215557 0.21603 0.216503
+0.216975 0.217448 0.21792 0.218391 0.218862 0.219333 0.219804 0.220274
+0.220744 0.221213 0.221682 0.22215 0.222619 0.223086 0.223554 0.224021
+0.224487 0.224954 0.225419 0.225885 0.226349 0.226814 0.227278 0.227741
+0.228204 0.228667 0.229129 0.22959 0.230051 0.230512 0.230972 0.231432
+0.231891 0.232349 0.232807 0.233265 0.233722 0.234178 0.234634 0.23509
+0.235544 0.235998 0.236452 0.236905 0.237358 0.23781 0.238261 0.238711
+0.239162 0.239611 0.24006 0.240508 0.240956 0.241403 0.241849 0.242294
+0.242739 0.243184 0.243627 0.24407 0.244513 0.244954 0.245395 0.245835
+0.246275 0.246713 0.247151 0.247589 0.248025 0.248461 0.248896 0.249331
+0.249764 0.250197 0.250629 0.25106 0.251491 0.25192 0.252349 0.252777
+0.253205 0.253631 0.254057 0.254481 0.254905 0.255329 0.255751 0.256172
+0.256593 0.257012 0.257431 0.257849 0.258266 0.258682 0.259097 0.259512
+0.259925 0.260338 0.260749 0.26116 0.261569 0.261978 0.262386 0.262793
+0.263199 0.263603 0.264007 0.26441 0.264812 0.265213 0.265613 0.266012
+0.266409 0.266806 0.267202 0.267597 0.267991 0.268383 0.268775 0.269165
+0.269555 0.269943 0.27033 0.270716 0.271101 0.271485 0.271868 0.27225
+0.27263 0.27301 0.273388 0.273765 0.274141 0.274516 0.27489 0.275262
+0.275633 0.276004 0.276372 0.27674 0.277107 0.277472 0.277836 0.278199
+0.27856 0.278921 0.27928 0.279637 0.279994 0.280349 0.280703 0.281056
+0.281407 0.281757 0.282106 0.282454 0.2828 0.283145 0.283488 0.28383
+0.284171 0.28451 0.284848 0.285185 0.28552 0.285854 0.286187 0.286518
+0.286848 0.287176 0.287503 0.287829 0.288153 0.288475 0.288796 0.289116
+0.289434 0.289751 0.290066 0.29038 0.290693 0.291003 0.291313 0.291621
+0.291927 0.292232 0.292535 0.292837 0.293137 0.293436 0.293733 0.294028
+0.294322 0.294614 0.294905 0.295194 0.295482 0.295768 0.296052 0.296335
+0.296616 0.296896 0.297173 0.29745 0.297724 0.297997 0.298268 0.298538
+0.298806 0.299072 0.299336 0.299599 0.29986 0.300119 0.300377 0.300633
+0.300887 0.301139 0.30139 0.301639 0.301886 0.302131 0.302375 0.302617
+0.302856 0.303095 0.303331 0.303566 0.303798 0.304029 0.304258 0.304485
+0.304711 0.304934 0.305156 0.305376 0.305594 0.30581 0.306024 0.306236
+0.306446 0.306655 0.306861 0.307066 0.307268 0.307469 0.307668 0.307865
+0.308059 0.308252 0.308443 0.308632 0.308819 0.309004 0.309187 0.309368
+0.309547 0.309724 0.309898 0.310071 0.310242 0.310411 0.310577 0.310742
+0.310905 0.311065 0.311224 0.31138 0.311534 0.311686 0.311836 0.311984
+0.31213 0.312274 0.312415 0.312554 0.312692 0.312827 0.31296 0.31309
+0.313219 0.313345 0.313469 0.313592 0.313711 0.313829 0.313944 0.314057
+0.314168 0.314277 0.314384 0.314488 0.31459 0.314689 0.314787 0.314882
+0.314975 0.315065 0.315154 0.31524 0.315323 0.315405 0.315484 0.315561
+0.315635 0.315707 0.315777 0.315844 0.315909 0.315972 0.316032 0.31609
+0.316146 0.316199 0.316249 0.316298 0.316344 0.316387 0.316428 0.316467
+0.316503 0.316537 0.316568 0.316597 0.316624 0.316648 0.316669 0.316688
+0.316705 0.316719 0.316731 0.31674 0.316746 0.31675 0.316752 0.316751
+0.316747 0.316741 0.316733 0.316722 0.316708 0.316692 0.316673 0.316651
+0.316628 0.316601 0.316572 0.31654 0.316506 0.316469 0.316429 0.316387
+0.316342 0.316295 0.316245 0.316192 0.316137 0.316079 0.316018 0.315955
+0.315889 0.31582 0.315749 0.315675 0.315598 0.315518 0.315436 0.315351
+0.315264 0.315173 0.31508 0.314985 0.314886 0.314785 0.314681 0.314574
+0.314465 0.314352 0.314237 0.314119 0.313999 0.313875 0.313749 0.31362
+0.313488 0.313354 0.313216 0.313076 0.312933 0.312787 0.312639 0.312487
+0.312333 0.312175 0.312015 0.311852 0.311686 0.311518 0.311346 0.311172
+0.310994 0.310814 0.310631 0.310445 0.310256 0.310064 0.309869 0.309672
+0.309471 0.309268 0.309061 0.308852 0.308639 0.308424 0.308206 0.307985
+0.307761 0.307533 0.307303 0.30707 0.306834 0.306595 0.306353 0.306108
+0.30586 0.305609 0.305355 0.305098 0.304838 0.304575 0.304308 0.304039
+0.303767 0.303492 0.303214 0.302932 0.302648 0.30236 0.30207 0.301776
+0.30148 0.30118 0.300877 0.300571 0.300262 0.29995 0.299635 0.299317
+0.298996 0.298671 0.298344 0.298013 0.297679 0.297342 0.297002 0.296659
+0.296313 0.295963 0.295611 0.295255 0.294896 0.294534 0.294169 0.293801
+0.293429 0.293055 0.292677 0.292296 0.291912 0.291524 0.291134 0.29074
+0.290343 0.289943 0.28954 0.289133 0.288724 0.288311 0.287895 0.287475
+0.287053 0.286627 0.286198 0.285766 0.28533 0.284892 0.28445 0.284005
+0.283556 0.283105 0.28265 0.282191 0.28173 0.281265 0.280798 0.280326
+0.279852 0.279374 0.278893 0.278409 0.277922 0.277431 0.276937 0.276439
+0.275939 0.275435 0.274928 0.274417 0.273903 0.273386 0.272866 0.272342
+0.271815 0.271285 0.270751 0.270214 0.269674 0.26913 0.268583 0.268033
+0.26748 0.266923 0.266363 0.265799 0.265232 0.264662 0.264089 0.263512
+0.262932 0.262348 0.261761 0.261171 0.260577 0.25998 0.25938 0.258777
+0.25817 0.257559 0.256946 0.256329 0.255708 0.255084 0.254457 0.253827
+0.253193 0.252556 0.251915 0.251271 0.250624 0.249973 0.249319 0.248662
+0.248001 0.247337 0.246669 0.245999 0.245324 0.244647 0.243965 0.243281
+0.242593 0.241902 0.241207 0.240509 0.239808 0.239103 0.238395 0.237684
+0.236969 0.23625 0.235529 0.234804 0.234075 0.233343 0.232608 0.231869
+0.231127 0.230382 0.229633 0.228881 0.228125 0.227366 0.226604 0.225838
+0.225069 0.224296 0.22352 0.222741 0.221958 0.221172 0.220382 0.219589
+0.218793 0.217993 0.21719 0.216383 0.215573 0.21476 0.213943 0.213123
+0.2123 0.211473 0.210643 0.209809 0.208972 0.208131 0.207288 0.20644
+0.20559 0.204736 0.203878 0.203017 0.202153 0.201286 0.200415 0.19954
+0.198663 0.197782 0.196897 0.196009 0.195118 0.194224 0.193326 0.192424
+0.19152 0.190611 0.1897 0.188785 0.187867 0.186945 0.18602 0.185092
+0.184161 0.183226 0.182287 0.181345 0.1804 0.179452 0.1785 0.177545
+0.176586 0.175625 0.174659 0.173691 0.172719 0.171744 0.170765 0.169784
+0.168798 0.16781 0.166818 0.165823 0.164824 0.163822 0.162817 0.161809
+0.160797 0.159782 0.158763 0.157742 0.156717 0.155688 0.154657 0.153622
+0.152583 0.151542 0.150497 0.149449 0.148398 0.147343 0.146285 0.145224
+0.144159 0.143092 0.142021 0.140946 0.139869 0.138788 0.137704 0.136616
+0.135526 0.134432 0.133335 0.132235 0.131131 0.130024 0.128914 0.127801
+0.126685 0.125565 0.124442 0.123316 0.122187 0.121054 0.119919 0.11878
+0.117638 0.116492 0.115344 0.114192 0.113037 0.111879 0.110718 0.109554
+0.108386 0.107216 0.106042 0.104865 0.103685 0.102502 0.101315 0.100126
+0.0989332 0.0977375 0.0965386 0.0953366 0.0941315 0.0929233 0.091712
+0.0904976 0.0892801 0.0880595 0.0868359 0.0856092 0.0843793 0.0831465
+0.0819105 0.0806716 0.0794295 0.0781844 0.0769363 0.0756851 0.0744309
+0.0731736 0.0719134 0.0706501 0.0693838 0.0681145 0.0668423 0.065567
+0.0642887 0.0630074 0.0617231 0.0604359 0.0591457 0.0578526 0.0565565
+0.0552574 0.0539554 0.0526504 0.0513425 0.0500317 0.048718 0.0474013
+0.0460817 0.0447593 0.0434339 0.0421056 0.0407745 0.0394404 0.0381035
+0.0367637 0.035421 0.0340756 0.0327272 0.031376 0.030022 0.0286651
+0.0273054 0.0259428 0.0245775 0.0232094 0.0218384 0.0204647 0.0190882
+0.0177089 0.0163268 0.014942 0.0135544 0.012164 0.0107709 0.0093751
+0.00797651 0.00657521 0.00517121 0.00376449 0.00235504 0.00094293 -0.000471906
+-0.0018894 -0.00330959 -0.00473244 -0.00615795 -0.00758612 -0.00901695
+-0.0104504 -0.0118865 -0.0133252 -0.0147665 -0.0162105 -0.017657 -0.0191061
+-0.0205579 -0.0220122 -0.023469 -0.0249285 -0.0263905 -0.027855 -0.0293221
+-0.0307917 -0.0322639 -0.0337386 -0.0352157 -0.0366954 -0.0381776 -0.0396623
+-0.0411494 -0.042639 -0.0441311 -0.0456256 -0.0471225 -0.048622 -0.0501238
+-0.051628 -0.0531347 -0.0546438 -0.0561552 -0.0576691 -0.0591853 -0.0607039
+-0.0622248 -0.0637482 -0.0652738 -0.0668018 -0.0683321 -0.0698647 -0.0713997
+-0.0729369 -0.0744765 -0.0760183 -0.0775624 -0.0791087 -0.0806573 -0.0822082
+-0.0837613 -0.0853166 -0.0868741 -0.0884339 -0.0899959 -0.09156 -0.0931263
+-0.0946949 -0.0962655 -0.0978384 -0.0994133 -0.10099 -0.10257 -0.104151
+-0.105734 -0.10732 -0.108908 -0.110497 -0.112089 -0.113683 -0.115279
+-0.116877 -0.118477 -0.120079 -0.121683 -0.123289 -0.124897 -0.126507
+-0.128119 -0.129733 -0.131349 -0.132966 -0.134586 -0.136208 -0.137831
+-0.139457 -0.141084 -0.142714 -0.144345 -0.145978 -0.147613 -0.149249
+-0.150888 -0.152528 -0.15417 -0.155814 -0.15746 -0.159107 -0.160757
+-0.162408 -0.16406 -0.165715 -0.167371 -0.169029 -0.170689 -0.17235
+-0.174013 -0.175678 -0.177344 -0.179012 -0.180682 -0.182353 -0.184026
+-0.1857 -0.187376 -0.189054 -0.190733 -0.192414 -0.194096 -0.19578
+-0.197466 -0.199153 -0.200841 -0.202531 -0.204222 -0.205915 -0.20761
+-0.209305 -0.211003 -0.212701 -0.214401 -0.216103 -0.217806 -0.21951
+-0.221215 -0.222922 -0.224631 -0.22634 -0.228051 -0.229764 -0.231477
+-0.233192 -0.234908 -0.236626 -0.238344 -0.240064 -0.241785 -0.243507
+-0.245231 -0.246956 -0.248682 -0.250409 -0.252137 -0.253866 -0.255597
+-0.257328 -0.259061 -0.260795 -0.26253 -0.264266 -0.266003 -0.267741
+-0.26948 -0.27122 -0.272961 -0.274703 -0.276446;
+#A 7000 -0.27819 -0.279935 -0.281681 -0.283428 -0.285176 -0.286925
+-0.288674 -0.290425 -0.292176 -0.293928 -0.295682 -0.297435 -0.29919
+-0.300946 -0.302702 -0.304459 -0.306217 -0.307976 -0.309735 -0.311495
+-0.313256 -0.315018 -0.31678 -0.318543 -0.320306 -0.32207 -0.323835
+-0.325601 -0.327367 -0.329134 -0.330901 -0.332669 -0.334437 -0.336206
+-0.337976 -0.339746 -0.341516 -0.343287 -0.345059 -0.346831 -0.348603
+-0.350376 -0.352149 -0.353923 -0.355697 -0.357472 -0.359246 -0.361022
+-0.362797 -0.364573 -0.36635 -0.368126 -0.369903 -0.37168 -0.373457
+-0.375235 -0.377013 -0.378791 -0.380569 -0.382348 -0.384127 -0.385905
+-0.387685 -0.389464 -0.391243 -0.393022 -0.394802 -0.396581 -0.398361
+-0.400141 -0.401921 -0.4037 -0.40548 -0.40726 -0.40904 -0.41082 -0.4126
+-0.414379 -0.416159 -0.417938 -0.419718 -0.421497 -0.423277 -0.425056
+-0.426835 -0.428613 -0.430392 -0.43217 -0.433949 -0.435727 -0.437504
+-0.439282 -0.441059 -0.442836 -0.444613 -0.446389 -0.448165 -0.449941
+-0.451716 -0.453491 -0.455266 -0.45704 -0.458814 -0.460588 -0.462361
+-0.464133 -0.465905 -0.467677 -0.469448 -0.471218 -0.472989 -0.474758
+-0.476527 -0.478296 -0.480063 -0.481831 -0.483597 -0.485363 -0.487129
+-0.488893 -0.490658 -0.492421 -0.494184 -0.495946 -0.497707 -0.499467
+-0.501227 -0.502986 -0.504744 -0.506502 -0.508258 -0.510014 -0.511769
+-0.513523 -0.515276 -0.517029 -0.51878 -0.520531 -0.52228 -0.524029
+-0.525777 -0.527523 -0.529269 -0.531014 -0.532758 -0.5345 -0.536242
+-0.537983 -0.539722 -0.54146 -0.543198 -0.544934 -0.546669 -0.548403
+-0.550136 -0.551867 -0.553597 -0.555327 -0.557054 -0.558781 -0.560507
+-0.562231 -0.563954 -0.565675 -0.567395 -0.569114 -0.570832 -0.572548
+-0.574263 -0.575976 -0.577689 -0.579399 -0.581108 -0.582816 -0.584522
+-0.586227 -0.587931 -0.589632 -0.591333 -0.593032 -0.594729 -0.596424
+-0.598118 -0.599811 -0.601502 -0.603191 -0.604879 -0.606565 -0.608249
+-0.609931 -0.611612 -0.613292 -0.614969 -0.616645 -0.618318 -0.619991
+-0.621661 -0.62333 -0.624996 -0.626661 -0.628324 -0.629985 -0.631645
+-0.633302 -0.634958 -0.636611 -0.638263 -0.639913 -0.64156 -0.643206
+-0.64485 -0.646492 -0.648131 -0.649769 -0.651405 -0.653038 -0.65467
+-0.656299 -0.657926 -0.659551 -0.661174 -0.662795 -0.664413 -0.66603
+-0.667644 -0.669256 -0.670866 -0.672473 -0.674078 -0.675681 -0.677282
+-0.67888 -0.680476 -0.68207 -0.683661 -0.68525 -0.686837 -0.688421
+-0.690003 -0.691582 -0.693159 -0.694733 -0.696305 -0.697875 -0.699442
+-0.701006 -0.702568 -0.704127 -0.705684 -0.707238 -0.70879 -0.710339
+-0.711885 -0.713429 -0.71497 -0.716509 -0.718045 -0.719578 -0.721108
+-0.722636 -0.724161 -0.725683 -0.727202 -0.728719 -0.730233 -0.731744
+-0.733252 -0.734757 -0.73626 -0.737759 -0.739256 -0.74075 -0.742241
+-0.743729 -0.745214 -0.746696 -0.748175 -0.749652 -0.751125 -0.752595
+-0.754062 -0.755526 -0.756987 -0.758445 -0.7599 -0.761352 -0.762801
+-0.764246 -0.765689 -0.767128 -0.768564 -0.769997 -0.771427 -0.772853
+-0.774277 -0.775697 -0.777113 -0.778527 -0.779937 -0.781344 -0.782748
+-0.784148 -0.785545 -0.786939 -0.788329 -0.789716 -0.7911 -0.79248
+-0.793856 -0.79523 -0.796599 -0.797966 -0.799329 -0.800688 -0.802044
+-0.803396 -0.804745 -0.80609 -0.807432 -0.80877 -0.810105 -0.811436
+-0.812763 -0.814087 -0.815407 -0.816723 -0.818036 -0.819345 -0.82065
+-0.821952 -0.82325 -0.824544 -0.825835 -0.827121 -0.828404 -0.829683
+-0.830959 -0.83223 -0.833498 -0.834762 -0.836022 -0.837278 -0.83853
+-0.839778 -0.841023 -0.842263 -0.8435 -0.844732 -0.845961 -0.847186
+-0.848406 -0.849623 -0.850836 -0.852045 -0.853249 -0.85445 -0.855646
+-0.856839 -0.858027 -0.859211 -0.860391 -0.861567 -0.862739 -0.863907
+-0.86507 -0.86623 -0.867385 -0.868536 -0.869682 -0.870825 -0.871963
+-0.873097 -0.874227 -0.875352 -0.876473 -0.87759 -0.878703 -0.879811
+-0.880915 -0.882014 -0.883109 -0.8842 -0.885287 -0.886369 -0.887446
+-0.888519 -0.889588 -0.890652 -0.891712 -0.892767 -0.893818 -0.894864
+-0.895906 -0.896943 -0.897976 -0.899004 -0.900028 -0.901047 -0.902061
+-0.903071 -0.904076 -0.905077 -0.906073 -0.907064 -0.908051 -0.909033
+-0.91001 -0.910983 -0.911951 -0.912914 -0.913873 -0.914826 -0.915775
+-0.91672 -0.917659 -0.918594 -0.919524 -0.920449 -0.921369 -0.922285
+-0.923196 -0.924101 -0.925002 -0.925898 -0.92679 -0.927676 -0.928558
+-0.929434 -0.930306 -0.931172 -0.932034 -0.932891 -0.933743 -0.934589
+-0.935431 -0.936268 -0.9371 -0.937927 -0.938749 -0.939565 -0.940377
+-0.941184 -0.941985 -0.942782 -0.943573 -0.944359 -0.945141 -0.945917
+-0.946688 -0.947454 -0.948214 -0.94897 -0.94972 -0.950465 -0.951205
+-0.95194 -0.952669 -0.953394 -0.954113 -0.954827 -0.955535 -0.956239
+-0.956937 -0.957629 -0.958317 -0.958999 -0.959676 -0.960348 -0.961014
+-0.961675 -0.96233 -0.962981 -0.963625 -0.964265 -0.964899 -0.965528
+-0.966151 -0.966769 -0.967382 -0.967989 -0.96859 -0.969187 -0.969777
+-0.970363 -0.970942 -0.971517 -0.972086 -0.972649 -0.973207 -0.973759
+-0.974306 -0.974847 -0.975383 -0.975913 -0.976438 -0.976957 -0.977471
+-0.977979 -0.978481 -0.978978 -0.979469 -0.979954 -0.980434 -0.980909
+-0.981377 -0.98184 -0.982298 -0.982749 -0.983195 -0.983636 -0.98407
+-0.9845 -0.984923 -0.98534 -0.985752 -0.986158 -0.986559 -0.986954
+-0.987343 -0.987726 -0.988103 -0.988475 -0.988841 -0.989201 -0.989556
+-0.989904 -0.990247 -0.990584 -0.990915 -0.99124 -0.99156 -0.991874
+-0.992182 -0.992483 -0.99278 -0.99307 -0.993354 -0.993633 -0.993906
+-0.994172 -0.994433 -0.994688 -0.994938 -0.995181 -0.995418 -0.995649
+-0.995875 -0.996094 -0.996308 -0.996516 -0.996717 -0.996913 -0.997103
+-0.997287 -0.997464 -0.997636 -0.997802 -0.997962 -0.998116 -0.998264
+-0.998406 -0.998542 -0.998672 -0.998795 -0.998913 -0.999025 -0.999131
+-0.99923 -0.999324 -0.999412 -0.999493 -0.999569 -0.999638 -0.999701
+-0.999759 -0.99981 -0.999855 -0.999894 -0.999927 -0.999954 -0.999974
+-0.999989 -0.999998 -1 -0.999996 -0.999986 -0.99997 -0.999948 -0.99992
+-0.999886 -0.999845 -0.999798 -0.999746 -0.999687 -0.999622 -0.99955
+-0.999473 -0.999389 -0.999299 -0.999203 -0.999101 -0.998993 -0.998878
+-0.998758 -0.998631 -0.998498 -0.998358 -0.998213 -0.998061 -0.997903
+-0.997739 -0.997569 -0.997392 -0.997209 -0.99702 -0.996825 -0.996624
+-0.996416 -0.996202 -0.995982 -0.995755 -0.995523 -0.995284 -0.995039
+-0.994787 -0.99453 -0.994266 -0.993996 -0.993719 -0.993437 -0.993148
+-0.992853 -0.992552 -0.992244 -0.99193 -0.99161 -0.991283 -0.990951
+-0.990612 -0.990266 -0.989915 -0.989557 -0.989193 -0.988822 -0.988446
+-0.988063 -0.987674 -0.987278 -0.986876 -0.986468 -0.986054 -0.985633
+-0.985206 -0.984773 -0.984334 -0.983888 -0.983436 -0.982978 -0.982513
+-0.982042 -0.981565 -0.981082 -0.980592 -0.980096 -0.979593 -0.979085
+-0.97857 -0.978049 -0.977521 -0.976987 -0.976447 -0.975901 -0.975348
+-0.974789 -0.974224 -0.973652 -0.973074 -0.97249 -0.9719 -0.971303
+-0.9707 -0.970091 -0.969476 -0.968854 -0.968226 -0.967591 -0.966951
+-0.966304 -0.965651 -0.964991 -0.964325 -0.963654 -0.962975 -0.962291
+-0.9616 -0.960903 -0.960199 -0.95949 -0.958774 -0.958052 -0.957323
+-0.956589 -0.955848 -0.955101 -0.954347 -0.953588 -0.952822 -0.95205
+-0.951271 -0.950487 -0.949696 -0.948899 -0.948096 -0.947286 -0.94647
+-0.945648 -0.94482 -0.943986 -0.943145 -0.942298 -0.941445 -0.940586
+-0.939721 -0.938849 -0.937971 -0.937087 -0.936197 -0.935301 -0.934398
+-0.933489 -0.932574 -0.931653 -0.930726 -0.929792 -0.928853 -0.927907
+-0.926955 -0.925997 -0.925033 -0.924062 -0.923086 -0.922103 -0.921115
+-0.92012 -0.919119 -0.918112 -0.917098 -0.916079 -0.915054 -0.914022
+-0.912984 -0.911941 -0.910891 -0.909835 -0.908773 -0.907705 -0.906631
+-0.90555 -0.904464 -0.903372 -0.902274 -0.901169 -0.900059 -0.898942
+-0.89782 -0.896691 -0.895557 -0.894416 -0.89327 -0.892117 -0.890959
+-0.889794 -0.888624 -0.887447 -0.886265 -0.885076 -0.883882 -0.882682
+-0.881475 -0.880263 -0.879045 -0.877821 -0.876591 -0.875355 -0.874113
+-0.872865 -0.871612 -0.870352 -0.869087 -0.867815 -0.866538 -0.865255
+-0.863966 -0.862672 -0.861371 -0.860065 -0.858752 -0.857434 -0.85611
+-0.854781 -0.853445 -0.852104 -0.850757 -0.849404 -0.848045 -0.846681
+-0.845311 -0.843935 -0.842553 -0.841166 -0.839773 -0.838374 -0.836969
+-0.835559 -0.834143 -0.832721 -0.831294 -0.829861 -0.828422 -0.826978
+-0.825528 -0.824072 -0.822611 -0.821144 -0.819672 -0.818194 -0.81671
+-0.81522 -0.813726 -0.812225 -0.810719 -0.809208 -0.807691 -0.806168
+-0.80464 -0.803106 -0.801567 -0.800022 -0.798472 -0.796916 -0.795355
+-0.793788 -0.792216 -0.790639 -0.789056 -0.787467 -0.785873 -0.784274
+-0.78267 -0.78106 -0.779444 -0.777823 -0.776197 -0.774566 -0.772929
+-0.771287 -0.769639 -0.767986 -0.766328 -0.764665 -0.762996 -0.761322
+-0.759643 -0.757959 -0.756269 -0.754574 -0.752874 -0.751168 -0.749458
+-0.747742 -0.746021 -0.744295 -0.742564 -0.740827 -0.739086 -0.737339
+-0.735587 -0.73383 -0.732068 -0.730301 -0.728529 -0.726752 -0.72497
+-0.723182 -0.72139 -0.719593 -0.71779 -0.715983 -0.714171 -0.712353
+-0.710531 -0.708704 -0.706872 -0.705035 -0.703193 -0.701346 -0.699494
+-0.697638 -0.695776 -0.69391 -0.692039 -0.690163 -0.688282 -0.686396
+-0.684506 -0.682611 -0.680711 -0.678806 -0.676897 -0.674983 -0.673064
+-0.67114 -0.669212 -0.667279 -0.665341 -0.663399 -0.661452 -0.6595
+-0.657544 -0.655583 -0.653618 -0.651648 -0.649673 -0.647694 -0.645711
+-0.643723 -0.64173 -0.639733 -0.637731 -0.635725 -0.633714 -0.631699
+-0.62968 -0.627656 -0.625628 -0.623595 -0.621558 -0.619516 -0.61747
+-0.61542 -0.613366 -0.611307 -0.609244 -0.607176 -0.605105 -0.603029
+-0.600949 -0.598864 -0.596776 -0.594683 -0.592586 -0.590485 -0.588379
+-0.58627 -0.584156 -0.582038 -0.579917 -0.577791 -0.575661 -0.573526
+-0.571388 -0.569246 -0.5671 -0.56495 -0.562796 -0.560637 -0.558475
+-0.556309 -0.554139 -0.551965 -0.549788 -0.547606 -0.54542 -0.543231
+-0.541038 -0.53884 -0.53664 -0.534435 -0.532226 -0.530014 -0.527798
+-0.525578 -0.523355 -0.521128 -0.518897 -0.516662 -0.514424 -0.512182
+-0.509937 -0.507688 -0.505435 -0.503179 -0.500919 -0.498655 -0.496388
+-0.494118 -0.491844 -0.489566 -0.487285 -0.485001;
+#A 8000 -0.482713 -0.480422 -0.478127 -0.475829 -0.473528 -0.471223
+-0.468915 -0.466603 -0.464288 -0.46197 -0.459649 -0.457324 -0.454996
+-0.452665 -0.45033 -0.447993 -0.445652 -0.443308 -0.440961 -0.438611
+-0.436257 -0.433901 -0.431541 -0.429179 -0.426813 -0.424444 -0.422072
+-0.419698 -0.41732 -0.414939 -0.412555 -0.410169 -0.407779 -0.405387
+-0.402991 -0.400593 -0.398192 -0.395788 -0.393381 -0.390972 -0.388559
+-0.386144 -0.383726 -0.381306 -0.378882 -0.376456 -0.374027 -0.371596
+-0.369162 -0.366725 -0.364286 -0.361844 -0.359399 -0.356952 -0.354503
+-0.35205 -0.349596 -0.347139 -0.344679 -0.342217 -0.339752 -0.337285
+-0.334816 -0.332344 -0.32987 -0.327393 -0.324914 -0.322433 -0.319949
+-0.317464 -0.314976 -0.312485 -0.309993 -0.307498 -0.305001 -0.302502
+-0.3 -0.297497 -0.294991 -0.292483 -0.289973 -0.287462 -0.284948 -0.282432
+-0.279913 -0.277393 -0.274871 -0.272347 -0.269821 -0.267293 -0.264764
+-0.262232 -0.259698 -0.257163 -0.254626 -0.252086 -0.249546 -0.247003
+-0.244458 -0.241912 -0.239364 -0.236814 -0.234263 -0.23171 -0.229155
+-0.226599 -0.224041 -0.221481 -0.21892 -0.216357 -0.213793 -0.211227
+-0.20866 -0.206091 -0.20352 -0.200948 -0.198375 -0.195801 -0.193224
+-0.190647 -0.188068 -0.185488 -0.182906 -0.180323 -0.177739 -0.175154
+-0.172567 -0.169979 -0.16739 -0.1648 -0.162208 -0.159616 -0.157022
+-0.154427 -0.151831 -0.149234 -0.146635 -0.144036 -0.141436 -0.138834
+-0.136232 -0.133629 -0.131024 -0.128419 -0.125813 -0.123206 -0.120598
+-0.117989 -0.115379 -0.112769 -0.110158 -0.107546 -0.104933 -0.102319
+-0.0997047 -0.0970896 -0.0944739 -0.0918574 -0.0892403 -0.0866226 -0.0840042
+-0.0813852 -0.0787656 -0.0761455 -0.0735248 -0.0709036 -0.0682819 -0.0656597
+-0.063037 -0.0604139 -0.0577903 -0.0551663 -0.0525419 -0.0499172 -0.047292
+-0.0446666 -0.0420408 -0.0394147 -0.0367883 -0.0341617 -0.0315348 -0.0289077
+-0.0262804 -0.0236529 -0.0210252 -0.0183974 -0.0157695 -0.0131414 -0.0105132
+-0.00788498 -0.00525669 -0.00262835;
+#X coords 0 1 8191 -1 100 70 1;
+#X restore 355 67 graph;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array window 8192 float 3;
+#A 0 0 0.00490196 0.00980392 0.0147059 0.0196078 0.0245098 0.0294118
+0.0343137 0.0392157 0.0441176 0.0490196 0.0539216 0.0588235 0.0637255
+0.0686275 0.0735294 0.0784314 0.0833333 0.0882353 0.0931373 0.0980392
+0.102941 0.107843 0.112745 0.117647 0.122549 0.127451 0.132353 0.137255
+0.142157 0.147059 0.151961 0.156863 0.161765 0.166667 0.171569 0.176471
+0.181373 0.186275 0.191176 0.196078 0.20098 0.205882 0.210784 0.215686
+0.220588 0.22549 0.230392 0.235294 0.240196 0.245098 0.25 0.254902
+0.259804 0.264706 0.269608 0.27451 0.279412 0.284314 0.289216 0.294118
+0.29902 0.303922 0.308824 0.313726 0.318627 0.323529 0.328431 0.333333
+0.338235 0.343137 0.348039 0.352941 0.357843 0.362745 0.367647 0.372549
+0.377451 0.382353 0.387255 0.392157 0.397059 0.401961 0.406863 0.411765
+0.416667 0.421569 0.426471 0.431373 0.436274 0.441176 0.446078 0.45098
+0.455882 0.460784 0.465686 0.470588 0.47549 0.480392 0.485294 0.490196
+0.495098 0.5 0.504902 0.509804 0.514706 0.519608 0.52451 0.529412 0.534314
+0.539216 0.544118 0.54902 0.553922 0.558824 0.563725 0.568627 0.573529
+0.578431 0.583333 0.588235 0.593137 0.598039 0.602941 0.607843 0.612745
+0.617647 0.622549 0.627451 0.632353 0.637255 0.642157 0.647059 0.651961
+0.656863 0.661765 0.666667 0.671569 0.676471 0.681373 0.686275 0.691176
+0.696078 0.70098 0.705882 0.710784 0.715686 0.720588 0.72549 0.730392
+0.735294 0.740196 0.745098 0.75 0.754902 0.759804 0.764706 0.769608
+0.77451 0.779412 0.784314 0.789216 0.794118 0.79902 0.803922 0.808824
+0.813725 0.818627 0.823529 0.828431 0.833333 0.838235 0.843137 0.848039
+0.852941 0.857843 0.862745 0.867647 0.872549 0.877451 0.882353 0.887255
+0.892157 0.897059 0.901961 0.906863 0.911765 0.916667 0.921569 0.926471
+0.931373 0.936275 0.941176 0.946078 0.95098 0.955882 0.960784 0.965686
+0.970588 0.97549 0.980392 0.985294 0.990196 0.995098 1 0.999875 0.99975
+0.999624 0.999499 0.999374 0.999249 0.999124 0.998999 0.998873 0.998748
+0.998623 0.998498 0.998373 0.998247 0.998122 0.997997 0.997872 0.997747
+0.997621 0.997496 0.997371 0.997246 0.997121 0.996996 0.99687 0.996745
+0.99662 0.996495 0.99637 0.996244 0.996119 0.995994 0.995869 0.995744
+0.995618 0.995493 0.995368 0.995243 0.995118 0.994992 0.994867 0.994742
+0.994617 0.994492 0.994367 0.994241 0.994116 0.993991 0.993866 0.993741
+0.993615 0.99349 0.993365 0.99324 0.993115 0.992989 0.992864 0.992739
+0.992614 0.992489 0.992364 0.992238 0.992113 0.991988 0.991863 0.991738
+0.991612 0.991487 0.991362 0.991237 0.991112 0.990986 0.990861 0.990736
+0.990611 0.990486 0.990361 0.990235 0.99011 0.989985 0.98986 0.989735
+0.989609 0.989484 0.989359 0.989234 0.989109 0.988983 0.988858 0.988733
+0.988608 0.988483 0.988358 0.988232 0.988107 0.987982 0.987857 0.987732
+0.987606 0.987481 0.987356 0.987231 0.987106 0.98698 0.986855 0.98673
+0.986605 0.98648 0.986355 0.986229 0.986104 0.985979 0.985854 0.985729
+0.985603 0.985478 0.985353 0.985228 0.985103 0.984977 0.984852 0.984727
+0.984602 0.984477 0.984352 0.984226 0.984101 0.983976 0.983851 0.983726
+0.9836 0.983475 0.98335 0.983225 0.9831 0.982974 0.982849 0.982724
+0.982599 0.982474 0.982349 0.982223 0.982098 0.981973 0.981848 0.981723
+0.981597 0.981472 0.981347 0.981222 0.981097 0.980971 0.980846 0.980721
+0.980596 0.980471 0.980346 0.98022 0.980095 0.97997 0.979845 0.97972
+0.979594 0.979469 0.979344 0.979219 0.979094 0.978968 0.978843 0.978718
+0.978593 0.978468 0.978343 0.978217 0.978092 0.977967 0.977842 0.977717
+0.977591 0.977466 0.977341 0.977216 0.977091 0.976965 0.97684 0.976715
+0.97659 0.976465 0.97634 0.976214 0.976089 0.975964 0.975839 0.975714
+0.975588 0.975463 0.975338 0.975213 0.975088 0.974962 0.974837 0.974712
+0.974587 0.974462 0.974337 0.974211 0.974086 0.973961 0.973836 0.973711
+0.973585 0.97346 0.973335 0.97321 0.973085 0.972959 0.972834 0.972709
+0.972584 0.972459 0.972333 0.972208 0.972083 0.971958 0.971833 0.971708
+0.971582 0.971457 0.971332 0.971207 0.971082 0.970956 0.970831 0.970706
+0.970581 0.970456 0.97033 0.970205 0.97008 0.969955 0.96983 0.969705
+0.969579 0.969454 0.969329 0.969204 0.969079 0.968953 0.968828 0.968703
+0.968578 0.968453 0.968327 0.968202 0.968077 0.967952 0.967827 0.967702
+0.967576 0.967451 0.967326 0.967201 0.967076 0.96695 0.966825 0.9667
+0.966575 0.96645 0.966325 0.966199 0.966074 0.965949 0.965824 0.965699
+0.965573 0.965448 0.965323 0.965198 0.965073 0.964947 0.964822 0.964697
+0.964572 0.964447 0.964321 0.964196 0.964071 0.963946 0.963821 0.963696
+0.96357 0.963445 0.96332 0.963195 0.96307 0.962944 0.962819 0.962694
+0.962569 0.962444 0.962318 0.962193 0.962068 0.961943 0.961818 0.961693
+0.961567 0.961442 0.961317 0.961192 0.961067 0.960941 0.960816 0.960691
+0.960566 0.960441 0.960315 0.96019 0.960065 0.95994 0.959815 0.95969
+0.959564 0.959439 0.959314 0.959189 0.959064 0.958938 0.958813 0.958688
+0.958563 0.958438 0.958312 0.958187 0.958062 0.957937 0.957812 0.957687
+0.957561 0.957436 0.957311 0.957186 0.957061 0.956935 0.95681 0.956685
+0.95656 0.956435 0.956309 0.956184 0.956059 0.955934 0.955809 0.955684
+0.955558 0.955433 0.955308 0.955183 0.955058 0.954932 0.954807 0.954682
+0.954557 0.954432 0.954306 0.954181 0.954056 0.953931 0.953806 0.953681
+0.953555 0.95343 0.953305 0.95318 0.953055 0.952929 0.952804 0.952679
+0.952554 0.952429 0.952303 0.952178 0.952053 0.951928 0.951803 0.951678
+0.951552 0.951427 0.951302 0.951177 0.951052 0.950926 0.950801 0.950676
+0.950551 0.950426 0.9503 0.950175 0.95005 0.949925 0.9498 0.949674
+0.949549 0.949424 0.949299 0.949174 0.949049 0.948923 0.948798 0.948673
+0.948548 0.948423 0.948297 0.948172 0.948047 0.947922 0.947797 0.947672
+0.947546 0.947421 0.947296 0.947171 0.947046 0.94692 0.946795 0.94667
+0.946545 0.94642 0.946294 0.946169 0.946044 0.945919 0.945794 0.945669
+0.945543 0.945418 0.945293 0.945168 0.945043 0.944917 0.944792 0.944667
+0.944542 0.944417 0.944291 0.944166 0.944041 0.943916 0.943791 0.943666
+0.94354 0.943415 0.94329 0.943165 0.94304 0.942914 0.942789 0.942664
+0.942539 0.942414 0.942288 0.942163 0.942038 0.941913 0.941788 0.941662
+0.941537 0.941412 0.941287 0.941162 0.941037 0.940911 0.940786 0.940661
+0.940536 0.940411 0.940285 0.94016 0.940035 0.93991 0.939785 0.939659
+0.939534 0.939409 0.939284 0.939159 0.939034 0.938908 0.938783 0.938658
+0.938533 0.938408 0.938282 0.938157 0.938032 0.937907 0.937782 0.937656
+0.937531 0.937406 0.937281 0.937156 0.937031 0.936905 0.93678 0.936655
+0.93653 0.936405 0.936279 0.936154 0.936029 0.935904 0.935779 0.935654
+0.935528 0.935403 0.935278 0.935153 0.935028 0.934902 0.934777 0.934652
+0.934527 0.934402 0.934276 0.934151 0.934026 0.933901 0.933776 0.93365
+0.933525 0.9334 0.933275 0.93315 0.933025 0.932899 0.932774 0.932649
+0.932524 0.932399 0.932273 0.932148 0.932023 0.931898 0.931773 0.931647
+0.931522 0.931397 0.931272 0.931147 0.931022 0.930896 0.930771 0.930646
+0.930521 0.930396 0.93027 0.930145 0.93002 0.929895 0.92977 0.929644
+0.929519 0.929394 0.929269 0.929144 0.929019 0.928893 0.928768 0.928643
+0.928518 0.928393 0.928267 0.928142 0.928017 0.927892 0.927767 0.927641
+0.927516 0.927391 0.927266 0.927141 0.927016 0.92689 0.926765 0.92664
+0.926515 0.92639 0.926264 0.926139 0.926014 0.925889 0.925764 0.925638
+0.925513 0.925388 0.925263 0.925138 0.925013 0.924887 0.924762 0.924637
+0.924512 0.924387 0.924261 0.924136 0.924011 0.923886 0.923761 0.923635
+0.92351 0.923385 0.92326 0.923135 0.92301 0.922884 0.922759 0.922634
+0.922509 0.922384 0.922258 0.922133 0.922008 0.921883 0.921758 0.921632
+0.921507 0.921382 0.921257 0.921132 0.921007 0.920881 0.920756 0.920631
+0.920506 0.920381 0.920255 0.92013 0.920005 0.91988 0.919755 0.919629
+0.919504 0.919379 0.919254 0.919129 0.919003 0.918878 0.918753 0.918628
+0.918503 0.918378 0.918252 0.918127 0.918002 0.917877 0.917752 0.917626
+0.917501 0.917376 0.917251 0.917126 0.917 0.916875 0.91675 0.916625
+0.9165 0.916375 0.916249 0.916124 0.915999 0.915874 0.915749 0.915623
+0.915498 0.915373 0.915248 0.915123 0.914998 0.914872 0.914747 0.914622
+0.914497 0.914372 0.914246 0.914121 0.913996 0.913871 0.913746 0.91362
+0.913495 0.91337 0.913245 0.91312 0.912995 0.912869 0.912744 0.912619
+0.912494 0.912369 0.912243 0.912118 0.911993 0.911868 0.911743 0.911617
+0.911492 0.911367 0.911242 0.911117 0.910991 0.910866 0.910741 0.910616
+0.910491 0.910366 0.91024 0.910115 0.90999 0.909865 0.90974 0.909614
+0.909489 0.909364 0.909239 0.909114 0.908988 0.908863 0.908738 0.908613
+0.908488 0.908363 0.908237 0.908112 0.907987 0.907862 0.907737 0.907611
+0.907486 0.907361 0.907236 0.907111 0.906985 0.90686 0.906735 0.90661
+0.906485 0.90636 0.906234 0.906109 0.905984 0.905859 0.905734 0.905608
+0.905483 0.905358 0.905233 0.905108 0.904982 0.904857 0.904732 0.904607
+0.904482 0.904357 0.904231 0.904106 0.903981 0.903856 0.903731 0.903605
+0.90348 0.903355 0.90323 0.903105 0.902979 0.902854 0.902729 0.902604
+0.902479 0.902354 0.902228 0.902103 0.901978 0.901853 0.901728 0.901602
+0.901477 0.901352 0.901227 0.901102 0.900976 0.900851 0.900726 0.900601
+0.900476;
+#A 1000 0.900351 0.900225 0.9001 0.899975 0.89985 0.899725 0.899599
+0.899474 0.899349 0.899224 0.899099 0.898973 0.898848 0.898723 0.898598
+0.898473 0.898347 0.898222 0.898097 0.897972 0.897847 0.897722 0.897596
+0.897471 0.897346 0.897221 0.897096 0.89697 0.896845 0.89672 0.896595
+0.89647 0.896345 0.896219 0.896094 0.895969 0.895844 0.895719 0.895593
+0.895468 0.895343 0.895218 0.895093 0.894967 0.894842 0.894717 0.894592
+0.894467 0.894342 0.894216 0.894091 0.893966 0.893841 0.893716 0.89359
+0.893465 0.89334 0.893215 0.89309 0.892964 0.892839 0.892714 0.892589
+0.892464 0.892339 0.892213 0.892088 0.891963 0.891838 0.891713 0.891587
+0.891462 0.891337 0.891212 0.891087 0.890961 0.890836 0.890711 0.890586
+0.890461 0.890336 0.89021 0.890085 0.88996 0.889835 0.88971 0.889584
+0.889459 0.889334 0.889209 0.889084 0.888958 0.888833 0.888708 0.888583
+0.888458 0.888332 0.888207 0.888082 0.887957 0.887832 0.887707 0.887581
+0.887456 0.887331 0.887206 0.887081 0.886955 0.88683 0.886705 0.88658
+0.886455 0.886329 0.886204 0.886079 0.885954 0.885829 0.885704 0.885578
+0.885453 0.885328 0.885203 0.885078 0.884952 0.884827 0.884702 0.884577
+0.884452 0.884327 0.884201 0.884076 0.883951 0.883826 0.883701 0.883575
+0.88345 0.883325 0.8832 0.883075 0.882949 0.882824 0.882699 0.882574
+0.882449 0.882324 0.882198 0.882073 0.881948 0.881823 0.881698 0.881572
+0.881447 0.881322 0.881197 0.881072 0.880946 0.880821 0.880696 0.880571
+0.880446 0.88032 0.880195 0.88007 0.879945 0.87982 0.879695 0.879569
+0.879444 0.879319 0.879194 0.879069 0.878943 0.878818 0.878693 0.878568
+0.878443 0.878317 0.878192 0.878067 0.877942 0.877817 0.877692 0.877566
+0.877441 0.877316 0.877191 0.877066 0.87694 0.876815 0.87669 0.876565
+0.87644 0.876314 0.876189 0.876064 0.875939 0.875814 0.875689 0.875563
+0.875438 0.875313 0.875188 0.875063 0.874937 0.874812 0.874687 0.874562
+0.874437 0.874311 0.874186 0.874061 0.873936 0.873811 0.873686 0.87356
+0.873435 0.87331 0.873185 0.87306 0.872934 0.872809 0.872684 0.872559
+0.872434 0.872308 0.872183 0.872058 0.871933 0.871808 0.871683 0.871557
+0.871432 0.871307 0.871182 0.871057 0.870931 0.870806 0.870681 0.870556
+0.870431 0.870305 0.87018 0.870055 0.86993 0.869805 0.86968 0.869554
+0.869429 0.869304 0.869179 0.869054 0.868928 0.868803 0.868678 0.868553
+0.868428 0.868302 0.868177 0.868052 0.867927 0.867802 0.867676 0.867551
+0.867426 0.867301 0.867176 0.867051 0.866925 0.8668 0.866675 0.86655
+0.866425 0.866299 0.866174 0.866049 0.865924 0.865799 0.865673 0.865548
+0.865423 0.865298 0.865173 0.865048 0.864922 0.864797 0.864672 0.864547
+0.864422 0.864296 0.864171 0.864046 0.863921 0.863796 0.863671 0.863545
+0.86342 0.863295 0.86317 0.863045 0.862919 0.862794 0.862669 0.862544
+0.862419 0.862293 0.862168 0.862043 0.861918 0.861793 0.861668 0.861542
+0.861417 0.861292 0.861167 0.861042 0.860916 0.860791 0.860666 0.860541
+0.860416 0.86029 0.860165 0.86004 0.859915 0.85979 0.859664 0.859539
+0.859414 0.859289 0.859164 0.859039 0.858913 0.858788 0.858663 0.858538
+0.858413 0.858287 0.858162 0.858037 0.857912 0.857787 0.857661 0.857536
+0.857411 0.857286 0.857161 0.857036 0.85691 0.856785 0.85666 0.856535
+0.85641 0.856284 0.856159 0.856034 0.855909 0.855784 0.855658 0.855533
+0.855408 0.855283 0.855158 0.855033 0.854907 0.854782 0.854657 0.854532
+0.854407 0.854281 0.854156 0.854031 0.853906 0.853781 0.853655 0.85353
+0.853405 0.85328 0.853155 0.85303 0.852904 0.852779 0.852654 0.852529
+0.852404 0.852278 0.852153 0.852028 0.851903 0.851778 0.851653 0.851527
+0.851402 0.851277 0.851152 0.851027 0.850901 0.850776 0.850651 0.850526
+0.850401 0.850275 0.85015 0.850025 0.8499 0.849775 0.849649 0.849524
+0.849399 0.849274 0.849149 0.849024 0.848898 0.848773 0.848648 0.848523
+0.848398 0.848272 0.848147 0.848022 0.847897 0.847772 0.847646 0.847521
+0.847396 0.847271 0.847146 0.847021 0.846895 0.84677 0.846645 0.84652
+0.846395 0.846269 0.846144 0.846019 0.845894 0.845769 0.845643 0.845518
+0.845393 0.845268 0.845143 0.845018 0.844892 0.844767 0.844642 0.844517
+0.844392 0.844266 0.844141 0.844016 0.843891 0.843766 0.84364 0.843515
+0.84339 0.843265 0.84314 0.843015 0.842889 0.842764 0.842639 0.842514
+0.842389 0.842263 0.842138 0.842013 0.841888 0.841763 0.841637 0.841512
+0.841387 0.841262 0.841137 0.841012 0.840886 0.840761 0.840636 0.840511
+0.840386 0.84026 0.840135 0.84001 0.839885 0.83976 0.839634 0.839509
+0.839384 0.839259 0.839134 0.839009 0.838883 0.838758 0.838633 0.838508
+0.838383 0.838257 0.838132 0.838007 0.837882 0.837757 0.837631 0.837506
+0.837381 0.837256 0.837131 0.837005 0.83688 0.836755 0.83663 0.836505
+0.83638 0.836254 0.836129 0.836004 0.835879 0.835754 0.835628 0.835503
+0.835378 0.835253 0.835128 0.835002 0.834877 0.834752 0.834627 0.834502
+0.834377 0.834251 0.834126 0.834001 0.833876 0.833751 0.833625 0.8335
+0.833375 0.83325 0.833125 0.833 0.832874 0.832749 0.832624 0.832499
+0.832374 0.832248 0.832123 0.831998 0.831873 0.831748 0.831622 0.831497
+0.831372 0.831247 0.831122 0.830997 0.830871 0.830746 0.830621 0.830496
+0.830371 0.830245 0.83012 0.829995 0.82987 0.829745 0.829619 0.829494
+0.829369 0.829244 0.829119 0.828993 0.828868 0.828743 0.828618 0.828493
+0.828368 0.828242 0.828117 0.827992 0.827867 0.827742 0.827616 0.827491
+0.827366 0.827241 0.827116 0.82699 0.826865 0.82674 0.826615 0.82649
+0.826365 0.826239 0.826114 0.825989 0.825864 0.825739 0.825613 0.825488
+0.825363 0.825238 0.825113 0.824987 0.824862 0.824737 0.824612 0.824487
+0.824362 0.824236 0.824111 0.823986 0.823861 0.823736 0.82361 0.823485
+0.82336 0.823235 0.82311 0.822984 0.822859 0.822734 0.822609 0.822484
+0.822359 0.822233 0.822108 0.821983 0.821858 0.821733 0.821607 0.821482
+0.821357 0.821232 0.821107 0.820981 0.820856 0.820731 0.820606 0.820481
+0.820356 0.82023 0.820105 0.81998 0.819855 0.81973 0.819604 0.819479
+0.819354 0.819229 0.819104 0.818978 0.818853 0.818728 0.818603 0.818478
+0.818353 0.818227 0.818102 0.817977 0.817852 0.817727 0.817601 0.817476
+0.817351 0.817226 0.817101 0.816975 0.81685 0.816725 0.8166 0.816475
+0.81635 0.816224 0.816099 0.815974 0.815849 0.815724 0.815598 0.815473
+0.815348 0.815223 0.815098 0.814972 0.814847 0.814722 0.814597 0.814472
+0.814346 0.814221 0.814096 0.813971 0.813846 0.813721 0.813595 0.81347
+0.813345 0.81322 0.813095 0.812969 0.812844 0.812719 0.812594 0.812469
+0.812344 0.812218 0.812093 0.811968 0.811843 0.811718 0.811592 0.811467
+0.811342 0.811217 0.811092 0.810966 0.810841 0.810716 0.810591 0.810466
+0.810341 0.810215 0.81009 0.809965 0.80984 0.809715 0.809589 0.809464
+0.809339 0.809214 0.809089 0.808963 0.808838 0.808713 0.808588 0.808463
+0.808338 0.808212 0.808087 0.807962 0.807837 0.807712 0.807586 0.807461
+0.807336 0.807211 0.807086 0.80696 0.806835 0.80671 0.806585 0.80646
+0.806334 0.806209 0.806084 0.805959 0.805834 0.805709 0.805583 0.805458
+0.805333 0.805208 0.805083 0.804957 0.804832 0.804707 0.804582 0.804457
+0.804331 0.804206 0.804081 0.803956 0.803831 0.803706 0.80358 0.803455
+0.80333 0.803205 0.80308 0.802954 0.802829 0.802704 0.802579 0.802454
+0.802328 0.802203 0.802078 0.801953 0.801828 0.801703 0.801577 0.801452
+0.801327 0.801202 0.801077 0.800951 0.800826 0.800701 0.800576 0.800451
+0.800326 0.8002 0.800075 0.79995 0.799825 0.7997 0.799574 0.799449
+0.799324 0.799199 0.799074 0.798948 0.798823 0.798698 0.798573 0.798448
+0.798322 0.798197 0.798072 0.797947 0.797822 0.797697 0.797571 0.797446
+0.797321 0.797196 0.797071 0.796945 0.79682 0.796695 0.79657 0.796445
+0.796319 0.796194 0.796069 0.795944 0.795819 0.795694 0.795568 0.795443
+0.795318 0.795193 0.795068 0.794942 0.794817 0.794692 0.794567 0.794442
+0.794316 0.794191 0.794066 0.793941 0.793816 0.793691 0.793565 0.79344
+0.793315 0.79319 0.793065 0.792939 0.792814 0.792689 0.792564 0.792439
+0.792313 0.792188 0.792063 0.791938 0.791813 0.791688 0.791562 0.791437
+0.791312 0.791187 0.791062 0.790936 0.790811 0.790686 0.790561 0.790436
+0.79031 0.790185 0.79006 0.789935 0.78981 0.789685 0.789559 0.789434
+0.789309 0.789184 0.789059 0.788933 0.788808 0.788683 0.788558 0.788433
+0.788307 0.788182 0.788057 0.787932 0.787807 0.787682 0.787556 0.787431
+0.787306 0.787181 0.787056 0.78693 0.786805 0.78668 0.786555 0.78643
+0.786304 0.786179 0.786054 0.785929 0.785804 0.785679 0.785553 0.785428
+0.785303 0.785178 0.785053 0.784927 0.784802 0.784677 0.784552 0.784427
+0.784301 0.784176 0.784051 0.783926 0.783801 0.783675 0.78355 0.783425
+0.7833 0.783175 0.78305 0.782924 0.782799 0.782674 0.782549 0.782424
+0.782298 0.782173 0.782048 0.781923 0.781798 0.781673 0.781547 0.781422
+0.781297 0.781172 0.781047 0.780921 0.780796 0.780671 0.780546 0.780421
+0.780295 0.78017 0.780045 0.77992 0.779795 0.77967 0.779544 0.779419
+0.779294 0.779169 0.779044 0.778918 0.778793 0.778668 0.778543 0.778418
+0.778292 0.778167 0.778042 0.777917 0.777792 0.777667 0.777541 0.777416
+0.777291 0.777166 0.777041 0.776915 0.77679 0.776665 0.77654 0.776415
+0.776289 0.776164 0.776039 0.775914 0.775789 0.775663 0.775538 0.775413
+0.775288;
+#A 2000 0.775163 0.775038 0.774912 0.774787 0.774662 0.774537 0.774412
+0.774286 0.774161 0.774036 0.773911 0.773786 0.77366 0.773535 0.77341
+0.773285 0.77316 0.773035 0.772909 0.772784 0.772659 0.772534 0.772409
+0.772283 0.772158 0.772033 0.771908 0.771783 0.771657 0.771532 0.771407
+0.771282 0.771157 0.771032 0.770906 0.770781 0.770656 0.770531 0.770406
+0.77028 0.770155 0.77003 0.769905 0.76978 0.769654 0.769529 0.769404
+0.769279 0.769154 0.769029 0.768903 0.768778 0.768653 0.768528 0.768403
+0.768277 0.768152 0.768027 0.767902 0.767777 0.767651 0.767526 0.767401
+0.767276 0.767151 0.767026 0.7669 0.766775 0.76665 0.766525 0.7664
+0.766274 0.766149 0.766024 0.765899 0.765774 0.765648 0.765523 0.765398
+0.765273 0.765148 0.765023 0.764897 0.764772 0.764647 0.764522 0.764397
+0.764271 0.764146 0.764021 0.763896 0.763771 0.763645 0.76352 0.763395
+0.76327 0.763145 0.76302 0.762894 0.762769 0.762644 0.762519 0.762394
+0.762268 0.762143 0.762018 0.761893 0.761768 0.761642 0.761517 0.761392
+0.761267 0.761142 0.761017 0.760891 0.760766 0.760641 0.760516 0.760391
+0.760265 0.76014 0.760015 0.75989 0.759765 0.759639 0.759514 0.759389
+0.759264 0.759139 0.759014 0.758888 0.758763 0.758638 0.758513 0.758388
+0.758262 0.758137 0.758012 0.757887 0.757762 0.757636 0.757511 0.757386
+0.757261 0.757136 0.757011 0.756885 0.75676 0.756635 0.75651 0.756385
+0.756259 0.756134 0.756009 0.755884 0.755759 0.755633 0.755508 0.755383
+0.755258 0.755133 0.755008 0.754882 0.754757 0.754632 0.754507 0.754382
+0.754256 0.754131 0.754006 0.753881 0.753756 0.75363 0.753505 0.75338
+0.753255 0.75313 0.753004 0.752879 0.752754 0.752629 0.752504 0.752379
+0.752253 0.752128 0.752003 0.751878 0.751753 0.751627 0.751502 0.751377
+0.751252 0.751127 0.751001 0.750876 0.750751 0.750626 0.750501 0.750376
+0.75025 0.750125 0.75 0.749875 0.74975 0.749624 0.749499 0.749374 0.749249
+0.749124 0.748999 0.748873 0.748748 0.748623 0.748498 0.748373 0.748247
+0.748122 0.747997 0.747872 0.747747 0.747621 0.747496 0.747371 0.747246
+0.747121 0.746996 0.74687 0.746745 0.74662 0.746495 0.74637 0.746244
+0.746119 0.745994 0.745869 0.745744 0.745618 0.745493 0.745368 0.745243
+0.745118 0.744992 0.744867 0.744742 0.744617 0.744492 0.744367 0.744241
+0.744116 0.743991 0.743866 0.743741 0.743615 0.74349 0.743365 0.74324
+0.743115 0.742989 0.742864 0.742739 0.742614 0.742489 0.742364 0.742238
+0.742113 0.741988 0.741863 0.741738 0.741612 0.741487 0.741362 0.741237
+0.741112 0.740986 0.740861 0.740736 0.740611 0.740486 0.740361 0.740235
+0.74011 0.739985 0.73986 0.739735 0.739609 0.739484 0.739359 0.739234
+0.739109 0.738983 0.738858 0.738733 0.738608 0.738483 0.738358 0.738232
+0.738107 0.737982 0.737857 0.737732 0.737606 0.737481 0.737356 0.737231
+0.737106 0.73698 0.736855 0.73673 0.736605 0.73648 0.736355 0.736229
+0.736104 0.735979 0.735854 0.735729 0.735603 0.735478 0.735353 0.735228
+0.735103 0.734977 0.734852 0.734727 0.734602 0.734477 0.734352 0.734226
+0.734101 0.733976 0.733851 0.733726 0.7336 0.733475 0.73335 0.733225
+0.7331 0.732974 0.732849 0.732724 0.732599 0.732474 0.732349 0.732223
+0.732098 0.731973 0.731848 0.731723 0.731597 0.731472 0.731347 0.731222
+0.731097 0.730971 0.730846 0.730721 0.730596 0.730471 0.730346 0.73022
+0.730095 0.72997 0.729845 0.72972 0.729594 0.729469 0.729344 0.729219
+0.729094 0.728968 0.728843 0.728718 0.728593 0.728468 0.728343 0.728217
+0.728092 0.727967 0.727842 0.727717 0.727591 0.727466 0.727341 0.727216
+0.727091 0.726965 0.72684 0.726715 0.72659 0.726465 0.72634 0.726214
+0.726089 0.725964 0.725839 0.725714 0.725588 0.725463 0.725338 0.725213
+0.725088 0.724962 0.724837 0.724712 0.724587 0.724462 0.724337 0.724211
+0.724086 0.723961 0.723836 0.723711 0.723585 0.72346 0.723335 0.72321
+0.723085 0.722959 0.722834 0.722709 0.722584 0.722459 0.722333 0.722208
+0.722083 0.721958 0.721833 0.721708 0.721582 0.721457 0.721332 0.721207
+0.721082 0.720956 0.720831 0.720706 0.720581 0.720456 0.72033 0.720205
+0.72008 0.719955 0.71983 0.719705 0.719579 0.719454 0.719329 0.719204
+0.719079 0.718953 0.718828 0.718703 0.718578 0.718453 0.718327 0.718202
+0.718077 0.717952 0.717827 0.717702 0.717576 0.717451 0.717326 0.717201
+0.717076 0.71695 0.716825 0.7167 0.716575 0.71645 0.716325 0.716199
+0.716074 0.715949 0.715824 0.715699 0.715573 0.715448 0.715323 0.715198
+0.715073 0.714947 0.714822 0.714697 0.714572 0.714447 0.714321 0.714196
+0.714071 0.713946 0.713821 0.713696 0.71357 0.713445 0.71332 0.713195
+0.71307 0.712944 0.712819 0.712694 0.712569 0.712444 0.712318 0.712193
+0.712068 0.711943 0.711818 0.711693 0.711567 0.711442 0.711317 0.711192
+0.711067 0.710941 0.710816 0.710691 0.710566 0.710441 0.710315 0.71019
+0.710065 0.70994 0.709815 0.70969 0.709564 0.709439 0.709314 0.709189
+0.709064 0.708938 0.708813 0.708688 0.708563 0.708438 0.708312 0.708187
+0.708062 0.707937 0.707812 0.707687 0.707561 0.707436 0.707311 0.707186
+0.707061 0.706935 0.70681 0.706685 0.70656 0.706435 0.706309 0.706184
+0.706059 0.705934 0.705809 0.705684 0.705558 0.705433 0.705308 0.705183
+0.705058 0.704932 0.704807 0.704682 0.704557 0.704432 0.704306 0.704181
+0.704056 0.703931 0.703806 0.703681 0.703555 0.70343 0.703305 0.70318
+0.703055 0.702929 0.702804 0.702679 0.702554 0.702429 0.702303 0.702178
+0.702053 0.701928 0.701803 0.701678 0.701552 0.701427 0.701302 0.701177
+0.701052 0.700926 0.700801 0.700676 0.700551 0.700426 0.7003 0.700175
+0.70005 0.699925 0.6998 0.699674 0.699549 0.699424 0.699299 0.699174
+0.699049 0.698923 0.698798 0.698673 0.698548 0.698423 0.698297 0.698172
+0.698047 0.697922 0.697797 0.697672 0.697546 0.697421 0.697296 0.697171
+0.697046 0.69692 0.696795 0.69667 0.696545 0.69642 0.696294 0.696169
+0.696044 0.695919 0.695794 0.695669 0.695543 0.695418 0.695293 0.695168
+0.695043 0.694917 0.694792 0.694667 0.694542 0.694417 0.694291 0.694166
+0.694041 0.693916 0.693791 0.693666 0.69354 0.693415 0.69329 0.693165
+0.69304 0.692914 0.692789 0.692664 0.692539 0.692414 0.692288 0.692163
+0.692038 0.691913 0.691788 0.691662 0.691537 0.691412 0.691287 0.691162
+0.691037 0.690911 0.690786 0.690661 0.690536 0.690411 0.690285 0.69016
+0.690035 0.68991 0.689785 0.689659 0.689534 0.689409 0.689284 0.689159
+0.689034 0.688908 0.688783 0.688658 0.688533 0.688408 0.688282 0.688157
+0.688032 0.687907 0.687782 0.687656 0.687531 0.687406 0.687281 0.687156
+0.687031 0.686905 0.68678 0.686655 0.68653 0.686405 0.686279 0.686154
+0.686029 0.685904 0.685779 0.685654 0.685528 0.685403 0.685278 0.685153
+0.685028 0.684902 0.684777 0.684652 0.684527 0.684402 0.684276 0.684151
+0.684026 0.683901 0.683776 0.68365 0.683525 0.6834 0.683275 0.68315
+0.683025 0.682899 0.682774 0.682649 0.682524 0.682399 0.682273 0.682148
+0.682023 0.681898 0.681773 0.681647 0.681522 0.681397 0.681272 0.681147
+0.681022 0.680896 0.680771 0.680646 0.680521 0.680396 0.68027 0.680145
+0.68002 0.679895 0.67977 0.679644 0.679519 0.679394 0.679269 0.679144
+0.679019 0.678893 0.678768 0.678643 0.678518 0.678393 0.678267 0.678142
+0.678017 0.677892 0.677767 0.677641 0.677516 0.677391 0.677266 0.677141
+0.677016 0.67689 0.676765 0.67664 0.676515 0.67639 0.676264 0.676139
+0.676014 0.675889 0.675764 0.675638 0.675513 0.675388 0.675263 0.675138
+0.675013 0.674887 0.674762 0.674637 0.674512 0.674387 0.674261 0.674136
+0.674011 0.673886 0.673761 0.673635 0.67351 0.673385 0.67326 0.673135
+0.67301 0.672884 0.672759 0.672634 0.672509 0.672384 0.672258 0.672133
+0.672008 0.671883 0.671758 0.671632 0.671507 0.671382 0.671257 0.671132
+0.671007 0.670881 0.670756 0.670631 0.670506 0.670381 0.670255 0.67013
+0.670005 0.66988 0.669755 0.669629 0.669504 0.669379 0.669254 0.669129
+0.669003 0.668878 0.668753 0.668628 0.668503 0.668378 0.668252 0.668127
+0.668002 0.667877 0.667752 0.667626 0.667501 0.667376 0.667251 0.667126
+0.667 0.666875 0.66675 0.666625 0.6665 0.666375 0.666249 0.666124 0.665999
+0.665874 0.665749 0.665623 0.665498 0.665373 0.665248 0.665123 0.664998
+0.664872 0.664747 0.664622 0.664497 0.664372 0.664246 0.664121 0.663996
+0.663871 0.663746 0.66362 0.663495 0.66337 0.663245 0.66312 0.662995
+0.662869 0.662744 0.662619 0.662494 0.662369 0.662243 0.662118 0.661993
+0.661868 0.661743 0.661617 0.661492 0.661367 0.661242 0.661117 0.660991
+0.660866 0.660741 0.660616 0.660491 0.660366 0.66024 0.660115 0.65999
+0.659865 0.65974 0.659614 0.659489 0.659364 0.659239 0.659114 0.658988
+0.658863 0.658738 0.658613 0.658488 0.658363 0.658237 0.658112 0.657987
+0.657862 0.657737 0.657611 0.657486 0.657361 0.657236 0.657111 0.656985
+0.65686 0.656735 0.65661 0.656485 0.65636 0.656234 0.656109 0.655984
+0.655859 0.655734 0.655608 0.655483 0.655358 0.655233 0.655108 0.654982
+0.654857 0.654732 0.654607 0.654482 0.654357 0.654231 0.654106 0.653981
+0.653856 0.653731 0.653605 0.65348 0.653355 0.65323 0.653105 0.652979
+0.652854 0.652729 0.652604 0.652479 0.652354 0.652228 0.652103 0.651978
+0.651853 0.651728 0.651602 0.651477 0.651352 0.651227 0.651102 0.650976
+0.650851 0.650726 0.650601 0.650476 0.650351 0.650225 0.6501;
+#A 3000 0.649975 0.64985 0.649725 0.649599 0.649474 0.649349 0.649224
+0.649099 0.648973 0.648848 0.648723 0.648598 0.648473 0.648347 0.648222
+0.648097 0.647972 0.647847 0.647722 0.647596 0.647471 0.647346 0.647221
+0.647096 0.64697 0.646845 0.64672 0.646595 0.64647 0.646345 0.646219
+0.646094 0.645969 0.645844 0.645719 0.645593 0.645468 0.645343 0.645218
+0.645093 0.644967 0.644842 0.644717 0.644592 0.644467 0.644342 0.644216
+0.644091 0.643966 0.643841 0.643716 0.64359 0.643465 0.64334 0.643215
+0.64309 0.642964 0.642839 0.642714 0.642589 0.642464 0.642339 0.642213
+0.642088 0.641963 0.641838 0.641713 0.641587 0.641462 0.641337 0.641212
+0.641087 0.640961 0.640836 0.640711 0.640586 0.640461 0.640336 0.64021
+0.640085 0.63996 0.639835 0.63971 0.639584 0.639459 0.639334 0.639209
+0.639084 0.638958 0.638833 0.638708 0.638583 0.638458 0.638332 0.638207
+0.638082 0.637957 0.637832 0.637707 0.637581 0.637456 0.637331 0.637206
+0.637081 0.636955 0.63683 0.636705 0.63658 0.636455 0.636329 0.636204
+0.636079 0.635954 0.635829 0.635704 0.635578 0.635453 0.635328 0.635203
+0.635078 0.634952 0.634827 0.634702 0.634577 0.634452 0.634327 0.634201
+0.634076 0.633951 0.633826 0.633701 0.633575 0.63345 0.633325 0.6332
+0.633075 0.632949 0.632824 0.632699 0.632574 0.632449 0.632324 0.632198
+0.632073 0.631948 0.631823 0.631698 0.631572 0.631447 0.631322 0.631197
+0.631072 0.630946 0.630821 0.630696 0.630571 0.630446 0.63032 0.630195
+0.63007 0.629945 0.62982 0.629695 0.629569 0.629444 0.629319 0.629194
+0.629069 0.628943 0.628818 0.628693 0.628568 0.628443 0.628317 0.628192
+0.628067 0.627942 0.627817 0.627692 0.627566 0.627441 0.627316 0.627191
+0.627066 0.62694 0.626815 0.62669 0.626565 0.62644 0.626314 0.626189
+0.626064 0.625939 0.625814 0.625689 0.625563 0.625438 0.625313 0.625188
+0.625063 0.624937 0.624812 0.624687 0.624562 0.624437 0.624311 0.624186
+0.624061 0.623936 0.623811 0.623686 0.62356 0.623435 0.62331 0.623185
+0.62306 0.622934 0.622809 0.622684 0.622559 0.622434 0.622308 0.622183
+0.622058 0.621933 0.621808 0.621683 0.621557 0.621432 0.621307 0.621182
+0.621057 0.620931 0.620806 0.620681 0.620556 0.620431 0.620305 0.62018
+0.620055 0.61993 0.619805 0.61968 0.619554 0.619429 0.619304 0.619179
+0.619054 0.618928 0.618803 0.618678 0.618553 0.618428 0.618302 0.618177
+0.618052 0.617927 0.617802 0.617676 0.617551 0.617426 0.617301 0.617176
+0.617051 0.616925 0.6168 0.616675 0.61655 0.616425 0.616299 0.616174
+0.616049 0.615924 0.615799 0.615673 0.615548 0.615423 0.615298 0.615173
+0.615048 0.614922 0.614797 0.614672 0.614547 0.614422 0.614296 0.614171
+0.614046 0.613921 0.613796 0.613671 0.613545 0.61342 0.613295 0.61317
+0.613045 0.612919 0.612794 0.612669 0.612544 0.612419 0.612293 0.612168
+0.612043 0.611918 0.611793 0.611668 0.611542 0.611417 0.611292 0.611167
+0.611042 0.610916 0.610791 0.610666 0.610541 0.610416 0.61029 0.610165
+0.61004 0.609915 0.60979 0.609664 0.609539 0.609414 0.609289 0.609164
+0.609039 0.608913 0.608788 0.608663 0.608538 0.608413 0.608287 0.608162
+0.608037 0.607912 0.607787 0.607661 0.607536 0.607411 0.607286 0.607161
+0.607036 0.60691 0.606785 0.60666 0.606535 0.60641 0.606284 0.606159
+0.606034 0.605909 0.605784 0.605658 0.605533 0.605408 0.605283 0.605158
+0.605033 0.604907 0.604782 0.604657 0.604532 0.604407 0.604281 0.604156
+0.604031 0.603906 0.603781 0.603655 0.60353 0.603405 0.60328 0.603155
+0.60303 0.602904 0.602779 0.602654 0.602529 0.602404 0.602278 0.602153
+0.602028 0.601903 0.601778 0.601653 0.601527 0.601402 0.601277 0.601152
+0.601027 0.600901 0.600776 0.600651 0.600526 0.600401 0.600275 0.60015
+0.600025 0.5999 0.599775 0.599649 0.599524 0.599399 0.599274 0.599149
+0.599024 0.598898 0.598773 0.598648 0.598523 0.598398 0.598272 0.598147
+0.598022 0.597897 0.597772 0.597646 0.597521 0.597396 0.597271 0.597146
+0.597021 0.596895 0.59677 0.596645 0.59652 0.596395 0.596269 0.596144
+0.596019 0.595894 0.595769 0.595643 0.595518 0.595393 0.595268 0.595143
+0.595018 0.594892 0.594767 0.594642 0.594517 0.594392 0.594266 0.594141
+0.594016 0.593891 0.593766 0.59364 0.593515 0.59339 0.593265 0.59314
+0.593015 0.592889 0.592764 0.592639 0.592514 0.592389 0.592263 0.592138
+0.592013 0.591888 0.591763 0.591637 0.591512 0.591387 0.591262 0.591137
+0.591012 0.590886 0.590761 0.590636 0.590511 0.590386 0.59026 0.590135
+0.59001 0.589885 0.58976 0.589634 0.589509 0.589384 0.589259 0.589134
+0.589009 0.588883 0.588758 0.588633 0.588508 0.588383 0.588257 0.588132
+0.588007 0.587882 0.587757 0.587631 0.587506 0.587381 0.587256 0.587131
+0.587005 0.58688 0.586755 0.58663 0.586505 0.58638 0.586254 0.586129
+0.586004 0.585879 0.585754 0.585628 0.585503 0.585378 0.585253 0.585128
+0.585002 0.584877 0.584752 0.584627 0.584502 0.584377 0.584251 0.584126
+0.584001 0.583876 0.583751 0.583625 0.5835 0.583375 0.58325 0.583125
+0.583 0.582874 0.582749 0.582624 0.582499 0.582374 0.582248 0.582123
+0.581998 0.581873 0.581748 0.581622 0.581497 0.581372 0.581247 0.581122
+0.580997 0.580871 0.580746 0.580621 0.580496 0.580371 0.580245 0.58012
+0.579995 0.57987 0.579745 0.579619 0.579494 0.579369 0.579244 0.579119
+0.578993 0.578868 0.578743 0.578618 0.578493 0.578368 0.578242 0.578117
+0.577992 0.577867 0.577742 0.577616 0.577491 0.577366 0.577241 0.577116
+0.57699 0.576865 0.57674 0.576615 0.57649 0.576365 0.576239 0.576114
+0.575989 0.575864 0.575739 0.575613 0.575488 0.575363 0.575238 0.575113
+0.574987 0.574862 0.574737 0.574612 0.574487 0.574362 0.574236 0.574111
+0.573986 0.573861 0.573736 0.57361 0.573485 0.57336 0.573235 0.57311
+0.572984 0.572859 0.572734 0.572609 0.572484 0.572359 0.572233 0.572108
+0.571983 0.571858 0.571733 0.571607 0.571482 0.571357 0.571232 0.571107
+0.570981 0.570856 0.570731 0.570606 0.570481 0.570356 0.57023 0.570105
+0.56998 0.569855 0.56973 0.569604 0.569479 0.569354 0.569229 0.569104
+0.568978 0.568853 0.568728 0.568603 0.568478 0.568353 0.568227 0.568102
+0.567977 0.567852 0.567727 0.567601 0.567476 0.567351 0.567226 0.567101
+0.566975 0.56685 0.566725 0.5666 0.566475 0.56635 0.566224 0.566099
+0.565974 0.565849 0.565724 0.565598 0.565473 0.565348 0.565223 0.565098
+0.564972 0.564847 0.564722 0.564597 0.564472 0.564346 0.564221 0.564096
+0.563971 0.563846 0.563721 0.563595 0.56347 0.563345 0.56322 0.563095
+0.562969 0.562844 0.562719 0.562594 0.562469 0.562344 0.562218 0.562093
+0.561968 0.561843 0.561718 0.561592 0.561467 0.561342 0.561217 0.561092
+0.560966 0.560841 0.560716 0.560591 0.560466 0.560341 0.560215 0.56009
+0.559965 0.55984 0.559715 0.559589 0.559464 0.559339 0.559214 0.559089
+0.558963 0.558838 0.558713 0.558588 0.558463 0.558338 0.558212 0.558087
+0.557962 0.557837 0.557712 0.557586 0.557461 0.557336 0.557211 0.557086
+0.55696 0.556835 0.55671 0.556585 0.55646 0.556334 0.556209 0.556084
+0.555959 0.555834 0.555709 0.555583 0.555458 0.555333 0.555208 0.555083
+0.554957 0.554832 0.554707 0.554582 0.554457 0.554331 0.554206 0.554081
+0.553956 0.553831 0.553706 0.55358 0.553455 0.55333 0.553205 0.55308
+0.552954 0.552829 0.552704 0.552579 0.552454 0.552328 0.552203 0.552078
+0.551953 0.551828 0.551703 0.551577 0.551452 0.551327 0.551202 0.551077
+0.550951 0.550826 0.550701 0.550576 0.550451 0.550326 0.5502 0.550075
+0.54995 0.549825 0.5497 0.549574 0.549449 0.549324 0.549199 0.549074
+0.548948 0.548823 0.548698 0.548573 0.548448 0.548322 0.548197 0.548072
+0.547947 0.547822 0.547697 0.547571 0.547446 0.547321 0.547196 0.547071
+0.546945 0.54682 0.546695 0.54657 0.546445 0.546319 0.546194 0.546069
+0.545944 0.545819 0.545694 0.545568 0.545443 0.545318 0.545193 0.545068
+0.544942 0.544817 0.544692 0.544567 0.544442 0.544316 0.544191 0.544066
+0.543941 0.543816 0.543691 0.543565 0.54344 0.543315 0.54319 0.543065
+0.542939 0.542814 0.542689 0.542564 0.542439 0.542313 0.542188 0.542063
+0.541938 0.541813 0.541688 0.541562 0.541437 0.541312 0.541187 0.541062
+0.540936 0.540811 0.540686 0.540561 0.540436 0.54031 0.540185 0.54006
+0.539935 0.53981 0.539685 0.539559 0.539434 0.539309 0.539184 0.539059
+0.538933 0.538808 0.538683 0.538558 0.538433 0.538307 0.538182 0.538057
+0.537932 0.537807 0.537682 0.537556 0.537431 0.537306 0.537181 0.537056
+0.53693 0.536805 0.53668 0.536555 0.53643 0.536304 0.536179 0.536054
+0.535929 0.535804 0.535679 0.535553 0.535428 0.535303 0.535178 0.535053
+0.534927 0.534802 0.534677 0.534552 0.534427 0.534301 0.534176 0.534051
+0.533926 0.533801 0.533675 0.53355 0.533425 0.5333 0.533175 0.53305
+0.532924 0.532799 0.532674 0.532549 0.532424 0.532298 0.532173 0.532048
+0.531923 0.531798 0.531673 0.531547 0.531422 0.531297 0.531172 0.531047
+0.530921 0.530796 0.530671 0.530546 0.530421 0.530295 0.53017 0.530045
+0.52992 0.529795 0.52967 0.529544 0.529419 0.529294 0.529169 0.529044
+0.528918 0.528793 0.528668 0.528543 0.528418 0.528292 0.528167 0.528042
+0.527917 0.527792 0.527667 0.527541 0.527416 0.527291 0.527166 0.527041
+0.526915 0.52679 0.526665 0.52654 0.526415 0.526289 0.526164 0.526039
+0.525914 0.525789 0.525663 0.525538 0.525413 0.525288 0.525163 0.525038
+0.524912;
+#A 4000 0.524787 0.524662 0.524537 0.524412 0.524286 0.524161 0.524036
+0.523911 0.523786 0.52366 0.523535 0.52341 0.523285 0.52316 0.523035
+0.522909 0.522784 0.522659 0.522534 0.522409 0.522283 0.522158 0.522033
+0.521908 0.521783 0.521657 0.521532 0.521407 0.521282 0.521157 0.521032
+0.520906 0.520781 0.520656 0.520531 0.520406 0.52028 0.520155 0.52003
+0.519905 0.51978 0.519654 0.519529 0.519404 0.519279 0.519154 0.519029
+0.518903 0.518778 0.518653 0.518528 0.518403 0.518277 0.518152 0.518027
+0.517902 0.517777 0.517651 0.517526 0.517401 0.517276 0.517151 0.517026
+0.5169 0.516775 0.51665 0.516525 0.5164 0.516274 0.516149 0.516024
+0.515899 0.515774 0.515648 0.515523 0.515398 0.515273 0.515148 0.515023
+0.514897 0.514772 0.514647 0.514522 0.514397 0.514271 0.514146 0.514021
+0.513896 0.513771 0.513645 0.51352 0.513395 0.51327 0.513145 0.51302
+0.512894 0.512769 0.512644 0.512519 0.512394 0.512268 0.512143 0.512018
+0.511893 0.511768 0.511642 0.511517 0.511392 0.511267 0.511142 0.511017
+0.510891 0.510766 0.510641 0.510516 0.510391 0.510265 0.51014 0.510015
+0.50989 0.509765 0.509639 0.509514 0.509389 0.509264 0.509139 0.509014
+0.508888 0.508763 0.508638 0.508513 0.508388 0.508262 0.508137 0.508012
+0.507887 0.507762 0.507636 0.507511 0.507386 0.507261 0.507136 0.507011
+0.506885 0.50676 0.506635 0.50651 0.506385 0.506259 0.506134 0.506009
+0.505884 0.505759 0.505633 0.505508 0.505383 0.505258 0.505133 0.505008
+0.504882 0.504757 0.504632 0.504507 0.504382 0.504256 0.504131 0.504006
+0.503881 0.503756 0.50363 0.503505 0.50338 0.503255 0.50313 0.503004
+0.502879 0.502754 0.502629 0.502504 0.502379 0.502253 0.502128 0.502003
+0.501878 0.501753 0.501627 0.501502 0.501377 0.501252 0.501127 0.501001
+0.500876 0.500751 0.500626 0.500501 0.500376 0.50025 0.500125 0.5 0.499875
+0.49975 0.499624 0.499499 0.499374 0.499249 0.499124 0.498998 0.498873
+0.498748 0.498623 0.498498 0.498373 0.498247 0.498122 0.497997 0.497872
+0.497747 0.497621 0.497496 0.497371 0.497246 0.497121 0.496995 0.49687
+0.496745 0.49662 0.496495 0.49637 0.496244 0.496119 0.495994 0.495869
+0.495744 0.495618 0.495493 0.495368 0.495243 0.495118 0.494992 0.494867
+0.494742 0.494617 0.494492 0.494367 0.494241 0.494116 0.493991 0.493866
+0.493741 0.493615 0.49349 0.493365 0.49324 0.493115 0.492989 0.492864
+0.492739 0.492614 0.492489 0.492364 0.492238 0.492113 0.491988 0.491863
+0.491738 0.491612 0.491487 0.491362 0.491237 0.491112 0.490986 0.490861
+0.490736 0.490611 0.490486 0.490361 0.490235 0.49011 0.489985 0.48986
+0.489735 0.489609 0.489484 0.489359 0.489234 0.489109 0.488983 0.488858
+0.488733 0.488608 0.488483 0.488358 0.488232 0.488107 0.487982 0.487857
+0.487732 0.487606 0.487481 0.487356 0.487231 0.487106 0.48698 0.486855
+0.48673 0.486605 0.48648 0.486355 0.486229 0.486104 0.485979 0.485854
+0.485729 0.485603 0.485478 0.485353 0.485228 0.485103 0.484977 0.484852
+0.484727 0.484602 0.484477 0.484352 0.484226 0.484101 0.483976 0.483851
+0.483726 0.4836 0.483475 0.48335 0.483225 0.4831 0.482974 0.482849
+0.482724 0.482599 0.482474 0.482349 0.482223 0.482098 0.481973 0.481848
+0.481723 0.481597 0.481472 0.481347 0.481222 0.481097 0.480971 0.480846
+0.480721 0.480596 0.480471 0.480346 0.48022 0.480095 0.47997 0.479845
+0.47972 0.479594 0.479469 0.479344 0.479219 0.479094 0.478968 0.478843
+0.478718 0.478593 0.478468 0.478343 0.478217 0.478092 0.477967 0.477842
+0.477717 0.477591 0.477466 0.477341 0.477216 0.477091 0.476965 0.47684
+0.476715 0.47659 0.476465 0.47634 0.476214 0.476089 0.475964 0.475839
+0.475714 0.475588 0.475463 0.475338 0.475213 0.475088 0.474962 0.474837
+0.474712 0.474587 0.474462 0.474337 0.474211 0.474086 0.473961 0.473836
+0.473711 0.473585 0.47346 0.473335 0.47321 0.473085 0.472959 0.472834
+0.472709 0.472584 0.472459 0.472333 0.472208 0.472083 0.471958 0.471833
+0.471708 0.471582 0.471457 0.471332 0.471207 0.471082 0.470956 0.470831
+0.470706 0.470581 0.470456 0.470331 0.470205 0.47008 0.469955 0.46983
+0.469705 0.469579 0.469454 0.469329 0.469204 0.469079 0.468953 0.468828
+0.468703 0.468578 0.468453 0.468327 0.468202 0.468077 0.467952 0.467827
+0.467702 0.467576 0.467451 0.467326 0.467201 0.467076 0.46695 0.466825
+0.4667 0.466575 0.46645 0.466324 0.466199 0.466074 0.465949 0.465824
+0.465699 0.465573 0.465448 0.465323 0.465198 0.465073 0.464947 0.464822
+0.464697 0.464572 0.464447 0.464321 0.464196 0.464071 0.463946 0.463821
+0.463696 0.46357 0.463445 0.46332 0.463195 0.46307 0.462944 0.462819
+0.462694 0.462569 0.462444 0.462318 0.462193 0.462068 0.461943 0.461818
+0.461693 0.461567 0.461442 0.461317 0.461192 0.461067 0.460941 0.460816
+0.460691 0.460566 0.460441 0.460315 0.46019 0.460065 0.45994 0.459815
+0.45969 0.459564 0.459439 0.459314 0.459189 0.459064 0.458938 0.458813
+0.458688 0.458563 0.458438 0.458312 0.458187 0.458062 0.457937 0.457812
+0.457687 0.457561 0.457436 0.457311 0.457186 0.457061 0.456935 0.45681
+0.456685 0.45656 0.456435 0.456309 0.456184 0.456059 0.455934 0.455809
+0.455684 0.455558 0.455433 0.455308 0.455183 0.455058 0.454932 0.454807
+0.454682 0.454557 0.454432 0.454306 0.454181 0.454056 0.453931 0.453806
+0.453681 0.453555 0.45343 0.453305 0.45318 0.453055 0.452929 0.452804
+0.452679 0.452554 0.452429 0.452303 0.452178 0.452053 0.451928 0.451803
+0.451678 0.451552 0.451427 0.451302 0.451177 0.451052 0.450926 0.450801
+0.450676 0.450551 0.450426 0.4503 0.450175 0.45005 0.449925 0.4498
+0.449675 0.449549 0.449424 0.449299 0.449174 0.449049 0.448923 0.448798
+0.448673 0.448548 0.448423 0.448297 0.448172 0.448047 0.447922 0.447797
+0.447672 0.447546 0.447421 0.447296 0.447171 0.447046 0.44692 0.446795
+0.44667 0.446545 0.44642 0.446294 0.446169 0.446044 0.445919 0.445794
+0.445668 0.445543 0.445418 0.445293 0.445168 0.445043 0.444917 0.444792
+0.444667 0.444542 0.444417 0.444291 0.444166 0.444041 0.443916 0.443791
+0.443666 0.44354 0.443415 0.44329 0.443165 0.44304 0.442914 0.442789
+0.442664 0.442539 0.442414 0.442288 0.442163 0.442038 0.441913 0.441788
+0.441662 0.441537 0.441412 0.441287 0.441162 0.441037 0.440911 0.440786
+0.440661 0.440536 0.440411 0.440285 0.44016 0.440035 0.43991 0.439785
+0.439659 0.439534 0.439409 0.439284 0.439159 0.439034 0.438908 0.438783
+0.438658 0.438533 0.438408 0.438282 0.438157 0.438032 0.437907 0.437782
+0.437656 0.437531 0.437406 0.437281 0.437156 0.437031 0.436905 0.43678
+0.436655 0.43653 0.436405 0.436279 0.436154 0.436029 0.435904 0.435779
+0.435653 0.435528 0.435403 0.435278 0.435153 0.435028 0.434902 0.434777
+0.434652 0.434527 0.434402 0.434276 0.434151 0.434026 0.433901 0.433776
+0.43365 0.433525 0.4334 0.433275 0.43315 0.433025 0.432899 0.432774
+0.432649 0.432524 0.432399 0.432273 0.432148 0.432023 0.431898 0.431773
+0.431647 0.431522 0.431397 0.431272 0.431147 0.431022 0.430896 0.430771
+0.430646 0.430521 0.430396 0.43027 0.430145 0.43002 0.429895 0.42977
+0.429644 0.429519 0.429394 0.429269 0.429144 0.429019 0.428893 0.428768
+0.428643 0.428518 0.428393 0.428267 0.428142 0.428017 0.427892 0.427767
+0.427641 0.427516 0.427391 0.427266 0.427141 0.427016 0.42689 0.426765
+0.42664 0.426515 0.42639 0.426264 0.426139 0.426014 0.425889 0.425764
+0.425638 0.425513 0.425388 0.425263 0.425138 0.425013 0.424887 0.424762
+0.424637 0.424512 0.424387 0.424261 0.424136 0.424011 0.423886 0.423761
+0.423635 0.42351 0.423385 0.42326 0.423135 0.42301 0.422884 0.422759
+0.422634 0.422509 0.422384 0.422258 0.422133 0.422008 0.421883 0.421758
+0.421632 0.421507 0.421382 0.421257 0.421132 0.421007 0.420881 0.420756
+0.420631 0.420506 0.420381 0.420255 0.42013 0.420005 0.41988 0.419755
+0.419629 0.419504 0.419379 0.419254 0.419129 0.419004 0.418878 0.418753
+0.418628 0.418503 0.418378 0.418252 0.418127 0.418002 0.417877 0.417752
+0.417626 0.417501 0.417376 0.417251 0.417126 0.417001 0.416875 0.41675
+0.416625 0.4165 0.416375 0.416249 0.416124 0.415999 0.415874 0.415749
+0.415623 0.415498 0.415373 0.415248 0.415123 0.414997 0.414872 0.414747
+0.414622 0.414497 0.414372 0.414246 0.414121 0.413996 0.413871 0.413746
+0.41362 0.413495 0.41337 0.413245 0.41312 0.412995 0.412869 0.412744
+0.412619 0.412494 0.412369 0.412243 0.412118 0.411993 0.411868 0.411743
+0.411617 0.411492 0.411367 0.411242 0.411117 0.410991 0.410866 0.410741
+0.410616 0.410491 0.410366 0.41024 0.410115 0.40999 0.409865 0.40974
+0.409614 0.409489 0.409364 0.409239 0.409114 0.408988 0.408863 0.408738
+0.408613 0.408488 0.408363 0.408237 0.408112 0.407987 0.407862 0.407737
+0.407611 0.407486 0.407361 0.407236 0.407111 0.406985 0.40686 0.406735
+0.40661 0.406485 0.40636 0.406234 0.406109 0.405984 0.405859 0.405734
+0.405608 0.405483 0.405358 0.405233 0.405108 0.404982 0.404857 0.404732
+0.404607 0.404482 0.404357 0.404231 0.404106 0.403981 0.403856 0.403731
+0.403605 0.40348 0.403355 0.40323 0.403105 0.402979 0.402854 0.402729
+0.402604 0.402479 0.402354 0.402228 0.402103 0.401978 0.401853 0.401728
+0.401602 0.401477 0.401352 0.401227 0.401102 0.400976 0.400851 0.400726
+0.400601 0.400476 0.400351 0.400225 0.4001 0.399975 0.39985 0.399725
+;
+#A 5000 0.399599 0.399474 0.399349 0.399224 0.399099 0.398973 0.398848
+0.398723 0.398598 0.398473 0.398348 0.398222 0.398097 0.397972 0.397847
+0.397722 0.397596 0.397471 0.397346 0.397221 0.397096 0.39697 0.396845
+0.39672 0.396595 0.39647 0.396345 0.396219 0.396094 0.395969 0.395844
+0.395719 0.395593 0.395468 0.395343 0.395218 0.395093 0.394967 0.394842
+0.394717 0.394592 0.394467 0.394341 0.394216 0.394091 0.393966 0.393841
+0.393716 0.39359 0.393465 0.39334 0.393215 0.39309 0.392964 0.392839
+0.392714 0.392589 0.392464 0.392339 0.392213 0.392088 0.391963 0.391838
+0.391713 0.391587 0.391462 0.391337 0.391212 0.391087 0.390961 0.390836
+0.390711 0.390586 0.390461 0.390336 0.39021 0.390085 0.38996 0.389835
+0.38971 0.389584 0.389459 0.389334 0.389209 0.389084 0.388958 0.388833
+0.388708 0.388583 0.388458 0.388332 0.388207 0.388082 0.387957 0.387832
+0.387707 0.387581 0.387456 0.387331 0.387206 0.387081 0.386955 0.38683
+0.386705 0.38658 0.386455 0.38633 0.386204 0.386079 0.385954 0.385829
+0.385704 0.385578 0.385453 0.385328 0.385203 0.385078 0.384952 0.384827
+0.384702 0.384577 0.384452 0.384326 0.384201 0.384076 0.383951 0.383826
+0.383701 0.383575 0.38345 0.383325 0.3832 0.383075 0.382949 0.382824
+0.382699 0.382574 0.382449 0.382323 0.382198 0.382073 0.381948 0.381823
+0.381698 0.381572 0.381447 0.381322 0.381197 0.381072 0.380946 0.380821
+0.380696 0.380571 0.380446 0.38032 0.380195 0.38007 0.379945 0.37982
+0.379695 0.379569 0.379444 0.379319 0.379194 0.379069 0.378943 0.378818
+0.378693 0.378568 0.378443 0.378317 0.378192 0.378067 0.377942 0.377817
+0.377692 0.377566 0.377441 0.377316 0.377191 0.377066 0.37694 0.376815
+0.37669 0.376565 0.37644 0.376314 0.376189 0.376064 0.375939 0.375814
+0.375689 0.375563 0.375438 0.375313 0.375188 0.375063 0.374937 0.374812
+0.374687 0.374562 0.374437 0.374311 0.374186 0.374061 0.373936 0.373811
+0.373686 0.37356 0.373435 0.37331 0.373185 0.37306 0.372934 0.372809
+0.372684 0.372559 0.372434 0.372308 0.372183 0.372058 0.371933 0.371808
+0.371683 0.371557 0.371432 0.371307 0.371182 0.371057 0.370931 0.370806
+0.370681 0.370556 0.370431 0.370305 0.37018 0.370055 0.36993 0.369805
+0.36968 0.369554 0.369429 0.369304 0.369179 0.369054 0.368928 0.368803
+0.368678 0.368553 0.368428 0.368302 0.368177 0.368052 0.367927 0.367802
+0.367677 0.367551 0.367426 0.367301 0.367176 0.367051 0.366925 0.3668
+0.366675 0.36655 0.366425 0.366299 0.366174 0.366049 0.365924 0.365799
+0.365674 0.365548 0.365423 0.365298 0.365173 0.365048 0.364922 0.364797
+0.364672 0.364547 0.364422 0.364296 0.364171 0.364046 0.363921 0.363796
+0.36367 0.363545 0.36342 0.363295 0.36317 0.363045 0.362919 0.362794
+0.362669 0.362544 0.362419 0.362293 0.362168 0.362043 0.361918 0.361793
+0.361668 0.361542 0.361417 0.361292 0.361167 0.361042 0.360916 0.360791
+0.360666 0.360541 0.360416 0.36029 0.360165 0.36004 0.359915 0.35979
+0.359664 0.359539 0.359414 0.359289 0.359164 0.359039 0.358913 0.358788
+0.358663 0.358538 0.358413 0.358287 0.358162 0.358037 0.357912 0.357787
+0.357661 0.357536 0.357411 0.357286 0.357161 0.357036 0.35691 0.356785
+0.35666 0.356535 0.35641 0.356284 0.356159 0.356034 0.355909 0.355784
+0.355659 0.355533 0.355408 0.355283 0.355158 0.355033 0.354907 0.354782
+0.354657 0.354532 0.354407 0.354281 0.354156 0.354031 0.353906 0.353781
+0.353655 0.35353 0.353405 0.35328 0.353155 0.35303 0.352904 0.352779
+0.352654 0.352529 0.352404 0.352278 0.352153 0.352028 0.351903 0.351778
+0.351652 0.351527 0.351402 0.351277 0.351152 0.351027 0.350901 0.350776
+0.350651 0.350526 0.350401 0.350275 0.35015 0.350025 0.3499 0.349775
+0.349649 0.349524 0.349399 0.349274 0.349149 0.349024 0.348898 0.348773
+0.348648 0.348523 0.348398 0.348272 0.348147 0.348022 0.347897 0.347772
+0.347646 0.347521 0.347396 0.347271 0.347146 0.347021 0.346895 0.34677
+0.346645 0.34652 0.346395 0.346269 0.346144 0.346019 0.345894 0.345769
+0.345643 0.345518 0.345393 0.345268 0.345143 0.345018 0.344892 0.344767
+0.344642 0.344517 0.344392 0.344266 0.344141 0.344016 0.343891 0.343766
+0.34364 0.343515 0.34339 0.343265 0.34314 0.343015 0.342889 0.342764
+0.342639 0.342514 0.342389 0.342263 0.342138 0.342013 0.341888 0.341763
+0.341637 0.341512 0.341387 0.341262 0.341137 0.341012 0.340886 0.340761
+0.340636 0.340511 0.340386 0.34026 0.340135 0.34001 0.339885 0.33976
+0.339634 0.339509 0.339384 0.339259 0.339134 0.339009 0.338883 0.338758
+0.338633 0.338508 0.338383 0.338257 0.338132 0.338007 0.337882 0.337757
+0.337631 0.337506 0.337381 0.337256 0.337131 0.337005 0.33688 0.336755
+0.33663 0.336505 0.33638 0.336254 0.336129 0.336004 0.335879 0.335754
+0.335628 0.335503 0.335378 0.335253 0.335128 0.335003 0.334877 0.334752
+0.334627 0.334502 0.334377 0.334251 0.334126 0.334001 0.333876 0.333751
+0.333625 0.3335 0.333375 0.33325 0.333125 0.332999 0.332874 0.332749
+0.332624 0.332499 0.332374 0.332248 0.332123 0.331998 0.331873 0.331748
+0.331622 0.331497 0.331372 0.331247 0.331122 0.330996 0.330871 0.330746
+0.330621 0.330496 0.330371 0.330245 0.33012 0.329995 0.32987 0.329745
+0.329619 0.329494 0.329369 0.329244 0.329119 0.328993 0.328868 0.328743
+0.328618 0.328493 0.328368 0.328242 0.328117 0.327992 0.327867 0.327742
+0.327616 0.327491 0.327366 0.327241 0.327116 0.32699 0.326865 0.32674
+0.326615 0.32649 0.326365 0.326239 0.326114 0.325989 0.325864 0.325739
+0.325613 0.325488 0.325363 0.325238 0.325113 0.324987 0.324862 0.324737
+0.324612 0.324487 0.324362 0.324236 0.324111 0.323986 0.323861 0.323736
+0.32361 0.323485 0.32336 0.323235 0.32311 0.322984 0.322859 0.322734
+0.322609 0.322484 0.322359 0.322233 0.322108 0.321983 0.321858 0.321733
+0.321607 0.321482 0.321357 0.321232 0.321107 0.320981 0.320856 0.320731
+0.320606 0.320481 0.320356 0.32023 0.320105 0.31998 0.319855 0.31973
+0.319604 0.319479 0.319354 0.319229 0.319104 0.318978 0.318853 0.318728
+0.318603 0.318478 0.318353 0.318227 0.318102 0.317977 0.317852 0.317727
+0.317601 0.317476 0.317351 0.317226 0.317101 0.316975 0.31685 0.316725
+0.3166 0.316475 0.31635 0.316224 0.316099 0.315974 0.315849 0.315724
+0.315598 0.315473 0.315348 0.315223 0.315098 0.314972 0.314847 0.314722
+0.314597 0.314472 0.314347 0.314221 0.314096 0.313971 0.313846 0.313721
+0.313595 0.31347 0.313345 0.31322 0.313095 0.312969 0.312844 0.312719
+0.312594 0.312469 0.312344 0.312218 0.312093 0.311968 0.311843 0.311718
+0.311592 0.311467 0.311342 0.311217 0.311092 0.310966 0.310841 0.310716
+0.310591 0.310466 0.310341 0.310215 0.31009 0.309965 0.30984 0.309715
+0.309589 0.309464 0.309339 0.309214 0.309089 0.308963 0.308838 0.308713
+0.308588 0.308463 0.308338 0.308212 0.308087 0.307962 0.307837 0.307712
+0.307586 0.307461 0.307336 0.307211 0.307086 0.30696 0.306835 0.30671
+0.306585 0.30646 0.306334 0.306209 0.306084 0.305959 0.305834 0.305709
+0.305583 0.305458 0.305333 0.305208 0.305083 0.304957 0.304832 0.304707
+0.304582 0.304457 0.304332 0.304206 0.304081 0.303956 0.303831 0.303706
+0.30358 0.303455 0.30333 0.303205 0.30308 0.302954 0.302829 0.302704
+0.302579 0.302454 0.302328 0.302203 0.302078 0.301953 0.301828 0.301703
+0.301577 0.301452 0.301327 0.301202 0.301077 0.300951 0.300826 0.300701
+0.300576 0.300451 0.300325 0.3002 0.300075 0.29995 0.299825 0.2997
+0.299574 0.299449 0.299324 0.299199 0.299074 0.298948 0.298823 0.298698
+0.298573 0.298448 0.298322 0.298197 0.298072 0.297947 0.297822 0.297697
+0.297571 0.297446 0.297321 0.297196 0.297071 0.296945 0.29682 0.296695
+0.29657 0.296445 0.296319 0.296194 0.296069 0.295944 0.295819 0.295694
+0.295568 0.295443 0.295318 0.295193 0.295068 0.294942 0.294817 0.294692
+0.294567 0.294442 0.294316 0.294191 0.294066 0.293941 0.293816 0.293691
+0.293565 0.29344 0.293315 0.29319 0.293065 0.292939 0.292814 0.292689
+0.292564 0.292439 0.292313 0.292188 0.292063 0.291938 0.291813 0.291688
+0.291562 0.291437 0.291312 0.291187 0.291062 0.290936 0.290811 0.290686
+0.290561 0.290436 0.29031 0.290185 0.29006 0.289935 0.28981 0.289685
+0.289559 0.289434 0.289309 0.289184 0.289059 0.288933 0.288808 0.288683
+0.288558 0.288433 0.288307 0.288182 0.288057 0.287932 0.287807 0.287682
+0.287556 0.287431 0.287306 0.287181 0.287056 0.28693 0.286805 0.28668
+0.286555 0.28643 0.286304 0.286179 0.286054 0.285929 0.285804 0.285679
+0.285553 0.285428 0.285303 0.285178 0.285053 0.284927 0.284802 0.284677
+0.284552 0.284427 0.284301 0.284176 0.284051 0.283926 0.283801 0.283676
+0.28355 0.283425 0.2833 0.283175 0.28305 0.282924 0.282799 0.282674
+0.282549 0.282424 0.282298 0.282173 0.282048 0.281923 0.281798 0.281673
+0.281547 0.281422 0.281297 0.281172 0.281047 0.280921 0.280796 0.280671
+0.280546 0.280421 0.280295 0.28017 0.280045 0.27992 0.279795 0.279669
+0.279544 0.279419 0.279294 0.279169 0.279044 0.278918 0.278793 0.278668
+0.278543 0.278418 0.278292 0.278167 0.278042 0.277917 0.277792 0.277667
+0.277541 0.277416 0.277291 0.277166 0.277041 0.276915 0.27679 0.276665
+0.27654 0.276415 0.276289 0.276164 0.276039 0.275914 0.275789 0.275663
+0.275538 0.275413 0.275288 0.275163 0.275038 0.274912 0.274787 0.274662
+0.274537;
+#A 6000 0.274412 0.274286 0.274161 0.274036 0.273911 0.273786 0.27366
+0.273535 0.27341 0.273285 0.27316 0.273035 0.272909 0.272784 0.272659
+0.272534 0.272409 0.272283 0.272158 0.272033 0.271908 0.271783 0.271657
+0.271532 0.271407 0.271282 0.271157 0.271032 0.270906 0.270781 0.270656
+0.270531 0.270406 0.27028 0.270155 0.27003 0.269905 0.26978 0.269654
+0.269529 0.269404 0.269279 0.269154 0.269029 0.268903 0.268778 0.268653
+0.268528 0.268403 0.268277 0.268152 0.268027 0.267902 0.267777 0.267651
+0.267526 0.267401 0.267276 0.267151 0.267026 0.2669 0.266775 0.26665
+0.266525 0.2664 0.266274 0.266149 0.266024 0.265899 0.265774 0.265648
+0.265523 0.265398 0.265273 0.265148 0.265023 0.264897 0.264772 0.264647
+0.264522 0.264397 0.264271 0.264146 0.264021 0.263896 0.263771 0.263645
+0.26352 0.263395 0.26327 0.263145 0.26302 0.262894 0.262769 0.262644
+0.262519 0.262394 0.262268 0.262143 0.262018 0.261893 0.261768 0.261642
+0.261517 0.261392 0.261267 0.261142 0.261017 0.260891 0.260766 0.260641
+0.260516 0.260391 0.260265 0.26014 0.260015 0.25989 0.259765 0.259639
+0.259514 0.259389 0.259264 0.259139 0.259014 0.258888 0.258763 0.258638
+0.258513 0.258388 0.258262 0.258137 0.258012 0.257887 0.257762 0.257636
+0.257511 0.257386 0.257261 0.257136 0.257011 0.256885 0.25676 0.256635
+0.25651 0.256385 0.256259 0.256134 0.256009 0.255884 0.255759 0.255633
+0.255508 0.255383 0.255258 0.255133 0.255008 0.254882 0.254757 0.254632
+0.254507 0.254382 0.254256 0.254131 0.254006 0.253881 0.253756 0.25363
+0.253505 0.25338 0.253255 0.25313 0.253005 0.252879 0.252754 0.252629
+0.252504 0.252379 0.252253 0.252128 0.252003 0.251878 0.251753 0.251627
+0.251502 0.251377 0.251252 0.251127 0.251002 0.250876 0.250751 0.250626
+0.250501 0.250376 0.25025 0.250125 0.25 0.249875 0.24975 0.249624 0.249499
+0.249374 0.249249 0.249124 0.248998 0.248873 0.248748 0.248623 0.248498
+0.248373 0.248247 0.248122 0.247997 0.247872 0.247747 0.247621 0.247496
+0.247371 0.247246 0.247121 0.246995 0.24687 0.246745 0.24662 0.246495
+0.24637 0.246244 0.246119 0.245994 0.245869 0.245744 0.245618 0.245493
+0.245368 0.245243 0.245118 0.244992 0.244867 0.244742 0.244617 0.244492
+0.244367 0.244241 0.244116 0.243991 0.243866 0.243741 0.243615 0.24349
+0.243365 0.24324 0.243115 0.242989 0.242864 0.242739 0.242614 0.242489
+0.242364 0.242238 0.242113 0.241988 0.241863 0.241738 0.241612 0.241487
+0.241362 0.241237 0.241112 0.240986 0.240861 0.240736 0.240611 0.240486
+0.240361 0.240235 0.24011 0.239985 0.23986 0.239735 0.239609 0.239484
+0.239359 0.239234 0.239109 0.238983 0.238858 0.238733 0.238608 0.238483
+0.238358 0.238232 0.238107 0.237982 0.237857 0.237732 0.237606 0.237481
+0.237356 0.237231 0.237106 0.23698 0.236855 0.23673 0.236605 0.23648
+0.236355 0.236229 0.236104 0.235979 0.235854 0.235729 0.235603 0.235478
+0.235353 0.235228 0.235103 0.234977 0.234852 0.234727 0.234602 0.234477
+0.234352 0.234226 0.234101 0.233976 0.233851 0.233726 0.2336 0.233475
+0.23335 0.233225 0.2331 0.232974 0.232849 0.232724 0.232599 0.232474
+0.232349 0.232223 0.232098 0.231973 0.231848 0.231723 0.231597 0.231472
+0.231347 0.231222 0.231097 0.230971 0.230846 0.230721 0.230596 0.230471
+0.230346 0.23022 0.230095 0.22997 0.229845 0.22972 0.229594 0.229469
+0.229344 0.229219 0.229094 0.228968 0.228843 0.228718 0.228593 0.228468
+0.228343 0.228217 0.228092 0.227967 0.227842 0.227717 0.227591 0.227466
+0.227341 0.227216 0.227091 0.226965 0.22684 0.226715 0.22659 0.226465
+0.22634 0.226214 0.226089 0.225964 0.225839 0.225714 0.225588 0.225463
+0.225338 0.225213 0.225088 0.224962 0.224837 0.224712 0.224587 0.224462
+0.224337 0.224211 0.224086 0.223961 0.223836 0.223711 0.223585 0.22346
+0.223335 0.22321 0.223085 0.222959 0.222834 0.222709 0.222584 0.222459
+0.222334 0.222208 0.222083 0.221958 0.221833 0.221708 0.221582 0.221457
+0.221332 0.221207 0.221082 0.220956 0.220831 0.220706 0.220581 0.220456
+0.22033 0.220205 0.22008 0.219955 0.21983 0.219705 0.219579 0.219454
+0.219329 0.219204 0.219079 0.218953 0.218828 0.218703 0.218578 0.218453
+0.218327 0.218202 0.218077 0.217952 0.217827 0.217702 0.217576 0.217451
+0.217326 0.217201 0.217076 0.21695 0.216825 0.2167 0.216575 0.21645
+0.216324 0.216199 0.216074 0.215949 0.215824 0.215699 0.215573 0.215448
+0.215323 0.215198 0.215073 0.214947 0.214822 0.214697 0.214572 0.214447
+0.214321 0.214196 0.214071 0.213946 0.213821 0.213696 0.21357 0.213445
+0.21332 0.213195 0.21307 0.212944 0.212819 0.212694 0.212569 0.212444
+0.212318 0.212193 0.212068 0.211943 0.211818 0.211693 0.211567 0.211442
+0.211317 0.211192 0.211067 0.210941 0.210816 0.210691 0.210566 0.210441
+0.210315 0.21019 0.210065 0.20994 0.209815 0.20969 0.209564 0.209439
+0.209314 0.209189 0.209064 0.208938 0.208813 0.208688 0.208563 0.208438
+0.208312 0.208187 0.208062 0.207937 0.207812 0.207687 0.207561 0.207436
+0.207311 0.207186 0.207061 0.206935 0.20681 0.206685 0.20656 0.206435
+0.206309 0.206184 0.206059 0.205934 0.205809 0.205684 0.205558 0.205433
+0.205308 0.205183 0.205058 0.204932 0.204807 0.204682 0.204557 0.204432
+0.204306 0.204181 0.204056 0.203931 0.203806 0.203681 0.203555 0.20343
+0.203305 0.20318 0.203055 0.202929 0.202804 0.202679 0.202554 0.202429
+0.202303 0.202178 0.202053 0.201928 0.201803 0.201678 0.201552 0.201427
+0.201302 0.201177 0.201052 0.200926 0.200801 0.200676 0.200551 0.200426
+0.2003 0.200175 0.20005 0.199925 0.1998 0.199675 0.199549 0.199424
+0.199299 0.199174 0.199049 0.198923 0.198798 0.198673 0.198548 0.198423
+0.198297 0.198172 0.198047 0.197922 0.197797 0.197672 0.197546 0.197421
+0.197296 0.197171 0.197046 0.19692 0.196795 0.19667 0.196545 0.19642
+0.196294 0.196169 0.196044 0.195919 0.195794 0.195669 0.195543 0.195418
+0.195293 0.195168 0.195043 0.194917 0.194792 0.194667 0.194542 0.194417
+0.194291 0.194166 0.194041 0.193916 0.193791 0.193666 0.19354 0.193415
+0.19329 0.193165 0.19304 0.192914 0.192789 0.192664 0.192539 0.192414
+0.192288 0.192163 0.192038 0.191913 0.191788 0.191662 0.191537 0.191412
+0.191287 0.191162 0.191037 0.190911 0.190786 0.190661 0.190536 0.190411
+0.190285 0.19016 0.190035 0.18991 0.189785 0.189659 0.189534 0.189409
+0.189284 0.189159 0.189034 0.188908 0.188783 0.188658 0.188533 0.188408
+0.188282 0.188157 0.188032 0.187907 0.187782 0.187656 0.187531 0.187406
+0.187281 0.187156 0.187031 0.186905 0.18678 0.186655 0.18653 0.186405
+0.186279 0.186154 0.186029 0.185904 0.185779 0.185653 0.185528 0.185403
+0.185278 0.185153 0.185028 0.184902 0.184777 0.184652 0.184527 0.184402
+0.184276 0.184151 0.184026 0.183901 0.183776 0.18365 0.183525 0.1834
+0.183275 0.18315 0.183025 0.182899 0.182774 0.182649 0.182524 0.182399
+0.182273 0.182148 0.182023 0.181898 0.181773 0.181647 0.181522 0.181397
+0.181272 0.181147 0.181022 0.180896 0.180771 0.180646 0.180521 0.180396
+0.18027 0.180145 0.18002 0.179895 0.17977 0.179644 0.179519 0.179394
+0.179269 0.179144 0.179019 0.178893 0.178768 0.178643 0.178518 0.178393
+0.178267 0.178142 0.178017 0.177892 0.177767 0.177641 0.177516 0.177391
+0.177266 0.177141 0.177016 0.17689 0.176765 0.17664 0.176515 0.17639
+0.176264 0.176139 0.176014 0.175889 0.175764 0.175638 0.175513 0.175388
+0.175263 0.175138 0.175013 0.174887 0.174762 0.174637 0.174512 0.174387
+0.174261 0.174136 0.174011 0.173886 0.173761 0.173635 0.17351 0.173385
+0.17326 0.173135 0.17301 0.172884 0.172759 0.172634 0.172509 0.172384
+0.172258 0.172133 0.172008 0.171883 0.171758 0.171632 0.171507 0.171382
+0.171257 0.171132 0.171007 0.170881 0.170756 0.170631 0.170506 0.170381
+0.170255 0.17013 0.170005 0.16988 0.169755 0.169629 0.169504 0.169379
+0.169254 0.169129 0.169004 0.168878 0.168753 0.168628 0.168503 0.168378
+0.168252 0.168127 0.168002 0.167877 0.167752 0.167626 0.167501 0.167376
+0.167251 0.167126 0.167001 0.166875 0.16675 0.166625 0.1665 0.166375
+0.166249 0.166124 0.165999 0.165874 0.165749 0.165623 0.165498 0.165373
+0.165248 0.165123 0.164998 0.164872 0.164747 0.164622 0.164497 0.164372
+0.164246 0.164121 0.163996 0.163871 0.163746 0.16362 0.163495 0.16337
+0.163245 0.16312 0.162994 0.162869 0.162744 0.162619 0.162494 0.162369
+0.162243 0.162118 0.161993 0.161868 0.161743 0.161617 0.161492 0.161367
+0.161242 0.161117 0.160991 0.160866 0.160741 0.160616 0.160491 0.160366
+0.16024 0.160115 0.15999 0.159865 0.15974 0.159614 0.159489 0.159364
+0.159239 0.159114 0.158988 0.158863 0.158738 0.158613 0.158488 0.158363
+0.158237 0.158112 0.157987 0.157862 0.157737 0.157611 0.157486 0.157361
+0.157236 0.157111 0.156985 0.15686 0.156735 0.15661 0.156485 0.15636
+0.156234 0.156109 0.155984 0.155859 0.155734 0.155608 0.155483 0.155358
+0.155233 0.155108 0.154982 0.154857 0.154732 0.154607 0.154482 0.154357
+0.154231 0.154106 0.153981 0.153856 0.153731 0.153605 0.15348 0.153355
+0.15323 0.153105 0.152979 0.152854 0.152729 0.152604 0.152479 0.152354
+0.152228 0.152103 0.151978 0.151853 0.151728 0.151602 0.151477 0.151352
+0.151227 0.151102 0.150976 0.150851 0.150726 0.150601 0.150476 0.150351
+0.150225 0.1501 0.149975 0.14985 0.149725 0.149599 0.149474 0.149349
+;
+#A 7000 0.149224 0.149099 0.148973 0.148848 0.148723 0.148598 0.148473
+0.148348 0.148222 0.148097 0.147972 0.147847 0.147722 0.147596 0.147471
+0.147346 0.147221 0.147096 0.14697 0.146845 0.14672 0.146595 0.14647
+0.146345 0.146219 0.146094 0.145969 0.145844 0.145719 0.145593 0.145468
+0.145343 0.145218 0.145093 0.144967 0.144842 0.144717 0.144592 0.144467
+0.144342 0.144216 0.144091 0.143966 0.143841 0.143716 0.14359 0.143465
+0.14334 0.143215 0.14309 0.142964 0.142839 0.142714 0.142589 0.142464
+0.142339 0.142213 0.142088 0.141963 0.141838 0.141713 0.141587 0.141462
+0.141337 0.141212 0.141087 0.140961 0.140836 0.140711 0.140586 0.140461
+0.140336 0.14021 0.140085 0.13996 0.139835 0.13971 0.139584 0.139459
+0.139334 0.139209 0.139084 0.138958 0.138833 0.138708 0.138583 0.138458
+0.138333 0.138207 0.138082 0.137957 0.137832 0.137707 0.137581 0.137456
+0.137331 0.137206 0.137081 0.136955 0.13683 0.136705 0.13658 0.136455
+0.136329 0.136204 0.136079 0.135954 0.135829 0.135704 0.135578 0.135453
+0.135328 0.135203 0.135078 0.134952 0.134827 0.134702 0.134577 0.134452
+0.134326 0.134201 0.134076 0.133951 0.133826 0.133701 0.133575 0.13345
+0.133325 0.1332 0.133075 0.132949 0.132824 0.132699 0.132574 0.132449
+0.132323 0.132198 0.132073 0.131948 0.131823 0.131698 0.131572 0.131447
+0.131322 0.131197 0.131072 0.130946 0.130821 0.130696 0.130571 0.130446
+0.13032 0.130195 0.13007 0.129945 0.12982 0.129695 0.129569 0.129444
+0.129319 0.129194 0.129069 0.128943 0.128818 0.128693 0.128568 0.128443
+0.128317 0.128192 0.128067 0.127942 0.127817 0.127692 0.127566 0.127441
+0.127316 0.127191 0.127066 0.12694 0.126815 0.12669 0.126565 0.12644
+0.126314 0.126189 0.126064 0.125939 0.125814 0.125689 0.125563 0.125438
+0.125313 0.125188 0.125063 0.124937 0.124812 0.124687 0.124562 0.124437
+0.124311 0.124186 0.124061 0.123936 0.123811 0.123686 0.12356 0.123435
+0.12331 0.123185 0.12306 0.122934 0.122809 0.122684 0.122559 0.122434
+0.122308 0.122183 0.122058 0.121933 0.121808 0.121683 0.121557 0.121432
+0.121307 0.121182 0.121057 0.120931 0.120806 0.120681 0.120556 0.120431
+0.120305 0.12018 0.120055 0.11993 0.119805 0.11968 0.119554 0.119429
+0.119304 0.119179 0.119054 0.118928 0.118803 0.118678 0.118553 0.118428
+0.118302 0.118177 0.118052 0.117927 0.117802 0.117677 0.117551 0.117426
+0.117301 0.117176 0.117051 0.116925 0.1168 0.116675 0.11655 0.116425
+0.116299 0.116174 0.116049 0.115924 0.115799 0.115674 0.115548 0.115423
+0.115298 0.115173 0.115048 0.114922 0.114797 0.114672 0.114547 0.114422
+0.114296 0.114171 0.114046 0.113921 0.113796 0.113671 0.113545 0.11342
+0.113295 0.11317 0.113045 0.112919 0.112794 0.112669 0.112544 0.112419
+0.112293 0.112168 0.112043 0.111918 0.111793 0.111667 0.111542 0.111417
+0.111292 0.111167 0.111042 0.110916 0.110791 0.110666 0.110541 0.110416
+0.11029 0.110165 0.11004 0.109915 0.10979 0.109664 0.109539 0.109414
+0.109289 0.109164 0.109039 0.108913 0.108788 0.108663 0.108538 0.108413
+0.108287 0.108162 0.108037 0.107912 0.107787 0.107661 0.107536 0.107411
+0.107286 0.107161 0.107036 0.10691 0.106785 0.10666 0.106535 0.10641
+0.106284 0.106159 0.106034 0.105909 0.105784 0.105658 0.105533 0.105408
+0.105283 0.105158 0.105033 0.104907 0.104782 0.104657 0.104532 0.104407
+0.104281 0.104156 0.104031 0.103906 0.103781 0.103655 0.10353 0.103405
+0.10328 0.103155 0.10303 0.102904 0.102779 0.102654 0.102529 0.102404
+0.102278 0.102153 0.102028 0.101903 0.101778 0.101652 0.101527 0.101402
+0.101277 0.101152 0.101027 0.100901 0.100776 0.100651 0.100526 0.100401
+0.100275 0.10015 0.100025 0.0998999 0.0997747 0.0996495 0.0995243 0.0993991
+0.0992739 0.0991487 0.0990235 0.0988984 0.0987732 0.098648 0.0985228
+0.0983976 0.0982724 0.0981472 0.098022 0.0978968 0.0977717 0.0976465
+0.0975213 0.0973961 0.0972709 0.0971457 0.0970205 0.0968953 0.0967702
+0.096645 0.0965198 0.0963946 0.0962694 0.0961442 0.096019 0.0958938
+0.0957687 0.0956435 0.0955183 0.0953931 0.0952679 0.0951427 0.0950175
+0.0948923 0.0947672 0.094642 0.0945168 0.0943916 0.0942664 0.0941412
+0.094016 0.0938908 0.0937656 0.0936405 0.0935153 0.0933901 0.0932649
+0.0931397 0.0930145 0.0928893 0.0927641 0.092639 0.0925138 0.0923886
+0.0922634 0.0921382 0.092013 0.0918878 0.0917626 0.0916375 0.0915123
+0.0913871 0.0912619 0.0911367 0.0910115 0.0908863 0.0907611 0.090636
+0.0905108 0.0903856 0.0902604 0.0901352 0.09001 0.0898848 0.0897596
+0.0896344 0.0895093 0.0893841 0.0892589 0.0891337 0.0890085 0.0888833
+0.0887581 0.0886329 0.0885078 0.0883826 0.0882574 0.0881322 0.088007
+0.0878818 0.0877566 0.0876314 0.0875063 0.0873811 0.0872559 0.0871307
+0.0870055 0.0868803 0.0867551 0.0866299 0.0865048 0.0863796 0.0862544
+0.0861292 0.086004 0.0858788 0.0857536 0.0856284 0.0855033 0.0853781
+0.0852529 0.0851277 0.0850025 0.0848773 0.0847521 0.0846269 0.0845018
+0.0843766 0.0842514 0.0841262 0.084001 0.0838758 0.0837506 0.0836254
+0.0835003 0.0833751 0.0832499 0.0831247 0.0829995 0.0828743 0.0827491
+0.0826239 0.0824988 0.0823736 0.0822484 0.0821232 0.081998 0.0818728
+0.0817476 0.0816224 0.0814972 0.0813721 0.0812469 0.0811217 0.0809965
+0.0808713 0.0807461 0.0806209 0.0804957 0.0803706 0.0802454 0.0801202
+0.079995 0.0798698 0.0797446 0.0796194 0.0794942 0.0793691 0.0792439
+0.0791187 0.0789935 0.0788683 0.0787431 0.0786179 0.0784927 0.0783676
+0.0782424 0.0781172 0.077992 0.0778668 0.0777416 0.0776164 0.0774912
+0.077366 0.0772409 0.0771157 0.0769905 0.0768653 0.0767401 0.0766149
+0.0764897 0.0763645 0.0762394 0.0761142 0.075989 0.0758638 0.0757386
+0.0756134 0.0754882 0.075363 0.0752379 0.0751127 0.0749875 0.0748623
+0.0747371 0.0746119 0.0744867 0.0743615 0.0742364 0.0741112 0.073986
+0.0738608 0.0737356 0.0736104 0.0734852 0.07336 0.0732348 0.0731097
+0.0729845 0.0728593 0.0727341 0.0726089 0.0724837 0.0723585 0.0722333
+0.0721082 0.071983 0.0718578 0.0717326 0.0716074 0.0714822 0.071357
+0.0712318 0.0711067 0.0709815 0.0708563 0.0707311 0.0706059 0.0704807
+0.0703555 0.0702303 0.0701052 0.06998 0.0698548 0.0697296 0.0696044
+0.0694792 0.069354 0.0692288 0.0691037 0.0689785 0.0688533 0.0687281
+0.0686029 0.0684777 0.0683525 0.0682273 0.0681022 0.067977 0.0678518
+0.0677266 0.0676014 0.0674762 0.067351 0.0672258 0.0671007 0.0669755
+0.0668503 0.0667251 0.0665999 0.0664747 0.0663495 0.0662243 0.0660992
+0.065974 0.0658488 0.0657236 0.0655984 0.0654732 0.065348 0.0652228
+0.0650976 0.0649725 0.0648473 0.0647221 0.0645969 0.0644717 0.0643465
+0.0642213 0.0640961 0.063971 0.0638458 0.0637206 0.0635954 0.0634702
+0.063345 0.0632198 0.0630946 0.0629695 0.0628443 0.0627191 0.0625939
+0.0624687 0.0623435 0.0622183 0.0620931 0.061968 0.0618428 0.0617176
+0.0615924 0.0614672 0.061342 0.0612168 0.0610916 0.0609665 0.0608413
+0.0607161 0.0605909 0.0604657 0.0603405 0.0602153 0.0600901 0.0599649
+0.0598398 0.0597146 0.0595894 0.0594642 0.059339 0.0592138 0.0590886
+0.0589634 0.0588383 0.0587131 0.0585879 0.0584627 0.0583375 0.0582123
+0.0580871 0.0579619 0.0578368 0.0577116 0.0575864 0.0574612 0.057336
+0.0572108 0.0570856 0.0569604 0.0568353 0.0567101 0.0565849 0.0564597
+0.0563345 0.0562093 0.0560841 0.0559589 0.0558337 0.0557086 0.0555834
+0.0554582 0.055333 0.0552078 0.0550826 0.0549574 0.0548322 0.0547071
+0.0545819 0.0544567 0.0543315 0.0542063 0.0540811 0.0539559 0.0538307
+0.0537056 0.0535804 0.0534552 0.05333 0.0532048 0.0530796 0.0529544
+0.0528292 0.0527041 0.0525789 0.0524537 0.0523285 0.0522033 0.0520781
+0.0519529 0.0518277 0.0517026 0.0515774 0.0514522 0.051327 0.0512018
+0.0510766 0.0509514 0.0508262 0.0507011 0.0505759 0.0504507 0.0503255
+0.0502003 0.0500751 0.0499499 0.0498247 0.0496995 0.0495744 0.0494492
+0.049324 0.0491988 0.0490736 0.0489484 0.0488232 0.048698 0.0485729
+0.0484477 0.0483225 0.0481973 0.0480721 0.0479469 0.0478217 0.0476965
+0.0475714 0.0474462 0.047321 0.0471958 0.0470706 0.0469454 0.0468202
+0.046695 0.0465699 0.0464447 0.0463195 0.0461943 0.0460691 0.0459439
+0.0458187 0.0456935 0.0455684 0.0454432 0.045318 0.0451928 0.0450676
+0.0449424 0.0448172 0.044692 0.0445669 0.0444417 0.0443165 0.0441913
+0.0440661 0.0439409 0.0438157 0.0436905 0.0435653 0.0434402 0.043315
+0.0431898 0.0430646 0.0429394 0.0428142 0.042689 0.0425638 0.0424387
+0.0423135 0.0421883 0.0420631 0.0419379 0.0418127 0.0416875 0.0415623
+0.0414372 0.041312 0.0411868 0.0410616 0.0409364 0.0408112 0.040686
+0.0405608 0.0404357 0.0403105 0.0401853 0.0400601 0.0399349 0.0398097
+0.0396845 0.0395593 0.0394341 0.039309 0.0391838 0.0390586 0.0389334
+0.0388082 0.038683 0.0385578 0.0384327 0.0383075 0.0381823 0.0380571
+0.0379319 0.0378067 0.0376815 0.0375563 0.0374311 0.037306 0.0371808
+0.0370556 0.0369304 0.0368052 0.03668 0.0365548 0.0364296 0.0363045
+0.0361793 0.0360541 0.0359289 0.0358037 0.0356785 0.0355533 0.0354281
+0.035303 0.0351778 0.0350526 0.0349274 0.0348022 0.034677 0.0345518
+0.0344266 0.0343015 0.0341763 0.0340511 0.0339259 0.0338007 0.0336755
+0.0335503 0.0334251 0.0332999 0.0331748 0.0330496 0.0329244 0.0327992
+0.032674 0.0325488 0.0324236 0.0322984 0.0321733 0.0320481 0.0319229
+0.0317977 0.0316725 0.0315473 0.0314221 0.0312969 0.0311718 0.0310466
+0.0309214 0.0307962 0.030671 0.0305458 0.0304206 0.0302954 0.0301703
+0.0300451 0.0299199 0.0297947 0.0296695 0.0295443 0.0294191 0.0292939
+0.0291688 0.0290436 0.0289184 0.0287932 0.028668 0.0285428 0.0284176
+0.0282924 0.0281673 0.0280421 0.0279169 0.0277917 0.0276665 0.0275413
+0.0274161 0.0272909 0.0271657 0.0270406 0.0269154 0.0267902 0.026665
+0.0265398 0.0264146 0.0262894 0.0261642 0.0260391 0.0259139 0.0257887
+0.0256635 0.0255383 0.0254131 0.0252879 0.0251627 0.0250376 0.0249124
+0.0247872 0.024662 0.0245368 0.0244116 0.0242864 0.0241612;
+#A 8000 0.0240361 0.0239109 0.0237857 0.0236605 0.0235353 0.0234101
+0.0232849 0.0231597 0.0230346 0.0229094 0.0227842 0.022659 0.0225338
+0.0224086 0.0222834 0.0221582 0.022033 0.0219079 0.0217827 0.0216575
+0.0215323 0.0214071 0.0212819 0.0211567 0.0210315 0.0209064 0.0207812
+0.020656 0.0205308 0.0204056 0.0202804 0.0201552 0.02003 0.0199049
+0.0197797 0.0196545 0.0195293 0.0194041 0.0192789 0.0191537 0.0190285
+0.0189034 0.0187782 0.018653 0.0185278 0.0184026 0.0182774 0.0181522
+0.018027 0.0179019 0.0177767 0.0176515 0.0175263 0.0174011 0.0172759
+0.0171507 0.0170255 0.0169004 0.0167752 0.01665 0.0165248 0.0163996
+0.0162744 0.0161492 0.016024 0.0158988 0.0157737 0.0156485 0.0155233
+0.0153981 0.0152729 0.0151477 0.0150225 0.0148973 0.0147722 0.014647
+0.0145218 0.0143966 0.0142714 0.0141462 0.014021 0.0138958 0.0137707
+0.0136455 0.0135203 0.0133951 0.0132699 0.0131447 0.0130195 0.0128943
+0.0127692 0.012644 0.0125188 0.0123936 0.0122684 0.0121432 0.012018
+0.0118928 0.0117677 0.0116425 0.0115173 0.0113921 0.0112669 0.0111417
+0.0110165 0.0108913 0.0107661 0.010641 0.0105158 0.0103906 0.0102654
+0.0101402 0.010015 0.00988983 0.00976465 0.00963946 0.00951427 0.00938908
+0.0092639 0.00913871 0.00901352 0.00888833 0.00876314 0.00863796 0.00851277
+0.00838758 0.00826239 0.00813721 0.00801202 0.00788683 0.00776164 0.00763645
+0.00751127 0.00738608 0.00726089 0.0071357 0.00701052 0.00688533 0.00676014
+0.00663495 0.00650976 0.00638458 0.00625939 0.0061342 0.00600901 0.00588383
+0.00575864 0.00563345 0.00550826 0.00538307 0.00525789 0.0051327 0.00500751
+0.00488232 0.00475714 0.00463195 0.00450676 0.00438157 0.00425638 0.0041312
+0.00400601 0.00388082 0.00375563 0.00363045 0.00350526 0.00338007 0.00325488
+0.00312969 0.00300451 0.00287932 0.00275413 0.00262894 0.00250376 0.00237857
+0.00225338 0.00212819 0.002003 0.00187782 0.00175263 0.00162744 0.00150225
+0.00137707 0.00125188 0.00112669 0.0010015 0.000876314 0.000751127
+0.000625939 0.000500751 0.000375563 0.000250376 0.000125188;
+#X coords 0 1 8191 -1 100 70 1;
+#X restore 355 154 graph;
+#X obj 26 197 function~ window;
+#X msg 26 167 rcos;
+#X obj 26 124 function~ waveform;
+#X msg 26 100 addsyn 0 1 0.25;
+#X obj 26 143 loadbang;
+#X obj 26 372 granule~ waveform window;
+#X msg 26 341 spray;
+#X obj 26 445 dac~;
+#X obj 26 417 *~ 0.2;
+#X obj 224 417 *~ 0.2;
+#X obj 168 296 metro 1000;
+#X obj 168 275 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X msg 141 101 addsyn 0 0.1 0.3 0.5 0.3 0.1;
+#N canvas 0 22 410 263 more-messages 0;
+#X obj 13 191 outlet;
+#X msg 159 175 steady \$1;
+#X obj 159 153 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 176 155 steady rhythm;
+#N canvas 0 22 643 386 tuning 0;
+#X obj 63 252 outlet;
+#X msg 91 121 setscale 110 123.75 139.219 146.667 165 185.625 208.828
+220 247.5 278.438 293.333 330 371.25 417.656 440 495 556.875 586.667
+660 742.5 835.312 880 990 1113.75 1173.33 1320 1485 1670.62 1760 1980
+;
+#X obj 91 96 loadbang;
+#X msg 227 236 pitchdev \$1;
+#X floatatom 227 216 5 0 0 0 - - -, f 5;
+#X obj 230 192 hsl 128 15 0 0.1 0 0 empty empty empty -2 -6 0 8 -260704
+-1 -1 0 1;
+#N canvas 0 22 470 320 more-scales 0;
+#X msg 53 65 setscale 440 495 556.875 586.667 660 742.5 835.312 880
+990 1113.75 1173.33 1320 1485 1670.62;
+#X text 58 45 two octave Pythagorean;
+#X msg 64 125 setscale 55 58.2705 61.7354 65.4064 69.2957 73.4162 77.7817
+82.4069 87.3071 92.4986 97.9989 103.826 110 116.541 123.471 130.813
+138.591 146.832 155.563 164.814 174.614 184.997 195.998 207.652 220
+233.082 246.942 261.626 277.183 293.665 311.127 329.628 349.228 369.994
+391.995 415.305 440 466.164 493.883 523.251 554.365 587.33 622.254
+659.255 698.456 739.989 783.991 830.609 880 932.328 987.767 1046.5
+1108.73 1174.66 1244.51 1318.51 1396.91 1479.98 1567.98 1661.22;
+#X text 62 106 equal-tempered 12 tone;
+#X msg 84 299 setscale 55 60.7249 67.0458 74.0245 81.7297 90.2369 99.6296
+110 121.45 134.092 148.049 163.459 180.474 199.259 220 242.9 268.183
+296.098 326.919 360.948 398.518 440 485.8 536.366 592.196 653.837 721.895
+797.037 880 971.599 1072.73 1184.39 1307.67 1443.79 1594.07;
+#X text 79 279 equal-tempered 7 tone;
+#X msg 94 422 setscale 220 247.5 278.438 293.333 330 440 495 556.875
+586.667 660 880 990 1113.75 1173.33 1320;
+#X text 92 404 pentatonic;
+#X obj 60 488 outlet;
+#X connect 0 0 8 0;
+#X connect 2 0 8 0;
+#X connect 4 0 8 0;
+#X connect 6 0 8 0;
+#X restore 63 42 pd more-scales;
+#X text 173 105 default: diatonic pythagorean;
+#X msg 193 58 constrain_scale \$1;
+#X obj 193 35 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X text 156 14 limit scale within freq constraints set by grist message
+;
+#X text 213 31 (if your boundaries are bad the constraints will be
+ignored and the full scale will be used.);
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 0;
+#X connect 6 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 8 0;
+#X restore 100 68 pd tuning;
+#X msg 204 76 transpose \$1;
+#X floatatom 204 53 5 0 0 0 - - -, f 5;
+#X text 203 34 global transposition;
+#N canvas 0 22 244 162 initialize 0;
+#X obj 9 76 s granule-master-gain-in;
+#X msg 9 56 0.05;
+#X obj 9 32 loadbang;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X restore 279 176 pd initialize;
+#N canvas 0 22 478 328 grain-cloud-profile 0;
+#X obj 35 235 outlet;
+#X msg 79 20 grist 333 1000 50 5000 0 1 0.05 1 30 60;
+#X msg 79 44 grist 250 1000 100 300 0.1 0.9 0.1 1 40 60;
+#X msg 79 68 grist 30 1000 400 500 0.1 0.9 0.1 1 50 600;
+#X msg 79 92 grist 10 1000 1200 1500 0.1 0.9 0.1 1 20 50;
+#X msg 79 116 grist 3 1000 100 1500 0.1 0.9 0.1 1 1000 8000;
+#X msg 85 200 events \$1;
+#X floatatom 85 180 5 0 0 0 - - -, f 5;
+#X text 127 177 specify events-per-cloud directly;
+#X text 28 260 grist parameter sequence:;
+#X text 28 274 events-per-cloud \, event horizon(ms.) \, min freq \,
+max freq \,;
+#X text 29 307 min grain-size(ms.) \, max grain-size;
+#X text 28 290 left pan boundary \, right pan boundary \, min amp \,
+max amp \,;
+#X msg 83 136 grist 3 1000 200 800 0.1 0.9 0.1 1 2000 4000;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 7 0 6 0;
+#X connect 13 0 0 0;
+#X restore 13 38 pd grain-cloud-profile;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 5 0;
+#X connect 9 0 0 0;
+#X restore 387 356 pd more-messages;
+#X floatatom 26 294 5 0 0 0 - - -, f 5;
+#X msg 190 340 pitchspray;
+#X msg 26 244 1;
+#X obj 26 218 loadbang;
+#X text 90 218 select method;
+#X text 67 342 basic grain cloud;
+#X obj 26 77 loadbang;
+#X text 267 339 tuned grain cloud;
+#X msg 36 268 2;
+#X msg 96 170 aenv 0.025;
+#N canvas 666 199 454 304 select-method 0;
+#X obj 64 35 inlet;
+#X obj 138 25 inlet;
+#X obj 26 13 loadbang;
+#X obj 138 223 spigot;
+#X obj 193 224 spigot;
+#X obj 230 188 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 175 185 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 64 132 unpack f f;
+#X obj 64 65 sel 1 2;
+#X msg 64 102 1 0;
+#X msg 97 102 0 1;
+#X obj 138 255 outlet;
+#X obj 193 254 outlet;
+#X connect 0 0 8 0;
+#X connect 1 0 3 0;
+#X connect 1 0 4 0;
+#X connect 2 0 9 0;
+#X connect 3 0 11 0;
+#X connect 4 0 12 0;
+#X connect 5 0 4 1;
+#X connect 6 0 3 1;
+#X connect 7 0 6 0;
+#X connect 7 1 5 0;
+#X connect 8 0 9 0;
+#X connect 8 1 10 0;
+#X connect 9 0 7 0;
+#X connect 10 0 7 0;
+#X restore 26 317 pd select-method;
+#X obj 23 14 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 24 49 granule~ - granular synthesis;
+#X text 91 80 generate waveform;
+#X text 96 150 generate envelope;
+#X text 60 244 spray;
+#X text 69 268 pitchspray;
+#X obj 349 300 hsl 128 15 0 1 0 0 granule-master-gain granule-master-gain-in
+master_gain -2 -8 0 10 -261682 -1 -1 635 1;
+#X floatatom 263 399 5 0 0 0 - granule-master-gain -, f 5;
+#X floatatom 65 398 5 0 0 0 - granule-master-gain -, f 5;
+#X text 332 358 comment;
+#X text 167 253 Turn on to start grains (DACs must be on);
+#X connect 3 0 2 0;
+#X connect 5 0 4 0;
+#X connect 6 0 3 0;
+#X connect 7 0 10 0;
+#X connect 7 1 11 0;
+#X connect 8 0 7 0;
+#X connect 10 0 9 0;
+#X connect 11 0 9 1;
+#X connect 12 0 26 1;
+#X connect 13 0 12 0;
+#X connect 14 0 4 0;
+#X connect 15 0 7 0;
+#X connect 16 0 26 0;
+#X connect 17 0 7 0;
+#X connect 18 0 16 0;
+#X connect 19 0 18 0;
+#X connect 22 0 5 0;
+#X connect 24 0 16 0;
+#X connect 25 0 2 0;
+#X connect 26 0 8 0;
+#X connect 26 1 17 0;
+#X connect 34 0 11 1;
+#X connect 35 0 10 1;
diff --git a/externals/lyonpotpourri/granule~.c b/externals/lyonpotpourri/granule~.c
new file mode 100755
index 0000000000000000000000000000000000000000..019118df487f57c3f895f3caf00d6964de4c1b33
--- /dev/null
+++ b/externals/lyonpotpourri/granule~.c
@@ -0,0 +1 @@
+#include "MSPd.h"

#define MAXGRAINS (512) // just for present to get lower overhead

#define MAXSCALE (8192)
#define OBJECT_NAME "granule~"


static t_class *granule_class;


typedef struct {
    float amplitude;
    float panL;
    float panR;
    long delay; // samples to wait until event starts
    long duration;// length in samples of event
    float phase; // phase for frequency oscillator
    float ephase; // phase for envelope
    float si; // sampling increment for frequency
    float esi; // sampling increment for envelope
} t_grain;

typedef struct {
	t_word *b_samples;
	long b_frames;
	long b_nchans;
} t_pdbuffer;


typedef struct _granule
{
    
    t_object x_obj;
    float x_f;
    t_pdbuffer *wavebuf; // holds waveform samples
    t_pdbuffer *windowbuf; // holds window samples
	t_symbol *wavename; // name of waveform buffer
	t_symbol *windowname; // name of window buffer
    
	float sr; // sampling rate
	short mute;
	short hosed; // buffers are bad
	/* Global grain data*/
	long events; // number of events in a block
	long horizon; // length of block for random events
	float minfreq; // minimum frequency for a grain
	float maxfreq; // maximum frequency for a grain
	float minpan; // minimum pan for a grain
	float maxpan; // maxium pan for a grain
	float minamp; // minimum amplitude for a grain
	float maxamp; // maximum amplitude for a grain
	float mindur; // minumum duration for a grain
	float maxdur; // maximum duration for a grain
	t_grain *grains; // stores grain data
	float *pitchscale; // contains a frequency grid for pitch constraint
	int pitchsteps; // number of members in scale
	float transpose; // factor for scaling all pitches
	float pitch_deviation; // factor to adjust scaled pitches
	short steady; // toggles pulsed rhythmic activity
	float lowblock_freq; //lowest allowed frequency
	float highblock_freq;// highest allowed frequency
	float mindur_ms;//store duration in ms
	float maxdur_ms;//ditto
	float horizon_ms;//ditto
	short constrain_scale;//flag to only use bounded portion of scale rather than all of it
} t_granule;

void granule_setbuf(t_granule *x, t_symbol *wavename, t_symbol *windowname);
void *granule_new(t_symbol *msg, short argc, t_atom *argv);
t_int *granule_perform(t_int *w);
t_int *granule_performhose(t_int *w);
void granule_dsp(t_granule *x, t_signal **sp);
void granule_reload(t_granule *x);
void granule_spray(t_granule *x);
void granule_pitchspray(t_granule *x);
void granule_transpose(t_granule *x, t_floatarg t);
void granule_pitchdev(t_granule *x, t_floatarg d);
void granule_lowblock(t_granule *x, t_floatarg f);
void granule_highblock(t_granule *x, t_floatarg f);
void granule_events(t_granule *x, t_floatarg e);
float granule_boundrand(float min, float max);
void *granule_grist(t_granule *x, t_symbol *msg, short argc, t_atom *argv);
void *granule_grain(t_granule *x, t_symbol *msg, short argc, t_atom *argv);
void *granule_setscale(t_granule *x, t_symbol *msg, short argc, t_atom *argv);
void granule_info(t_granule *x);
void granule_mute(t_granule *x, t_floatarg toggle);
void granule_steady(t_granule *x, t_floatarg toggle);
void granule_constrain_scale(t_granule *x, t_floatarg toggle);
void granule_dsp_free(t_granule *x);
void granule_init(t_granule *x,short initialized);
void granule_constrain(int *index_min, int *index_max, float minfreq, float maxfreq, float *scale, int steps);

void granule_tilde_setup(void){
    granule_class = class_new(gensym("granule~"), (t_newmethod)granule_new,
                              (t_method)granule_dsp_free,sizeof(t_granule), 0,A_GIMME,0);
    CLASS_MAINSIGNALIN(granule_class, t_granule, x_f);
    class_addmethod(granule_class,(t_method)granule_dsp,gensym("dsp"),0);
    class_addmethod(granule_class,(t_method)granule_mute,gensym("mute"),A_FLOAT,0);
    class_addmethod(granule_class,(t_method)granule_setbuf,gensym("setbuf"),A_DEFSYM,A_DEFSYM,0);
    class_addmethod(granule_class,(t_method)granule_spray,gensym("spray"),0);
    class_addmethod(granule_class,(t_method)granule_info,gensym("info"),0);
    class_addmethod(granule_class,(t_method)granule_pitchspray,gensym("pitchspray"),0);
    class_addmethod(granule_class,(t_method)granule_transpose,gensym("transpose"),A_FLOAT,0);
    class_addmethod(granule_class,(t_method)granule_events,gensym("events"),A_FLOAT,0);
    class_addmethod(granule_class,(t_method)granule_pitchdev,gensym("pitchdev"),A_FLOAT,0);
    class_addmethod(granule_class,(t_method)granule_lowblock,gensym("lowblock"),A_FLOAT,0);
    class_addmethod(granule_class,(t_method)granule_highblock,gensym("highblock"),A_FLOAT,0);
    class_addmethod(granule_class,(t_method)granule_steady,gensym("steady"),A_FLOAT,0);
    class_addmethod(granule_class,(t_method)granule_constrain_scale,gensym("constrain_scale"),A_FLOAT,0);
    class_addmethod(granule_class,(t_method)granule_grist,gensym("grist"),A_GIMME,0);
    class_addmethod(granule_class,(t_method)granule_grain,gensym("grain"),A_GIMME,0);
    class_addmethod(granule_class,(t_method)granule_setscale,gensym("setscale"),A_GIMME,0);
    potpourri_announce(OBJECT_NAME);
}

void granule_constrain_scale(t_granule *x, t_floatarg toggle)
{
	x->constrain_scale = toggle;
}
void granule_lowblock(t_granule *x, t_floatarg f)
{
	if(f > 0){
		x->lowblock_freq = f;
	}
}

void granule_highblock(t_granule *x, t_floatarg f)
{
	if(f > 0){
		x->highblock_freq = f;
	}
}

void granule_pitchdev(t_granule *x, t_floatarg d)
{
	if(d < 0 ){
		error("pitch deviation must be positive");
		return;
	}
	x->pitch_deviation = d;
}

void granule_mute(t_granule *x, t_floatarg toggle)
{
	x->mute = toggle;
}

void granule_steady(t_granule *x, t_floatarg toggle)
{
	x->steady = toggle;
}

void granule_events(t_granule *x, t_floatarg e)
{
	if( e <= 0 ){
		post("events must be positive!");
		return;
	}
	x->events = e;
    //	x->steady_dur = x->horizon / (float) x->events;
}

void granule_transpose(t_granule *x, t_floatarg t)
{
	if( t <= 0 ){
		error("transpose factor must be greater than zero!");
		return;
	}
	x->transpose = t;
}

void *granule_setscale(t_granule *x, t_symbol *msg, short argc, t_atom *argv)
{
	int i;
	float *pitchscale = x->pitchscale;
	if( argc >= MAXSCALE ){
		error("%d is the maximum size scale", MAXSCALE);
		return 0;
	}
	if( argc < 2 ){
		error("there must be at least 2 members in scale");
		return 0;
	}
	for(i=0; i < argc; i++){
		pitchscale[i] = atom_getfloatarg(i,argc,argv);
	}
	x->pitchsteps = argc;
    //	post("read %d values into scale", x->pitchsteps);
    return 0;
}

void granule_constrain(int *index_min, int *index_max, float minfreq, float maxfreq, float *scale, int steps)
{
	int imax = steps - 1;
	int imin = 0;
	while(scale[imin] < minfreq && imin < imax){
		++imin;
	}
	if(imin == imax){
        //		post("could not constrain minimum index  - your grist parameters are out of range for this scale");
		*index_min = 0;
		*index_max = steps - 1;
		return;
	}
    while(scale[imax] > maxfreq && imax > 0){
		--imax;
	}
	if(imax < 1 || imax <= imin){
        //		post("could not constrain maximum index - your grist parameters are out of range for this scale");
		*index_min = 0;
		*index_max = steps - 1;
		return;
	}
	*index_min = imin;
	*index_max = imax;
}

void granule_pitchspray(t_granule *x)
{
	int i,j;
    
	long eframes = x->windowbuf->b_frames;
	long frames = x->wavebuf->b_frames;
	float sr = x->sr;
	long horizon = x->horizon; // length of block for random events
	float mindur = x->mindur;
	float maxdur = x->maxdur;
	float minfreq = x->minfreq; // minimum frequency for a grain
	float maxfreq = x->maxfreq; // maximum frequency for a grain
	float minpan = x->minpan; // minimum pan for a grain
	float maxpan = x->maxpan; // maxium pan for a grain
	float minamp = x->minamp; // minimum amplitude for a grain
	float maxamp = x->maxamp; // maximum amplitude for a grain
	float transpose = x->transpose; // pitch scalar
	float lowblock_freq = x->lowblock_freq;
	float highblock_freq = x->highblock_freq;
	short steady = x->steady;
	float pitch_deviation = x->pitch_deviation;
	float pdev = 0;
	float pdev_invert = 0;
    //	float pscale;
	float pan;
	int index_min, index_max;
	int steps = x->pitchsteps;
	float *scale = x->pitchscale;
	int windex;
	short inserted = 0;
	short constrain_scale = x->constrain_scale;
	t_grain *grains = x->grains;
    
    
	if( steps < 2 ){
		error("scale is undefined");
		return;
	}
	if( pitch_deviation ){
		pdev = 1.0 + pitch_deviation;
		pdev_invert = 1.0 / pdev;
	}
	for( i = 0; i < x->events; i++ ){
		inserted = 0;
		for(j = 0; j < MAXGRAINS; j++ ){
			if( grains[j].ephase >= eframes ){
				if(steady){
					grains[j].delay = (float)(i * horizon) / (float) x->events ;
				} else {
    				grains[j].delay = granule_boundrand(0.0,(float) horizon);
    			}
    			grains[j].duration = (long) granule_boundrand(mindur, maxdur);
    			grains[j].phase = 0.0;
    			grains[j].ephase = 0.0;
    			pan = granule_boundrand(minpan, maxpan);
    			grains[j].panL = cos(pan * PIOVERTWO);
    			grains[j].panR = sin(pan * PIOVERTWO);
    			grains[j].amplitude = granule_boundrand(minamp, maxamp);
    			grains[j].esi =  (float) eframes / (float) grains[j].duration ;
				if(constrain_scale){
					granule_constrain(&index_min,&index_max,minfreq, maxfreq, scale, steps);
					windex = (int) granule_boundrand((float)index_min, (float)index_max);
				} else {
					windex = (int) granule_boundrand(0.0, (float)(steps-1));
				}
    			grains[j].si = transpose * scale[windex] * (float) frames / sr;
    			if( pitch_deviation ){
    				grains[j].si *= granule_boundrand(pdev_invert,pdev);
    			}
    			/* must add this code to spray, and also do for high frequencies
                 */
    			if(lowblock_freq > 0.0) {
    				if(grains[j].si * (sr/frames) < lowblock_freq){
    					post("lowblock: aborted grain with %f frequency",grains[j].si * (sr/frames));
    					grains[j].ephase = eframes; // abort grain
    				}
    			}
    			if(highblock_freq > 0.0) {
    				if(grains[j].si * (sr/frames) > highblock_freq){
    					post("highblock: aborted grain with %f frequency, greater than %f",
                             grains[j].si * (sr/frames), highblock_freq);
    					grains[j].ephase = eframes; // abort grain
    				}
    			}
    			inserted = 1;
    			goto nextgrain;
    		}
		}
		if(!inserted){
			error("could not insert grain");
			return;
		}
    nextgrain: ;
	}
}

void granule_spray(t_granule *x)
{
	int i,j;
	long eframes = x->windowbuf->b_frames;
	long frames = x->wavebuf->b_frames;
	float sr = x->sr;
	long horizon = x->horizon; // length of block for random events
	float mindur = x->mindur;
	float maxdur = x->maxdur;
	float minfreq = x->minfreq; // minimum frequency for a grain
	float maxfreq = x->maxfreq; // maximum frequency for a grain
	float minpan = x->minpan; // minimum pan for a grain
	float maxpan = x->maxpan; // maxium pan for a grain
	float minamp = x->minamp; // minimum amplitude for a grain
	float maxamp = x->maxamp; // maximum amplitude for a grain
	float transpose = x->transpose; // pitch scalar
    //	float steady_dur = x->steady_dur;
	short steady = x->steady;
	float pan;
	t_grain *grains = x->grains;
	short inserted;

	for( i = 0; i < x->events; i++ ){
		inserted = 0;
		for(j = 0; j < MAXGRAINS; j++ ){
			if( grains[j].ephase >= eframes ){
				if(steady){
					grains[j].delay = (float)(i * horizon) / (float) x->events ;
				} else {
    				grains[j].delay = granule_boundrand(0.0,(float) horizon);
    			}
   				grains[j].duration = (long) granule_boundrand(mindur, maxdur);
    			grains[j].phase = 0.0;
    			grains[j].ephase = 0.0;
    			pan = granule_boundrand(minpan, maxpan);
    			grains[j].panL = cos(pan * PIOVERTWO);
    			grains[j].panR = sin(pan * PIOVERTWO);
    			grains[j].amplitude = granule_boundrand(minamp, maxamp);
    			grains[j].esi =  (float) eframes / (float) grains[j].duration ;
				grains[j].si = transpose * granule_boundrand(minfreq, maxfreq) * (float) frames / sr;
    			inserted = 1;
    			goto nextgrain;
    		}
		}
		if(! inserted){
			error("could not insert grain");
			return;
		}
    nextgrain: ;
	}
}

void *granule_grain(t_granule *x, t_symbol *msg, short argc, t_atom *argv)
{
	short inserted;
	int j;
	float duration, frequency, amplitude, pan;
	t_grain *grains;
	long eframes;
	long frames;
	float sr;

	grains = x->grains;
	eframes = x->windowbuf->b_frames;
	frames = x->wavebuf->b_frames;
	sr = x->sr;

	if(argc < 4){
		error("grain takes 4 arguments, not %d",argc);
		post("duration frequency amplitude pan");
		return 0;
	}
	duration = atom_getintarg(0,argc,argv);
	frequency = atom_getfloatarg(1,argc,argv); // in ms
	amplitude = atom_getfloatarg(2,argc,argv);
	pan = atom_getfloatarg(3,argc,argv);
	if(duration <= 0.0){
		error("illegal duration:%f",duration);
		return 0;
	}
	if(frequency <= 0.0){
		error("illegal frequency:%f",frequency);
		return 0;
	}
	if(pan < 0.0 || pan > 1.0){
		error("illegal pan:%f",pan);
		return 0;
	}
	inserted = 0;
	for(j = 0; j < MAXGRAINS; j++ ){
		if( grains[j].ephase >= eframes ){
			grains[j].delay = 0.0;// immediate deployment
			grains[j].duration = (long) (.001 * x->sr * duration);
			grains[j].phase = 0.0;
			grains[j].ephase = 0.0;
			grains[j].panL = cos(pan * PIOVERTWO);
			grains[j].panR = sin(pan * PIOVERTWO);
			grains[j].amplitude = amplitude;
			grains[j].esi =  (float) eframes / (float) grains[j].duration ;
			grains[j].si = frequency * (float) frames / sr;
			return 0;
		}
	}
	
	error("could not insert grain");
	return 0;
	
}

float granule_boundrand(float min, float max)
{
	return min + (max-min) * ((float) (rand() % RAND_MAX)/ (float) RAND_MAX);
}


void *granule_new(t_symbol *msg, short argc, t_atom *argv)
{

    t_granule *x = (t_granule *)pd_new(granule_class);
    outlet_new(&x->x_obj, gensym("signal"));
    outlet_new(&x->x_obj, gensym("signal"));
    x->wavebuf = (t_pdbuffer*)malloc(sizeof(t_pdbuffer));
    x->windowbuf = (t_pdbuffer*)malloc(sizeof(t_pdbuffer));
	srand(time(0));
    
	x->pitchscale = (float *) t_getbytes(MAXSCALE * sizeof(float));
	x->grains = (t_grain *) t_getbytes(MAXGRAINS * sizeof(t_grain));
	
    
	// default names
	x->wavename = gensym("waveform");
	x->windowname = gensym("window");
    
	/* MaxMSP bug that may soon be fixed, this does not work:
     x->wavename = atom_getsymarg(0,argc,argv);
     x->windowname = atom_getsymarg(1,argc,argv); */
    
    // apparently Pd lacks this Max/MSP bug
	x->wavename = atom_getsymbolarg(0,argc,argv);
	x->windowname = atom_getsymbolarg(1,argc,argv);

    
	x->sr = sys_getsr();
	if(! x->sr )
		x->sr = 44100;
    
	granule_init(x,0);
    
    
    return (x);
}

void granule_init(t_granule *x,short initialized)
{
	int i;
	
	if(!initialized){
		x->pitchsteps = 0; // we could predefine a 12t scale
		x->mute = 0;
		x->steady = 0;
		x->events = 10;
		x->horizon_ms = 1000;
		x->minfreq = 220.0;
		x->maxfreq = 880.0;
		x->minpan = .1;
		x->maxpan = .9;
		x->minamp = .1;
		x->maxamp = 1.0;
		x->mindur_ms = 150;
		x->maxdur_ms = 750;
		x->transpose = 1.0;
		x->pitch_deviation = 0.0;
		x->lowblock_freq = 0.0; // by default we do not block any frequencies
		x->highblock_freq = 0.0; // ditto
		x->constrain_scale = 0;
	}
	x->horizon = x->horizon_ms * .001 * x->sr;
	x->mindur = x->mindur_ms * .001 * x->sr;
	x->maxdur = x->maxdur_ms * .001 * x->sr;
	for( i = 0; i < MAXGRAINS; i++ ){ // this is what we test for a legal place to insert grain
		x->grains[i].ephase = 9999999999.0;
	}
}

void granule_info(t_granule *x)
{
	int tcount = 0;
	t_grain *grains = x->grains;
	long eframes = x->windowbuf->b_frames;
	int i;
	
	for(i = 0; i < MAXGRAINS; i++ ){
		if( grains[i].ephase < eframes )
			++tcount;
	}
	post("%d active grains", tcount);
	post("wavename %s", x->wavename->s_name);
	post("windowname %s", x->windowname->s_name);
}


void *granule_grist(t_granule *x, t_symbol *msg, short argc, t_atom *argv)
{
	if(argc < 10 ){
		error("grist takes 10 arguments:");
		post("events horizon minfreq maxfreq minpan maxpan minamp maxamp mindur maxdur");
		return 0;
	}
	x->events = atom_getintarg(0,argc,argv);
	x->horizon_ms = atom_getfloatarg(1,argc,argv);
	x->minfreq = atom_getfloatarg(2,argc,argv);
	x->maxfreq = atom_getfloatarg(3,argc,argv);
	x->minpan = atom_getfloatarg(4,argc,argv);
	x->maxpan = atom_getfloatarg(5,argc,argv);
	x->minamp = atom_getfloatarg(6,argc,argv);
	x->maxamp = atom_getfloatarg(7,argc,argv);
	x->mindur_ms = atom_getfloatarg(8,argc,argv);
	x->maxdur_ms = atom_getfloatarg(9,argc,argv);
	
	x->mindur = .001 * x->sr * x->mindur_ms ;
	x->maxdur = .001 * x->sr * x->maxdur_ms;
	x->horizon = .001 * x->sr * x->horizon_ms;
	
	if(x->minfreq < 0){
		x->minfreq *= -1.0;
	}
	if(x->maxfreq < 0){
		x->maxfreq *= -1.0;
	}
	if(x->minpan < 0.0) {
		x->minpan = 0.0;
	}
	if(x->maxpan > 1.0) {
		x->maxpan = 1.0;
	}
	if(x->events < 0){
		x->events = 0;
	}
	return 0;
}


void granule_reload(t_granule *x)
{
	granule_setbuf(x, x->wavename, x->windowname);
}


void granule_setbuf(t_granule *x, t_symbol *wavename, t_symbol *windowname)
{
    t_garray *a;
    int frames;
    
    x->hosed = 0;
    x->wavebuf->b_frames = 0;
    x->windowbuf->b_frames = 0;
    x->wavebuf->b_nchans = 1;
    x->windowbuf->b_nchans = 1;
    if (!(a = (t_garray *)pd_findbyclass(wavename, garray_class))) {
        if (*wavename->s_name) pd_error(x, "granule~: %s: no such array", wavename->s_name);
        x->hosed = 1;
    }
    else if (!garray_getfloatwords(a, &frames, &x->wavebuf->b_samples)) {
        pd_error(x, "%s: bad template for granule~", wavename->s_name);
        x->hosed = 1;
    }
    else  {
        x->wavebuf->b_frames = frames;
        garray_usedindsp(a);
    }
    
    if (!(a = (t_garray *)pd_findbyclass(windowname, garray_class))) {
        if (*wavename->s_name) pd_error(x, "granule~: %s: no such array", windowname->s_name);
        x->hosed = 1;
    }
    else if (!garray_getfloatwords(a, &frames, &x->windowbuf->b_samples)) {
        pd_error(x, "%s: bad template for granule~", windowname->s_name);
        x->hosed = 1;
    }
    else  {
        x->windowbuf->b_frames = frames;
        garray_usedindsp(a);
    }
}


t_int *granule_performhose(t_int *w)
{
    //	t_granule *x = (t_granule *) (w[1]);
	float *outputL = (t_float *)(w[3]);
	float *outputR = (t_float *)(w[4]);
	int n = (int) w[5];
	while(n--) *outputL++ = *outputR++ = 0;
	return (w+6);
}

t_int *granule_perform(t_int *w)
{
	t_granule *x = (t_granule *) (w[1]);
    //	float *in = (t_float *)(w[2]); // ignoring input
	float *outputL = (t_float *)(w[3]);
	float *outputR = (t_float *)(w[4]);
	int n = (int) w[5];

	t_pdbuffer *wavebuf = x->wavebuf;
	t_pdbuffer *windowbuf = x->windowbuf;
	t_word *wavetable = wavebuf->b_samples;
	t_word *window = windowbuf->b_samples;
	t_grain *grains = x->grains;
	float sample;
	float envelope;
	float amplitude;
	float panL, panR;
	float si;
	float esi;
	float phase;
	float ephase;
	long delay;
	long frames = wavebuf->b_frames;
	long eframes = windowbuf->b_frames;
	int i,j;
	
    
    
	/* grain parameters */
    
    
	if( x->mute ){
		while(n--) *outputL++ = *outputR++ = 0;
		return (w+6);
	}
    
    // pre-clean buffer
	for( i = 0; i < n; i++ ){
		outputL[i] = outputR[i] = 0;
	}
    
	for (j=0; j<MAXGRAINS; j++) {
        
		if(grains[j].ephase >= eframes){
			goto nextgrain;
		}
		amplitude = grains[j].amplitude;
		si =  grains[j].si;
		esi = grains[j].esi;
		phase =  grains[j].phase;
		ephase = grains[j].ephase;
		delay =  grains[j].delay;
		panL = grains[j].panL;
		panR = grains[j].panR;
        
		
		for(i = 0; i < n; i++ ){
			// ++(x->sampcount); // not really needed
			if( delay > 0 ){
				--delay;
			}
			if( delay <= 0 && ephase < eframes){
				sample = wavetable[(int)phase].w_float;
                
				envelope = amplitude * window[(int)ephase].w_float;
				sample *= envelope;
				outputL[i] += panL * sample;
				outputR[i] += panR * sample;
				phase += si;
				ephase += esi;
				while( phase >= frames )
					phase -= frames;
                
				if( ephase >= eframes ){
					grains[j].ephase = ephase;
					goto nextgrain; // must escape loop now
				}
                
			}
		}
		grains[j].phase = phase;
		grains[j].ephase = ephase;
		grains[j].delay = delay;
		
    nextgrain: ;
	}
    
	return (w+6);
    
    
}

void granule_dsp_free(t_granule *x)
{

	t_freebytes(x->grains, MAXGRAINS * sizeof(t_grain));
	t_freebytes(x->pitchscale, MAXSCALE * sizeof(float));
}

void granule_dsp(t_granule *x, t_signal **sp)
{
    
	granule_reload(x);
	
	if( x->hosed ){
		post("You need some valid buffers");
		dsp_add(granule_performhose, 5, x,
                sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
		return;
	}
	if( x->sr != sp[0]->s_sr){
		x->sr = sp[0]->s_sr;
		if( !x->sr ){
			post("warning: zero sampling rate!");
			x->sr = 44100;
		}
		granule_init(x,1);
	} 
	dsp_add(granule_perform, 5, x, 
			sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
}

\ No newline at end of file
diff --git a/externals/lyonpotpourri/kbuffer~-help.pd b/externals/lyonpotpourri/kbuffer~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..c55bcd5f48ddf1d21b89e76dfeb0ade5e27b64fb
--- /dev/null
+++ b/externals/lyonpotpourri/kbuffer~-help.pd
@@ -0,0 +1,69 @@
+#N canvas 487 22 464 484 10;
+#X obj 44 210 kbuffer~ 512 8000;
+#X text 170 207 args: ksampling rate \, storage time (in ms.);
+#N canvas 0 22 466 316 more-messages 0;
+#X msg 238 89 size 4000;
+#X obj 173 154 outlet;
+#X text 170 212 reset size or srate;
+#X msg 275 124 info;
+#X msg 137 91 ksrate 1024;
+#X connect 0 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 1 0;
+#X restore 302 170 pd more-messages;
+#X msg 43 165 record;
+#X msg 98 166 play;
+#X msg 143 167 stop;
+#X msg 186 167 speed \$1;
+#X msg 261 167 loop;
+#X obj 44 273 phasor~;
+#X floatatom 160 258 5 0 0 0 - - -, f 5;
+#X floatatom 26 136 5 0 0 2 kb-input kb-input -, f 5;
+#X obj 82 363 hsl 128 15 300 1000 0 0 kb-input empty empty -2 -6 0
+8 -261119 -1 -1 0 1;
+#X floatatom 131 127 5 0 0 0 - - -, f 5;
+#X msg 129 104 1;
+#X obj 44 392 *~ 0.1;
+#X obj 44 422 dac~;
+#X obj 129 83 loadbang;
+#X text 177 122 try different playback speed \, negative OK;
+#X text 80 335 hit record \; then perform some wiggles here:;
+#X text 187 150 after done recording \, hit loop or play;
+#X obj 22 9 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X obj 44 308 killdc~;
+#N canvas 0 22 222 238 monitor-phase 0;
+#X obj 101 116 metro 100;
+#X obj 101 97 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X obj 101 144 snapshot~;
+#X obj 101 42 loadbang;
+#X msg 101 67 1;
+#X obj 101 179 outlet;
+#X obj 15 48 inlet~;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 2 0 5 0;
+#X connect 3 0 4 0;
+#X connect 4 0 1 0;
+#X connect 6 0 2 0;
+#X restore 160 234 pd monitor-phase;
+#X text 21 45 kbuffer~ lets you sample gestures with a lower sampling
+rate than the audio rate., f 68;
+#X connect 0 0 8 0;
+#X connect 0 1 22 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X connect 8 0 21 0;
+#X connect 10 0 0 0;
+#X connect 12 0 6 0;
+#X connect 13 0 12 0;
+#X connect 14 0 15 0;
+#X connect 14 0 15 1;
+#X connect 16 0 13 0;
+#X connect 21 0 14 0;
+#X connect 22 0 9 0;
diff --git a/externals/lyonpotpourri/kbuffer~.c b/externals/lyonpotpourri/kbuffer~.c
new file mode 100755
index 0000000000000000000000000000000000000000..1e949bb88fbf36f44ca7e36a4466954ba9ebc0f9
--- /dev/null
+++ b/externals/lyonpotpourri/kbuffer~.c
@@ -0,0 +1,310 @@
+#include "MSPd.h"
+
+#define OBJECT_NAME "kbuffer~"
+
+static t_class *kbuffer_class;
+
+typedef struct _kbuffer
+{
+    
+    t_object x_obj;
+    float x_f;
+	float ksrate;
+	float srate;
+	float si;
+	float phase;
+	float duration;
+	int iphase;
+	int lastphase;
+	int length;
+	float *data;
+	float fval;
+	float lastval;
+	short record_flag;
+	short play_flag;
+	short dump_flag;
+	short loop_flag;
+	float sync ;
+	float speed ;
+	short in_connected;
+	int memsize;
+} t_kbuffer;
+
+t_int *kbuffer_perform(t_int *w);
+
+void kbuffer_dsp(t_kbuffer *x, t_signal **sp);
+void *kbuffer_new(t_symbol *s, int argc, t_atom *argv);
+void kbuffer_dsp_free(t_kbuffer *x);
+void kbuffer_record(t_kbuffer *x);
+void kbuffer_play(t_kbuffer *x);
+void kbuffer_loop(t_kbuffer *x);
+void kbuffer_info(t_kbuffer *x);
+void kbuffer_dump(t_kbuffer *x);
+void kbuffer_stop(t_kbuffer *x);
+void kbuffer_info(t_kbuffer *x);
+void kbuffer_speed(t_kbuffer *x, t_floatarg speed);
+void kbuffer_size(t_kbuffer *x, t_floatarg ms);
+void kbuffer_ksrate(t_kbuffer *x, t_floatarg ksrate);
+void kbuffer_float(t_kbuffer *x, double f);
+void kbuffer_int(t_kbuffer *x, int i);
+void kbuffer_init(t_kbuffer *x,short initialized);
+
+void kbuffer_tilde_setup(void){
+    kbuffer_class = class_new(gensym("kbuffer~"), (t_newmethod)kbuffer_new,
+                              (t_method)kbuffer_dsp_free,sizeof(t_kbuffer), 0,A_GIMME,0);
+    CLASS_MAINSIGNALIN(kbuffer_class, t_kbuffer, x_f);
+    class_addmethod(kbuffer_class,(t_method)kbuffer_dsp,gensym("dsp"),0);
+    class_addmethod(kbuffer_class,(t_method)kbuffer_record,gensym("record"),0);
+    class_addmethod(kbuffer_class,(t_method)kbuffer_play,gensym("play"),0);
+    class_addmethod(kbuffer_class,(t_method)kbuffer_loop,gensym("loop"),0);
+    class_addmethod(kbuffer_class,(t_method)kbuffer_stop,gensym("stop"),0);
+    class_addmethod(kbuffer_class,(t_method)kbuffer_dump,gensym("dump"),0);
+    class_addmethod(kbuffer_class,(t_method)kbuffer_info,gensym("info"),0);
+    class_addmethod(kbuffer_class,(t_method)kbuffer_speed,gensym("speed"),A_FLOAT,0);
+    class_addmethod(kbuffer_class,(t_method)kbuffer_size,gensym("size"),A_FLOAT,0);
+    class_addmethod(kbuffer_class,(t_method)kbuffer_ksrate,gensym("ksrate"),A_FLOAT,0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+void kbuffer_speed(t_kbuffer *x, t_floatarg speed) {
+	x->speed = speed;
+}
+
+void kbuffer_size(t_kbuffer *x, t_floatarg ms) {
+	int i;
+	if(ms < 1)
+		ms = 1;
+	x->duration = ms / 1000.0 ;
+	x->memsize = x->ksrate * x->duration * sizeof(float);
+    x->length = x->duration * x->ksrate ;
+	x->data = (float*) realloc(x->data,x->memsize*sizeof(float));
+    for( i = 0; i < x->length; i++){
+    	x->data[i] = 0.0;
+    }
+}
+
+void kbuffer_ksrate(t_kbuffer *x, t_floatarg ksrate) {
+	int i;
+	if( ksrate < 1 )
+		ksrate = 1 ;
+	x->ksrate = ksrate ;
+	x->memsize = x->ksrate * x->duration * sizeof(float);
+    x->length = x->duration * x->ksrate ;
+    x->si = x->ksrate / x->srate;
+	x->data = (float*) realloc(x->data,x->memsize*sizeof(float));
+    for( i = 0; i < x->length; i++){
+    	x->data[i] = 0.0;
+    }
+}
+
+void kbuffer_info(t_kbuffer *x) {
+	post("function length is %d samples",x->length);
+	post("function sampling rate is %.2f",x->ksrate);
+	post("function byte size is %d",x->memsize);
+	post("function duration is %.2f seconds",x->duration);
+}
+
+void kbuffer_record(t_kbuffer *x) {
+	x->record_flag = 1;
+	x->play_flag = 0;
+	x->dump_flag = 0;
+	x->loop_flag = 0;
+	x->sync = 0.0;
+	x->phase = x->iphase = 0 ;
+	x->lastphase = -1 ;
+	// post("starting to record");
+}
+void kbuffer_stop(t_kbuffer *x) {
+	x->record_flag = 0;
+	x->play_flag = 0;
+	x->dump_flag = 0;
+	x->loop_flag = 0;
+	x->sync = 0.0;
+	x->phase = x->iphase = 0 ;
+	x->lastphase = -1 ;
+}
+void kbuffer_dump(t_kbuffer *x) {
+	x->record_flag = 0;
+	x->play_flag = 0;
+	x->loop_flag = 0;
+	x->dump_flag = 1;
+	x->sync = 0.0;
+	x->phase = x->iphase = 0 ;
+	x->lastphase = -1 ;
+}
+
+void kbuffer_play(t_kbuffer *x) {
+	x->record_flag = 0;
+	x->play_flag = 1;
+	x->dump_flag = 0;
+	x->loop_flag = 0;
+	x->sync = 0.0;
+	x->phase = x->iphase = 0 ;
+	x->lastphase = -1 ;
+}
+
+void kbuffer_loop(t_kbuffer *x) {
+	x->record_flag = 0;
+	x->play_flag = 0;
+	x->dump_flag = 0;
+	x->loop_flag = 1;
+	x->sync = 0.0;
+	x->phase = x->iphase = 0 ;
+	x->lastphase = -1 ;
+}
+
+void kbuffer_dsp_free(t_kbuffer *x) {
+	free(x->data);
+}
+
+t_int *kbuffer_perform(t_int *w)
+{
+    // DSP config
+    t_kbuffer *x = (t_kbuffer *)(w[1]);
+    t_float *in = (t_float *)(w[2]);
+    t_float *out = (t_float *)(w[3]);
+    t_float *sync_out = (t_float *)(w[4]);
+    int n = (int) w[5];
+    short record_flag = x->record_flag;
+    short play_flag = x->play_flag ;
+    short dump_flag = x->dump_flag ;
+    short loop_flag = x->loop_flag ;
+    int length = x->length;
+    int iphase = x->iphase;
+    int lastphase = x->lastphase;
+    float phase = x->phase;
+    float *data = x->data;
+    float si = x->si;
+    float speed = x->speed;
+    float sample;
+    short in_connected = x->in_connected;
+    float fval = x->fval;
+    /*********************/
+    
+    while( n-- ){
+        if( in_connected ){
+            sample = *in++ ;
+        } else {
+            sample = fval;
+        }
+        if( record_flag ){
+            iphase = phase;
+            /*		phase += (si * speed); Bug!! */
+            phase += si;
+            if( iphase >= length ){
+                record_flag = 0;
+                // post("end of recording at %d samples",length);
+            }
+            else if( iphase > lastphase ){
+                lastphase = iphase ;
+                data[ iphase ] = sample ;
+            }
+            *sync_out++ = phase / (float) length ;
+            *out++ = sample ; // mirror input to output
+        } else if ( play_flag ){
+            iphase = phase;
+            phase += (si * speed);
+            if( iphase >= length ){
+                play_flag = 0;
+                *out++ = data[ length - 1 ]; // lock at final value
+            } else if (iphase < 0 ) {
+                play_flag = 0;
+                *out++ = data[ 0 ]; // lock at first value
+            }
+            else {
+                *out++ = data[ iphase ] ;
+            }
+            *sync_out++ = phase / (float) length ;
+        }
+        else if ( loop_flag ){
+            iphase = phase;
+            phase += (si * speed);
+            if( iphase >= length ){
+                phase = iphase = 0;
+            } else if (iphase < 0 ) {
+                phase = iphase = length - 1;
+            }
+            *out++ = data[ iphase ] ;
+            *sync_out++ = phase / (float) length ;
+            
+        }
+        else if ( dump_flag ) {
+            iphase = phase ;
+            phase += 1.0 ;
+            if( iphase >= length ){
+                dump_flag = 0;
+            } else {
+                *out++ = data[ iphase ];
+            }
+            
+        }
+        
+        else {
+            *sync_out++ = 0.0 ;
+            *out++ = 0.0;
+            
+        }
+        x->phase = phase;
+        x->lastphase = lastphase;
+        x->record_flag = record_flag;
+        x->play_flag = play_flag;
+        
+    }
+    // DSP CONFIG
+    return (w+6);
+}
+
+void *kbuffer_new(t_symbol *s, int argc, t_atom *argv)
+{
+
+    t_kbuffer *x = (t_kbuffer *)pd_new(kbuffer_class);
+    outlet_new(&x->x_obj, gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+    
+	x->srate = sys_getsr();
+	if( x->srate == 0 ){
+		error("zero sampling rate - set to 44100");
+		x->srate = 44100;
+	}
+	x->ksrate = atom_getfloatarg(0,argc,argv);
+    x->duration = atom_getfloatarg(1,argc,argv)/1000.0;
+	if(x->ksrate <= 0)
+		x->ksrate = 128;
+	if(x->duration <= 0)
+		x->duration = 10.;
+	
+	kbuffer_init(x,0);
+ 	return (x);
+}
+
+void kbuffer_init(t_kbuffer *x,short initialized)
+{
+	if(!initialized){
+		x->record_flag = 0;
+		x->play_flag = 0;
+		x->dump_flag = 0;
+		x->loop_flag = 0;
+		x->fval = 0;
+		x->speed = 1.0 ;
+        x->memsize = x->ksrate * x->duration * sizeof(float);
+        x->length = x->duration * x->ksrate;
+        x->data = (float *) calloc(x->memsize, sizeof(float));
+	}
+    x->si = x->ksrate / x->srate;
+}
+
+void kbuffer_dsp(t_kbuffer *x, t_signal **sp)
+{
+	// DSP CONFIG
+
+	x->in_connected = 1;
+    
+	if(x->srate != sp[0]->s_sr){
+        x->srate = sp[0]->s_sr;
+        kbuffer_init(x,1);
+	}
+   	dsp_add(kbuffer_perform, 5, x,
+            sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
+    
+}
+
diff --git a/externals/lyonpotpourri/killdc~-help.pd b/externals/lyonpotpourri/killdc~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..9edceba4d385cd19b61bf92331c12f962aa84977
--- /dev/null
+++ b/externals/lyonpotpourri/killdc~-help.pd
@@ -0,0 +1,27 @@
+#N canvas 648 97 510 369 10;
+#X obj 34 180 killdc~;
+#X obj 34 128 +~ 0.5;
+#X obj 34 98 *~ 0.5;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array sine+dc 441 float 2;
+#X coords 0 1 441 -1 200 140 1;
+#X restore 295 27 graph;
+#X obj 13 260 tabwrite~ sine+dc;
+#X msg 88 202 bang;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array dc-gone 441 float 2;
+#X coords 0 1 441 -1 200 140 1;
+#X restore 294 181 graph;
+#X obj 140 260 tabwrite~ dc-gone;
+#X obj 34 68 osc~ 100;
+#X obj 9 7 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 13 40 killdc~ removes DC from signal;
+#X text 125 202 <- see DC cut in action;
+#X connect 0 0 7 0;
+#X connect 1 0 0 0;
+#X connect 1 0 4 0;
+#X connect 2 0 1 0;
+#X connect 5 0 4 0;
+#X connect 5 0 7 0;
+#X connect 8 0 2 0;
diff --git a/externals/lyonpotpourri/killdc~.c b/externals/lyonpotpourri/killdc~.c
new file mode 100755
index 0000000000000000000000000000000000000000..864b7a2976421ac79f0382af4493fdf553f2361d
--- /dev/null
+++ b/externals/lyonpotpourri/killdc~.c
@@ -0,0 +1,119 @@
+#include "MSPd.h"
+
+#define OBJECT_NAME "killdc~"
+#define FUNC_LEN (512)
+#define MAXSECTS 20
+
+static t_class *killdc_class;
+
+typedef struct {
+    float ps[4][MAXSECTS];
+    float c[4][MAXSECTS];
+    int nsects ;
+    float xnorm;
+} COEFS ;
+
+typedef struct _killdc
+{
+    t_object x_obj;
+    float x_f;
+    
+    COEFS fdata;
+} t_killdc;
+
+void *killdc_new(t_symbol *s);
+t_int *offset_perform(t_int *w);
+t_int *killdc_perform(t_int *w);
+void killdc_dsp(t_killdc *x, t_signal **sp);
+
+
+
+void killdc_tilde_setup(void)
+{
+    killdc_class = class_new(gensym("killdc~"),(t_newmethod)killdc_new,0,
+                             sizeof(t_killdc), 0, A_DEFSYMBOL,0);
+    CLASS_MAINSIGNALIN(killdc_class,t_killdc, x_f );
+    class_addmethod(killdc_class,(t_method)killdc_dsp,gensym("dsp"),A_CANT,0);
+  	potpourri_announce(OBJECT_NAME);
+    
+}
+
+void *killdc_new(t_symbol *s)
+{
+ 	int i, j;
+    
+    t_killdc *x = (t_killdc *)pd_new(killdc_class);
+    outlet_new(&x->x_obj, gensym("signal"));
+    
+    /**************/
+    
+    
+	x->fdata.nsects = 3;
+	x->fdata.c[0][0] = -1.9999995 ;
+	x->fdata.c[1][0] = -1.9997407 ;
+	x->fdata.c[2][0] =  1.0000000  ;
+	x->fdata.c[3][0] =  0.99974253 ;
+	x->fdata.c[0][1] = -1.9999997  ;
+	x->fdata.c[1][1] = -1.9988353 ;
+	x->fdata.c[2][1] =  1.0000000  ;
+	x->fdata.c[3][1] =  0.99883796 ;
+	x->fdata.c[0][2] = -2.0000000   ;
+	x->fdata.c[1][2] = -1.9959218 ;
+	x->fdata.c[2][2] =  1.0000000  ;
+	x->fdata.c[3][2] =  0.99592773 ;
+	
+    for(i=0; i< x->fdata.nsects; i++) {
+    	for(j=0;j<4;j++)  {
+      		x->fdata.ps[j][i] = 0.0;
+    	}
+  	}
+    
+	x->fdata.xnorm = 0.99725327e+00 ;
+    
+    
+    
+    
+    // INITIALIZATIONS
+    
+    
+    return (x);
+}
+// method from Paul Lansky's cmix implementation
+t_int *killdc_perform(t_int *w)
+{
+	t_float *in1,*out;
+	float sample ;
+	int n;
+	int m;
+	float op;
+    //	int lcount = 0;
+    /********/
+	t_killdc *x = (t_killdc *) (w[1]);
+	in1 = (t_float *)(w[2]);
+	out = (t_float *)(w[3]);
+	n = (int)(w[4]);
+	
+	while (n--) {
+		sample = *in1++;
+    	for(m=0; m< x->fdata.nsects;m++) {
+            op = sample + x->fdata.c[0][m] * x->fdata.ps[0][m] +
+            x->fdata.c[2][m] * x->fdata.ps[1][m]
+            - x->fdata.c[1][m] * x->fdata.ps[2][m]
+            - x->fdata.c[3][m] * x->fdata.ps[3][m];
+            
+    		x->fdata.ps[1][m] = x->fdata.ps[0][m];
+   			x->fdata.ps[0][m] = sample;
+    		x->fdata.ps[3][m] = x->fdata.ps[2][m];
+    		x->fdata.ps[2][m] = op;
+    		sample = op;
+  		}
+ 		*out++ = sample * x->fdata.xnorm ;
+	}
+	return (w+5);
+}		
+
+void killdc_dsp(t_killdc *x, t_signal **sp)
+{
+    dsp_add(killdc_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec,  sp[0]->s_n);
+}
+
diff --git a/externals/lyonpotpourri/latch~-help.pd b/externals/lyonpotpourri/latch~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..230eae76cab6ea056667da6e4f7348687d37c644
--- /dev/null
+++ b/externals/lyonpotpourri/latch~-help.pd
@@ -0,0 +1,28 @@
+#N canvas 890 538 471 305 10;
+#X obj 112 155 latch~ 250;
+#X obj 112 106 samm~ 60 1;
+#X obj 23 9 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X obj 30 207 *~;
+#X obj 30 149 osc~ 500;
+#X obj 30 268 dac~;
+#X obj 117 217 hsl 70 12 0 0.1 0 0 latch-gain latch-gain-in gain -2
+-8 0 10 -262130 -1 -1 0 1;
+#X floatatom 68 218 5 0 0 0 - latch-gain -, f 5;
+#X obj 203 82 osc~ 0.1;
+#X obj 203 105 *~ 400;
+#X obj 203 133 +~ 450;
+#X text 24 42 latch~ - a sample-accurate latch generator. An incoming
+click is held for a given amount of time.;
+#X text 193 158 arg: latch duration in ms.;
+#X obj 30 236 *~ 0;
+#X connect 0 0 3 1;
+#X connect 1 0 0 0;
+#X connect 3 0 13 0;
+#X connect 4 0 3 0;
+#X connect 7 0 13 1;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 0 1;
+#X connect 13 0 5 0;
+#X connect 13 0 5 1;
diff --git a/externals/lyonpotpourri/latch~.c b/externals/lyonpotpourri/latch~.c
new file mode 100755
index 0000000000000000000000000000000000000000..b67c27b29476181bfaaa367c658733fcf27d9342
--- /dev/null
+++ b/externals/lyonpotpourri/latch~.c
@@ -0,0 +1,111 @@
+#include "MSPd.h"
+
+static t_class *latch_class;
+
+#define OBJECT_NAME "latch~"
+#define LATCH_WAITING 0
+#define LATCH_RUNNING 1
+
+typedef struct _latch
+{
+	t_object x_obj;
+    t_float x_f;
+	t_float current;
+	long latch;
+	long dsamps;
+	long sr;
+	t_float duration;
+	long status;
+	long connected;
+} t_latch;
+
+static void *latch_new(t_float duration);
+static t_int *latch_perform(t_int *w);
+static void latch_dsp(t_latch *x, t_signal **sp);
+
+void latch_tilde_setup(void)
+{
+	latch_class = class_new(gensym("latch~"), (t_newmethod)latch_new, 0, sizeof(t_latch), 0,A_FLOAT, 0);
+	CLASS_MAINSIGNALIN(latch_class, t_latch, x_f);
+	class_addmethod(latch_class, (t_method)latch_dsp, gensym("dsp"), A_CANT, 0);
+	potpourri_announce(OBJECT_NAME);
+}
+
+static void *latch_new(t_float duration)
+{
+
+	t_latch *x = (t_latch *)pd_new(latch_class);
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+
+	x->status = LATCH_WAITING;    
+	x->duration = duration;
+	x->sr = sys_getsr();
+	if(x->duration <= 1.0)
+		x->duration = 1.0;
+	x->duration *= 0.001;
+	x->dsamps = x->sr ? x->sr * x->duration : 44100;
+
+	return x;
+}
+
+static t_int *latch_perform(t_int *w)
+{
+	t_latch *x = (t_latch *) (w[1]);
+	t_float *trigger = (t_float *)(w[2]);
+	t_float *vec_duration = (t_float *)(w[3]);
+	t_float *output = (t_float *)(w[4]);
+	int n = (int) w[5];
+	int next_pointer = 6;
+	long latch = x->latch;
+	long dsamps = x->dsamps;
+	long status = x->status;
+	t_float current = x->current;
+	t_float duration = x->duration;
+	long sr = x->sr;
+	long connected = x->connected;
+	int i = 0;
+
+	
+
+	for(i = 0; i < n; i++){
+        
+		if(connected){
+			duration = vec_duration[i];
+			if( duration > 0.0 ){ // dummy proof
+				dsamps = sr * duration * 0.001;
+			}
+		}
+        
+		if(trigger[i]){
+			latch = 0;
+			status = LATCH_RUNNING;
+			current = trigger[i];
+		} else {
+			latch++;
+			if(latch >= dsamps){
+				status = LATCH_WAITING;
+				current = 0.0;
+			}
+		}
+		output[i] = current;
+     
+	}
+    
+	
+	x->current = current;
+	x->status = status;
+	x->latch = latch;
+	x->dsamps = dsamps;
+	return w + next_pointer;
+}		
+
+static void latch_dsp(t_latch *x, t_signal **sp)
+{
+	x->connected = 1;
+	if(x->sr != sp[0]->s_sr){
+		x->sr = sp[0]->s_sr;
+		x->dsamps = x->duration * x->sr;
+	}
+    dsp_add(latch_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
+}
diff --git a/externals/lyonpotpourri/leanconvert.c b/externals/lyonpotpourri/leanconvert.c
new file mode 100755
index 0000000000000000000000000000000000000000..617c6656835270579c4b8b3daf02391286917e9b
--- /dev/null
+++ b/externals/lyonpotpourri/leanconvert.c
@@ -0,0 +1 @@
+#include "fftease.h"

void leanconvert( float *S, float *C, int N2 )

{

 int		real, imag,
		amp, phase;
 float		a, b;
  int		i;
	double hypot(), atan2();
	
 for ( i = 0; i <= N2; i++ ) {
   imag = phase = ( real = amp = i<<1 ) + 1;
   a = ( i == N2 ? S[1] : S[real] );
   b = ( i == 0 || i == N2 ? 0. : S[imag] );
   C[amp] = hypot( a, b );
   C[phase] = -atan2( b, a );
 }
}

\ No newline at end of file
diff --git a/externals/lyonpotpourri/leanunconvert.c b/externals/lyonpotpourri/leanunconvert.c
new file mode 100755
index 0000000000000000000000000000000000000000..48807294eeca04a8e099465cdf39bb46a4a1e493
--- /dev/null
+++ b/externals/lyonpotpourri/leanunconvert.c
@@ -0,0 +1 @@
+#include "fftease.h"

/* unconvert essentially undoes what convert does, i.e., it
  turns N2+1 PAIRS of amplitude and frequency values in
  C into N2 PAIR of complex spectrum data (in rfft format)
  in output array S; sampling rate R and interpolation factor
  I are used to recompute phase values from frequencies */

void leanunconvert( float *C, float *S, int N2 )

{
double cos(), sin();
  int		real, imag,
		amp, phase;
  register int		i;
  
  for ( i = 0; i <= N2; i++ ) {
    imag = phase = ( real = amp = i<<1 ) + 1;
    S[real] = *(C+amp) * cos( *(C+phase) );
    if ( i != N2 )
      S[imag] = -*(C+amp) * sin( *(C+phase) );
  }
}

\ No newline at end of file
diff --git a/externals/lyonpotpourri/lpp.h b/externals/lyonpotpourri/lpp.h
new file mode 100755
index 0000000000000000000000000000000000000000..d9521ac01bfdbc5c9b6fe55c82c9cfbadb869218
--- /dev/null
+++ b/externals/lyonpotpourri/lpp.h
@@ -0,0 +1,45 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <time.h>
+
+#define LYONPOTPOURRI_MSG "-[LyonPotpourri 3.0]-"
+#define LYONPOTPOURRI_VERSION "3.0 (pre-release 3.1)"
+#define LPP_COMPILE_DATE "12 May 2010"
+#define lpp_version(objectname) post("%s: version %s compiled %s",objectname,LYONPOTPOURRI_VERSION,LPP_COMPILE_DATE);
+// #define potpourri_announce(objname)  post("%s\t ( %s )",LYONPOTPOURRI_MSG,objname)
+
+#define NO_FREE_FUNCTION 0
+
+#ifndef PI
+#define PI 3.1415926535898
+#endif
+#ifndef PIOVERTWO
+#define PIOVERTWO 1.5707963268
+#endif
+#ifndef TWOPI
+#define TWOPI 6.2831853072
+#endif
+// budget version of Max/MSP denorm function
+#define FIX_DENORM_FLOAT(v)	(v=(fabs(v) < 0.000001 ? 0.f : (v)))
+
+
+/*** MSP helper functions, thanks JKC! ***/
+
+void atom_arg_getfloat(float *c, long idx, long ac, t_atom *av);
+void atom_arg_getsym(t_symbol **c, long idx, long ac, t_atom *av);
+
+void atom_arg_getfloat(float *c, long idx, long ac, t_atom *av) 
+{
+		if (c&&ac&&av&&(idx<ac)) {
+			*c = atom_getfloat(av+idx);
+		}
+}
+
+void atom_arg_getsym(t_symbol **c, long idx, long ac, t_atom *av)
+{
+	if (c&&ac&&av&&(idx<ac)) {
+		*c = atom_getsymbol(av+idx);
+	} 
+}
diff --git a/externals/lyonpotpourri/lyonpotpourri-meta.pd b/externals/lyonpotpourri/lyonpotpourri-meta.pd
new file mode 100755
index 0000000000000000000000000000000000000000..55430cf8453db047f955f4a6290609bc37c1af1e
--- /dev/null
+++ b/externals/lyonpotpourri/lyonpotpourri-meta.pd
@@ -0,0 +1,7 @@
+#N canvas 15 49 200 200 10;
+#N canvas 25 49 420 300 META 1;
+#X text 13 41 NAME lyonpotpourri;
+#X text 10 25 AUTHOR Eric Lyon <e.lyon@qub.ac.uk>;
+#X text 10 10 VERSION 2.0;
+#X text 10 60 LICENSE MIT;
+#X restore 10 10 pd META;
diff --git a/externals/lyonpotpourri/m_pd.h b/externals/lyonpotpourri/m_pd.h
new file mode 100755
index 0000000000000000000000000000000000000000..02030a7796b5325b3013b1a73f266b9276bc81e2
--- /dev/null
+++ b/externals/lyonpotpourri/m_pd.h
@@ -0,0 +1,735 @@
+/* Copyright (c) 1997-1999 Miller Puckette.
+* For information on usage and redistribution, and for a DISCLAIMER OF ALL
+* WARRANTIES, see the file, "LICENSE.txt," in this distribution.  */
+
+
+#ifndef __m_pd_h_
+
+#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus)
+extern "C" {
+#endif
+
+#define PD_MAJOR_VERSION 0
+#define PD_MINOR_VERSION 45
+#define PD_BUGFIX_VERSION 4
+#define PD_TEST_VERSION ""
+extern int pd_compatibilitylevel;   /* e.g., 43 for pd 0.43 compatibility */
+
+/* old name for "MSW" flag -- we have to take it for the sake of many old
+"nmakefiles" for externs, which will define NT and not MSW */
+#if defined(NT) && !defined(MSW)
+#define MSW
+#endif
+
+/* These pragmas are only used for MSVC, not MinGW or Cygwin <hans@at.or.at> */
+#ifdef _MSC_VER
+/* #pragma warning( disable : 4091 ) */
+#pragma warning( disable : 4305 )  /* uncast const double to float */
+#pragma warning( disable : 4244 )  /* uncast float/int conversion etc. */
+#pragma warning( disable : 4101 )  /* unused automatic variables */
+#endif /* _MSC_VER */
+
+    /* the external storage class is "extern" in UNIX; in MSW it's ugly. */
+#ifdef _WIN32
+#ifdef PD_INTERNAL
+#define EXTERN __declspec(dllexport) extern
+#else
+#define EXTERN __declspec(dllimport) extern
+#endif /* PD_INTERNAL */
+#else
+#define EXTERN extern
+#endif /* _WIN32 */
+
+    /* and depending on the compiler, hidden data structures are
+    declared differently: */
+#if defined( __GNUC__) || defined( __BORLANDC__ ) || defined( __MWERKS__ )
+#define EXTERN_STRUCT struct
+#else
+#define EXTERN_STRUCT extern struct
+#endif
+
+/* Define some attributes, specific to the compiler */
+#if defined(__GNUC__)
+#define ATTRIBUTE_FORMAT_PRINTF(a, b) __attribute__ ((format (printf, a, b)))
+#else
+#define ATTRIBUTE_FORMAT_PRINTF(a, b)
+#endif
+
+#if !defined(_SIZE_T) && !defined(_SIZE_T_)
+#include <stddef.h>     /* just for size_t -- how lame! */
+#endif
+
+/* Microsoft Visual Studio is not C99, it does not provide stdint.h */
+#ifdef _MSC_VER
+typedef signed __int8     int8_t;
+typedef signed __int16    int16_t;
+typedef signed __int32    int32_t;
+typedef signed __int64    int64_t;
+typedef unsigned __int8   uint8_t;
+typedef unsigned __int16  uint16_t;
+typedef unsigned __int32  uint32_t;
+typedef unsigned __int64  uint64_t;
+#else
+# include <stdint.h>
+#endif
+
+/* for FILE, needed by sys_fopen() and sys_fclose() only */
+#include <stdio.h>
+
+#define MAXPDSTRING 1000        /* use this for anything you want */
+#define MAXPDARG 5              /* max number of args we can typecheck today */
+
+/* signed and unsigned integer types the size of a pointer:  */
+#if !defined(PD_LONGINTTYPE)
+#define PD_LONGINTTYPE long
+#endif
+
+#if !defined(PD_FLOATSIZE)
+  /* normally, our floats (t_float, t_sample,...) are 32bit */
+# define PD_FLOATSIZE 32
+#endif
+
+#if PD_FLOATSIZE == 32
+# define PD_FLOATTYPE float
+/* an unsigned int of the same size as FLOATTYPE: */
+# define PD_FLOATUINTTYPE unsigned int
+
+#elif PD_FLOATSIZE == 64
+# define PD_FLOATTYPE double
+# define PD_FLOATUINTTYPE unsigned long
+#else
+# error invalid FLOATSIZE: must be 32 or 64
+#endif
+
+typedef PD_LONGINTTYPE t_int;       /* pointer-size integer */
+typedef PD_FLOATTYPE t_float;       /* a float type at most the same size */
+typedef PD_FLOATTYPE t_floatarg;    /* float type for function calls */
+
+typedef struct _symbol
+{
+    char *s_name;
+    struct _class **s_thing;
+    struct _symbol *s_next;
+} t_symbol;
+
+EXTERN_STRUCT _array;
+#define t_array struct _array       /* g_canvas.h */
+
+/* pointers to glist and array elements go through a "stub" which sticks
+around after the glist or array is freed.  The stub itself is deleted when
+both the glist/array is gone and the refcount is zero, ensuring that no
+gpointers are pointing here. */
+
+#define GP_NONE 0       /* the stub points nowhere (has been cut off) */
+#define GP_GLIST 1      /* the stub points to a glist element */
+#define GP_ARRAY 2      /* ... or array */
+
+typedef struct _gstub
+{
+    union
+    {
+        struct _glist *gs_glist;    /* glist we're in */
+        struct _array *gs_array;    /* array we're in */
+    } gs_un;
+    int gs_which;                   /* GP_GLIST/GP_ARRAY */
+    int gs_refcount;                /* number of gpointers pointing here */
+} t_gstub;
+
+typedef struct _gpointer           /* pointer to a gobj in a glist */
+{
+    union
+    {   
+        struct _scalar *gp_scalar;  /* scalar we're in (if glist) */
+        union word *gp_w;           /* raw data (if array) */
+    } gp_un;
+    int gp_valid;                   /* number which must match gpointee */
+    t_gstub *gp_stub;               /* stub which points to glist/array */
+} t_gpointer;
+
+typedef union word
+{
+    t_float w_float;
+    t_symbol *w_symbol;
+    t_gpointer *w_gpointer;
+    t_array *w_array;
+    struct _binbuf *w_binbuf;
+    int w_index;
+} t_word;
+
+typedef enum
+{
+    A_NULL,
+    A_FLOAT,
+    A_SYMBOL,
+    A_POINTER,
+    A_SEMI,
+    A_COMMA,
+    A_DEFFLOAT,
+    A_DEFSYM,
+    A_DOLLAR, 
+    A_DOLLSYM,
+    A_GIMME,
+    A_CANT
+}  t_atomtype;
+
+#define A_DEFSYMBOL A_DEFSYM    /* better name for this */
+
+typedef struct _atom
+{
+    t_atomtype a_type;
+    union word a_w;
+} t_atom;
+
+EXTERN_STRUCT _class;
+#define t_class struct _class
+
+EXTERN_STRUCT _outlet;
+#define t_outlet struct _outlet
+
+EXTERN_STRUCT _inlet;
+#define t_inlet struct _inlet
+
+EXTERN_STRUCT _binbuf;
+#define t_binbuf struct _binbuf
+
+EXTERN_STRUCT _clock;
+#define t_clock struct _clock
+
+EXTERN_STRUCT _outconnect;
+#define t_outconnect struct _outconnect
+
+EXTERN_STRUCT _glist;
+#define t_glist struct _glist
+#define t_canvas struct _glist  /* LATER lose this */
+
+typedef t_class *t_pd;      /* pure datum: nothing but a class pointer */
+
+typedef struct _gobj        /* a graphical object */
+{
+    t_pd g_pd;              /* pure datum header (class) */
+    struct _gobj *g_next;   /* next in list */
+} t_gobj;
+
+typedef struct _scalar      /* a graphical object holding data */
+{
+    t_gobj sc_gobj;         /* header for graphical object */
+    t_symbol *sc_template;  /* template name (LATER replace with pointer) */
+    t_word sc_vec[1];       /* indeterminate-length array of words */
+} t_scalar;
+
+typedef struct _text        /* patchable object - graphical, with text */
+{
+    t_gobj te_g;                /* header for graphical object */
+    t_binbuf *te_binbuf;        /* holder for the text */
+    t_outlet *te_outlet;        /* linked list of outlets */
+    t_inlet *te_inlet;          /* linked list of inlets */
+    short te_xpix;              /* x&y location (within the toplevel) */
+    short te_ypix;
+    short te_width;             /* requested width in chars, 0 if auto */
+    unsigned int te_type:2;     /* from defs below */
+} t_text;
+
+#define T_TEXT 0        /* just a textual comment */
+#define T_OBJECT 1      /* a MAX style patchable object */
+#define T_MESSAGE 2     /* a MAX stype message */
+#define T_ATOM 3        /* a cell to display a number or symbol */
+
+#define te_pd te_g.g_pd
+
+   /* t_object is synonym for t_text (LATER unify them) */
+
+typedef struct _text t_object;
+
+#define ob_outlet te_outlet
+#define ob_inlet te_inlet
+#define ob_binbuf te_binbuf
+#define ob_pd te_g.g_pd
+#define ob_g te_g
+
+typedef void (*t_method)(void);
+typedef void *(*t_newmethod)( void);
+typedef void (*t_gotfn)(void *x, ...);
+
+/* ---------------- pre-defined objects and symbols --------------*/
+EXTERN t_pd pd_objectmaker;     /* factory for creating "object" boxes */
+EXTERN t_pd pd_canvasmaker;     /* factory for creating canvases */
+EXTERN t_symbol s_pointer;
+EXTERN t_symbol s_float;
+EXTERN t_symbol s_symbol;
+EXTERN t_symbol s_bang;
+EXTERN t_symbol s_list;
+EXTERN t_symbol s_anything;
+EXTERN t_symbol s_signal;
+EXTERN t_symbol s__N;
+EXTERN t_symbol s__X;
+EXTERN t_symbol s_x;
+EXTERN t_symbol s_y;
+EXTERN t_symbol s_;
+
+/* --------- prototypes from the central message system ----------- */
+EXTERN void pd_typedmess(t_pd *x, t_symbol *s, int argc, t_atom *argv);
+EXTERN void pd_forwardmess(t_pd *x, int argc, t_atom *argv);
+EXTERN t_symbol *gensym(const char *s);
+EXTERN t_gotfn getfn(t_pd *x, t_symbol *s);
+EXTERN t_gotfn zgetfn(t_pd *x, t_symbol *s);
+EXTERN void nullfn(void);
+EXTERN void pd_vmess(t_pd *x, t_symbol *s, char *fmt, ...);
+#define mess0(x, s) ((*getfn((x), (s)))((x)))
+#define mess1(x, s, a) ((*getfn((x), (s)))((x), (a)))
+#define mess2(x, s, a,b) ((*getfn((x), (s)))((x), (a),(b)))
+#define mess3(x, s, a,b,c) ((*getfn((x), (s)))((x), (a),(b),(c)))
+#define mess4(x, s, a,b,c,d) ((*getfn((x), (s)))((x), (a),(b),(c),(d)))
+#define mess5(x, s, a,b,c,d,e) ((*getfn((x), (s)))((x), (a),(b),(c),(d),(e)))
+EXTERN void obj_list(t_object *x, t_symbol *s, int argc, t_atom *argv);
+EXTERN t_pd *pd_newest(void);
+
+/* --------------- memory management -------------------- */
+EXTERN void *getbytes(size_t nbytes);
+EXTERN void *getzbytes(size_t nbytes);
+EXTERN void *copybytes(void *src, size_t nbytes);
+EXTERN void freebytes(void *x, size_t nbytes);
+EXTERN void *resizebytes(void *x, size_t oldsize, size_t newsize);
+
+/* -------------------- atoms ----------------------------- */
+
+#define SETSEMI(atom) ((atom)->a_type = A_SEMI, (atom)->a_w.w_index = 0)
+#define SETCOMMA(atom) ((atom)->a_type = A_COMMA, (atom)->a_w.w_index = 0)
+#define SETPOINTER(atom, gp) ((atom)->a_type = A_POINTER, \
+    (atom)->a_w.w_gpointer = (gp))
+#define SETFLOAT(atom, f) ((atom)->a_type = A_FLOAT, (atom)->a_w.w_float = (f))
+#define SETSYMBOL(atom, s) ((atom)->a_type = A_SYMBOL, \
+    (atom)->a_w.w_symbol = (s))
+#define SETDOLLAR(atom, n) ((atom)->a_type = A_DOLLAR, \
+    (atom)->a_w.w_index = (n))
+#define SETDOLLSYM(atom, s) ((atom)->a_type = A_DOLLSYM, \
+    (atom)->a_w.w_symbol= (s))
+
+EXTERN t_float atom_getfloat(t_atom *a);
+EXTERN t_int atom_getint(t_atom *a);
+EXTERN t_symbol *atom_getsymbol(t_atom *a);
+EXTERN t_symbol *atom_gensym(t_atom *a);
+EXTERN t_float atom_getfloatarg(int which, int argc, t_atom *argv);
+EXTERN t_int atom_getintarg(int which, int argc, t_atom *argv);
+EXTERN t_symbol *atom_getsymbolarg(int which, int argc, t_atom *argv);
+
+EXTERN void atom_string(t_atom *a, char *buf, unsigned int bufsize);
+
+/* ------------------  binbufs --------------- */
+
+EXTERN t_binbuf *binbuf_new(void);
+EXTERN void binbuf_free(t_binbuf *x);
+EXTERN t_binbuf *binbuf_duplicate(t_binbuf *y);
+
+EXTERN void binbuf_text(t_binbuf *x, char *text, size_t size);
+EXTERN void binbuf_gettext(t_binbuf *x, char **bufp, int *lengthp);
+EXTERN void binbuf_clear(t_binbuf *x);
+EXTERN void binbuf_add(t_binbuf *x, int argc, t_atom *argv);
+EXTERN void binbuf_addv(t_binbuf *x, char *fmt, ...);
+EXTERN void binbuf_addbinbuf(t_binbuf *x, t_binbuf *y);
+EXTERN void binbuf_addsemi(t_binbuf *x);
+EXTERN void binbuf_restore(t_binbuf *x, int argc, t_atom *argv);
+EXTERN void binbuf_print(t_binbuf *x);
+EXTERN int binbuf_getnatom(t_binbuf *x);
+EXTERN t_atom *binbuf_getvec(t_binbuf *x);
+EXTERN int binbuf_resize(t_binbuf *x, int newsize);
+EXTERN void binbuf_eval(t_binbuf *x, t_pd *target, int argc, t_atom *argv);
+EXTERN int binbuf_read(t_binbuf *b, char *filename, char *dirname,
+    int crflag);
+EXTERN int binbuf_read_via_canvas(t_binbuf *b, char *filename, t_canvas *canvas,
+    int crflag);
+EXTERN int binbuf_read_via_path(t_binbuf *b, char *filename, char *dirname,
+    int crflag);
+EXTERN int binbuf_write(t_binbuf *x, char *filename, char *dir,
+    int crflag);
+EXTERN void binbuf_evalfile(t_symbol *name, t_symbol *dir);
+EXTERN t_symbol *binbuf_realizedollsym(t_symbol *s, int ac, t_atom *av,
+    int tonew);
+
+/* ------------------  clocks --------------- */
+
+EXTERN t_clock *clock_new(void *owner, t_method fn);
+EXTERN void clock_set(t_clock *x, double systime);
+EXTERN void clock_delay(t_clock *x, double delaytime);
+EXTERN void clock_unset(t_clock *x);
+EXTERN void clock_setunit(t_clock *x, double timeunit, int sampflag);
+EXTERN double clock_getlogicaltime(void);
+EXTERN double clock_getsystime(void); /* OBSOLETE; use clock_getlogicaltime() */
+EXTERN double clock_gettimesince(double prevsystime);
+EXTERN double clock_gettimesincewithunits(double prevsystime,
+    double units, int sampflag);
+EXTERN double clock_getsystimeafter(double delaytime);
+EXTERN void clock_free(t_clock *x);
+
+/* ----------------- pure data ---------------- */
+EXTERN t_pd *pd_new(t_class *cls);
+EXTERN void pd_free(t_pd *x);
+EXTERN void pd_bind(t_pd *x, t_symbol *s);
+EXTERN void pd_unbind(t_pd *x, t_symbol *s);
+EXTERN t_pd *pd_findbyclass(t_symbol *s, t_class *c);
+EXTERN void pd_pushsym(t_pd *x);
+EXTERN void pd_popsym(t_pd *x);
+EXTERN t_symbol *pd_getfilename(void);
+EXTERN t_symbol *pd_getdirname(void);
+EXTERN void pd_bang(t_pd *x);
+EXTERN void pd_pointer(t_pd *x, t_gpointer *gp);
+EXTERN void pd_float(t_pd *x, t_float f);
+EXTERN void pd_symbol(t_pd *x, t_symbol *s);
+EXTERN void pd_list(t_pd *x, t_symbol *s, int argc, t_atom *argv);
+EXTERN void pd_anything(t_pd *x, t_symbol *s, int argc, t_atom *argv);
+#define pd_class(x) (*(x))
+
+/* ----------------- pointers ---------------- */
+EXTERN void gpointer_init(t_gpointer *gp);
+EXTERN void gpointer_copy(const t_gpointer *gpfrom, t_gpointer *gpto);
+EXTERN void gpointer_unset(t_gpointer *gp);
+EXTERN int gpointer_check(const t_gpointer *gp, int headok);
+
+/* ----------------- patchable "objects" -------------- */
+EXTERN t_inlet *inlet_new(t_object *owner, t_pd *dest, t_symbol *s1,
+    t_symbol *s2);
+EXTERN t_inlet *pointerinlet_new(t_object *owner, t_gpointer *gp);
+EXTERN t_inlet *floatinlet_new(t_object *owner, t_float *fp);
+EXTERN t_inlet *symbolinlet_new(t_object *owner, t_symbol **sp);
+EXTERN t_inlet *signalinlet_new(t_object *owner, t_float f);
+EXTERN void inlet_free(t_inlet *x);
+
+EXTERN t_outlet *outlet_new(t_object *owner, t_symbol *s);
+EXTERN void outlet_bang(t_outlet *x);
+EXTERN void outlet_pointer(t_outlet *x, t_gpointer *gp);
+EXTERN void outlet_float(t_outlet *x, t_float f);
+EXTERN void outlet_symbol(t_outlet *x, t_symbol *s);
+EXTERN void outlet_list(t_outlet *x, t_symbol *s, int argc, t_atom *argv);
+EXTERN void outlet_anything(t_outlet *x, t_symbol *s, int argc, t_atom *argv);
+EXTERN t_symbol *outlet_getsymbol(t_outlet *x);
+EXTERN void outlet_free(t_outlet *x);
+EXTERN t_object *pd_checkobject(t_pd *x);
+
+
+/* -------------------- canvases -------------- */
+
+EXTERN void glob_setfilename(void *dummy, t_symbol *name, t_symbol *dir);
+
+EXTERN void canvas_setargs(int argc, t_atom *argv);
+EXTERN void canvas_getargs(int *argcp, t_atom **argvp);
+EXTERN t_symbol *canvas_getcurrentdir(void);
+EXTERN t_glist *canvas_getcurrent(void);
+EXTERN void canvas_makefilename(t_glist *c, char *file,
+    char *result,int resultsize);
+EXTERN t_symbol *canvas_getdir(t_glist *x);
+EXTERN char sys_font[]; /* default typeface set in s_main.c */
+EXTERN char sys_fontweight[]; /* default font weight set in s_main.c */
+EXTERN int sys_fontwidth(int fontsize);
+EXTERN int sys_fontheight(int fontsize);
+EXTERN void canvas_dataproperties(t_glist *x, t_scalar *sc, t_binbuf *b);
+EXTERN int canvas_open(t_canvas *x, const char *name, const char *ext,
+    char *dirresult, char **nameresult, unsigned int size, int bin);
+
+/* ---------------- widget behaviors ---------------------- */
+
+EXTERN_STRUCT _widgetbehavior;
+#define t_widgetbehavior struct _widgetbehavior
+
+EXTERN_STRUCT _parentwidgetbehavior;
+#define t_parentwidgetbehavior struct _parentwidgetbehavior
+EXTERN t_parentwidgetbehavior *pd_getparentwidget(t_pd *x);
+
+/* -------------------- classes -------------- */
+
+#define CLASS_DEFAULT 0         /* flags for new classes below */
+#define CLASS_PD 1
+#define CLASS_GOBJ 2
+#define CLASS_PATCHABLE 3
+#define CLASS_NOINLET 8
+
+#define CLASS_TYPEMASK 3
+
+
+EXTERN t_class *class_new(t_symbol *name, t_newmethod newmethod,
+    t_method freemethod, size_t size, int flags, t_atomtype arg1, ...);
+EXTERN void class_addcreator(t_newmethod newmethod, t_symbol *s, 
+    t_atomtype type1, ...);
+EXTERN void class_addmethod(t_class *c, t_method fn, t_symbol *sel,
+    t_atomtype arg1, ...);
+EXTERN void class_addbang(t_class *c, t_method fn);
+EXTERN void class_addpointer(t_class *c, t_method fn);
+EXTERN void class_doaddfloat(t_class *c, t_method fn);
+EXTERN void class_addsymbol(t_class *c, t_method fn);
+EXTERN void class_addlist(t_class *c, t_method fn);
+EXTERN void class_addanything(t_class *c, t_method fn);
+EXTERN void class_sethelpsymbol(t_class *c, t_symbol *s);
+EXTERN void class_setwidget(t_class *c, t_widgetbehavior *w);
+EXTERN void class_setparentwidget(t_class *c, t_parentwidgetbehavior *w);
+EXTERN t_parentwidgetbehavior *class_parentwidget(t_class *c);
+EXTERN char *class_getname(t_class *c);
+EXTERN char *class_gethelpname(t_class *c);
+EXTERN char *class_gethelpdir(t_class *c);
+EXTERN void class_setdrawcommand(t_class *c);
+EXTERN int class_isdrawcommand(t_class *c);
+EXTERN void class_domainsignalin(t_class *c, int onset);
+EXTERN void class_set_extern_dir(t_symbol *s);
+#define CLASS_MAINSIGNALIN(c, type, field) \
+    class_domainsignalin(c, (char *)(&((type *)0)->field) - (char *)0)
+
+         /* prototype for functions to save Pd's to a binbuf */
+typedef void (*t_savefn)(t_gobj *x, t_binbuf *b);
+EXTERN void class_setsavefn(t_class *c, t_savefn f);
+EXTERN t_savefn class_getsavefn(t_class *c);
+EXTERN void obj_saveformat(t_object *x, t_binbuf *bb); /* add format to bb */
+
+        /* prototype for functions to open properties dialogs */
+typedef void (*t_propertiesfn)(t_gobj *x, struct _glist *glist);
+EXTERN void class_setpropertiesfn(t_class *c, t_propertiesfn f);
+EXTERN t_propertiesfn class_getpropertiesfn(t_class *c);
+
+#ifndef PD_CLASS_DEF
+#define class_addbang(x, y) class_addbang((x), (t_method)(y))
+#define class_addpointer(x, y) class_addpointer((x), (t_method)(y))
+#define class_addfloat(x, y) class_doaddfloat((x), (t_method)(y))
+#define class_addsymbol(x, y) class_addsymbol((x), (t_method)(y))
+#define class_addlist(x, y) class_addlist((x), (t_method)(y))
+#define class_addanything(x, y) class_addanything((x), (t_method)(y))
+#endif
+
+/* ------------   printing --------------------------------- */
+EXTERN void post(const char *fmt, ...);
+EXTERN void startpost(const char *fmt, ...);
+EXTERN void poststring(const char *s);
+EXTERN void postfloat(t_floatarg f);
+EXTERN void postatom(int argc, t_atom *argv);
+EXTERN void endpost(void);
+EXTERN void error(const char *fmt, ...) ATTRIBUTE_FORMAT_PRINTF(1, 2);
+EXTERN void verbose(int level, const char *fmt, ...) ATTRIBUTE_FORMAT_PRINTF(2, 3);
+EXTERN void bug(const char *fmt, ...) ATTRIBUTE_FORMAT_PRINTF(1, 2);
+EXTERN void pd_error(void *object, const char *fmt, ...) ATTRIBUTE_FORMAT_PRINTF(2, 3);
+EXTERN void logpost(const void *object, const int level, const char *fmt, ...)
+    ATTRIBUTE_FORMAT_PRINTF(3, 4);
+EXTERN void sys_logerror(const char *object, const char *s);
+EXTERN void sys_unixerror(const char *object);
+EXTERN void sys_ouch(void);
+
+
+/* ------------  system interface routines ------------------- */
+EXTERN int sys_isreadablefile(const char *name);
+EXTERN int sys_isabsolutepath(const char *dir);
+EXTERN void sys_bashfilename(const char *from, char *to);
+EXTERN void sys_unbashfilename(const char *from, char *to);
+EXTERN int open_via_path(const char *dir, const char *name, const char *ext,
+    char *dirresult, char **nameresult, unsigned int size, int bin);
+EXTERN int sched_geteventno(void);
+EXTERN double sys_getrealtime(void);
+EXTERN int (*sys_idlehook)(void);   /* hook to add idle time computation */
+
+/* Win32's open()/fopen() do not handle UTF-8 filenames so we need
+ * these internal versions that handle UTF-8 filenames the same across
+ * all platforms.  They are recommended for use in external
+ * objectclasses as well so they work with Unicode filenames on Windows */
+EXTERN int sys_open(const char *path, int oflag, ...);
+EXTERN int sys_close(int fd);
+EXTERN FILE *sys_fopen(const char *filename, const char *mode);
+EXTERN int sys_fclose(FILE *stream);
+
+/* ------------  threading ------------------- */ 
+EXTERN void sys_lock(void);
+EXTERN void sys_unlock(void);
+EXTERN int sys_trylock(void);
+
+
+/* --------------- signals ----------------------------------- */
+
+typedef PD_FLOATTYPE t_sample;
+typedef union _sampleint_union {
+  t_sample f;
+  PD_FLOATUINTTYPE i;
+} t_sampleint_union;
+#define MAXLOGSIG 32
+#define MAXSIGSIZE (1 << MAXLOGSIG)
+
+typedef struct _signal
+{
+    int s_n;            /* number of points in the array */
+    t_sample *s_vec;    /* the array */
+    t_float s_sr;         /* sample rate */
+    int s_refcount;     /* number of times used */
+    int s_isborrowed;   /* whether we're going to borrow our array */
+    struct _signal *s_borrowedfrom;     /* signal to borrow it from */
+    struct _signal *s_nextfree;         /* next in freelist */
+    struct _signal *s_nextused;         /* next in used list */
+    int s_vecsize;      /* allocated size of array in points */
+} t_signal;
+
+typedef t_int *(*t_perfroutine)(t_int *args);
+
+EXTERN t_int *plus_perform(t_int *args);
+EXTERN t_int *zero_perform(t_int *args);
+EXTERN t_int *copy_perform(t_int *args);
+
+EXTERN void dsp_add_plus(t_sample *in1, t_sample *in2, t_sample *out, int n);
+EXTERN void dsp_add_copy(t_sample *in, t_sample *out, int n);
+EXTERN void dsp_add_scalarcopy(t_float *in, t_sample *out, int n);
+EXTERN void dsp_add_zero(t_sample *out, int n);
+
+EXTERN int sys_getblksize(void);
+EXTERN t_float sys_getsr(void);
+EXTERN int sys_get_inchannels(void);
+EXTERN int sys_get_outchannels(void);
+
+EXTERN void dsp_add(t_perfroutine f, int n, ...);
+EXTERN void dsp_addv(t_perfroutine f, int n, t_int *vec);
+EXTERN void pd_fft(t_float *buf, int npoints, int inverse);
+EXTERN int ilog2(int n);
+
+EXTERN void mayer_fht(t_sample *fz, int n);
+EXTERN void mayer_fft(int n, t_sample *real, t_sample *imag);
+EXTERN void mayer_ifft(int n, t_sample *real, t_sample *imag);
+EXTERN void mayer_realfft(int n, t_sample *real);
+EXTERN void mayer_realifft(int n, t_sample *real);
+
+EXTERN float *cos_table;
+#define LOGCOSTABSIZE 9
+#define COSTABSIZE (1<<LOGCOSTABSIZE)
+
+EXTERN int canvas_suspend_dsp(void);
+EXTERN void canvas_resume_dsp(int oldstate);
+EXTERN void canvas_update_dsp(void);
+EXTERN int canvas_dspstate;
+
+/*   up/downsampling */
+typedef struct _resample
+{
+  int method;       /* up/downsampling method ID */
+
+  t_int downsample; /* downsampling factor */
+  t_int upsample;   /* upsampling factor */
+
+  t_sample *s_vec;   /* here we hold the resampled data */
+  int      s_n;
+
+  t_sample *coeffs;  /* coefficients for filtering... */
+  int      coefsize;
+
+  t_sample *buffer;  /* buffer for filtering */
+  int      bufsize;
+} t_resample;
+
+EXTERN void resample_init(t_resample *x);
+EXTERN void resample_free(t_resample *x);
+
+EXTERN void resample_dsp(t_resample *x, t_sample *in, int insize, t_sample *out, int outsize, int method);
+EXTERN void resamplefrom_dsp(t_resample *x, t_sample *in, int insize, int outsize, int method);
+EXTERN void resampleto_dsp(t_resample *x, t_sample *out, int insize, int outsize, int method);
+
+/* ----------------------- utility functions for signals -------------- */
+EXTERN t_float mtof(t_float);
+EXTERN t_float ftom(t_float);
+EXTERN t_float rmstodb(t_float);
+EXTERN t_float powtodb(t_float);
+EXTERN t_float dbtorms(t_float);
+EXTERN t_float dbtopow(t_float);
+
+EXTERN t_float q8_sqrt(t_float);
+EXTERN t_float q8_rsqrt(t_float);
+#ifndef N32     
+EXTERN t_float qsqrt(t_float);  /* old names kept for extern compatibility */
+EXTERN t_float qrsqrt(t_float);
+#endif
+/* --------------------- data --------------------------------- */
+
+    /* graphical arrays */
+EXTERN_STRUCT _garray;
+#define t_garray struct _garray
+
+EXTERN t_class *garray_class;
+EXTERN int garray_getfloatarray(t_garray *x, int *size, t_float **vec);
+EXTERN int garray_getfloatwords(t_garray *x, int *size, t_word **vec);
+EXTERN void garray_redraw(t_garray *x);
+EXTERN int garray_npoints(t_garray *x);
+EXTERN char *garray_vec(t_garray *x);
+EXTERN void garray_resize(t_garray *x, t_floatarg f);  /* avoid; use this: */
+EXTERN void garray_resize_long(t_garray *x, long n);   /* better version */
+EXTERN void garray_usedindsp(t_garray *x);
+EXTERN void garray_setsaveit(t_garray *x, int saveit);
+EXTERN t_glist *garray_getglist(t_garray *x);
+EXTERN t_array *garray_getarray(t_garray *x);
+EXTERN t_class *scalar_class;
+
+EXTERN t_float *value_get(t_symbol *s);
+EXTERN void value_release(t_symbol *s);
+EXTERN int value_getfloat(t_symbol *s, t_float *f);
+EXTERN int value_setfloat(t_symbol *s, t_float f);
+
+/* ------- GUI interface - functions to send strings to TK --------- */
+typedef void (*t_guicallbackfn)(t_gobj *client, t_glist *glist);
+
+EXTERN void sys_vgui(char *fmt, ...);
+EXTERN void sys_gui(char *s);
+EXTERN void sys_pretendguibytes(int n);
+EXTERN void sys_queuegui(void *client, t_glist *glist, t_guicallbackfn f);
+EXTERN void sys_unqueuegui(void *client);
+    /* dialog window creation and destruction */
+EXTERN void gfxstub_new(t_pd *owner, void *key, const char *cmd);
+EXTERN void gfxstub_deleteforkey(void *key);
+
+extern t_class *glob_pdobject;  /* object to send "pd" messages */
+
+/*-------------  Max 0.26 compatibility --------------------*/
+
+/* the following reflects the new way classes are laid out, with the class
+   pointing to the messlist and not vice versa. Externs shouldn't feel it. */
+typedef t_class *t_externclass;
+
+EXTERN void c_extern(t_externclass *cls, t_newmethod newroutine,
+    t_method freeroutine, t_symbol *name, size_t size, int tiny, \
+    t_atomtype arg1, ...);
+EXTERN void c_addmess(t_method fn, t_symbol *sel, t_atomtype arg1, ...);
+
+#define t_getbytes getbytes
+#define t_freebytes freebytes
+#define t_resizebytes resizebytes
+#define typedmess pd_typedmess
+#define vmess pd_vmess
+
+/* A definition to help gui objects straddle 0.34-0.35 changes.  If this is
+defined, there is a "te_xpix" field in objects, not a "te_xpos" as before: */
+
+#define PD_USE_TE_XPIX
+
+#ifndef _MSC_VER /* Microoft compiler can't handle "inline" function/macros */
+#if defined(__i386__) || defined(__x86_64__) || defined(__arm__)
+/* a test for NANs and denormals.  Should only be necessary on i386. */
+# if PD_FLOATSIZE == 32
+static inline int PD_BADFLOAT(t_sample f) {
+  t_sampleint_union u;
+  u.f=f;
+  return ((u.i & 0x7f800000)==0) || ((u.i&0x7f800000)==0x7f800000);
+}
+/* more stringent test: anything not between 1e-19 and 1e19 in absolute val */
+static inline int PD_BIGORSMALL(t_sample f) {
+  t_sampleint_union u;
+  u.f=f;
+  return ((u.i & 0x60000000)==0) || ((u.i & 0x60000000)==0x60000000);
+}
+# else
+#  warning 64bit mode: BIGORSMALL not implemented yet
+#  define PD_BADFLOAT(f) 0
+#  define PD_BIGORSMALL(f) 0
+# endif
+#else
+# define PD_BADFLOAT(f) 0
+# define PD_BIGORSMALL(f) 0
+#endif
+#else   /* _MSC_VER */
+#define PD_BADFLOAT(f) ((((*(unsigned int*)&(f))&0x7f800000)==0) || \
+    (((*(unsigned int*)&(f))&0x7f800000)==0x7f800000))
+/* more stringent test: anything not between 1e-19 and 1e19 in absolute val */
+#define PD_BIGORSMALL(f) ((((*(unsigned int*)&(f))&0x60000000)==0) || \
+    (((*(unsigned int*)&(f))&0x60000000)==0x60000000))
+#endif /* _MSC_VER */
+    /* get version number at run time */
+EXTERN void sys_getversion(int *major, int *minor, int *bugfix);
+
+#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus)
+}
+#endif
+
+#define __m_pd_h_
+#endif /* __m_pd_h_ */
diff --git a/externals/lyonpotpourri/magfreq_analysis~-help.pd b/externals/lyonpotpourri/magfreq_analysis~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..ed48d1d0a1030cd9a385baa143dc30d1f1b83877
--- /dev/null
+++ b/externals/lyonpotpourri/magfreq_analysis~-help.pd
@@ -0,0 +1,48 @@
+#N canvas 770 168 473 383 10;
+#X obj 186 212 magfreq_analysis~;
+#X obj 186 262 channel~;
+#X obj 186 178 osc~ 440;
+#X msg 95 223 channel \$1;
+#X floatatom 95 199 5 0 0 0 - - -, f 5;
+#X obj 186 302 snapshot~;
+#X obj 379 182 metro 100;
+#X obj 379 155 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X floatatom 186 334 5 0 0 0 - - -, f 5;
+#X obj 282 258 channel~;
+#X obj 282 298 snapshot~;
+#X floatatom 282 334 5 0 0 0 - - -, f 5;
+#X floatatom 186 151 5 0 0 0 - - -, f 5;
+#X obj 95 150 loadbang;
+#X msg 95 174 2;
+#X msg 379 130 1;
+#X obj 379 105 loadbang;
+#X msg 252 180 fftinfo;
+#X obj 9 7 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 19 198 select bin;
+#X text 8 124 try different frequencies \, then see what bins they
+show up in, f 69;
+#X text 13 39 magfreq_analysis~ - Analyze input as magnitude/frequency
+spectrum. You could use the output to drive an oscillator bank and
+resynthesize the spectrum \, possibly with frequency alterations.,
+f 67;
+#X connect 0 0 1 0;
+#X connect 0 1 9 0;
+#X connect 1 0 5 0;
+#X connect 2 0 0 0;
+#X connect 3 0 1 0;
+#X connect 3 0 9 0;
+#X connect 4 0 3 0;
+#X connect 5 0 8 0;
+#X connect 6 0 5 0;
+#X connect 6 0 10 0;
+#X connect 7 0 6 0;
+#X connect 9 0 10 0;
+#X connect 10 0 11 0;
+#X connect 12 0 2 0;
+#X connect 13 0 14 0;
+#X connect 14 0 4 0;
+#X connect 15 0 7 0;
+#X connect 16 0 15 0;
+#X connect 17 0 0 0;
diff --git a/externals/lyonpotpourri/magfreq_analysis~.c b/externals/lyonpotpourri/magfreq_analysis~.c
new file mode 100755
index 0000000000000000000000000000000000000000..bb85d9a8692a4e6b671178a1ece6fb323cd65c33
--- /dev/null
+++ b/externals/lyonpotpourri/magfreq_analysis~.c
@@ -0,0 +1,438 @@
+#include "MSPd.h"
+#include "fftease.h"
+
+static t_class *magfreq_analysis_class;
+
+#define OBJECT_NAME "magfreq_analysis~"
+
+typedef struct _magfreq_analysis
+{
+    
+	t_object x_obj;
+	float x_f;
+	int R;
+	int	N;
+	int	N2;
+	int	Nw;
+	int	Nw2;
+	int	D;
+	int	i;
+	int	inCount;
+	float *Wanal;
+	float *Wsyn;
+	float *input;
+	float *Hwin;
+	float *buffer;
+	float *channel;
+	float *output;
+	// for convert
+	float *c_lastphase_in;
+	float *c_lastphase_out;
+	float c_fundamental;
+	float c_factor_in;
+	float c_factor_out;
+    // for oscbank
+	int NP;
+	float P;
+	int L;
+	int first;
+	float Iinv;
+	float *lastamp;
+	float *lastfreq;
+	float *index;
+	float *table;
+	float myPInc;
+	float ffac;
+	//
+	float lofreq;
+	float hifreq;
+	int lo_bin;
+	int hi_bin;
+	float topfreq;
+	float synt;
+	// for fast fft
+	float mult;
+	float *trigland;
+	int *bitshuffle;
+	//
+	int bypass_state;
+	int pitch_connected;
+	int synt_connected;
+	int overlap;
+	int winfac;
+	short mute;
+} t_magfreq_analysis;
+
+void *magfreq_analysis_new(t_symbol *s, int argc, t_atom *argv);
+t_int *offset_perform(t_int *w);
+t_int *magfreq_analysis_perform(t_int *w);
+void magfreq_analysis_dsp(t_magfreq_analysis *x, t_signal **sp);
+void magfreq_analysis_bypass(t_magfreq_analysis *x, t_floatarg state);//Pd does not accept A_LONG
+void magfreq_analysis_float(t_magfreq_analysis *x, double f);
+void magfreq_analysis_free(t_magfreq_analysis *x);
+void magfreq_analysis_mute(t_magfreq_analysis *x, t_floatarg tog);
+void magfreq_analysis_init(t_magfreq_analysis *x, short initialized);
+void magfreq_analysis_lowfreq(t_magfreq_analysis *x, t_floatarg f);
+void magfreq_analysis_highfreq(t_magfreq_analysis *x, t_floatarg f);
+void magfreq_analysis_overlap(t_magfreq_analysis *x, t_floatarg o);
+void magfreq_analysis_winfac(t_magfreq_analysis *x, t_floatarg f);
+void magfreq_analysis_fftinfo(t_magfreq_analysis *x);;
+
+
+void magfreq_analysis_tilde_setup(void)
+{
+	magfreq_analysis_class = class_new(gensym("magfreq_analysis~"), (t_newmethod)magfreq_analysis_new,
+                                       (t_method)magfreq_analysis_free ,sizeof(t_magfreq_analysis), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(magfreq_analysis_class, t_magfreq_analysis, x_f);
+	class_addmethod(magfreq_analysis_class, (t_method)magfreq_analysis_dsp, gensym("dsp"), 0);
+	class_addmethod(magfreq_analysis_class, (t_method)magfreq_analysis_mute, gensym("mute"), A_DEFFLOAT,0);
+	class_addmethod(magfreq_analysis_class, (t_method)magfreq_analysis_bypass, gensym("bypass"), A_DEFFLOAT,0);
+	class_addmethod(magfreq_analysis_class, (t_method)magfreq_analysis_highfreq, gensym("highfreq"), A_DEFFLOAT,0);
+	class_addmethod(magfreq_analysis_class, (t_method)magfreq_analysis_lowfreq, gensym("lowfreq"), A_DEFFLOAT,0);
+	class_addmethod(magfreq_analysis_class, (t_method)magfreq_analysis_overlap, gensym("overlap"), A_DEFFLOAT,0);
+	class_addmethod(magfreq_analysis_class, (t_method)magfreq_analysis_winfac, gensym("winfac"), A_DEFFLOAT,0);
+	class_addmethod(magfreq_analysis_class, (t_method)magfreq_analysis_fftinfo, gensym("fftinfo"),0);
+	potpourri_announce(OBJECT_NAME);
+}
+
+
+void magfreq_analysis_mute(t_magfreq_analysis *x, t_floatarg tog)
+{
+	x->mute = (short)tog;
+}
+
+void magfreq_analysis_overlap(t_magfreq_analysis *x, t_floatarg f)
+{
+	int i = (int) f;
+	if(!power_of_two(i)){
+		error("%f is not a power of two",f);
+		return;
+	}
+	x->overlap = i;
+	magfreq_analysis_init(x,1);
+}
+
+void magfreq_analysis_winfac(t_magfreq_analysis *x, t_floatarg f)
+{
+	int i = (int)f;
+	
+	if(!power_of_two(i)){
+		error("%f is not a power of two",f);
+		return;
+	}
+	x->winfac = i;
+	magfreq_analysis_init(x,2);
+}
+
+void magfreq_analysis_fftinfo(t_magfreq_analysis *x)
+{
+	if( ! x->overlap ){
+		post("zero overlap!");
+		return;
+	}
+	post("%s: FFT size %d, hopsize %d, windowsize %d", OBJECT_NAME, x->N, x->N/x->overlap, x->Nw);
+}
+
+void magfreq_analysis_free(t_magfreq_analysis *x ){
+	freebytes(x->c_lastphase_in,0);
+	freebytes(x->c_lastphase_out,0);
+	freebytes(x->trigland,0);
+	freebytes(x->bitshuffle,0);
+	freebytes(x->Wanal,0);
+	freebytes(x->Wsyn,0);
+	freebytes(x->input,0);
+	freebytes(x->Hwin,0);
+	freebytes(x->buffer,0);
+	freebytes(x->channel,0);
+	freebytes(x->output,0);
+	freebytes(x->lastamp,0);
+	freebytes(x->lastfreq,0);
+	freebytes(x->index,0);
+	freebytes(x->table,0);
+}
+
+void magfreq_analysis_highfreq(t_magfreq_analysis *x, t_floatarg f)
+{
+	float curfreq;
+	
+	if(f < x->lofreq){
+		error("current minimum is %f",x->lofreq);
+		return;
+	}
+	if(f > x->R/2 ){
+		f = x->R/2;
+	}
+	x->hifreq = f;
+	x->hi_bin = 1;
+	curfreq = 0;
+	while(curfreq < x->hifreq) {
+		++(x->hi_bin);
+		curfreq += x->c_fundamental;
+	}
+}
+
+void magfreq_analysis_lowfreq(t_magfreq_analysis *x, t_floatarg f)
+{
+	float curfreq;
+	
+	if(f > x->hifreq){
+		error("current maximum is %f",x->lofreq);
+		return;
+	}
+	if(f < 0 ){
+		f = 0;
+	}
+	x->lofreq = f;
+	x->lo_bin = 0;
+	curfreq = 0;
+	while( curfreq < x->lofreq ) {
+		++(x->lo_bin);
+		curfreq += x->c_fundamental ;
+	}
+}
+
+
+void magfreq_analysis_init(t_magfreq_analysis *x, short initialized)
+{
+	int i;
+	float curfreq;
+	
+	if(!x->R)//temp init if MSP functions returned zero
+		x->R = 44100;
+	if(!x->D)
+		x->D = 256;
+	if(x->P <= 0)
+		x->P = 1.0;
+	if(!power_of_two(x->overlap))
+		x->overlap = 2;
+	if(!power_of_two(x->winfac))
+		x->winfac = 2;
+	x->N = x->D * x->overlap;
+	x->Nw = x->N * x->winfac;
+	// limit_fftsize(&x->N,&x->Nw,OBJECT_NAME);
+	x->N2 = x->N / 2;
+	x->Nw2 = x->Nw / 2;
+	x->inCount = -(x->Nw);
+	x->bypass_state = 0;
+	x->mult = 1. / (float) x->N;
+	x->pitch_connected = 0;
+	x->synt_connected = 0;
+    
+	x->L = 8192 ;
+	x->c_fundamental =  (float) x->R/(float)( (x->N2)<<1 );
+	x->c_factor_in =  (float) x->R/((float)x->D * TWOPI);
+	x->c_factor_out = TWOPI * (float)  x->D / (float) x->R;
+	x->Iinv = 1./x->D;
+	x->myPInc = x->P*x->L/x->R;
+	x->ffac = x->P * PI/x->N;
+	
+	if(!initialized){
+		x->Wanal = (float *) getbytes( (MAX_Nw) * sizeof(float));
+		x->Wsyn = (float *) getbytes( (MAX_Nw) * sizeof(float));
+		x->Hwin = (float *) getbytes( (MAX_Nw) * sizeof(float));
+		x->input = (float *) getbytes( MAX_Nw * sizeof(float) );
+		x->output = (float *) getbytes( MAX_Nw * sizeof(float) );
+		x->buffer = (float *) getbytes( MAX_N * sizeof(float) );
+		x->channel = (float *) getbytes( (MAX_N+2) * sizeof(float) );
+		x->bitshuffle = (int *) getbytes( MAX_N * 2 * sizeof( int ) );
+		x->trigland = (float *) getbytes( MAX_N * 2 * sizeof( float ) );
+		x->c_lastphase_in = (float *) getbytes( (MAX_N2+1) * sizeof(float) );
+		x->c_lastphase_out = (float *) getbytes( (MAX_N2+1) * sizeof(float) );
+		x->lastamp = (float *) getbytes( (MAX_N+1) * sizeof(float) );
+		x->lastfreq = (float *) getbytes( (MAX_N+1) * sizeof(float) );
+		x->index = (float *) getbytes( (MAX_N+1) * sizeof(float) );
+		x->table = (float *) getbytes( x->L * sizeof(float) );
+		x->P = 1.0;
+		x->ffac = x->P * PI/MAX_N;
+		x->mute = 0;
+        //		x->threshgen = .0001;
+        
+	}
+	memset((char *)x->input,0,x->Nw * sizeof(float));
+	memset((char *)x->output,0,x->Nw * sizeof(float));
+	memset((char *)x->c_lastphase_in,0,(x->N2+1) * sizeof(float));
+	memset((char *)x->c_lastphase_out,0,(x->N2+1) * sizeof(float));
+	memset((char *)x->lastamp,0,(x->N+1) * sizeof(float));
+	memset((char *)x->lastfreq,0,(x->N+1) * sizeof(float));
+	memset((char *)x->index,0,(x->N+1) * sizeof(float));
+    
+	for ( i = 0; i < x->L; i++ ) {
+		x->table[i] = (float) x->N * cos((float)i * TWOPI / (float)x->L);
+	}
+	init_rdft( x->N, x->bitshuffle, x->trigland);
+	makehanning( x->Hwin, x->Wanal, x->Wsyn, x->Nw, x->N, x->D, 0);
+	
+	if( x->hifreq < x->c_fundamental ) {
+		x->hifreq = 3000.0 ;
+	}
+	x->hi_bin = 1;
+	curfreq = 0;
+	while( curfreq < x->hifreq ) {
+		++(x->hi_bin);
+		curfreq += x->c_fundamental ;
+	}
+	
+	x->lo_bin = 0;
+	curfreq = 0;
+	while( curfreq < x->lofreq ) {
+		++(x->lo_bin);
+		curfreq += x->c_fundamental ;
+	}
+	
+}
+
+void *magfreq_analysis_new(t_symbol *s, int argc, t_atom *argv)
+{
+
+	t_magfreq_analysis *x = (t_magfreq_analysis *)pd_new(magfreq_analysis_class);
+	outlet_new(&x->x_obj, gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal"));
+	
+	x->lofreq = atom_getfloatarg(0,argc,argv);
+	x->hifreq = atom_getfloatarg(1,argc,argv);
+	x->overlap = atom_getfloatarg(2,argc,argv);
+	x->winfac = atom_getfloatarg(3,argc,argv);
+	
+	if(x->lofreq <0 || x->lofreq> 22050)
+		x->lofreq = 0;
+	if(x->hifreq <50 || x->hifreq> 22050)
+		x->hifreq = 4000;
+    
+    
+	if(!power_of_two(x->overlap)){
+		x->overlap = 4;
+	}
+	if(!power_of_two(x->winfac)){
+		x->winfac = 2;
+	}
+	x->R = sys_getsr();
+	x->D = sys_getblksize();
+	
+	magfreq_analysis_init(x,0);
+	
+	return (x);
+}
+
+t_int *magfreq_analysis_perform(t_int *w)
+{
+	int 	j, in,on;
+	int    amp,freq,chan;
+	
+	t_magfreq_analysis *x = (t_magfreq_analysis *) (w[1]);
+	t_float *inbuf = (t_float *)(w[2]);
+	t_float *magnitude_vec = (t_float *)(w[3]);
+	t_float *frequency_vec = (t_float *)(w[4]);
+	t_float *index_vec = (t_float *)(w[5]);
+	int n = (int) w[6];
+	
+	int D = x->D;
+	int Nw = x->Nw;
+	int N = x->N ;
+	int N2 = x-> N2;
+	float fundamental = x->c_fundamental;
+	float factor_in =  x->c_factor_in;
+	int *bitshuffle = x->bitshuffle;
+	float *trigland = x->trigland;
+	float *lastphase_in = x->c_lastphase_in;
+    
+	
+	float *Wanal = x->Wanal;
+	float *input = x->input;;
+	float *buffer = x->buffer;
+	float *channel = x->channel;
+	in = on = x->inCount ;
+	
+	
+	if(x->mute){
+		for( j = 0; j < n; j++ ) {
+			*magnitude_vec++ = 0;
+			*frequency_vec++ = 0;
+			*index_vec++ = j;
+		}
+		return w+7;
+	}
+    
+	
+	if (x->bypass_state) {
+		for( j = 0; j < n; j++ ) {
+			*magnitude_vec++ = 0;
+			*frequency_vec++ = 0;
+			*index_vec++ = 0;
+		}
+		return w+7;
+	}
+	
+    in = on = x->inCount ;
+	
+    in += D;
+    //    on += I;
+	
+    for ( j = 0 ; j < (Nw - D) ; j++ ){
+        input[j] = input[j+D];
+    }
+    for ( j = (Nw-D); j < Nw; j++) {
+        input[j] = *inbuf++;
+    }
+	
+    fold( input, Wanal, Nw, buffer, N, in );
+    rdft( N, 1, buffer, bitshuffle, trigland );
+    convert( buffer, channel, N2, lastphase_in, fundamental, factor_in );
+	
+	
+    // start osc bank
+	
+    for ( chan = 0; chan < n; chan++ ) {
+		
+        freq = ( amp = ( chan << 1 ) ) + 1;
+        frequency_vec[chan] = channel[freq];
+        magnitude_vec[chan] = channel[amp];
+        
+    	index_vec[chan] = chan;
+	}
+    
+	
+	
+    // restore state variables
+    x->inCount = in % Nw;
+    return w+7;
+}
+
+void magfreq_analysis_bypass(t_magfreq_analysis *x, t_floatarg state)
+{
+	x->bypass_state = state;
+}
+
+#if __MSP__
+void magfreq_analysis_float(t_magfreq_analysis *x, double f) // Look at floats at inlets
+{
+	int inlet = x->x_obj.z_in;
+	
+	if (inlet == 1)
+    {
+		/*x->P = (float)f;
+         x->myPInc = x->P*x->L/x->R;*/
+    }
+	else if (inlet == 2)
+    {
+		//	x->threshgen = (float)f;
+    }
+	
+}
+#endif
+
+
+void magfreq_analysis_dsp(t_magfreq_analysis *x, t_signal **sp)
+{
+	
+	if(x->D != sp[0]->s_n || x->R != sp[0]->s_sr ){
+		x->D = sp[0]->s_n;
+		x->R = sp[0]->s_sr;
+		magfreq_analysis_init(x,1);
+	}
+	
+	dsp_add(magfreq_analysis_perform, 6, x,
+			sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec,
+			sp[0]->s_n);
+}
+
diff --git a/externals/lyonpotpourri/makewindows.c b/externals/lyonpotpourri/makewindows.c
new file mode 100755
index 0000000000000000000000000000000000000000..81a80f0007d9109fe78429e61cb07c4ba9b67ca3
--- /dev/null
+++ b/externals/lyonpotpourri/makewindows.c
@@ -0,0 +1 @@
+#include "fftease.h"

void makewindows( float *H, float *A, float *S, int Nw, int N, int I )

{
 int i ;
 float sum ;

    for ( i = 0 ; i < Nw ; i++ )
	H[i] = A[i] = S[i] = 0.54 - 0.46*cos( TWOPI*i/(Nw - 1) ) ;

    if ( Nw > N ) {
     float x ;

	x = -(Nw - 1)/2. ;
	for ( i = 0 ; i < Nw ; i++, x += 1. )
	    if ( x != 0. ) {
		A[i] *= N*sin( PI*x/N )/(PI*x) ;
		if ( I )
		    S[i] *= I*sin( PI*x/I )/(PI*x) ;
	    }
    }

    for ( sum = i = 0 ; i < Nw ; i++ )
	sum += A[i] ;

    for ( i = 0 ; i < Nw ; i++ ) {
     float afac = 2./sum ;
     float sfac = Nw > N ? 1./afac : afac ;
	A[i] *= afac ;
	S[i] *= sfac ;
    }

    if ( Nw <= N && I ) {
	for ( sum = i = 0 ; i < Nw ; i += I )
	    sum += S[i]*S[i] ;
	for ( sum = 1./sum, i = 0 ; i < Nw ; i++ )
	    S[i] *= sum ;
    }
}

void makehamming( float *H, float *A, float *S, int Nw, int N, int I, int odd )

{
 int i;
 float sum ;


 
 if (odd) {
    for ( i = 0 ; i < Nw ; i++ )
	  H[i] = A[i] = S[i] = sqrt(0.54 - 0.46*cos( TWOPI*i/(Nw - 1) ));
 }
	
 else {

   for ( i = 0 ; i < Nw ; i++ )
	  H[i] = A[i] = S[i] = 0.54 - 0.46*cos( TWOPI*i/(Nw - 1) );

 }
 	
    if ( Nw > N ) {
     float x ;

	x = -(Nw - 1)/2. ;
	for ( i = 0 ; i < Nw ; i++, x += 1. )
	    if ( x != 0. ) {
		A[i] *= N*sin( PI*x/N )/(PI*x) ;
		if ( I )
		    S[i] *= I*sin( PI*x/I )/(PI*x) ;
	    }
    }
    for ( sum = i = 0 ; i < Nw ; i++ )
	sum += A[i] ;

    for ( i = 0 ; i < Nw ; i++ ) {
     float afac = 2./sum ;
     float sfac = Nw > N ? 1./afac : afac ;
	A[i] *= afac ;
	S[i] *= sfac ;
    }

    if ( Nw <= N && I ) {
	for ( sum = i = 0 ; i < Nw ; i += I )
	    sum += S[i]*S[i] ;
	for ( sum = 1./sum, i = 0 ; i < Nw ; i++ )
	    S[i] *= sum ;
    }
}

  
void makehanning( float *H, float *A, float *S, int Nw, int N, int I, int odd )
{
 int i;
 float sum ;
 
 
 if (odd) {
    for ( i = 0 ; i < Nw ; i++ )
	  H[i] = A[i] = S[i] = sqrt(0.5 * (1. + cos(PI + TWOPI * i / (Nw - 1))));
 }
	
 else {

   for ( i = 0 ; i < Nw ; i++ )
	  H[i] = A[i] = S[i] = 0.5 * (1. + cos(PI + TWOPI * i / (Nw - 1)));

 }
 	
    if ( Nw > N ) {
     float x ;

	x = -(Nw - 1)/2. ;
	for ( i = 0 ; i < Nw ; i++, x += 1. )
	    if ( x != 0. ) {
		A[i] *= N*sin( PI*x/N )/(PI*x) ;
		if ( I )
		    S[i] *= I*sin( PI*x/I )/(PI*x) ;
	    }
    }
    for ( sum = i = 0 ; i < Nw ; i++ )
	sum += A[i] ;

    for ( i = 0 ; i < Nw ; i++ ) {
     float afac = 2./sum ;
     float sfac = Nw > N ? 1./afac : afac ;
	A[i] *= afac ;
	S[i] *= sfac ;
    }

    if ( Nw <= N && I ) {
	for ( sum = i = 0 ; i < Nw ; i += I )
	    sum += S[i]*S[i] ;
	for ( sum = 1./sum, i = 0 ; i < Nw ; i++ )
	    S[i] *= sum ;
    }
}
\ No newline at end of file
diff --git a/externals/lyonpotpourri/markov~-help.pd b/externals/lyonpotpourri/markov~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..17c812788d6647f2ed2dd056b7c345820d889e2d
--- /dev/null
+++ b/externals/lyonpotpourri/markov~-help.pd
@@ -0,0 +1,114 @@
+#N canvas 379 48 488 369 10;
+#X obj 132 186 markov~ 10;
+#X obj 132 220 phasor~;
+#X obj 132 250 lop~ 3000;
+#X obj 132 279 *~ 0.1;
+#X obj 132 307 dac~;
+#X floatatom 229 259 5 0 0 0 - - -, f 5;
+#N canvas 447 119 548 433 bach 0;
+#X obj 153 44 inlet;
+#X obj 135 415 outlet;
+#X obj 153 73 t b b;
+#X msg 183 107 set_length 9;
+#X obj 15 107 t b b b b b b b b b b;
+#X msg 15 360 values 261.626 293.665 329.628 391.995 440 523.251 587.33
+659.255 698.456;
+#X text 11 340 the notes in first 2 bars of JS Bach WTC 1 no. 1 prelude
+;
+#X msg 711 134;
+#X msg 724 156;
+#X msg 280 152 event_odds 0 0 1 1 0 0 0 0 0 0;
+#X msg 280 172 event_odds 1 0 0 0 0 1 0 0 0 0;
+#X msg 280 192 event_odds 2 0 0 0 1 0 0 0 0 0;
+#X msg 280 212 event_odds 3 0 0 0 0 0 1 0 0 0;
+#X msg 280 232 event_odds 4 0 0 0 0 0 0 1 0 0;
+#X msg 280 254 event_odds 5 0 0 0 0 0 0 0 1 0;
+#X msg 280 276 event_odds 6 0 0 0 0 0 0 0 0 1;
+#X msg 281 297 event_odds 7 1 0 0 1 0 0 0 0 0;
+#X msg 281 317 event_odds 8 1 0 0 0 1 0 0 0 0;
+#X text 189 398 If you do not know about transition matrices please
+see Xenakis's Formalized Music or whatever Web info you can find on
+first order Markov chains.;
+#X connect 0 0 2 0;
+#X connect 2 0 4 0;
+#X connect 2 1 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 5 0;
+#X connect 4 1 17 0;
+#X connect 4 2 16 0;
+#X connect 4 3 15 0;
+#X connect 4 4 14 0;
+#X connect 4 5 13 0;
+#X connect 4 6 12 0;
+#X connect 4 7 11 0;
+#X connect 4 8 10 0;
+#X connect 4 9 9 0;
+#X connect 5 0 1 0;
+#X connect 9 0 1 0;
+#X connect 10 0 1 0;
+#X connect 11 0 1 0;
+#X connect 12 0 1 0;
+#X connect 13 0 1 0;
+#X connect 14 0 1 0;
+#X connect 15 0 1 0;
+#X connect 16 0 1 0;
+#X connect 17 0 1 0;
+#X restore 132 142 pd bach;
+#X obj 132 117 loadbang;
+#N canvas 0 22 458 308 tempo-control 0;
+#X obj 138 45 loadbang;
+#X msg 138 69 120 4;
+#X obj 138 101 unpack f f;
+#X floatatom 138 127 5 0 0 0 - - -, f 5;
+#X floatatom 203 127 5 0 0 0 - - -, f 5;
+#X msg 138 157 tempo \$1;
+#X msg 203 154 subdiv \$1;
+#X obj 138 207 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 2 1 4 0;
+#X connect 3 0 5 0;
+#X connect 4 0 6 0;
+#X connect 5 0 7 0;
+#X connect 6 0 7 0;
+#X restore 0 87 pd tempo-control;
+#X obj 131 77 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 232 218 snapshot~;
+#X floatatom 232 239 5 0 0 0 - - -, f 5;
+#X obj 232 174 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 232 195 metro 50;
+#N canvas 0 22 458 308 override 0;
+#X obj 141 168 outlet;
+#X msg 116 120 manual_override \$1;
+#X obj 116 87 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 280 103 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 0 0;
+#X restore -4 158 pd override;
+#X text 254 175 see phase (1 cycle per note);
+#X text 183 138 is there a pdq external?;
+#X obj -14 16 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text -14 51 markov~ - 1st order Markov chains for basic melodic
+coherence, f 67;
+#X connect 0 0 1 0;
+#X connect 0 1 10 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 0 4 1;
+#X connect 5 0 3 1;
+#X connect 6 0 0 0;
+#X connect 7 0 6 0;
+#X connect 8 0 0 0;
+#X connect 9 0 6 0;
+#X connect 10 0 11 0;
+#X connect 12 0 13 0;
+#X connect 13 0 10 0;
+#X connect 14 0 0 0;
diff --git a/externals/lyonpotpourri/markov~.c b/externals/lyonpotpourri/markov~.c
new file mode 100755
index 0000000000000000000000000000000000000000..c54b45bfc9b655bc75522e6ec3485249057e939c
--- /dev/null
+++ b/externals/lyonpotpourri/markov~.c
@@ -0,0 +1,290 @@
+#include "MSPd.h"
+
+
+static t_class *markov_class;
+
+#define OBJECT_NAME "markov~"
+
+typedef struct _markov
+{
+    
+    t_object x_obj;
+    float x_f;
+    // for markov
+	int event_count;
+	int maximum_length;
+	float **event_weights;
+	int current_event;
+	float *values;
+	float current_value;
+	// for rhythm
+	int count;
+	int event_samples;
+	int subdiv;
+	float tempo;
+    
+	float sr;
+	short manual_override;
+	short trigger;
+} t_markov;
+
+//void main(void)
+void *markov_new(t_floatarg event_count);
+t_int *markov_perform(t_int *w);
+void markov_dsp(t_markov *x, t_signal **sp);
+int markov_domarkov( int current_event, float **event_weights, int event_count );
+void markov_subdiv(t_markov *x, t_floatarg subdiv);
+void markov_tempo(t_markov *x, t_floatarg tempo);
+void markov_set_length(t_markov *x, t_floatarg length);
+void markov_manual_override(t_markov *x, t_floatarg toggle);
+void markov_values(t_markov *x, t_symbol *msg, short argc, t_atom *argv);
+void markov_event_odds(t_markov *x, t_symbol *msg, short argc, t_atom *argv);
+void markov_free( t_markov *x);
+void markov_bang( t_markov *x);
+
+void markov_tilde_setup(void){
+    markov_class = class_new(gensym("markov~"), (t_newmethod)markov_new,
+                             (t_method)markov_free,sizeof(t_markov), 0,A_DEFFLOAT,0);
+    CLASS_MAINSIGNALIN(markov_class, t_markov, x_f);
+    class_addmethod(markov_class,(t_method)markov_dsp,gensym("dsp"),0);
+    class_addmethod(markov_class,(t_method)markov_subdiv,gensym("subdiv"),A_FLOAT,0);
+    class_addmethod(markov_class,(t_method)markov_tempo,gensym("tempo"),A_FLOAT,0);
+    class_addmethod(markov_class,(t_method)markov_set_length,gensym("set_length"),A_FLOAT,0);
+    class_addmethod(markov_class,(t_method)markov_manual_override,gensym("manual_override"),A_FLOAT,0);
+    class_addmethod(markov_class,(t_method)markov_values,gensym("values"),A_GIMME,0);
+    class_addmethod(markov_class,(t_method)markov_event_odds,gensym("event_odds"),A_GIMME,0);
+    class_addbang(markov_class,(t_method)markov_bang);
+    potpourri_announce(OBJECT_NAME);
+}
+
+
+void markov_free( t_markov *x)
+{
+	free( x->values );
+	free( x->event_weights );
+}
+
+void markov_manual_override(t_markov *x, t_floatarg toggle)
+{
+	x->manual_override = toggle;
+}
+
+void markov_bang(t_markov *x)
+{
+	x->trigger = 1;
+}
+
+void markov_values(t_markov *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	int i;
+    
+	if( argc != x->event_count ){
+		error("there must be %d values in this list", x->event_count);
+		return;
+	}
+	for( i = 0; i < x->event_count ; i++){
+		x->values[i] = atom_getfloatarg(i, argc, argv);
+	}
+}
+
+void markov_event_odds(t_markov *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	int i;
+	int event;
+	float sum = 0.0;
+    
+	float **event_weights = x->event_weights;
+    
+	if( argc != x->event_count + 1){
+		error("there must be %d values in this list", x->event_count + 1);
+		return;
+	}
+	event = atom_getfloatarg(0, argc, argv);
+	if( event < 0 || event > x->event_count - 1 ){
+		error("attempt to set event outside range of 0 to %d",x->event_count - 1);
+		return;
+	}
+	for( i = 0; i < x->event_count; i++){
+		event_weights[event][i] = atom_getfloatarg( (i+1), argc, argv);
+		sum += event_weights[event][i];
+	}
+	if( sum == 0.0 ){
+		error("zero sum for odds - this is a very bad thing");
+		return;
+	} else if( sum != 1.0 ){
+		// post("sum was %f, rescaling to 1.0", sum);
+		for( i = 0; i < x->event_count; i++ ){
+			event_weights[event][i] /= sum;
+		}
+	}
+}
+
+void markov_set_length(t_markov *x, t_floatarg length)
+{
+	if( length < 1 || length > x->maximum_length ){
+		error("%d is an illegal length", (int) length);
+		return;
+	}
+	x->event_count = length;
+    
+}
+
+void markov_tempo(t_markov *x, t_floatarg tempo)
+{
+	x->tempo = tempo;
+	x->event_samples = x->sr * (60.0/x->tempo) / (float) x->subdiv;
+}
+
+void markov_subdiv(t_markov *x, t_floatarg subdiv)
+{
+	x->subdiv = (int) subdiv;
+	if( subdiv < 1 || subdiv > 128)
+		subdiv = 1;
+	x->event_samples = x->sr * (60.0/x->tempo) / (float) x->subdiv;
+}
+
+void *markov_new(t_floatarg event_count)
+{
+    
+  	int i;
+
+    t_markov *x = (t_markov *)pd_new(markov_class);
+    outlet_new(&x->x_obj, gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+    // event_count is MAXIMUM event_count
+	if( event_count < 2 || event_count > 256 ){
+		error("maximum event length limited to 256, set to 16 here");
+		event_count = 16 ;
+	}
+    x->maximum_length = event_count;
+    
+    x->event_count = 4; // default pattern
+    x->count = 0;
+    
+    x->event_weights = (float **) malloc( event_count * sizeof(float *) );
+  	for( i = 0; i < 10; i++ ){
+    	x->event_weights[i] = (float *) malloc( event_count * sizeof(float) );
+  	}
+    x->values = (float *) malloc( event_count * sizeof(float) );
+    
+	x->current_event = 0;
+    x->values[0] = 300;
+    x->values[1] = 400;
+    x->values[2] = 500;
+    x->values[3] = 600;
+    // weights
+    x->event_weights[0][0] = 0;
+	x->event_weights[0][1] = 0.5;
+	x->event_weights[0][2] = 0.5;
+	x->event_weights[0][3] = 0;
+    x->event_weights[1][0] = 0.25;
+	x->event_weights[1][1] = 0.5;
+	x->event_weights[1][2] = 0.0;
+	x->event_weights[1][3] = 0.25;
+    x->event_weights[2][0] = 1;
+	x->event_weights[2][1] = 0.0;
+	x->event_weights[2][2] = 0.0;
+	x->event_weights[2][3] = 0.0;
+    x->event_weights[3][0] = 0.33;
+	x->event_weights[3][1] = 0.33;
+	x->event_weights[3][2] = 0.34;
+	x->event_weights[3][3] = 0.0;
+    x->current_value = x->values[ x->current_event ];
+	x->count = 0;
+	x->tempo = 60.0;
+	x->sr = sys_getsr();
+	if( ! x->sr ){
+		error("zero sampling rate - set to 44100");
+		x->sr = 44100;
+	}
+	x->subdiv = 1;
+	x->event_samples = x->sr * (60.0/x->tempo) / (float) x->subdiv;
+    
+	x->trigger = 0;
+    
+    return (x);
+}
+
+
+t_int *markov_perform(t_int *w)
+{
+	
+	t_markov *x = (t_markov *) (w[1]);
+	t_float *out = (t_float *)(w[3]);
+	t_float *sync = (t_float *)(w[4]);
+	int n = (int)(w[5]);
+	
+	int count = x->count;
+	int event_samples = x->event_samples;
+	int event_count = x->event_count;
+	float **event_weights = x->event_weights;
+	int current_event = x->current_event;
+	float *values = x->values;
+	float current_value = x->current_value;
+    
+	
+	if( x->manual_override ){
+		while (n--) {
+			if( x->trigger ){
+				current_event = markov_domarkov( current_event, event_weights, event_count );
+				current_value = values[ current_event ];
+				x->trigger = 0;
+			}
+			*out++ = current_value;
+		}
+		x->current_value = current_value;
+		x->current_event = current_event;
+		return (w+6);
+	}
+	
+	while (n--) {
+        
+		if( ++count >= event_samples ){
+			current_event = markov_domarkov( current_event, event_weights, event_count );
+			current_value = values[ current_event ];
+			count = 0;
+		}
+        
+		*sync++ = (float) count / (float) event_samples;
+        
+		*out++ = current_value;
+        
+	}
+    
+	x->current_value = current_value;
+	x->count = count;
+	x->current_event = current_event;
+	
+	return (w+6);
+}
+
+int markov_domarkov(int current_event, float **event_weights, int event_count)
+{
+	float randval;
+	int i;
+	
+	randval =  rand() % 32768 ;
+	randval /= 32768.0;
+	
+	
+	for( i = 0; i < event_count; i++ ){
+		if( randval < event_weights[current_event][i] ){
+			return i;
+		}
+		randval -= event_weights[current_event][i];
+	}
+	return 0; // should never happen
+}
+
+void markov_dsp(t_markov *x, t_signal **sp)
+{
+    //	long i;
+    if(x->sr!=sp[0]->s_sr){
+        x->sr=sp[0]->s_sr;// BUG!!! in MSP code was !=
+        x->event_samples = x->sr * (60.0/x->tempo) / (float) x->subdiv;
+        x->count = 0;
+    }
+    dsp_add(markov_perform, 5, x, sp[0]->s_vec , sp[1]->s_vec, sp[2]->s_vec, 
+            sp[0]->s_n);
+}
+
diff --git a/externals/lyonpotpourri/mask~-help.pd b/externals/lyonpotpourri/mask~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..16c48c83abbde1f354ac53b2c9d0ed7f90002711
--- /dev/null
+++ b/externals/lyonpotpourri/mask~-help.pd
@@ -0,0 +1,34 @@
+#N canvas 168 173 424 386 10;
+#X msg 31 93 tempo \$1;
+#X floatatom 31 68 5 0 0 0 - mask-tempo-in -, f 5;
+#X obj 31 144 mask~ 1 0 0 0 1 0 0 0.5 0 1 0 0 0.2 0.4 0.6 0.8;
+#X obj 31 205 clickhold~;
+#X obj 31 232 osc~ 120;
+#X obj 242 177 adsr~ 5 10 10 200 0.7 0.1;
+#X obj 31 268 *~;
+#X obj 31 303 *~ 0.1;
+#X obj 31 329 dac~;
+#X obj 31 177 mask~ 440 500 370 1000 888;
+#X obj 32 8 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#N canvas 0 22 195 209 initialize 0;
+#X msg 39 74 60;
+#X obj 39 48 loadbang;
+#X obj 39 114 s mask-tempo-in;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X restore 87 305 pd initialize;
+#X text 33 41 mask~ - click-driven sequencer;
+#X obj 31 119 samm~ 60 4;
+#X connect 0 0 13 0;
+#X connect 1 0 0 0;
+#X connect 2 0 5 0;
+#X connect 2 0 9 0;
+#X connect 3 0 4 0;
+#X connect 4 0 6 0;
+#X connect 5 0 6 1;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 7 0 8 1;
+#X connect 9 0 3 0;
+#X connect 13 0 2 0;
diff --git a/externals/lyonpotpourri/mask~.c b/externals/lyonpotpourri/mask~.c
new file mode 100755
index 0000000000000000000000000000000000000000..6dd0b4f2544615f9360a24cb9b50d733fee98c2a
--- /dev/null
+++ b/externals/lyonpotpourri/mask~.c
@@ -0,0 +1,363 @@
+#include "MSPd.h"
+
+static t_class *mask_class;
+
+#define MAXLEN 256
+#define MAXMASKS 1024
+#define MAXSEQ 1024
+#define OBJECT_NAME "mask~"
+#define DATE "(6.6.06)"
+
+typedef struct
+{
+    float *pat; // mask pattern
+    int length;// length of pattern
+} t_maskpat;
+
+typedef struct
+{
+    int *seq; // mask pattern
+    int length;// length of pattern
+    int phase; // keep track of where we are in sequence
+} t_sequence;
+
+typedef struct _mask
+{
+    
+    t_object x_obj;
+    float x_f;
+    short mute;// stops all computation (try z-disable)
+    short gate; // continues masking but inhibits all output
+    short phaselock; // indicates all patterns are the same size and use the same phase count
+    short indexmode;//special mode where input clicks are also mask indicies (+ 1)
+    int phase;//phase of current pattern
+    int current_mask;// currently selected pattern
+    t_maskpat *masks;// contains the mask patterns
+    t_sequence sequence;// contains an optional mask sequence
+    int *stored_masks;// a list of patterns stored
+    int pattern_count;//how many patterns are stored
+    short noloop;// flag to play pattern only once
+    float *in_vec;//copy space for input to avoid dreaded vector sharing override
+} t_mask;
+
+void *mask_new(t_symbol *msg, short argc, t_atom *argv);
+t_int *mask_perform(t_int *w);
+void mask_dsp(t_mask *x, t_signal **sp);
+void mask_mute(t_mask *x, t_floatarg f);
+void mask_phaselock(t_mask *x, t_floatarg f);
+void mask_gate(t_mask *x, t_floatarg f);
+void mask_addmask(t_mask *x, t_symbol *msg, short argc, t_atom *argv);
+void mask_recall(t_mask *x, t_floatarg p);
+void mask_showmask(t_mask *x, t_floatarg p);
+void mask_indexmode(t_mask *x, t_floatarg t);
+void mask_gozero(t_mask *x);
+void mask_free(t_mask *x);
+void mask_sequence(t_mask *x, t_symbol *msg, short argc, t_atom *argv);
+void mask_noloop(t_mask *x, t_floatarg f);
+void mask_playonce(t_mask *x, t_floatarg pnum);
+
+
+
+void mask_tilde_setup(void){
+    mask_class = class_new(gensym("mask~"), (t_newmethod)mask_new,
+                           (t_method)mask_free ,sizeof(t_mask), 0,A_GIMME,0);
+    CLASS_MAINSIGNALIN(mask_class, t_mask, x_f);
+    class_addmethod(mask_class,(t_method)mask_dsp,gensym("dsp"),0);
+    class_addmethod(mask_class,(t_method)mask_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(mask_class,(t_method)mask_phaselock,gensym("phaselock"),A_FLOAT,0);
+    class_addmethod(mask_class,(t_method)mask_gate,gensym("gate"),A_FLOAT,0);
+    class_addmethod(mask_class,(t_method)mask_addmask,gensym("addmask"),A_GIMME,0);
+    class_addmethod(mask_class,(t_method)mask_sequence,gensym("sequence"),A_GIMME,0);
+    class_addmethod(mask_class,(t_method)mask_recall,gensym("recall"),A_FLOAT,0);
+    class_addmethod(mask_class,(t_method)mask_showmask,gensym("showmask"),A_FLOAT,0);
+    class_addmethod(mask_class,(t_method)mask_indexmode,gensym("indexmode"),A_FLOAT,0);
+    class_addmethod(mask_class,(t_method)mask_playonce,gensym("playonce"),A_FLOAT,0);
+    class_addmethod(mask_class,(t_method)mask_noloop,gensym("noloop"),A_FLOAT,0);
+    class_addmethod(mask_class,(t_method)mask_gozero,gensym("gozero"),0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+void mask_playonce(t_mask *x, t_floatarg pnum)
+{
+	x->noloop = 1;
+	x->mute = 0;
+	mask_recall(x,pnum);
+}
+
+void mask_indexmode(t_mask *x, t_floatarg t)
+{
+	x->indexmode = (short)t;
+}
+
+void mask_gozero(t_mask *x)
+{
+    x->phase = 0;
+}
+
+void mask_mute(t_mask *x, t_floatarg f)
+{
+    x->mute = (short)f;
+}
+
+void mask_noloop(t_mask *x, t_floatarg f)
+{
+    x->noloop = (short)f;
+}
+
+void mask_phaselock(t_mask *x, t_floatarg f)
+{
+    x->phaselock = (short)f;
+}
+
+void mask_gate(t_mask *x, t_floatarg f)
+{
+    x->gate = (short)f;
+}
+
+
+void mask_showmask(t_mask *x, t_floatarg p){
+    int location = p;
+    short found = 0;
+    int i;
+    int len;
+    
+    
+    for(i = 0; i<x->pattern_count; i++){
+        if(location == x->stored_masks[i]){
+            found = 1;
+            break;
+        }
+    }
+    if(found){
+        len = x->masks[location].length;
+        post("pattern length is %d",len);
+        for(i = 0; i < len; i++){
+            post("%d: %f",i,x->masks[location].pat[i]);
+        }
+        
+    } else {
+        error("no pattern stored at location %d",location);
+    }
+}
+
+void mask_recall(t_mask *x, t_floatarg p)
+{
+    int i;
+    int location = p;
+    short found = 0;
+    
+    
+    for(i = 0; i < x->pattern_count; i++){
+        if(location == x->stored_masks[i]){
+            found = 1;
+            break;
+        }
+    }
+    if(found){
+        x->current_mask = location;
+        if(! x->phaselock){
+            x->phase = 0;
+        }
+    } else {
+        error("no pattern stored at location %d",location);
+    }
+}
+
+//initiate mask recall sequence
+void mask_sequence(t_mask *x, t_symbol *msg, short argc, t_atom *argv)
+{
+    int i;
+    
+	if(argc > MAXSEQ){
+		error("%d exceeds possible length for a sequence",argc);
+		return;
+	}
+	if(argc < 1){
+		error("you must sequence at least 1 mask");
+		return;
+	}
+	for(i = 0; i < argc; i++){
+		x->sequence.seq[i] = atom_getfloatarg(i,argc,argv);
+	}
+	if(x->sequence.seq[0] < 0){
+		post("sequencing turned off");
+		x->sequence.length = 0;
+		return;
+	}
+	x->sequence.phase = 0;
+	x->sequence.length = argc;
+	// now load in first mask of sequence
+	mask_recall(x, (t_floatarg)x->sequence.seq[x->sequence.phase++]);
+	
+	// ideally would check that each sequence number is a valid stored location
+}
+
+void mask_addmask(t_mask *x, t_symbol *msg, short argc, t_atom *argv)
+{
+    int location;
+    int i;
+    
+    if(argc < 2){
+        error("must specify location and mask");
+        return;
+    }
+    if(argc > MAXLEN){
+        error("mask is limited to length %d",MAXLEN);
+        return;
+    }
+    location = atom_getintarg(0,argc,argv);
+    if(location < 0 || location > MAXMASKS - 1){
+        error("illegal location");
+        return;
+    }
+    if(x->masks[location].pat == NULL){
+        x->masks[location].pat = (float *) malloc(MAXLEN * sizeof(float));
+        x->stored_masks[x->pattern_count++] = location;
+    } else {
+        //    post("replacing pattern stored at location %d", location);
+    }
+    //  post("reading new mask from argument list, with %d members",argc-1);
+    x->masks[location].length = argc-1;
+    for(i=1; i<argc; i++){
+        x->masks[location].pat[i-1] = atom_getfloatarg(i,argc,argv);
+    }
+    //  post("there are currently %d patterns stored",x->pattern_count);
+}
+
+void mask_free(t_mask *x)
+{
+    int i;
+    for(i=0;i<x->pattern_count;i++)
+        free(x->masks[i].pat);
+    free(x->masks);
+    free(x->stored_masks);
+    free(x->sequence.seq);
+    free(x->in_vec);
+}
+
+void *mask_new(t_symbol *msg, short argc, t_atom *argv)
+{
+    int i;
+    t_mask *x = (t_mask *)pd_new(mask_class);
+    outlet_new(&x->x_obj, gensym("signal"));
+    
+    x->masks = (t_maskpat *) malloc(MAXMASKS * sizeof(t_maskpat));
+    x->stored_masks = (int *) malloc(MAXMASKS * sizeof(int));
+    
+    x->sequence.seq = (int *) malloc(MAXSEQ * sizeof(int));
+    
+    
+    /* this should be vector size, and possibly realloced in dsp routine if size changes */
+    x->in_vec = (float *) malloc(8192 * sizeof(float));
+    
+    x->sequence.length = 0; // no sequence by default
+    x->sequence.phase = 0; //
+    
+    //	post("allocated %d bytes for basic mask holder",MAXMASKS * sizeof(t_maskpat));
+    
+    x->current_mask = -1; // by default no mask is selected
+    for(i=0; i<MAXMASKS; i++){
+        x->stored_masks[i] = -1; // indicates no pattern stored
+        x->masks[i].pat = NULL;
+    }
+    if(argc > 0){
+        //	post("reading initial mask from argument list, with %d members",argc);
+        x->masks[0].pat = (float *) malloc(MAXLEN * sizeof(float));
+        //		post("allocated %d bytes for this pattern", MAXLEN * sizeof(float));
+        x->masks[0].length = argc;
+        for(i=0; i<argc; i++){
+            x->masks[0].pat[i] = atom_getfloatarg(i,argc,argv);
+        }
+        x->current_mask = 0; // now we use the mask we read from the arguments
+        x->stored_masks[0] = 0;
+        x->pattern_count = 1;
+    }
+    x->indexmode = 0;
+    x->mute = 0;
+    x->gate = 1;//by default gate is on, and the pattern goes out (zero gate turns it off)
+    x->phaselock = 0;// by default do NOT use a common phase for all patterns
+    x->phase = 0;
+    x->noloop = 0;
+    
+    return x;
+}
+
+
+t_int *mask_perform(t_int *w)
+{
+    int i;
+    t_mask *x = (t_mask *) (w[1]);
+    float *inlet = (t_float *) (w[2]);
+    float *outlet = (t_float *) (w[3]);
+    int n = (int) w[4];
+    
+    int phase = x->phase;
+    short gate = x->gate;
+    short indexmode = x->indexmode;
+    short noloop = x->noloop;
+    int current_mask = x->current_mask;
+    t_maskpat *masks = x->masks;
+    t_sequence sequence = x->sequence;
+    float *in_vec = x->in_vec;
+    
+    
+    if( x->mute || current_mask < 0){
+        while(n--) *outlet++ = 0;
+        return (w+5);
+    }
+    
+    // should use memcpy() here
+    for(i = 0; i < n; i++){
+        in_vec[i] = inlet[i];
+    }
+    // clean outlet - should use memset()
+    for( i = 0; i < n; i++){
+        outlet[i] = 0.0;
+    }
+    
+    for(i = 0; i<n; i++){
+        if(in_vec[i]){ // got a click
+            if(indexmode){ // indexmode means the click itself controls the phase of the mask
+                phase = in_vec[i] - 1;
+                /*    	post("current mask: %d, length: %d, inphase %d", current_mask, masks[current_mask].length, phase); */
+                if(phase < 0 || phase >= masks[current_mask].length){
+                    /*	post("phase %d out of range", phase); */
+                    phase %= masks[current_mask].length;
+                    /*	post("phase reset to %d", phase); */
+                }
+            }
+            if(gate){
+				outlet[i] = masks[current_mask].pat[phase];
+                //				post("mask value: %f",outlet[i]);
+			}
+            ++phase; //advance phase in all cases (so pattern advances when gated)
+            if(phase >= masks[current_mask].length){
+				phase = 0;
+				if(noloop){
+					x->mute = 1;
+                    //				post("halted by noloop");
+					goto out;
+				}
+				// if a sequence is active, reset the current mask too
+				if(sequence.length){
+					mask_recall(x, (t_floatarg)sequence.seq[sequence.phase++]);
+					current_mask = x->current_mask; // this was reset internally!
+					if(sequence.phase >= sequence.length)
+						sequence.phase = 0;
+				}
+            }
+        } 
+    }
+out:
+    x->phase = phase;
+    x->sequence.phase = sequence.phase;
+    return (w+5);
+}
+
+
+
+void mask_dsp(t_mask *x, t_signal **sp)
+{
+    dsp_add(mask_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
+}
+
diff --git a/externals/lyonpotpourri/npan~-help.pd b/externals/lyonpotpourri/npan~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..5ab3d6deaccb5f3d70be75b0c94a52da32dc2718
--- /dev/null
+++ b/externals/lyonpotpourri/npan~-help.pd
@@ -0,0 +1,113 @@
+#N canvas 687 213 522 443 10;
+#X obj -38 157 npan~ 4;
+#X obj 1 124 phasor~ 0.2;
+#X obj -38 98 noise~;
+#X obj -37 298 vu 15 120 empty empty -1 -8 0 10 -66577 -1 1 0;
+#N canvas 0 22 450 300 meter 0;
+#X obj 110 164 snapshot~;
+#X obj 126 114 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X floatatom 110 187 5 0 0 0 - - -, f 5;
+#X obj 110 91 env~ 1024;
+#X obj 126 140 metro 100;
+#X obj 109 211 - 100;
+#X obj 231 46 loadbang;
+#X msg 231 71 1;
+#X obj 109 246 outlet;
+#X obj 110 51 inlet~;
+#X connect 0 0 2 0;
+#X connect 1 0 4 0;
+#X connect 2 0 5 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 8 0;
+#X connect 6 0 7 0;
+#X connect 7 0 1 0;
+#X connect 9 0 3 0;
+#X restore -38 255 pd meter;
+#X obj 24 299 vu 15 120 empty empty -1 -8 0 10 -66577 -1 1 0;
+#N canvas 0 22 450 300 meter 0;
+#X obj 110 164 snapshot~;
+#X obj 126 114 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X floatatom 110 187 5 0 0 0 - - -, f 5;
+#X obj 110 91 env~ 1024;
+#X obj 126 140 metro 100;
+#X obj 109 211 - 100;
+#X obj 231 46 loadbang;
+#X msg 231 71 1;
+#X obj 109 246 outlet;
+#X obj 110 51 inlet~;
+#X connect 0 0 2 0;
+#X connect 1 0 4 0;
+#X connect 2 0 5 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 8 0;
+#X connect 6 0 7 0;
+#X connect 7 0 1 0;
+#X connect 9 0 3 0;
+#X restore 23 256 pd meter;
+#X obj 87 299 vu 15 120 empty empty -1 -8 0 10 -66577 -1 1 0;
+#N canvas 0 22 450 300 meter 0;
+#X obj 110 164 snapshot~;
+#X obj 126 114 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X floatatom 110 187 5 0 0 0 - - -, f 5;
+#X obj 110 91 env~ 1024;
+#X obj 126 140 metro 100;
+#X obj 109 211 - 100;
+#X obj 231 46 loadbang;
+#X msg 231 71 1;
+#X obj 109 246 outlet;
+#X obj 110 51 inlet~;
+#X connect 0 0 2 0;
+#X connect 1 0 4 0;
+#X connect 2 0 5 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 8 0;
+#X connect 6 0 7 0;
+#X connect 7 0 1 0;
+#X connect 9 0 3 0;
+#X restore 86 256 pd meter;
+#X obj 148 300 vu 15 120 empty empty -1 -8 0 10 -66577 -1 1 0;
+#N canvas 0 22 450 300 meter 0;
+#X obj 110 164 snapshot~;
+#X obj 126 114 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X floatatom 110 187 5 0 0 0 - - -, f 5;
+#X obj 110 91 env~ 1024;
+#X obj 126 140 metro 100;
+#X obj 109 211 - 100;
+#X obj 231 46 loadbang;
+#X msg 231 71 1;
+#X obj 109 246 outlet;
+#X obj 110 51 inlet~;
+#X connect 0 0 2 0;
+#X connect 1 0 4 0;
+#X connect 2 0 5 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 8 0;
+#X connect 6 0 7 0;
+#X connect 7 0 1 0;
+#X connect 9 0 3 0;
+#X restore 147 257 pd meter;
+#X obj -44 13 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 20 158 arg: number of outlets;
+#X text 80 97 Left inlet is sound to pan. Right inlet (ranging from
+0-1) determines perimeter pan location.;
+#X text -35 57 npan~ - perimeter panning for an arbitrary number of
+channel outputs, f 69;
+#X connect 0 0 4 0;
+#X connect 0 1 6 0;
+#X connect 0 2 8 0;
+#X connect 0 3 10 0;
+#X connect 1 0 0 1;
+#X connect 2 0 0 0;
+#X connect 4 0 3 0;
+#X connect 6 0 5 0;
+#X connect 8 0 7 0;
+#X connect 10 0 9 0;
diff --git a/externals/lyonpotpourri/npan~.c b/externals/lyonpotpourri/npan~.c
new file mode 100755
index 0000000000000000000000000000000000000000..60aac986c2d08082724a94cb64eb51c016d59389
--- /dev/null
+++ b/externals/lyonpotpourri/npan~.c
@@ -0,0 +1,130 @@
+#include "MSPd.h"
+#define OBJECT_NAME "npan~"
+
+#define SPEAKERMAX (1024)
+
+static t_class *npan_class;
+
+
+typedef struct _npan
+{
+	t_object x_obj;
+	double pi_over_two;
+	double twopi;
+    float x_f;
+	int outcount;
+    t_float *input_locvec;
+    t_float *panner_locvec;
+} t_npan;
+
+void *npan_new(t_symbol *s, short argc, t_atom *argv);
+t_int *npan_perform(t_int *w);
+void npan_dsp(t_npan *x, t_signal **sp);
+void npan_free(t_npan *x);
+
+void npan_tilde_setup(void){
+    npan_class = class_new(gensym("npan~"), (t_newmethod)npan_new,
+                  (t_method)npan_free, sizeof(t_npan),0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(npan_class, t_npan, x_f);
+    class_addmethod(npan_class, (t_method)npan_dsp, gensym("dsp"),0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+void *npan_new(t_symbol *s, short argc, t_atom *argv)
+{
+	t_npan *x;
+    x = (t_npan *)pd_new(npan_class);
+	int i;
+	x->outcount = (int) atom_getfloatarg(0, argc, argv);
+	if( x->outcount < 2 || x->outcount > SPEAKERMAX ){
+		
+		error("npan~: output count %d exceeded range limits of 2 to %d",x->outcount, SPEAKERMAX);
+        x->outcount = SPEAKERMAX;
+	}
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("signal"),gensym("signal")); // create 2nd inlet
+	for(i = 0; i < x->outcount; i++){
+		outlet_new(&x->x_obj, gensym("signal"));
+	}
+    x->input_locvec = (t_float *) calloc(8192, 1);
+    x->panner_locvec = (t_float *) calloc(8192, 1);
+    x->pi_over_two = 1.5707963267948965;
+	x->twopi = 6.283185307179586;
+	return x;
+}
+
+void npan_free(t_npan *x)
+{
+    free(x->panner_locvec);
+    free(x->input_locvec);
+}
+
+t_int *npan_perform(t_int *w)
+{
+    t_npan *x = (t_npan*) w[1];
+    int outcount = x->outcount;
+	t_float *input = (t_float*) w[2];
+	t_float *panner = (t_float*) w[3];
+    t_float *outlet1, *outlet2, *cleanoutlet;
+    t_float *input_locvec = x->input_locvec;
+    t_float *panner_locvec = x->panner_locvec;
+    
+	double gain1, gain2;
+	double insamp;
+	int chan1, chan2;
+	double panloc, frak;
+	int i,j;
+	
+	double pi_over_two = x->pi_over_two;
+    int n = (int) w[4 + outcount];
+	// copy inputs
+    for(i = 0; i < n; i++){
+        input_locvec[i] = input[i];
+        panner_locvec[i] = panner[i];
+    }
+	// clean all outlets
+	for( i = 0; i < outcount; i++ ){
+		cleanoutlet = (t_float*) w[4 + i];
+        for(j = 0; j < n; j++){
+            cleanoutlet[j] = 0.0;
+        }
+	}
+	for(i = 0; i < n; i++){
+        insamp = input_locvec[i];
+		panloc = panner_locvec[i];
+		if( panloc < 0 )
+			panloc = 0.0;
+		if( panloc >= 1 ) // wrap around (otherwise crash on outlet out of range)
+			panloc = 0.0;
+		panloc *= (double) outcount;
+		chan1 = floor( panloc );
+		chan2 = (chan1 + 1) % outcount;
+		frak = ( panloc - chan1 ) * pi_over_two;
+		gain1 = cos( frak );
+		gain2 = sin( frak );
+		outlet1 = (t_float*) w[chan1 + 4]; // add offset
+		outlet2 = (t_float*) w[chan2 + 4];
+		
+		outlet1[i] = insamp * gain1;
+		outlet2[i] = insamp * gain2;
+	}
+    return (w + outcount + 5);
+}
+
+void npan_dsp(t_npan *x, t_signal **sp)
+{
+	long i;
+    t_int **sigvec;
+    int pointer_count = x->outcount + 4;
+    sigvec  = (t_int **) calloc(pointer_count, sizeof(t_int *));
+	for(i = 0; i < pointer_count; i++){
+		sigvec[i] = (t_int *) calloc(sizeof(t_int),1);
+	}
+	sigvec[0] = (t_int *)x; // first pointer is to the object
+	sigvec[pointer_count - 1] = (t_int *)sp[0]->s_n; // last pointer is to vector size (N)
+	for(i = 1; i < pointer_count - 1; i++){ // now attach the inlet and all outlets
+		sigvec[i] = (t_int *)sp[i-1]->s_vec;
+	}
+    dsp_addv(npan_perform, pointer_count, (t_int *) sigvec);
+    free(sigvec);
+}
+
diff --git a/externals/lyonpotpourri/oscil~-help.pd b/externals/lyonpotpourri/oscil~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..05efe2dcd2ebc0a994141b7e3fee03c0446f316e
--- /dev/null
+++ b/externals/lyonpotpourri/oscil~-help.pd
@@ -0,0 +1,84 @@
+#N canvas 241 327 452 381 10;
+#X floatatom 134 164 5 0 0 2 frequency oscil-frequency-in -, f 5;
+#X obj -59 312 dac~;
+#N canvas 0 22 639 421 built-in-waveforms 0;
+#X obj 121 344 outlet;
+#X msg 135 88 square;
+#X msg 186 89 triangle;
+#X msg 254 89 buzz;
+#X msg 299 89 sine;
+#X msg 26 43 harmcount \$1;
+#X floatatom 26 23 5 0 0 0 - - -, f 5;
+#X msg 343 88 sawtooth;
+#X msg 374 221 harmcount \$1;
+#X floatatom 324 175 5 0 0 0 - - -, f 5;
+#X obj 324 195 t b f;
+#X msg 324 219 buzz;
+#X obj 327 154 hsl 40 15 1 40 0 0 empty empty empty -2 -6 0 8 -36928
+-1 -1 0 1;
+#X text 131 69 band-limited waveforms;
+#X text 325 133 or do it dynamically;
+#X msg 272 312 fadetime 50;
+#X text 236 295 make sure your fade time is short for fast changes
+;
+#X text 118 45 set how many harmonics in bl waveforms;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 5 0;
+#X connect 7 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 10 0;
+#X connect 10 0 11 0;
+#X connect 10 1 8 0;
+#X connect 11 0 0 0;
+#X connect 12 0 9 0;
+#X connect 15 0 0 0;
+#X restore -59 73 pd built-in-waveforms;
+#X obj -59 221 oscil~ 220 8192 square 16;
+#X floatatom 147 228 5 0 0 0 - - -, f 5;
+#X msg -15 134 fadetime 5000;
+#X msg 1 163 fadetime 50;
+#X obj 150 209 hsl 128 15 0 0.7 0 0 empty empty gain -2 -6 0 8 -261836
+-1 -1 0 1;
+#N canvas 0 22 470 320 user-waveforms 0;
+#X msg 105 81 0 0 0.1 0 0.25 0.5 0 0 0.3 0.1 0.05;
+#X obj 105 230 outlet;
+#X msg 120 107 0 0.1 0.3 0 0 0 0 0.5 0 0 0.7 0 0 0.2 0.1;
+#X msg 130 129 0 0.1 0.1 1 1 0.1 0.1;
+#X msg 140 151 0 1 0.5 0.25 0.125 0.0625;
+#X text 45 33 list relative weights of harmonics \, starting with DC
+;
+#X msg 145 198 0 1;
+#X text 171 199 this is a sine;
+#X connect 0 0 1 0;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 1 0;
+#X connect 6 0 1 0;
+#X restore -50 95 pd user-waveforms;
+#X text -19 118 waveform interpolation;
+#X obj -64 12 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text -61 42 oscil~ - an oscillator with arbitrary waveforms \, length
+and crossfade between different waveforms;
+#N canvas 0 22 450 300 initialize 0;
+#X obj 78 90 loadbang;
+#X msg 78 113 220;
+#X obj 78 148 s oscil-frequency-in;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X restore -2 303 pd initialize;
+#X obj -59 250 *~ 0.02;
+#X connect 0 0 3 0;
+#X connect 2 0 3 0;
+#X connect 3 0 13 0;
+#X connect 4 0 13 1;
+#X connect 5 0 3 0;
+#X connect 6 0 3 0;
+#X connect 7 0 4 0;
+#X connect 8 0 3 0;
+#X connect 13 0 1 0;
+#X connect 13 0 1 1;
diff --git a/externals/lyonpotpourri/oscil~.c b/externals/lyonpotpourri/oscil~.c
new file mode 100755
index 0000000000000000000000000000000000000000..88dd3abb1bd7683f3a5e653a1249cfe707e7e1c3
--- /dev/null
+++ b/externals/lyonpotpourri/oscil~.c
@@ -0,0 +1,789 @@
+#include "MSPd.h"
+#include "string.h"
+
+/**/
+// NOTE: MUST PREVENT WAVEFORM UPDATE IF ALREADY IN PROGRESS
+
+// 7.23.04 adding bandlimited harmonic count
+// 9.2.04 fixed cross fade amplitude bug
+// 1.14.06 added apwave message for amp/phase creation
+
+#define OSCIL_MAXIMUM_HARMONICS (1024)
+#define OSCIL_DEFAULT_FLEN 8192
+#define OSCIL_MAX_FLEN 1048576
+#define OSCIL_MAX_HARMS 1024
+#define OSCIL_DEFAULT_HARMONICS 10
+#define OSCIL_INIT_FREQ 440.0
+#define OSCIL_DEFAULT_WAVEFORM "sine"
+#define OSCIL_NOFADE 0
+#define OSCIL_LINEAR 1
+#define OSCIL_POWER 2
+
+#define OBJECT_NAME "oscil~"
+#define REV "2.4.06"
+
+
+static t_class *oscil_class;
+
+typedef struct _oscil
+{
+    
+    t_object x_obj;
+    float x_f;
+	int table_length;
+	float *wavetable;
+	int harmonic_count;
+	float *harmonic_weights;
+	float *harmonic_phases;
+	double phase;
+	double phase_offset;
+	double si_factor;
+	double si;
+	int bl_harms;
+	float piotwo;
+	float twopi;
+	float sr;
+	short mute;
+	short connected[4];
+	float *old_wavetable;
+	short dirty;
+	float fade_ms;
+	int fade_samples;
+	int fade_countdown;
+	short fadetype;
+	short firsttime;
+	short fade_in_progress;
+	short interpolate; // flag for synthesis method
+    
+} t_oscil;
+
+void *oscil_new(t_symbol *s, short argc, t_atom *argv);
+static t_int *oscil_perform(t_int *w);
+void oscil_dsp(t_oscil *x, t_signal **sp);
+void build_waveform(t_oscil *x);
+void build_amph_waveform(t_oscil *x);
+void oscil_mute(t_oscil *x, t_floatarg flag);
+void oscil_sine(t_oscil *x );
+void oscil_sawtooth(t_oscil *x);
+void oscil_square(t_oscil *x) ;
+void oscil_triangle(t_oscil *x);
+void oscil_buzz(t_oscil *x );
+void oscil_list (t_oscil *x, t_symbol *msg, short argc, t_atom *argv);
+void oscil_fadetime (t_oscil *x, t_floatarg fade_ms) ;
+void oscil_fadetype(t_oscil *x, t_floatarg ftype);
+void oscil_harmcount(t_oscil *x, t_floatarg harms);
+void oscil_interpolate(t_oscil *x, t_floatarg tog);
+void oscil_dsp_free(t_oscil *x);
+void oscil_amph(t_oscil *x, t_symbol *msg, short argc, t_atom *argv);
+t_int *oscil_perform_interpolate(t_int *w);
+
+
+void oscil_tilde_setup(void)
+{
+    oscil_class = class_new(gensym("oscil~"), (t_newmethod)oscil_new,
+                            (t_method)oscil_dsp_free ,sizeof(t_oscil), 0, A_GIMME,0);
+    CLASS_MAINSIGNALIN(oscil_class, t_oscil, x_f );
+    class_addmethod(oscil_class, (t_method)oscil_dsp, gensym("dsp"), 0);
+    class_addmethod(oscil_class, (t_method)oscil_mute, gensym("mute"), A_DEFFLOAT,0);
+    class_addmethod(oscil_class, (t_method)oscil_sine, gensym("sine"), 0);
+    class_addmethod(oscil_class, (t_method)oscil_triangle, gensym("triangle"), 0);
+    class_addmethod(oscil_class, (t_method)oscil_square, gensym("square"), 0);
+    class_addmethod(oscil_class, (t_method)oscil_sawtooth, gensym("sawtooth"), 0);
+    class_addmethod(oscil_class, (t_method)oscil_buzz, gensym("buzz"), 0);
+    class_addmethod(oscil_class, (t_method)oscil_list, gensym("list"), A_GIMME, 0);
+    class_addmethod(oscil_class, (t_method)oscil_amph, gensym("amph"), A_GIMME, 0);
+    class_addmethod(oscil_class, (t_method)oscil_fadetype, gensym("fadetype"), A_FLOAT, 0);
+    class_addmethod(oscil_class, (t_method)oscil_fadetime, gensym("fadetime"), A_FLOAT, 0);
+    class_addmethod(oscil_class, (t_method)oscil_harmcount, gensym("harmcount"), A_FLOAT, 0);
+    class_addmethod(oscil_class, (t_method)oscil_interpolate, gensym("interpolate"), A_FLOAT, 0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+
+void oscil_list (t_oscil *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	short i;
+	int harmonic_count = 0;
+	float *harmonic_weights = x->harmonic_weights;
+	for (i=0; i < argc; i++) {
+		harmonic_weights[harmonic_count] = atom_getfloatarg(i, argc, argv);
+		++harmonic_count;
+	}
+	x->harmonic_count = harmonic_count ;
+	build_waveform(x);
+}
+
+void oscil_amph(t_oscil *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	short i;
+	int harmonic_count = 0;
+	float *harmonic_weights = x->harmonic_weights;
+	float *harmonic_phases = x->harmonic_phases;
+	if(argc < 1){
+		return;
+	}
+	/* DC */
+	harmonic_weights[0] = atom_getfloatarg(0, argc, argv);
+	harmonic_phases[0] = 0;
+	
+	harmonic_count = 1;
+	for (i=1; i < argc; i += 2) {
+		harmonic_weights[harmonic_count] = atom_getfloatarg(i, argc, argv);
+		harmonic_phases[harmonic_count] = atom_getfloatarg(i+1, argc, argv);
+		++harmonic_count;
+	}
+	x->harmonic_count = harmonic_count ;
+	build_amph_waveform(x);
+}
+
+
+void oscil_fadetime (t_oscil *x, t_floatarg fade_ms)
+{
+	if(x->fade_countdown) {
+		error("oscil: crossfade in progress, cannot update fade time");
+		return;
+	}
+	if( fade_ms < 0.0 || fade_ms > 60000.0 ){
+		error("%s: %f is not a good fade time",OBJECT_NAME, fade_ms);
+		fade_ms = 50.;
+	}
+	x->fade_ms = fade_ms;
+	x->fade_samples = x->fade_ms * x->sr / 1000.0 ;
+}
+
+void oscil_fadetype(t_oscil *x, t_floatarg ftype)
+{
+    
+	if( ftype < 0 || ftype > 2 ) {
+		error("%s: unknown type of fade, selecting no fade",OBJECT_NAME);
+		ftype = 0;
+	}
+	x->fadetype = ftype;
+}
+
+void oscil_harmcount(t_oscil *x, t_floatarg harms)
+{
+    
+	if( harms < 1 || harms > OSCIL_MAXIMUM_HARMONICS-1) {
+		error("%d is out of range and must be between 1 to %d", harms,OSCIL_MAXIMUM_HARMONICS-1 );
+		return;
+	}
+	x->bl_harms = harms + 1;
+}
+
+void oscil_mute(t_oscil *x, t_floatarg flag)
+{
+	x->mute = (short)flag;
+}
+
+void oscil_interpolate(t_oscil *x, t_floatarg flag)
+{
+	x->interpolate = (short)flag;
+    //	post("must toggle DACs for this synthesis method");
+}
+
+
+void *oscil_new(t_symbol *s, short argc, t_atom *argv)
+{
+	float init_freq;
+	t_symbol *init_waveform_symbol;
+
+    t_oscil *x = (t_oscil *)pd_new(oscil_class);
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("signal"), gensym("signal") );
+    outlet_new(&x->x_obj, gensym("signal") );
+    
+    /*
+     SET DEFAULTS IN ADVANCE
+     added 4.14.2003
+     */
+    
+    init_freq = OSCIL_INIT_FREQ;
+    x->table_length = OSCIL_DEFAULT_FLEN;
+    init_waveform_symbol = gensym(OSCIL_DEFAULT_WAVEFORM);
+    x->bl_harms = OSCIL_DEFAULT_HARMONICS;
+    x->table_length = OSCIL_DEFAULT_FLEN ;
+    x->phase_offset = 0.0;
+    x->interpolate = 0;
+    
+    if( argc > 0 ){
+        init_freq = atom_getfloatarg(0, argc, argv);
+        if( ! init_freq ){
+            error("%s: zero initial frequency, resetting to 440",OBJECT_NAME);
+            init_freq = 440 ;
+        }
+        
+    }
+    if( argc > 1 ){
+        x->table_length = atom_getfloatarg(1, argc, argv);
+        //    post("table length is %d", x->table_length );
+    }
+    if( argc > 2 ){
+        init_waveform_symbol = atom_getsymbolarg(2, argc, argv);
+    } else {
+        init_waveform_symbol = gensym( OSCIL_DEFAULT_WAVEFORM );
+        
+    }
+    
+    if( argc > 3 ) {
+        x->bl_harms = atom_getfloatarg(3, argc, argv);
+        if( x->bl_harms > 1024 ){
+            error("%s: too many harmonics - limit is 1024",OBJECT_NAME);
+            x->bl_harms = 1024;
+        }
+    }
+    else {
+        x->bl_harms = OSCIL_DEFAULT_HARMONICS ;
+    }
+    
+    if( x->table_length < 4 ){
+        x->table_length = OSCIL_DEFAULT_FLEN ;
+    }
+    if( x->table_length > OSCIL_MAX_FLEN ){
+        x->table_length = OSCIL_MAX_FLEN;
+        error("%s: Exceeded maximum - setting function length to %d",OBJECT_NAME,OSCIL_MAX_FLEN);
+    } if( x->bl_harms < 1 || x->bl_harms > OSCIL_MAXIMUM_HARMONICS ){
+        x->bl_harms = OSCIL_DEFAULT_HARMONICS ;
+        error("%s: Bad parameters. Bandlimited waveforms will have %d partials.",
+              OBJECT_NAME,OSCIL_DEFAULT_HARMONICS);
+    }
+    
+    
+	x->fade_in_progress = 0;
+    
+	x->bl_harms = x->bl_harms + 1;
+	x->piotwo = 2. * atan(1.0);
+	x->twopi = 8.0 * atan(1.0);
+    
+	
+	x->old_wavetable = (float *) t_getbytes( x->table_length * sizeof(float) );
+    
+	x->wavetable = (float *) t_getbytes( x->table_length * sizeof(float) );
+	x->harmonic_weights = (float *) t_getbytes( OSCIL_MAXIMUM_HARMONICS * sizeof(float) );
+	x->harmonic_phases = (float *) t_getbytes( OSCIL_MAXIMUM_HARMONICS * sizeof(float) );
+	x->phase = 0;
+	x->mute = 0;
+	x->dirty = 0;
+	x->sr = sys_getsr();
+	if( ! x->sr ){
+		x->sr = 44100;
+		error("zero sampling rate - set to 44100");
+	}
+	x->si_factor = (float) x->table_length / x->sr;
+	x->si = init_freq * x->si_factor ;
+	x->fade_countdown = 0;
+	x->fade_ms = 50. ;
+	x->fade_samples = x->fade_ms * x->sr / 1000.0 ;
+	x->fadetype = OSCIL_LINEAR;
+    
+	x->firsttime = 1;
+	
+	if (init_waveform_symbol == gensym("triangle")) {
+		oscil_triangle( x );
+	} else if (init_waveform_symbol == gensym("square")) {
+		oscil_square( x );
+	} else if (init_waveform_symbol == gensym("sawtooth")) {
+		oscil_sawtooth( x );
+	} else if (init_waveform_symbol == gensym("buzz")) {
+		oscil_buzz( x );
+	} else { // default to sine wave
+		oscil_sine( x );
+	}
+    
+	x->firsttime = 0;
+    
+	// post("Additive synthesis oscil [4.14.2003a] (as described in Audio Programming)");
+    
+    return (x);
+}
+
+void build_amph_waveform( t_oscil *x )
+{
+	float rescale;
+	int i, j;
+	float max = 0.0;
+	float *wavetable = x->wavetable;
+	float *old_wavetable = x->old_wavetable;
+	float *harmonic_weights = x->harmonic_weights;
+	float *harmonic_phases = x->harmonic_phases;
+	int harmonic_count = x->harmonic_count;
+	int table_length = x->table_length;
+	float twopi = x->twopi;
+    //	float testsum = 0.0;
+	float addphase;
+    
+	if( x->fade_in_progress ){
+		// error("Crossfade in progress. Cannot generate waveform");
+		// do not use because this will happen too often
+		return;
+	}
+	
+    
+	if( harmonic_count < 1 ){
+		error("%s: no harmonics specified, waveform not created.",OBJECT_NAME);
+		return;
+	}
+	
+	if( x->fadetype && ! x->firsttime ){
+		x->fade_countdown = x->fade_samples;
+		x->fade_in_progress = 1;
+	}
+	/*
+     for( i = 0; i < table_length ; i++ ){
+     old_wavetable[i] = wavetable[i];
+     }
+     */
+	memcpy(old_wavetable, wavetable, table_length * sizeof(float) );
+    
+	x->dirty = 1 ;
+	
+	// add DC in directly (usually 0.0)
+	for( i = 0; i < table_length; i++ ){
+		wavetable[i] = harmonic_weights[0];
+	}
+	// sum all specified harmonics
+	for( i = 1 ; i < harmonic_count; i++ ){
+		if( harmonic_weights[i] ){
+			addphase = twopi * harmonic_phases[i];
+            //			post("amp %f phase %f twopi phase %f",harmonic_weights[i],harmonic_phases[i],addphase);
+			for( j = 0; j < table_length; j++ ){
+				wavetable[j] +=
+                harmonic_weights[i] * sin( twopi * ((float)i * ((float)j/(float)table_length)) + addphase ) ;
+			}
+		}
+	}
+	// determine maximum amplitude.
+	max = 0;
+	for( j = 0; j < table_length; j++ ){
+		if( max < fabs(wavetable[j]) ){
+			max = fabs(wavetable[j]) ;
+		}
+	}
+	// restore last table
+	if( max == 0.0 ){
+		for( j = 0; j < table_length; j++ ){
+			wavetable[j] = old_wavetable[j];
+		}
+		error("all zero function ignored");
+		x->dirty = 0;
+		return;
+	}
+	// normalize waveform to maximum amplitude of 1.0
+	rescale = 1.0 / max ;
+    
+	for( j = 0; j < table_length; j++ ){
+		wavetable[j] *= rescale ;
+	}
+	x->dirty = 0;
+}
+
+void build_waveform( t_oscil *x ) {
+	float rescale;
+	int i, j;
+	float max = 0.0;
+	float *wavetable = x->wavetable;
+	float *old_wavetable = x->old_wavetable;
+	float *harmonic_weights = x->harmonic_weights;
+	int harmonic_count = x->harmonic_count;
+	int table_length = x->table_length;
+	float twopi = x->twopi;
+    //	float testsum = 0.0;
+    
+	if( x->fade_in_progress ){
+		// error("Crossfade in progress. Cannot generate waveform");
+		// do not use because this will happen too often
+		return;
+	}
+	
+    
+	if( harmonic_count < 1 ){
+		error("no harmonics specified, waveform not created.");
+		return;
+	}
+	
+	if( x->fadetype && ! x->firsttime ){
+		x->fade_countdown = x->fade_samples;
+		x->fade_in_progress = 1;
+	}
+	/*
+     for( i = 0; i < table_length ; i++ ){
+     old_wavetable[i] = wavetable[i];
+     }
+     */
+	memcpy(old_wavetable, wavetable, table_length * sizeof(float) );
+	
+	x->dirty = 1 ;
+	
+	// add DC in directly (usually 0.0)
+	for( i = 0; i < table_length; i++ ){
+		wavetable[i] = harmonic_weights[0];
+	}
+	// sum all specified harmonics
+	for( i = 1 ; i < harmonic_count; i++ ){
+		if( harmonic_weights[i] ){
+			for( j = 0; j < table_length; j++ ){
+				wavetable[j] += harmonic_weights[i] * sin( twopi * ( (float) i * ((float) j /(float)table_length)) ) ;
+			}
+		}
+	}
+	// determine maximum amplitude. Since waveform is symmetric, we could only look for positive maximum.
+	max = 0;
+	for( j = 0; j < table_length; j++ ){
+		if( max < fabs(wavetable[j]) ){
+			max = fabs(wavetable[j]) ;
+		}
+	}
+	// restore last table
+	if( max == 0.0 ){
+		for( j = 0; j < table_length; j++ ){	// could use memcpy here
+			wavetable[j] = old_wavetable[j];
+		}
+		error("all zero function ignored");
+		x->dirty = 0;
+		return;
+	}
+	// normalize waveform to maximum amplitude of 1.0
+	rescale = 1.0 / max ;
+    
+	for( j = 0; j < table_length; j++ ){
+		wavetable[j] *= rescale ;
+	}
+	x->dirty = 0;
+}
+
+// interpolation
+t_int *oscil_perform_interpolate(t_int *w)
+{
+	t_oscil *x = (t_oscil *) (w[1]);
+	t_float *freq_vec = (t_float *)(w[2]);
+	t_float *phase_vec = (t_float *)(w[3]);
+	t_float *out = (t_float *)(w[4]);
+	int n = (int) w[5];
+    
+	double si_factor = x->si_factor;
+	double si = x->si ;
+	double phase = x->phase;
+	double phase_offset = x->phase_offset;
+	int table_length = x->table_length;
+	float *wavetable = x->wavetable;
+	float *old_wavetable = x->old_wavetable;
+	short *connected = x->connected ;
+	int fade_countdown = x->fade_countdown;
+	int iphase, iphase2;
+	int fade_samples = x->fade_samples;
+	short fadetype = x->fadetype;
+	float m1, m2;
+	float frac;
+	double fphase;
+	float sample1, sample2, outsamp1, outsamp2;
+	
+	float piotwo = x->piotwo;
+	
+	if( x->mute ){
+		while (n--) {
+			*out++ = 0.0;
+		}
+		return (w+6);
+	}
+	/* interpolated loop */
+	if(x->interpolate){
+		while (n--) {
+			if(connected[0])
+				si = *freq_vec++ * si_factor;
+			
+			if(connected[1]){
+				phase_offset = (float)table_length * *phase_vec++;
+                
+			}
+            
+			fphase = (phase + phase_offset);
+			while( fphase >= table_length ) {
+				fphase -= table_length;
+			}
+			while( fphase < 0 ) {
+				fphase += table_length;
+			}
+			
+			iphase = floor(fphase);
+			iphase2 = (iphase+1)%table_length ;
+			frac = fphase - iphase;
+			
+			
+			if( x->dirty ){
+				sample1 = old_wavetable[ iphase ];
+				sample2 = old_wavetable[ iphase2 ];
+				*out++ = sample1 + frac * (sample2 - sample1);
+			}
+			else if( fade_countdown ){
+                
+				sample1 = wavetable[ iphase ];
+				sample2 = wavetable[ iphase2 ];
+				outsamp1 = sample1 + frac * (sample2 - sample1);
+                
+				sample1 = old_wavetable[ iphase ];
+				sample2 = old_wavetable[ iphase2 ];
+				outsamp2 = sample1 + frac * (sample2 - sample1);
+                
+				m2 = (float) fade_countdown / (float) fade_samples ;
+				m1 = 1.0 - m2 ;
+				--fade_countdown;
+				if( fadetype == 1 ){
+					*out++ = m1 * outsamp1 + m2 * outsamp2 ;
+				}
+				else if( fadetype == 2 ) {
+					m1 *= piotwo;
+					*out++ = sin(m1) * outsamp1 + cos(m1) * outsamp2;
+				}
+			} else {
+				sample1 = wavetable[ iphase ];
+				sample2 = wavetable[ iphase2 ];
+				*out++ = sample1 + frac * (sample2 - sample1) ;
+			}
+            
+            
+			phase += si;
+			while( phase >= table_length ) {
+				phase -= table_length ;
+			}
+			while( phase < 0 ) {
+				phase += table_length ;
+			}
+            
+		}
+	}
+    
+    /* non-interpolated loop */
+	else {
+		while (n--) {
+			if(connected[0])
+				si = *freq_vec++ * si_factor;
+			
+			if(connected[1]){
+				phase_offset = (float)table_length * *phase_vec++;
+                
+			}
+            
+			iphase = (int)(phase + phase_offset);
+			while( iphase >= table_length ) {
+				iphase -= table_length;
+			}
+			while( iphase < 0 ) {
+				iphase += table_length;
+			}
+			
+			if( x->dirty ){
+				*out++ = old_wavetable[ iphase ] ;
+			}
+			else if( fade_countdown ){
+				m2 = (float) fade_countdown / (float) fade_samples ;
+				m1 = 1.0 - m2 ;
+				--fade_countdown;
+				if( fadetype == 1 ){
+					*out++ = m1 * wavetable[iphase] + m2 * old_wavetable[ iphase ] ;
+				}
+				else if( fadetype == 2 ) {
+					m1 *= piotwo;
+					*out++ = sin(m1) * wavetable[iphase] + cos(m1) * old_wavetable[ iphase ] ;
+				}
+			} else {
+				*out++ = wavetable[ iphase ] ;
+			}
+            
+            
+			phase += si;
+			while( phase >= table_length ) {
+				phase -= table_length ;
+			}
+			while( phase < 0 ) {
+				phase += table_length ;
+			}
+            
+		}
+	}
+    
+	if( ! fade_countdown ){
+		x->fade_in_progress = 0;
+	}
+	x->fade_countdown = fade_countdown;
+    x->phase = phase;
+    x->phase_offset = phase_offset;
+	return (w+6);
+}
+
+
+static t_int *oscil_perform(t_int *w)
+{
+	t_oscil *x = (t_oscil *) (w[1]);
+	t_float *freq_vec = (t_float *)(w[2]);
+	t_float *phase_vec = (t_float *)(w[3]);
+	t_float *out = (t_float *)(w[4]);
+	int n = (int) w[5];
+    
+	double si_factor = x->si_factor;
+	double si = x->si ;
+	double phase = x->phase;
+	double phase_offset = x->phase_offset;
+	int table_length = x->table_length;
+	float *wavetable = x->wavetable;
+	float *old_wavetable = x->old_wavetable;
+	short *connected = x->connected ;
+	int fade_countdown = x->fade_countdown;
+	int iphase;
+	int fade_samples = x->fade_samples;
+	short fadetype = x->fadetype;
+	float m1, m2;
+	float piotwo = x->piotwo;
+	
+	if( x->mute ){
+		while (n--) {
+			*out++ = 0.0;
+		}
+		return (w+6);
+	}
+	
+	while (n--) {
+		if(connected[0])
+			si = *freq_vec++ * si_factor;
+		
+		if(connected[1]){
+			phase_offset = (float)table_length * *phase_vec++;
+            
+		}
+        
+		iphase = (int)(phase + phase_offset);
+		while( iphase >= table_length ) {
+			iphase -= table_length;
+		}
+		while( iphase < 0 ) {
+			iphase += table_length;
+		}
+		
+		if( x->dirty ){
+			*out++ = old_wavetable[ iphase ] ;
+		}
+		else if( fade_countdown ){
+			m2 = (float) fade_countdown / (float) fade_samples ;
+			m1 = 1.0 - m2 ;
+			--fade_countdown;
+			if( fadetype == 1 ){
+				*out++ = m1 * wavetable[iphase] + m2 * old_wavetable[ iphase ] ;
+			}
+			else if( fadetype == 2 ) {
+				m1 *= piotwo;
+				*out++ = sin(m1) * wavetable[iphase] + cos(m1) * old_wavetable[ iphase ] ;
+			}
+		} else {
+			*out++ = wavetable[ iphase ] ;
+		}
+        
+        
+		phase += si;
+		while( phase >= table_length ) {
+			phase -= table_length ;
+		}
+		while( phase < 0 ) {
+			phase += table_length ;
+		}
+        
+	}
+	if( ! fade_countdown ){
+		x->fade_in_progress = 0;
+	}
+	x->fade_countdown = fade_countdown;
+    x->phase = phase;
+    x->phase_offset = phase_offset;
+	return (w+6);
+}
+
+void oscil_sawtooth(t_oscil *x)
+{
+    int i;
+    float sign = 1.0;
+    
+	x->harmonic_weights[0] = 0.0; // DC
+	x->harmonic_count = x->bl_harms;
+	for( i = 1 ; i < x->bl_harms; i++ ){
+		x->harmonic_weights[i] = sign * 1.0/(float)i;
+		sign *= -1. ;
+	}
+	build_waveform(x);
+}
+void oscil_triangle(t_oscil *x)
+{
+    int i;
+    float sign = 1.0;
+	x->harmonic_weights[0] = 0.0; // DC
+	x->harmonic_count = x->bl_harms;
+	for( i = 1 ; i < x->bl_harms; i += 2 ){
+		x->harmonic_weights[i] = sign * 1.0/((float)i * (float)i);
+		x->harmonic_weights[i + 1] = 0.0;
+		sign *= -1;
+	}
+	build_waveform(x);
+}
+
+void oscil_sine(t_oscil *x)
+{
+	x->harmonic_weights[0] = 0.0;
+	x->harmonic_weights[1] = 1.0;
+	x->harmonic_count = 2;
+	build_waveform(x);
+}
+
+void oscil_square(t_oscil *x)
+{
+    int i;
+	x->harmonic_weights[0] = 0.0; // DC
+	x->harmonic_count = x->bl_harms;
+	for( i = 1 ; i < x->bl_harms  ; i += 2 ){
+		x->harmonic_weights[i] = 1.0/(float)i;
+		x->harmonic_weights[i + 1] = 0.0;
+	}
+	build_waveform(x);
+}
+
+void oscil_buzz(t_oscil *x)
+{
+    int i;
+	x->harmonic_weights[0] = 0.0;
+	x->harmonic_count = x->bl_harms;
+	for( i = 1 ; i < x->bl_harms; i++ ){
+		x->harmonic_weights[i] = 1.0;
+	}
+	build_waveform(x);
+}
+
+void oscil_dsp_free(t_oscil *x)
+{
+
+	t_freebytes(x->wavetable, x->table_length * sizeof(float));
+	t_freebytes(x->old_wavetable, x->table_length * sizeof(float));
+	t_freebytes(x->harmonic_weights, OSCIL_MAXIMUM_HARMONICS * sizeof(float));
+	t_freebytes(x->harmonic_phases, OSCIL_MAXIMUM_HARMONICS * sizeof(float));
+}
+
+void oscil_dsp(t_oscil *x, t_signal **sp)
+{
+	if(! x->sr ){
+		x->sr = 44100;
+	}
+	if( x->sr != sp[0]->s_sr ){
+		if(! sp[0]->s_sr){
+			error("oscil~: Zero sampling rate reported!");
+			return;
+		}
+		x->si *= sp[0]->s_sr / x->sr ;
+		x->sr = sp[0]->s_sr;
+		x->si_factor = (float) x->table_length / x->sr;	
+	}
+
+	x->connected[0] = 1;
+	x->connected[1] = 1; 
+
+	x->phase = 0.0;
+    
+	dsp_add(oscil_perform_interpolate, 5, x, 
+			sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
+    
+	
+}
+
diff --git a/externals/lyonpotpourri/overlapadd.c b/externals/lyonpotpourri/overlapadd.c
new file mode 100755
index 0000000000000000000000000000000000000000..beab0e0913ec1bc57e53d8ed387b4abba2a414cb
--- /dev/null
+++ b/externals/lyonpotpourri/overlapadd.c
@@ -0,0 +1 @@
+/*
 * input I is a folded spectrum of length N; output O and
 * synthesis window W are of length Nw--overlap-add windowed,
 * unrotated, unfolded input data into output O
 */

#include "fftease.h"

void overlapadd( float *I, int N, float *W, float *O, int Nw, int n )

{
 int i ;
    while ( n < 0 )
	n += N ;
    n %= N ;
    for ( i = 0 ; i < Nw ; i++ ) {
	O[i] += I[n]*W[i] ;
	if ( ++n == N )
	    n = 0 ;
    }
}
\ No newline at end of file
diff --git a/externals/lyonpotpourri/pd-template.spec b/externals/lyonpotpourri/pd-template.spec
new file mode 100755
index 0000000000000000000000000000000000000000..ce9b1b8dc5c61d931b3d602c701922616ff4e728
--- /dev/null
+++ b/externals/lyonpotpourri/pd-template.spec
@@ -0,0 +1,29 @@
+# This is a sample spec file for packaging Pd libraries
+
+#%define _topdir	 	/home/strike/mywget
+%define name		template 
+%define release		1
+%define version 	0.1
+%define buildroot %{_topdir}/%{name}-%{version}-root
+
+BuildRoot:	%{buildroot}
+Summary: 		replace me with a summary of your library
+License: 		GPL
+Name: 			%{name}
+Version: 		%{version}
+Release: 		%{release}
+Source: 		%{name}-%{version}.tar.gz
+Prefix: 		/usr
+Group: 			Development/Tools
+
+%description
+Replace me with a description of your library.
+
+%prep
+%setup -q
+
+%build
+make
+
+%install
+make install prefix=$RPM_BUILD_ROOT/usr
diff --git a/externals/lyonpotpourri/phasemod~-help.pd b/externals/lyonpotpourri/phasemod~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..b66561f4799cdf2adcd8505012811a062b8d49d3
--- /dev/null
+++ b/externals/lyonpotpourri/phasemod~-help.pd
@@ -0,0 +1,105 @@
+#N canvas 472 143 283 364 10;
+#X obj 18 113 phasemod~;
+#X obj 18 216 dac~;
+#X floatatom 18 87 5 0 0 2 freq frequency -, f 5;
+#X floatatom 78 86 5 0 0 2 phase phase -, f 5;
+#X obj 18 250 hsl 128 15 50 700 0 0 frequency phasemod-freq-in frequency
+-2 -6 0 8 -262017 -1 -1 2188 1;
+#X obj 19 280 hsl 128 15 0 30 0 0 phase phasemod-phase-in phase -2
+-6 0 8 -262017 -1 -1 6350 1;
+#X floatatom 73 184 5 0 0 2 gain phasemod-gain -, f 5;
+#N canvas 826 370 454 304 scope 0;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array phasemod-scope 441 float 3;
+#A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0.000191748 0.000191748 0.000191748 0.000191748 0.000191748
+0.000191748 0.000191748 0.000191748 0.000191748 0.000191748 0.000191748
+0.000191748 0.000383495 0.000383495 0.000383495 0.000383495 0.000383495
+0.000383495 0.000383495 0.000383495 0.000575243 0.000575243 0.000575243
+0.000575243 0.000575243 0.00076699 0.00076699 0.00076699 0.00076699
+0.000958738 0.000958738 0.000958738 0.00115049 0.00115049 0.00115049
+0.00134223 0.00134223 0.00153398 0.00153398 0.00172573 0.00172573 0.00191747
+0.00191747 0.00210922 0.00210922 0.00230097 0.00249272 0.00268446 0.00268446
+0.00287621 0.00306796 0.0032597 0.00345145 0.0036432 0.00383494 0.00402669
+0.00441018 0.00460193 0.00479367 0.00517716 0.00536891 0.0057524 0.00613588
+0.00632763 0.00671112 0.0070946 0.00766983 0.00805331 0.00843679 0.00901202
+0.00939549 0.00997071 0.0105459 0.0111211 0.0118881 0.0124633 0.0132302
+0.0139971 0.014764 0.0155309 0.0164895 0.0174481 0.0184067 0.019557
+0.0205156 0.0218575 0.0230077 0.0243495 0.0256914 0.0272248 0.0287582
+0.0302915 0.0320164 0.0339328 0.0358491 0.0377653 0.0400645 0.0423635
+0.0446623 0.0471524 0.0498337 0.0527062 0.0557696 0.0588325 0.0622776
+0.065722 0.0693569 0.0733733 0.0775797 0.0819759 0.0865614 0.0915271
+0.0966813 0.102024 0.107935 0.113842 0.120317 0.127167 0.134391 0.141797
+0.149765 0.15829 0.167182 0.176627 0.186432 0.196783 0.207862 0.219475
+0.231618 0.244468 0.258016 0.272437 0.287347 0.303103 0.319684 0.33707
+0.355418 0.37452 0.394697 0.415732 0.437582 0.460539 0.484534 0.509325
+0.53516 0.561931 0.589521 0.617949 0.6472 0.677081 0.707513 0.738241
+0.769103 0.799998 0.830403 0.859988 0.888433 0.91514 0.939591 0.960963
+0.978634 0.991561 0.998833 0.999279 0.991685 0.974726 0.946971 0.907
+0.853461 0.784913 0.700158 0.598622 0.479494 0.343381 0.191139 0.025308
+-0.150712 -0.331287 -0.509655 -0.676516 -0.820993 -0.930486 -0.991636
+-0.991536 -0.91934 -0.76849 -0.539849 -0.244096 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0.000191748 0.000191748 0.000191748 0.000191748 0.000191748
+0.000191748 0.000191748 0.000191748 0.000191748 0.000191748 0.000191748
+0.000191748 0.000383495 0.000383495 0.000383495 0.000383495 0.000383495
+0.000383495 0.000383495 0.000383495 0.000575243 0.000575243 0.000575243
+0.000575243 0.000575243 0.00076699 0.00076699 0.00076699 0.00076699
+0.000958738 0.000958738 0.000958738 0.00115049 0.00115049 0.00115049
+0.00134223 0.00134223 0.00134223 0.00153398 0.00153398 0.00172573 0.00172573
+0.00191747 0.00210922 0.00210922 0.00230097 0.00249272 0.00249272 0.00268446
+0.00287621 0.00306796 0.0032597 0.00345145 0.0036432 0.00383494 0.00402669
+0.00421843 0.00460193 0.00479367 0.00498542 0.00536891 0.00556065 0.00594414
+0.00632763 0.00671112 0.0070946 0.00747809 0.00786157 0.00843679 0.00882027
+0.00939549 0.00997071 0.0103542 0.0111211 0.0116963 0.0122715 0.0130385
+0.0138054 0.0145723 0.0153392 0.0162978 0.0172564 0.018215 0.0191736
+0.0203238 0.0214741 0.0226243 0.0239662 0.025308 0.0268414 0.0283748
+0.0299082 0.0316331 0.0333579 0.0352742 0.0373821 0.0394897 0.0417888
+;
+#X coords 0 1 440 -1 200 140 1;
+#X restore 37 20 graph;
+#X obj 69 246 tabwrite~ phasemod-scope;
+#X obj 69 193 inlet~;
+#X obj 130 216 metro 100;
+#X obj 130 197 tgl 15 0 empty phasemod-scope-tog empty 17 7 0 10 -262144
+-1 -1 1 1;
+#X text 154 201 turn on scope;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 3 0;
+#X restore 43 137 pd scope;
+#X obj 9 7 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 13 43 phasemod~ - a phase-modulated sinusoid;
+#N canvas 0 22 450 300 initialize 0;
+#X msg 75 106 162;
+#X msg 77 136 15;
+#X obj 31 73 loadbang;
+#X obj 127 124 s phasemod-freq-in;
+#X obj 119 168 s phasemod-phase-in;
+#X msg 97 212 0.1;
+#X obj 135 243 s phasemod-gain-in;
+#X msg 60 268 1;
+#X obj 131 278 s phasemod-scope-tog;
+#X connect 0 0 3 0;
+#X connect 1 0 4 0;
+#X connect 2 0 0 0;
+#X connect 2 0 1 0;
+#X connect 2 0 5 0;
+#X connect 2 0 7 0;
+#X connect 5 0 6 0;
+#X connect 7 0 8 0;
+#X restore 157 252 pd initialize;
+#X obj 19 311 hsl 128 15 0 1 0 0 phasemod-gain phasemod-gain-in gain
+-2 -6 0 8 -262017 -1 -1 1270 1;
+#X text 112 133 <- look at waveform;
+#X obj 18 182 *~ 0.03;
+#X connect 0 0 7 0;
+#X connect 0 0 13 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 1;
+#X connect 6 0 13 1;
+#X connect 13 0 1 0;
+#X connect 13 0 1 1;
diff --git a/externals/lyonpotpourri/phasemod~.c b/externals/lyonpotpourri/phasemod~.c
new file mode 100755
index 0000000000000000000000000000000000000000..2bcb54c1b45372c57512d5139e22887f37887e5e
--- /dev/null
+++ b/externals/lyonpotpourri/phasemod~.c
@@ -0,0 +1,167 @@
+#include "MSPd.h"
+#define FUNC_LEN (32768)
+#define OBJECT_NAME "phasemod~"
+
+
+static t_class *phasemod_class;
+
+
+typedef struct _phasemod
+{
+    
+    t_object x_obj;
+    float x_f;
+    t_float x_val;
+    float mygain;
+    float *wavetab;
+	float phs;
+	float bendphs;
+	float frequency;
+	float alpha;
+	short mute;
+	short connections[4];
+	float si_fac;
+	float sr;
+} t_phasemod;
+
+void *phasemod_new(t_symbol *s, int argc, t_atom *argv);
+t_int *offset_perform(t_int *w);
+t_int *phasemod_perform(t_int *w);
+void phasemod_float(t_phasemod *x, double f);
+void phasemod_int(t_phasemod *x, long n);
+void phasemod_mute(t_phasemod *x, t_floatarg toggle);
+void phasemod_dsp(t_phasemod *x, t_signal **sp);
+void phasemod_dsp_free(t_phasemod *x);
+
+void phasemod_tilde_setup(void){
+    phasemod_class = class_new(gensym("phasemod~"), (t_newmethod)phasemod_new,
+                               (t_method)phasemod_dsp_free,sizeof(t_phasemod), 0,A_GIMME,0);
+    CLASS_MAINSIGNALIN(phasemod_class, t_phasemod, x_f);
+    class_addmethod(phasemod_class,(t_method)phasemod_dsp,gensym("dsp"),0);
+    class_addmethod(phasemod_class,(t_method)phasemod_mute,gensym("mute"),A_FLOAT,0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+void phasemod_dsp_free( t_phasemod *x )
+{
+    free(x->wavetab);
+}
+
+void phasemod_mute(t_phasemod *x, t_floatarg toggle)
+{
+	x->mute = toggle;
+}
+void phasemod_assist (t_phasemod *x, void *b, long msg, long arg, char *dst)
+{
+	if (msg==1) {
+		switch (arg) {
+			case 0:
+				sprintf(dst,"(signal/float) Frequency ");
+				break;
+			case 1:
+				sprintf(dst,"(signal/float) Slope Factor ");
+				break;
+		}
+	} else if (msg==2) {
+		sprintf(dst,"(signal) Output ");
+	}
+}
+
+void *phasemod_new(t_symbol *s, int argc, t_atom *argv)
+{
+  	int i;
+    t_phasemod *x = (t_phasemod *)pd_new(phasemod_class);
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+    x->phs = 0;
+  	x->mute = 0;
+    x->frequency = 440.0;
+	
+    x->wavetab = (float *) calloc(FUNC_LEN, sizeof(float) );
+    for( i = 0 ; i < FUNC_LEN; i++ ) {
+    	x->wavetab[i] = sin( TWOPI * ((float)i/(float) FUNC_LEN)) ;
+    }
+    x->bendphs = 0;
+    x->sr = sys_getsr();
+    if(!x->sr)
+        x->sr = 44100.0;
+    x->si_fac = 1.0/x->sr;
+    return (x);
+}
+
+t_int *phasemod_perform(t_int *w)
+{
+    
+	float phs;
+	
+	t_phasemod *x = (t_phasemod *) (w[1]);
+	t_float *frequency_vec = (t_float *)(w[2]);
+	t_float *alpha_vec = (t_float *)(w[3]);
+	t_float *out = (t_float *)(w[4]);
+	int n = (int) w[5];
+	
+	short *connections = x->connections;
+	float bendphs = x->bendphs;
+	float *wavetab = x->wavetab;
+	float si_fac = x->si_fac;
+	
+	float incr = x->frequency * si_fac ;
+	float alpha = x->alpha;
+	
+	if( x->mute ){
+		while(n--){
+			*out++ = 0.0;
+		}
+		return (w + 6);
+	}
+	
+	while (n--) {
+		if( connections[1] ){
+			alpha = *alpha_vec++;
+		}
+		if( alpha == 0 ){
+			alpha = .000001;
+		}
+		
+		if( connections[0] ){
+			incr = *frequency_vec++ * si_fac ;
+		}
+		// NO NEGATIVE FREQUENCIES
+		if( incr < 0 )
+			incr = -incr;
+        
+		bendphs += incr ;
+		while( bendphs > 1.0 )
+			bendphs -= 1.0 ;
+        phs =   FUNC_LEN * ( (1 - exp(bendphs * alpha))/(1 - exp(alpha))  );
+        
+		while( phs < 0.0 ) {
+			phs += FUNC_LEN;
+		}
+		while( phs >= FUNC_LEN ){
+			phs -= FUNC_LEN;
+		}
+		*out++ =  wavetab[(int) phs] ;
+	}
+    
+	x->bendphs = bendphs;
+	return (w+6);
+}
+
+void phasemod_dsp(t_phasemod *x, t_signal **sp)
+{
+
+	x->connections[0] = 1;
+	x->connections[1] = 1;
+    
+	if(x->sr != sp[0]->s_sr){
+		if(!sp[0]->s_sr){
+			error("zero sampling rate");
+			return;
+		}
+		x->sr = sp[0]->s_sr;
+		x->si_fac = 1.0/x->sr;
+	}
+	dsp_add(phasemod_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec,  sp[0]->s_n);
+}
+
diff --git a/externals/lyonpotpourri/player~-help.pd b/externals/lyonpotpourri/player~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..b18b66b7909b21bc9452fd26fbdc8af1f1a87b8f
--- /dev/null
+++ b/externals/lyonpotpourri/player~-help.pd
@@ -0,0 +1,129 @@
+#N canvas 428 168 584 467 10;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array sf4player 14274 float 2;
+#X coords 0 1 14274 -1 200 140 1;
+#X restore 358 63 graph;
+#X obj 26 344 dac~;
+#N canvas 113 308 712 535 load-a-sound 0;
+#X obj 49 170 soundfiler;
+#X obj 49 119 openpanel;
+#X obj 49 92 inlet;
+#X msg 49 142 read -resize \$1 sf4player;
+#X msg 339 115 read -resize sound/bell.aiff sf4player;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X restore 133 390 pd load-a-sound;
+#X obj 133 333 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 286 190 5 0 0 0 - increment -, f 5;
+#X obj 266 424 hsl 128 15 -2 2 0 0 increment empty increment -2 -6
+0 10 -143299 -1 -1 1800 1;
+#N canvas 144 217 774 527 triggers 0;
+#X obj 93 107 samm~ 60 1;
+#X msg 93 79 mute \$1;
+#X obj 93 46 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 36 253 outlet~;
+#X msg 208 113 bang;
+#X msg 205 72 tempo \$1;
+#X floatatom 205 52 5 0 0 0 - - -, f 5;
+#X obj 208 25 hsl 128 15 20 200 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X text 244 115 manual play;
+#X text 111 48 stop metro;
+#X obj 169 250 loadbang;
+#X msg 169 274 1;
+#X obj 169 296 s increment;
+#X obj 353 344 outlet~;
+#X obj 353 283 clickhold~;
+#X obj 37 185 mask~ 1 0.7 0.5 0.3 0.1;
+#X obj 353 228 mask~ 1 3 2 4;
+#X obj 208 138 click~;
+#X connect 0 0 15 0;
+#X connect 0 0 16 0;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 4 0 17 0;
+#X connect 5 0 0 0;
+#X connect 6 0 5 0;
+#X connect 7 0 6 0;
+#X connect 10 0 11 0;
+#X connect 11 0 12 0;
+#X connect 14 0 13 0;
+#X connect 15 0 3 0;
+#X connect 16 0 14 0;
+#X connect 17 0 3 0;
+#X restore 58 181 pd triggers;
+#X msg 26 161 static_increment \$1;
+#X obj 26 134 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#N canvas 184 101 652 543 Learn-About-Me 0;
+#X text 30 61 (up to 8 simultaneous plays) so that;
+#X text 30 83 if you retrigger before the last play;
+#X text 33 104 is done \, the tail of the sound does;
+#X text 33 127 not get cut off abruptly.;
+#X text 31 41 other players \, player~ allows overlap;
+#X text 42 176 By default you have continuous control;
+#X text 42 215 the right inlet.) This increment controls;
+#X text 42 233 ALL currently active playbacks. If you;
+#X text 43 255 want independent playback (say a drum;
+#X text 42 277 machine with different increments on;
+#X text 45 301 each note) then turn on "static_increment.";
+#X text 46 328 Then you lose direct control over increment -;
+#X text 45 372 is constant. But then you can have multiple notes;
+#X text 45 398 playing at different increments.;
+#X text 29 22 player~ plays sound from an array. Unlike;
+#X text 40 194 over the sound increment (the input to;
+#X text 44 437 player~ is sample-triggered \, which means it can;
+#X text 46 461 be controlled with a sample-accurate metronome;
+#X text 48 482 such as samm~. This can make for a much more steady
+;
+#X text 46 504 rhythm then using metro.;
+#X text 44 351 whatever increment is set at the onset of each note
+;
+#X restore 130 423 pd Learn-About-Me;
+#X text 177 348 do this before turning on DACs;
+#X text 161 330 <- first load in a short sound (recommend 1-5 secs.)
+;
+#X floatatom 63 303 5 0 0 0 - player-gain -, f 5;
+#X obj 26 321 *~ 0.2;
+#X obj 266 396 hsl 128 15 0 1 0 0 player-gain player-gain-in gain -2
+-8 0 10 -260987 -1 -1 0 1;
+#X obj 26 91 loadbang;
+#X obj 286 211 sig~;
+#X obj 170 234 clean_selector~ 2;
+#X obj 170 182 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X msg 170 205 channel \$1;
+#X obj 9 7 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X obj 26 276 player~ sf4player 1 8;
+#N canvas 0 22 450 300 initialize 0;
+#X obj 164 103 s phasemod-scope-tog;
+#X obj 153 36 loadbang;
+#X msg 154 62 0.1;
+#X connect 1 0 2 0;
+#X restore 26 387 pd initialize;
+#X msg 26 112 1;
+#X text 47 137 set this for fixed increments (and polyphony);
+#X text 13 53 player~ - click-driven sample-accurate array playback
+;
+#X text 169 275 args: channel count \, overlap count, f 38;
+#X connect 3 0 2 0;
+#X connect 4 0 16 0;
+#X connect 6 0 21 0;
+#X connect 6 1 17 0;
+#X connect 7 0 21 0;
+#X connect 8 0 7 0;
+#X connect 12 0 13 1;
+#X connect 13 0 1 0;
+#X connect 13 0 1 1;
+#X connect 15 0 23 0;
+#X connect 16 0 17 1;
+#X connect 17 0 21 1;
+#X connect 18 0 19 0;
+#X connect 19 0 17 0;
+#X connect 21 0 13 0;
+#X connect 23 0 8 0;
diff --git a/externals/lyonpotpourri/player~.c b/externals/lyonpotpourri/player~.c
new file mode 100755
index 0000000000000000000000000000000000000000..dee10cd606567ff00258bc68b8e52d335bd0d024
--- /dev/null
+++ b/externals/lyonpotpourri/player~.c
@@ -0,0 +1,522 @@
+#include "MSPd.h"
+
+static t_class *player_class;
+
+
+#include "time.h"
+#include "stdlib.h"
+
+#define MAX_CHANNELS (1)
+#define DEFAULT_MAX_OVERLAP (8) // number of overlapping instances allowed
+#define FORWARD 1
+#define BACKWARD 2
+#define ACTIVE 0
+#define INACTIVE 1
+#define MAX_VEC 2048
+
+#define MAXIMUM_VECTOR (8192)
+
+#define OBJECT_NAME "player~"
+#define COMPILE_DATE "7.3.06"
+
+typedef struct
+{
+	float phase; // current phase in frames
+	float gain; // gain for this note
+	short status;// status of this event slot
+		float increment;// first increment noted (only if using static increments)
+			
+} t_event;
+
+typedef struct _player
+{
+
+	t_object x_obj;
+	float x_f;
+	t_symbol *wavename; // name of waveform buffer
+	float sr; // sampling rate
+	short hosed; // buffers are bad
+	float fadeout; // fadeout time in sample frames (if truncation)
+	float sync; // input from groove sync signal
+	float increment; // read increment
+	short direction; // forwards or backwards
+	int most_recent_event; // position in array where last note was initiated
+	long b_nchans; // channels of buffer
+	int overlap_max; // max number of simultaneous plays 
+	t_event *events; //note attacks
+	int active_events; // how many currently activated notes?
+	short connections[4]; // state of signal connections
+	short interpolation_tog; // select for interpolation or not
+	short mute;
+	short static_increment; // flag to use static increment (off by default)
+							// variables only for Pd
+	int vs; // signal vector size
+	float *trigger_vec; // copy of input vector (Pd only)
+	float *increment_vec; // copy of input vector (Pd only)
+	t_word *b_samples; // pointer to array data
+	long b_valid; // state of array
+	long b_frames; // number of frames (in Pd frames are mono)
+} t_player;
+
+void player_setbuf(t_player *x, t_symbol *wavename);
+void *player_new(t_symbol *msg, short argc, t_atom *argv);
+t_int *player_perform_mono(t_int *w);
+t_int *player_perform_mono_interpol(t_int *w);
+t_int *player_perform_stereo(t_int *w);
+t_int *player_perform_stereo_interpol(t_int *w);
+t_int *player_perform_stereo_interpol_nocopy(t_int *w);
+t_int *player_perform_hosed1(t_int *w);
+t_int *player_perform_hosed2(t_int *w);
+t_int *pd_player(t_int *w);
+
+void player_dsp(t_player *x, t_signal **sp);
+float player_boundrand(float min, float max);
+void player_dsp_free(t_player *x);
+void player_float(t_player *x, double f);
+void player_interpolation(t_player *x, t_float f);
+void player_mute(t_player *x, t_floatarg f);
+void player_static_increment(t_player *x, t_floatarg f);
+void player_stop(t_player *x);
+void player_info(t_player *x);
+void player_init(t_player *x,short initialized);
+
+void player_tilde_setup(void)
+{
+	player_class = class_new(gensym("player~"), (t_newmethod)player_new, 
+							 (t_method)player_dsp_free ,sizeof(t_player), 0, A_GIMME,0);
+	CLASS_MAINSIGNALIN(player_class, t_player, x_f );
+	class_addmethod(player_class, (t_method)player_dsp, gensym("dsp"), 0);
+//	class_addmethod(player_class, (t_method)player_mute, gensym("mute"), A_DEFFLOAT,0);
+	class_addmethod(player_class, (t_method)player_setbuf, gensym("setbuf"),A_DEFSYM, 0);
+	class_addmethod(player_class, (t_method)player_mute, gensym("mute"), A_FLOAT, 0);
+	class_addmethod(player_class, (t_method)player_static_increment, gensym("static_increment"), A_FLOAT, 0);
+	class_addmethod(player_class, (t_method)player_stop, gensym("stop"), 0);
+	potpourri_announce(OBJECT_NAME);
+	
+}
+
+void player_static_increment(t_player *x, t_floatarg f)
+{
+	x->static_increment = f;
+}
+
+void player_stop(t_player *x)
+{
+	int i;
+	
+	for(i = 0; i < x->overlap_max; i++){
+		x->events[i].status = INACTIVE;
+		x->events[i].phase = 0.0;
+		x->events[i].phase = 0.0;
+		x->events[i].gain = 0.0;
+	}
+}
+
+
+
+void player_mute(t_player *x, t_floatarg f)
+{
+	x->mute = f;
+}
+
+
+
+void *player_new(t_symbol *msg, short argc, t_atom *argv)
+{
+	
+	t_player *x = (t_player *)pd_new(player_class);
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	outlet_new(&x->x_obj, gensym("signal") );
+	if(argc < 1 || argv[0].a_type != A_SYMBOL){
+		post("%s: warning: no buffer name given: defaulting to "
+                     "empty symbol",OBJECT_NAME);
+	}
+	x->wavename = atom_getsymbolarg(0,argc,argv);
+	x->b_nchans = 1;	
+	x->overlap_max = atom_getfloatarg(2,argc,argv);
+	if(x->overlap_max <= 0 || x->overlap_max > 128){
+		x->overlap_max = DEFAULT_MAX_OVERLAP;
+	}
+	// post("%d overlaps for %s",x->overlap_max,x->wavename->s_name);
+	x->sr = sys_getsr();
+	x->vs = sys_getblksize();
+	if(!x->sr)
+		x->sr = 44100;
+	if(!x->vs)
+		x->vs = 256;  
+	player_init(x,0);
+	//   player_setbuf(x, x->wavename);
+	return (x);
+}
+
+void player_init(t_player *x,short initialized)
+{
+	int i;
+	
+	if(!initialized){
+		x->most_recent_event = 0;
+		x->active_events = 0;
+		x->increment = 1.0;
+		x->direction = FORWARD;
+		
+		x->events = (t_event *) calloc(x->overlap_max, sizeof(t_event));
+		x->mute = 0;
+		x->interpolation_tog = 1; // interpolation by default
+		x->static_increment = 0; // by default increment is adjustable through note
+		for(i = 0; i < x->overlap_max; i++){
+			x->events[i].status = INACTIVE;
+			x->events[i].increment = 0.0;
+			x->events[i].phase = 0.0;
+			x->events[i].gain = 0.0;
+		}
+		//		post("using local vectors");
+		x->increment_vec = malloc(MAXIMUM_VECTOR * sizeof(float));
+		x->trigger_vec = malloc(MAXIMUM_VECTOR * sizeof(float));
+	} else {
+		for(i = 0; i < x->overlap_max; i++){
+			x->events[i].status = INACTIVE;
+		}
+		x->increment_vec = realloc(x->increment_vec, x->vs * sizeof(float));
+		x->trigger_vec = realloc(x->trigger_vec, x->vs * sizeof(float));
+	}
+	
+}
+void player_setbuf(t_player *x, t_symbol *wavename)
+{
+	int frames;
+
+	t_garray *a;
+	
+	x->hosed = 0;
+
+	x->b_frames = 0;
+	x->b_valid = 0;
+	if (!(a = (t_garray *)pd_findbyclass(wavename, garray_class)))
+    {
+		if (*wavename->s_name) pd_error(x, "player~: %s: no such array",
+										wavename->s_name);
+		x->b_samples = 0;
+		x->hosed = 1;
+    }
+	else if (!garray_getfloatwords(a, &frames, &x->b_samples))
+    {
+		pd_error(x, "%s: bad template for player~", wavename->s_name);
+		x->b_samples = 0;
+		x->hosed = 1;
+    }
+	else  {
+		x->b_frames = frames;
+		x->b_valid = 1;
+		garray_usedindsp(a);
+	}
+	if(! x->b_valid ){
+		post("player~ got invalid buffer");
+	}
+	
+}
+
+t_int *player_perform_hosed1(t_int *w)
+{
+	
+	//  t_player *x = (t_player *) (w[1]);
+	float *outchan = (t_float *)(w[4]);
+	int n = (int) w[5];
+	
+	memset((void *)outchan,0,sizeof(float) * n);
+	return(w+6);
+}
+
+t_int *player_perform_hosed2(t_int *w)
+{
+	
+	//  t_player *x = (t_player *) (w[1]);
+	float *out1 = (t_float *)(w[4]);
+	float *out2 = (t_float *)(w[5]);
+	int n = (int) w[6];
+	
+	//  while(n--) *outchan++ = 0.0;
+	memset((void *)out1,0,sizeof(float) * n);
+	memset((void *)out2,0,sizeof(float) * n);
+	return(w+7);
+}
+
+
+/* New mono version for Pd */
+
+t_int *player_perform_mono_interpol(t_int *w)
+{
+	t_player *x = (t_player *) (w[1]);
+	float *t_vec = (t_float *)(w[2]);
+	float *i_vec = (t_float *)(w[3]);
+	float *outchan = (t_float *)(w[4]);
+	int n = (int) w[5];
+	t_word *b_samples;
+	long b_nchans;
+	t_event *events = x->events;
+
+	float increment = x->increment;
+	int overlap_max = x->overlap_max;
+	int iphase;
+	float fphase;
+	float gain;
+	short insert_success;
+	int new_insert;
+	int i,j,k;
+	float *trigger_vec = x->trigger_vec;
+	float *increment_vec = x->increment_vec;
+	short bail;
+	short static_increment = x->static_increment;
+	float maxphase;
+	float frac;
+	int theft_candidate;
+	int flimit;
+	float samp1, samp2;
+	long b_frames;
+	float vincrement;
+	
+	if(x->mute || x->hosed){
+		memset((void *)outchan,0,sizeof(float) * n);
+		return(w+6);
+	}
+	player_setbuf(x, x->wavename);
+	b_samples = x->b_samples;
+	b_nchans = x->b_nchans;
+	b_frames = x->b_frames;  
+    
+	if(! x->b_valid) {
+		player_stop(x);
+		memset((void *)outchan,0,sizeof(float) * n);
+		return(w+6);		
+	}
+	// DO THIS BETTER
+
+	for(i = 0; i < n; i++){
+		trigger_vec[i] = t_vec[i];
+		increment_vec[i] = i_vec[i];
+	}
+
+
+	/* test if we even need to do anything */
+	bail = 1;	
+	for(i = 0; i < overlap_max; i++){
+		if(events[i].status == ACTIVE){
+			bail = 0;
+			break;
+		}
+	} 
+	if(bail){
+		for(i = 0; i < n; i++){
+			if(trigger_vec[i]){
+				bail = 0;
+			}
+		}
+	}
+	if(bail){
+		memset((void *)outchan,0,sizeof(float) * n);
+		return(w+6);
+	}
+	
+	/* main sample playback code */
+
+	vincrement = increment_vec[0];
+
+	memset((void *)outchan,0,sizeof(float) * n);
+	flimit = (b_frames - 1) * 2;
+	for(i = 0; i < overlap_max; i++){
+		if(events[i].status == ACTIVE){
+			gain = events[i].gain;
+			for(j = 0; j < n; j++){ //vector loop
+				iphase = events[i].phase;
+				frac = events[i].phase - iphase;
+				if(static_increment){
+					increment = events[i].increment;
+				} else {
+
+					increment = increment_vec[j];
+
+				}
+			//	iphase *= 2;
+				if(increment > 0){ // moving forward into sample
+					if(iphase == flimit){
+						outchan[j] += b_samples[iphase].w_float * gain;
+					} else {
+						samp1 = b_samples[iphase].w_float;
+						samp2 = b_samples[iphase + 1].w_float;
+						outchan[j] += gain * (samp1 + frac * (samp2-samp1));
+					}
+				} 
+				// moving backwards into sample				
+				else {
+					if(iphase == 0.0){
+						outchan[j] += b_samples[iphase].w_float * gain;
+					} else {
+						samp2 = b_samples[iphase].w_float;
+						samp1 = b_samples[iphase - 1].w_float;
+						outchan[j] += gain * (samp1 + frac * (samp2-samp1));
+					}
+				}
+				
+				if(static_increment){
+					events[i].phase += events[i].increment;
+				}
+				else {
+
+
+					events[i].phase += increment_vec[j];
+
+				}
+				if( events[i].phase < 0.0 || events[i].phase >= b_frames){
+					events[i].status = INACTIVE;
+					break;
+				}
+			}
+		}
+	}
+	/* trigger responder and initial playback code */
+	for(i=0; i<n; i++){
+		if(trigger_vec[i]){
+			gain = trigger_vec[i];
+
+			increment = increment_vec[i];
+			insert_success = 0;
+			
+			/* put new event into event list */
+			for(j=0; j<overlap_max; j++){
+				if(events[j].status == INACTIVE){
+					events[j].status = ACTIVE;
+					events[j].gain = gain;
+					events[j].increment = increment;
+					if(increment > 0){
+						events[j].phase = 0.0;
+					} else {
+						events[j].phase = b_frames - 1;
+					}
+					insert_success = 1;
+					new_insert = j;
+					break;
+				}
+			}	
+			
+			if(!insert_success){ // steal a note if necessary
+				
+				maxphase = 0;
+				theft_candidate = 0;
+				for(k = 0; k < overlap_max; k++){
+					if(events[k].phase > maxphase){
+						maxphase = events[k].phase;
+						theft_candidate = k;
+					}
+				}
+				// post("stealing note at slot %d", theft_candidate);
+				new_insert = theft_candidate;
+				events[new_insert].gain = gain;
+				events[new_insert].increment = increment;
+				if(increment > 0){
+					events[new_insert].phase = 0.0;
+				} else {
+					events[new_insert].phase = b_frames - 1;
+				}
+				insert_success = 1;
+			}
+			
+			for(k=i; k<n; k++){
+				
+				//roll out for remaining portion of vector
+				fphase = events[new_insert].phase;
+				iphase = (int)floorf(fphase);
+				frac = fphase - iphase;
+		//		iphase *= 2; // double for stereo
+				/* do interpolation */
+				if(increment > 0){ // moving forward into sample
+					if(iphase == flimit){
+						outchan[k] += b_samples[iphase].w_float * gain;
+					} else {
+						samp1 = b_samples[iphase].w_float;
+						samp2 = b_samples[iphase + 1].w_float;
+						outchan[k] += gain * (samp1 + frac * (samp2-samp1));
+					}
+				} 
+				// moving backwards into sample				
+				else {
+					if(iphase == 0.0){
+						outchan[k] += b_samples[iphase].w_float * gain;
+					} else {
+						samp2 = b_samples[iphase].w_float;
+						samp1 = b_samples[iphase - 1].w_float;
+						outchan[k] += gain * (samp1 + frac * (samp2-samp1));
+					}
+				}
+				/* advance phase */
+				if(static_increment){
+					increment = events[new_insert].increment;
+				} else {
+
+					increment = increment_vec[k];
+				}
+				
+				events[new_insert].phase += increment; 
+				
+				
+				/* note termination conditions */
+				if( events[new_insert].phase < 0.0 || events[new_insert].phase >= b_frames){
+					events[new_insert].status = INACTIVE;
+					break;
+				}
+			}					
+		}
+	}
+	return (w+6);
+}
+
+
+
+float player_boundrand(float min, float max)
+{
+	return min + (max-min) * ((float) (rand() % RAND_MAX)/ (float) RAND_MAX);
+}
+
+
+void player_dsp_free(t_player *x)
+{
+
+	free(x->events);
+	free(x->increment_vec);
+	free(x->trigger_vec);
+
+}
+
+void player_dsp(t_player *x, t_signal **sp)
+{
+	
+	player_setbuf(x, x->wavename);
+	
+	if(x->sr != sp[0]->s_sr){
+		x->sr = sp[0]->s_sr;
+		if(!x->sr){
+			post("warning: zero sampling rate!");
+			x->sr = 44100;
+		}
+	} 
+	
+	if(x->vs != sp[0]->s_n){
+		x->vs = sp[0]->s_n;
+		player_init(x,1);
+	}
+	
+	if(x->b_frames <= 0 && ! x->hosed){
+		post("empty buffer, external disabled until it a sound is loaded");
+		x->hosed = 1;
+	}
+	
+	
+	player_stop(x); // turn off all players to start
+	
+	if(x->hosed)
+		dsp_add(player_perform_hosed1, 5, x, 
+				sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
+	else{
+		dsp_add(player_perform_mono_interpol, 5, x, 
+				sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);	
+	}
+	
+}
diff --git a/externals/lyonpotpourri/poltocar~-help.pd b/externals/lyonpotpourri/poltocar~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..f94f1fc3c05dc9e445fbb7ec547d48c80da07759
--- /dev/null
+++ b/externals/lyonpotpourri/poltocar~-help.pd
@@ -0,0 +1,56 @@
+#N canvas 506 441 450 300 10;
+#N canvas 91 32 532 393 basic-fft 0;
+#X obj 225 66 inlet~;
+#X obj 225 341 outlet~;
+#X obj 225 98 windowvec~;
+#X obj 225 136 rfft~, f 6;
+#X obj 75 341 block~ 1024 8;
+#X obj 225 171 cartopol~;
+#X obj 225 215 poltocar~;
+#X obj 225 245 rifft~;
+#X obj 225 308 windowvec~;
+#X obj 225 275 *~ 0;
+#X obj 394 185 *;
+#X msg 346 107 1 1024 8;
+#X obj 346 138 unpack f f f;
+#X obj 346 217 /;
+#X floatatom 346 249 12 0 0 0 - - -, f 12;
+#X text 427 250 rescale factor;
+#X obj 346 76 loadbang;
+#X text 28 195 Any processing would go here ->;
+#X text 44 321 sets FFT size and overlap;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 5 0;
+#X connect 3 1 5 1;
+#X connect 5 0 6 0;
+#X connect 5 1 6 1;
+#X connect 6 0 7 0;
+#X connect 6 1 7 1;
+#X connect 7 0 9 0;
+#X connect 8 0 1 0;
+#X connect 9 0 8 0;
+#X connect 10 0 13 1;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 12 1 10 0;
+#X connect 12 2 10 1;
+#X connect 13 0 14 0;
+#X connect 14 0 9 1;
+#X connect 16 0 11 0;
+#X restore 30 119 pd basic-fft;
+#X obj 30 92 osc~ 440;
+#X obj 30 193 dac~;
+#X obj 30 155 *~ 0.01;
+#X floatatom 30 69 5 0 0 0 - - -, f 5;
+#X obj 26 4 cnv 15 155 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X floatatom 101 156 5 0 0 2 gain - -, f 5;
+#X text 23 36 poltocar~ converts from polar form to rfft~ complex format.
+;
+#X connect 0 0 3 0;
+#X connect 1 0 0 0;
+#X connect 3 0 2 0;
+#X connect 3 0 2 1;
+#X connect 4 0 1 0;
+#X connect 6 0 3 1;
diff --git a/externals/lyonpotpourri/poltocar~.c b/externals/lyonpotpourri/poltocar~.c
new file mode 100755
index 0000000000000000000000000000000000000000..d7e0de29198a631a74442af207da34b4d5074022
--- /dev/null
+++ b/externals/lyonpotpourri/poltocar~.c
@@ -0,0 +1,67 @@
+#include "MSPd.h"
+
+static t_class *poltocar_class;
+
+/* Pd version of poltocar~ */
+
+#define OBJECT_NAME "poltocar~"
+typedef struct _poltocar
+{
+	t_object x_obj;
+    t_float x_f;
+} t_poltocar;
+
+void *poltocar_new(t_symbol *msg, short argc, t_atom *argv);
+void poltocar_free(t_poltocar *x);
+void poltocar_dsp(t_poltocar *x, t_signal **sp);
+
+
+void poltocar_tilde_setup(void){
+    poltocar_class = class_new(gensym("poltocar~"), (t_newmethod)poltocar_new,
+                              0, sizeof(t_poltocar),0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(poltocar_class, t_poltocar, x_f);
+    class_addmethod(poltocar_class, (t_method)poltocar_dsp, gensym("dsp"),0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+void *poltocar_new(t_symbol *msg, short argc, t_atom *argv)
+{
+	t_poltocar *x = (t_poltocar *)pd_new(poltocar_class);
+    inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+	return x;
+}
+
+t_int *poltocar_perform(t_int *w)
+{
+    int i;
+    t_poltocar *x = (t_poltocar *) w[1];
+    t_float *mag_in = (t_float *) w[2];
+    t_float *phase_in = (t_float *) w[3];
+    t_float *real_out = (t_float *) w[4];
+    t_float *imag_out = (t_float *) w[5];
+    t_float real, imag;
+
+    int n = (int) w[6]; // obj, func, 1 inlet
+    int N2 = n/2;
+    
+    for(i = 0; i < N2 + 1; i++){
+        real = mag_in[i] * cos( phase_in[i] );
+        if(i == N2){
+            imag = 0;
+        } else{
+            imag = -mag_in[i] * sin( phase_in[i] );
+        }
+        real_out[i] = real;
+        imag_out[i] = imag;
+    }
+
+    return (w + 7);
+}
+
+void poltocar_dsp(t_poltocar *x, t_signal **sp)
+{
+    dsp_add(poltocar_perform,6, x,
+            sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, sp[0]->s_n);
+}
diff --git a/externals/lyonpotpourri/power_of_two.c b/externals/lyonpotpourri/power_of_two.c
new file mode 100755
index 0000000000000000000000000000000000000000..038c6a3265e23cb5c13b24e55c079479c484a8c1
--- /dev/null
+++ b/externals/lyonpotpourri/power_of_two.c
@@ -0,0 +1,17 @@
+
+int power_of_two(int test)
+{
+  int limit = 8192;
+  int compare = 1;
+  //  post("testing what we thing is an int:%d",test);
+  do {
+    if(test == compare){
+      //      post("good power of 2 found!");
+      return 1;
+    } 
+    compare *= 2;
+  } while (compare <= limit);
+  
+  return 0;
+}
+
diff --git a/externals/lyonpotpourri/pulser~-help.pd b/externals/lyonpotpourri/pulser~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..f0cf79744dea61da8b229fa5d47f0c19e2218580
--- /dev/null
+++ b/externals/lyonpotpourri/pulser~-help.pd
@@ -0,0 +1,54 @@
+#N canvas 196 132 459 311 10;
+#X msg -14 114 harmonics \$1;
+#X floatatom -14 90 5 0 0 0 - pulser-harmonic-count -, f 5;
+#X floatatom 94 104 5 0 0 2 freq pulser-frequency -, f 5;
+#X obj 157 93 osc~ 0.1;
+#X obj 157 115 *~ 0.4;
+#X obj 157 139 +~ 0.5;
+#X obj 69 214 *~ 0.1;
+#X floatatom 108 194 5 0 0 1 gain pulser-gain -, f 5;
+#X obj 69 251 dac~;
+#X floatatom 157 73 5 0 0 0 - pulser-pw-speed -, f 5;
+#X obj 69 174 pulser~ 74 12;
+#X text 163 158 <- pulsewidth;
+#X obj -19 14 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#N canvas 658 263 450 300 initialize 0;
+#X obj 170 210 s pulser-frequency;
+#X obj 170 154 loadbang;
+#X msg 170 181 74;
+#X obj 41 87 s pulser-harmonic-count;
+#X obj 40 34 loadbang;
+#X msg 41 60 12;
+#X obj 277 116 s pulser-pw-speed-in;
+#X obj 277 49 loadbang;
+#X msg 277 91 0.1;
+#X obj 21 161 s pulser-gain-in;
+#X msg 22 140 0.1;
+#X obj 23 118 loadbang;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 4 0 5 0;
+#X connect 5 0 3 0;
+#X connect 7 0 8 0;
+#X connect 8 0 6 0;
+#X connect 10 0 9 0;
+#X connect 11 0 10 0;
+#X restore 131 250 pd initialize;
+#X obj 228 85 hsl 128 15 0 1 0 0 pulser-pw-speed pulser-pw-speed-in
+pulsewidth-modulation-speed -2 -8 0 10 -83269 -1 -1 400 1;
+#X obj 227 116 hsl 128 15 0 1 0 0 pulser-gain pulser-gain-in gain -2
+-8 0 10 -83269 -1 -1 1270 1;
+#X text -20 48 pulser~ - A pulsewave with variable pulsewidth;
+#X text 164 175 args: initial frequency \, # of harmonics;
+#X connect 0 0 10 0;
+#X connect 1 0 0 0;
+#X connect 2 0 10 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 10 1;
+#X connect 6 0 8 0;
+#X connect 6 0 8 1;
+#X connect 7 0 6 1;
+#X connect 9 0 3 0;
+#X connect 10 0 6 0;
diff --git a/externals/lyonpotpourri/pulser~.c b/externals/lyonpotpourri/pulser~.c
new file mode 100755
index 0000000000000000000000000000000000000000..4e64c32af31a68109734b850f422d54e9c0d4a73
--- /dev/null
+++ b/externals/lyonpotpourri/pulser~.c
@@ -0,0 +1,214 @@
+#include "MSPd.h"
+
+#define FUNC_LEN (16384)
+#define FUNC_LEN_OVER2 (8192)
+#define MAX_COMPONENTS (256)
+
+#define OBJECT_NAME "pulser~"
+
+static t_class *pulser_class;
+
+
+typedef struct _pulser
+{
+
+  t_object x_obj;
+  float x_f;
+  int components;
+  float global_gain;
+  float *wavetab;
+
+  float *phases;
+  float frequency;
+  float pulsewidth;
+  float si_fac;
+  short mute;
+  short connected[4];
+  float sr;
+} t_pulser;
+
+void *pulser_new(t_symbol *s, int argc, t_atom *argv);
+
+t_int *pulser_perform(t_int *w);
+void pulser_dsp(t_pulser *x, t_signal **sp);
+void pulser_mute(t_pulser *x, t_floatarg toggle);
+void pulser_harmonics(t_pulser *x, t_floatarg c);
+void pulser_float(t_pulser *x, double f);
+void pulser_free(t_pulser *x);
+
+void pulser_tilde_setup(void){
+  pulser_class = class_new(gensym("pulser~"), (t_newmethod)pulser_new, 
+			    (t_method)pulser_free,sizeof(t_pulser), 0,A_GIMME,0);
+  CLASS_MAINSIGNALIN(pulser_class, t_pulser, x_f);
+  class_addmethod(pulser_class,(t_method)pulser_dsp,gensym("dsp"),0);
+  class_addmethod(pulser_class,(t_method)pulser_mute,gensym("mute"),A_FLOAT,0);
+  class_addmethod(pulser_class,(t_method)pulser_harmonics,gensym("harmonics"),A_FLOAT,0);
+  potpourri_announce(OBJECT_NAME);
+}
+
+void pulser_mute(t_pulser *x, t_floatarg toggle)
+{
+	x->mute = toggle;
+}
+
+void pulser_harmonics(t_pulser *x, t_floatarg c)
+{
+	if(c < 2 || c > MAX_COMPONENTS){
+		error("harmonic count out of bounds");
+		return;
+	}
+	x->components = c;
+	x->global_gain = 1.0 / (float) x->components ;
+	// reset phases too?
+}
+
+void pulser_free(t_pulser *x)
+{
+	free(x->phases);
+	free(x->wavetab);
+}
+
+void *pulser_new(t_symbol *s, int argc, t_atom *argv)
+{
+  int i;
+
+  t_pulser *x = (t_pulser *)pd_new(pulser_class);
+  inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+  outlet_new(&x->x_obj, gensym("signal"));
+  x->sr = sys_getsr();
+  if(!x->sr){
+    error("zero sampling rate, setting to 44100");
+    x->sr = 44100;
+  }
+
+  x->mute = 0;
+  x->components = 8;
+  x->frequency = 440.0;
+  x->pulsewidth = 0.5;
+  
+  if( argc > 0 )
+    x->frequency = atom_getfloatarg(0,argc,argv);
+  if( argc > 1 )
+    x->components = atom_getfloatarg(1,argc,argv);
+			
+  x->si_fac = ((float)FUNC_LEN/x->sr) ;
+  
+  if(x->components <= 0 || x->components > MAX_COMPONENTS){
+  	error("%d is an illegal number of components, setting to 8",x->components );
+  	x->components = 8;
+  }
+  x->global_gain = 1.0 / (float) x->components ;
+  x->phases = (float *) calloc(MAX_COMPONENTS, sizeof(float) );
+  x->wavetab = (float *) calloc(FUNC_LEN, sizeof(float) );
+
+  for(i = 0 ; i < FUNC_LEN; i++) {
+    x->wavetab[i] = sin(TWOPI * ((float)i/(float) FUNC_LEN)) ;
+  }
+  return (x);
+}
+
+
+t_int *pulser_perform(t_int *w)
+{
+
+  int i,j;
+  float gain;
+  float incr;
+
+  float outsamp;
+  int lookdex;
+  t_pulser *x = (t_pulser *) (w[1]);
+  t_float *frequency_vec = (t_float *)(w[2]);
+  t_float *pulsewidth_vec = (t_float *)(w[3]);
+  t_float *out = (t_float *)(w[4]);
+  int n = (int) w[5];
+	
+
+  float *wavetab = x->wavetab;
+  float si_fac = x->si_fac;
+
+  float *phases = x->phases;
+  int components = x->components;
+  float global_gain = x->global_gain;
+  float pulsewidth = x->pulsewidth;
+  float frequency = x->frequency;
+  short *connected = x->connected;
+  
+  if( x->mute )
+  {
+  	while( n-- ){
+  		*out++ = 0.0;
+  	}
+  	return (w+6);
+  }
+  
+  incr = frequency * si_fac;
+  
+  while (n--) { 
+
+    if( connected[1] ){
+    	pulsewidth = *pulsewidth_vec++;
+    	// post("pw %f",pulsewidth);
+    }
+    if( pulsewidth < 0 )
+      pulsewidth = 0;
+    if( pulsewidth > 1 )
+      pulsewidth = 1;
+    
+    if( connected[0] ){
+      incr = *frequency_vec++ * si_fac ;
+    }
+ 
+    outsamp = 0;
+    
+    for( i = 0, j = 1; i < components; i++, j++ ){
+
+      lookdex = (float)FUNC_LEN_OVER2 * pulsewidth * (float)j;
+ 
+      while( lookdex >= FUNC_LEN ){
+				lookdex -= FUNC_LEN;
+		  }
+ 
+      gain = wavetab[ lookdex ] ;
+ 
+      phases[i] += incr * (float) j;
+      while( phases[i] < 0.0 ) {
+				phases[i] += FUNC_LEN;
+      }
+      while( phases[i] >= FUNC_LEN ){
+				phases[i] -= FUNC_LEN;
+      }
+      outsamp += gain * wavetab[ (int) phases[i] ];
+		
+    }
+    *out++ =  outsamp * global_gain; 
+  }
+
+  //	x->bendphs = bendphs;
+  return (w+6);
+}		
+
+void pulser_dsp(t_pulser *x, t_signal **sp)
+{
+  long i;
+
+	if(!sp[0]->s_sr){
+		error("zero sampling rate");
+		return;
+	}
+	
+  if(x->sr != sp[0]->s_sr){
+  	x->sr = sp[0]->s_sr;
+  	x->si_fac = ((float)FUNC_LEN/x->sr);
+  	for(i=0;i<MAX_COMPONENTS;i++){
+  		x->phases[i] = 0.0;
+  	}
+  }
+  for( i = 0; i < 2; i++){
+
+  	x->connected[i] = 1;
+  }
+  dsp_add(pulser_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
+}
+
+
diff --git a/externals/lyonpotpourri/qsortE.c b/externals/lyonpotpourri/qsortE.c
new file mode 100755
index 0000000000000000000000000000000000000000..0fa7e50e5830b6d88e0c7827117c088b5c6c5502
--- /dev/null
+++ b/externals/lyonpotpourri/qsortE.c
@@ -0,0 +1 @@
+/* Plug-compatible replacement for UNIX qsort.
   Copyright (C) 1989 Free Software Foundation, Inc.
   Written by Douglas C. Schmidt (schmidt@ics.uci.edu)

This file is part of GNU CC.

GNU QSORT is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU QSORT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU QSORT; see the file COPYING.  If not, write to
the Free the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */

/* Synched up with: FSF 19.28. */

#ifdef sparc
#include <alloca.h>
#endif

#include <stdlib.h>

/* Invoke the comparison function, returns either 0, < 0, or > 0. */
#define CMP(A,B) ((*cmp)((A),(B)))

/* Byte-wise swap two items of size SIZE. */
#define SWAP(A,B,SIZE) do {int sz = (SIZE); char *a = (A); char *b = (B); \
    do { char _temp = *a;*a++ = *b;*b++ = _temp;} while (--sz);} while (0)

/* Copy SIZE bytes from item B to item A. */
#define COPY(A,B,SIZE) {int sz = (SIZE); do { *(A)++ = *(B)++; } while (--sz); }

/* This should be replaced by a standard ANSI macro. */
#define BYTES_PER_WORD 8

/* The next 4 #defines implement a very fast in-line stack abstraction. */
#define STACK_SIZE (BYTES_PER_WORD * sizeof (long))
#define PUSH(LOW,HIGH) do {top->lo = LOW;top++->hi = HIGH;} while (0)
#define POP(LOW,HIGH)  do {LOW = (--top)->lo;HIGH = top->hi;} while (0)
#define STACK_NOT_EMPTY (stack < top)                

/* Discontinue quicksort algorithm when partition gets below this size.
   This particular magic number was chosen to work best on a Sun 4/260. */
#define MAX_THRESH 4


/* requisite prototype */

int qsortE (char *base_ptr, int total_elems, int size, int (*cmp)());



/* Stack node declarations used to store unfulfilled partition obligations. */
typedef struct 
{
  char *lo;
  char *hi;
  
} stack_node;

/* Order size using quicksort.  This implementation incorporates
   four optimizations discussed in Sedgewick:
   
   1. Non-recursive, using an explicit stack of pointer that store the 
      next array partition to sort.  To save time, this maximum amount 
      of space required to store an array of MAX_INT is allocated on the 
      stack.  Assuming a 32-bit integer, this needs only 32 * 
      sizeof (stack_node) == 136 bits.  Pretty cheap, actually.

   2. Choose the pivot element using a median-of-three decision tree.
      This reduces the probability of selecting a bad pivot value and 
      eliminates certain extraneous comparisons.

   3. Only quicksorts TOTAL_ELEMS / MAX_THRESH partitions, leaving
      insertion sort to order the MAX_THRESH items within each partition.  
      This is a big win, since insertion sort is faster for small, mostly
      sorted array segments.
   
   4. The larger of the two sub-partitions is always pushed onto the
      stack first, with the algorithm then concentrating on the
      smaller partition.  This *guarantees* no more than log (n)
      stack size is needed (actually O(1) in this case)! */
      
int qsortE (char *base_ptr, int total_elems, int size, int (*cmp)())
{
  /* Allocating SIZE bytes for a pivot buffer facilitates a better 
     algorithm below since we can do comparisons directly on the pivot. */
  char *pivot_buffer = (char *)  malloc(size);
  int   max_thresh   = MAX_THRESH * size;

  if (total_elems > MAX_THRESH)
    {
      char       *lo = base_ptr;
      char       *hi = lo + size * (total_elems - 1);
      stack_node stack[STACK_SIZE]; /* Largest size needed for 32-bit int!!! */
      stack_node *top = stack + 1;

      while (STACK_NOT_EMPTY)
        {
          char *left_ptr;
          char *right_ptr;
          {
            char *pivot = pivot_buffer;
            {
              /* Select median value from among LO, MID, and HI. Rearrange
                 LO and HI so the three values are sorted. This lowers the 
                 probability of picking a pathological pivot value and 
                 skips a comparison for both the LEFT_PTR and RIGHT_PTR. */

              char *mid = lo + size * ((hi - lo) / size >> 1);

              if (CMP (mid, lo) < 0)
                SWAP (mid, lo, size);
              if (CMP (hi, mid) < 0)
                SWAP (mid, hi, size);
              else 
                goto jump_over;
              if (CMP (mid, lo) < 0)
                SWAP (mid, lo, size);
            jump_over:
              COPY (pivot, mid, size);
              pivot = pivot_buffer;
            }
            left_ptr  = lo + size;
            right_ptr = hi - size; 

            /* Here's the famous ``collapse the walls'' section of quicksort.  
               Gotta like those tight inner loops!  They are the main reason 
               that this algorithm runs much faster than others. */
            do 
              {
                while (CMP (left_ptr, pivot) < 0)
                  left_ptr += size;

                while (CMP (pivot, right_ptr) < 0)
                  right_ptr -= size;

                if (left_ptr < right_ptr) 
                  {
                    SWAP (left_ptr, right_ptr, size);
                    left_ptr += size;
                    right_ptr -= size;
                  }
                else if (left_ptr == right_ptr) 
                  {
                    left_ptr += size;
                    right_ptr -= size;
                    break;
                  }
              } 
            while (left_ptr <= right_ptr);

          }

          /* Set up pointers for next iteration.  First determine whether
             left and right partitions are below the threshold size. If so, 
             ignore one or both.  Otherwise, push the larger partition's
             bounds on the stack and continue sorting the smaller one. */

          if ((right_ptr - lo) <= max_thresh)
            {
              if ((hi - left_ptr) <= max_thresh) /* Ignore both small partitions. */
                POP (lo, hi); 
              else              /* Ignore small left partition. */  
                lo = left_ptr;
            }
          else if ((hi - left_ptr) <= max_thresh) /* Ignore small right partition. */
            hi = right_ptr;
          else if ((right_ptr - lo) > (hi - left_ptr)) /* Push larger left partition indices. */
            {                   
              PUSH (lo, right_ptr);
              lo = left_ptr;
            }
          else                  /* Push larger right partition indices. */
            {                   
              PUSH (left_ptr, hi);
              hi = right_ptr;
            }
        }
    }

  /* Once the BASE_PTR array is partially sorted by quicksort the rest
     is completely sorted using insertion sort, since this is efficient 
     for partitions below MAX_THRESH size. BASE_PTR points to the beginning 
     of the array to sort, and END_PTR points at the very last element in
     the array (*not* one beyond it!). */

#define MIN(X,Y) ((X) < (Y) ? (X) : (Y))

  {
    char *end_ptr = base_ptr + size * (total_elems - 1);
    char *run_ptr;
    char *tmp_ptr = base_ptr;
    char *thresh  = MIN (end_ptr, base_ptr + max_thresh);

    /* Find smallest element in first threshold and place it at the
       array's beginning.  This is the smallest array element,
       and the operation speeds up insertion sort's inner loop. */

    for (run_ptr = tmp_ptr + size; run_ptr <= thresh; run_ptr += size)
      if (CMP (run_ptr, tmp_ptr) < 0)
        tmp_ptr = run_ptr;

    if (tmp_ptr != base_ptr)
      SWAP (tmp_ptr, base_ptr, size);

    /* Insertion sort, running from left-hand-side up to `right-hand-side.' 
       Pretty much straight out of the original GNU qsort routine. */

    for (run_ptr = base_ptr + size; (tmp_ptr = run_ptr += size) <= end_ptr; )
      {

        while (CMP (run_ptr, tmp_ptr -= size) < 0)
          ;

        if ((tmp_ptr += size) != run_ptr)
          {
            char *trav;

            for (trav = run_ptr + size; --trav >= run_ptr;)
              {
                char c = *trav;
                char *hi, *lo;

                for (hi = lo = trav; (lo -= size) >= tmp_ptr; hi = lo)
                  *hi = *lo;
                *hi = c;
              }
          }

      }
  }
  return 1;
}
\ No newline at end of file
diff --git a/externals/lyonpotpourri/quadpan~-help.pd b/externals/lyonpotpourri/quadpan~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..f758a8c92b3f0c3b4f923abb0b72f73bb4866878
--- /dev/null
+++ b/externals/lyonpotpourri/quadpan~-help.pd
@@ -0,0 +1,120 @@
+#N canvas 87 151 509 477 10;
+#X obj 7 206 quadpan~, f 29;
+#X obj 8 316 vu 15 120 empty empty -1 -8 0 10 -66577 -1 1 0;
+#N canvas 0 22 450 300 meter 0;
+#X obj 110 164 snapshot~;
+#X obj 126 114 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X floatatom 110 187 5 0 0 0 - - -, f 5;
+#X obj 110 91 env~ 1024;
+#X obj 126 140 metro 100;
+#X obj 109 211 - 100;
+#X obj 231 46 loadbang;
+#X msg 231 71 1;
+#X obj 109 246 outlet;
+#X obj 110 51 inlet~;
+#X connect 0 0 2 0;
+#X connect 1 0 4 0;
+#X connect 2 0 5 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 8 0;
+#X connect 6 0 7 0;
+#X connect 7 0 1 0;
+#X connect 9 0 3 0;
+#X restore 7 273 pd meter;
+#X obj 69 317 vu 15 120 empty empty -1 -8 0 10 -66577 -1 1 0;
+#N canvas 0 22 450 300 meter 0;
+#X obj 110 164 snapshot~;
+#X obj 126 114 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X floatatom 110 187 5 0 0 0 - - -, f 5;
+#X obj 110 91 env~ 1024;
+#X obj 126 140 metro 100;
+#X obj 109 211 - 100;
+#X obj 231 46 loadbang;
+#X msg 231 71 1;
+#X obj 109 246 outlet;
+#X obj 110 51 inlet~;
+#X connect 0 0 2 0;
+#X connect 1 0 4 0;
+#X connect 2 0 5 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 8 0;
+#X connect 6 0 7 0;
+#X connect 7 0 1 0;
+#X connect 9 0 3 0;
+#X restore 68 274 pd meter;
+#X obj 132 317 vu 15 120 empty empty -1 -8 0 10 -66577 -1 1 0;
+#N canvas 0 22 450 300 meter 0;
+#X obj 110 164 snapshot~;
+#X obj 126 114 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X floatatom 110 187 5 0 0 0 - - -, f 5;
+#X obj 110 91 env~ 1024;
+#X obj 126 140 metro 100;
+#X obj 109 211 - 100;
+#X obj 231 46 loadbang;
+#X msg 231 71 1;
+#X obj 109 246 outlet;
+#X obj 110 51 inlet~;
+#X connect 0 0 2 0;
+#X connect 1 0 4 0;
+#X connect 2 0 5 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 8 0;
+#X connect 6 0 7 0;
+#X connect 7 0 1 0;
+#X connect 9 0 3 0;
+#X restore 131 274 pd meter;
+#X obj 193 318 vu 15 120 empty empty -1 -8 0 10 -66577 -1 1 0;
+#N canvas 0 22 450 300 meter 0;
+#X obj 110 164 snapshot~;
+#X obj 126 114 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X floatatom 110 187 5 0 0 0 - - -, f 5;
+#X obj 110 91 env~ 1024;
+#X obj 126 140 metro 100;
+#X obj 109 211 - 100;
+#X obj 231 46 loadbang;
+#X msg 231 71 1;
+#X obj 109 246 outlet;
+#X obj 110 51 inlet~;
+#X connect 0 0 2 0;
+#X connect 1 0 4 0;
+#X connect 2 0 5 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 8 0;
+#X connect 6 0 7 0;
+#X connect 7 0 1 0;
+#X connect 9 0 3 0;
+#X restore 192 275 pd meter;
+#X obj 95 105 hsl 128 15 0 1 0 0 empty empty X-coordinate -2 -8 0 10
+-262144 -1 -1 0 1;
+#X obj 107 146 hsl 128 15 0 1 0 0 empty empty Y-coordinate -2 -8 0
+10 -262144 -1 -1 0 1;
+#X text 5 61 quadpan~ takes in X/Y cordinates (as signal or float)
+to position a signal within a quadraphonic plane.;
+#X obj 7 154 osc~ 440;
+#X obj 11 25 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 195 169 Spatial positioning of output channels;
+#X text 195 187 is as follows:;
+#X text 360 223 3;
+#X text 292 223 4;
+#X text 362 275 1;
+#X text 291 275 2;
+#X connect 0 0 2 0;
+#X connect 0 1 4 0;
+#X connect 0 2 6 0;
+#X connect 0 3 8 0;
+#X connect 2 0 1 0;
+#X connect 4 0 3 0;
+#X connect 6 0 5 0;
+#X connect 8 0 7 0;
+#X connect 9 0 0 1;
+#X connect 10 0 0 2;
+#X connect 12 0 0 0;
diff --git a/externals/lyonpotpourri/quadpan~.c b/externals/lyonpotpourri/quadpan~.c
new file mode 100755
index 0000000000000000000000000000000000000000..a43c02c078c21d591c3c2970e29835776f10a8ea
--- /dev/null
+++ b/externals/lyonpotpourri/quadpan~.c
@@ -0,0 +1 @@
+#include "MSPd.h"
#define OBJECT_NAME "quadpan~"
/*
 
 Front
 
 *out1         *out3
 
 
 
 *out2         *out4
 
 Back
 
 */

static t_class  *quadpan_class;


typedef struct _quadpan
{
    t_object x_obj;
    t_float x_f;
//    short bypass;
//    float pi_over_two;
//    float twopi;
    float *in;
    float *Xin;
    float *Yin;
} t_quadpan;

void *quadpan_new(t_symbol *s, int argc, t_atom *argv);
t_int *offset_perform(t_int *w);
t_int *quadpan_perform(t_int *w);
void quadpan_dsp(t_quadpan *x, t_signal **sp);
void quadpan_showstate( t_quadpan *x );
void quadpan_free(t_quadpan *x);
void quadpan_tilde_setup(void)
{
	quadpan_class = class_new(gensym("quadpan~"), (t_newmethod)quadpan_new, (t_method)quadpan_free,sizeof(t_quadpan),0,A_GIMME,0);
	CLASS_MAINSIGNALIN(quadpan_class, t_quadpan, x_f);
	class_addmethod(quadpan_class, (t_method)quadpan_dsp, gensym("dsp"), A_CANT, 0);
    
	potpourri_announce(OBJECT_NAME);
}

void *quadpan_new(t_symbol *s, int argc, t_atom *argv)
{
    int i;
    t_quadpan *x = (t_quadpan *)pd_new(quadpan_class);
    
    
    for(i = 0; i < 2; i++){
        inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("signal"),gensym("signal"));
    }
    for(i = 0; i < 4; i++){
        outlet_new(&x->x_obj, gensym("signal"));
    }
    x->in = (float *) malloc(8192 * sizeof(float));
    x->Xin = (float *) malloc(8192 * sizeof(float));
    x->Yin = (float *) malloc(8192 * sizeof(float));
//    x->pi_over_two = 1.5707963267948965;
//    x->twopi = 6.283185307179586;
    
    return x;
}
void quadpan_free(t_quadpan *x)
{
    free(x->in);
    free(x->Xin);
    free(x->Yin);
}

t_int *quadpan_perform(t_int *w)
{
    float gain1, gain2, gain3, gain4;
    float xval, yval;
    float xsquared, ysquared, ix, iy, ixsquared, iysquared;
    int i;
    
    t_quadpan *x = (t_quadpan *) (w[1]);
    float *in = x->in;
    float *Xin = x->Xin;
    float *Yin = x->Yin;
    
    float *in_loc = (t_float *)(w[2]);
    float *Xin_loc = (t_float *)(w[3]);
    float *Yin_loc = (t_float *)(w[4]);
    
    float *out1 = (t_float *)(w[5]);
    float *out2 = (t_float *)(w[6]);
    float *out3 = (t_float *)(w[7]);
    float *out4 = (t_float *)(w[8]);
    int n = (int)(w[9]);
    
    // copy buffers to avoid writeovers in shared memory
    for(i = 0; i < n; i++){
        in[i] = in_loc[i];
        Xin[i] = Xin_loc[i];
        Yin[i] = Yin_loc[i];
    }
    
    while( n-- ){
        xval = *Xin++;
        yval = *Yin++;
        if( xval < 0.0 )
            xval = 0.0;
        if( yval > 1.0 )
            yval = 1.0;
        if( yval < 0.0 )
            yval = 0.0;
        if( yval > 1.0 )
            yval = 1.0;
        
        xsquared = xval * xval;
        ysquared = yval * yval;
        ix = 1.0 - xval;
        iy = 1.0 - yval;
        ixsquared = ix * ix;
        iysquared = iy * iy;
        
        gain1 = sqrt( xsquared + ysquared );
        if( gain1 > 1.0 )
            gain1 = 1.0;
        gain1 = 1.0 - gain1; /* Left Rear Gain */
        
        
        gain2 = sqrt( ixsquared + ysquared );
        if( gain2 > 1.0 )
            gain2 = 1.0;
        gain2 = 1.0 - gain2; /* Right Rear Gain */
        
        gain3 = sqrt( xsquared + iysquared );
        if( gain3 > 1.0 )
            gain3 = 1.0;
        gain3 = 1.0 - gain3; /* Left Front Gain */
        
        
        gain4 = sqrt( ixsquared + iysquared ) ;
        if( gain4 > 1.0 )
            gain4 = 1.0;
        gain4 = 1.0 - gain4; /* Right Front Gain*/
        
        *out1++ = *in * gain3;
        *out2++ = *in * gain4;
        *out3++ = *in * gain2;
        *out4++ = *in++ * gain1;
    }
    
    return (w+10);
}



void quadpan_dsp(t_quadpan *x, t_signal **sp)
{
    if( ! sp[0]->s_sr ){
        return;
    }
    dsp_add(quadpan_perform, 9, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec,
            sp[3]->s_vec, sp[4]->s_vec, sp[5]->s_vec, sp[6]->s_vec,
            sp[0]->s_n);
}


\ No newline at end of file
diff --git a/externals/lyonpotpourri/rotapan~-help.pd b/externals/lyonpotpourri/rotapan~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..b026bd9e085dbb83ece8c310af32815145149ea1
--- /dev/null
+++ b/externals/lyonpotpourri/rotapan~-help.pd
@@ -0,0 +1,37 @@
+#N canvas 606 234 406 508 10;
+#X obj 31 269 rotapan~ 5;
+#X obj 31 373 shoehorn~ 5 2;
+#X obj 31 414 *~ 0.01;
+#X obj 106 415 *~ 0.01;
+#X obj 31 97 osc~ 400;
+#X obj 65 120 osc~ 500;
+#X obj 120 228 phasor~ 0.08;
+#X obj 31 463 dac~;
+#X obj 110 164 osc~ 430;
+#X obj 129 187 osc~ 479;
+#X obj 95 142 osc~ 300;
+#X text 22 34 rotapan~ rotates an array of channels preserving spatial
+relations. The rightmost inlet controls the phase of the rotation \,
+in the range (0-1). The argument determines the length of the channel
+array.;
+#X obj 26 4 cnv 15 155 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X obj 148 374 hsl 128 15 0 0.15 0 0 empty empty gain -2 -8 0 10 -232576
+-1 -1 0 1;
+#X connect 0 0 1 0;
+#X connect 0 1 1 1;
+#X connect 0 2 1 2;
+#X connect 0 3 1 3;
+#X connect 0 4 1 4;
+#X connect 1 0 2 0;
+#X connect 1 1 3 0;
+#X connect 2 0 7 0;
+#X connect 3 0 7 1;
+#X connect 4 0 0 0;
+#X connect 5 0 0 1;
+#X connect 6 0 0 5;
+#X connect 8 0 0 3;
+#X connect 9 0 0 4;
+#X connect 10 0 0 2;
+#X connect 13 0 3 1;
+#X connect 13 0 2 1;
diff --git a/externals/lyonpotpourri/rotapan~.c b/externals/lyonpotpourri/rotapan~.c
new file mode 100755
index 0000000000000000000000000000000000000000..2c46a1e99bcc2a33032452aeaefecc80a164ffc6
--- /dev/null
+++ b/externals/lyonpotpourri/rotapan~.c
@@ -0,0 +1,147 @@
+#include "MSPd.h"
+
+static t_class *rotapan_class;
+
+#define OBJECT_NAME "rotapan~"
+
+/* Pd version of rotapan~ */
+
+typedef struct _rotapan
+	{
+		t_object x_obj;
+        t_float x_f;
+		t_double sr;
+        long rchans;
+        double pio2;
+        t_float *inarr;
+        t_float **ins; // array of input signal vectors
+        t_float **outs; // array of output signal vectors
+	} t_rotapan;
+
+
+void *rotapan_new(t_symbol *s, int argc, t_atom *argv);
+
+
+void rotapan_free(t_rotapan *x);
+void rotapan_assist(t_rotapan *x, void *b, long msg, long arg, char *dst);
+void rotapan_version(t_rotapan *x);
+void rotapan_dsp(t_rotapan *x, t_signal **sp);
+t_int *rotapan_perform(t_int *w);
+
+void rotapan_tilde_setup(void){
+    rotapan_class = class_new(gensym("rotapan~"), (t_newmethod)rotapan_new,
+                               (t_method)rotapan_free, sizeof(t_rotapan),0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(rotapan_class, t_rotapan, x_f);
+    class_addmethod(rotapan_class, (t_method)rotapan_dsp, gensym("dsp"),0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+void *rotapan_new(t_symbol *s, int argc, t_atom *argv)
+{
+	int i;
+    
+    t_rotapan *x = (t_rotapan *)pd_new(rotapan_class);
+    x->rchans = (long) atom_getfloatarg(0,argc,argv);
+    /* allocate in chans plus 1 for controlling the pan */
+    for(i = 0; i < x->rchans; i++){
+        inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("signal"),gensym("signal"));
+    }
+    for(i=0; i < x->rchans; i++){
+        outlet_new(&x->x_obj, gensym("signal"));
+    }
+    x->pio2 = PI / 2.0;
+    x->inarr = (t_float *) malloc((x->rchans + 1) * sizeof(t_float));
+    // for better compatibility with Max 6
+    x->ins = (t_float **) malloc((x->rchans + 1) * sizeof(t_float *));
+    x->outs = (t_float **) malloc(x->rchans * sizeof(t_float *));
+    for(i = 0; i < x->rchans + 1; i++){
+        x->ins[i] = (t_float *) malloc(8192 * sizeof(t_float));
+    }
+    return x;
+}
+
+
+
+void rotapan_free(t_rotapan *x)
+{
+    int i;
+    for(i = 0; i < x->rchans + 1; i++){
+        free(x->ins[i]);
+    }
+    free(x->ins);
+    free(x->outs);
+    free(x->inarr);
+}
+
+// try copying all vectors first!!!
+
+t_int *rotapan_perform(t_int *w)
+{
+    t_rotapan *x = (t_rotapan*) w[1];
+    t_float *invec;
+	long rchans = x->rchans;
+    t_double pio2 = x->pio2;
+    t_float *inarr = x->inarr;
+    t_float **ins = x->ins;
+    t_float **outs = x->outs;
+    double amp1, amp2;
+    double panloc;
+    double scaledIndex;
+	int chan,i,j;
+    int offset;
+    
+    int n = (int) w[(rchans * 2) + 3];
+    
+    // copy input vectors
+    for(i = 0; i < rchans + 1; i++){
+        invec = (t_float *) w[2 + i];
+        for(j = 0; j < n; j++){
+            ins[i][j] = invec[j];
+        }
+    }
+    
+    // assign output vector pointers
+    for(i = 0; i < rchans; i++){
+        outs[i] = (t_float *) w[3 + rchans + i];
+    }
+    
+	for( j = 0; j < n; j++){
+        for(chan = 0; chan < rchans; chan++){
+            inarr[chan] = ins[chan][j];
+            outs[chan][j] = 0;
+        }
+        scaledIndex = ins[rchans][j] * (double) rchans;
+        if(scaledIndex < 0.0 || scaledIndex > rchans)
+            scaledIndex = 0.0;
+        
+        offset = (int) floor(scaledIndex) % rchans;
+        panloc = (scaledIndex - offset) * pio2;
+        
+        amp1 = cos( panloc );
+        amp2 = sin( panloc );
+        
+        for(chan = 0; chan < rchans; chan++){
+            outs[(chan+offset)%rchans][j] += amp1 * inarr[chan];
+            outs[(chan+offset+1)%rchans][j] += amp2 * inarr[chan];
+        }
+	}
+    return (w + (rchans * 2) + 4);
+}
+
+void rotapan_dsp(t_rotapan *x, t_signal **sp)
+{
+	long i;
+    t_int **sigvec;
+    int pointer_count = (x->rchans * 2) + 3; // input/output chans + object + panner + vectorsize
+    sigvec  = (t_int **) calloc(pointer_count, sizeof(t_int *));
+	for(i = 0; i < pointer_count; i++){
+		sigvec[i] = (t_int *) calloc(sizeof(t_int),1);
+	}
+	sigvec[0] = (t_int *)x; // first pointer is to the object
+	sigvec[pointer_count - 1] = (t_int *)sp[0]->s_n; // last pointer is to vector size (N)
+	for(i = 1; i < pointer_count - 1; i++){ // now attach the inlet and all outlets
+		sigvec[i] = (t_int *)sp[i-1]->s_vec;
+	}
+    dsp_addv(rotapan_perform, pointer_count, (t_int *)sigvec);
+    free(sigvec);
+}
diff --git a/externals/lyonpotpourri/rtrig~-help.pd b/externals/lyonpotpourri/rtrig~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..af4b99478f21032614b02fd8a0ef98a0034219fe
--- /dev/null
+++ b/externals/lyonpotpourri/rtrig~-help.pd
@@ -0,0 +1,1268 @@
+#N canvas 32 219 471 332 10;
+#X floatatom 42 100 10 0 0 0 - rtrig-odds -, f 10;
+#X msg 42 125 odds \$1;
+#N canvas 0 22 466 316 initialize-odds 0;
+#X msg 83 104 44100;
+#X floatatom 62 161 5 0 0 0 - - -, f 5;
+#X obj 82 137 t b f;
+#X obj 62 185 / 44100;
+#X obj 33 68 t b b;
+#X msg 22 101 3;
+#X obj 34 23 loadbang;
+#X obj 85 236 s rtrig-odds;
+#X connect 0 0 2 0;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X connect 2 1 3 1;
+#X connect 3 0 7 0;
+#X connect 4 0 0 0;
+#X connect 4 1 5 0;
+#X connect 5 0 1 0;
+#X connect 6 0 4 0;
+#X restore 210 293 pd initialize-odds;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array rtrig_buffa 8000 float 3;
+#A 0 -0.835742 0.295418 -0.477275 0.664057 0.0894576 0.126525 -0.570681
+-0.769957 0.328894 0.887324 -0.987493 -0.0918505 -0.167639 0.30611
+0.247932 0.985064 0.511729 -0.00734649 0.834626 -0.250302 0.602716
+-0.245854 0.251351 0.959939 0.462986 0.376727 -0.676458 0.0291857 -0.0850926
+0.94899 -0.698311 0.411686 -0.93346 0.647462 0.45746 -0.202548 0.599162
+-0.972271 0.203824 0.525393 -0.243858 0.728809 0.555214 0.762019 -0.56623
+-0.936332 -0.650677 -0.0315117 -0.817959 -0.607699 0.624249 0.888495
+-0.538406 -0.21957 -0.971602 0.299982 -0.481549 -0.363419 0.919384
+-0.177656 0.633112 0.961006 0.0322292 -0.397558 -0.86288 0.359295 -0.498907
+0.313094 0.347302 -0.931515 0.2274 -0.194406 0.901002 -0.183211 0.492452
+-0.0555201 -0.223885 0.339124 0.881303 0.347028 -0.931989 0.935646
+-0.960249 0.374315 0.427719 0.886643 -0.610111 -0.340919 -0.861892
+-0.77309 -0.771005 -0.89265 0.784726 -0.176239 -0.59436 0.452907 0.901254
+-0.33951 -0.896446 0.560837 0.657857 0.6397 -0.251398 -0.375343 0.925152
+0.767889 0.776224 0.228304 -0.265735 -0.770307 0.674781 -0.709107 0.688673
+-0.0179935 -0.559029 -0.453848 -0.0498401 0.619035 0.534469 0.538508
+-0.605998 0.752198 -0.898959 -0.358198 0.253901 -0.560671 0.0542763
+-0.801537 0.137144 0.653029 -0.310072 0.868368 0.895979 0.344743 0.88309
+0.51009 0.911849 0.412433 -0.50774 0.473596 0.123357 0.488988 0.422602
+-0.247433 0.786962 -0.355936 -0.61795 -0.333146 0.288632 0.401489 -0.161195
+0.619629 0.353057 0.129873 -0.48553 -0.643962 0.793926 -0.260973 0.738193
+-0.271011 0.300902 -0.255625 -0.196899 -0.310884 0.463357 0.545739
+0.0642049 -0.746434 0.0312008 -0.534848 0.386727 -0.394044 -0.136592
+-0.639938 -0.125413 0.822458 -0.0163202 -0.831933 0.243304 0.0835845
+-0.109819 -0.263907 0.350414 -0.443453 0.239869 0.861429 -0.49394 -0.0297523
+0.387729 0.657026 0.288703 0.213668 -0.843178 0.870313 -0.100632 -0.776229
+0.624257 -0.184434 -0.590113 0.133038 -0.673835 0.42339 -0.301372 0.256905
+-0.242029 0.461011 0.614018 -0.175316 0.682158 -0.340017 -0.306358
+0.180674 -0.893927 -0.0329915 -0.496265 0.64704 -0.80673 0.816391 -0.0227405
+-0.511206 0.749586 0.324426 -0.588578 0.731633 0.0103903 0.526134 0.408683
+-0.256027 0.769024 0.409292 -0.88282 -0.0139037 -0.220843 0.249845
+-0.728362 -0.478801 0.563889 -0.822624 0.547458 -0.38642 -0.225291
+0.371196 -0.884515 -0.62141 0.0543785 0.573484 0.238404 -0.141481 -0.871272
+-0.228759 -0.00496008 -0.405321 -0.0663771 0.540572 0.549933 -0.419932
+0.642915 0.739506 -0.0393885 -0.269934 0.323352 -0.867807 -0.628863
+-0.623337 0.543939 -0.376835 0.842055 -0.0336764 -0.540341 -0.00541768
+-0.530913 -0.651437 -0.373879 0.596194 -0.188957 0.654246 -0.552156
+-0.6946 0.0461859 0.425136 0.0923067 -0.727232 0.436202 0.118093 -0.384571
+-0.505481 0.747758 0.410103 0.714996 -0.0788929 0.76251 -0.500903 0.493941
+-0.0383628 0.345127 0.580724 0.823013 -0.816762 0.816806 0.526632 0.751311
+0.176557 0.663496 -0.0243367 0.725419 -0.328631 -0.465656 -0.12947
+-0.606257 -0.755194 0.0302401 0.197236 0.395497 0.77666 0.397157 -0.829292
+-0.354888 0.661359 0.673057 -0.241324 -0.0920525 0.0217313 -0.275228
+-0.650033 0.695618 -0.239013 0.482461 0.584513 -0.133738 -0.467729
+-0.753606 0.198563 -0.0801162 0.574328 0.370515 0.672695 0.109728 0.393439
+-0.409602 -0.0315059 0.167785 -0.121698 -0.476875 0.562172 0.153844
+0.540081 0.730521 0.0823469 -0.119007 0.508604 -0.744002 -0.536503
+-0.379099 -0.517365 0.726126 -0.436086 0.377468 0.660092 0.0119243
+-0.062981 0.352068 -0.45459 -0.439821 -0.272285 -0.532898 0.301422
+0.112311 0.665597 0.0473227 0.340226 -0.476158 0.350259 0.346503 0.721466
+-0.422589 -0.533556 -0.522983 0.0757775 0.561406 -0.719939 0.189364
+0.736802 0.512699 -0.419168 -0.50214 0.180212 0.732151 0.405037 0.690649
+-0.342393 0.817066 0.822425 -0.19811 -0.170585 -0.00960906 -0.183966
+0.0843094 0.186337 -0.339525 -0.772934 -0.646612 0.550507 0.564046
+0.452695 0.247418 -0.33724 -0.471828 -0.0587427 0.121892 0.80766 0.718705
+0.00680929 0.444281 -0.352458 -0.0231827 0.162945 -0.796439 0.586364
+0.179311 0.476521 -0.569629 0.503339 -0.257618 0.370019 0.806299 -0.684801
+0.51225 -0.514917 0.783005 -0.628046 0.436044 0.579696 0.182305 0.36794
+0.60085 -0.253543 0.16974 -0.390853 0.379326 -0.0498748 0.483581 -0.807632
+0.355495 0.434666 0.527345 0.516842 -0.058084 -0.364105 0.0444323 -0.735993
+-0.520848 0.0848005 -0.619585 0.251174 0.29002 0.72976 -0.661572 0.227479
+-0.511462 -0.571849 0.633173 0.276035 0.552367 0.641434 -0.269253 0.784109
+-0.741408 -0.658231 0.394871 0.0828319 -0.135257 0.785654 0.655901
+-0.0883092 0.277407 0.445409 0.327473 0.0265041 -0.632168 -0.283796
+0.0538263 -0.347673 0.614191 -0.481112 -0.0303797 -0.682108 -0.617428
+0.739628 -0.431869 -0.113293 0.149238 0.296776 0.349126 0.409234 -0.177757
+0.331158 0.117851 -0.436817 -0.647831 0.28219 -0.394438 0.633584 0.595235
+0.503814 0.727404 -0.523504 -0.335233 -0.0714134 -0.259293 -0.217885
+0.424861 0.443948 0.528297 0.267977 0.733394 0.620765 0.659832 -0.335029
+0.399491 -0.692404 0.714901 0.471658 -0.729963 -0.42572 0.602705 0.556965
+-0.36731 0.513438 0.214491 -0.716247 0.408588 0.430966 -0.320824 -0.718305
+0.356686 0.388347 -0.772503 -0.731744 -0.699603 0.333012 0.220973 -0.257542
+0.502044 0.306945 -0.410018 -0.283928 0.251241 0.481999 -0.600003 0.0456756
+0.340463 0.0377561 0.501463 -0.594775 -0.015507 -0.483183 0.485574
+-0.0807038 -0.250886 0.463413 0.495773 -0.702418 0.44709 -0.685287
+-0.687092 0.298555 0.132605 0.114882 -0.63336 0.585037 -0.080348 -0.0366592
+0.078957 -0.131559 0.19811 -0.589798 0.0484538 -0.265803 -0.441673
+-0.585173 0.350033 -0.711773 -0.573298 0.238271 -0.173883 0.337647
+0.684968 0.727698 0.659831 -0.739789 -0.049479 -0.49972 -0.104304 0.506399
+0.629377 -0.489331 0.301648 0.151661 -0.660537 -0.62112 -0.359871 0.127436
+0.707046 0.235909 0.734927 0.12304 0.0763171 -0.645178 0.0402257 0.454439
+0.52093 0.710564 -0.072247 -0.713049 -0.63649 0.371238 -0.46628 0.720145
+-0.139022 -0.70529 0.25552 -0.702439 0.029119 -0.0352826 0.391516 -0.708384
+0.55949 0.465008 -0.127794 -0.0208143 0.398531 -0.621433 0.116855 0.72709
+-0.585166 -0.481018 0.562012 0.471237 0.6655 0.165751 -0.707516 0.523411
+0.462807 0.0830106 0.666693 0.3467 0.278718 -0.601018 0.417231 -0.370105
+0.505445 0.361488 -0.07527 0.70442 -0.210057 -0.34542 -0.557546 -0.418198
+-0.134056 0.192986 -0.190269 -0.611525 -0.2634 -0.222219 -0.598422
+0.665082 -0.231841 0.654043 -0.509599 -0.576013 -0.449476 0.410317
+0.45798 0.124308 -0.222888 -0.683149 0.591303 -0.148623 -0.608435 0.695386
+0.323044 0.545027 -0.360188 0.0783212 0.27972 -0.223151 0.494273 -0.610568
+0.434615 -0.703194 -0.358026 -0.286511 0.350378 -0.549627 -0.246215
+0.260122 0.496291 -0.235503 -0.479008 0.567751 0.323822 -0.115039 0.196336
+0.175999 0.300174 -0.570021 0.263679 0.0880464 0.704413 -0.370217 -0.198681
+0.294029 0.0815164 -0.395507 0.165862 0.525991 0.471599 0.15045 0.482413
+-0.0613482 -0.554782 -0.677325 -0.505148 -0.0165601 0.297918 -0.247105
+-0.128779 0.528402 0.559834 0.687403 -0.608829 0.612915 0.0459864 0.345713
+0.213191 -0.454221 0.00844385 0.0109279 -0.611085 -0.251864 0.541453
+-0.00680817 0.20224 0.0888158 0.472351 0.197968 0.600626 -0.545826
+-0.296135 -0.361889 -0.403542 0.62498 -0.21801 0.490471 0.45164 0.504504
+-0.0748931 -0.0910913 -0.454578 0.304081 -0.289184 0.365134 0.0521821
+0.669388 -0.00531549 -0.609455 0.134414 -0.014946 -0.686835 0.567918
+0.316421 -0.034298 -0.333065 -0.149974 -0.631012 0.475446 -0.535029
+-0.0158695 -0.447376 0.267874 -0.0135686 0.320405 0.442661 -0.563091
+0.421266 -0.54511 -0.646913 -0.564367 -0.511526 -0.444568 -0.361846
+-0.6733 -0.568254 0.0271765 -0.601813 0.624402 0.0579314 -0.207928
+0.460577 0.13731 -0.673844 -0.118013 0.560369 -0.41876 0.396223 -0.462294
+0.234038 0.464818 0.591199 -0.516332 -0.209218 -0.624572 0.491284 0.0815168
+0.044928 -0.0939441 0.402145 -0.156087 -0.00193751 0.457005 0.579195
+-0.297386 -0.392002 0.0500696 -0.235417 -0.520099 -0.504788 0.372377
+0.13047 0.115681 0.316857 0.0735848 -0.253244 -0.504774 0.47214 0.188744
+-0.460137 -0.626947 0.191956 0.467457 0.475433 0.521683 -0.0967438
+0.0854922 0.441389 -0.394306 -0.387262 0.0130479 0.156095 -0.265696
+0.625665 0.368947 -0.628428 -0.0312153 0.27487 -0.534798 -0.578554
+-0.132449 -0.370106 -0.18532 0.113568 0.338905 0.205818 -0.139103 0.292232
+-0.466877 0.381875 0.643627 -0.617752 -0.347127 -0.565264 -0.447765
+-0.0991089 -0.45228 -0.11953 0.243897 0.421926 -0.465014 0.280245 0.486581
+0.088119 -0.0574674 -0.415159 0.0977275 0.127468 -0.00414757 -0.206007
+-0.0248921 -0.194346 -0.347053 0.436773 0.162224 -0.085168 0.440861
+0.598579 -0.437637 -0.602206 0.112534 0.599072 -0.126888 -0.530007
+-0.641592 -0.560737 -0.562271 -0.397322 -0.295041 -0.286294 0.416746
+-0.310183 0.47051 0.528005 -0.57018 0.577526 -0.054944 0.48164 0.511956
+0.406457 -0.55139 0.293391 -0.0229246 -0.336202 -0.0374929 -0.0554736
+-0.0152052 -0.551992 0.402195 -0.623831 0.516455 -0.565019 0.0641088
+0.136063 -0.572871 -0.622318 0.0863632 0.313693 0.459188 0.269234 0.119192
+-0.604932 -0.136763 0.0913802 0.433635 0.202212 0.142965 -0.557436
+0.519055 0.357822 -0.107945 0.453436 0.543711 -0.0272039 0.497259 0.348116
+0.588512 0.0931868 0.465119 -0.106892 0.205048 -0.407759 0.199801 0.10876
+-0.449567 0.581581 -0.498432 -0.0377746 -0.432671 -0.350054 0.422076
+0.0385665 -0.0291709 0.168769 0.392004 -0.395741 0.0711381 0.408597
+-0.525884 -0.367884 -0.102081 0.182327 0.365597 0.498273 0.377647 -0.365565
+0.0100336 -0.60319 0.0940302 0.216856 0.229052 -0.12576 -0.167006 0.389126
+-0.035366 -0.0957428 -0.0386752 -0.285765 0.278915 -0.444399 0.614114
+0.128978 -0.261654;
+#A 1000 -0.367433 -0.275242 -0.494542 0.00431681 0.0247323 -0.0105089
+-0.274871 0.61231 0.224424 0.108666 -0.363012 0.24762 -0.468279 -0.0948115
+0.0297219 -0.466191 -0.604472 -0.421738 -0.308083 0.431317 0.542731
+0.489894 -0.255843 -0.14041 -0.161539 0.163833 0.319203 -0.501539 0.241121
+-0.211488 -0.593707 0.0076551 -0.272384 -0.183472 -0.117746 0.460573
+-0.595302 -0.452789 0.446612 0.502246 0.355556 -0.571297 -0.369663
+0.371721 0.224178 0.0209524 -0.545654 0.0221634 0.359498 0.070479 0.337225
+-0.248012 0.576219 -0.295738 0.559389 -0.0700473 -0.333728 0.294 0.218175
+-0.172732 0.383528 -0.155221 0.062428 0.340428 -0.236089 -0.5382 0.0437288
+-0.163413 -0.508837 0.522399 -0.034779 -0.150689 0.404752 -0.19332
+-0.174052 0.332519 0.333605 0.377217 -0.134947 0.000228848 -0.0633218
+0.169028 0.310182 0.498309 -0.0821215 -0.118023 -0.344128 0.217763
+0.335757 0.479297 -0.274292 0.233225 -0.37188 -0.163501 -0.184397 -0.0960866
+0.38999 0.270889 -0.0135504 -0.154792 -0.422041 -0.100883 0.517478
+0.482862 -0.440394 -0.436418 -0.0914329 -0.249056 0.0930156 -0.516369
+-0.400413 0.41524 0.579206 -0.274995 0.210603 0.183352 -0.323886 -0.206244
+-0.142845 -0.396456 0.416858 -0.318263 0.293502 -0.249623 -0.0445082
+0.0329547 -0.00507005 0.227516 -0.094368 0.291225 -0.292363 -0.214395
+0.154849 -0.541658 -0.403338 -0.482903 0.506149 0.572239 -0.416546
+0.566058 -0.278873 0.528777 0.53763 -0.135283 0.00586314 -0.257098
+-0.542307 -0.0928621 -0.253854 -0.569594 0.38338 0.459174 -0.288573
+0.34601 -0.134484 -0.249679 -0.192104 -0.449886 -0.426976 0.471713
+0.12383 -0.0358312 0.337693 0.1343 0.547612 -0.265108 0.511812 -0.096223
+0.108317 0.0683641 -0.296455 0.0799446 0.549392 -0.26494 -0.0668157
+0.413318 -0.541842 0.0376601 -0.244326 -0.424026 0.0293535 -0.0948211
+0.504502 0.519598 0.274755 0.27989 -0.124142 0.397101 -0.0362575 -0.204294
+-0.177781 -0.148448 0.509071 -0.296815 -0.408951 0.22306 0.126114 0.115586
+-0.313965 -0.0422686 -0.123403 -0.0918809 -0.0434048 0.205762 0.497157
+0.216819 -0.352018 -0.434552 0.0969264 0.435664 0.487445 0.206018 0.433077
+0.0522922 -0.461244 -0.128747 -0.376982 -0.364537 -0.534637 -0.355191
+0.051794 -0.111232 -0.26376 -0.171768 -0.535732 -0.1053 -0.286618 0.522006
+0.490407 0.0269577 0.334498 0.288256 0.131309 -0.35567 0.0504357 -0.538349
+-0.200592 0.528612 0.333771 0.42801 -0.255544 -0.311824 -0.0103947
+-0.510054 -0.21405 -0.133371 0.101145 -0.320838 -0.234215 -0.362298
+-0.00609061 -0.0941244 -0.274805 0.0855003 0.532705 -0.390074 -0.189968
+-0.17807 -0.427541 0.394226 -0.0915744 0.0087277 0.0882959 0.390637
+0.0978042 -0.0682682 -0.287665 -0.321582 -0.252169 0.390103 0.45845
+-0.51312 -0.426996 -0.165765 -0.0878426 -0.458708 0.194024 0.409689
+0.372037 -0.0333962 0.451497 0.366627 -0.457975 0.245902 -0.277681
+-0.435963 0.166079 -0.48291 -0.0583709 -0.125538 0.227343 0.303136
+-0.064972 -0.491479 -0.0962057 -0.206229 0.107734 0.326645 -0.257916
+0.458317 0.49532 -0.459684 -0.356774 -0.232013 -0.372925 -0.372314
+-0.302658 0.235733 0.478405 -0.470904 -0.300925 -0.292057 0.398182
+-0.195054 0.497424 -0.208164 -0.311334 -0.355826 -0.144643 -0.151203
+0.443159 0.415945 -0.455035 -0.358111 -0.0568893 0.0884788 -0.363805
+0.133959 0.470788 0.414416 -0.149819 0.393441 0.113702 -0.194813 -0.396641
+-0.0369495 -0.052249 -0.0308795 -0.144171 0.425029 -0.461673 0.365892
+-0.466819 0.00353357 0.466091 0.181119 -0.0473516 -0.217339 0.31901
+-0.493251 -0.285854 -0.140661 -0.187819 -0.261082 -0.373948 -0.111184
+0.368464 0.142652 0.170717 -0.121921 0.456237 -0.191502 -0.233861 0.205927
+-0.144203 -0.1619 -0.0928985 -0.134012 -0.441922 -0.330149 -0.150014
+0.0512567 0.398885 -0.222977 0.216484 -0.142294 0.447771 -0.465575
+0.242806 0.365434 0.244199 0.402724 -0.151852 -0.14024 -0.333509 0.273799
+0.420283 0.413328 -0.39063 0.179519 0.326531 -0.399391 0.384413 0.151763
+0.238433 -0.429873 -0.108666 0.380411 0.15069 0.282908 -0.457724 -0.38476
+0.174552 0.0572583 -0.0910657 -0.195095 0.0783487 0.329131 0.149767
+0.006806 -0.422064 -0.306607 0.169531 -0.463747 0.355426 0.140381 -0.462418
+0.333689 -0.0960503 -0.360754 0.119676 -0.312339 -0.0121017 -0.162273
+-0.430013 0.0237817 -0.00227968 0.148671 0.378073 0.15942 -0.0425293
+0.00365751 -0.0688015 -0.34862 0.311434 0.343505 0.0208228 0.399145
+-0.484528 0.451569 0.368019 -0.306757 0.189017 -0.0569441 -0.220609
+0.141537 0.35402 -0.0006415 -0.0401325 0.287822 0.0738417 -0.0212225
+0.308195 0.128946 0.0163164 0.120673 0.277234 0.034024 -0.206095 -0.372988
+-0.468244 -0.0811246 -0.0588176 -0.171899 -0.210384 -0.365513 -0.222266
+-0.14499 -0.328541 -0.409464 -0.141213 0.283887 -0.0739413 -0.306423
+0.322907 0.270656 -0.263126 0.450735 -0.0218741 -0.261802 0.475905
+-0.473354 -0.0700584 -0.133136 -0.355867 0.00855277 0.262923 0.012141
+-0.137954 -0.199379 0.326304 -0.355264 0.433404 0.352456 -0.273565
+-0.444891 0.139199 0.376416 0.0151982 0.443985 -0.240998 0.264514 0.461
+-0.118386 -0.387363 0.0910616 0.228133 -0.11079 -0.280568 -0.244386
+0.292792 -0.361689 -0.279105 0.295952 0.414509 -0.281819 0.442386 -0.195142
+-0.346505 0.0396845 -0.402754 -0.0985328 0.379534 -0.135418 0.360593
+0.242732 -0.105493 -0.0723099 0.0717686 -0.155488 -0.420064 0.121793
+0.192059 -0.455617 -0.208639 0.223255 0.162779 0.037244 0.136878 -0.0850288
+0.349981 0.167607 0.444043 -0.0383285 0.11186 0.0802951 -0.357286 -0.0806454
+0.259644 -0.0360423 -0.055709 -0.223303 -0.248628 -0.0425518 -0.26166
+-0.0282449 0.440017 0.28618 0.0718392 -0.191033 -0.344718 -0.200991
+-0.134885 -0.227084 -0.0267616 0.217874 0.0678331 0.399215 0.440716
+-0.348663 0.26552 -0.428508 0.392761 0.0243112 -0.36356 0.0455636 0.27707
+0.157334 0.382869 -0.0740053 0.43482 -0.00214982 0.0627078 -0.271819
+-0.327664 -0.384596 0.00444482 -0.326818 -0.0775521 0.23256 -0.0896605
+-0.0635293 -0.148796 0.0851521 0.374422 0.2215 -0.0345469 0.404843
+-0.222723 -0.437568 0.282256 -0.0619798 -0.0772161 -0.0800227 -0.410801
+-0.439997 -0.197767 0.163016 -0.17148 -0.0611159 -0.119884 0.119299
+0.439572 0.33912 -0.103626 0.364075 -0.361341 0.3171 0.0145265 -0.419276
+-0.121783 -0.151006 -0.0310109 0.114667 -0.209216 -0.322913 -0.235401
+-0.40658 0.0924605 0.113212 0.147169 0.438308 0.412988 0.0774338 0.21899
+0.195107 0.327054 -0.131339 0.115037 -0.305849 0.153441 -0.249048 -0.0652134
+-0.0182817 -0.217721 -0.352367 0.211939 0.380106 -0.0904079 -0.0739979
+0.423267 0.263662 -0.432514 -0.213369 -0.0989565 0.16136 0.397206 0.217036
+0.246652 -0.396639 0.282959 0.214799 -0.269673 0.386277 -0.215938 0.167963
+-0.396283 -0.315497 -0.333759 0.248123 -0.194862 -0.219814 -0.03245
+-0.103017 -0.349431 -0.111254 -0.281066 0.100527 0.0117867 0.272746
+-0.128362 -0.129661 0.132829 -0.307941 0.00660918 -0.200856 0.235275
+-0.0927469 -0.0226129 -0.167796 -0.370535 0.148211 -0.377942 -0.175602
+-0.276206 0.338425 -0.0396304 0.301293 0.0180009 0.261997 -0.0591971
+0.0446929 -0.155237 -0.204242 -0.237984 -0.183541 -0.122579 0.189739
+-0.26438 0.360301 0.0482359 -0.334967 -0.206607 -0.198226 -0.201065
+0.16676 -0.37113 -0.342875 -0.209142 0.0310099 0.298324 0.120238 0.0470919
+0.297156 -0.240169 -0.215206 0.408261 0.330327 -0.097586 -0.268137
+-0.0556848 0.349251 0.00282997 0.30927 0.309262 -0.0128703 -0.00612628
+-0.184591 -0.248113 0.382744 0.179613 0.00817505 0.195997 -0.144197
+-0.0751613 0.219514 0.0317123 -0.28574 0.266036 -0.0310973 -0.0661612
+0.342639 -0.277836 0.107258 0.20614 0.00382019 -0.224966 0.0614965
+-0.408289 0.394971 0.276286 0.215131 -0.397132 0.109002 -0.40052 0.390415
+-0.359158 -0.230041 0.27466 0.178274 0.0948681 0.00116634 -0.248427
+0.27649 0.338282 -0.376667 -0.31084 -0.0300047 -0.218511 -0.268928
+0.39139 -0.313863 0.321134 -0.140555 -0.0516427 -0.307018 -0.291352
+0.0298606 -0.385452 -0.181127 0.053446 -0.239011 0.097486 0.177064
+-0.000433934 -0.30665 0.0959365 -0.317159 0.387091 0.19832 0.243064
+0.371351 0.0748231 0.205311 -0.366705 -0.0768744 0.36651 0.216433 0.139159
+0.363253 -0.340081 -0.07106 0.171344 0.211102 -0.158153 0.0424928 0.183498
+0.365141 -0.234668 0.293459 0.0180548 -0.142257 -0.352378 0.0748415
+0.0258298 -0.271492 -0.290075 0.0295616 -0.381029 -0.0205016 0.207977
+-0.100546 0.347204 -0.101012 -0.297965 -0.273311 0.141041 0.137948
+0.18005 -0.326404 -0.0871252 0.277847 0.235149 0.0395204 -0.238603
+-0.264331 -0.203643 -0.0813457 -0.309769 -0.374069 -0.0502322 -0.0566436
+0.123142 0.147841 0.248827 -0.227233 -0.0982252 -0.254568 -0.273491
+-0.335766 0.283466 -0.136765 0.010351 -0.0925355 0.234273 -0.160938
+-0.245124 -0.309106 0.0330107 -0.274756 -0.314079 0.00381228 0.0424322
+0.202715 -0.259872 -0.18628 0.069997 -0.365253 -0.133553 0.108994 0.0705565
+-0.273852 -0.134493 -0.288914 -0.110644 -0.0990951 -0.199465 -0.320406
+0.335455 0.282634 0.213235 0.276555 0.268883 0.286708 -0.118949 -0.328117
+0.331795 -0.316752 0.201464 -0.364426 -0.336822 -0.16654 0.302646 0.0643729
+-0.0167951 -0.158792 0.28786 -0.229108 -0.309211 -0.313667 -0.243702
+-0.306722 -0.180656 -0.234998 -0.108153 0.275709 0.0259072 -0.12274
+0.120937 -0.183879 -0.340529 -0.0978198 -0.165505 -0.291105 0.113772
+-0.0929008 -0.0994556 0.164509 0.295482 -0.299901 0.271355 -0.129076
+0.099856 0.050496 -0.346137 0.270383 -0.0327291 -0.344542 0.155496
+-0.343207 0.261987 -0.316049 -0.0735887 0.0214508 -0.257683 -0.36021
+-0.352323 0.0680364 -0.273948 0.050504 -0.0290199 0.201088 -0.0193107
+0.19138 0.270749 0.335952 0.318403 -0.33531 0.143152 0.103387 -0.193895
+0.138447 -0.0235258 -0.0415646 0.15683 -0.00642759 -0.116454 0.282772
+0.20992 0.0739448 -0.0861439 -0.0420883 -0.30765 0.157526 0.08245 0.182733
+-0.133364 -0.0246687 0.218607 -0.209579 -0.320855 -0.322398 0.35486
+0.134056 -0.332112 -0.243868 0.215638 0.0652962 -0.0840778 -0.283003
+-0.0369627 -0.271987 -0.00461057 -0.19783 0.0413568 0.203738 0.157843
+0.0195133 0.135245 -0.212573;
+#A 2000 0.200209 0.0734631 0.0928159 -0.292988 0.2947 0.18162 -0.0486224
+0.0396767 0.216987 -0.062405 -0.213681 0.0946136 -0.180953 0.184422
+0.090247 -0.32984 0.0228291 0.116746 -0.13639 -0.233402 0.116045 0.209376
+0.163891 -0.0382326 -0.188677 -0.317437 -0.261232 0.191135 -0.295033
+-0.238871 0.312057 -0.11146 0.161592 0.0986467 -0.208995 0.0948014
+0.0407823 0.288357 -0.0250742 0.159394 0.122286 0.140017 0.129958 0.19922
+0.0839394 0.125641 0.155163 0.24258 0.180648 -0.0777762 0.0850191 0.246365
+-0.0264099 -0.100617 0.114681 0.284826 0.339862 0.0118169 -0.232638
+0.221441 -0.19921 0.248252 0.324319 0.240422 0.301309 -0.121478 0.222187
+0.176571 -0.219922 0.289331 -0.118886 -0.294437 0.32212 -0.209111 0.178933
+0.0594453 -0.262483 0.197674 0.0996593 -0.210097 0.0171813 -0.0484113
+0.33269 0.222671 -0.0358214 -0.33749 -0.0942383 0.215121 -0.109529
+0.330561 0.100836 -0.0992404 0.0287395 -0.253757 0.0893601 -0.148973
+0.140383 -0.167216 -0.169799 -0.25304 0.299888 0.0102152 0.0863718
+-0.092021 0.166359 0.158904 0.275049 0.300602 0.0963948 -0.28523 0.172087
+-0.272496 0.0823892 0.262345 0.099517 -0.165058 -0.134409 0.309801
+0.283063 -0.0316093 0.204293 0.21318 0.0538177 0.18466 0.00250576 -0.0544187
+0.189842 -0.222168 -0.106343 -0.307607 -0.196389 -0.0696753 -0.297406
+-0.0539127 0.320251 -0.0609413 -0.291684 -0.199573 0.08094 0.193998
+-0.233949 0.00121626 -0.0501311 0.0616576 0.233605 0.255903 0.218478
+-0.136381 0.122158 -0.00800147 -0.0114827 -0.255058 0.29856 -0.0854143
+0.287666 0.0150338 0.0117555 -0.175524 -0.127498 -0.291856 -0.239653
+-0.146728 -0.0467028 -0.165863 0.0958069 -0.0884098 -0.310673 0.317856
+0.282399 -0.0525878 -0.0736862 -0.293273 0.019204 -0.279421 -0.317724
+0.157718 -0.30051 0.0174446 0.183465 -0.245442 -0.130558 0.184748 -0.230893
+-0.269816 -0.100168 0.3068 0.14368 -0.317063 -0.309782 -0.294259 -0.291738
+-0.0143223 -0.0754103 0.048723 0.10371 -0.103782 0.271576 -0.264943
+-0.109083 0.263659 -0.0276319 -0.149169 0.116271 0.0665562 0.147749
+0.148644 0.227626 0.0559344 0.27466 0.252752 0.152369 0.246294 0.184177
+-0.246614 -0.308383 0.0951599 0.00363405 -0.297969 0.258989 0.0806836
+-0.0559659 -0.111874 0.225087 0.306603 -0.0646075 0.0318277 0.0923795
+-0.0981586 -0.268282 -0.123288 0.0201577 0.29108 0.0952233 0.0526 -0.301416
+-0.0584485 0.112849 0.00126683 -0.0832985 -0.20591 -0.0706531 -0.228938
+0.271258 0.180262 0.221928 0.10046 -0.182533 -0.226745 -0.304964 0.208472
+0.000754345 0.200569 -0.220168 0.0375318 0.0816712 -0.2192 -0.0154953
+0.182909 -0.230553 0.259952 -0.161504 0.154741 -0.153478 0.26998 0.0513453
+-0.157198 0.213378 -0.0856444 -0.120973 -0.0966633 0.224547 0.0105354
+-0.198395 -0.118149 0.0729837 0.290852 -0.196454 0.118081 0.202891
+0.17986 -0.0721225 0.177271 -0.0174806 -0.290065 0.0745255 -0.154929
+-0.168351 -0.0243916 0.249136 0.256901 0.189068 0.156595 0.0642284
+-0.194196 -0.247858 0.0801667 -0.119518 -0.247126 0.117147 -0.069204
+0.00629999 -0.159399 0.147141 0.11182 -0.238538 0.0228745 -0.283409
+0.0771356 -0.0566473 -0.0391579 -0.278063 0.268495 -0.181168 -0.151863
+0.183665 0.0633193 -0.121778 0.19827 -0.0128894 -0.00344577 -0.277451
+0.0274723 -0.0133802 0.00842348 -0.0791821 -0.124454 0.0900195 0.19345
+0.201803 0.273694 -0.270986 -0.0593161 -0.149996 -0.200205 -0.082581
+0.129325 0.267734 0.253242 -0.0720151 0.233291 -0.156047 -0.227897
+0.221627 0.226295 0.281477 0.0193852 0.00892663 -0.273691 0.0391456
+0.192175 -0.128201 0.165189 -0.229504 -0.140561 0.193843 0.200563 0.102336
+0.185621 0.0424851 -0.09698 -0.125775 0.146362 -0.0854688 -0.102335
+-0.0463309 -0.231399 -0.248978 0.0922811 0.039514 0.0599057 0.242111
+0.266201 -0.0979566 0.25037 0.0117171 0.226489 -0.101533 -0.266627
+0.03791 0.102744 0.212804 0.118176 -0.0125826 0.215656 -0.0334058 0.0895978
+0.0783781 -0.0343111 0.127555 0.0102875 -0.0246137 0.236109 0.0828266
+-0.113185 -0.204268 -0.240917 0.26065 -0.264378 -0.153071 0.0278315
+0.121887 0.0825421 0.229201 0.276274 -0.0715817 -0.180164 -0.249047
+-0.125105 0.131866 -0.232858 0.25224 0.276273 0.0810688 0.245526 0.244941
+-0.0971761 -0.0832707 -0.0733448 0.0653995 0.246176 0.102141 -0.220758
+0.226546 -0.054626 -0.272391 -0.0282433 0.205286 0.0329339 0.171306
+0.236747 -0.157997 -0.0388805 -0.15742 -0.179038 0.0381513 -0.188084
+-0.251478 -0.253176 0.0475456 -0.105379 0.158924 -0.24756 0.0924737
+-0.0567246 -0.107556 -0.259675 0.0212133 0.0819598 -0.202242 0.260077
+0.00780536 -0.245202 0.123752 -0.110788 0.0311192 0.0315005 -0.0562755
+-0.233526 -0.235854 0.114524 0.205028 0.158546 -0.0634319 -0.0846447
+0.185626 -0.117343 -0.193117 0.0580969 -0.265026 0.133234 -0.136169
+-0.112354 -0.247143 -0.11897 0.105658 -0.113451 -0.123621 -0.0447416
+-0.197857 -0.0474364 -0.226956 -0.205807 -0.229976 -0.0535528 -0.245341
+0.177827 -0.261107 -0.163546 0.197595 -0.26165 -0.168897 -0.0280393
+-0.209458 0.0496961 -0.209237 -0.0881118 -0.0378347 -0.219661 0.185735
+0.0150017 0.230972 0.0276925 -0.190811 0.0082931 -0.252202 -0.191321
+-0.244875 -0.21279 0.243977 0.0583171 0.0358342 -0.185315 -0.00703214
+-0.0733836 -0.254737 0.0913277 0.143447 -0.0218662 0.189068 -0.21364
+-0.00290769 -0.197538 0.112431 0.0912156 -0.0544065 -0.0978668 0.119396
+-0.0297196 0.130008 0.0906917 0.235269 -0.214147 0.0161478 0.0888101
+-0.0660549 -0.112315 -0.10933 0.238853 0.0765751 -0.139129 0.17043
+-0.208353 0.117063 -0.0550542 0.0875908 -0.0861098 -0.211831 0.0237104
+-0.186028 0.195406 0.129471 -0.231986 -0.0995911 -0.119745 -0.16781
+-0.0890738 0.0947444 0.212143 0.0700198 0.108372 0.0628498 -0.16294
+0.0946244 -0.0320069 -0.026718 -0.0789739 -0.216737 0.18733 -0.0521794
+-0.180563 0.0248214 -0.193363 -0.105484 -0.0843865 -0.0133015 0.0996474
+0.213871 0.0657021 -0.235381 0.0880285 -0.110797 0.174899 -0.105456
+0.172242 -0.0733781 -0.100684 -0.240032 -0.0973065 0.201482 -0.0443407
+-0.155592 -0.150305 0.169108 0.0895078 -0.107437 0.12768 -0.0670655
+0.142149 -0.08015 0.0449655 0.194063 0.244388 0.10573 -0.163425 0.125315
+0.152969 0.0788152 0.0542501 0.0290168 0.179835 0.0378998 0.114797
+-0.0558295 -0.199985 -0.207163 -0.0974645 0.0929253 -0.20687 0.119756
+0.0165074 0.232307 0.124001 0.111752 0.204292 -0.140088 -0.0957599
+0.229428 -0.134416 0.220038 -0.122082 -0.0997085 0.108066 -0.0775698
+0.194433 -0.173509 0.145684 0.0787471 -0.230043 -0.163299 0.0801612
+0.172812 0.0702269 -0.0116277 -0.0519028 0.0636801 -0.084178 0.107996
+-0.148294 -0.0600114 -0.0247268 0.168201 0.205954 0.156607 0.208827
+0.0679073 0.209747 0.011258 -0.170288 -0.230386 0.229419 0.190623 0.207985
+-0.212651 0.0317362 -0.106794 -0.13473 0.142166 -0.0251642 -0.0288235
+-0.0337985 0.152869 -0.0406989 -0.168958 0.0333708 -0.0197622 -0.0885399
+-0.140533 -0.0989477 0.168748 -0.0897475 -0.0241031 -0.103746 0.150809
+-0.03587 -0.053442 0.206022 -0.0999474 -0.0928646 0.0403806 -0.0919412
+0.0577665 -0.126466 0.175648 -0.180812 0.0996705 -0.0405699 -0.114944
+-0.102486 0.0918843 0.00448387 0.00183077 0.00944839 0.0138147 -0.0505852
+0.0866179 -0.115519 -0.108612 -0.154609 -0.111818 0.0968398 -0.185756
+-0.02288 0.212193 -0.0387429 -0.160995 0.189006 0.0309686 0.112071
+-0.219272 -0.211714 -0.135507 0.177542 -0.201028 -0.177894 0.027844
+0.213909 -0.0401007 0.0230527 0.144766 -0.0210758 0.142618 -0.039296
+-0.0957271 0.124666 -0.165123 -0.161159 0.141317 -0.0982746 0.0572213
+0.050454 0.214058 -0.0768965 -0.209624 -0.0406298 0.213217 0.0969856
+-0.0863185 -0.0743621 -0.0857871 -0.075959 -0.131607 -0.138822 -0.148579
+-0.213226 0.0180573 0.13084 0.0543585 0.119827 -0.112457 -0.0977953
+0.0164791 -0.177642 -0.157413 0.0320012 -0.126222 0.078934 -0.00208391
+-0.127755 0.139318 -0.0980561 -0.0908191 -0.0733907 0.0203532 0.159281
+-0.0920969 0.208396 0.0156036 -0.200091 0.127974 0.0395545 0.0116631
+0.0743272 -0.126499 0.132529 -0.0953007 0.123712 -0.078223 -0.0163382
+0.104084 0.0993994 -0.0724851 0.166886 0.193674 0.0273915 0.0709334
+-0.0395487 0.0895268 0.0889484 -0.00710997 -0.155659 0.213252 0.145936
+0.212149 0.209009 -0.157068 -0.191406 -0.00746764 0.191534 0.0806529
+-0.110945 -0.171742 0.0461092 -0.147565 0.107846 -0.044346 0.182862
+-0.0644761 -0.0858064 0.0550425 -0.0958679 0.03817 -0.177639 0.120698
+0.0711522 0.0449057 -0.122984 -0.054183 -0.0687513 -0.127333 -0.0674979
+0.193451 -0.0127256 0.0644915 0.0326161 -0.0114128 -0.105916 0.173758
+0.0514912 -0.115653 -0.161222 -0.00476611 -0.13773 0.0854689 -0.0822358
+-0.161381 0.0236774 -0.155088 0.0437309 -0.137562 0.0671559 0.0871476
+-0.0421604 0.144062 -0.185112 0.0901474 0.172525 -0.181544 -0.046364
+-0.102488 0.114237 -0.161602 -0.181793 0.118405 0.10209 -0.16913 -0.166716
+-0.0144649 0.114457 -0.177584 -0.0795526 -0.153275 -0.0945481 0.198615
+0.0764526 -0.161438 0.0378139 -0.0691348 -0.178629 0.108782 0.151731
+0.0177777 0.196047 0.121159 -0.201375 -0.126326 0.153518 -0.104173
+0.172263 0.146907 -0.0176664 -0.0834507 -0.142872 0.147091 -0.0626841
+0.132974 0.00635607 0.0414528 0.199162 0.0839908 -0.100203 0.106594
+0.133035 0.12103 -0.118235 -0.107672 0.058426 0.11397 -0.0416509 0.0927299
+-0.100303 0.0709961 0.109996 -0.0903446 -0.0535805 -0.145821 -0.0959745
+-0.0837521 0.114064 -0.0103824 0.192805 0.0253374 0.106676 -0.0059829
+0.143166 0.155225 0.069973 0.177585 -0.0725978 -0.00102501 0.152026
+0.174496 -0.0668389 -0.122991 0.169162 0.143466 0.0841107 -0.0880505
+0.157568 -0.103738 0.0507492 -0.0998481 -0.156989 -0.107662 -0.0551859
+-0.133294 0.161826 0.175963 -0.0661633 0.126007 -0.190035 0.0092972
+-0.0411551 0.0829361 0.0709953 0.121547 -0.0602791 0.0462523 0.0146203
+-0.188068 0.0735257 -0.164606 -0.0488419 0.156753 0.0711526 0.00221219
+-0.0634613 0.165176 0.035219 -0.12677 -0.0717442 0.168748 -0.109586
+0.111461 0.0341829 0.101998 0.0618109 0.189829 0.0912702 -0.00186241
+-0.0433434 -0.0109901 0.10514 0.00251591 -0.0229517 0.138047 0.0200906
+-0.0869301 -0.185712 -0.0113521 -0.0353086 0.142783 -0.119065 0.0486695
+-0.165385 -0.06074 0.182049 0.149746 0.102271 0.0411116 0.0484548;
+#A 3000 0.173558 0.0864053 -0.0398964 -0.163088 -0.0743301 0.0764632
+0.0642505 0.0859902 0.0358329 0.164668 0.185583 0.0353322 0.150186
+-0.0673695 0.0130015 -0.0308566 0.0243223 0.086611 0.125987 -0.0834
+0.136504 0.0972897 -0.0322126 -0.0595156 -0.0117016 0.0200816 0.174668
+0.145331 0.0151355 0.174449 0.00582571 0.0439086 0.0765667 -0.178212
+-0.153946 -0.146511 0.0721378 -0.0277833 -0.0724084 0.0389396 0.0916826
+0.0469879 0.0735868 -0.136336 0.109006 0.132552 0.0807181 0.0430299
+-0.0476355 0.0295503 0.00502616 0.0213951 -0.0923652 -0.148128 -0.00796943
+0.0710561 0.140625 -0.0142634 0.019726 -0.148771 0.0392031 0.0622252
+-0.085075 -0.0514789 -0.0154989 -0.173611 -0.00463826 -0.0937347 0.145399
+0.0810978 -0.171749 -0.0593341 -0.0834753 0.144305 0.122191 -0.126667
+0.118683 0.0523141 -0.112697 -0.0573408 0.114695 -0.0171614 -0.0783925
+-0.0774069 -0.169516 0.128926 0.154329 0.106715 -0.106938 -0.0409872
+0.111444 -0.0967544 -0.07789 0.0341553 -0.0127092 0.0462965 -0.0850067
+0.032137 -0.138081 -0.0358738 0.12415 0.0332228 -0.109311 0.158179
+0.15287 0.131136 0.0559478 0.110903 0.0632892 0.137327 -0.163804 0.127648
+-0.00612092 0.0689045 -0.130614 0.123659 0.0423482 0.0244303 0.0533944
+-0.103913 0.0644314 0.147814 -0.000301854 0.164613 0.0770267 -0.007688
+0.0795304 -0.0891494 -0.115913 0.0338951 -0.0266791 -0.00139539 -0.0107366
+-0.167743 -0.112874 0.00364346 0.0246054 0.0506078 -0.0365013 -0.0613995
+-0.162893 0.115542 -0.0434122 0.000662969 0.133679 0.0608481 -0.157543
+0.0701366 -0.00752228 0.062997 -0.00232885 -0.0245298 0.05496 0.0685631
+-0.0537974 -0.162219 -0.126501 -0.152731 0.0605448 0.15829 -0.093694
+0.131179 0.142254 -0.0162248 0.0574343 0.149152 -0.0570182 -0.150853
+0.155237 -0.0576269 -0.0740736 0.103659 0.00790221 0.0704513 -0.0568679
+0.0106242 0.0371273 0.0824222 -0.164666 -0.0830993 -0.161305 0.0638288
+-0.0607619 -0.154124 -0.0244543 -0.0618564 -0.138769 -0.161935 0.0493661
+-0.154418 0.138621 0.0403727 -0.00528452 -0.0566457 -0.129225 -0.103856
+-0.0352825 -0.0351495 -0.153171 0.0344591 0.137348 -0.157252 0.0170674
+-0.0111438 0.119622 0.0783717 -0.158601 -0.0803632 -0.101834 -0.0766658
+-0.157058 0.128418 0.0479387 -0.137988 0.156363 0.0178816 -0.0723136
+-0.0452653 -0.0159216 0.0372501 -0.00573264 -0.108602 -0.13679 0.155166
+-0.158697 0.0824443 -0.0170316 0.0335439 0.0170823 -0.0561548 0.0428964
+-0.0858373 -0.0824806 0.102465 -0.0135689 -0.0165507 0.0732273 -0.107949
+0.00977816 0.143483 -0.106062 0.0239498 -0.139412 -0.13419 0.0995984
+-0.0624123 -0.0420321 0.0129472 0.00387326 -0.0153612 -0.0951885 0.00409278
+0.0920586 -0.102916 0.0759207 0.109607 0.103106 -0.143043 -0.0185282
+0.0434247 -0.129843 0.0691915 0.00224206 0.143839 0.0689207 0.109069
+-0.0838886 0.132185 0.0886391 -0.0944101 -0.153513 0.133218 -0.123263
+-0.140702 -0.116041 -0.0937273 0.135206 0.112007 -0.0549318 0.0097323
+-0.0189892 -0.0941122 -0.136567 -0.041169 0.0800246 0.0887374 0.0141533
+-0.148689 -0.14829 -0.142357 0.0227182 -0.090651 0.123609 0.0208081
+-0.14877 0.105323 -0.100936 -0.0884676 -0.118898 -0.130214 0.0635899
+-0.127105 0.0125208 -0.00695408 0.0136048 -0.143893 -0.0909064 0.0541485
+-0.0169242 -0.078393 0.0641363 -0.129023 -0.0439865 -0.0926122 0.0785349
+0.102233 0.0181518 0.0741398 -0.120359 -0.0699596 0.0317246 0.0261806
+-0.0485861 -0.085642 0.133362 0.101745 0.00223944 0.126139 -0.0363134
+0.147574 -0.050396 -0.134334 -0.0949427 -0.134784 -0.0714207 0.113255
+-0.133133 0.108113 -0.0676188 0.130769 0.0750587 0.119601 -0.0274351
+0.0584047 0.0171742 -0.131771 -0.129168 0.0319371 -0.0387252 0.0804702
+-0.143578 -0.0289375 0.0459569 0.0178343 -0.0826935 0.0251686 -0.105605
+0.00729027 -0.040004 -0.0750128 -0.100395 -0.0499645 -0.105713 -0.138029
+0.106065 -0.0526687 -0.0673471 -0.0156689 -0.0976511 0.124586 -0.0494665
+-0.0262731 -0.0572895 -0.0431664 -0.0678085 0.132328 -0.0415095 -0.0356755
+0.0516783 -0.0467004 -0.0407006 0.0294756 0.111597 -0.0820459 -0.0798673
+0.0877687 0.0565628 -0.0726594 -0.0298497 0.0273784 0.123714 0.0953478
+-0.0578996 -0.0563484 0.0732273 -0.0939433 -0.0134044 -0.103775 0.0505915
+-0.0128405 -0.0187125 0.0214177 -0.0394197 -0.00312144 0.0010957 -0.12721
+-0.0986527 -0.0273788 -0.12769 0.0760943 -0.0367239 0.0532083 0.0574171
+0.12846 -0.0381186 -0.00238101 -0.0441273 -0.0870778 -0.0621075 -0.110292
+0.0414898 -0.127919 0.0265038 0.0708036 0.0287773 -0.131407 -0.0155435
+0.040803 0.0300598 0.0595005 0.0306868 -0.0814499 -0.022711 -0.0954945
+-0.040151 0.0284474 0.0798937 -0.00645906 0.115213 0.0168048 0.115433
+0.0947185 0.0977 -0.0432901 0.0244274 0.0219628 -0.126507 -0.126708
+-0.115355 0.0131409 -0.0178251 -0.113995 0.0885133 0.0886676 0.054478
+-0.123537 0.102725 0.0274028 -0.0201851 0.0359829 -0.130632 -0.0530071
+-0.0870958 0.13014 0.0436166 -0.129825 -0.0540442 -0.0877443 0.0241994
+-0.100787 -0.013293 0.128893 -0.054039 -0.0783347 0.103837 0.120657
+-0.0838516 -0.0818118 0.00488695 0.0341884 -0.00792697 0.0664923 0.0428005
+-0.10777 0.0932301 0.118478 0.0311577 0.0622649 0.112278 -0.0944156
+0.116036 -0.0546071 -0.0415273 -0.0994695 -0.0042225 -0.106228 0.0578003
+0.00560405 -0.0832121 0.0286824 -0.0455286 -0.00944815 0.0248472 -0.0749605
+-0.00915242 -0.012491 -0.0772782 -0.0780326 0.0426449 0.00624683 -0.0182367
+-0.110369 0.0203082 0.0388392 -0.0134558 -0.113461 0.0394771 -0.0305197
+0.0535718 0.0984983 0.0107777 0.0630689 -0.0685532 0.0743478 -0.059173
+-0.0254748 0.0385105 0.0820903 -0.0911478 -0.120632 0.125234 -0.0415189
+-0.0198608 0.122306 -0.0708164 0.0731587 0.0576574 -0.0779969 0.00798973
+0.0614933 -0.0739947 -0.0482081 -0.0301763 -0.0863928 -0.0123479 -0.100468
+-0.0553885 0.10061 -0.0871712 -0.0992769 -0.0412806 0.00637478 0.00683828
+0.00567641 0.00882006 -0.0507263 -0.00726054 -0.0316824 0.0720837 -0.00966656
+-0.00534259 0.0961286 0.0540446 0.0671545 -0.0480932 -0.0855013 -0.0767124
+-0.0603025 -0.0283065 -0.115748 0.0289509 -0.0606214 0.120343 -0.0549505
+0.119348 0.0432102 -0.0890348 0.112689 0.0359685 0.0076352 -0.0543289
+-0.0981038 0.0887975 0.0502702 0.0448753 0.0187022 -0.100448 0.117044
+0.0301797 -0.0562876 -0.118638 -0.0471621 -0.0536074 -0.010733 -0.0371306
+-0.0415894 -0.0232408 -0.00817158 -0.0322478 -0.0823216 0.057985 0.0184162
+-0.0729541 -0.0238277 -0.0764938 -0.0821643 0.0853423 -0.0191425 0.0456314
+-0.101011 -0.111164 0.0887079 0.108839 -0.0366411 0.0366845 -0.00794471
+0.0743201 -0.116002 -0.0880584 -0.117199 -0.0229633 -0.0431907 -0.0157511
+0.0352888 -0.0957762 -0.0969923 0.0871341 -0.0168125 -0.0847782 -0.0248615
+0.0266423 -0.108505 -0.0960715 -0.0161921 -0.115153 0.0824413 0.109353
+0.0430087 0.0247346 -0.073886 -0.0798892 -0.0428891 0.101965 0.0785867
+-0.0912218 0.076108 -0.0998503 0.0819016 0.0493919 0.101686 0.0925761
+0.0108485 -0.00341864 0.0582651 -0.0772319 0.0653804 -0.00490431 -0.0818488
+-0.0530744 -0.00234148 0.1021 -0.0181815 0.0673436 -0.0136986 0.0555192
+-0.0684297 0.0674482 -0.0522361 0.00339143 0.0189195 0.0797529 0.0596698
+0.0214301 0.00636965 0.0766288 -0.034823 0.0377106 0.00443192 -0.00475465
+0.0917248 -0.0711176 -0.0100447 0.0300136 0.0602811 0.0102313 0.0676439
+-0.039796 -0.112646 0.107967 0.107395 0.00903484 0.0965092 -0.0592804
+-0.106459 0.0604111 0.0907119 0.10979 -0.00141599 -0.0475283 -0.037476
+-0.110551 0.0193624 -0.0671819 0.0987725 -0.100837 0.0151567 -0.0613616
+-0.0399829 0.0113761 -0.020814 -0.0575396 0.0368101 -0.102924 0.0381659
+0.0154235 0.0737416 -0.0530872 0.042365 -0.10586 0.0209801 -0.0774718
+0.0965817 0.0366656 -0.0734282 -0.0118983 0.0414423 -0.020581 0.103915
+-0.0789889 0.0899482 -0.0592233 0.0434926 0.0242897 -0.0160691 -0.0504465
+0.0052492 0.0148264 -0.044935 0.0189129 0.0374787 0.0413752 -0.00717599
+0.0470786 -0.0687287 -0.0953715 0.0418426 0.0966302 0.0899492 -0.0423821
+0.0345056 -0.0288465 0.0772198 0.00742612 -0.0235636 0.0297662 0.0246235
+0.106263 0.0836961 0.0140199 -0.0648137 -0.00286074 -0.0929327 -0.030786
+-0.09722 0.00232895 0.0702008 0.0360142 -0.0431214 -0.0615409 0.0120698
+-0.0179491 -0.0369778 -0.102966 0.0383491 -0.0471985 -0.001574 -0.0932257
+0.0263893 -0.103223 -0.0657719 -0.0310277 0.0910421 -0.00489068 -0.0861269
+0.0399926 0.0380773 -0.0115539 0.0411883 -0.0379355 -0.0800769 -0.0805847
+-0.0813157 -0.0340343 0.0106786 -0.0194467 -0.0977389 0.0783219 0.00667025
+-0.0994575 -0.0922637 -0.0989971 -0.0583375 -0.0627319 -0.0632006 -0.0127436
+-0.0960202 -0.0458013 0.0291997 0.06792 0.0148387 0.0992669 0.0626022
+-0.0852894 0.050106 -0.00703903 0.0145449 -0.0673959 -0.066469 -0.0870324
+0.0671034 0.0673042 0.0684892 0.0827303 -0.0492994 0.0985079 0.0975959
+-0.0767962 -0.0354165 0.0787236 -0.0483149 0.085719 0.0174181 -0.0901367
+-0.0748318 -0.0168138 -0.0611439 0.0793303 -0.000382945 -0.0831188
+0.0348028 -0.0630469 0.0279596 -0.0758223 0.0889051 -0.0657222 -0.0351514
+-0.0108462 0.0206023 0.00342939 -0.056033 0.00170116 -0.0135202 0.0920253
+0.00821804 0.0627429 -0.0625612 0.0475009 0.0911915 -0.052369 0.0196653
+0.0436813 0.0480595 -0.0967523 0.0373786 -0.0284933 -0.0696583 0.0129352
+-0.0489368 -0.0366684 -0.0858022 -0.0854107 0.0254629 0.0806221 0.0843674
+0.0288046 0.0532854 -0.0407318 0.0770768 0.00574052 -0.00424772 -0.0410003
+-0.0636551 0.0470132 0.080742 -0.0683668 0.0397289 0.0391872 -0.013384
+0.0764705 -0.0771787 -0.00250281 0.00434914 0.0095641 0.0415522 0.0712155
+-0.065202 0.0915026 -0.0719902 -0.069749 -0.0429729 0.0211485 0.0375925
+0.0136204 0.0104715 0.0613622 0.0113693 0.0587059 -0.00777694 -0.0719939
+0.037853 0.0624963 -0.00244391 -0.0882534 -0.0211197 0.0498613 0.039521
+0.0554317 0.0586651 -0.0132119 0.00789909 0.0486014 0.0917666 0.021918
+0.0485426 0.00913585 0.0759319 -0.0672207 0.052421 0.0888714 0.0774803
+0.0197589 -0.057988 0.0406684 -0.0197807 0.0884112 -0.00177422 0.0392753
+0.022705 0.0633483 -0.0612946 -0.0309161 0.0848013 -0.00653231 0.0777233
+-0.0370621 -0.0503526 0.0113136 -0.0504009 -0.0286294 -0.0288821 0.0652834
+-0.0799183 0.0230335 -0.0454548 -0.0248015 0.0873202 0.0717325 -0.0821504
+-0.0150553 -0.0262376 -0.0178746 -0.0206601 -0.00478706 0.0732438 0.0113788
+-0.0674488 0.0260477 -0.00372725 -0.021158 -0.0486368 0.0873743 -0.0776077
+0.0188391 0.0735687 0.00740782 -0.0747897 0.0247785 -0.0824243 -0.0674632
+0.0673154 -0.050897 0.0485181 0.0626501 0.00544994 0.0529686 -0.00365343
+-0.00645985 0.0622872 0.0467649 0.0643953 -0.0315704 0.0299958 -0.0354854
+-0.0207879 -0.0487645 -0.0264784 -0.0759335 0.0658809 0.0760264 0.0113502
+;
+#A 4000 0.0232085 -0.00295692 -0.0037627 -0.0302234 0.0199647 0.0487856
+-0.0563897 -0.0430549 0.0182524 -0.0553319 -0.0117767 -0.0710143 0.0576602
+0.0151193 -0.0385029 -0.00116495 0.0134047 -0.0371417 0.0268056 -0.0787356
+-0.0287352 -0.0700739 -0.00614181 0.0035292 0.037925 0.0447966 -0.0270117
+-0.0111899 -0.0584252 0.0212179 -0.0495641 0.0494275 -0.0399874 -0.00156313
+0.00951535 -0.0654701 -0.0788001 0.0506299 -0.00318004 0.0389564 0.0417943
+-0.0826117 -0.00295447 -0.0373947 0.0213437 -0.0395203 0.0831919 -0.00135541
+-0.0396605 -0.0383961 0.0298691 -0.0469609 0.046156 -0.00677279 -0.00670764
+0.0332374 0.0367584 -0.0199451 -0.0299017 -0.0698981 0.0433913 -0.0246412
+0.0554748 -0.0500904 -0.0695468 -0.02356 -0.00693216 0.0161949 0.00728662
+-0.0499378 0.0116285 0.0506661 0.0190768 0.0629156 -0.0392995 0.0591692
+-0.0786462 -0.0348695 0.0602216 -0.0703871 -0.0558726 -0.0743552 -0.0376303
+-0.0731023 -0.0376348 0.0320921 0.0684899 0.081023 -0.0249217 -0.0659174
+0.0236278 -0.048032 0.0488733 -0.0746391 -0.0529973 0.053481 0.0610931
+-0.0500703 -0.0123857 0.0716112 0.050769 -0.0470996 0.00917141 0.0444948
+0.0419748 -0.0557659 0.0408033 -0.0391869 -0.00952783 -0.0584194 0.0415058
+0.0429153 0.00975938 -0.0459918 -0.0527684 -0.0465876 0.0773995 0.00565338
+-0.00609835 -0.0454705 0.0237648 0.0405301 0.0483184 0.0350996 -0.0461078
+0.0258797 0.0134373 0.0366518 -0.00598282 -0.0641379 0.0296166 -0.0274792
+0.00420166 -0.0691912 0.00849212 0.0675445 0.0368539 -0.0509026 0.0706284
+0.0588616 -0.0292046 -0.0333575 0.00557093 -0.056585 0.042427 -0.0194417
+-0.0600566 -0.0228791 -0.0601686 0.0316606 0.0298546 -0.0564214 0.0281264
+-0.0421375 -0.0321013 0.00861586 0.0615034 -0.0442022 -0.00940106 0.0682671
+0.0198141 -0.0506283 -0.000816518 0.0613501 -0.0224049 0.0727526 0.026645
+0.0102108 -0.0621173 -0.0298775 0.052307 -0.0527452 -0.0662842 -0.0419854
+-0.0667265 0.0312524 -0.0605519 -0.0539439 0.0507988 -0.0516462 0.0463087
+0.0654916 -0.0401101 0.00805014 -0.000735866 -0.0216371 0.0129501 0.0181212
+0.0464236 0.0235335 -0.060339 0.00224643 -0.0469302 0.00385983 -0.062532
+0.0517418 0.0693544 -0.0439005 -0.0688071 0.0697483 -0.0186708 0.058293
+-0.0119901 -0.00160754 -0.0567549 -0.0111007 -0.0457444 -0.0686136
+0.0485991 -0.0560067 -0.0603094 -0.0311315 -0.0347783 0.0671608 0.0274932
+-0.0338023 -0.0527029 -0.0724365 -0.0459632 0.0488177 0.0525665 0.0703671
+0.0600539 -0.00278851 0.0612016 -0.0330564 0.0254928 -0.0242087 -0.0644278
+0.0659684 0.0348146 -0.00816879 -0.0519871 -0.0274256 0.0229449 -0.0269983
+0.0563946 -0.0180679 0.0414729 0.0212699 -0.0314747 0.0578209 0.013648
+-0.012467 0.0203291 0.00107844 0.0251646 -0.061182 0.0226602 -0.0679105
+0.00956147 -0.0535254 0.0677524 -0.0455229 -0.0328604 0.0542836 0.0213329
+0.00101921 0.00426161 0.00245122 -0.0311841 -0.00298272 0.0579049 -0.0319819
+0.0602026 0.0550147 0.00833849 -0.0645982 0.0460022 0.00681244 0.0318528
+-0.0547733 0.0329283 -0.0529877 -0.0547249 -0.0413451 -0.050919 -0.0265143
+0.0429341 0.0337823 -0.0528125 -0.0323879 -0.0371068 -0.0151879 -0.0557561
+-0.0398862 0.00125247 0.0376735 -0.0452306 -0.0216141 0.0512187 0.0101807
+-0.0244687 0.0666922 0.0223105 0.0336601 -0.0257667 -0.0659288 -0.0533143
+-0.0568824 -0.0204123 -0.00913007 0.0495334 0.059042 0.00149375 -0.0199719
+-0.0204401 -0.0242784 0.0533368 -0.0547379 0.0274176 -0.0539052 0.00703998
+0.0122314 0.0207328 0.0082407 -0.0502405 -0.0580947 -0.0652968 -0.0408456
+-0.0300353 0.0500554 0.059924 0.0226976 0.0470676 0.0300832 -0.0521303
+-0.0434677 0.0420662 -0.0637253 -0.0282353 0.0472294 0.0487775 0.000406203
+-0.0564663 0.0256907 0.0520261 -0.0369613 -0.0564767 -0.00832827 -0.0490619
+0.0114895 0.0610402 0.0534141 -0.0617665 0.0463494 -0.0212997 0.00731406
+0.0640723 0.0283931 -0.0482548 -0.0415955 0.034499 -0.0355501 0.0641118
+0.0611263 0.00806472 0.0537014 -0.0194965 0.04187 -0.0621171 -0.0308196
+-0.0526858 0.0378897 0.0417617 -0.0327886 -0.038842 0.0533235 -0.0379307
+-0.0230401 0.0631726 -0.0354479 0.0606431 0.0038577 -0.0353015 0.0611083
+0.00986514 0.0525498 0.0322595 -0.0262471 0.0175871 -0.0425034 -0.034341
+0.0343512 -0.00582132 -0.00216965 -0.0308996 0.0194773 -0.0480123 0.0367159
+0.000979969 -0.0603171 -0.00716886 -0.0497715 -5.74132e-05 -0.0237112
+0.017545 -0.0457071 -0.0482234 -0.0428745 0.0270232 -0.0293815 0.0470682
+-0.0199057 0.017803 0.018121 -0.0528311 -0.047878 -0.0283641 0.0154843
+-0.0112566 0.0223315 0.0585076 -0.0163455 0.0208455 -0.0574329 -0.0449024
+0.0316602 0.0546824 0.0459631 -0.0378298 0.0104215 0.0239305 -0.0574579
+0.0187883 0.0470083 0.00134487 0.0373891 0.0287596 0.0176246 0.0211383
+0.0522366 0.0304413 0.0180927 -0.00520472 -0.00493491 -0.0245225 0.0203045
+-0.0441135 -0.0503216 -0.0423394 0.040382 0.0328318 0.0178739 0.0522771
+-0.0218727 0.0384792 0.0564295 0.0116536 -0.0395358 -0.0195086 0.0369713
+-0.00507094 0.00272098 -0.0548548 -0.0412066 -0.0344362 0.0572448 -0.0455309
+0.0260816 0.00545119 -0.0263728 0.0301343 0.0366202 0.0124376 -0.0470996
+-0.0048548 -0.0289829 -0.0459082 -0.0197317 -0.056052 0.0208885 -0.028215
+-0.009879 -0.0169501 -0.044545 -0.00561645 0.0561034 -0.0512953 0.0195345
+0.0183656 0.0340246 0.0159045 0.0147001 0.011293 0.0383048 0.0139301
+0.0205511 0.0161483 0.0285812 -0.0244202 -0.00411797 -0.00120473 -0.001106
+-0.0315709 -0.0190053 0.00879033 -0.0343857 0.0141961 -0.013577 -0.0283298
+-0.0163206 -0.018112 0.0241002 0.0172528 -0.0331261 0.0137344 0.0541693
+-0.00740887 -0.0146491 0.0238594 -0.0392272 -0.042653 0.0295971 -0.0437868
+-0.00104993 -0.0232523 0.0283198 0.00915047 0.0457421 0.00180389 0.00356868
+-0.052484 -0.00556803 0.0541313 0.0304336 0.046445 -0.0515958 0.0511773
+0.00641148 0.0217138 0.00164088 0.0439702 -0.00253807 0.0232517 0.0512915
+-0.011806 -0.047276 -0.0459035 -0.0337341 0.0340615 -0.00716726 -0.0350575
+-0.00532302 0.0286125 -0.0347484 0.0504601 0.00725448 -0.0316892 0.00142906
+-0.0507116 -0.0382314 -0.012945 0.0199415 -0.0199314 -0.042792 -0.00173364
+0.0123201 0.024731 -0.00536449 -0.0448082 0.0309147 -0.00904821 -0.018492
+-0.0267931 -0.00778724 0.0268095 -0.0269223 0.00179272 0.0369286 -0.0314397
+0.0145588 0.00223041 -0.0350915 0.0311863 0.0130095 -0.00934447 -0.0381999
+-0.00304966 -0.0491975 -0.0500033 -0.0168451 -0.0450088 0.0163931 0.0291041
+0.00727728 -0.036848 0.0340685 -0.0116662 -0.00148679 0.00103389 -0.0374032
+-0.0300421 -0.000105296 0.00117334 -0.00228839 -0.00488078 0.0444215
+-0.0437324 -0.0178209 -0.0426513 -0.00816167 -0.00153485 -0.0249988
+-0.00222452 0.00441124 0.045266 0.0214263 0.0356299 0.0246222 0.0351585
+-0.0465375 -0.00904492 -0.00394886 0.0319304 0.0254875 -0.022898 0.00386978
+0.000347115 -0.0441399 -0.0371762 0.0367699 -0.0380647 0.0133768 0.0159541
+-0.0213193 0.0226873 0.0139755 0.0195783 0.0227935 -0.0215736 -0.0487342
+-0.0358417 0.0125099 -0.00821951 0.044817 0.0109874 0.00481487 0.0474796
+0.0249953 0.0382578 -0.0383005 -0.0158843 0.0264883 -0.0437816 -0.0379181
+-0.0107408 0.0216199 -0.00929034 0.0435413 -0.011691 -0.0284183 -0.0354493
+-0.0250706 -0.00738957 -0.00160084 0.0226224 0.0250018 0.0291519 -0.00179127
+-0.0331567 0.00424755 0.0478301 -0.0398232 0.0225477 -0.0167039 -0.00145396
+0.0148112 0.0331616 -0.0322901 -0.0219004 0.028229 -0.0166997 -0.0152668
+-0.0303827 -0.0105952 0.0116113 0.00215041 0.0378414 0.0336669 0.0216083
+-0.0329385 0.0246664 0.0180005 0.0311766 -0.0386748 -0.0200423 -0.0254794
+0.0216373 0.00205767 -0.0026129 0.0157657 -0.0462159 -0.0365779 0.0307631
+-0.0139408 0.0394106 -0.0117476 -0.0299753 -0.0208686 -0.0361304 -0.0126577
+-0.0301614 0.0351149 0.0423119 0.00348616 0.0104074 -0.040338 0.0271404
+0.0388229 -0.00377744 -0.00465373 0.0270036 0.00058781 0.0124913 0.039063
+0.0130591 0.0354801 0.00649493 -0.00799274 0.0410164 -0.0289106 -0.0021224
+0.0335194 -0.00719606 -0.0314962 -0.00957143 0.00862059 0.0229873 0.0112813
+0.0433841 0.0209205 -0.0155161 -0.0329042 -0.0398198 -0.0403796 0.00815549
+0.0277006 0.0333835 0.0408551 -0.0225481 0.00379061 -0.0283602 0.0261624
+-0.0306885 -0.0116726 0.0437106 -0.0145126 0.0439009 -0.0332225 -0.0316633
+0.00679859 0.0173038 -0.013825 0.00471999 0.0222479 0.00680166 -0.00827523
+-0.0172671 0.00998321 -0.0192239 0.0380591 -0.00974715 0.038819 -0.00663069
+-0.00415495 -0.0191781 -0.0133687 -0.0412435 -0.0206221 -0.0257818
+-0.0219611 0.0132269 0.00974006 -0.0276068 -0.027113 -0.0122657 -0.0350041
+0.0275005 -0.0142673 -0.0156015 -0.0194604 0.0306659 -0.0199164 -0.0198592
+0.00947517 -0.00495544 0.0414039 0.0129279 0.00848902 -0.0280356 -0.0254557
+0.00414192 -0.0285504 0.0323534 0.0280198 -0.0146886 -0.0167676 -0.0245948
+0.0263374 -0.0371355 0.0417638 0.0280166 -0.0340907 0.0158902 -0.0113252
+0.00561381 0.0344036 0.0378688 -0.0387572 -0.0327194 -0.0134105 -0.0387978
+0.026158 0.00732316 -0.0393751 0.0382705 0.00761807 0.0312192 -0.0214935
+0.0263325 -0.00280985 0.00876339 -0.0291963 0.0092623 -0.0279623 0.0372623
+-0.0155016 0.0373925 0.0129782 -0.0240901 -0.000382024 -0.00063029
+-0.0303984 -0.0396524 0.0134525 -0.037749 -0.0382185 -0.0033881 -0.0183828
+-0.000140294 0.00388887 0.0271782 0.021568 0.00521532 -0.0212649 -0.0245851
+-0.00874191 -0.0329973 0.0312623 0.00826409 -0.0257638 -0.0192993 0.0185333
+-0.0215308 -0.0205771 0.00182865 0.0221678 -0.0320758 -0.0160253 -0.0198682
+0.000660462 0.0104033 -0.00520725 -0.0291332 0.0194919 0.0367563 -0.0286114
+-0.0110771 0.0259347 0.0363141 0.0042874 0.00293622 0.0382681 -0.0385143
+-0.0355985 -0.0122022 -0.0380717 0.00275173 0.0318358 0.0338793 -0.0297797
+-0.0112633 -0.00243917 -0.0277539 -0.0282676 0.011427 -0.0166744 -0.0130673
+0.0293463 0.0219637 0.016172 -0.0289725 0.0250573 0.0270533 0.0131094
+0.0205053 0.0358969 0.0338678 0.0126391 -0.0120052 -0.0371907 -0.0226067
+-0.0336317 0.0093574 0.0164499 0.00716317 0.00576894 0.0218776 0.00899573
+-0.00153709 -0.0278492 0.0237625 0.0273851 0.0275101 0.0210411 0.0106127
+-0.00784759 -0.00152568 -0.0324362 -0.0308996 -0.0131359 0.00161629
+-0.00213867 0.000108056 0.00737141 -0.0194758 -0.0181708 -0.0210741
+0.0296536 -0.0233513 -0.00517655 0.0115864 0.0210976 -0.0161077 -0.0318391
+-0.0139962 -0.0302747 0.00704774 0.0211407 -0.0119257 0.00342778 0.0281486
+0.00610502 -0.0342753 0.0182799 0.0278164 0.020619 0.0318338 -0.0180253
+-0.0118973 -0.00897804 0.0240822 0.0325911 0.0205736 -0.000439841 -0.0131164
+0.0216454 -0.0258035 -0.0199313 -0.0169216 0.0104289 0.0294133 0.00646299
+0.0343042 -0.00699336 -0.0131239 0.0265836 -0.0253401 -0.00381108 0.035079
+-0.0280135 -0.00684215 -0.0160239 0.00875539 0.0226003 0.0255409 -0.00843269
+-0.0249587 -0.0245871 -0.0199702 -0.00500268 0.0227476 -0.0339641 0.00947815
+0.00929899 -0.029653 0.013679 -0.000594559 -0.00559267 0.0293031 0.0079757
+0.0148724 -0.013213 -0.00815607 -0.0123639 0.0339289 -0.0288844 -0.00558602
+0.0194138;
+#A 5000 0.011794 -0.023335 0.0195792 0.0291025 -0.00562236 -0.0153483
+0.00357997 -0.00770151 0.00909717 -0.0100473 -0.00818514 0.0023615
+0.0089601 0.0108067 0.00474749 0.0177341 0.00250366 -0.0189739 0.0243105
+-0.0333674 0.0301901 -0.00483403 0.0306426 -0.00112348 -0.00822323
+0.0326775 0.0213102 0.0187695 -0.0087805 -0.0298401 0.0135209 -0.0276573
+-0.00296547 0.00493955 0.0298277 0.012313 0.0200528 -0.03056 0.00231328
+0.0208099 0.00885818 -0.0147446 -0.0109534 0.00758571 -0.00803555 0.0115444
+-0.0208973 -0.0047034 0.00573858 0.00375047 0.00972034 -0.0115607 0.00802264
+0.0199435 0.00681596 0.0234824 -0.0293348 0.0195667 -0.001767 -0.0224462
+0.0176703 0.00283818 -0.013611 -0.0281063 -0.0294261 -0.0283942 -0.0010303
+0.0189098 0.0312762 -0.0296071 -0.00407273 0.0101747 -0.02091 0.0159894
+0.0151751 -0.0277165 0.00752312 -0.0182507 -0.0148558 0.0184244 0.0213509
+0.000820939 0.0263058 0.00475986 -0.00412142 0.00280555 -0.0170212
+0.0189312 0.00113172 0.0218175 0.00453768 0.00535973 0.0245663 0.0182178
+-0.0136914 -0.0300476 0.0290831 0.02761 -0.00816106 0.0108763 -0.00575712
+0.0153209 -0.0234047 -0.0025652 0.00215573 -0.00641798 -0.00953584
+0.00198757 0.00231762 0.0295187 -0.00370301 0.00947679 -0.00933436
+0.0264409 -0.0202738 0.0111224 -0.0116462 0.00691194 -0.018946 -0.0093047
+0.00608635 -0.0156492 -0.00825471 -0.014183 -0.00553767 -0.0279252
+0.0173518 -0.0158998 0.0184068 0.00694272 0.0054242 0.0144424 -0.00178177
+0.0099006 -0.00336844 0.0148623 -0.0273405 0.0178337 0.022197 0.0119439
+-0.0112646 0.0140386 -0.0106163 0.0180122 -0.0202539 0.0109307 0.0213784
+0.00371602 -0.0192908 0.0289985 0.0199365 0.0016619 -0.0234802 -0.0248305
+-0.0244316 -0.00892402 0.0276999 -0.000926093 0.025319 -0.0279166 -0.0229266
+-0.00501592 -0.0202896 -0.00483199 0.00630874 -0.013418 -0.0127354
+-0.0235411 0.0267571 0.00479899 -0.0236766 -0.0147266 -0.0223787 -0.0170078
+0.000869558 -0.0258323 -0.0104767 0.00661562 0.0010565 -0.0206533 0.024914
+0.0100474 0.0037721 -0.00564504 0.0165739 -0.00264078 0.0254048 -0.0276773
+-0.0114254 -0.00650337 0.0187751 0.00821754 -0.00583379 0.0105602 -0.0266668
+-0.0215112 -0.0135702 -0.0262893 -0.00104969 -0.0272616 0.00774709
+-0.00853758 0.0107151 0.0169605 -0.0216254 -0.022073 0.00777973 -0.0190075
+0.020625 0.0045367 0.00582445 -0.0104339 0.00329198 0.00728507 0.0118011
+0.0269013 0.000558021 -0.00048552 -0.0140847 -0.00522203 -0.0255445
+0.0245787 0.00527942 -0.00377134 -0.0136796 0.0164392 -0.0162625 -0.0135448
+0.0172811 -0.00420916 0.022249 -0.0240094 -0.00804154 0.00991048 -0.00232563
+-0.0220275 -0.000955787 -0.0179544 -0.00977216 0.0224331 0.0209739
+-0.00309348 0.00633736 -0.0257301 0.0231549 0.0180547 0.00836457 -0.00670235
+-0.0241312 -0.0108565 -0.01758 0.011053 0.0178038 -0.00297904 -0.00855139
+0.00773135 -0.015522 -0.0195589 0.0085583 -0.0133518 0.0128526 0.0225487
+-0.00225824 0.0132192 -0.00552192 -0.0142598 -0.0202987 0.0113768 -0.00436293
+-0.0192834 -0.0181217 -0.0169494 -0.00370834 -0.0229671 -0.0227786
+-0.0176028 -0.024228 -0.0103294 0.012895 0.00295277 -0.0163752 0.0228927
+0.0231382 -0.0198241 -0.00338745 -0.0217258 -0.0169829 0.00511858 0.0153656
+0.0238241 -0.00390502 0.000543026 -0.00215885 -0.0216081 0.0223212
+0.00900532 -0.0209824 0.00233115 -0.00638642 -0.00475563 -0.0207349
+0.0102267 0.0117699 0.00764262 0.000485487 -0.0120865 -0.00596644 0.00750027
+0.0102399 0.0222689 -0.00626576 0.00507691 0.0108058 0.00466612 0.0184326
+0.0114898 -0.00178554 -0.0214255 -0.0151043 0.00389931 0.00611453 0.011779
+-0.00255227 -0.00109455 -0.00630907 -0.0111268 -0.0107363 -0.00655222
+0.00916807 -0.0106535 -0.0236316 0.013587 0.00682021 0.00740389 0.0105095
+-0.0143288 -0.0140463 0.0195057 -0.0189149 -0.00293892 0.0209033 0.0150488
+0.0170115 0.00244874 -0.000531779 -0.00864751 -0.0158598 0.0134123
+0.00520285 0.0065825 0.00122747 0.0174485 -0.0136396 0.0125668 0.0106209
+0.00256686 0.0188095 -0.021408 -0.00995505 -0.00737002 0.00241848 -0.0224321
+0.0104947 0.00209399 -0.00934 0.00881614 0.00918312 0.00332746 0.00226015
+0.0177739 0.00872401 -0.00375418 0.00687959 0.0163251 0.00463709 -0.00249016
+-0.0103907 -0.0127825 -0.0211019 -0.00346187 0.0025176 -0.0195749 -0.00903949
+0.0127224 -0.0182452 -0.0037449 -0.0104937 -0.0147896 0.000441033 0.0151126
+0.0150496 -0.0151211 0.0198974 -0.00648868 -0.00881631 -0.00675153
+-0.0130507 0.00222756 -0.00907579 0.00369085 0.00471282 -0.0200166
+0.00682551 0.000475485 0.0109861 -0.0189455 0.0194092 -0.00761342 0.01566
+-0.00415192 0.00988988 0.0131523 0.0202126 0.00164586 0.00466115 0.0042258
+0.014235 -0.0200796 -0.0200053 0.00953259 0.00394879 -0.0137527 0.0133437
+-0.00601983 -0.0129815 0.0174546 -0.00236343 0.014976 0.00177654 0.0192543
+-0.0165936 -0.0200737 -0.00308647 -0.0121312 -0.00101508 0.00576133
+-0.0135534 -0.00414842 -0.00977185 -0.0110888 -0.0176665 0.020201 0.000103915
+-0.0162106 0.00129614 -0.00797941 0.00313392 0.00446713 0.0200555 0.0193115
+-0.0195953 0.00610523 0.00345976 0.000568659 -0.0177625 -0.00056385
+0.00307489 -0.00830557 0.0164053 0.00981673 -0.000337955 0.00587092
+0.0102994 0.00716086 -0.0179399 -0.00965425 0.00552933 0.0086652 0.0137781
+0.0143474 0.0166241 -0.0113579 0.00810173 -0.0171289 0.00335139 -0.000136389
+0.0164448 0.00379564 -0.00746737 -0.0155033 -0.0156839 0.00369368 -0.0108057
+-0.00556354 0.0161697 -0.00643513 -0.00174482 -0.016307 -0.00390513
+-0.01541 -0.00325067 0.00679664 -0.0106832 -0.00609779 0.013787 -0.0060264
+0.00175911 -0.0176059 0.00505219 0.00626133 0.00710359 -0.00326446
+-0.00914656 -0.00711672 0.00188894 0.00994349 -0.0109982 -0.0137967
+0.0112302 0.00518609 0.0163556 -0.0041245 0.00878321 -0.00932251 0.00495372
+-0.00866801 0.0188272 -0.0142209 0.0132164 0.00734867 0.0176389 0.016903
+0.00830682 -0.00676318 0.015767 0.0105981 -0.0180293 0.0118356 0.0166987
+-0.00292938 0.016494 -0.00390031 0.00456486 -0.0165654 0.00629518 0.00270334
+-0.0031696 -0.0125936 0.00468887 -0.0108615 0.0127615 0.00579049 0.0015124
+0.00919078 -0.00288787 -0.0069744 -0.010072 0.0110847 -0.0083595 -0.00520093
+-0.0140943 0.0130941 0.00291248 -0.00249142 0.0019882 -0.00552807 0.00907188
+0.00701001 0.0128446 0.0138812 -0.00669456 -0.0091914 -0.0155814 0.0118771
+0.00306768 0.0089601 4.87688e-05 -0.0165753 -0.0142439 -0.00446496
+-0.0153819 0.0127401 0.00882866 0.0138197 -0.00838846 -0.000717258
+0.00788621 -0.0136064 0.0173182 -0.00434114 -0.0120628 0.000557328
+-0.013825 -0.0130131 0.00130062 -0.0119241 0.00544472 -0.00266774 0.0136734
+0.0106791 0.0168159 -0.00526431 0.00662529 -0.00458634 -0.000645557
+0.0134741 -3.9694e-05 -0.000295426 -0.0129974 0.00815489 -0.00329835
+0.000379739 0.00903147 -0.00766313 -0.0109274 0.0023256 -0.0100161
+0.0125098 -0.0103888 -0.016187 0.0144716 -0.00322135 -0.0141911 -0.0140297
+0.00632885 -0.0156198 -0.0120266 0.00773087 0.00883036 -0.00943039
+0.00087353 0.0118156 -0.0159113 0.0162683 -0.0120294 0.00485543 0.00602778
+-0.000212966 -0.00699858 -0.00811812 0.0127374 0.00762 -0.0121463 0.0057338
+0.0152191 0.00373511 0.00997474 0.013611 -0.000622422 -0.00921167 -0.00405898
+-0.00366005 -0.0155302 -0.00623179 -0.00118671 0.00109995 0.00743866
+-0.0120657 0.00605737 0.00837801 0.00376192 -0.00333946 0.0102448 0.00211353
+0.00220577 0.00356102 0.00619844 0.0139441 -0.010854 0.0016684 0.0119057
+-0.0152422 -0.0103855 -0.013929 -0.0133092 0.0148162 0.0127014 -0.0141117
+-0.00589344 -0.0102384 -0.00916879 0.00964585 0.0100435 0.00215131
+-0.00772844 6.60042e-05 0.00737175 -0.00450362 -0.0125272 0.0136496
+-0.000460775 0.0108109 0.0139025 0.0039098 0.0139418 0.00521247 -0.00768274
+-0.0151775 -0.00242032 -0.0121441 -0.00326192 0.0148182 -0.00927056
+0.00796059 -0.00516314 0.00772112 -0.0136727 0.000215002 0.00966329
+0.00737751 -0.00393126 0.00178057 -0.000231045 0.0132805 -0.0122922
+0.0125806 0.0033438 -0.00273845 -0.0050877 -0.014159 0.00414198 -0.0138216
+0.00971385 0.00317629 0.000276221 0.00237725 -0.0115982 0.011698 0.00499187
+0.0133066 -0.00401141 0.0141446 0.0109956 0.00636107 -0.00976566 -0.000792338
+0.00661025 0.0107527 0.0098179 -0.00330331 0.0130513 0.0107277 0.00444097
+-0.00541295 -0.0013376 0.0118424 0.00629169 0.00861314 -0.0116223 -0.00165359
+0.00453897 -0.0136798 -0.00758352 0.0123301 -0.0135285 0.00381468 -0.0134026
+0.0119324 -0.00153256 0.0135537 -0.00143586 -0.00663921 0.00202939
+-0.00145424 -0.0111718 0.00449651 0.00591836 -0.0104056 0.00640195
+-0.00146417 -0.00672711 0.00589206 0.00103691 0.00269587 0.00947889
+0.00436132 -0.00817976 -0.013467 -0.00629897 0.0017077 0.00490634 -0.0130369
+-0.00934676 0.00881372 0.0064038 -0.0082985 -0.00368064 0.00105433
+-0.00707307 -0.00478192 -0.00936201 0.00405569 -0.00815587 0.00590702
+-0.0107118 -0.00414202 0.00129476 0.00625843 0.00708817 0.0054154 0.00530941
+0.000686702 -0.0106288 0.00251357 0.00831386 -0.0108688 0.00298791
+0.00872527 0.00928518 0.000660167 -0.00553394 0.00158073 -0.0036277
+0.0017622 -0.00660237 0.0109083 -0.0127224 -0.00382097 -0.00891224
+0.0110275 0.0100457 -0.00135313 -0.00250879 0.00347453 0.000713521
+-0.00983129 0.0128053 0.000837871 0.00540863 0.0090991 -0.00641546
+-0.00803903 0.0127052 -0.00890005 -0.008448 -0.00922506 -0.0121532
+0.000358595 0.00348523 -0.0111269 0.000438879 0.00638975 -0.00432599
+-0.00877099 -0.00935755 -0.000134803 -0.00361586 0.00705568 0.0105808
+0.0113129 0.00499092 -0.00251181 0.00523848 0.0115313 -0.00318519 0.00407405
+-0.0109854 -0.00614844 -0.00453025 0.0089713 -0.0103979 0.010858 -0.0100695
+0.00126864 0.0119713 -0.00331934 -0.00578554 -0.00136575 -0.00253582
+-0.0111106 0.00226965 0.00179003 -0.00458614 0.0117681 0.0105192 0.0045464
+0.0111329 -0.0066591 0.00975511 0.00949084 -0.00389633 0.000969593
+-0.00484972 0.00156428 -0.00125597 0.0010522 -0.00630323 -0.000666371
+-0.00256996 0.00967127 -0.00931685 -0.0070897 -0.00863617 0.00973146
+-0.00679495 0.00664627 -0.0107553 -0.00678334 -0.0073555 0.0028328
+-0.0074993 0.00785706 -0.00794663 0.00244377 -0.00361091 0.000499738
+0.00385415 0.000715035 0.00828348 -0.00761224 -0.00390454 0.00554149
+-0.00884904 0.00354493 -0.00581734 -0.0106556 0.00757721 0.00798714
+-0.00755903 0.00646172 -0.00789588 0.00880257 -0.00193197 -0.00252052
+-0.00298339 0.00424432 0.00086599 0.00810739 0.000173593 0.00510825
+0.00520783 0.00614126 0.00229457 -0.0094382 -0.0110126 -0.00254995
+0.00511274 0.0032377 -0.00947284 -0.0102886 0.00671566 0.00548167 -0.00991932
+0.00653304 -0.00841475 0.00744598 0.00753517 -0.00215317 0.0023745
+0.00123881 -0.0033708 -0.00351567 0.00961403 0.0104291 -0.00437929
+-0.00453368 -0.0049478 -0.00677792 -0.0106788 0.00571421 0.00553373
+0.00995161 0.00452391 -0.0103609 0.00876115 0.00880707 0.00649518 -0.00757657
+0.00184018 0.00330433 0.00409766 0.000993472 0.00603217 -0.00238106
+-0.000301685 0.000982104 -0.00612623 0.00295712 -0.00203754 -0.00456782
+0.000256376 -0.00358335 0.00918037 0.00737128 -0.00227146 0.00995883
+0.0062105 0.00528483 -0.00353867 -0.00375995 0.000460811 -0.000427725
+-0.00698899 0.00947917 0.00855573 -0.00130174 -0.00316505 0.000626231
+-0.00513888 -0.00794333 -0.00959825 0.00693421 -0.00817165 -0.00135494
+0.00588952 -0.000103875 -0.0085644 -0.000652357 -0.00495887 0.00198118
+;
+#A 6000 -0.00570322 -0.00447865 -0.0043397 0.00652218 -0.00709481 -0.00838182
+-0.00793983 0.0035901 0.00945395 0.00290804 -0.00921651 -0.00967486
+-0.00919485 0.0093202 -0.00847386 0.00520904 -0.00660879 -0.00674357
+-0.00707267 -0.00795935 0.00954667 0.000196531 -0.00664793 5.74777e-05
+0.00606852 -0.00875444 0.00599406 -0.000125537 -0.00514972 -0.00875745
+-0.00737619 -0.00460677 0.00150842 0.00925627 0.00289913 0.00440645
+-0.00733838 0.00418025 0.00337703 0.00701451 0.00722648 0.00593873
+0.00678984 -0.00619318 -0.00100098 -0.00474514 0.00641145 -0.00153918
+-0.00501351 -0.0043192 0.000429743 0.00470691 0.00422804 0.00152915
+-0.00747768 0.0077937 -0.00156794 0.00428469 0.00609792 0.00547062
+-0.00205094 0.00447308 0.0027717 -0.00618855 0.00547681 -0.00850097
+-0.00238274 0.00370864 -0.00846104 0.000512816 0.00451144 -0.00268473
+0.00116592 -0.0067849 -0.00324647 0.00397147 0.00355538 -0.00425668
+0.00640954 0.00806337 0.007616 0.00678378 0.00437298 0.00352057 -0.006564
+0.000978523 0.00790908 -0.00168019 -0.00107751 0.00631138 0.00599533
+0.00578724 0.0081389 -0.00752588 0.00408646 0.0059702 -0.0054637 -0.00858825
+-0.00579754 -0.00145522 -0.0073227 -0.00470899 0.00728165 0.0069051
+-0.00730967 -0.00150545 0.00647672 0.00149735 0.00366194 -0.00838924
+-0.000374832 -0.00122974 -0.00731579 -0.00652773 -0.00759172 -0.00685793
+0.00603223 0.00265052 0.00575305 -0.00446075 -0.00101701 0.00467671
+0.005519 -0.00811778 -0.00163843 -0.000343813 -0.00452201 0.00595735
+-0.00785912 0.00016791 0.0045331 0.000481177 -0.00136025 0.000680868
+0.0051469 -0.00276325 -0.000745286 0.000772739 -0.00742422 0.00293254
+-0.00128592 -0.000688605 -0.00713458 0.00600986 -0.00106583 -0.00715026
+0.0025631 -0.00646056 0.00171886 -0.00601867 0.00612158 0.00322696
+0.00740005 0.00550956 0.00453673 0.00392505 -0.0061616 -0.000516313
+0.00761124 0.00392338 0.00186975 -0.00529232 0.00698131 0.00337108
+-0.0040963 -0.00451536 -0.00721366 -0.0012427 0.00409687 -0.00179516
+-0.00328285 0.00647386 0.003664 0.00153735 0.00707133 -0.00245462 0.0051299
+0.00481272 0.00493074 0.00580417 -0.00691799 -0.00490422 -0.00475159
+-0.00589517 0.00110445 -0.00124221 0.00294809 -0.000484902 0.000277398
+0.00015137 0.00562472 -0.00666164 -0.00332831 0.000899421 -0.0012883
+0.00213544 0.00309042 0.00677626 -0.00448499 0.00687569 -0.00655839
+0.00404458 -0.00577648 -0.00404707 0.00140575 -0.00126649 0.000812072
+0.00533673 -0.00620354 4.41353e-05 0.00401003 0.00170354 0.0049924
+-0.00645399 0.00519603 0.0035215 0.00442806 0.00494526 0.000681385
+0.0012084 -0.00633715 -0.00586083 0.00375201 -0.00262531 -0.00291554
+-0.00264985 0.00583282 0.00677645 -0.00692467 0.000267408 0.00579844
+0.00368968 -0.00177472 0.0010855 0.00679995 0.000122758 0.00583166
+0.00523548 -0.0041251 -2.53327e-05 0.00616941 -0.00384253 0.00354661
+-0.000392576 0.00257688 0.00658872 -0.00653203 0.00548864 -0.00377223
+-0.000187408 -0.0023093 0.000236237 -0.00479687 0.00247366 0.000144412
+-0.00570199 0.00637643 -0.00640608 -0.00424227 -0.00142989 -0.00252244
+0.00163066 0.00398428 0.00137108 0.00362175 0.00194547 -0.0010796 0.00256626
+0.00176679 0.0062276 -0.00309467 -0.00293094 -0.00320228 -0.00555314
+-0.00649318 0.00144863 -0.00331446 -0.00402584 0.0037118 0.00483936
+-0.00169543 0.00254426 -0.00604689 0.00237577 -0.00366 0.00351545 0.0061645
+0.00492222 0.00146122 -0.00256746 0.00594143 0.000650396 0.00374092
+0.00631955 -0.000428623 -0.00280288 -0.00249915 0.00425296 0.0048905
+0.00247389 0.00207205 0.00223507 -0.00491864 -0.00316483 0.00378491
+-0.00406631 0.00316984 -0.00367661 -0.00375972 0.0051286 -0.00294593
+0.00556332 0.00364787 0.00407355 0.00173862 3.28866e-05 0.00232997
+0.00416101 -0.00566787 -0.00271189 0.000217296 0.00296157 0.0060023
+-0.00457923 0.00159063 -0.00148797 0.000351654 0.000998788 -0.00582986
+-0.00592717 0.00459883 -0.000770127 0.0052337 0.00567257 -0.0048552
+-0.000597726 -0.0013158 0.00139299 -0.00296905 -0.000961222 -0.00334943
+-0.00139248 0.000758566 -0.000819108 -0.00519409 -0.00295937 -0.00411034
+-0.00126598 0.00575326 -0.00155944 0.000455269 0.00346974 0.00559425
+0.00534368 -0.00560721 0.00312315 -0.00572429 -0.000124678 0.00115189
+-0.00216995 0.00521385 -0.00561396 0.0044913 0.00371405 -0.00133451
+0.00392491 0.000914768 0.0048232 0.00351704 0.000169633 0.00249119
+-0.000865149 0.00532587 0.00358741 0.00342586 0.00113506 0.00218809
+-0.00224852 0.000403272 0.00294683 0.00063136 0.00360218 -0.00158013
+0.00543662 -0.00200175 0.000709361 0.00276262 -0.00357119 -0.00461073
+-0.00470699 -0.0022236 -0.00269078 -0.00338843 0.00209679 -0.000959598
+0.00313796 0.0044886 -0.00243988 0.00469972 0.00242487 0.00401584 0.00500083
+-0.000891066 -0.00122546 -0.00359965 -0.000344482 -0.00415781 0.0027435
+-0.00237994 -0.00169673 0.0031223 -0.00470681 0.00314136 0.00217102
+-0.00157792 -0.000949771 0.00324864 -0.00359902 0.00473037 0.00502376
+-0.00480421 0.00346058 -0.00283585 -0.00306908 0.00252832 0.00435907
+0.00424503 -0.00257584 -0.000241485 -0.00274146 0.000318125 0.00392117
+-0.00118808 -0.00412203 0.0006699 -0.000286332 -0.00063445 0.000472918
+0.000689999 -0.00299858 -0.0016545 0.00224191 0.00417085 0.0015336
+-0.00342328 -0.000118605 -0.00118747 0.000777475 0.00271026 -0.00166069
+-0.00132269 0.00378446 -0.00439403 0.000324111 -0.0048448 0.00435902
+0.00187618 0.000572443 0.00388358 -0.00376661 0.0046025 0.00192439
+0.00208894 -0.00043276 -0.00354637 0.00456001 -0.000825786 0.00334023
+-0.000142944 -0.0019605 -0.00176253 -0.00274092 -0.000667061 0.00296384
+0.00367993 -0.00465371 -0.00430577 0.00136595 -0.00174363 -0.00416508
+5.4845e-05 0.00190514 0.00194718 0.000377468 -0.001856 0.00354122 -0.00238809
+-0.00188939 -0.00387527 -0.000494484 0.00325548 -0.0018559 -0.00132489
+0.00150993 0.00329367 -0.000278264 0.00375311 0.00218339 -0.00275456
+0.001742 0.00429865 0.00387615 -0.000439828 -0.00370054 -0.00346178
+0.00410798 0.00178555 8.5822e-05 0.00339224 0.00145151 -0.00429751
+-0.00115119 -0.00172806 0.00335812 0.00205153 0.000996019 0.00398642
+0.00106922 0.000467772 -0.00411921 0.00384463 -0.000496191 -0.00199914
+0.00195315 0.000226245 -0.00336411 -0.00143821 0.00405345 0.00040218
+-0.000116104 -0.00300518 -0.00283273 0.000828467 0.00169684 -0.00341477
+-0.00321241 0.00360331 0.000191778 -0.00137282 0.000789467 -0.00321108
+-0.00397042 -0.00133701 -0.00353439 -0.000264215 -0.000250179 -0.00267769
+0.00227221 -0.00244035 -0.000185492 0.00046219 0.00355101 -0.00121823
+-0.000776099 0.00100131 -0.00146032 -0.000632884 -0.0040171 -0.000120965
+-0.00390938 0.00258878 -0.00147856 7.27925e-05 -0.000523017 -0.00387894
+0.00259002 -0.00112165 0.00081854 -0.00051505 0.00277914 0.00224479
+0.00137916 -0.00270149 -0.002342 -0.00267588 0.00163964 -0.0015441
+-0.00336015 0.00210629 0.00150747 -0.00225274 -0.0024877 0.00278617
+0.00244658 -0.00119675 -0.00239757 -0.000679584 0.00377146 0.00356494
+-0.00125804 0.00142345 0.00100273 0.000310673 -0.00123811 0.000158328
+0.00127412 0.0030484 0.00027143 -0.00107729 0.00248735 -0.00239672
+-0.0014675 -0.0034669 -0.00246139 -0.000478933 0.00134645 -0.00122935
+0.00235249 -0.00289891 -0.00156293 -0.00177095 -0.003396 -0.00253654
+-0.000311373 -0.00306275 -0.000249744 0.00346336 0.00107112 -0.00274107
+0.0011735 -0.00298394 -0.00299706 -0.00142962 0.00264445 3.7643e-05
+0.00109791 -0.000570788 -0.00329633 0.00316035 -0.00308219 -0.00211852
+-0.00283544 0.00150027 -0.00186509 -0.00298058 -3.8477e-05 -0.000860678
+0.00309285 0.00158349 0.00309149 -0.00221238 0.00159396 -0.000843301
+-0.000199285 -0.00200043 -0.00313551 0.00224219 0.00118295 -0.00137142
+0.000953036 -0.00177081 -0.00171165 0.00139588 -0.00184153 0.0012838
+0.00181769 0.000104944 -0.000851724 -0.000374557 0.00137421 0.00208226
+0.000945936 -0.00330075 0.00129221 0.000573518 -0.00330378 0.00260766
+-0.002838 -0.000613219 -0.000219534 -0.00194837 0.000851609 0.00213776
+-0.00324207 0.00238679 0.00107862 0.000354471 0.00109193 0.00139112
+-0.00173112 -0.000888298 -0.00308811 -0.00155819 0.00106979 0.0016091
+0.00159336 -0.00179553 -0.000787975 -0.000806378 0.00063396 0.00209535
+0.00216238 -0.00201451 -1.67794e-05 0.00238587 0.00258593 -0.000931098
+0.00284618 -0.000117558 -0.00116463 0.00279147 0.00143573 0.000761398
+-0.000503515 -0.000948251 0.00129045 -0.000223791 -0.00128649 -0.000827047
+-0.00266098 -0.000856781 0.00263298 -0.00172005 0.00085221 0.000962359
+0.00203107 -0.0020965 0.000777521 -0.00151143 0.00137948 0.00224661
+-0.000354447 0.00190892 0.000702389 0.00132761 0.00213337 0.00261426
+-0.00264768 0.000330986 -0.00023868 0.00188377 0.000817171 -0.000376495
+-0.00161819 0.00204246 0.00203329 -0.0026721 -0.000235097 0.00233353
+-0.0028177 0.00179812 0.00260218 -0.000739494 0.000428464 0.00233469
+-0.000783066 0.00247251 0.00100424 0.0018425 0.00195536 -0.00201084
+0.00212107 0.00184687 0.00278345 0.000845881 -0.00167152 -0.00208996
+0.00257876 -0.00106471 -0.000587303 0.00140029 0.00198946 0.00223463
+-0.00015454 -0.0011717 -0.000472182 0.001378 -0.000142248 -0.00161436
+0.00191329 0.00233531 -4.13618e-05 -0.00225598 -0.00226086 -0.000732662
+0.00238388 -3.53509e-06 -0.00246556 0.000409025 -0.00209033 0.001095
+-0.000610658 -0.00123896 0.00189721 -0.00245098 -0.000620009 0.000315553
+0.0013178 -0.00233828 -0.00238781 -0.00215948 -0.00134533 -2.24758e-05
+0.000113663 0.00115464 -0.00141208 0.00218523 0.00147756 -0.00158325
+0.00166478 -0.00182054 3.5271e-06 -0.00109895 -0.000463907 -0.000817356
+-0.00170237 0.00225851 0.00170723 -0.00234207 0.000100658 -0.00214875
+-0.00229243 0.001074 -0.00138498 0.00236444 0.00109029 -0.0010582 0.000948999
+0.00139785 -0.000255612 -0.00154754 -0.000902163 -0.000556932 0.00184524
+-0.000818614 0.0014175 -0.001147 -0.000879508 0.00137127 0.00157677
+-0.00227442 -0.000213276 -0.00163455 -0.00235069 0.000914303 -0.000359532
+0.00123966 0.00204608 0.00115316 -0.00209813 0.000266484 0.000787913
+0.00185387 -0.000490972 0.00130654 -0.000763627 0.000687359 1.25636e-05
+-0.000517927 -0.00210868 0.000302149 -0.000221433 -0.00139145 -0.00218493
+-0.000786313 0.000499234 0.00140311 -0.00210649 3.17324e-05 -0.00149887
+-0.000949377 -0.00217184 -0.00170018 0.00178524 0.000209359 0.00209031
+0.00178385 -0.00129121 0.000139166 -0.00162974 -0.00060624 -0.000557949
+-0.00162694 -0.000707867 0.000242797 -0.00177361 0.00142123 0.000909407
+0.000589972 -0.00108638 -0.001541 0.000119615 -0.00154313 0.00184791
+0.00112397 -0.000481904 -0.00203236 0.000932752 -6.22393e-05 0.000403429
+-0.000214537 -0.00129623 0.00150692 0.00135973 -0.000668023 0.000859076
+0.000477253 -0.00205027 0.000620383 -0.000298067 0.00131581 -9.81897e-05
+-0.000357981 0.000391007 0.00120418 -0.000479092 0.000118652 -0.00183203
+0.0011365 -0.000703926 -0.000782721 0.00201164 -0.00060997 -0.00095725
+0.000978817 -0.00176144 0.000256378 0.000577638 0.000324133 1.59867e-05
+0.00160444 0.00132522 -0.00166645 0.001214 0.00166469 0.000941659 0.000189783
+-0.000329214 0.000621588 0.000827563 0.000667328 0.00097043 0.00116145
+0.000785249 4.30932e-05 5.21686e-05 0.000412219 0.000602401 -0.000733841
+-0.00120154 0.000249634 -0.00127267 -0.00180589 0.00113257 0.00115229
+-0.000576841 0.000447163 0.0018513 -0.000842885 -0.00175455 -0.00139878
+-0.00090474 0.000459078 -0.00142743 -0.000454167 -0.000222927 0.00150268
+-0.000933776 0.000395572 0.000256062 0.00175047 0.000725543 0.000754875
+0.00124936 0.000557209 0.000163629 -0.000817999 0.00149572 0.000422363
+-0.00169798 -0.000436914 -0.000310488 -0.0013734 -0.00105209 -0.00125445
+0.000686591 -0.000624771 0.00134761 -0.0017261 0.00144715 0.000225461
+0.000898026 0.000874913 -0.000806741 -0.00106018 0.000942372 -0.000554013
+-7.91525e-06 -0.000867468 0.00105901 -0.000392938 0.000726409 0.00130337
+0.000244898 -3.74816e-06 -0.000388736 0.000184777 0.000765299 -0.000649227
+0.000357297;
+#A 7000 0.0012492 -0.000575012 -0.000898908 0.000507421 -0.000530798
+-0.000259931 -0.00151475 0.000737702 0.000613408 0.00158958 -0.00118669
+0.0015686 -0.00123311 -0.001357 0.00029626 0.00104943 -0.00109924 -0.00100317
+0.00142512 -0.000305563 -0.000475551 0.00135078 0.000744428 -0.000338464
+0.000532713 0.00135782 0.000868392 -0.00146866 0.000550816 0.0015088
+-0.000846424 -0.000401221 -0.00019781 -0.000220583 -0.000470368 0.00100168
+-0.000986546 0.000920071 -0.00132245 0.00131788 0.00064037 0.000788796
+-0.000758939 -0.000382906 0.000309443 -0.000870563 0.00074417 -0.000779842
+-0.00127626 0.00057363 -0.000889073 0.000219084 0.000446521 -0.00125235
+9.01408e-05 -0.00103675 0.000389459 -0.000313182 -0.000615406 -0.00015187
+-0.000870292 -0.00129548 0.000424396 0.00142679 -0.000447372 -0.000900836
+-0.000787204 0.00099431 0.000140848 -0.000485013 0.000252497 -0.000374513
+-0.000863164 -0.000540191 0.00023615 -0.000714745 0.000558057 -0.000323393
+-0.000441217 0.000784675 -4.65611e-05 0.000436985 -0.00116446 -0.0001948
+0.000213646 0.000608115 0.00035096 3.90493e-05 -0.00113403 0.000135148
+0.000705914 -0.000505814 -0.000555664 0.000386704 -0.000838822 -0.000561424
+0.000400031 -0.000138427 -0.00040852 0.000369891 -0.000300845 0.00124515
+0.00124346 -0.00113911 0.00111082 0.000594973 -0.000300892 0.000686361
+-0.0010648 0.000853163 -6.13605e-05 0.000673992 0.00113989 -0.000162426
+0.000163353 -0.000293628 0.000136755 -0.000341238 0.000993567 -0.00113639
+-0.000481713 -0.00120794 0.00110377 -0.000529109 -0.000900797 1.5097e-05
+-0.000127802 -0.00115169 -0.000218883 -0.00103647 -0.000729499 -0.000933569
+0.000261304 0.000553128 0.000213879 -0.00104661 0.000533644 -0.000868625
+0.000911986 -0.00092741 -0.000160334 0.000682107 -0.000541971 -7.53034e-05
+-0.00114301 -0.000283223 0.000369455 0.000836565 -0.00115323 -6.13803e-05
+-0.000710245 -0.000505833 0.000271918 -0.000249941 0.000159092 -0.00104976
+0.000924776 -0.000313533 -0.00101767 -0.00109038 0.000389106 0.000954921
+-0.00049903 -0.000687481 -0.00079854 0.000145733 0.000642144 -0.000180584
+-0.000277334 0.0002971 -0.000401817 -0.000123326 -0.00018055 -4.79884e-05
+0.000738632 -0.000676492 -0.000579566 0.000748011 -0.000341441 -0.000497692
+-0.000307388 6.95357e-05 -0.000244494 0.000563768 -0.000399399 -0.000456226
+-0.000262401 -0.000539637 0.000579934 0.000935327 0.000232443 -0.000948325
+-2.87749e-05 0.000719733 -0.000900581 0.000606823 0.000864087 -6.92021e-05
+0.000901744 -0.000684915 0.000382314 -0.000354214 0.000875534 0.000880776
+0.000439515 -0.00073796 -0.000421234 -0.000559352 -0.000690283 -0.00062318
+0.000211343 -0.000923636 -0.000920695 -0.000947497 -0.000324575 -0.000912157
+0.000376783 -0.000387742 -0.000774662 0.000123788 0.000820491 0.000936377
+0.000456949 0.000784013 0.000777128 0.000380906 -0.000855015 0.000631465
+0.000680243 -0.00016551 -0.000182981 -0.000283614 -7.74131e-05 -0.000339954
+0.000856157 0.000464451 -0.0009205 0.000906736 0.00044987 0.000660678
+-0.000310299 0.000487073 -0.000114541 0.000136953 -5.9995e-05 -0.00014513
+0.000737664 0.000257715 -0.00080071 -0.000816176 -1.94711e-05 0.000297526
+3.97128e-05 -0.000519886 -0.000813488 -0.000192749 0.000842487 -0.0002868
+0.000398808 -0.000481032 0.000677423 -0.000200971 7.96434e-05 -0.000845284
+-1.42636e-05 0.000376014 0.000234714 -0.000763005 0.000789758 -0.000396797
+-0.000329816 -0.000188165 -0.000317305 0.000726605 0.000548254 -0.000327887
+-0.000709808 -0.000484459 0.000769154 -0.000625539 0.000344775 -0.000619264
+-0.000376633 -0.000460527 0.000411514 -0.000244047 -0.000583738 -0.000335371
+0.00041205 0.000190481 0.00012176 0.000637337 0.000695486 -0.000219423
+0.000365849 -0.000479682 0.000137039 0.00020266 -0.000463569 -0.000750459
+-0.000381625 -0.000461828 -0.000631848 -0.00060664 0.000232222 -0.000714649
+0.000397486 0.000222135 -0.00032225 0.000570012 -0.000208637 -0.000725021
+0.000678173 -0.000540412 -0.000469693 0.000594229 0.000426519 -0.000538308
+0.000223535 -0.000137773 -0.000316593 -0.00015623 -0.000610216 0.000381392
+0.00061934 -0.00025272 -0.000268581 0.000656806 6.27917e-05 -0.000500579
+0.000587874 0.000462338 0.000101547 -0.000673198 -0.000395233 -0.000264257
+0.000558283 -7.40567e-05 -0.000394004 -0.000691442 4.78703e-05 0.00054017
+0.000667208 0.000540232 -0.000595821 0.000286323 0.000664962 -0.000199572
+0.000407903 -0.000261271 -0.000442182 3.44015e-05 0.000173264 3.26499e-05
+0.000340138 0.000313123 0.000372136 -0.000322517 0.00022914 -0.000253731
+-0.000447886 -0.000126551 0.000626085 0.000149804 0.000101168 0.000622597
+0.00039729 -0.000268301 0.000120118 1.50889e-05 -0.000378856 0.000413486
+-0.000342796 0.00029533 0.000209729 -0.00031269 -0.000144468 -0.000102416
+-0.000147359 -0.00028676 0.000584347 0.000108544 -0.000202493 -7.51208e-05
+0.000403579 0.000447199 -0.000548961 0.000288714 -9.09286e-05 -0.000441917
+-0.000418663 -0.000218049 -0.000306548 -2.17395e-05 0.000176577 8.58264e-05
+0.000542075 -0.000277782 0.000535511 -0.000187838 -0.000236575 0.000101605
+0.000237291 -6.59155e-06 0.000367821 0.000453996 -0.000245949 0.000197307
+-0.000358722 0.000447421 -0.00041882 -0.000214713 -3.92954e-05 0.000231444
+0.000279601 0.000503509 0.000487381 -0.000268749 -1.41e-05 0.000205976
+0.000329102 0.000497112 -0.000403776 -0.00052477 0.000106153 -7.88035e-06
+-0.000369373 0.000395796 -0.000139955 -0.000391764 0.000296226 0.000271513
+7.23289e-05 -0.000509181 0.000207145 -5.47508e-05 0.000215143 0.000361323
+0.000226735 0.000185898 0.000299066 0.000227878 0.000499131 -0.000370339
+-2.75462e-05 -0.000115399 -0.000502344 0.000341239 0.000509725 8.26888e-05
+3.69382e-05 -2.25344e-06 0.000312896 0.000163926 0.000477555 -3.13345e-05
+-0.000490836 4.24753e-05 0.000262056 0.000151496 1.16089e-05 0.000317891
+-0.000109386 0.000308685 0.00043373 -0.00030428 -0.000320058 -0.00038599
+-0.000171142 -0.000418772 0.000291421 0.000302665 -2.95393e-05 1.26319e-05
+0.000137193 -6.00689e-05 -0.00031629 -0.000117911 0.000239614 0.000368158
+-0.000399459 0.000161575 0.000175609 -0.000374141 -9.84947e-05 -0.000213919
+-0.000428891 0.000174801 -0.000189702 0.000214115 0.000165268 -0.000349396
+-0.000405665 3.95643e-05 0.00036534 0.000289016 0.000424982 -6.46746e-05
+-0.000332357 0.000326202 -0.000347566 -0.000397012 -6.96946e-05 0.000115071
+3.94671e-05 0.000328449 0.000323533 0.000304188 0.00018308 -9.26968e-05
+7.13173e-05 0.000359726 -0.000247005 -8.64855e-05 -5.32104e-05 -9.01422e-05
+-2.14043e-05 0.000199606 0.000142187 0.000196057 -0.000214303 -0.000261724
+-0.000275583 -7.52304e-05 0.000126259 3.01654e-05 -4.09653e-05 -0.0003402
+-0.000218268 -0.000320716 2.88781e-05 -0.000256556 -2.60203e-05 -0.000189933
+-5.74624e-05 0.000132393 -0.000144382 -5.66651e-05 -6.79256e-05 -0.000332045
+-0.000154313 -0.000254363 -0.000296142 0.000167059 -3.51242e-05 7.95371e-05
+-0.000177711 -0.000144392 0.000358404 -0.000325194 -0.000178367 0.00011174
+0.000114395 0.000353344 -4.52515e-05 0.000152097 -0.000356767 -0.000340855
+-0.000275549 0.000260527 -0.000189885 4.07865e-05 -7.10681e-05 -4.75349e-05
+0.000243042 -0.000221257 0.000132443 -2.22106e-05 -0.000296696 0.000178845
+0.000340916 0.000172121 -0.000280522 -4.32924e-05 0.000312616 -0.000296574
+0.000248021 -0.000235786 0.000110128 0.000176364 0.000222532 -0.000188694
+-0.000228089 -1.8564e-05 -0.000107123 -0.000173131 0.000165302 -0.000210595
+0.000190611 -0.000158425 -0.000302273 -1.9037e-05 3.78133e-05 -0.000219932
+0.000131112 -0.000281152 9.74466e-05 -0.000119311 -0.000275698 4.63384e-05
+-0.000230743 -1.70803e-05 -9.66521e-05 3.54906e-05 -0.000138785 0.000265031
+0.00013758 0.000161817 -9.01403e-06 0.000243307 -0.000232444 0.000101935
+0.000275709 -0.000190156 0.000139153 -0.000151913 -0.000242767 -0.000258583
+-9.71673e-05 0.000290766 9.92376e-05 -3.16694e-05 -0.000110656 -0.000174381
+0.000141272 -0.000138564 -3.78255e-05 -1.28841e-05 -9.9798e-05 -0.000220305
+-4.35099e-05 1.51792e-05 0.000160573 -0.000177594 -0.000156793 -0.000186564
+-0.000266483 -7.12576e-05 -0.00025858 5.47798e-05 -7.04945e-05 0.000106298
+-0.000206712 0.000242848 -0.000117685 0.000237174 -8.5087e-05 -0.00025921
+0.000115376 3.29665e-05 -3.51605e-05 -9.79168e-05 -9.33544e-05 0.000170928
+-0.000231284 -8.21348e-05 -8.11348e-05 -0.000146722 4.11026e-05 -0.000204514
+-0.000109212 -0.000218314 6.33194e-05 0.000187675 -8.45559e-05 -2.93489e-06
+-7.4673e-05 -0.000128661 1.08752e-06 -1.2751e-06 -3.47991e-06 -6.38608e-05
+3.5126e-05 -4.96448e-05 -0.000166491 8.91011e-06 0.000112424 -1.49576e-05
+-7.11332e-05 0.00015326 -0.000231573 0.000159096 -0.000102849 -8.83628e-05
+-3.44492e-05 6.08733e-05 -5.24769e-05 -0.000143917 0.000187676 -5.48234e-05
+-0.000169366 -6.924e-05 0.000208597 7.43959e-05 1.51495e-05 -0.000156248
+-0.000189901 -0.00021846 -1.09017e-05 -2.10567e-05 0.000175068 -0.000203148
+9.6554e-05 0.000159488 -0.000157061 0.000157146 9.29294e-05 -8.68819e-05
+-0.000112576 0.000106051 -0.000159277 8.87658e-05 0.000117173 0.000207073
+-0.000159477 -0.00014425 6.50592e-05 -0.000169995 -3.47183e-05 -0.000191218
+0.000199124 -0.000158299 -0.000173895 5.56455e-05 0.000109783 -4.95583e-05
+-0.00019452 0.000162531 -7.30231e-05 -6.51151e-05 -6.5513e-05 -1.30406e-05
+-4.58004e-05 8.54845e-05 -6.62585e-05 0.000147404 -0.000145886 0.000171048
+-8.13935e-05 -0.000112742 8.18382e-05 9.87108e-05 -0.000178329 8.30383e-05
+0.000118243 -0.000133737 -0.000117509 -0.000181216 6.96005e-05 -2.5578e-05
+-8.87828e-05 -0.000119761 -0.000131815 9.39839e-05 -3.85206e-05 -3.98037e-05
+-0.000123752 6.5694e-05 0.000149544 6.55084e-05 -5.10189e-05 -0.000147475
+5.61899e-05 0.000156118 -0.000126318 -7.61452e-05 0.000146521 -9.81166e-05
+2.3322e-05 1.48155e-06 -4.83064e-05 -0.000116114 -0.000133376 -3.8507e-06
+-2.81958e-05 0.000132099 0.000141073 -3.98404e-05 6.84192e-05 -0.000148495
+-9.63587e-05 0.000123971 -0.000153369 0.000123925 0.000126407 5.96334e-05
+-0.00013141 -0.000151332 6.38976e-06 -0.000132509 -0.000113432 -0.000145522
+-2.72324e-06 0.000103609 -9.12737e-05 2.333e-05 -5.32228e-05 -1.80584e-05
+-0.000108868 4.33863e-05 1.05692e-05 -3.24529e-05 -2.547e-05 -0.000127644
+-5.51754e-05 0.000118803 4.58581e-05 -6.0435e-05 0.000119945 9.03633e-05
+0.000126189 -2.16762e-05 0.000103534 5.26705e-05 9.06114e-05 -3.96244e-06
+9.18588e-05 -6.99231e-05 -0.000102175 0.000121435 -5.29731e-05 -0.000130497
+7.07592e-07 -6.53253e-06 -0.000126898 -7.27657e-05 4.9602e-05 -0.000130346
+-9.72919e-05 0.000115102 1.65862e-05 0.000124706 -0.000111513 -1.01902e-05
+0.00011511 9.17382e-05 -5.68378e-05 -0.000126589 -9.65907e-05 0.000109071
+1.98354e-05 1.44711e-05 -9.53789e-05 -4.40881e-05 -3.42756e-05 -0.000107171
+6.77947e-05 -6.02567e-05 -4.51936e-06 7.07596e-05 5.11669e-06 1.96312e-05
+0.000103474 -0.000117026 9.32659e-05 1.71592e-05 -5.50648e-05 8.14844e-05
+8.30488e-05 9.60546e-05 5.34437e-05 1.59611e-07 7.36206e-05 -0.000113025
+-6.21388e-05 1.59049e-05 -1.24152e-05 -1.14204e-05 9.41162e-05 5.53836e-05
+-7.5127e-05 8.12193e-05 4.72129e-05 4.56104e-05 -6.3318e-06 8.70641e-05
+-2.9712e-05 -5.41445e-05 0.000105252 -3.76891e-06 -2.06443e-05 3.80059e-05
+-5.28402e-05 -3.03088e-05 6.83216e-05 2.58535e-06 -6.68118e-05 7.39135e-05
+5.81208e-07 -3.86402e-05 -9.29886e-06 9.32456e-05 -3.96077e-05 7.14271e-05
+5.64583e-06 2.07722e-06 -8.81567e-05 1.48119e-05 -2.04169e-05 4.94373e-05
+-6.21602e-05 -6.99812e-05 -6.81391e-05 -6.67656e-05 -6.97088e-05 -2.29791e-05
+-4.80091e-05 -2.99185e-05 7.93086e-06 -6.4468e-06 1.68672e-05 -5.89997e-06
+-6.48934e-05 -4.2006e-05 -3.71554e-05 3.15824e-05 -1.4117e-05 -8.54198e-05
+-5.2555e-05 6.81312e-05 -8.00106e-05 -5.03327e-05 -4.99049e-05 5.6397e-05
+-8.34014e-05 4.20525e-05 -3.50847e-05 -3.44716e-05 1.595e-05 -2.8145e-05
+-3.57833e-05 3.28588e-05 7.61727e-05 -6.03767e-05 -1.1149e-05 4.99157e-05
+1.97055e-05 2.67875e-05 2.76247e-05 4.69502e-05 1.2949e-05 7.13521e-05
+2.82482e-05 3.18771e-07 -3.82229e-05 6.32702e-05 2.32495e-05 7.1777e-05
+-5.64882e-05 -7.52744e-05 5.21801e-05 -4.66259e-05 -4.72077e-05 -5.04802e-05
+5.51556e-05 -4.92359e-05 -6.65992e-05 5.69698e-05 3.37395e-05 -5.03714e-05
+5.93517e-05 2.79149e-05 1.50739e-05 -4.38056e-05 -4.2024e-05 3.20716e-05
+-1.51792e-05 5.43174e-05 6.80207e-05 2.4926e-05 6.80454e-05 -8.69103e-06
+-4.71735e-05 5.8643e-05 -1.73492e-05 5.06138e-05 -2.80768e-05 6.04457e-05
+-2.56288e-05 1.8836e-05 -1.48352e-05 5.89033e-05 5.97622e-05 -2.3729e-05
+-3.43449e-05 3.39459e-05 -4.18459e-05 1.94012e-05 9.52488e-06 -5.98462e-05
+-5.52232e-06 4.58803e-05 -5.51445e-05 2.25818e-06 4.16403e-05 -4.15755e-05
+3.94566e-05 4.77493e-05 -1.37609e-05 -6.95325e-06;
+#X coords 0 1 7999 -1 100 70 1;
+#X restore 237 208 graph;
+#N canvas 512 387 458 308 makeglitch 0;
+#X obj 87 124 noise~;
+#X obj 166 125 line~;
+#X msg 169 69 1;
+#X msg 234 76 0 200;
+#X obj 163 163 *~;
+#X obj 95 204 *~;
+#X obj 95 245 tabwrite~ rtrig_buffa;
+#X obj 172 30 t b b b;
+#X obj 136 32 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 52 48 inlet;
+#X obj 164 187 *~;
+#X connect 0 0 5 0;
+#X connect 1 0 4 0;
+#X connect 1 0 4 1;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 10 0;
+#X connect 4 0 10 1;
+#X connect 5 0 6 0;
+#X connect 7 0 6 0;
+#X connect 7 1 3 0;
+#X connect 7 2 2 0;
+#X connect 8 0 7 0;
+#X connect 9 0 8 0;
+#X connect 10 0 5 1;
+#X restore 105 292 pd makeglitch;
+#X obj 42 177 player~ rtrig_buffa 1 4;
+#X obj 42 262 *~ 0.1;
+#X obj 42 291 dac~;
+#X obj 200 171 sig~ 1;
+#X obj 42 154 rtrig~ 0.1 1 1e-05;
+#X obj 78 220 hsl 128 8 0 1 0 0 empty empty gain -2 -8 0 8 -223855
+-1 -1 0 1;
+#X floatatom 75 232 5 0 0 0 - - -, f 5;
+#X obj 45 84 hsl 128 8 0 0.001 0 0 rtrig-odds empty odds -2 -8 0 8
+-223855 -1 -1 0 1;
+#X obj 26 10 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 28 43 rtrig~ - generates random click triggers;
+#X obj 105 267 loadbang;
+#X text 160 149 args: min gain \, max gain \, per-sample event odds
+;
+#X connect 0 0 1 0;
+#X connect 1 0 9 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 6 0 7 1;
+#X connect 8 0 5 1;
+#X connect 9 0 5 0;
+#X connect 10 0 11 0;
+#X connect 11 0 6 1;
+#X connect 15 0 4 0;
diff --git a/externals/lyonpotpourri/rtrig~.c b/externals/lyonpotpourri/rtrig~.c
new file mode 100755
index 0000000000000000000000000000000000000000..3604cb4dc4c3466f7012ee905bbc471a94154621
--- /dev/null
+++ b/externals/lyonpotpourri/rtrig~.c
@@ -0,0 +1,145 @@
+#include "MSPd.h"
+
+static t_class *rtrig_class;
+
+#define OBJECT_NAME "rtrig~"
+
+#define MAXFLAMS (16)
+#define MAXATTACKS (128)
+#define STOPGAIN (.001)
+
+#define RAND_MAX2 (0x7fffffff)
+
+typedef struct
+{
+	int attack_count; // number of triggers per flam event
+	float *attack_times; // trigger times in seconds
+	int *attack_points; // trigger times in samples
+	int fdex; // current flam
+	float gainatten; // attenuation factor
+	float amp; // current amp
+	int atks;// number of attacks per flam
+	long counter; // internal clock
+	short active; // flag that flam is turned on
+    
+    
+} t_flam;
+
+typedef struct _rtrig
+{
+    
+	t_object x_obj;
+	float x_f;
+    short mute;
+    float min;
+    float max;
+    float odds;
+    
+} t_rtrig;
+
+
+void *rtrig_new(t_symbol *s, int argc, t_atom *argv);
+t_int *rtrig_perform(t_int *w);
+void rtrig_dsp(t_rtrig *x, t_signal **sp);
+void rtrig_free(t_rtrig *x);
+void rtrig_mute(t_rtrig *x, t_floatarg tog);
+void rtrig_min(t_rtrig *x, t_floatarg v);
+void rtrig_max(t_rtrig *x, t_floatarg v);
+void rtrig_odds(t_rtrig *x, t_floatarg v);
+
+
+void rtrig_tilde_setup(void)
+{
+    rtrig_class = class_new(gensym("rtrig~"),(t_newmethod)rtrig_new,(t_method)rtrig_free, sizeof(t_rtrig), 0, A_GIMME,0);
+    CLASS_MAINSIGNALIN(rtrig_class,t_rtrig, x_f );
+    
+    class_addmethod(rtrig_class,(t_method)rtrig_dsp,gensym("dsp"),A_CANT,0);
+    class_addmethod(rtrig_class,(t_method)rtrig_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(rtrig_class,(t_method)rtrig_min,gensym("min"),A_FLOAT,0);
+    class_addmethod(rtrig_class,(t_method)rtrig_max,gensym("max"),A_FLOAT,0);
+    class_addmethod(rtrig_class,(t_method)rtrig_odds,gensym("odds"),A_FLOAT,0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+void rtrig_mute(t_rtrig *x, t_floatarg tog)
+{
+	x->mute = (short) tog;
+}
+
+void rtrig_min(t_rtrig *x, t_floatarg v)
+{
+	x->min = (float) v;
+}
+
+void rtrig_max(t_rtrig *x, t_floatarg v)
+{
+	x->max = (float) v;
+}
+
+void rtrig_odds(t_rtrig *x, t_floatarg v)
+{
+	x->odds = (float) v;
+}
+
+
+void *rtrig_new(t_symbol *s, int argc, t_atom *argv)
+{
+
+    t_rtrig *x = (t_rtrig *)pd_new(rtrig_class);
+    outlet_new(&x->x_obj, gensym("signal"));    
+    x->mute = 0;
+    x->min = atom_getfloatarg(0,argc,argv);
+    x->max = atom_getfloatarg(1,argc,argv);
+    x->odds = atom_getfloatarg(2,argc,argv);
+    
+    srand(time(0));
+    return (x);
+}
+
+
+
+void rtrig_free(t_rtrig *x)
+{    
+}
+
+t_int *rtrig_perform(t_int *w)
+{
+    
+	t_rtrig *x = (t_rtrig *) (w[1]);
+	float *out_vec = (t_float *)(w[2]);
+	int n = (int) w[3];
+	
+	float rval;
+	float min = x->min;
+	float max = x->max;
+	float odds = x->odds;
+    
+	if(x->mute){
+		memset( (void *)out_vec, 0, n * sizeof(float) );
+		return (w+4);
+	}
+    
+	while( n-- ){
+		rval = (float) rand() / (float) RAND_MAX2;
+		if(rval < odds){
+			rval = min + (max-min) * ((float) rand() / (float) RAND_MAX2);
+			*out_vec++ = rval;
+		} else {
+			*out_vec++ = 0.0;
+		}
+	}
+	
+    
+	return (w+4);
+}
+
+void rtrig_dsp(t_rtrig *x, t_signal **sp)
+{
+    
+	dsp_add(rtrig_perform, 3, x, 
+            //			sp[0]->s_vec, 
+			sp[1]->s_vec,
+			sp[0]->s_n
+            );
+}
+
diff --git a/externals/lyonpotpourri/samm~-help.pd b/externals/lyonpotpourri/samm~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..1504557841f6be2f86d355e8b888948bd6cb21fb
--- /dev/null
+++ b/externals/lyonpotpourri/samm~-help.pd
@@ -0,0 +1,200 @@
+#N canvas 1227 671 555 539 10;
+#X obj 42 295 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 78 80 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 42 254 click2bang~;
+#X obj 134 313 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 134 282 click2bang~;
+#X obj 245 339 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 245 290 click2bang~;
+#X obj 116 467 *~ 0.1;
+#X obj 116 497 dac~;
+#X floatatom 320 454 5 0 0 0 - - -, f 5;
+#N canvas 547 354 816 547 toner 0;
+#X obj 211 218 adsr~;
+#X obj 94 286 *~;
+#X obj 210 154 loadbang;
+#X obj 115 347 outlet~;
+#X obj 169 100 inlet~;
+#X msg 211 191 2 50 50 50;
+#X obj 94 178 osc~ 322;
+#X connect 0 0 1 1;
+#X connect 1 0 3 0;
+#X connect 2 0 5 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 1 0;
+#X restore 180 394 pd toner;
+#N canvas 547 354 820 551 toner 0;
+#X obj 211 218 adsr~;
+#X obj 94 286 *~;
+#X obj 210 154 loadbang;
+#X obj 115 347 outlet~;
+#X obj 169 100 inlet~;
+#X msg 211 191 2 50 50 50;
+#X obj 94 178 osc~ 444;
+#X connect 0 0 1 1;
+#X connect 1 0 3 0;
+#X connect 2 0 5 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 1 0;
+#X restore 244 394 pd toner;
+#N canvas 547 354 828 559 toner 0;
+#X obj 211 218 adsr~;
+#X obj 94 286 *~;
+#X obj 210 154 loadbang;
+#X obj 115 347 outlet~;
+#X obj 169 100 inlet~;
+#X msg 211 191 2 50 50 50;
+#X obj 94 178 osc~ 670;
+#X connect 0 0 1 1;
+#X connect 1 0 3 0;
+#X connect 2 0 5 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 1 0;
+#X restore 374 393 pd toner;
+#N canvas 452 295 832 563 toner 0;
+#X obj 211 218 adsr~;
+#X obj 94 286 *~;
+#X obj 210 154 loadbang;
+#X obj 115 347 outlet~;
+#X obj 169 100 inlet~;
+#X msg 211 191 2 50 50 50;
+#X obj 94 178 osc~ 190;
+#X connect 0 0 1 1;
+#X connect 1 0 3 0;
+#X connect 2 0 5 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 1 0;
+#X restore 116 394 pd toner;
+#N canvas 547 354 828 559 toner 0;
+#X obj 211 218 adsr~;
+#X obj 94 286 *~;
+#X obj 210 154 loadbang;
+#X obj 115 347 outlet~;
+#X obj 169 100 inlet~;
+#X obj 94 178 osc~ 976;
+#X msg 211 191 2 50 50 200;
+#X connect 0 0 1 1;
+#X connect 1 0 3 0;
+#X connect 2 0 6 0;
+#X connect 4 0 0 0;
+#X connect 5 0 1 0;
+#X connect 6 0 0 0;
+#X restore 436 393 pd toner;
+#X obj 140 183 samm~ 20 5 7 11 13 19 1;
+#N canvas 460 303 824 555 toner 0;
+#X obj 211 218 adsr~;
+#X obj 94 286 *~;
+#X obj 210 154 loadbang;
+#X obj 115 347 outlet~;
+#X obj 169 100 inlet~;
+#X msg 211 191 2 50 50 50;
+#X obj 94 179 osc~ 555;
+#X connect 0 0 1 1;
+#X connect 1 0 3 0;
+#X connect 2 0 5 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 1 0;
+#X restore 309 393 pd toner;
+#X obj 163 362 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 163 313 click2bang~;
+#X obj 345 372 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 345 310 click2bang~;
+#X obj 441 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 441 291 click2bang~;
+#X obj 140 153 r samm-msgs;
+#N canvas 0 22 574 436 operation 0;
+#X obj 127 186 s samm-msgs;
+#X msg 109 134 tempo \$1;
+#X floatatom 109 105 5 0 0 0 - - -, f 5;
+#X msg 109 79 20;
+#X msg 215 112 arm;
+#X msg 253 115 resume;
+#X msg 313 115 pause;
+#X msg 34 107 beatinfo;
+#X msg 250 210 mute \$1;
+#X obj 251 174 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 8 0;
+#X restore 375 98 pd operation;
+#X obj 323 448 hsl 80 8 0 0.25 0 0 empty empty gain -2 -8 0 8 -141498
+-1 -1 0 1;
+#X text 312 187 args: tempo \, [beat subdivisions]*;
+#N canvas 639 436 544 322 specs 0;
+#X obj 48 283 s samm-msgs;
+#X msg 90 71 divbeats 1 19 13 11 7 5;
+#X msg 102 116 msbeats 250 450 333 1600 777 630;
+#X msg 48 30 beats 0.1 0.2 0.333 0.25 0.4 0.5;
+#X msg 98 162 ratiobeats 1 12 1 16 1 9 1 7 3 32 5.5 11;
+#X text 46 9 specify each tempo with its time interval in beats;
+#X text 91 53 specify each tempo as a subdivision of a beat (quarter
+note);
+#X text 108 96 specify each tempo with time interval in ms.;
+#X text 107 142 specify each tempo as a ratio (relative to a whole
+note);
+#X msg 106 205 sampbeats 44100 22050 11025 88200 6677 9313;
+#X text 131 185 specify each tempo in samples;
+#X msg 157 243 beatinfo;
+#X text 155 227 diagnostics;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 9 0 0 0;
+#X connect 11 0 0 0;
+#X restore 375 123 pd specs;
+#X text 99 80 reinit timer;
+#X obj 9 12 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 11 46 samm~ - sample accurate multiple metronomes;
+#X obj 78 103 click~;
+#X connect 1 0 31 0;
+#X connect 2 0 0 0;
+#X connect 4 0 3 0;
+#X connect 6 0 5 0;
+#X connect 7 0 8 0;
+#X connect 7 0 8 1;
+#X connect 9 0 7 1;
+#X connect 10 0 7 0;
+#X connect 11 0 7 0;
+#X connect 12 0 7 0;
+#X connect 13 0 7 0;
+#X connect 14 0 7 0;
+#X connect 15 0 2 0;
+#X connect 15 0 13 0;
+#X connect 15 1 4 0;
+#X connect 15 1 10 0;
+#X connect 15 2 11 0;
+#X connect 15 2 18 0;
+#X connect 15 3 16 0;
+#X connect 15 3 6 0;
+#X connect 15 4 12 0;
+#X connect 15 4 20 0;
+#X connect 15 5 14 0;
+#X connect 15 5 22 0;
+#X connect 16 0 7 0;
+#X connect 18 0 17 0;
+#X connect 20 0 19 0;
+#X connect 22 0 21 0;
+#X connect 23 0 15 0;
+#X connect 25 0 9 0;
+#X connect 31 0 15 0;
diff --git a/externals/lyonpotpourri/samm~.c b/externals/lyonpotpourri/samm~.c
new file mode 100755
index 0000000000000000000000000000000000000000..0e8d0788ab62215cd7a559da983cb7f84d72a9cd
--- /dev/null
+++ b/externals/lyonpotpourri/samm~.c
@@ -0,0 +1,431 @@
+#include "MSPd.h"
+
+
+static t_class *samm_class;
+
+#define MAXBEATS (256)
+#define OBJECT_NAME "samm~"
+// #define DATE "prerelease"
+
+typedef struct _samm
+{
+	t_object x_obj;
+	float x_f;
+	double tempo; /* current tempo */
+	double onebeat_samps; /* number of samples for a single beat */
+	double *beats; /* amount of beats for each active tempo outlet */
+	double *metro_samps;/* number of samples to count down for each time interval */
+	double *metro_beatdurs;/* number of beats for each metro time interval */
+	double *metro;/* current countdown for each time interval */
+	int metro_count; /* number of metronomes to keep track of */
+	float sr; /* current sampling rate */
+	short pause;
+	short mute;
+    // Pd only */
+	float *trigger_vec;
+	short vs;
+} t_samm;
+
+void *samm_new(t_symbol *msg, short argc, t_atom *argv);
+void *samm_beatlist(t_samm *x, t_symbol *msg, short argc, t_atom *argv);
+t_int *samm_perform(t_int *w);
+void samm_dsp(t_samm *x, t_signal **sp);
+void samm_tempo(t_samm *x, t_floatarg f);
+void samm_divbeats(t_samm *x, t_symbol *msg, short argc, t_atom *argv);
+void samm_msbeats(t_samm *x, t_symbol *msg, short argc, t_atom *argv);
+void samm_sampbeats(t_samm *x, t_symbol *msg, short argc, t_atom *argv);
+void samm_ratiobeats(t_samm *x, t_symbol *msg, short argc, t_atom *argv);
+void samm_free(t_samm *x);
+void samm_beatinfo(t_samm *x);
+void samm_init(t_samm *x,short initialized);
+void samm_mute(t_samm *x, t_floatarg f);
+void samm_pause(t_samm *x);
+void samm_arm(t_samm *x);
+void samm_resume(t_samm *x);
+void samm_beats(t_samm *x, t_symbol *msg, short argc, t_atom *argv);
+
+
+void samm_beatinfo(t_samm *x)
+{
+	int i;
+	post("tempo %.10f",x->tempo);
+	post("samples in one beat: %.10f",x->onebeat_samps);
+	for(i = 0; i < x->metro_count; i++){
+		post("%d: relative duration %.10f, samples %.10f samples ratio to 1 beat: %.10f", i,
+             x->metro_beatdurs[i], x->metro_samps[i], x->onebeat_samps / x->metro_samps[i]  );
+	}
+}
+
+void samm_tilde_setup(void){
+	samm_class = class_new(gensym("samm~"), (t_newmethod)samm_new,
+						   (t_method)samm_free,sizeof(t_samm), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(samm_class, t_samm, x_f);
+	class_addmethod(samm_class,(t_method)samm_dsp,gensym("dsp"),0);
+	class_addmethod(samm_class,(t_method)samm_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(samm_class,(t_method)samm_tempo,gensym("tempo"),A_FLOAT,0);
+	class_addmethod(samm_class,(t_method)samm_beatinfo,gensym("beatinfo"),0);
+	class_addmethod(samm_class,(t_method)samm_beats,gensym("beats"),A_GIMME,0);
+	class_addmethod(samm_class,(t_method)samm_divbeats,gensym("divbeats"),A_GIMME,0);
+	class_addmethod(samm_class,(t_method)samm_msbeats,gensym("msbeats"),A_GIMME,0);
+	class_addmethod(samm_class,(t_method)samm_sampbeats,gensym("sampbeats"),A_GIMME,0);
+	class_addmethod(samm_class,(t_method)samm_ratiobeats,gensym("ratiobeats"),A_GIMME,0);
+	class_addmethod(samm_class,(t_method)samm_pause,gensym("pause"),A_GIMME,0);
+	class_addmethod(samm_class,(t_method)samm_arm,gensym("arm"),A_GIMME,0);
+	class_addmethod(samm_class,(t_method)samm_resume,gensym("resume"),A_GIMME,0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+
+
+void samm_pause(t_samm *x)
+{
+	x->pause = 1;
+}
+
+void samm_mute(t_samm *x, t_floatarg f)
+{
+	x->mute = (short) f;
+}
+
+void samm_arm(t_samm *x)
+{
+	int i;
+	
+	x->pause = 1;
+	for( i = 0; i < x->metro_count; i++){
+		x->metro[i] = 1.0;
+	}
+	
+}
+
+void samm_resume(t_samm *x)
+{
+	x->pause = 0;
+}
+
+void samm_beats(t_samm *x, t_symbol *msg, short argc, t_atom *argv)
+{
+    int i;
+    double beatdur;
+    
+	if(argc != x->metro_count){
+		error("%s: arguments did not match metro count %d",OBJECT_NAME,x->metro_count);
+		return;
+	}
+    
+	for(i = 0; i < argc; i++){
+		beatdur = (double)atom_getfloatarg(i,argc,argv);
+    	if(!beatdur){
+			error("%s: zero divisor given for beat stream %d",OBJECT_NAME,i+1);
+			beatdur = 1.0;
+		}
+        
+		x->metro_beatdurs[i] = beatdur;
+		x->metro_samps[i] = x->metro_beatdurs[i] * x->onebeat_samps;
+		x->metro[i] = 1.0; // initialize for instantaneous beat
+	}
+}
+
+void samm_divbeats(t_samm *x, t_symbol *msg, short argc, t_atom *argv)
+{
+    int i;
+    double divisor;
+    
+	if(argc != x->metro_count){
+		error("%s: arguments did not match metro count %d",OBJECT_NAME,x->metro_count);
+		return;
+	}
+    
+	for(i = 0; i < argc; i++){
+		divisor = (double)atom_getfloatarg(i,argc,argv);
+    	if(!divisor){
+			error("%s: zero divisor given for beat stream %d",OBJECT_NAME,i+1);
+			divisor = 1.0;
+		}
+        
+		x->metro_beatdurs[i] = 1.0 / divisor; // argument is now DIVISOR of beat
+		x->metro_samps[i] = x->metro_beatdurs[i] * x->onebeat_samps;
+		x->metro[i] = 1.0; // initialize for instantaneous beat
+	}
+}
+
+void samm_msbeats(t_samm *x, t_symbol *msg, short argc, t_atom *argv)
+{
+    int i;
+    double msecs;
+	if(argc != x->metro_count){
+		error("%s: arguments did not match metro count %d",OBJECT_NAME,x->metro_count);
+		return;
+	}
+	for(i = 0; i < argc; i++){
+		msecs = (double)atom_getfloatarg(i,argc,argv);
+    	if(msecs <= 0){
+			error("%s: illegal duration for beat stream %d",OBJECT_NAME,i+1);
+			msecs = 1000.0;
+		}
+		x->metro_samps[i] = x->sr * .001 * msecs;
+		x->metro_beatdurs[i] = x->metro_samps[i] / x->onebeat_samps; // just in case tempo changes
+		x->metro[i] = 1.0; // initialize for instantaneous beat
+	}
+    
+}
+
+void samm_sampbeats(t_samm *x, t_symbol *msg, short argc, t_atom *argv)
+{
+    int i;
+    double samples;
+	if(argc != x->metro_count){
+		error("%s: arguments did not match metro count %d",OBJECT_NAME,x->metro_count);
+		return;
+	}
+	for(i = 0; i < argc; i++){
+		samples = (double)atom_getfloatarg(i,argc,argv);
+    	if(samples <= 0){
+			error("%s: illegal duration for beat stream %d",OBJECT_NAME,i+1);
+			samples = x->sr;
+		}
+		x->metro_samps[i] = samples;
+		x->metro_beatdurs[i] = x->metro_samps[i] / x->onebeat_samps; // just in case tempo changes
+		x->metro[i] = 1.0; // initialize for instantaneous beat
+	}
+}
+
+void samm_ratiobeats(t_samm *x, t_symbol *msg, short argc, t_atom *argv)
+{
+    int i,j;
+    double num,denom;
+    
+	if(argc != x->metro_count * 2){
+		error("%s: arguments did not match metro count %d",OBJECT_NAME,x->metro_count);
+		return;
+	}
+    
+	for(i = 0, j= 0; i < argc; i += 2, j++){
+		num = (double)atom_getfloatarg(i,argc,argv);
+		denom = (double)atom_getfloatarg(i+1,argc,argv);
+    	if(!denom){
+			error("%s: zero divisor given for beat stream %d",OBJECT_NAME,(i/2)+1);
+			denom = 1.0;
+		}
+        
+		x->metro_beatdurs[j] = 4.0 * (num / denom);
+        //		post("beat duration %f",4.0 * (num/denom));
+		x->metro_samps[j] = x->metro_beatdurs[j] * x->onebeat_samps;
+		x->metro[j] = 1.0; // initialize for instantaneous beat
+	}
+}
+
+void samm_tempo(t_samm *x, t_floatarg f)
+{
+	int i;
+	double last_tempo;
+	double tempo_fac;
+	
+	if( f <= 0.0) {
+		error("illegal tempo: %f", f);
+		return;
+	}
+	last_tempo = x->tempo;
+	x->tempo = f;
+	tempo_fac = last_tempo / x->tempo; // shrink or stretch factor for beats
+	x->onebeat_samps = (60.0/x->tempo) * x->sr;
+	for(i = 0; i < x->metro_count; i++){
+		x->metro_samps[i] = x->metro_beatdurs[i] * x->onebeat_samps;
+		x->metro[i] *= tempo_fac;
+	}
+}
+
+
+void *samm_new(t_symbol *msg, short argc, t_atom *argv)
+{
+	int i,j, default_tempo = 120;
+	double divisor;
+	t_samm *x;
+    t_atom sane_defaults[2];
+	
+    if(argc < 2){
+        // If no args, set some sane defaults
+        if (!argc){
+            post("%s: warning: no tempo or beat streams provided: setting "
+                 "tempo to 120 BPM and 1 stream to '1'",OBJECT_NAME);
+            SETFLOAT(sane_defaults, default_tempo);
+            SETFLOAT(sane_defaults+1, 1.);
+            argc = 2;
+            argv = sane_defaults;
+        }
+        else
+        {
+            error("%s: there must be at least 1 beat stream",OBJECT_NAME);
+            return (void *)NULL;
+        }
+    }
+    if(argc > MAXBEATS + 1)
+    {
+        error("%s: exceeded maximum of %d beat values",OBJECT_NAME, MAXBEATS);
+        return (void *)NULL;
+    }
+    
+    x = (t_samm *)pd_new(samm_class);
+    x->metro_count = argc - 1;
+    for(i=0;i< x->metro_count;i++)
+        outlet_new(&x->x_obj, gensym("signal"));
+	x->sr = sys_getsr();
+	x->vs = sys_getblksize();
+    
+    x->pause = 0;
+    x->mute = 0;
+    
+	x->beats = (double *) calloc(x->metro_count, sizeof(double));
+	x->metro_samps = (double *) calloc(x->metro_count, sizeof(double));
+	x->metro_beatdurs = (double *) calloc(x->metro_count, sizeof(double));
+	x->metro = (double *) calloc(x->metro_count, sizeof(double));
+    
+	if(! x->sr ){
+		x->sr = 44100;
+		post("sr autoset to 44100");
+	}
+	
+	if(argc > 0) {
+		x->tempo = (double) atom_getfloatarg(0,argc,argv);
+	}
+    
+	if( x->tempo <= 0.0 ){
+		x->tempo = default_tempo;
+		post("tempo autoset to %d BPM", default_tempo);
+	}
+	
+	x->onebeat_samps = (60.0/x->tempo) * x->sr;
+	
+    
+    
+    
+	for(i = 1,j = 0; i < argc; i++, j++){
+        divisor = (double)atom_getfloatarg(i,argc,argv);
+    	if(!divisor){
+			error("%s: zero divisor given for beat stream %d",OBJECT_NAME,i);
+			divisor = 1.0;
+		}
+        
+		x->metro_beatdurs[j] = 1.0 / divisor; // argument is now DIVISOR of beat
+		x->metro_samps[j] = x->metro_beatdurs[j] * x->onebeat_samps;
+		x->metro[j] = 1.0; // initialize for instantaneous beat
+		
+	}
+    //    post("there are %d beat streams",x->metro_count);
+    samm_init(x,0);
+    
+    return (x);
+}
+
+void samm_free(t_samm *x)
+{
+    free(x->trigger_vec);
+    free(x->beats);
+    free(x->metro_samps);
+    free(x->metro_beatdurs);
+    free(x->metro);
+    
+}
+void samm_init(t_samm *x,short initialized)
+{
+    if(!initialized){
+        x->trigger_vec = (float*)calloc(x->vs, sizeof(float));
+        
+        
+    } else {
+        x->trigger_vec = (float*) realloc(x->trigger_vec,x->vs*sizeof(float));
+    }
+}
+
+
+t_int *samm_perform(t_int *w)
+{
+	int i, j, k;
+    //	float outval;
+	t_samm *x = (t_samm *) (w[1]);
+	t_float *inlet = (t_float *) (w[2]);
+	t_float *beat_outlet;
+	
+	int n;
+	
+	int metro_count = x->metro_count;
+	double *metro = x->metro;
+	float *trigger_vec = x->trigger_vec;
+	short pause = x->pause;
+    
+    n = (int) w[metro_count + 3];
+    
+    if(x->mute){
+		for(i = 0, j=3; i < metro_count; i++, j++){
+			beat_outlet = (t_float *) (w[j]);
+			for(k=0; k < n; k++){
+				beat_outlet[k] = 0.0; // use memset
+			}
+		}
+		return (w + metro_count + 4);
+    }
+    /* main loop */
+	for(i=0;i<n;i++)
+		trigger_vec[i] = inlet[i];
+    
+	for(i = 0, j=3; i < metro_count; i++, j++){
+		beat_outlet = (t_float *) (w[j]);
+		for(k = 0; k < n; k++){
+			if(trigger_vec[k]) {
+				metro[i] = 1.0; // instant reset from an impulse
+			}
+			
+			beat_outlet[k] = 0.0;
+			if(! pause ){
+				metro[i] -= 1.0;
+				if( metro[i] <= 0){
+					beat_outlet[k] = 1.0;
+					metro[i] += x->metro_samps[i];
+				}
+			}
+		}
+	}
+    
+	return (w + metro_count + 4);
+}
+
+
+void samm_dsp(t_samm *x, t_signal **sp)
+{
+	long i;
+    t_int **sigvec;
+    int pointer_count;
+    
+    pointer_count = x->metro_count + 3; // all metros, plus 1 inlet, plus the object pointer, plus N
+	
+	if(x->vs != sp[0]->s_n){
+		x->vs = sp[0]->s_n;
+		samm_init(x,1);
+	}
+	if(x->sr != sp[0]->s_sr) {
+		x->sr = sp[0]->s_sr;
+		x->onebeat_samps = (60.0/x->tempo) * x->sr;
+		for(i = 0; i < x->metro_count; i++){
+			x->metro_samps[i] = x->metro_beatdurs[i] * x->onebeat_samps;
+			x->metro[i] = 0;
+		}
+	}
+	sigvec  = (t_int **) calloc(pointer_count, sizeof(t_int *));
+	for(i = 0; i < pointer_count; i++){
+		sigvec[i] = (t_int *) calloc(sizeof(t_int),1);
+	}
+	sigvec[0] = (t_int *)x; // first pointer is to the object
+    
+	sigvec[pointer_count - 1] = (t_int *)sp[0]->s_n; // last pointer is to vector size (N)
+	
+	for(i = 1; i < pointer_count - 1; i++){ // now attach the inlet and all outlets
+		sigvec[i] = (t_int *)sp[i-1]->s_vec;
+	}
+    //	post("attached %d pointers",pointer_count);
+
+	dsp_addv(samm_perform, pointer_count, (t_int *) sigvec);     
+    
+	free(sigvec);
+    
+}
+
diff --git a/externals/lyonpotpourri/sarec~-help.pd b/externals/lyonpotpourri/sarec~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..7fff63368257eb8eff7f8dc477089f5ca64d2879
--- /dev/null
+++ b/externals/lyonpotpourri/sarec~-help.pd
@@ -0,0 +1,110 @@
+#N canvas 635 332 566 425 10;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array track1 100000 float 2;
+#X coords 0 1 99999 -1 200 100 1;
+#X restore 17 111 graph;
+#X obj 156 301 sarec~ track1 1;
+#X obj 258 240 noise~;
+#X obj 258 269 *~ 0.1;
+#X obj 156 232 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X floatatom 156 349 5 0 0 0 - - -, f 5;
+#X obj 18 12 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X floatatom 423 364 5 0 0 0 - - -, f 5;
+#X obj 426 351 hsl 100 10 0 0.25 0 0 empty empty gain -2 -8 0 10 -141498
+-1 -1 0 1;
+#X msg 376 294 \; track1 const 0;
+#X text 374 279 clear track;
+#X text 256 224 input signal;
+#X text 25 233 trigger record ->;
+#X obj 349 351 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 379 193 s sarec.messages;
+#X obj 24 260 r sarec.messages;
+#X obj 227 122 vradio 15 1 0 4 empty empty record_mode 0 -8 0 10 -204800
+-4160 -1 1;
+#X text 245 121 record;
+#X text 245 138 overdub;
+#X text 246 153 punch;
+#X text 245 169 lock track;
+#X obj 156 263 click~;
+#N canvas 310 149 450 300 status-messages 0;
+#X msg 88 133 overdub;
+#X msg 147 133 punch;
+#X msg 37 133 record;
+#X msg 192 134 lock;
+#X obj 90 68 sel 0 1 2 3;
+#X obj 48 213 s sarec.messages;
+#X obj 81 28 inlet;
+#X connect 0 0 5 0;
+#X connect 1 0 5 0;
+#X connect 2 0 5 0;
+#X connect 3 0 5 0;
+#X connect 4 0 2 0;
+#X connect 4 1 0 0;
+#X connect 4 2 1 0;
+#X connect 4 3 3 0;
+#X connect 6 0 4 0;
+#X restore 227 193 pd status-messages;
+#X msg 379 174 punchfade \$1;
+#X msg 379 150 5;
+#X msg 409 150 50;
+#X msg 438 150 150;
+#X text 376 132 set taper for punch mode;
+#N canvas 149 234 450 300 show-record-phase 0;
+#X obj 53 132 snapshot~;
+#X msg 179 95 1;
+#X obj 179 116 metro 50;
+#X obj 179 76 loadbang;
+#X text 94 154 record phase;
+#X obj 53 60 inlet~;
+#X obj 53 199 outlet;
+#X connect 0 0 6 0;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 3 0 1 0;
+#X connect 5 0 0 0;
+#X restore 156 324 pd show-record-phase;
+#N canvas 144 388 450 300 set-record-region 0;
+#X obj 37 199 s sarec.messages;
+#X msg 49 120 region 500 1000;
+#X msg 37 93 region 0 0;
+#X text 40 75 set region to entire array (default);
+#X text 167 120 select region within array (ms.);
+#X msg 61 159 region 0 1500;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 5 0 0 0;
+#X restore 379 103 pd set-record-region;
+#N canvas 115 280 450 300 playback 0;
+#X obj 42 205 *~ 0.1;
+#X obj 42 235 dac~;
+#X obj 42 178 tabplay~ track1;
+#X obj 179 67 inlet;
+#X obj 44 74 inlet;
+#X connect 0 0 1 0;
+#X connect 0 0 1 1;
+#X connect 2 0 0 0;
+#X connect 3 0 0 1;
+#X connect 4 0 2 0;
+#X restore 349 383 pd playback;
+#X text 216 351 play back track ->;
+#X text 380 81 select region;
+#X text 20 47 sarec~ - sample-accurate recording unit. This object
+could provide the basis for a multi-track recording system.;
+#X connect 1 0 28 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 1;
+#X connect 4 0 21 0;
+#X connect 7 0 30 1;
+#X connect 8 0 7 0;
+#X connect 13 0 30 0;
+#X connect 15 0 1 0;
+#X connect 16 0 22 0;
+#X connect 21 0 1 0;
+#X connect 23 0 14 0;
+#X connect 24 0 23 0;
+#X connect 25 0 23 0;
+#X connect 26 0 23 0;
+#X connect 28 0 5 0;
diff --git a/externals/lyonpotpourri/sarec~.c b/externals/lyonpotpourri/sarec~.c
new file mode 100755
index 0000000000000000000000000000000000000000..a07a877191f2b9ff11763959decca832419c30e9
--- /dev/null
+++ b/externals/lyonpotpourri/sarec~.c
@@ -0,0 +1,400 @@
+#include "MSPd.h"
+
+static t_class *sarec_class;
+
+#define MAXBEATS (256)
+#define OBJECT_NAME "sarec~"
+#define SAREC_RECORD 1
+#define SAREC_OVERDUB 2
+#define SAREC_PUNCH 3
+#define SAREC_LOCK 4
+
+// update time in samples
+#define WAVEFORM_UPDATE (22050)
+
+typedef struct _sarec
+{
+	t_object x_obj;
+    t_float x_f;
+    long b_valid;
+    long b_frames;
+    t_word *b_samples;
+	long display_counter;
+	int valid; // status of recording buffer (not yet implemented)
+	int status; // idle? 0, recording? 1
+	int mode; // record, overdub or punch
+	int overdub; // 0 ? write over track, 1: overdub into track
+	int *armed_chans; // 1, armed, 0, protected
+	long counter; // sample counter
+	float sync; // position in recording
+	long start_frame; // start time in samples
+	long end_frame; // end time in samples
+	long fadesamps; // number of samples for fades on PUNCH mode
+	long regionsamps; // use for fade
+	int channel_count; // number of channels (hopefully!) in buffer
+	float sr;
+    float syncphase;
+	t_symbol *bufname; // name of recording buffer
+    t_garray *recbuf; 
+} t_sarec;
+
+
+void *sarec_new(t_symbol *bufname);
+
+// void sarec_region(t_sarec *x, t_symbol *msg, short argc, t_atom *argv);
+void sarec_regionsamps(t_sarec *x, t_floatarg start_frame, t_floatarg end_frame);
+void sarec_region(t_sarec *x, t_floatarg start_time, t_floatarg end_time);
+
+t_int *sarec_perform(t_int *w);
+void sarec_dsp(t_sarec *x, t_signal **sp);
+
+
+void sarec_arm(t_sarec *x, t_floatarg chan);
+void sarec_disarm(t_sarec *x, t_floatarg chan);
+void sarec_attach_buffer(t_sarec *x);
+void sarec_overdub(t_sarec *x);
+void sarec_record(t_sarec *x);
+void sarec_punch(t_sarec *x);
+void sarec_punchfade(t_sarec *x, t_floatarg fadetime);
+void sarec_tilde_setup(void);
+void sarec_lock(t_sarec *x);
+
+
+void sarec_tilde_setup(void)
+{
+    t_class *c;
+    c = class_new(gensym("sarec~"),(t_newmethod)sarec_new,0, sizeof(t_sarec),0, A_SYMBOL,0);
+    CLASS_MAINSIGNALIN(c,t_sarec,x_f);
+    class_addmethod(c,(t_method)sarec_dsp,gensym("dsp"),A_CANT,0);
+    class_addmethod(c,(t_method)sarec_arm,gensym("arm"),A_FLOAT,0);
+    class_addmethod(c,(t_method)sarec_disarm,gensym("disarm"),A_FLOAT,0);
+    class_addmethod(c,(t_method)sarec_overdub,gensym("overdub"),0);
+    class_addmethod(c,(t_method)sarec_lock,gensym("lock"),0);
+    class_addmethod(c,(t_method)sarec_punch,gensym("punch"),0);
+    class_addmethod(c,(t_method)sarec_punchfade,gensym("punchfade"),A_FLOAT,0);
+    class_addmethod(c,(t_method)sarec_record,gensym("record"),0);
+    class_addmethod(c,(t_method)sarec_regionsamps,gensym("regionsamps"),A_FLOAT, A_FLOAT,0);
+    class_addmethod(c,(t_method)sarec_region,gensym("region"),A_FLOAT, A_FLOAT,0);
+    sarec_class = c;
+    potpourri_announce(OBJECT_NAME);
+}
+
+
+void sarec_lock(t_sarec *x)
+{
+	x->mode = SAREC_LOCK;
+}
+
+
+void *sarec_new(t_symbol *bufname)
+{
+	int i;
+	int chans;
+    
+    chans = 1; // mono processing only in Pd
+    
+	t_sarec *x = (t_sarec *)pd_new(sarec_class);
+	inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+
+	
+    x->status = 0;
+	x->counter = 0;
+    x->b_valid = 0;
+    x->bufname = bufname;
+	x->channel_count = chans;
+	x->armed_chans = (int *) malloc(x->channel_count * sizeof(int));
+	x->display_counter = 0;
+	x->start_frame = 0;
+	x->end_frame = 0;
+	x->overdub = 0;
+	x->mode = SAREC_RECORD;
+	x->sr = sys_getsr();
+	x->fadesamps = x->sr * 0.05; // 50 ms fade time
+	x->start_frame = -1; // initialize to a bad value
+	x->end_frame = -1;
+	x->regionsamps = 0;
+	for(i = 0; i < x->channel_count; i++){
+		x->armed_chans[i] = 1; // all channels armed by default
+	}
+	return x;
+}
+
+t_int *sarec_perform(t_int *w)
+{
+	int i, j;
+	t_sarec *x = (t_sarec *) (w[1]);
+	t_float *click_inlet = (t_float *) (w[2]);
+	t_float *record_inlet;
+	t_float *sync;
+	t_int channel_count = x->channel_count;
+	int n;
+	int next_pointer = channel_count + 5;
+	int status = x->status;
+	int counter = x->counter;
+	int *armed_chans = x->armed_chans;
+	t_word *samples = x->b_samples;
+	long b_frames = x->b_frames;
+	long start_frame = x->start_frame;
+	long end_frame = x->end_frame;
+    long b_valid = x->b_valid;
+	//int overdub = x->overdub;
+	int mode = x->mode;
+	long fadesamps = x->fadesamps;
+	long regionsamps = x->regionsamps;
+	int clickval;
+	float frak;
+	float goin_up, goin_down;
+	long counter_msf;
+	sync = (t_float *) (w[3 + channel_count]);
+	n = (int) w[4 + channel_count];
+    if(! b_valid)
+        goto escape;
+	if(! regionsamps ){
+		x->regionsamps = regionsamps = end_frame - start_frame;
+	}
+	for(i = 0; i < n; i++){
+		// could be record (1) or overdub (2)
+		if( click_inlet[i] ){
+			clickval = (int) click_inlet[i];
+			if(clickval == -2) {
+				status = 0;
+				counter = 0;
+                garray_redraw(x->recbuf);
+			}
+			else {
+				// arm all channels
+				if(clickval == -1) {
+					// just use all armed channels
+				}
+				// arm only one channel - protect against fatal bad index
+				else if(clickval <= channel_count && clickval > 0) {
+					for(j=0; j < channel_count; j++){
+						armed_chans[j] = 0;
+					};
+					armed_chans[clickval - 1] = 1;
+					// post("arming channel %d", clickval);
+				}
+				
+				counter = start_frame;
+				if(!end_frame){
+					end_frame = b_frames;
+				}
+				status = 1;
+			}
+			
+		}		
+		if(counter >= end_frame) {
+			counter = 0;
+			status = 0;
+            garray_redraw(x->recbuf);
+		}
+		// write over track
+		if(status && (mode == SAREC_RECORD) ){
+			for(j=0; j < channel_count; j++){
+				if( armed_chans[j] ){
+					record_inlet = (t_float *) (w[3 + j]);
+					samples[ (counter * channel_count) + j].w_float = record_inlet[i];
+				}
+			}
+			counter++;
+		}
+		// overdub
+		else if(status && (mode == SAREC_OVERDUB) ){
+			for(j=0; j < channel_count; j++){
+				if( armed_chans[j] ){
+					record_inlet = (t_float *) (w[3 + j]);
+					samples[ (counter * channel_count) + j].w_float += record_inlet[i];
+				}
+			}
+			counter++;
+		}
+		// punch
+		
+		else if(status && (mode == SAREC_PUNCH)) {
+			counter_msf = counter - start_frame;
+			for(j=0; j < channel_count; j++){
+				if( armed_chans[j] ){
+					record_inlet = (t_float *) (w[3 + j]);
+					// frak is multiplier for NEW STUFF, (1-frak) is MULTIPLIER for stuff to fade out
+					// do power fade though
+					
+					if( counter_msf < fadesamps ){
+						
+						// fade in
+						frak = (float)counter_msf / (float)fadesamps;
+						goin_up = sin(PIOVERTWO * frak);
+						goin_down = cos(PIOVERTWO * frak);
+						//post("fadein: %d, up: %f, down: %f", counter_msf, goin_up, goin_down);
+						samples[ (counter * channel_count) + j].w_float =
+						(samples[ (counter * channel_count) + j].w_float * goin_down)
+						+ (record_inlet[i] * goin_up);
+					} else if ( counter_msf >= (regionsamps - fadesamps) ){
+						frak = (float) (regionsamps - counter_msf) / (float) fadesamps;
+						// fade out
+                        
+						// frak = (float)counter_msf / (float)fadesamps;
+						goin_up = cos(PIOVERTWO * frak);
+						goin_down = sin(PIOVERTWO * frak);
+						//post("fadeout: %d, up: %f, down: %f", counter_msf, goin_up, goin_down);
+						samples[ (counter * channel_count) + j].w_float =
+						(samples[ (counter * channel_count) + j].w_float * goin_up)
+						+ (record_inlet[i] * goin_down);
+					} else {
+						// straight replace
+						samples[ (counter * channel_count) + j].w_float = record_inlet[i];
+					}
+					
+				}
+			}
+			counter++;
+		}
+		
+		sync[i] = (float) counter / (float) b_frames;
+	}
+	if(status){
+		x->display_counter += n;
+		if(x->display_counter > WAVEFORM_UPDATE){
+            garray_redraw(x->recbuf);
+			x->display_counter = 0;
+		}
+	}
+	x->end_frame = end_frame;
+	x->status = status;
+	x->counter = counter;
+escape:
+	return w + next_pointer;
+}
+
+void sarec_overdub(t_sarec *x)
+{
+	x->mode = SAREC_OVERDUB;
+}
+
+
+void sarec_record(t_sarec *x)
+{
+	x->mode = SAREC_RECORD;
+}
+
+void sarec_punchfade(t_sarec *x, t_floatarg fadetime)
+{
+	x->fadesamps = x->sr * fadetime * 0.001; // read fade in ms.
+	//post("punch mode");
+}
+
+void sarec_punch(t_sarec *x)
+{
+	x->mode = SAREC_PUNCH;
+	// post("punch mode");
+}
+
+void sarec_disarm(t_sarec *x, t_floatarg chan)
+{
+    //	int i;
+	int ichan = (int) chan;
+	if(chan <= x->channel_count && chan > 0) {
+		x->armed_chans[ichan - 1] = 0;
+	}
+}
+
+void sarec_arm(t_sarec *x, t_floatarg chan)
+{
+	int i;
+	int ichan = (int) chan;
+	if(ichan == -1){
+		for(i = 0; i < x->channel_count; i++){
+			x->armed_chans[i] = 1;
+		}
+	} else if(ichan == 0)
+	{
+		for(i = 0; i < x->channel_count; i++){
+			x->armed_chans[i] = 0;
+		}
+	} else if(chan <= x->channel_count && chan > 0) {
+		x->armed_chans[ichan - 1] = 1;
+	}
+}
+
+
+void sarec_region(t_sarec *x, t_floatarg start_time, t_floatarg end_time)
+{
+	long b_frames = x->b_frames;
+	long start_frame, end_frame;
+	float sr = x->sr;
+	// convert milliseconds to samples:
+	start_frame = (long) (sr * 0.001 * start_time );
+	end_frame = (long) (sr * 0.001 * end_time );
+	start_frame = start_frame < 0 || start_frame > b_frames - 1 ? 0 : start_frame;
+	end_frame = end_frame > b_frames ? b_frames : end_frame;
+	x->end_frame = end_frame;
+	x->start_frame = start_frame;
+	x->regionsamps = end_frame - start_frame;
+}
+
+void sarec_regionsamps(t_sarec *x, t_floatarg start_frame, t_floatarg end_frame)
+{
+	long b_frames = x->b_frames;
+	// long start_frame, end_frame;
+	//start_frame = (long) atom_getfloatarg(0, argc, argv);
+	//end_frame = (long) atom_getfloatarg(1, argc, argv);
+	start_frame = start_frame < 0 || start_frame > b_frames - 1 ? 0 : start_frame;
+	end_frame = end_frame > b_frames ? b_frames : end_frame;
+	x->end_frame = (long)end_frame;
+	x->start_frame = (long)start_frame;
+	x->regionsamps = end_frame - start_frame;
+}
+
+
+void sarec_attach_buffer(t_sarec *x)
+{
+	t_garray *a; 
+	t_symbol *bufname = x->bufname;
+	int b_frames;
+	float *b_samples = x->b_samples;
+	if (!(a = (t_garray *)pd_findbyclass(bufname, garray_class))) {
+		if (*bufname->s_name) pd_error(x, "%s: %s: no such array",OBJECT_NAME,bufname->s_name);
+        x->b_valid = 0;
+    }
+	else if (!garray_getfloatwords(a, &b_frames, &b_samples)) {
+		pd_error(x, "%s: bad array for %s", bufname->s_name,OBJECT_NAME);
+        x->b_valid = 0;
+    }
+	else  {
+        x->recbuf = a;
+        x->b_valid = 1; // a->a_valid; ???
+        x->b_frames = b_frames;
+        x->b_samples = b_samples;
+		garray_usedindsp(a);
+	}
+}
+
+void sarec_dsp(t_sarec *x, t_signal **sp)
+{
+	long i;
+	t_int **sigvec;
+	int pointer_count;
+	pointer_count = x->channel_count + 4;
+    /* all channels, 1 inlet, 1 sync outlet,  the object pointer, vector size N */
+	
+	sarec_attach_buffer(x);
+	if( x->start_frame < 0 && x->end_frame < 0){
+		x->start_frame = 0;
+		x->end_frame = x->b_frames;
+	}
+	sigvec  = (t_int **) calloc(pointer_count, sizeof(t_int *));
+	for(i = 0; i < pointer_count; i++){
+		sigvec[i] = (t_int *) calloc(sizeof(t_int),1);
+	}
+	sigvec[0] = (t_int *)x; // first pointer is to the object
+	
+	sigvec[pointer_count - 1] = (t_int *)sp[0]->s_n; // last pointer is to vector size (N)
+	
+	for(i = 1; i < pointer_count - 1; i++){ // now attach the inlet and all outlets
+		sigvec[i] = (t_int *)sp[i-1]->s_vec;
+	}
+	x->sr = sp[0]->s_sr;
+    
+	dsp_addv(sarec_perform, pointer_count, (t_int *) sigvec);
+	free(sigvec);	
+}
\ No newline at end of file
diff --git a/externals/lyonpotpourri/sel~-help.pd b/externals/lyonpotpourri/sel~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..320b382b1bf9a9b52dc5c2140f1303f84511005c
--- /dev/null
+++ b/externals/lyonpotpourri/sel~-help.pd
@@ -0,0 +1,46 @@
+#N canvas 192 248 489 337 10;
+#X obj 41 184 sel~ 1 2 5.5, f 27;
+#X obj 41 226 click2bang~;
+#X obj 120 227 click2bang~;
+#X obj 200 225 click2bang~;
+#X obj 41 87 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 41 269 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 120 268 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 200 266 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 114 75 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 114 142 *~ 2;
+#X obj 268 88 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 41 125 click~;
+#X obj 114 112 click~;
+#X obj 268 126 click~;
+#X obj 26 4 cnv 15 155 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X obj 26 4 cnv 15 155 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 28 41 sel~ - sample-accurate implementation of the sel algorithm
+;
+#X text 281 224 impulses are numerically matched by sending a click
+(impulse with value 1.0) to the appropriate outlet, f 31;
+#X msg 312 99 set 5.5;
+#X obj 312 70 loadbang;
+#X connect 0 0 1 0;
+#X connect 0 1 2 0;
+#X connect 0 2 3 0;
+#X connect 1 0 5 0;
+#X connect 2 0 6 0;
+#X connect 3 0 7 0;
+#X connect 4 0 11 0;
+#X connect 8 0 12 0;
+#X connect 9 0 0 0;
+#X connect 10 0 13 0;
+#X connect 11 0 0 0;
+#X connect 12 0 9 0;
+#X connect 13 0 0 0;
+#X connect 18 0 13 0;
+#X connect 19 0 18 0;
diff --git a/externals/lyonpotpourri/sel~.c b/externals/lyonpotpourri/sel~.c
new file mode 100755
index 0000000000000000000000000000000000000000..4e4eb73a9a6f43e3ffdcd603b92d9ff6634f8e89
--- /dev/null
+++ b/externals/lyonpotpourri/sel~.c
@@ -0,0 +1,178 @@
+#include "MSPd.h"
+
+static t_class *sel_class;
+
+#define MAXBEATS (256)
+#define OBJECT_NAME "sel~"
+#define COMPILE_DATE "9.02.07"
+#define OBJECT_VERSION "2.01"
+// #define DATE "prerelease"
+
+/* Pd version of sel~ */
+
+typedef struct _sel
+{
+	t_object x_obj;
+    t_float x_f;
+	t_float *matches; // store numbers to match against
+	t_float *trigger_vec; // copy of input vector
+	t_int length; // number of matches to check
+    t_float **ins; // array of input signal vectors
+    t_float **outs; // array of output signal vectors
+} t_sel;
+
+void *sel_new(t_symbol *msg, short argc, t_atom *argv);
+void sel_free(t_sel *x);
+void sel_dsp(t_sel *x, t_signal **sp);
+
+
+void sel_tilde_setup(void){
+    sel_class = class_new(gensym("sel~"), (t_newmethod)sel_new,
+                              (t_method)sel_free, sizeof(t_sel),0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(sel_class, t_sel, x_f);
+    class_addmethod(sel_class, (t_method)sel_dsp, gensym("dsp"),0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+void *sel_new(t_symbol *msg, short argc, t_atom *argv)
+{
+	int i;
+
+	t_sel *x = (t_sel *)pd_new(sel_class);
+	x->length = (t_int)argc;
+
+	for(i=0;i< x->length ;i++){
+        outlet_new(&x->x_obj, gensym("signal"));
+    }
+    
+	x->matches = (t_double *) malloc(x->length * sizeof(double));
+
+	for(i = 0; i < argc; i++){
+		x->matches[i] = (double)atom_getfloatarg(i,argc,argv);
+	}
+
+    x->ins = (t_float **) malloc(1 * sizeof(t_float *));
+    x->outs = (t_float **) malloc(x->length * sizeof(t_float *));
+    // only 1 inlet
+    for(i = 0; i < 1; i++){
+        x->ins[i] = (t_float *) malloc(8192 * sizeof(t_float));
+    }
+	return x;
+}
+
+void sel_free(t_sel *x)
+{
+	free(x->matches);
+    free(x->outs);
+    free(x->ins[0]);
+    free(x->ins);
+}
+
+t_int *sel_perform(t_int *w)
+{
+    int i, j;
+    t_sel *x = (t_sel *) w[1];
+    t_float **ins = x->ins;
+    t_float **outs = x->outs;
+    t_float *invec;
+	t_float *inlet;
+	t_float *match_outlet;
+	t_float *matches = x->matches;
+	t_int length = x->length;
+	
+    int n = (int) w[length + 3]; // obj, func, 1 inlet
+    
+    // copy input vectors (just 1 here)
+    for(i = 0; i < 1; i++){
+        invec = (t_float *) w[2 + i];
+        for(j = 0; j < n; j++){
+            ins[i][j] = invec[j];
+        }
+    }
+    inlet = ins[0];
+    // assign output vector pointers
+    for(i = 0; i < length; i++){
+        outs[i] = (t_float *) w[3 + i];
+    }
+    
+    // clean each outlet
+	for(j = 0; j < length; j++){
+		match_outlet = (t_double *) outs[j];
+		for(i = 0; i < n; i++){
+			match_outlet[i] = 0.0;
+		}
+	}
+    // now match and route any clicks in the input
+	for(i = 0; i < n; i++){
+		if(inlet[i]){
+			for(j = 0; j < length; j++){
+				if( inlet[i] == matches[j]){
+					match_outlet = (t_double *) outs[j];
+					match_outlet[i] = 1.0; // always send a unity click
+				}
+			}
+		}
+	}
+    return (w + length + 4);
+}
+
+/*
+void sel_perform64(t_sel *x, t_object *dsp64, double **ins,
+                   long numins, double **outs,long numouts, long n,
+                   long flags, void *userparam)
+{
+    int i, j;
+	t_double *inlet = ins[0];
+	t_double *match_outlet;
+	t_double *matches = x->matches;
+	int length = x->length;
+	
+    // clean each outlet
+	for(j = 0; j < length; j++){
+		match_outlet = (t_double *) outs[j];
+		for(i = 0; i < n; i++){
+			match_outlet[i] = 0.0;
+		}
+	}
+    // now match and route any clicks in the input
+	for(i = 0; i < n; i++){
+		if(inlet[i]){
+			for(j = 0; j < length; j++){
+				if( inlet[i] == matches[j]){
+					match_outlet = (t_double *) outs[j];
+					match_outlet[i] = 1.0; // always send a unity click
+				}
+			}
+		}
+	}
+}
+
+
+t_int *sel_dsp64(t_sel *x, t_object *dsp64, short *count, double sr, long n, long flags)
+{
+    if(!sp[0]->s_sr)
+        return;
+    object_method(dsp64, gensym("dsp_add64"),x,sel_perform64,0,NULL);
+}
+*/
+
+void sel_dsp(t_sel *x, t_signal **sp)
+{
+	long i;
+    t_int **sigvec;
+    int pointer_count = x->length + 3; // output chans + object + inchan + vectorsize
+    if(!sp[0]->s_sr){
+        return;
+    }
+    sigvec  = (t_int **) calloc(pointer_count, sizeof(t_int *));
+	for(i = 0; i < pointer_count; i++){
+		sigvec[i] = (t_int *) calloc(sizeof(t_int),1);
+	}
+	sigvec[0] = (t_int *)x; // first pointer is to the object
+	sigvec[pointer_count - 1] = (t_int *)sp[0]->s_n; // last pointer is to vector size (N)
+	for(i = 1; i < pointer_count - 1; i++){ // now attach the inlet and all outlets
+		sigvec[i] = (t_int *)sp[i-1]->s_vec;
+	}
+    dsp_addv(sel_perform, pointer_count, (t_int *)sigvec);
+    free(sigvec);
+}
diff --git a/externals/lyonpotpourri/shoehorn~-help.pd b/externals/lyonpotpourri/shoehorn~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..33883d33e4e1d2f5728be13ee09e4e092072cf22
--- /dev/null
+++ b/externals/lyonpotpourri/shoehorn~-help.pd
@@ -0,0 +1,28 @@
+#N canvas 375 428 410 405 10;
+#X obj 11 117 osc~ 340;
+#X obj 11 283 *~ 0.01;
+#X obj 87 285 *~ 0.01;
+#X obj 11 338 dac~;
+#X obj 48 168 osc~ 546;
+#X obj 29 141 osc~ 739;
+#X obj 11 246 shoehorn~ 5 2;
+#X obj 67 193 osc~ 1666;
+#X obj 86 216 osc~ 665;
+#X text -2 47 shoehorn~ collapses an arbitrary number of input channels
+into an arbitrary number of output channels \, by spacing them from
+left to right with equal power panning.;
+#X obj -3 9 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X obj 153 250 hsl 128 15 0 0.15 0 0 empty empty gain -2 -8 0 10 -232576
+-1 -1 1300 1;
+#X connect 0 0 6 0;
+#X connect 1 0 3 0;
+#X connect 2 0 3 1;
+#X connect 4 0 6 2;
+#X connect 5 0 6 1;
+#X connect 6 0 1 0;
+#X connect 6 1 2 0;
+#X connect 7 0 6 3;
+#X connect 8 0 6 4;
+#X connect 11 0 2 1;
+#X connect 11 0 1 1;
diff --git a/externals/lyonpotpourri/shoehorn~.c b/externals/lyonpotpourri/shoehorn~.c
new file mode 100755
index 0000000000000000000000000000000000000000..4d8cd9b312a3f5737217d9e1a4912f27dbfe7ae2
--- /dev/null
+++ b/externals/lyonpotpourri/shoehorn~.c
@@ -0,0 +1,174 @@
+#include "MSPd.h"
+
+static t_class *shoehorn_class;
+
+/* Pd version of shoehorn~ */
+
+#define OBJECT_NAME "shoehorn~"
+
+typedef struct _shoehorn
+{
+    
+    t_object x_obj;
+    t_float x_f;
+    long inChans;
+    long outChans;
+    double pio2;
+    t_float *inarr;
+    t_float **loc_invecs;
+    t_float *outs;
+    double advFrac;
+    double *pangains1;
+    double *pangains2;
+    long *indexList;
+} t_shoehorn;
+
+void *shoehorn_new(t_symbol *s, int argc, t_atom *argv);
+void shoehorn_free(t_shoehorn *x);
+void shoehorn_dsp(t_shoehorn *x, t_signal **sp);
+t_int *shoehorn_perform(t_int *w);
+
+void shoehorn_tilde_setup(void){
+    shoehorn_class = class_new(gensym("shoehorn~"), (t_newmethod)shoehorn_new,
+                           (t_method)shoehorn_free, sizeof(t_shoehorn),0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(shoehorn_class, t_shoehorn, x_f);
+    class_addmethod(shoehorn_class, (t_method)shoehorn_dsp, gensym("dsp"),0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+void *shoehorn_new(t_symbol *s, int argc, t_atom *argv)
+{
+	int i;
+    double fullFrac, thisFrac, panloc;
+    long outIndex;
+    t_shoehorn *x = (t_shoehorn *)pd_new(shoehorn_class);
+    x->inChans = (long) atom_getfloatarg(0,argc,argv);
+    x->outChans = (long) atom_getfloatarg(1,argc,argv);
+    if(x->inChans < 2){
+        post("%s: warning: defaulting to 2 in channels", OBJECT_NAME);
+        x->inChans = 2;
+    }
+    if(x->outChans < 2){
+        post("%s: warning: defaulting to 2 out channels", OBJECT_NAME);
+        x->outChans = 2;
+    }
+    for(i = 0; i < x->inChans - 1; i++){
+        inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("signal"),gensym("signal"));
+    }
+    for(i=0; i < x->outChans; i++){
+        outlet_new(&x->x_obj, gensym("signal"));
+    }
+    x->pio2 = PI / 2.0;
+    
+    x->inarr = (t_float *) malloc(x->inChans * sizeof(t_float));
+    x->loc_invecs = (t_float **) malloc(x->inChans * sizeof(t_float *));
+    for(i = 0; i < x->inChans; i++){
+        x->loc_invecs[i] = (t_float *) malloc(8192 * sizeof(t_float));
+    }
+    x->pangains1 = (double *) malloc(x->inChans * sizeof(double));
+    x->pangains2 = (double *) malloc(x->inChans * sizeof(double));
+    x->indexList = (long *) malloc(x->inChans * sizeof(long));
+    x->advFrac = (double)(x->outChans - 1)/(double)(x->inChans - 1);
+    x->outs = (t_float **) malloc(x->outChans * sizeof(t_float *)); // temporary holding for output vectors
+    
+    for(i = 1; i < x->inChans - 1; i++){
+        fullFrac = i * x->advFrac;
+        outIndex = floor(fullFrac);
+        thisFrac = fullFrac - outIndex;
+        panloc = thisFrac * x->pio2;
+        x->indexList[i] = outIndex;
+        x->pangains1[i] = cos(panloc);
+        x->pangains2[i] = sin(panloc);
+    }
+    return x;
+}
+
+void shoehorn_free(t_shoehorn *x)
+{
+    int i;
+    free(x->inarr);
+    free(x->pangains1);
+    free(x->pangains2);
+    free(x->indexList);
+    for(i = 0; i < x->inChans; i++){
+        free(x->loc_invecs[i]);
+    }
+    free(x->loc_invecs);
+    free(x->outs);
+}
+
+
+t_int *shoehorn_perform(t_int *w)
+{
+    t_shoehorn *x = (t_shoehorn*) w[1];
+	long inChans = x->inChans;
+    long outChans = x->outChans;
+    t_float *inarr = x->inarr;
+    t_float **loc_invecs = x->loc_invecs;
+    t_float *invec;
+    t_float **outs = x->outs;
+    double *pangains1 = x->pangains1;
+    double *pangains2 = x->pangains2;
+	int chan,i, j;
+    long outIndex;
+    long *indexList = x->indexList;
+    
+    int n = (int) w[inChans + outChans + 2];
+    // assign output vector pointers
+    
+    for(i = 0; i < outChans; i++){
+        outs[i] = (t_float *) w[2 + inChans + i];
+    }
+
+    // copy all input vectors to a local 2D array
+    for(i = 0; i < inChans; i++){
+        invec = (t_float *) w[2 + i];
+        for(j = 0; j < n; j++){
+            loc_invecs[i][j] = invec[j];
+        }
+    }
+   
+	for( j = 0; j < n; j++){
+        // copy local input sample frame
+        for(chan = 0; chan < inChans; chan++){
+            inarr[chan] = loc_invecs[chan][j];
+        }
+        
+        // zero out output channels
+        for(chan = 1; chan < outChans - 1; chan++){
+            outs[chan][j] = 0.0;
+        }
+        
+        // copy outer channel samples directly
+        
+        outs[0][j] = inarr[0];
+        outs[outChans - 1][j] = inarr[inChans - 1];
+        
+        // spread internal input channels to respective output channels
+        
+        for(chan = 1; chan < inChans - 1; chan++){
+            outIndex = indexList[chan];
+            outs[outIndex][j] += pangains1[chan] * inarr[chan];
+            outs[outIndex+1][j] += pangains2[chan] * inarr[chan];
+        }
+	}
+    return (w + inChans + outChans + 3);
+}
+
+void shoehorn_dsp(t_shoehorn *x, t_signal **sp)
+{
+	long i;
+    t_int **sigvec;
+    int pointer_count = x->inChans + x->outChans + 2;
+    sigvec  = (t_int **) calloc(pointer_count, sizeof(t_int *));
+	for(i = 0; i < pointer_count; i++){
+		sigvec[i] = (t_int *) calloc(sizeof(t_int),1);
+	}
+	sigvec[0] = (t_int *)x; // first pointer is to the object
+	sigvec[pointer_count - 1] = (t_int *)sp[0]->s_n; // last pointer is to vector size (N)
+	for(i = 1; i < pointer_count - 1; i++){ // now attach the inlet and all outlets
+		sigvec[i] = (t_int *)sp[i-1]->s_vec;
+	}
+    dsp_addv(shoehorn_perform, pointer_count, (t_int *)sigvec);
+    free(sigvec);
+}
diff --git a/externals/lyonpotpourri/sigseq~-help.pd b/externals/lyonpotpourri/sigseq~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..b756c425d0b9d4ecf1ea925c03db267f3400ee19
--- /dev/null
+++ b/externals/lyonpotpourri/sigseq~-help.pd
@@ -0,0 +1,83 @@
+#N canvas 133 217 352 325 10;
+#X obj 20 126 sigseq~;
+#X obj 113 155 bng 30 550 50 0 empty empty empty 0 -6 0 8 -260679 -51584
+-1;
+#X obj 66 245 *~ 0.1;
+#X obj 66 214 *~;
+#X obj 66 283 dac~;
+#X obj 20 175 osc~;
+#N canvas 647 240 474 324 messages 0;
+#X obj 133 195 outlet;
+#N canvas 40 386 462 312 clock 0;
+#X obj 141 124 outlet;
+#X obj 45 212 send~ external_clock;
+#X msg 45 148 tempo \$1;
+#X floatatom 44 122 5 0 0 0 - - -, f 5;
+#X obj 45 173 samm~ 60 0.25;
+#X msg 141 98 external_clock \$1;
+#X obj 141 51 tgl 40 0 empty empty empty 0 -6 0 8 -4061 -1 -1 0 1;
+#X text 139 30 must toggle DACs before switch takes effect;
+#X connect 2 0 4 0;
+#X connect 3 0 2 0;
+#X connect 4 0 1 0;
+#X connect 5 0 0 0;
+#X connect 6 0 5 0;
+#X restore 207 159 pd clock;
+#X obj 205 234 outlet~;
+#X obj 205 198 receive~ external_clock;
+#N canvas 0 22 474 324 other-controls 0;
+#X obj 24 181 outlet;
+#X msg 24 65 banggate \$1;
+#X obj 24 14 tgl 40 0 empty empty empty 0 -6 0 8 -4061 -1 -1 1 1;
+#X text 66 27 open gate for bang on sequence start;
+#X obj 58 -9 loadbang;
+#X msg 24 -7 1;
+#X msg 159 141 adsrgate \$1;
+#X obj 159 94 tgl 40 0 empty empty empty 0 -6 0 8 -4061 -1 -1 0 1;
+#X text 205 114 on by default \, zero turns off ADSR;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 4 0 5 0;
+#X connect 5 0 2 0;
+#X connect 6 0 0 0;
+#X connect 7 0 6 0;
+#X restore 133 64 pd other-controls;
+#N canvas 367 423 470 320 sequences 0;
+#X obj 76 246 outlet;
+#X msg 200 91 440 469.333 605 660 704;
+#X msg 173 190 500 600 700 1300 888 340 3000 773 773;
+#X obj 227 148 loadbang;
+#X msg 53 113 rand \$1;
+#X obj 53 59 tgl 40 0 empty empty empty 0 -6 0 8 -4061 -1 -1 0 1;
+#X obj 129 30 tgl 40 0 empty empty empty 0 -6 0 8 -4061 -1 -1 0 1;
+#X msg 129 84 retro \$1;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 2 0;
+#X connect 4 0 0 0;
+#X connect 5 0 4 0;
+#X connect 6 0 7 0;
+#X connect 7 0 0 0;
+#X restore 176 98 pd sequences;
+#X connect 1 0 0 0;
+#X connect 3 0 2 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X restore 20 96 pd messages;
+#X obj 18 18 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 15 52 sigseq~ - sample-accurate sequencing;
+#X floatatom 105 219 5 0 0 2 - sigseq-gain -, f 5;
+#X obj 148 218 hsl 128 15 0 0.2 0 0 sigseq-gain sigseq-gain-in gain
+-2 -8 0 10 -203904 -1 -1 4400 1;
+#X text 111 101 <- controls here;
+#X connect 0 0 5 0;
+#X connect 0 1 3 1;
+#X connect 0 2 1 0;
+#X connect 2 0 4 0;
+#X connect 2 0 4 1;
+#X connect 3 0 2 0;
+#X connect 5 0 3 0;
+#X connect 6 0 0 0;
+#X connect 6 1 0 0;
+#X connect 9 0 2 1;
diff --git a/externals/lyonpotpourri/sigseq~.c b/externals/lyonpotpourri/sigseq~.c
new file mode 100755
index 0000000000000000000000000000000000000000..a2233d763897628fe45eddd3887cb7f3fc69fda0
--- /dev/null
+++ b/externals/lyonpotpourri/sigseq~.c
@@ -0,0 +1,572 @@
+#include "MSPd.h"
+
+
+static t_class *sigseq_class;
+
+#define MAX_VEC 2048
+#define MAX_SEQ 1024
+#define internal_clock 1
+#define EXTERNAL_CLOCK 2
+
+#define OBJECT_NAME "sigseq~"
+typedef struct _sigseq
+{
+    
+    t_object x_obj;
+    float x_f;
+    
+    // Variables Here
+    float *sequence;
+    float *trigger_vec; // stores vector with trigger click
+    int seq_len;
+    int seq_ptr;// position in sequence
+    short bang_ptr;
+    float tempo;
+    int beat_subdiv;
+    int tsamps;
+    int counter;
+    float val;
+    void *mybang;
+    void *m_outlet; // NEW
+    void *m_clock; // NEW
+    float flat_gain;
+    float last_val;
+    short retro_state;
+    short rand_state;
+    // ADSR
+    float a;
+    float d;
+    float s;
+    float r;
+    int ebreak1;
+    int ebreak2;
+    int ebreak3;
+    int asamps;
+    int dsamps;
+    int ssamps;
+    int rsamps;
+    float egain;
+    int do_envelope;
+    int bang_on;
+    short mute;
+    int rval;
+    int method; //synthesis method to use
+    float sr;
+} t_sigseq;
+
+void *sigseq_new(t_symbol *s, int argc, t_atom *argv);
+
+t_int *sigseq_perform(t_int *w);
+t_int *sigseq_perform_clickin(t_int *w);
+void sigseq_dsp(t_sigseq *x, t_signal **sp);
+void sigseq_list (t_sigseq *x, t_symbol *msg, short argc, t_atom *argv);
+void sigseq_adsr (t_sigseq *x, t_symbol *msg, short argc, t_atom *argv);
+void sigseq_adsrgate (t_sigseq *x, t_symbol *msg, short argc, t_atom *argv);
+void sigseq_banggate (t_sigseq *x, t_symbol *msg, short argc, t_atom *argv);
+void sigseq_tempo(t_sigseq *x, t_symbol *msg, short argc, t_atom *argv);
+void sigseq_retro(t_sigseq *x, t_symbol *msg, short argc, t_atom *argv);
+void sigseq_rand(t_sigseq *x, t_symbol *msg, short argc, t_atom *argv);
+void sigseq_mute(t_sigseq *x, t_symbol *msg, short argc, t_atom *argv);
+void sigseq_tick(t_sigseq *x);
+void sigseq_report(t_sigseq *x);
+void sigseq_readfile(t_sigseq *x, t_symbol *filename);
+void sigseq_internal_clock(t_sigseq *x, t_floatarg toggle);
+void sigseq_external_clock(t_sigseq *x, t_floatarg toggle);
+void sigseq_gozero(t_sigseq *x);
+void sigseq_free(t_sigseq *x);
+void sigseq_init(t_sigseq *x,short initialized);
+
+
+void sigseq_tilde_setup(void){
+    sigseq_class = class_new(gensym("sigseq~"), (t_newmethod)sigseq_new,
+                             (t_method)sigseq_free ,sizeof(t_sigseq), 0,A_GIMME,0);
+    CLASS_MAINSIGNALIN(sigseq_class, t_sigseq, x_f);
+    class_addmethod(sigseq_class,(t_method)sigseq_dsp,gensym("dsp"),0);
+    class_addmethod(sigseq_class,(t_method)sigseq_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(sigseq_class,(t_method)sigseq_list,gensym("list"),A_GIMME,0);
+    class_addmethod(sigseq_class,(t_method)sigseq_adsr,gensym("adsr"),A_GIMME,0);
+    class_addmethod(sigseq_class,(t_method)sigseq_adsrgate,gensym("adsrgate"),A_GIMME,0);
+    class_addmethod(sigseq_class,(t_method)sigseq_banggate,gensym("banggate"),A_GIMME,0);
+    class_addmethod(sigseq_class,(t_method)sigseq_tempo,gensym("tempo"),A_GIMME,0);
+    class_addmethod(sigseq_class,(t_method)sigseq_retro,gensym("retro"),A_GIMME,0);
+    class_addmethod(sigseq_class,(t_method)sigseq_rand,gensym("rand"),A_GIMME,0);
+    class_addmethod(sigseq_class,(t_method)sigseq_report,gensym("report"),0);
+    class_addmethod(sigseq_class,(t_method)sigseq_gozero,gensym("gozero"),0);
+    class_addmethod(sigseq_class,(t_method)sigseq_internal_clock,gensym("internal_clock"),A_FLOAT,0);
+    class_addmethod(sigseq_class,(t_method)sigseq_external_clock,gensym("external_clock"),A_FLOAT,0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+void sigseq_gozero(t_sigseq *x)
+{
+    if(x->seq_len <= 0)
+        return;
+    x->seq_ptr = x->seq_len - 1;
+}
+
+void sigseq_internal_clock(t_sigseq *x, t_floatarg toggle)
+{
+    if(toggle){
+        x->method = internal_clock;
+    } else {
+        x->method = EXTERNAL_CLOCK;
+    }
+}
+
+void sigseq_external_clock(t_sigseq *x, t_floatarg toggle)
+{
+    if(toggle){
+        x->method = EXTERNAL_CLOCK;
+    } else {
+        x->method = internal_clock;
+    }
+    post("method is %d",x->method);
+}
+
+void sigseq_report(t_sigseq *x)
+{
+    int i;
+    post("randstate: %d", x->rand_state);
+    post("rval: %d", x->rval);
+    post("seqpt: %d", x->seq_ptr);
+    post("manual rnd pos: %d", x->rval % x->seq_len);
+    
+    for(i=0;i<x->seq_len;i++){
+        post("%f",x->sequence[i]);
+    }
+}
+
+void sigseq_readfile(t_sigseq *x, t_symbol *filename)
+{
+    FILE *fp;
+    float data;
+    post("requested path: %s", filename->s_name);
+    fp = fopen(filename->s_name, "r");
+    if( fp == NULL ){
+        post("could not open file!");
+        return;
+    }
+    while( fscanf(fp, "%f", &data) != EOF ){
+        post("%f",data);
+    }
+    fclose(fp);
+}
+
+void sigseq_mute(t_sigseq *x, t_symbol *msg, short argc, t_atom *argv)
+{
+    x->mute = atom_getfloatarg(0,argc,argv);
+}
+
+
+void sigseq_rand(t_sigseq *x, t_symbol *msg, short argc, t_atom *argv)
+{
+    x->rand_state = atom_getfloatarg(0,argc,argv);	
+}
+
+void sigseq_retro(t_sigseq *x, t_symbol *msg, short argc, t_atom *argv)
+{
+    x->retro_state = atom_getfloatarg(0,argc,argv);
+	
+}
+
+void sigseq_adsrgate(t_sigseq *x, t_symbol *msg, short argc, t_atom *argv)
+{
+    
+    x->do_envelope = atom_getfloatarg(0,argc,argv);
+}
+
+void sigseq_banggate(t_sigseq *x, t_symbol *msg, short argc, t_atom *argv)
+{
+    
+    x->bang_on = atom_getfloatarg(0,argc,argv);
+}
+
+void sigseq_tempo(t_sigseq *x, t_symbol *msg, short argc, t_atom *argv)
+{
+    float beatdur;
+	
+    x->tempo = atom_getfloatarg(0,argc,argv);
+    if(!x->tempo)
+        x->tempo = 120;
+   	
+    beatdur = (60. / x->tempo ) / (float) x->beat_subdiv ;
+    x->tsamps = x->sr * beatdur;
+   	
+    x->asamps = x->sr * x->a;
+    x->dsamps = x->sr * x->d;
+    x->rsamps = x->sr * x->r;
+    x->ssamps = x->tsamps - (x->asamps+x->dsamps+x->rsamps);
+    x->ebreak1 = x->asamps;
+    x->ebreak2 = x->asamps+x->dsamps;
+    x->ebreak3 = x->asamps+x->dsamps+x->ssamps;
+    if( x->ssamps < 0 ){
+        x->ssamps = 0;
+        // post("adsr: Warning: zero duration sustain");
+    }
+}
+void *sigseq_new(t_symbol *s, int argc, t_atom *argv)
+{
+    t_sigseq *x = (t_sigseq *)pd_new(sigseq_class);
+    outlet_new(&x->x_obj, gensym("signal"));
+    outlet_new(&x->x_obj, gensym("signal"));
+    x->mybang = outlet_new(&x->x_obj, gensym("bang"));
+    x->m_clock = clock_new(x,(void *)sigseq_tick);
+    
+    srand(clock());
+    x->tempo = atom_getfloatarg(0,argc,argv);
+    x->beat_subdiv = atom_getfloatarg(1,argc,argv);
+    x->flat_gain = atom_getfloatarg(2,argc,argv);
+    if( x->tempo <= 0 )
+        x->tempo = 120.;
+    if(x->beat_subdiv <= 0)
+        x->beat_subdiv = 2;
+    if(x->flat_gain<= 0)
+        x->flat_gain = 0.5;
+    
+    x->sr = sys_getsr();
+    if(!x->sr){
+        x->sr = 44100;
+        error("zero sampling rate - set to 44100");
+    }
+    sigseq_init(x,0);
+	
+    return (x);
+}
+
+void sigseq_init(t_sigseq *x,short initialized)
+{
+    float beatdur;
+    int asamp, dsamp, ssamp, rsamp;
+    //  int i;
+    
+    if(!initialized){
+        x->sequence = (float *) t_getbytes(MAX_SEQ * sizeof(float));
+        x->trigger_vec = (float *) t_getbytes(MAX_VEC * sizeof(float));
+        x->seq_len = 3;
+        x->seq_ptr = 0;
+        x->bang_ptr = 0;
+        x->sequence[0] = 313;
+        x->sequence[1] = 511;
+        x->sequence[2] = 71;
+        x->method = internal_clock;
+        x->a = .005;
+        x->d = .01;
+        x->r = .2;
+        x->egain = .707;
+        x->do_envelope = 1;
+        x->bang_on = 0;
+        x->retro_state = 0;
+        x->rand_state = 0;
+        x->mute = 0;
+    }
+    
+    beatdur = (60. / x->tempo ) / (float) x->beat_subdiv;
+    x->tsamps = x->sr * beatdur;
+    x->counter = x->tsamps ;
+    x->last_val = 666.6661;
+    x->val = x->sequence[0];
+    asamp = x->sr * x->a;
+    dsamp = x->sr * x->d;
+    rsamp = x->sr * x->r;
+    ssamp = x->tsamps - (asamp+dsamp+rsamp);
+    if( ssamp < 0 ){
+        ssamp = 0;
+    }
+    x->ebreak1 = asamp;
+    x->ebreak2 = asamp+dsamp;
+    x->ebreak3 = asamp+dsamp+ssamp;
+    x->asamps = asamp;
+    x->dsamps = dsamp;
+    x->ssamps = ssamp;
+    x->rsamps = rsamp;
+}
+
+void sigseq_tick(t_sigseq *x)
+{
+    if(x->seq_ptr) //weird that we need this
+        x->seq_ptr = 0;
+    //  post("bang: val %f s0 %f pt %d",x->val,x->sequence[0],x->seq_ptr);
+    outlet_bang(x->mybang);
+}
+
+void sigseq_list (t_sigseq *x, t_symbol *msg, short argc, t_atom *argv)
+{
+    short i;
+    
+    if( argc < 1 ){
+        // post("null list ignored");
+        return;
+    }
+    x->seq_len = 0;
+    for( i = 0; i < argc; i++ ){
+        x->sequence[i] = atom_getfloatarg(i,argc,argv);
+        ++(x->seq_len);
+    }
+    x->seq_ptr = 0;
+    x->val = x->sequence[ 0 ];
+    x->counter = 0 ;
+    //  sigseq_tick(x);
+    return;
+}
+
+void sigseq_adsr (t_sigseq *x, t_symbol *msg, short argc, t_atom *argv)
+{
+    //  short i;
+    
+    if( argc != 4 ){
+        error("sigseq~: bad arguments for adsr");
+        return;
+    }
+    x->a = atom_getfloatarg(0,argc,argv) * .001;
+    x->d = atom_getfloatarg(1,argc,argv) * .001;
+    x->r = atom_getfloatarg(2,argc,argv) * .001;
+    x->egain = atom_getfloatarg(3,argc,argv);
+    
+    x->asamps = x->sr * x->a;
+    x->dsamps = x->sr * x->d;
+    x->rsamps = x->sr * x->r;
+    x->ssamps = x->tsamps - (x->asamps+x->dsamps+x->rsamps);
+    x->ebreak1 = x->asamps;
+    x->ebreak2 = x->asamps+x->dsamps;
+    x->ebreak3 = x->asamps+x->dsamps+x->ssamps;
+    if( x->ssamps < 0 ){
+        x->ssamps = 0;
+        // post("adsr: Warning: zero duration sustain");
+    }
+    //  	post("A %d D %d S %d R %d gain %f",x->asamps,x->dsamps,x->ssamps,x->rsamps,x->egain);
+    return;
+}
+t_int *sigseq_perform(t_int *w)
+{
+    
+    t_sigseq *x = (t_sigseq *) (w[1]);
+    //  t_float *in = (t_float *)(w[2]);
+    t_float *out = (t_float *)(w[3]);
+    t_float *adsr = (t_float *)(w[4]);
+    int n = (int) w[5];
+    /*********************************************/
+    float *sequence = x->sequence;
+    int seq_len = x->seq_len;
+    int seq_ptr = x->seq_ptr;
+    int tsamps = x->tsamps;
+    int counter = x->counter;
+    float val = x->val;
+    float last_val = x->last_val;
+    int ebreak1 = x->ebreak1;
+    int ebreak2 = x->ebreak2;
+    int ebreak3 = x->ebreak3;
+    float egain = x->egain;
+    float env_val;
+    float flat_gain = x->flat_gain;
+    int do_envelope = x->do_envelope;
+    int asamps = x->asamps;
+    int dsamps = x->dsamps;
+    //  int ssamps = x->ssamps;
+    int rsamps = x->rsamps;
+    int bang_on = x->bang_on;
+    short bang_ptr = x->bang_ptr;
+    short retro_state = x->retro_state;
+    short rand_state = x->rand_state;
+    float etmp;
+    //  short bang_me_now = 0 ;
+    float trand;
+    /*********************************************/
+    if(x->mute){
+        while (n--) {
+            *out++ = 0.0;
+        }
+        return (w+6);
+    } else {
+        
+        while(n--) {
+            if(counter >= tsamps){
+                counter = 0;
+                bang_ptr = (bang_ptr + 1) % seq_len ;
+                if (rand_state) {
+                    trand = (float) ( rand() % 32768 / 32768.0) * (float) seq_len;
+                    x->rval = trand ;
+                    seq_ptr = x->rval % seq_len;
+                    
+                }
+                else if (retro_state) {
+                    seq_ptr = (seq_ptr - 1) % seq_len ;
+                    if( seq_ptr < 0) {
+                        seq_ptr = seq_len - 1;
+                    }
+                    //
+                }
+                else {
+                    seq_ptr = (seq_ptr + 1) % seq_len ;
+                }
+                if ( seq_ptr >= seq_len || seq_ptr < 0) {
+                    seq_ptr = 1;
+                }
+                val = sequence[ seq_ptr ];
+                if( bang_ptr == 0 && bang_on) {
+                    clock_delay(x->m_clock,0);
+                }
+            }
+            *out++ = val;
+            if( do_envelope ) {
+                if( counter < ebreak1 ){
+                    env_val = (float) counter / (float) asamps;
+                } else if (counter < ebreak2) {
+                    etmp = (float) (counter - ebreak1) / (float) dsamps;
+                    env_val = (1.0 - etmp) + (egain * etmp);
+                } else if (counter < ebreak3) {
+                    env_val = egain;
+                } else {
+                    env_val = ((float)(tsamps-counter)/(float)rsamps) * egain ;
+                }
+                *adsr++ = env_val;
+            } else {
+                *adsr++ = flat_gain;
+            }
+            counter++;
+        }
+        if( last_val != val) {
+            last_val = val;
+        }
+        
+        x->seq_ptr = seq_ptr;
+        x->bang_ptr = bang_ptr;
+        x->counter = counter;
+        x->val = val;
+        x->last_val = last_val;
+        
+    }
+    return (w+6);
+}
+
+
+t_int *sigseq_perform_clickin(t_int *w)
+{
+    
+    t_sigseq *x = (t_sigseq *) (w[1]);
+    t_float *trigger = (t_float *)(w[2]);
+    t_float *out = (t_float *)(w[3]);
+    t_float *adsr = (t_float *)(w[4]);
+    int n = (int) w[5];
+    /*********************************************/
+    float *sequence = x->sequence;
+    int seq_len = x->seq_len;
+    int seq_ptr = x->seq_ptr;
+    int tsamps = x->tsamps;
+    int counter = x->counter;
+    //  float val = x->val;
+    float last_val = x->last_val;
+    int ebreak1 = x->ebreak1;
+    int ebreak2 = x->ebreak2;
+    int ebreak3 = x->ebreak3;
+    float egain = x->egain;
+    float env_val;
+    float flat_gain = x->flat_gain;
+    int do_envelope = x->do_envelope;
+    int asamps = x->asamps;
+    int dsamps = x->dsamps;
+    //  int ssamps = x->ssamps;
+    int rsamps = x->rsamps;
+    int bang_on = x->bang_on;
+    short bang_ptr = x->bang_ptr;
+    short retro_state = x->retro_state;
+    short rand_state = x->rand_state;
+    float *trigger_vec = x->trigger_vec;
+    float etmp;
+    //  short bang_me_now = 0 ;
+    float trand;
+    int i;
+    /*********************************************/
+    if(x->mute){
+        while (n--) {
+            *out++ = 0.0;
+        }
+        return (w+6);
+    }
+ 	
+    for(i = 0; i < n; i++){
+        trigger_vec[i] = trigger[i];
+    }
+    for(i = 0; i < n; i++) {
+        if(trigger_vec[i]){
+            counter = 0;
+            //     bang_ptr = (bang_ptr + 1) % seq_len ;
+            
+            if (rand_state) {
+                trand = (float) ( rand() % 32768 / 32768.0) * (float) seq_len;
+                x->rval = trand ;
+                x->seq_ptr = x->rval % seq_len;	
+                
+            }
+            else if (retro_state) {
+                x->seq_ptr = (seq_ptr - 1) % seq_len ;
+                if( x->seq_ptr < 0) {
+                    x->seq_ptr = seq_len - 1;
+                }
+            } 
+            else {
+                x->seq_ptr = (x->seq_ptr + 1) % seq_len ;
+            }
+            if ( x->seq_ptr >= seq_len || x->seq_ptr < 0) {
+                x->seq_ptr = 1;
+            }
+            x->val = sequence[x->seq_ptr];			
+            if(x->seq_ptr == 0 && bang_on) {
+                clock_delay(x->m_clock,0);
+            }
+        }
+        out[i] = x->val;
+        if( do_envelope ) {
+            if( counter < ebreak1 ){
+                env_val = (float) counter / (float) asamps;
+            } else if (counter < ebreak2) {
+                etmp = (float) (counter - ebreak1) / (float) dsamps;
+                env_val = (1.0 - etmp) + (egain * etmp);
+            } else if (counter < ebreak3) {
+                env_val = egain;
+            } else if(counter < tsamps) {
+                env_val = ((float)(tsamps-counter)/(float)rsamps) * egain ;
+            } else {
+                env_val = 0;
+            }
+            adsr[i] = env_val;
+        } else {
+            adsr[i] = flat_gain;
+        }
+        counter++;
+    }
+    if( last_val != x->val) {
+        last_val = x->val;		
+    }
+    
+    x->bang_ptr = bang_ptr;
+    x->counter = counter;
+    
+    x->last_val = last_val;
+	
+    return (w+6);
+}		
+
+void sigseq_free(t_sigseq *x)
+{
+    
+    t_freebytes(x->sequence, MAX_SEQ * sizeof(float));
+    t_freebytes(x->trigger_vec, MAX_VEC * sizeof(float));
+}
+
+void sigseq_dsp(t_sigseq *x, t_signal **sp)
+{
+    if(!sp[0]->s_sr)
+        return;
+    if(x->sr != sp[0]->s_sr){
+        x->sr = sp[0]->s_sr;
+        sigseq_init(x,1);
+    }
+    if(x->method == EXTERNAL_CLOCK){
+        dsp_add(sigseq_perform_clickin, 5, x, 
+                sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
+    } else {
+        dsp_add(sigseq_perform, 5, x, 
+                sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
+    }
+}
+
diff --git a/externals/lyonpotpourri/smap-help.pd b/externals/lyonpotpourri/smap-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..37a53b9e2f6c78e44da1b03677df7fe4a645739b
--- /dev/null
+++ b/externals/lyonpotpourri/smap-help.pd
@@ -0,0 +1,9 @@
+#N canvas 246 169 450 300 10;
+#X obj 141 163 smap 0 4;
+#X obj 144 113 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 141 195 5 0 0 0 - - -;
+#X text 49 56 remap a 0-127 MIDI input range to the output range specified
+in the arguments;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
diff --git a/externals/lyonpotpourri/smap.pd b/externals/lyonpotpourri/smap.pd
new file mode 100755
index 0000000000000000000000000000000000000000..de9549d85d75a3e6dd1ed390fa0000f703877c49
--- /dev/null
+++ b/externals/lyonpotpourri/smap.pd
@@ -0,0 +1,28 @@
+#N canvas 0 22 458 308 10;
+#X obj 88 84 inlet;
+#X obj 88 110 / 127;
+#X obj 265 144 - 0;
+#X obj 283 38 t b b;
+#X floatatom 128 161 5 0 0 0 - - -;
+#X obj 88 181 *;
+#X obj 88 210 +;
+#X floatatom 135 192 5 0 0 0 - - -;
+#X obj 88 237 outlet;
+#X obj 283 17 loadbang;
+#X floatatom 205 125 5 0 0 0 - - -;
+#X obj 227 66 float \$2;
+#X obj 304 67 float \$1;
+#X connect 0 0 1 0;
+#X connect 1 0 5 0;
+#X connect 2 0 4 0;
+#X connect 3 0 11 0;
+#X connect 3 1 12 0;
+#X connect 4 0 5 1;
+#X connect 5 0 6 0;
+#X connect 6 0 8 0;
+#X connect 7 0 6 1;
+#X connect 9 0 3 0;
+#X connect 10 0 2 0;
+#X connect 11 0 10 0;
+#X connect 12 0 2 1;
+#X connect 12 0 7 0;
diff --git a/externals/lyonpotpourri/splitbank~-help.pd b/externals/lyonpotpourri/splitbank~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..58f5bd1407748749e997031c44c388ad51038c10
--- /dev/null
+++ b/externals/lyonpotpourri/splitbank~-help.pd
@@ -0,0 +1,355 @@
+#N canvas 551 163 627 595 10;
+#X obj 36 501 shoehorn~ 8 2, f 32;
+#N canvas 371 171 799 432 splitter 0;
+#X obj 533 297 block~ 128 1;
+#X obj 103 237 outlet~;
+#X obj 151 236 outlet~;
+#X obj 203 243 outlet~;
+#X obj 251 242 outlet~;
+#X obj 325 241 outlet~;
+#X obj 373 240 outlet~;
+#X obj 425 247 outlet~;
+#X obj 133 70 inlet~;
+#X obj 54 234 outlet~;
+#X obj 270 86 unpack f f f f f f f f;
+#X msg 271 53 1 1 1 1 1 1 1 1;
+#X obj 625 244 outlet;
+#X obj 271 18 loadbang;
+#X obj 598 94 inlet;
+#X obj 133 172 splitbank~ 8, f 78;
+#X obj 537 253 outlet~;
+#X obj 453 85 inlet;
+#X obj 15 71 r splitbank-msg;
+#X obj 495 92 inlet;
+#X obj 547 92 inlet;
+#X text 51 269 FFT size is (signal-vector-size * overlap-factor). The
+overlap factor is specified internally \, and defaults to 8.0. Overlap-add
+and windowing is performed internally \, so the block~ overlap factor
+must be 1.0. The vector size of 128 used here produces an FFT size
+of 1024 by default., f 41;
+#X connect 8 0 15 0;
+#X connect 10 0 15 1;
+#X connect 10 1 15 2;
+#X connect 10 2 15 3;
+#X connect 10 3 15 4;
+#X connect 10 4 15 5;
+#X connect 10 5 15 6;
+#X connect 10 6 15 7;
+#X connect 10 7 15 8;
+#X connect 11 0 10 0;
+#X connect 13 0 11 0;
+#X connect 14 0 15 12;
+#X connect 15 0 9 0;
+#X connect 15 1 1 0;
+#X connect 15 2 2 0;
+#X connect 15 3 3 0;
+#X connect 15 4 4 0;
+#X connect 15 5 5 0;
+#X connect 15 6 6 0;
+#X connect 15 7 7 0;
+#X connect 15 8 16 0;
+#X connect 15 9 12 0;
+#X connect 17 0 15 9;
+#X connect 18 0 15 0;
+#X connect 19 0 15 10;
+#X connect 20 0 15 11;
+#X restore 36 363 pd splitter;
+#X obj 36 549 dac~;
+#X obj 365 465 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X msg 365 523 \; pd dsp \$1;
+#X obj 399 288 hsl 128 15 0 1 0 0 empty empty manual_override -2 -8
+0 10 -262144 -1 -1 0 1;
+#X floatatom 252 538 5 0 0 0 sync_signal - -, f 5;
+#X obj 272 169 hsl 128 15 0 0.01 0 0 empty empty synthesis_threshold
+-2 -8 0 10 -262144 -1 -1 0 1;
+#N canvas 184 87 542 546 soundsource 0;
+#X obj 66 406 outlet~;
+#X obj 62 350 *~ 0.1;
+#X obj 42 198 -~ 0.5;
+#X obj 46 144 phasor~ 440;
+#X floatatom 109 63 5 0 0 0 - - -, f 5;
+#X obj 147 146 phasor~ 440;
+#X obj 150 191 -~ 0.5;
+#X obj 133 96 *~ 1.5;
+#X msg 416 179 100;
+#X obj 416 157 loadbang;
+#X obj 268 26 inlet;
+#X obj 342 300 s splitbank-freq;
+#X obj 138 316 hsl 128 15 0 0.4 0 0 empty empty gain -2 -8 0 10 -262144
+-1 -1 4700 1;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 3 0;
+#X connect 4 0 7 0;
+#X connect 5 0 6 0;
+#X connect 6 0 1 0;
+#X connect 7 0 5 0;
+#X connect 8 0 11 0;
+#X connect 9 0 8 0;
+#X connect 10 0 4 0;
+#X connect 12 0 1 1;
+#X restore 36 231 pd soundsource;
+#X floatatom 36 206 5 0 0 2 frequency splitbank-freq -, f 5;
+#X obj 318 210 hsl 128 15 0 1 0 0 empty empty table_offset -2 -8 0
+10 -262144 -1 -1 0 1;
+#X obj 352 250 hsl 128 15 0 1 0 0 empty empty bin_offset -2 -8 0 10
+-262144 -1 -1 0 1;
+#N canvas 617 105 817 690 state 0;
+#X obj 49 66 inlet;
+#X msg 49 93 set \$1 \$2 \$3 \$4 \$5 \$6 \$7 \$8 \$9 \$10 \$11 \$12
+\$13 \$14 \$15 \$16 \$17 \$18 \$19 \$20 \$21 \$22 \$23 \$24 \$25 \$26
+\$27 \$28 \$29 \$30 \$31 \$32 \$33 \$34 \$35 \$36 \$37 \$38 \$39 \$40
+\$41 \$42 \$43 \$44 \$45 \$46 \$47 \$48 \$49 \$50 \$51 \$52 \$53 \$54
+\$55 \$56 \$57 \$58 \$59 \$60 \$61 \$62 \$63 \$64 \$65 \$66 \$67 \$68
+\$69 \$70 \$71 \$72 \$73 \$74 \$75 \$76 \$77 \$78 \$79 \$80 \$81 \$82
+\$83 \$84 \$85 \$86 \$87 \$88 \$89 \$90 \$91 \$92 \$93 \$94 \$95 \$96
+\$97 \$98 \$99 \$100 \$101 \$102 \$103 \$104 \$105 \$106 \$107 \$108
+\$109 \$110 \$111 \$112 \$113 \$114 \$115 \$116 \$117 \$118 \$119 \$120
+\$121 \$122 \$123 \$124 \$125 \$126 \$127 \$128 \$129 \$130 \$131 \$132
+\$133 \$134 \$135 \$136 \$137 \$138 \$139 \$140 \$141 \$142 \$143 \$144
+\$145 \$146 \$147 \$148 \$149 \$150 \$151 \$152 \$153 \$154 \$155 \$156
+\$157 \$158 \$159 \$160 \$161 \$162 \$163 \$164 \$165 \$166 \$167 \$168
+\$169 \$170 \$171 \$172 \$173 \$174 \$175 \$176 \$177 \$178 \$179 \$180
+\$181 \$182 \$183 \$184 \$185 \$186 \$187 \$188 \$189 \$190 \$191 \$192
+\$193 \$194 \$195 \$196 \$197 \$198 \$199 \$200 \$201 \$202 \$203 \$204
+\$205 \$206 \$207 \$208 \$209 \$210 \$211 \$212 \$213 \$214 \$215 \$216
+\$217 \$218 \$219 \$220 \$221 \$222 \$223 \$224 \$225 \$226 \$227 \$228
+\$229 \$230 \$231 \$232 \$233 \$234 \$235 \$236 \$237 \$238 \$239 \$240
+\$241 \$242 \$243 \$244 \$245 \$246 \$247 \$248 \$249 \$250 \$251 \$252
+\$253 \$254 \$255 \$256 \$257 \$258 \$259 \$260 \$261 \$262 \$263 \$264
+\$265 \$266 \$267 \$268 \$269 \$270 \$271 \$272 \$273 \$274 \$275 \$276
+\$277 \$278 \$279 \$280 \$281 \$282 \$283 \$284 \$285 \$286 \$287 \$288
+\$289 \$290 \$291 \$292 \$293 \$294 \$295 \$296 \$297 \$298 \$299 \$300
+\$301 \$302 \$303 \$304 \$305 \$306 \$307 \$308 \$309 \$310 \$311 \$312
+\$313 \$314 \$315 \$316 \$317 \$318 \$319 \$320 \$321 \$322 \$323 \$324
+\$325 \$326 \$327 \$328 \$329 \$330 \$331 \$332 \$333 \$334 \$335 \$336
+\$337 \$338 \$339 \$340 \$341 \$342 \$343 \$344 \$345 \$346 \$347 \$348
+\$349 \$350 \$351 \$352 \$353 \$354 \$355 \$356 \$357 \$358 \$359 \$360
+\$361 \$362 \$363 \$364 \$365 \$366 \$367 \$368 \$369 \$370 \$371 \$372
+\$373 \$374 \$375 \$376 \$377 \$378 \$379 \$380 \$381 \$382 \$383 \$384
+\$385 \$386 \$387 \$388 \$389 \$390 \$391 \$392 \$393 \$394 \$395 \$396
+\$397 \$398 \$399 \$400 \$401 \$402 \$403 \$404 \$405 \$406 \$407 \$408
+\$409 \$410 \$411 \$412 \$413 \$414 \$415 \$416 \$417 \$418 \$419 \$420
+\$421 \$422 \$423 \$424 \$425 \$426 \$427 \$428 \$429 \$430 \$431 \$432
+\$433 \$434 \$435 \$436 \$437 \$438 \$439 \$440 \$441 \$442 \$443 \$444
+\$445 \$446 \$447 \$448 \$449 \$450 \$451 \$452 \$453 \$454 \$455 \$456
+\$457 \$458 \$459 \$460 \$461 \$462 \$463 \$464 \$465 \$466 \$467 \$468
+\$469 \$470 \$471 \$472 \$473 \$474 \$475 \$476 \$477 \$478 \$479 \$480
+\$481 \$482 \$483 \$484 \$485 \$486 \$487 \$488 \$489 \$490 \$491 \$492
+\$493 \$494 \$495 \$496 \$497 \$498 \$499 \$500 \$501 \$502 \$503 \$504
+\$505 \$506 \$507 \$508 \$509 \$510 \$511 \$512 512;
+#X msg 433 93 205 7 49 10 211 58 51 76 121 62 63 212 243 181 157 71
+165 233 140 16 82 20 74 152 238 218 230 214 204 50 26 117 242 179 215
+53 237 79 199 95 91 41 161 208 80 189 67 154 3 252 146 216 65 23 148
+192 200 223 248 36 134 5 106 119 124 130 145 227 133 13 45 235 59 128
+14 166 251 34 113 42 56 164 94 122 93 17 190 37 224 176 174 103 102
+175 84 159 196 101 9 253 184 98 132 4 221 229 66 245 115 191 141 114
+100 185 210 81 110 193 44 137 68 155 116 169 203 127 97 108 2 249 52
+125 167 254 178 39 158 240 247 29 195 234 46 123 202 32 61 239 194
+25 222 118 143 197 180 120 15 188 182 92 172 38 207 153 18 160 156
+31 96 27 30 72 220 236 70 40 231 75 241 11 54 69 250 47 206 33 19 198
+129 6 171 64 150 85 83 24 107 99 225 246 135 226 88 187 0 213 162 60
+147 77 255 131 111 168 244 139 21 105 1 112 22 43 177 35 228 173 138
+170 183 232 209 149 217 163 136 86 57 90 8 142 12 144 78 104 201 55
+48 89 109 87 28 186 219 151 73 126 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 512;
+#X text 434 69 current bin mapping;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X restore 279 470 pd state;
+#N canvas 0 22 695 522 sig2float 0;
+#X obj 200 68 inlet~;
+#X obj 343 201 outlet;
+#X obj 343 168 snapshot~;
+#X msg 343 106 1;
+#X obj 343 82 loadbang;
+#X obj 343 133 metro 50;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 3 0 5 0;
+#X connect 4 0 3 0;
+#X connect 5 0 2 0;
+#X restore 252 501 pd sig2float;
+#N canvas 53 282 535 369 interval-sets 0;
+#X msg -79 52 1 1 1 1 1 1 1 1;
+#X msg -66 76 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7;
+#X msg -56 103 1 1.01 1.02 1.03 1.04 1.05 1.06 1.07;
+#X obj -92 294 s splitbank-msg;
+#X msg -92 21 1 1.25 1.5 2 0.5 1 1.875 2.25;
+#X msg -41 132 1 1.059 1.122 1.189 1.259 1.334 1.414 1.498;
+#X msg -26 160 1 1.122 1.259 1.414 1.587 1.781 1.999 2.244;
+#X msg -12 195 1 1.189 1.414 1.681 1.999 2.378 2.828 3.363;
+#X msg 4 217 1 1.0009 1.002 1.003 1.004 1.005 1.006 1.007;
+#X text 13 250 list unpacks to frequency multipliers for each spectrum
+fragment;
+#X connect 0 0 3 0;
+#X connect 1 0 3 0;
+#X connect 2 0 3 0;
+#X connect 4 0 3 0;
+#X connect 5 0 3 0;
+#X connect 6 0 3 0;
+#X connect 7 0 3 0;
+#X connect 8 0 3 0;
+#X restore 404 69 pd interval-sets;
+#N canvas 111 193 455 381 frequency-synthesis-constraints 0;
+#X obj 14 214 s splitbank-msg;
+#X msg 67 86 maxfreq 600;
+#X msg 168 137 minfreq 200;
+#X msg 151 112 minfreq 0;
+#X msg 14 35 maxfreq 19000;
+#X msg 41 62 maxfreq 1500;
+#X msg 179 161 minfreq 900;
+#X text 9 252 The range of frequencies to be synthesized can be specfied
+by minimum and maximum. Actually produced frequencies will vary outside
+this range \, depending on the current interval set. Constraining frequency
+range reduces the CPU load. When the minimum frequency equals or exceeds
+the maximum \, no sound is produced.;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X restore 404 95 pd frequency-synthesis-constraints;
+#N canvas 367 60 618 567 basic-messages 0;
+#X msg -86 57 manual_override \$1;
+#X msg -1 306 scramble;
+#X msg -9 275 ramptime 5000;
+#X obj -104 418 s splitbank-msg;
+#X msg -49 175 powerfade \$1;
+#X obj -49 148 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X msg -28 239 mute \$1;
+#X obj -28 202 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X msg -102 -7 fftinfo;
+#X msg -114 -41 showstate;
+#X obj -86 26 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X text 62 307 set new random mapping;
+#X text 29 239 mute all sound and release CPU cycles;
+#X text 40 60 manually move between two settings when this toggle is
+on;
+#X text -44 -6 print FFT size and related information;
+#X text -47 -40 show the current bin mapping;
+#X text 83 268 set transition time (in milliseconds) to move from one
+mapping to the next;
+#X obj -19 34 s splitbank-man-override;
+#X text 144 362 change overlap factor (DACs must be restarted);
+#X msg 79 448 \; pd dsp \$1;
+#X obj 79 395 t b b;
+#X msg 114 418 1;
+#X msg 79 418 0;
+#X obj 123 394 delay 1;
+#X msg 78 361 overlap 4;
+#X text 41 172 select equal-power cross fade \, rather than linear
+(default);
+#X connect 0 0 3 0;
+#X connect 1 0 3 0;
+#X connect 2 0 3 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 0;
+#X connect 6 0 3 0;
+#X connect 7 0 6 0;
+#X connect 8 0 3 0;
+#X connect 9 0 3 0;
+#X connect 10 0 0 0;
+#X connect 10 0 17 0;
+#X connect 20 0 23 0;
+#X connect 20 1 22 0;
+#X connect 21 0 19 0;
+#X connect 22 0 19 0;
+#X connect 23 0 21 0;
+#X connect 24 0 3 0;
+#X connect 24 0 20 0;
+#X restore 403 43 pd basic-messages;
+#X text 26 39 splitbank~ splits an incoming sound into a number of
+sub-spectra \, each of which is independently tunable. Each sub-spectrum
+emerges from its own outlet \, from where it can be fully spatialized
+\, or collapsed to stereo as shown in this example. The internal design
+of the FFT processing requires that the object be deployed inside a
+block~ subpatcher \, in order to gain control over the FFT size.;
+#X text 121 363 <- main DSP block~ subpatch;
+#N canvas 131 124 508 327 timing 0;
+#N canvas 95 351 507 328 steadyclock 0;
+#X obj 83 25 inlet;
+#X obj 133 86 t 1 f f;
+#X msg 206 148 ramptime \$1;
+#X obj 217 287 s splitbank-msg;
+#X obj 133 197 metro 1000;
+#X msg 133 242 scramble;
+#X obj 83 57 sel 0;
+#X msg 84 112 0;
+#X connect 0 0 6 0;
+#X connect 1 0 4 0;
+#X connect 1 1 4 1;
+#X connect 1 2 2 0;
+#X connect 2 0 3 0;
+#X connect 4 0 5 0;
+#X connect 5 0 3 0;
+#X connect 6 0 7 0;
+#X connect 6 1 1 0;
+#X connect 7 0 4 0;
+#X restore 26 292 pd steadyclock;
+#X msg 73 87 7000;
+#X msg 190 231 0;
+#X msg 97 120 2000;
+#X msg 167 176 100;
+#X text 217 233 turn off clock;
+#X msg 26 53 20000;
+#X text 115 30 Set transition time in milliseconds. this smooth crossfade
+does not operate when manual override is selected;
+#X msg 123 151 500;
+#X obj 231 106 r splitbank-man-override;
+#X obj 231 139 sel 0 1;
+#X msg 358 249 5000;
+#X obj 358 175 r splitbank-startbang;
+#X obj 358 214 delay 50;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 6 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 10 0;
+#X connect 10 0 1 0;
+#X connect 10 1 2 0;
+#X connect 11 0 0 0;
+#X connect 12 0 13 0;
+#X connect 13 0 11 0;
+#X restore 405 123 pd timing;
+#X obj 26 4 cnv 15 155 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X obj 436 508 sel 1;
+#X obj 436 533 s splitbank-startbang;
+#X connect 0 0 2 0;
+#X connect 0 1 2 1;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 1 2 0 2;
+#X connect 1 3 0 3;
+#X connect 1 4 0 4;
+#X connect 1 5 0 5;
+#X connect 1 6 0 6;
+#X connect 1 7 0 7;
+#X connect 1 8 13 0;
+#X connect 1 9 12 0;
+#X connect 3 0 4 0;
+#X connect 3 0 21 0;
+#X connect 5 0 1 4;
+#X connect 7 0 1 1;
+#X connect 8 0 1 0;
+#X connect 9 0 8 0;
+#X connect 10 0 1 2;
+#X connect 11 0 1 3;
+#X connect 13 0 6 0;
+#X connect 21 0 22 0;
diff --git a/externals/lyonpotpourri/splitbank~.c b/externals/lyonpotpourri/splitbank~.c
new file mode 100755
index 0000000000000000000000000000000000000000..948cd4aa749e1118d247e6ff4b8fc3e85a4bc342
--- /dev/null
+++ b/externals/lyonpotpourri/splitbank~.c
@@ -0,0 +1 @@
+#include "MSPd.h"
#define OSCBANK_TABLE_LENGTH (8192)
#define OSCBANK_DEFAULT_TOPFREQ (15000.0)

#define MAXSTORE (128)

#define OBJECT_NAME "splitbank~"

static t_class *splitbank_class;

typedef struct
{
    int R;
    int	N;
    int	N2;
    int	Nw;
    int	Nw2;
    int	vector_size;
    int	i;
    int	in_count;
    float *Wanal;
    float *Wsyn;
    float *input_buffer;
    float *Hwin;
    float *complex_spectrum;
    float *interleaved_spectrum;
    float *output_buffer;
    // for convert
    float *c_lastphase_in;
    float *c_lastphase_out;
    float c_fundamental;
    float c_factor_in;
    float c_factor_out;
    float P;
    int table_length;
    float table_si;
    int first;
    float i_vector_size;
    float *lastamp;
    float *lastfreq;
    float *index;
    float *table;
    float pitch_increment;
    
    int lo_bin;
    int hi_bin;
    float synthesis_threshold;
    
    int overlap;
    int winfac;
    float user_lofreq;
    float user_hifreq;
    float curfreq;
    // faster FFT
    float mult;
    float *trigland;
    int *bitshuffle;
    
} t_oscbank;

typedef struct _splitbank
{
    t_object x_obj;
    t_float x_f;
    t_oscbank **obanks;
    int N;
    int N2;
    int R;
    int overlap;
    void *list_outlet;
    t_atom *list_data;
    int *bin_tmp;
    int ramp_frames;
    int frames_left;
    float frame_duration;
    int vector_size;
    int table_offset;
    int bin_offset;
    float *last_mag;
    float *current_mag;
    int *last_binsplit;
    int *current_binsplit;
    int **stored_binsplits;
    short *stored_slots;
    float *in_amps;
    short new_distribution;
    short interpolation_completed;
//    short bypass;
    short initialize;
    short manual_override;
    float manual_control_value;
    short mute;
    short powerfade;
    int channel_count;
    long countdown_samps; // samps for a given fadetime
    long counter;
    int hopsamps;
    t_float **ins; // input signal vectors
    t_float **outs; // output signal vectors
} t_splitbank;

void *splitbank_new(t_symbol *s, int argc, t_atom *argv);
t_int *splitbank_perform( t_int *w );
void splitbank_dsp(t_splitbank *x, t_signal **sp);
void splitbank_showstate( t_splitbank *x );
void splitbank_manual_override( t_splitbank *x, t_floatarg toggle );
void splitbank_setstate( t_splitbank *x, t_symbol *msg, short argc, t_atom *argv);
void splitbank_ramptime( t_splitbank *x, t_symbol *msg, short argc, t_atom *argv);
int rand_index( int max);
void splitbank_scramble (t_splitbank *x);
void splitbank_store( t_splitbank *x, t_floatarg location );
void splitbank_recall( t_splitbank *x, t_floatarg location );
void splitbank_powerfade( t_splitbank *x, t_floatarg toggle );
void splitbank_maxfreq( t_splitbank *x, t_floatarg freq );
void splitbank_minfreq( t_splitbank *x, t_floatarg freq );
void splitbank_mute( t_splitbank *x, t_floatarg toggle );
void splitbank_fftinfo( t_splitbank *x);
void splitbank_free( t_splitbank *x );
void splitbank_overlap( t_splitbank *x, t_floatarg ofac );
void splitbank_spliti( t_splitbank *x,  float *dest_mag, int start, int end, float oldfrac);
void splitbank_split(t_splitbank *x, int *binsplit, float *dest_mag, int start, int end );
int splitbank_closestPowerOfTwo(int p);
void fftease_obank_analyze( t_oscbank *x ) ;
void fftease_obank_initialize ( t_oscbank *x, float lo_freq, float hi_freq, int overlap,
                               int R, int vector_size, int N);
void fftease_obank_transpose( t_oscbank *x );
void fftease_obank_synthesize( t_oscbank *x );
void fftease_obank_destroy( t_oscbank *x );
void fftease_shiftin( t_oscbank *x, float *input );
void fftease_shiftout( t_oscbank *x, float *output );
void fftease_obank_topfreq( t_oscbank *x, float topfreq );
void fftease_obank_bottomfreq( t_oscbank *x, float bottomfreq );

void rfft( float *x, int N, int forward );
void cfft( float *x, int NC, int forward );
void bitreverse( float *x, int N );
void fold( float *I, float *W, int Nw, float *O, int N, int n );
void init_rdft(int n, int *ip, float *w);
void rdft(int n, int isgn, float *a, int *ip, float *w);
void bitrv2(int n, int *ip, float *a);
void cftsub(int n, float *a, float *w);
void rftsub(int n, float *a, int nc, float *c);
void makewt(int nw, int *ip, float *w);
void makect(int nc, int *ip, float *c);
void makewindows( float *H, float *A, float *S, int Nw, int N, int I );
void makehamming( float *H, float *A, float *S, int Nw, int N, int I,int odd );
void makehanning( float *H, float *A, float *S, int Nw, int N, int I,int odd );
void convert(float *S, float *C, int N2, float *lastphase, float fundamental, float factor );
//////////
void splitbank_tilde_setup(void){

    splitbank_class = class_new(gensym("splitbank~"), (t_newmethod)splitbank_new,
                                (t_method)splitbank_free, sizeof(t_splitbank),0,A_GIMME,0);
	CLASS_MAINSIGNALIN(splitbank_class, t_splitbank, x_f);
    class_addmethod(splitbank_class, (t_method)splitbank_dsp, gensym("dsp"),0);
    class_addmethod(splitbank_class, (t_method)splitbank_showstate, gensym("showstate"),0);
    class_addmethod(splitbank_class, (t_method)splitbank_manual_override, gensym("manual_override"),A_FLOAT,0);
    class_addmethod(splitbank_class, (t_method)splitbank_store, gensym("store"),A_FLOAT,0);
    class_addmethod(splitbank_class, (t_method)splitbank_mute, gensym("mute"),A_FLOAT,0);
    class_addmethod(splitbank_class, (t_method)splitbank_recall, gensym("recall"),A_FLOAT,0);
    class_addmethod(splitbank_class, (t_method)splitbank_setstate, gensym("setstate"),A_GIMME,0);
    class_addmethod(splitbank_class, (t_method)splitbank_ramptime, gensym("ramptime"),A_GIMME,0);
    class_addmethod(splitbank_class, (t_method)splitbank_powerfade, gensym("powerfade"),A_FLOAT,0);
    class_addmethod(splitbank_class, (t_method)splitbank_maxfreq, gensym("maxfreq"),A_FLOAT,0);
    class_addmethod(splitbank_class, (t_method)splitbank_minfreq, gensym("minfreq"),A_FLOAT,0);
    class_addmethod(splitbank_class, (t_method)splitbank_overlap, gensym("overlap"),A_FLOAT,0);
    class_addmethod(splitbank_class, (t_method)splitbank_scramble, gensym("scramble"),0);
    class_addmethod(splitbank_class, (t_method)splitbank_fftinfo, gensym("fftinfo"),0);
    
    potpourri_announce(OBJECT_NAME);
}

void splitbank_overlap( t_splitbank *x, t_floatarg ofac )
{
    x->overlap = splitbank_closestPowerOfTwo( (int)ofac );
}

void splitbank_powerfade( t_splitbank *x, t_floatarg toggle )
{
    x->powerfade = (short)toggle;
}
void splitbank_mute( t_splitbank *x, t_floatarg toggle )
{
    x->mute = (short)toggle;
}
void splitbank_fftinfo( t_splitbank *x)
{
    post("FFT size: %d", x->N);
    post("Overlap Factor: %d", x->overlap);
    post("Hop size: %d", x->hopsamps);
}

void splitbank_manual_override( t_splitbank *x, t_floatarg toggle )
{
    x->manual_override = (short)toggle;
}

void splitbank_free( t_splitbank *x )
{
    int i;
    if(x->initialize == 0){
        free(x->list_data) ;
        free(x->current_binsplit);
        free(x->last_binsplit);
        free(x->current_mag);
        free(x->last_mag);
        free(x->bin_tmp);
        free(x->stored_slots);
        free(x->in_amps);
        for( i = 0; i < MAXSTORE; i++ ){
            free(x->stored_binsplits[i]);
        }
        free(x->stored_binsplits);
        for(i = 0; i < x->channel_count + 5; i++){
            free(x->ins[i]);
        }
        free(x->ins);
        free(x->outs);
        for(i = 0; i < x->channel_count; i++){
            fftease_obank_destroy(x->obanks[i]);
        }
        free(x->obanks);
    }
}

void splitbank_maxfreq( t_splitbank *x, t_floatarg freq )
{
    int i;
    for(i = 0; i < x->channel_count; i++){
        fftease_obank_topfreq( x->obanks[i], freq);
    }
}

void splitbank_minfreq( t_splitbank *x, t_floatarg freq )
{
    int i;
    for(i = 0; i < x->channel_count; i++){
        fftease_obank_bottomfreq( x->obanks[i], freq);
    }
}

void splitbank_store( t_splitbank *x, t_floatarg loc )
{
    int **stored_binsplits = x->stored_binsplits;
    int *current_binsplit = x->current_binsplit;
    short *stored_slots = x->stored_slots;
    int location = (int) loc;
    int i;
    
    if( location < 0 || location > MAXSTORE - 1 ){
        error("location must be between 0 and %d, but was %d", MAXSTORE, location);
        return;
    }
    for(i = 0; i < x->N2; i++ ){
        stored_binsplits[location][i] = current_binsplit[i];
    }
    stored_slots[location] = 1;
    
   // post("stored bin split at location %d", location);
}

void splitbank_recall( t_splitbank *x, t_floatarg loc )
{
    int **stored_binsplits = x->stored_binsplits;
    int *current_binsplit = x->current_binsplit;
    int *last_binsplit = x->last_binsplit;
    short *stored_slots = x->stored_slots;
    int i;
    int location = (int) loc;
    if( location < 0 || location > MAXSTORE - 1 ){
        error("location must be between 0 and %d, but was %d", MAXSTORE, location);
        return;
    }
    if( ! stored_slots[location] ){
        error("nothing stored at location %d", location);
        return;
    }
    
    for(i = 0; i < x->N2; i++ ){
        last_binsplit[i] = current_binsplit[i];
        current_binsplit[i] = stored_binsplits[location][i];
    }
    
    x->new_distribution = 1;
    x->interpolation_completed = 0;
    x->frames_left = x->ramp_frames;
    if(! x->ramp_frames) { // Ramp Off - Immediately set last to current
        for( i = 0; i < x->N2; i++ ){
            x->last_binsplit[ i ] = x->current_binsplit[ i ];
        }
    }
}

int splitbank_closestPowerOfTwo(int p){
    int base = 2;
    if(p > 2){
        while(base < p){
            base *= 2;
        }
    }
    return base;
}

void *splitbank_new(t_symbol *s, int argc, t_atom *argv)
{
    t_splitbank *x = (t_splitbank *)pd_new(splitbank_class);
    int i;

    
    x->channel_count = (int) atom_getfloatarg(0, argc, argv);
    x->channel_count = splitbank_closestPowerOfTwo( x->channel_count );
    // post("theoretic chan count: %d",x->channel_count );
    // x->channel_count = 8;
    srand( time( 0 ) );
    for(i = 0; i < x->channel_count + 4; i++){
        inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("signal"),gensym("signal"));
    }
    for(i = 0; i < x->channel_count + 1; i++){
        outlet_new(&x->x_obj, gensym("signal"));
    }
    
    x->ins = (t_float **) malloc(sizeof(t_float *) * (x->channel_count + 5));
    x->outs = (t_float **) malloc(sizeof(t_float *) * (x->channel_count + 1));
    for(i = 0; i < x->channel_count + 5; i++){
        x->ins[i] = (t_float *) malloc(8192 * sizeof(t_float));
    }
    x->list_outlet = (t_outlet *) outlet_new(&x->x_obj, gensym("list"));
 
    x->obanks = (t_oscbank **) malloc(x->channel_count * sizeof(t_oscbank *));
    for(i = 0; i < x->channel_count; i++){
        x->obanks[i] = (t_oscbank *) malloc(sizeof(t_oscbank));
    }
    
    x->mute = 0;
    x->table_offset = 0;
    x->bin_offset = 0;
    x->powerfade = 0;
    x->manual_override = 0;
    x->countdown_samps = 0;
    x->overlap = 8; // to generate FFT size
    x->initialize = 1;
    return x;
}
t_int *splitbank_perform(t_int *w)
{
	
    int i,j;
    float frac = 0.0;
    t_splitbank *x = (t_splitbank *) (w[1]);
    
    int channel_count = x->channel_count;
    float *input;
    float *synthesis_threshold;
    float *t_offset;
    float *b_offset;
    float *manual_control;
    float *sync = (t_float *)(w[(channel_count * 2) + 7]);
    int n = (int) w[(channel_count * 2) + 8];
    
    int N2 = x->N2;
    int N = x->N;
    int hopsamps = x->hopsamps;
//    int frames_left = x->frames_left;
//    int ramp_frames = x->ramp_frames;
    
    int *current_binsplit = x->current_binsplit;
    int *last_binsplit = x->last_binsplit;
    
    float *in_amps = x->in_amps;
    float manual_control_value = x->manual_control_value;
    
    long counter = x->counter;
    long countdown_samps = x->countdown_samps;
    
    t_oscbank **obanks = x->obanks;

    
    t_float **ins = x->ins;
    t_float *inlet;
    t_float *outlet;
    t_float **outs = x->outs; // assign from output vector pointers
    
    // mute branch: clear outlets and return
    
    if(x->mute){
        for(i = 0; i < (channel_count + 1); i++){
            outlet = (t_float *) w[i + (channel_count + 7)];
            for(j = 0; j < n; j++){
                outlet[j] = 0.0;
            }
        }
        return (w + ((channel_count * 2) + 9));
    }
    
    // Copy all inlets

    for(i = 0; i < channel_count + 5; i++){
        inlet = (t_float *) w[2 + i];
        for(j = 0; j < n; j++){
            ins[i][j] = inlet[j];
        }
    }
    // local assigments:
    
    input = ins[0];

    synthesis_threshold = ins[channel_count + 1];
    t_offset = ins[channel_count + 2];
    b_offset = ins[channel_count + 3];
    manual_control = ins[channel_count + 4];
    
    // assign outlet pointers
    
    for(i = 0; i < (channel_count + 1); i++){
        outs[i] = (t_float *) w[i + (channel_count + 7)]; // was 5
    }
    
    sync = outs[channel_count];
    
    for(i = 0; i < channel_count; i++){
        obanks[i]->pitch_increment = ins[i+1][0] * obanks[i]->table_si;
        obanks[i]->synthesis_threshold = synthesis_threshold[0];
    }

    
    x->table_offset = t_offset[0] * N2;
    x->bin_offset = b_offset[0] * N2;
    
    manual_control_value = manual_control[0];
    
    
    // ANALYSIS (only analyze to one oscbank
    
    fftease_shiftin( obanks[0], input );
    fftease_obank_analyze( obanks[0] );
    
    
    // copy input amplitudes from analyzed frame
    for( i = 0, j = 0; i < N; i += 2 , j++){
        in_amps[j] = obanks[0]->interleaved_spectrum[i];
    }
    
    // zero the amps next
    
    for(i = 0; i < channel_count; i++){
        for(j = 0; j < N; j += 2){
            obanks[i]->interleaved_spectrum[j] = 0.0;
        }
    }
    
    if( x->manual_override ){
        for(i = 0; i < channel_count; i++){
            splitbank_spliti( x, obanks[i]->interleaved_spectrum,
                             N2*i/channel_count, N2*(i+1)/channel_count, manual_control_value);
        }
        frac = manual_control_value;
    }
    else if( x->new_distribution ) {
        
        x->new_distribution = 0;

        for(i = 0; i < channel_count; i++){
            splitbank_split( x, last_binsplit, obanks[i]->interleaved_spectrum,
                            N2*i/channel_count, N2*(i+1)/channel_count);
        }
        frac = 0.0;
    }
    else if ( x->interpolation_completed ) {
        for(i = 0; i < channel_count; i++){
            splitbank_split( x, current_binsplit, obanks[i]->interleaved_spectrum,
                            N2*i/channel_count, N2*(i+1)/channel_count);
        }
        frac = 1.0;
    } else {
        frac = (float) counter / (float) countdown_samps;

        for(i = 0; i < channel_count; i++){
            splitbank_spliti( x, obanks[i]->interleaved_spectrum,
                             N2*i/channel_count, N2*(i+1)/channel_count, 1.0 - frac);
        }
        counter += hopsamps;
        if( counter >= countdown_samps )
        {
            counter = countdown_samps;
            x->interpolation_completed = 1;
        }
    }
    for( i = 0; i < n; i++ ){
        sync[i] = frac;
    }
    // copy frequency information to other banks

    for(i = 1; i < channel_count; i++){
        for( j = 1; j < N; j += 2){
            obanks[i]->interleaved_spectrum[j] = obanks[0]->interleaved_spectrum[j];
        }
    }
    
    // SYNTHESIS
    
    for(i = 0; i < channel_count; i++){
        fftease_obank_synthesize( obanks[i] );
        fftease_shiftout( obanks[i], outs[i] );
    }
    x->counter = counter;
    return (w + ((channel_count * 2) + 9));
}


void splitbank_scramble (t_splitbank *x)
{
    int i, j;
    int used;
    
    int max = x->N2;
    int bindex;
    
    int *current_binsplit = x->current_binsplit;
    int *last_binsplit = x->last_binsplit;
    int *bin_tmp = x->bin_tmp;
    
    x->new_distribution = 1;
    x->interpolation_completed = 0;
    
    //  post("scrambling");
    
    // Copy current mapping to last mapping (first time this will be all zeros)
    
    for( i = 0; i < x->N2; i++ ){
        last_binsplit[i] = current_binsplit[i];
    }
    
    
    for( i = 0; i < max; i++ ){
        bin_tmp[i] = i;
    }
    
    used = max;
    
    // This randomly distributes each bin number (to occur once each in a random location)
    
    for( i = 0; i < max; i++ ){
        bindex = rand_index( used );
        current_binsplit[i] = bin_tmp[bindex];
        for(j = bindex; j < used - 1; j++) {
            bin_tmp[j] = bin_tmp[j+1];
        }
        --used;
    }
    x->counter = 0;
    if(! x->countdown_samps ) { // Ramp Off - Immediately set last to current
        for( i = 0; i < x->N2; i++ ){
            last_binsplit[ i ] = current_binsplit[ i ];
        }
    }
}

int rand_index( int max) {
    int rand();
    return ( rand() % max );
}

void splitbank_setstate (t_splitbank *x, t_symbol *msg, short argc, t_atom *argv) {
    short i;
    
    if( argc != x->N2 ){
        error("list must be of length %d, but actually was %d", x->N2, argc);
        return;
    }
    for( i = 0; i < x->N2; i++ ){
        x->last_binsplit[ i ] = x->current_binsplit[ i ];
        x->current_binsplit[ i ] = 0;
    }
    for (i=0; i < argc; i++) {
        x->current_binsplit[i] = atom_getintarg(i, argc, argv );
		
    }
    x->frames_left = x->ramp_frames;
    if(! x->ramp_frames) { // Ramp Off - Immediately set last to current
        for( i = 0; i < x->N2; i++ ){
            x->last_binsplit[ i ] = x->current_binsplit[ i ];
        }
    }
    
    return;
}

void splitbank_ramptime (t_splitbank *x, t_symbol *msg, short argc, t_atom *argv) {
    float rampdur;
	rampdur = atom_getfloatarg(0,argc,argv) * 0.001;
 	x->countdown_samps = rampdur * x->R;
 	x->counter = 0;
    
//    return;
}

// REPORT CURRENT SHUFFLE STATUS
void splitbank_showstate (t_splitbank *x ) {
    
    t_atom *list_data = x->list_data;
    
    short i, count;
    
    count = 0;
    // post("showing %d data points", x->N2);
    
    for( i = 0; i < x->N2; i++ ) {
        SETFLOAT(list_data+count,x->current_binsplit[i]);
        ++count;
    }
    outlet_list(x->list_outlet,0L,x->N2,list_data);
    
    return;
}
/*
void splitbank_float(t_splitbank *x, t_float f) // Look at floats at inlets
{
	int inlet = ((t_pxobject*)x)->z_in;
	int N2 = x->obank1->N2;
	
	// inlet 0 is the first signal inlet
	
	if (inlet == 1)
	{
        x->obank1->pitch_increment = f * x->obank1->table_si;
	}
	else if (inlet == 2)
	{
        x->obank2->pitch_increment = f * x->obank2->table_si;
	}
	else if (inlet == 3)
	{
        x->obank3->pitch_increment = f * x->obank3->table_si;
	}
	else if (inlet == 4)
	{
        x->obank4->pitch_increment = f * x->obank4->table_si;
	}
	else if (inlet == 5)
	{
        x->obank5->pitch_increment = f * x->obank5->table_si;
	}
	else if (inlet == 6)
	{
        x->obank6->pitch_increment = f * x->obank6->table_si;
	}
	else if (inlet == 7)
	{
        x->obank7->pitch_increment = f * x->obank7->table_si;
	}
	else if (inlet == 8)
	{
        x->obank8->pitch_increment = f * x->obank8->table_si;
	}
	else if (inlet == 9)
	{
        x->obank1->synthesis_threshold = f;
        x->obank2->synthesis_threshold = f;
        x->obank3->synthesis_threshold = f;
        x->obank4->synthesis_threshold = f;
        x->obank5->synthesis_threshold = f;
        x->obank6->synthesis_threshold = f;
        x->obank7->synthesis_threshold = f;
        x->obank8->synthesis_threshold = f;
	}
	else if (inlet == 10)
	{
        x->table_offset = (int) (f * N2);
	}
	else if (inlet == 11)
	{
        x->bin_offset = (int) (f * N2);
	}
	else if (inlet == 12)
	{
        x->manual_control_value = f;
	}
}
*/
void splitbank_split(t_splitbank *x, int *binsplit, float *dest_mag, int start, int end )
{
    int i;
    int bindex;
    int n = x->N2;
    float *in_amps = x->in_amps;
    int table_offset = x->table_offset;
    int bin_offset = x->bin_offset;
    
    if( table_offset  < 0 )
        table_offset *= -1;
    if( bin_offset  < 0 )
        bin_offset *= -1;
    
    for( i = start; i < end; i++){
        bindex = binsplit[ (i + table_offset) % n ];
        bindex = ( bindex + bin_offset ) % n;
        dest_mag[ bindex * 2 ] = in_amps[ bindex ]; // putting amps into interleaved spectrum
    }
}


void splitbank_spliti( t_splitbank *x, float *dest_mag, int start, int end, float oldfrac)
{
    int i;
    int bindex;
    int *current_binsplit = x->current_binsplit;
    int *last_binsplit = x->last_binsplit;
    float *current_mag = x->current_mag;
    float *last_mag = x->last_mag;
    float *in_amps = x->in_amps;
    int bin_offset = x->bin_offset;
    int table_offset = x->table_offset;
    int n = x->N2;
    float newfrac;
    float phase;
    
    
    if( oldfrac < 0 )
        oldfrac = 0;
    if( oldfrac > 1.0 )
        oldfrac = 1.0;
 	
    if( x->powerfade ){
        phase = oldfrac * PIOVERTWO;
        oldfrac = sin( phase );
        newfrac = cos( phase );
    } else {
        newfrac = 1.0 - oldfrac;
    }
    
    if( table_offset  < 0 )
        table_offset *= -1;
    if( bin_offset  < 0 )
        bin_offset *= -1;
    
    for( i = 0; i < n; i++ ){
        last_mag[i] = current_mag[i] = 0.0;
    }
    
    for( i = start; i < end; i++ ){
        bindex = current_binsplit[ (i + table_offset) % n ];
        bindex = ( bindex + bin_offset ) % n;
        current_mag[ bindex ] = in_amps[ bindex ];
        
        bindex = last_binsplit[ (i + table_offset) % n ];
        bindex = ( bindex + bin_offset ) % n;
        last_mag[ bindex ] = in_amps[ bindex ];
    }
    for( i = 0; i < n; i++){
        if(! current_mag[i] && ! last_mag[i]){
            dest_mag[i * 2] = 0.0;
        }
        else if( current_mag[i] && last_mag[i]) {
            dest_mag[i * 2] = current_mag[i];
        } else if (  current_mag[i] && ! last_mag[i] ) {
            dest_mag[i * 2] = newfrac * current_mag[i];
        }
        else {
            dest_mag[i * 2] = oldfrac * last_mag[i];
        }
    }
}

void splitbank_dsp(t_splitbank *x, t_signal **sp)
{
    int i;
    int R;
    int lo_freq = 0;
    int hi_freq = 15000;
    int fftsize;
    int overlap = x->overlap;
    t_int **sigvec;
    int pointer_count;
    int channel_count = x->channel_count;
    int vector_size;
    t_oscbank **obanks = x->obanks;
    
    pointer_count = (channel_count * 2) + 8;
    sigvec = (t_int **) malloc(sizeof(t_int *) * pointer_count);
	for(i = 0; i < pointer_count; i++){
		sigvec[i] = (t_int *) calloc(sizeof(t_int),1);
	}
	sigvec[0] = (t_int *)x; // first pointer is to the object
	sigvec[pointer_count - 1] = (t_int *)sp[0]->s_n; // last pointer is to vector size (N)
	for(i = 1; i < pointer_count - 1; i++){ // now attach the inlet and all outlets
		sigvec[i] = (t_int *)sp[i-1]->s_vec;
	}
    
    x->vector_size = vector_size = sp[0]->s_n;
 
    fftsize = vector_size * overlap;
    
//    post("vector size %d, sys vector size: %d",vector_size, sys_getblksize() );
//    post("splitbank~: samples per vector: %d, sys blocksize %d, fftsize %d",
//         sp[0]->s_n, sys_getblksize(), fftsize);
    
    // generate FFT size from x->overlap * x->vector_size
    if( ! sp[0]->s_sr ){
        error("splitbank~: zero sample rate! Perhaps no audio driver is selected.");
        return;
    }
    if(x->initialize || x->R != sys_getsr() || x->vector_size != sp[0]->s_n || x->N != fftsize){
        if( (x->initialize || x->R != sys_getsr()) && (! x->countdown_samps) ){
            x->counter = 0;
            x->countdown_samps = 1.0 * x->R; // 1 second fade time by default
        }
        x->R = sys_getsr();
        R = (int) x->R;
        x->N = fftsize;
        x->N2 = fftsize / 2;
        x->list_data = malloc((x->N + 2) * sizeof(t_atom));
        x->last_binsplit = malloc(x->N2 * sizeof(int));
        x->current_binsplit = malloc(x->N2 * sizeof(int));
        x->bin_tmp = malloc(x->N2 * sizeof(int));
        x->last_mag = malloc(x->N2 * sizeof(float));
        x->current_mag = malloc(x->N2 * sizeof(float));
        x->stored_slots = malloc(x->N2 * sizeof(short));
        x->stored_binsplits = malloc(MAXSTORE * sizeof(int *));
        for( i = 0; i < MAXSTORE; i++ ){
            x->stored_binsplits[i] = malloc(x->N2 * sizeof(int));
        }
        splitbank_scramble( x );
        
        for( i = 0; i < x->N2; i++ ){
            x->last_binsplit[i] = x->current_binsplit[i];
        }
         for(i = 0; i < channel_count; i++){
            fftease_obank_initialize(obanks[i], lo_freq, hi_freq, overlap, R, vector_size,x->N);
        }
        
        x->in_amps = malloc((x->N +2) * sizeof(float));
        x->initialize = 0;
    }
    x->hopsamps = x->N / x->overlap;
    dsp_addv(splitbank_perform, pointer_count, (t_int *) sigvec);
    free(sigvec);
}

////////////////////////////////////////
/**************************************************/
void fftease_obank_destroy( t_oscbank *x )
{
    free(x->Wanal);
    free(x->Wsyn);
    free(x->Hwin);
    free(x->complex_spectrum);
    free(x->interleaved_spectrum);
    free(x->input_buffer);
    free(x->output_buffer);
    free(x->c_lastphase_in);
    free(x->lastamp);
    free(x->lastfreq);
    free(x->index);
    free(x->table);
    free(x->bitshuffle);
    free(x->trigland);
    free(x);
}
/**************************************************/
void fftease_obank_initialize ( t_oscbank *x, float lo_freq, float hi_freq, int overlap,
                               int R, int vector_size, int N)
{
    int i;

    x->overlap = overlap;
    
    //  x = t_getbytes( sizeof(t_oscbank) ); // CRASH!!
    
    x->R = R;
    x->vector_size = vector_size;
    x->N = N;
    x->Nw = x->N;
    x->N2 = (x->N)>>1;
    x->Nw2 = (x->Nw)>>1;
    x->in_count = -(x->Nw);
    x->table_length = OSCBANK_TABLE_LENGTH ;
    // x->topfreq = OSCBANK_DEFAULT_TOPFREQ ;
    
    x->user_lofreq = lo_freq;
    x->user_hifreq = hi_freq;
    
    x->synthesis_threshold = .000001;
    x->table_si = (float) x->table_length/ (float) x->R;
    x->Wanal = (float *) malloc( x->Nw * sizeof(float) );
    x->Wsyn = (float *) malloc( x->Nw * sizeof(float) );
    x->Hwin = (float *) malloc( x->Nw * sizeof(float) );
    x->complex_spectrum = (float *) malloc( x->N * sizeof(float) );
    x->interleaved_spectrum = (float *) malloc( (x->N + 2) * sizeof(float) );
    x->input_buffer = (float *) malloc( x->Nw * sizeof(float) );
    x->output_buffer = (float *) malloc( x->Nw * sizeof(float) );
    x->c_lastphase_in = (float *) malloc( (x->N2+1) * sizeof(float) );
    x->c_lastphase_out = (float *) malloc( (x->N2+1) * sizeof(float) );
    x->lastamp = (float *) malloc( (x->N+1) * sizeof(float) );
    x->lastfreq = (float *) malloc( (x->N+1) * sizeof(float) );
    x->index = (float *) malloc( (x->N+1) * sizeof(float) );
    x->table = (float *) malloc( x->table_length * sizeof(float) );
    x->bitshuffle = (int *) malloc( (x->N * 2) * sizeof( int ) );
    x->trigland = (float *) malloc( (x->N * 2) * sizeof( float ) );
    
    x->mult = 1. / (float) x->N;
    
    for( i = 0; i < x->N2 + 1; i++) {
        x->c_lastphase_in[i] = x->c_lastphase_out[i] = 0.0;
    }
    
    for( i = 0; i < x->N + 1; i++) {
        x->lastamp[i] = x->lastfreq[i] = x->index[i] = 0.0;
    }
    
    for( i = 0; i < x->Nw; i++ ){
        x->input_buffer[i] = x->output_buffer[i] = 0.0;
    }
    
    init_rdft( x->N, x->bitshuffle, x->trigland);
    makehanning( x->Hwin, x->Wanal, x->Wsyn, x->Nw, x->N, x->vector_size, 0);
    
    
    x->c_fundamental =  (float) x->R/(float)x->N ;
    x->c_factor_in =  (float) x->R/((float)x->vector_size * TWOPI);
    x->c_factor_out = 1.0 / x->c_factor_in;
    
    
    
    if( x->user_hifreq < x->c_fundamental ) {
        x->user_hifreq = OSCBANK_DEFAULT_TOPFREQ ;
    }
    
    x->hi_bin = 1;
    x->curfreq = 0;
    while( x->curfreq < x->user_hifreq ) {
        ++(x->hi_bin);
        x->curfreq += x->c_fundamental ;
    }
    
    x->lo_bin = 0;
    x->curfreq = 0;
    while( x->curfreq < x->user_lofreq ) {
        ++(x->lo_bin);
        x->curfreq += x->c_fundamental ;
    }
    
    if( x->hi_bin > x->N2)
        x->hi_bin = x->N2 ;
    
    for ( i = 0; i < x->table_length; i++ ) {
        x->table[i] = (float) x->N * cos(  (float)i * TWOPI / (float)x->table_length );
    }
    
    x->P = 1.0 ;
    x->i_vector_size = 1. / x->vector_size;
    x->pitch_increment = x->P * x->table_length/x->R;
    /*
     post("*** oscbank OO ***");
     post("initialized oscbank!");
     post("synthesizing %d bins", x->hi_bin - x->lo_bin);
     post("FFTsize %d, overlap %d", x->N, x->overlap);
     post("vector size %d, Nw %d", x->vector_size, x->Nw);
     post("*** initialization done! ***");
     */
}
/**************************************************/
void  fftease_obank_topfreq( t_oscbank *x, float topfreq )
{
    if( topfreq < x->c_fundamental ) {
        topfreq = OSCBANK_DEFAULT_TOPFREQ ;
    }
    
    x->hi_bin = 1;
    x->curfreq = 0;
    while( x->curfreq < topfreq ) {
        ++(x->hi_bin);
        x->curfreq += x->c_fundamental ;
    }
    if( x->hi_bin > x->N2)
        x->hi_bin = x->N2 ;
}
/**************************************************/
void  fftease_obank_bottomfreq( t_oscbank *x, float bottomfreq )
{
    
    
    x->lo_bin = 0;
    x->curfreq = 0;
    while( x->curfreq < bottomfreq ) {
        ++(x->lo_bin);
        x->curfreq += x->c_fundamental ;
    }
    
}
/**************************************************/
void  fftease_obank_analyze( t_oscbank *x )
{
    fold( x->input_buffer, x->Wanal, x->Nw, x->complex_spectrum, x->N, x->in_count );
    
    rdft( x->N, 1, x->complex_spectrum, x->bitshuffle, x->trigland );
    
    convert( x->complex_spectrum, x->interleaved_spectrum, x->N2, x->c_lastphase_in,
            x->c_fundamental, x->c_factor_in );
    
}
/**************************************************/
void fftease_shiftin( t_oscbank *x, float *input )
{
    int i;
    int vector_size = x->vector_size;
    int Nw = x->Nw;
    float *input_buffer = x->input_buffer;
    
    for ( i = 0 ; i < (Nw - vector_size) ; i++ ){
        input_buffer[i] = input_buffer[i + vector_size];
    }
    for ( i = (Nw - vector_size) ; i < Nw; i++ ) {
        input_buffer[i] = *input++;
    }
    
}
/**************************************************/
void fftease_shiftout( t_oscbank *x, float *output )
{
    int i;
    int vector_size = x->vector_size;
    int Nw = x->Nw;
    float *output_buffer = x->output_buffer;
    float mult = x->mult;
    
    for ( i = 0; i < vector_size; i++ ){
        *output++ = output_buffer[i] * mult;
    }
    for ( i = 0; i < Nw - vector_size; i++ ){
        output_buffer[i] = output_buffer[i + vector_size];
    }
    for ( i = Nw - vector_size; i < Nw; i++ ){
        output_buffer[i] = 0.;
    }
    
    x->in_count += vector_size;
}
/**************************************************/
void fftease_obank_synthesize( t_oscbank *x )
{
    int amp, chan, freq;
    float    a,ainc,f,finc,address;
    int n;
    
    float synthesis_threshold = x->synthesis_threshold;
    float *lastfreq = x->lastfreq;
    float *lastamp = x->lastamp;
    int table_length = x->table_length;
    float *output_buffer = x->output_buffer;
    int vector_size = x->vector_size;
    float i_vector_size = x->i_vector_size;
    int lo_bin = x->lo_bin;
    int hi_bin = x->hi_bin;
    float *interleaved_spectrum = x->interleaved_spectrum;
    float pitch_increment = x->pitch_increment;
    float *index = x->index;
    float *table = x->table;
    
    for ( chan = lo_bin; chan < hi_bin; chan++ ) {
        
        freq = ( amp = ( chan << 1 ) ) + 1;
        if ( interleaved_spectrum[amp] > synthesis_threshold ){
            interleaved_spectrum[freq] *= pitch_increment;
            finc = ( interleaved_spectrum[freq] - ( f = lastfreq[chan] ) ) * i_vector_size;
            ainc = ( interleaved_spectrum[amp] - ( a = lastamp[chan] ) ) * i_vector_size;
            address = index[chan];
            for ( n = 0; n < vector_size; n++ ) {
                output_buffer[n] += a*table[ (int) address ];
                
                address += f;
                while ( address >= table_length )
                    address -= table_length;
                while ( address < 0 )
                    address += table_length;
                a += ainc;
                f += finc;
            }
            lastfreq[chan] = interleaved_spectrum[freq];
            lastamp[chan] = interleaved_spectrum[amp];
            index[chan] = address;
        }
    }
}
////////////////////////
void init_rdft(int n, int *ip, float *w)
{
    
    int	nw,
	nc;
    
    void	makewt(int nw, int *ip, float *w);
    void	makect(int nc, int *ip, float *c);
    
    nw = n >> 2;
    makewt(nw, ip, w);
    
    nc = n >> 2;
    makect(nc, ip, w + nw);
    
    return;
}


void rdft(int n, int isgn, float *a, int *ip, float *w)
{
    
    int		j,
    nw,
    nc;
    
    float		xi;
    
    void		bitrv2(int n, int *ip, float *a),
    cftsub(int n, float *a, float *w),
    rftsub(int n, float *a, int nc, float *c);
    
    
    nw = ip[0];
    nc = ip[1];
    
    if (isgn < 0) {
        a[1] = 0.5 * (a[1] - a[0]);
        a[0] += a[1];
        
        for (j = 3; j <= n - 1; j += 2) {
            a[j] = -a[j];
        }
        
        if (n > 4) {
            rftsub(n, a, nc, w + nw);
            bitrv2(n, ip + 2, a);
        }
        
        cftsub(n, a, w);
        
        for (j = 1; j <= n - 1; j += 2) {
            a[j] = -a[j];
        }
    }
    
    else {
        
        if (n > 4) {
            bitrv2(n, ip + 2, a);
        }
        
        cftsub(n, a, w);
        
        if (n > 4) {
            rftsub(n, a, nc, w + nw);
        }
        
        xi = a[0] - a[1];
        a[0] += a[1];
        a[1] = xi;
    }
}


void bitrv2(int n, int *ip, float *a)
{
    int j, j1, k, k1, l, m, m2;
    float xr, xi;
    
    ip[0] = 0;
    l = n;
    m = 1;
    
    while ((m << 2) < l) {
        l >>= 1;
        for (j = 0; j <= m - 1; j++) {
            ip[m + j] = ip[j] + l;
        }
        m <<= 1;
    }
    
    if ((m << 2) > l) {
        
        for (k = 1; k <= m - 1; k++) {
            
            for (j = 0; j <= k - 1; j++) {
                j1 = (j << 1) + ip[k];
                k1 = (k << 1) + ip[j];
                xr = a[j1];
                xi = a[j1 + 1];
                a[j1] = a[k1];
                a[j1 + 1] = a[k1 + 1];
                a[k1] = xr;
                a[k1 + 1] = xi;
            }
        }
    }
    
    else {
        m2 = m << 1;
        
        for (k = 1; k <= m - 1; k++) {
            
            for (j = 0; j <= k - 1; j++) {
                j1 = (j << 1) + ip[k];
                k1 = (k << 1) + ip[j];
                xr = a[j1];
                xi = a[j1 + 1];
                a[j1] = a[k1];
                a[j1 + 1] = a[k1 + 1];
                a[k1] = xr;
                a[k1 + 1] = xi;
                j1 += m2;
                k1 += m2;
                xr = a[j1];
                xi = a[j1 + 1];
                a[j1] = a[k1];
                a[j1 + 1] = a[k1 + 1];
                a[k1] = xr;
                a[k1 + 1] = xi;
            }
        }
    }
}


void cftsub(int n, float *a, float *w)
{
    int j, j1, j2, j3, k, k1, ks, l, m;
    float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
    float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
    
    l = 2;
    
    while ((l << 1) < n) {
        m = l << 2;
        
        for (j = 0; j <= l - 2; j += 2) {
            j1 = j + l;
            j2 = j1 + l;
            j3 = j2 + l;
            x0r = a[j] + a[j1];
            x0i = a[j + 1] + a[j1 + 1];
            x1r = a[j] - a[j1];
            x1i = a[j + 1] - a[j1 + 1];
            x2r = a[j2] + a[j3];
            x2i = a[j2 + 1] + a[j3 + 1];
            x3r = a[j2] - a[j3];
            x3i = a[j2 + 1] - a[j3 + 1];
            a[j] = x0r + x2r;
            a[j + 1] = x0i + x2i;
            a[j2] = x0r - x2r;
            a[j2 + 1] = x0i - x2i;
            a[j1] = x1r - x3i;
            a[j1 + 1] = x1i + x3r;
            a[j3] = x1r + x3i;
            a[j3 + 1] = x1i - x3r;
        }
        
        if (m < n) {
            wk1r = w[2];
            
            for (j = m; j <= l + m - 2; j += 2) {
                j1 = j + l;
                j2 = j1 + l;
                j3 = j2 + l;
                x0r = a[j] + a[j1];
                x0i = a[j + 1] + a[j1 + 1];
                x1r = a[j] - a[j1];
                x1i = a[j + 1] - a[j1 + 1];
                x2r = a[j2] + a[j3];
                x2i = a[j2 + 1] + a[j3 + 1];
                x3r = a[j2] - a[j3];
                x3i = a[j2 + 1] - a[j3 + 1];
                a[j] = x0r + x2r;
                a[j + 1] = x0i + x2i;
                a[j2] = x2i - x0i;
                a[j2 + 1] = x0r - x2r;
                x0r = x1r - x3i;
                x0i = x1i + x3r;
                a[j1] = wk1r * (x0r - x0i);
                a[j1 + 1] = wk1r * (x0r + x0i);
                x0r = x3i + x1r;
                x0i = x3r - x1i;
                a[j3] = wk1r * (x0i - x0r);
                a[j3 + 1] = wk1r * (x0i + x0r);
            }
            
            k1 = 1;
            ks = -1;
            
            for (k = (m << 1); k <= n - m; k += m) {
                k1++;
                ks = -ks;
                wk1r = w[k1 << 1];
                wk1i = w[(k1 << 1) + 1];
                wk2r = ks * w[k1];
                wk2i = w[k1 + ks];
                wk3r = wk1r - 2 * wk2i * wk1i;
                wk3i = 2 * wk2i * wk1r - wk1i;
                
                for (j = k; j <= l + k - 2; j += 2) {
                    j1 = j + l;
                    j2 = j1 + l;
                    j3 = j2 + l;
                    x0r = a[j] + a[j1];
                    x0i = a[j + 1] + a[j1 + 1];
                    x1r = a[j] - a[j1];
                    x1i = a[j + 1] - a[j1 + 1];
                    x2r = a[j2] + a[j3];
                    x2i = a[j2 + 1] + a[j3 + 1];
                    x3r = a[j2] - a[j3];
                    x3i = a[j2 + 1] - a[j3 + 1];
                    a[j] = x0r + x2r;
                    a[j + 1] = x0i + x2i;
                    x0r -= x2r;
                    x0i -= x2i;
                    a[j2] = wk2r * x0r - wk2i * x0i;
                    a[j2 + 1] = wk2r * x0i + wk2i * x0r;
                    x0r = x1r - x3i;
                    x0i = x1i + x3r;
                    a[j1] = wk1r * x0r - wk1i * x0i;
                    a[j1 + 1] = wk1r * x0i + wk1i * x0r;
                    x0r = x1r + x3i;
                    x0i = x1i - x3r;
                    a[j3] = wk3r * x0r - wk3i * x0i;
                    a[j3 + 1] = wk3r * x0i + wk3i * x0r;
                }
            }
        }
        
        l = m;
    }
    
    if (l < n) {
        
        for (j = 0; j <= l - 2; j += 2) {
            j1 = j + l;
            x0r = a[j] - a[j1];
            x0i = a[j + 1] - a[j1 + 1];
            a[j] += a[j1];
            a[j + 1] += a[j1 + 1];
            a[j1] = x0r;
            a[j1 + 1] = x0i;
        }
    }
}


void rftsub(int n, float *a, int nc, float *c)
{
    int j, k, kk, ks;
    float wkr, wki, xr, xi, yr, yi;
    
    ks = (nc << 2) / n;
    kk = 0;
    
    for (k = (n >> 1) - 2; k >= 2; k -= 2) {
        j = n - k;
        kk += ks;
        wkr = 0.5 - c[kk];
        wki = c[nc - kk];
        xr = a[k] - a[j];
        xi = a[k + 1] + a[j + 1];
        yr = wkr * xr - wki * xi;
        yi = wkr * xi + wki * xr;
        a[k] -= yr;
        a[k + 1] -= yi;
        a[j] += yr;
        a[j + 1] -= yi;
    }
}


void makewt(int nw, int *ip, float *w)
{
    void bitrv2(int n, int *ip, float *a);
    int nwh, j;
    float delta, x, y;
    
    ip[0] = nw;
    ip[1] = 1;
    if (nw > 2) {
        nwh = nw >> 1;
        delta = atan(1.0) / nwh;
        w[0] = 1;
        w[1] = 0;
        w[nwh] = cos(delta * nwh);
        w[nwh + 1] = w[nwh];
        for (j = 2; j <= nwh - 2; j += 2) {
            x = cos(delta * j);
            y = sin(delta * j);
            w[j] = x;
            w[j + 1] = y;
            w[nw - j] = y;
            w[nw - j + 1] = x;
        }
        bitrv2(nw, ip + 2, w);
    }
}


void makect(int nc, int *ip, float *c)
{
    int nch, j;
    float delta;
    
    ip[1] = nc;
    if (nc > 1) {
        nch = nc >> 1;
        delta = atan(1.0) / nch;
        c[0] = 0.5;
        c[nch] = 0.5 * cos(delta * nch);
        for (j = 1; j <= nch - 1; j++) {
            c[j] = 0.5 * cos(delta * j);
            c[nc - j] = 0.5 * sin(delta * j);
        }
    }
}
void convert(float *S, float *C, int N2, float *lastphase, float fundamental, float factor )
{
    float 	phase,
    phasediff;
    int 		real,
    imag,
    amp,
    freq;
    float 	a,
    b;
    int 		i;
    
    /*  float myTWOPI, myPI; */
    /*  double sin(), cos(), atan(), hypot();*/
    
    /*  myTWOPI = 8.*atan(1.);
     myPI = 4.*atan(1.); */
    
    
    for ( i = 0; i <= N2; i++ ) {
        imag = freq = ( real = amp = i<<1 ) + 1;
        a = ( i == N2 ? S[1] : S[real] );
        b = ( i == 0 || i == N2 ? 0. : S[imag] );
        
        C[amp] = hypot( a, b );
        if ( C[amp] == 0. )
            phasediff = 0.;
        else {
            phasediff = ( phase = -atan2( b, a ) ) - lastphase[i];
            lastphase[i] = phase;
            
            while ( phasediff > PI )
                phasediff -= TWOPI;
            while ( phasediff < -PI )
                phasediff += TWOPI;
        }
        C[freq] = phasediff*factor + i*fundamental;
    }
}

\ No newline at end of file
diff --git a/externals/lyonpotpourri/splitspec~-help.pd b/externals/lyonpotpourri/splitspec~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..d20dec413c6a2fefa5c3e50b245577ed00fdc8b2
--- /dev/null
+++ b/externals/lyonpotpourri/splitspec~-help.pd
@@ -0,0 +1,396 @@
+#N canvas 323 22 903 531 10;
+#X obj 34 134 noise~;
+#N canvas 68 56 1321 800 splitspec-rfft 0;
+#X obj 33 76 inlet~;
+#X obj 34 461 outlet~;
+#X obj 33 108 windowvec~;
+#X obj 33 146 rfft~, f 6;
+#X obj 34 531 block~ 1024 8;
+#X obj 33 181 cartopol~;
+#X obj 34 335 poltocar~;
+#X obj 34 365 rifft~;
+#X obj 34 428 windowvec~;
+#X obj 34 395 *~ 0;
+#X obj 1107 163 *;
+#X msg 1059 85 1 1024 8;
+#X obj 1059 116 unpack f f f;
+#X obj 1059 195 /;
+#X floatatom 1059 227 12 0 0 0 - - -, f 12;
+#X text 962 228 rescale factor;
+#X obj 1059 54 loadbang;
+#X obj 1058 256 s \$0-rescale;
+#X obj 68 385 r \$0-rescale;
+#X obj 161 469 outlet~;
+#X obj 161 343 poltocar~;
+#X obj 161 373 rifft~;
+#X obj 161 436 windowvec~;
+#X obj 161 403 *~ 0;
+#X obj 195 393 r \$0-rescale;
+#X obj 280 469 outlet~;
+#X obj 280 343 poltocar~;
+#X obj 280 373 rifft~;
+#X obj 280 436 windowvec~;
+#X obj 280 403 *~ 0;
+#X obj 314 393 r \$0-rescale;
+#X obj 407 477 outlet~;
+#X obj 407 351 poltocar~;
+#X obj 407 381 rifft~;
+#X obj 407 444 windowvec~;
+#X obj 407 411 *~ 0;
+#X obj 441 401 r \$0-rescale;
+#X obj 537 479 outlet~;
+#X obj 537 353 poltocar~;
+#X obj 537 383 rifft~;
+#X obj 537 446 windowvec~;
+#X obj 537 413 *~ 0;
+#X obj 571 403 r \$0-rescale;
+#X obj 664 487 outlet~;
+#X obj 664 361 poltocar~;
+#X obj 664 391 rifft~;
+#X obj 664 454 windowvec~;
+#X obj 664 421 *~ 0;
+#X obj 698 411 r \$0-rescale;
+#X obj 783 487 outlet~;
+#X obj 783 361 poltocar~;
+#X obj 783 391 rifft~;
+#X obj 783 454 windowvec~;
+#X obj 783 421 *~ 0;
+#X obj 817 411 r \$0-rescale;
+#X obj 910 495 outlet~;
+#X obj 910 369 poltocar~;
+#X obj 910 399 rifft~;
+#X obj 910 462 windowvec~;
+#X obj 910 429 *~ 0;
+#X obj 944 419 r \$0-rescale;
+#X obj 198 73 inlet;
+#X obj 501 100 inlet;
+#X obj 562 100 inlet;
+#X obj 626 98 inlet;
+#X obj 1335 1235 outlet;
+#X obj 1082 337 outlet;
+#X obj 35 282 splitspec~ 8, f 159;
+#X text 124 531 determines FFT size of 1024 with overlap factor 8;
+#X msg 1066 382 set \$1 \$2 \$3 \$4 \$5 \$6 \$7 \$8 \$9 \$10 \$11 \$12
+\$13 \$14 \$15 \$16 \$17 \$18 \$19 \$20 \$21 \$22 \$23 \$24 \$25 \$26
+\$27 \$28 \$29 \$30 \$31 \$32 \$33 \$34 \$35 \$36 \$37 \$38 \$39 \$40
+\$41 \$42 \$43 \$44 \$45 \$46 \$47 \$48 \$49 \$50 \$51 \$52 \$53 \$54
+\$55 \$56 \$57 \$58 \$59 \$60 \$61 \$62 \$63 \$64 \$65 \$66 \$67 \$68
+\$69 \$70 \$71 \$72 \$73 \$74 \$75 \$76 \$77 \$78 \$79 \$80 \$81 \$82
+\$83 \$84 \$85 \$86 \$87 \$88 \$89 \$90 \$91 \$92 \$93 \$94 \$95 \$96
+\$97 \$98 \$99 \$100 \$101 \$102 \$103 \$104 \$105 \$106 \$107 \$108
+\$109 \$110 \$111 \$112 \$113 \$114 \$115 \$116 \$117 \$118 \$119 \$120
+\$121 \$122 \$123 \$124 \$125 \$126 \$127 \$128 \$129 \$130 \$131 \$132
+\$133 \$134 \$135 \$136 \$137 \$138 \$139 \$140 \$141 \$142 \$143 \$144
+\$145 \$146 \$147 \$148 \$149 \$150 \$151 \$152 \$153 \$154 \$155 \$156
+\$157 \$158 \$159 \$160 \$161 \$162 \$163 \$164 \$165 \$166 \$167 \$168
+\$169 \$170 \$171 \$172 \$173 \$174 \$175 \$176 \$177 \$178 \$179 \$180
+\$181 \$182 \$183 \$184 \$185 \$186 \$187 \$188 \$189 \$190 \$191 \$192
+\$193 \$194 \$195 \$196 \$197 \$198 \$199 \$200 \$201 \$202 \$203 \$204
+\$205 \$206 \$207 \$208 \$209 \$210 \$211 \$212 \$213 \$214 \$215 \$216
+\$217 \$218 \$219 \$220 \$221 \$222 \$223 \$224 \$225 \$226 \$227 \$228
+\$229 \$230 \$231 \$232 \$233 \$234 \$235 \$236 \$237 \$238 \$239 \$240
+\$241 \$242 \$243 \$244 \$245 \$246 \$247 \$248 \$249 \$250 \$251 \$252
+\$253 \$254 \$255 \$256 \$257 \$258 \$259 \$260 \$261 \$262 \$263 \$264
+\$265 \$266 \$267 \$268 \$269 \$270 \$271 \$272 \$273 \$274 \$275 \$276
+\$277 \$278 \$279 \$280 \$281 \$282 \$283 \$284 \$285 \$286 \$287 \$288
+\$289 \$290 \$291 \$292 \$293 \$294 \$295 \$296 \$297 \$298 \$299 \$300
+\$301 \$302 \$303 \$304 \$305 \$306 \$307 \$308 \$309 \$310 \$311 \$312
+\$313 \$314 \$315 \$316 \$317 \$318 \$319 \$320 \$321 \$322 \$323 \$324
+\$325 \$326 \$327 \$328 \$329 \$330 \$331 \$332 \$333 \$334 \$335 \$336
+\$337 \$338 \$339 \$340 \$341 \$342 \$343 \$344 \$345 \$346 \$347 \$348
+\$349 \$350 \$351 \$352 \$353 \$354 \$355 \$356 \$357 \$358 \$359 \$360
+\$361 \$362 \$363 \$364 \$365 \$366 \$367 \$368 \$369 \$370 \$371 \$372
+\$373 \$374 \$375 \$376 \$377 \$378 \$379 \$380 \$381 \$382 \$383 \$384
+\$385 \$386 \$387 \$388 \$389 \$390 \$391 \$392 \$393 \$394 \$395 \$396
+\$397 \$398 \$399 \$400 \$401 \$402 \$403 \$404 \$405 \$406 \$407 \$408
+\$409 \$410 \$411 \$412 \$413 \$414 \$415 \$416 \$417 \$418 \$419 \$420
+\$421 \$422 \$423 \$424 \$425 \$426 \$427 \$428 \$429 \$430 \$431 \$432
+\$433 \$434 \$435 \$436 \$437 \$438 \$439 \$440 \$441 \$442 \$443 \$444
+\$445 \$446 \$447 \$448 \$449 \$450 \$451 \$452 \$453 \$454 \$455 \$456
+\$457 \$458 \$459 \$460 \$461 \$462 \$463 \$464 \$465 \$466 \$467 \$468
+\$469 \$470 \$471 \$472 \$473 \$474 \$475 \$476 \$477 \$478 \$479 \$480
+\$481 \$482 \$483 \$484 \$485 \$486 \$487 \$488 \$489 \$490 \$491 \$492
+\$493 \$494 \$495 \$496 \$497 \$498 \$499 \$500 \$501 \$502 \$503 \$504
+\$505 \$506 \$507 \$508 \$509 \$510 \$511, f 45;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 5 0;
+#X connect 3 1 5 1;
+#X connect 5 0 67 0;
+#X connect 5 1 67 1;
+#X connect 6 0 7 0;
+#X connect 6 1 7 1;
+#X connect 7 0 9 0;
+#X connect 8 0 1 0;
+#X connect 9 0 8 0;
+#X connect 10 0 13 1;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 12 1 10 0;
+#X connect 12 2 10 1;
+#X connect 13 0 14 0;
+#X connect 14 0 17 0;
+#X connect 16 0 11 0;
+#X connect 18 0 9 1;
+#X connect 20 0 21 0;
+#X connect 20 1 21 1;
+#X connect 21 0 23 0;
+#X connect 22 0 19 0;
+#X connect 23 0 22 0;
+#X connect 24 0 23 1;
+#X connect 26 0 27 0;
+#X connect 26 1 27 1;
+#X connect 27 0 29 0;
+#X connect 28 0 25 0;
+#X connect 29 0 28 0;
+#X connect 30 0 29 1;
+#X connect 32 0 33 0;
+#X connect 32 1 33 1;
+#X connect 33 0 35 0;
+#X connect 34 0 31 0;
+#X connect 35 0 34 0;
+#X connect 36 0 35 1;
+#X connect 38 0 39 0;
+#X connect 38 1 39 1;
+#X connect 39 0 41 0;
+#X connect 40 0 37 0;
+#X connect 41 0 40 0;
+#X connect 42 0 41 1;
+#X connect 44 0 45 0;
+#X connect 44 1 45 1;
+#X connect 45 0 47 0;
+#X connect 46 0 43 0;
+#X connect 47 0 46 0;
+#X connect 48 0 47 1;
+#X connect 50 0 51 0;
+#X connect 50 1 51 1;
+#X connect 51 0 53 0;
+#X connect 52 0 49 0;
+#X connect 53 0 52 0;
+#X connect 54 0 53 1;
+#X connect 56 0 57 0;
+#X connect 56 1 57 1;
+#X connect 57 0 59 0;
+#X connect 58 0 55 0;
+#X connect 59 0 58 0;
+#X connect 60 0 59 1;
+#X connect 61 0 67 0;
+#X connect 62 0 67 2;
+#X connect 63 0 67 3;
+#X connect 64 0 67 4;
+#X connect 67 0 6 0;
+#X connect 67 1 6 1;
+#X connect 67 2 20 0;
+#X connect 67 3 20 1;
+#X connect 67 4 26 0;
+#X connect 67 5 26 1;
+#X connect 67 6 32 0;
+#X connect 67 7 32 1;
+#X connect 67 8 38 0;
+#X connect 67 9 38 1;
+#X connect 67 10 44 0;
+#X connect 67 11 44 1;
+#X connect 67 12 50 0;
+#X connect 67 13 50 1;
+#X connect 67 14 56 0;
+#X connect 67 15 56 1;
+#X connect 67 16 69 0;
+#X connect 67 17 66 0;
+#X connect 69 0 65 0;
+#X restore 34 164 pd splitspec-rfft;
+#X obj 720 115 hsl 128 15 0 1 0 0 empty empty manual_override_controller
+-2 -8 0 10 -204786 -1 -1 0 1;
+#X obj 362 111 hsl 128 15 0 1 0 0 empty empty table_offset -2 -8 0
+10 -204786 -1 -1 0 1;
+#X obj 525 112 hsl 128 15 0 1 0 0 empty empty bin_offset -2 -8 0 10
+-204786 -1 -1 0 1;
+#X obj 108 124 r splitspec-help-msgs;
+#N canvas 197 462 750 354 messages 0;
+#X msg 322 119 scramble;
+#X obj 440 85 metro 5000;
+#X obj 440 51 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X msg 44 180 spiral;
+#X obj 395 154 loadbang;
+#X msg 395 183 ramptime 5000;
+#X msg 527 243 manual_override \$1;
+#X obj 527 205 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X text 461 45 use for constantly changing spectra;
+#X msg 222 113 bypass \$1;
+#X obj 222 87 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 337 302 s splitspec-help-msgs;
+#X text 545 206 slider control of x-fade amount;
+#X text 245 86 turn off spectral splitting;
+#X text 490 176 interpolation time in ms.;
+#X text 91 175 spiral configuration;
+#X text 27 27 break into contiguous blocks of spectrum (power of 2
+only);
+#X msg 30 55 squantize 7;
+#X text 381 120 scramble bin assignments;
+#X connect 0 0 11 0;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 11 0;
+#X connect 4 0 5 0;
+#X connect 5 0 11 0;
+#X connect 6 0 11 0;
+#X connect 7 0 6 0;
+#X connect 9 0 11 0;
+#X connect 10 0 9 0;
+#X connect 17 0 11 0;
+#X restore 34 381 pd messages;
+#X msg 114 381 <- how it works;
+#X floatatom 34 457 5 0 0.25 0 - - -, f 5;
+#X obj 37 432 hsl 128 15 0 2 0 0 empty empty gain -2 -8 0 10 -204800
+-1 -1 1900 1;
+#X obj 34 485 s splitspec-help-mgain;
+#N canvas 0 22 1204 446 gain8 0;
+#X obj 36 44 inlet~;
+#X obj 36 106 outlet~;
+#X obj 36 76 *~;
+#X obj 79 44 r splitspec-help-mgain;
+#X obj 223 44 inlet~;
+#X obj 223 106 outlet~;
+#X obj 223 76 *~;
+#X obj 266 44 r splitspec-help-mgain;
+#X obj 409 44 inlet~;
+#X obj 409 106 outlet~;
+#X obj 409 76 *~;
+#X obj 452 44 r splitspec-help-mgain;
+#X obj 596 44 inlet~;
+#X obj 596 106 outlet~;
+#X obj 596 76 *~;
+#X obj 639 44 r splitspec-help-mgain;
+#X obj 781 44 inlet~;
+#X obj 781 106 outlet~;
+#X obj 781 76 *~;
+#X obj 824 44 r splitspec-help-mgain;
+#X obj 968 44 inlet~;
+#X obj 968 106 outlet~;
+#X obj 968 76 *~;
+#X obj 1011 44 r splitspec-help-mgain;
+#X obj 1154 44 inlet~;
+#X obj 1154 106 outlet~;
+#X obj 1154 76 *~;
+#X obj 1197 44 r splitspec-help-mgain;
+#X obj 1341 44 inlet~;
+#X obj 1341 106 outlet~;
+#X obj 1341 76 *~;
+#X obj 1384 44 r splitspec-help-mgain, f 35;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 1;
+#X connect 4 0 6 0;
+#X connect 6 0 5 0;
+#X connect 7 0 6 1;
+#X connect 8 0 10 0;
+#X connect 10 0 9 0;
+#X connect 11 0 10 1;
+#X connect 12 0 14 0;
+#X connect 14 0 13 0;
+#X connect 15 0 14 1;
+#X connect 16 0 18 0;
+#X connect 18 0 17 0;
+#X connect 19 0 18 1;
+#X connect 20 0 22 0;
+#X connect 22 0 21 0;
+#X connect 23 0 22 1;
+#X connect 24 0 26 0;
+#X connect 26 0 25 0;
+#X connect 27 0 26 1;
+#X connect 28 0 30 0;
+#X connect 30 0 29 0;
+#X connect 31 0 30 1;
+#X restore 34 222 pd gain8;
+#X floatatom 433 230 5 0 0 0 sync-phase - -, f 5;
+#N canvas 244 54 590 399 storage 0;
+#X obj 191 298 s splitspec-help-msgs;
+#X msg 85 125 store \$1;
+#X msg 80 82 1;
+#X msg 119 79 2;
+#X msg 159 80 3;
+#X msg 202 178 recall \$1;
+#X msg 212 133 1;
+#X msg 251 130 2;
+#X msg 291 131 3;
+#X text 247 55 store and then recall bin configuration patterns;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 1 0;
+#X connect 5 0 0 0;
+#X connect 6 0 5 0;
+#X connect 7 0 5 0;
+#X connect 8 0 5 0;
+#X restore 201 431 pd storage;
+#X obj 28 12 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 27 50 splitspec~ - divides a spectrum into N separate parts
+(N must be a power of 2 \, less than the FFT size) \, which can then
+be spatialized. Smooth transitions between spectral divisions are provided.
+, f 105;
+#X text 271 430 <- save configurations;
+#N canvas 0 22 450 300 current-bin-configuration 0;
+#X obj 124 56 inlet;
+#X msg 123 105 344 165 79 39 487 386 236 27 213 462 284 439 293 160
+1 173 201 242 130 144 417 274 372 119 179 332 270 24 290 348 203 111
+176 492 271 420 187 312 13 224 300 100 258 246 60 158 327 508 46 477
+345 279 45 136 97 51 351 225 159 161 147 499 260 223 425 506 470 373
+63 357 197 62 421 194 114 503 272 278 207 32 189 44 422 387 354 367
+219 59 353 375 167 306 511 440 449 50 464 450 495 340 168 253 301 57
+58 346 479 65 445 259 443 23 143 155 127 286 389 472 388 364 198 264
+292 22 295 285 240 177 399 328 314 31 403 384 329 505 333 82 442 321
+231 126 113 476 56 359 303 99 311 336 238 378 496 254 228 202 204 72
+317 125 437 133 396 444 134 391 428 86 8 243 460 80 42 256 393 195
+115 371 108 182 129 41 95 172 16 356 413 435 360 392 395 283 252 17
+49 211 19 199 233 335 501 459 451 482 36 419 310 424 221 307 475 116
+85 426 394 247 276 96 215 347 510 70 137 488 153 71 467 26 474 416
+73 257 458 78 145 380 226 304 163 491 25 191 415 282 54 318 77 87 309
+152 33 298 407 208 232 162 411 269 216 47 409 365 322 418 452 402 432
+148 343 326 463 188 457 2 28 98 447 109 214 83 489 112 414 193 493
+206 75 190 69 7 21 61 140 131 12 196 52 498 5 308 366 43 406 149 230
+92 478 3 456 29 281 355 209 106 4 423 81 484 461 88 118 299 368 169
+102 40 323 363 504 485 164 483 123 239 138 481 150 277 234 170 241
+291 383 379 34 267 382 174 358 64 280 132 507 48 350 181 494 268 124
+139 429 408 180 324 9 370 398 210 453 465 401 294 468 319 142 369 427
+251 38 89 53 55 471 227 390 220 473 249 412 405 266 128 454 30 157
+446 330 84 117 212 93 37 448 433 305 341 74 222 287 217 15 244 146
+349 35 381 338 337 385 186 6 185 110 122 331 11 289 175 288 361 245
+397 184 250 265 18 362 120 68 66 192 316 229 235 248 273 325 455 237
+377 490 297 502 91 486 218 410 497 441 438 313 94 10 302 20 436 339
+103 261 90 104 342 320 76 434 480 135 0 430 101 296 151 334 509 262
+469 107 275 263 315 404 205 178 352 121 141 156 67 183 14 166 171 200
+255 374 105 500 400 154 431 466;
+#X msg 176 27 showstate;
+#X obj 176 55 s splitspec-help-msgs;
+#X connect 0 0 1 0;
+#X connect 2 0 3 0;
+#X restore 547 214 pd current-bin-configuration;
+#X obj 34 348 dac~ 1 2 3 4 5 6 7 8, f 35;
+#X connect 0 0 1 0;
+#X connect 1 0 11 0;
+#X connect 1 1 11 1;
+#X connect 1 2 11 2;
+#X connect 1 3 11 3;
+#X connect 1 4 11 4;
+#X connect 1 5 11 5;
+#X connect 1 6 11 6;
+#X connect 1 7 11 7;
+#X connect 1 8 12 0;
+#X connect 1 9 17 0;
+#X connect 2 0 1 4;
+#X connect 3 0 1 2;
+#X connect 4 0 1 3;
+#X connect 5 0 1 1;
+#X connect 8 0 10 0;
+#X connect 9 0 8 0;
+#X connect 11 0 18 0;
+#X connect 11 1 18 1;
+#X connect 11 2 18 2;
+#X connect 11 3 18 3;
+#X connect 11 4 18 4;
+#X connect 11 5 18 5;
+#X connect 11 6 18 6;
+#X connect 11 7 18 7;
diff --git a/externals/lyonpotpourri/splitspec~.c b/externals/lyonpotpourri/splitspec~.c
new file mode 100755
index 0000000000000000000000000000000000000000..e88ca3e2f81acfe2ff6248ca8742ca25bf4510fc
--- /dev/null
+++ b/externals/lyonpotpourri/splitspec~.c
@@ -0,0 +1,722 @@
+#include "MSPd.h"
+
+#define MAXSTORE (128)
+#define OBJECT_NAME "splitspec~"
+
+/* Pd version of splitspec~ */
+
+static t_class *splitspec_class;
+
+typedef struct _splitspec
+{
+    t_object x_obj;
+    t_float x_f;
+    int N;
+    int N2;
+    void *list_outlet;
+    void *phase_outlet;
+    t_atom *list_data;
+    // Avoid buffer sharing overwrites with local copies
+    t_float *inmag_loc;
+    t_float *inphase_loc;
+    t_float *t_offset_loc;
+    t_float *b_offset_loc;
+    t_float *manual_control_loc;
+    float frame_duration;
+    int table_offset;
+    int bin_offset;
+    float *last_mag;
+    float *current_mag;
+    int *last_binsplit;
+    int *current_binsplit;
+    int **stored_binsplits;
+    short *stored_slots;
+    short new_distribution;
+    short interpolation_completed;
+    short bypass;
+    short initialize;
+    int manual_override;
+    long countdown_samps; // samps for a given fadetime
+    long counter;
+    int overlap_factor; // compensate for overlap in fade
+    float sr;
+    float fl_phase; // show phase as float
+    int hopsamps; // number of samples to hop
+    int channel_count; // number of channels to split
+    t_clock *phase_clock;
+    t_float **magvecs;// connect to mag input vectors
+    t_float **phasevecs;// point to phase input vectors
+} t_splitspec;
+
+void *splitspec_new(t_symbol *s, int argc, t_atom *argv);
+t_int *offset_perform(t_int *w);
+t_int *splitspec_perform(t_int *w);
+void splitspec_dsp(t_splitspec *x, t_signal **sp);
+void splitspec_showstate( t_splitspec *x );
+void splitspec_bypass( t_splitspec *x, t_floatarg toggle);
+void splitspec_manual_override( t_splitspec *x, t_floatarg toggle );
+void splitspec_setstate (t_splitspec *x, t_symbol *msg, int argc, t_atom *argv);
+void splitspec_ramptime (t_splitspec *x, t_symbol *msg, int argc, t_atom *argv);
+int rand_index( int max);
+void splitspec_scramble (t_splitspec *x);
+void splitspec_spiral(t_splitspec *x);
+void splitspec_squantize(t_splitspec *x, t_floatarg blockbins);
+void splitspec_overlap( t_splitspec *x, t_floatarg factor);
+
+void splitspec_store( t_splitspec *x, t_floatarg floc);
+void splitspec_recall( t_splitspec *x, t_floatarg floc);
+void splitspeci( int *current_binsplit, int *last_binsplit, int bin_offset, int table_offset,
+                float *current_mag, float *last_mag, float *inmag, float *dest_mag, int start, int end, int n,
+                float oldfrac, float newfrac );
+void splitspec( int *binsplit, int bin_offset, int table_offset,
+               float *inmag, float *dest_mag, int start, int end, int n );
+
+void splitspec_dsp_free( t_splitspec *x );
+
+void splitspec_phaseout(t_splitspec *x);
+int splitspec_closestPowerOfTwo(int p);
+void splitspec_tilde_setup(void){
+   splitspec_class = class_new(gensym("splitspec~"), (t_newmethod)splitspec_new,
+                                (t_method)splitspec_dsp_free, sizeof(t_splitspec),0,A_GIMME,0);
+    
+    /* splitspec_class = class_new(gensym("splitspec~"), (t_newmethod)splitspec_new,
+                                0, sizeof(t_splitspec),0,A_GIMME,0); */
+	CLASS_MAINSIGNALIN(splitspec_class, t_splitspec, x_f);
+    class_addmethod(splitspec_class, (t_method)splitspec_dsp, gensym("dsp"),0);
+    class_addmethod(splitspec_class, (t_method)splitspec_showstate, gensym("showstate"),0);
+    class_addmethod(splitspec_class, (t_method)splitspec_scramble, gensym("scramble"),0);
+    class_addmethod(splitspec_class, (t_method)splitspec_spiral, gensym("spiral"),0);
+    class_addmethod(splitspec_class, (t_method)splitspec_squantize, gensym("squantize"),A_FLOAT,0);
+    class_addmethod(splitspec_class, (t_method)splitspec_manual_override, gensym("manual_override"),A_FLOAT,0);
+    class_addmethod(splitspec_class, (t_method)splitspec_bypass, gensym("bypass"),A_FLOAT,0);
+    class_addmethod(splitspec_class, (t_method)splitspec_store, gensym("store"),A_FLOAT,0);
+    class_addmethod(splitspec_class, (t_method)splitspec_recall, gensym("recall"),A_FLOAT,0);
+    class_addmethod(splitspec_class, (t_method)splitspec_overlap, gensym("overlap"),A_FLOAT,0);
+    class_addmethod(splitspec_class, (t_method)splitspec_setstate, gensym("setstate"),A_GIMME,0);
+    class_addmethod(splitspec_class, (t_method)splitspec_ramptime, gensym("ramptime"),A_GIMME,0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+void splitspec_phaseout(t_splitspec *x)
+{
+    outlet_float(x->phase_outlet, x->fl_phase);
+}
+
+void splitspec_overlap( t_splitspec *x, t_floatarg fol )
+{
+    int overlap = (int)fol;
+	if( overlap < 2 ){
+		post("splitspec~: illegal overlap %d",overlap);
+	}
+	x->overlap_factor = overlap;
+}
+
+void splitspec_spiral(t_splitspec *x)
+{
+    int i,j,k;
+    int offset;
+
+    int channel_count = x->channel_count;
+    int *current_binsplit = x->current_binsplit;
+    int *last_binsplit = x->last_binsplit;
+    
+    int N2 = x->N2;
+    
+    offset = N2 / channel_count;
+    
+    x->new_distribution = 1;
+    x->interpolation_completed = 0;
+    for( i = 0; i < N2; i++ ){
+        last_binsplit[i] = current_binsplit[i];
+    }
+    k = 0;
+    for( i = 0; i < N2 / channel_count; i++){
+        for(j = 0; j < channel_count; j++){
+            current_binsplit[i + (j * offset)] = k++;
+        }
+    }
+    if(! x->counter) { // Ramp Off - Immediately set last to current
+        for( i = 0; i < N2; i++ ){
+            last_binsplit[ i ] = current_binsplit[ i ];
+        }
+    }
+}
+
+void splitspec_squantize(t_splitspec *x, t_floatarg bb)
+{
+    int i, j, k;
+    
+    int maxblock;
+    int iterations;
+    int bincount = 0;
+    int *current_binsplit = x->current_binsplit;
+    int *last_binsplit = x->last_binsplit;
+    int blockbins = (int) bb;
+    int N2 = x->N2;
+    int channel_count = x->channel_count;
+    blockbins = splitspec_closestPowerOfTwo( blockbins );
+    maxblock = N2 / channel_count;
+    if( blockbins < 1 || blockbins > maxblock ){
+        error("%d is out of bounds - must be between 1 and %d", blockbins, maxblock);
+        return;
+    }
+    
+    iterations = N2 /  channel_count /  blockbins;
+    x->new_distribution = 1;
+    x->interpolation_completed = 0;
+    
+    
+    for( i = 0; i < N2; i++ ){
+        last_binsplit[i] = current_binsplit[i];
+    }
+    
+    if( iterations == 1 ){
+        for( i = 0; i < N2 ; i++ ){
+            current_binsplit[i] = i;
+        }
+    }
+    else {
+        for( k = 0; k < iterations; k++ ) {
+            for( i = 0; i < N2; i += maxblock  ){
+                for( j = 0; j < blockbins; j++ ){
+                    if( i + j + k * blockbins < N2 ){
+                        current_binsplit[i + j + k * blockbins] = bincount++;
+                        // post("assigning %d to position %d", bincount-1, i+j+k*blockbins);
+                    } else {
+                        // error("%d out of range", i + j + k * blockbins);
+                    }
+                }
+            }
+        }
+    }
+    
+    
+//    x->frames_left = x->ramp_frames;
+    if(! x->counter) { // Ramp Off - Immediately set last to current
+        for( i = 0; i < N2; i++ ){
+            last_binsplit[ i ] = current_binsplit[ i ];
+        }
+    }
+}
+
+void splitspec_bypass( t_splitspec *x, t_floatarg toggle )
+{
+    x->bypass = (int)toggle;
+}
+
+void splitspec_manual_override( t_splitspec *x, t_floatarg toggle )
+{
+    x->manual_override = (int) toggle;
+}
+
+void splitspec_dsp_free( t_splitspec *x ){
+    int i;
+    if(x->initialize == 0){
+        free(x->list_data);
+        free(x->last_binsplit);
+        free(x->current_binsplit);
+        free(x->last_mag);
+        free(x->current_mag);
+        free(x->stored_slots);
+        for(i = 0; i < MAXSTORE; i++){
+            free(x->stored_binsplits[i]);
+        }
+        free(x->stored_binsplits);
+        free(x->inmag_loc);
+        free(x->inphase_loc);
+        free(x->t_offset_loc);
+        free(x->b_offset_loc);
+        free(x->manual_control_loc);
+        free(x->magvecs);
+        free(x->phasevecs);
+    }
+}
+
+void splitspeci( int *current_binsplit, int *last_binsplit, int bin_offset, int table_offset,
+                float *current_mag, float *last_mag, float *inmag, float *dest_mag, int start, int end, int n,
+                float oldfrac, float newfrac )
+{
+    int i;
+    int bindex;
+    
+    for( i = 0; i < n; i++ ){
+        last_mag[i] = current_mag[i] = 0.0;
+    }
+    for( i = start; i < end; i++ ){
+        bindex = current_binsplit[ (i + table_offset) % n ];
+        bindex = ( bindex + bin_offset ) % n;
+        current_mag[ bindex ] = inmag[ bindex ];
+        bindex = last_binsplit[ (i + table_offset) % n ];
+        bindex = ( bindex + bin_offset ) % n;
+        last_mag[ bindex ] = inmag[ bindex ];
+    }
+    for( i = 0; i < n; i++){
+        if(! current_mag[i] && ! last_mag[i]){
+            dest_mag[i] = 0.0;
+        } else {
+            dest_mag[i] = oldfrac * last_mag[i] + newfrac * current_mag[i];
+        }
+    }
+    
+}
+
+void splitspec( int *binsplit, int bin_offset, int table_offset,
+               float *inmag, float *dest_mag, int start, int end, int n )
+{
+    int i;
+    int bindex;
+    // n is actually N2
+    for( i = start; i < end; i++){
+        bindex = binsplit[ (i + table_offset) % n ];
+        bindex = ( bindex + bin_offset ) % n;
+        dest_mag[ bindex ] = inmag[ bindex ];
+    }
+}
+
+
+void splitspec_store( t_splitspec *x, t_floatarg floc)
+{
+    int **stored_binsplits = x->stored_binsplits;
+    int *current_binsplit = x->current_binsplit;
+    short *stored_slots = x->stored_slots;
+    int location = (int)floc;
+    int i;
+    
+    if( location < 0 || location > MAXSTORE - 1 ){
+        error("location must be between 0 and %d, but was %d", MAXSTORE, location);
+        return;
+    }
+    for(i = 0; i < x->N2; i++ ){
+        stored_binsplits[location][i] = current_binsplit[i];
+    }
+    stored_slots[location] = 1;
+    
+//    post("stored bin split at location %d", location);
+}
+
+void splitspec_recall( t_splitspec *x, t_floatarg floc)
+{
+    int **stored_binsplits = x->stored_binsplits;
+    int *current_binsplit = x->current_binsplit;
+    int *last_binsplit = x->last_binsplit;
+    short *stored_slots = x->stored_slots;
+    int i;
+    int location = (int)floc;
+    if( location < 0 || location > MAXSTORE - 1 ){
+        error("location must be between 0 and %d, but was %d", MAXSTORE, location);
+        return;
+    }
+    if( ! stored_slots[location] ){
+        error("nothing stored at location %d", location);
+        return;
+    }
+    
+    for(i = 0; i < x->N2; i++ ){
+        last_binsplit[i] = current_binsplit[i];
+        current_binsplit[i] = stored_binsplits[location][i];
+    }
+    
+    x->new_distribution = 1;
+    x->interpolation_completed = 0;
+ //   x->frames_left = x->ramp_frames;
+    if(! x->counter) { // Ramp Off - Immediately set last to current
+        for( i = 0; i < x->N2; i++ ){
+            x->last_binsplit[ i ] = x->current_binsplit[ i ];
+        }
+    }
+}
+
+void *splitspec_new(t_symbol *s, int argc, t_atom *argv)
+{
+    int i;
+    t_splitspec *x = (t_splitspec *)pd_new(splitspec_class);
+    
+    // x->channel_count = 8; // hard wire just for now
+    x->channel_count = (int) atom_getfloatarg(0, argc, argv);
+    x->channel_count = splitspec_closestPowerOfTwo( x->channel_count );
+    // post("Channel count is: %d", x->channel_count);
+    srand( time( 0 ) );
+    
+    for(i=0; i < 4; i++){
+        inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("signal"),gensym("signal"));
+    }
+    for(i=0; i < x->channel_count * 2; i++){
+        outlet_new(&x->x_obj, gensym("signal"));
+    }
+    x->list_outlet = (t_outlet *) outlet_new(&x->x_obj, gensym("list")); // to report random distribution
+    x->phase_outlet = (t_outlet *) outlet_new((t_object *)x, &s_float);
+    x->phase_clock = (t_clock *) clock_new((void *)x, (t_method)splitspec_phaseout);
+    x->bypass = 0;
+    x->table_offset = 0;
+    x->bin_offset = 0;
+    
+    x->sr = sys_getsr();
+ 	x->counter = 0;
+    x->overlap_factor = 8; // default
+    
+	x->countdown_samps = 1.0 * x->sr; // 1 second fade time by default
+    
+    x->initialize = 1;
+    x->manual_override = 0;
+    
+    x->inmag_loc = (t_float *) calloc(8192,sizeof(t_float));
+    x->inphase_loc = (t_float *) calloc(8192,sizeof(t_float));
+    x->t_offset_loc = (t_float *) calloc(8192,sizeof(t_float));
+    x->b_offset_loc = (t_float *) calloc(8192,sizeof(t_float));
+    x->manual_control_loc = (t_float *) calloc(8192,sizeof(t_float));
+    x->magvecs = (t_float **) malloc(x->channel_count * sizeof(t_float *));
+    x->phasevecs = (t_float **) malloc(x->channel_count * sizeof(t_float *));
+    return x;
+}
+
+int splitspec_closestPowerOfTwo(int p){
+    int base = 2;
+    while(base < p){
+        base *= 2;
+    }
+    return base;
+}
+
+t_int *splitspec_perform(t_int *w)
+{
+	
+    int i, j;
+
+    t_splitspec *x = (t_splitspec *) (w[1]);
+    int channel_count = x->channel_count;
+    
+    float *inmag = (t_float *)(w[2]);
+    float *inphase = (t_float *)(w[3]);
+    float *t_offset = (t_float *)(w[4]);
+    float *b_offset = (t_float *)(w[5]);
+    float *manual_control = (t_float *)(w[6]);
+
+    t_float **magvecs = x->magvecs;
+    t_float **phasevecs = x->phasevecs;
+    int n = (int) w[7 + (channel_count * 2)];
+    
+    int table_offset = x->table_offset;
+    int bin_offset = x->bin_offset;
+    
+    int *current_binsplit = x->current_binsplit;
+    int *last_binsplit = x->last_binsplit;
+    float *last_mag = x->last_mag;
+    float *current_mag = x->current_mag;
+    long counter = x->counter;
+    long countdown_samps = x->countdown_samps;
+    float frac, oldgain, newgain;
+    t_float *inmag_loc = x->inmag_loc;
+    t_float *inphase_loc = x->inphase_loc;
+    t_float *t_offset_loc = x->t_offset_loc;
+    t_float *b_offset_loc = x->b_offset_loc;
+    t_float *manual_control_loc = x->manual_control_loc;
+    int next_ptr = 8 + (channel_count * 2);
+    int hopsamps = x->hopsamps;
+    int N2 = x->N2;
+    /****/
+    
+    // copy inputs to local buffers
+    
+    for(i = 0; i < n; i++){
+        inmag_loc[i] = inmag[i];
+        inphase_loc[i] = inphase[i];
+        t_offset_loc[i] = t_offset[i];
+        b_offset_loc[i] = b_offset[i];
+        manual_control_loc[i] = manual_control[i];
+    }
+    
+    // assign local vector pointers
+    for(i = 0, j= 0; i < channel_count * 2; i+=2, j++){
+        magvecs[j] = (t_float *) w[ 7 + i ];
+        phasevecs[j] = (t_float *) w[ 8 + i ];
+    }
+    
+    table_offset = *t_offset_loc * n;
+    bin_offset = *b_offset_loc * n;
+    
+    if( table_offset  < 0 )
+        table_offset *= -1;
+    if( bin_offset  < 0 )
+        bin_offset *= -1;
+  	
+    
+    // n == fftsize / 2 (N2)
+    // n is the number of "bins", and is also the number of values in each signal vector
+    
+    if( x->bypass ){
+        for( i = 0; i < n; i++){
+            for(j = 0; j < channel_count; j++){
+                magvecs[j][i] = inmag_loc[i] * 0.5;;
+                phasevecs[j][i] = inphase_loc[i];
+            }
+        }
+        return (w + next_ptr);
+    }
+    
+    // ZERO OUT MAGNITUDES AND COPY PHASES TO OUTPUT
+    for( i = 0; i < n; i++ ){
+        for(j = 0; j < channel_count; j++){
+            magvecs[j][i] = 0.0;
+            phasevecs[j][i] = inphase_loc[i];
+        }
+    }
+    
+    // Special case of live control over interpolation
+    if( x->manual_override ){
+        
+        // do interpolation
+        frac = *manual_control_loc;
+        // sanity check here
+        if( frac < 0 ) { frac = 0; }
+        if( frac >1.0 ){ frac = 1.0; }
+        oldgain = cos( frac * PIOVERTWO );
+        newgain = sin( frac * PIOVERTWO );
+        
+        for(j = 0; j < channel_count; j++){
+            splitspeci( current_binsplit, last_binsplit, bin_offset, table_offset,
+                       current_mag, last_mag, inmag_loc, magvecs[j],
+                       N2*j/channel_count, N2*(j+1)/channel_count, N2, oldgain, newgain );
+        }
+        return (w + next_ptr);
+    }
+    
+    // Normal operation
+    if( x->new_distribution ){
+        x->new_distribution = 0;
+        // put out contents of last distribution
+        for(j = 0; j < channel_count; j++){
+            splitspec(last_binsplit, bin_offset, table_offset, inmag_loc, magvecs[j],
+                      N2*j/channel_count, N2*(j+1)/channel_count, N2);
+        }
+        frac = 0.0;
+        
+    } else if ( x->interpolation_completed ) {
+        // put out contents of current distribution
+        for(j = 0; j < channel_count; j++){
+            splitspec(current_binsplit, bin_offset, table_offset, inmag_loc, magvecs[j],
+                      N2*j/channel_count, N2*(j+1)/channel_count, N2);
+        }
+        frac = 1.0;
+    } else {
+        // do interpolation
+        frac = (float) counter / (float) countdown_samps;
+        oldgain = cos( frac * PIOVERTWO );
+        newgain = sin( frac * PIOVERTWO );
+        for(j = 0; j < channel_count; j++){
+            splitspeci( current_binsplit, last_binsplit, bin_offset, table_offset,
+                       current_mag, last_mag, inmag_loc, magvecs[j],
+                       N2*j/channel_count, N2*(j+1)/channel_count, N2, oldgain, newgain );
+        }
+        // end of interpolation
+        
+        counter += hopsamps;
+        if( counter >= countdown_samps )
+        {
+            counter = countdown_samps;
+            x->interpolation_completed = 1;
+        }
+    }
+    
+    x->fl_phase = frac;
+    clock_delay(x->phase_clock,0.0); // send current phase to float outlet
+    x->counter = counter;
+    return (w + next_ptr);
+}
+
+
+void splitspec_scramble (t_splitspec *x)
+{
+    int i;
+    
+    int max = x->N2;
+    int swapi, tmp;
+    int N2 = x->N2;
+    int *current_binsplit = x->current_binsplit;
+    int *last_binsplit = x->last_binsplit;
+    
+    x->new_distribution = 1;
+    x->interpolation_completed = 0;
+
+    // Copy current mapping to last mapping (first time this will be all zeros)
+    
+    for( i = 0; i < x->N2; i++ ){
+        last_binsplit[i] = current_binsplit[i];
+    }
+
+    for( i = 0; i < N2; i++ ){
+        current_binsplit[i] = i;
+    }
+    max = N2;
+    for(i = 0; i < N2; i++){
+        swapi = rand() % max;
+        tmp = current_binsplit[swapi];
+        current_binsplit[swapi] = current_binsplit[max - 1];
+        current_binsplit[max - 1] = tmp;
+        --max;
+    }
+    /*
+    for(i = 0; i < N2; i++){
+        post("i: %d, dex: %d", i, current_binsplit[i]);
+    }
+   */
+    x->counter = 0;
+    if(! x->countdown_samps ) { // Ramp Off - Immediately set last to current
+        for( i = 0; i < x->N2; i++ ){
+            last_binsplit[ i ] = current_binsplit[ i ];
+        }
+    }
+}
+
+
+void splitspec_setstate (t_splitspec *x, t_symbol *msg, int argc, t_atom *argv) {
+    short i;
+    
+    if( argc != x->N2 ){
+        error("list must be of length %d, but actually was %d", x->N2, argc);
+        return;
+    }
+    for( i = 0; i < x->N2; i++ ){
+        x->last_binsplit[ i ] = x->current_binsplit[ i ];
+        x->current_binsplit[ i ] = 0;
+    }
+    for (i=0; i < argc; i++) {
+        x->current_binsplit[i] = atom_getintarg(i, argc, argv );
+		
+    }
+   // x->frames_left = x->ramp_frames;
+    if(!x->counter) { // Ramp Off - Immediately set last to current
+        for( i = 0; i < x->N2; i++ ){
+            x->last_binsplit[ i ] = x->current_binsplit[ i ];
+        }
+    }
+    
+    return;
+}
+
+void splitspec_ramptime (t_splitspec *x, t_symbol *msg, int argc, t_atom *argv) {
+    float rampdur;
+    
+ 	rampdur = atom_getfloatarg(0,argc,argv) * 0.001; // convert from milliseconds
+ 	x->countdown_samps = rampdur * x->sr;
+ 	x->counter = 0;
+    //  post("countdown samps :%d", x->countdown_samps  );
+}
+
+// REPORT CURRENT SHUFFLE STATUS
+void splitspec_showstate (t_splitspec *x ) {
+    
+    t_atom *list_data = x->list_data;
+    
+    short i, count;
+    
+    count = 0;
+    // post("showing %d data points", x->N2);
+    
+    if(! x->initialize){
+        for( i = 0; i < x->N2; i++ ) {
+            SETFLOAT(list_data+count,(float)x->current_binsplit[i]);
+            ++count;
+        }
+        outlet_list(x->list_outlet,0,x->N2,list_data);
+    }
+    return;
+}
+
+void splitspec_dsp(t_splitspec *x, t_signal **sp)
+{
+    int i;
+    float R, funda;
+    int vector_size;
+    t_int **sigvec;
+    int pointer_count;
+    vector_size = sys_getblksize();
+    
+    pointer_count = (x->channel_count * 2) + 7;
+    sigvec = (t_int **) malloc(sizeof(t_int *) * pointer_count);
+	for(i = 0; i < pointer_count; i++){
+		sigvec[i] = (t_int *) calloc(sizeof(t_int),1);
+	}
+	sigvec[0] = (t_int *)x; // first pointer is to the object
+	sigvec[pointer_count - 1] = (t_int *)sp[0]->s_n; // last pointer is to vector size (N)
+	for(i = 1; i < pointer_count - 1; i++){ // now attach the inlet and all outlets
+		sigvec[i] = (t_int *)sp[i-1]->s_vec;
+	}
+    
+    /*
+     
+     FFT size (N) == vector size. (Pd only. Max has a different approach.)
+     There is one vector with the magnitudes, and another with the phases, each of size .
+     Therefore N2+2 (or the vector size/2  + 1) is the actual number of bins.
+     Therefore N2/split is the number of bins assigned to each splitted channel.
+     
+     */
+    // post("vector size %d, sys vector size: %d",vector_size, sys_getblksize() );
+    // post("splitspec: samples per vector: %d, sys blocksize %d", sp[0]->s_n, sys_getblksize());
+    if( ! sp[0]->s_sr ){
+        error("splitspec~: zero sample rate!");
+        return;
+    }
+	
+    
+    if( x->initialize || x->sr != sys_getsr() || x->N != sp[0]->s_n){
+        
+        x->sr = sys_getsr();
+        x->N = sp[0]->s_n;
+        x->N2 = sp[0]->s_n / 2;
+ //       post("FFT size is %d, N2 is %d",x->N, x->N2);
+        R = sys_getsr();
+//        post("sampling rate: %f, vector thinks it is: %f", sys_getsr(), sp[0]->s_sr);
+        funda = R / (2. * (float) x->N) ;
+        
+        if(x->initialize){
+            x->list_data = (t_atom *) calloc((x->N + 2),sizeof(t_atom));
+            x->last_binsplit = (int *) calloc( x->N2,sizeof(int));
+            x->current_binsplit = (int *) calloc( x->N2,sizeof(int));
+            x->last_mag = (float *) calloc(x->N2,sizeof(float)) ;
+            x->current_mag = (float *) calloc(x->N2,sizeof(float)) ;
+            x->stored_slots = (short *) calloc(x->N2,sizeof(short));
+            x->stored_binsplits = (int **) calloc(MAXSTORE,sizeof(int *));
+            for( i = 0; i < MAXSTORE; i++ ){
+                x->stored_binsplits[i] = (int *)calloc(x->N2,sizeof(int));
+            }
+        } else {
+            x->list_data = (t_atom *) realloc((void *)x->list_data,(x->N + 2) * sizeof(t_atom));
+            x->last_binsplit = (int *) realloc((void *)x->last_binsplit,x->N2 * sizeof(int));
+            x->current_binsplit = (int *) realloc((void *)x->current_binsplit,x->N2 * sizeof(int));
+            x->last_mag = (float *) realloc((void *)x->last_mag,x->N2 * sizeof(float));
+            x->current_mag = (float *) realloc((void *)x->current_mag,x->N2 * sizeof(float));
+            x->stored_slots = (short *) realloc((void *)x->stored_slots,x->N2 * sizeof(short));
+            for( i = 0; i < MAXSTORE; i++ ){
+                x->stored_binsplits[i] = (int *) realloc((void *)x->stored_binsplits[i],x->N2 * sizeof(int));
+            }
+            for(i = 0; i < x->N2; i++){
+                x->last_mag[i] = 0.0;
+                x->current_mag[i] = 0.0;
+                x->current_binsplit[i] = i;
+                x->last_binsplit[i] = i;
+            }
+        }
+        
+        x->frame_duration = (float) sp[0]->s_n / sp[0]->s_sr;
+        
+        splitspec_scramble( x );
+        for( i = 0; i < x->N2; i++ ){
+            x->last_binsplit[i] = x->current_binsplit[i];
+        }
+        
+        x->initialize = 0;
+        x->counter = 0;
+    }
+    
+    if(vector_size == 0) {
+        // post("zero vector size!");
+        return;
+    } else {
+        x->hopsamps = x->N / x->overlap_factor;
+//        post("hop samps: %d, overlap: %d", x->hopsamps, x->overlap_factor);
+    }
+    dsp_addv(splitspec_perform, pointer_count, (t_int *) sigvec);
+    free(sigvec);
+}
+
+
diff --git a/externals/lyonpotpourri/squash~-help.pd b/externals/lyonpotpourri/squash~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..f56091d1bef6c674a0f9f7e1fbac49c5d3ad6984
--- /dev/null
+++ b/externals/lyonpotpourri/squash~-help.pd
@@ -0,0 +1,85 @@
+#N canvas 670 336 409 359 10;
+#X obj 20 229 squash~;
+#X obj 14 14 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#N canvas 565 63 450 300 taps 0;
+#X obj 43 111 noise~;
+#X obj 118 79 metro 1000;
+#X msg 118 56 1;
+#X obj 118 33 loadbang;
+#X obj 168 201 line~;
+#X obj 63 226 *~;
+#X obj 63 260 outlet~;
+#X msg 118 155 1;
+#X msg 209 176 0.05 50;
+#X msg 271 176 0.01 900;
+#X msg 340 177 0 50;
+#X obj 209 149 delay 1;
+#X obj 271 149 delay 50;
+#X obj 339 149 delay 900;
+#X connect 0 0 5 0;
+#X connect 1 0 7 0;
+#X connect 1 0 11 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 5 1;
+#X connect 5 0 6 0;
+#X connect 7 0 4 0;
+#X connect 8 0 4 0;
+#X connect 9 0 4 0;
+#X connect 10 0 4 0;
+#X connect 11 0 8 0;
+#X connect 11 0 12 0;
+#X connect 12 0 9 0;
+#X connect 12 0 13 0;
+#X connect 13 0 10 0;
+#X restore 20 170 pd taps;
+#X obj 20 273 *~ 0.1;
+#X obj 20 308 dac~;
+#X floatatom 59 253 5 0 0 0 - squash-gain -, f 5;
+#X obj 66 308 hsl 128 15 0 0.1 0 0 squash-gain empty gain -2 -8 0 10
+-261682 -1 -1 4400 1;
+#X obj 49 196 r squash.messages;
+#N canvas 741 67 448 403 squash-controls 0;
+#X obj 31 130 s squash.messages;
+#X msg 31 106 ratio \$1;
+#X obj 34 62 hsl 128 15 0.5 1 0 0 empty empty ratio -2 -8 0 10 -204786
+-1 -1 0 1;
+#X floatatom 31 86 5 0 0 0 - - -, f 5;
+#X obj 29 234 s squash.messages;
+#X obj 32 166 hsl 128 15 0 0.001 0 0 empty empty noise_threshold -2
+-8 0 10 -204786 -1 -1 0 1;
+#X floatatom 29 190 7 0 0 0 - - -, f 7;
+#X msg 29 210 nt \$1;
+#X text 171 165 set noise floor;
+#X obj 28 347 s squash.messages;
+#X obj 31 279 hsl 128 15 0 1 0 0 empty empty compression_threshold
+-2 -8 0 10 -204786 -1 -1 1000 1;
+#X floatatom 28 303 7 0 0 0 - - -, f 7;
+#X msg 28 323 thresh \$1;
+#X text 170 278 set compression threshold;
+#X text 29 18 lower ratio values give higher compression \, values
+greater than 1 result in expansion.;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 4 0;
+#X connect 10 0 11 0;
+#X connect 11 0 12 0;
+#X connect 12 0 9 0;
+#X restore 111 243 pd squash-controls;
+#X text 16 50 squash~ is based on a compression algorithm by Christopher
+Penrose. It can be useful for extreme effects \, and is notable for
+employing the overlap-add system found in FFTease externals \, though
+all processing is done in the time domain here. This processor is capable
+of generating extreme amplitude ranges. Use with caution \, with a
+low playback gain \, and do not use this external in performance until
+you are very familiar with its operation.;
+#X connect 0 0 3 0;
+#X connect 2 0 0 0;
+#X connect 3 0 4 0;
+#X connect 3 0 4 1;
+#X connect 5 0 3 1;
+#X connect 7 0 0 0;
diff --git a/externals/lyonpotpourri/squash~.c b/externals/lyonpotpourri/squash~.c
new file mode 100755
index 0000000000000000000000000000000000000000..0719eadb61f0fb733139c88a951ae95785ef59f8
--- /dev/null
+++ b/externals/lyonpotpourri/squash~.c
@@ -0,0 +1,437 @@
+#include "MSPd.h"
+
+
+#define OBJECT_NAME "squash~"
+
+/* Pd version of squash~ */
+
+static t_class *squash_class;
+
+
+typedef struct _squash
+{
+
+	t_object x_obj;
+	t_float x_f;
+	int D;
+	int N;
+	int Nw;
+	int N2;
+	int incnt;
+	int outcnt;
+	float *Wanal;
+	float *Wsyn;
+	float *Hwin;
+	float *buffer;
+	float *input;
+	float *output;
+	float thresh;
+	float ratio;
+	float nt;
+	float nmult;
+	short mute;
+} t_squash;
+
+
+float boundrand(float min, float max);
+void *squash_new(t_symbol *msg, short argc, t_atom *argv);
+void squash_mute(t_squash *x, t_floatarg toggle);
+void squash_assist (t_squash *x, void *b, long msg, long arg, char *dst);
+void squash_dsp_free(t_squash *x);
+double squash_squat( float *buffer, float thresh, float ratio, float nt, float nmult, int N );
+void squash_mute(t_squash *x, t_floatarg f);
+void squash_thresh(t_squash *x, t_floatarg f);
+void squash_nt(t_squash *x, t_floatarg f);
+void squash_ratio(t_squash *x, t_floatarg f);
+void squash_nmult(t_squash *x, t_floatarg f);
+void squash_mute(t_squash *x, t_floatarg f);
+void squash_free(t_squash *x);
+void squash_dsp(t_squash *x, t_signal **sp);
+void overlapadd( float *I, int N, float *W, float *O, int Nw, int n );
+void makehanning( float *H, float *A, float *S, int Nw, int N, int I, int odd );
+void makehamming( float *H, float *A, float *S, int Nw, int N, int I, int odd );
+void fold( float *I, float *W, int Nw, float *O, int N, int n );
+void makewindows( float *H, float *A, float *S, int Nw, int N, int I );
+/*
+void squash_perform64(t_squash *x, t_object *dsp64, double **ins, 
+                      long numins, double **outs,long numouts, long n,
+                      long flags, void *userparam);
+void squash_dsp64(t_squash *x, t_object *dsp64, short *count, double sr, long n, long flags);
+*/
+/*
+int main(void)
+{
+	t_class *c;
+	c = class_new("el.squash~", (method)squash_new, (method)squash_free, sizeof(t_squash), 0,A_GIMME,0);
+	
+    class_addmethod(c, (method)squash_dsp64, "dsp64", A_CANT, 0);
+	class_addmethod(c, (method)squash_assist,"assist",A_CANT,0);
+	class_addmethod(c,(method)squash_thresh, "thresh", A_FLOAT,  0);
+	class_addmethod(c,(method)squash_nt, "nt", A_FLOAT,  0);
+	class_addmethod(c,(method)squash_nmult, "nmult", A_FLOAT,  0);
+	class_addmethod(c,(method)squash_ratio, "ratio", A_FLOAT,  0);
+	class_addmethod(c,(method)squash_mute, "mute", A_FLOAT,  0);
+	class_register(CLASS_BOX, c);
+	squash_class = c;
+	
+	potpourri_announce(OBJECT_NAME);
+	return 0;
+}
+*/
+
+void squash_tilde_setup(void){
+    squash_class = class_new(gensym("squash~"), (t_newmethod)squash_new,
+                          (t_method)squash_free, sizeof(t_squash),0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(squash_class, t_squash, x_f);
+    class_addmethod(squash_class, (t_method)squash_dsp, gensym("dsp"),0);
+	class_addmethod(squash_class,(t_method)squash_thresh, gensym("thresh"), A_FLOAT,  0);
+	class_addmethod(squash_class,(t_method)squash_nt, gensym("nt"), A_FLOAT,  0);
+	class_addmethod(squash_class,(t_method)squash_nmult, gensym("nmult"), A_FLOAT,  0);
+	class_addmethod(squash_class,(t_method)squash_ratio, gensym("ratio"), A_FLOAT,  0);
+	class_addmethod(squash_class,(t_method)squash_mute, gensym("mute"), A_FLOAT,  0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+void *squash_new(t_symbol *msg, short argc, t_atom *argv)
+{
+    
+    t_squash *x = (t_squash *)pd_new(squash_class);
+	outlet_new(&x->x_obj, gensym("signal"));
+	
+	x->D = sys_getblksize();
+	x->N = x->D * 4;
+	x->Nw = x->N;
+	x->N2 = x->N / 2;
+	x->incnt = - x->Nw;
+	x->Wanal = (float *) calloc(x->Nw,sizeof(float));
+	x->Wsyn = (float *) calloc(x->Nw, sizeof(float));
+	x->Hwin = (float *) calloc(x->Nw, sizeof(float));
+	x->input = (float *) calloc(x->Nw, sizeof(float));
+	x->output = (float *) calloc(x->Nw, sizeof(float));
+	x->buffer = (float *) calloc(x->N, sizeof(float));
+	makehanning(x->Hwin, x->Wanal, x->Wsyn, x->Nw, x->N, x->D, 0);
+	x->thresh = 0.1;
+	x->ratio = 1.;
+	x->nt = .0000001;
+	x->nmult = 0.1;
+	x->mute = 0;
+    return x;
+}
+
+
+void squash_free(t_squash *x)
+{
+    free(x->Wanal);
+    free(x->Wsyn);
+    free(x->Hwin);
+    free(x->input);
+    free(x->output);
+    free(x->buffer);
+}
+
+void makewindows( float *H, float *A, float *S, int Nw, int N, int I )
+
+{
+	int i ;
+	float sum ;
+	
+    for ( i = 0 ; i < Nw ; i++ )
+		H[i] = A[i] = S[i] = 0.54 - 0.46*cos( TWOPI*i/(Nw - 1) ) ;
+	
+    if ( Nw > N ) {
+		float x ;
+		
+		x = -(Nw - 1)/2. ;
+		for ( i = 0 ; i < Nw ; i++, x += 1. )
+			if ( x != 0. ) {
+				A[i] *= N*sin( PI*x/N )/(PI*x) ;
+				if ( I )
+					S[i] *= I*sin( PI*x/I )/(PI*x) ;
+			}
+    }
+	
+    for ( sum = i = 0 ; i < Nw ; i++ )
+		sum += A[i] ;
+	
+    for ( i = 0 ; i < Nw ; i++ ) {
+		float afac = 2./sum ;
+		float sfac = Nw > N ? 1./afac : afac ;
+		A[i] *= afac ;
+		S[i] *= sfac ;
+    }
+	
+    if ( Nw <= N && I ) {
+		for ( sum = i = 0 ; i < Nw ; i += I )
+			sum += S[i]*S[i] ;
+		for ( sum = 1./sum, i = 0 ; i < Nw ; i++ )
+			S[i] *= sum ;
+    }
+}
+
+
+
+
+void makehamming( float *H, float *A, float *S, int Nw, int N, int I, int odd )
+
+{
+	int i;
+	float sum ;
+	
+	
+	
+	if (odd) {
+		for ( i = 0 ; i < Nw ; i++ )
+			H[i] = A[i] = S[i] = sqrt(0.54 - 0.46*cos( TWOPI*i/(Nw - 1) ));
+	}
+	
+	else {
+		
+		for ( i = 0 ; i < Nw ; i++ )
+			H[i] = A[i] = S[i] = 0.54 - 0.46*cos( TWOPI*i/(Nw - 1) );
+		
+	}
+ 	
+    if ( Nw > N ) {
+		float x ;
+		
+		x = -(Nw - 1)/2. ;
+		for ( i = 0 ; i < Nw ; i++, x += 1. )
+			if ( x != 0. ) {
+				A[i] *= N*sin( PI*x/N )/(PI*x) ;
+				if ( I )
+					S[i] *= I*sin( PI*x/I )/(PI*x) ;
+			}
+    }
+    for ( sum = i = 0 ; i < Nw ; i++ )
+		sum += A[i] ;
+	
+    for ( i = 0 ; i < Nw ; i++ ) {
+		float afac = 2./sum ;
+		float sfac = Nw > N ? 1./afac : afac ;
+		A[i] *= afac ;
+		S[i] *= sfac ;
+    }
+	
+    if ( Nw <= N && I ) {
+		for ( sum = i = 0 ; i < Nw ; i += I )
+			sum += S[i]*S[i] ;
+		for ( sum = 1./sum, i = 0 ; i < Nw ; i++ )
+			S[i] *= sum ;
+    }
+}
+
+
+
+void makehanning( float *H, float *A, float *S, int Nw, int N, int I, int odd )
+{
+	int i;
+	float sum ;
+	
+	
+	if (odd) {
+		for ( i = 0 ; i < Nw ; i++ )
+			H[i] = A[i] = S[i] = sqrt(0.5 * (1. + cos(PI + TWOPI * i / (Nw - 1))));
+	}
+	
+	else {
+		
+		for ( i = 0 ; i < Nw ; i++ )
+			H[i] = A[i] = S[i] = 0.5 * (1. + cos(PI + TWOPI * i / (Nw - 1)));
+		
+	}
+ 	
+    if ( Nw > N ) {
+		float x ;
+		
+		x = -(Nw - 1)/2. ;
+		for ( i = 0 ; i < Nw ; i++, x += 1. )
+			if ( x != 0. ) {
+				A[i] *= N*sin( PI*x/N )/(PI*x) ;
+				if ( I )
+					S[i] *= I*sin( PI*x/I )/(PI*x) ;
+			}
+    }
+    for ( sum = i = 0 ; i < Nw ; i++ )
+		sum += A[i] ;
+	
+    for ( i = 0 ; i < Nw ; i++ ) {
+		float afac = 2./sum ;
+		float sfac = Nw > N ? 1./afac : afac ;
+		A[i] *= afac ;
+		S[i] *= sfac ;
+    }
+	
+    if ( Nw <= N && I ) {
+		for ( sum = i = 0 ; i < Nw ; i += I )
+			sum += S[i]*S[i] ;
+		for ( sum = 1./sum, i = 0 ; i < Nw ; i++ )
+			S[i] *= sum ;
+    }
+}
+
+void fold( float *I, float *W, int Nw, float *O, int N, int n )
+
+{
+	
+    int i;
+	
+    for ( i = 0; i < N; i++ )
+		O[i] = 0.;
+	
+    while ( n < 0 )
+      	n += N;
+    n %= N;
+    for ( i = 0; i < Nw; i++ ) {
+		O[n] += I[i]*W[i];
+      	if ( ++n == N )
+			n = 0;
+    }
+}
+
+void overlapadd( float *I, int N, float *W, float *O, int Nw, int n )
+
+{
+	int i ;
+    while ( n < 0 )
+		n += N ;
+    n %= N ;
+    for ( i = 0 ; i < Nw ; i++ ) {
+		O[i] += I[n]*W[i] ;
+		if ( ++n == N )
+			n = 0 ;
+    }
+}
+
+
+void squash_mute(t_squash *x, t_floatarg f){
+  x->mute = (short)f;
+}
+
+void squash_thresh(t_squash *x, t_floatarg f){
+  x->thresh = (float)f;
+}
+
+void squash_nt(t_squash *x, t_floatarg f){
+  x->nt = (float)f;
+}
+
+void squash_ratio(t_squash *x, t_floatarg f){
+  x->ratio = (float)f;
+}
+
+void squash_nmult(t_squash *x, t_floatarg f){
+  x->nmult = (float)f;
+}
+
+t_int *squash_perform(t_int *w)
+{
+	t_squash *x = (t_squash *) (w[1]);
+	float *in = (t_float *)(w[2]);
+	float *out = (t_float *)(w[3]);
+	int n = (int) w[4];
+	
+	int j;
+	float *input = x->input;
+	float *output = x->output;
+	int D = x->D;
+	int Nw = x->Nw;
+	int N = x->N;
+	float *buffer = x->buffer;
+	float *Wanal = x->Wanal;
+	float *Wsyn = x->Wsyn;	
+	float thresh = x->thresh;
+	float ratio = x->ratio;
+	float nt = x->nt;
+	float nmult = x->nmult;
+	
+	if(x->mute){
+		memset((void *)out, 0, n * sizeof(float) );
+		return w + 5;
+	}
+	
+	x->incnt += D;
+	
+    for ( j = 0 ; j < Nw - D ; j++ )
+		input[j] = input[j+D];
+	
+    for ( j = Nw-D; j < Nw; j++ ) {
+		input[j] = *in++;
+    }
+	fold( input, Wanal, Nw, buffer, N, x->incnt );
+	squash_squat( buffer, thresh, ratio, nt, nmult, Nw );
+	overlapadd( buffer, N, Wsyn, output, Nw, x->incnt );
+	
+    for ( j = 0; j < D; j++ )
+      *out++ = output[j];
+
+    for ( j = 0; j < Nw - D; j++ )
+      output[j] = output[j+D];
+			
+    for ( j = Nw - D; j < Nw; j++ )
+      output[j] = 0.;	
+
+	x->incnt = x->incnt % Nw;
+	return w + 5;
+}
+
+/*
+void squash_dsp64(t_squash *x, t_object *dsp64, short *count, double sr, long n, long flags)
+{
+    if(!sr)
+        return;
+    if(n != x->D ){
+        x->D = n;
+        error("squash~: blocksize change not implemented yet!");
+    }
+
+    object_method(dsp64, gensym("dsp_add64"),x,squash_perform64,0,NULL);
+}
+*/
+
+void squash_dsp(t_squash *x, t_signal **sp)
+{
+    if(sp[0]->s_n != x->D ){
+        x->D = sp[0]->s_n;
+        error("blocksize change not implemented yet!");
+    } else {
+        dsp_add(squash_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
+    }
+}
+
+#define DIAG 0
+
+/*  compression/expansion routine! */ 
+	
+double squash_squat( float *buffer, float thresh, float ratio, float nt, float nmult, int N )
+{
+  register int		i;
+  double 		rms = 0.;
+  float		dbthr;
+  register float 	mult;
+
+    dbthr = 10. * log10(thresh);
+
+
+  for ( i=0; i < N; i++ )
+    rms += ( *(buffer+i) * *(buffer+i) );
+
+  rms = sqrt(rms/(float)N);
+  if (rms < nt && ratio < 1.)
+    mult = nmult;
+  else
+    mult = pow( 10., (( dbthr - (( dbthr - (10. * log10(rms)) ) * ratio) ) / 10.) ) / rms;
+
+  if (DIAG) {
+    if (rms <= thresh)
+      fprintf(stderr,"below  dbthr: %f  dbrms: %f rms: %f  mult: %f\n", dbthr, (10. * log10(rms)), rms, mult);
+    else
+      fprintf(stderr,"above  dbthr: %f  dbrms: %f rms: %f  mult: %f\n", dbthr, (10. * log10(rms)), rms, mult);
+  }
+
+  for ( i=0; i < N; i++ )
+    *(buffer+i) *= mult;
+
+  return rms;
+}
+
+
diff --git a/externals/lyonpotpourri/stutter~-help.pd b/externals/lyonpotpourri/stutter~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..aacd4e093e50d5883650b7f287991be2cda6c200
--- /dev/null
+++ b/externals/lyonpotpourri/stutter~-help.pd
@@ -0,0 +1,124 @@
+#N canvas 173 944 422 326 10;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array sound1 62079 float 2;
+#X coords 0 1 62079 -1 100 70 1;
+#X restore 19 101 graph;
+#X obj 27 278 dac~;
+#N canvas 1642 1031 502 352 messages 0;
+#X obj 22 122 s stutter.messages;
+#X text 20 15 extrema for echo count;
+#X text 23 148 extrema for loop duration;
+#N canvas 586 175 450 300 pattern-storage 0;
+#X obj 29 46 s stutter.messages;
+#X msg 29 13 show_loop;
+#X text 118 15 print current loop;
+#X text 169 83 setloop (start sample \, sample duration);
+#X obj 26 113 s stutter.messages;
+#X msg 26 79 set_loop 6951 3000;
+#X obj 30 187 s stutter.messages;
+#X msg 30 153 store_loop 1;
+#X obj 25 249 s stutter.messages;
+#X msg 25 215 recall_loop 1;
+#X text 128 213 recall loop 1;
+#X text 127 154 store current loop in location 1;
+#X text 25 277 you can store up to 1024 different loops in locations
+0-1023;
+#X connect 1 0 0 0;
+#X connect 5 0 4 0;
+#X connect 7 0 6 0;
+#X connect 9 0 8 0;
+#X restore 313 149 pd pattern-storage;
+#X obj 43 257 s stutter.messages;
+#X obj 43 199 unpack f f;
+#X msg 45 172 90 40;
+#X msg 108 172 1000 200;
+#X msg 43 226 max_looptime \$1;
+#X msg 172 226 min_looptime \$1;
+#X text 176 173 order: max \, min;
+#X obj 320 112 s stutter.messages;
+#X msg 320 55 lockme \$1;
+#X obj 320 27 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#N canvas 564 177 450 300 refinements 0;
+#X obj 43 257 s stutter.messages;
+#X msg 93 232 taper 5;
+#X msg 43 200 taper 50;
+#X text 111 199 softer envelope;
+#X text 153 235 harder envelope;
+#X text 44 183 taper duration in ms.;
+#X obj 30 101 s stutter.messages;
+#X msg 30 75 randomize_dur \$1;
+#X floatatom 30 51 5 0 0 0 - - -, f 5;
+#X obj 33 26 hsl 128 15 0 0.2 0 0 empty empty empty -2 -8 0 10 -129795
+-1 -1 0 1;
+#X obj 193 104 s stutter.messages;
+#X floatatom 193 54 5 0 0 0 - - -, f 5;
+#X obj 196 29 hsl 128 15 0 0.2 0 0 empty empty empty -2 -8 0 10 -129795
+-1 -1 0 1;
+#X msg 193 77 randomize_start \$1;
+#X text 25 7 random loop deviations;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 7 0 6 0;
+#X connect 8 0 7 0;
+#X connect 9 0 8 0;
+#X connect 11 0 13 0;
+#X connect 12 0 11 0;
+#X connect 13 0 10 0;
+#X restore 313 179 pd refinements;
+#X msg 328 76 new_loop;
+#X text 340 29 lock current loop;
+#X text 392 76 force new;
+#X msg 22 58 minmax_echo 2 4;
+#X msg 75 87 minmax_echo 5 20;
+#X msg 190 89 minmax_echo 1 2;
+#X msg 153 38 min_echo 1;
+#X msg 172 61 max_echo 2;
+#X connect 5 0 8 0;
+#X connect 5 1 9 0;
+#X connect 6 0 5 0;
+#X connect 7 0 5 0;
+#X connect 8 0 4 0;
+#X connect 9 0 4 0;
+#X connect 12 0 11 0;
+#X connect 13 0 12 0;
+#X connect 15 0 11 0;
+#X connect 18 0 0 0;
+#X connect 19 0 0 0;
+#X connect 20 0 0 0;
+#X connect 21 0 0 0;
+#X connect 22 0 0 0;
+#X restore 131 126 pd messages;
+#X text 126 100 use a fairly long and varied sound here;
+#N canvas 9 465 466 316 load-soundfile 0;
+#X obj 31 177 soundfiler;
+#X msg 30 103 bang;
+#X obj 30 129 openpanel;
+#X msg 30 151 read -resize \$1 sound1;
+#X obj 11 57 loadbang;
+#X obj 105 40 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X msg 10 82 read -resize examples/voice.wav sound1;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 0 0;
+#X connect 4 0 6 0;
+#X connect 5 0 6 0;
+#X connect 6 0 0 0;
+#X restore 129 82 pd load-soundfile;
+#X obj 27 253 *~ 0.1;
+#X obj 88 252 hsl 100 14 0 0.5 0 0 stutter.demo.gain empty empty -2
+-8 0 10 -174016 -1 -1 8400 1;
+#X obj 5 10 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 218 127 <- open this for more info;
+#X text 194 254 set master gain;
+#X floatatom 66 232 5 0 0 0 - stutter.demo.gain -, f 5;
+#X obj 27 209 stutter~ sound1 500 1000 30;
+#X obj 27 184 r stutter.messages;
+#X text 6 42 stutter~ - stutter-play an array;
+#X connect 5 0 1 0;
+#X connect 5 0 1 1;
+#X connect 10 0 5 1;
+#X connect 11 0 5 0;
+#X connect 12 0 11 0;
diff --git a/externals/lyonpotpourri/stutter~.c b/externals/lyonpotpourri/stutter~.c
new file mode 100755
index 0000000000000000000000000000000000000000..b65651589aa70c6f026d8a6a3c220afe9962801e
--- /dev/null
+++ b/externals/lyonpotpourri/stutter~.c
@@ -0,0 +1,531 @@
+#include "MSPd.h"
+
+static t_class *stutter_class;
+long rand_state = 0 ;
+
+#define OBJECT_NAME "stutter~"
+
+// REALLY MESSED UP - need to figure out 64-bit and may need to start from scratch
+
+/* still needs implementation for mono. Also update to use rand() function.
+ Also free memory function. Change from pre-inc/dec to normal form.
+ 
+ Obviously this is a legacy external. Chopper probably does everything stutter does
+ only better.
+ */
+
+typedef struct _stutter
+	{
+		t_object x_obj;
+		t_float x_f;
+		t_symbol *l_sym;
+		t_symbol *bufname;
+		t_garray *theBuffer;
+		t_garray *l_buf;
+		long l_chan;
+		///
+		int loop_samps;
+		int samps_to_go ;
+		int loop_start;
+		int echos;
+		int min_echo;
+		int max_echo;
+		int b_index;
+		//
+		int taper_samps;
+		t_float taper_dur;
+		int loop_min_samps;
+		int loop_max_samps;
+		t_float loop_min_duration;
+		t_float loop_max_duration;
+		t_float taper_duration;
+		t_float R;
+		t_float ldev;
+		t_float st_dev;
+		int lock_loop;
+		int new_loop_loop;
+		t_float buffer_duration;
+		int framesize;
+		int bufchans;
+		short verbose;
+		short mute_me;
+		int *stored_starts;
+		int *stored_samps;
+		long b_valid;
+		//float *b_samples;
+        t_word *b_samples;
+		long b_frames;
+	} t_stutter;
+
+t_int *stutter_perform(t_int *w);
+
+void stutter_dsp(t_stutter *x, t_signal **sp);
+void *stutter_new(t_symbol *msg, short argc, t_atom *argv);
+void stutter_in1(t_stutter *x, long n);
+void stutter_min_looptime(t_stutter *x, t_floatarg n);
+void stutter_max_looptime(t_stutter *x, t_floatarg n);
+void stutter_randomize_start(t_stutter *x, t_floatarg n);
+void stutter_randomize_dur(t_stutter *x, t_floatarg n);
+void stutter_lockme(t_stutter *x, t_floatarg n);
+void stutter_new_loop(t_stutter *x);
+
+void stutter_assist(t_stutter *x, void *b, long m, long a, char *s);
+void stutter_dblclick(t_stutter *x);
+void stutter_verbose(t_stutter *x, t_floatarg t);
+void stutter_mute(t_stutter *x, t_floatarg t);
+void stutter_show_loop(t_stutter *x);
+void stutter_set_loop(t_stutter *x, t_symbol *msg, short argc, t_atom *argv);
+void stutter_store_loop(t_stutter *x, t_floatarg loop_b_index);
+void stutter_recall_loop(t_stutter *x,  t_floatarg loop_b_index);
+void stutter_taper(t_stutter *x,  t_floatarg f);
+void stutter_min_echo(t_stutter *x,  t_floatarg f);
+void stutter_max_echo(t_stutter *x,  t_floatarg f);
+void stutter_minmax_echo(t_stutter *x,  t_floatarg minf, t_floatarg maxf);
+float boundrand(float min, float max);
+void stutter_init(t_stutter *x,short initialized);
+void stutter_info(t_stutter *x);
+void stutter_version(t_stutter *x);
+void stutter_setarray(t_stutter *x);
+float erand(void);
+
+t_symbol *ps_buffer;
+
+void stutter_tilde_setup(void){
+	stutter_class = class_new(gensym("stutter~"), (t_newmethod)stutter_new, 
+								NO_FREE_FUNCTION,sizeof(t_stutter), 0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(stutter_class, t_stutter, x_f);
+	class_addmethod(stutter_class,(t_method)stutter_dsp,gensym("dsp"),0);
+	class_addmethod(stutter_class,(t_method)stutter_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(stutter_class,(t_method)stutter_show_loop,gensym("show_loop"),0);
+	class_addmethod(stutter_class,(t_method)stutter_set_loop,gensym("set_loop"),A_GIMME,0);
+	class_addmethod(stutter_class,(t_method)stutter_store_loop,gensym("store_loop"),A_FLOAT,0);
+	class_addmethod(stutter_class,(t_method)stutter_recall_loop,gensym("recall_loop"),A_FLOAT,0);
+	class_addmethod(stutter_class,(t_method)stutter_taper,gensym("taper"),A_FLOAT,0);
+	class_addmethod(stutter_class,(t_method)stutter_min_echo,gensym("min_echo"),A_FLOAT,0);
+	class_addmethod(stutter_class,(t_method)stutter_max_echo,gensym("max_echo"),A_FLOAT,0);
+    class_addmethod(stutter_class,(t_method)stutter_minmax_echo,gensym("minmax_echo"),A_FLOAT,A_FLOAT,0);
+	class_addmethod(stutter_class,(t_method)stutter_min_looptime,gensym("min_looptime"),A_FLOAT,0);
+	class_addmethod(stutter_class,(t_method)stutter_max_looptime,gensym("max_looptime"),A_FLOAT,0);
+	class_addmethod(stutter_class,(t_method)stutter_lockme,gensym("lockme"),A_FLOAT,0);
+	class_addmethod(stutter_class,(t_method)stutter_new_loop,gensym("new_loop"),0);
+	class_addmethod(stutter_class,(t_method)stutter_randomize_dur,gensym("randomize_dur"),A_FLOAT,0);
+	class_addmethod(stutter_class,(t_method)stutter_randomize_start,gensym("randomize_start"),A_FLOAT,0);
+	ps_buffer = gensym("buffer~");
+	potpourri_announce(OBJECT_NAME);
+}
+
+void stutter_mute(t_stutter *x, t_floatarg tog)
+{
+	x->mute_me = (int)tog;
+}
+
+void stutter_verbose(t_stutter *x, t_floatarg tog)
+{
+	x->verbose = (int)tog;
+}
+
+
+void stutter_setarray(t_stutter *x)
+{
+	t_garray *b;
+	t_symbol *bufname = x->bufname;
+	int frames;
+	
+	if (!(b = (t_garray *)pd_findbyclass(bufname, garray_class)))
+    {
+		if (*bufname->s_name) pd_error(x, "stutter~: %s: no such array",
+										bufname->s_name);
+		x->b_valid = 0;
+    }
+	else if (!garray_getfloatwords(b, &frames, &x->b_samples))
+    {
+		pd_error(x, "%s: bad template for stutter~", bufname->s_name);
+		x->b_samples = 0;
+		x->b_valid = 1;
+    }
+	else  {
+		x->b_frames = frames;
+		x->b_valid = 1;
+		x->theBuffer = b;
+		garray_usedindsp(b);
+	}
+        //if(! x->b_valid ){
+        //    post("stutter~ got invalid buffer");
+        //}
+}
+
+t_int *stutter_perform(t_int *w)
+{
+	t_stutter *x = (t_stutter *)(w[1]);
+	t_float *out1 = (t_float *)(w[2]);
+	int n = (int) w[3];
+	long b_frames = x->b_frames;
+	int next_pointer = 4;
+	t_word *tab;
+    t_float theSample;
+	long b_index;
+	int loop_start, samps_to_go, echos, loop_samps, taper_samps;
+	int loop_max_samps, loop_min_samps;
+	int lock_loop;
+	t_float sdev, ldev, startdev, st_dev;
+	
+	stutter_setarray(x);
+    
+	if(x->mute_me || ! x->b_valid) {
+		while( n-- ) {
+			*out1++ = 0.0;
+		}
+		return w+next_pointer;
+	} else {
+		
+		tab = x->b_samples;
+		b_frames = x->b_frames;
+		b_index = x->b_index;
+		loop_start = x->loop_start;
+		loop_samps = x->loop_samps;
+		samps_to_go = x->samps_to_go;
+		echos = x->echos;
+		taper_samps = x->taper_samps ;
+		loop_max_samps = x->loop_max_samps;
+		loop_min_samps = x->loop_min_samps;
+		ldev = x->ldev;
+		lock_loop = x->lock_loop;
+		st_dev = x->st_dev;
+		
+		if( x->framesize != b_frames ) {
+			x->framesize = b_frames;
+			x->buffer_duration = (float)  b_frames / (float) x->R ;
+		}	
+		
+		while( n-- ) {
+			if( b_index < 0 ){
+				b_index = 0;
+			} else if( b_index > b_frames - 1) {
+				b_index = 0;
+			}
+			theSample = tab[ b_index ].w_float;
+			if( samps_to_go > loop_samps - taper_samps ){
+				*out1++ = theSample * ( (float)(loop_samps - samps_to_go)/(float)taper_samps );
+				++b_index;
+			} else if( samps_to_go < taper_samps ) {
+				*out1++ = theSample * ( (float)(samps_to_go)/(float)taper_samps );
+				++b_index;
+				
+			} else {
+				*out1++ = theSample;
+				++b_index;
+			}
+			if( ! --samps_to_go ){
+				b_index = loop_start ;
+				sdev = ldev * loop_samps ;
+				if( erand() < .5 ){
+					sdev = -sdev;
+				}
+				if(  ( --echos <= 0 ) && ( ! lock_loop ) ) {
+					echos = (int)boundrand((float)x->min_echo,(float)x->max_echo);
+					samps_to_go = loop_samps = 
+					loop_min_samps + ( erand() * (float)(loop_max_samps-loop_min_samps) ) ;
+					loop_start = erand() * (b_frames - loop_samps) ;
+				} else {
+					loop_samps += sdev;
+					
+					if( loop_samps < loop_min_samps ){
+						loop_samps = loop_min_samps;
+					} else if( loop_samps > loop_max_samps ) {
+						loop_samps = loop_max_samps;
+					}
+					samps_to_go = loop_samps;
+					if( st_dev ) {
+						startdev = erand() * st_dev * (t_float) loop_samps;
+						if( erand() < .5 ){
+							startdev = -startdev;
+						}
+						loop_start += startdev ;
+						if( loop_start < 0 ) {
+							loop_start = 0 ;
+						} else if ( loop_start + loop_samps > b_frames) {
+							loop_start = b_frames - loop_samps;
+						}
+					}
+					if( loop_start + loop_samps >= b_frames ){
+						loop_start = (b_frames - loop_samps) - 1;
+					}
+					
+				}
+			}
+		}
+		x->b_index = b_index;
+		x->loop_start = loop_start;
+		x->loop_samps = loop_samps;
+		x->samps_to_go = samps_to_go;
+		x->echos = echos;
+		return w + next_pointer;
+	}
+}
+
+float erand(void) {
+	static int im = 6075 ;
+	static int ia = 106 ;
+	static int ic = 1283 ;
+	rand_state = (rand_state * ia +  ic) % im ;
+	return ( (float) rand_state / (float) im );
+}
+
+void stutter_info(t_stutter *x)
+{
+	post("there are %d frames in this buffer. Duration is %f.",x->b_frames, x->buffer_duration);
+}
+
+void stutter_new_loop(t_stutter *x)
+{
+	x->echos = (int)boundrand((float)x->min_echo,(float)x->max_echo);
+	x->samps_to_go = x->loop_samps = boundrand((float)x->loop_min_samps,(float)x->loop_max_samps);
+	x->loop_start = boundrand(0.0,1.0) * (x->framesize - x->loop_samps) ;
+}
+
+void stutter_show_loop(t_stutter *x)
+{
+	post("start %d samps %d", x->loop_start, x->loop_samps);
+}
+
+void stutter_store_loop(t_stutter *x, t_floatarg loop_b_index)
+{
+	int i = loop_b_index;
+	x->stored_starts[i] = x->loop_start;
+	x->stored_samps[i] = x->loop_samps;
+	// post("loop stored at position %d", i);
+}
+
+void stutter_recall_loop(t_stutter *x, t_floatarg loop_b_index)
+{
+	// bug warning: recall preceding store will crash program
+	// need to add warning
+	int i = loop_b_index;
+	
+	if(!x->stored_samps[i]){
+		error("no loop stored at position %d!", i);
+		return;
+	}
+	x->loop_start = x->stored_starts[ i ];
+	x->samps_to_go = x->loop_samps = x->stored_samps[ i ];
+	if( x->loop_min_samps > x->loop_samps )
+		x->loop_min_samps = x->loop_samps ;
+	if( x->loop_max_samps < x->loop_samps )
+		x->loop_max_samps = x->loop_samps ;
+	// post("loop recalled from position %d", i);
+}
+
+
+void stutter_set_loop(t_stutter *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	float temp;
+	atom_arg_getfloat(&temp, 0, argc, argv);
+	x->loop_start = temp;
+	atom_arg_getfloat(&temp, 0, argc, argv);
+	x->loop_samps = temp;
+	//	post("loop set to: %d %d", x->loop_start, x->loop_samps);
+}
+
+void stutter_lockme(t_stutter *x, t_floatarg f)
+{
+    int n = (int) f;
+	if( n > 0 ) {
+		x->lock_loop = 1;
+	} else {
+		x->lock_loop = 0;
+	}
+}
+//set min time for loop
+void stutter_min_looptime(t_stutter *x, t_floatarg n)
+{
+	n /= 1000.0;
+	
+	if( n < .0001 ){
+		n = .0001;
+	}
+	x->loop_min_samps = x->R * n ;
+	if( x->loop_min_samps >= x->loop_max_samps ){
+		x->loop_min_samps = x->loop_max_samps - 1;
+	}
+	
+}
+
+// set deviation factor
+void stutter_randomize_dur(t_stutter *x, t_floatarg n)
+{
+	
+	if( n < 0 )
+		n = 0;
+	if( n > 1 )
+		n = 1.;
+	x->ldev = n;
+}
+void stutter_randomize_start(t_stutter *x, t_floatarg n)
+{
+	
+	if( n < 0 )
+		n = 0;
+	if( n > 1 )
+		n = 1.;
+	x->st_dev = n;
+}
+
+// set max time for loop
+void stutter_max_looptime(t_stutter *x, t_floatarg n)
+{
+	n /= 1000.0;
+	
+	if( x->buffer_duration > 0.0 ) {
+		if( n >= x->buffer_duration * .49) {
+			n = x->buffer_duration * .49 ;
+		}
+	}
+	x->loop_max_samps = x->R * n ;
+	if( x->loop_max_samps <= x->loop_min_samps ){
+		x->loop_max_samps = x->loop_min_samps + 1;
+	}
+}
+
+
+
+
+void *stutter_new(t_symbol *msg, short argc, t_atom *argv)
+{
+	t_stutter *x = (t_stutter *)pd_new(stutter_class);
+	outlet_new(&x->x_obj, gensym("signal"));
+
+	srand(time(0));
+	
+	if(argc<1){
+		post("stutter~: warning: no array name given (defaulting to "
+                     "empty symbol)");
+	}
+	x->bufchans = 1;
+	x->bufname = atom_getsymbolarg(0,argc,argv);
+	x->loop_min_duration = atom_getintarg(1,argc,argv)/1000.0;
+	x->loop_max_duration = atom_getintarg(2,argc,argv)/1000.0;
+	x->taper_duration = atom_getintarg(3,argc,argv)/1000.0;
+	
+	if(!x->loop_min_duration)
+		x->loop_min_duration = .02;
+	if(!x->loop_max_duration)
+		x->loop_max_duration = 0.2;
+	if(!x->taper_duration)
+		x->taper_duration = .002;
+	
+	x->R = sys_getsr();
+	if(!x->R)
+		x->R = 44100.0;
+	stutter_init(x,0);
+	return x;
+}
+
+float boundrand(float min, float max)
+{
+	return min + (max-min) * ((float)rand()/RAND_MAX);
+}
+
+void stutter_taper(t_stutter *x,  t_floatarg f)
+{
+	f *= .001;
+	if(f>0){
+		x->taper_duration = f;
+		x->taper_samps = x->R * x->taper_duration;
+	}
+}
+
+void stutter_min_echo(t_stutter *x,  t_floatarg f)
+{
+	int ec = (int)f;
+	if(ec>0 && ec < x->max_echo){
+		x->min_echo = ec;
+	} else {
+		error("min echo must be less than max echo, and greater than zero");
+	}
+}
+void stutter_max_echo(t_stutter *x,  t_floatarg f)
+{
+	int ec = (int)f;
+	
+	if(ec > x->min_echo){
+		x->max_echo = ec;
+	} else {
+		error("max echo must be greater than min echo");
+	}
+}
+
+void stutter_minmax_echo(t_stutter *x,  t_floatarg minf, t_floatarg maxf)
+{
+    int minec = (int)minf;
+    int maxec = (int)maxf;
+    
+    if( minec < maxec){
+        x->min_echo = minec;
+        x->max_echo - maxec;
+    }
+    else {
+        error("bad inputs to minmax_echo");
+    }
+}
+
+
+void stutter_init(t_stutter *x,short initialized)
+{
+	int i;
+	
+	if(!initialized){
+		x->loop_min_samps = x->loop_min_duration * (float)x->R;
+		x->loop_max_samps = x->loop_max_duration * (float)x->R;
+		x->samps_to_go = x->loop_samps = x->loop_min_samps + 
+		(erand() * (float)(x->loop_max_samps-x->loop_min_samps) ) ;
+		
+		x->loop_start = 0;
+		x->min_echo = 2;
+		x->max_echo = 12;
+		x->echos = (int) boundrand((float)x->min_echo,(float)x->max_echo);
+		x->b_index = x->loop_start ;
+		x->samps_to_go = x->loop_samps;
+		x->taper_samps = x->R * x->taper_duration;
+		x->ldev = 0;
+		x->lock_loop = 0;
+		x->buffer_duration = 0.0 ;
+		x->st_dev = 0.0;
+		x->framesize = 0;
+		x->new_loop_loop = 0;
+		x->mute_me = 0;
+		x->verbose = 0;
+		x->stored_starts = t_getbytes(1024 * sizeof(int));
+		x->stored_samps = t_getbytes(1024 * sizeof(int));
+		for(i = 0; i < 1024; i++){
+			x->stored_samps[i] = 0;
+		}
+	} else {
+		x->loop_min_samps = x->loop_min_duration * (float)x->R;
+		x->loop_max_samps = x->loop_max_duration * (float)x->R;
+		x->samps_to_go = x->loop_samps = x->loop_min_samps + 
+		(erand() * (float)(x->loop_max_samps - x->loop_min_samps)) ;
+		x->loop_start = 0;
+		x->b_index = x->loop_start;
+		x->samps_to_go = x->loop_samps;
+		x->taper_samps = x->R * x->taper_duration;
+		x->ldev = 0;
+		x->lock_loop = 0;
+		x->buffer_duration = 0.0 ;
+		x->st_dev = 0.0;
+		x->framesize = 0;
+		x->new_loop_loop = 0;
+	}
+}
+void stutter_dsp(t_stutter *x, t_signal **sp)
+{
+    stutter_setarray(x);
+
+	if(x->R != sp[0]->s_sr){
+		x->R = sp[0]->s_sr;
+		x->taper_samps = x->R * x->taper_duration;
+		x->loop_min_samps = .02 * (t_float)x->R;
+		x->loop_max_samps = .2 * (t_float) x->R;
+	}
+	dsp_add(stutter_perform, 3, x, sp[0]->s_vec, sp[0]->s_n);
+}
+
diff --git a/externals/lyonpotpourri/ugens.h b/externals/lyonpotpourri/ugens.h
new file mode 100755
index 0000000000000000000000000000000000000000..6bccc5f7eb32761d4b8249ff98d3eebd83bb4f1e
--- /dev/null
+++ b/externals/lyonpotpourri/ugens.h
@@ -0,0 +1,57 @@
+/* THIS IS A TOTALLY HACKED HEADER - NO LONGER ANY GOOD FOR CMIX */
+
+#define MAXSECTS 20
+#define RESON_NO_SCL (0.)
+#define START 3
+#define STARTM1 2 /* for start of comb memory in a array */
+#define NCOMBS  6 /* for reverb */
+#define NALPASSES 2 /* for reverb */
+
+typedef struct {
+  float ps0;
+  float ps1;
+  float ps2;
+  float ps3;
+  float c0;
+  float c1;
+  float c2;
+  float c3;
+} LSTRUCT ;
+
+typedef struct {
+  int len;
+  float *func;
+  float amp;
+  float phs;
+  float si;
+} CMIXOSC ;
+
+typedef struct {
+  float *arr;
+  float lpt;
+  float rvbt;
+  int len;
+  int status;
+} CMIXCOMB ;
+
+typedef struct {
+  float cf;
+  float bw;
+  float scl;
+  float q[5];
+} CMIXRESON ;
+
+typedef struct {
+  float a;
+  float d;
+  float s;
+  float r;
+  float v1;
+  float v2;
+  float v3;
+  float v4;
+  float v5;
+  float *func;
+  int len;
+} CMIXADSR ;
+
diff --git a/externals/lyonpotpourri/unconvert.c b/externals/lyonpotpourri/unconvert.c
new file mode 100755
index 0000000000000000000000000000000000000000..85392dd7196c1a8ccedc82e796932c8b666528a0
--- /dev/null
+++ b/externals/lyonpotpourri/unconvert.c
@@ -0,0 +1,34 @@
+#include "fftease.h"
+
+
+
+void unconvert( float *C, float *S, int N2, float *lastphase, float fundamental, float factor )
+
+{
+  int 		i,
+		real,
+		imag,
+		amp,
+		freq;
+  float 	mag,
+		phase;
+double sin(), cos();
+
+    for ( i = 0; i <= N2; i++ ) {
+
+	imag = freq = ( real = amp = i<<1 ) + 1;
+
+	if ( i == N2 )
+	  real = 1;
+
+	mag = C[amp];
+	lastphase[i] += C[freq] - i*fundamental;
+	phase = lastphase[i]*factor;
+	S[real] = mag*cos( phase );
+
+	if ( i != N2 )
+	  S[imag] = -mag*sin( phase );
+
+    }
+
+}
diff --git a/externals/lyonpotpourri/vdb~-help.pd b/externals/lyonpotpourri/vdb~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..4bb6ee545c832cb7dd1d6ff438a753a3424d1011
--- /dev/null
+++ b/externals/lyonpotpourri/vdb~-help.pd
@@ -0,0 +1,106 @@
+#N canvas 848 86 446 275 10;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array vdb-delay-line 88200 float 2;
+#X coords 0 1 88200 -1 100 70 1;
+#X restore 339 73 graph;
+#X obj 20 179 *~ 0.1;
+#X obj 20 214 dac~;
+#X obj 36 97 r vdb-msgs;
+#N canvas 0 22 454 304 input-sound 0;
+#X obj 53 162 *~;
+#X msg 111 53 tempo \$1;
+#X floatatom 110 22 5 0 0 0 - - -, f 5;
+#X floatatom 41 71 5 0 0 0 - - -, f 5;
+#X obj 40 107 osc~ 450;
+#X obj 53 240 outlet~;
+#X obj 112 83 samm~ 130 1;
+#X obj 112 114 adsr~ 10 30 500 300 0.5 0.2;
+#X obj 53 201 *~ 0.5;
+#X connect 0 0 8 0;
+#X connect 1 0 6 0;
+#X connect 2 0 1 0;
+#X connect 3 0 4 0;
+#X connect 4 0 0 0;
+#X connect 6 0 7 0;
+#X connect 7 0 0 1;
+#X connect 8 0 5 0;
+#X restore 20 77 pd input-sound;
+#N canvas 138 333 474 324 msgs 0;
+#X obj 15 193 s vdb-msgs;
+#X obj 17 25 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1
+;
+#X msg 16 58 inf_hold \$1;
+#X msg 112 104 maxdelay \$1;
+#X floatatom 112 71 5 1 1000 0 - - -, f 5;
+#X obj 116 36 hsl 70 10 1 1000 0 0 empty empty maximum_delay -2 -8
+1 10 -185881 -1 -1 0 1;
+#X obj 220 102 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+1;
+#X msg 220 76 1;
+#X obj 221 43 loadbang;
+#X msg 221 140 always_update \$1;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 0;
+#X connect 6 0 9 0;
+#X connect 7 0 6 0;
+#X connect 8 0 7 0;
+#X connect 9 0 0 0;
+#X restore 203 197 pd msgs;
+#N canvas 110 371 466 316 delaytime 0;
+#X obj 87 269 outlet~;
+#X obj 309 123 *~ 200;
+#X obj 309 151 +~ 799;
+#X obj 87 230 clean_selector~ 2;
+#X msg 21 131 channel \$1;
+#X obj 22 70 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1
+;
+#X obj 21 19 loadbang;
+#X floatatom 310 64 5 0 0 0 - - -, f 5;
+#X msg 22 45 1;
+#X obj 309 90 osc~ 0.1;
+#X obj 87 196 sig~ 200;
+#X text 45 74 select fixed or changing delay time;
+#X connect 1 0 2 0;
+#X connect 2 0 3 1;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 0;
+#X connect 6 0 8 0;
+#X connect 7 0 9 0;
+#X connect 8 0 5 0;
+#X connect 9 0 1 0;
+#X connect 10 0 3 0;
+#X restore 148 84 pd delaytime;
+#X floatatom 276 90 5 -0.9 0.9 2 feedback vdb-feedback -, f 5;
+#X obj 283 178 hsl 70 10 -0.9 0.9 0 0 vdb-feedback vdb-feedback-in
+feedback_amt -2 -8 1 10 -185881 -1 -1 1300 1;
+#X obj 9 10 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 23 40 vdb~ - a delay line with feedback exposed as garray;
+#X floatatom 50 156 5 0 0 2 gain vdb-gain -, f 5;
+#X obj 283 205 hsl 70 10 0 1 0 0 vdb-gain vdb-gain-in gain -2 -8 1
+10 -185881 -1 -1 1490 1;
+#N canvas 889 561 450 300 initialize 0;
+#X obj 157 81 s vdb-feedback-in;
+#X msg 157 50 0;
+#X obj 156 14 loadbang;
+#X obj 27 53 loadbang;
+#X obj 28 120 s vdb-gain-in;
+#X msg 28 89 0.1;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 5 0;
+#X connect 5 0 4 0;
+#X restore 167 155 pd initialize;
+#X obj 20 122 vdb~ vdb-delay-line 2000 1000 1 0.7 1;
+#X connect 1 0 2 0;
+#X connect 1 0 2 1;
+#X connect 3 0 14 0;
+#X connect 4 0 14 0;
+#X connect 6 0 14 1;
+#X connect 7 0 14 2;
+#X connect 11 0 1 1;
+#X connect 14 0 1 0;
diff --git a/externals/lyonpotpourri/vdb~.c b/externals/lyonpotpourri/vdb~.c
new file mode 100755
index 0000000000000000000000000000000000000000..a891f486cf505f1e21cb0851ac6568be96304042
--- /dev/null
+++ b/externals/lyonpotpourri/vdb~.c
@@ -0,0 +1,519 @@
+#include "MSPd.h"
+
+#define OBJECT_NAME "vdb~"
+
+static t_class *vdb_class;
+
+typedef struct
+{
+	float coef;
+	float cutoff;
+	float x1;
+} t_lpf;
+
+typedef struct {
+	t_word *b_samples;
+	long b_valid;
+	long b_nchans;
+	long b_frames;
+} t_guffer; // stuff we care about from garrays and buffers
+
+
+typedef struct _vdb
+{
+    
+    t_object x_obj;
+    float x_f;
+    
+	float sr;
+	t_lpf lpf;
+	short filter;
+	//
+	float speed;
+	float feedback;
+	float delay_time;
+	float delay_samps;
+	float maxdelay; // maximum delay in seconds (cannot be larger than buffer)
+	long maxdelay_len; // framelength of usable region of buffer
+	long len; // framelength of buffer
+	long phs; // current phase
+	float tap;
+	short *connections;
+	short feedback_protect;
+	short mute;
+	short interpolate;
+	short inf_hold;
+	short always_update;
+	// copy to buffer
+	t_symbol *buffername;
+	t_guffer *delay_buffer;
+	long b_nchans;
+	long b_frames;
+	t_word *b_samples;
+	long b_valid;
+	// interface
+	int inlet_count;
+	int outlet_count;
+	int delay_inlet;
+	int feedback_inlet;
+	short redraw_flag; // pd only for gating redraw function
+	
+} t_vdb;
+
+t_int *vdb_perform(t_int *w);
+
+void vdb_protect(t_vdb *x, t_floatarg state);
+void vdb_inf_hold(t_vdb *x, t_floatarg state);
+void vdb_always_update(t_vdb *x, t_floatarg state);
+void vdb_maxdelay(t_vdb *x, t_floatarg delay);
+void vdb_dsp(t_vdb *x, t_signal **sp);
+void *vdb_new(t_symbol *s, int argc, t_atom *argv);
+void vdb_float(t_vdb *x, t_float f);
+void vdb_mute(t_vdb *x, t_floatarg t);
+void vdb_interpolate(t_vdb *x, t_floatarg t);
+void vdb_show(t_vdb *x);
+void vdb_update_buffer(t_vdb *x);
+void vdb_coef(t_vdb *x, t_floatarg f);
+void vdb_filter(t_vdb *x, t_floatarg t);
+void vdb_init(t_vdb *x,short initialized);
+int vdb_attach_buffer(t_vdb *x);
+void vdb_redraw(t_vdb *x);
+void vdb_redraw_array(t_vdb *x, t_floatarg t);
+void vdb_free(t_vdb *x);
+
+
+void vdb_tilde_setup(void)
+{
+	
+	vdb_class = class_new(gensym("vdb~"),(t_newmethod)vdb_new,(t_method)vdb_free, sizeof(t_vdb), 0, A_GIMME,0);
+	CLASS_MAINSIGNALIN(vdb_class,t_vdb, x_f );
+	class_addmethod(vdb_class,(t_method)vdb_dsp,gensym("dsp"),A_CANT,0);
+	class_addmethod(vdb_class,(t_method)vdb_protect,gensym("protect"),A_FLOAT,0);
+	class_addmethod(vdb_class,(t_method)vdb_inf_hold,gensym("inf_hold"),A_FLOAT,0);
+	class_addmethod(vdb_class,(t_method)vdb_maxdelay,gensym("maxdelay"),A_FLOAT,0);
+	class_addmethod(vdb_class,(t_method)vdb_always_update,gensym("always_update"),A_FLOAT,0);
+	class_addmethod(vdb_class,(t_method)vdb_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(vdb_class,(t_method)vdb_show,gensym("show"),0);
+    //	class_addmethod(vdb_class,(t_method)vdb_update_buffer,gensym("update_buffer"),0);
+	class_addmethod(vdb_class,(t_method)vdb_interpolate,gensym("interpolate"),A_FLOAT,0);
+	class_addmethod(vdb_class,(t_method)vdb_redraw_array,gensym("redraw_array"),A_FLOAT,0);
+	
+	potpourri_announce(OBJECT_NAME);
+}
+
+
+void vdb_maxdelay(t_vdb *x, t_floatarg delay)
+{
+	long newlen;
+	x->maxdelay = 50.0;
+	newlen = delay * .001 * x->sr;
+	if(newlen > x->len){
+		error("%s: requested a max delay that exceeds buffer size",OBJECT_NAME);
+		return;
+	}
+	x->maxdelay_len = newlen;
+	
+}
+
+void vdb_update_buffer(t_vdb *x)
+{
+	vdb_attach_buffer(x);
+}
+
+void vdb_mute(t_vdb *x, t_floatarg t)
+{
+	x->mute = (short)t;
+}
+
+void vdb_always_update(t_vdb *x, t_floatarg state)
+{
+	x->always_update = (short) state;
+}
+
+void vdb_redraw_array(t_vdb *x, t_floatarg t)
+{
+	x->redraw_flag = (short)t;
+}
+
+
+void vdb_inf_hold(t_vdb *x, t_floatarg state)
+{
+	x->inf_hold = (short) state;
+}
+
+void vdb_filter(t_vdb *x, t_floatarg t)
+{
+	x->filter = (short)t;
+}
+
+void vdb_coef(t_vdb *x, t_floatarg f)
+{
+	x->lpf.coef = (float)f;
+}
+
+void vdb_show(t_vdb *x)
+{
+	post("feedback %f delay %f",x->feedback, x->delay_time);
+}
+
+void vdb_interpolate(t_vdb *x, t_floatarg t)
+{
+	x->interpolate = (short)t;
+}
+
+t_int *vdb_perform(t_int *w)
+{
+	// DSP config
+    t_vdb *x = (t_vdb *)(w[1]);
+    int n;
+
+    float fdelay;
+    float insamp; //, insamp2;
+    float outsamp;
+    float frac;
+    t_word *delay_line = x->b_samples;
+
+	int phs = x->phs;
+	long maxdelay_len = x->maxdelay_len;
+
+	float feedback = x->feedback;
+	short *connections = x->connections;
+	float sr = x->sr;
+	short feedback_protect = x->feedback_protect;
+	short interpolate = x->interpolate;
+	short inf_hold = x->inf_hold;
+	float x1,x2;
+	int idelay;
+	int dphs,dphs1,dphs2;
+	long b_nchans = x->b_nchans;
+ 	int delay_inlet = x->delay_inlet;
+ 	int feedback_inlet = x->feedback_inlet;
+	t_int i,j;
+	t_float *input;
+	t_float *output;
+	t_float *delay_vec;
+	t_float *feedback_vec;
+	
+	/**********************/
+	
+    
+    
+	n = (int) w[b_nchans * 2 + 4];
+	
+	if(x->always_update){
+		vdb_attach_buffer(x);
+		maxdelay_len = x->maxdelay_len;
+		phs = x->phs;
+	}
+
+        if( x->mute ) {
+            for(i = 0; i < b_nchans; i++){
+                output = (t_float *) w[4 + b_nchans + i];
+                for(j = 0; j < n; j++){
+                    *output++ = 0.0;
+                }
+            }
+            return (w + b_nchans * 2 + 5);
+        }
+        
+        
+        
+        if(!x->b_valid){
+            for(i = 0; i < b_nchans; i++){
+                output = (t_float *) w[4 + b_nchans + i];
+                for(j = 0; j < n; j++){
+                    *output++ = 0.0;
+                }
+            }
+            return (w + b_nchans * 2 + 5);
+        }
+        
+        fdelay = x->delay_time * .001 * sr;
+        feedback = x->feedback;
+        delay_vec = (t_float *) w[b_nchans + 2];
+        feedback_vec = (t_float *) w[b_nchans + 3];
+        for(i = 0; i < b_nchans; i++){
+            input = (t_float *) w[i+2];
+            output = (t_float *) w[4 + b_nchans + i];
+            phs = x->phs; // reset for each channel
+            for(j = 0; j < n; j++){
+                
+                //		insamp = input[j];
+                
+                if ( connections[delay_inlet]) {
+                    fdelay = delay_vec[j];
+                    fdelay *= .001 * sr;
+                    if (fdelay < 1. )
+                        fdelay = 1.;
+                    if( fdelay > maxdelay_len - 1 )
+                        fdelay = maxdelay_len - 1;
+                    x->delay_time = fdelay;
+                }
+                if(! inf_hold ){
+                    if(connections[feedback_inlet]){
+                        feedback = feedback_vec[j];
+                        if( feedback_protect ) {
+                            if( feedback > 0.99)
+                                feedback = 0.99;
+                            if( feedback < -0.99 )
+                                feedback = -0.99;
+                        }
+                        x->feedback = feedback;
+                    }
+                }
+                
+                idelay = floor(fdelay);
+                
+                if(phs < 0 || phs >= maxdelay_len){
+                    error("%s: bad phase %d",OBJECT_NAME,phs);
+                    phs = 0;
+                }
+                
+                if(interpolate){
+                    frac = (fdelay - idelay);
+                    dphs1 = phs - idelay;
+                    dphs2 = dphs1 - 1;
+                    
+                    while(dphs1 >= maxdelay_len){
+                        dphs1 -= maxdelay_len;
+                    }
+                    while(dphs1 < 0){
+                        dphs1 += maxdelay_len;
+                    }
+                    while(dphs2 >= maxdelay_len){
+                        dphs2 -= maxdelay_len;
+                    }
+                    while(dphs2 < 0){
+                        dphs2 += maxdelay_len;
+                    }
+                    
+                    x1 = delay_line[dphs1 * b_nchans + i].w_float;
+                    x2 = delay_line[dphs2 * b_nchans + i].w_float;
+                    outsamp = x1 + frac * (x2 - x1);
+                    
+                } else {
+                    dphs = phs - idelay;
+                    while(dphs >= maxdelay_len){
+                        dphs -= maxdelay_len;
+                    }
+                    while(dphs < 0){
+                        dphs += maxdelay_len;
+                    }
+                    if(dphs < 0 || dphs >= maxdelay_len){
+                        error("bad dphase %d",dphs);
+                        dphs = 0;
+                    }
+                    outsamp = delay_line[dphs * b_nchans + i].w_float;
+                    
+                    
+                }
+                output[j] = outsamp;
+                if(! inf_hold ){
+                    insamp = input[j];
+                    delay_line[phs * b_nchans + i].w_float = insamp + outsamp * feedback;
+                }
+                ++phs;
+                while(phs >= maxdelay_len){
+                    phs -= maxdelay_len;
+                }
+                while(phs < 0){
+                    phs += maxdelay_len;
+                }
+                
+            }
+            
+        }
+        
+        
+        x->phs = phs;
+        if(x->redraw_flag){
+            vdb_redraw(x);
+        }
+        return (w + b_nchans * 2 + 5);
+        
+        
+}
+    
+void *vdb_new(t_symbol *s, int argc, t_atom *argv)
+{
+    int i;
+    int user_chans;
+
+    t_vdb *x = (t_vdb *)pd_new(vdb_class);
+
+    x->sr = sys_getsr();
+    if(argc < 2){
+        if (!argc)
+        {
+            post("%s: warning: no array name given: defaulting to empty symbol",
+                OBJECT_NAME);
+        } else {
+            error("%s: you must provide a valid buffer name and channel count",
+                OBJECT_NAME);
+            return (void *)NULL;
+        }
+    }
+        
+    if(!x->sr){
+        error("zero sampling rate - set to 44100");
+        x->sr = 44100;
+    }
+    // DSP CONFIG
+
+
+    // SET DEFAULTS
+    x->maxdelay = 50.0; // milliseconds
+    x->feedback = 0.5;
+    x->delay_time  = 0.0;
+
+    // args: name channels [max delay, initial delay, feedback, interpolation_flag]
+        
+
+    x->buffername = atom_getsymbolarg(0,argc,argv);
+        
+    user_chans = 1; // in Pd buffers always mono...
+    x->maxdelay = atom_getfloatarg(1,argc,argv);
+    x->delay_time = atom_getfloatarg(2,argc,argv);
+    x->feedback = atom_getfloatarg(3,argc,argv);
+    x->interpolate = atom_getfloatarg(4,argc,argv);
+    x->b_nchans = user_chans;
+    x->redraw_flag = 1;
+        
+    /* need data checking here */
+    x->inlet_count = x->b_nchans + 2;
+    x->outlet_count = x->b_nchans;
+    x->delay_inlet = x->b_nchans;
+    x->feedback_inlet = x->delay_inlet + 1;
+
+    for(i = 0; i < x->inlet_count - 1; i++){
+        inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+    }
+    outlet_new(&x->x_obj, gensym("signal") );
+        
+        
+    vdb_init(x,0);
+    return (x);
+}
+    
+    void vdb_free(t_vdb *x)
+    {
+
+        free(x->connections);
+    }
+    
+    
+    void vdb_init(t_vdb *x,short initialized)
+    {
+        // int i;
+        
+        
+        if(!initialized){
+            if(!x->maxdelay)
+                x->maxdelay = 50.0;
+            x->maxdelay_len = x->maxdelay * .001 * x->sr;
+            x->feedback_protect = 0;
+            x->inf_hold = 0;
+            x->phs = 0;
+            x->mute = 0;
+            x->always_update = 0;
+            x->connections = (short *) calloc(128, sizeof(short));
+        }
+        
+    }
+    
+    
+
+    
+    void vdb_protect(t_vdb *x, t_floatarg state)
+    {
+        x->feedback_protect = state;
+    }
+    
+    int vdb_attach_buffer(t_vdb *x)
+    {
+
+        t_garray *a;
+        t_symbol *wavename = x->buffername;
+        int b_frames;
+        t_word *b_samples;
+        if (!(a = (t_garray *)pd_findbyclass(wavename, garray_class))) {
+            if (*wavename->s_name) pd_error(x, "%s: %s: no such array",OBJECT_NAME,wavename->s_name);
+            
+            x->b_valid = 0;
+            return 0;
+        }
+        else if (!garray_getfloatwords(a, &b_frames, &b_samples)) {
+            pd_error(x, "%s: bad array for %s", wavename->s_name,OBJECT_NAME);
+            x->b_valid = 0; 
+            return 0;
+        }
+        else  {
+            x->b_nchans = 1;
+            x->b_frames = b_frames;
+            x->b_samples = b_samples;
+            x->b_valid = 1;		
+            x->len = x->b_frames;
+            if(x->maxdelay_len > x->len){
+                x->maxdelay_len = x->len;
+                post("%s: shortened maxdelay to %d frames",OBJECT_NAME,x->maxdelay_len);	
+            }
+            garray_usedindsp(a);
+            return(1);	
+        }
+        
+        
+    }
+
+    
+    void vdb_redraw(t_vdb *x)
+    {
+        t_garray *a;
+        t_symbol *wavename = x->buffername;
+        if (!(a = (t_garray *)pd_findbyclass(wavename, garray_class))) {
+            if (*wavename->s_name) pd_error(x, "%s: %s: no such array",OBJECT_NAME, wavename->s_name);
+            x->b_valid = 0;
+        }
+        else  {
+            garray_redraw(a);
+        }
+    }
+    
+    
+    void vdb_dsp(t_vdb *x, t_signal **sp)
+    {
+        int i;
+        int vector_count;
+        t_int **sigvec;
+        
+        vector_count = x->inlet_count+x->outlet_count + 2;
+        
+        
+        for(i = 0; i < vector_count - 2; i++){
+
+            x->connections[i] = 1;
+        }
+        
+        vdb_attach_buffer(x);
+        
+        sigvec  = (t_int **) calloc(vector_count, sizeof(t_int *));	
+        for(i = 0; i < vector_count; i++)
+            sigvec[i] = (t_int *) calloc(sizeof(t_int),1);
+        
+        sigvec[0] = (t_int *)x;
+        
+        sigvec[vector_count - 1] = (t_int *)sp[0]->s_n;
+        
+        for(i = 1; i < vector_count - 1; i++){
+            sigvec[i] = (t_int *)sp[i-1]->s_vec;
+        }
+        
+        
+
+        dsp_addv(vdb_perform, vector_count, (t_int *)sigvec);
+        
+        free(sigvec);
+        
+        
+    }
+    
+    
diff --git a/externals/lyonpotpourri/vdp~-help.pd b/externals/lyonpotpourri/vdp~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..088c12a5014a83e5e7b1e2c8f0d8e76c1a6d03c0
--- /dev/null
+++ b/externals/lyonpotpourri/vdp~-help.pd
@@ -0,0 +1,51 @@
+#N canvas 665 223 458 308 10;
+#X obj 135 164 vdp~ 20 0 0.5;
+#N canvas 627 438 458 308 input-sound 0;
+#X obj 130 125 phasor~ 96;
+#X obj 130 158 -~ 0.5;
+#X obj 130 190 outlet~;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X restore 90 79 pd input-sound;
+#X floatatom 281 125 5 0 0 0 - - -, f 5;
+#N canvas 643 483 454 304 delaytime 0;
+#X obj 177 107 osc~ 0.1;
+#X obj 177 140 *~ 9.9;
+#X obj 177 169 +~ 10;
+#X obj 177 198 outlet~;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X restore 172 107 pd delaytime;
+#X obj 90 255 *~ 0.1;
+#X obj 90 280 dac~;
+#X obj 284 113 hsl 80 8 -0.99 0.99 0 0 empty empty feedback_amount
+-2 -8 1 10 -76846 -1 -1 4200 1;
+#X floatatom 128 235 5 0 0 0 - - -, f 5;
+#X obj 132 224 hsl 80 8 0 0.2 0 0 empty empty gain -2 -8 1 10 -76846
+-1 -1 2900 1;
+#N canvas 0 22 458 308 capture 0;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array vdp-catch 882 float 2;
+#X coords 0 1 882 -1 200 140 1;
+#X restore 35 85 graph;
+#X obj 263 152 s vdp-msgs;
+#X msg 263 117 copy_to_buffer vdp-catch;
+#X connect 2 0 1 0;
+#X restore 238 166 pd capture;
+#X obj 13 79 r vdp-msgs;
+#X obj 8 10 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 9 46 vdp~ - a simple \, self-contained delay unit with feedback
+;
+#X connect 0 0 4 0;
+#X connect 1 0 0 0;
+#X connect 1 0 4 0;
+#X connect 2 0 0 2;
+#X connect 3 0 0 1;
+#X connect 4 0 5 0;
+#X connect 4 0 5 1;
+#X connect 6 0 2 0;
+#X connect 7 0 4 1;
+#X connect 8 0 7 0;
+#X connect 10 0 0 0;
diff --git a/externals/lyonpotpourri/vdp~.c b/externals/lyonpotpourri/vdp~.c
new file mode 100755
index 0000000000000000000000000000000000000000..0dc5a88c2f14620f22ce9a94d9583be3ebdbf6cd
--- /dev/null
+++ b/externals/lyonpotpourri/vdp~.c
@@ -0,0 +1,477 @@
+
+#include "MSPd.h"
+
+#define F_LEN 16384
+#define MAX_DELAY_TIME 3600000.0 // in seconds
+#define OBJECT_NAME "vdp~"
+
+static t_class *vdp_class;
+
+typedef struct
+{
+	float coef;
+	float cutoff;
+	float x1;
+} t_lpf;
+
+typedef struct {
+	float *b_samples;
+	long b_valid;
+	long b_nchans;
+	long b_frames;
+	t_symbol *wavename;
+} t_guffer; // stuff we care about from garrays and buffers
+
+typedef struct _vdp
+{
+    
+    t_object x_obj;
+    float x_f;
+	float sr;
+	
+	t_lpf lpf;
+	short filter;
+	
+	float speed;
+	float feedback;
+	float delay_time;
+	float delay_samps;
+	float maxdel;
+	
+	float *delay_line ;
+	float *write_ptr; // location to write current input
+	float *startmem; // first address in delay line
+	float *endmem; // last address to read in delay line
+	int len;
+	int phs;
+	float tap;
+	short connections[4];
+	
+	short feedback_protect;
+	short mute;
+	short interpolate;
+	short inf_hold;
+	/* copy to buffer */
+	t_guffer *destbuf; /* for copying to another buffer */
+	/* tapering */
+	long taper_count;
+	float taper_feedback;
+} t_vdp;
+
+t_int *vdp_perform(t_int *w);
+
+void vdp_protect(t_vdp *x, double state);
+void vdp_dsp(t_vdp *x, t_signal **sp);
+void *vdp_new(t_symbol *s, int argc, t_atom *argv);
+void vdp_float(t_vdp *x, double f);
+void vdp_mute(t_vdp *x, t_floatarg t);
+void vdp_interpolate(t_vdp *x, t_floatarg t);
+void vdp_show(t_vdp *x);
+void vdp_coef(t_vdp *x, t_floatarg f);
+void vdp_filter(t_vdp *x, t_floatarg t);
+void vdp_init(t_vdp *x,short initialized);
+void vdp_clear(t_vdp *x);
+void vdp_inf_hold(t_vdp *x,t_floatarg state);
+void vdp_copy_to_buffer(t_vdp *x, t_symbol *msg, short argc, t_atom *argv);
+int vdp_setdestbuf(t_vdp *x, t_symbol *wavename);
+void vdp_redraw(t_vdp *x);
+void vdp_free(t_vdp *x);
+
+
+void vdp_tilde_setup(void)
+{
+	vdp_class = class_new(gensym("vdp~"),(t_newmethod)vdp_new,(t_method)vdp_free, sizeof(t_vdp), 0, A_GIMME,0);
+	CLASS_MAINSIGNALIN(vdp_class,t_vdp, x_f );
+	
+	class_addmethod(vdp_class,(t_method)vdp_dsp,gensym("dsp"),A_CANT,0);
+	class_addmethod(vdp_class,(t_method)vdp_protect,gensym("protect"),A_FLOAT,0);
+	class_addmethod(vdp_class,(t_method)vdp_mute,gensym("mute"),A_FLOAT,0);
+	class_addmethod(vdp_class,(t_method)vdp_filter,gensym("filter"),A_FLOAT,0);
+	class_addmethod(vdp_class,(t_method)vdp_coef,gensym("coef"),A_FLOAT,0);
+	class_addmethod(vdp_class,(t_method)vdp_show,gensym("show"),0);
+	class_addmethod(vdp_class,(t_method)vdp_clear,gensym("clear"),0);
+	class_addmethod(vdp_class,(t_method)vdp_inf_hold,gensym("inf_hold"),A_FLOAT,0);
+	class_addmethod(vdp_class,(t_method)vdp_interpolate,gensym("interpolate"),A_FLOAT,0);
+	class_addmethod(vdp_class,(t_method)vdp_copy_to_buffer,gensym("copy_to_buffer"),A_GIMME,0);
+	potpourri_announce(OBJECT_NAME);
+}
+
+void vdp_mute(t_vdp *x, t_floatarg t)
+{
+	x->mute = (short)t;
+}
+
+void vdp_inf_hold(t_vdp *x, t_floatarg t)
+{
+	x->inf_hold = (short)t;
+	x->taper_feedback = 1.0;
+	x->taper_count = 0;
+}
+
+
+void vdp_filter(t_vdp *x, t_floatarg t)
+{
+	x->filter = (short)t;
+}
+
+void vdp_coef(t_vdp *x, t_floatarg f)
+{
+	x->lpf.coef = (float)f;
+}
+
+void vdp_show(t_vdp *x)
+{
+	post("feedback %f delay %f",x->feedback, x->delay_time);
+}
+
+void vdp_interpolate(t_vdp *x, t_floatarg t)
+{
+	x->interpolate = (short)t;
+}
+
+t_int *vdp_perform(t_int *w)
+{
+	// DSP config
+    t_vdp *x = (t_vdp *)(w[1]);
+    t_float *input = (t_float *)(w[2]);
+    t_float *delay_vec = (t_float *)(w[3]);
+    t_float *feedback_vec = (t_float *)(w[4]);
+    t_float *output = (t_float *)(w[5]);
+    int n = (int) w[6];
+    
+    float fdelay;
+    float insamp;
+    float outsamp = 0.0;
+    float frac;
+	float *write_ptr = x->write_ptr;
+	float *read_ptr;
+	float *startmem = x->startmem;
+	float *endmem = x->endmem;
+	int len = x->len;
+	float tap = x->tap;
+	float feedback = x->feedback;
+	float delay_samps = x->delay_samps;
+	short *connections = x->connections;
+	float sr = x->sr;
+	float msr = sr * 0.001;
+	short feedback_protect = x->feedback_protect;
+	short interpolate = x->interpolate;
+	t_lpf lpf = x->lpf;
+	short filter = x->filter;
+	float x1,x2;
+	int idelay;
+	
+	short inf_hold = x->inf_hold;
+	
+	
+	/**********************/
+	
+	if( x->mute ) {
+		/* while(n--){
+         *output++ = 0.0;
+         } */
+		memset( (char *)output, 0, n * sizeof(float) );
+		return (w+7);
+	}
+	
+	fdelay = delay_samps;
+	idelay = floor(fdelay);
+	
+	/* loop only for infinite hold */
+	
+	if(inf_hold){
+		while( n-- ){
+			read_ptr = write_ptr;
+			outsamp = *read_ptr;
+			*write_ptr++;
+			if( write_ptr >= endmem ){
+				write_ptr = startmem;
+			}
+			*output++ = outsamp;
+		}
+		x->write_ptr = write_ptr;
+		x->delay_samps = fdelay;
+		return (w+7);
+	}
+	
+	
+	/* normal main loop*/
+	while( n-- ){
+		
+		// Pull Data off Signal buffers
+		insamp = *input++;
+		
+		
+		if ( connections[1]) {
+			fdelay = *delay_vec++ * msr; // convert delay from milliseconds to samples
+			if (fdelay < 0.0 )
+				fdelay = 0.0;
+			if( fdelay >= len )
+				fdelay = len - 1;
+			idelay = floor(fdelay);
+		}
+		
+		if(connections[2]){
+			feedback = *feedback_vec++;
+			if( feedback_protect ) {
+				if( feedback > 0.99)
+					feedback = 0.99;
+				if( feedback < -0.99 )
+					feedback = -0.99;
+			}
+			
+		}
+		
+		
+		/* make fdelay behave */
+		if(fdelay < 0.0){
+			fdelay = 0.0;
+		}
+		else if(fdelay >= len){
+			fdelay = len - 1;
+		}
+		idelay = floor(fdelay);
+		
+		if(interpolate){
+			frac = (fdelay - idelay);
+			read_ptr = write_ptr - idelay;
+			if( read_ptr < startmem ){
+				read_ptr += len;
+			}
+			x1 = *read_ptr--;
+			if( read_ptr < startmem ){
+				read_ptr += endmem - startmem;
+			}
+			x2 = *read_ptr;
+			outsamp = x1 + frac * (x2 - x1);
+			
+		}
+		else { // no interpolation case
+			read_ptr = write_ptr - idelay;
+			if( read_ptr < startmem ){
+				read_ptr += len;
+			}
+			outsamp = *read_ptr;
+			
+		}
+		if(filter){
+			outsamp += lpf.x1 * lpf.coef;
+			outsamp /= (1.0+lpf.coef);
+			lpf.x1 = outsamp;
+		}
+		
+		*write_ptr++ = insamp + outsamp * feedback;
+		
+		if( write_ptr >= endmem ){
+			write_ptr = startmem;
+		}
+		
+		*output++ = outsamp;
+	}
+	
+	x->tap = tap;
+	x->feedback = feedback;
+	x->delay_time = fdelay;
+	x->delay_samps = fdelay;
+	x->write_ptr = write_ptr;
+	
+	return (w+7);
+	
+	
+}
+
+void *vdp_new(t_symbol *s, int argc, t_atom *argv)
+{
+    int i;
+
+	t_vdp *x = (t_vdp *)pd_new(vdp_class);
+	for(i = 0; i < 2; i++){
+		inlet_new(&x->x_obj, &x->x_obj.ob_pd,gensym("signal"), gensym("signal"));
+	}
+	outlet_new(&x->x_obj, gensym("signal") );
+	x->sr = sys_getsr();
+	if(!x->sr){
+		error("zero sampling rate - set to 44100");
+		x->sr = 44100;
+	}
+	// DSP CONFIG
+    
+    
+	// SET DEFAULTS
+	x->maxdel = 50.0; // milliseconds
+	x->feedback = 0.5;
+	x->delay_time  = 0.0;
+    
+    /*
+     atom_arg_getfloat(&x->maxdel,0,argc,argv);
+     atom_arg_getfloat(&x->delay_time,1,argc,argv);
+     atom_arg_getfloat(&x->feedback,2,argc,argv);
+     */
+	x->maxdel = atom_getfloatarg(0,argc,argv);
+	x->delay_time = atom_getfloatarg(1,argc,argv);
+	x->feedback = atom_getfloatarg(2,argc,argv);
+	x->interpolate = atom_getfloatarg(3,argc,argv);
+	if(!x->maxdel)
+		x->maxdel = 50.0;
+    
+	vdp_init(x,0);
+	return (x);
+}
+
+void vdp_free(t_vdp *x)
+{
+	free(x->delay_line);
+}
+
+void vdp_clear(t_vdp *x)
+{
+	memset((char*)x->delay_line,0,(x->len + 2) * sizeof(float));
+}
+
+
+void vdp_init(t_vdp *x,short initialized)
+{
+    //int i;
+    
+    if(!initialized){
+        x->feedback_protect = 0;
+        x->interpolate = 1;
+        x->filter = 0;
+        x->inf_hold = 0;
+        if( x->maxdel < .00001 ){
+            x->maxdel = .00001;
+        }
+        if( x->maxdel > MAX_DELAY_TIME ){
+            error("%s: %f is too long, delay time set to max of %f",OBJECT_NAME,x->maxdel, MAX_DELAY_TIME);
+            x->maxdel = MAX_DELAY_TIME;
+        }
+        x->len = x->maxdel * .001 * x->sr;
+        x->lpf.coef = 0.5;
+        x->lpf.x1 = 0.0;
+        x->delay_line = (float *) calloc((x->len + 2), sizeof(float));
+        x->destbuf = (t_guffer *) calloc(1,sizeof(t_guffer));
+        x->phs = 0;
+        x->mute = 0;
+        x->tap = 0;
+    } else {
+        x->len = x->maxdel * .001 * x->sr;
+        x->delay_line = (float *) realloc(x->delay_line, (x->len + 2) * sizeof(float));
+        memset((char*)x->delay_line,0,(x->len + 2) * sizeof(float));
+    }
+    x->startmem = x->delay_line;
+    x->endmem = x->startmem + x->len;
+    // x->endmem = x->startmem + (x->len - 1);
+    
+    x->write_ptr = x->startmem;
+    /*
+     post("startmem %d endmem %d len %d diff %d diffback %d", x->startmem, x->endmem, x->len, x->endmem - x->startmem, ( x->endmem - x->startmem) /sizeof(float));
+     */
+}
+
+void vdp_dsp(t_vdp *x, t_signal **sp)
+{
+	// DSP CONFIG
+	x->connections[1] = 1;
+	x->connections[2] = 1;
+    
+	if(x->sr != sp[0]->s_sr){
+		x->sr = sp[0]->s_sr;
+		vdp_init(x,1);
+	}
+    dsp_add(vdp_perform, 6, x,
+    		sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec,
+    		sp[0]->s_n);
+    
+}
+
+
+
+void vdp_protect(t_vdp *x, double state)
+{
+	x->feedback_protect = state;
+}
+
+void vdp_copy_to_buffer(t_vdp *x, t_symbol *msg, short argc, t_atom *argv)
+{
+    t_symbol *destname;
+    
+    float *b_samples = x->delay_line;
+    long b_nchans = 1;
+    long b_frames = x->len + 2;
+    
+    float *b_dest_samples;
+    long b_dest_nchans;
+    long b_dest_frames;
+    
+	
+	destname = atom_getsymarg(0,argc,argv);
+	
+	if(! vdp_setdestbuf(x, destname)){
+		post("could not find buffer");
+		return;
+	}
+	b_dest_samples = x->destbuf->b_samples;
+	b_dest_nchans = x->destbuf->b_nchans;
+	b_dest_frames = x->destbuf->b_frames;
+	
+    
+	if(b_nchans != 1){
+		error("%s: buffer must be mono",OBJECT_NAME);
+		return;
+	}
+	if(b_dest_frames < b_frames ){
+		// post("%s: destination buffer %s is too small, truncating",OBJECT_NAME,destname->s_name);
+		b_frames = b_dest_frames; // local copy only
+	}
+ 	// post("cleaning out %d frames",b_dest_frames);
+	/* first clean out destination */
+	memset((char *)b_dest_samples, 0, b_dest_frames * 1 * sizeof(float));
+	
+	// post("copying %d frames",b_frames);
+	
+	/* now copy segment */
+	memcpy(b_dest_samples, b_samples, b_frames * 1 * sizeof(float) );
+	vdp_redraw(x);
+}
+
+int vdp_setdestbuf(t_vdp *x, t_symbol *wavename)
+{
+
+	t_garray *a;
+    //	t_symbol *wavename = x->buffername;
+	int b_frames;
+	float *b_samples;
+	if (!(a = (t_garray *)pd_findbyclass(wavename, garray_class))) {
+		if (*wavename->s_name) pd_error(x, "%s: %s: no such array",OBJECT_NAME,wavename->s_name);
+        
+		x->destbuf->b_valid = 0;
+		return 0;
+    }
+	else if (!garray_getfloatarray(a, &b_frames, &b_samples)) {
+		pd_error(x, "%s: bad array for %s", wavename->s_name,OBJECT_NAME);
+		x->destbuf->b_valid = 0;
+		return 0;
+    }
+	else  {
+ 		x->destbuf->b_nchans = 1;
+		x->destbuf->b_frames = b_frames;
+		x->destbuf->b_samples = b_samples;
+		x->destbuf->b_valid = 1;
+		x->destbuf->wavename = wavename;
+		garray_usedindsp(a);
+		return(1);
+	}
+}
+
+void vdp_redraw(t_vdp *x)
+{
+	t_garray *a;
+	t_symbol *wavename = x->destbuf->wavename;
+	if (!(a = (t_garray *)pd_findbyclass(wavename, garray_class))) {
+		if (*wavename->s_name) pd_error(x, "%s: %s: no such array",OBJECT_NAME, wavename->s_name);
+		x->destbuf->b_valid = 0;
+	}
+	else  {
+		garray_redraw(a);
+	}
+}
diff --git a/externals/lyonpotpourri/vecdex~-help.pd b/externals/lyonpotpourri/vecdex~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..32bc95eb57e57baa754a73ac32d7af8b56a16237
--- /dev/null
+++ b/externals/lyonpotpourri/vecdex~-help.pd
@@ -0,0 +1,73 @@
+#N canvas 552 251 450 300 10;
+#X obj 39 260 dac~;
+#X obj 39 200 *~ 0.01;
+#X obj 39 125 noise~;
+#N canvas 532 235 601 529 fft-hipass 0;
+#X obj 86 50 inlet~;
+#X obj 225 472 outlet~;
+#X obj 225 98 windowvec~;
+#X obj 225 136 rfft~, f 6;
+#X obj 225 171 cartopol~;
+#X obj 225 346 poltocar~;
+#X obj 225 376 rifft~;
+#X obj 225 439 windowvec~;
+#X obj 225 406 *~ 0;
+#X obj 421 264 *;
+#X msg 373 186 1 1024 8;
+#X obj 373 217 unpack f f f;
+#X obj 373 296 /;
+#X floatatom 373 328 12 0 0 0 - - -, f 12;
+#X text 454 329 rescale factor;
+#X obj 373 155 loadbang;
+#X obj 185 311 *~;
+#X obj 125 268 greater~ 20;
+#X obj 91 212 vecdex~;
+#X msg 162 212 top \$1;
+#X obj 162 180 inlet;
+#X text 164 22 only pass through bin magnitudes for bin numbers greater
+than the "top" number sent to greater~;
+#X obj 79 484 block~ 1024 8;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 1 4 1;
+#X connect 4 0 16 1;
+#X connect 4 1 5 1;
+#X connect 5 0 6 0;
+#X connect 5 1 6 1;
+#X connect 6 0 8 0;
+#X connect 7 0 1 0;
+#X connect 8 0 7 0;
+#X connect 9 0 12 1;
+#X connect 10 0 11 0;
+#X connect 11 0 12 0;
+#X connect 11 1 9 0;
+#X connect 11 2 9 1;
+#X connect 12 0 13 0;
+#X connect 13 0 8 1;
+#X connect 15 0 10 0;
+#X connect 16 0 5 0;
+#X connect 17 0 16 0;
+#X connect 18 0 17 0;
+#X connect 19 0 17 0;
+#X connect 20 0 19 0;
+#X restore 39 164 pd fft-hipass;
+#X obj 117 94 hsl 128 15 0 100 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 114 128 5 0 0 0 - - -, f 5;
+#X text 253 99 set cutoff bin;
+#X obj 118 200 hsl 128 15 0 0.2 0 0 empty empty gain -2 -8 0 10 -262144
+-1 -1 0 1;
+#X text 129 165 <- open to see workings of this hipass filter;
+#X obj 26 4 cnv 15 155 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X text 28 36 vecdex~ - outputs the current index within a signal vector.
+It can be useful for spectral processing \, as demonstrated here.,
+f 64;
+#X connect 1 0 0 0;
+#X connect 1 0 0 1;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 5 0;
+#X connect 5 0 3 1;
+#X connect 7 0 1 1;
diff --git a/externals/lyonpotpourri/vecdex~.c b/externals/lyonpotpourri/vecdex~.c
new file mode 100755
index 0000000000000000000000000000000000000000..626907b1520be0d8d314e4657255579920b10ba5
--- /dev/null
+++ b/externals/lyonpotpourri/vecdex~.c
@@ -0,0 +1,67 @@
+/* Required Header Files */
+
+#include "MSPd.h"
+
+/* The class pointer */
+
+static t_class *vecdex_class;
+
+/* The object structure */
+
+typedef struct _vecdex {
+	t_object obj;
+	t_float x_f;
+//    float top;
+} t_vecdex;
+
+#define OBJECT_NAME "vecdex~"
+
+/* Function prototypes */
+
+void *vecdex_new(t_symbol *msg, short argc, t_atom *argv);
+void vecdex_dsp(t_vecdex *x, t_signal **sp);
+t_int *vecdex_perform(t_int *w);
+
+/* The object setup function */
+
+void vecdex_tilde_setup(void)
+{
+	vecdex_class = class_new(gensym("vecdex~"), (t_newmethod)vecdex_new, 0,sizeof(t_vecdex),0,A_GIMME,0);
+	CLASS_MAINSIGNALIN(vecdex_class, t_vecdex, x_f);
+	class_addmethod(vecdex_class, (t_method)vecdex_dsp, gensym("dsp"), A_CANT, 0);
+
+	potpourri_announce(OBJECT_NAME);
+}
+
+/* The new instance routine */
+
+void *vecdex_new(t_symbol *msg, short argc, t_atom *argv)
+{
+	t_vecdex *x = (t_vecdex *)pd_new(vecdex_class);
+	outlet_new(&x->obj, gensym("signal"));
+	return x;
+}
+
+/* The free memory function*/
+
+
+/* The perform routine */
+
+t_int *vecdex_perform(t_int *w)
+{
+	t_vecdex *x = (t_vecdex *) (w[1]);
+//	t_float *input = (t_float *) (w[2]);
+	t_float *output = (t_float *) (w[3]);
+	int n = (int) w[4];
+	int i;
+	
+	for(i=0; i < n; i++){
+        output[i] = i;
+	}
+	return w + 5;
+}
+
+void vecdex_dsp(t_vecdex *x, t_signal **sp)
+{
+	dsp_add(vecdex_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
+}
\ No newline at end of file
diff --git a/externals/lyonpotpourri/waveshape~-help.pd b/externals/lyonpotpourri/waveshape~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..be1ace79184fbd418bdc2f5768d051aff457f8be
--- /dev/null
+++ b/externals/lyonpotpourri/waveshape~-help.pd
@@ -0,0 +1,36 @@
+#N canvas 482 57 462 373 10;
+#X obj 27 239 waveshape~;
+#X obj 27 303 *~ 0.1;
+#X obj 27 330 dac~;
+#X msg 123 164 0 0 0 1 1;
+#X msg 125 190 0 0.5 0 0 1 0.3 1;
+#X msg 125 217 0 0.2 0 0.2 0 0.2 0 0 1 0 0 0 0 0 0.5;
+#X text 122 146 select a weighted summation of Chebychev polynomials
+;
+#X floatatom 80 304 5 0 0 0 - - -, f 5;
+#X floatatom 27 91 5 0 0 0 - - -, f 5;
+#X obj 256 192 loadbang;
+#X obj 27 109 osc~ 200;
+#X obj 27 275 killdc~;
+#X obj 28 16 cnv 15 160 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X obj 98 84 osc~ 0.1;
+#X obj 98 105 *~ 0.49;
+#X obj 98 128 +~ 0.51;
+#X obj 27 159 *~;
+#X text 24 55 waveshape~ basic waveshaping unit;
+#X connect 0 0 11 0;
+#X connect 1 0 2 0;
+#X connect 1 0 2 1;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 7 0 1 1;
+#X connect 8 0 10 0;
+#X connect 9 0 5 0;
+#X connect 10 0 16 0;
+#X connect 11 0 1 0;
+#X connect 13 0 14 0;
+#X connect 14 0 15 0;
+#X connect 15 0 16 1;
+#X connect 16 0 0 0;
diff --git a/externals/lyonpotpourri/waveshape~.c b/externals/lyonpotpourri/waveshape~.c
new file mode 100755
index 0000000000000000000000000000000000000000..47822b6b648bc405e6c36653ff3ef3ed25851f17
--- /dev/null
+++ b/externals/lyonpotpourri/waveshape~.c
@@ -0,0 +1,171 @@
+#include "MSPd.h"
+
+#define OBJECT_NAME "waveshape~"
+
+#define ws_MAXHARMS (256)
+
+
+static t_class *waveshape_class;
+
+
+typedef struct _waveshape
+{
+    
+    t_object x_obj;
+    float x_f;
+    int flen;
+    float *wavetab;
+    float *tempeh; // work function
+    int hcount;
+    float *harms;
+    short mute;
+} t_waveshape;
+
+void *waveshape_new(void);
+
+t_int *waveshape_perform(t_int *w);
+void waveshape_dsp(t_waveshape *x, t_signal **sp);
+void waveshape_list (t_waveshape *x, t_symbol *msg, short argc, t_atom *argv);
+void update_waveshape_function( t_waveshape *x );
+//float mapp();
+void waveshape_mute(t_waveshape *x, t_floatarg tog);
+void waveshape_free(t_waveshape *x);
+
+
+void waveshape_tilde_setup(void){
+    waveshape_class = class_new(gensym("waveshape~"), (t_newmethod)waveshape_new,
+                                (t_method)waveshape_free,sizeof(t_waveshape), 0,0);
+    CLASS_MAINSIGNALIN(waveshape_class, t_waveshape, x_f);
+    class_addmethod(waveshape_class,(t_method)waveshape_dsp,gensym("dsp"),0);
+    class_addmethod(waveshape_class,(t_method)waveshape_mute,gensym("mute"),A_FLOAT,0);
+    class_addmethod(waveshape_class,(t_method)waveshape_list,gensym("list"),A_GIMME,0);
+    potpourri_announce(OBJECT_NAME);
+}
+
+
+void waveshape_free(t_waveshape *x)
+{
+	free(x->wavetab);
+	free(x->tempeh);
+	free(x->harms);
+}
+
+
+void waveshape_list (t_waveshape *x, t_symbol *msg, short argc, t_atom *argv)
+{
+	short i;
+    t_symbol *fraud;
+    fraud = msg;
+    x->hcount = 0;
+	for (i=0; i < argc; i++) {
+		if (argv[i].a_type == A_FLOAT) {
+				x->harms[ x->hcount ] = argv[i].a_w.w_float;
+				++(x->hcount);
+		}
+	}
+	update_waveshape_function( x );
+    
+}
+
+void waveshape_mute(t_waveshape *x, t_floatarg tog)
+{
+	x->mute = tog;
+}
+
+void *waveshape_new(void)
+{
+    t_waveshape *x = (t_waveshape *)pd_new(waveshape_class);
+    outlet_new(&x->x_obj, gensym("signal"));
+    
+	x->flen = 1<<16 ;
+	x->wavetab = (float *) calloc( x->flen, sizeof(float) );
+	x->tempeh = (float *) calloc( x->flen, sizeof(float) );
+	x->harms = (float *) calloc( ws_MAXHARMS, sizeof(float) );
+	x->hcount = 4;
+	x->harms[0] = 0;
+	x->harms[1] = .33;
+	x->harms[2] = .33;
+	x->harms[3] = .33;
+	x->mute = 0;
+	update_waveshape_function( x );
+    return (x);
+}
+
+void update_waveshape_function( t_waveshape *x ) {
+	float point;
+	int i, j;
+	float min, max;
+    // zero out function;
+	for( i = 0; i < x->flen; i++ ){
+		x->tempeh[i] = 0;
+	}
+	for( i = 0 ; i < x->hcount; i++ ){
+		if( x->harms[i] > 0.0 ) {
+			for( j = 0; j < x->flen; j++ ){
+				point = -1.0 + 2.0 * ( (float) j / (float) x->flen) ;
+				x->tempeh[j] += x->harms[i] * cos( (float) i * acos( point ) );
+			}
+		}
+	}
+	min = 1; max = -1;
+	for( j = 0; j < x->flen; j++ ){
+		if( min > x->tempeh[j] )
+			min = x->tempeh[j];
+		if( max < x->tempeh[j] )
+			max = x->tempeh[j];
+        
+	}
+    //	post("min:%f, max:%f",min,max);
+    // normalize from -1 to +1
+	if( (max - min) == 0 ){
+		post("all zero function - watch out!");
+		return;
+	}
+	for( j = 0; j < x->flen; j++ ){
+		x->tempeh[j] = -1.0 + ( (x->tempeh[j] - min) / (max - min) ) * 2.0 ;
+	}
+	// put tempeh into waveshape function
+	for( j = 0; j < x->flen; j++ ){
+		x->wavetab[j] = x->tempeh[j];
+	}
+}
+
+t_int *waveshape_perform(t_int *w)
+{
+	float insamp; // , waveshape, ingain ;
+	int windex ;
+	
+	t_waveshape *x = (t_waveshape *) (w[1]);
+	t_float *in = (t_float *)(w[2]);
+	t_float *out = (t_float *)(w[3]);
+	int n = (int) w[4];
+	int flenm1 = x->flen - 1;
+	float *wavetab = x->wavetab;
+	
+	if(x->mute){
+		while(n--){
+			*out++ = 0.0;
+		}
+		return w+5;
+	}
+	
+	while (n--) {
+		insamp = *in++;
+		if(insamp > 1.0){
+			insamp = 1.0;
+		}
+		else if(insamp < -1.0){
+			insamp = -1.0;
+		}
+		windex = ((insamp + 1.0)/2.0) * (float)flenm1 ;
+		*out++ = wavetab[windex] ;
+	}
+    
+	return (w+5);
+}
+
+void waveshape_dsp(t_waveshape *x, t_signal **sp)
+{
+    dsp_add(waveshape_perform, 4, x, sp[0]->s_vec,sp[1]->s_vec,sp[0]->s_n);
+}
+
diff --git a/externals/lyonpotpourri/windowvec~-help.pd b/externals/lyonpotpourri/windowvec~-help.pd
new file mode 100755
index 0000000000000000000000000000000000000000..2c750387f93d8d7089c34733db69dc32ce2a1e5a
--- /dev/null
+++ b/externals/lyonpotpourri/windowvec~-help.pd
@@ -0,0 +1,57 @@
+#N canvas 506 441 450 300 10;
+#N canvas 91 32 532 393 basic-fft 0;
+#X obj 225 66 inlet~;
+#X obj 225 341 outlet~;
+#X obj 225 98 windowvec~;
+#X obj 225 136 rfft~, f 6;
+#X obj 75 341 block~ 1024 8;
+#X obj 225 171 cartopol~;
+#X obj 225 215 poltocar~;
+#X obj 225 245 rifft~;
+#X obj 225 308 windowvec~;
+#X obj 225 275 *~ 0;
+#X obj 394 185 *;
+#X msg 346 107 1 1024 8;
+#X obj 346 138 unpack f f f;
+#X obj 346 217 /;
+#X floatatom 346 249 12 0 0 0 - - -, f 12;
+#X text 427 250 rescale factor;
+#X obj 346 76 loadbang;
+#X text 28 195 Any processing would go here ->;
+#X text 44 321 sets FFT size and overlap;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 5 0;
+#X connect 3 1 5 1;
+#X connect 5 0 6 0;
+#X connect 5 1 6 1;
+#X connect 6 0 7 0;
+#X connect 6 1 7 1;
+#X connect 7 0 9 0;
+#X connect 8 0 1 0;
+#X connect 9 0 8 0;
+#X connect 10 0 13 1;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 12 1 10 0;
+#X connect 12 2 10 1;
+#X connect 13 0 14 0;
+#X connect 14 0 9 1;
+#X connect 16 0 11 0;
+#X restore 32 136 pd basic-fft;
+#X obj 32 109 osc~ 440;
+#X obj 32 210 dac~;
+#X obj 32 172 *~ 0.01;
+#X floatatom 32 86 5 0 0 0 - - -, f 5;
+#X obj 26 4 cnv 15 155 25 empty empty LyonPotpourri 20 12 1 18 -260097
+-204786 0;
+#X floatatom 103 173 5 0 0 2 gain - -, f 5;
+#X text 28 35 windowvec~ - applies a Hann window to each incoming signal
+vector. Useful for the the windowing portion of an overlap-add process.
+, f 66;
+#X connect 0 0 3 0;
+#X connect 1 0 0 0;
+#X connect 3 0 2 0;
+#X connect 3 0 2 1;
+#X connect 4 0 1 0;
+#X connect 6 0 3 1;
diff --git a/externals/lyonpotpourri/windowvec~.c b/externals/lyonpotpourri/windowvec~.c
new file mode 100755
index 0000000000000000000000000000000000000000..cf471ca72b53a4a6b8bd535426d68070dafdffb0
--- /dev/null
+++ b/externals/lyonpotpourri/windowvec~.c
@@ -0,0 +1,97 @@
+/* Required Header Files */
+
+#include "MSPd.h"
+
+/* The class pointer */
+
+static t_class *windowvec_class;
+
+/* The object structure */
+
+typedef struct _windowvec {
+	t_object obj;
+	t_float x_f;
+	float *envelope;
+	long vecsize;
+	long oldbytes;
+} t_windowvec;
+
+#define OBJECT_NAME "windowvec~"
+
+/* Function prototypes */
+
+void *windowvec_new(void);
+void windowvec_dsp(t_windowvec *x, t_signal **sp, short *count);
+t_int *windowvec_perform(t_int *w);
+
+/* The object setup function */
+
+void windowvec_tilde_setup(void)
+{
+	windowvec_class = class_new(gensym("windowvec~"), (t_newmethod)windowvec_new, 0, sizeof(t_windowvec), 0,0);
+	CLASS_MAINSIGNALIN(windowvec_class, t_windowvec, x_f);
+	class_addmethod(windowvec_class, (t_method)windowvec_dsp, gensym("dsp"), A_CANT, 0);
+	potpourri_announce(OBJECT_NAME);
+}
+
+/* The new instance routine */
+
+void *windowvec_new(void)
+{
+	t_windowvec *x = (t_windowvec *)pd_new(windowvec_class);
+	outlet_new(&x->obj, gensym("signal"));
+	x->vecsize = 0;
+	x->envelope = NULL;
+	return x;
+}
+
+/* The free memory function*/
+
+void windowvec_free(t_windowvec *x, t_signal **sp, short *count)
+{
+	freebytes(x->envelope, x->oldbytes);
+}
+
+/* The perform routine */
+
+t_int *windowvec_perform(t_int *w)
+{
+	t_windowvec *x = (t_windowvec *) (w[1]);
+	t_float *input = (t_float *) (w[2]);
+	t_float *output = (t_float *) (w[3]);
+	int n = (int) w[4];
+	int i;
+	float *envelope = x->envelope;
+	
+	/* Apply a Hann window to the input vector */
+	
+	for(i=0; i < n; i++){
+		output[i] = input[i] * envelope[i];
+	}
+	return w + 5;
+}
+
+void windowvec_dsp(t_windowvec *x, t_signal **sp, short *count)
+{
+	int i;
+	float twopi = 8. * atan(1);
+	if(x->vecsize != sp[0]->s_n){
+		x->vecsize = sp[0]->s_n;
+		
+		/* Allocate memory */
+		
+		if(x->envelope == NULL){
+			x->envelope = (float *) getbytes(x->vecsize * sizeof(float));
+		} else {
+			x->envelope = (float *) resizebytes(x->envelope, x->oldbytes, x->vecsize * sizeof(float));
+		}
+		x->oldbytes = x->vecsize * sizeof(float);
+		
+		/* Generate a Hann window */
+		
+		for(i = 0 ; i < x->vecsize; i++){
+			x->envelope[i] = - 0.5 * cos(twopi * (i / (float)x->vecsize)) + 0.5;
+		}
+	}
+	dsp_add(windowvec_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
+}
\ No newline at end of file