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

tiago at users.alioth.debian.org tiago at users.alioth.debian.org
Wed May 10 00:22:34 UTC 2017


The following commit has been merged in the master branch:
commit 1aad3c4145e1b767723f51c11147502524b95e2b
Author: Tiago Bortoletto Vaz <tiago at debian.org>
Date:   Tue May 9 20:19:08 2017 -0400

    New release.

diff --git a/ChangeLog b/ChangeLog
index c55041e..5d5619c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,77 @@
+2017-04-20 belangeo <belangeo at gmail.com>
+
+    * Upgraded version number to 0.8.6.
+
+2017-04-20 belangeo <belangeo at gmail.com>
+
+    * Added a Copy menu item in PyoObject.ctrl() and DataTable.graph() windows.
+
+2017-04-20 belangeo <belangeo at gmail.com>
+
+    * Added setRandomType(dist, x) method to SfMarkerShuffler object.
+
+2017-04-20 belangeo <belangeo at gmail.com>
+
+    * Fixed TableRec, TrigTableRec and Looper time stream not started on play.
+
+2017-04-18 belangeo <belangeo at gmail.com>
+
+    * Fixed libraries dynamic links in MacOS installer scripts.
+
+2017-04-13 belangeo <belangeo at gmail.com>
+
+    * Fixed segfault in Resample_dealloc function.
+
+2017-04-10 belangeo <belangeo at gmail.com>
+
+    * Wrapped non-blocking offline processing between PyGILState_Ensure and
+    PyGILState_Release calls.
+
+2017-04-10 belangeo <belangeo at gmail.com>
+
+    * Updated liblo from 0.26 to 0.28 on Windows. This fixes a bug with socket
+    not properly closed.
+
+2017-04-09 belangeo <belangeo at gmail.com>
+
+    * Fixed segfault when updating ControlSlider value from the audio thread.
+
+2017-04-07 belangeo <belangeo at gmail.com>
+
+    * Fixed CallAfter segfault when deleted inside its own callback.
+
+2017-04-06 belangeo <belangeo at gmail.com>
+
+    * Fixed TableRead which continues to play when freq is negative and loop is off.
+
+2017-04-06 belangeo <belangeo at gmail.com>
+
+    * Added "speed" argument to Seq object. Useful to create continuous time
+      deceleration or acceleration.
+
+2017-03-31 belangeo <belangeo at gmail.com>
+
+    * Upgraded version number to 0.8.5.
+
+2017-03-31 belangeo <belangeo at gmail.com>
+
+    * Added two examples in 07-effects, 01-flanger.py and 02-schroeder-reverb.py.
+
+2017-03-31 belangeo <belangeo at gmail.com>
+
+    * Removed Server.setInOutDefaultDeviceFromHost(host) method.
+      Added a new winhost argument to the Server's initialization.
+      Added pa_get_default_devices_from_host(host) function.
+
+2017-03-27 belangeo <belangeo at gmail.com>
+
+    * Check the jack api version before compiling to ensure existing
+    functions are used (jack_port_set_name/jack_port_rename).
+
+2017-03-26 belangeo <belangeo at gmail.com>
+
+    * Added setInOutDefaultDeviceFromHost(host) to the Server object.
+
 2017-03-24 belangeo <belangeo at gmail.com>
 
     * Upgraded version number to 0.8.4.
diff --git a/README.md b/README.md
index 1fd9a95..0df0be4 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ benefits of a mature, and widely used, general programming language.
 
 Systems : macOS (10.6 -> 10.12), linux, Windows (XP, Vista, 7, 8, 10)
 
-Python versions : 2.7.x (stable), 3.x.x (still experimental)
+Python versions : 2.7.x (stable), 3.x.x (still experimental but fully functional)
 
 [PYO OFFICAL WEB SITE](http://ajaxsoundstudio.com/pyo/)
 
@@ -54,6 +54,10 @@ processing environment.
 presentation of stimuli and collection of data for a wide range of neuroscience, 
 psychology and psychophysics experiments.
 
+[Pyo Synth](https://github.com/alexandrepoirier/PyoSynth) : Pyo Synth is an open
+source application that makes the manipulation of pyo scripts easier by letting
+you control it with a midi keyboard. 
+
 ## Examples ##
 
 pyo is fully integrated to Python and very simple to use.
diff --git a/TODO.md b/TODO.md
index c0942fc..4e57273 100644
--- a/TODO.md
+++ b/TODO.md
@@ -38,13 +38,11 @@ Objects
   A trigger from the second object will make the object output the second value
   from the list.
 
-- Added random distribution in SfMarkerShuffler.
-
 MIDI
 ----
 
 - Create a MidiLinseg object that act like MidiAdsr but with a breakpoints
-  function as the envelope. The sustain point should settable by the user.
+  function as the envelope. The sustain point should be settable by the user.
 
 - sysex support in MidiListener.
 
@@ -61,7 +59,7 @@ GUI
 
 - Keyboard, a virtual MIDI keyboard (adapted from Zyne's one).
 
-- Save menu item in ctrl() and DataTable graph() windows.
+- Ability to set channel "name" in the view of PyoGuiScope and PyoGuiSpectrum.
 
 Tables
 ------
@@ -69,10 +67,16 @@ Tables
 - Objects that can write to tables should accept any PyoTableObject,
   not just a NewTable or a DataTable.
 
+Matrices
+--------
+
+- Implement the buffer protocol as in the PyoTableObject.
 
 E-Pyo
 -----
 
+- Complete review of E-Pyo on Windows. Lot of features don't seem to work.
+
 - Window splitter to show more than one file at the time (multiple 
   views) ?
 
diff --git a/doc-sphinx/source/api/functions/audio.rst b/doc-sphinx/source/api/functions/audio.rst
index 71202c2..0f9edc6 100644
--- a/doc-sphinx/source/api/functions/audio.rst
+++ b/doc-sphinx/source/api/functions/audio.rst
@@ -34,6 +34,11 @@ Set of functions to inspect the system's audio configuration.
 
 .. autofunction:: pa_get_default_host_api
 
+*pa_get_default_devices_from_host*
+-------------------------------------
+
+.. autofunction:: pa_get_default_devices_from_host
+
 *pa_count_devices*
 ---------------------------------
 
diff --git a/doc-sphinx/source/index.rst b/doc-sphinx/source/index.rst
index 936df77..ad0952c 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.4 documentation
+Welcome to the pyo 0.8.6 documentation
 ===================================================
 
 .. image:: E-PyoIcon.png
@@ -41,6 +41,7 @@ Examples
    Playing with soundfiles <examples/04-soundfiles/index>
    Amplitude envelopes <examples/05-envelopes/index>
    Filtering <examples/06-filters/index>
+   Creating sound effects <examples/07-effects/index>
    Multicore audio programming <examples/18-multicore/index>
 
 Much more to come... Stay tuned!
diff --git a/examples/07-effects/01-flanger.py b/examples/07-effects/01-flanger.py
new file mode 100644
index 0000000..9a52bdf
--- /dev/null
+++ b/examples/07-effects/01-flanger.py
@@ -0,0 +1,42 @@
+"""
+01-flanger.py - Hand-made simple flanger.
+
+A flanger is an audio effect produced by mixing two identical signals
+together, one signal delayed by a small and gradually changing period.
+This produces a swept comb filter effect: peaks and notches are produced
+in the resulting frequency spectrum, related to each other in a linear
+harmonic series. Varying the time delay causes these to sweep up and
+down the frequency spectrum. 
+
+"""
+from pyo import *
+
+s = Server().boot()
+
+# Rich frequency spectrum as stereo input source.
+amp = Fader(fadein=0.25, mul=0.5).play()
+src = PinkNoise(amp).mix(2)
+
+# Flanger parameters                        == unit ==
+middelay = 0.005                            # seconds
+
+depth = Sig(0.99)                           # 0 --> 1
+depth.ctrl(title="Modulation Depth")
+lfospeed = Sig(0.2)                         # Hertz
+lfospeed.ctrl(title="LFO Frequency in Hz")
+feedback = Sig(0.5, mul=0.95)               # 0 --> 1
+feedback.ctrl(title="Feedback")
+
+# LFO with adjusted output range to control the delay time in seconds.
+lfo = Sine(freq=lfospeed, mul=middelay*depth, add=middelay)
+
+# Dynamically delayed signal. The source passes through a DCBlock
+# to ensure there is no DC offset in the signal (with feedback, DC
+# offset can be fatal!).
+flg = Delay(DCBlock(src), delay=lfo, feedback=feedback)
+
+# Mix the original source with its delayed version.
+# Compress the mix to normalize the output signal.
+cmp = Compress(src+flg, thresh=-20, ratio=4).out()
+
+s.gui(locals())
diff --git a/examples/07-effects/02-schroeder-reverb.py b/examples/07-effects/02-schroeder-reverb.py
new file mode 100755
index 0000000..3b03b3f
--- /dev/null
+++ b/examples/07-effects/02-schroeder-reverb.py
@@ -0,0 +1,44 @@
+"""
+02-schroeder-reverb.py - Simple reverberator based on Schroeder's algorithms.
+
+An artificial reverberation based on the work of Manfred Schroeder.
+
+This reverberator takes a monopkonic input and outputs two uncorrelated
+reverberated signals. 
+
+This algorithm presents four parallel comb filters fedding two serial
+allpass filters. An additional lowpass filter is used at the end to 
+control the brightness of the reverberator.
+
+The manual example for the Allpass object presents an other Schroeder
+reverberator.
+
+"""
+from pyo import *
+
+s = Server(duplex=0).boot()
+
+soundfile = SndTable(SNDS_PATH + "/transparent.aif")
+
+src = Looper(soundfile, dur=2, xfade=0, mul=0.3)
+src2 = src.mix(2).out()
+
+# Four parallel stereo comb filters. The delay times are chosen 
+# to be as uncorrelated as possible. Prime numbers are a good
+# choice for delay lengths in samples.
+comb1 = Delay(src, delay=[0.0297, 0.0277], feedback=0.65)
+comb2 = Delay(src, delay=[0.0371, 0.0393], feedback=0.51)
+comb3 = Delay(src, delay=[0.0411, 0.0409], feedback=0.5)
+comb4 = Delay(src, delay=[0.0137, 0.0155], feedback=0.73)
+
+combsum = src + comb1 + comb2 + comb3 + comb4
+
+# The sum of the original signal and the comb filters
+# feeds two serial allpass filters.
+all1 = Allpass(combsum, delay=[.005, .00507], feedback=0.75)
+all2 = Allpass(all1, delay=[.0117, .0123], feedback=0.61)
+
+# Brightness control.
+lowp = Tone(all2, freq=3500, mul=.25).out()
+
+s.gui(locals())
diff --git a/include/pyomodule.h b/include/pyomodule.h
index 9e3cb24..bfb00aa 100644
--- a/include/pyomodule.h
+++ b/include/pyomodule.h
@@ -21,7 +21,7 @@
 #include "Python.h"
 #include <math.h>
 
-#define PYO_VERSION "0.8.4"
+#define PYO_VERSION "0.8.6"
 
 #ifndef __MYFLT_DEF
 #define __MYFLT_DEF
diff --git a/installers/osx/PkgResources_x86_64_py2/ReadMe.rtf b/installers/osx/PkgResources_x86_64_py2/ReadMe.rtf
index b93fbc8..84d1283 100755
--- a/installers/osx/PkgResources_x86_64_py2/ReadMe.rtf
+++ b/installers/osx/PkgResources_x86_64_py2/ReadMe.rtf
@@ -1,82 +1,82 @@
 {\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\fswiss\fprq2\fcharset0 Liberation Sans{\*\falt Arial};}{\f5\froman\fprq2\fcharset0 LucidaGrande;}{\f6\fnil\fprq2\fcharset0 WenQuanYi Micro Hei;}{\f7\fnil\fprq2\fcharset0 FreeSans;}{\f8\fswiss\fprq0\fcharset128 FreeSans;}}
+{\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105 Normal;}
-{\s15\sbasedon0\snext16\sb240\sa120\keepn\dbch\af6\dbch\af7\afs28\loch\f4\fs28 Heading;}
-{\s16\sbasedon0\snext16\sl288\slmult1\sb0\sa140 Text Body;}
-{\s17\sbasedon16\snext17\sl288\slmult1\sb0\sa140\dbch\af8 List;}
-{\s18\sbasedon0\snext18\sb120\sa120\noline\i\dbch\af8\afs24\ai\fs24 Caption;}
-{\s19\sbasedon0\snext19\noline\dbch\af8 Index;}
-}{\*\generator LibreOffice/5.2.5.1$Linux_X86_64 LibreOffice_project/20m0$Build-1}{\info{\author Olivier }{\creatim\yr0\mo0\dy0\hr0\min0}{\revtim\yr2017\mo3\dy23\hr20\min36}{\printim\yr0\mo0\dy0\hr0\min0}}{\*\userprops}\deftab720
-\viewscale120
+{\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-Python-pyo (version 0.8.}{\cf1\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-4}{\cf1\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
+{\*\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\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
 
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\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
 
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\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
 
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\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
 
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 The following components will be installed in the site-packages folder of the current Python Framework:}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\b0\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\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
 
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 _pyo64.so}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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.py}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 pyo64.py}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 pyolib (folder)}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\b0\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\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
 
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\b0\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\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
 
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-Warning:}{\cf1\b0\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\b0\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\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
 
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 libportaudio.2.dylib}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 libportmidi.dylib}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 libsndfile.1.dylib}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 libFLAC.8.dylib}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 libvorbisenc.2.dylib}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 libvorbis.0.dylib}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 libogg.0.dylib}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\b0\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\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
 
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105{\cf1\b0\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/ReadMe.rtf b/installers/osx/PkgResources_x86_64_py3/ReadMe.rtf
index 57d208c..0a5c3e1 100755
--- a/installers/osx/PkgResources_x86_64_py3/ReadMe.rtf
+++ b/installers/osx/PkgResources_x86_64_py3/ReadMe.rtf
@@ -1,82 +1,82 @@
 {\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\fswiss\fprq2\fcharset0 Liberation Sans{\*\falt Arial};}{\f5\froman\fprq2\fcharset0 LucidaGrande;}{\f6\fnil\fprq2\fcharset0 WenQuanYi Micro Hei;}{\f7\fnil\fprq2\fcharset0 FreeSans;}{\f8\fswiss\fprq0\fcharset128 FreeSans;}}
