[SCM] python-pyo/master: New upstream release.

tiago at users.alioth.debian.org tiago at users.alioth.debian.org
Thu Aug 31 11:41:57 UTC 2017


The following commit has been merged in the master branch:
commit badf51843f3f4bdb8f12019cbe82dcee6c0f8f42
Author: Tiago Bortoletto Vaz <tiago at debian.org>
Date:   Thu Aug 31 07:09:29 2017 -0400

    New upstream release.

diff --git a/ChangeLog b/ChangeLog
index 5d5619c..3f03cd5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,59 @@
+2017-08-28 belangeo <belangeo at gmail.com>
+
+    * Upgraded version number to 0.8.7.
+
+2017-08-28 belangeo <belangeo at gmail.com>
+
+    * Update MacOS and Windows build routine to compile for python 2.7,
+      3.5 and 3.6.
+
+2017-08-xx belangeo <belangeo at gmail.com>
+
+    * Fixed encoding of path for various objects.
+
+2017-08-25 belangeo <belangeo at gmail.com>
+
+    * Fixed clean-up of VoiceManager object.
+
+2017-08-25 belangeo <belangeo at gmail.com>
+
+    * Fixed ending point of TableRec's time stream (now keep the last 
+      value instead of switching back to 0).
+
+2017-08-23 belangeo <belangeo at gmail.com>
+
+    * Fixed windows 10 dependencies.
+
+2017-08-07 belangeo <belangeo at gmail.com>
+
+    * OscDataSend now can send more than one message per buffer size.
+
+2017-06-28 belangeo <belangeo at gmail.com>
+
+    * Fixed Expr unicode handling.
+
+2017-06-27 belangeo <belangeo at gmail.com>
+
+    * Wrap jack api detection inside a try-except statement in case
+      jack2-dbus is used instead of jackd.
+
+2017-06-05 belangeo <belangeo at gmail.com>
+
+    * Added getInterpolated method to PyoMatrixObject class.
+
+2017-06-05 belangeo <belangeo at gmail.com>
+
+    * The server now allow up to 16 channel rms outputs for GUI drawing.
+
+2017-05-18 belangeo <belangeo at gmail.com>
+
+	* Disable Microsoft Midi devices by default. Added
+	  Server.allowMicrosoftMidiDevices() method to enable them.
+
+2017-05-16 belangeo <belangeo at gmail.com>
+
+    * Converted remaining print statements to function calls.
+
 2017-04-20 belangeo <belangeo at gmail.com>
 
     * Upgraded version number to 0.8.6.
diff --git a/TODO.md b/TODO.md
index 4e57273..4abe454 100644
--- a/TODO.md
+++ b/TODO.md
@@ -41,6 +41,8 @@ Objects
 MIDI
 ----
 
+- Jack on windows.
+
 - Create a MidiLinseg object that act like MidiAdsr but with a breakpoints
   function as the envelope. The sustain point should be settable by the user.
 
diff --git a/debian/changelog b/debian/changelog
index aefcea5..02c374d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+python-pyo (0.8.7-1) unstable; urgency=medium
+
+  * New upstream release.
+
+ -- Tiago Bortoletto Vaz <tiago at debian.org>  Thu, 31 Aug 2017 07:09:00 -0400
+
 python-pyo (0.8.6-1) unstable; urgency=medium
 
   * New upstream release.
diff --git a/doc-sphinx/build.py b/doc-sphinx/build.py
index 457067b..30fa130 100644
--- a/doc-sphinx/build.py
+++ b/doc-sphinx/build.py
@@ -97,7 +97,7 @@ for dir in folders:
 
 os.system("cp ../utils/E-PyoIcon.png source/")
 
-os.system("sphinx-build -a -b %s ./source %s" % (build_format, build_folder))
+os.system("sphinx-build -a -E -j 4 -b %s ./source %s" % (build_format, build_folder))
 
 if build_format == "latex":
     os.system("cd build_latex; pdflatex -interaction nonstopmode Pyo;  pdflatex -interaction nonstopmode Pyo")
diff --git a/doc-sphinx/source/api/functions/sndfile.rst b/doc-sphinx/source/api/functions/sndfile.rst
index 05fd50a..a177fc8 100644
--- a/doc-sphinx/source/api/functions/sndfile.rst
+++ b/doc-sphinx/source/api/functions/sndfile.rst
@@ -11,10 +11,10 @@ Soundfile
 *savefile*
 ---------------------------------
 
-.. autofunction:: savefile(samples, path, sr=44100, channels=1, fileformat=0, sampletype=0)
+.. autofunction:: savefile(samples, path, sr=44100, channels=1, fileformat=0, sampletype=0, quality=0.4)
 
 *savefileFromTable*
 ---------------------------------
 
-.. autofunction:: savefileFromTable(table, path, fileformat=0, sampletype=0)
+.. autofunction:: savefileFromTable(table, path, fileformat=0, sampletype=0, quality=0.4)
 
diff --git a/doc-sphinx/source/index.rst b/doc-sphinx/source/index.rst
index ad0952c..a1c6bf5 100644
--- a/doc-sphinx/source/index.rst
+++ b/doc-sphinx/source/index.rst
@@ -3,7 +3,7 @@
    You can adapt this file completely to your liking, but it should at least
    contain the root `toctree` directive.
 
-Welcome to the pyo 0.8.6 documentation
+Welcome to the pyo 0.8.7 documentation
 ===================================================
 
 .. image:: E-PyoIcon.png
diff --git a/embedded/juceplugin/PyoClass.cpp b/embedded/juceplugin/PyoClass.cpp
index 167d04e..b61bb23 100644
--- a/embedded/juceplugin/PyoClass.cpp
+++ b/embedded/juceplugin/PyoClass.cpp
@@ -32,9 +32,9 @@ Pyo::~Pyo() {
 }
 
 /*
-** This function fills pyo's input buffers with new samples, tells pyo to 
-** process a buffer of samples and fills the host's output buffer with new 
-** samples. Should be called once per process block, inside the host's 
+** This function fills pyo's input buffers with new samples, tells pyo to
+** process a buffer of samples and fills the host's output buffer with new
+** samples. Should be called once per process block, inside the host's
 ** processBlock function.
 **
 ** arguments:
@@ -62,7 +62,7 @@ void Pyo::process(AudioSampleBuffer& buffer) {
 ** reboot or not.
 **
 ** arguments:
-**   file : const char * or const String &, 
+**   file : const char * or const String &,
 **             filename to execute as a python script. The file is first
 **             searched in the current working directory. If not found,
 **             the module will try to open it as an absolute path.
@@ -111,7 +111,7 @@ int Pyo::value(const String &name, float value) {
 ** Sends an array of numerical values to an existing Sig or SigTo object.
 **
 ** arguments:
-**   name : const char * or const String &, 
+**   name : const char * or const String &,
 **          variable name of the object.
 **   value : float *, array of floats.
 **   len : int, number of elements in the array.
@@ -154,7 +154,7 @@ int Pyo::value(const String &name, float *value, int len) {
 ** Sends a numerical value to a Pyo object's attribute.
 **
 ** arguments:
-**   name : const char * or const String &, 
+**   name : const char * or const String &,
 **          object name and attribute separated by a dot.
 **   value : float, value to be assigned.
 **
@@ -183,7 +183,7 @@ int Pyo::set(const String &name, float value) {
 ** Sends an array of numerical values to a Pyo object's attribute.
 **
 ** arguments:
-**   name : const char * or const String &, 
+**   name : const char * or const String &,
 **          object name and attribute separated by a dot.
 **   value : float *, array of floats.
 **   len : int, number of elements in the array.
@@ -223,7 +223,7 @@ int Pyo::set(const String &name, float *value, int len) {
 }
 
 /*
-** Executes any raw valid python statement. With this function, one can 
+** Executes any raw valid python statement. With this function, one can
 ** dynamically creates and manipulates audio objects and algorithms.
 **
 ** arguments:
@@ -247,6 +247,19 @@ int Pyo::exec(const String &_msg) {
 }
 
 /*
+** Sends a MIDI messges to the Server.
+**
+** Example (for a Pyo object named `pyo`):
+**
+** pyo.midi(144, 60, 127) //Send a Note on message on channel 1 for note # 60
+** pyo.midi(128, 60, 0)   //Send a Note off messge on channel 1 for note # 60
+*/
+
+void Pyo::midi(int status, int data1, int data2) {
+    return pyo_add_midi_event(interpreter, status, data1, data2);
+}
+
+/*
 ** Shutdown and reboot the pyo server while keeping current in/out buffers.
 ** This will erase audio objects currently active within the server.
 **
diff --git a/embedded/juceplugin/PyoClass.h b/embedded/juceplugin/PyoClass.h
index 6487748..7749d9d 100644
--- a/embedded/juceplugin/PyoClass.h
+++ b/embedded/juceplugin/PyoClass.h
@@ -24,6 +24,7 @@ class Pyo {
         int set(const String &name, float value);
         int set(const char *name, float *value, int len);
         int set(const String &name, float *value, int len);
+        void midi(int status, int data1, int data2);
 
     private:
         int nChannels;
diff --git a/examples/18-multicore/03-synchronization.py b/examples/18-multicore/03-synchronization.py
index 0033dd2..e9edc95 100644
--- a/examples/18-multicore/03-synchronization.py
+++ b/examples/18-multicore/03-synchronization.py
@@ -69,6 +69,8 @@ if __name__ == '__main__':
     signal, child = multiprocessing.Pipe()
     p1, p2 = Proc(1, child), Proc(2, child)
     main = Main()
-    p1.start(); p2.start(); main.start()
+    p1.start(); p2.start();
+    time.sleep(.05)
+    main.start()
     time.sleep(.05)
     signal.send(1)
diff --git a/examples/wxgui/01_gui_widgets_example.py b/examples/wxgui/01_gui_widgets_example.py
index a7b4d7c..4c2f384 100644
--- a/examples/wxgui/01_gui_widgets_example.py
+++ b/examples/wxgui/01_gui_widgets_example.py
@@ -95,8 +95,8 @@ class MyFrame(wx.Frame):
                                         integer=False,
                                         powoftwo=False,
                                         orient=wx.HORIZONTAL)
-        #print self.freq.getRange()
-        #print self.freq.isPowOfTwo()
+        #print(self.freq.getRange())
+        #print(self.freq.isPowOfTwo())
         self.freq.Bind(EVT_PYO_GUI_CONTROL_SLIDER, self.changeFreq)
         sizer.Add(self.freq, 0, wx.ALL | wx.EXPAND, 5)
         return sizer
diff --git a/include/pyomodule.h b/include/pyomodule.h
index bfb00aa..7839e2a 100644
--- a/include/pyomodule.h
+++ b/include/pyomodule.h
@@ -21,7 +21,7 @@
 #include "Python.h"
 #include <math.h>
 
-#define PYO_VERSION "0.8.6"
+#define PYO_VERSION "0.8.7"
 
 #ifndef __MYFLT_DEF
 #define __MYFLT_DEF
@@ -51,9 +51,13 @@
 #define TYPE_O_IF "O|if"
 #define TYPE_O_IFS "O|ifs"
 #define TYPE_S_IFF "s|iff"
+#define TYPE_P_IFF "s#|iff"
 #define TYPE_S_FIFF "s|fiff"
+#define TYPE_P_FIFF "s#|fiff"
 #define TYPE_S_FFIFF "s|ffiff"
+#define TYPE_P_FFIFF "s#|ffiff"
 #define TYPE_S__OIFI "s|Oifi"
+#define TYPE_P__OIFI "s#|Oifi"
 #define TYPE__FFFOO "|fffOO"
 #define TYPE__FFFIOO "|fffiOO"
 #define TYPE__FFFFFOO "|fffffOO"
@@ -137,9 +141,13 @@
 #define TYPE_O_IF "O|id"
 #define TYPE_O_IFS "O|ids"
 #define TYPE_S_IFF "s|idd"
+#define TYPE_P_IFF "s#|idd"
 #define TYPE_S_FIFF "s|didd"
+#define TYPE_P_FIFF "s#|didd"
 #define TYPE_S_FFIFF "s|ddidd"
+#define TYPE_P_FFIFF "s#|ddidd"
 #define TYPE_S__OIFI "s|Oidi"
+#define TYPE_P__OIFI "s#|Oidi"
 #define TYPE__FFFOO "|dddOO"
 #define TYPE__FFFIOO "|dddiOO"
 #define TYPE__FFFFFOO "|dddddOO"
@@ -1344,6 +1352,25 @@ extern PyTypeObject TableScanType;
  \
     return PyFloat_FromDouble(self->data[y][x]); \
 
+#define MATRIX_GET_INTERPOLATED \
+    MYFLT x = 0.0, y = 0.0; \
+    static char *kwlist[] = {"x", "y", NULL}; \
+ \
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE__FF, kwlist, &x, &y)) \
+        return PyInt_FromLong(-1); \
+ \
+    if (x < 0.0 || x > 1.0) { \
+        PyErr_SetString(PyExc_TypeError, "X position outside of matrix boundaries!."); \
+        return PyInt_FromLong(-1); \
+    } \
+ \
+    if (y < 0.0 || y > 1.0) { \
+        PyErr_SetString(PyExc_TypeError, "Y position outside of matrix boundaries!."); \
+        return PyInt_FromLong(-1); \
+    } \
+ \
+    return PyFloat_FromDouble(MatrixStream_getInterpPointFromPos(self->matrixstream, x, y)); \
+
 /* GETS & SETS */
 #define GET_SERVER \
     if (self->server == NULL) { \
diff --git a/include/servermodule.h b/include/servermodule.h
index 46ae7da..85dba44 100644
--- a/include/servermodule.h
+++ b/include/servermodule.h
@@ -101,6 +101,7 @@ typedef struct {
     int withPortMidi;
     int withPortMidiOut;
     int midiActive;
+    int allowMMMapper;
     int server_started;
     int server_stopped; /* for fadeout */
     int server_booted;
diff --git a/installers/osx/PkgResources_x86_64_py2/ReadMe.rtf b/installers/osx/PkgResources_x86_64_py2/ReadMe.rtf
index 84d1283..70bea13 100755
--- a/installers/osx/PkgResources_x86_64_py2/ReadMe.rtf
+++ b/installers/osx/PkgResources_x86_64_py2/ReadMe.rtf
@@ -1,82 +1,97 @@
-{\rtf1\ansi\deff3\adeflang1025
-{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}{\f4\froman\fprq2\fcharset0 Liberation Sans{\*\falt Arial};}{\f5\froman\fprq2\fcharset0 LucidaGrande;}{\f6\fnil\fprq2\fcharset0 FreeSans;}{\f7\fnil\fprq2\fcharset0 LucidaGrande;}{\f8\fnil\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}}
-{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}
-{\stylesheet{\s0\snext0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105 Normal;}
-{\s15\sbasedon0\snext16\ql\nowidctlpar\hyphpar0\sb240\sa120\keepn\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f4\fs28 Heading;}
-{\s16\sbasedon0\snext16\sl288\slmult1\ql\nowidctlpar\hyphpar0\sb0\sa140\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24 Text Body;}
-{\s17\sbasedon16\snext17\sl288\slmult1\ql\nowidctlpar\hyphpar0\sb0\sa140\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24 List;}
-{\s18\sbasedon0\snext18\ql\nowidctlpar\hyphpar0\sb120\sa120\ltrpar\cf1\i\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24 Caption;}
-{\s19\sbasedon0\snext19\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24 Index;}
-}{\*\generator LibreOffice/5.2.6.2$Linux_X86_64 LibreOffice_project/20m0$Build-2}{\info{\author Olivier }{\creatim\yr0\mo0\dy0\hr0\min0}{\revtim\yr2017\mo3\dy31\hr14\min21}{\printim\yr0\mo0\dy0\hr0\min0}}{\*\userprops}\deftab720
-\hyphauto0\viewscale120
-{\*\pgdsctbl
-{\pgdsc0\pgdscuse451\pgwsxn12240\pghsxn15840\marglsxn1440\margrsxn1440\margtsxn1440\margbsxn1440\pgdscnxt0 Default Style;}}
-\formshade{\*\pgdscno0}\paperh15840\paperw12240\margl1440\margr1440\margt1440\margb1440\sectd\sbknone\sectunlocked1\pgndec\pgwsxn12240\pghsxn15840\marglsxn1440\margrsxn1440\margtsxn1440\margbsxn1440\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
-{\*\ftnsep}\pgndec\pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-Python-pyo (version 0.8.}{\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-5}{\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-) for python 2.7}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-System requirements : macOS 10.6 to 10.12}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-This package installs all the required components to run pyo inside your current Python installation. Python 2.7 (32/64 bit) must be already installed on your system.}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-This package is divided into two separate installers. If you do not require one of them, please unselect the package in custom installation mode.}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-1. pyo extension:}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-The following components will be installed in the site-packages folder of the current Python Framework:}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0\dbch\af7\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-_pyo.so}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-_pyo64.so}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-pyo.py}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-pyo64.py}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-pyolib (folder)}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0\dbch\af7\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-2. Support libraries (i386 and x86_64):}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-This component will install a number of dynamic libraries on which pyo depends. If you already have these, then you can skip this installation.}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0\dbch\af7\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-Warning:}{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
- this installation will overwrite any previously installed libraries. These are the libraries that will be installed in your /usr/local/lib directory:}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0\dbch\af7\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-liblo.7.dylib}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-libportaudio.2.dylib}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-libportmidi.dylib}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-libsndfile.1.dylib}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-libFLAC.8.dylib}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-libvorbisenc.2.dylib}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-libvorbis.0.dylib}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-libogg.0.dylib}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0\dbch\af7\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-Olivier B\u233\'e9langer, 2016}
-\par }
\ No newline at end of file
+{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+{\fonttbl\f0\fnil\fcharset0 LucidaGrande;\f1\froman\fcharset0 Times-Roman;}
+{\colortbl;\red255\green255\blue255;}
+{\info
+{\author Olivier }}\margl1440\margr1440\vieww10800\viewh8400\viewkind0
+\deftab720
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\f0\fs26 \cf0 Python-pyo (version 0.8.7) for python 2.7
+\f1\fs24 \
+
+\f0\fs26 \
+System requirements : macOS 10.6 to 10.12
+\f1\fs24 \
+
+\f0\fs26 \
+This package installs all the required components to run pyo inside your current Python installation. Python 2.7 (32/64 bit) must be already installed on your system.
+\f1\fs24 \
+
+\f0\fs26 \
+This package is divided into two separate installers. If you do not require one of them, please unselect the package in custom installation mode.
+\f1\fs24 \
+
+\f0\fs26 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\b \cf0 1. pyo extension:
+\f1\b0\fs24 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\f0\fs26 \cf0 The following components will be installed in the site-packages folder of the current Python Framework:
+\f1\fs24 \
+
+\f0\fs26 \
+_pyo.so
+\f1\fs24 \
+
+\f0\fs26 _pyo64.so
+\f1\fs24 \
+
+\f0\fs26 pyo.py
+\f1\fs24 \
+
+\f0\fs26 pyo64.py
+\f1\fs24 \
+
+\f0\fs26 pyolib (folder)
+\f1\fs24 \
+
+\f0\fs26 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\b \cf0 2. Support libraries (i386 and x86_64):
+\f1\b0\fs24 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\f0\fs26 \cf0 This component will install a number of dynamic libraries on which pyo depends. If you already have these, then you can skip this installation.
+\f1\fs24 \
+
+\f0\fs26 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\b \cf0 Warning:
+\b0  this installation will overwrite any previously installed libraries. These are the libraries that will be installed in your /usr/local/lib directory:
+\f1\fs24 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\f0\fs26 \cf0 \
+liblo.7.dylib
+\f1\fs24 \
+
+\f0\fs26 libportaudio.2.dylib
+\f1\fs24 \
+
+\f0\fs26 libportmidi.dylib
+\f1\fs24 \
+
+\f0\fs26 libsndfile.1.dylib
+\f1\fs24 \
+
+\f0\fs26 libFLAC.8.dylib
+\f1\fs24 \
+
+\f0\fs26 libvorbisenc.2.dylib
+\f1\fs24 \
+
+\f0\fs26 libvorbis.0.dylib
+\f1\fs24 \
+
+\f0\fs26 libogg.0.dylib
+\f1\fs24 \
+
+\f0\fs26 \
+\pard\pardeftab720
+\cf0 Olivier B\'e9langer, 2017
+\f1\fs24 \
+}
\ No newline at end of file
diff --git a/installers/osx/PkgResources_x86_64_py3/ReadMe.rtf b/installers/osx/PkgResources_x86_64_py3/ReadMe.rtf
deleted file mode 100755
index 0a5c3e1..0000000
--- a/installers/osx/PkgResources_x86_64_py3/ReadMe.rtf
+++ /dev/null
@@ -1,82 +0,0 @@
-{\rtf1\ansi\deff3\adeflang1025
-{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}{\f4\froman\fprq2\fcharset0 Liberation Sans{\*\falt Arial};}{\f5\froman\fprq2\fcharset0 LucidaGrande;}{\f6\fnil\fprq2\fcharset0 FreeSans;}{\f7\fnil\fprq2\fcharset0 LucidaGrande;}{\f8\fnil\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}}
-{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}
-{\stylesheet{\s0\snext0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105 Normal;}
-{\s15\sbasedon0\snext16\ql\nowidctlpar\hyphpar0\sb240\sa120\keepn\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f4\fs28 Heading;}
-{\s16\sbasedon0\snext16\sl288\slmult1\ql\nowidctlpar\hyphpar0\sb0\sa140\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24 Text Body;}
-{\s17\sbasedon16\snext17\sl288\slmult1\ql\nowidctlpar\hyphpar0\sb0\sa140\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24 List;}
-{\s18\sbasedon0\snext18\ql\nowidctlpar\hyphpar0\sb120\sa120\ltrpar\cf1\i\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24 Caption;}
-{\s19\sbasedon0\snext19\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24 Index;}
-}{\*\generator LibreOffice/5.2.6.2$Linux_X86_64 LibreOffice_project/20m0$Build-2}{\info{\author Olivier }{\creatim\yr0\mo0\dy0\hr0\min0}{\revtim\yr2017\mo3\dy31\hr14\min22}{\printim\yr0\mo0\dy0\hr0\min0}}{\*\userprops}\deftab720
-\hyphauto0\viewscale120
-{\*\pgdsctbl
-{\pgdsc0\pgdscuse451\pgwsxn12240\pghsxn15840\marglsxn1440\margrsxn1440\margtsxn1440\margbsxn1440\pgdscnxt0 Default Style;}}
-\formshade{\*\pgdscno0}\paperh15840\paperw12240\margl1440\margr1440\margt1440\margb1440\sectd\sbknone\sectunlocked1\pgndec\pgwsxn12240\pghsxn15840\marglsxn1440\margrsxn1440\margtsxn1440\margbsxn1440\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
-{\*\ftnsep}\pgndec\pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-Python-pyo (version 0.8.}{\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-5}{\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-) for python 3.5}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-System requirements : macOS 10.8 to 10.12}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-This package installs all the required components to run pyo inside your current Python installation. Python 3.5 (32/64 bit) must be already installed on your system.}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-This package is divided into two separate installers. If you do not require one of them, please unselect the package in custom installation mode.}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-1. pyo extension:}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-The following components will be installed in the site-packages folder of the current Python Framework:}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0\dbch\af7\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-_pyo.cpython-35m-darwin.so}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-_pyo64.cpython-35m-darwin.so}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-pyo.py}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-pyo64.py}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-pyolib (folder)}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0\dbch\af7\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-2. Support libraries (i386 and x86_64):}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-This component will install a number of dynamic libraries on which pyo depends. If you already have these, then you can skip this installation.}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0\dbch\af7\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-Warning:}{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
- this installation will overwrite any previously installed libraries. These are the libraries that will be installed in your /usr/local/lib directory:}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0\dbch\af7\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-liblo.7.dylib}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-libportaudio.2.dylib}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-libportmidi.dylib}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-libsndfile.1.dylib}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-libFLAC.8.dylib}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-libvorbisenc.2.dylib}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-libvorbis.0.dylib}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-libogg.0.dylib}
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\hyphpar0\dbch\af7\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-
-\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af8\afs24\alang4105\loch\f3\fs24\lang4105\nowidctlpar\hyphpar0{\b0\dbch\af7\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-Olivier B\u233\'e9langer, 2016}
-\par }
\ No newline at end of file
diff --git a/installers/osx/PkgResources_x86_64_py3/License.rtf b/installers/osx/PkgResources_x86_64_py35/License.rtf
similarity index 100%
rename from installers/osx/PkgResources_x86_64_py3/License.rtf
rename to installers/osx/PkgResources_x86_64_py35/License.rtf
diff --git a/installers/osx/PkgResources_x86_64_py35/ReadMe.rtf b/installers/osx/PkgResources_x86_64_py35/ReadMe.rtf
new file mode 100755
index 0000000..d763b09
--- /dev/null
+++ b/installers/osx/PkgResources_x86_64_py35/ReadMe.rtf
@@ -0,0 +1,97 @@
+{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+{\fonttbl\f0\fnil\fcharset0 LucidaGrande;\f1\froman\fcharset0 Times-Roman;}
+{\colortbl;\red255\green255\blue255;}
+{\info
+{\author Olivier }}\margl1440\margr1440\vieww10800\viewh8400\viewkind0
+\deftab720
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\f0\fs26 \cf0 Python-pyo (version 0.8.7) for python 3.5
+\f1\fs24 \
+
+\f0\fs26 \
+System requirements : macOS 10.8 to 10.12
+\f1\fs24 \
+
+\f0\fs26 \
+This package installs all the required components to run pyo inside your current Python installation. Python 3.5 (32/64 bit) must be already installed on your system.
+\f1\fs24 \
+
+\f0\fs26 \
+This package is divided into two separate installers. If you do not require one of them, please unselect the package in custom installation mode.
+\f1\fs24 \
+
+\f0\fs26 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\b \cf0 1. pyo extension:
+\f1\b0\fs24 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\f0\fs26 \cf0 The following components will be installed in the site-packages folder of the current Python Framework:
+\f1\fs24 \
+
+\f0\fs26 \
+_pyo.cpython-35m-darwin.so
+\f1\fs24 \
+
+\f0\fs26 _pyo64.cpython-35m-darwin.so
+\f1\fs24 \
+
+\f0\fs26 pyo.py
+\f1\fs24 \
+
+\f0\fs26 pyo64.py
+\f1\fs24 \
+
+\f0\fs26 pyolib (folder)
+\f1\fs24 \
+
+\f0\fs26 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\b \cf0 2. Support libraries (i386 and x86_64):
+\f1\b0\fs24 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\f0\fs26 \cf0 This component will install a number of dynamic libraries on which pyo depends. If you already have these, then you can skip this installation.
+\f1\fs24 \
+
+\f0\fs26 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\b \cf0 Warning:
+\b0  this installation will overwrite any previously installed libraries. These are the libraries that will be installed in your /usr/local/lib directory:
+\f1\fs24 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\f0\fs26 \cf0 \
+liblo.7.dylib
+\f1\fs24 \
+
+\f0\fs26 libportaudio.2.dylib
+\f1\fs24 \
+
+\f0\fs26 libportmidi.dylib
+\f1\fs24 \
+
+\f0\fs26 libsndfile.1.dylib
+\f1\fs24 \
+
+\f0\fs26 libFLAC.8.dylib
+\f1\fs24 \
+
+\f0\fs26 libvorbisenc.2.dylib
+\f1\fs24 \
+
+\f0\fs26 libvorbis.0.dylib
+\f1\fs24 \
+
+\f0\fs26 libogg.0.dylib
+\f1\fs24 \
+
+\f0\fs26 \
+\pard\pardeftab720
+\cf0 Olivier B\'e9langer, 2017
+\f1\fs24 \
+}
\ No newline at end of file
diff --git a/installers/osx/PkgResources_x86_64_py3/Welcome.rtf b/installers/osx/PkgResources_x86_64_py35/Welcome.rtf
similarity index 100%
rename from installers/osx/PkgResources_x86_64_py3/Welcome.rtf
rename to installers/osx/PkgResources_x86_64_py35/Welcome.rtf
diff --git a/installers/osx/PkgResources_x86_64_py3/postinstall b/installers/osx/PkgResources_x86_64_py35/postinstall
similarity index 100%
copy from installers/osx/PkgResources_x86_64_py3/postinstall
copy to installers/osx/PkgResources_x86_64_py35/postinstall
diff --git a/installers/osx/PkgResources_x86_64_py3/postupgrade b/installers/osx/PkgResources_x86_64_py35/postupgrade
similarity index 100%
copy from installers/osx/PkgResources_x86_64_py3/postupgrade
copy to installers/osx/PkgResources_x86_64_py35/postupgrade
diff --git a/installers/osx/PkgResources_x86_64_py2/License.rtf b/installers/osx/PkgResources_x86_64_py36/License.rtf
similarity index 100%
copy from installers/osx/PkgResources_x86_64_py2/License.rtf
copy to installers/osx/PkgResources_x86_64_py36/License.rtf
diff --git a/installers/osx/PkgResources_x86_64_py36/ReadMe.rtf b/installers/osx/PkgResources_x86_64_py36/ReadMe.rtf
new file mode 100755
index 0000000..d2bd3cd
--- /dev/null
+++ b/installers/osx/PkgResources_x86_64_py36/ReadMe.rtf
@@ -0,0 +1,97 @@
+{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+{\fonttbl\f0\fnil\fcharset0 LucidaGrande;\f1\froman\fcharset0 Times-Roman;}
+{\colortbl;\red255\green255\blue255;}
+{\info
+{\author Olivier }}\margl1440\margr1440\vieww10800\viewh8400\viewkind0
+\deftab720
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\f0\fs26 \cf0 Python-pyo (version 0.8.7) for python 3.6
+\f1\fs24 \
+
+\f0\fs26 \
+System requirements : macOS 10.8 to 10.12
+\f1\fs24 \
+
+\f0\fs26 \
+This package installs all the required components to run pyo inside your current Python installation. Python 3.6 (32/64 bit) must be already installed on your system.
+\f1\fs24 \
+
+\f0\fs26 \
+This package is divided into two separate installers. If you do not require one of them, please unselect the package in custom installation mode.
+\f1\fs24 \
+
+\f0\fs26 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\b \cf0 1. pyo extension:
+\f1\b0\fs24 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\f0\fs26 \cf0 The following components will be installed in the site-packages folder of the current Python Framework:
+\f1\fs24 \
+
+\f0\fs26 \
+_pyo.cpython-36m-darwin.so
+\f1\fs24 \
+
+\f0\fs26 _pyo64.cpython-36m-darwin.so
+\f1\fs24 \
+
+\f0\fs26 pyo.py
+\f1\fs24 \
+
+\f0\fs26 pyo64.py
+\f1\fs24 \
+
+\f0\fs26 pyolib (folder)
+\f1\fs24 \
+
+\f0\fs26 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\b \cf0 2. Support libraries (i386 and x86_64):
+\f1\b0\fs24 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\f0\fs26 \cf0 This component will install a number of dynamic libraries on which pyo depends. If you already have these, then you can skip this installation.
+\f1\fs24 \
+
+\f0\fs26 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\b \cf0 Warning:
+\b0  this installation will overwrite any previously installed libraries. These are the libraries that will be installed in your /usr/local/lib directory:
+\f1\fs24 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720
+
+\f0\fs26 \cf0 \
+liblo.7.dylib
+\f1\fs24 \
+
+\f0\fs26 libportaudio.2.dylib
+\f1\fs24 \
+
+\f0\fs26 libportmidi.dylib
+\f1\fs24 \
+
+\f0\fs26 libsndfile.1.dylib
+\f1\fs24 \
+
+\f0\fs26 libFLAC.8.dylib
+\f1\fs24 \
+
+\f0\fs26 libvorbisenc.2.dylib
+\f1\fs24 \
+
+\f0\fs26 libvorbis.0.dylib
+\f1\fs24 \
+
+\f0\fs26 libogg.0.dylib
+\f1\fs24 \
+
+\f0\fs26 \
+\pard\pardeftab720
+\cf0 Olivier B\'e9langer, 2017
+\f1\fs24 \
+}
\ No newline at end of file
diff --git a/installers/osx/PkgResources_x86_64_py2/Welcome.rtf b/installers/osx/PkgResources_x86_64_py36/Welcome.rtf
similarity index 100%
copy from installers/osx/PkgResources_x86_64_py2/Welcome.rtf
copy to installers/osx/PkgResources_x86_64_py36/Welcome.rtf
diff --git a/installers/osx/PkgResources_x86_64_py3/postinstall b/installers/osx/PkgResources_x86_64_py36/postinstall
similarity index 66%
rename from installers/osx/PkgResources_x86_64_py3/postinstall
rename to installers/osx/PkgResources_x86_64_py36/postinstall
index d3b0e5a..0e9e5b6 100755
--- a/installers/osx/PkgResources_x86_64_py3/postinstall
+++ b/installers/osx/PkgResources_x86_64_py36/postinstall
@@ -1,7 +1,7 @@
 #! /bin/sh
 
 # Removed older versions in the python site-packages builtin and in the python site-packages from python.org directories
