[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