+{\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105 Normal;}
-{\s15\sbasedon0\snext16\sb240\sa120\keepn\dbch\af6\dbch\af7\afs28\loch\f4\fs28 Heading;}
-{\s16\sbasedon0\snext16\sl288\slmult1\sb0\sa140 Text Body;}
-{\s17\sbasedon16\snext17\sl288\slmult1\sb0\sa140\dbch\af8 List;}
-{\s18\sbasedon0\snext18\sb120\sa120\noline\i\dbch\af8\afs24\ai\fs24 Caption;}
-{\s19\sbasedon0\snext19\noline\dbch\af8 Index;}
-}{\*\generator LibreOffice/5.2.5.1$Linux_X86_64 LibreOffice_project/20m0$Build-1}{\info{\author Olivier }{\creatim\yr0\mo0\dy0\hr0\min0}{\revtim\yr2017\mo3\dy23\hr20\min36}{\printim\yr0\mo0\dy0\hr0\min0}}{\*\userprops}\deftab720
-\viewscale120
+{\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-Python-pyo (version 0.8.}{\cf1\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-4}{\cf1\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
+{\*\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\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
 
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\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
 
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\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
 
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\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
 
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 The following components will be installed in the site-packages folder of the current Python Framework:}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\b0\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\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
 
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 _pyo64.cpython-35m-darwin.so}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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.py}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 pyo64.py}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 pyolib (folder)}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\b0\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\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
 
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\b0\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\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
 
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
-Warning:}{\cf1\b0\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\b0\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\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
 
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 libportaudio.2.dylib}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 libportmidi.dylib}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 libsndfile.1.dylib}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 libFLAC.8.dylib}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 libvorbisenc.2.dylib}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 libvorbis.0.dylib}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b0\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
 libogg.0.dylib}
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\b0\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\ab0\rtlch \ltrch\loch\fs26\loch\f5\hich\af5
 