-PATHS=/Library/Python/3.5/site-packages/:/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/
+PATHS=/Library/Python/3.6/site-packages/:/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/
 for path in ${PATHS//:/ }; do
     if cd $path; then
         if [ -f pyo.py ]; then
@@ -16,10 +16,10 @@ for path in ${PATHS//:/ }; do
         if [ -f pyo64.pyc ]; then
             sudo rm pyo64.pyc;
         fi    
-        if [ -f _pyo.cpython-35m-darwin.so ]; then
+        if [ -f _pyo.cpython-36m-darwin.so ]; then
             sudo rm _pyo.so;
         fi    
-        if [ -f _pyo64.cpython-35m-darwin.so ]; then
+        if [ -f _pyo64.cpython-36m-darwin.so ]; then
             sudo rm _pyo64.so;
         fi    
         if [ -d pyolib ]; then
@@ -33,30 +33,30 @@ for path in ${PATHS//:/ }; do
 done
 
 # Install pyo in the python site-packages builtin directories
-if cd /Library/Python/3.5/site-packages/; then
-    sudo cp -r /tmp/python35/* .
+if cd /Library/Python/3.6/site-packages/; then
+    sudo cp -r /tmp/python36/* .
 else
-    sudo mkdir -p /Library/Python/3.5/site-packages/
-    cd /Library/Python/3.5/site-packages/
-    sudo cp -r /tmp/python35/* .
+    sudo mkdir -p /Library/Python/3.6/site-packages/
+    cd /Library/Python/3.6/site-packages/
+    sudo cp -r /tmp/python36/* .
 fi
 
 # Install pyo in the python.org site-packages directories
-if cd /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/; then  
-    sudo cp -r /tmp/python35/* .
+if cd /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/; then  
+    sudo cp -r /tmp/python36/* .
 else
-    sudo mkdir -p /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/
-    cd /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/
-    sudo cp -r /tmp/python35/* .
+    sudo mkdir -p /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/
+    cd /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/
+    sudo cp -r /tmp/python36/* .
 fi
 
 # Check if anaconda is already installed and copy files to site-packages directory
-if cd ~/anaconda/lib/python3.5/site-packages/; then  
-    sudo cp -r /tmp/python35/* .
+if cd ~/anaconda/lib/python3.6/site-packages/; then  
+    sudo cp -r /tmp/python36/* .
 fi
 
 # Clean up.
-sudo rm -rf /tmp/python35
+sudo rm -rf /tmp/python36
 
 # Add /usr/local/lib in .bash_profile if not already done
 searchString="/usr/local/lib"
diff --git a/installers/osx/PkgResources_x86_64_py3/postupgrade b/installers/osx/PkgResources_x86_64_py36/postupgrade
similarity index 66%
rename from installers/osx/PkgResources_x86_64_py3/postupgrade
rename to installers/osx/PkgResources_x86_64_py36/postupgrade
index d3b0e5a..0e9e5b6 100755
--- a/installers/osx/PkgResources_x86_64_py3/postupgrade
+++ b/installers/osx/PkgResources_x86_64_py36/postupgrade
@@ -1,7 +1,7 @@
 #! /bin/sh
 
 # Removed older versions in the python site-packages builtin and in the python site-packages from python.org directories
-PATHS=/Library/Python/3.5/site-packages/:/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/
+PATHS=/Library/Python/3.6/site-packages/:/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/
 for path in ${PATHS//:/ }; do
     if cd $path; then
         if [ -f pyo.py ]; then
@@ -16,10 +16,10 @@ for path in ${PATHS//:/ }; do
         if [ -f pyo64.pyc ]; then
             sudo rm pyo64.pyc;
         fi    
-        if [ -f _pyo.cpython-35m-darwin.so ]; then
+        if [ -f _pyo.cpython-36m-darwin.so ]; then
             sudo rm _pyo.so;
         fi    
-        if [ -f _pyo64.cpython-35m-darwin.so ]; then
+        if [ -f _pyo64.cpython-36m-darwin.so ]; then
             sudo rm _pyo64.so;
         fi    
         if [ -d pyolib ]; then
@@ -33,30 +33,30 @@ for path in ${PATHS//:/ }; do
 done
 
 # Install pyo in the python site-packages builtin directories
-if cd /Library/Python/3.5/site-packages/; then
-    sudo cp -r /tmp/python35/* .
+if cd /Library/Python/3.6/site-packages/; then
+    sudo cp -r /tmp/python36/* .
 else
-    sudo mkdir -p /Library/Python/3.5/site-packages/
-    cd /Library/Python/3.5/site-packages/
-    sudo cp -r /tmp/python35/* .
+    sudo mkdir -p /Library/Python/3.6/site-packages/
+    cd /Library/Python/3.6/site-packages/
+    sudo cp -r /tmp/python36/* .
 fi
 
 # Install pyo in the python.org site-packages directories
-if cd /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/; then  
-    sudo cp -r /tmp/python35/* .
+if cd /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/; then  
+    sudo cp -r /tmp/python36/* .
 else
-    sudo mkdir -p /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/
-    cd /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/
-    sudo cp -r /tmp/python35/* .
+    sudo mkdir -p /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/
+    cd /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/
+    sudo cp -r /tmp/python36/* .
 fi
 
 # Check if anaconda is already installed and copy files to site-packages directory
-if cd ~/anaconda/lib/python3.5/site-packages/; then  
-    sudo cp -r /tmp/python35/* .
+if cd ~/anaconda/lib/python3.6/site-packages/; then  
+    sudo cp -r /tmp/python36/* .
 fi
 
 # Clean up.
-sudo rm -rf /tmp/python35
+sudo rm -rf /tmp/python36
 
 # Add /usr/local/lib in .bash_profile if not already done
 searchString="/usr/local/lib"
diff --git a/installers/osx/release_x86_64_py2.sh b/installers/osx/release_x86_64_py2.sh
index f65a80f..2db031e 100755
--- a/installers/osx/release_x86_64_py2.sh
+++ b/installers/osx/release_x86_64_py2.sh
@@ -1,16 +1,16 @@
 #!/bin/sh
 
 # Need Xcode 3.2.6 or later (pkgbuild and productbuild)
-# with python 2.7.12 (32/64-bit) and wxpython 3.0.2.0 (classic) installed
+# with python 2.7.13 (32/64-bit) and wxpython 3.0.2.0 (classic) installed
 
 # 1. update pyo sources
 # 2. compile and install pyo float and double for python2
 # 3. cd utils and build E-Pyo for python2
 # 4. cd installers/osx and build the release for python2
 
-export PACKAGE_NAME=pyo_0.8.6_x86_64_py2.pkg
-export DMG_DIR="pyo 0.8.6 py2 Universal"
-export DMG_NAME="pyo_0.8.6_OSX_py2-universal.dmg"
+export PACKAGE_NAME=pyo_0.8.7_x86_64_py2.pkg
+export DMG_DIR="pyo 0.8.7 py2 Universal"
+export DMG_NAME="pyo_0.8.7_OSX_py2-universal.dmg"
 export INSTALLER_DIR=`pwd`/installer
 export PYO_MODULE_DIR=$INSTALLER_DIR/PyoModule/Package_Contents/tmp
 export SUPPORT_LIBS_DIR=$INSTALLER_DIR/SupportLibs/Package_Contents/usr/local/lib
diff --git a/installers/osx/release_x86_64_py3.sh b/installers/osx/release_x86_64_py3.5.sh
similarity index 88%
copy from installers/osx/release_x86_64_py3.sh
copy to installers/osx/release_x86_64_py3.5.sh
index 8d78450..0cee288 100755
--- a/installers/osx/release_x86_64_py3.sh
+++ b/installers/osx/release_x86_64_py3.5.sh
@@ -1,21 +1,21 @@
 #!/bin/sh
 
 # Need Xcode 3.2.6 or later (pkgbuild and productbuild)
-# with python 3.5.2 (32/64-bit) and wxpython 3.0.3.0 (phoenix) installed
+# with python 3.5.4 (32/64-bit) and wxpython 4.0.0b1 (phoenix) installed
 
 # 1. update pyo sources
-# 2. compile and install pyo float and double for python3
-# 3. cd utils and build E-Pyo for python3
-# 4. cd installers/osx and build the release for python3
+# 2. compile and install pyo float and double for python3.5
+# 3. cd utils and build E-Pyo for python3.5
+# 4. cd installers/osx and build the release for python3.5
 
-export PACKAGE_NAME=pyo_0.8.6_x86_64_py3.pkg
-export DMG_DIR="pyo 0.8.6 py3 Universal"
-export DMG_NAME="pyo_0.8.6_OSX_py3-universal.dmg"
+export PACKAGE_NAME=pyo_0.8.7_x86_64_py35.pkg
+export DMG_DIR="pyo 0.8.7 py35 Universal"
+export DMG_NAME="pyo_0.8.7_OSX_py35-universal.dmg"
 export INSTALLER_DIR=`pwd`/installer
 export PYO_MODULE_DIR=$INSTALLER_DIR/PyoModule/Package_Contents/tmp
 export SUPPORT_LIBS_DIR=$INSTALLER_DIR/SupportLibs/Package_Contents/usr/local/lib
 export BUILD_RESOURCES=$INSTALLER_DIR/PkgResources/English.lproj
-export PKG_RESOURCES=$INSTALLER_DIR/../PkgResources_x86_64_py3
+export PKG_RESOURCES=$INSTALLER_DIR/../PkgResources_x86_64_py35
 
 mkdir -p $PYO_MODULE_DIR
 mkdir -p $SUPPORT_LIBS_DIR
@@ -74,13 +74,13 @@ sudo chmod -R 755 SupportLibs/Package_Contents/usr
 
 echo "building packages..."
 
-pkgbuild    --identifier com.iact.umontreal.ca.pyo.py3.tmp.pkg \
+pkgbuild    --identifier com.iact.umontreal.ca.pyo.py35.tmp.pkg \
             --root PyoModule/Package_Contents/ \
             --version 1.0 \
             --scripts $PKG_RESOURCES \
             PyoModule.pkg
 
-pkgbuild    --identifier com.iact.umontreal.ca.pyo.py3.usr.pkg \
+pkgbuild    --identifier com.iact.umontreal.ca.pyo.py35.usr.pkg \
             --root SupportLibs/Package_Contents/ \
             --version 1.0 \
             SupportLibs.pkg
@@ -92,7 +92,7 @@ echo "assembling DMG..."
 mkdir "$DMG_DIR"
 cd "$DMG_DIR"
 cp ../$PACKAGE_NAME .
-cp -R ../../../../utils/E-Pyo_OSX_py3/E-Pyo.app .
+cp -R ../../../../utils/E-Pyo_OSX_py35/E-Pyo.app .
 ln -s /Applications .
 cd ..
 
diff --git a/installers/osx/release_x86_64_py3.sh b/installers/osx/release_x86_64_py3.6.sh
similarity index 78%
rename from installers/osx/release_x86_64_py3.sh
rename to installers/osx/release_x86_64_py3.6.sh
index 8d78450..367a5d0 100755
--- a/installers/osx/release_x86_64_py3.sh
+++ b/installers/osx/release_x86_64_py3.6.sh
@@ -1,21 +1,21 @@
 #!/bin/sh
 
 # Need Xcode 3.2.6 or later (pkgbuild and productbuild)
-# with python 3.5.2 (32/64-bit) and wxpython 3.0.3.0 (phoenix) installed
+# with python 3.6.2 (32/64-bit) and wxpython 4.0.0b1 (phoenix) installed
 
 # 1. update pyo sources
-# 2. compile and install pyo float and double for python3
-# 3. cd utils and build E-Pyo for python3
-# 4. cd installers/osx and build the release for python3
+# 2. compile and install pyo float and double for python3.6
+# 3. cd utils and build E-Pyo for python3.6
+# 4. cd installers/osx and build the release for python3.6
 
-export PACKAGE_NAME=pyo_0.8.6_x86_64_py3.pkg
-export DMG_DIR="pyo 0.8.6 py3 Universal"
-export DMG_NAME="pyo_0.8.6_OSX_py3-universal.dmg"
+export PACKAGE_NAME=pyo_0.8.7_x86_64_py36.pkg
+export DMG_DIR="pyo 0.8.7 py36 Universal"
+export DMG_NAME="pyo_0.8.7_OSX_py36-universal.dmg"
 export INSTALLER_DIR=`pwd`/installer
 export PYO_MODULE_DIR=$INSTALLER_DIR/PyoModule/Package_Contents/tmp
 export SUPPORT_LIBS_DIR=$INSTALLER_DIR/SupportLibs/Package_Contents/usr/local/lib
 export BUILD_RESOURCES=$INSTALLER_DIR/PkgResources/English.lproj
-export PKG_RESOURCES=$INSTALLER_DIR/../PkgResources_x86_64_py3
+export PKG_RESOURCES=$INSTALLER_DIR/../PkgResources_x86_64_py36
 
 mkdir -p $PYO_MODULE_DIR
 mkdir -p $SUPPORT_LIBS_DIR
@@ -29,19 +29,19 @@ cd ../..
 git checkout-index -a -f --prefix=installers/osx/installer/pyo-build/
 cd installers/osx/installer/pyo-build
 
-echo "building pyo for python 3.5 (64-bit)..."
-sudo /usr/local/bin/python3.5 setup.py install --use-coreaudio --use-double
+echo "building pyo for python 3.6 (64-bit)..."
+sudo /usr/local/bin/python3.6 setup.py install --use-coreaudio --use-double
 
-sudo cp -R build/lib.macosx-10.6-intel-3.5 $PYO_MODULE_DIR/python35
+sudo cp -R build/lib.macosx-10.6-intel-3.6 $PYO_MODULE_DIR/python36
 
-sudo install_name_tool -change /usr/local/opt/portmidi/lib/libportmidi.dylib /usr/local/lib/libportmidi.dylib $PYO_MODULE_DIR/python35/_pyo.cpython-35m-darwin.so
-sudo install_name_tool -change /usr/local/opt/portmidi/lib/libportmidi.dylib /usr/local/lib/libportmidi.dylib $PYO_MODULE_DIR/python35/_pyo64.cpython-35m-darwin.so
-sudo install_name_tool -change /usr/local/opt/portaudio/lib/libportaudio.2.dylib /usr/local/lib/libportaudio.2.dylib $PYO_MODULE_DIR/python35/_pyo.cpython-35m-darwin.so
-sudo install_name_tool -change /usr/local/opt/portaudio/lib/libportaudio.2.dylib /usr/local/lib/libportaudio.2.dylib $PYO_MODULE_DIR/python35/_pyo64.cpython-35m-darwin.so
-sudo install_name_tool -change /usr/local/opt/liblo/lib/liblo.7.dylib /usr/local/lib/liblo.7.dylib $PYO_MODULE_DIR/python35/_pyo.cpython-35m-darwin.so
-sudo install_name_tool -change /usr/local/opt/liblo/lib/liblo.7.dylib /usr/local/lib/liblo.7.dylib $PYO_MODULE_DIR/python35/_pyo64.cpython-35m-darwin.so
-sudo install_name_tool -change /usr/local/opt/libsndfile/lib/libsndfile.1.dylib /usr/local/lib/libsndfile.1.dylib $PYO_MODULE_DIR/python35/_pyo.cpython-35m-darwin.so
-sudo install_name_tool -change /usr/local/opt/libsndfile/lib/libsndfile.1.dylib /usr/local/lib/libsndfile.1.dylib $PYO_MODULE_DIR/python35/_pyo64.cpython-35m-darwin.so
+sudo install_name_tool -change /usr/local/opt/portmidi/lib/libportmidi.dylib /usr/local/lib/libportmidi.dylib $PYO_MODULE_DIR/python36/_pyo.cpython-36m-darwin.so
+sudo install_name_tool -change /usr/local/opt/portmidi/lib/libportmidi.dylib /usr/local/lib/libportmidi.dylib $PYO_MODULE_DIR/python36/_pyo64.cpython-36m-darwin.so
+sudo install_name_tool -change /usr/local/opt/portaudio/lib/libportaudio.2.dylib /usr/local/lib/libportaudio.2.dylib $PYO_MODULE_DIR/python36/_pyo.cpython-36m-darwin.so
+sudo install_name_tool -change /usr/local/opt/portaudio/lib/libportaudio.2.dylib /usr/local/lib/libportaudio.2.dylib $PYO_MODULE_DIR/python36/_pyo64.cpython-36m-darwin.so
+sudo install_name_tool -change /usr/local/opt/liblo/lib/liblo.7.dylib /usr/local/lib/liblo.7.dylib $PYO_MODULE_DIR/python36/_pyo.cpython-36m-darwin.so
+sudo install_name_tool -change /usr/local/opt/liblo/lib/liblo.7.dylib /usr/local/lib/liblo.7.dylib $PYO_MODULE_DIR/python36/_pyo64.cpython-36m-darwin.so
+sudo install_name_tool -change /usr/local/opt/libsndfile/lib/libsndfile.1.dylib /usr/local/lib/libsndfile.1.dylib $PYO_MODULE_DIR/python36/_pyo.cpython-36m-darwin.so
+sudo install_name_tool -change /usr/local/opt/libsndfile/lib/libsndfile.1.dylib /usr/local/lib/libsndfile.1.dylib $PYO_MODULE_DIR/python36/_pyo64.cpython-36m-darwin.so
 
 cd ..
 
@@ -74,13 +74,13 @@ sudo chmod -R 755 SupportLibs/Package_Contents/usr
 
 echo "building packages..."
 
-pkgbuild    --identifier com.iact.umontreal.ca.pyo.py3.tmp.pkg \
+pkgbuild    --identifier com.iact.umontreal.ca.pyo.py36.tmp.pkg \
             --root PyoModule/Package_Contents/ \
             --version 1.0 \
             --scripts $PKG_RESOURCES \
             PyoModule.pkg
 
-pkgbuild    --identifier com.iact.umontreal.ca.pyo.py3.usr.pkg \
+pkgbuild    --identifier com.iact.umontreal.ca.pyo.py36.usr.pkg \
             --root SupportLibs/Package_Contents/ \
             --version 1.0 \
             SupportLibs.pkg
@@ -92,7 +92,7 @@ echo "assembling DMG..."
 mkdir "$DMG_DIR"
 cd "$DMG_DIR"
 cp ../$PACKAGE_NAME .
-cp -R ../../../../utils/E-Pyo_OSX_py3/E-Pyo.app .
+cp -R ../../../../utils/E-Pyo_OSX_py36/E-Pyo.app .
 ln -s /Applications .
 cd ..
 
diff --git a/installers/win/README-win32-py35.txt b/installers/win/README-win32-py36.txt
similarity index 82%
copy from installers/win/README-win32-py35.txt
copy to installers/win/README-win32-py36.txt
index a1cd9e3..4b83913 100644
--- a/installers/win/README-win32-py35.txt
+++ b/installers/win/README-win32-py36.txt
@@ -1,10 +1,10 @@
 Pyo is a Python module written in C to help digital signal processing script creation.
 
-* Python 3.5 must be installed on your system before running this installer. *
+* Python 3.6 must be installed on your system before running this installer. *
 
 http://www.python.org/download/
 
-To use the WxPython toolkit for widgets, you need to install wxPython Phoenix (3.0.3+) for python 3.5:
+To use the WxPython toolkit for widgets, you need to install wxPython Phoenix (4.0.0b1+) for python 3.6:
 
 http://www.wxpython.org/download.php#stable
 
diff --git a/installers/win/build_installers_win.bat b/installers/win/build_installers_win.bat
index 4278992..cc6c15f 100644
--- a/installers/win/build_installers_win.bat
+++ b/installers/win/build_installers_win.bat
@@ -5,3 +5,6 @@ Compil32 /cc "win_installer_py27.iss"
 
 echo *** Build installer for python3.5 ***
 Compil32 /cc "win_installer_py35.iss"
+
+echo *** Build installer for python3.6 ***
+Compil32 /cc "win_installer_py36.iss"
diff --git a/installers/win/win_installer_py27.iss b/installers/win/win_installer_py27.iss
index 4b2c76d..20209f8 100644
--- a/installers/win/win_installer_py27.iss
+++ b/installers/win/win_installer_py27.iss
@@ -3,7 +3,7 @@
 
 #define appName "pyo"
 #define pyVer "2.7"
-#define appVer "0.8.6"
+#define appVer "0.8.7"
 
 [Setup]
 ; NOTE: The value of AppId uniquely identifies this application.
@@ -45,8 +45,10 @@ Source: "C:\Python27\Lib\site-packages\liblo-7.dll"; DestDir: "{app}\Lib\site-pa
 Source: "C:\Python27\Lib\site-packages\portaudio.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 Source: "C:\Python27\Lib\site-packages\portmidi.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 Source: "C:\Python27\Lib\site-packages\porttime.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
-Source: "C:\Python27\Lib\site-packages\pthreadVC2.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
-Source: "C:\Python27\Lib\site-packages\msvcr90.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Python27\Lib\site-packages\pthreadGC2.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Python27\Lib\site-packages\pthreadVC2.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Python27\Lib\site-packages\msvcr90.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Python27\Lib\site-packages\msvcr100.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 Source: "C:\MinGW\bin\libgcc_s_dw2-1.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 Source: "C:\MinGW\bin\libstdc++-6.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 Source: "C:\Python27\Lib\site-packages\pyo-{#appVer}-py{#pyVer}.egg-info"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
diff --git a/installers/win/win_installer_py35.iss b/installers/win/win_installer_py35.iss
index 6c68449..92468e2 100644
--- a/installers/win/win_installer_py35.iss
+++ b/installers/win/win_installer_py35.iss
@@ -3,7 +3,7 @@
 
 #define appName "pyo"
 #define pyVer "3.5"
-#define appVer "0.8.6"
+#define appVer "0.8.7"
 
 [Setup]
 ; NOTE: The value of AppId uniquely identifies this application.
@@ -46,9 +46,11 @@ Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-pac
 Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\portmidi.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\porttime.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\pthreadVC2.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\pthreadGC2.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\dcomp.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\gpsvc.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\sysntfy.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\msvcr100.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 Source: "C:\MinGW\bin\libgcc_s_dw2-1.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 Source: "C:\MinGW\bin\libstdc++-6.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\pyo-{#appVer}-py{#pyVer}.egg-info"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
diff --git a/installers/win/win_installer_py35.iss b/installers/win/win_installer_py36.iss
similarity index 75%
copy from installers/win/win_installer_py35.iss
copy to installers/win/win_installer_py36.iss
index 6c68449..920f1a8 100644
--- a/installers/win/win_installer_py35.iss
+++ b/installers/win/win_installer_py36.iss
@@ -2,14 +2,14 @@
 ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
 
 #define appName "pyo"
-#define pyVer "3.5"
-#define appVer "0.8.6"
+#define pyVer "3.6"
+#define appVer "0.8.7"
 
 [Setup]
 ; NOTE: The value of AppId uniquely identifies this application.
 ; Do not use the same AppId value in installers for other applications.
 ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
-AppId={{D9B062A3-AFAE-4FC0-9603-CE4FCA106382}
+AppId={{C33D5687-694D-4000-AF85-191E2DC66F64}
 AppName={#appName}
 AppVersion={#appVer}
 AppPublisher=ajaxsoundstudio.com
@@ -21,7 +21,7 @@ DisableDirPage=no
 AlwaysShowDirOnReadyPage=yes
 DefaultGroupName={#appName}
 AllowNoIcons=yes
-InfoBeforeFile=C:\Users\olivier\git\pyo\installers\win\\README-win32-py35.txt
+InfoBeforeFile=C:\Users\olivier\git\pyo\installers\win\\README-win32-py36.txt
 LicenseFile=C:\Users\olivier\git\pyo\COPYING.txt
 OutputBaseFilename={#appName}_{#appVer}_py{#pyVer}_setup
 Compression=lzma
@@ -35,29 +35,31 @@ SetupIconFile=C:\Users\olivier\git\pyo\utils\E-PyoIcon.ico
 Name: "english"; MessagesFile: "compiler:Default.isl"
 
 [Files]
-Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\pyo.py"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion 
-Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\pyo64.py"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
-Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\pyolib\*"; DestDir: "{app}\Lib\site-packages\pyolib"; Flags: ignoreversion recursesubdirs createallsubdirs
-Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\_pyo.cp35-win32.pyd"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
-Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\_pyo64.cp35-win32.pyd"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
-Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\libsndfile-1.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
-Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\liblo-7.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
-Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\portaudio.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
-Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\portmidi.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
-Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\porttime.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
-Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\pthreadVC2.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
-Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\dcomp.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
-Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\gpsvc.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
-Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\sysntfy.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\pyo.py"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion 
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\pyo64.py"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\pyolib\*"; DestDir: "{app}\Lib\site-packages\pyolib"; Flags: ignoreversion recursesubdirs createallsubdirs
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\_pyo.cp36-win32.pyd"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\_pyo64.cp36-win32.pyd"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\libsndfile-1.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\liblo-7.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\portaudio.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\portmidi.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\porttime.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\pthreadVC2.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\pthreadGC2.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\dcomp.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\gpsvc.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\sysntfy.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\msvcr100.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 Source: "C:\MinGW\bin\libgcc_s_dw2-1.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 Source: "C:\MinGW\bin\libstdc++-6.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
-Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\pyo-{#appVer}-py{#pyVer}.egg-info"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\pyo-{#appVer}-py{#pyVer}.egg-info"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 Source: "C:\Users\olivier\git\pyo\examples\*"; DestDir: "{userdesktop}\pyo_examples\"; Flags: ignoreversion recursesubdirs createallsubdirs
 ; NOTE: Don't use "Flags: ignoreversion" on any shared system files
 
 ; E-Pyo stuff
-Source: "C:\Users\olivier\git\pyo\utils\E-Pyo_py35\E-Pyo.exe"; DestDir: "{pf}\E-Pyo"; Flags: ignoreversion
-Source: "C:\Users\olivier\git\pyo\utils\E-Pyo_py35\Resources\*"; DestDir: "{pf}\E-Pyo\Resources"; Flags: ignoreversion recursesubdirs createallsubdirs
+Source: "C:\Users\olivier\git\pyo\utils\E-Pyo_py36\E-Pyo.exe"; DestDir: "{pf}\E-Pyo"; Flags: ignoreversion
+Source: "C:\Users\olivier\git\pyo\utils\E-Pyo_py36\Resources\*"; DestDir: "{pf}\E-Pyo\Resources"; Flags: ignoreversion recursesubdirs createallsubdirs
 
 [Tasks]
 Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"
@@ -126,6 +128,6 @@ begin
     Result := InstallPath;
   END else
     BEGIN
-    Result := 'C:\Python35-32';
+    Result := 'C:\Python36-32';
    END
 end;
\ No newline at end of file
diff --git a/pyolib/_core.py b/pyolib/_core.py
index 7bfee68..275f628 100644
--- a/pyolib/_core.py
+++ b/pyolib/_core.py
@@ -97,9 +97,9 @@ FUNCTIONS_INIT_LINES = {
     "pm_count_devices": "pm_count_devices()",
     "sndinfo": "sndinfo(path, print=False)",
     "savefile": "savefile(samples, path, sr=44100, channels=1, "
-                "fileformat=0, sampletype=0)",
+                "fileformat=0, sampletype=0, quality=0.4)",
     "savefileFromTable": "savefileFromTable(table, path, fileformat=0, "
-                         "sampletype=0)",
+                         "sampletype=0, quality=0.4)",
     "upsamp": "upsamp(path, outfile, up=4, order=128)",
     "downsamp": "downsamp(path, outfile, down=4, order=128)",
     "midiToHz": "midiToHz(x)",
@@ -126,6 +126,200 @@ FUNCTIONS_INIT_LINES = {
     "getPyoKeywords": "getPyoKeywords()"
 }
 
+def stringencode(st):
+    if sys.version_info[0] >= 3:
+        if type(st) is str:
+            st = st.encode(sys.getfilesystemencoding())
+    return st
+
+def sndinfo(path, print=False):
+    """
+    Retrieve informations about a soundfile.
+
+    Prints the infos of the given soundfile to the console and returns a
+    tuple containing:
+
+    (number of frames, duration in seconds, sampling rate,
+     number of channels, file format, sample type)
+
+    :Args:
+
+        path: string
+            Path of a valid soundfile.
+        print: boolean, optional
+            If True, sndinfo will print sound infos to the console.
+            Defaults to False.
+
+    >>> path = SNDS_PATH + '/transparent.aif'
+    >>> print(path)
+    /usr/lib/python2.7/dist-packages/pyolib/snds/transparent.aif
+    >>> info = sndinfo(path)
+    >>> print(info)
+    (29877, 0.6774829931972789, 44100.0, 1, 'AIFF', '16 bit int')
+
+    """
+    path = stringencode(path)
+    return p_sndinfo(path, print)
+
+def savefile(samples, path, sr=44100, channels=1, fileformat=0, sampletype=0,
+             quality=0.4):
+    """
+    Creates an audio file from a list of floats.
+
+    :Args:
+
+        samples: list of floats
+            List of samples data, or list of list of samples data if more than 1 channels.
+        path: string
+            Full path (including extension) of the new file.
+        sr: int, optional
+            Sampling rate of the new file. Defaults to 44100.
+        channels: int, optional
+            Number of channels of the new file. Defaults to 1.
+        fileformat: int, optional
+            Format type of the new file. Defaults to 0. Supported formats are:
+                0. WAVE - Microsoft WAV format (little endian) {.wav, .wave}
+                1. AIFF - Apple/SGI AIFF format (big endian) {.aif, .aiff}
+                2. AU - Sun/NeXT AU format (big endian) {.au}
+                3. RAW - RAW PCM data {no extension}
+                4. SD2 - Sound Designer 2 {.sd2}
+                5. FLAC - FLAC lossless file format {.flac}
+                6. CAF - Core Audio File format {.caf}
+                7. OGG - Xiph OGG container {.ogg}
+        sampletype ; int, optional
+            Bit depth encoding of the audio file. Defaults to 0.
+            SD2 and FLAC only support 16 or 24 bit int. Supported types are:
+                0. 16 bit int
+                1. 24 bit int
+                2. 32 bit int
+                3. 32 bit float
+                4. 64 bit float
+                5. U-Law encoded
+                6. A-Law encoded
+        quality: float, optional
+            The encoding quality value, between 0.0 (lowest quality) and
+            1.0 (highest quality). This argument has an effect only with
+            FLAC and OGG compressed formats. Defaults to 0.4.
+
+    >>> from random import uniform
+    >>> import os
+    >>> home = os.path.expanduser('~')
+    >>> sr, dur, chnls, path = 44100, 5, 2, os.path.join(home, 'noise.aif')
+    >>> samples = [[uniform(-0.5,0.5) for i in range(sr*dur)] for i in range(chnls)]
+    >>> savefile(samples=samples, path=path, sr=sr, channels=chnls, fileformat=1, sampletype=1)
+
+    """
+    path = stringencode(path)
+    p_savefile(samples, path, sr, channels, fileformat, sampletype, quality)
+
+def savefileFromTable(table, path, fileformat=0, sampletype=0, quality=0.4):
+    """
+    Creates an audio file from the content of a table.
+
+    :Args:
+
+        table: PyoTableObject
+            Table from which to retrieve the samples to write.
+        path: string
+            Full path (including extension) of the new file.
+        fileformat: int, optional
+            Format type of the new file. Defaults to 0. Supported formats are:
+                0. WAVE - Microsoft WAV format (little endian) {.wav, .wave}
+                1. AIFF - Apple/SGI AIFF format (big endian) {.aif, .aiff}
+                2. AU - Sun/NeXT AU format (big endian) {.au}
+                3. RAW - RAW PCM data {no extension}
+                4. SD2 - Sound Designer 2 {.sd2}
+                5. FLAC - FLAC lossless file format {.flac}
+                6. CAF - Core Audio File format {.caf}
+                7. OGG - Xiph OGG container {.ogg}
+        sampletype ; int, optional
+            Bit depth encoding of the audio file. Defaults to 0.
+            SD2 and FLAC only support 16 or 24 bit int. Supported types are:
+                0. 16 bit int
+                1. 24 bit int
+                2. 32 bit int
+                3. 32 bit float
+                4. 64 bit float
+                5. U-Law encoded
+                6. A-Law encoded
+        quality: float, optional
+            The encoding quality value, between 0.0 (lowest quality) and
+            1.0 (highest quality). This argument has an effect only with
+            FLAC and OGG compressed formats. Defaults to 0.4.
+
+    >>> import os
+    >>> home = os.path.expanduser('~')
+    >>> path1 = SNDS_PATH + '/transparent.aif'
+    >>> path2 = os.path.join(home, '/transparent2.aif')
+    >>> t = SndTable(path1)
+    >>> savefileFromTable(table=t, path=path, fileformat=1, sampletype=1)
+
+    """
+    path = stringencode(path)
+    p_savefileFromTable(table, path, fileformat, sampletype, quality)
+
+def upsamp(path, outfile, up=4, order=128):
+    """
+    Increases the sampling rate of an audio file.
+
+    :Args:
+
+        path: string
+            Full path (including extension) of the audio file to convert.
+        outfile: string
+            Full path (including extension) of the new file.
+        up: int, optional
+            Upsampling factor. Defaults to 4.
+        order: int, optional
+            Length, in samples, of the anti-aliasing lowpass filter.
+            Defaults to 128.
+
+    >>> import os
+    >>> home = os.path.expanduser('~')
+    >>> f = SNDS_PATH+'/transparent.aif'
+    >>> # upsample a signal 3 times
+    >>> upfile = os.path.join(home, 'trans_upsamp_2.aif')
+    >>> upsamp(f, upfile, 2, 256)
+    >>> # downsample the upsampled signal 3 times
+    >>> downfile = os.path.join(home, 'trans_downsamp_3.aif')
+    >>> downsamp(upfile, downfile, 3, 256)
+
+    """
+    path = stringencode(path)
+    outfile = stringencode(outfile)
+    p_upsamp(path, outfile, up, order)
+
+def downsamp(path, outfile, down=4, order=128):
+    """
+    Decreases the sampling rate of an audio file.
+
+    :Args:
+
+        path: string
+            Full path (including extension) of the audio file to convert.
+        outfile: string
+            Full path (including extension) of the new file.
+        down: int, optional
+            Downsampling factor. Defaults to 4.
+        order: int, optional
+            Length, in samples, of the anti-aliasing lowpass filter.
+            Defaults to 128.
+
+    >>> import os
+    >>> home = os.path.expanduser('~')
+    >>> f = SNDS_PATH+'/transparent.aif'
+    >>> # upsample a signal 3 times
+    >>> upfile = os.path.join(home, 'trans_upsamp_2.aif')
+    >>> upsamp(f, upfile, 2, 256)
+    >>> # downsample the upsampled signal 3 times
+    >>> downfile = os.path.join(home, 'trans_downsamp_3.aif')
+    >>> downsamp(upfile, downfile, 3, 256)
+
+    """
+    path = stringencode(path)
+    outfile = stringencode(outfile)
+    p_downsamp(path, outfile, down, order)
+
 class PyoError(Exception):
     """Base class for all pyo exceptions."""
 
@@ -1039,7 +1233,8 @@ class PyoObject(PyoObjectBase):
             [obj.play(wrap(dur, i), wrap(delay, i)) \
              for i, obj in enumerate(self._base_players)]
         if self._time_objs is not None:
-            [obj.play(wrap(dur, i), wrap(delay, i)) \
+            # We don't send 'dur' argument to time_stream to avoid a stop() call.
+            [obj.play(0, wrap(delay, i)) \
              for i, obj in enumerate(self._time_objs)]
 
         [obj.play(wrap(dur, i), wrap(delay, i)) \
@@ -1091,7 +1286,8 @@ class PyoObject(PyoObjectBase):
             [obj.play(wrap(dur, i), wrap(delay, i))
              for i, obj in enumerate(self._base_players)]
         if self._time_objs is not None:
-            [obj.play(wrap(dur, i), wrap(delay, i))
+            # We don't send 'dur' argument to time_stream to avoid a stop() call.
+            [obj.play(0, wrap(delay, i))
              for i, obj in enumerate(self._time_objs)]
 
         if isinstance(chnl, list):
@@ -1122,8 +1318,10 @@ class PyoObject(PyoObjectBase):
                 self._trig_objs.stop()
         if self._base_players is not None:
             [obj.stop() for obj in self._base_players]
-        if self._time_objs is not None:
-            [obj.stop() for obj in self._time_objs]
+        # This is not good for TableRec objects, only for Looper.
+        # It's move locally to the Looper definition.
+        #if self._time_objs is not None:
+        #    [obj.stop() for obj in self._time_objs]
 
         [obj.stop() for obj in self._base_objs]
         return self
@@ -2053,7 +2251,7 @@ class PyoMatrixObject(PyoObjectBase):
         pyoArgsAssert(self, "NII", value, x, y)
         [obj.put(value, x, y) for obj in self._base_objs]
 
-    def get(self, x, y):
+    def get(self, x=0, y=0):
         """
         Returns the value, as float, at specified position in the matrix.
 
@@ -2076,6 +2274,29 @@ class PyoMatrixObject(PyoObjectBase):
         else:
             return values
 
+    def getInterpolated(self, x=0.0, y=0.0):
+        """
+        Returns the value, as float, at a normalized position in the matrix.
+
+        If the object has more than 1 matrixstream, the default is to
+        return a list with the value of each matrixstream. User can call
+        obj[x].getInterpolated() to get the value of a specific matrix.
+
+        :Args:
+
+            x: float {0 -> 1}
+                X normalized position where to get value. Defaults to 0.0.
+            y: int {0 -> 1}
+                Y normalized position where to get value. Defaults to 0.0.
+
+        """
+        pyoArgsAssert(self, "FF", x, y)
+        values = [obj.getInterpolated(x, y) for obj in self._base_objs]
+        if len(values) == 1:
+            return values[0]
+        else:
+            return values
+
     def view(self, title="Matrix viewer", wxnoserver=False):
         """
         Opens a window showing the contents of the matrix.
diff --git a/pyolib/_maps.py b/pyolib/_maps.py
index d7ddd29..1ed78f7 100644
--- a/pyolib/_maps.py
+++ b/pyolib/_maps.py
@@ -39,9 +39,9 @@ class Map(object):
             Method used to scale the input value on the specified range.
 
     >>> m = Map(20., 20000., 'log')
-    >>> print m.get(.5)
+    >>> print(m.get(.5))
     632.455532034
-    >>> print m.set(12000)
+    >>> print(m.set(12000))
     0.926050416795
 
     """
diff --git a/pyolib/_wxwidgets.py b/pyolib/_wxwidgets.py
index 1e80676..01dce27 100644
--- a/pyolib/_wxwidgets.py
+++ b/pyolib/_wxwidgets.py
@@ -2705,7 +2705,6 @@ class ExprEditor(stc.StyledTextCtrl):
         self.Redo()
 
     def setup(self):
-        self.SetUseAntiAliasing(True)
         self.SetIndent(2)
         self.SetBackSpaceUnIndents(True)
         self.SetTabIndents(True)
@@ -2801,7 +2800,7 @@ class ExprEditor(stc.StyledTextCtrl):
 
     def onExecute(self, evt):
         pos = self.GetCurrentPos()
-        self.obj.expr = self.GetTextRaw()
+        self.obj.expr = self.GetText()
         self.SetCurrentPos(pos)
         self.SetSelection(pos, pos)
 
diff --git a/pyolib/expression.py b/pyolib/expression.py
index 41f27ff..e0aff58 100644
--- a/pyolib/expression.py
+++ b/pyolib/expression.py
@@ -259,7 +259,11 @@ from ._widgets import createExprEditorWindow
 
 if sys.version_info[0] < 3:
     def to_unicode(s):
-        return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
+        try:
+            s = unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
+        except:
+            pass
+        return s
 else:
     def to_unicode(s):
         return s
diff --git a/pyolib/fourier.py b/pyolib/fourier.py
index ede6a75..1798209 100644
--- a/pyolib/fourier.py
+++ b/pyolib/fourier.py
@@ -1224,7 +1224,7 @@ class CvlVerb(PyoObject):
         for file in impulse:
             _size, _dur, _snd_sr, _snd_chnls, _format, _type = sndinfo(file)
             lmax3 = max(lmax, _snd_chnls)
-            self._base_objs.extend([CvlVerb_base(wrap(in_fader,i), file, wrap(bal,i), wrap(size,i), i%_snd_chnls, wrap(mul,i), wrap(add,i)) for i in range(lmax3)])
+            self._base_objs.extend([CvlVerb_base(wrap(in_fader,i), stringencode(file), wrap(bal,i), wrap(size,i), i%_snd_chnls, wrap(mul,i), wrap(add,i)) for i in range(lmax3)])
         self.play()
 
     def setInput(self, x, fadetime=0.05):
diff --git a/pyolib/listener.py b/pyolib/listener.py
index c952aee..5a1a09d 100644
--- a/pyolib/listener.py
+++ b/pyolib/listener.py
@@ -45,10 +45,11 @@ class MidiListener(threading.Thread):
         This object is available only if pyo is built with portmidi support
         (see withPortmidi function).
 
-    >>> s = Server().boot()
+    >>> s = Server()
     >>> s.deactivateMidi()
+    >>> s.boot()
     >>> def midicall(status, data1, data2):
-    ...     print status, data1, data2
+    ...     print(status, data1, data2)
     >>> listen = MidiListener(midicall, 5)
     >>> listen.start()
 
@@ -131,8 +132,9 @@ class MidiDispatcher(threading.Thread):
         This object is available only if pyo is built with portmidi support
         (see withPortmidi function).
 
-    >>> s = Server().boot()
+    >>> s = Server()
     >>> s.deactivateMidi()
+    >>> s.boot()
     >>> dispatch = MidiDispatcher(5)
     >>> dispatch.start()
     >>> dispatch.send(144, 60, 127)
@@ -262,7 +264,7 @@ class OscListener(threading.Thread):
 
     >>> s = Server().boot()
     >>> def call(address, *args):
-    ...     print address, args
+    ...     print(address, args)
     >>> listen = OscListener(call, 9901)
     >>> listen.start()
 
diff --git a/pyolib/midi.py b/pyolib/midi.py
index 9112535..b39b8a9 100644
--- a/pyolib/midi.py
+++ b/pyolib/midi.py
@@ -223,10 +223,10 @@ class CtlScan(PyoObject):
             with an argument for the controller number in input. Ex.:
 
             def ctl_scan(ctlnum):
-                print ctlnum
+                print(ctlnum)
 
         toprint: boolean, optional
-            If True, controller number and value will be print to
+            If True, controller number and value will be printed to
             the console.
 
     .. note::
@@ -239,7 +239,7 @@ class CtlScan(PyoObject):
     >>> s.boot()
     >>> s.start()
     >>> def ctl_scan(ctlnum):
-    ...     print ctlnum
+    ...     print(ctlnum)
     >>> a = CtlScan(ctl_scan)
 
     """
@@ -311,7 +311,7 @@ class CtlScan(PyoObject):
         self.setFunction(x)
     @property
     def toprint(self):
-        """boolean. If True, print values to the console."""
+        """boolean. If True, prints values to the console."""
         return self._toprint
     @toprint.setter
     def toprint(self, x):
@@ -335,10 +335,10 @@ class CtlScan2(PyoObject):
             one for the midi channel. Ex.:
 
             def ctl_scan(ctlnum, midichnl):
-                print ctlnum, midichnl
+                print(ctlnum, midichnl)
 
         toprint: boolean, optional
-            If True, controller number and value will be print to
+            If True, controller number and value will be printed to
             the console.
 
     .. note::
@@ -351,7 +351,7 @@ class CtlScan2(PyoObject):
     >>> s.boot()
     >>> s.start()
     >>> def ctl_scan(ctlnum, midichnl):
-    ...     print ctlnum, midichnl
+    ...     print(ctlnum, midichnl)
     >>> a = CtlScan2(ctl_scan)
 
     """
@@ -423,7 +423,7 @@ class CtlScan2(PyoObject):
         self.setFunction(x)
     @property
     def toprint(self):
-        """boolean. If True, print values to the console."""
+        """boolean. If True, prints values to the console."""
         return self._toprint
     @toprint.setter
     def toprint(self, x):
@@ -1464,7 +1464,7 @@ class RawMidi(PyoObject):
             for the data bytes. Ex.:
 
             def event(status, data1, data2):
-                print status, data1, data2
+                print(status, data1, data2)
 
     .. note::
 
@@ -1476,7 +1476,7 @@ class RawMidi(PyoObject):
     >>> s.boot()
     >>> s.start()
     >>> def event(status, data1, data2):
-    ...     print status, data1, data2
+    ...     print(status, data1, data2)
     >>> a = RawMidi(event)
 
     """
diff --git a/pyolib/opensndctrl.py b/pyolib/opensndctrl.py
index 9406a82..770ab1c 100644
--- a/pyolib/opensndctrl.py
+++ b/pyolib/opensndctrl.py
@@ -363,8 +363,8 @@ class OscDataSend(PyoObject):
     >>> s = Server().boot()
     >>> s.start()
     >>> def pp(address, *args):
-    ...     print address
-    ...     print args
+    ...     print(address)
+    ...     print(args)
     >>> r = OscDataReceive(9900, "/data/test", pp)
     >>> # Send various types
     >>> a = OscDataSend("fissif", 9900, "/data/test")
@@ -528,8 +528,8 @@ class OscDataReceive(PyoObject):
     >>> s = Server().boot()
     >>> s.start()
     >>> def pp(address, *args):
-    ...     print address
-    ...     print args
+    ...     print(address)
+    ...     print(args)
     >>> r = OscDataReceive(9900, "/data/test", pp)
     >>> # Send various types
     >>> a = OscDataSend("fissif", 9900, "/data/test")
diff --git a/pyolib/pattern.py b/pyolib/pattern.py
index 63ce461..c164ff6 100644
--- a/pyolib/pattern.py
+++ b/pyolib/pattern.py
@@ -60,7 +60,7 @@ class Pattern(PyoObject):
         If `arg` is not None, the function must be defined with one argument:
 
         >>> def tocall(arg):
-        >>>     print arg
+        >>>     print(arg)
 
     >>> s = Server().boot()
     >>> s.start()
@@ -285,7 +285,7 @@ class CallAfter(PyoObject):
         If `arg` is not None, the function must be defined with one argument:
 
         >>> def tocall(arg):
-        >>>     print arg
+        >>>     print(arg)
 
         The object is not deleted after the call. The user must delete it himself.
 
diff --git a/pyolib/players.py b/pyolib/players.py
index 00f20c1..74e3e09 100644
--- a/pyolib/players.py
+++ b/pyolib/players.py
@@ -83,7 +83,7 @@ class SfPlayer(PyoObject):
         the first stream to the next object:
 
         >>> def printing():
-        ...     print "one trig!"
+        ...     print("one trig!")
         >>> sf = SfPlayer("/stereo/sound/file.aif").out()
         >>> trig = TrigFunc(sf['trig'][0], printing)
 
@@ -106,8 +106,8 @@ class SfPlayer(PyoObject):
         self._base_objs = []
         _trig_objs_tmp = []
         for i in range(lmax):
-            _snd_size, _dur, _snd_sr, _snd_chnls, _format, _type  = sndinfo(path[0])
-            self._base_players.append(SfPlayer_base(wrap(path,i), wrap(speed,i), wrap(loop,i), wrap(offset,i), wrap(interp,i)))
+            _snd_size, _dur, _snd_sr, _snd_chnls, _format, _type = sndinfo(path[0])
+            self._base_players.append(SfPlayer_base(stringencode(wrap(path,i)), wrap(speed,i), wrap(loop,i), wrap(offset,i), wrap(interp,i)))
             for j in range(_snd_chnls):
                 self._base_objs.append(SfPlay_base(self._base_players[-1], j, wrap(mul,i), wrap(add,i)))
                 _trig_objs_tmp.append(TriggerDummy_base(self._base_players[-1]))
@@ -146,7 +146,7 @@ class SfPlayer(PyoObject):
 
         self._path = path
         path, lmax = convertArgsToLists(path)
-        [obj.setSound(wrap(path,i)) for i, obj in enumerate(self._base_players)]
+        [obj.setSound(stringencode(wrap(path,i))) for i, obj in enumerate(self._base_players)]
 
     def setSound(self, path):
         """
@@ -330,13 +330,13 @@ class SfMarkerShuffler(PyoObject):
         self._snd_size, self._dur, self._snd_sr, self._snd_chnls, _format, _type = sndinfo(path[0])
         for i in range(lmax):
             try:
-                sf = aifc.open(wrap(path,i))
+                sf = aifc.open(wrap(path,i)) # Do we need stringencode() here?
                 markerstmp = sf.getmarkers()
                 sf.close()
                 self._markers = [m[1] for m in markerstmp]
             except:
                 self._markers = []
-            self._base_players.append(SfMarkerShuffler_base(wrap(path,i), self._markers, wrap(speed,i), wrap(interp,i)))
+            self._base_players.append(SfMarkerShuffler_base(stringencode(wrap(path,i)), self._markers, wrap(speed,i), wrap(interp,i)))
         for i in range(lmax * self._snd_chnls):
             j = i // self._snd_chnls
             self._base_objs.append(SfMarkerShuffle_base(wrap(self._base_players,j), i % self._snd_chnls, wrap(mul,j), wrap(add,j)))
@@ -520,7 +520,7 @@ class SfMarkerLooper(PyoObject):
                 self._markers = [m[1] for m in markerstmp]
             except:
                 self._markers = []
-            self._base_players.append(SfMarkerLooper_base(wrap(path,i), self._markers, wrap(speed,i), wrap(mark,i), wrap(interp,i)))
+            self._base_players.append(SfMarkerLooper_base(stringencode(wrap(path,i)), self._markers, wrap(speed,i), wrap(mark,i), wrap(interp,i)))
         for i in range(lmax * self._snd_chnls):
             j = i // self._snd_chnls
             self._base_objs.append(SfMarkerLoop_base(wrap(self._base_players,j), i % self._snd_chnls, wrap(mul,j), wrap(add,j)))
diff --git a/pyolib/server.py b/pyolib/server.py
index be3af8c..37a54e3 100644
--- a/pyolib/server.py
+++ b/pyolib/server.py
@@ -107,6 +107,7 @@ class Server(object):
         - reinit(sr, nchnls, buffersize, duplex, audio, jackname): Reinit the server's settings.
         - deactivateMidi(): Deactivate Midi callback.
         - setIsJackTransportSlave(x): Set if pyo's server is slave to jack transport or not.
+        - allowMicrosoftMidiDevices(): Allows the Microsoft Midi Mapper or GS Wavetable Synth devices.
 
     >>> # For an 8 channels server in duplex mode with
     >>> # a sampling rate of 48000 Hz and buffer size of 512
@@ -404,6 +405,15 @@ class Server(object):
         """
         self._server.setMidiOutputDevice(x)
 
+    def allowMicrosoftMidiDevices(self):
+        """
+        Allows the Microsoft Midi Mapper or GS Wavetable Synth device.
+
+        These are off by default because they crash on some systems.
+
+        """
+        self._server.allowMicrosoftMidiDevices()
+
     def setSamplingRate(self, x):
         """
         Set the sampling rate used by the server.
@@ -802,7 +812,7 @@ class Server(object):
             print('Warning: Filename has no extension. Using fileformat value.')
         self._fileformat = fileformat
         self._sampletype = sampletype
-        self._server.recordOptions(dur, filename, fileformat, sampletype, quality)
+        self._server.recordOptions(dur, stringencode(filename), fileformat, sampletype, quality)
 
     def recstart(self, filename=None):
         """
@@ -830,7 +840,7 @@ class Server(object):
                 fileformat = FILE_FORMATS[ext]
                 if fileformat != self._fileformat:
                     self._fileformat = fileformat
-                    self._server.recordOptions(self._dur, filename, self._fileformat, self._sampletype)
+                    self._server.recordOptions(self._dur, stringencode(filename), self._fileformat, self._sampletype)
 
         self._server.recstart(filename)
 
diff --git a/pyolib/tableprocess.py b/pyolib/tableprocess.py
index 844ffd1..e4c1c07 100644
--- a/pyolib/tableprocess.py
+++ b/pyolib/tableprocess.py
@@ -2403,6 +2403,11 @@ class Looper(PyoObject):
             return self._time_dummy[-1]
         return PyoObject.__getitem__(self, i)
 
+    def stop(self):
+        if self._time_objs is not None:
+            [obj.stop() for obj in self._time_objs]
+        return PyoObject.stop(self)
+
     def setTable(self, x):
         """
         Replace the `table` attribute.
diff --git a/pyolib/tables.py b/pyolib/tables.py
index fcad96a..ff15d01 100644
--- a/pyolib/tables.py
+++ b/pyolib/tables.py
@@ -1515,14 +1515,14 @@ class SndTable(PyoTableObject):
                 _size, _dur, _snd_sr, _snd_chnls, _format, _type = sndinfo(p)
                 if chnl is None:
                     if stop is None:
-                        self._base_objs.extend([SndTable_base(p, i, start) for i in range(_snd_chnls)])
+                        self._base_objs.extend([SndTable_base(stringencode(p), i, start) for i in range(_snd_chnls)])
                     else:
-                        self._base_objs.extend([SndTable_base(p, i, start, stop) for i in range(_snd_chnls)])
+                        self._base_objs.extend([SndTable_base(stringencode(p), i, start, stop) for i in range(_snd_chnls)])
                 else:
                     if stop is None:
-                        self._base_objs.append(SndTable_base(p, chnl, start))
+                        self._base_objs.append(SndTable_base(stringencode(p), chnl, start))
                     else:
-                        self._base_objs.append(SndTable_base(p, chnl, start, stop))
+                        self._base_objs.append(SndTable_base(stringencode(p), chnl, start, stop))
                 self._size.append(self._base_objs[-1].getSize())
                 self._dur.append(self._size[-1] / float(_snd_sr))
             if lmax == 1:
@@ -1560,17 +1560,17 @@ class SndTable(PyoTableObject):
                 self._size.append(_size)
                 self._dur.append(_dur)
                 if stop is None:
-                    obj.setSound(p, 0, start)
+                    obj.setSound(stringencode(p), 0, start)
                 else:
-                    obj.setSound(p, 0, start, stop)
+                    obj.setSound(stringencode(p), 0, start, stop)
         else:
             _size, _dur, _snd_sr, _snd_chnls, _format, _type = sndinfo(path)
             self._size = _size
             self._dur = _dur
             if stop is None:
-                [obj.setSound(path, (i%_snd_chnls), start) for i, obj in enumerate(self._base_objs)]
+                [obj.setSound(stringencode(path), (i%_snd_chnls), start) for i, obj in enumerate(self._base_objs)]
             else:
-                [obj.setSound(path, (i%_snd_chnls), start, stop) for i, obj in enumerate(self._base_objs)]
+                [obj.setSound(stringencode(path), (i%_snd_chnls), start, stop) for i, obj in enumerate(self._base_objs)]
         self.refreshView()
         self._resetView()
 
@@ -1607,17 +1607,17 @@ class SndTable(PyoTableObject):
                 self._size.append(_size)
                 self._dur.append(_dur)
                 if stop is None:
-                    obj.append(p, crossfade, 0, start)
+                    obj.append(stringencode(p), crossfade, 0, start)
                 else:
-                    obj.append(p, crossfade, 0, start, stop)
+                    obj.append(stringencode(p), crossfade, 0, start, stop)
         else:
             _size, _dur, _snd_sr, _snd_chnls, _format, _type = sndinfo(path)
             self._size = _size
             self._dur = _dur
             if stop is None:
-                [obj.append(path, crossfade, (i%_snd_chnls), start) for i, obj in enumerate(self._base_objs)]
+                [obj.append(stringencode(path), crossfade, (i%_snd_chnls), start) for i, obj in enumerate(self._base_objs)]
             else:
-                [obj.append(path, crossfade, (i%_snd_chnls), start, stop) for i, obj in enumerate(self._base_objs)]
+                [obj.append(stringencode(path), crossfade, (i%_snd_chnls), start, stop) for i, obj in enumerate(self._base_objs)]
         self.refreshView()
 
     def insert(self, path, pos=0, crossfade=0, start=0, stop=None):
@@ -1659,17 +1659,17 @@ class SndTable(PyoTableObject):
                 self._size.append(_size)
                 self._dur.append(_dur)
                 if stop is None:
-                    obj.insert(p, pos, crossfade, 0, start)
+                    obj.insert(stringencode(p), pos, crossfade, 0, start)
                 else:
-                    obj.insert(p, pos, crossfade, 0, start, stop)
+                    obj.insert(stringencode(p), pos, crossfade, 0, start, stop)
         else:
             _size, _dur, _snd_sr, _snd_chnls, _format, _type = sndinfo(path)
             self._size = _size
             self._dur = _dur
             if stop is None:
-                [obj.insert(path, pos, crossfade, (i%_snd_chnls), start) for i, obj in enumerate(self._base_objs)]
+                [obj.insert(stringencode(path), pos, crossfade, (i%_snd_chnls), start) for i, obj in enumerate(self._base_objs)]
             else:
-                [obj.insert(path, pos, crossfade, (i%_snd_chnls), start, stop) for i, obj in enumerate(self._base_objs)]
+                [obj.insert(stringencode(path), pos, crossfade, (i%_snd_chnls), start, stop) for i, obj in enumerate(self._base_objs)]
         self.refreshView()
 
     def getRate(self, all=True):
diff --git a/pyolib/utils.py b/pyolib/utils.py
index c1abb5f..81f2a7b 100644
--- a/pyolib/utils.py
+++ b/pyolib/utils.py
@@ -637,7 +637,7 @@ class Record(PyoObject):
                 print('Warning: Unknown file extension. Using fileformat value.')
         else:
             print('Warning: Filename has no extension. Using fileformat value.')
-        self._base_objs = [Record_base(self._in_fader.getBaseObjects(), filename, chnls, fileformat, sampletype, buffering, quality)]
+        self._base_objs = [Record_base(self._in_fader.getBaseObjects(), stringencode(filename), chnls, fileformat, sampletype, buffering, quality)]
         self.play()
 
     def out(self, chnl=0, inc=1, dur=0, delay=0):
diff --git a/scripts/compile_win.bat b/scripts/compile_win.bat
index d386ae2..3f97f1f 100644
--- a/scripts/compile_win.bat
+++ b/scripts/compile_win.bat
@@ -11,6 +11,11 @@ echo *** Compile for python3.5-32 ***
 C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\python.exe setup.py install --use-double
 
 RMDIR /S /Q build
+
+echo *** Compile for python3.6-32 ***
+C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\python.exe setup.py install --use-double
+
+RMDIR /S /Q build
 
 cd utils
 
@@ -19,3 +24,6 @@ C:\Python27\python.exe epyo_builder_win32.py
 
 echo *** Build E-Pyo for python3.5-32 ***
 C:\Users\olivier\AppData\Local\Programs\Python\Python35-32\python.exe epyo_builder_win32.py
+
+echo *** Build E-Pyo for python3.6-32 ***
+C:\Users\olivier\AppData\Local\Programs\Python\Python36-32\python.exe epyo_builder_win32.py
diff --git a/scripts/html_man.py b/scripts/html_man.py
index 08e8baf..1d239f4 100644
--- a/scripts/html_man.py
+++ b/scripts/html_man.py
@@ -30,7 +30,7 @@ if man_file == 'manual-dev':
     man_version = 'latest sources'
 else:
     man_version = 'version %s' % PYO_VERSION
-print PYO_VERSION
+print(PYO_VERSION)
 
 try:
     os.mkdir(os.getcwd() + '/doc')
@@ -279,7 +279,7 @@ shutil.copy('scripts/prettify.css', 'doc/%s' % man_file)
 shutil.copy('scripts/prettify.js', 'doc/%s' % man_file)
 
 # Upload on iACT server
-print "Upload documentation (y/n)?"
+print("Upload documentation (y/n)?")
 ans = raw_input()
 if (ans == 'y'):
     os.system('scp -r doc/%s sysop at 132.204.178.49:/Library/WebServer/Documents/pyo/' % man_file)
diff --git a/scripts/release_builder_OSX.sh b/scripts/release_builder_OSX.sh
index 5e27998..55b663c 100755
--- a/scripts/release_builder_OSX.sh
+++ b/scripts/release_builder_OSX.sh
@@ -10,8 +10,9 @@ if [ -d build ]; then
     sudo rm -rf build/;
 fi    
 
-sudo python setup.py install --use-coreaudio --use-double
-sudo python3 setup.py install --use-coreaudio --use-double
+sudo python2.7 setup.py install --use-coreaudio --use-double
+sudo python3.5 setup.py install --use-coreaudio --use-double
+sudo python3.6 setup.py install --use-coreaudio --use-double
 
 # Compile E-Pyo for both python2 and python3
 cd utils
@@ -20,12 +21,17 @@ if [ -d E-Pyo_OSX_py2 ]; then
    sudo rm -rf E-Pyo_OSX_py2/;
 fi    
 
-if [ -d E-Pyo_OSX_py3 ]; then
-    sudo rm -rf E-Pyo_OSX_py3/;
+if [ -d E-Pyo_OSX_py35 ]; then
+    sudo rm -rf E-Pyo_OSX_py35/;
+fi    
+
+if [ -d E-Pyo_OSX_py36 ]; then
+    sudo rm -rf E-Pyo_OSX_py36/;
 fi    
 
 sh epyo_builder_OSX_py2.sh
-sh epyo_builder_OSX_py3.sh
+sh epyo_builder_OSX_py3.5.sh
+sh epyo_builder_OSX_py3.6.sh
 
 # Build the packages
 cd ../installers/osx
@@ -33,4 +39,5 @@ cd ../installers/osx
 sudo rm -rf *.dmg
 
 sudo sh release_x86_64_py2.sh
-sudo sh release_x86_64_py3.sh
+sudo sh release_x86_64_py3.5.sh
+sudo sh release_x86_64_py3.6.sh
diff --git a/scripts/release_doc_src.sh b/scripts/release_doc_src.sh
index 98efe2d..9859557 100755
--- a/scripts/release_doc_src.sh
+++ b/scripts/release_doc_src.sh
@@ -6,7 +6,7 @@
 # 3. Execute from pyo folder : ./scripts/release_doc_src.sh
 #
 
-version=0.8.6
+version=0.8.7
 replace=XXX
 
 doc_rep=pyo_XXX-doc
diff --git a/scripts/retrieve_keywords.py b/scripts/retrieve_keywords.py
index f58ec88..8b2860b 100644
--- a/scripts/retrieve_keywords.py
+++ b/scripts/retrieve_keywords.py
@@ -21,7 +21,7 @@ l.append("Server")
 with open("pyo_keywords.txt", "w") as f:
     for i, word in enumerate(l):
         if word not in t2:
-            print word
+            print(word)
         if (i % 10) == 0:
             f.write("\n")
         f.write(word + " ")
diff --git a/scripts/win/windows-7-build-routine.txt b/scripts/win/windows-7-build-routine.txt
index f408325..69603aa 100644
--- a/scripts/win/windows-7-build-routine.txt
+++ b/scripts/win/windows-7-build-routine.txt
@@ -54,8 +54,8 @@ MinGW SConstruct for PortAudio
 Michael Gogins
 Modified by Olivier Belanger on september 2010
 '''
-print __doc__
-print
+print(__doc__)
+print()
 
 import os
 import string
@@ -145,8 +145,8 @@ portAudio = commonEnvironment.SharedLibrary('portaudio', portAudioSources)
 MinGW SConstruct for PortMidi
 Michael Gogins
 '''
-print __doc__
-print
+print(__doc__)
+print()
 
 import os
 import string
diff --git a/scripts/win/windows-build-routine.txt b/scripts/win/windows-build-routine.txt
index 2cac5e2..a5455df 100644
--- a/scripts/win/windows-build-routine.txt
+++ b/scripts/win/windows-build-routine.txt
@@ -92,8 +92,8 @@ MinGW SConstruct for PortAudio
 Michael Gogins
 Modified by Olivier Belanger on september 2010
 '''
-print __doc__
-print
+print(__doc__)
+print()
 
 import os
 import string
@@ -181,8 +181,8 @@ portAudio = commonEnvironment.SharedLibrary('portaudio', portAudioSources)
 MinGW SConstruct for PortMidi
 Michael Gogins
 '''
-print __doc__
-print
+print(__doc__)
+print()
 
 import os
 import string
diff --git a/setup.py b/setup.py
index b34e3d6..f96a0c4 100644
--- a/setup.py
+++ b/setup.py
@@ -32,7 +32,12 @@ else:
         return bytes(strng, encoding=encoding)
 
 def get_jack_api():
-    output = subprocess.Popen(["jackd", "-V"], stdout=subprocess.PIPE)
+    try:
+        output = subprocess.Popen(["jackd", "-V"], stdout=subprocess.PIPE)
+    except FileNotFoundError:
+        # jack2-dbus is probably installed instead of jackd.
+        return "JACK_OLD_API"
+
     text = output.communicate()[0]
     if text != "":
         line = text.splitlines()[0]
@@ -43,7 +48,7 @@ def get_jack_api():
     else:
         return "JACK_NEW_API"
 
-pyo_version = "0.8.6"
+pyo_version = "0.8.7"
 build_with_jack_support = False
 compile_externals = False
 
@@ -163,7 +168,7 @@ if sys.platform == "win32":
                     'C:\liblo-0.28', 'C:\pthreads\include', 'C:\portmidi\porttime']
     library_dirs = ['C:\portaudio', 'C:\portmidi', 'C:\liblo-0.28\src\.libs', 'C:\pthreads\lib', 
                     'C:/Program Files (x86)/Mega-Nerd/libsndfile/bin']
-    libraries += ['libsndfile-1', 'pthreadVC2']
+    libraries += ['libsndfile-1', 'pthreadGC2']
     if 'portmidi' in libraries:
         libraries.append('porttime')
 else:
diff --git a/src/engine/md_portmidi.c b/src/engine/md_portmidi.c
index c4bfb4e..6d8592b 100644
--- a/src/engine/md_portmidi.c
+++ b/src/engine/md_portmidi.c
@@ -162,7 +162,12 @@ Server_pm_init(Server *self)
                 Server_debug(self, "Midi output device : %d.\n", self->midi_output);
                 const PmDeviceInfo *outinfo = Pm_GetDeviceInfo(self->midi_output);
                 if (outinfo != NULL) {
-                    if (outinfo->output) {
+                    if ((strcmp(outinfo->name, "Microsoft MIDI Mapper") == 0 || 
+                          strcmp(outinfo->name, "Microsoft GS Wavetable Synth") == 0) && 
+                         self->allowMMMapper == 0) {
+                        self->withPortMidiOut = 0;
+                    }
+                    else if (outinfo->output) {
 
                         Py_BEGIN_ALLOW_THREADS
                         if (!Pt_Started())
@@ -209,7 +214,12 @@ Server_pm_init(Server *self)
                 for (i=0; i<num_devices; i++) {
                     const PmDeviceInfo *outinfo = Pm_GetDeviceInfo(i);
                     if (outinfo != NULL) {
-                        if (outinfo->output) {
+                        if ((strcmp(outinfo->name, "Microsoft MIDI Mapper") == 0 || 
+                              strcmp(outinfo->name, "Microsoft GS Wavetable Synth") == 0) && 
+                             self->allowMMMapper == 0) {
+                            continue;
+                        }
+                        else if (outinfo->output) {
 
                             Py_BEGIN_ALLOW_THREADS
                             pmerr = Pm_OpenOutput(&be_data->midiout[self->midiout_count], i, NULL, 100, NULL, NULL, 1);
diff --git a/src/engine/pyomodule.c b/src/engine/pyomodule.c
index a80a56b..1e7d7cc 100644
--- a/src/engine/pyomodule.c
+++ b/src/engine/pyomodule.c
@@ -90,19 +90,19 @@ PyObject * with_osc() { Py_INCREF(Py_False); return Py_False; };
 #define portaudio_count_host_apis_info \
 "\nReturns the number of host apis found by Portaudio.\n\n\
 >>> c = pa_count_host_apis()\n\
->>> print c\n\
+>>> print(c)\n\
 1\n\n"
 
 #define portaudio_get_version_info \
 "\nReturns the version number, as an integer, of the current portaudio installation.\n\n\
 >>> v = pa_get_version()\n\
->>> print v\n\
+>>> print(v)\n\
 1899\n\n"
 
 #define portaudio_get_version_text_info \
 "\nReturns the textual description of the current portaudio installation.\n\n\
 >>> desc = pa_get_version_text()\n\
->>> print desc\n\
+>>> print(desc)\n\
 PortAudio V19-devel (built Oct 8 2012 16:25:16)\n\n"
 
 #define portaudio_list_host_apis_info \
@@ -113,13 +113,13 @@ index: 0, id: 5, name: Core Audio, num devices: 6, default in: 0, default out: 2
 #define portaudio_get_default_host_api_info \
 "\nReturns the index number of Portaudio's default host api.\n\n\
 >>> h = pa_get_default_host_api()\n\
->>> print h\n\
+>>> print(h)\n\
 0\n\n"
 
 #define portaudio_count_devices_info \
 "\nReturns the number of devices found by Portaudio.\n\n\
 >>> c = pa_count_devices()\n\
->>> print c\n\
+>>> print(c)\n\
 6\n\n"
 
 #define portaudio_list_devices_info \
@@ -141,21 +141,21 @@ AUDIO devices:\n\
 This function returns two dictionaries, one containing a dictionary for each input device and one containing a dictionary for each output device. \
 Keys of outer dictionaries are the device index as returned by Portaudio. Keys of inner dictionaries are: 'name', 'host api index', 'default sr' and 'latency'.\n\n\
 >>> inputs, outputs = pa_get_devices_infos()\n\
->>> print '- Inputs:'\n\
+>>> print('- Inputs:')\n\
 >>> for index in sorted(inputs.keys()):\n\
-...     print '  Device index:', index\n\
+...     print('  Device index:', index)\n\
 ...     for key in ['name', 'host api index', 'default sr', 'latency']:\n\
-...         print '    %s:' % key, inputs[index][key]\n\
->>> print '- Outputs:'\n\
+...         print('    %s:' % key, inputs[index][key])\n\
+>>> print('- Outputs:')\n\
 >>> for index in sorted(outputs.keys()):\n\
-...     print '  Device index:', index\n\
+...     print('  Device index:', index)\n\
 ...     for key in ['name', 'host api index', 'default sr', 'latency']:\n\
-...         print '    %s:' % key, outputs[index][key]\n\n"
+...         print('    %s:' % key, outputs[index][key])\n\n"
 
 #define portaudio_get_output_devices_info \
 "\nReturns output devices (device names, device indexes) found by Portaudio.\n\n`device names` is a list of strings and `device indexes` is a list of the actual\nPortaudio index of each device.\n\n\
 >>> outs = pa_get_output_devices()\n\
->>> print outs\n\
+>>> print(outs)\n\
 (['Built-in Output', 'UA-4FX', 'Soundflower (2ch)', 'Soundflower (16ch)'], [2, 3, 4, 5])\n\n"
 
 #define portaudio_get_output_max_channels_info \
@@ -164,11 +164,11 @@ x: int\n        Device index as listed by Portaudio (see pa_get_output_devices).
 >>> device = 'HDA Intel PCH: STAC92xx Analog (hw:0,0)'\n\
 >>> dev_list, dev_index =  pa_get_output_devices()\n\
 >>> dev = dev_index[dev_list.index(device)]\n\
->>> print 'Device index:', dev\n\
+>>> print('Device index:', dev)\n\
 >>> maxouts = pa_get_output_max_channels(dev)\n\
 >>> maxins = pa_get_input_max_channels(dev)\n\
->>> print 'Max outputs:', maxouts\n\
->>> print 'Max inputs:', maxins\n\
+>>> print('Max outputs:', maxouts)\n\
+>>> print('Max inputs:', maxins)\n\
 >>> if maxouts >= 2 and maxins >= 2:\n\
 ...     nchnls = 2\n\
 >>> else:\n\
@@ -180,11 +180,11 @@ x: int\n        Device index as listed by Portaudio (see pa_get_input_devices).\
 >>> device = 'HDA Intel PCH: STAC92xx Analog (hw:0,0)'\n\
 >>> dev_list, dev_index =  pa_get_output_devices()\n\
 >>> dev = dev_index[dev_list.index(device)]\n\
->>> print 'Device index:', dev\n\
+>>> print('Device index:', dev)\n\
 >>> maxouts = pa_get_output_max_channels(dev)\n\
 >>> maxins = pa_get_input_max_channels(dev)\n\
->>> print 'Max outputs', maxouts\n\
->>> print 'Max inputs:', maxins\n\
+>>> print('Max outputs', maxouts)\n\
+>>> print('Max inputs:', maxins)\n\
 >>> if maxouts >= 2 and maxins >= 2:\n\
 ...     nchnls = 2\n\
 >>> else:\n\
@@ -193,21 +193,21 @@ x: int\n        Device index as listed by Portaudio (see pa_get_input_devices).\
 #define portaudio_get_input_devices_info \
 "\nReturns input devices (device names, device indexes) found by Portaudio.\n\n`device names` is a list of strings and `device indexes` is a list of the actual\nPortaudio index of each device.\n\n\
 >>> ins = pa_get_input_devices()\n\
->>> print ins\n\
+>>> print(ins)\n\
 (['Built-in Microphone', 'Built-in Input', 'UA-4FX', 'Soundflower (2ch)', 'Soundflower (16ch)'], [0, 1, 3, 4, 5])\n\n"
 
 #define portaudio_get_default_input_info \
 "\nReturns the index number of Portaudio's default input device.\n\n\
 >>> names, indexes = pa_get_input_devices()\n\
 >>> name = names[indexes.index(pa_get_default_input())]\n\
->>> print name\n\
+>>> print(name)\n\
 'Built-in Microphone'\n\n"
 
 #define portaudio_get_default_output_info \
 "\nReturns the index number of Portaudio's default output device.\n\n\
 >>> names, indexes = pa_get_output_devices()\n\
 >>> name = names[indexes.index(pa_get_default_output())]\n\
->>> print name\n\
+>>> print(name)\n\
 'UA-4FX'\n\n"
 
 /** Portmidi utility functions __doc__ strings. **/
@@ -216,7 +216,7 @@ x: int\n        Device index as listed by Portaudio (see pa_get_input_devices).\
 #define portmidi_count_devices_info \
 "\nReturns the number of devices found by Portmidi.\n\n\
 >>> c = pm_count_devices()\n\
->>> print c\n\
+>>> print(c)\n\
 6\n\n"
 
 #define portmidi_list_devices_info \
@@ -233,27 +233,27 @@ MIDI devices:\n\
 #define portmidi_get_input_devices_info \
 "\nReturns midi input devices (device names, device indexes) found by Portmidi.\n\n`device names` is a list of strings and `device indexes` is a list of the actual\nPortmidi index of each device.\n\n\
 >>> ins = pm_get_input_devices()\n\
->>> print ins\n\
+>>> print(ins)\n\
 (['IAC Driver Bus 1', 'from MaxMSP 1', 'from MaxMSP 2'], [0, 1, 2])\n\n"
 
 #define portmidi_get_output_devices_info \
 "\nReturns midi output devices (device names, device indexes) found by Portmidi.\n\n`device names` is a list of strings and `device indexes` is a list of the actual\nPortmidi index of each device.\n\n\
 >>> outs = pm_get_output_devices()\n\
->>> print outs\n\
+>>> print(outs)\n\
 (['IAC Driver Bus 1', 'to MaxMSP 1', 'to MaxMSP 2'], [3, 4, 5])\n\n"
 
 #define portmidi_get_default_input_info \
 "\nReturns the index number of Portmidi's default input device.\n\n\
 >>> names, indexes = pm_get_input_devices()\n\
 >>> name = names[indexes.index(pm_get_default_input())]\n\
->>> print name\n\
+>>> print(name)\n\
 'IAC Driver Bus 1'\n\n"
 
 #define portmidi_get_default_output_info \
 "\nReturns the index number of Portmidi's default output device.\n\n\
 >>> names, indexes = pm_get_output_devices()\n\
 >>> name = names[indexes.index(pm_get_default_output())]\n\
->>> print name\n\
+>>> print(name)\n\
 'IAC Driver Bus 1'\n\n"
 
 
@@ -315,30 +315,19 @@ libsndfile_get_format(int fileformat, int sampletype) {
     return format;
 }
 
-#define sndinfo_info \
-"\nRetrieve informations about a soundfile.\n\n\
-Prints the infos of the given soundfile to the console and returns a tuple containing:\n\n(number of frames, duration in seconds, sampling rate,\nnumber of channels, file format, sample type).\n\n:Args:\n\n    \
-path : string\n        Path of a valid soundfile.\n    \
-print : boolean, optional\n        If True, sndinfo will print sound infos to the console. Defaults to False.\n\n\
->>> path = SNDS_PATH + '/transparent.aif'\n\
->>> print path\n\
-/usr/lib/python2.7/dist-packages/pyolib/snds/transparent.aif\n\
->>> info = sndinfo(path)\n\
->>> print info\n\
-(29877, 0.6774829931972789, 44100.0, 1, 'AIFF', '16 bit int')\n\n"
-
 static PyObject *
-sndinfo(PyObject *self, PyObject *args, PyObject *kwds) {
+p_sndinfo(PyObject *self, PyObject *args, PyObject *kwds) {
     SNDFILE *sf;
     SF_INFO info;
     char *path;
     char fileformat[5];
     char sampletype[16];
     int format, subformat, print = 0;
+    Py_ssize_t psize;
 
     static char *kwlist[] = {"path", "print", NULL};
 
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, "s|i", kwlist, &path, &print)) {
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "s#|i", kwlist, &path, &psize, &print)) {
         PySys_WriteStderr("sndinfo: called with wrong arguments.\n");
         Py_RETURN_NONE;
     }
@@ -403,49 +392,15 @@ sndinfo(PyObject *self, PyObject *args, PyObject *kwds) {
         PySys_WriteStdout("name: %s\nnumber of frames: %i\nduration: %.4f sec\nsr: %.2f\nchannels: %i\nformat: %s\nsample type: %s\n",
                           path, (int)info.frames, ((float)info.frames / info.samplerate), (float)info.samplerate, (int)info.channels, 
                           fileformat, sampletype);
-    PyObject *sndinfo = PyTuple_Pack(6, PyInt_FromLong(info.frames), PyFloat_FromDouble((float)info.frames / info.samplerate),
+    PyObject *sndinfos = PyTuple_Pack(6, PyInt_FromLong(info.frames), PyFloat_FromDouble((float)info.frames / info.samplerate),
                                         PyFloat_FromDouble(info.samplerate), PyInt_FromLong(info.channels), 
                                         PyUnicode_FromString(fileformat), PyUnicode_FromString(sampletype));
     sf_close(sf);
-    return sndinfo;
+    return sndinfos;
 }
 
-#define savefile_info \
-"\nCreates an audio file from a list of floats.\n\n:Args:\n\n    \
-samples : list of floats\n        list of samples data, or list of list of samples data if more than 1 channels.\n    \
-path : string\n        Full path (including extension) of the new file.\n    \
-sr : int, optional\n        Sampling rate of the new file. Defaults to 44100.\n    \
-channels : int, optional\n        number of channels of the new file. Defaults to 1.\n    \
-fileformat : int, optional\n        Format type of the new file. Defaults to 0. Supported formats are:\n            \
-0. WAVE - Microsoft WAV format (little endian) {.wav, .wave}\n            \
-1. AIFF - Apple/SGI AIFF format (big endian) {.aif, .aiff}\n            \
-2. AU - Sun/NeXT AU format (big endian) {.au}\n            \
-3. RAW - RAW PCM data {no extension}\n            \
-4. SD2 - Sound Designer 2 {.sd2}\n            \
-5. FLAC - FLAC lossless file format {.flac}\n            \
-6. CAF - Core Audio File format {.caf}\n            \
-7. OGG - Xiph OGG container {.ogg}\n    \
-sampletype ; int, optional\n        Bit depth encoding of the audio file. Defaults to 0.\n        \
-SD2 and FLAC only support 16 or 24 bit int. Supported types are:\n            \
-0. 16 bit int\n            \
-1. 24 bit int\n            \
-2. 32 bit int\n            \
-3. 32 bit float\n            \
-4. 64 bit float\n            \
-5. U-Law encoded\n            \
-6. A-Law encoded\n    \
-quality : float, optional\n        The encoding quality value, between 0.0 (lowest quality) and\n        \
-1.0 (highest quality). This argument has an effect only with\n        \
-FLAC and OGG compressed formats. Defaults to 0.4.\n\n\
->>> from random import uniform\n\
->>> import os\n\
->>> home = os.path.expanduser('~')\n\
->>> sr, dur, chnls, path = 44100, 5, 2, os.path.join(home, 'noise.aif')\n\
->>> samples = [[uniform(-0.5,0.5) for i in range(sr*dur)] for i in range(chnls)]\n\
->>> savefile(samples=samples, path=path, sr=sr, channels=chnls, fileformat=1, sampletype=1)\n\n"
-
 static PyObject *
-savefile(PyObject *self, PyObject *args, PyObject *kwds) {
+p_savefile(PyObject *self, PyObject *args, PyObject *kwds) {
     int i, j, size;
     char *recpath;
     PyObject *samples;
@@ -457,9 +412,10 @@ savefile(PyObject *self, PyObject *args, PyObject *kwds) {
     double quality = 0.4;
     SNDFILE *recfile;
     SF_INFO recinfo;
+    Py_ssize_t psize;
     static char *kwlist[] = {"samples", "path", "sr", "channels", "fileformat", "sampletype", "quality", NULL};
 
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, "Os|iiiid", kwlist, &samples, &recpath, &sr, &channels, &fileformat, &sampletype, &quality))
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "Os#|iiiid", kwlist, &samples, &recpath, &psize, &sr, &channels, &fileformat, &sampletype, &quality))
         return PyInt_FromLong(-1);
 
     recinfo.samplerate = sr;
@@ -503,40 +459,8 @@ savefile(PyObject *self, PyObject *args, PyObject *kwds) {
     Py_RETURN_NONE;
 }
 
-#define savefileFromTable_info \
-"\nCreates an audio file from the content of a table.\n\n:Args:\n\n    \
-table : PyoTableObject\n        table from which to retrieve samples to write.\n    \
-path : string\n        Full path (including extension) of the new file.\n    \
-fileformat : int, optional\n        Format type of the new file. Defaults to 0. Supported formats are:\n            \
-0. WAVE - Microsoft WAV format (little endian) {.wav, .wave}\n            \
-1. AIFF - Apple/SGI AIFF format (big endian) {.aif, .aiff}\n            \
-2. AU - Sun/NeXT AU format (big endian) {.au}\n            \
-3. RAW - RAW PCM data {no extension}\n            \
-4. SD2 - Sound Designer 2 {.sd2}\n            \
-5. FLAC - FLAC lossless file format {.flac}\n            \
-6. CAF - Core Audio File format {.caf}\n            \
-7. OGG - Xiph OGG container {.ogg}\n    \
-sampletype ; int, optional\n        Bit depth encoding of the audio file. Defaults to 0.\n        \
-SD2 and FLAC only support 16 or 24 bit int. Supported types are:\n            \
-0. 16 bit int\n            \
-1. 24 bit int\n            \
-2. 32 bit int\n            \
-3. 32 bit float\n            \
-4. 64 bit float\n            \
-5. U-Law encoded\n            \
-6. A-Law encoded\n    \
-quality : float, optional\n        The encoding quality value, between 0.0 (lowest quality) and\n        \
-1.0 (highest quality). This argument has an effect only with\n        \
-FLAC and OGG compressed formats. Defaults to 0.4.\n\n\
->>> import os\n\
->>> home = os.path.expanduser('~')\n\
->>> path1 = SNDS_PATH + '/transparent.aif'\n\
->>> path2 = os.path.join(home, '/transparent2.aif')\n\
->>> t = SndTable(path1)\n\
->>> savefileFromTable(table=t, path=path, fileformat=1, sampletype=1)\n\n"
-
 static PyObject *
-savefileFromTable(PyObject *self, PyObject *args, PyObject *kwds) {
+p_savefileFromTable(PyObject *self, PyObject *args, PyObject *kwds) {
     int i, j, size;
     char *recpath;
     PyObject *table;
@@ -552,9 +476,10 @@ savefileFromTable(PyObject *self, PyObject *args, PyObject *kwds) {
     int num_items = 0;
     SNDFILE *recfile;
     SF_INFO recinfo;
+    Py_ssize_t psize;
     static char *kwlist[] = {"table", "path", "fileformat", "sampletype", "quality", NULL};
 
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, "Os|iid", kwlist, &table, &recpath, &fileformat, &sampletype, &quality))
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "Os#|iid", kwlist, &table, &recpath, &psize, &fileformat, &sampletype, &quality))
         return PyInt_FromLong(-1);
 
     base_objs = PyObject_GetAttrString(table, "_base_objs");
@@ -649,37 +574,6 @@ savefileFromTable(PyObject *self, PyObject *args, PyObject *kwds) {
 }
 
 /****** Sampling rate conversions ******/
-#define upsamp_info \
-"\nIncreases the sampling rate of an audio file.\n\n:Args:\n\n    \
-path : string\n        Full path (including extension) of the audio file to convert.\n    \
-outfile : string\n        Full path (including extension) of the new file.\n    \
-up : int, optional\n        Upsampling factor. Defaults to 4.\n    \
-order : int, optional\n        Length, in samples, of the anti-aliasing lowpass filter. Defaults to 128.\n\n\
->>> import os\n\
->>> home = os.path.expanduser('~')\n\
->>> f = SNDS_PATH+'/transparent.aif'\n\
->>> # upsample a signal 3 times\n\
->>> upfile = os.path.join(home, 'trans_upsamp_2.aif')\n\
->>> upsamp(f, upfile, 2, 256)\n\
->>> # downsample the upsampled signal 3 times\n\
->>> downfile = os.path.join(home, 'trans_downsamp_3.aif')\n\
->>> downsamp(upfile, downfile, 3, 256)\n\n"
-
-#define downsamp_info \
-"\nDecreases the sampling rate of an audio file.\n\n:Args:\n\n    \
-path : string\n        Full path (including extension) of the audio file to convert.\n    \
-outfile : string\n        Full path (including extension) of the new file.\n    \
-down : int, optional\n        Downsampling factor. Defaults to 4.\n    \
-order : int, optional\n        Length, in samples, of the anti-aliasing lowpass filter. Defaults to 128.\n\n\
->>> import os\n\
->>> home = os.path.expanduser('~')\n\
->>> f = SNDS_PATH+'/transparent.aif'\n\
->>> # upsample a signal 3 times\n\
->>> upfile = os.path.join(home, 'trans_upsamp_2.aif')\n\
->>> upsamp(f, upfile, 2, 256)\n\
->>> # downsample the upsampled signal 3 times\n\
->>> downfile = os.path.join(home, 'trans_downsamp_3.aif')\n\
->>> downsamp(upfile, downfile, 3, 256)\n\n"
 
 MYFLT HALF_BLACKMAN[513] = {5.999999848427251e-05, 6.0518785176100209e-05, 6.2141079979483038e-05, 6.4805892179720104e-05, 6.8557070335373282e-05, 7.335994450841099e-05, 7.9284000094048679e-05, 8.6251806351356208e-05, 9.4344803073909134e-05, 0.00010353395919082686, 0.0001138320003519766, 0.0001252776273759082, 0.00013784394832327962, 0.00015158756286837161, 0.00016646583389956504, 0.00018252100562676787, 0.00019978794443886727, 0.00021828405442647636, 0.00023800843337085098, 0.00025901006301864982, 0.0002812814200296998, 0.00030484798480756581, 0.00032972017652355134, 0.00035596732050180435, 0.00038358545862138271, 0.0004126313142478466, 0.00044307118514552712, 0.00047501336666755378, 0.00050844199722632766, 0.00054337596520781517, 0.00057988864136859775, 0.00061800965340808034, 0.00065775914117693901, 0.000699152413289994, 0.00074227934237569571, 0.00078715570271015167, 0.00083377416012808681, 0.00088227324886247516, 0.0009326221770606935, 0.00098489224910736084, 0.0010391034884378314, 0.0010953464079648256, 0.001153626712039113, 0.0012140328763052821, 0.0012765693245455623, 0.001341317780315876, 0.0014083425048738718, 0.0014776336029171944, 0.001549328095279634, 0.0016234172508120537, 0.0017000052612274885, 0.0017791179707273841, 0.0018608199898153543, 0.0019451823318377137, 0.0020322385244071484, 0.0021220885682851076, 0.0022147782146930695, 0.0023103870917111635, 0.0024089745711535215, 0.0025105655658990145, 0.0026152802165597677, 0.0027231767307966948, 0.0028343265876173973, 0.0029487889260053635, 0.0030666270758956671, 0.0031879479065537453, 0.0033128033392131329, 0.0034412886016070843, 0.0035734693519771099, 0.0037094042636454105, 0.0038491983432322741, 0.0039929361082613468, 0.0041406778618693352, 0.004292510449886322, 0.0044485158286988735, 0.004608803428709507, 0.0047734435647726059, 0.0049425391480326653, 0.005116121843457222, 0.0052943285554647446, 0.0054772454313933849, 0.0056649716570973396, 0.0058575910516083241, 0.0060551739297807217, 0.0062578483484685421, 0.0064656869508326054, 0.0066788033582270145, 0.0068972636945545673, 0.0071212123148143291, 0.0073507223278284073, 0.007585874292999506, 0.0078268209472298622, 0.0080736298114061356, 0.0083263935521245003, 0.0085852388292551041, 0.0088502718135714531, 0.0091215828433632851, 0.0093993041664361954, 0.0096835149452090263, 0.0099743194878101349, 0.010271874256432056, 0.010576239787042141, 0.010887577198445797, 0.01120593398809433, 0.01153149176388979, 0.011864298023283482, 0.012204526923596859, 0.012552268803119659, 0.012907638214528561, 0.013270745985209942, 0.013641729019582272, 0.014020670205354691, 0.014407743699848652, 0.014803030528128147, 0.015206646174192429, 0.015618747100234032, 0.016039434820413589, 0.0164688341319561, 0.01690707728266716, 0.017354268580675125, 0.017810540273785591, 0.018276045098900795, 0.018750874325633049, 0.019235162064433098, 0.01972905732691288, 0.020232660695910454, 0.020746102556586266, 0.021269544959068298, 0.021803082898259163, 0.022346852347254753, 0.022900991141796112, 0.023465657606720924, 0.024040926247835159, 0.024626968428492546, 0.025223886594176292, 0.025831848382949829, 0.026450937613844872, 0.02708134613931179, 0.027723187580704689, 0.02837657742202282, 0.029041649773716927, 0.029718579724431038, 0.030407454818487167, 0.03110840916633606, 0.03182162344455719, 0.032547183334827423, 0.033285260200500488, 0.034035947173833847, 0.034799445420503616, 0.035575807094573975, 0.036365248262882233, 0.037167854607105255, 0.037983741611242294, 0.038813117891550064, 0.039656046777963638, 0.040512733161449432, 0.041383236646652222, 0.042267743498086929, 0.043166369199752808, 0.044079229235649109, 0.045006513595581055, 0.045948274433612823, 0.046904727816581726, 0.047875978052616119, 0.048862140625715256, 0.049863360822200775, 0.050879742950201035, 0.051911454647779465, 0.052958611398935318, 0.054021358489990234, 0.055099856108427048, 0.056194130331277847, 0.057304393500089645, 0.0584307461977005, 0.059573329985141754, 0.060732249170541763, 0.061907690018415451, 0.063099689781665802, 0.064308419823646545, 0.065534010529518127, 0.066776573657989502, 0.068036213517189026, 0.069313108921051025, 0.070607319474220276, 0.071918979287147522, 0.073248207569122314, 0.074595145881175995, 0.075959883630275726, 0.07734256237745285, 0.078743241727352142, 0.080162093043327332, 0.08159918338060379, 0.083054669201374054, 0.084528610110282898, 0.086021184921264648, 0.087532415986061096, 0.089062459766864777, 0.090611375868320465, 0.092179328203201294, 0.093766368925571442, 0.095372647047042847, 0.096998192369937897, 0.098643146455287933, 0.10030759125947952, 0.10199161618947983, 0.10369531810283661, 0.10541882365942001, 0.10716214776039124, 0.10892540961503983, 0.11070869863033295, 0.11251209676265717, 0.11433566361665726, 0.11617954820394516, 0.11804373562335968, 0.11992833018302917, 0.12183342128992081, 0.12375906854867935, 0.12570534646511078, 0.12767235934734344, 0.12966008484363556, 0.13166864216327667, 0.13369807600975037, 0.13574843108654022, 0.13781978189945221, 0.13991223275661469, 0.14202572405338287, 0.14416038990020752, 0.14631621539592743, 0.14849328994750977, 0.15069162845611572, 0.15291133522987366, 0.15515235066413879, 0.15741473436355591, 0.15969853103160858, 0.1620037853717804, 0.16433051228523254, 0.16667875647544861, 0.16904847323894501, 0.17143970727920532, 0.17385250329971313, 0.17628686130046844, 0.17874275147914886, 0.18122029304504395, 0.18371935188770294, 0.18623997271060944, 0.18878217041492462, 0.1913459450006485, 0.19393126666545868, 0.19653819501399994, 0.19916661083698273, 0.20181652903556824, 0.20448794960975647, 0.20718084275722504, 0.20989517867565155, 0.2126309871673584, 0.21538813412189484, 0.21816661953926086, 0.2209663987159729, 0.22378745675086975, 0.22662979364395142, 0.22949324548244476, 0.23237781226634979, 0.23528343439102173, 0.23821006715297699, 0.24115763604640961, 0.24412614107131958, 0.24711540341377258, 0.25012537837028503, 0.25315603613853455, 0.25620725750923157, 0.25927898287773132, 0.26237118244171143, 0.26548364758491516, 0.26861634850502014, 0.27176916599273682, 0.27494201064109802, 0.2781347930431366, 0.28134745359420776, 0.28457978367805481, 0.28783169388771057, 0.29110309481620789, 0.29439383745193481, 0.29770383238792419, 0.30103299021720886, 0.30438104271888733, 0.30774796009063721, 0.31113356351852417, 0.31453773379325867, 0.31796032190322876, 0.3214012086391449, 0.32486018538475037, 0.32833707332611084, 0.33183175325393677, 0.33534407615661621, 0.33887386322021484, 0.34242099523544312, 0.34598517417907715, 0.34956631064414978, 0.35316416621208191, 0.35677862167358398, 0.3604094386100769, 0.36405652761459351, 0.36771953105926514, 0.37139829993247986, 0.37509268522262573, 0.37880244851112366, 0.38252738118171692, 0.38626736402511597, 0.39002197980880737, 0.39379113912582397, 0.39757457375526428, 0.40137210488319397, 0.40518343448638916, 0.40900847315788269, 0.41284680366516113, 0.41669824719429016, 0.42056256532669067, 0.42443951964378357, 0.42832884192466736, 0.4322303831577301, 0.43614372611045837, 0.44006863236427307, 0.44400492310523987, 0.4479522705078125, 0.45191043615341187, 0.45587921142578125, 0.45985805988311768, 0.46384698152542114, 0.46784573793411255, 0.47185373306274414, 0.47587084770202637, 0.47989678382873535, 0.48393124341964722, 0.48797392845153809, 0.49202454090118408, 0.49608278274536133, 0.50014835596084595, 0.50422090291976929, 0.50830012559890747, 0.5123857855796814, 0.51647758483886719, 0.52057504653930664, 0.52467787265777588, 0.5287858247756958, 0.53289848566055298, 0.53701561689376831, 0.54113680124282837, 0.54526180028915405, 0.54939013719558716, 0.55352163314819336, 0.55765581130981445, 0.56179243326187134, 0.56593120098114014, 0.57007157802581787, 0.57421320676803589, 0.57835590839385986, 0.58249920606613159, 0.58664274215698242, 0.59078621864318848, 0.59492921829223633, 0.5990714430809021, 0.60321247577667236, 0.60735195875167847, 0.61148953437805176, 0.61562496423721313, 0.61975759267807007, 0.62388718128204346, 0.62801331281661987, 0.63213574886322021, 0.6362539529800415, 0.64036762714385986, 0.64447635412216187, 0.64857983589172363, 0.65267753601074219, 0.65676921606063843, 0.66085445880889893, 0.6649329662322998, 0.66900408267974854, 0.67306756973266602, 0.67712306976318359, 0.68117010593414307, 0.68520838022232056, 0.68923747539520264, 0.69325697422027588, 0.69726645946502686, 0.70126563310623169, 0.70525401830673218, 0.70923143625259399, 0.71319711208343506, 0.71715086698532104, 0.72109222412109375, 0.7250208854675293, 0.72893643379211426, 0.73283845186233521, 0.73672652244567871, 0.74060028791427612, 0.74445939064025879, 0.74830329418182373, 0.75213176012039185, 0.75594443082809448, 0.75974071025848389, 0.76352030038833618, 0.76728278398513794, 0.77102780342102051, 0.77475500106811523, 0.77846395969390869, 0.78215426206588745, 0.78582549095153809, 0.78947734832763672, 0.79310941696166992, 0.79672133922576904, 0.80031275749206543, 0.80388307571411133, 0.80743205547332764, 0.8109593391418457, 0.81446456909179688, 0.81794726848602295, 0.82140713930130005, 0.82484376430511475, 0.82825678586959839, 0.83164584636688232, 0.8350105881690979, 0.83835059404373169, 0.84166562557220459, 0.84495508670806885, 0.84821879863739014, 0.85145628452301025, 0.8546673059463501, 0.85785144567489624, 0.86100828647613525, 0.86413758993148804, 0.86723899841308594, 0.87031209468841553, 0.87335652112960815, 0.87637203931808472, 0.87935841083526611, 0.88231492042541504, 0.88524156808853149, 0.88813787698745728, 0.89100354909896851, 0.89383822679519653, 0.89664167165756226, 0.89941352605819702, 0.90215343236923218, 0.90486115217208862, 0.90753632783889771, 0.91017866134643555, 0.91278791427612305, 0.91536372900009155, 0.91790568828582764, 0.92041373252868652, 0.92288732528686523, 0.92532640695571899, 0.92773056030273438, 0.93009954690933228, 0.93243312835693359, 0.93473094701766968, 0.93699288368225098, 0.93921846151351929, 0.94140768051147461, 0.94356006383895874, 0.94567543268203735, 0.94775348901748657, 0.94979411363601685, 0.95179694890975952, 0.95376187562942505, 0.95568859577178955, 0.95757681131362915, 0.95942646265029907, 0.96123719215393066, 0.9630088210105896, 0.96474123001098633, 0.96643412113189697, 0.96808725595474243, 0.96970051527023315, 0.97127372026443481, 0.97280663251876831, 0.97429907321929932, 0.97575092315673828, 0.9771619439125061, 0.97853195667266846, 0.97986090183258057, 0.98114854097366333, 0.98239481449127197, 0.98359936475753784, 0.98476219177246094, 0.98588317632675171, 0.98696213960647583, 0.98799896240234375, 0.98899352550506592, 0.98994570970535278, 0.99085539579391479, 0.9917224645614624, 0.99254685640335083, 0.99332839250564575, 0.99406707286834717, 0.99476277828216553, 0.99541538953781128, 0.99602478742599487, 0.99659103155136108, 0.99711394309997559, 0.99759352207183838, 0.99802964925765991, 0.99842232465744019, 0.9987715482711792, 0.99907714128494263, 0.99933922290802002, 0.99955761432647705, 0.9997323751449585, 0.99986344575881958, 0.9999508261680603, 0.99999451637268066, 0.99999451637268066};
 /*
@@ -753,13 +647,14 @@ void lp_conv(MYFLT *samples, MYFLT *impulse, int num_samps, int size, int gain)
 }
 
 static PyObject *
-upsamp(PyObject *self, PyObject *args, PyObject *kwds)
+p_upsamp(PyObject *self, PyObject *args, PyObject *kwds)
 {
     unsigned int i, j, k;
     char *inpath;
     char *outpath;
     SNDFILE *sf;
     SF_INFO info;
+    Py_ssize_t psize, psize2;
     unsigned int snd_size, snd_sr, snd_chnls, num_items;
     MYFLT *sincfunc;
     MYFLT *tmp;
@@ -769,7 +664,7 @@ upsamp(PyObject *self, PyObject *args, PyObject *kwds)
     int order = 128;
     static char *kwlist[] = {"path", "outfile", "up", "order", NULL};
 
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, "ss|ii", kwlist, &inpath, &outpath, &up, &order))
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "s#s#|ii", kwlist, &inpath, &psize, &outpath, &psize2, &up, &order))
         return PyInt_FromLong(-1);
 
     /* opening input soundfile */
@@ -856,13 +751,14 @@ upsamp(PyObject *self, PyObject *args, PyObject *kwds)
 }
 
 static PyObject *
-downsamp(PyObject *self, PyObject *args, PyObject *kwds)
+p_downsamp(PyObject *self, PyObject *args, PyObject *kwds)
 {
     unsigned int i, j;
     char *inpath;
     char *outpath;
     SNDFILE *sf;
     SF_INFO info;
+    Py_ssize_t psize, psize2;
     unsigned int snd_size, snd_sr, snd_chnls, num_items, samples_per_channels;
     MYFLT *sincfunc;
     MYFLT *tmp;
@@ -872,7 +768,7 @@ downsamp(PyObject *self, PyObject *args, PyObject *kwds)
     int order = 128;
     static char *kwlist[] = {"path", "outfile", "down", "order", NULL};
 
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, "ss|ii", kwlist, &inpath, &outpath, &down, &order))
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "s#s#|ii", kwlist, &inpath, &psize, &outpath, &psize2, &down, &order))
         return PyInt_FromLong(-1);
 
     /* opening input soundfile */
@@ -970,8 +866,8 @@ This function receives a list of points as input and returns a simplified list b
 A point is a tuple (or a list) of two floats, time and value. A list of points looks like:\n\n        \
 [ (0, 0), (0.1, 0.7), (0.2, 0.5), ... ] \n\n\
 :Args:\n\n    \
-pointlist : list of lists or list of tuples\n        List of points (time, value) to filter.\n    \
-tolerance : float, optional\n        Normalized distance threshold under which a point is\n        excluded from the list. Defaults to 0.02."
+pointlist: list of lists or list of tuples\n        List of points (time, value) to filter.\n    \
+tolerance: float, optional\n        Normalized distance threshold under which a point is\n        excluded from the list. Defaults to 0.02."
 
 typedef struct STACK_RECORD {
     int nAnchorIndex;
@@ -1134,15 +1030,15 @@ reducePoints(PyObject *self, PyObject *args, PyObject *kwds)
 This function returns the shortest distance from a point to a line segment\nnormalized between 0 and 1.\n\n\
 A point is a tuple (or a list) of two floats, time and value. `p` is the point for which\nto find the distance from line `p1` to `p2`.\n\n\
 :Args:\n\n    \
-p : list or tuple\n        Point for which to find the distance.\n    \
-p1 : list or tuple\n        First point of the segment.\n    \
-p2 : list or tuple\n        Second point of the segment.\n    \
-xmin : float, optional\n        Minimum value on the X axis.\n    \
-xmax : float, optional\n        Maximum value on the X axis.\n    \
-ymin : float, optional\n        Minimum value on the Y axis.\n    \
-ymax : float, optional\n        Maximum value on the Y axis.\n    \
-xlog : boolean, optional\n        Set this argument to True if X axis has a logarithmic scaling.\n    \
-ylog : boolean, optional\n        Set this argument to True if Y axis has a logarithmic scaling."
+p: list or tuple\n        Point for which to find the distance.\n    \
+p1: list or tuple\n        First point of the segment.\n    \
+p2: list or tuple\n        Second point of the segment.\n    \
+xmin: float, optional\n        Minimum value on the X axis.\n    \
+xmax: float, optional\n        Maximum value on the X axis.\n    \
+ymin: float, optional\n        Minimum value on the Y axis.\n    \
+ymax: float, optional\n        Maximum value on the Y axis.\n    \
+xlog: boolean, optional\n        Set this argument to True if X axis has a logarithmic scaling.\n    \
+ylog: boolean, optional\n        Set this argument to True if Y axis has a logarithmic scaling."
 
 static PyObject *
 distanceToSegment(PyObject *self, PyObject *args, PyObject *kwds)
@@ -1209,11 +1105,11 @@ distanceToSegment(PyObject *self, PyObject *args, PyObject *kwds)
 #define linToCosCurve_info \
 "\nCreates a cosinus interpolated curve from a list of points.\n\n\
 A point is a tuple (or a list) of two floats, time and value.\n\n:Args:\n\n    \
-data : list of points\n        Set of points between which will be inserted interpolated segments.\n    \
-yrange : list of 2 floats, optional\n        Minimum and maximum values on the Y axis. Defaults to [0., 1.].\n    \
-totaldur : float, optional\n        X axis duration. Defaults to 1.\n    \
-points : int, optional\n        Number of points in the output list. Defaults to 1024.\n    \
-log : boolean, optional\n        Set this value to True if the Y axis has a logarithmic scale. Defaults to False\n\n\
+data: list of points\n        Set of points between which will be inserted interpolated segments.\n    \
+yrange: list of 2 floats, optional\n        Minimum and maximum values on the Y axis. Defaults to [0., 1.].\n    \
+totaldur: float, optional\n        X axis duration. Defaults to 1.\n    \
+points: int, optional\n        Number of points in the output list. Defaults to 1024.\n    \
+log: boolean, optional\n        Set this value to True if the Y axis has a logarithmic scale. Defaults to False\n\n\
 >>> s = Server().boot()\n\
 >>> a = [(0,0), (0.25, 1), (0.33, 1), (1,0)]\n\
 >>> b = linToCosCurve(a, yrange=[0, 1], totaldur=1, points=8192)\n\
@@ -1330,20 +1226,20 @@ linToCosCurve(PyObject *self, PyObject *args, PyObject *kwds)
 This function takes data in the range `xmin` - `xmax` and returns corresponding values\nin the range `ymin` - `ymax`.\n\n\
 `data` can be either a number or a list. Return value is of the same type as `data`\nwith all values rescaled.\n\n\
 :Argss:\n\n    \
-data : float or list of floats\n        Values to convert.\n    \
-xmin : float, optional\n        Minimum value of the input range.\n    \
-xmax : float, optional\n        Maximum value of the input range.\n    \
-ymin : float, optional\n        Minimum value of the output range.\n    \
-ymax : float, optional\n        Maximum value of the output range.\n    \
-xlog : boolean, optional\n        Set this argument to True if the input range has a logarithmic scaling.\n    \
-ylog : boolean, optional\n        Set this argument to True if the output range has a logarithmic scaling.\n\n\
+data: float or list of floats\n        Values to convert.\n    \
+xmin: float, optional\n        Minimum value of the input range.\n    \
+xmax: float, optional\n        Maximum value of the input range.\n    \
+ymin: float, optional\n        Minimum value of the output range.\n    \
+ymax: float, optional\n        Maximum value of the output range.\n    \
+xlog: boolean, optional\n        Set this argument to True if the input range has a logarithmic scaling.\n    \
+ylog: boolean, optional\n        Set this argument to True if the output range has a logarithmic scaling.\n\n\
 >>> a = 0.5\n\
 >>> b = rescale(a, 0, 1, 20, 20000, False, True)\n\
->>> print b\n\
+>>> print(b)\n\
 632.453369141\n\
 >>> a = [0, .4, .8]\n\
 >>> b = rescale(a, 0, 1, 20, 20000, False, True)\n\
->>> print b\n\
+>>> print(b)\n\
 [20.000001907348633, 316.97738647460938, 5023.7705078125]\n\n"
 
 static PyObject *
@@ -1468,13 +1364,13 @@ rescale(PyObject *self, PyObject *args, PyObject *kwds)
 "\nConverts values from a 0-1 range to an output range.\n\n\
 This function takes data in the range `0` - `1` and returns corresponding values\nin the range `min` - `max`.\n\n\
 :Argss:\n\n    \
-x : float\n        Value to convert, in the range 0 to 1.\n    \
-min : float, optional\n        Minimum value of the output range. Defaults to 0.\n    \
-max : float, optional\n        Maximum value of the output range. Defaults to 1.\n    \
-exp : float, optional\n        Power factor (1 (default) is linear, les than 1 is logarithmic, greter than 1 is exponential).\n\n\
+x: float\n        Value to convert, in the range 0 to 1.\n    \
+min: float, optional\n        Minimum value of the output range. Defaults to 0.\n    \
+max: float, optional\n        Maximum value of the output range. Defaults to 1.\n    \
+exp: float, optional\n        Power factor (1 (default) is linear, les than 1 is logarithmic, greter than 1 is exponential).\n\n\
 >>> a = 0.5\n\
 >>> b = floatmap(a, 0, 1, 4)\n\
->>> print b\n\
+>>> print(b)\n\
 0.0625\n\n"
 
 static PyObject *
@@ -1503,17 +1399,17 @@ floatmap(PyObject *self, PyObject *args, PyObject *kwds)
 /****** Conversion utilities ******/
 #define midiToHz_info \
 "\nConverts a midi note value to frequency in Hertz.\n\n:Args:\n\n    \
-x : int or float\n        Midi note. `x` can be a number, a list or a tuple, otherwise the function returns None.\n\n\
+x: int or float\n        Midi note. `x` can be a number, a list or a tuple, otherwise the function returns None.\n\n\
 >>> a = (48, 60, 62, 67)\n\
 >>> b = midiToHz(a)\n\
->>> print b\n\
+>>> print(b)\n\
 (130.8127826503271, 261.62556530066814, 293.66476791748823, 391.9954359818656)\n\
 >>> a = [48, 60, 62, 67]\n\
 >>> b = midiToHz(a)\n\
->>> print b\n\
+>>> print(b)\n\
 [130.8127826503271, 261.62556530066814, 293.66476791748823, 391.9954359818656]\n\
 >>> b = midiToHz(60.0)\n\
->>> print b\n\
+>>> print(b)\n\
 261.625565301\n\n"
 
 static PyObject *
@@ -1548,17 +1444,17 @@ midiToHz(PyObject *self, PyObject *arg) {
 
 #define hzToMidi_info \
 "\nConverts a frequency in Hertz to a midi note value.\n\n:Args:\n\n    \
-x : float\n        Frequency in Hertz. `x` can be a number, a list or a tuple, otherwise the function returns None.\n\n\
+x: float\n        Frequency in Hertz. `x` can be a number, a list or a tuple, otherwise the function returns None.\n\n\
 >>> a = (110.0, 220.0, 440.0, 880.0)\n\
 >>> b = hzToMidi(a)\n\
->>> print b\n\
+>>> print(b)\n\
 (45.0, 57.0, 69.0, 81.0)\n\
 >>> a = [110.0, 220.0, 440.0, 880.0]\n\
 >>> b = hzToMidi(a)\n\
->>> print b\n\
+>>> print(b)\n\
 [45.0, 57.0, 69.0, 81.0]\n\
 >>> b = hzToMidi(440.0)\n\
->>> print b\n\
+>>> print(b)\n\
 69.0\n\n"
 
 static PyObject *
@@ -1593,17 +1489,17 @@ hzToMidi(PyObject *self, PyObject *arg) {
 
 #define midiToTranspo_info \
 "\nConverts a midi note value to transposition factor (central key = 60).\n\n:Args:\n\n    \
-x : int or float\n        Midi note. `x` can be a number, a list or a tuple, otherwise the function returns None.\n\n\
+x: int or float\n        Midi note. `x` can be a number, a list or a tuple, otherwise the function returns None.\n\n\
 >>> a = (48, 60, 62, 67)\n\
 >>> b = midiToTranspo(a)\n\
->>> print b\n    \
+>>> print(b)\n    \
 (0.49999999999997335, 1.0, 1.122462048309383, 1.4983070768767281)\n\
 >>> a = [48, 60, 62, 67]\n\
 >>> b = midiToTranspo(a)\n\
->>> print b\n\
+>>> print(b)\n\
 [0.49999999999997335, 1.0, 1.122462048309383, 1.4983070768767281]\n\
 >>> b = midiToTranspo(60.0)\n\
->>> print b\n\
+>>> print(b)\n\
 1.0\n\n"
 
 static PyObject *
@@ -1638,18 +1534,18 @@ midiToTranspo(PyObject *self, PyObject *arg) {
 
 #define sampsToSec_info \
 "\nReturns the duration in seconds equivalent to the number of samples given as an argument.\n\n:Args:\n\n    \
-x : int or float\n        Duration in samples. `x` can be a number, a list or a tuple, otherwise function returns None.\n\n\
+x: int or float\n        Duration in samples. `x` can be a number, a list or a tuple, otherwise function returns None.\n\n\
 >>> s = Server().boot()\n\
 >>> a = (64, 128, 256)\n\
 >>> b = sampsToSec(a)\n\
->>> print b\n\
+>>> print(b)\n\
 (0.0014512471655328798, 0.0029024943310657597, 0.0058049886621315194)\n\
 >>> a = [64, 128, 256]\n\
 >>> b = sampsToSec(a)\n\
->>> print b\n\
+>>> print(b)\n\
 [0.0014512471655328798, 0.0029024943310657597, 0.0058049886621315194]\n\
 >>> b = sampsToSec(8192)\n\
->>> print b\n\
+>>> print(b)\n\
 0.185759637188\n\n"
 
 static PyObject *
@@ -1690,18 +1586,18 @@ sampsToSec(PyObject *self, PyObject *arg) {
 
 #define secToSamps_info \
 "\nReturns the number of samples equivalent to the duration in seconds given as an argument.\n\n:Args:\n\n    \
-x : int or float\n        Duration in seconds. `x` can be a number, a list or a tuple, otherwise function returns None.\n\n\
+x: int or float\n        Duration in seconds. `x` can be a number, a list or a tuple, otherwise function returns None.\n\n\
 >>> s = Server().boot()\n\
 >>> a = (0.1, 0.25, 0.5, 1)\n\
 >>> b = secToSamps(a)\n\
->>> print b\n\
+>>> print(b)\n\
 (4410, 11025, 22050, 44100)\n\
 >>> a = [0.1, 0.25, 0.5, 1]\n\
 >>> b = secToSamps(a)\n\
->>> print b\n\
+>>> print(b)\n\
 [4410, 11025, 22050, 44100]\n\
 >>> b = secToSamps(2.5)\n\
->>> print b\n\
+>>> print(b)\n\
 110250\n\n"
 
 static PyObject *
@@ -1743,10 +1639,10 @@ secToSamps(PyObject *self, PyObject *arg) {
 /************* Server quieries *************/
 #define serverCreated_info \
 "\nReturns True if a Server object is already created, otherwise, returns False.\n\n\
->>> print serverCreated()\n\
+>>> print(serverCreated())\n\
 False\n\
 >>> s = Server()\n\
->>> print serverCreated()\n\
+>>> print(serverCreated())\n\
 True\n\n"
 
 static PyObject *
@@ -1764,10 +1660,10 @@ serverCreated(PyObject *self) {
 #define serverBooted_info \
 "\nReturns True if an already created Server is booted, otherwise, returns False.\n\n\
 >>> s = Server()\n\
->>> print serverBooted()\n\
+>>> print(serverBooted())\n\
 False\n\
 >>> s.boot()\n\
->>> print serverBooted()\n\
+>>> print(serverBooted())\n\
 True\n\n"
 
 static PyObject *
@@ -1814,11 +1710,11 @@ static PyMethodDef pyo_functions[] = {
 {"pm_get_default_input", (PyCFunction)portmidi_get_default_input, METH_NOARGS, portmidi_get_default_input_info},
 {"pm_get_output_devices", (PyCFunction)portmidi_get_output_devices, METH_NOARGS, portmidi_get_output_devices_info},
 {"pm_get_default_output", (PyCFunction)portmidi_get_default_output, METH_NOARGS, portmidi_get_default_output_info},
-{"sndinfo", (PyCFunction)sndinfo, METH_VARARGS|METH_KEYWORDS, sndinfo_info},
-{"savefile", (PyCFunction)savefile, METH_VARARGS|METH_KEYWORDS, savefile_info},
-{"savefileFromTable", (PyCFunction)savefileFromTable, METH_VARARGS|METH_KEYWORDS, savefileFromTable_info},
-{"upsamp", (PyCFunction)upsamp, METH_VARARGS|METH_KEYWORDS, upsamp_info},
-{"downsamp", (PyCFunction)downsamp, METH_VARARGS|METH_KEYWORDS, downsamp_info},
+{"p_sndinfo", (PyCFunction)p_sndinfo, METH_VARARGS|METH_KEYWORDS, ""},
+{"p_savefile", (PyCFunction)p_savefile, METH_VARARGS|METH_KEYWORDS, ""},
+{"p_savefileFromTable", (PyCFunction)p_savefileFromTable, METH_VARARGS|METH_KEYWORDS, ""},
+{"p_upsamp", (PyCFunction)p_upsamp, METH_VARARGS|METH_KEYWORDS, ""},
+{"p_downsamp", (PyCFunction)p_downsamp, METH_VARARGS|METH_KEYWORDS, ""},
 {"reducePoints", (PyCFunction)reducePoints, METH_VARARGS|METH_KEYWORDS, reducePoints_info},
 {"distanceToSegment", (PyCFunction)distanceToSegment, METH_VARARGS|METH_KEYWORDS, distanceToSegment_info},
 {"rescale", (PyCFunction)rescale, METH_VARARGS|METH_KEYWORDS, rescale_info},
@@ -2226,4 +2122,4 @@ init_pyo64(void)
 #if PY_MAJOR_VERSION >= 3
     return m;
 #endif
-}
\ No newline at end of file
+}
diff --git a/src/engine/servermodule.c b/src/engine/servermodule.c
index d67b475..0f9f68c 100644
--- a/src/engine/servermodule.c
+++ b/src/engine/servermodule.c
@@ -381,7 +381,7 @@ Server_process_buffers(Server *server)
         else if (Stream_getBufferCountWait(stream_tmp) != 0)
             Stream_IncrementBufferCount(stream_tmp);
     }
-    if (server->withGUI == 1 && nchnls <= 8) {
+    if (server->withGUI == 1 && nchnls <= 16) {
         Server_process_gui(server);
     }
     if (server->withTIME == 1) {
@@ -467,6 +467,30 @@ Server_process_gui(Server *server)
             case 8:
                 PyObject_CallMethod((PyObject *)server->GUI, "setRms", "ffffffff", server->lastRms[0], server->lastRms[1], server->lastRms[2], server->lastRms[3], server->lastRms[4], server->lastRms[5], server->lastRms[6], server->lastRms[7]);
                 break;
+            case 9:
+                PyObject_CallMethod((PyObject *)server->GUI, "setRms", "fffffffff", server->lastRms[0], server->lastRms[1], server->lastRms[2], server->lastRms[3], server->lastRms[4], server->lastRms[5], server->lastRms[6], server->lastRms[7], server->lastRms[8]);
+                break;
+            case 10:
+                PyObject_CallMethod((PyObject *)server->GUI, "setRms", "ffffffffff", server->lastRms[0], server->lastRms[1], server->lastRms[2], server->lastRms[3], server->lastRms[4], server->lastRms[5], server->lastRms[6], server->lastRms[7], server->lastRms[8], server->lastRms[9]);
+                break;
+            case 11:
+                PyObject_CallMethod((PyObject *)server->GUI, "setRms", "fffffffffff", server->lastRms[0], server->lastRms[1], server->lastRms[2], server->lastRms[3], server->lastRms[4], server->lastRms[5], server->lastRms[6], server->lastRms[7], server->lastRms[8], server->lastRms[9], server->lastRms[10]);
+                break;
+            case 12:
+                PyObject_CallMethod((PyObject *)server->GUI, "setRms", "ffffffffffff", server->lastRms[0], server->lastRms[1], server->lastRms[2], server->lastRms[3], server->lastRms[4], server->lastRms[5], server->lastRms[6], server->lastRms[7], server->lastRms[8], server->lastRms[9], server->lastRms[10], server->lastRms[11]);
+                break;
+            case 13:
+                PyObject_CallMethod((PyObject *)server->GUI, "setRms", "fffffffffffff", server->lastRms[0], server->lastRms[1], server->lastRms[2], server->lastRms[3], server->lastRms[4], server->lastRms[5], server->lastRms[6], server->lastRms[7], server->lastRms[8], server->lastRms[9], server->lastRms[10], server->lastRms[11], server->lastRms[12]);
+                break;
+            case 14:
+                PyObject_CallMethod((PyObject *)server->GUI, "setRms", "ffffffffffffff", server->lastRms[0], server->lastRms[1], server->lastRms[2], server->lastRms[3], server->lastRms[4], server->lastRms[5], server->lastRms[6], server->lastRms[7], server->lastRms[8], server->lastRms[9], server->lastRms[10], server->lastRms[11], server->lastRms[12], server->lastRms[13]);
+                break;
+            case 15:
+                PyObject_CallMethod((PyObject *)server->GUI, "setRms", "fffffffffffffff", server->lastRms[0], server->lastRms[1], server->lastRms[2], server->lastRms[3], server->lastRms[4], server->lastRms[5], server->lastRms[6], server->lastRms[7], server->lastRms[8], server->lastRms[9], server->lastRms[10], server->lastRms[11], server->lastRms[12], server->lastRms[13], server->lastRms[14]);
+                break;
+            case 16:
+                PyObject_CallMethod((PyObject *)server->GUI, "setRms", "ffffffffffffffff", server->lastRms[0], server->lastRms[1], server->lastRms[2], server->lastRms[3], server->lastRms[4], server->lastRms[5], server->lastRms[6], server->lastRms[7], server->lastRms[8], server->lastRms[9], server->lastRms[10], server->lastRms[11], server->lastRms[12], server->lastRms[13], server->lastRms[14], server->lastRms[15]);
+                break;
         }
         server->gcount = 0;
     }
@@ -595,6 +619,7 @@ Server_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->midi_input = -1;
     self->midi_output = -1;
     self->midiActive = 1;
+    self->allowMMMapper = 0; // Disable Microsoft MIDI Mapper by default.
     self->midi_time_offset = 0;
     self->amp = self->resetAmp = 1.;
     self->currentAmp = self->lastAmp = 1.; // If set to 0, there is a 5ms fadein at server start.
@@ -1113,6 +1138,13 @@ Server_setStartOffset(Server *self, PyObject *arg)
     Py_RETURN_NONE;
 }
 
+static PyObject *
+Server_allowMicrosoftMidiDevices(Server *self)
+{
+    self->allowMMMapper = 1;
+    Py_RETURN_NONE;
+}
+
 /*******************************************/
 /** Server shutdown / boot / start / stop **/
 /*******************************************/
@@ -1384,9 +1416,10 @@ Server_stop(Server *self)
 static PyObject *
 Server_recordOptions(Server *self, PyObject *args, PyObject *kwds)
 {
+    Py_ssize_t psize;
     static char *kwlist[] = {"dur", "filename", "fileformat", "sampletype", "quality", NULL};
 
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, "d|siid", kwlist, &self->recdur, &self->recpath, &self->recformat, &self->rectype, &self->recquality)) {
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "d|s#iid", kwlist, &self->recdur, &self->recpath, &psize, &self->recformat, &self->rectype, &self->recquality)) {
         return PyInt_FromLong(-1);
     }
 
@@ -1396,11 +1429,12 @@ Server_recordOptions(Server *self, PyObject *args, PyObject *kwds)
 static PyObject *
 Server_start_rec(Server *self, PyObject *args, PyObject *kwds)
 {
+    Py_ssize_t psize;
     char *filename=NULL;
 
     static char *kwlist[] = {"filename", NULL};
 
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, "|s", kwlist, &filename)) {
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "|s#", kwlist, &filename, &psize)) {
         return PyInt_FromLong(-1);
     }
     Server_start_rec_internal(self, filename);