-\par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105{\cf1\b0\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/release_x86_64_py2.sh b/installers/osx/release_x86_64_py2.sh
index e550ba9..f65a80f 100755
--- a/installers/osx/release_x86_64_py2.sh
+++ b/installers/osx/release_x86_64_py2.sh
@@ -8,9 +8,9 @@
 # 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.4_x86_64_py2.pkg
-export DMG_DIR="pyo 0.8.4 py2 Universal"
-export DMG_NAME="pyo_0.8.4_OSX_py2-universal.dmg"
+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 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
@@ -55,6 +55,14 @@ sudo cp /usr/local/lib/libvorbisenc.2.dylib $SUPPORT_LIBS_DIR/libvorbisenc.2.dyl
 sudo cp /usr/local/lib/libvorbis.0.dylib $SUPPORT_LIBS_DIR/libvorbis.0.dylib
 sudo cp /usr/local/lib/libogg.0.dylib $SUPPORT_LIBS_DIR/libogg.0.dylib
 
+sudo install_name_tool -change /usr/local/opt/flac/lib/libFLAC.8.dylib /usr/local/lib/libFLAC.8.dylib $SUPPORT_LIBS_DIR/libsndfile.1.dylib
+sudo install_name_tool -change /usr/local/opt/libogg/lib/libogg.0.dylib /usr/local/lib/libogg.0.dylib $SUPPORT_LIBS_DIR/libsndfile.1.dylib
+sudo install_name_tool -change /usr/local/opt/libvorbis/lib/libvorbis.0.dylib /usr/local/lib/libvorbis.0.dylib $SUPPORT_LIBS_DIR/libsndfile.1.dylib
+sudo install_name_tool -change /usr/local/opt/libvorbis/lib/libvorbisenc.2.dylib /usr/local/lib/libvorbisenc.2.dylib $SUPPORT_LIBS_DIR/libsndfile.1.dylib
+sudo install_name_tool -change /usr/local/opt/libogg/lib/libogg.0.dylib /usr/local/lib/libogg.0.dylib $SUPPORT_LIBS_DIR/libvorbis.0.dylib
+sudo install_name_tool -change /usr/local/opt/libogg/lib/libogg.0.dylib /usr/local/lib/libogg.0.dylib $SUPPORT_LIBS_DIR/libvorbisenc.2.dylib
+sudo install_name_tool -change /usr/local/Cellar/libvorbis/1.3.5/lib/libvorbis.0.dylib /usr/local/lib/libvorbis.0.dylib $SUPPORT_LIBS_DIR/libvorbisenc.2.dylib
+
 echo "setting permissions..."
 sudo chgrp -R admin PyoModule/Package_Contents/tmp
 sudo chown -R root PyoModule/Package_Contents/tmp
diff --git a/installers/osx/release_x86_64_py3.sh b/installers/osx/release_x86_64_py3.sh
index 964d611..8d78450 100755
--- a/installers/osx/release_x86_64_py3.sh
+++ b/installers/osx/release_x86_64_py3.sh
@@ -8,9 +8,9 @@
 # 3. cd utils and build E-Pyo for python3
 # 4. cd installers/osx and build the release for python3
 
-export PACKAGE_NAME=pyo_0.8.4_x86_64_py3.pkg
-export DMG_DIR="pyo 0.8.4 py3 Universal"
-export DMG_NAME="pyo_0.8.4_OSX_py3-universal.dmg"
+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 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
@@ -55,6 +55,14 @@ sudo cp /usr/local/lib/libvorbisenc.2.dylib $SUPPORT_LIBS_DIR/libvorbisenc.2.dyl
 sudo cp /usr/local/lib/libvorbis.0.dylib $SUPPORT_LIBS_DIR/libvorbis.0.dylib
 sudo cp /usr/local/lib/libogg.0.dylib $SUPPORT_LIBS_DIR/libogg.0.dylib
 
+sudo install_name_tool -change /usr/local/opt/flac/lib/libFLAC.8.dylib /usr/local/lib/libFLAC.8.dylib $SUPPORT_LIBS_DIR/libsndfile.1.dylib
+sudo install_name_tool -change /usr/local/opt/libogg/lib/libogg.0.dylib /usr/local/lib/libogg.0.dylib $SUPPORT_LIBS_DIR/libsndfile.1.dylib
+sudo install_name_tool -change /usr/local/opt/libvorbis/lib/libvorbis.0.dylib /usr/local/lib/libvorbis.0.dylib $SUPPORT_LIBS_DIR/libsndfile.1.dylib
+sudo install_name_tool -change /usr/local/opt/libvorbis/lib/libvorbisenc.2.dylib /usr/local/lib/libvorbisenc.2.dylib $SUPPORT_LIBS_DIR/libsndfile.1.dylib
+sudo install_name_tool -change /usr/local/opt/libogg/lib/libogg.0.dylib /usr/local/lib/libogg.0.dylib $SUPPORT_LIBS_DIR/libvorbis.0.dylib
+sudo install_name_tool -change /usr/local/opt/libogg/lib/libogg.0.dylib /usr/local/lib/libogg.0.dylib $SUPPORT_LIBS_DIR/libvorbisenc.2.dylib
+sudo install_name_tool -change /usr/local/Cellar/libvorbis/1.3.5/lib/libvorbis.0.dylib /usr/local/lib/libvorbis.0.dylib $SUPPORT_LIBS_DIR/libvorbisenc.2.dylib
+
 echo "setting permissions..."
 sudo chgrp -R admin PyoModule/Package_Contents/tmp
 sudo chown -R root PyoModule/Package_Contents/tmp
diff --git a/installers/win/win_installer_py27.iss b/installers/win/win_installer_py27.iss
index c57e86e..4b2c76d 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.4"
+#define appVer "0.8.6"
 
 [Setup]
 ; NOTE: The value of AppId uniquely identifies this application.
@@ -41,7 +41,7 @@ Source: "C:\Python27\Lib\site-packages\pyolib\*"; DestDir: "{app}\Lib\site-packa
 Source: "C:\Python27\Lib\site-packages\_pyo.pyd"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 Source: "C:\Python27\Lib\site-packages\_pyo64.pyd"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 Source: "C:\Python27\Lib\site-packages\libsndfile-1.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
-Source: "C:\Python27\Lib\site-packages\lo.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+Source: "C:\Python27\Lib\site-packages\liblo-7.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
 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
diff --git a/installers/win/win_installer_py35.iss b/installers/win/win_installer_py35.iss
index c326010..6c68449 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.4"
+#define appVer "0.8.6"
 
 [Setup]
 ; NOTE: The value of AppId uniquely identifies this application.
@@ -41,7 +41,7 @@ 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\_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\lo.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
diff --git a/pyo.py b/pyo.py
index e93e6f2..b8f5e25 100644
--- a/pyo.py
+++ b/pyo.py
@@ -74,6 +74,7 @@ OBJECTS_TREE = {
                          'pa_get_default_output', 'pm_get_input_devices',
                          'pa_list_devices', 'pa_count_host_apis', 
                          'pa_list_host_apis', 'pa_get_default_host_api',
+                         'pa_get_default_devices_from_host',
                          'pm_count_devices', 'pm_list_devices', 'sndinfo', 
                          'savefile', 'pa_get_output_devices',
                          'pa_get_input_devices', 'midiToHz', 'hzToMidi', 
diff --git a/pyolib/_core.py b/pyolib/_core.py
index 447ae92..7bfee68 100644
--- a/pyolib/_core.py
+++ b/pyolib/_core.py
@@ -77,6 +77,7 @@ FUNCTIONS_INIT_LINES = {
     "pa_count_host_apis": "pa_count_host_apis()",
     "pa_list_host_apis": "pa_list_host_apis()",
     "pa_get_default_host_api": "pa_get_default_host_api()",
+    "pa_get_default_devices_from_host": "pa_get_default_devices_from_host(host)",
     "pa_count_devices": "pa_count_devices()",
     "pa_list_devices": "pa_list_devices()",
     "pa_get_devices_infos": "pa_get_devices_infos()",
@@ -444,6 +445,72 @@ def getVersion():
     major, minor, rev = PYO_VERSION.split('.')
     return (int(major), int(minor), int(rev))
 
+def pa_get_default_devices_from_host(host):
+    """
+    Returns the default input and output devices for a given audio host.
+
+    This function can greatly help finding the device indexes (especially
+    on Windows) to give to the server in order to use to desired audio host.
+
+    :Args:
+
+        host: string
+            Name of the desired audio host. Possible hosts are:
+
+            - For Windows: mme, directsound, asio, wasapi or wdm-ks.
+            - For linux: alsa, oss, pulse or jack.
+            - For MacOS: core audio, jack or soundflower.
+
+    Return: (default_input_device, default_output_device)
+
+    """
+    host_default_in = pa_get_default_input()
+    host_default_out = pa_get_default_output()
+
+    # Retrieve host apis infos.
+    tempfile = os.path.join(os.path.expanduser("~"), "pa_retrieve_host_apis")
+    with open(tempfile, "w") as f:
+        with f as sys.stdout:
+            pa_list_host_apis()
+        sys.stdout = sys.__stdout__
+
+    with open(tempfile, "r") as f:
+        lines = f.readlines()
+
+    os.remove(tempfile)
+
+    # Build the list of currently available hosts.
+    host_names = []
+    for line in lines:
+        p1 = line.find("name: ") + 6
+        p2 = line.find(",", p1+1)
+        host_names.append(line[p1:p2])
+
+    # Search for the desired host.
+    found = False
+    for line in lines:
+        if host.lower() in line.lower():
+            splitted = line.replace("\n", "").split(", ")
+            attributes = [x.split(": ") for x in splitted]
+            found = True
+            break
+
+    # If not found, return portaudio default values.
+    if not found:
+        print("Pyo can't find audio host '%s'. Currently available hosts are:" % host)
+        for host in host_names:
+            print("    %s" % host.lower())
+        return host_default_in, host_default_out
+
+    # If found, search default device indexes.
+    for attribute in attributes:
+        if attribute[0] == "default in":
+            host_default_in = int(attribute[1])
+        elif attribute[0] == "default out":
+            host_default_out = int(attribute[1])
+
+    return host_default_in, host_default_out
+
 def getWeakMethodRef(x):
     "Return a callable object as a weak method reference."
     if type(x) in [list, tuple]:
@@ -689,6 +756,7 @@ class PyoObject(PyoObjectBase):
         self._map_list = []
         self._zeros = None
         self._base_players = None
+        self._time_objs = None
 
     def __add__(self, x):
         x, lmax = convertArgsToLists(x)
@@ -970,6 +1038,10 @@ class PyoObject(PyoObjectBase):
         if self._base_players is not None:
             [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)) \
+             for i, obj in enumerate(self._time_objs)]
+
         [obj.play(wrap(dur, i), wrap(delay, i)) \
          for i, obj in enumerate(self._base_objs)]
         return self
@@ -1018,6 +1090,10 @@ class PyoObject(PyoObjectBase):
         if self._base_players is not None:
             [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))
+             for i, obj in enumerate(self._time_objs)]
+
         if isinstance(chnl, list):
             [obj.out(wrap(chnl, i), wrap(dur, i), wrap(delay, i)) \
              for i, obj in enumerate(self._base_objs)]
@@ -1046,6 +1122,9 @@ 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]
+
         [obj.stop() for obj in self._base_objs]
         return self
 
diff --git a/pyolib/_wxwidgets.py b/pyolib/_wxwidgets.py
index 8a1c71d..1e80676 100644
--- a/pyolib/_wxwidgets.py
+++ b/pyolib/_wxwidgets.py
@@ -37,7 +37,10 @@ def interpFloat(t, v1, v2):
 
 def tFromValue(value, v1, v2):
     "returns a t (in range 0-1) given a value in the range v1 to v2"
-    return float(value - v1) / (v2 - v1)
+    if (v2 - v1) == 0:
+        return 1.0
+    else:
+        return float(value - v1) / (v2 - v1)
 
 def clamp(v, minv, maxv):
     "clamps a value within a range"
@@ -77,7 +80,8 @@ def GetRoundBitmap( w, h, r ):
 class ControlSlider(wx.Panel):
 
     def __init__(self, parent, minvalue, maxvalue, init=None, pos=(0,0), size=(200,16), log=False,
-                 outFunction=None, integer=False, powoftwo=False, backColour=None, orient=wx.HORIZONTAL):
+                 outFunction=None, integer=False, powoftwo=False, backColour=None, orient=wx.HORIZONTAL,
+                 ctrllabel=""):
         if size == (200,16) and orient == wx.VERTICAL:
             size = (40, 200)
         wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY, pos=pos, size=size,
@@ -106,6 +110,7 @@ class ControlSlider(wx.Panel):
         if self.powoftwo:
             self.integer = True
             self.log = False
+        self.ctrllabel = ctrllabel
         self.SetRange(minvalue, maxvalue)
         self.borderWidth = 1
         self.selected = False
@@ -134,6 +139,9 @@ class ControlSlider(wx.Panel):
         else:
             self.dcref = wx.PaintDC
 
+    def getCtrlLabel(self):
+        return self.ctrllabel
+
     def setMidiCtl(self, x, propagate=True):
         self.propagate = propagate
         self.midictl = x
@@ -150,11 +158,11 @@ class ControlSlider(wx.Panel):
 
     def Enable(self):
         self._enable = True
-        self.Refresh()
+        wx.CallAfter(self.Refresh)
 
     def Disable(self):
         self._enable = False
-        self.Refresh()
+        wx.CallAfter(self.Refresh)
 
     def setSliderHeight(self, height):
         self.sliderHeight = height
@@ -205,7 +213,7 @@ class ControlSlider(wx.Panel):
             self.value = powOfTwo(self.value)
         self.clampPos()
         self.selected = False
-        self.Refresh()
+        wx.CallAfter(self.Refresh)
 
     def GetValue(self):
         if self.log:
@@ -407,7 +415,7 @@ class ControlSlider(wx.Panel):
 # It should work in the same way as the ControlSlider widget.
 class MultiSlider(wx.Panel):
 
-    def __init__(self, parent, init, key, command, slmap):
+    def __init__(self, parent, init, key, command, slmap, ctrllabel=""):
         wx.Panel.__init__(self, parent, size=(250,250))
         self.backgroundColour = BACKGROUND_COLOUR
         self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
@@ -418,6 +426,7 @@ class MultiSlider(wx.Panel):
         self.Bind(wx.EVT_LEFT_UP, self.MouseUp)
         self.Bind(wx.EVT_MOTION, self.MouseMotion)
         self._slmap = slmap
+        self.ctrllabel = ctrllabel
         self._values = [slmap.set(x) for x in init]
         self._nchnls = len(init)
         self._labels = init
@@ -432,6 +441,9 @@ class MultiSlider(wx.Panel):
         self.SetSize((250, self._nchnls*16))
         self.SetMinSize((250,self._nchnls*16))
 
+    def getCtrlLabel(self):
+        return self.ctrllabel
+
     def OnResize(self, event):
         self.Layout()
         self.Refresh()
@@ -485,6 +497,9 @@ class MultiSlider(wx.Panel):
                 self._command(self._key, self._labels)
             self.Refresh()
 