@@ -2024,6 +2058,7 @@ static PyMethodDef Server_methods[] = {
     {"setTimeCallable", (PyCFunction)Server_setTimeCallable, METH_O, "Sets the Server's TIME callable object."},
     {"setCallback", (PyCFunction)Server_setCallback, METH_O, "Sets the Server's CALLBACK callable object."},
     {"setVerbosity", (PyCFunction)Server_setVerbosity, METH_O, "Sets the verbosity."},
+    {"allowMicrosoftMidiDevices", (PyCFunction)Server_allowMicrosoftMidiDevices, METH_NOARGS, "Allow Microsoft Midi Mapper or GS Wavetable Synth devices."},
     {"setStartOffset", (PyCFunction)Server_setStartOffset, METH_O, "Sets starting time offset."},
     {"boot", (PyCFunction)Server_boot, METH_O, "Setup and boot the server."},
     {"shutdown", (PyCFunction)Server_shutdown, METH_NOARGS, "Shut down the server."},
diff --git a/src/objects/fftmodule.c b/src/objects/fftmodule.c
index 14076b0..f02b6c3 100644
--- a/src/objects/fftmodule.c
+++ b/src/objects/fftmodule.c
@@ -3598,6 +3598,7 @@ static PyObject *
 CvlVerb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     int i, k;
+    Py_ssize_t psize;
     PyObject *inputtmp, *input_streamtmp, *baltmp=NULL, *multmp=NULL, *addtmp=NULL;
     CvlVerb *self;
     self = (CvlVerb *)type->tp_alloc(type, 0);
@@ -3613,7 +3614,7 @@ CvlVerb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     static char *kwlist[] = {"input", "impulse", "bal", "size", "chnl", "mul", "add", NULL};
 
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, "Os|OiiOO", kwlist, &inputtmp, &self->impulse_path, &baltmp, &self->size, &self->chnl, &multmp, &addtmp))
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "Os#|OiiOO", kwlist, &inputtmp, &self->impulse_path, &psize, &baltmp, &self->size, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
 
     if (self->size < self->bufsize) {
diff --git a/src/objects/matrixmodule.c b/src/objects/matrixmodule.c
index 38f0d28..e4fd2d6 100644
--- a/src/objects/matrixmodule.c
+++ b/src/objects/matrixmodule.c
@@ -275,6 +275,7 @@ static PyObject * NewMatrix_blur(NewMatrix *self) { MATRIX_BLUR };
 static PyObject * NewMatrix_boost(NewMatrix *self, PyObject *args, PyObject *kwds) { MATRIX_BOOST };
 static PyObject * NewMatrix_put(NewMatrix *self, PyObject *args, PyObject *kwds) { MATRIX_PUT };
 static PyObject * NewMatrix_get(NewMatrix *self, PyObject *args, PyObject *kwds) { MATRIX_GET };
+static PyObject * NewMatrix_getInterpolated(NewMatrix *self, PyObject *args, PyObject *kwds) { MATRIX_GET_INTERPOLATED };
 
 static PyObject *
 NewMatrix_getSize(NewMatrix *self)
@@ -432,6 +433,7 @@ static PyMethodDef NewMatrix_methods[] = {
 {"boost", (PyCFunction)NewMatrix_boost, METH_VARARGS|METH_KEYWORDS, "Boost the contrast of the matrix."},
 {"put", (PyCFunction)NewMatrix_put, METH_VARARGS|METH_KEYWORDS, "Puts a value at specified position in the matrix."},
 {"get", (PyCFunction)NewMatrix_get, METH_VARARGS|METH_KEYWORDS, "Gets the value at specified position in the matrix."},
+{"getInterpolated", (PyCFunction)NewMatrix_getInterpolated, METH_VARARGS|METH_KEYWORDS, "Gets the value at normalized position in the matrix."},
 {"getSize", (PyCFunction)NewMatrix_getSize, METH_NOARGS, "Return the size of the matrix in samples."},
 {"getRate", (PyCFunction)NewMatrix_getRate, METH_NOARGS, "Return the frequency (in cps) that reads the sound without pitch transposition."},
 {NULL}  /* Sentinel */
diff --git a/src/objects/oscmodule.c b/src/objects/oscmodule.c
index 23d252e..2df96fd 100644
--- a/src/objects/oscmodule.c
+++ b/src/objects/oscmodule.c
@@ -727,6 +727,7 @@ OscDataSend_compute_next_data_frame(OscDataSend *self)
 {
     int i, j = 0;
     Py_ssize_t blobsize = 0;
+    PyObject *inlist = NULL;
     PyObject *datalist = NULL;
     char *blobdata = NULL;
     uint8_t midi[4];
@@ -734,35 +735,37 @@ OscDataSend_compute_next_data_frame(OscDataSend *self)
     char *path=NULL;
     lo_message *msg;
 
-    if (self->something_to_send == 1) {
+    while (self->something_to_send) {
         if (PyBytes_Check(self->address_path))
             path = PyBytes_AsString(self->address_path);
         else
             path = PY_UNICODE_AS_UNICODE(self->address_path);
         msg = lo_message_new();
 
+        self->something_to_send--;
+        inlist = PyList_GetItem(self->value, self->something_to_send);
         for (i=0; i<self->num_items; i++) {
             switch (self->types[i]) {
                 case LO_INT32:
-                    lo_message_add_int32(msg, PyInt_AS_LONG(PyList_GET_ITEM(self->value, i)));
+                    lo_message_add_int32(msg, PyInt_AS_LONG(PyList_GET_ITEM(inlist, i)));
                     break;
                 case LO_INT64:
-                    lo_message_add_int64(msg, (long)PyLong_AsLong(PyList_GET_ITEM(self->value, i)));
+                    lo_message_add_int64(msg, (long)PyLong_AsLong(PyList_GET_ITEM(inlist, i)));
                     break;
                 case LO_FLOAT:
-                    lo_message_add_float(msg, (float)PyFloat_AsDouble(PyList_GET_ITEM(self->value, i)));
+                    lo_message_add_float(msg, (float)PyFloat_AsDouble(PyList_GET_ITEM(inlist, i)));
                     break;
                 case LO_DOUBLE:
-                    lo_message_add_double(msg, (double)PyFloat_AsDouble(PyList_GET_ITEM(self->value, i)));
+                    lo_message_add_double(msg, (double)PyFloat_AsDouble(PyList_GET_ITEM(inlist, i)));
                     break;
                 case LO_STRING:
-                    lo_message_add_string(msg, PY_STRING_AS_STRING(PyList_GET_ITEM(self->value, i)));
+                    lo_message_add_string(msg, PY_STRING_AS_STRING(PyList_GET_ITEM(inlist, i)));
                     break;
                 case LO_CHAR:
-                    lo_message_add_char(msg, (char)PY_STRING_AS_STRING(PyList_GET_ITEM(self->value, i))[0]);
+                    lo_message_add_char(msg, (char)PY_STRING_AS_STRING(PyList_GET_ITEM(inlist, i))[0]);
                     break;
                 case LO_BLOB:
-                    datalist = PyList_GET_ITEM(self->value, i);
+                    datalist = PyList_GET_ITEM(inlist, i);
                     blobsize = PyList_Size(datalist);
                     blobdata = (char *)malloc(blobsize * sizeof(char));
                     for (j=0; j<blobsize; j++) {
@@ -772,7 +775,7 @@ OscDataSend_compute_next_data_frame(OscDataSend *self)
                     lo_message_add_blob(msg, blob);
                     break;
                 case LO_MIDI:
-                    datalist = PyList_GET_ITEM(self->value, i);
+                    datalist = PyList_GET_ITEM(inlist, i);
                     for (j=0; j<4; j++) {
                         midi[j] = (uint8_t)PyInt_AS_LONG(PyList_GET_ITEM(datalist, j));
                     }
@@ -795,7 +798,8 @@ OscDataSend_compute_next_data_frame(OscDataSend *self)
             PySys_WriteStdout("OSC error %d: %s\n", lo_address_errno(self->address), 
                                          lo_address_errstr(self->address));
         }
-        self->something_to_send = 0;
+        Py_DECREF(inlist);
+        PySequence_DelItem(self->value, self->something_to_send);
         lo_message_free(msg);
         if (blob != NULL)
             lo_blob_free(blob);
@@ -838,6 +842,8 @@ OscDataSend_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     OscDataSend *self;
     self = (OscDataSend *)type->tp_alloc(type, 0);
 
+    self->value = PyList_New(0);
+    self->something_to_send = 0;
     self->host = NULL;
 
     INIT_OBJECT_COMMON
@@ -883,10 +889,9 @@ OscDataSend_send(OscDataSend *self, PyObject *arg)
 
     if (PyList_Check(arg)) {
         tmp = arg;
-        Py_XDECREF(self->value);
         Py_INCREF(tmp);
-        self->value = tmp;
-        self->something_to_send = 1;
+        PyList_Append(self->value, tmp);
+        self->something_to_send++;
     }
     else
         PySys_WriteStdout("OscDataSend: argument to send() method must be a list of values.\n");
diff --git a/src/objects/panmodule.c b/src/objects/panmodule.c
index 4ace883..2880276 100644
--- a/src/objects/panmodule.c
+++ b/src/objects/panmodule.c
@@ -1963,20 +1963,26 @@ VoiceManager_compute_next_data_frame(VoiceManager *self)
 static int
 VoiceManager_traverse(VoiceManager *self, visitproc visit, void *arg)
 {
+    int i;
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->trigger_streams);
+    for (i=0; i<self->maxVoices; i++) {
+        Py_VISIT(self->trigger_streams[i]);
+    }
     return 0;
 }
 
 static int
 VoiceManager_clear(VoiceManager *self)
 {
+    int i;
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->trigger_streams);
+    for (i=0; i<self->maxVoices; i++) {
+        Py_CLEAR(self->trigger_streams[i]);
+    }
     return 0;
 }
 
@@ -1984,8 +1990,10 @@ static void
 VoiceManager_dealloc(VoiceManager* self)
 {
     pyo_DEALLOC
-    if (self->voices != NULL)
+    if (self->voices != NULL) {
         free(self->voices);
+        free(self->trigger_streams);
+    }
     VoiceManager_clear(self);
     Py_TYPE(self)->tp_free((PyObject*)self);
 }
diff --git a/src/objects/recordmodule.c b/src/objects/recordmodule.c
index c9696ff..e6a3a46 100644
--- a/src/objects/recordmodule.c
+++ b/src/objects/recordmodule.c
@@ -122,6 +122,7 @@ Record_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     int fileformat = 0;
     int sampletype = 0;
     double quality = 0.4;
+    Py_ssize_t psize;
     PyObject *input_listtmp;
     Record *self;
     self = (Record *)type->tp_alloc(type, 0);
@@ -136,7 +137,7 @@ Record_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     static char *kwlist[] = {"input", "filename", "chnls", "fileformat", "sampletype", "buffering", "quality", NULL};
 
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, "Os|iiiid", kwlist, &input_listtmp, &self->recpath, &self->chnls, &fileformat, &sampletype, &self->buffering, &quality))
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "Os#|iiiid", kwlist, &input_listtmp, &self->recpath, &psize, &self->chnls, &fileformat, &sampletype, &self->buffering, &quality))
         Py_RETURN_NONE;
 
     Py_XDECREF(self->input_list);
diff --git a/src/objects/sfplayermodule.c b/src/objects/sfplayermodule.c
index 50b528c..42408d9 100644
--- a/src/objects/sfplayermodule.c
+++ b/src/objects/sfplayermodule.c
@@ -274,6 +274,7 @@ static PyObject *
 SfPlayer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     int i;
+    Py_ssize_t psize;
     MYFLT offset = 0.;
     PyObject *speedtmp=NULL;
     SfPlayer *self;
@@ -291,7 +292,7 @@ SfPlayer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     static char *kwlist[] = {"path", "speed", "loop", "offset", "interp", NULL};
 
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_S__OIFI, kwlist, &self->path, &speedtmp, &self->loop, &offset, &self->interp))
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_P__OIFI, kwlist, &self->path, &psize, &speedtmp, &self->loop, &offset, &self->interp))
         Py_RETURN_NONE;
 
     if (speedtmp) {
@@ -386,14 +387,18 @@ SfPlayer_setSpeed(SfPlayer *self, PyObject *arg)
 }
 
 static PyObject *
-SfPlayer_setSound(SfPlayer *self, PyObject *arg)
+SfPlayer_setSound(SfPlayer *self, PyObject *args)
 {
     /* Need to perform a check to be sure that the new 
        sound is of the same number of channels. */
+    Py_ssize_t psize;
 
-    ASSERT_ARG_NOT_NULL
+    //ASSERT_ARG_NOT_NULL
+
+    if (! PyArg_ParseTuple(args, "s#", &self->path, &psize))
+        Py_RETURN_NONE;
 
-    self->path = PY_STRING_AS_STRING(arg);
+    //self->path = PY_STRING_AS_STRING(arg);
 
     sf_close(self->sf);
 
@@ -480,7 +485,7 @@ static PyMethodDef SfPlayer_methods[] = {
 {"play", (PyCFunction)SfPlayer_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
 {"out", (PyCFunction)SfPlayer_out, METH_VARARGS|METH_KEYWORDS, "Starts computing and sends sound to soundcard channel speficied by argument."},
 {"stop", (PyCFunction)SfPlayer_stop, METH_NOARGS, "Stops computing."},
-{"setSound", (PyCFunction)SfPlayer_setSound, METH_O, "Sets sfplayer sound path."},
+{"setSound", (PyCFunction)SfPlayer_setSound, METH_VARARGS, "Sets sfplayer sound path."},
 {"setSpeed", (PyCFunction)SfPlayer_setSpeed, METH_O, "Sets sfplayer reading speed."},
 {"setLoop", (PyCFunction)SfPlayer_setLoop, METH_O, "Sets sfplayer loop mode (0 = no loop, 1 = loop)."},
 {"setOffset", (PyCFunction)SfPlayer_setOffset, METH_O, "Sets sfplayer start position."},
@@ -1181,6 +1186,7 @@ static PyObject *
 SfMarkerShuffler_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     int i;
+    Py_ssize_t psize;
     PyObject *speedtmp=NULL, *markerstmp=NULL;
     SfMarkerShuffler *self;
     self = (SfMarkerShuffler *)type->tp_alloc(type, 0);
@@ -1198,7 +1204,7 @@ SfMarkerShuffler_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     static char *kwlist[] = {"path", "markers", "speed", "interp", NULL};
 
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, "sO|Oi", kwlist, &self->path, &markerstmp, &speedtmp, &self->interp))
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "s#O|Oi", kwlist, &self->path, &psize, &markerstmp, &speedtmp, &self->interp))
         Py_RETURN_NONE;
 
     if (speedtmp) {
@@ -1988,6 +1994,7 @@ static PyObject *
 SfMarkerLooper_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     int i;
+    Py_ssize_t psize;
     PyObject *speedtmp=NULL, *marktmp=NULL, *markerstmp=NULL;
     SfMarkerLooper *self;
     self = (SfMarkerLooper *)type->tp_alloc(type, 0);
@@ -2008,7 +2015,7 @@ SfMarkerLooper_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     static char *kwlist[] = {"path", "markers", "speed", "mark", "interp", NULL};
 
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, "sO|OOi", kwlist, &self->path, &markerstmp, &speedtmp, &marktmp, &self->interp))
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "s#O|OOi", kwlist, &self->path, &psize, &markerstmp, &speedtmp, &marktmp, &self->interp))
         Py_RETURN_NONE;
 
     if (speedtmp) {
diff --git a/src/objects/tablemodule.c b/src/objects/tablemodule.c
index 880a464..0dd4769 100644
--- a/src/objects/tablemodule.c
+++ b/src/objects/tablemodule.c
@@ -4113,6 +4113,7 @@ static PyObject *
 SndTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     int i;
+    Py_ssize_t psize;
     SndTable *self;
 
     self = (SndTable *)type->tp_alloc(type, 0);
@@ -4129,7 +4130,7 @@ SndTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     static char *kwlist[] = {"path", "chnl", "start", "stop", NULL};
 
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_S_IFF, kwlist, &self->path, &self->chnl, &self->start, &self->stop))
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_P_IFF, kwlist, &self->path, &psize, &self->chnl, &self->start, &self->stop))
         return PyInt_FromLong(-1);
 
     if (strcmp(self->path, "") == 0) {
@@ -4317,11 +4318,12 @@ SndTable_getEnvelope(SndTable *self, PyObject *arg) {
 static PyObject *
 SndTable_setSound(SndTable *self, PyObject *args, PyObject *kwds)
 {
+    Py_ssize_t psize;
     static char *kwlist[] = {"path", "chnl", "start", "stop", NULL};
 
     MYFLT stoptmp = -1.0;
 
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_S_IFF, kwlist, &self->path, &self->chnl, &self->start, &stoptmp)) {
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_P_IFF, kwlist, &self->path, &psize, &self->chnl, &self->start, &stoptmp)) {
         Py_INCREF(Py_None);
         return Py_None;
     }