+    def GetValue(self):
+        return self._labels
+
 class VuMeter(wx.Panel):
 
     def __init__(self, parent, size=(200,11), numSliders=2, orient=wx.HORIZONTAL,
@@ -895,8 +910,13 @@ class PyoObjectControl(wx.Frame):
         from .controls import SigTo
         self.menubar = wx.MenuBar()
         self.fileMenu = wx.Menu()
-        self.fileMenu.Append(-1, 'Close\tCtrl+W', kind=wx.ITEM_NORMAL)
-        self.fileMenu.Bind(wx.EVT_MENU, self._destroy)
+        self.fileMenu.Append(9999, 'Close\tCtrl+W', kind=wx.ITEM_NORMAL)
+        self.fileMenu.Bind(wx.EVT_MENU, self._destroy, id=9999)
+        self.fileMenu.AppendSeparator()
+        self.fileMenu.Append(10000, 'Copy all parameters to the clipboard (4 digits of precision)\tCtrl+C', kind=wx.ITEM_NORMAL)
+        self.Bind(wx.EVT_MENU, self.copy, id=10000)
+        self.fileMenu.Append(10001, 'Copy all parameters to the clipboard (full precision)\tShift+Ctrl+C', kind=wx.ITEM_NORMAL)
+        self.Bind(wx.EVT_MENU, self.copy, id=10001)
         self.menubar.Append(self.fileMenu, "&File")
         self.SetMenuBar(self.menubar)
         self.Bind(wx.EVT_CLOSE, self._destroy)
@@ -933,10 +953,10 @@ class PyoObjectControl(wx.Frame):
                     if res == 'int': res = True
                     else: res = False
                     self._sliders.append(ControlSlider(panel, mini, maxi, init, log=scl, size=(300,16),
-                                        outFunction=Command(self.setval, key), integer=res))
+                                        outFunction=Command(self.setval, key), integer=res, ctrllabel=key))
                     self.box.AddMany([(label, 0, wx.LEFT, 5), (self._sliders[-1], 1, wx.EXPAND | wx.LEFT, 5)])
                 else:
-                    self._sliders.append(MultiSlider(panel, init, key, self.setval, m))
+                    self._sliders.append(MultiSlider(panel, init, key, self.setval, m, ctrllabel=key))
                     self.box.AddMany([(label, 0, wx.LEFT, 5), (self._sliders[-1], 1, wx.EXPAND | wx.LEFT, 5)])
                 # set obj attribute to PyoObject SigTo
                 if not dataOnly:
@@ -971,6 +991,39 @@ class PyoObjectControl(wx.Frame):
         else:
             setattr(self._obj, key, x)
 
+    def copy(self, evt):
+        labels = [slider.getCtrlLabel() for slider in self._sliders]
+        values = [slider.GetValue() for slider in self._sliders]
+        if evt.GetId() == 10000:
+            pstr = ""
+            for i in range(len(labels)):
+                pstr += "%s=" % labels[i]
+                if type(values[i]) == list:
+                    pstr += "["
+                    pstr += ", ".join(["%.4f" % val for val in values[i]])
+                    pstr += "]"
+                else:
+                    pstr += "%.4f" % values[i]
+                if i < (len(labels)-1):
+                    pstr += ", "
+        else:
+            pstr = ""
+            for i in range(len(labels)):
+                pstr += "%s=" % labels[i]
+                if type(values[i]) == list:
+                    pstr += "["
+                    pstr += ", ".join([str(val) for val in values[i]])
+                    pstr += "]"
+                else:
+                    pstr += str(values[i])
+                if i < (len(labels)-1):
+                    pstr += ", "
+        data = wx.TextDataObject(pstr)
+        if wx.TheClipboard.Open():
+            wx.TheClipboard.Clear()
+            wx.TheClipboard.SetData(data)
+            wx.TheClipboard.Close()
+
 ######################################################################
 ### View window for PyoTableObject
 ######################################################################
@@ -997,7 +1050,7 @@ class ViewTable(wx.Frame):
         self.update(samples)
 
     def update(self, samples):
-        wx.CallAfter(self.wavePanel.draw, samples)
+        self.wavePanel.draw(samples)
 
     def _destroy(self, evt):
         self.object._setViewFrame(None)
@@ -1019,7 +1072,7 @@ class ViewTablePanel(wx.Panel):
 
     def draw(self, samples):
         self.samples = samples
-        self.Refresh()
+        wx.CallAfter(self.Refresh)
 
     def OnPaint(self, evt):
         w,h = self.GetSize()
@@ -1069,7 +1122,7 @@ class SndViewTable(wx.Frame):
         self.update()
 
     def update(self):
-        wx.CallAfter(self.wavePanel.setImage)
+        self.wavePanel.setImage()
 
     def _destroy(self, evt):
         self.obj._setViewFrame(None)
@@ -1141,7 +1194,7 @@ class SndViewTablePanel(wx.Panel):
     def setImage(self):
         if self.obj is not None:
             self.img = self.obj.getViewTable(self.GetSize(), self.begin, self.end)
-            self.Refresh()
+            wx.CallAfter(self.Refresh)
 
     def clipPos(self, pos):
         if pos[0] < 0.0: x = 0.0
@@ -1327,7 +1380,7 @@ class ViewMatrixBase(wx.Frame):
         self.SetMaxSize(self.GetSize())
 
     def update(self, samples):
-        wx.CallAfter(self.setImage, samples)
+        self.setImage(samples)
 
     def _destroy(self, evt):
         self.object._setViewFrame(None)
@@ -1343,7 +1396,7 @@ class ViewMatrix(ViewMatrixBase):
         image = wx.EmptyImage(self.size[0], self.size[1])
         image.SetData(samples)
         self.img = wx.BitmapFromImage(image)
-        self.Refresh()
+        wx.CallAfter(self.Refresh)
 
     def OnPaint(self, evt):
         dc = wx.PaintDC(self)
@@ -1468,7 +1521,7 @@ class SpectrumDisplay(wx.Frame):
         self.obj.setHeight(size[1])
 
     def update(self, points):
-        wx.CallAfter(self.spectrumPanel.setImage, points)
+        self.spectrumPanel.setImage(points)
 
     def setFscaling(self, x):
         self.spectrumPanel.setFscaling(x)
@@ -1735,7 +1788,7 @@ class ScopeDisplay(wx.Frame):
         self.obj.setGain(gain)
 
     def update(self, points):
-        wx.CallAfter(self.scopePanel.setImage, points)
+        self.scopePanel.setImage(points)
 
     def _destroy(self, evt):
         self.obj._setViewFrame(None)
@@ -1824,7 +1877,7 @@ class ScopePanel(wx.Panel):
         for j in range(4):
             dc.SetPen(wx.Pen('#888888', width=1, style=wx.DOT))
             dc.DrawLine(j*tickstep, 0, j*tickstep, h)
-            dc.DrawText("%.3f" % (j*timestep), j*tickstep+2, h-12)
+            dc.DrawText("%.3f" % (j*timestep), j*tickstep+2, h-15)
         # draw waveforms
         for i, samples in enumerate(self.img):
             gc.SetPen(self.pens[i%8])
@@ -2407,6 +2460,9 @@ class DataMultiSlider(wx.Panel):
         self.changed = True
         wx.CallAfter(self.Refresh)
 
+    def getValues(self):
+        return self.values
+
     def OnPaint(self, event):
         w,h = self.GetSize()
         dc = self.dcref(self)
@@ -2506,6 +2562,11 @@ class DataTableGrapher(wx.Frame):
         self.fileMenu = wx.Menu()
         self.fileMenu.Append(9999, 'Close\tCtrl+W', kind=wx.ITEM_NORMAL)
         self.Bind(wx.EVT_MENU, self.close, id=9999)
+        self.fileMenu.AppendSeparator()
+        self.fileMenu.Append(10000, 'Copy all points to the clipboard (4 digits of precision)\tCtrl+C', kind=wx.ITEM_NORMAL)
+        self.Bind(wx.EVT_MENU, self.copy, id=10000)
+        self.fileMenu.Append(10001, 'Copy all points to the clipboard (full precision)\tShift+Ctrl+C', kind=wx.ITEM_NORMAL)
+        self.Bind(wx.EVT_MENU, self.copy, id=10001)
         self.menubar.Append(self.fileMenu, "&File")
         self.SetMenuBar(self.menubar)
 
@@ -2518,6 +2579,23 @@ class DataTableGrapher(wx.Frame):
     def update(self, samples):
         self.multi.update(samples)
 
+    def copy(self, evt):
+        values = self.multi.getValues()
+        if evt.GetId() == 10000:
+            pstr = "["
+            for i, val in enumerate(values):
+                pstr += "%.4f" % val
+                if i < (len(values)-1):
+                    pstr += ", "
+            pstr += "]"
+        else:
+            pstr = str(values)
+        data = wx.TextDataObject(pstr)
+        if wx.TheClipboard.Open():
+            wx.TheClipboard.Clear()
+            wx.TheClipboard.SetData(data)
+            wx.TheClipboard.Close()
+
 class ExprLexer(object):
     """Defines simple interface for custom lexer objects."""
     STC_EXPR_DEFAULT, STC_EXPR_KEYWORD, STC_EXPR_KEYWORD2, STC_EXPR_COMMENT, \
diff --git a/pyolib/players.py b/pyolib/players.py
index cde1780..00f20c1 100644
--- a/pyolib/players.py
+++ b/pyolib/players.py
@@ -314,7 +314,9 @@ class SfMarkerShuffler(PyoObject):
 
     >>> s = Server().boot()
     >>> s.start()