@@ -4336,12 +4338,13 @@ SndTable_setSound(SndTable *self, PyObject *args, PyObject *kwds)
 static PyObject *
 SndTable_append(SndTable *self, PyObject *args, PyObject *kwds)
 {
+    Py_ssize_t psize;
     static char *kwlist[] = {"path", "crossfade", "chnl", "start", "stop", NULL};
 
     MYFLT stoptmp = -1.0;
     MYFLT crosstmp = 0.0;
 
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_S_FIFF, kwlist, &self->path, &crosstmp, &self->chnl, &self->start, &stoptmp)) {
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_P_FIFF, kwlist, &self->path, &psize, &crosstmp, &self->chnl, &self->start, &stoptmp)) {
         Py_INCREF(Py_None);
         return Py_None;
     }
@@ -4361,13 +4364,14 @@ SndTable_append(SndTable *self, PyObject *args, PyObject *kwds)
 static PyObject *
 SndTable_insert(SndTable *self, PyObject *args, PyObject *kwds)
 {
+    Py_ssize_t psize;
     static char *kwlist[] = {"path", "pos", "crossfade", "chnl", "start", "stop", NULL};
 
     MYFLT stoptmp = -1.0;
     MYFLT crosstmp = 0.0;
     MYFLT postmp = 0.0;
 
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_S_FFIFF, kwlist, &self->path, &postmp, &crosstmp, &self->chnl, &self->start, &stoptmp)) {
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_P_FFIFF, kwlist, &self->path, &psize, &postmp, &crosstmp, &self->chnl, &self->start, &stoptmp)) {
         Py_INCREF(Py_None);
         return Py_None;
     }