-    >>> sf = SfMarkerShuffler(SNDS_PATH + "/transparent.aif", speed=[1,1], mul=.3).out()
+    >>> sound = SNDS_PATH + "/transparent.aif"
+    >>> sf = SfMarkerShuffler(sound, speed=[1,1], mul=.3).out()
+    >>> sf.setRandomType("expon_min", 0.6)
 
     """
     def __init__(self, path, speed=1, interp=2, mul=1, add=0):
@@ -370,6 +372,62 @@ class SfMarkerShuffler(PyoObject):
         x, lmax = convertArgsToLists(x)
         [obj.setInterp(wrap(x,i)) for i, obj in enumerate(self._base_players)]
 
+    def setRandomType(self, dist=0, x=0.5):
+        """
+        Set the random distribution type used to choose the markers.
+
+        :Args:
+
+            dist: int or string
+                The distribution type. Available distributions are:
+                    0. uniform (default)
+                    1. linear minimum
+                    2. linear maximum
+                    3. triangular
+                    4. exponential minimum
+                    5. exponential maximum
+                    6. double (bi)exponential
+                    7. cauchy
+                    8. weibull
+                    9. gaussian
+            x: float
+                Distribution specific parameter, if applicable, as a float
+                between 0 and 1. Defaults to 0.5.
+
+        .. note::
+
+            Depending on the distribution type, `x` parameter is applied as
+            follow (names as string, or associated number can be used as `dist`
+            parameter):
+
+            0. uniform
+                - x: not used
+            1. linear_min
+                - x: not used
+            2. linear_max
+                - x: not used
+            3. triangle
+                - x: not used
+            4. expon_min
+                - x: slope {0 = no slope -> 1 = sharp slope}
+            5. expon_max
+                - x: slope {0 = no slope -> 1 = sharp slope}
+            6. biexpon
+                - x: bandwidth {0 = huge bandwidth -> 1 = narrow bandwidth}
+            7. cauchy
+                - x: bandwidth {0 = huge bandwidth -> 1 = narroe bandwidth}
+            8. weibull
+                - x: shape {0 = expon min => linear min => 1 = gaussian}
+            9. gaussian
+                - x: bandwidth {0 = huge bandwidth -> 1 = narrow bandwidth}
+
+        """
+        dist, x, lmax = convertArgsToLists(dist, x)
+        for i, t in enumerate(dist):
+            if type(t) in [bytes_t, unicode_t]:
+                dist[i] = XNOISE_DICT.get(t, 0)
+        [obj.setRandomType(wrap(dist,i), wrap(x,i)) for i, obj in enumerate(self._base_players)]
+
     def getMarkers(self):
         """
         Returns a list of marker time values in samples.
diff --git a/pyolib/server.py b/pyolib/server.py
index 278b047..be3af8c 100644
--- a/pyolib/server.py
+++ b/pyolib/server.py
@@ -20,7 +20,7 @@ GNU Lesser General Public License for more details.
 You should have received a copy of the GNU Lesser General Public
 License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
-import os, time
+import os, sys, time
 from ._core import *
 from ._widgets import createServerGUI
 
@@ -82,6 +82,9 @@ class Server(object):
             Name of jack client. Defaults to 'pyo'
         ichnls: int, optional
             Number of input channels if different of output channels. If None (default), ichnls = nchnls.
+        winhost: string, optional
+            Under Windows, pyo's Server will try to use the default devices of the given host.
+            This behaviour can be changed with the SetXXXDevice methods.
 
     .. note::
 
@@ -112,7 +115,7 @@ class Server(object):
 
     """
     def __init__(self, sr=44100, nchnls=2, buffersize=256, duplex=1,
-                 audio='portaudio', jackname='pyo', ichnls=None):
+                 audio='portaudio', jackname='pyo', ichnls=None, winhost="wasapi"):
         if "PYO_SERVER_AUDIO" in os.environ and "offline" not in audio and "embedded" not in audio:
             audio = os.environ["PYO_SERVER_AUDIO"]
         self._time = time
@@ -121,6 +124,7 @@ class Server(object):
             self._ichnls = nchnls
         else:
             self._ichnls = ichnls
+        self._winhost = winhost
         self._amp = 1.
         self._verbosity = 7
         self._startoffset = 0
@@ -134,6 +138,11 @@ class Server(object):
         self._server = Server_base(sr, nchnls, buffersize, duplex, audio, jackname, self._ichnls)
         self._server._setDefaultRecPath(os.path.join(os.path.expanduser("~"), "pyo_rec.wav"))
 
+        if sys.platform.startswith("win"):
+            host_default_in, host_default_out = pa_get_default_devices_from_host(winhost)
+            self._server.setInputDevice(host_default_in)
+            self._server.setOutputDevice(host_default_out)
+
     def __del__(self):
         self.setTime = None
         self.setRms = None
@@ -145,7 +154,7 @@ class Server(object):
             self._time.sleep(.25)
 
     def reinit(self, sr=44100, nchnls=2, buffersize=256, duplex=1,
-               audio='portaudio', jackname='pyo', ichnls=None):
+               audio='portaudio', jackname='pyo', ichnls=None, winhost="wasapi"):
         """
         Reinit the server'settings. Useful to alternate between real-time and offline server.
 
@@ -160,6 +169,7 @@ class Server(object):
             self._ichnls = nchnls
         else:
             self._ichnls = ichnls
+        self._winhost = winhost
         self._amp = 1.
         self._verbosity = 7
         self._startoffset = 0
@@ -172,6 +182,11 @@ class Server(object):
         self._isJackTransportSlave = False
         self._server.__init__(sr, nchnls, buffersize, duplex, audio, jackname, self._ichnls)
 
+        if sys.platform.startswith("win"):
+            host_default_in, host_default_out = pa_get_default_devices_from_host(winhost)
+            self._server.setInputDevice(host_default_in)
+            self._server.setOutputDevice(host_default_out)
+
     def setCallback(self, callback):
         """
         Register a custom process callback.
diff --git a/pyolib/triggers.py b/pyolib/triggers.py
index 438252b..f9508ca 100644
--- a/pyolib/triggers.py
+++ b/pyolib/triggers.py
@@ -188,6 +188,10 @@ class Seq(PyoObject):
         onlyonce: boolean, optional
             If True, the sequence will play only once and automatically stop.
             Defaults to False.
+        speed: float or PyoObject, optional
+            Continuous speed factor. This factor multiplies the speed of the
+            internal timer continuously. It can be useful to create time
+            deceleration or acceleration. Defaults to 1.
 
     .. note::
 
@@ -204,20 +208,21 @@ class Seq(PyoObject):
     >>> a = SineLoop(tr, feedback=0.07, mul=amp).out()
 
     """
-    def __init__(self, time=1, seq=[1], poly=1, onlyonce=False):
-        pyoArgsAssert(self, "OlIB", time, seq, poly)
+    def __init__(self, time=1, seq=[1], poly=1, onlyonce=False, speed=1):
+        pyoArgsAssert(self, "OlIBO", time, seq, poly, onlyonce, speed)
         PyoObject.__init__(self)
         self._time = time
         self._seq = seq
         self._poly = poly
         self._onlyonce = onlyonce
-        time, lmax = convertArgsToLists(time)
+        self._speed = speed
+        time, speed, lmax = convertArgsToLists(time, speed)
         if type(seq[0]) != list:
-            self._base_players = [Seqer_base(wrap(time,i), seq, poly, onlyonce) for i in range(lmax)]
+            self._base_players = [Seqer_base(wrap(time,i), seq, poly, onlyonce, wrap(speed,i)) for i in range(lmax)]
         else:
             seqlen = len(seq)
             lmax = max(seqlen, lmax)
-            self._base_players = [Seqer_base(wrap(time,i), wrap(seq,i), poly, onlyonce) for i in range(lmax)]
+            self._base_players = [Seqer_base(wrap(time,i), wrap(seq,i), poly, onlyonce, wrap(speed,i)) for i in range(lmax)]
         self._base_objs = [Seq_base(wrap(self._base_players,j), i) for i in range(poly) for j in range(lmax)]
 
     def setTime(self, x):
@@ -235,6 +240,21 @@ class Seq(PyoObject):
         x, lmax = convertArgsToLists(x)
         [obj.setTime(wrap(x,i)) for i, obj in enumerate(self._base_players)]
 
+    def setSpeed(self, x):
+        """
+        Replace the `speed` attribute.
+
+        :Args:
+
+            x: float or PyoObject
+                New `speed` attribute.
+
+        """
+        pyoArgsAssert(self, "O", x)
+        self._speed = x
+        x, lmax = convertArgsToLists(x)
+        [obj.setSpeed(wrap(x,i)) for i, obj in enumerate(self._base_players)]
+
     def setSeq(self, x):
         """
         Replace the `seq` attribute.
@@ -293,6 +313,13 @@ class Seq(PyoObject):
     def time(self, x): self.setTime(x)
 
     @property
+    def speed(self):
+        """float or PyoObject. Continuous speed factor."""
+        return self._speed
+    @speed.setter
+    def speed(self, x): self.setSpeed(x)
+
+    @property
     def seq(self):
         """List of floats. Sequence of beat durations in time's unit."""
         return self._seq
diff --git a/scripts/compile_win.bat b/scripts/compile_win.bat
index a8e0ae6..d386ae2 100644
--- a/scripts/compile_win.bat
+++ b/scripts/compile_win.bat
@@ -1,4 +1,6 @@
 echo off
+
+RMDIR /S /Q build
 
 echo *** Compile for python2.7 ***
 C:\Python27\python.exe setup.py install --use-double
diff --git a/scripts/release_doc_src.sh b/scripts/release_doc_src.sh
index 4756d28..98efe2d 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.4
+version=0.8.6
 replace=XXX
 
 doc_rep=pyo_XXX-doc
diff --git a/scripts/win/windows-7-build-routine.txt b/scripts/win/windows-7-build-routine.txt
index 241a9c1..f408325 100644
--- a/scripts/win/windows-7-build-routine.txt
+++ b/scripts/win/windows-7-build-routine.txt
@@ -24,53 +24,11 @@ which may be pre-release or release; currently it is the latest stable release (
 Do not build from sources.
 
 === STEP 7 ===
---- Update liblo tag 0.26 from the tarball at http://liblo.sourceforge.net (not SVN!), 
-copy build/config-msvc.h --> src/config.h,
+--- Update liblo tag 0.28 from the tarball at http://liblo.sourceforge.net (not SVN!), 
 
-If there is a conflict about struct timespec, remove the definition in pthread.h.
-
-and build with this SConstruct:
-
-# S C O N S T R U C T   F O R   L I B L O . D L L
-# Michael Gogins
-# Using hints from: http://clam.iua.upf.edu/wikis/clam/index.php/Devel/Windows_MinGW_cross_compile#liblo
-# Modified by Olivier Belanger on september 2010
-
-environment = Environment(tools = ['mingw'])
-
-sources = '''
-src/address.c
-src/blob.c
-src/bundle.c
-src/message.c
-src/method.c
-src/pattern_match.c
-src/send.c
-src/server.c
-src/server_thread.c
-src/timetag.c
-'''
-
-cppath = '''
-.
-lo
-C:/pthreads/include
-'''
-
-libpath = '''
-C:/MinGW/lib
-C:/pthreads/lib
-'''
+Compile with MinGW's pthreads installed and ./configure && make
 
-environment.Append(CFLAGS = Split('-O2 -g -DHAVE_CONFIG_H -D_WIN32_WINNT=0x0501'))
-environment.Append(CPPPATH = Split(cppath))
-environment.Append(LIBPATH = Split(libpath))
-environment.Append(LIBS = Split('pthreadvc2 kernel32 gdi32 wsock32 ws2_32 ole32 uuid winmm'))
-environment.Append(LINKFLAGS = ['-Wl,--enable-stdcall-fixup', '-Wl,--export-all-symbols'])
-### -export-all-symbols or -export-dynamic ? ###
-
-liblo = environment.SharedLibrary('lo', Split(sources))
-#######################################################
+If there is a conflict about struct timespec, remove the definition in pthread.h.
 
 === STEP 8 ===
 --- Install Directx 9.0 SDK (april 2007)
diff --git a/setup.py b/setup.py
index a6b987a..b34e3d6 100644
--- a/setup.py
+++ b/setup.py
@@ -20,9 +20,30 @@ License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
 from distutils.sysconfig import get_python_lib
 from distutils.core import setup, Extension
-import os, sys, py_compile
+import os, sys, py_compile, subprocess
 
-pyo_version = "0.8.4"
+if sys.version_info[0] < 3:
+    def tobytes(strng, encoding=None):
+        "Convert unicode string to bytes."
+        return bytes(strng)
+else:
+    def tobytes(strng, encoding="utf-8"):
+        "Convert unicode string to bytes."
+        return bytes(strng, encoding=encoding)
+
+def get_jack_api():
+    output = subprocess.Popen(["jackd", "-V"], stdout=subprocess.PIPE)
+    text = output.communicate()[0]
+    if text != "":
+        line = text.splitlines()[0]
+        if tobytes("0.124") in line or tobytes("1.9.10") in line:
+            return "JACK_OLD_API"
+        else:
+            return "JACK_NEW_API"
+    else:
+        return "JACK_NEW_API"
+
+pyo_version = "0.8.6"
 build_with_jack_support = False
 compile_externals = False
 
@@ -89,18 +110,22 @@ else:
     macros.append(('USE_OSC', None))
     ad_files.append("osclistenermodule.c")
     obj_files.append("oscmodule.c")
-    libraries += ["lo"]
+    if sys.platform == "win32":
+        libraries += ["liblo-7"]
+    else:
+        libraries += ["lo"]
 
 # Optional Audio / Midi drivers
 if '--use-jack' in sys.argv: 
     sys.argv.remove('--use-jack') 
     build_with_jack_support = True
-    macros.append(('USE_JACK',None))
+    macros.append(('USE_JACK', None))
+    macros.append((get_jack_api(), None))
     ad_files.append("ad_jack.c")
 
 if '--use-coreaudio' in sys.argv: 
     sys.argv.remove('--use-coreaudio') 
-    macros.append(('USE_COREAUDIO',None))
+    macros.append(('USE_COREAUDIO', None))
     ad_files.append("ad_coreaudio.c")
 
 if sys.platform == "darwin":
@@ -135,8 +160,8 @@ else:
 if sys.platform == "win32":
     include_dirs = ['C:\portaudio\include', 'C:\portmidi\pm_common', 'include',
                     'C:\Program Files (x86)\Mega-Nerd\libsndfile\include',
-                    'C:\liblo', 'C:\pthreads\include', 'C:\portmidi\porttime']
-    library_dirs = ['C:\portaudio', 'C:\portmidi', 'C:\liblo', 'C:\pthreads\lib', 
+                    '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']
     if 'portmidi' in libraries:
diff --git a/src/engine/ad_jack.c b/src/engine/ad_jack.c
index 05fa6b0..d63ca39 100644
--- a/src/engine/ad_jack.c
+++ b/src/engine/ad_jack.c
@@ -97,8 +97,6 @@ jack_transport_cb(jack_transport_state_t state, jack_position_t *pos, void *arg)
             break;
         case JackTransportLooping:
             break;
-        case JackTransportNetStarting:
-            break;
     }
 
     server->jack_transport_state = state;