@@ -5749,8 +5753,6 @@ TableRec_compute_next_data_frame(TableRec *self)
     if (self->pointer < size) {
         upBound = (int)(size - self->fadeInSample);
 
-        //MYFLT buffer[num];
-        //memset(&buffer, 0, sizeof(buffer));
         for (i=0; i<self->bufsize; i++) {
             self->buffer[i] = 0.0;
         }
diff --git a/pyolib/snds/IRMediumHallStereo.wav "b/tests/b\303\251b\303\252tte/IRMediumHallStereo.wav"
similarity index 100%
copy from pyolib/snds/IRMediumHallStereo.wav
copy to "tests/b\303\251b\303\252tte/IRMediumHallStereo.wav"
diff --git "a/tests/b\303\251b\303\252tte/noise.aif" "b/tests/b\303\251b\303\252tte/noise.aif"
new file mode 100644
index 0000000..bcaf65a
Binary files /dev/null and "b/tests/b\303\251b\303\252tte/noise.aif" differ
diff --git a/pyolib/snds/transparent.aif "b/tests/b\303\251b\303\252tte/transparent.aif"
similarity index 100%
copy from pyolib/snds/transparent.aif
copy to "tests/b\303\251b\303\252tte/transparent.aif"
diff --git a/tests/encoding_test.py b/tests/encoding_test.py
new file mode 100644
index 0000000..e3629d7
--- /dev/null
+++ b/tests/encoding_test.py
@@ -0,0 +1,140 @@
+#! -*- encoding: utf-8 -*-
+import os
+import sys
+import locale
+from random import uniform
+from pyo import *
+
+### The encoding line is for E-Pyo tempfile only.
+### sys.getfilesystemencoding() should be used to set
+### the encoding line added by E-Pyo.
+
+print("Default encoding: ", sys.getdefaultencoding())
+print("File system encoding: ", sys.getfilesystemencoding())
+print("Locale preferred encoding: ", locale.getpreferredencoding())
+print("Locale default encoding: ", locale.getdefaultlocale())
+
+s = Server().boot()
+
+### Need a python layer to encode the path in python 3.
+# Python 3
+#p = 'bébêtte/noise.aif'.encode(sys.getfilesystemencoding())
+# Python 2
+p = 'bébêtte/noise.aif'
+
+########## SNDINFO ###############
+info = sndinfo(p)
+print("sndinfo output:\n", info)
+
+####### SAVEFILE ##############
+sr, dur, chnls, path = 44100, 5, 2, os.path.join("bébêtte", 'savefile.aif')
+samples = [[uniform(-0.5,0.5) for i in range(sr*dur)] for i in range(chnls)]
+savefile(samples=samples, path=path, sr=sr, channels=chnls, fileformat=1, sampletype=1)
+print("Savefile record:", os.path.isfile(os.path.join("bébêtte", 'savefile.aif')))
+
+####### SAVEFILEFROMTABLE #########
+home = os.path.expanduser('~')
+path1 = SNDS_PATH + '/transparent.aif'
+path2 = os.path.join("bébêtte", 'savefileFromTable.aif')
+t = SndTable(path1)
+savefileFromTable(table=t, path=path2, fileformat=1, sampletype=1)
+print("SavefileFromTable record:", os.path.isfile(os.path.join("bébêtte", 'savefileFromTable.aif')))
+
+##### UPSAMP/DOWNSAMP ######
+# upsample a signal 3 times
+upfile = os.path.join("bébêtte", 'upsamp.aif')
+upsamp(p, upfile, 2, 256)
+print("upsamp record:", os.path.isfile(os.path.join("bébêtte", 'upsamp.aif')))
+# downsample the upsampled signal 3 times
+downfile = os.path.join("bébêtte", 'downsamp.aif')
+downsamp(upfile, downfile, 3, 256)
+print("downsamp record:", os.path.isfile(os.path.join("bébêtte", 'downsamp.aif')))
+
+######### SfPlayer ###########
+sf1 = SfPlayer(p, mul=0.1)
+sf1.setPath(downfile)
+
+p2 = os.path.join("bébêtte", 'transparent.aif')
+######### SfMarkerShuffler ###########
+sf2 = SfMarkerShuffler(p2, mul=0.3)
+
+######### SfMarkerLooper ###########
+sf3 = SfMarkerLooper(p2, mul=.3)
+rnd = RandInt(len(sf3.getMarkers()), 2)
+sf3.mark = rnd
+
+######### SndTable ###########
+tab1 = SndTable(p)
+tab1.setSound(p2)
+tab1.append(p2, 0.2)
+tab1.insert(p2, 0.1, 0.1)
+tabplay = Osc(tab1, [tab1.getRate(), tab1.getRate() * 1.01], mul=0.5)
+
+######### CvlVerb impulse path ###########
+impl = os.path.join("bébêtte", 'IRMediumHallStereo.wav')
+cv = CvlVerb(tabplay, impl, size=1024, bal=0.7).out()
+
+######### Record ###########
+recfile = os.path.join("bébêtte", 'recfile.wav')
+rec = Record(cv, recfile, chnls=2, fileformat=0, sampletype=0, buffering=4, quality=0.40)
+recplay = None
+def reccallback():
+    global rec, recplay
+    rec.stop()
+    del rec
+#    recplay = SfPlayer(recfile, loop=True).out()
+#   print("Start playback!")
+#print("Recording 4 seconds of sounds...")
+after = CallAfter(reccallback, 4)
+
+######### Server ###########
+servrecfile = os.path.join("bébêtte", 'servrecfile.wav')
+#s.recordOptions(dur=-1, filename=servrecfile)
+servrecfile = os.path.join("bébêtte", 'servrecfile2.wav')
+s.recstart(servrecfile)
+
+s.gui(locals(), exit=False)
+
+def delfile(f):
+    if os.path.isfile(f):
+        os.remove(f)
+
+# On windows, we should delete Sf* objects before deleting the audio files.
+del sf1
+del recplay
+delfile(os.path.join("bébêtte", 'savefile.aif'))
+delfile(os.path.join("bébêtte", 'savefileFromTable.aif'))
+delfile(os.path.join("bébêtte", 'upsamp.aif'))
+delfile(os.path.join("bébêtte", 'downsamp.aif'))
+delfile(os.path.join("bébêtte", 'recfile.wav'))
+delfile(os.path.join("bébêtte", 'servrecfile.wav'))
+delfile(os.path.join("bébêtte", 'servrecfile2.wav'))
+
+"""
+1 - Adapt encoding line for E-Pyo tempfile. **done**
+
+2 - Use widestring in C layer.
+
+3 - "if sys.version > 2" -> path.encode(sys.getfilesystemencoding())
+    For python2, don't do anything.
+    Function stringencode(strng) in _core.py
+ 
+Objects with file input:
+sndinfo, savefile, savefileFromTable, upsamp, downsamp **done**
+Sf_family **done**
+CvlVerb **done**
+SndTable **done**
+Record **done**
+Server: recordOptions, recstart **Not working yet on Windows with python 3.5**
+
+ControlRead, ControlRec *nothing to do?*
+Expr *to_unicode?* *nothing to do?*
+NoteinRead, NoteinRec *nothing to do?*
+PyoTableObject: write, read *nothing to do?*
+PyoMatrixObject: write, read *nothing to do?*
+
+4 - For method of a C class, use stringencode(st) before the call and
+    PyArg_ParseTuple(args, "s#", &self->path, &psize) in the method body.
+    METH_VARARGS must be used as the method flag.
+
+"""
diff --git a/scripts/test_portaudio_functions.py b/tests/test_portaudio_functions.py
similarity index 100%
rename from scripts/test_portaudio_functions.py
rename to tests/test_portaudio_functions.py
diff --git a/utils/E-Pyo.py b/utils/E-Pyo.py
index eca8bd4..d545fbc 100755
--- a/utils/E-Pyo.py
+++ b/utils/E-Pyo.py
@@ -2789,7 +2789,7 @@ class MainFrame(wx.Frame):
 
     def doSearchInProject(self, rootdir, search):
         result = {}
-        filters = ["build"]
+        filters = ["build", "__pycache__"]
         busy = wx.BusyCursor()
         for root, dirs, files in os.walk(rootdir):
             if os.path.split(root)[1].startswith("."):
@@ -3176,8 +3176,8 @@ class MainFrame(wx.Frame):
         for line in text.splitlines():
             if check1:
                 if not line.startswith("#"):
-                    if not '# encoding: utf-8' in text:
-                        newtext += '# encoding: utf-8\n'
+                    if not '# encoding:' in text:
+                        newtext += '# -*- encoding: %s -*-\n' % sys.getfilesystemencoding()
                     check1 = False
             if not check1 and check2:
                 if is_future and '__future__' in line:
@@ -5250,7 +5250,7 @@ class ProjectTree(wx.Panel):
                                                  self.fileidx)
                     self.tree.SetItemData(child, packItemData(os.path.join(dir, path)))
             elif os.path.isdir(path):