@@ -430,7 +428,11 @@ jack_input_port_set_names(Server *self) {
             name = PY_STRING_AS_STRING(PyList_GetItem(self->jackInputPortNames, i));
 
             Py_BEGIN_ALLOW_THREADS
+#ifdef JACK_NEW_API
             err = jack_port_rename(be_data->jack_client, be_data->jack_in_ports[i], name);
+#else
+            err = jack_port_set_name(be_data->jack_in_ports[i], name);
+#endif
             Py_END_ALLOW_THREADS
 
             if (err)
@@ -443,7 +445,11 @@ jack_input_port_set_names(Server *self) {
             sprintf(result, "%s_%d", name, i);
 
             Py_BEGIN_ALLOW_THREADS
+#ifdef JACK_NEW_API
             err = jack_port_rename(be_data->jack_client, be_data->jack_in_ports[i], result);
+#else
+            err = jack_port_set_name(be_data->jack_in_ports[i], result);
+#endif
             Py_END_ALLOW_THREADS
 
             if (err)
@@ -469,7 +475,11 @@ jack_output_port_set_names(Server *self) {
             name = PY_STRING_AS_STRING(PyList_GetItem(self->jackOutputPortNames, i));
 
             Py_BEGIN_ALLOW_THREADS
+#ifdef JACK_NEW_API
             err = jack_port_rename(be_data->jack_client, be_data->jack_out_ports[i], name);
+#else
+            err = jack_port_set_name(be_data->jack_out_ports[i], name);
+#endif
             Py_END_ALLOW_THREADS
 
             if (err)
@@ -482,7 +492,11 @@ jack_output_port_set_names(Server *self) {
             sprintf(result, "%s_%d", name, i);
 
             Py_BEGIN_ALLOW_THREADS
+#ifdef JACK_NEW_API
             err = jack_port_rename(be_data->jack_client, be_data->jack_out_ports[i], result);
+#else
+            err = jack_port_set_name(be_data->jack_out_ports[i], result);
+#endif
             Py_END_ALLOW_THREADS
 
             if (err)
diff --git a/src/engine/md_portmidi.c b/src/engine/md_portmidi.c
index 9910305..c4bfb4e 100644
--- a/src/engine/md_portmidi.c
+++ b/src/engine/md_portmidi.c
@@ -280,27 +280,26 @@ Server_pm_deinit(Server *self)
        but Pm_Close segfaults now and then so...
        This hack need to be tested on Windows and OSX. */
 
-    /* Restored with macros to protect Close statements. */
-
     if (self->withPortMidi == 1) {
         for (i=0; i<self->midiin_count; i++) {
             if (be_data->midiin[i] != NULL) {
-
+/*
                 Py_BEGIN_ALLOW_THREADS
                 Pm_Close(be_data->midiin[i]);
                 Py_END_ALLOW_THREADS
-
+*/
             }
         }
     }
     if (self->withPortMidiOut == 1) {
         for (i=0; i<self->midiout_count; i++) {
-            if (be_data->midiout[i] != NULL)
-
+            if (be_data->midiout[i] != NULL) {
+/*
                 Py_BEGIN_ALLOW_THREADS
                 Pm_Close(be_data->midiout[i]);
                 Py_END_ALLOW_THREADS
-
+*/
+            }
         }
     }
     if (self->withPortMidi == 1 || self->withPortMidiOut == 1) {
diff --git a/src/engine/servermodule.c b/src/engine/servermodule.c
index 99d7e9a..d67b475 100644
--- a/src/engine/servermodule.c
+++ b/src/engine/servermodule.c
@@ -195,6 +195,7 @@ void
     Server *self;
     self = (Server *)arg;
 
+    PyGILState_STATE s = PyGILState_Ensure();
     if (self->recdur < 0) {
         Server_error(self,"Duration must be specified for Offline Server (see Server.recordOptions).");
     }
@@ -211,6 +212,8 @@ void
         sf_close(self->recfile);
         Server_message(self,"Offline Server rendering finished.\n");
     }
+    PyGILState_Release(s);
+
     return NULL;
 }
 
diff --git a/src/objects/metromodule.c b/src/objects/metromodule.c
index adff001..998e2b8 100644
--- a/src/objects/metromodule.c
+++ b/src/objects/metromodule.c
@@ -385,8 +385,10 @@ typedef struct {
     pyo_audio_HEAD
     PyObject *time;
     Stream *time_stream;
+    PyObject *speed;
+    Stream *speed_stream;
     PyObject *tmp;
-    int modebuffer[1];
+    int modebuffer[2];
     double sampleToSec;
     double currentTime;
     double *seq;
@@ -415,11 +417,94 @@ Seqer_reset(Seqer *self)
 }
 
 static void
-Seqer_generate_i(Seqer *self) {
+Seqer_generate_ii(Seqer *self) {
+    double tm, sp;
+    int i;
+
+    tm = PyFloat_AS_DOUBLE(self->time);
+    sp = PyFloat_AS_DOUBLE(self->speed);
+
+    for (i=0; i<(self->poly*self->bufsize); i++) {
+        self->buffer_streams[i] = 0.0;
+    }
+
+    if (self->to_stop) {
+        PyObject_CallMethod((PyObject *)self, "stop", NULL);
+        self->to_stop = 0;
+        return;
+    }
+
+    for (i=0; i<self->bufsize; i++) {
+        self->currentTime += (self->sampleToSec * sp);
+        if (self->currentTime >= self->when) {
+            self->currentTime -= self->when;
+            self->when = self->seq[self->tap] * tm;
+            self->buffer_streams[i + self->voiceCount * self->bufsize] = 1.0;
+            self->voiceCount++;
+            if (self->voiceCount >= self->poly)
+                self->voiceCount = 0;
+            self->tap++;
+            if (self->tap >= self->seqsize) {
+                self->tap = 0;
+                if (self->newseq == 1)
+                    Seqer_reset(self);
+                if (self->onlyonce) {
+                    self->to_stop = 1;
+                    return;
+                }
+            }
+        }
+    }
+}
+
+static void
+Seqer_generate_ai(Seqer *self) {
+    int i;
+    double sp;
+
+    MYFLT *time = Stream_getData((Stream *)self->time_stream);
+    sp = PyFloat_AS_DOUBLE(self->speed);
+
+    for (i=0; i<(self->poly*self->bufsize); i++) {
+        self->buffer_streams[i] = 0.0;
+    }
+
+    if (self->to_stop) {
+        PyObject_CallMethod((PyObject *)self, "stop", NULL);
+        self->to_stop = 0;
+        return;
+    }
+
+    for (i=0; i<self->bufsize; i++) {
+        self->currentTime += (self->sampleToSec * sp);
+        if (self->currentTime >= self->when) {
+            self->currentTime -= self->when;
+            self->when = self->seq[self->tap] * (double)time[i];
+            self->buffer_streams[i + self->voiceCount * self->bufsize] = 1.0;
+            self->voiceCount++;
+            if (self->voiceCount >= self->poly)
+                self->voiceCount = 0;
+            self->tap++;
+            if (self->tap >= self->seqsize) {
+                self->tap = 0;
+                if (self->newseq == 1)
+                    Seqer_reset(self);
+                if (self->onlyonce) {
+                    self->to_stop = 1;
+                    return;
+                }
+            }
+        }
+    }
+}
+
+static void
+Seqer_generate_ia(Seqer *self) {
     double tm;
     int i;
 
     tm = PyFloat_AS_DOUBLE(self->time);
+    MYFLT *speed = Stream_getData((Stream *)self->speed_stream);
 
     for (i=0; i<(self->poly*self->bufsize); i++) {
         self->buffer_streams[i] = 0.0;
@@ -432,7 +517,7 @@ Seqer_generate_i(Seqer *self) {
     }
 
     for (i=0; i<self->bufsize; i++) {
-        self->currentTime += self->sampleToSec;
+        self->currentTime += (self->sampleToSec * (double)speed[i]);
         if (self->currentTime >= self->when) {
             self->currentTime -= self->when;
             self->when = self->seq[self->tap] * tm;
@@ -455,10 +540,11 @@ Seqer_generate_i(Seqer *self) {
 }
 
 static void
-Seqer_generate_a(Seqer *self) {
+Seqer_generate_aa(Seqer *self) {
     int i;
 
     MYFLT *time = Stream_getData((Stream *)self->time_stream);
+    MYFLT *speed = Stream_getData((Stream *)self->speed_stream);
 
     for (i=0; i<(self->poly*self->bufsize); i++) {
         self->buffer_streams[i] = 0.0;
@@ -471,7 +557,7 @@ Seqer_generate_a(Seqer *self) {
     }
 
     for (i=0; i<self->bufsize; i++) {
-        self->currentTime += self->sampleToSec;
+        self->currentTime += (self->sampleToSec * (double)speed[i]);
         if (self->currentTime >= self->when) {
             self->currentTime -= self->when;
             self->when = self->seq[self->tap] * (double)time[i];
@@ -502,13 +588,19 @@ Seqer_getSamplesBuffer(Seqer *self)
 static void
 Seqer_setProcMode(Seqer *self)
 {
-    int procmode = self->modebuffer[0];
+    int procmode = self->modebuffer[0] + self->modebuffer[1] * 10;
     switch (procmode) {
         case 0:
-            self->proc_func_ptr = Seqer_generate_i;
+            self->proc_func_ptr = Seqer_generate_ii;
             break;
         case 1:
-            self->proc_func_ptr = Seqer_generate_a;
+            self->proc_func_ptr = Seqer_generate_ai;
+            break;
+        case 10:
+            self->proc_func_ptr = Seqer_generate_ia;
+            break;
+        case 11:
+            self->proc_func_ptr = Seqer_generate_aa;
             break;
     }
 }
@@ -525,6 +617,8 @@ Seqer_traverse(Seqer *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->time);
     Py_VISIT(self->time_stream);
+    Py_VISIT(self->speed);
+    Py_VISIT(self->speed_stream);
     Py_VISIT(self->tmp);
     return 0;
 }
@@ -535,6 +629,8 @@ Seqer_clear(Seqer *self)
     pyo_CLEAR
     Py_CLEAR(self->time);
     Py_CLEAR(self->time_stream);
+    Py_CLEAR(self->speed);
+    Py_CLEAR(self->speed_stream);
     Py_CLEAR(self->tmp);
     return 0;
 }
@@ -553,11 +649,12 @@ static PyObject *
 Seqer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     int i;
-    PyObject *timetmp=NULL, *seqtmp=NULL;
+    PyObject *timetmp=NULL, *speedtmp=NULL, *seqtmp=NULL;
     Seqer *self;
     self = (Seqer *)type->tp_alloc(type, 0);
 
     self->time = PyFloat_FromDouble(1.);
+    self->speed = PyFloat_FromDouble(1.);
     self->poly = 1;
     self->seqsize = 1;
     self->seq = (double *)realloc(self->seq, self->seqsize * sizeof(double));
@@ -568,6 +665,7 @@ Seqer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->onlyonce = 0;
     self->to_stop = 0;
 	self->modebuffer[0] = 0;
+	self->modebuffer[1] = 0;
 
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Seqer_compute_next_data_frame);
@@ -578,15 +676,19 @@ Seqer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->sampleToSec = 1.0 / self->sr;
     self->currentTime = 0.0;
 
-    static char *kwlist[] = {"time", "seq", "poly", "onlyonce", NULL};
+    static char *kwlist[] = {"time", "seq", "poly", "onlyonce", "speed", NULL};
 
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOii", kwlist, &timetmp, &seqtmp, &self->poly, &self->onlyonce))
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOiiO", kwlist, &timetmp, &seqtmp, &self->poly, &self->onlyonce, &speedtmp))
         Py_RETURN_NONE;
 
     if (timetmp) {
         PyObject_CallMethod((PyObject *)self, "setTime", "O", timetmp);
     }
 
+    if (speedtmp) {
+        PyObject_CallMethod((PyObject *)self, "setSpeed", "O", speedtmp);
+    }
+
     if (seqtmp) {
         PyObject_CallMethod((PyObject *)self, "setSeq", "O", seqtmp);
     }
@@ -645,6 +747,37 @@ Seqer_setTime(Seqer *self, PyObject *arg)
 }
 
 static PyObject *
+Seqer_setSpeed(Seqer *self, PyObject *arg)
+{
+	PyObject *tmp, *streamtmp;
+
+    ASSERT_ARG_NOT_NULL
+
+	int isNumber = PyNumber_Check(arg);
+
+	tmp = arg;
+	Py_INCREF(tmp);
+	Py_DECREF(self->speed);
+	if (isNumber == 1) {
+		self->speed = PyNumber_Float(tmp);
+        self->modebuffer[1] = 0;
+	}
+	else {
+		self->speed = tmp;
+        streamtmp = PyObject_CallMethod((PyObject *)self->speed, "_getStream", NULL);
+        Py_INCREF(streamtmp);
+        Py_XDECREF(self->speed_stream);
+        self->speed_stream = (Stream *)streamtmp;
+		self->modebuffer[1] = 1;
+	}
+
+    (*self->mode_func_ptr)(self);
+
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+static PyObject *
 Seqer_setSeq(Seqer *self, PyObject *arg)
 {
 	PyObject *tmp;
@@ -684,6 +817,7 @@ static PyMemberDef Seqer_members[] = {
     {"server", T_OBJECT_EX, offsetof(Seqer, server), 0, "Pyo server."},
     {"stream", T_OBJECT_EX, offsetof(Seqer, stream), 0, "Stream object."},
     {"time", T_OBJECT_EX, offsetof(Seqer, time), 0, "Seqer time factor."},
+    {"speed", T_OBJECT_EX, offsetof(Seqer, speed), 0, "Seqer speed factor."},
     {NULL}  /* Sentinel */
 };
 
@@ -693,6 +827,7 @@ static PyMethodDef Seqer_methods[] = {
     {"play", (PyCFunction)Seqer_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
     {"stop", (PyCFunction)Seqer_stop, METH_NOARGS, "Stops computing."},
     {"setTime", (PyCFunction)Seqer_setTime, METH_O, "Sets time factor."},
+    {"setSpeed", (PyCFunction)Seqer_setSpeed, METH_O, "Sets speed factor."},
     {"setSeq", (PyCFunction)Seqer_setSeq, METH_O, "Sets duration sequence."},
     {"setOnlyonce", (PyCFunction)Seqer_setOnlyonce, METH_O, "Sets onlyonce attribute."},
     {NULL}  /* Sentinel */
diff --git a/src/objects/oscilmodule.c b/src/objects/oscilmodule.c
index 8a3ab21..5549677 100644
--- a/src/objects/oscilmodule.c
+++ b/src/objects/oscilmodule.c
@@ -5834,8 +5834,11 @@ TableRead_readframes_i(TableRead *self) {
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
         if (self->pointerPos < 0) {
-            if (self->init == 0)
+            if (self->init == 0) {
                 self->trigsBuffer[i] = 1.0;
+                if (self->loop == 0)
+                    self->go = 0;
+            }
             else
                 self->init = 0;
             self->pointerPos = size + self->pointerPos;
@@ -5880,8 +5883,11 @@ TableRead_readframes_a(TableRead *self) {
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
         if (self->pointerPos < 0) {
-            if (self->init == 0)
+            if (self->init == 0) {
                 self->trigsBuffer[i] = 1.0;
+                if (self->loop == 0)
+                    self->go = 0;
+            }
             else
                 self->init = 0;
             self->pointerPos = size + self->pointerPos;
diff --git a/src/objects/oscmodule.c b/src/objects/oscmodule.c
index f654edb..23d252e 100644
--- a/src/objects/oscmodule.c
+++ b/src/objects/oscmodule.c
@@ -100,6 +100,7 @@ OscReceiver_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, OscReceiver_compute_next_data_frame);
+    Stream_setStreamActive(self->stream, 1);
 
     static char *kwlist[] = {"port", "address", NULL};
 
@@ -1293,6 +1294,7 @@ OscListReceiver_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, OscListReceiver_compute_next_data_frame);
+    Stream_setStreamActive(self->stream, 1);
 
     static char *kwlist[] = {"port", "address", "num", NULL};
 
diff --git a/src/objects/patternmodule.c b/src/objects/patternmodule.c
index db95d6e..88f2915 100644
--- a/src/objects/patternmodule.c
+++ b/src/objects/patternmodule.c
@@ -529,7 +529,8 @@ CallAfter_generate(CallAfter *self) {
             result = PyObject_Call(self->callable, tuple, NULL);
             if (result == NULL)
                 PyErr_Print();
-            PyObject_CallMethod((PyObject *)self, "stop", NULL);
+            if (self->stream != NULL)
+                PyObject_CallMethod((PyObject *)self, "stop", NULL);
             break;
         }
         self->currentTime += self->sampleToSec;
diff --git a/src/objects/sfplayermodule.c b/src/objects/sfplayermodule.c
index 1a14894..50b528c 100644
--- a/src/objects/sfplayermodule.c
+++ b/src/objects/sfplayermodule.c
@@ -812,6 +812,8 @@ typedef struct {
     MYFLT *samplesBuffer;
     MYFLT *markers;
     int markers_size;
+    MYFLT x;
+    MYFLT (*type_func_ptr)();
     MYFLT (*interp_func_ptr)(MYFLT *, int, MYFLT, int);
 } SfMarkerShuffler;
 
@@ -819,6 +821,122 @@ typedef struct {
 static void SfMarkerShuffler_chooseNewMark(SfMarkerShuffler *self, int dir);
 /******************/
 
+// no parameter
+static MYFLT
+SfMarkerShuffler_uniform(SfMarkerShuffler *self) {
+    return RANDOM_UNIFORM;
+}
+
+static MYFLT
+SfMarkerShuffler_linear_min(SfMarkerShuffler *self) {
+    MYFLT a = RANDOM_UNIFORM;
+    MYFLT b = RANDOM_UNIFORM;
+    if (a < b) return a;
+    else return b;
+}
+
+static MYFLT
+SfMarkerShuffler_linear_max(SfMarkerShuffler *self) {
+    MYFLT a = RANDOM_UNIFORM;
+    MYFLT b = RANDOM_UNIFORM;
+    if (a > b) return a;
+    else return b;
+}
+
+static MYFLT
+SfMarkerShuffler_triangle(SfMarkerShuffler *self) {
+    MYFLT a = RANDOM_UNIFORM;
+    MYFLT b = RANDOM_UNIFORM;
+    return ((a + b) * 0.5);
+}
+
+// x1 = slope
+static MYFLT
+SfMarkerShuffler_expon_min(SfMarkerShuffler *self) {
+    if (self->x <= 0.0) self->x = 0.00001;
+    MYFLT val = -MYLOG(RANDOM_UNIFORM) / self->x;
+    if (val < 0.0) return 0.0;
+    else if (val > 1.0) return 1.0;
+    else return val;
+}
+
+static MYFLT
+SfMarkerShuffler_expon_max(SfMarkerShuffler *self) {
+    if (self->x <= 0.0) self->x = 0.00001;
+    MYFLT val = 1.0 - (-MYLOG(RANDOM_UNIFORM) / self->x);
+    if (val < 0.0) return 0.0;
+    else if (val > 1.0) return 1.0;
+    else return val;
+}
+
+// x1 = bandwidth
+static MYFLT
+SfMarkerShuffler_biexpon(SfMarkerShuffler *self) {
+    MYFLT polar, val;
+    if (self->x <= 0.0) self->x = 0.00001;
+    MYFLT sum = RANDOM_UNIFORM * 2.0;
+
+    if (sum > 1.0) {
+        polar = -1;
+        sum = 2.0 - sum;
+    }
+    else
+        polar = 1;
+
+    val = 0.5 * (polar * MYLOG(sum) / self->x) + 0.5;
+
+    if (val < 0.0) return 0.0;
+    else if (val > 1.0) return 1.0;
+    else return val;
+}
+
+static MYFLT
+SfMarkerShuffler_cauchy(SfMarkerShuffler *self) {
+    MYFLT rnd, val, dir;
+    do {
+        rnd = RANDOM_UNIFORM;
+    }
+    while (rnd == 0.5);
+
+    if (pyorand() < (PYO_RAND_MAX / 2))
+        dir = -1;
+    else
+        dir = 1;
+
+    val = 0.5 * (MYTAN(rnd) * self->x * dir) + 0.5;
+
+    if (val < 0.0) return 0.0;
+    else if (val > 1.0) return 1.0;
+    else return val;
+}
+
+// x = shape
+static MYFLT
+SfMarkerShuffler_weibull(SfMarkerShuffler *self) {
+    MYFLT rnd, val;
+    if (self->x <= 0.0) self->x = 0.00001;
+
+    rnd = 1.0 / (1.0 - RANDOM_UNIFORM);
+    val = 0.5 * MYPOW(MYLOG(rnd), (1.0 / self->x));
+
+    if (val < 0.0) return 0.0;
+    else if (val > 1.0) return 1.0;
+    else return val;
+}
+
+// x = bandwidth
+static MYFLT
+SfMarkerShuffler_gaussian(SfMarkerShuffler *self) {
+    MYFLT rnd, val;
+
+    rnd = (RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM);
+    val = (self->x * (rnd - 3.0) * 0.33 + 0.5);
+
+    if (val < 0.0) return 0.0;
+    else if (val > 1.0) return 1.0;
+    else return val;
+}
+
 static void
 SfMarkerShuffler_readframes_i(SfMarkerShuffler *self) {
     MYFLT sp, frac, bufpos, delta, tmp;
@@ -985,7 +1103,7 @@ SfMarkerShuffler_chooseNewMark(SfMarkerShuffler *self, int dir)
     int mark;
     if (dir == 1) {
         if (self->startPos == -1) {
-            mark = (int)(self->markers_size * RANDOM_UNIFORM);
+            mark = (int)(self->markers_size * (*self->type_func_ptr)(self) * 0.99);
             self->startPos = self->markers[mark];
             self->endPos = self->markers[mark+1];
         }
@@ -994,13 +1112,13 @@ SfMarkerShuffler_chooseNewMark(SfMarkerShuffler *self, int dir)
             self->endPos = self->nextEndPos;
         }
 
-        mark = (int)(self->markers_size * RANDOM_UNIFORM);
+        mark = (int)(self->markers_size * (*self->type_func_ptr)(self) * 0.99);
         self->nextStartPos = self->markers[mark];
         self->nextEndPos = self->markers[mark+1];
     }
     else {
         if (self->startPos == -1) {
-            mark = self->markers_size - (int)(self->markers_size * RANDOM_UNIFORM);
+            mark = self->markers_size - (int)(self->markers_size * (*self->type_func_ptr)(self) * 0.99);
             self->startPos = self->markers[mark];
             self->endPos = self->markers[mark-1];
         }
@@ -1009,7 +1127,7 @@ SfMarkerShuffler_chooseNewMark(SfMarkerShuffler *self, int dir)
             self->endPos = self->nextEndPos;
         }
 
-        mark = self->markers_size - (int)(self->markers_size * RANDOM_UNIFORM);
+        mark = self->markers_size - (int)(self->markers_size * (*self->type_func_ptr)(self) * 0.99);
         self->nextStartPos = self->markers[mark];
         self->nextEndPos = self->markers[mark-1];
     }
@@ -1073,6 +1191,7 @@ SfMarkerShuffler_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->endPos = -1;
 	self->modebuffer[0] = 0;
     self->lastDir = 1;
+    self->x = 0.5;
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, SfMarkerShuffler_compute_next_data_frame);
     self->mode_func_ptr = SfMarkerShuffler_setProcMode;
@@ -1090,6 +1209,8 @@ SfMarkerShuffler_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     (*self->mode_func_ptr)(self);
 
+    self->type_func_ptr = SfMarkerShuffler_uniform;
+
     if (self->interp == 0)
         self->interp = 2;
     if (self->interp == 1)
@@ -1187,6 +1308,72 @@ SfMarkerShuffler_setInterp(SfMarkerShuffler *self, PyObject *arg)
     Py_RETURN_NONE;
 }
 
+static PyObject *
+SfMarkerShuffler_setRandomType(SfMarkerShuffler *self, PyObject *args, PyObject *kwds)
+{
+    int dist = 0;
+    MYFLT x = 0.5;
+
+    static char *kwlist[] = {"dist", "x", NULL};
+
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE__IF, kwlist, &dist, &x))
+        Py_RETURN_NONE;
+
+    if (dist < 0 || dist > 9) {
+        Py_RETURN_NONE;
+    }
+
+    if (x < 0.0)
+        self->x = 0.0;
+    else if (x >= 1.0)
+        self->x = 1.0;
+    else
+        self->x = x;
+
+    switch (dist) {
+        case 0:
+            self->type_func_ptr = SfMarkerShuffler_uniform;
+            break;
+        case 1:
+            self->type_func_ptr = SfMarkerShuffler_linear_min;
+            break;
+        case 2:
+            self->type_func_ptr = SfMarkerShuffler_linear_max;
+            break;
+        case 3:
+            self->type_func_ptr = SfMarkerShuffler_triangle;
+            break;
+        case 4:
+            self->type_func_ptr = SfMarkerShuffler_expon_min;
+            self->x *= 10.0;
+            break;
+        case 5:
+            self->type_func_ptr = SfMarkerShuffler_expon_max;
+            self->x *= 10.0;
+            break;
+        case 6:
+            self->type_func_ptr = SfMarkerShuffler_biexpon;
+            self->x *= 10.0;
+            break;
+        case 7:
+            self->type_func_ptr = SfMarkerShuffler_cauchy;
+            self->x *= 10.0;
+            self->x = 10.0 - self->x;
+            break;
+        case 8:
+            self->type_func_ptr = SfMarkerShuffler_weibull;
+            self->x = self->x * 5.0 + 0.1;
+            break;
+        case 9:
+            self->type_func_ptr = SfMarkerShuffler_gaussian;
+            self->x *= 10.0;
+            self->x = 10.0 - self->x;
+            break;
+    }
+
+    Py_RETURN_NONE;
+}
+
 MYFLT *
 SfMarkerShuffler_getSamplesBuffer(SfMarkerShuffler *self)
 {
@@ -1208,6 +1395,7 @@ static PyMethodDef SfMarkerShuffler_methods[] = {
 {"stop", (PyCFunction)SfMarkerShuffler_stop, METH_NOARGS, "Stops computing."},
 {"setSpeed", (PyCFunction)SfMarkerShuffler_setSpeed, METH_O, "Sets sfplayer reading speed."},
 {"setInterp", (PyCFunction)SfMarkerShuffler_setInterp, METH_O, "Sets sfplayer interpolation mode."},
+{"setRandomType", (PyCFunction)SfMarkerShuffler_setRandomType, METH_VARARGS|METH_KEYWORDS, "Sets sfplayer random type."},
 {NULL}  /* Sentinel */
 };
 
diff --git a/src/objects/utilsmodule.c b/src/objects/utilsmodule.c
index 662fc09..cab8d87 100644
--- a/src/objects/utilsmodule.c
+++ b/src/objects/utilsmodule.c
@@ -5605,7 +5605,7 @@ Resample_dealloc(Resample* self)
 {
     int i;
     pyo_DEALLOC
-    if (self->size > 0) {
+    if (self->size > self->factor) {
         for (i=0; i<self->factor; i++) {
             free(self->pimpulse[i]);
             free(self->pinput[i]);
diff --git a/utils/setup.py b/utils/setup.py
index 29ccb3b..0ac54f9 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.4',
+               'CFBundleInfoDictionaryVersion': '0.8.6',
                'CFBundleName': 'E-Pyo',
                'CFBundlePackageType': 'APPL',
-               'CFBundleShortVersionString': '0.8.4',
-               'CFBundleVersion': '0.8.4',
+               'CFBundleShortVersionString': '0.8.6',
+               'CFBundleVersion': '0.8.6',
                'CFBundleDocumentTypes': [{'CFBundleTypeOSTypes': ['TEXT'],
                                           'CFBundleTypeExtensions': ['py'],
                                           'CFBundleTypeRole': 'Editor',

-- 
python-pyo packaging



More information about the pkg-multimedia-commits mailing list