-                if elem != "build":
+                if elem not in ["build", "__pycache__"]:
                     child = self.tree.AppendItem(item, elem, self.fldridx,
                                                  self.fldropenidx)
                     self.tree.SetItemData(child, packItemData(os.path.join(dir, path)))
diff --git a/utils/epyo_builder_OSX_py3.sh b/utils/epyo_builder_OSX_py3.5.sh
similarity index 94%
copy from utils/epyo_builder_OSX_py3.sh
copy to utils/epyo_builder_OSX_py3.5.sh
index ce39d6d..4eb8c35 100755
--- a/utils/epyo_builder_OSX_py3.sh
+++ b/utils/epyo_builder_OSX_py3.5.sh
@@ -10,12 +10,12 @@ cp -R styles Resources/
 
 rm -rf build dist
 
-python3 setup.py py2app
+python3.5 setup.py py2app
 
 rm -rf build
-mv dist E-Pyo_OSX_py3
+mv dist E-Pyo_OSX_py35
 
-if cd E-Pyo_OSX_py3;
+if cd E-Pyo_OSX_py35;
 then
     find . -name .git -depth -exec rm -rf {} \
     find . -name *.pyc -depth -exec rm -f {} \
diff --git a/utils/epyo_builder_OSX_py3.sh b/utils/epyo_builder_OSX_py3.6.sh
similarity index 71%
rename from utils/epyo_builder_OSX_py3.sh
rename to utils/epyo_builder_OSX_py3.6.sh
index ce39d6d..654d2dd 100755
--- a/utils/epyo_builder_OSX_py3.sh
+++ b/utils/epyo_builder_OSX_py3.6.sh
@@ -10,12 +10,12 @@ cp -R styles Resources/
 
 rm -rf build dist
 
-python3 setup.py py2app
+python3.6 setup.py py2app
 
 rm -rf build
-mv dist E-Pyo_OSX_py3
+mv dist E-Pyo_OSX_py36
 
-if cd E-Pyo_OSX_py3;
+if cd E-Pyo_OSX_py36;
 then
     find . -name .git -depth -exec rm -rf {} \
     find . -name *.pyc -depth -exec rm -f {} \
@@ -31,11 +31,11 @@ rm -rf E-Pyo.app
 mv E-Pyo-x86_64.app E-Pyo.app
 
 # py2app does not handle correctly wxpython phoenix dylib imports, add them manually.
-cp /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/wx/*.dylib E-Pyo.app/Contents/Resources/lib/python3.5/lib-dynload/wx/
+cp /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/wx/*.dylib E-Pyo.app/Contents/Resources/lib/python3.6/lib-dynload/wx/
 
 # Fixed wrong path in Info.plist
 cd E-Pyo.app/Contents
-awk '{gsub("/Library/Frameworks/Python.framework/Versions/3.5/bin/python3", "@executable_path/../Frameworks/Python.framework/Versions/3.5/Python")}1' Info.plist > Info.plist_tmp && mv Info.plist_tmp Info.plist
+awk '{gsub("/Library/Frameworks/Python.framework/Versions/3.6/bin/python3", "@executable_path/../Frameworks/Python.framework/Versions/3.6/Python")}1' Info.plist > Info.plist_tmp && mv Info.plist_tmp Info.plist
 
 cd ../../..
 
diff --git a/utils/epyo_builder_win32.py b/utils/epyo_builder_win32.py
index b9856ad..04d620e 100644
--- a/utils/epyo_builder_win32.py
+++ b/utils/epyo_builder_win32.py
@@ -16,7 +16,7 @@ shutil.copytree("styles", "Resources/styles")
 if version[0] < 3:
     os.system('C:\Python%d%d\Scripts\pyinstaller --clean -F -c --icon=Resources\E-PyoIcon.ico "E-Pyo.py"' % version)
 else:
-    os.system('pyinstaller --clean -F -c --icon=Resources\E-PyoIcon.ico "E-Pyo.py"')
+    os.system('C:\\Users\olivier\AppData\Local\Programs\Python\Python%d%d-32\Scripts\pyinstaller --clean -F -c --icon=Resources\E-PyoIcon.ico "E-Pyo.py"' % version)
 
 os.mkdir("E-Pyo_py%d%d" % version)
 shutil.copytree("Resources", "E-Pyo_py%d%d/Resources" % version)
diff --git a/utils/setup.py b/utils/setup.py
index 0ac54f9..52e4e9e 100644
--- a/utils/setup.py
+++ b/utils/setup.py
@@ -16,11 +16,11 @@ OPTIONS = {'argv_emulation': False,
                'CFBundleExecutable': 'E-Pyo',
                'CFBundleIconFile': 'E-PyoIcon.icns',
                'CFBundleIdentifier': 'com.ajaxsoundstudio.E-Pyo',
-               'CFBundleInfoDictionaryVersion': '0.8.6',
+               'CFBundleInfoDictionaryVersion': '0.8.7',
                'CFBundleName': 'E-Pyo',
                'CFBundlePackageType': 'APPL',
-               'CFBundleShortVersionString': '0.8.6',
-               'CFBundleVersion': '0.8.6',
+               'CFBundleShortVersionString': '0.8.7',
+               'CFBundleVersion': '0.8.7',
                'CFBundleDocumentTypes': [{'CFBundleTypeOSTypes': ['TEXT'],
                                           'CFBundleTypeExtensions': ['py'],
                                           'CFBundleTypeRole': 'Editor',
diff --git a/utils/snippets/Utilities/Incrementor b/utils/snippets/Utilities/Incrementor
index 1595907..325608f 100644
--- a/utils/snippets/Utilities/Incrementor
+++ b/utils/snippets/Utilities/Incrementor
@@ -1 +1 @@
-snippet = {'shortcut': u'Shift-Alt-8', 'value': u'count = 0\ndef incrementor():\n    global count\n    count += 1\n    print count\n\npat = Pattern(function=incrementor, time=1).play()\n'}
\ No newline at end of file
+snippet = {'shortcut': u'Shift-Alt-8', 'value': u'count = 0\ndef incrementor():\n    global count\n    count += 1\n    print(count)\n\npat = Pattern(function=incrementor, time=1).play()\n'}

-- 
python-pyo packaging



More information about the pkg-multimedia-commits mailing list