[SCM] python-pyo/master: Imported Upstream version 0.7.5

tiago at users.alioth.debian.org tiago at users.alioth.debian.org
Tue Mar 24 00:26:54 UTC 2015


The following commit has been merged in the master branch:
commit 9f0c64216c3702f98150e7a063e9f826ee009a7d
Author: Tiago Bortoletto Vaz <tiago at debian.org>
Date:   Mon Mar 23 20:15:17 2015 -0400

    Imported Upstream version 0.7.5

diff --git a/COPYING.LESSER.txt b/COPYING.LESSER.txt
new file mode 100644
index 0000000..853047c
--- /dev/null
+++ b/COPYING.LESSER.txt
@@ -0,0 +1,165 @@
+                GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/ChangeLog b/ChangeLog
index 1e01dd5..0a20360 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,91 @@
+-------------------------------------------------------------------------------------
+2015-03-05 belangeo <belangeo at gmail.com>
+
+    * Fixed crash when portaudio stream is stopped on OSX (created when fixed
+	for Windows). Rev 1310 is the sources for 0.7.5 release.
+    - rev 1310
+
+2015-03-05 belangeo <belangeo at gmail.com>
+
+    * Release tag: 0.7.5.
+    - rev 1308
+
+2015-03-05 belangeo <belangeo at gmail.com>
+
+    * Added documentation for server methods setTimeCallable and setMeterCallable.
+    - rev 1304
+
+2015-03-05 belangeo <belangeo at gmail.com>
+
+    * Changed license to the more permissive LGPL version 3.
+    - rev 1303
+
+2015-03-03 belangeo <belangeo at gmail.com>
+
+    * The Server can be booted with a different number of input and output channels.
+    - rev 1301
+
+2015-03-03 belangeo <belangeo at gmail.com>
+
+    * Wraped input of Record in an InputFader object.
+    - rev 1300
+
+2015-03-03 belangeo <belangeo at gmail.com>
+
+    * Fixed bug in Hilbert object.
+    - rev 1299
+
+2015-02-18 belangeo <belangeo at gmail.com>
+
+    * Added mul, add and sub methods to PyoTableObject. These methods can 
+    take float, list or another PyoTableObject as argument.
+    - rev 1298
+
+2015-02-13 belangeo <belangeo at gmail.com>
+
+    * Added new objet: AtanTable, generates arctangent transfert functions.
+    - rev 1296
+
+2015-02-11 belangeo <belangeo at gmail.com>
+
+    * Fixed a bug when changing the looping mode of the Looper object.
+    - rev 1295
+
+2015-02-09 belangeo <belangeo at gmail.com>
+
+    * Added a reset method to the Looper objet.
+    - rev 1294
+
+2015-02-08 belangeo <belangeo at gmail.com>
+
+    * E-Pyo: Added a refresh button to actualize the content of the folder panel.
+    - rev 1292
+
+2015-02-07 belangeo <belangeo at gmail.com>
+
+    * E-Pyo: Added a menu item to set a master document (the one that will be executed whatever 
+    which one has the focus).
+    - rev 1291
+
+2015-02-03 belangeo <belangeo at gmail.com>
+
+    * Added getServer, getSamplingRate and getBufferSize to PyoObjectBase. These methods can be 
+    accessed from any pyo objects.
+    - rev 1290
+
+2015-02-03 belangeo <belangeo at gmail.com>
+
+    * Fixed a bug with class method referenced inside pyo object. Save them as weak reference, 
+    allowing the garbage collector to properly delete the objects when reference count falls to 0.
+    - rev 1289
+
+2015-02-02 belangeo <belangeo at gmail.com>
+
+    * Added new objet: TableWrite, records values in a table at arbitrary location.
+    - rev 1288
+
+-------------------------------------------------------------------------------------
+
 2015-01-29 belangeo <belangeo at gmail.com>
 
     * Release tag: 0.7.4
diff --git a/doc-sphinx/source/api/alphabetical.rst b/doc-sphinx/source/api/alphabetical.rst
index a67b7d7..b61616d 100644
--- a/doc-sphinx/source/api/alphabetical.rst
+++ b/doc-sphinx/source/api/alphabetical.rst
@@ -7,10 +7,11 @@ Alphabetical class reference
 - :py:class:`AToDB` :     Returns the decibel equivalent of an amplitude value.
 - :py:class:`Abs` :     Performs an absolute function on audio signal.
 - :py:class:`Adsr` :     Attack - Decay - Sustain - Release envelope generator.
-- :py:class:`Allpass2` :     Second-order phase shifter allpass. 
+- :py:class:`Allpass2` :     Second-order phase shifter allpass.
 - :py:class:`AllpassWG` :     Out of tune waveguide model with a recursive allpass network.
 - :py:class:`Allpass` :     Delay line based allpass filter.
 - :py:class:`Atan2` :     Computes the principal value of the arc tangent of b/a.
+- :py:class:`AtanTable` :     Generates an arctangent transfert function.
 - :py:class:`Atone` :     A first-order recursive high-pass filter with variable frequency response.
 - :py:class:`AttackDetector` :     Audio signal onset detection.
 - :py:class:`Average` :     Moving average filter.
@@ -19,9 +20,9 @@ Alphabetical class reference
 - :py:class:`Beat` :     Generates algorithmic trigger patterns.
 - :py:class:`Bendin` :     Get the current value of the pitch bend controller.
 - :py:class:`Between` :     Informs when an input signal is contained in a specified range.
-- :py:class:`Biquad` :     A sweepable general purpose biquadratic digital filter. 
+- :py:class:`Biquad` :     A sweepable general purpose biquadratic digital filter.
 - :py:class:`Biquada` :     A general purpose biquadratic digital filter (floating-point arguments).
-- :py:class:`Biquadx` :     A multi-stages sweepable general purpose biquadratic digital filter. 
+- :py:class:`Biquadx` :     A multi-stages sweepable general purpose biquadratic digital filter.
 - :py:class:`Blit` :     Band limited impulse train synthesis.
 - :py:class:`BrownNoise` :     A brown noise generator.
 - :py:class:`ButBP` :     A second-order Butterworth bandpass filter.
@@ -41,7 +42,7 @@ Alphabetical class reference
 - :py:class:`Clip` :     Clips a signal to a predefined limit.
 - :py:class:`Cloud` :     Generates random triggers.
 - :py:class:`Compare` :     Comparison object.
-- :py:class:`ComplexRes` :     Complex one-pole resonator filter. 
+- :py:class:`ComplexRes` :     Complex one-pole resonator filter.
 - :py:class:`Compress` :     Reduces the dynamic range of an audio signal.
 - :py:class:`ControlRead` :     Reads control values previously stored in text files.
 - :py:class:`ControlRec` :     Records control values and writes them in a text file.
@@ -65,10 +66,10 @@ Alphabetical class reference
 - :py:class:`Denorm` :     Mixes low level noise to an input signal.
 - :py:class:`Disto` :     Arc tangent distortion.
 - :py:class:`Dummy` :     Dummy object used to perform arithmetics on PyoObject.
-- :py:class:`EQ` :     Equalizer filter. 
+- :py:class:`EQ` :     Equalizer filter.
 - :py:class:`Euclide` :     Euclidean rhythm generator.
 - :py:class:`ExpTable` :     Construct a table from exponential interpolated segments.
-- :py:class:`Expseg` :     Trace a series of exponential segments between specified break-points. 
+- :py:class:`Expseg` :     Trace a series of exponential segments between specified break-points.
 - :py:class:`FFT` :     Fast Fourier Transform.
 - :py:class:`FM` :     A simple frequency modulation generator.
 - :py:class:`FToM` :     Returns the midi note equivalent to a frequency in Hz.
@@ -84,7 +85,7 @@ Alphabetical class reference
 - :py:class:`Gate` :     Allows a signal to pass only when its amplitude is above a set threshold.
 - :py:class:`Granulator` :     Granular synthesis generator.
 - :py:class:`Granule` :     Another granular synthesis generator.
-- :py:class:`HannTable` :     Generates Hanning window function. 
+- :py:class:`HannTable` :     Generates Hanning window function.
 - :py:class:`HarmTable` :     Harmonic waveform generator.
 - :py:class:`Harmonizer` :     Generates harmonizing voices in synchrony with its audio input.
 - :py:class:`Hilbert` :     Hilbert transform.
@@ -99,7 +100,7 @@ Alphabetical class reference
 - :py:class:`Iter` :     Triggers iterate over a list of values.
 - :py:class:`LFO` :     Band-limited Low Frequency Oscillator with different wave shapes.
 - :py:class:`LinTable` :     Construct a table from segments of straight lines in breakpoint fashion.
-- :py:class:`Linseg` :     Trace a series of line segments between specified break-points. 
+- :py:class:`Linseg` :     Trace a series of line segments between specified break-points.
 - :py:class:`Log10` :     Performs a base 10 log function on audio signal.
 - :py:class:`Log2` :     Performs a base 2 log function on audio signal.
 - :py:class:`LogTable` :     Construct a table from logarithmic segments in breakpoint fashion.
@@ -123,7 +124,7 @@ Alphabetical class reference
 - :py:class:`Mix` :     Mix audio streams to arbitrary number of streams.
 - :py:class:`Mixer` :     Audio mixer.
 - :py:class:`NewMatrix` :     Create a new matrix ready for recording.
-- :py:class:`NewTable` :     Create an empty table ready for recording. 
+- :py:class:`NewTable` :     Create an empty table ready for recording.
 - :py:class:`NextTrig` :     A trigger in the second stream opens a gate only for the next one in the first stream.
 - :py:class:`Noise` :     A white noise generator.
 - :py:class:`NoteinRead` :     Reads Notein values previously stored in text files.
@@ -157,13 +158,13 @@ Alphabetical class reference
 - :py:class:`PVTranspose` :     Transpose the frequency components of a pv stream.
 - :py:class:`PVVerb` :     Spectral domain reverberation.
 - :py:class:`Pan` :     Cosinus panner with control on the spread factor.
-- :py:class:`ParaTable` :     Generates parabola window function. 
+- :py:class:`ParaTable` :     Generates parabola window function.
 - :py:class:`PartialTable` :     Inharmonic waveform generator.
 - :py:class:`Particle` :     A full control granular synthesis generator.
 - :py:class:`Pattern` :     Periodically calls a Python function.
 - :py:class:`PeakAmp` :     Peak amplitude follower.
 - :py:class:`Percent` :     Lets pass a certain percentage of the input triggers.
-- :py:class:`Phaser` :     Multi-stages second-order phase shifter allpass filters. 
+- :py:class:`Phaser` :     Multi-stages second-order phase shifter allpass filters.
 - :py:class:`Phasor` :     A simple phase incrementor.
 - :py:class:`PinkNoise` :     A pink noise generator.
 - :py:class:`Pointer2` :     High quality table reader with control on the pointer position.
@@ -180,8 +181,8 @@ Alphabetical class reference
 - :py:class:`Randh` :     Periodic pseudo-random generator.
 - :py:class:`Randi` :     Periodic pseudo-random generator with interpolation.
 - :py:class:`Record` :     Writes input sound in an audio file on the disk.
-- :py:class:`Reson` :     A second-order resonant bandpass filter. 
-- :py:class:`Resonx` :     A multi-stages second-order resonant bandpass filter. 
+- :py:class:`Reson` :     A second-order resonant bandpass filter.
+- :py:class:`Resonx` :     A multi-stages second-order resonant bandpass filter.
 - :py:class:`Rossler` :     Chaotic attractor for the Rossler system.
 - :py:class:`Round` :     Rounds to the nearest integer value in a floating-point format.
 - :py:class:`SDelay` :     Simple delay without interpolation.
@@ -193,8 +194,8 @@ Alphabetical class reference
 - :py:class:`SLMapQ` :     SLMap with normalized values for a 'q' slider.
 - :py:class:`SPan` :     Simple equal power panner.
 - :py:class:`STRev` :     Stereo reverb.
-- :py:class:`SVF` :     Fourth-order state variable filter allowing continuous change of the filter type. 
-- :py:class:`SampHold` :     Performs a sample-and-hold operation on its input. 
+- :py:class:`SVF` :     Fourth-order state variable filter allowing continuous change of the filter type.
+- :py:class:`SampHold` :     Performs a sample-and-hold operation on its input.
 - :py:class:`SawTable` :     Sawtooth waveform generator.
 - :py:class:`Scale` :     Maps an input range of audio values to an output range.
 - :py:class:`Scope` :     Oscilloscope - audio waveform display.
@@ -208,7 +209,7 @@ Alphabetical class reference
 - :py:class:`SigTo` :     Convert numeric value to PyoObject signal with portamento.
 - :py:class:`Sig` :     Convert numeric value to PyoObject signal.
 - :py:class:`Sin` :     Performs a sine function on audio signal.
-- :py:class:`SincTable` :     Generates sinc window function. 
+- :py:class:`SincTable` :     Generates sinc window function.
 - :py:class:`SineLoop` :     A simple sine wave oscillator with feedback.
 - :py:class:`Sine` :     A simple sine wave oscillator.
 - :py:class:`SmoothDelay` :     Artifact free sweepable recursive delay.
@@ -226,13 +227,14 @@ Alphabetical class reference
 - :py:class:`TableRead` :     Simple waveform table reader.
 - :py:class:`TableRec` :     TableRec is for writing samples into a previously created NewTable.
 - :py:class:`TableScale` :     Scales all the values contained in a PyoTableObject.
+- :py:class:`TableWrite` :     TableWrite writes samples into a previously created NewTable.
 - :py:class:`Tan` :     Performs a tangent function on audio signal.
 - :py:class:`Tanh` :     Performs a hyperbolic tangent function on audio signal.
 - :py:class:`Thresh` :     Informs when a signal crosses a threshold.
 - :py:class:`Timer` :     Reports elapsed time between two trigs.
 - :py:class:`Tone` :     A first-order recursive low-pass filter with variable frequency response.
 - :py:class:`Touchin` :     Get the current value of an after-touch Midi controller.
-- :py:class:`TrackHold` :     Performs a track-and-hold operation on its input. 
+- :py:class:`TrackHold` :     Performs a track-and-hold operation on its input.
 - :py:class:`TranspoToCents` :     Returns the cents value equivalent of a transposition factor.
 - :py:class:`TrigBurst` :     Generates a time/amplitude expandable trigger pattern.
 - :py:class:`TrigChoice` :     Random generator from user's defined values.
@@ -250,11 +252,11 @@ Alphabetical class reference
 - :py:class:`Urn` :     Periodic pseudo-random integer generator without duplicates.
 - :py:class:`VarPort` :     Convert numeric value to PyoObject signal with portamento.
 - :py:class:`Vectral` :     Performs magnitude smoothing between successive frames.
-- :py:class:`Vocoder` :     Applies the spectral envelope of a first sound to the spectrum of a second sound. 
+- :py:class:`Vocoder` :     Applies the spectral envelope of a first sound to the spectrum of a second sound.
 - :py:class:`VoiceManager` :     Polyphony voice manager.
 - :py:class:`WGVerb` :     8 delay line mono FDN reverb.
 - :py:class:`Waveguide` :     Basic waveguide model.
-- :py:class:`WinTable` :     Generates different kind of windowing functions. 
+- :py:class:`WinTable` :     Generates different kind of windowing functions.
 - :py:class:`Wrap` :     Wraps-around the signal that exceeds the `min` and `max` thresholds.
 - :py:class:`XnoiseDur` :     Recursive time varying X-class pseudo-random generator.
 - :py:class:`XnoiseMidi` :     X-class midi notes pseudo-random generator.
diff --git a/doc-sphinx/source/api/classes/tableprocess.rst b/doc-sphinx/source/api/classes/tableprocess.rst
index c883866..8e9da9e 100644
--- a/doc-sphinx/source/api/classes/tableprocess.rst
+++ b/doc-sphinx/source/api/classes/tableprocess.rst
@@ -110,6 +110,12 @@ store audio samples or algorithmic sequences for future uses.
 .. autoclass:: TableRec
    :members:
 
+*TableWrite*
+-----------------------------------
+
+.. autoclass:: TableWrite
+   :members:
+
 *TableScale*
 -----------------------------------
 
diff --git a/doc-sphinx/source/api/classes/tables.rst b/doc-sphinx/source/api/classes/tables.rst
index 1891218..326aefa 100644
--- a/doc-sphinx/source/api/classes/tables.rst
+++ b/doc-sphinx/source/api/classes/tables.rst
@@ -114,3 +114,8 @@ in memory and access them quickly.
 .. autoclass:: WinTable
    :members:
 
+*AtanTable*
+-----------------------------------
+
+.. autoclass:: AtanTable
+   :members:
diff --git a/doc-sphinx/source/index.rst b/doc-sphinx/source/index.rst
index d2de0de..548d84b 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.7.4 documentation
+Welcome to the Pyo 0.7.5 documentation
 ===================================================
 
 .. toctree::
diff --git a/examples/tables/05_table_maker.py b/examples/tables/05_table_maker.py
index 7213bb3..fdcd0ae 100644
--- a/examples/tables/05_table_maker.py
+++ b/examples/tables/05_table_maker.py
@@ -13,7 +13,8 @@ path = "../snds/baseballmajeur_m.aif"
 dur = sndinfo(path)[1]
 
 t = SndTable(path, start=0, stop=1)
-a = Looper(t, pitch=[1.,1.], dur=t.getDur(), xfade=5, mul=.4).out()
+amp = Fader(fadein=0.005, fadeout=0.005, dur=0, mul=0.4).play()
+a = Looper(t, pitch=[1.,1.], dur=t.getDur(), xfade=5, mul=amp).out()
 
 def addsnd():
     start = random.uniform(0, dur*0.7)
@@ -22,14 +23,20 @@ def addsnd():
     cross = random.uniform(0.04, duration/2)
     t.insert(path, pos=pos, crossfade=cross, start=start, stop=start+duration)
 
-def gen():
+def delayed_generation():
     start = random.uniform(0, dur*0.7)
     duration = random.uniform(.1, .3)
     t.setSound(path, start=start, stop=start+duration)
     for i in range(10):
         addsnd()
-
     a.dur = t.getDur()
+    a.reset()
+    amp.play()
+
+caller = CallAfter(function=delayed_generation, time=0.005).stop()
+def gen():
+    amp.stop()
+    caller.play()
 
 gen()
 
diff --git a/include/dummymodule.h b/include/dummymodule.h
index e082a70..8ce3436 100644
--- a/include/dummymodule.h
+++ b/include/dummymodule.h
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -25,7 +25,7 @@ typedef struct {
     pyo_audio_HEAD
     PyObject *input;
     Stream *input_stream;
-    int modebuffer[2]; // need at least 2 slots for mul & add 
+    int modebuffer[2]; // need at least 2 slots for mul & add
 } Dummy;
 
 extern PyObject * Dummy_initialize(Dummy *self);
@@ -33,4 +33,3 @@ extern PyObject * Dummy_initialize(Dummy *self);
 #define MAKE_NEW_DUMMY(self, type, rt_error)	\
 (self) = (Dummy *)(type)->tp_alloc((type), 0);	\
 if ((self) == rt_error) { return rt_error; }
-
diff --git a/include/fft.h b/include/fft.h
index 99f8d7d..a7019b5 100644
--- a/include/fft.h
+++ b/include/fft.h
@@ -1,29 +1,29 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 #include "pyomodule.h"
- 
+
 #ifndef _FFT_
 #define _FFT_
 /* in-place split-radix real fft */
 void realfft_split(MYFLT *data, MYFLT *outdata, int n, MYFLT **twiddle);
-void irealfft_split(MYFLT *data, MYFLT *outdata, int n, MYFLT **twiddle); 
+void irealfft_split(MYFLT *data, MYFLT *outdata, int n, MYFLT **twiddle);
 void fft_compute_split_twiddle(MYFLT **twiddle, int size);
 void fft_compute_window(MYFLT *window, int size, int wintype);
 /* in-place radix-2 real fft (not used actually) */
@@ -33,4 +33,3 @@ void irealfft_packed(MYFLT *data, MYFLT *outdata, int size, MYFLT *twiddle);
 void fft_compute_split_twiddle(MYFLT **twiddle, int size);
 void fft_compute_radix2_twiddle(MYFLT *twiddle, int size);
 #endif
-
diff --git a/include/interpolation.h b/include/interpolation.h
index 370c02c..5b3d042 100644
--- a/include/interpolation.h
+++ b/include/interpolation.h
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 #include "pyomodule.h"
 
diff --git a/include/matrixmodule.h b/include/matrixmodule.h
index abcb1c3..72f5593 100644
--- a/include/matrixmodule.h
+++ b/include/matrixmodule.h
@@ -1,21 +1,21 @@
- /*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
  *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
  * processing script creation.                                            *
  *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    *
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
  * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include "Python.h"
diff --git a/include/pvstreammodule.h b/include/pvstreammodule.h
index 5194e3e..d4ceb23 100644
--- a/include/pvstreammodule.h
+++ b/include/pvstreammodule.h
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -56,6 +56,6 @@ extern PyTypeObject PVStreamType;
 /* include from other modules to use API */
 
 // #define Stream_setStreamObject(op, v) (((Stream *)(op))->streamobject = (v))
- 
+
 #endif
 /* __PVSTREAMMODULE */
\ No newline at end of file
diff --git a/include/pyomodule.h b/include/pyomodule.h
index a8b9c71..e6f8ee1 100644
--- a/include/pyomodule.h
+++ b/include/pyomodule.h
@@ -1,27 +1,27 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include "Python.h"
 #include <math.h>
 
-#define PYO_VERSION "0.7.4"
+#define PYO_VERSION "0.7.5"
 
 #ifndef __MYFLT_DEF
 #define __MYFLT_DEF
@@ -344,6 +344,7 @@ extern PyTypeObject SndTableType;
 extern PyTypeObject DataTableType;
 extern PyTypeObject NewTableType;
 extern PyTypeObject TableRecType;
+extern PyTypeObject TableWriteType;
 extern PyTypeObject TableRecTimeStreamType;
 extern PyTypeObject TableMorphType;
 extern PyTypeObject TrigTableRecType;
@@ -483,6 +484,7 @@ extern PyTypeObject ScopeType;
 extern PyTypeObject PeakAmpType;
 extern PyTypeObject MainParticleType;
 extern PyTypeObject ParticleType;
+extern PyTypeObject AtanTableType;
 
 /* Constants */
 #define E M_E
@@ -538,8 +540,9 @@ extern PyTypeObject ParticleType;
     Stream *add_stream; \
     int bufsize; \
     int nchnls; \
+    int ichnls; \
     double sr; \
-    MYFLT *data; 
+    MYFLT *data;
 
 #define pyo_table_HEAD \
     PyObject_HEAD \
@@ -564,7 +567,7 @@ extern PyTypeObject ParticleType;
     Py_VISIT(self->mul); \
     Py_VISIT(self->mul_stream); \
     Py_VISIT(self->add); \
-    Py_VISIT(self->add_stream);    
+    Py_VISIT(self->add_stream);
 
 #define pyo_table_VISIT \
     if (PyServer_get_server() != NULL) \
@@ -637,6 +640,7 @@ extern PyTypeObject ParticleType;
     self->bufsize = PyInt_AsLong(PyObject_CallMethod(self->server, "getBufferSize", NULL)); \
     self->sr = PyFloat_AsDouble(PyObject_CallMethod(self->server, "getSamplingRate", NULL)); \
     self->nchnls = PyInt_AsLong(PyObject_CallMethod(self->server, "getNchnls", NULL)); \
+    self->ichnls = PyInt_AsLong(PyObject_CallMethod(self->server, "getIchnls", NULL)); \
     self->data = (MYFLT *)realloc(self->data, (self->bufsize) * sizeof(MYFLT)); \
     for (i=0; i<self->bufsize; i++) \
         self->data[i] = 0.0; \
@@ -715,7 +719,115 @@ extern PyTypeObject ParticleType;
     } \
     self->data[self->size] = self->data[0]; \
     Py_RETURN_NONE; \
-    
+
+#define TABLE_ADD \
+    int i, tabsize; \
+    MYFLT x = 0.0; \
+    MYFLT *list = NULL; \
+    PyObject *table = NULL; \
+    if (PyNumber_Check(arg)) { \
+        x = PyFloat_AsDouble(PyNumber_Float(arg)); \
+        for (i=0; i<self->size; i++) { \
+            self->data[i] += x; \
+        } \
+    } \
+    else if ( PyObject_HasAttrString((PyObject *)arg, "getTableStream") == 1 ) { \
+        Py_XDECREF(table); \
+        table = PyObject_CallMethod((PyObject *)arg, "getTableStream", ""); \
+        list = TableStream_getData((TableStream *)table); \
+        tabsize = TableStream_getSize((TableStream *)table); \
+        if (self->size < tabsize) \
+            tabsize = self->size; \
+        for (i=0; i<tabsize; i++) { \
+            self->data[i] += list[i]; \
+        } \
+    } \
+    else if (PyList_Check(arg)) { \
+        tabsize = PyList_Size(arg); \
+        if (self->size < tabsize) \
+            tabsize = self->size; \
+        for (i=0; i<tabsize; i++) { \
+            self->data[i] += PyFloat_AS_DOUBLE(PyNumber_Float(PyList_GET_ITEM(arg, i))); \
+        } \
+    } \
+ \
+    self->data[self->size] = self->data[0]; \
+ \
+    Py_INCREF(Py_None); \
+    return Py_None; \
+
+#define TABLE_SUB \
+    int i, tabsize; \
+    MYFLT x = 0.0; \
+    MYFLT *list = NULL; \
+    PyObject *table = NULL; \
+    if (PyNumber_Check(arg)) { \
+        x = PyFloat_AsDouble(PyNumber_Float(arg)); \
+        for (i=0; i<self->size; i++) { \
+            self->data[i] -= x; \
+        } \
+    } \
+    else if ( PyObject_HasAttrString((PyObject *)arg, "getTableStream") == 1 ) { \
+        Py_XDECREF(table); \
+        table = PyObject_CallMethod((PyObject *)arg, "getTableStream", ""); \
+        list = TableStream_getData((TableStream *)table); \
+        tabsize = TableStream_getSize((TableStream *)table); \
+        if (self->size < tabsize) \
+            tabsize = self->size; \
+        for (i=0; i<tabsize; i++) { \
+            self->data[i] -= list[i]; \
+        } \
+    } \
+    else if (PyList_Check(arg)) { \
+        tabsize = PyList_Size(arg); \
+        if (self->size < tabsize) \
+            tabsize = self->size; \
+        for (i=0; i<tabsize; i++) { \
+            self->data[i] -= PyFloat_AS_DOUBLE(PyNumber_Float(PyList_GET_ITEM(arg, i))); \
+        } \
+    } \
+ \
+    self->data[self->size] = self->data[0]; \
+ \
+    Py_INCREF(Py_None); \
+    return Py_None; \
+
+#define TABLE_MUL \
+    int i, tabsize; \
+    MYFLT x = 0.0; \
+    MYFLT *list = NULL; \
+    PyObject *table = NULL; \
+    if (PyNumber_Check(arg)) { \
+        x = PyFloat_AsDouble(PyNumber_Float(arg)); \
+        for (i=0; i<self->size; i++) { \
+            self->data[i] *= x; \
+        } \
+    } \
+    else if ( PyObject_HasAttrString((PyObject *)arg, "getTableStream") == 1 ) { \
+        Py_XDECREF(table); \
+        table = PyObject_CallMethod((PyObject *)arg, "getTableStream", ""); \
+        list = TableStream_getData((TableStream *)table); \
+        tabsize = TableStream_getSize((TableStream *)table); \
+        if (self->size < tabsize) \
+            tabsize = self->size; \
+        for (i=0; i<tabsize; i++) { \
+            self->data[i] *= list[i]; \
+        } \
+    } \
+    else if (PyList_Check(arg)) { \
+        tabsize = PyList_Size(arg); \
+        if (self->size < tabsize) \
+            tabsize = self->size; \
+        for (i=0; i<tabsize; i++) { \
+            self->data[i] *= PyFloat_AS_DOUBLE(PyNumber_Float(PyList_GET_ITEM(arg, i))); \
+        } \
+    } \
+ \
+    self->data[self->size] = self->data[0]; \
+ \
+    Py_INCREF(Py_None); \
+    return Py_None; \
+
 #define SET_TABLE \
     int i; \
     if (arg == NULL) { \
@@ -1012,10 +1124,10 @@ extern PyTypeObject ParticleType;
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_F_I, kwlist, &val, &pos)) \
         return PyInt_FromLong(-1); \
  \
-    if (pos >= self->size) { \
-        PyErr_SetString(PyExc_TypeError, "position outside of table boundaries!."); \
-        return PyInt_FromLong(-1); \
-    } \
+    if (pos >= self->size) \
+        pos = self->size - 1; \
+    else if (pos < 0) \
+        pos = 0; \
  \
     self->data[pos] = val; \
  \
@@ -1207,7 +1319,7 @@ extern PyTypeObject ParticleType;
     (*self->mode_func_ptr)(self); \
  \
     Py_INCREF(Py_None); \
-    return Py_None; 
+    return Py_None;
 
 #define SET_ADD \
     PyObject *tmp, *streamtmp; \
@@ -1238,7 +1350,7 @@ extern PyTypeObject ParticleType;
     (*self->mode_func_ptr)(self); \
 \
     Py_INCREF(Py_None); \
-    return Py_None; 
+    return Py_None;
 
 #define SET_SUB \
     PyObject *tmp, *streamtmp; \
@@ -1269,7 +1381,7 @@ extern PyTypeObject ParticleType;
     (*self->mode_func_ptr)(self); \
  \
     Py_INCREF(Py_None); \
-    return Py_None; 
+    return Py_None;
 
 #define SET_DIV \
     PyObject *tmp, *streamtmp; \
@@ -1303,7 +1415,7 @@ extern PyTypeObject ParticleType;
     (*self->mode_func_ptr)(self); \
  \
     Py_INCREF(Py_None); \
-    return Py_None; 
+    return Py_None;
 
 /* Multiply, Add, inplace_multiply & inplace_add */
 #define MULTIPLY \
@@ -1430,7 +1542,7 @@ extern PyTypeObject ParticleType;
         self->data[i] = 0; \
     } \
     Py_INCREF(Py_None); \
-    return Py_None;    
+    return Py_None;
 
 /* Post processing (mul & add) macros */
 #define POST_PROCESSING_II \
@@ -1466,7 +1578,7 @@ extern PyTypeObject ParticleType;
         old = self->data[i]; \
         val = mul * old + add[i]; \
         self->data[i] = val; \
-    } 
+    }
 
 #define POST_PROCESSING_AA \
     MYFLT old, val; \
@@ -1516,7 +1628,7 @@ extern PyTypeObject ParticleType;
         old = self->data[i]; \
         val = mul * old - add[i]; \
         self->data[i] = val; \
-    } 
+    }
 
 #define POST_PROCESSING_AREVA \
     MYFLT old, val; \
@@ -1542,4 +1654,3 @@ extern PyTypeObject ParticleType;
         val = old / tmp - add[i]; \
         self->data[i] = val; \
     }
-
diff --git a/include/servermodule.h b/include/servermodule.h
index 0fedc69..91e9d22 100644
--- a/include/servermodule.h
+++ b/include/servermodule.h
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *                                                                        *
  * Octobre 2013 : Multiple servers facility and embeded backend added by  *
  * Guillaume Barrette. See embeded possibilities at:                      *
@@ -61,7 +61,7 @@ typedef struct {
     jack_port_t **jack_out_ports;
 #endif
 } PyoJackBackendData;
-  
+
 typedef struct {
     PyObject_HEAD
     PyObject *streams;
@@ -80,6 +80,7 @@ typedef struct {
     int midi_count;
     double samplingRate;
     int nchnls;
+    int ichnls;
     int bufferSize;
     int duplex;
     int input;
@@ -96,7 +97,7 @@ typedef struct {
     int stream_count;
     int record;
     int thisServerID;       /* To keep the reference index in the array of servers */
-    
+
     /* global amplitude */
     MYFLT amp;
     MYFLT resetAmp;
@@ -105,13 +106,13 @@ typedef struct {
     MYFLT stepVal;
     int timeStep;
     int timeCount;
-    
+
     MYFLT *input_buffer;
     float *output_buffer; /* Has to be float since audio callbacks must use floats */
-    
+
     /* rendering offline of the first "startoffset" seconds */
     double startoffset;
-    
+
     /* rendering settings */
     double recdur;
     char *recpath;
@@ -119,7 +120,7 @@ typedef struct {
     int rectype;
     SNDFILE *recfile;
     SF_INFO recinfo;
-    
+
     /* GUI VUMETER */
     int withGUI;
     int numPass;
@@ -133,7 +134,7 @@ typedef struct {
     int timePass;
     int tcount;
     PyObject *TIME;
-    
+
     /* Properties */
     int verbosity; /* a sum of values to display different levels: 1 = error */
                    /* 2 = message, 4 = warning , 8 = debug. Default 7.*/
@@ -142,15 +143,14 @@ typedef struct {
 
 PyObject * PyServer_get_server();
 extern PyObject * Server_removeStream(Server *self, int sid);
-extern MYFLT * Server_getInputBuffer(Server *self);    
-extern PmEvent * Server_getMidiEventBuffer(Server *self);    
-extern int Server_getMidiEventCount(Server *self);  
+extern MYFLT * Server_getInputBuffer(Server *self);
+extern PmEvent * Server_getMidiEventBuffer(Server *self);
+extern int Server_getMidiEventCount(Server *self);
 extern int Server_generateSeed(Server *self, int oid);
-extern PyTypeObject ServerType;    
+extern PyTypeObject ServerType;
 
 #ifdef __cplusplus
 }
 #endif
 
 #endif /* !defined(Py_SERVERMODULE_H) */
-
diff --git a/include/streammodule.h b/include/streammodule.h
index 4febd94..78a8fa3 100644
--- a/include/streammodule.h
+++ b/include/streammodule.h
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -87,6 +87,6 @@ extern PyTypeObject TriggerStreamType;
 #define Stream_setBufferCountWait(op, v) (((Stream *)(op))->bufferCountWait = (v))
 #define Stream_setDuration(op, v) (((Stream *)(op))->duration = (v))
 #define Stream_setBufferSize(op, v) (((Stream *)(op))->bufsize = (v))
- 
+
 #endif
-/* __STREAMMODULE */
+/* __STREAMMODULE */
\ No newline at end of file
diff --git a/include/tablemodule.h b/include/tablemodule.h
index 8b2dccf..26e2ac5 100644
--- a/include/tablemodule.h
+++ b/include/tablemodule.h
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include "Python.h"
@@ -44,4 +44,4 @@ double TableStream_getSamplingRate(PyObject *self);
 MYFLT * TableStream_getData(PyObject *self);
 extern PyTypeObject TableStreamType;
 
-#endif
+#endif
\ No newline at end of file
diff --git a/include/wind.h b/include/wind.h
index c7c939b..bc3658d 100644
--- a/include/wind.h
+++ b/include/wind.h
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2011 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *                                                                        *
  * Envelope window generator :                                            *
  *      0 : Rectangular (no window)                                       *
@@ -28,10 +28,10 @@
  *      7 : Tuckey (alpha = 0.66)                                         *
  *      8 : Sine (half-sine window)                                       *
  *************************************************************************/
+
 #include "pyomodule.h"
- 
+
 #ifndef _WIND_
 #define _WIND_
 void gen_window(MYFLT *window, int size, int wintype);
 #endif
-
diff --git a/installers/osx/PkgResources_x86_64/License.rtf b/installers/osx/PkgResources_x86_64/License.rtf
index 66b2d2a..50a49ab 100755
--- a/installers/osx/PkgResources_x86_64/License.rtf
+++ b/installers/osx/PkgResources_x86_64/License.rtf
@@ -1,681 +1,423 @@
-{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fnil\fcharset0 LucidaGrande;}
-{\colortbl;\red255\green255\blue255;}
-\margl1440\margr1440\vieww10100\viewh11340\viewkind0
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
-
-\f0\fs26 \cf0                     GNU GENERAL PUBLIC LICENSE\
-                       Version 3, 29 June 2007\
-\
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\
- Everyone is permitted to copy and distribute verbatim copies\
- of this license document, but changing it is not allowed.\
-\
-                            Preamble\
-\
-  The GNU General Public License is a free, copyleft license for\
-software and other kinds of works.\
-\
-  The licenses for most software and other practical works are designed\
-to take away your freedom to share and change the works.  By contrast,\
-the GNU General Public License is intended to guarantee your freedom to\
-share and change all versions of a program--to make sure it remains free\
-software for all its users.  We, the Free Software Foundation, use the\
-GNU General Public License for most of our software; it applies also to\
-any other work released this way by its authors.  You can apply it to\
-your programs, too.\
-\
-  When we speak of free software, we are referring to freedom, not\
-price.  Our General Public Licenses are designed to make sure that you\
-have the freedom to distribute copies of free software (and charge for\
-them if you wish), that you receive source code or can get it if you\
-want it, that you can change the software or use pieces of it in new\
-free programs, and that you know you can do these things.\
-\
-  To protect your rights, we need to prevent others from denying you\
-these rights or asking you to surrender the rights.  Therefore, you have\
-certain responsibilities if you distribute copies of the software, or if\
-you modify it: responsibilities to respect the freedom of others.\
-\
-  For example, if you distribute copies of such a program, whether\
-gratis or for a fee, you must pass on to the recipients the same\
-freedoms that you received.  You must make sure that they, too, receive\
-or can get the source code.  And you must show them these terms so they\
-know their rights.\
-\
-  Developers that use the GNU GPL protect your rights with two steps:\
-(1) assert copyright on the software, and (2) offer you this License\
-giving you legal permission to copy, distribute and/or modify it.\
-\
-  For the developers' and authors' protection, the GPL clearly explains\
-that there is no warranty for this free software.  For both users' and\
-authors' sake, the GPL requires that modified versions be marked as\
-changed, so that their problems will not be attributed erroneously to\
-authors of previous versions.\
-\
-  Some devices are designed to deny users access to install or run\
-modified versions of the software inside them, although the manufacturer\
-can do so.  This is fundamentally incompatible with the aim of\
-protecting users' freedom to change the software.  The systematic\
-pattern of such abuse occurs in the area of products for individuals to\
-use, which is precisely where it is most unacceptable.  Therefore, we\
-have designed this version of the GPL to prohibit the practice for those\
-products.  If such problems arise substantially in other domains, we\
-stand ready to extend this provision to those domains in future versions\
-of the GPL, as needed to protect the freedom of users.\
-\
-  Finally, every program is threatened constantly by software patents.\
-States should not allow patents to restrict development and use of\
-software on general-purpose computers, but in those that do, we wish to\
-avoid the special danger that patents applied to a free program could\
-make it effectively proprietary.  To prevent this, the GPL assures that\
-patents cannot be used to render the program non-free.\
-\
-  The precise terms and conditions for copying, distribution and\
-modification follow.\
-\
-                       TERMS AND CONDITIONS\
-\
-  0. Definitions.\
-\
-  "This License" refers to version 3 of the GNU General Public License.\
-\
-  "Copyright" also means copyright-like laws that apply to other kinds of\
-works, such as semiconductor masks.\
-\
-  "The Program" refers to any copyrightable work licensed under this\
-License.  Each licensee is addressed as "you".  "Licensees" and\
-"recipients" may be individuals or organizations.\
-\
-  To "modify" a work means to copy from or adapt all or part of the work\
-in a fashion requiring copyright permission, other than the making of an\
-exact copy.  The resulting work is called a "modified version" of the\
-earlier work or a work "based on" the earlier work.\
-\
-  A "covered work" means either the unmodified Program or a work based\
-on the Program.\
-\
-  To "propagate" a work means to do anything with it that, without\
-permission, would make you directly or secondarily liable for\
-infringement under applicable copyright law, except executing it on a\
-computer or modifying a private copy.  Propagation includes copying,\
-distribution (with or without modification), making available to the\
-public, and in some countries other activities as well.\
-\
-  To "convey" a work means any kind of propagation that enables other\
-parties to make or receive copies.  Mere interaction with a user through\
-a computer network, with no transfer of a copy, is not conveying.\
-\
-  An interactive user interface displays "Appropriate Legal Notices"\
-to the extent that it includes a convenient and prominently visible\
-feature that (1) displays an appropriate copyright notice, and (2)\
-tells the user that there is no warranty for the work (except to the\
-extent that warranties are provided), that licensees may convey the\
-work under this License, and how to view a copy of this License.  If\
-the interface presents a list of user commands or options, such as a\
-menu, a prominent item in the list meets this criterion.\
-\
-  1. Source Code.\
-\
-  The "source code" for a work means the preferred form of the work\
-for making modifications to it.  "Object code" means any non-source\
-form of a work.\
-\
-  A "Standard Interface" means an interface that either is an official\
-standard defined by a recognized standards body, or, in the case of\
-interfaces specified for a particular programming language, one that\
-is widely used among developers working in that language.\
-\
-  The "System Libraries" of an executable work include anything, other\
-than the work as a whole, that (a) is included in the normal form of\
-packaging a Major Component, but which is not part of that Major\
-Component, and (b) serves only to enable use of the work with that\
-Major Component, or to implement a Standard Interface for which an\
-implementation is available to the public in source code form.  A\
-"Major Component", in this context, means a major essential component\
-(kernel, window system, and so on) of the specific operating system\
-(if any) on which the executable work runs, or a compiler used to\
-produce the work, or an object code interpreter used to run it.\
-\
-  The "Corresponding Source" for a work in object code form means all\
-the source code needed to generate, install, and (for an executable\
-work) run the object code and to modify the work, including scripts to\
-control those activities.  However, it does not include the work's\
-System Libraries, or general-purpose tools or generally available free\
-programs which are used unmodified in performing those activities but\
-which are not part of the work.  For example, Corresponding Source\
-includes interface definition files associated with source files for\
-the work, and the source code for shared libraries and dynamically\
-linked subprograms that the work is specifically designed to require,\
-such as by intimate data communication or control flow between those\
-subprograms and other parts of the work.\
-\
-  The Corresponding Source need not include anything that users\
-can regenerate automatically from other parts of the Corresponding\
-Source.\
-\
-  The Corresponding Source for a work in source code form is that\
-same work.\
-\
-  2. Basic Permissions.\
-\
-  All rights granted under this License are granted for the term of\
-copyright on the Program, and are irrevocable provided the stated\
-conditions are met.  This License explicitly affirms your unlimited\
-permission to run the unmodified Program.  The output from running a\
-covered work is covered by this License only if the output, given its\
-content, constitutes a covered work.  This License acknowledges your\
-rights of fair use or other equivalent, as provided by copyright law.\
-\
-  You may make, run and propagate covered works that you do not\
-convey, without conditions so long as your license otherwise remains\
-in force.  You may convey covered works to others for the sole purpose\
-of having them make modifications exclusively for you, or provide you\
-with facilities for running those works, provided that you comply with\
-the terms of this License in conveying all material for which you do\
-not control copyright.  Those thus making or running the covered works\
-for you must do so exclusively on your behalf, under your direction\
-and control, on terms that prohibit them from making any copies of\
-your copyrighted material outside their relationship with you.\
-\
-  Conveying under any other circumstances is permitted solely under\
-the conditions stated below.  Sublicensing is not allowed; section 10\
-makes it unnecessary.\
-\
-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\
-\
-  No covered work shall be deemed part of an effective technological\
-measure under any applicable law fulfilling obligations under article\
-11 of the WIPO copyright treaty adopted on 20 December 1996, or\
-similar laws prohibiting or restricting circumvention of such\
-measures.\
-\
-  When you convey a covered work, you waive any legal power to forbid\
-circumvention of technological measures to the extent such circumvention\
-is effected by exercising rights under this License with respect to\
-the covered work, and you disclaim any intention to limit operation or\
-modification of the work as a means of enforcing, against the work's\
-users, your or third parties' legal rights to forbid circumvention of\
-technological measures.\
-\
-  4. Conveying Verbatim Copies.\
-\
-  You may convey verbatim copies of the Program's source code as you\
-receive it, in any medium, provided that you conspicuously and\
-appropriately publish on each copy an appropriate copyright notice;\
-keep intact all notices stating that this License and any\
-non-permissive terms added in accord with section 7 apply to the code;\
-keep intact all notices of the absence of any warranty; and give all\
-recipients a copy of this License along with the Program.\
-\
-  You may charge any price or no price for each copy that you convey,\
-and you may offer support or warranty protection for a fee.\
-\
-  5. Conveying Modified Source Versions.\
-\
-  You may convey a work based on the Program, or the modifications to\
-produce it from the Program, in the form of source code under the\
-terms of section 4, provided that you also meet all of these conditions:\
-\
-    a) The work must carry prominent notices stating that you modified\
-    it, and giving a relevant date.\
-\
-    b) The work must carry prominent notices stating that it is\
-    released under this License and any conditions added under section\
-    7.  This requirement modifies the requirement in section 4 to\
-    "keep intact all notices".\
-\
-    c) You must license the entire work, as a whole, under this\
-    License to anyone who comes into possession of a copy.  This\
-    License will therefore apply, along with any applicable section 7\
-    additional terms, to the whole of the work, and all its parts,\
-    regardless of how they are packaged.  This License gives no\
-    permission to license the work in any other way, but it does not\
-    invalidate such permission if you have separately received it.\
-\
-    d) If the work has interactive user interfaces, each must display\
-    Appropriate Legal Notices; however, if the Program has interactive\
-    interfaces that do not display Appropriate Legal Notices, your\
-    work need not make them do so.\
-\
-  A compilation of a covered work with other separate and independent\
-works, which are not by their nature extensions of the covered work,\
-and which are not combined with it such as to form a larger program,\
-in or on a volume of a storage or distribution medium, is called an\
-"aggregate" if the compilation and its resulting copyright are not\
-used to limit the access or legal rights of the compilation's users\
-beyond what the individual works permit.  Inclusion of a covered work\
-in an aggregate does not cause this License to apply to the other\
-parts of the aggregate.\
-\
-  6. Conveying Non-Source Forms.\
-\
-  You may convey a covered work in object code form under the terms\
-of sections 4 and 5, provided that you also convey the\
-machine-readable Corresponding Source under the terms of this License,\
-in one of these ways:\
-\
-    a) Convey the object code in, or embodied in, a physical product\
-    (including a physical distribution medium), accompanied by the\
-    Corresponding Source fixed on a durable physical medium\
-    customarily used for software interchange.\
-\
-    b) Convey the object code in, or embodied in, a physical product\
-    (including a physical distribution medium), accompanied by a\
-    written offer, valid for at least three years and valid for as\
-    long as you offer spare parts or customer support for that product\
-    model, to give anyone who possesses the object code either (1) a\
-    copy of the Corresponding Source for all the software in the\
-    product that is covered by this License, on a durable physical\
-    medium customarily used for software interchange, for a price no\
-    more than your reasonable cost of physically performing this\
-    conveying of source, or (2) access to copy the\
-    Corresponding Source from a network server at no charge.\
-\
-    c) Convey individual copies of the object code with a copy of the\
-    written offer to provide the Corresponding Source.  This\
-    alternative is allowed only occasionally and noncommercially, and\
-    only if you received the object code with such an offer, in accord\
-    with subsection 6b.\
-\
-    d) Convey the object code by offering access from a designated\
-    place (gratis or for a charge), and offer equivalent access to the\
-    Corresponding Source in the same way through the same place at no\
-    further charge.  You need not require recipients to copy the\
-    Corresponding Source along with the object code.  If the place to\
-    copy the object code is a network server, the Corresponding Source\
-    may be on a different server (operated by you or a third party)\
-    that supports equivalent copying facilities, provided you maintain\
-    clear directions next to the object code saying where to find the\
-    Corresponding Source.  Regardless of what server hosts the\
-    Corresponding Source, you remain obligated to ensure that it is\
-    available for as long as needed to satisfy these requirements.\
-\
-    e) Convey the object code using peer-to-peer transmission, provided\
-    you inform other peers where the object code and Corresponding\
-    Source of the work are being offered to the general public at no\
-    charge under subsection 6d.\
-\
-  A separable portion of the object code, whose source code is excluded\
-from the Corresponding Source as a System Library, need not be\
-included in conveying the object code work.\
-\
-  A "User Product" is either (1) a "consumer product", which means any\
-tangible personal property which is normally used for personal, family,\
-or household purposes, or (2) anything designed or sold for incorporation\
-into a dwelling.  In determining whether a product is a consumer product,\
-doubtful cases shall be resolved in favor of coverage.  For a particular\
-product received by a particular user, "normally used" refers to a\
-typical or common use of that class of product, regardless of the status\
-of the particular user or of the way in which the particular user\
-actually uses, or expects or is expected to use, the product.  A product\
-is a consumer product regardless of whether the product has substantial\
-commercial, industrial or non-consumer uses, unless such uses represent\
-the only significant mode of use of the product.\
-\
-  "Installation Information" for a User Product means any methods,\
-procedures, authorization keys, or other information required to install\
-and execute modified versions of a covered work in that User Product from\
-a modified version of its Corresponding Source.  The information must\
-suffice to ensure that the continued functioning of the modified object\
-code is in no case prevented or interfered with solely because\
-modification has been made.\
-\
-  If you convey an object code work under this section in, or with, or\
-specifically for use in, a User Product, and the conveying occurs as\
-part of a transaction in which the right of possession and use of the\
-User Product is transferred to the recipient in perpetuity or for a\
-fixed term (regardless of how the transaction is characterized), the\
-Corresponding Source conveyed under this section must be accompanied\
-by the Installation Information.  But this requirement does not apply\
-if neither you nor any third party retains the ability to install\
-modified object code on the User Product (for example, the work has\
-been installed in ROM).\
-\
-  The requirement to provide Installation Information does not include a\
-requirement to continue to provide support service, warranty, or updates\
-for a work that has been modified or installed by the recipient, or for\
-the User Product in which it has been modified or installed.  Access to a\
-network may be denied when the modification itself materially and\
-adversely affects the operation of the network or violates the rules and\
-protocols for communication across the network.\
-\
-  Corresponding Source conveyed, and Installation Information provided,\
-in accord with this section must be in a format that is publicly\
-documented (and with an implementation available to the public in\
-source code form), and must require no special password or key for\
-unpacking, reading or copying.\
-\
-  7. Additional Terms.\
-\
-  "Additional permissions" are terms that supplement the terms of this\
-License by making exceptions from one or more of its conditions.\
-Additional permissions that are applicable to the entire Program shall\
-be treated as though they were included in this License, to the extent\
-that they are valid under applicable law.  If additional permissions\
-apply only to part of the Program, that part may be used separately\
-under those permissions, but the entire Program remains governed by\
-this License without regard to the additional permissions.\
-\
-  When you convey a copy of a covered work, you may at your option\
-remove any additional permissions from that copy, or from any part of\
-it.  (Additional permissions may be written to require their own\
-removal in certain cases when you modify the work.)  You may place\
-additional permissions on material, added by you to a covered work,\
-for which you have or can give appropriate copyright permission.\
-\
-  Notwithstanding any other provision of this License, for material you\
-add to a covered work, you may (if authorized by the copyright holders of\
-that material) supplement the terms of this License with terms:\
-\
-    a) Disclaiming warranty or limiting liability differently from the\
-    terms of sections 15 and 16 of this License; or\
-\
-    b) Requiring preservation of specified reasonable legal notices or\
-    author attributions in that material or in the Appropriate Legal\
-    Notices displayed by works containing it; or\
-\
-    c) Prohibiting misrepresentation of the origin of that material, or\
-    requiring that modified versions of such material be marked in\
-    reasonable ways as different from the original version; or\
-\
-    d) Limiting the use for publicity purposes of names of licensors or\
-    authors of the material; or\
-\
-    e) Declining to grant rights under trademark law for use of some\
-    trade names, trademarks, or service marks; or\
-\
-    f) Requiring indemnification of licensors and authors of that\
-    material by anyone who conveys the material (or modified versions of\
-    it) with contractual assumptions of liability to the recipient, for\
-    any liability that these contractual assumptions directly impose on\
-    those licensors and authors.\
-\
-  All other non-permissive additional terms are considered "further\
-restrictions" within the meaning of section 10.  If the Program as you\
-received it, or any part of it, contains a notice stating that it is\
-governed by this License along with a term that is a further\
-restriction, you may remove that term.  If a license document contains\
-a further restriction but permits relicensing or conveying under this\
-License, you may add to a covered work material governed by the terms\
-of that license document, provided that the further restriction does\
-not survive such relicensing or conveying.\
-\
-  If you add terms to a covered work in accord with this section, you\
-must place, in the relevant source files, a statement of the\
-additional terms that apply to those files, or a notice indicating\
-where to find the applicable terms.\
-\
-  Additional terms, permissive or non-permissive, may be stated in the\
-form of a separately written license, or stated as exceptions;\
-the above requirements apply either way.\
-\
-  8. Termination.\
-\
-  You may not propagate or modify a covered work except as expressly\
-provided under this License.  Any attempt otherwise to propagate or\
-modify it is void, and will automatically terminate your rights under\
-this License (including any patent licenses granted under the third\
-paragraph of section 11).\
-\
-  However, if you cease all violation of this License, then your\
-license from a particular copyright holder is reinstated (a)\
-provisionally, unless and until the copyright holder explicitly and\
-finally terminates your license, and (b) permanently, if the copyright\
-holder fails to notify you of the violation by some reasonable means\
-prior to 60 days after the cessation.\
-\
-  Moreover, your license from a particular copyright holder is\
-reinstated permanently if the copyright holder notifies you of the\
-violation by some reasonable means, this is the first time you have\
-received notice of violation of this License (for any work) from that\
-copyright holder, and you cure the violation prior to 30 days after\
-your receipt of the notice.\
-\
-  Termination of your rights under this section does not terminate the\
-licenses of parties who have received copies or rights from you under\
-this License.  If your rights have been terminated and not permanently\
-reinstated, you do not qualify to receive new licenses for the same\
-material under section 10.\
-\
-  9. Acceptance Not Required for Having Copies.\
-\
-  You are not required to accept this License in order to receive or\
-run a copy of the Program.  Ancillary propagation of a covered work\
-occurring solely as a consequence of using peer-to-peer transmission\
-to receive a copy likewise does not require acceptance.  However,\
-nothing other than this License grants you permission to propagate or\
-modify any covered work.  These actions infringe copyright if you do\
-not accept this License.  Therefore, by modifying or propagating a\
-covered work, you indicate your acceptance of this License to do so.\
-\
-  10. Automatic Licensing of Downstream Recipients.\
-\
-  Each time you convey a covered work, the recipient automatically\
-receives a license from the original licensors, to run, modify and\
-propagate that work, subject to this License.  You are not responsible\
-for enforcing compliance by third parties with this License.\
-\
-  An "entity transaction" is a transaction transferring control of an\
-organization, or substantially all assets of one, or subdividing an\
-organization, or merging organizations.  If propagation of a covered\
-work results from an entity transaction, each party to that\
-transaction who receives a copy of the work also receives whatever\
-licenses to the work the party's predecessor in interest had or could\
-give under the previous paragraph, plus a right to possession of the\
-Corresponding Source of the work from the predecessor in interest, if\
-the predecessor has it or can get it with reasonable efforts.\
-\
-  You may not impose any further restrictions on the exercise of the\
-rights granted or affirmed under this License.  For example, you may\
-not impose a license fee, royalty, or other charge for exercise of\
-rights granted under this License, and you may not initiate litigation\
-(including a cross-claim or counterclaim in a lawsuit) alleging that\
-any patent claim is infringed by making, using, selling, offering for\
-sale, or importing the Program or any portion of it.\
-\
-  11. Patents.\
-\
-  A "contributor" is a copyright holder who authorizes use under this\
-License of the Program or a work on which the Program is based.  The\
-work thus licensed is called the contributor's "contributor version".\
-\
-  A contributor's "essential patent claims" are all patent claims\
-owned or controlled by the contributor, whether already acquired or\
-hereafter acquired, that would be infringed by some manner, permitted\
-by this License, of making, using, or selling its contributor version,\
-but do not include claims that would be infringed only as a\
-consequence of further modification of the contributor version.  For\
-purposes of this definition, "control" includes the right to grant\
-patent sublicenses in a manner consistent with the requirements of\
-this License.\
-\
-  Each contributor grants you a non-exclusive, worldwide, royalty-free\
-patent license under the contributor's essential patent claims, to\
-make, use, sell, offer for sale, import and otherwise run, modify and\
-propagate the contents of its contributor version.\
-\
-  In the following three paragraphs, a "patent license" is any express\
-agreement or commitment, however denominated, not to enforce a patent\
-(such as an express permission to practice a patent or covenant not to\
-sue for patent infringement).  To "grant" such a patent license to a\
-party means to make such an agreement or commitment not to enforce a\
-patent against the party.\
-\
-  If you convey a covered work, knowingly relying on a patent license,\
-and the Corresponding Source of the work is not available for anyone\
-to copy, free of charge and under the terms of this License, through a\
-publicly available network server or other readily accessible means,\
-then you must either (1) cause the Corresponding Source to be so\
-available, or (2) arrange to deprive yourself of the benefit of the\
-patent license for this particular work, or (3) arrange, in a manner\
-consistent with the requirements of this License, to extend the patent\
-license to downstream recipients.  "Knowingly relying" means you have\
-actual knowledge that, but for the patent license, your conveying the\
-covered work in a country, or your recipient's use of the covered work\
-in a country, would infringe one or more identifiable patents in that\
-country that you have reason to believe are valid.\
-\
-  If, pursuant to or in connection with a single transaction or\
-arrangement, you convey, or propagate by procuring conveyance of, a\
-covered work, and grant a patent license to some of the parties\
-receiving the covered work authorizing them to use, propagate, modify\
-or convey a specific copy of the covered work, then the patent license\
-you grant is automatically extended to all recipients of the covered\
-work and works based on it.\
-\
-  A patent license is "discriminatory" if it does not include within\
-the scope of its coverage, prohibits the exercise of, or is\
-conditioned on the non-exercise of one or more of the rights that are\
-specifically granted under this License.  You may not convey a covered\
-work if you are a party to an arrangement with a third party that is\
-in the business of distributing software, under which you make payment\
-to the third party based on the extent of your activity of conveying\
-the work, and under which the third party grants, to any of the\
-parties who would receive the covered work from you, a discriminatory\
-patent license (a) in connection with copies of the covered work\
-conveyed by you (or copies made from those copies), or (b) primarily\
-for and in connection with specific products or compilations that\
-contain the covered work, unless you entered into that arrangement,\
-or that patent license was granted, prior to 28 March 2007.\
-\
-  Nothing in this License shall be construed as excluding or limiting\
-any implied license or other defenses to infringement that may\
-otherwise be available to you under applicable patent law.\
-\
-  12. No Surrender of Others' Freedom.\
-\
-  If conditions are imposed on you (whether by court order, agreement or\
-otherwise) that contradict the conditions of this License, they do not\
-excuse you from the conditions of this License.  If you cannot convey a\
-covered work so as to satisfy simultaneously your obligations under this\
-License and any other pertinent obligations, then as a consequence you may\
-not convey it at all.  For example, if you agree to terms that obligate you\
-to collect a royalty for further conveying from those to whom you convey\
-the Program, the only way you could satisfy both those terms and this\
-License would be to refrain entirely from conveying the Program.\
-\
-  13. Use with the GNU Affero General Public License.\
-\
-  Notwithstanding any other provision of this License, you have\
-permission to link or combine any covered work with a work licensed\
-under version 3 of the GNU Affero General Public License into a single\
-combined work, and to convey the resulting work.  The terms of this\
-License will continue to apply to the part which is the covered work,\
-but the special requirements of the GNU Affero General Public License,\
-section 13, concerning interaction through a network will apply to the\
-combination as such.\
-\
-  14. Revised Versions of this License.\
-\
-  The Free Software Foundation may publish revised and/or new versions of\
-the GNU General Public License from time to time.  Such new versions will\
-be similar in spirit to the present version, but may differ in detail to\
-address new problems or concerns.\
-\
-  Each version is given a distinguishing version number.  If the\
-Program specifies that a certain numbered version of the GNU General\
-Public License "or any later version" applies to it, you have the\
-option of following the terms and conditions either of that numbered\
-version or of any later version published by the Free Software\
-Foundation.  If the Program does not specify a version number of the\
-GNU General Public License, you may choose any version ever published\
-by the Free Software Foundation.\
-\
-  If the Program specifies that a proxy can decide which future\
-versions of the GNU General Public License can be used, that proxy's\
-public statement of acceptance of a version permanently authorizes you\
-to choose that version for the Program.\
-\
-  Later license versions may give you additional or different\
-permissions.  However, no additional obligations are imposed on any\
-author or copyright holder as a result of your choosing to follow a\
-later version.\
-\
-  15. Disclaimer of Warranty.\
-\
-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\
-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY\
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\
-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\
-\
-  16. Limitation of Liability.\
-\
-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\
-SUCH DAMAGES.\
-\
-  17. Interpretation of Sections 15 and 16.\
-\
-  If the disclaimer of warranty and limitation of liability provided\
-above cannot be given local legal effect according to their terms,\
-reviewing courts shall apply local law that most closely approximates\
-an absolute waiver of all civil liability in connection with the\
-Program, unless a warranty or assumption of liability accompanies a\
-copy of the Program in return for a fee.\
-\
-                     END OF TERMS AND CONDITIONS\
-\
-            How to Apply These Terms to Your New Programs\
-\
-  If you develop a new program, and you want it to be of the greatest\
-possible use to the public, the best way to achieve this is to make it\
-free software which everyone can redistribute and change under these terms.\
-\
-  To do so, attach the following notices to the program.  It is safest\
-to attach them to the start of each source file to most effectively\
-state the exclusion of warranty; and each file should have at least\
-the "copyright" line and a pointer to where the full notice is found.\
-\
-    <one line to give the program's name and a brief idea of what it does.>\
-    Copyright (C) <year>  <name of author>\
-\
-    This program is free software: you can redistribute it and/or modify\
-    it under the terms of the GNU General Public License as published by\
-    the Free Software Foundation, either version 3 of the License, or\
-    (at your option) any later version.\
-\
-    This program is distributed in the hope that it will be useful,\
-    but WITHOUT ANY WARRANTY; without even the implied warranty of\
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\
-    GNU General Public License for more details.\
-\
-    You should have received a copy of the GNU General Public License\
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.\
-\
-Also add information on how to contact you by electronic and paper mail.\
-\
-  If the program does terminal interaction, make it output a short\
-notice like this when it starts in an interactive mode:\
-\
-    <program>  Copyright (C) <year>  <name of author>\
-    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\
-    This is free software, and you are welcome to redistribute it\
-    under certain conditions; type `show c' for details.\
-\
-The hypothetical commands `show w' and `show c' should show the appropriate\
-parts of the General Public License.  Of course, your program's commands\
-might be different; for a GUI interface, you would use an "about box".\
-\
-  You should also get your employer (if you work as a programmer) or school,\
-if any, to sign a "copyright disclaimer" for the program, if necessary.\
-For more information on this, and how to apply and follow the GNU GPL, see\
-<http://www.gnu.org/licenses/>.\
-\
-  The GNU General Public License does not permit incorporating your program\
-into proprietary programs.  If your program is a subroutine library, you\
-may consider it more useful to permit linking proprietary applications with\
-the library.  If this is what you want to do, use the GNU Lesser General\
-Public License instead of this License.  But first, please read\
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.\
-}
\ No newline at end of file
+{\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 Droid Sans Fallback;}{\f7\fnil\fprq2\fcharset0 FreeSans;}{\f8\fswiss\fprq0\fcharset128 FreeSans;}}
+{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
+{\stylesheet{\s0\snext0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084 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;}
+}{\info{\creatim\yr0\mo0\dy0\hr0\min0}{\author olivier }{\revtim\yr2015\mo3\dy5\hr14\min36}{\printim\yr0\mo0\dy0\hr0\min0}{\comment LibreOffice}{\vern67306242}}\deftab720
+\viewscale100
+{\*\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{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+                }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+GNU LESSER GENERAL PUBLIC LICENSE}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+                       }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Version 3, 29 June 2007}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+ }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+ }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Everyone is permitted to copy and distribute verbatim copies}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+ }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+of this license document, but changing it is not allowed.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+This version of the GNU Lesser General Public License incorporates}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+the terms and conditions of version 3 of the GNU General Public}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+License, supplemented by the additional permissions listed below.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+0. Additional Definitions.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+As used herein, "this License" refers to version 3 of the GNU Lesser}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+General Public License, and the "GNU GPL" refers to version 3 of the GNU}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+General Public License.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+"The Library" refers to a covered work governed by this License,}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+other than an Application or a Combined Work as defined below.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+An "Application" is any work that makes use of an interface provided}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+by the Library, but which is not otherwise based on the Library.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Defining a subclass of a class defined by the Library is deemed a mode}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+of using an interface provided by the Library.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+A "Combined Work" is a work produced by combining or linking an}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Application with the Library.  The particular version of the Library}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+with which the Combined Work was made is also called the "Linked}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Version".}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+The "Minimal Corresponding Source" for a Combined Work means the}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Corresponding Source for the Combined Work, excluding any source code}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+for portions of the Combined Work that, considered in isolation, are}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+based on the Application, and not on the Linked Version.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+The "Corresponding Application Code" for a Combined Work means the}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+object code and/or source code for the Application, including any data}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+and utility programs needed for reproducing the Combined Work from the}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Application, but excluding the System Libraries of the Combined Work.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+1. Exception to Section 3 of the GNU GPL.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+You may convey a covered work under sections 3 and 4 of this License}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+without being bound by section 3 of the GNU GPL.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+2. Conveying Modified Versions.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+If you modify a copy of the Library, and, in your modifications, a}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+facility refers to a function or data to be supplied by an Application}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+that uses the facility (other than as an argument passed when the}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+facility is invoked), then you may convey a copy of the modified}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+version:}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+a) under this License, provided that you make a good faith effort to}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+ensure that, in the event an Application does not supply the}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+function or data, the facility still operates, and performs}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+whatever part of its purpose remains meaningful, or}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+b) under the GNU GPL, with none of the additional permissions of}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+this License applicable to that copy.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+3. Object Code Incorporating Material from Library Header Files.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+The object code form of an Application may incorporate material from}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+a header file that is part of the Library.  You may convey such object}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+code under terms of your choice, provided that, if the incorporated}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+material is not limited to numerical parameters, data structure}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+layouts and accessors, or small macros, inline functions and templates}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+(ten or fewer lines in length), you do both of the following:}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+a) Give prominent notice with each copy of the object code that the}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Library is used in it and that the Library and its use are}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+covered by this License.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+b) Accompany the object code with a copy of the GNU GPL and this license}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+document.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+4. Combined Works.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+You may convey a Combined Work under terms of your choice that,}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+taken together, effectively do not restrict modification of the}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+portions of the Library contained in the Combined Work and reverse}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+engineering for debugging such modifications, if you also do each of}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+the following:}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+a) Give prominent notice with each copy of the Combined Work that}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+the Library is used in it and that the Library and its use are}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+covered by this License.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+b) Accompany the Combined Work with a copy of the GNU GPL and this license}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+document.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+c) For a Combined Work that displays copyright notices during}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+execution, include the copyright notice for the Library among}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+these notices, as well as a reference directing the user to the}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+copies of the GNU GPL and this license document.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+d) Do one of the following:}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+       }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+0) Convey the Minimal Corresponding Source under the terms of this}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+       }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+License, and the Corresponding Application Code in a form}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+       }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+suitable for, and under terms that permit, the user to}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+       }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+recombine or relink the Application with a modified version of}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+       }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+the Linked Version to produce a modified Combined Work, in the}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+       }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+manner specified by section 6 of the GNU GPL for conveying}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+       }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Corresponding Source.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+       }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+1) Use a suitable shared library mechanism for linking with the}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+       }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Library.  A suitable mechanism is one that (a) uses at run time}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+       }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+a copy of the Library already present on the user's computer}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+       }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+system, and (b) will operate properly with a modified version}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+       }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+of the Library that is interface-compatible with the Linked}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+       }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Version.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+e) Provide Installation Information, but only if you would otherwise}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+be required to provide such information under section 6 of the}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+GNU GPL, and only to the extent that such information is}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+necessary to install and execute a modified version of the}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Combined Work produced by recombining or relinking the}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Application with a modified version of the Linked Version. (If}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+you use option 4d0, the Installation Information must accompany}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+the Minimal Corresponding Source and Corresponding Application}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Code. If you use option 4d1, you must provide the Installation}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Information in the manner specified by section 6 of the GNU GPL}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+for conveying Corresponding Source.)}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+5. Combined Libraries.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+You may place library facilities that are a work based on the}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Library side by side in a single library together with other library}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+facilities that are not Applications and are not covered by this}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+License, and convey such a combined library under terms of your}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+choice, if you do both of the following:}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+a) Accompany the combined library with a copy of the same work based}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+on the Library, uncombined with any other library facilities,}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+conveyed under the terms of this License.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+b) Give prominent notice with the combined library that part of it}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+is a work based on the Library, and explaining where to find the}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+   }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+accompanying uncombined form of the same work.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+6. Revised Versions of the GNU Lesser General Public License.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+The Free Software Foundation may publish revised and/or new versions}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+of the GNU Lesser General Public License from time to time. Such new}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+versions will be similar in spirit to the present version, but may}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+differ in detail to address new problems or concerns.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Each version is given a distinguishing version number. If the}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Library as you received it specifies that a certain numbered version}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+of the GNU Lesser General Public License "or any later version"}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+applies to it, you have the option of following the terms and}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+conditions either of that published version or of any later version}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+published by the Free Software Foundation. If the Library as you}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+received it does not specify a version number of the GNU Lesser}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+General Public License, you may choose any version of the GNU Lesser}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+General Public License ever published by the Free Software Foundation.}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch
+
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\fs26\loch\f5
+  }{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+If the Library as you received it specifies that a proxy can decide}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+whether future versions of the GNU Lesser General Public License shall}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+apply, that proxy's public statement of acceptance of any version is}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+permanent authorization for you to choose that version for the}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\rtlch \ltrch\loch\fs26\loch\f5
+Library.}
+\par }
\ No newline at end of file
diff --git a/installers/osx/PkgResources_x86_64/ReadMe.rtf b/installers/osx/PkgResources_x86_64/ReadMe.rtf
index 7339a3b..4d01517 100755
--- a/installers/osx/PkgResources_x86_64/ReadMe.rtf
+++ b/installers/osx/PkgResources_x86_64/ReadMe.rtf
@@ -7,19 +7,20 @@
 {\s17\sbasedon16\snext17\sl288\slmult1\ql\nowidctlpar\sb0\sa140\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af8\afs24\loch\f3\fs24\lang3084 List;}
 {\s18\sbasedon0\snext18\ql\nowidctlpar\sb120\sa120\noline\ltrpar\cf1\i\kerning1\dbch\af7\langfe1081\dbch\af8\afs24\ai\loch\f3\fs24\lang3084 Caption;}
 {\s19\sbasedon0\snext19\ql\nowidctlpar\noline\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af8\afs24\loch\f3\fs24\lang3084 Index;}
-}{\info{\creatim\yr0\mo0\dy0\hr0\min0}{\author olivier }{\revtim\yr2015\mo1\dy29\hr19\min33}{\printim\yr0\mo0\dy0\hr0\min0}{\comment LibreOffice}{\vern67306242}}\deftab720
+}{\info{\author olivier }{\creatim\yr0\mo0\dy0\hr0\min0}{\author olivier }{\revtim\yr2015\mo3\dy5\hr17\min29}{\printim\yr0\mo0\dy0\hr0\min0}{\comment LibreOffice}{\vern67306242}}\deftab720
 \viewscale100
 {\*\pgdsctbl
 {\pgdsc0\pgdscuse451\pgwsxn12240\pghsxn15840\marglsxn1440\margrsxn1440\margtsxn1440\margbsxn1440\pgdscnxt0 Default Style;}}
 \formshade{\*\pgdscno0}\paperh15840\paperw12240\margl1440\margr1440\margt1440\margb1440\sectd\sbknone\sectunlocked1\pgndec\pgwsxn12240\pghsxn15840\marglsxn1440\margrsxn1440\margtsxn1440\margbsxn1440\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
 {\*\ftnsep}\pgndec\pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af6\langfe1081\dbch\af6\afs24\alang1081\loch\f3\fs24\lang3084\ql\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\kerning1\dbch\af6\langfe1081\rtlch \ltrch\loch\fs26\lang3084\loch\f5
 Python-pyo (version 0.7.}{\cf1\kerning1\dbch\af6\langfe1081\rtlch \ltrch\loch\fs26\lang3084\loch\f5
-4}{\cf1\kerning1\dbch\af6\langfe1081\rtlch \ltrch\loch\fs26\lang3084\loch\f5
+5}{\cf1\kerning1\dbch\af6\langfe1081\rtlch \ltrch\loch\fs26\lang3084\loch\f5
 )}
 \par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af6\langfe1081\dbch\af6\afs24\alang1081\loch\f3\fs24\lang3084\ql\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\kerning1\dbch\af6\langfe1081\rtlch \ltrch\loch\fs26\lang3084\loch\f5
 
 \par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af6\langfe1081\dbch\af6\afs24\alang1081\loch\f3\fs24\lang3084\ql\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\kerning1\dbch\af6\langfe1081\rtlch \ltrch\loch\fs26\lang3084\loch\f5
-System requirements : OS X 10.6 to 10.9}
+System requirements : OS X 10.6 to 10.}{\cf1\kerning1\dbch\af6\langfe1081\rtlch \ltrch\loch\fs26\lang3084\loch\f5
+10}
 \par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af6\langfe1081\dbch\af6\afs24\alang1081\loch\f3\fs24\lang3084\ql\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\kerning1\dbch\af6\langfe1081\rtlch \ltrch\loch\fs26\lang3084\loch\f5
 
 \par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af6\langfe1081\dbch\af6\afs24\alang1081\loch\f3\fs24\lang3084\ql\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\kerning1\dbch\af6\langfe1081\rtlch \ltrch\loch\fs26\lang3084\loch\f5
@@ -78,5 +79,6 @@ libogg.0.dylib}
 \par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af6\langfe1081\dbch\af6\afs24\alang1081\loch\f3\fs24\lang3084\ql\nowidctlpar\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\cf1\b0\kerning1\dbch\af6\langfe1081\rtlch \ltrch\loch\fs26\lang3084\loch\f5
 
 \par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af6\langfe1081\dbch\af6\afs24\alang1081\loch\f3\fs24\lang3084\ql\nowidctlpar{\cf1\b0\kerning1\dbch\af6\langfe1081\rtlch \ltrch\loch\fs26\lang3084\loch\f5
-Olivier B\u233\'e9langer, 2014}
+Olivier B\u233\'e9langer, 201}{\cf1\b0\kerning1\dbch\af6\langfe1081\rtlch \ltrch\loch\fs26\lang3084\loch\f5
+5}
 \par }
\ No newline at end of file
diff --git a/installers/osx/release_x86_64.sh b/installers/osx/release_x86_64.sh
index c8bcfad..2779969 100644
--- a/installers/osx/release_x86_64.sh
+++ b/installers/osx/release_x86_64.sh
@@ -1,16 +1,15 @@
 #!/bin/sh
 
 # Need Xcode 3.2.6 or later (pkgbuild and productbuild)
-# 1. install python (and wxpython) 2.6 and 2.7 (32-bit)
-# 2. update pyo sources
-# 3. compile and install pyo float and double
-# 4. cd utils and build E-Pyo
-# 5. install python (and wxpython) 2.7 (64-bit)
-# 6. cd installer/osx and build the realease, only x86_64 version
-
-export PACKAGE_NAME=pyo_0.7.4_x86_64.pkg
-export DMG_DIR="pyo 0.7.4 Universal"
-export DMG_NAME="pyo_0.7.4_OSX-universal.dmg"
+# with python 2.7.8 (32/64-bit) and wxpython 3.0.1.1 (cocoa) installed
+# 1. update pyo sources
+# 2. compile and install pyo float and double
+# 3. cd utils and build E-Pyo
+# 4. cd installer/osx and build the realease, only x86_64 version
+
+export PACKAGE_NAME=pyo_0.7.5_x86_64.pkg
+export DMG_DIR="pyo 0.7.5 Universal"
+export DMG_NAME="pyo_0.7.5_OSX-universal.dmg"
 export INSTALLER_DIR=`pwd`/installer
 export PYO_MODULE_DIR=$INSTALLER_DIR/PyoModule/Package_Contents/tmp
 export SUPPORT_LIBS_DIR=$INSTALLER_DIR/SupportLibs/Package_Contents/usr/local/lib
diff --git a/installers/win/win_installer_py26.iss b/installers/win/win_installer_py26.iss
index f973793..8f0acd5 100644
--- a/installers/win/win_installer_py26.iss
+++ b/installers/win/win_installer_py26.iss
@@ -3,7 +3,7 @@
 
 #define appName "pyo"
 #define pyVer "2.6"
-#define appVer "0.7.4"
+#define appVer "0.7.5"
 
 [Setup]
 ; NOTE: The value of AppId uniquely identifies this application.
diff --git a/installers/win/win_installer_py27.iss b/installers/win/win_installer_py27.iss
index 5935569..af16bc9 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.7.4"
+#define appVer "0.7.5"
 
 [Setup]
 ; NOTE: The value of AppId uniquely identifies this application.
diff --git a/pyo.py b/pyo.py
index 02421c5..02ae816 100644
--- a/pyo.py
+++ b/pyo.py
@@ -1,57 +1,22 @@
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+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
-
-import sys
-import __builtin__
-from types import IntType, FloatType
-
-# For Python 2.5-, this will enable the simliar property mechanism as in
-# Python 2.6+/3.0+. The code is based on
-# http://bruynooghe.blogspot.com/2008/04/xsetter-syntax-in-python-25.html
-if sys.version_info[:2] <= (2, 5):
-    class property(property):
-        def __init__(self, fget, *args, **kwargs):
-            self.__doc__ = fget.__doc__
-            super(property, self).__init__(fget, *args, **kwargs)
-
-        def setter(self, fset):
-            cls_ns = sys._getframe(1).f_locals
-            for k, v in cls_ns.iteritems():
-                if v == self:
-                    propname = k
-                    break
-            cls_ns[propname] = property(self.fget, fset, self.fdel, self.__doc__)
-            return cls_ns[propname]
-
-        def deleter(self, fdel):
-            cls_ns = sys._getframe(1).f_locals
-            for k, v in cls_ns.iteritems():
-                if v == self:
-                    propname = k
-                    break
-            cls_ns[propname] = property(self.fget, self.fset, fdel, self.__doc__)
-            return cls_ns[propname]
-
-    __builtin__.property = property
-
 from pyolib._maps import *
 import pyolib.analysis as analysis
 from pyolib.analysis import *
@@ -99,255 +64,50 @@ if WITH_EXTERNALS:
     import pyolib.external as external
     from pyolib.external import *
 
-class FreqShift(PyoObject):
-    """
-    Frequency shifting using single sideband amplitude modulation.
-
-    Shifting frequencies means that the input signal can be detuned, 
-    where the harmonic components of the signal are shifted out of 
-    harmonic alignment with each other, e.g. a signal with harmonics at 
-    100, 200, 300, 400 and 500 Hz, shifted up by 50 Hz, will have harmonics 
-    at 150, 250, 350, 450, and 550 Hz.
-
-    :Parent: :py:class:`PyoObject`
-
-    :Args:
-
-        input : PyoObject
-            Input signal to process.
-        shift : float or PyoObject, optional
-            Amount of shifting in Hertz. Defaults to 100.
-
-    >>> s = Server().boot()
-    >>> s.start()
-    >>> a = SineLoop(freq=300, feedback=.1, mul=.3)
-    >>> lf1 = Sine(freq=.04, mul=10)
-    >>> lf2 = Sine(freq=.05, mul=10)
-    >>> b = FreqShift(a, shift=lf1, mul=.5).out()
-    >>> c = FreqShift(a, shift=lf2, mul=.5).out(1)
-
-    """
-    def __init__(self, input, shift=100, mul=1, add=0):
-        PyoObject.__init__(self, mul, add)
-        self._input = input
-        self._shift = shift
-        self._in_fader = InputFader(input)
-        in_fader, shift, mul, add, lmax = convertArgsToLists(self._in_fader, shift, mul, add)
-
-        self._hilb_objs = []
-        self._sin_objs = []
-        self._cos_objs = []
-        self._mod_objs = []
-        self._base_objs = []
-        for i in range(lmax):
-            self._hilb_objs.append(Hilbert(wrap(in_fader,i)))
-            self._sin_objs.append(Sine(freq=wrap(shift,i), mul=.707))
-            self._cos_objs.append(Sine(freq=wrap(shift,i), phase=0.25, mul=.707))
-            self._mod_objs.append(Mix(self._hilb_objs[-1]['real'] * self._sin_objs[-1] + self._hilb_objs[-1]['imag'] * self._cos_objs[-1], 
-                                      mul=wrap(mul,i), add=wrap(add,i)))
-            self._base_objs.extend(self._mod_objs[-1].getBaseObjects())
-
-    def play(self, dur=0, delay=0):
-        dur, delay, lmax = convertArgsToLists(dur, delay)
-        [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._hilb_objs)]
-        [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._sin_objs)]
-        [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._cos_objs)]
-        [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._mod_objs)]
-        return PyoObject.play(self, dur, delay)
-
-    def stop(self):
-        [obj.stop() for obj in self._hilb_objs]
-        [obj.stop() for obj in self._sin_objs]
-        [obj.stop() for obj in self._cos_objs]
-        [obj.stop() for obj in self._mod_objs]
-        return PyoObject.stop(self)
-
-    def out(self, chnl=0, inc=1, dur=0, delay=0):
-        dur, delay, lmax = convertArgsToLists(dur, delay)
-        [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._hilb_objs)]
-        [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._sin_objs)]
-        [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._cos_objs)]
-        [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._mod_objs)]
-        return PyoObject.out(self, chnl, inc, dur, delay)
-
-    def setInput(self, x, fadetime=0.05):
-        """
-        Replace the `input` attribute.
-
-        Parameters:
-
-        x : PyoObject
-            New signal to process.
-        fadetime : float, optional
-            Crossfade time between old and new input. Defaults to 0.05.
-
-        """
-        self._input = x
-        self._in_fader.setInput(x, fadetime)
-
-    def setShift(self, x):
-        """
-        Replace the `shift` attribute.
-
-        Parameters:
-
-        x : float or PyoObject
-            New `shift` attribute.
-
-        """
-        self._shift = x
-        x, lmax = convertArgsToLists(x)
-        [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._sin_objs)]
-        [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._cos_objs)]
-
-    def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMap(-2000., 2000., "lin", "shift", self._shift), SLMapMul(self._mul)]
-        PyoObject.ctrl(self, map_list, title, wxnoserver)
-
-    @property
-    def input(self): 
-        """PyoObject. Input signal to pitch shift.""" 
-        return self._input
-    @input.setter
-    def input(self, x): self.setInput(x)
-
-    @property
-    def shift(self): 
-        """float or PyoObject. Amount of pitch shift in Hertz.""" 
-        return self._shift
-    @shift.setter
-    def shift(self, x): self.setShift(x)
-
-class PartialTable(PyoTableObject):
-    """
-    Inharmonic waveform generator.
-
-    Generates waveforms made of inharmonic components. Partials are
-    given as a list of 2-values tuple, where the first one is the
-    partial number (can be float) and the second one is the strength
-    of the partial.
-    
-    The object uses the first two decimal values of each partial to 
-    compute a higher harmonic at a multiple of 100 (so each component
-    is in reality truly harmonic). If the oscillator has a frequency
-    divided by 100, the real desired partials will be restituted.
-    
-    The list:
-        
-    [(1, 1), (1.1, 0.7), (1.15, 0.5)] will draw a table with:
-        
-    harmonic 100 : amplitude = 1
-    harmonic 110 : amplitude = 0.7
-    harmonic 115 : amplitude = 0.5
-    
-    To listen to a signal composed of 200, 220 and 230 Hz, one should
-    declared an oscillator like this (frequency of 200Hz divided by 100):
-        
-    a = Osc(t, freq=2, mul=0.5).out()
-
-    :Parent: :py:class:`PyoTableObject`
-
-    :Args:
-
-        list : list of tuple, optional
-            List of 2-values tuples. First value is the partial number (float up 
-            to two decimal values) and second value is its amplitude (relative to
-            the other harmonics). Defaults to [(1,1), (1.33,0.5),(1.67,0.3)].
-        size : int, optional
-            Table size in samples. Because computed harmonics are very high in
-            frequency, the table size must be bigger than a classic HarmTable.
-            Defaults to 65536.
-
-    >>> s = Server().boot()
-    >>> s.start()
-    >>> t = PartialTable([(1,1), (2.37, 0.5), (4.55, 0.3)]).normalize()
-    >>> # Play with fundamentals 199 and 200 Hz
-    >>> a = Osc(table=t, freq=[1.99,2], mul=.2).out()
-
-    """
-    def __init__(self, list=[(1,1), (1.33,0.5),(1.67,0.3)], size=65536):
-        PyoTableObject.__init__(self, size)
-        self._list = list
-        self._par_table = HarmTable(self._create_list(), size)
-        self._base_objs = self._par_table.getBaseObjects()
-        self.normalize()
-
-    def _create_list(self):
-        # internal method used to compute the harmonics's weight
-        hrms = [(int(x*100.), y) for x, y in self._list]
-        l = []
-        ind = 0
-        for i in range(10000):
-            if i == hrms[ind][0]:
-                l.append(hrms[ind][1])
-                ind += 1
-                if ind == len(hrms):
-                    break
-            else:
-                l.append(0)
-        return l
-    
-    def replace(self, list):
-        """
-        Redraw the waveform according to a new set of harmonics 
-        relative strengths.
-        
-        :Args:
-        
-            list : list of tuples
-                Each tuple contains the partial number, as a float,
-                and its strength.
-
-        """      
-        self._list = list
-        [obj.replace(self._create_list()) for obj in self._base_objs]
-        self.normalize()
-        self.refreshView()
-
-    @property
-    def list(self): 
-        """list. List of partial numbers and strength."""
-        return self._list
-    @list.setter
-    def list(self, x): self.replace(x)
-
 OBJECTS_TREE = {'functions': sorted(['pa_count_devices', 'pa_get_default_input', 'pa_get_default_output', 'pm_get_input_devices',
-                                    'pa_list_devices', 'pa_count_host_apis', 'pa_list_host_apis', 'pa_get_default_host_api', 
-                                    'pm_count_devices', 'pm_list_devices', 'sndinfo', 'savefile', 'pa_get_output_devices', 
-                                    'pa_get_input_devices', 'midiToHz', 'hzToMidi', 'sampsToSec', 'secToSamps', 'example', 'class_args', 
+                                    'pa_list_devices', 'pa_count_host_apis', 'pa_list_host_apis', 'pa_get_default_host_api',
+                                    'pm_count_devices', 'pm_list_devices', 'sndinfo', 'savefile', 'pa_get_output_devices',
+                                    'pa_get_input_devices', 'midiToHz', 'hzToMidi', 'sampsToSec', 'secToSamps', 'example', 'class_args',
                                     'pm_get_default_input', 'pm_get_output_devices', 'pm_get_default_output', 'midiToTranspo',
                                      'getVersion', 'reducePoints', 'serverCreated', 'serverBooted', 'distanceToSegment', 'rescale',
                                      'upsamp', 'downsamp', 'linToCosCurve', 'convertStringToSysEncoding', 'savefileFromTable',
                                     'pa_get_input_max_channels', 'pa_get_output_max_channels', 'pa_get_devices_infos', 'pa_get_version',
                                     'pa_get_version_text', 'floatmap']),
                 'PyoObjectBase': {
-                    'PyoMatrixObject': sorted(['NewMatrix']),                        
-                    'PyoTableObject': sorted(['LinTable', 'NewTable', 'SndTable', 'HannTable', 'HarmTable', 'SawTable', 'ParaTable', 'LogTable', 'CosLogTable',
-                                            'SquareTable', 'ChebyTable', 'CosTable', 'CurveTable', 'ExpTable', 'DataTable', 'WinTable', 'SincTable', 'PartialTable']),
-                    'PyoPVObject' : sorted(['PVAnal', 'PVSynth', 'PVTranspose', 'PVVerb', 'PVGate', 'PVAddSynth', 'PVCross', 'PVMult', 'PVMorph', 'PVFilter', 'PVDelay', 'PVBuffer', 'PVShift', 'PVAmpMod', 'PVFreqMod', 'PVBufLoops', 'PVBufTabLoops', 'PVMix']),
-                    'PyoObject': {'analysis': sorted(['Follower', 'Follower2', 'ZCross', 'Yin', 'Centroid', 'AttackDetector', 'Scope', 'Spectrum', 'PeakAmp']),
-                                  'arithmetic': sorted(['Sin', 'Cos', 'Tan', 'Abs', 'Sqrt', 'Log', 'Log2', 'Log10', 'Pow', 'Atan2', 'Floor', 'Round',
-                                                        'Ceil', 'Tanh']),
+                    'PyoMatrixObject': sorted(['NewMatrix']),
+                    'PyoTableObject': sorted(['LinTable', 'NewTable', 'SndTable', 'HannTable', 'HarmTable', 'SawTable', 'ParaTable',
+                                              'LogTable', 'CosLogTable', 'SquareTable', 'ChebyTable', 'CosTable', 'CurveTable', 'ExpTable',
+                                              'DataTable', 'WinTable', 'SincTable', 'PartialTable', 'AtanTable']),
+                    'PyoPVObject' : sorted(['PVAnal', 'PVSynth', 'PVTranspose', 'PVVerb', 'PVGate', 'PVAddSynth', 'PVCross', 'PVMult',
+                                            'PVMorph', 'PVFilter', 'PVDelay', 'PVBuffer', 'PVShift', 'PVAmpMod', 'PVFreqMod', 'PVBufLoops',
+                                            'PVBufTabLoops', 'PVMix']),
+                    'PyoObject': {'analysis': sorted(['Follower', 'Follower2', 'ZCross', 'Yin', 'Centroid', 'AttackDetector', 'Scope',
+                                                      'Spectrum', 'PeakAmp']),
+                                  'arithmetic': sorted(['Sin', 'Cos', 'Tan', 'Abs', 'Sqrt', 'Log', 'Log2', 'Log10', 'Pow', 'Atan2', 'Floor',
+                                                        'Round', 'Ceil', 'Tanh']),
                                   'controls': sorted(['Fader', 'Sig', 'SigTo', 'Adsr', 'Linseg', 'Expseg']),
                                   'dynamics': sorted(['Clip', 'Compress', 'Degrade', 'Mirror', 'Wrap', 'Gate', 'Balance', 'Min', 'Max']),
                                   'effects': sorted(['Delay', 'SDelay', 'Disto', 'Freeverb', 'Waveguide', 'Convolve', 'WGVerb', 'SmoothDelay',
                                                      'Harmonizer', 'Chorus', 'AllpassWG', 'FreqShift', 'Vocoder', 'Delay1', 'STRev']),
                                   'filters': sorted(['Biquad', 'BandSplit', 'Port', 'Hilbert', 'Tone', 'DCBlock', 'EQ', 'Allpass',
-                                                     'Allpass2', 'Phaser', 'Biquadx', 'IRWinSinc', 'IRAverage', 'IRPulse', 'IRFM', 'FourBand',
-                                                     'Biquada', 'Atone', 'SVF', 'Average', 'Reson', 'Resonx', 'ButLP', 'ButHP', 'ButBP', 'ButBR', 'ComplexRes']),
+                                                     'Allpass2', 'Phaser', 'Biquadx', 'IRWinSinc', 'IRAverage', 'IRPulse', 'IRFM',
+                                                     'FourBand', 'Biquada', 'Atone', 'SVF', 'Average', 'Reson', 'Resonx', 'ButLP',
+                                                     'ButHP', 'ButBP', 'ButBR', 'ComplexRes']),
                                   'generators': sorted(['Noise', 'Phasor', 'Sine', 'Input', 'FM', 'SineLoop', 'Blit', 'PinkNoise', 'CrossFM',
                                                         'BrownNoise', 'Rossler', 'Lorenz', 'LFO', 'SumOsc', 'SuperSaw', 'RCOsc']),
                                   'internals': sorted(['Dummy', 'InputFader', 'Mix', 'VarPort']),
-                                  'midi': sorted(['Midictl', 'CtlScan', 'CtlScan2', 'Notein', 'MidiAdsr', 'MidiDelAdsr', 'Bendin', 'Touchin', 'Programin']),
+                                  'midi': sorted(['Midictl', 'CtlScan', 'CtlScan2', 'Notein', 'MidiAdsr', 'MidiDelAdsr', 'Bendin',
+                                                  'Touchin', 'Programin']),
                                   'opensndctrl': sorted(['OscReceive', 'OscSend', 'OscDataSend', 'OscDataReceive', 'OscListReceive']),
                                   'pan': sorted(['Pan', 'SPan', 'Switch', 'Selector', 'Mixer', 'VoiceManager']),
                                   'pattern': sorted(['Pattern', 'Score', 'CallAfter']),
                                   'randoms': sorted(['Randi', 'Randh', 'Choice', 'RandInt', 'Xnoise', 'XnoiseMidi', 'RandDur', 'XnoiseDur', 'Urn']),
                                   'players': sorted(['SfMarkerShuffler', 'SfPlayer', 'SfMarkerLooper']),
-                                  'tableprocess': sorted(['TableRec', 'Osc', 'Pointer', 'Pointer2', 'Lookup', 'Granulator', 'Pulsar', 'OscLoop', 'Granule',
-                                                        'TableRead', 'TableMorph', 'Looper', 'TableIndex', 'OscBank', 'OscTrig', 'TablePut', 'TableScale', 'Particle']),
-                                  'matrixprocess': sorted(['MatrixRec', 'MatrixPointer', 'MatrixMorph', 'MatrixRecLoop']), 
-                                  'triggers': sorted(['Metro', 'Beat', 'TrigEnv', 'TrigRand', 'TrigRandInt', 'Select', 'Counter', 'TrigChoice', 
+                                  'tableprocess': sorted(['TableRec', 'Osc', 'Pointer', 'Pointer2', 'Lookup', 'Granulator', 'Pulsar', 'OscLoop',
+                                                          'Granule', 'TableRead', 'TableMorph', 'Looper', 'TableIndex', 'OscBank', 'OscTrig',
+                                                          'TablePut', 'TableScale', 'Particle', 'TableWrite']),
+                                  'matrixprocess': sorted(['MatrixRec', 'MatrixPointer', 'MatrixMorph', 'MatrixRecLoop']),
+                                  'triggers': sorted(['Metro', 'Beat', 'TrigEnv', 'TrigRand', 'TrigRandInt', 'Select', 'Counter', 'TrigChoice',
                                                     'TrigFunc', 'Thresh', 'Cloud', 'Trig', 'TrigXnoise', 'TrigXnoiseMidi', 'Timer', 'Count',
                                                     'Change', 'TrigLinseg', 'TrigExpseg', 'Percent', 'Seq', 'TrigTableRec', 'Iter', 'NextTrig',
                                                     'TrigVal', 'Euclide', 'TrigBurst']),
@@ -356,9 +116,8 @@ OBJECTS_TREE = {'functions': sorted(['pa_count_devices', 'pa_get_default_input',
                                                     'TranspoToCents', 'MToF', 'FToM', 'MToT', 'TrackHold']),
                                   'fourier': sorted(['FFT', 'IFFT', 'CarToPol', 'PolToCar', 'FrameDelta', 'FrameAccum', 'Vectral', 'CvlVerb'])}},
         'Map': {'SLMap': sorted(['SLMapFreq', 'SLMapMul', 'SLMapPhase', 'SLMapQ', 'SLMapDur', 'SLMapPan'])},
-        'Server': [], 
-        'Stream': [], 
+        'Server': [],
+        'Stream': [],
         'TableStream': []}
 
-DOC_KEYWORDS = ['Attributes', 'Examples', 'Parameters', 'Methods', 'Notes', 'Methods details', 'See also', 'Parentclass']
-DEMOS_PATH = SNDS_PATH
+DOC_KEYWORDS = ['Attributes', 'Examples', 'Parameters', 'Methods', 'Notes', 'Methods details', 'See also', 'Parentclass']
\ No newline at end of file
diff --git a/pyo64.py b/pyo64.py
index dbd5b17..04f100f 100644
--- a/pyo64.py
+++ b/pyo64.py
@@ -1,22 +1,22 @@
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+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 __builtin__
 __builtin__.pyo_use_double = True
-from pyo import *
+from pyo import *
\ No newline at end of file
diff --git a/pyolib/_core.py b/pyolib/_core.py
index 07a9e98..64f875d 100644
--- a/pyolib/_core.py
+++ b/pyolib/_core.py
@@ -1,36 +1,36 @@
 # -*- coding: utf-8 -*-
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+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/>.
 """
-from types import ListType, SliceType, FloatType, StringType, UnicodeType, NoneType
+from types import ListType, TupleType, SliceType, FloatType, StringType, UnicodeType, NoneType
 import random, os, sys, inspect, tempfile
 from subprocess import call
+from weakref import proxy
 
 import __builtin__
 if hasattr(__builtin__, 'pyo_use_double'):
     import pyo64 as current_pyo
     from _pyo64 import *
-else:    
+else:
     import pyo as current_pyo
     from _pyo import *
-    
+
 from _maps import *
 from _widgets import createCtrlWindow, createViewTableWindow, createViewMatrixWindow
 
@@ -38,10 +38,8 @@ from _widgets import createCtrlWindow, createViewTableWindow, createViewMatrixWi
 ### Utilities
 ######################################################################
 SNDS_PATH = os.path.join(os.path.dirname(current_pyo.__file__), "pyolib", "snds")
-XNOISE_DICT = {'uniform': 0, 'linear_min': 1, 'linear_max': 2, 'triangle': 3, 
-                'expon_min': 4, 'expon_max': 5, 'biexpon': 6, 'cauchy': 7, 
-                'weibull': 8, 'gaussian': 9, 'poisson': 10, 'walker': 11, 
-                'loopseg': 12}
+XNOISE_DICT = {'uniform': 0, 'linear_min': 1, 'linear_max': 2, 'triangle': 3, 'expon_min': 4, 'expon_max': 5,
+               'biexpon': 6, 'cauchy': 7, 'weibull': 8, 'gaussian': 9, 'poisson': 10, 'walker': 11, 'loopseg': 12}
 FILE_FORMATS = {'wav': 0, 'wave': 0, 'aif': 1, 'aiff': 1, 'au': 2, '': 3, 'sd2': 4, 'flac': 5, 'caf': 6, 'ogg': 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_count_devices": "pa_count_devices()",
@@ -69,11 +67,11 @@ FUNCTIONS_INIT_LINES = {"pa_count_host_apis": "pa_count_host_apis()", "pa_list_h
 def convertStringToSysEncoding(str):
     """
     Convert a string to the current platform file system encoding.
-    
+
     Returns the new encoded string.
 
     :Args:
-    
+
         str : string
             String to convert.
 
@@ -82,12 +80,12 @@ def convertStringToSysEncoding(str):
         str = str.decode("utf-8")
     str = str.encode(sys.getfilesystemencoding())
     return str
-        
+
 def convertArgsToLists(*args):
     """
-    Convert all arguments to list if not already a list or a PyoObject. 
+    Convert all arguments to list if not already a list or a PyoObject.
     Return new args and maximum list length.
-    
+
     """
     converted = []
     for i in args:
@@ -95,14 +93,14 @@ def convertArgsToLists(*args):
             converted.append(i)
         else:
             converted.append([i])
-            
+
     max_length = max(len(i) for i in converted)
     return tuple(converted + [max_length])
 
 def wrap(arg, i):
     """
     Return value at position `i` from `arg` with wrap around `arg` length.
-    
+
     """
     x = arg[i % len(arg)]
     if isinstance(x, PyoObjectBase):
@@ -158,16 +156,13 @@ def example(cls, dur=5, toprint=True, double=False):
         ex += line + "\n"
 
     ex += "time.sleep(%f)\ns.stop()\ntime.sleep(0.25)\ns.shutdown()\n" % dur
-    if sys.version_info[:2] <= (2, 5):
-        f = open('/tmp/pyo_example.py', 'w')
-    else:
-        f = tempfile.NamedTemporaryFile(delete=False)
+    f = tempfile.NamedTemporaryFile(delete=False)
     if toprint:
         f.write('print """\n%s\n"""\n' % ex)
     f.write(ex)
-    f.close()    
+    f.close()
     p = call(["python", f.name])
-      
+
 def removeExtraDecimals(x):
     if type(x) == FloatType:
         return "=%.2f" % x
@@ -180,7 +175,7 @@ def class_args(cls):
     """
     Returns the init line of a class reference.
 
-    This function takes a class reference (not an instance of that class) 
+    This function takes a class reference (not an instance of that class)
     as input and returns the init line of that class with the default values.
 
     :Args:
@@ -213,7 +208,7 @@ def getVersion():
     Returns the version number of the current pyo installation.
 
     This function returns the version number of the current pyo
-    installation as a 3-ints tuple (major, minor, rev). 
+    installation as a 3-ints tuple (major, minor, rev).
 
     The returned tuple for version '0.4.1' will look like : (0, 4, 1)
 
@@ -224,8 +219,39 @@ def getVersion():
     major, minor, rev = PYO_VERSION.split('.')
     return (int(major), int(minor), int(rev))
 
-def dumpref():
-    pass
+def getWeakMethodRef(x):
+    if type(x) in [ListType, TupleType]:
+        tmp = []
+        for y in x:
+            if hasattr(y, "__self__"):
+                y = WeakMethod(y)
+            tmp.append(y)
+        x = tmp
+    else:
+        if hasattr(x, "__self__"):
+            x = WeakMethod(x)
+    return x
+
+class WeakMethod(object):
+    """A callable object. Takes one argument to init: 'object.method'.
+    Once created, call this object -- MyWeakMethod() --
+    and pass args/kwargs as you normally would.
+    """
+    def __init__(self, callobj):
+        if hasattr(callobj, "__self__"):
+            self.target = proxy(callobj.__self__)
+            self.method = proxy(callobj.__func__)
+            self.isMethod = True
+        else:
+            self.method = callobj
+            self.isMethod = False
+
+    def __call__(self, *args, **kwargs):
+        """Call the method with args and kwargs as needed."""
+        if self.isMethod:
+            return self.method(self.target, *args, **kwargs)
+        else:
+            return self.method(*args, **kwargs)
 
 class PyoError(Exception):
     """Base class for all pyo exceptions."""
@@ -248,7 +274,7 @@ class PyoObjectBase(object):
     .. note::
 
         **Operations allowed on all PyoObjectBase**
-            
+
         >>> len(obj) # Return the number of streams managed by the object.
         >>> obj[x] # Return stream `x` of the object. `x` is a number from 0 to len(obj)-1.
         >>> dir(obj) # Return the list of attributes of the object.
@@ -258,7 +284,7 @@ class PyoObjectBase(object):
     # Descriptive word for this kind of object, for use in printing
     # descriptions of the object. Subclasses need to set this.
     _STREAM_TYPE = ''
-    
+
     def __init__(self):
         if not serverCreated():
             raise PyoServerStateException("You must create and boot a Server before creating any audio object.")
@@ -269,7 +295,7 @@ class PyoObjectBase(object):
         """
         Print infos about the current state of the object.
 
-        Print the number of Stream objects managed by the instance 
+        Print the number of Stream objects managed by the instance
         and the current status of the object's attributes.
 
         """
@@ -290,19 +316,26 @@ class PyoObjectBase(object):
         """
         return self._base_objs
 
-    def cleanFuncRefs(self):
+    def getServer(self):
+        """
+        Return a reference to the current Server object.
+
+        """
+        return self._base_objs[0].getServer()
+
+    def getSamplingRate(self):
         """
-        Method used to remove internal references to callback functions.
-        
-        An internal reference to a callback function (ex. the function
-        called by the TrigFunc object) may prevent the object to be
-        properly deleted when its reference count drop to zero. Calling
-        this function just before deleting the last reference will replace
-        the callback reference by a dump ref.
+        Return the current sampling rate (samples per second), as a float.
 
         """
-        if hasattr(self, "_function"):
-            self.setFunction(dumpref)
+        return self._base_objs[0].getServer().getSamplingRate()
+
+    def getBufferSize(self):
+        """
+        Return the current buffer size (samples per buffer), as an integer.
+
+        """
+        return self._base_objs[0].getServer().getBufferSize()
 
     def __getitem__(self, i):
         if i == 'trig':
@@ -332,11 +365,11 @@ class PyoObjectBase(object):
 class PyoObject(PyoObjectBase):
     """
     Base class for all pyo objects that manipulate vectors of samples.
-    
+
     The user should never instantiate an object of this class.
 
     :Parent: :py:class:`PyoObjectBase`
-    
+
     :Args:
 
         mul : float or PyoObject, optional
@@ -345,22 +378,22 @@ class PyoObject(PyoObjectBase):
             Addition factor. Defaults to 0.
 
     .. note::
-    
+
         **Arithmetics**
-    
-        Multiplication, addition, division and substraction can be applied 
-        between pyo objects or between pyo objects and numbers. Doing so 
+
+        Multiplication, addition, division and substraction can be applied
+        between pyo objects or between pyo objects and numbers. Doing so
         returns a Dummy object with the result of the operation.
-        
+
         >>> # creates a Dummy object `b` with `mul` set to 0.5 and leave `a` unchanged.
         >>> b = a * 0.5
-    
-        Inplace multiplication, addition, division and substraction can be 
-        applied between pyo objects or between pyo objects and numbers.         
-        These operations will replace the `mul` or `add` factor of the object. 
-        
+
+        Inplace multiplication, addition, division and substraction can be
+        applied between pyo objects or between pyo objects and numbers.
+        These operations will replace the `mul` or `add` factor of the object.
+
         >>> a *= 0.5 # replaces the `mul` attribute of `a`.
-    
+
         The next operators can be used with PyoObject (not with XXX_base objects).
 
         **Exponent** and **modulo**
@@ -371,11 +404,11 @@ class PyoObject(PyoObjectBase):
         >>> a % b # returns a Wrap object created as : Wrap(a, 0, b)
 
         **Unary negative** (**-**)
-    
+
         >>> -a # returns a Dummy object with negative values of streams in `a`.
-    
+
         **Comparison operators**
-        
+
         >>> a < b # returns a Compare object created as : Compare(a, comp=b, mode="<")
         >>> a <= b # returns a Compare object created as : Compare(a, comp=b, mode="<=")
         >>> a == b # returns a Compare object created as : Compare(a, comp=b, mode="==")
@@ -387,7 +420,7 @@ class PyoObject(PyoObjectBase):
         return False except `a != None`, which returns True.
 
     """
-    
+
     _STREAM_TYPE = 'audio'
 
     def __init__(self, mul=1.0, add=0.0):
@@ -412,16 +445,16 @@ class PyoObject(PyoObjectBase):
                 _add_dummy = Dummy([wrap(self._base_objs,i) + obj for i, obj in enumerate(x)])
         self._keep_trace.append(_add_dummy)
         return _add_dummy
-        
+
     def __radd__(self, x):
         x, lmax = convertArgsToLists(x)
         if self.__len__() >= lmax:
             _add_dummy = Dummy([obj + wrap(x,i/self._op_duplicate) for i, obj in enumerate(self._base_objs)])
         else:
-            _add_dummy = Dummy([wrap(self._base_objs,i) + obj for i, obj in enumerate(x)])                
+            _add_dummy = Dummy([wrap(self._base_objs,i) + obj for i, obj in enumerate(x)])
         self._keep_trace.append(_add_dummy)
         return _add_dummy
-            
+
     def __iadd__(self, x):
         self.setAdd(x)
         return self
@@ -460,7 +493,7 @@ class PyoObject(PyoObjectBase):
     def __isub__(self, x):
         self.setSub(x)
         return self
- 
+
     def __mul__(self, x):
         x, lmax = convertArgsToLists(x)
         if self.__len__() >= lmax:
@@ -469,23 +502,23 @@ class PyoObject(PyoObjectBase):
             if isinstance(x, PyoObject):
                 _mul_dummy = x * self
             else:
-                _mul_dummy = Dummy([wrap(self._base_objs,i) * obj for i, obj in enumerate(x)])  
+                _mul_dummy = Dummy([wrap(self._base_objs,i) * obj for i, obj in enumerate(x)])
         self._keep_trace.append(_mul_dummy)
         return _mul_dummy
-        
+
     def __rmul__(self, x):
         x, lmax = convertArgsToLists(x)
         if self.__len__() >= lmax:
             _mul_dummy = Dummy([obj * wrap(x,i/self._op_duplicate) for i, obj in enumerate(self._base_objs)])
         else:
-            _mul_dummy = Dummy([wrap(self._base_objs,i) * obj for i, obj in enumerate(x)])                
+            _mul_dummy = Dummy([wrap(self._base_objs,i) * obj for i, obj in enumerate(x)])
         self._keep_trace.append(_mul_dummy)
         return _mul_dummy
-            
+
     def __imul__(self, x):
         self.setMul(x)
         return self
- 
+
     def __div__(self, x):
         x, lmax = convertArgsToLists(x)
         if self.__len__() >= lmax:
@@ -529,7 +562,7 @@ class PyoObject(PyoObjectBase):
 
     def __mod__(self, x):
         return Wrap(self, 0, x)
-    
+
     def __neg__(self):
         if self._zeros == None:
             self._zeros = Sig(0)
@@ -568,8 +601,8 @@ class PyoObject(PyoObjectBase):
             all : boolean, optional
                 If True, the object returns a list with the state of all
                 streams managed by the object.
-                
-                If False, it return a boolean corresponding to the state 
+
+                If False, it return a boolean corresponding to the state
                 of the first stream.
 
         """
@@ -586,9 +619,9 @@ class PyoObject(PyoObjectBase):
 
             all : boolean, optional
                 If True, the object returns a list with the state of all
-                streams managed by the object. 
-                
-                If False, it return a boolean corresponding to the state 
+                streams managed by the object.
+
+                If False, it return a boolean corresponding to the state
                 of the first stream.
 
         """
@@ -596,25 +629,25 @@ class PyoObject(PyoObjectBase):
             return [obj._getStream().isOutputting() for obj in self._base_objs]
         else:
             return self._base_objs[0]._getStream().isOutputting()
-            
+
     def get(self, all=False):
         """
         Return the first sample of the current buffer as a float.
-        
+
         Can be used to convert audio stream to usable Python data.
-        
-        Object that implements string identifier for specific audio 
+
+        Object that implements string identifier for specific audio
         streams must use the corresponding string to specify the stream
-        from which to get the value. See get() method definition in these 
+        from which to get the value. See get() method definition in these
         object's man pages.
-        
+
         :Args:
 
             all : boolean, optional
                 If True, the first value of each object's stream
-                will be returned as a list. 
-                
-                If False, only the value of the first object's stream 
+                will be returned as a list.
+
+                If False, only the value of the first object's stream
                 will be returned as a float.
 
         """
@@ -625,20 +658,20 @@ class PyoObject(PyoObjectBase):
 
     def play(self, dur=0, delay=0):
         """
-        Start processing without sending samples to output. 
+        Start processing without sending samples to output.
         This method is called automatically at the object creation.
 
         This method returns `self`, allowing it to be applied at the object
         creation.
-        
+
         :Args:
-        
+
             dur : float, optional
                 Duration, in seconds, of the object's activation. The default is 0
                 and means infinite duration.
             delay : float, optional
                 Delay, in seconds, before the object's activation. Defaults to 0.
-        
+
         """
         dur, delay, lmax = convertArgsToLists(dur, delay)
         if hasattr(self, "_trig_objs"):
@@ -654,11 +687,11 @@ class PyoObject(PyoObjectBase):
 
         This method returns `self`, allowing it to be applied at the object
         creation.
-        
+
         :Args:
 
             chnl : int, optional
-                Physical output assigned to the first audio stream of the object. 
+                Physical output assigned to the first audio stream of the object.
                 Defaults to 0.
             inc : int, optional
                 Output channel increment value. Defaults to 1.
@@ -667,15 +700,15 @@ class PyoObject(PyoObjectBase):
                 and means infinite duration.
             delay : float, optional
                 Delay, in seconds, before the object's activation. Defaults to 0.
-            
-        If `chnl` >= 0, successive streams increment the output number by 
+
+        If `chnl` >= 0, successive streams increment the output number by
         `inc` and wrap around the global number of channels.
-        
-        If `chnl` is negative, streams begin at 0, increment 
-        the output number by `inc` and wrap around the global number of 
+
+        If `chnl` is negative, streams begin at 0, increment
+        the output number by `inc` and wrap around the global number of
         channels. Then, the list of streams is scrambled.
-        
-        If `chnl` is a list, successive values in the list will be 
+
+        If `chnl` is a list, successive values in the list will be
         assigned to successive streams.
 
         """
@@ -687,19 +720,19 @@ class PyoObject(PyoObjectBase):
         if type(chnl) == ListType:
             [obj.out(wrap(chnl,i), wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._base_objs)]
         else:
-            if chnl < 0:    
+            if chnl < 0:
                 [obj.out(i*inc, wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(random.sample(self._base_objs, len(self._base_objs)))]
             else:
                 [obj.out(chnl+i*inc, wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._base_objs)]
         return self
-    
+
     def stop(self):
         """
         Stop processing.
 
         This method returns `self`, allowing it to be applied at the object
         creation.
-        
+
         """
         if hasattr(self, "_trig_objs"):
             self._trig_objs.stop()
@@ -710,18 +743,18 @@ class PyoObject(PyoObjectBase):
 
     def mix(self, voices=1):
         """
-        Mix the object's audio streams into `voices` streams and return 
+        Mix the object's audio streams into `voices` streams and return
         a Mix object.
-        
+
         :Args:
 
             voices : int, optional
-                Number of audio streams of the Mix object created by this method. 
+                Number of audio streams of the Mix object created by this method.
                 Defaults to 1.
 
-                If more than 1, object's streams are alternated and added into 
+                If more than 1, object's streams are alternated and added into
                 Mix object's streams.
-            
+
         """
         return Mix(self, voices)
 
@@ -755,30 +788,30 @@ class PyoObject(PyoObjectBase):
         self.setMul(mul)
         self.setAdd(add)
         return self
-        
+
     def setMul(self, x):
         """
         Replace the `mul` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 New `mul` attribute.
-        
+
         """
         self._mul = x
         x, lmax = convertArgsToLists(x)
         [obj.setMul(wrap(x,i/self._op_duplicate)) for i, obj in enumerate(self._base_objs)]
-        
+
     def setAdd(self, x):
         """
         Replace the `add` attribute.
-                
+
         :Args:
 
             x : float or PyoObject
                 New `add` attribute.
-        
+
         """
         self._add = x
         x, lmax = convertArgsToLists(x)
@@ -787,12 +820,12 @@ class PyoObject(PyoObjectBase):
     def setSub(self, x):
         """
         Replace and inverse the `add` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 New inversed `add` attribute.
-        
+
         """
         self._add = x
         x, lmax = convertArgsToLists(x)
@@ -801,7 +834,7 @@ class PyoObject(PyoObjectBase):
     def setDiv(self, x):
         """
         Replace and inverse the `mul` attribute.
-                
+
         :Args:
 
             x : float or PyoObject
@@ -844,30 +877,30 @@ class PyoObject(PyoObjectBase):
         if isinstance(getattr(self, attr), VarPort):
             setattr(self, attr, self._target_dict[attr])
         self._signal_dict[attr].stop()
-        
+
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         """
-        Opens a sliders window to control the parameters of the object. 
-        Only parameters that can be set to a PyoObject are allowed 
+        Opens a sliders window to control the parameters of the object.
+        Only parameters that can be set to a PyoObject are allowed
         to be mapped on a slider.
 
-        If a list of values are given to a parameter, a multisliders 
+        If a list of values are given to a parameter, a multisliders
         will be used to control each stream independently.
 
         :Args:
 
             map_list : list of SLMap objects, optional
-                Users defined set of parameters scaling. There is default 
+                Users defined set of parameters scaling. There is default
                 scaling for each object that accept `ctrl` method.
             title : string, optional
-                Title of the window. If none is provided, the name of the 
+                Title of the window. If none is provided, the name of the
                 class is used.
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for 
-        the server GUI before showing the controller window. 
+
+        If `wxnoserver` is set to True, the interpreter will not wait for
+        the server GUI before showing the controller window.
 
         """
         if map_list == None:
@@ -879,38 +912,38 @@ class PyoObject(PyoObjectBase):
 
     @property
     def mul(self):
-        """float or PyoObject. Multiplication factor.""" 
+        """float or PyoObject. Multiplication factor."""
         return self._mul
     @mul.setter
     def mul(self, x): self.setMul(x)
 
     @property
     def add(self):
-        """float or PyoObject. Addition factor.""" 
+        """float or PyoObject. Addition factor."""
         return self._add
     @add.setter
     def add(self, x): self.setAdd(x)
-           
+
 ######################################################################
 ### PyoTableObject -> base class for pyo table objects
 ######################################################################
 class PyoTableObject(PyoObjectBase):
     """
-    Base class for all pyo table objects. 
-    
-    A table object is a buffer memory to store precomputed samples. 
-    
+    Base class for all pyo table objects.
+
+    A table object is a buffer memory to store precomputed samples.
+
     The user should never instantiate an object of this class.
-    
+
     :Parent: :py:class:`PyoObjectBase`
- 
+
     :Args:
 
         size : int
             Length of the table in samples. Usually provided by the child object.
 
     """
-    
+
     _STREAM_TYPE = 'table'
 
     def __init__(self, size=0):
@@ -918,17 +951,17 @@ class PyoTableObject(PyoObjectBase):
         self._size = size
         self.viewFrame = None
         self.graphFrame = None
-        
+
     def save(self, path, format=0, sampletype=0):
         """
         Writes the content of the table in an audio file.
-        
+
         The sampling rate of the file is the sampling rate of the server
         and the number of channels is the number of table streams of the
         object.
 
         :Args:
-        
+
             path : string
                 Full path (including extension) of the new file.
             format : int, optional
@@ -942,8 +975,8 @@ class PyoTableObject(PyoObjectBase):
                     6. CAF - Core Audio File format {.caf}
                     7. OGG - Xiph OGG container {.ogg}
             sampletype : int, optional
-                Bit depth encoding of the audio file. 
-                
+                Bit depth encoding of the audio file.
+
                 SD2 and FLAC only support 16 or 24 bit int. Supported types are:
                     0. 16 bit int (default)
                     1. 24 bit int
@@ -960,16 +993,16 @@ class PyoTableObject(PyoObjectBase):
             if FILE_FORMATS.has_key(ext):
                 format = FILE_FORMATS[ext]
         savefileFromTable(self, path, format, sampletype)
-    
+
     def write(self, path, oneline=True):
         """
         Writes the content of the table in a text file.
-        
+
         This function can be used to store the table data as a
         list of floats into a text file.
-        
+
         :Args:
-        
+
             path : string
                 Full path of the generated file.
             oneline : boolean, optional
@@ -999,20 +1032,20 @@ class PyoTableObject(PyoObjectBase):
         """
         Reads the content of a text file and replaces the table data
         with the values stored in the file.
-        
+
         :Args:
-            
+
             path : string
                 Full path of the file to read.
-        
-        The format is a list of lists of floats. For example, A two 
+
+        The format is a list of lists of floats. For example, A two
         tablestreams object must be given a content like this:
-        
+
         [ [ 0.0, 1.0, 0.5, ... ], [ 1.0, 0.99, 0.98, 0.97, ... ] ]
-        
-        Each object's tablestream will be resized according to the 
+
+        Each object's tablestream will be resized according to the
         length of the lists.
-        
+
         """
         f = open(path, "r")
         f_list = eval(f.read())
@@ -1023,15 +1056,15 @@ class PyoTableObject(PyoObjectBase):
 
     def setSize(self, size):
         """
-        Change the size of the table. 
-        
+        Change the size of the table.
+
         This will erase the previously drawn waveform.
-        
+
         :Args:
-        
+
             size : int
                 New table size in samples.
-        
+
         """
         self._size = size
         [obj.setSize(size) for obj in self._base_objs]
@@ -1040,14 +1073,14 @@ class PyoTableObject(PyoObjectBase):
     def getSize(self, all=False):
         """
         Return table size in samples.
- 
+
         :Args:
-        
+
             all : boolean
                 If the table contains more than one stream and `all` is True,
                 returns a list of all sizes. Otherwise, returns only the
                 first size as an int. Defaults to False.
-       
+
         """
         if all:
             return [obj.getSize() for obj in self._base_objs]
@@ -1060,18 +1093,18 @@ class PyoTableObject(PyoObjectBase):
     def put(self, value, pos=0):
         """
         Puts a value at specified sample position in the table.
-        
+
         If the object has more than 1 tablestream, the default is to
-        record the value in each table. User can call obj[x].put() 
+        record the value in each table. User can call obj[x].put()
         to record into a specific table.
-        
+
         :Args:
-        
+
             value : float
                 Value, as floating-point, to record in the table.
             pos : int, optional
                 Position, in samples, where to record value. Defaults to 0.
-        
+
         """
         [obj.put(value, pos) for obj in self._base_objs]
         self.refreshView()
@@ -1079,16 +1112,16 @@ class PyoTableObject(PyoObjectBase):
     def get(self, pos):
         """
         Returns the value, as float, stored at a specified position in the table.
-        
+
         If the object has more than 1 tablestream, the default is to
-        return a list with the value of each tablestream. User can call 
+        return a list with the value of each tablestream. User can call
         obj[x].get() to get the value of a specific table.
-        
+
         :Args:
-        
+
             pos : int, optional
                 Position, in samples, where to read the value. Defaults to 0.
-        
+
         """
         values = [obj.get(pos) for obj in self._base_objs]
         if len(values) == 1: return values[0]
@@ -1097,14 +1130,14 @@ class PyoTableObject(PyoObjectBase):
     def getTable(self, all=False):
         """
         Returns the content of the table as list of floats.
-        
+
         :Args:
 
             all : boolean, optional
                 If True, all sub tables are retrieved and returned as a list
-                of list of floats. 
-                
-                If False, a single list containing the content of the first 
+                of list of floats.
+
+                If False, a single list containing the content of the first
                 subtable (or the only one) is returned.
 
         """
@@ -1239,10 +1272,82 @@ class PyoTableObject(PyoObjectBase):
         self.refreshView()
         return self
 
+    def add(self, x):
+        """
+        Performs addition on the table values.
+
+        Adds the argument to each table values, position by position
+        if the argument is a list or another PyoTableObject.
+
+        :Args:
+
+            x : float, list or PyoTableObject
+                value(s) to add.
+
+        """
+        if type(x) == ListType:
+            if type(x[0]) == ListType:
+                [obj.add(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
+            else:
+                [obj.add(x) for obj in self._base_objs]
+        else:
+            x, lmax = convertArgsToLists(x)
+            [obj.add(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
+        self.refreshView()
+        return self
+
+    def sub(self, x):
+        """
+        Performs substraction on the table values.
+
+        Substracts the argument to each table values, position by position
+        if the argument is a list or another PyoTableObject.
+
+        :Args:
+
+            x : float, list or PyoTableObject
+                value(s) to substract.
+
+        """
+        if type(x) == ListType:
+            if type(x[0]) == ListType:
+                [obj.sub(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
+            else:
+                [obj.sub(x) for obj in self._base_objs]
+        else:
+            x, lmax = convertArgsToLists(x)
+            [obj.sub(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
+        self.refreshView()
+        return self
+
+    def mul(self, x):
+        """
+        Performs multiplication on the table values.
+
+        Multiply each table values by the argument, position by position
+        if the argument is a list or another PyoTableObject.
+
+        :Args:
+
+            x : float, list or PyoTableObject
+                value(s) to multiply.
+
+        """
+        if type(x) == ListType:
+            if type(x[0]) == ListType:
+                [obj.mul(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
+            else:
+                [obj.mul(x) for obj in self._base_objs]
+        else:
+            x, lmax = convertArgsToLists(x)
+            [obj.mul(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
+        self.refreshView()
+        return self
+
     def copy(self):
         """
         Returns a deep copy of the object.
-        
+
         """
         args = [getattr(self, att) for att in self.__dir__()]
         if self.__class__.__name__ == "SndTable":
@@ -1263,18 +1368,18 @@ class PyoTableObject(PyoObjectBase):
     def view(self, title="Table waveform", wxnoserver=False):
         """
         Opens a window showing the contents of the table.
-        
+
         :Args:
-        
+
             title : string, optional
-                Window title. Defaults to "Table waveform". 
+                Window title. Defaults to "Table waveform".
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for 
-        the server GUI before showing the controller window. 
-        
+
+        If `wxnoserver` is set to True, the interpreter will not wait for
+        the server GUI before showing the controller window.
+
         """
         samples = self._base_objs[0].getViewTable((500,200))
         createViewTableWindow(samples, title, wxnoserver, self.__class__.__name__, self)
@@ -1284,7 +1389,7 @@ class PyoTableObject(PyoObjectBase):
 
     def _setGraphFrame(self, frame):
         self.graphFrame = frame
-        
+
     def refreshView(self):
         """
         Updates the graphical display of the table, if applicable.
@@ -1296,30 +1401,30 @@ class PyoTableObject(PyoObjectBase):
             self.viewFrame.update(samples)
         if self.graphFrame != None:
             self.graphFrame.update(self.getTable())
-            
+
     @property
     def size(self):
-        """int. Table size in samples.""" 
+        """int. Table size in samples."""
         return self._size
     @size.setter
     def size(self, x): self.setSize(x)
-        
+
 ######################################################################
 ### PyoMatrixObject -> base class for pyo matrix objects
 ######################################################################
 class PyoMatrixObject(PyoObjectBase):
     """
-    Base class for all pyo matrix objects. 
-    
-    A matrix object is a 2 dimensions buffer memory to store 
-    precomputed samples. 
-    
+    Base class for all pyo matrix objects.
+
+    A matrix object is a 2 dimensions buffer memory to store
+    precomputed samples.
+
     The user should never instantiate an object of this class.
-    
+
     :Parent: :py:class:`PyoObjectBase`
 
     """
-    
+
     _STREAM_TYPE = 'matrix'
 
     def __init__(self):
@@ -1329,15 +1434,15 @@ class PyoMatrixObject(PyoObjectBase):
     def write(self, path):
         """
         Writes the content of the matrix into a text file.
-        
+
         This function can be used to store the matrix data as a
         list of list of floats into a text file.
 
         :Args:
-            
+
             path : string
                 Full path of the generated file.
-         
+
         """
         f = open(path, "w")
         f.write(str([obj.getData() for obj in self._base_objs]))
@@ -1347,22 +1452,22 @@ class PyoMatrixObject(PyoObjectBase):
         """
         Reads the content of a text file and replaces the matrix data
         with the values in the file.
-        
-        Format is a list of lists of floats. For example, A two 
+
+        Format is a list of lists of floats. For example, A two
         matrixstreams object must be given a content like this:
-        
+
         [ [ [0.0 ,1.0, 0.5, ... ], [1.0, 0.99, 0.98, 0.97, ... ] ],
         [ [0.0, 1.0, 0.5, ... ], [1.0, 0.99, 0.98, 0.97, ... ] ] ]
-        
-        Each object's matrixstream will be resized according to the 
+
+        Each object's matrixstream will be resized according to the
         length of the lists, but the number of matrixstreams must be
         the same.
- 
+
         :Args:
-            
+
             path : string
                 Full path of the file to read.
-       
+
         """
         f = open(path, "r")
         f_list = eval(f.read())
@@ -1373,7 +1478,7 @@ class PyoMatrixObject(PyoObjectBase):
     def getSize(self):
         """
         Returns matrix size in samples. Size is a tuple (x, y).
-        
+
         """
         return self._size
 
@@ -1395,9 +1500,9 @@ class PyoMatrixObject(PyoObjectBase):
     def boost(self, min=-1.0, max=1.0, boost=0.01):
         """
         Boost the constrast of values in the matrix.
-        
+
         :Args:
-        
+
             min : float, optional
                 Minimum value. Defaults to -1.0.
             max : float, optional
@@ -1411,38 +1516,38 @@ class PyoMatrixObject(PyoObjectBase):
     def put(self, value, x=0, y=0):
         """
         Puts a value at specified position in the matrix.
-        
+
         If the object has more than 1 matrixstream, the default is to
-        record the value in each matrix. User can call obj[x].put() 
+        record the value in each matrix. User can call obj[x].put()
         to record in a specific matrix.
-        
+
         :Args:
-        
+
             value : float
                 Value, as floating-point, to record in the matrix.
             x : int, optional
                 X position where to record value. Defaults to 0.
             y : int, optional
                 Y position where to record value. Defaults to 0.
-        
+
         """
         [obj.put(value, x, y) for obj in self._base_objs]
 
     def get(self, x, y):
         """
         Returns the value, as float, at specified position in the matrix.
-        
+
         If the object has more than 1 matrixstream, the default is to
-        return a list with the value of each matrixstream. User can call 
+        return a list with the value of each matrixstream. User can call
         obj[x].get() to get the value of a specific matrix.
-        
+
         :Args:
-        
+
             x : int, optional
                 X position where to get value. Defaults to 0.
             y : int, optional
                 Y position where to get value. Defaults to 0.
-        
+
         """
         values = [obj.get(x, y) for obj in self._base_objs]
         if len(values) == 1: return values[0]
@@ -1451,25 +1556,25 @@ class PyoMatrixObject(PyoObjectBase):
     def view(self, title="Matrix viewer", wxnoserver=False):
         """
         Opens a window showing the contents of the matrix.
-        
+
         :Args:
-        
+
             title : string, optional
-                Window title. Defaults to "Matrix viewer". 
+                Window title. Defaults to "Matrix viewer".
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for 
-        the server GUI before showing the controller window. 
-        
-        """        
+
+        If `wxnoserver` is set to True, the interpreter will not wait for
+        the server GUI before showing the controller window.
+
+        """
         samples = self._base_objs[0].getViewData()
         createViewMatrixWindow(samples, self.getSize(), title, wxnoserver, self)
 
     def _setViewFrame(self, frame):
         self.viewFrame = frame
-        
+
     def refreshView(self):
         """
         Updates the graphical display of the matrix, if applicable.
@@ -1485,13 +1590,13 @@ class PyoMatrixObject(PyoObjectBase):
 class PyoPVObject(PyoObjectBase):
     """
     Base class for objects working with phase vocoder's magnitude and frequency streams.
-    
+
     The user should never instantiate an object of this class.
 
     :Parent: :py:class:`PyoObjectBase`
 
     """
-    
+
     _STREAM_TYPE = 'pvoc'
 
     def __init__(self):
@@ -1509,8 +1614,8 @@ class PyoPVObject(PyoObjectBase):
             all : boolean, optional
                 If True, the object returns a list with the state of all
                 streams managed by the object.
-                
-                If False, it return a boolean corresponding to the state 
+
+                If False, it return a boolean corresponding to the state
                 of the first stream.
 
         """
@@ -1521,20 +1626,20 @@ class PyoPVObject(PyoObjectBase):
 
     def play(self, dur=0, delay=0):
         """
-        Start processing without sending samples to output. 
+        Start processing without sending samples to output.
         This method is called automatically at the object creation.
 
         This method returns `self`, allowing it to be applied at the object
         creation.
-        
+
         :Args:
-        
+
             dur : float, optional
                 Duration, in seconds, of the object's activation. The default is 0
                 and means infinite duration.
             delay : float, optional
                 Delay, in seconds, before the object's activation. Defaults to 0.
-        
+
         """
         dur, delay, lmax = convertArgsToLists(dur, delay)
         if hasattr(self, "_trig_objs"):
@@ -1543,14 +1648,14 @@ class PyoPVObject(PyoObjectBase):
             [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._base_players)]
         [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._base_objs)]
         return self
-    
+
     def stop(self):
         """
         Stop processing.
 
         This method returns `self`, allowing it to be applied at the object
         creation.
-        
+
         """
         if hasattr(self, "_trig_objs"):
             self._trig_objs.stop()
@@ -1591,30 +1696,30 @@ class PyoPVObject(PyoObjectBase):
         if isinstance(getattr(self, attr), VarPort):
             setattr(self, attr, self._target_dict[attr])
         self._signal_dict[attr].stop()
-        
+
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         """
-        Opens a sliders window to control the parameters of the object. 
-        Only parameters that can be set to a PyoObject are allowed 
+        Opens a sliders window to control the parameters of the object.
+        Only parameters that can be set to a PyoObject are allowed
         to be mapped on a slider.
 
-        If a list of values are given to a parameter, a multisliders 
+        If a list of values are given to a parameter, a multisliders
         will be used to control each stream independently.
 
         :Args:
 
             map_list : list of SLMap objects, optional
-                Users defined set of parameters scaling. There is default 
+                Users defined set of parameters scaling. There is default
                 scaling for each object that accept `ctrl` method.
             title : string, optional
-                Title of the window. If none is provided, the name of the 
+                Title of the window. If none is provided, the name of the
                 class is used.
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for 
-        the server GUI before showing the controller window. 
+
+        If `wxnoserver` is set to True, the interpreter will not wait for
+        the server GUI before showing the controller window.
 
         """
         if map_list == None:
@@ -1623,7 +1728,7 @@ class PyoPVObject(PyoObjectBase):
             print("There is no controls for %s object." % self.__class__.__name__)
             return
         createCtrlWindow(self, map_list, title, wxnoserver)
-        
+
 ######################################################################
 ### Internal classes -> Used by pyo
 ######################################################################
@@ -1631,7 +1736,7 @@ class Mix(PyoObject):
     """
     Mix audio streams to arbitrary number of streams.
 
-    Mix the object's audio streams as `input` argument into `voices` 
+    Mix the object's audio streams as `input` argument into `voices`
     streams.
 
     :Parent: :py:class:`PyoObject`
@@ -1641,8 +1746,8 @@ class Mix(PyoObject):
         input : PyoObject or list of PyoObjects
             Input signal(s) to mix the streams.
         voices : int, optional
-            Number of streams of the Mix object. If more than 1, input 
-            object's streams are alternated and added into Mix object's 
+            Number of streams of the Mix object. If more than 1, input
+            object's streams are alternated and added into Mix object's
             streams. Defaults to 1.
 
     .. note::
@@ -1672,18 +1777,18 @@ class Mix(PyoObject):
         if type(input) == ListType:
             input_objs = []
             input_objs = [obj for pyoObj in input for obj in pyoObj.getBaseObjects()]
-        else:    
+        else:
             input_objs = input.getBaseObjects()
         input_len = len(input_objs)
-        if voices < 1: 
+        if voices < 1:
             voices = 1
             num = 1
-        elif voices > input_len and voices > lmax: 
+        elif voices > input_len and voices > lmax:
             num = voices
         elif lmax > input_len:
-            num = lmax    
+            num = lmax
         else:
-            num = input_len   
+            num = input_len
         sub_lists = []
         for i in range(voices):
             sub_lists.append([])
@@ -1703,7 +1808,7 @@ class Dummy(PyoObject):
     :Args:
 
         objs_list : list of audio Stream objects
-            List of Stream objects return by the PyoObject hidden method 
+            List of Stream objects return by the PyoObject hidden method
             getBaseObjects().
 
     .. note::
@@ -1712,9 +1817,9 @@ class Dummy(PyoObject):
         the PyoObject on which the operation is performed. A dummy object
         is created, which is just a copy of the audio Streams of the object,
         and the operation is applied on the Dummy, leaving the original
-        object unchanged. This lets the user performs multiple different 
+        object unchanged. This lets the user performs multiple different
         arithmetic operations on an object without conficts. Here, `b` is
-        a Dummy object with `a` as its input with a `mul` attribute of 0.5. 
+        a Dummy object with `a` as its input with a `mul` attribute of 0.5.
         attribute:
 
         >>> a = Sine()
@@ -1731,7 +1836,7 @@ class Dummy(PyoObject):
     >>> a = SineLoop(p, feedback=.05, mul=.1).mix(2).out()
     >>> b = SineLoop(p*1.253, feedback=.05, mul=.06).mix(2).out()
     >>> c = SineLoop(p*1.497, feedback=.05, mul=.03).mix(2).out()
-    
+
     """
     def __init__(self, objs_list):
         PyoObject.__init__(self)
@@ -1743,7 +1848,7 @@ class Dummy(PyoObject):
             else:
                 tmp_list.append(x)
         self._base_objs = tmp_list
-        
+
 class InputFader(PyoObject):
     """
     Audio streams crossfader.
@@ -1755,9 +1860,9 @@ class InputFader(PyoObject):
 
     .. note::
 
-        The setInput method, available to object with `input` attribute, 
-        uses an InputFader object internally to perform crossfade between 
-        the old and the new audio input assigned to the object. 
+        The setInput method, available to object with `input` attribute,
+        uses an InputFader object internally to perform crossfade between
+        the old and the new audio input assigned to the object.
 
     >>> s = Server().boot()
     >>> s.start()
@@ -1777,7 +1882,7 @@ class InputFader(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1792,7 +1897,7 @@ class InputFader(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal.""" 
+        """PyoObject. Input signal."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -1800,14 +1905,14 @@ class InputFader(PyoObject):
 class Sig(PyoObject):
     """
     Convert numeric value to PyoObject signal.
-    
+
     :Parent: :py:class:`PyoObject`
 
     :Args:
 
         value : float or PyoObject
             Numerical value to convert.
-    
+
     >>> import random
     >>> s = Server().boot()
     >>> s.start()
@@ -1843,10 +1948,10 @@ class Sig(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMap(0, 1, "lin", "value", self._value)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-    
+
     @property
     def value(self):
-        """float or PyoObject. Numerical value to convert.""" 
+        """float or PyoObject. Numerical value to convert."""
         return self._value
     @value.setter
     def value(self, x): self.setValue(x)
@@ -1870,7 +1975,7 @@ class VarPort(PyoObject):
         init : float, optional
             Initial value of the internal memory. Defaults to 0.
         function : Python callable, optional
-            If provided, it will be called at the end of the line. 
+            If provided, it will be called at the end of the line.
             Defaults to None.
         arg : any Python object, optional
             Optional argument sent to the function called at the end of the line.
@@ -1885,7 +1990,7 @@ class VarPort(PyoObject):
     >>> def callback(arg):
     ...     print "end of line"
     ...     print arg
-    ... 
+    ...
     >>> fr = VarPort(value=500, time=2, init=250, function=callback, arg="YEP!")
     >>> a = SineLoop(freq=[fr,fr*1.01], feedback=0.05, mul=.2).out()
 
@@ -1894,9 +1999,9 @@ class VarPort(PyoObject):
         PyoObject.__init__(self, mul, add)
         self._value = value
         self._time = time
-        self._function = function
+        self._function = getWeakMethodRef(function)
         value, time, init, function, arg, mul ,add, lmax = convertArgsToLists(value, time, init, function, arg, mul, add)
-        self._base_objs = [VarPort_base(wrap(value,i), wrap(time,i), wrap(init,i), wrap(function,i), wrap(arg,i), wrap(mul,i), wrap(add,i)) for i in range(lmax)]
+        self._base_objs = [VarPort_base(wrap(value,i), wrap(time,i), wrap(init,i), WeakMethod(wrap(function,i)), wrap(arg,i), wrap(mul,i), wrap(add,i)) for i in range(lmax)]
 
     def setValue(self, x):
         """
@@ -1929,33 +2034,33 @@ class VarPort(PyoObject):
     def setFunction(self, x):
         """
         Replace the `function` attribute.
-        
+
         :Args:
 
             x : Python function
                 new `function` attribute.
-        
+
         """
-        self._function = x
+        self._function = getWeakMethodRef(x)
         x, lmax = convertArgsToLists(x)
-        [obj.setFunction(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
+        [obj.setFunction(WeakMethod(wrap(x,i))) for i, obj in enumerate(self._base_objs)]
 
     @property
     def value(self):
-        """float. Numerical value to convert.""" 
+        """float. Numerical value to convert."""
         return self._value
     @value.setter
     def value(self, x): self.setValue(x)
 
     @property
     def time(self):
-        """float. Ramp time.""" 
+        """float. Ramp time."""
         return self._time
     @time.setter
     def time(self, x): self.setTime(x)
 
     @property
-    def function(self): 
+    def function(self):
         """Python callable. Function to be called."""
         return self._function
     @function.setter
@@ -2019,23 +2124,23 @@ class Pow(PyoObject):
 
     @property
     def base(self):
-        """float or PyoObject. Base composant.""" 
+        """float or PyoObject. Base composant."""
         return self._base
     @base.setter
     def base(self, x): self.setBase(x)
 
     @property
     def exponent(self):
-        """float or PyoObject. Exponent composant.""" 
+        """float or PyoObject. Exponent composant."""
         return self._exponent
     @exponent.setter
     def exponent(self, x): self.setExponent(x)
-    
+
 class Wrap(PyoObject):
     """
     Wraps-around the signal that exceeds the `min` and `max` thresholds.
 
-    This object is useful for table indexing, phase shifting or for 
+    This object is useful for table indexing, phase shifting or for
     clipping and modeling an audio signal.
 
     :Parent: :py:class:`PyoObject`
@@ -2126,21 +2231,21 @@ class Wrap(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def min(self):
-        """float or PyoObject. Minimum possible value.""" 
+        """float or PyoObject. Minimum possible value."""
         return self._min
     @min.setter
     def min(self, x): self.setMin(x)
 
     @property
     def max(self):
-        """float or PyoObject. Maximum possible value.""" 
+        """float or PyoObject. Maximum possible value."""
         return self._max
     @max.setter
     def max(self, x): self.setMax(x)
@@ -2194,7 +2299,7 @@ class Compare(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -2209,7 +2314,7 @@ class Compare(PyoObject):
     def setComp(self, x):
         """
         Replace the `comp` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -2222,13 +2327,13 @@ class Compare(PyoObject):
         self._comp = x
         x, lmax = convertArgsToLists(x)
         [obj.setComp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
-        
+
     def setMode(self, x):
         """
-        Replace the `mode` attribute. 
-        
+        Replace the `mode` attribute.
+
         Allowed operator are "<", "<=", ">", ">=", "==", "!=".
-        
+
         :Args:
 
             x : string
@@ -2241,21 +2346,21 @@ class Compare(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal.""" 
+        """PyoObject. Input signal."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def comp(self):
-        """PyoObject. Comparison signal.""" 
+        """PyoObject. Comparison signal."""
         return self._comp
     @comp.setter
     def comp(self, x): self.setComp(x)
 
     @property
     def mode(self):
-        """string. Comparison operator.""" 
+        """string. Comparison operator."""
         return self._mode
     @mode.setter
-    def mode(self, x): self.setMode(x)
+    def mode(self, x): self.setMode(x)
\ No newline at end of file
diff --git a/pyolib/_maps.py b/pyolib/_maps.py
index 7005918..9687aa7 100644
--- a/pyolib/_maps.py
+++ b/pyolib/_maps.py
@@ -1,22 +1,22 @@
 # -*- coding: utf-8 -*-
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU Lesser General Public
+License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
 from math import pow, log10
 
@@ -51,11 +51,11 @@ class Map:
     def get(self, x):
         """
         Takes `x` between 0 and 1 and returns scaled value.
-        
+
         """
         if x < 0: x = 0.0
-        elif x > 1: x = 1.0 
-        
+        elif x > 1: x = 1.0
+
         if self._scale == 'log':
             return pow(10, x * log10(self._max/self._min) + log10(self._min))
         else:
@@ -63,11 +63,11 @@ class Map:
 
     def set(self, x):
         """
-        Takes `x` in the real range and returns value unscaled 
+        Takes `x` in the real range and returns value unscaled
         (between 0 and 1).
-        
+
         """
-        
+
         if self._scale == 'log':
             return log10(x/self._min) / log10(self._max/self._min)
         else:
@@ -76,7 +76,7 @@ class Map:
     def setMin(self, x):
         """
         Replace the `min` attribute.
-        
+
         :Args:
 
             x : float
@@ -84,11 +84,11 @@ class Map:
 
         """
         self._min = x
-        
+
     def setMax(self, x):
         """
         Replace the `max` attribute.
-        
+
         :Args:
 
             x : float
@@ -100,7 +100,7 @@ class Map:
     def setScale(self, x):
         """
         Replace the `scale` attribute.
-        
+
         :Args:
 
             x : string
@@ -110,32 +110,32 @@ class Map:
         self._scale = x
 
     @property
-    def min(self): 
+    def min(self):
         """int or float. Lowest value of the range."""
         return self._min
     @min.setter
-    def min(self, x): 
-        self.setMin(x)    
+    def min(self, x):
+        self.setMin(x)
     @property
-    def max(self): 
+    def max(self):
         """int or float. Highest value of the range."""
         return self._max
     @max.setter
-    def max(self, x): 
+    def max(self, x):
         self.setMax(x)
     @property
-    def scale(self): 
+    def scale(self):
         """string. Method used to scale the input value."""
         return self._scale
     @scale.setter
-    def scale(self, x): 
+    def scale(self, x):
         self.setScale(x)
 
 class SLMap(Map):
     """
     Base Map class used to manage control sliders.
 
-    Derived from Map class, a few parameters are added for sliders 
+    Derived from Map class, a few parameters are added for sliders
     initialization.
 
     :Parent: :py:class:`Map`
@@ -147,7 +147,7 @@ class SLMap(Map):
         max : int or float
             Highest value of the range.
         scale : string {'lin', 'log'}
-            Method used to scale the input value on the specified range.    
+            Method used to scale the input value on the specified range.
         name : string
             Name of the attributes the slider is affected to.
         init : int or float
@@ -156,12 +156,12 @@ class SLMap(Map):
         res : string {'int', 'float'}, optional
             Sets the resolution of the slider. Defaults to 'float'.
         ramp : float, optional
-            Ramp time, in seconds, used to smooth the signal sent from slider 
+            Ramp time, in seconds, used to smooth the signal sent from slider
             to object's attribute. Defaults to 0.025.
         dataOnly : boolean, optional
-            Set this argument to True if the parameter does not accept audio 
-            signal as control but discreet values. If True, label will be 
-            marked with a star symbol (*). Defaults to False. 
+            Set this argument to True if the parameter does not accept audio
+            signal as control but discreet values. If True, label will be
+            marked with a star symbol (*). Defaults to False.
 
     >>> s = Server().boot()
     >>> s.start()
@@ -176,23 +176,23 @@ class SLMap(Map):
         self._name, self._init, self._res, self._ramp, self._dataOnly = name, init, res, ramp, dataOnly
 
     @property
-    def name(self): 
+    def name(self):
         """string. Name of the parameter to control."""
         return self._name
     @property
-    def init(self): 
+    def init(self):
         """float. Initial value of the slider."""
         return self._init
     @property
-    def res(self): 
+    def res(self):
         """string. Slider resolution {int or float}."""
         return self._res
     @property
-    def ramp(self): 
+    def ramp(self):
         """float. Ramp time in seconds."""
         return self._ramp
     @property
-    def dataOnly(self): 
+    def dataOnly(self):
         """boolean. True if argument does not accept audio stream."""
         return self._dataOnly
 
@@ -210,7 +210,7 @@ class SLMapFreq(SLMap):
 
     .. note::
 
-        SLMapFreq values are: 
+        SLMapFreq values are:
 
         - min = 20.0
         - max = 20000.0
@@ -264,7 +264,7 @@ class SLMapPhase(SLMap):
 
     .. note::
 
-        SLMapPhase values are: 
+        SLMapPhase values are:
 
         - min = 0.0
         - max = 1.0
@@ -291,7 +291,7 @@ class SLMapPan(SLMap):
 
     .. note::
 
-        SLMapPhase values are: 
+        SLMapPhase values are:
 
         - min = 0.0
         - max = 1.0
@@ -318,7 +318,7 @@ class SLMapQ(SLMap):
 
     .. note::
 
-        SLMapQ values are: 
+        SLMapQ values are:
 
         - min = 0.1
         - max = 100.0
@@ -345,7 +345,7 @@ class SLMapDur(SLMap):
 
     .. note::
 
-        SLMapDur values are: 
+        SLMapDur values are:
 
         - min = 0.
         - max = 60.0
@@ -356,4 +356,4 @@ class SLMapDur(SLMap):
 
     """
     def __init__(self, init=1.):
-        SLMap.__init__(self, 0., 60., 'lin', 'dur', init, 'float', 0.025)
+        SLMap.__init__(self, 0., 60., 'lin', 'dur', init, 'float', 0.025)
\ No newline at end of file
diff --git a/pyolib/_tkwidgets.py b/pyolib/_tkwidgets.py
index 8057194..f4b0f1c 100644
--- a/pyolib/_tkwidgets.py
+++ b/pyolib/_tkwidgets.py
@@ -1,20 +1,21 @@
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
-This file is part of pyo.
+This file is part of pyo, a python module to help digital signal
+processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU Lesser General Public
+License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
 from types import ListType, FloatType, IntType
 import math, sys, os
@@ -24,7 +25,7 @@ try:
     from PIL import Image, ImageDraw, ImageTk
 except:
     pass
-    
+
 # constants for platform displays with Tk
 if sys.platform == 'linux2':
     Y_OFFSET = 0
@@ -40,7 +41,7 @@ else:
 ### Multisliders
 ######################################################################
 class MultiSlider(Frame):
-    def __init__(self, master, init, key, command): 
+    def __init__(self, master, init, key, command):
         Frame.__init__(self, master, bd=0, relief=FLAT)
         self._values = init
         self._nchnls = len(init)
@@ -48,13 +49,13 @@ class MultiSlider(Frame):
         self._command = command
         self._lines = []
         self._height = 16
-        self.canvas = Canvas(self, height=self._height*self._nchnls+1, 
+        self.canvas = Canvas(self, height=self._height*self._nchnls+1,
                             width=225, relief=FLAT, bd=0, bg="#BCBCAA")
         w = self.canvas.winfo_width()
         for i in range(self._nchnls):
             x = int(self._values[i] * w)
             y = self._height * i + Y_OFFSET
-            self._lines.append(self.canvas.create_rectangle(0, y, x, 
+            self._lines.append(self.canvas.create_rectangle(0, y, x,
                                 y+self._height-1, width=0, fill="#121212"))
         self.canvas.bind("<Button-1>", self.clicked)
         self.canvas.bind("<Motion>", self.move)
@@ -69,10 +70,10 @@ class MultiSlider(Frame):
             y = self._height * i + Y_OFFSET
             x = self._values[i] * w
             self.canvas.coords(self._lines[i], 0, y, x, y+self._height-1)
-    
+
     def clicked(self, event):
         self.update(event)
-    
+
     def move(self, event):
         if event.state == 0x0100:
             slide = (event.y - Y_OFFSET) / self._height
@@ -87,7 +88,7 @@ class MultiSlider(Frame):
         y = self._height * slide + Y_OFFSET
         self.canvas.coords(self._lines[slide], 0, y, event.x, y+self._height-1)
         self._command(self._key, self._values)
-       
+
 ######################################################################
 ### Control window for PyoObject
 ######################################################################
@@ -117,7 +118,7 @@ class PyoObjectControl(Frame):
             # filters PyoObjects
             if type(init) not in [ListType, FloatType, IntType]:
                 self._excluded.append(key)
-            else:    
+            else:
                 self._maps[key] = m
                 # label (param name)
                 label = Label(self, height=1, width=10, highlightthickness=0, text=key)
@@ -125,13 +126,13 @@ class PyoObjectControl(Frame):
                 # create and pack slider
                 if type(init) != ListType:
                     self._sliders.append(Scale(self, command=Command(self.setval, key),
-                                  orient=HORIZONTAL, relief=GROOVE, from_=0., to=1., showvalue=False, 
+                                  orient=HORIZONTAL, relief=GROOVE, from_=0., to=1., showvalue=False,
                                   resolution=.0001, bd=1, length=225, troughcolor="#BCBCAA", width=12))
                     self._sliders[-1].set(m.set(init))
                     disp_height = 1
                 else:
-                    self._sliders.append(MultiSlider(self, [m.set(x) for x in init], key, self.setval)) 
-                    disp_height = len(init)   
+                    self._sliders.append(MultiSlider(self, [m.set(x) for x in init], key, self.setval))
+                    disp_height = len(init)
                 self._sliders[-1].grid(row=i, column=1, sticky=E+W)
                 # display of numeric values
                 textvar = StringVar(self)
@@ -142,7 +143,7 @@ class PyoObjectControl(Frame):
                     self._displays[key].set("%.4f" % init)
                 else:
                     self._displays[key].set("\n".join(["%.4f" % i for i in init]))
-                # set obj attribute to PyoObject SigTo     
+                # set obj attribute to PyoObject SigTo
                 self._sigs[key] = SigTo(init, .025, init)
                 refStream = self._obj.getBaseObjects()[0]._getStream()
                 server = self._obj.getBaseObjects()[0].getServer()
@@ -150,10 +151,10 @@ class PyoObjectControl(Frame):
                     curStream = self._sigs[key].getBaseObjects()[k]._getStream()
                     server.changeStreamPosition(refStream, curStream)
                 setattr(self._obj, key, self._sigs[key])
-        # padding        
+        # padding
         top = self.winfo_toplevel()
         top.rowconfigure(0, weight=1)
-        top.columnconfigure(0, weight=1)       
+        top.columnconfigure(0, weight=1)
         self.columnconfigure(1, weight=1)
         self.grid(ipadx=5, ipady=5, sticky=E+W)
 
@@ -168,10 +169,10 @@ class PyoObjectControl(Frame):
         if type(x) != ListType:
             value = self._maps[key].get(float(x))
             self._displays[key].set("%.4f" % value)
-        else:    
-            value = [self._maps[key].get(float(y)) for y in x] 
+        else:
+            value = [self._maps[key].get(float(y)) for y in x]
             self._displays[key].set("\n".join(["%.4f" % i for i in value]))
-        
+
         self._values[key] = value
         setattr(self._sigs[key], "value", value)
 
@@ -191,10 +192,10 @@ class ViewTable_withPIL(Frame):
         draw.line(samples, fill=0, width=1)
         self.img = ImageTk.PhotoImage(im)
         self.canvas.create_image(self.width/2,self.height/2,image=self.img)
-        self.canvas.create_line(0, self.half_height+2, self.width, self.half_height+2, fill='grey', dash=(4,2))    
+        self.canvas.create_line(0, self.half_height+2, self.width, self.half_height+2, fill='grey', dash=(4,2))
         self.canvas.grid()
         self.grid(ipadx=10, ipady=10)
-    
+
 class ViewTable_withoutPIL(Frame):
     def __init__(self, master=None, samples=None):
         Frame.__init__(self, master, bd=1, relief=GROOVE)
@@ -202,7 +203,7 @@ class ViewTable_withoutPIL(Frame):
         self.height = 200
         self.half_height = self.height / 2
         self.canvas = Canvas(self, height=self.height, width=self.width, relief=SUNKEN, bd=1, bg="#EFEFEF")
-        self.canvas.create_line(0, self.half_height+Y_OFFSET, self.width, self.half_height+Y_OFFSET, fill='grey', dash=(4,2))    
+        self.canvas.create_line(0, self.half_height+Y_OFFSET, self.width, self.half_height+Y_OFFSET, fill='grey', dash=(4,2))
         self.canvas.create_line(*samples)
         self.canvas.grid()
         self.grid(ipadx=10, ipady=10)
@@ -247,7 +248,7 @@ class ViewMatrix_withoutPIL(Frame):
 ### Server Object User Interface (Tk)
 ######################################################################
 class ServerGUI(Frame):
-    def __init__(self, master=None, nchnls=2, startf=None, stopf=None, recstartf=None, 
+    def __init__(self, master=None, nchnls=2, startf=None, stopf=None, recstartf=None,
                 recstopf=None, ampf=None, started=0, locals=None, shutdown=None, meter=True, timer=True, amp=1.):
         Frame.__init__(self, master, padx=10, pady=10, bd=2, relief=GROOVE)
         self.shutdown = shutdown
@@ -273,7 +274,7 @@ class ServerGUI(Frame):
         self.createWidgets()
         if started == 1:
             self.start(True)
-        
+
 
     def createWidgets(self):
         row = 0
@@ -290,14 +291,14 @@ class ServerGUI(Frame):
         self.quitButton = Button(self, text='Quit', command=self.on_quit)
         self.quitButton.grid(ipadx=5, row=row, column=2)
         row += 1
-        
+
         self.ampScale = Scale(self, command=self.setAmp, digits=4, label='Amplitude (dB)',
-                              orient=HORIZONTAL, relief=GROOVE, from_=-60.0, to=18.0, 
+                              orient=HORIZONTAL, relief=GROOVE, from_=-60.0, to=18.0,
                               resolution=.01, bd=1, length=250, troughcolor="#BCBCAA", width=10)
         self.ampScale.set(20.0 * math.log10(self.amp))
         self.ampScale.grid(ipadx=5, ipady=5, row=row, column=0, columnspan=3)
         row += 1
-        
+
         if self.meter:
             self.vumeter = Canvas(self, height=5*self.nchnls+1, width=250, relief=FLAT, bd=0, bg="#323232")
             self.green = []
@@ -330,8 +331,8 @@ class ServerGUI(Frame):
             self.text.bind("<Return>", self.getText)
             self.text.bind("<Up>", self.getPrev)
             self.text.bind("<Down>", self.getNext)
-            
-    
+
+
     def on_quit(self):
         self.shutdown()
         self.quit()
@@ -346,16 +347,16 @@ class ServerGUI(Frame):
 
     def setTime(self, *args):
         self.timer_strvar.set(" %02d : %02d : %02d : %03d" % (args[0], args[1], args[2], args[3]))
-        
+
     def getNext(self, event):
         self.text.delete("1.0", END)
         self._histo_count += 1
         if self._histo_count >= len(self._history):
             self._histo_count = len(self._history)
-        else:    
+        else:
             self.text.insert("1.0", self._history[self._histo_count])
         return "break"
-    
+
     def getText(self, event):
         source = self.text.get("1.0", END)
         self.text.delete("1.0", END)
@@ -363,7 +364,7 @@ class ServerGUI(Frame):
         self._history.append(source)
         self._histo_count = len(self._history)
         return "break"
-    
+
     def start(self, justSet=False):
         if self._started == False:
             if not justSet:
@@ -403,7 +404,7 @@ class ServerGUI(Frame):
                 self.vumeter.coords(self.green[i], 0, y, self.B1, y)
                 self.vumeter.coords(self.yellow[i], self.B1, y, amp, y)
                 self.vumeter.coords(self.red[i], self.B2, y, self.B2, y)
-            else:    
+            else:
                 self.vumeter.coords(self.green[i], 0, y, self.B1, y)
                 self.vumeter.coords(self.yellow[i], self.B1, y, self.B2, y)
-                self.vumeter.coords(self.red[i], self.B2, y, amp, y)
+                self.vumeter.coords(self.red[i], self.B2, y, amp, y)
\ No newline at end of file
diff --git a/pyolib/_widgets.py b/pyolib/_widgets.py
index 40bded2..912a041 100644
--- a/pyolib/_widgets.py
+++ b/pyolib/_widgets.py
@@ -1,22 +1,22 @@
 # -*- coding: utf-8 -*-
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU Lesser General Public
+License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
 from types import ListType, FloatType, IntType
 import math, sys, os, random
@@ -47,18 +47,18 @@ if not PYO_USE_WX:
         from _tkwidgets import *
         PYO_USE_TK = True
         print """
-WxPython is not found for the current python version. 
-Pyo will use a minimal GUI toolkit written with Tkinter. 
-This toolkit has limited functionnalities and is no more 
+WxPython is not found for the current python version.
+Pyo will use a minimal GUI toolkit written with Tkinter.
+This toolkit has limited functionnalities and is no more
 maintained or updated. If you want to use all of pyo's
-GUI features, you should install WxPython, available here: 
+GUI features, you should install WxPython, available here:
 http://www.wxpython.org/
 """
     except:
         PYO_USE_TK = False
         print """
 Neither WxPython nor Tkinter are found for the current python version.
-Pyo's GUI features are disabled. For a complete GUI toolkit, you should 
+Pyo's GUI features are disabled. For a complete GUI toolkit, you should
 consider installing WxPython, available here: http://www.wxpython.org/
 """
 
@@ -83,10 +83,10 @@ def createRootWindow():
             return None
         else:
             return None
-    else:        
-        if not WX_APP: 
+    else:
+        if not WX_APP:
             win = wx.App(False)
-            WX_APP = True 
+            WX_APP = True
             return win
         else:
             return None
@@ -97,10 +97,10 @@ def tkCloseWindow(win):
 
 def tkCloseWindowFromKeyboard(event):
     win = event.widget
-    if not isinstance(win, ServerGUI): 
+    if not isinstance(win, ServerGUI):
         win.destroy()
         if win in WINDOWS: WINDOWS.remove(win)
-                
+
 def tkCreateToplevelWindow():
     win = Toplevel()
     WINDOWS.append(win)
@@ -131,7 +131,7 @@ def wxShowWindow(f, title, root):
     f.Show()
     if root != None:
         root.MainLoop()
-    
+
 def wxCreateDelayedCtrlWindows():
     for win in CTRLWINDOWS:
         f = PyoObjectControl(None, win[0], win[1])
@@ -197,7 +197,7 @@ def wxCreateDelayedScopeWindows():
         if win[0] != None:
             win[0]._setViewFrame(f)
         wxDisplayWindow(f, title)
-    
+
 def createCtrlWindow(obj, map_list, title, wxnoserver=False):
     if not PYO_USE_WX:
         createRootWindow()
@@ -225,7 +225,7 @@ def createGraphWindow(obj, mode, xlen, yrange, title, wxnoserver=False):
             if title == None: title = obj.__class__.__name__
             wxShowWindow(f, title, root)
         else:
-            GRAPHWINDOWS.append([obj, mode, xlen, yrange, title])   
+            GRAPHWINDOWS.append([obj, mode, xlen, yrange, title])
 
 def createDataGraphWindow(obj, yrange, title, wxnoserver=False):
     if not PYO_USE_WX:
@@ -238,8 +238,8 @@ def createDataGraphWindow(obj, yrange, title, wxnoserver=False):
             wxShowWindow(f, title, root)
             obj._setGraphFrame(f)
         else:
-            DATAGRAPHWINDOWS.append([obj, yrange, title])   
-        
+            DATAGRAPHWINDOWS.append([obj, yrange, title])
+
 def createViewTableWindow(samples, title="Table waveform", wxnoserver=False, tableclass=None, object=None):
     if not PYO_USE_WX:
         createRootWindow()
@@ -256,7 +256,7 @@ def createViewTableWindow(samples, title="Table waveform", wxnoserver=False, tab
             if object != None:
                 object._setViewFrame(f)
         else:
-            TABLEWINDOWS.append([samples, tableclass, title, object])    
+            TABLEWINDOWS.append([samples, tableclass, title, object])
 
 def createSndViewTableWindow(obj, title="Table waveform", wxnoserver=False, tableclass=None, mouse_callback=None):
     if not PYO_USE_WX:
@@ -275,12 +275,12 @@ def createSndViewTableWindow(obj, title="Table waveform", wxnoserver=False, tabl
             obj._setViewFrame(f)
         else:
             SNDTABLEWINDOWS.append([obj, tableclass, title, mouse_callback])
-        
+
 def createViewMatrixWindow(samples, size, title="Matrix viewer", wxnoserver=False, object=None):
-    if not WITH_PIL: print """The Python Imaging Library is not installed. 
+    if not WITH_PIL: print """The Python Imaging Library is not installed.
 It helps a lot to speed up matrix drawing!"""
     if not PYO_USE_WX:
-        createRootWindow()    
+        createRootWindow()
         win = tkCreateToplevelWindow()
         if WITH_PIL: f = ViewMatrix_withPIL(win, samples, size)
         else: f = ViewMatrix_withoutPIL(win, samples, size)
@@ -295,7 +295,7 @@ It helps a lot to speed up matrix drawing!"""
             if object != None:
                 object._setViewFrame(f)
         else:
-            MATRIXWINDOWS.append([samples,size,title, object])    
+            MATRIXWINDOWS.append([samples,size,title, object])
 
 def createSpectrumWindow(object, title, wxnoserver=False):
     if not PYO_USE_WX:
@@ -309,7 +309,7 @@ def createSpectrumWindow(object, title, wxnoserver=False):
             if object != None:
                 object._setViewFrame(f)
         else:
-            SPECTRUMWINDOWS.append([object, title])   
+            SPECTRUMWINDOWS.append([object, title])
 
 def createScopeWindow(object, title, wxnoserver=False):
     if not PYO_USE_WX:
@@ -323,8 +323,8 @@ def createScopeWindow(object, title, wxnoserver=False):
             if object != None:
                 object._setViewFrame(f)
         else:
-            SCOPEWINDOWS.append([object, title])   
-        
+            SCOPEWINDOWS.append([object, title])
+
 def createServerGUI(nchnls, start, stop, recstart, recstop, setAmp, started, locals, shutdown, meter, timer, amp, exit):
     global X, Y, MAX_X, NEXT_Y
     if not PYO_USE_WX:
@@ -335,7 +335,7 @@ def createServerGUI(nchnls, start, stop, recstart, recstop, setAmp, started, loc
         f.focus_set()
     else:
         win = createRootWindow()
-        f = ServerGUI(None, nchnls, start, stop, recstart, recstop, setAmp, started, locals, shutdown, meter, timer, amp, exit) 
+        f = ServerGUI(None, nchnls, start, stop, recstart, recstop, setAmp, started, locals, shutdown, meter, timer, amp, exit)
         f.SetTitle("pyo server")
         f.SetPosition((30, 30))
         f.Show()
@@ -354,4 +354,3 @@ def createServerGUI(nchnls, start, stop, recstart, recstop, setAmp, started, loc
         wx.CallAfter(wxCreateDelayedScopeWindows)
         wx.CallAfter(f.Raise)
     return f, win
-        
diff --git a/pyolib/_wxwidgets.py b/pyolib/_wxwidgets.py
index 9fed692..aeec4fe 100644
--- a/pyolib/_wxwidgets.py
+++ b/pyolib/_wxwidgets.py
@@ -1,22 +1,22 @@
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
-This file is part of pyo.
+This file is part of pyo, a python module to help digital signal
+processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+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 wx, os, sys, math, time, random
 from types import ListType, FloatType, IntType
 
@@ -24,7 +24,7 @@ try:
     from PIL import Image, ImageDraw, ImageTk
 except:
     pass
-    
+
 BACKGROUND_COLOUR = "#EBEBEB"
 
 def interpFloat(t, v1, v2):
@@ -53,7 +53,7 @@ def powOfTwo(x):
 
 def powOfTwoToInt(x):
     return POWOFTWO[x]
-        
+
 def GetRoundBitmap( w, h, r ):
     maskColor = wx.Color(0,0,0)
     shownColor = wx.Color(5,5,5)
@@ -72,18 +72,18 @@ def GetRoundShape( w, h, r ):
     return wx.RegionFromBitmap( GetRoundBitmap(w,h,r) )
 
 class ControlSlider(wx.Panel):
-    def __init__(self, parent, minvalue, maxvalue, init=None, pos=(0,0), size=(200,16), log=False, 
+    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):
         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, 
+        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY, pos=pos, size=size,
                             style=wx.NO_BORDER | wx.WANTS_CHARS | wx.EXPAND)
         self.parent = parent
-        if backColour: 
+        if backColour:
             self.backgroundColour = backColour
-        else: 
+        else:
             self.backgroundColour = BACKGROUND_COLOUR
-        self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)  
+        self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
         self.SetBackgroundColour(self.backgroundColour)
         self.orient = orient
         # self.SetMinSize(self.GetSize())
@@ -109,10 +109,10 @@ class ControlSlider(wx.Panel):
         self.propagate = True
         self.midictl = None
         self.new = ''
-        if init != None: 
+        if init != None:
             self.SetValue(init)
             self.init = init
-        else: 
+        else:
             self.SetValue(minvalue)
             self.init = minvalue
         self.clampPos()
@@ -151,7 +151,7 @@ class ControlSlider(wx.Panel):
     def Disable(self):
         self._enable = False
         self.Refresh()
-        
+
     def setSliderHeight(self, height):
         self.sliderHeight = height
         self.Refresh()
@@ -162,7 +162,7 @@ class ControlSlider(wx.Panel):
     def getInit(self):
         return self.init
 
-    def SetRange(self, minvalue, maxvalue):   
+    def SetRange(self, minvalue, maxvalue):
         self.minvalue = minvalue
         self.maxvalue = maxvalue
 
@@ -178,7 +178,7 @@ class ControlSlider(wx.Panel):
         if not self.integer:
             return interpFloat(inter, self.minvalue, self.maxvalue)
         elif self.powoftwo:
-            return powOfTwo(int(interpFloat(inter, self.minvalue, self.maxvalue)))    
+            return powOfTwo(int(interpFloat(inter, self.minvalue, self.maxvalue)))
         else:
             return int(interpFloat(inter, self.minvalue, self.maxvalue))
 
@@ -187,7 +187,7 @@ class ControlSlider(wx.Panel):
         if self.HasCapture():
             self.ReleaseMouse()
         if self.powoftwo:
-            value = powOfTwoToInt(value)  
+            value = powOfTwoToInt(value)
         value = clamp(value, self.minvalue, self.maxvalue)
         if self.log:
             t = toLog(value, self.minvalue, self.maxvalue)
@@ -198,7 +198,7 @@ class ControlSlider(wx.Panel):
         if self.integer:
             self.value = int(self.value)
         if self.powoftwo:
-            self.value = powOfTwo(self.value)    
+            self.value = powOfTwo(self.value)
         self.clampPos()
         self.selected = False
         self.Refresh()
@@ -272,7 +272,7 @@ class ControlSlider(wx.Panel):
                     self.selected = True
             self.Refresh()
         event.Skip()
-            
+
     def MouseMotion(self, evt):
         if self._enable:
             size = self.GetSize()
@@ -286,7 +286,7 @@ class ControlSlider(wx.Panel):
                 self.Refresh()
 
     def OnResize(self, evt):
-        self.clampPos()    
+        self.clampPos()
         self.Refresh()
 
     def clampPos(self):
@@ -294,14 +294,14 @@ class ControlSlider(wx.Panel):
         if self.powoftwo:
             val = powOfTwoToInt(self.value)
         else:
-            val = self.value 
+            val = self.value
         if self.orient == wx.VERTICAL:
             self.pos = tFromValue(val, self.minvalue, self.maxvalue) * (size[1] - self.knobSize) + self.knobHalfSize
             self.pos = clamp(size[1]-self.pos, self.knobHalfSize, size[1]-self.knobHalfSize)
         else:
             self.pos = tFromValue(val, self.minvalue, self.maxvalue) * (size[0] - self.knobSize) + self.knobHalfSize
             self.pos = clamp(self.pos, self.knobHalfSize, size[0]-self.knobHalfSize)
-        
+
     def setBackgroundColour(self, colour):
         self.backgroundColour = colour
         self.SetBackgroundColour(self.backgroundColour)
@@ -318,7 +318,7 @@ class ControlSlider(wx.Panel):
         # Draw background
         dc.SetPen(wx.Pen(self.backgroundColour, width=self.borderWidth, style=wx.SOLID))
         dc.DrawRectangle(0, 0, w, h)
-        
+
         # Draw inner part
         if self._enable: sliderColour =  "#99A7CC"
         else: sliderColour = "#BBBBBB"
@@ -336,7 +336,7 @@ class ControlSlider(wx.Panel):
         if self.midictl != None:
             if sys.platform in ['win32', 'linux2']:
                 dc.SetFont(wx.Font(6, wx.ROMAN, wx.NORMAL, wx.NORMAL))
-            else:    
+            else:
                 dc.SetFont(wx.Font(9, wx.ROMAN, wx.NORMAL, wx.NORMAL))
             dc.SetTextForeground('#FFFFFF')
             if self.orient == wx.VERTICAL:
@@ -358,7 +358,7 @@ class ControlSlider(wx.Panel):
             gc.SetBrush(brush)
             gc.DrawRoundedRectangle(rec[0], rec[1], rec[2], rec[3], 3)
         else:
-            rec = wx.Rect(self.pos-self.knobHalfSize, 0, self.knobSize-1, h)  
+            rec = wx.Rect(self.pos-self.knobHalfSize, 0, self.knobSize-1, h)
             if self.selected:
                 brush = wx.Brush('#333333', wx.SOLID)
             else:
@@ -368,7 +368,7 @@ class ControlSlider(wx.Panel):
 
         if sys.platform in ['win32', 'linux2']:
             dc.SetFont(wx.Font(7, wx.ROMAN, wx.NORMAL, wx.NORMAL))
-        else:    
+        else:
             dc.SetFont(wx.Font(10, wx.ROMAN, wx.NORMAL, wx.NORMAL))
 
         # Draw text
@@ -400,10 +400,10 @@ class ControlSlider(wx.Panel):
         evt.Skip()
 
 class MultiSlider(wx.Panel):
-    def __init__(self, parent, init, key, command, slmap): 
+    def __init__(self, parent, init, key, command, slmap):
         wx.Panel.__init__(self, parent, size=(250,250))
         self.backgroundColour = BACKGROUND_COLOUR
-        self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)  
+        self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
         self.SetBackgroundColour(self.backgroundColour)
         self.Bind(wx.EVT_SIZE, self.OnResize)
         self.Bind(wx.EVT_PAINT, self.OnPaint)
@@ -419,16 +419,16 @@ class MultiSlider(wx.Panel):
         self._height = 16
         if sys.platform in ['win32', 'linux2']:
             self._font = wx.Font(7, wx.ROMAN, wx.NORMAL, wx.NORMAL)
-        else:    
+        else:
             self._font = wx.Font(10, wx.ROMAN, wx.NORMAL, wx.NORMAL)
-            
+
         self.SetSize((250, self._nchnls*16))
         self.SetMinSize((250,self._nchnls*16))
 
     def OnResize(self, event):
         self.Layout()
         self.Refresh()
-        
+
     def OnPaint(self, event):
         w,h = self.GetSize()
         dc = wx.AutoBufferedPaintDC(self)
@@ -477,13 +477,13 @@ class MultiSlider(wx.Panel):
                     self._labels = [self._slmap.get(x) for x in self._values]
                 self._command(self._key, self._labels)
             self.Refresh()
-        
+
 class VuMeter(wx.Panel):
     def __init__(self, parent, size=(200,11), numSliders=2, orient=wx.HORIZONTAL):
         if orient == wx.HORIZONTAL:
             size = (size[0], numSliders * 5 + 1)
         else:
-            size = (numSliders * 5 + 1, size[1])        
+            size = (numSliders * 5 + 1, size[1])
         wx.Panel.__init__(self, parent, -1, size=size)
         self.parent = parent
         self.orient = orient
@@ -496,7 +496,7 @@ class VuMeter(wx.Panel):
 
         self.Bind(wx.EVT_PAINT, self.OnPaint)
         self.Bind(wx.EVT_SIZE, self.OnSize)
-        self.Bind(wx.EVT_CLOSE, self.OnClose)   
+        self.Bind(wx.EVT_CLOSE, self.OnClose)
 
     def OnSize(self, evt):
         self.createBitmaps()
@@ -570,13 +570,13 @@ class VuMeter(wx.Panel):
         wx.CallAfter(self.parent.Refresh)
 
     def setRms(self, *args):
-        if args[0] < 0: 
+        if args[0] < 0:
             return
         if not args:
-            self.amplitude = [0 for i in range(self.numSliders)]                
+            self.amplitude = [0 for i in range(self.numSliders)]
         else:
             self.amplitude = args
-        wx.CallAfter(self.Refresh)   
+        wx.CallAfter(self.Refresh)
 
     def OnPaint(self, event):
         w,h = self.GetSize()
@@ -607,15 +607,15 @@ class VuMeter(wx.Panel):
                     dc.DrawBitmap(self.bitmap, y, 0)
                     dc.DestroyClippingRegion()
         event.Skip()
-        
+
     def OnClose(self, evt):
         self.Destroy()
 
 class RangeSlider(wx.Panel):
-    def __init__(self, parent, minvalue, maxvalue, init=None, pos=(0,0), size=(200,15), 
+    def __init__(self, parent, minvalue, maxvalue, init=None, pos=(0,0), size=(200,15),
                  valtype='int', log=False, function=None):
         wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY, pos=pos, size=size, style=wx.NO_BORDER)
-        self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)  
+        self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
         self.SetBackgroundColour(BACKGROUND_COLOUR)
         self.SetMinSize(self.GetSize())
         self.sliderHeight = 15
@@ -635,10 +635,10 @@ class RangeSlider(wx.Panel):
                 if len(init) == 1:
                     self.SetValue([init[0],init[0]])
                 else:
-                    self.SetValue([init[0],init[1]])    
-            else: 
+                    self.SetValue([init[0],init[1]])
+            else:
                 self.SetValue([minvalue,maxvalue])
-        else: 
+        else:
             self.SetValue([minvalue,maxvalue])
         self.Bind(wx.EVT_LEFT_DOWN, self.MouseDown)
         self.Bind(wx.EVT_RIGHT_DOWN, self.MouseRightDown)
@@ -669,7 +669,7 @@ class RangeSlider(wx.Panel):
         self.handlecolor = wx.Colour(self.knobcolor[0]*0.35, self.knobcolor[1]*0.35, self.knobcolor[2]*0.35)
         self.createSliderBitmap()
 
-    def SetRange(self, minvalue, maxvalue):   
+    def SetRange(self, minvalue, maxvalue):
         self.minvalue = minvalue
         self.maxvalue = maxvalue
 
@@ -691,7 +691,7 @@ class RangeSlider(wx.Panel):
             self.handles = self.scale(self.handlePos)
             self.CaptureMouse()
             self.Refresh()
-        
+
     def MouseDown(self, evt):
         size = self.GetSize()
         xpos = evt.GetPosition()[0]
@@ -718,7 +718,7 @@ class RangeSlider(wx.Panel):
             if self.action == 'drag':
                 off = xpos - self.lastpos
                 self.lastpos = xpos
-                self.handlePos[0] = clamp(self.handlePos[0] + off, 1, size[0]-self.length) 
+                self.handlePos[0] = clamp(self.handlePos[0] + off, 1, size[0]-self.length)
                 self.handlePos[1] = clamp(self.handlePos[1] + off, self.length, size[0]-1)
             if self.action == 'left':
                 self.handlePos[0] = clamp(xpos, 1, self.handlePos[1]-20)
@@ -747,7 +747,7 @@ class RangeSlider(wx.Panel):
         self.handlePos = tmp
 
 class HRangeSlider(RangeSlider):
-    def __init__(self, parent, minvalue, maxvalue, init=None, pos=(0,0), size=(200,15), 
+    def __init__(self, parent, minvalue, maxvalue, init=None, pos=(0,0), size=(200,15),
                  valtype='int', log=False, function=None):
         RangeSlider.__init__(self, parent, minvalue, maxvalue, init, pos, size, valtype, log, function)
         self.SetMinSize((50, 15))
@@ -808,7 +808,7 @@ class HRangeSlider(RangeSlider):
             if self.myType == IntType:
                 value = int(value)
             tmp.append(value)
-        self.handles = tmp        
+        self.handles = tmp
         self.OnResize(None)
 
     def GetValue(self):
@@ -822,7 +822,7 @@ class HRangeSlider(RangeSlider):
             if self.myType == IntType:
                 val = int(val)
             tmp.append(val)
-        tmp = [min(tmp), max(tmp)]    
+        tmp = [min(tmp), max(tmp)]
         return tmp
 
     def OnPaint(self, evt):
@@ -834,14 +834,14 @@ class HRangeSlider(RangeSlider):
         dc.Clear()
         dc.SetPen(wx.Pen(BACKGROUND_COLOUR))
         dc.DrawRectangle(0, 0, w, h)
-        
+
         #dc.DrawBitmap(self.backgroundBitmap, 0, 0)
 
         # Draw handles
         dc.SetPen(wx.Pen(self.handlecolor, width=1, style=wx.SOLID))
         dc.SetBrush(wx.Brush(self.handlecolor))
-        
-        rec = wx.Rect(self.handlePos[0], 3, self.handlePos[1]-self.handlePos[0], h-7)  
+
+        rec = wx.Rect(self.handlePos[0], 3, self.handlePos[1]-self.handlePos[0], h-7)
         dc.DrawRoundedRectangleRect(rec, 4)
         dc.SetPen(wx.Pen(self.fillcolor, width=1, style=wx.SOLID))
         dc.SetBrush(wx.Brush(self.fillcolor))
@@ -868,7 +868,7 @@ class PyoObjectControl(wx.Frame):
     def __init__(self, parent=None, obj=None, map_list=None):
         wx.Frame.__init__(self, parent)
         from controls import SigTo
-        self.menubar = wx.MenuBar()        
+        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)
@@ -883,18 +883,18 @@ class PyoObjectControl(wx.Frame):
         self._displays = {}
         self._maps = {}
         self._sigs = {}
-        
+
         panel = wx.Panel(self)
         panel.SetBackgroundColour(BACKGROUND_COLOUR)
         mainBox = wx.BoxSizer(wx.VERTICAL)
         self.box = wx.FlexGridSizer(10,2,5,5)
-        
+
         for i, m in enumerate(self._map_list):
             key, init, mini, maxi, scl, res, dataOnly = m.name, m.init, m.min, m.max, m.scale, m.res, m.dataOnly
             # filters PyoObjects
             if type(init) not in [ListType, FloatType, IntType]:
                 self._excluded.append(key)
-            else:    
+            else:
                 self._maps[key] = m
                 # label (param name)
                 if dataOnly:
@@ -909,10 +909,10 @@ class PyoObjectControl(wx.Frame):
                     else: res = False
                     self._sliders.append(ControlSlider(panel, mini, maxi, init, log=scl, size=(300,16),
                                         outFunction=Command(self.setval, key), integer=res))
-                    self.box.AddMany([(label, 0, wx.LEFT, 5), (self._sliders[-1], 1, wx.EXPAND | wx.LEFT, 5)])   
+                    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.box.AddMany([(label, 0, wx.LEFT, 5), (self._sliders[-1], 1, wx.EXPAND | wx.LEFT, 5)])   
+                    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:
                     self._values[key] = init
@@ -923,21 +923,21 @@ class PyoObjectControl(wx.Frame):
                         curStream = self._sigs[key].getBaseObjects()[k]._getStream()
                         server.changeStreamPosition(refStream, curStream)
                     setattr(self._obj, key, self._sigs[key])
-        self.box.AddGrowableCol(1, 1) 
+        self.box.AddGrowableCol(1, 1)
         mainBox.Add(self.box, 1, wx.EXPAND | wx.TOP | wx.BOTTOM | wx.RIGHT, 10)
 
         panel.SetSizerAndFit(mainBox)
         self.SetClientSize(panel.GetSize())
         self.SetMinSize(self.GetSize())
         self.SetMaxSize((-1, self.GetSize()[1]))
-        
+
     def _destroy(self, event):
         for m in self._map_list:
             key = m.name
             if key not in self._excluded and key in self._values:
                 setattr(self._obj, key, self._values[key])
                 del self._sigs[key]
-        self.Destroy()        
+        self.Destroy()
 
     def setval(self, key, x):
         if key in self._values:
@@ -953,7 +953,7 @@ class ViewTable(wx.Frame):
     def __init__(self, parent, samples=None, tableclass=None, object=None):
         wx.Frame.__init__(self, parent, size=(500,200))
         self.SetMinSize((300, 150))
-        menubar = wx.MenuBar()        
+        menubar = wx.MenuBar()
         fileMenu = wx.Menu()
         closeItem = fileMenu.Append(-1, 'Close\tCtrl+W', kind=wx.ITEM_NORMAL)
         self.Bind(wx.EVT_MENU, self._destroy, closeItem)
@@ -990,7 +990,7 @@ class ViewTablePanel(wx.Panel):
         else:
             self.dcref = wx.PaintDC
 
-        
+
     def draw(self, samples):
         self.samples = samples
         self.Refresh()
@@ -1000,7 +1000,7 @@ class ViewTablePanel(wx.Panel):
         dc = self.dcref(self)
         gc = wx.GraphicsContext_Create(dc)
         dc.SetBrush(wx.Brush("#FFFFFF"))
-        dc.SetPen(wx.Pen('#BBBBBB', width=1, style=wx.SOLID))  
+        dc.SetPen(wx.Pen('#BBBBBB', width=1, style=wx.SOLID))
         dc.Clear()
         dc.DrawRectangle(0,0,w,h)
         gc.SetPen(wx.Pen('#000000', width=1, style=wx.SOLID))
@@ -1011,12 +1011,12 @@ class ViewTablePanel(wx.Panel):
 
     def OnSize(self, evt):
         wx.CallAfter(self.obj.refreshView)
-        
+
 class SndViewTable(wx.Frame):
     def __init__(self, parent, obj=None, tableclass=None, mouse_callback=None):
         wx.Frame.__init__(self, parent, size=(500,250))
         self.SetMinSize((300, 150))
-        self.menubar = wx.MenuBar()        
+        self.menubar = wx.MenuBar()
         self.fileMenu = wx.Menu()
         closeItem = self.fileMenu.Append(-1, 'Close\tCtrl+W', kind=wx.ITEM_NORMAL)
         self.Bind(wx.EVT_MENU, self._destroy, closeItem)
@@ -1031,7 +1031,7 @@ class SndViewTable(wx.Frame):
         self.box = wx.BoxSizer(wx.VERTICAL)
         self.wavePanel = SndViewTablePanel(self.panel, obj, mouse_callback)
         self.box.Add(self.wavePanel, 1, wx.EXPAND|wx.ALL, 5)
-        self.zoomH = HRangeSlider(self.panel, minvalue=0, maxvalue=1, init=None, pos=(0,0), size=(200,15), 
+        self.zoomH = HRangeSlider(self.panel, minvalue=0, maxvalue=1, init=None, pos=(0,0), size=(200,15),
                  valtype='float', log=False, function=self.setZoomH)
         self.box.Add(self.zoomH, 0, wx.EXPAND|wx.LEFT|wx.RIGHT, 5)
         self.panel.SetSizer(self.box)
@@ -1149,14 +1149,14 @@ class SndViewTablePanel(wx.Panel):
             y = h/self.chnls*i
             if len(samples):
                 gc.DrawLines(samples)
-            dc.SetPen(wx.Pen('#888888', width=1, style=wx.DOT))  
+            dc.SetPen(wx.Pen('#888888', width=1, style=wx.DOT))
             dc.DrawLine(0, y+off, w, y+off)
             for j in range(10):
-                dc.SetPen(wx.Pen('#888888', width=1, style=wx.DOT))  
+                dc.SetPen(wx.Pen('#888888', width=1, style=wx.DOT))
                 dc.DrawLine(j*tickstep, 0, j*tickstep, h)
                 dc.DrawText(timelabel % (self.begin+j*timestep), j*tickstep+2, h-y-12)
-            dc.SetPen(wx.Pen('#000000', width=1))  
-            dc.DrawLine(0, h-y, w, h-y)            
+            dc.SetPen(wx.Pen('#000000', width=1))
+            dc.DrawLine(0, h-y, w, h-y)
 
     def OnSize(self, evt):
         wx.CallAfter(self.setImage)
@@ -1168,7 +1168,7 @@ class ViewMatrix(wx.Frame):
     def __init__(self, parent, size=None, object=None):
         wx.Frame.__init__(self, parent)
         self.object = object
-        self.menubar = wx.MenuBar()        
+        self.menubar = wx.MenuBar()
         self.fileMenu = wx.Menu()
         closeItem = self.fileMenu.Append(-1, 'Close\tCtrl+W', kind=wx.ITEM_NORMAL)
         self.Bind(wx.EVT_MENU, self._destroy, closeItem)
@@ -1193,7 +1193,7 @@ class ViewMatrix_withPIL(ViewMatrix):
         ViewMatrix.__init__(self, parent, size, object)
         self.size = size
         self.setImage(samples)
-        
+
     def setImage(self, samples):
         im = Image.new("L", self.size, None)
         im.putdata(samples)
@@ -1213,7 +1213,7 @@ class ViewMatrix_withoutPIL(ViewMatrix):
         self.width = size[0]
         self.height = size[1]
         self.setImage(samples)
-    
+
     def setImage(self, samples):
         self.samples = samples
         self.Refresh()
@@ -1228,7 +1228,7 @@ class ViewMatrix_withoutPIL(ViewMatrix):
             if len(amp) == 1:
                 amp = "0%s" % amp
             amp = "#%s%s%s" % (amp, amp, amp)
-            dc.SetPen(wx.Pen(amp, width=1, style=wx.SOLID))  
+            dc.SetPen(wx.Pen(amp, width=1, style=wx.SOLID))
             dc.DrawPoint(x, y)
 
 ######################################################################
@@ -1238,7 +1238,7 @@ class SpectrumDisplay(wx.Frame):
     def __init__(self, parent, obj=None):
         wx.Frame.__init__(self, parent, size=(600,350))
         self.SetMinSize((400,240))
-        self.menubar = wx.MenuBar()        
+        self.menubar = wx.MenuBar()
         self.fileMenu = wx.Menu()
         closeItem = self.fileMenu.Append(-1, 'Close\tCtrl+W', kind=wx.ITEM_NORMAL)
         self.Bind(wx.EVT_MENU, self._destroy, closeItem)
@@ -1278,7 +1278,7 @@ class SpectrumDisplay(wx.Frame):
         self.magTog = wx.ToggleButton(self.panel, -1, label="Mag Log", size=(tw+X_OFF, th+10))
         self.magTog.SetValue(1)
         self.magTog.Bind(wx.EVT_TOGGLEBUTTON, self.setMagScale)
-        self.toolBox.Add(self.magTog, 0, wx.TOP|wx.LEFT, 5)        
+        self.toolBox.Add(self.magTog, 0, wx.TOP|wx.LEFT, 5)
         tw, th = self.GetTextExtent("Blackman 3-term")
         self.winPopup = wx.Choice(self.panel, -1, choices=["Rectangular", "Hamming", "Hanning", "Bartlett", "Blackman 3-term",
                                     "Blackman-Harris 4-term", "Blackman-Harris 7-term", "Tuckey", "Half-sine"], size=(tw+X_OFF, th+10))
@@ -1297,14 +1297,14 @@ class SpectrumDisplay(wx.Frame):
         self.spectrumPanel = SpectrumPanel(self.panel, len(self.obj), self.obj.getLowfreq(), self.obj.getHighfreq(),
                                             self.obj.getFscaling(), self.obj.getMscaling())
         self.box.Add(self.spectrumPanel, 1, wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP, 5)
-        self.zoomH = HRangeSlider(self.panel, minvalue=0, maxvalue=0.5, init=None, pos=(0,0), size=(200,15), 
+        self.zoomH = HRangeSlider(self.panel, minvalue=0, maxvalue=0.5, init=None, pos=(0,0), size=(200,15),
                  valtype='float', log=False, function=self.setZoomH)
         self.box.Add(self.zoomH, 0, wx.EXPAND|wx.LEFT|wx.RIGHT, 5)
         self.dispBox.Add(self.box, 1, wx.EXPAND, 0)
         self.gainSlider = ControlSlider(self.panel, -24, 24, 0, outFunction=self.setGain, orient=wx.VERTICAL)
         self.dispBox.Add(self.gainSlider, 0, wx.EXPAND|wx.TOP, 5)
-        self.dispBox.AddSpacer(5)  
-        self.mainBox.Add(self.dispBox, 1, wx.EXPAND) 
+        self.dispBox.AddSpacer(5)
+        self.mainBox.Add(self.dispBox, 1, wx.EXPAND)
         self.panel.SetSizer(self.mainBox)
 
     def activate(self, evt):
@@ -1347,7 +1347,7 @@ class SpectrumDisplay(wx.Frame):
     def setDisplaySize(self, size):
         self.obj.setWidth(size[0])
         self.obj.setHeight(size[1])
-        
+
     def update(self, points):
         wx.CallAfter(self.spectrumPanel.setImage, points)
 
@@ -1445,7 +1445,7 @@ class SpectrumPanel(wx.Panel):
                 lf = math.log10(20)
             else:
                 lf = math.log10(self.lowfreq)
-            
+
             hf = math.log10(self.highfreq)
             lrange = hf - lf
             mag = pow(10.0, math.floor(lf))
@@ -1540,7 +1540,7 @@ class SpectrumPanel(wx.Panel):
         # spectrum
         if self.img != None:
             for i, samples in enumerate(self.img):
-                gc.SetPen(self.pens[i])  
+                gc.SetPen(self.pens[i])
                 gc.SetBrush(self.brushes[i])
                 gc.DrawLines(samples)
 
@@ -1551,7 +1551,7 @@ class ScopeDisplay(wx.Frame):
     def __init__(self, parent, obj=None):
         wx.Frame.__init__(self, parent, size=(600,350))
         self.SetMinSize((400,240))
-        self.menubar = wx.MenuBar()        
+        self.menubar = wx.MenuBar()
         self.fileMenu = wx.Menu()
         closeItem = self.fileMenu.Append(-1, 'Close\tCtrl+W', kind=wx.ITEM_NORMAL)
         self.Bind(wx.EVT_MENU, self._destroy, closeItem)
@@ -1587,8 +1587,8 @@ class ScopeDisplay(wx.Frame):
         self.dispBox.Add(self.box, 1, wx.EXPAND, 0)
         self.gainSlider = ControlSlider(self.panel, -24, 24, 20.0 * math.log10(gain), outFunction=self.setGain, orient=wx.VERTICAL)
         self.dispBox.Add(self.gainSlider, 0, wx.EXPAND)
-        self.dispBox.AddSpacer(5)  
-        self.mainBox.Add(self.dispBox, 1, wx.EXPAND) 
+        self.dispBox.AddSpacer(5)
+        self.mainBox.Add(self.dispBox, 1, wx.EXPAND)
         self.panel.SetSizer(self.mainBox)
 
     def activate(self, evt):
@@ -1598,7 +1598,7 @@ class ScopeDisplay(wx.Frame):
         length *= 0.001
         self.obj.setLength(length)
         self.scopePanel.setLength(length)
-        
+
     def setGain(self, gain):
         gain = pow(10.0, gain * 0.05)
         self.scopePanel.setGain(gain)
@@ -1669,8 +1669,8 @@ class ScopePanel(wx.Panel):
             font = dc.GetFont()
             font.SetPointSize(8)
             dc.SetFont(font)
-        
-        dc.SetPen(wx.Pen('#888888', width=1, style=wx.DOT))  
+
+        dc.SetPen(wx.Pen('#888888', width=1, style=wx.DOT))
         # horizontal grid
         step = h / 6
         ampstep = 1.0 / 3.0 / self.gain
@@ -1686,7 +1686,7 @@ class ScopePanel(wx.Panel):
         tickstep = w / 4
         timestep = self.length * 0.25
         for j in range(4):
-            dc.SetPen(wx.Pen('#888888', width=1, style=wx.DOT))  
+            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)
         # draw waveforms
@@ -1712,11 +1712,11 @@ RAD2 = RAD*2
 AREA = RAD+2
 AREA2 = AREA*2
 class Grapher(wx.Panel):
-    def __init__(self, parent, xlen=8192, yrange=(0.0, 1.0), init=[(0.0,0.0),(1.0,1.0)], mode=0, 
-                 exp=10.0, inverse=True, tension=0.0, bias=0.0, outFunction=None): 
+    def __init__(self, parent, xlen=8192, yrange=(0.0, 1.0), init=[(0.0,0.0),(1.0,1.0)], mode=0,
+                 exp=10.0, inverse=True, tension=0.0, bias=0.0, outFunction=None):
         wx.Panel.__init__(self, parent, size=(500,250), style=wx.SUNKEN_BORDER)
         self.backgroundColour = BACKGROUND_COLOUR
-        self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)  
+        self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
         self.SetBackgroundColour(self.backgroundColour)
         self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeave)
         self.Bind(wx.EVT_PAINT, self.OnPaint)
@@ -1743,7 +1743,7 @@ class Grapher(wx.Panel):
             self.dcref = wx.BufferedPaintDC
         else:
             self.dcref = wx.PaintDC
-        
+
         self.SetFocus()
 
     def setInitPoints(self, pts):
@@ -1790,7 +1790,7 @@ class Grapher(wx.Panel):
             leftclip = x
         if self.selected == (len(self.points) - 1):
             rightclip = w-OFF-RAD
-        else:    
+        else:
             x,y = self.pointToPixels(self.points[self.selected+1])
             rightclip = x
 
@@ -1865,7 +1865,7 @@ class Grapher(wx.Panel):
         self.Refresh()
 
     def MouseUp(self, evt):
-        if self.HasCapture(): 
+        if self.HasCapture():
             self.ReleaseMouse()
             self.sendValues()
 
@@ -1894,7 +1894,7 @@ class Grapher(wx.Panel):
         else:
             low = pt1[1]
             high = pt2[1]
-        
+
         steps = pt2[0] - pt1[0]
         if steps > 0:
             lrange = high - low
@@ -1948,7 +1948,7 @@ class Grapher(wx.Panel):
             mu = float(i) / steps
             mu2 = (1. - math.cos(mu*math.pi)) * 0.5
             tmp.append((pt1[0]+i, pt1[1] * (1. - mu2) + pt2[1] * mu2))
-        return tmp    
+        return tmp
 
     def getExpPoints(self, pt1, pt2):
         tmp = []
@@ -2011,8 +2011,8 @@ class Grapher(wx.Panel):
             a2 = mu3 - mu2
             a3 = -2.0 * mu3 + 3.0 * mu2
             tmp.append((pt1[0]+i, a0*y1 + a1*m0 + a2*m1 + a3*y2))
-        return tmp    
-        
+        return tmp
+
     def OnPaint(self, evt):
         w,h = self.GetSize()
         corners = [(OFF,OFF),(w-OFF,OFF),(w-OFF,h-OFF),(OFF,h-OFF)]
@@ -2045,15 +2045,15 @@ class Grapher(wx.Panel):
                     t = "%.2f" % (self.xlen * i * 0.1)
                 dc.DrawText(t, xpos+2, h-OFF-10)
             if i < 9:
-                t = "%.2f" % ((9-i) * 0.1 * (self.yrange[1]-self.yrange[0]) + self.yrange[0])    
+                t = "%.2f" % ((9-i) * 0.1 * (self.yrange[1]-self.yrange[0]) + self.yrange[0])
                 dc.DrawText(t, OFF+1, ypos+ystep-10)
             else:
-                t = "%.2f" % ((9-i) * 0.1 * (self.yrange[1]-self.yrange[0]) + self.yrange[0])    
+                t = "%.2f" % ((9-i) * 0.1 * (self.yrange[1]-self.yrange[0]) + self.yrange[0])
                 dc.DrawText(t, OFF+1, h-OFF-10)
 
         dc.SetPen(wx.Pen("#000000", 1))
         dc.SetBrush(wx.Brush("#000000"))
-        # Draw bounding box        
+        # Draw bounding box
         for i in range(4):
             dc.DrawLinePoint(corners[i], corners[(i+1)%4])
 
@@ -2157,7 +2157,7 @@ class Grapher(wx.Panel):
                 gc.SetBrush(wx.Brush("#000000"))
                 dc.SetBrush(wx.Brush("#000000"))
             gc.DrawEllipse(p[0]-RAD,p[1]-RAD,RAD2,RAD2)
-        
+
         # Draw position values
         font.SetPointSize(ptsize-3)
         dc.SetFont(font)
@@ -2185,7 +2185,7 @@ class TableGrapher(wx.Frame):
         else:
             self.graph = Grapher(self, xlen=xlen, yrange=yrange, init=pts, mode=mode, outFunction=obj.replace)
 
-        self.menubar = wx.MenuBar()        
+        self.menubar = wx.MenuBar()
         self.fileMenu = wx.Menu()
         self.fileMenu.Append(9999, 'Close\tCtrl+W', kind=wx.ITEM_NORMAL)
         self.Bind(wx.EVT_MENU, self.close, id=9999)
@@ -2216,9 +2216,9 @@ class TableGrapher(wx.Frame):
                 pstr += "%.4f)" % pt[1]
                 if i < (len(pts)-1):
                     pstr += ","
-            pstr += "]" 
+            pstr += "]"
         else:
-            pstr = str(pts)           
+            pstr = str(pts)
         data = wx.TextDataObject(pstr)
         if wx.TheClipboard.Open():
             wx.TheClipboard.Clear()
@@ -2229,10 +2229,10 @@ class TableGrapher(wx.Frame):
         self.graph.reset()
 
 class DataMultiSlider(wx.Panel):
-    def __init__(self, parent, init, yrange=(0,1), outFunction=None): 
+    def __init__(self, parent, init, yrange=(0,1), outFunction=None):
         wx.Panel.__init__(self, parent, size=(250,250), style=wx.SUNKEN_BORDER)
         self.backgroundColour = BACKGROUND_COLOUR
-        self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)  
+        self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
         self.SetBackgroundColour(self.backgroundColour)
         self.Bind(wx.EVT_SIZE, self.OnResize)
         self.Bind(wx.EVT_PAINT, self.OnPaint)
@@ -2331,13 +2331,13 @@ class DataMultiSlider(wx.Panel):
             if step > 1:
                 inc = (y2 - y1) / step
                 if x2 > x1:
-                    for i in range(0, step): 
+                    for i in range(0, step):
                         self.values[x1+i] = y1 + inc * i
                 else:
-                    for i in range(1, step): 
+                    for i in range(1, step):
                         self.values[x1-i] = y1 + inc * i
             if x2 >= 0 and x2 < self.len:
-                self.values[x2] = y2                    
+                self.values[x2] = y2
             self.lastpos = pos
             self.Refresh()
 
@@ -2346,7 +2346,7 @@ class DataTableGrapher(wx.Frame):
         wx.Frame.__init__(self, parent, size=(500,250))
         self.obj = obj
         self.multi = DataMultiSlider(self, self.obj.getTable(), yrange, outFunction=self.obj.replace)
-        self.menubar = wx.MenuBar()        
+        self.menubar = wx.MenuBar()
         self.fileMenu = wx.Menu()
         self.fileMenu.Append(9999, 'Close\tCtrl+W', kind=wx.ITEM_NORMAL)
         self.Bind(wx.EVT_MENU, self.close, id=9999)
@@ -2360,17 +2360,17 @@ class DataTableGrapher(wx.Frame):
         wx.CallAfter(self.multi.update, samples)
 
 class ServerGUI(wx.Frame):
-    def __init__(self, parent=None, nchnls=2, startf=None, stopf=None, recstartf=None, 
+    def __init__(self, parent=None, nchnls=2, startf=None, stopf=None, recstartf=None,
                 recstopf=None, ampf=None, started=0, locals=None, shutdown=None, meter=True, timer=True, amp=1., exit=True):
         wx.Frame.__init__(self, parent, style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER)
 
         self.SetTitle("pyo server")
-        
+
         self.menubar = wx.MenuBar()
         self.menu = wx.Menu()
         self.menu.Append(22999, 'Start/Stop\tCtrl+R', kind=wx.ITEM_NORMAL)
         self.Bind(wx.EVT_MENU, self.start, id=22999)
-        quit_item = self.menu.Append(wx.ID_EXIT, "Quit\tCtrl+Q")  
+        quit_item = self.menu.Append(wx.ID_EXIT, "Quit\tCtrl+Q")
         self.Bind(wx.EVT_MENU, self.on_quit, id=wx.ID_EXIT)
         self.menubar.Append(self.menu, "&File")
         self.SetMenuBar(self.menubar)
@@ -2419,7 +2419,7 @@ class ServerGUI(wx.Frame):
         self.ampScale = ControlSlider(panel, -60, 18, 20.0 * math.log10(amp), size=(202, 16), outFunction=self.setAmp)
         ampBox.Add(self.ampScale, 0, wx.LEFT, leftMargin-10)
         box.Add(ampBox, 0, wx.LEFT | wx.RIGHT, 8)
-        
+
         if meter:
             box.AddSpacer(10)
             self.meter = VuMeter(panel, size=(200,5*self.nchnls+1), numSliders=self.nchnls)
@@ -2453,7 +2453,7 @@ class ServerGUI(wx.Frame):
 
     def setTime(self, *args):
         wx.CallAfter(self.timetext.SetLabel, "%02d : %02d : %02d : %03d" % (args[0], args[1], args[2], args[3]))
-        
+
     def start(self, evt=None, justSet=False):
         if self._started == False:
             if not justSet:
@@ -2499,7 +2499,7 @@ class ServerGUI(wx.Frame):
         self._histo_count += 1
         if self._histo_count >= len(self._history):
             self._histo_count = len(self._history)
-        else:    
+        else:
             self.text.SetValue(self._history[self._histo_count])
             self.text.SetInsertionPointEnd()
 
@@ -2519,11 +2519,10 @@ class ServerGUI(wx.Frame):
             self.getNext()
             evt.StopPropagation()
         else:
-            evt.Skip()      
+            evt.Skip()
 
     def setAmp(self, value):
         self.ampf(math.pow(10.0, float(value) * 0.05))
 
     def setRms(self, *args):
         self.meter.setRms(*args)
-
diff --git a/pyolib/analysis.py b/pyolib/analysis.py
index 6b8316c..a71fc86 100644
--- a/pyolib/analysis.py
+++ b/pyolib/analysis.py
@@ -2,29 +2,29 @@
 Tools to analyze audio signals.
 
 These objects are designed to retrieve specific informations
-from an audio stream. Analysis are sent at audio rate, user 
+from an audio stream. Analysis are sent at audio rate, user
 can use them for controlling parameters of others objects.
 
 """
 
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU Lesser General Public
+License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
 
 from _core import *
@@ -35,13 +35,13 @@ from pattern import Pattern
 class Follower(PyoObject):
     """
     Envelope follower.
-    
+
     Output signal is the continuous mean amplitude of an input signal.
 
     :Parent: :py:class:`PyoObject`
 
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         freq : float or PyoObject, optional
@@ -49,9 +49,9 @@ class Follower(PyoObject):
 
     .. note::
 
-        The out() method is bypassed. Follower's signal can not be sent to 
+        The out() method is bypassed. Follower's signal can not be sent to
         audio outs.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> sf = SfPlayer(SNDS_PATH + "/transparent.aif", loop=True, mul=.4).out()
@@ -70,7 +70,7 @@ class Follower(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -81,11 +81,11 @@ class Follower(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -102,7 +102,7 @@ class Follower(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMap(1., 500., 'log', 'freq', self._freq)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-      
+
     @property
     def input(self):
         """PyoObject. Input signal to process."""
@@ -136,7 +136,7 @@ class Follower2(PyoObject):
 
     .. note::
 
-        The out() method is bypassed. Follower's signal can not be sent to 
+        The out() method is bypassed. Follower's signal can not be sent to
         audio outs.
 
     >>> s = Server().boot()
@@ -207,21 +207,21 @@ class Follower2(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def risetime(self):
-        """float or PyoObject. Time to reach upward value in seconds.""" 
+        """float or PyoObject. Time to reach upward value in seconds."""
         return self._risetime
     @risetime.setter
     def risetime(self, x): self.setRisetime(x)
 
     @property
     def falltime(self):
-        """float or PyoObject. Time to reach downward value in seconds.""" 
+        """float or PyoObject. Time to reach downward value in seconds."""
         return self._falltime
     @falltime.setter
     def falltime(self, x): self.setFalltime(x)
@@ -229,25 +229,25 @@ class Follower2(PyoObject):
 class ZCross(PyoObject):
     """
     Zero-crossing counter.
-    
-    Output signal is the number of zero-crossing occured during each 
+
+    Output signal is the number of zero-crossing occured during each
     buffer size, normalized between 0 and 1.
- 
+
     :Parent: :py:class:`PyoObject`
-   
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         thresh : float, optional
-            Minimum amplitude difference allowed between adjacent samples 
+            Minimum amplitude difference allowed between adjacent samples
             to be included in the zeros count.
 
     .. note::
 
-        The out() method is bypassed. ZCross's signal can not be sent to 
+        The out() method is bypassed. ZCross's signal can not be sent to
         audio outs.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> a = SfPlayer(SNDS_PATH + "/transparent.aif", loop=True, mul=.4).out()
@@ -266,7 +266,7 @@ class ZCross(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -281,7 +281,7 @@ class ZCross(PyoObject):
     def setThresh(self, x):
         """
         Replace the `thresh` attribute.
-        
+
         :Args:
 
             x : float
@@ -298,17 +298,17 @@ class ZCross(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMap(0., 0.5, 'lin', 'thresh', self._thresh)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-     
+
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def thresh(self):
-        """float. Amplitude difference threshold.""" 
+        """float. Amplitude difference threshold."""
         return self._thresh
     @thresh.setter
     def thresh(self, x): self.setThresh(x)
@@ -316,41 +316,41 @@ class ZCross(PyoObject):
 class Yin(PyoObject):
     """
     Pitch tracker using the Yin algorithm.
-    
+
     Pitch tracker using the Yin algorithm based on the implementation in C of aubio.
     This algorithm was developped by A. de Cheveigne and H. Kawahara and published in
-    
+
     de Cheveigne, A., Kawahara, H. (2002) 'YIN, a fundamental frequency estimator for
     speech and music', J. Acoust. Soc. Am. 111, 1917-1930.
-    
+
     The audio output of the object is the estimated frequency, in Hz, of the input sound.
- 
+
     :Parent: :py:class:`PyoObject`
-   
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         tolerance : float, optional
             Parameter for minima selection, between 0 and 1. Defaults to 0.2.
         minfreq : float, optional
-            Minimum estimated frequency in Hz. Frequency below this threshold will 
+            Minimum estimated frequency in Hz. Frequency below this threshold will
             be ignored. Defaults to 40.
         maxfreq : float, optional
-            Maximum estimated frequency in Hz. Frequency above this threshold will 
+            Maximum estimated frequency in Hz. Frequency above this threshold will
             be ignored. Defaults to 1000.
         cutoff : float, optional
             Cutoff frequency, in Hz, of the lowpass filter applied on the input sound.
             Defaults to 1000.
-            
+
             The lowpass filter helps the algorithm to detect the fundamental frequency by filtering
-            higher harmonics. 
+            higher harmonics.
         winsize : int, optional
             Size, in samples, of the analysis window. Must be higher that two period
             of the lowest desired frequency.
-            
+
             Available at initialization time only.  Defaults to 1024.
-            
+
 
     >>> s = Server(duplex=1).boot()
     >>> s.start()
@@ -376,7 +376,7 @@ class Yin(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -391,7 +391,7 @@ class Yin(PyoObject):
     def setTolerance(self, x):
         """
         Replace the `tolerance` attribute.
-        
+
         :Args:
 
             x : float
@@ -405,7 +405,7 @@ class Yin(PyoObject):
     def setMinfreq(self, x):
         """
         Replace the `minfreq` attribute.
-        
+
         :Args:
 
             x : float
@@ -419,7 +419,7 @@ class Yin(PyoObject):
     def setMaxfreq(self, x):
         """
         Replace the `maxfreq` attribute.
-        
+
         :Args:
 
             x : float
@@ -433,8 +433,8 @@ class Yin(PyoObject):
     def setCutoff(self, x):
         """
         Replace the `cutoff` attribute.
-        
-        :Args: 
+
+        :Args:
 
             x : float
                 New input lowpass filter cutoff frequency.
@@ -453,38 +453,38 @@ class Yin(PyoObject):
                           SLMap(500, 5000, 'log', 'maxfreq', self._maxfreq, dataOnly=True),
                           SLMap(200, 15000, 'log', 'cutoff', self._cutoff, dataOnly=True)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-     
+
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def tolerance(self):
-        """float. Parameter for minima selection.""" 
+        """float. Parameter for minima selection."""
         return self._tolerance
     @tolerance.setter
     def tolerance(self, x): self.setTolerance(x)
 
     @property
     def minfreq(self):
-        """float. Minimum frequency detected.""" 
+        """float. Minimum frequency detected."""
         return self._minfreq
     @minfreq.setter
     def minfreq(self, x): self.setMinfreq(x)
 
     @property
     def maxfreq(self):
-        """float. Maximum frequency detected.""" 
+        """float. Maximum frequency detected."""
         return self._maxfreq
     @maxfreq.setter
     def maxfreq(self, x): self.setMaxfreq(x)
 
     @property
     def cutoff(self):
-        """float. Input lowpass filter cutoff frequency.""" 
+        """float. Input lowpass filter cutoff frequency."""
         return self._cutoff
     @cutoff.setter
     def cutoff(self, x): self.setCutoff(x)
@@ -492,31 +492,31 @@ class Yin(PyoObject):
 class Centroid(PyoObject):
     """
     Computes the spectral centroid of an input signal.
-    
+
     Output signal is the spectral centroid, in Hz, of the input signal.
-    It indicates where the "center of mass" of the spectrum is. Perceptually, 
+    It indicates where the "center of mass" of the spectrum is. Perceptually,
     it has a robust connection with the impression of "brightness" of a sound.
-    
-    Centroid does its computation with two overlaps, so a new output value 
+
+    Centroid does its computation with two overlaps, so a new output value
     comes every half of the FFT window size.
- 
+
     :Parent: :py:class:`PyoObject`
-   
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         size : int, optional
             Size, as a power-of-two, of the FFT used to compute the centroid.
 
             Available at initialization time only.  Defaults to 1024.
-            
+
 
     .. note::
 
-        The out() method is bypassed. Centroid's signal can not be sent to 
+        The out() method is bypassed. Centroid's signal can not be sent to
         audio outs.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> a = SfPlayer(SNDS_PATH + "/transparent.aif", loop=True, mul=.4).out()
@@ -536,7 +536,7 @@ class Centroid(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -554,10 +554,10 @@ class Centroid(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = []
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-     
+
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -565,36 +565,36 @@ class Centroid(PyoObject):
 class AttackDetector(PyoObject):
     """
     Audio signal onset detection.
-    
+
     AttackDetector anaylises an audio signal in input an output a trigger each
     time an onset is detected. An onset is a sharp amplitude rising while the
     signal had previously fall below a minimum threshold. Parameters must be
     carefully tuned depending on the nature of the analysed signal and the level
-    of the background noise. 
+    of the background noise.
 
     :Parent: :py:class:`PyoObject`
-   
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         deltime : float, optional
             Delay time, in seconds, between previous and current rms analysis to compare.
             Defaults to 0.005.
         cutoff : float, optional
-            Cutoff frequency, in Hz, of the amplitude follower's lowpass filter. 
+            Cutoff frequency, in Hz, of the amplitude follower's lowpass filter.
             Defaults to 10.
-            
-            Higher values are more responsive and also more likely to give false onsets. 
+
+            Higher values are more responsive and also more likely to give false onsets.
         maxthresh : float, optional
-            Attack threshold in positive dB (current rms must be higher than previous 
+            Attack threshold in positive dB (current rms must be higher than previous
             rms + maxthresh to be reported as an attack). Defaults to 3.0.
         minthresh : float, optional
-            Minimum threshold in dB (signal must fall below this threshold to allow 
+            Minimum threshold in dB (signal must fall below this threshold to allow
             a new attack to be detected). Defaults to -30.0.
         reltime : float, optional
             Time, in seconds, to wait before reporting a new attack. Defaults to 0.1.
-            
+
 
     >>> s = Server(duplex=1).boot()
     >>> s.start()
@@ -619,7 +619,7 @@ class AttackDetector(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -634,7 +634,7 @@ class AttackDetector(PyoObject):
     def setDeltime(self, x):
         """
         Replace the `deltime` attribute.
-        
+
         :Args:
 
             x : float
@@ -648,7 +648,7 @@ class AttackDetector(PyoObject):
     def setCutoff(self, x):
         """
         Replace the `cutoff` attribute.
-        
+
         :Args:
 
             x : float
@@ -662,7 +662,7 @@ class AttackDetector(PyoObject):
     def setMaxthresh(self, x):
         """
         Replace the `maxthresh` attribute.
-        
+
         :Args:
 
             x : float
@@ -676,7 +676,7 @@ class AttackDetector(PyoObject):
     def setMinthresh(self, x):
         """
         Replace the `minthresh` attribute.
-        
+
         :Args:
 
             x : float
@@ -690,8 +690,8 @@ class AttackDetector(PyoObject):
     def setReltime(self, x):
         """
         Replace the `reltime` attribute.
-        
-        :Args: 
+
+        :Args:
 
             x : float
                 Time, in seconds, to wait before reporting a new attack.
@@ -711,45 +711,45 @@ class AttackDetector(PyoObject):
                           SLMap(-90.0, 0.0, 'lin', 'minthresh', self._minthresh, dataOnly=True),
                           SLMap(0.001, 1.0, 'log', 'reltime', self._reltime, dataOnly=True)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-     
+
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def deltime(self):
-        """float. Delay between rms analysis.""" 
+        """float. Delay between rms analysis."""
         return self._deltime
     @deltime.setter
     def deltime(self, x): self.setDeltime(x)
 
     @property
     def cutoff(self):
-        """float. Cutoff for the follower lowpass filter.""" 
+        """float. Cutoff for the follower lowpass filter."""
         return self._cutoff
     @cutoff.setter
     def cutoff(self, x): self.setCutoff(x)
 
     @property
     def maxthresh(self):
-        """float. Attack threshold in dB.""" 
+        """float. Attack threshold in dB."""
         return self._maxthresh
     @maxthresh.setter
     def maxthresh(self, x): self.setMaxthresh(x)
 
     @property
     def minthresh(self):
-        """float. Minimum threshold in dB.""" 
+        """float. Minimum threshold in dB."""
         return self._minthresh
     @minthresh.setter
     def minthresh(self, x): self.setMinthresh(x)
 
     @property
     def reltime(self):
-        """float. Time to wait before reporting a new attack.""" 
+        """float. Time to wait before reporting a new attack."""
         return self._reltime
     @reltime.setter
     def reltime(self, x): self.setReltime(x)
@@ -761,11 +761,11 @@ class Spectrum(PyoObject):
     Spectrum measures the magnitude of an input signal versus frequency
     within a user defined range. It can show both magnitude and frequency
     on linear or logarithmic scale.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         size : int {pow-of-two > 4}, optional
@@ -791,9 +791,9 @@ class Spectrum(PyoObject):
             Defaults to None.
 
     .. note::
-    
+
         Spectrum has no `out` method.
-        
+
         Spectrum has no `mul` and `add` attributes.
 
     >>> s = Server().boot()
@@ -809,7 +809,7 @@ class Spectrum(PyoObject):
         self._input = input
         self._size = size
         self._wintype = wintype
-        self._function = function
+        self._function = getWeakMethodRef(function)
         self._fscaling = 0
         self._mscaling = 1
         self._lowbound = 0
@@ -823,11 +823,11 @@ class Spectrum(PyoObject):
         if function == None:
             self.view()
         self._timer = Pattern(self.refreshView, 0.05).play()
- 
+
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -842,12 +842,12 @@ class Spectrum(PyoObject):
     def setSize(self, x):
         """
         Replace the `size` attribute.
-        
+
         :Args:
 
             x : int
                 new `size` attribute.
-        
+
         """
         self._size = x
         x, lmax = convertArgsToLists(x)
@@ -856,12 +856,12 @@ class Spectrum(PyoObject):
     def setWinType(self, x):
         """
         Replace the `wintype` attribute.
-        
+
         :Args:
 
             x : int
                 new `wintype` attribute.
-        
+
         """
         self._wintype = x
         x, lmax = convertArgsToLists(x)
@@ -870,23 +870,23 @@ class Spectrum(PyoObject):
     def setFunction(self, function):
         """
         Sets the function to be called to retrieve the analysis data.
-        
+
         :Args:
-            
+
             function : python callable
                 The function called by the internal timer to retrieve the
                 analysis data. The function must be created with one argument
                 and will receive the data as a list of lists (one list per channel).
 
         """
-        self._function = function
+        self._function = getWeakMethodRef(function)
 
     def poll(self, active):
         """
         Turns on and off the analysis polling.
-        
+
         :Args:
-            
+
             active : boolean
                 If True, starts the analysis polling, False to stop it.
                 defaults to True.
@@ -900,27 +900,27 @@ class Spectrum(PyoObject):
     def polltime(self, time):
         """
         Sets the polling time in seconds.
-        
+
         :Args:
-            
+
             time : float
                 Adjusts the frequency of the internal timer used to
                 retrieve the current analysis frame. defaults to 0.05.
-        
+
         """
         self._timer.time = time
 
     def setLowbound(self, x):
         """
         Sets the lower frequency, as multiplier of sr, returned by the analysis.
-        
+
         Returns the real low frequency en Hz.
-        
+
         :Args:
 
             x : float {0 <= x <= 0.5}
                 new `lowbound` attribute.
-        
+
         """
         self._lowbound = x
         x, lmax = convertArgsToLists(x)
@@ -930,14 +930,14 @@ class Spectrum(PyoObject):
     def setHighbound(self, x):
         """
         Sets the higher frequency, as multiplier of sr, returned by the analysis.
-        
+
         Returns the real high frequency en Hz.
-        
+
         :Args:
 
             x : float {0 <= x <= 0.5}
                 new `highbound` attribute.
-        
+
         """
         self._highbound = x
         x, lmax = convertArgsToLists(x)
@@ -947,7 +947,7 @@ class Spectrum(PyoObject):
     def getLowfreq(self):
         """
         Returns the current lower frequency, in Hz, used by the analysis.
-        
+
         """
 
         return self._base_objs[0].getLowfreq()
@@ -955,21 +955,21 @@ class Spectrum(PyoObject):
     def getHighfreq(self):
         """
         Returns the current higher frequency, in Hz, used by the analysis.
-        
+
         """
         return self._base_objs[0].getHighfreq()
 
     def setWidth(self, x):
         """
         Sets the width, in pixels, of the current display.
-        
+
         Used internally to build the list of points to draw.
-        
+
         :Args:
 
             x : int
                 new `width` attribute.
-        
+
         """
         self._width = x
         x, lmax = convertArgsToLists(x)
@@ -978,14 +978,14 @@ class Spectrum(PyoObject):
     def setHeight(self, x):
         """
         Sets the height, in pixels, of the current display.
-        
+
         Used internally to build the list of points to draw.
-        
+
         :Args:
 
             x : int
                 new `height` attribute.
-        
+
         """
         self._height = x
         x, lmax = convertArgsToLists(x)
@@ -994,13 +994,13 @@ class Spectrum(PyoObject):
     def setFscaling(self, x):
         """
         Sets the frequency display to linear or logarithmic.
-        
+
         :Args:
 
             x : boolean
                 If True, the frequency display is logarithmic. False turns
                 it back to linear. Defaults to False.
-        
+
         """
         self._fscaling = x
         x, lmax = convertArgsToLists(x)
@@ -1011,13 +1011,13 @@ class Spectrum(PyoObject):
     def setMscaling(self, x):
         """
         Sets the magnitude display to linear or logarithmic.
-        
+
         :Args:
 
             x : boolean
-                If True, the magnitude display is logarithmic (which means in dB). 
+                If True, the magnitude display is logarithmic (which means in dB).
                 False turns it back to linear. Defaults to True.
-        
+
         """
         self._mscaling = x
         x, lmax = convertArgsToLists(x)
@@ -1028,7 +1028,7 @@ class Spectrum(PyoObject):
     def getFscaling(self):
         """
         Returns the scaling of the frequency display.
-        
+
         Returns True for logarithmic or False for linear.
 
         """
@@ -1037,7 +1037,7 @@ class Spectrum(PyoObject):
     def getMscaling(self):
         """
         Returns the scaling of the magnitude display.
-        
+
         Returns True for logarithmic or False for linear.
 
         """
@@ -1046,12 +1046,12 @@ class Spectrum(PyoObject):
     def setGain(self, x):
         """
         Set the gain of the analysis data. For drawing purpose.
-        
+
         :Args:
 
             x : float
                 new `gain` attribute, as linear values.
-        
+
         """
         self._gain = x
         x, lmax = convertArgsToLists(x)
@@ -1060,28 +1060,28 @@ class Spectrum(PyoObject):
     def view(self, title="Spectrum", wxnoserver=False):
         """
         Opens a window showing the result of the analysis.
-        
+
         :Args:
-        
+
             title : string, optional
-                Window title. Defaults to "Spectrum". 
+                Window title. Defaults to "Spectrum".
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for 
-        the server GUI before showing the controller window. 
-        
+
+        If `wxnoserver` is set to True, the interpreter will not wait for
+        the server GUI before showing the controller window.
+
         """
         createSpectrumWindow(self, title, wxnoserver)
 
     def _setViewFrame(self, frame):
         self.viewFrame = frame
-        
+
     def refreshView(self):
         """
         Updates the graphical display of the spectrum.
-        
+
         Called automatically by the internal timer.
 
         """
@@ -1094,7 +1094,7 @@ class Spectrum(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -1166,13 +1166,13 @@ class Scope(PyoObject):
     """
     Oscilloscope - audio waveform display.
 
-    Oscilloscopes are used to observe the change of an electrical 
+    Oscilloscopes are used to observe the change of an electrical
     signal over time.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         length : float, optional
@@ -1183,9 +1183,9 @@ class Scope(PyoObject):
             Can't be a list. Defaults to 0.67.
 
     .. note::
-    
+
         Scope has no `out` method.
-        
+
         Scope has no `mul` and `add` attributes.
 
     >>> s = Server().boot()
@@ -1209,11 +1209,11 @@ class Scope(PyoObject):
         self._base_objs = [Scope_base(wrap(in_fader,i), length) for i in range(lmax)]
         self.view()
         self._timer = Pattern(self.refreshView, length).play()
- 
+
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1228,12 +1228,12 @@ class Scope(PyoObject):
     def setLength(self, x):
         """
         Replace the `length` attribute.
-        
+
         :Args:
 
             x : float
                 new `length` attribute.
-        
+
         """
         self._length = x
         self._timer.time = x
@@ -1242,12 +1242,12 @@ class Scope(PyoObject):
     def setGain(self, x):
         """
         Set the gain boost applied to the analysed data. For drawing purpose.
-        
+
         :Args:
 
             x : float
                 new `gain` attribute, as linear values.
-        
+
         """
         self._gain = x
         x, lmax = convertArgsToLists(x)
@@ -1256,9 +1256,9 @@ class Scope(PyoObject):
     def poll(self, active):
         """
         Turns on and off the analysis polling.
-        
+
         :Args:
-            
+
             active : boolean
                 If True, starts the analysis polling, False to stop it.
                 defaults to True.
@@ -1272,12 +1272,12 @@ class Scope(PyoObject):
     def setWidth(self, x):
         """
         Gives the width of the display to the analyzer.
-        
+
         The analyzer needs this value to construct the list
         of points to draw on the display.
-        
+
         :Args:
-            
+
             x : int
                 Width of the display in pixel value. The default
                 width is 500.
@@ -1289,12 +1289,12 @@ class Scope(PyoObject):
     def setHeight(self, x):
         """
         Gives the height of the display to the analyzer.
-        
+
         The analyzer needs this value to construct the list
         of points to draw on the display.
-        
+
         :Args:
-            
+
             x : int
                 Height of the display in pixel value. The default
                 height is 400.
@@ -1302,32 +1302,32 @@ class Scope(PyoObject):
         """
         self._height = x
         [obj.setHeight(x) for obj in self._base_objs]
-        
+
     def view(self, title="Scope", wxnoserver=False):
         """
         Opens a window showing the result of the analysis.
-        
+
         :Args:
-        
+
             title : string, optional
-                Window title. Defaults to "Spectrum". 
+                Window title. Defaults to "Spectrum".
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for 
-        the server GUI before showing the controller window. 
-        
+
+        If `wxnoserver` is set to True, the interpreter will not wait for
+        the server GUI before showing the controller window.
+
         """
         createScopeWindow(self, title, wxnoserver)
 
     def _setViewFrame(self, frame):
         self.viewFrame = frame
-        
+
     def refreshView(self):
         """
         Updates the graphical display of the scope.
-        
+
         Called automatically by the internal timer.
 
         """
@@ -1338,7 +1338,7 @@ class Scope(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -1360,31 +1360,31 @@ class Scope(PyoObject):
 class PeakAmp(PyoObject):
     """
     Peak amplitude follower.
-    
+
     Output signal is the continuous peak amplitude of an input signal.
     A new peaking value is computed every buffer size. If `function`
     argument is not None, it should be a function that will be called
     every buffer size with a variable-length argument list containing
     the peaking values of all object's streams. Useful for meter drawing.
     Function definition must look like this:
-        
+
     >>> def getValues(*args)
 
     :Parent: :py:class:`PyoObject`
 
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         function : callable, optional
-            Function that will be called with amplitude values in arguments. 
+            Function that will be called with amplitude values in arguments.
             Default to None.
 
     .. note::
 
-        The out() method is bypassed. PeakAmp's signal can not be sent to 
+        The out() method is bypassed. PeakAmp's signal can not be sent to
         audio outs.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> sf = SfPlayer(SNDS_PATH + "/transparent.aif", loop=True, mul=.4).out()
@@ -1396,20 +1396,20 @@ class PeakAmp(PyoObject):
         PyoObject.__init__(self, mul, add)
         self._input = input
         if callable(function):
-            self._function = function
+            self._function = getWeakMethodRef(function)
         else:
             self._function = None
         self._in_fader = InputFader(input)
         in_fader, mul, add, lmax = convertArgsToLists(self._in_fader, mul, add)
         self._base_objs = [PeakAmp_base(wrap(in_fader,i), wrap(mul,i), wrap(add,i)) for i in range(lmax)]
-        sr = self._base_objs[0].getServer().getSamplingRate()
-        bs = self._base_objs[0].getServer().getBufferSize()
+        sr = self.getSamplingRate()
+        bs = self.getBufferSize()
         self._timer = Pattern(self._buildList, bs/sr).play()
 
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1424,7 +1424,7 @@ class PeakAmp(PyoObject):
     def setFunction(self, x):
         """
         Replace the `function` attribute.
-        
+
         :Args:
 
             x : callable
@@ -1432,7 +1432,7 @@ class PeakAmp(PyoObject):
 
         """
         if callable(x):
-            self._function = x
+            self._function = getWeakMethodRef(x)
 
     def out(self, chnl=0, inc=1, dur=0, delay=0):
         return self.play(dur, delay)
@@ -1445,7 +1445,7 @@ class PeakAmp(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = []
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-      
+
     @property
     def input(self):
         """PyoObject. Input signal to process."""
@@ -1458,4 +1458,4 @@ class PeakAmp(PyoObject):
         """PyoObject. function signal to process."""
         return self._function
     @function.setter
-    def function(self, x): self.setFunction(x)
+    def function(self, x): self.setFunction(x)
\ No newline at end of file
diff --git a/pyolib/arithmetic.py b/pyolib/arithmetic.py
index 9bc37bc..3c12942 100644
--- a/pyolib/arithmetic.py
+++ b/pyolib/arithmetic.py
@@ -3,23 +3,23 @@ Tools to perform arithmetic operations on audio signals.
 
 """
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU Lesser General Public
+License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
 
 from _core import *
@@ -37,7 +37,7 @@ class Sin(PyoObject):
 
         input : PyoObject
             Input signal, angle in radians.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> import math
@@ -56,7 +56,7 @@ class Sin(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -70,7 +70,7 @@ class Sin(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -119,7 +119,7 @@ class Cos(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -175,7 +175,7 @@ class Tan(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -226,7 +226,7 @@ class Abs(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -282,7 +282,7 @@ class Sqrt(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -291,7 +291,7 @@ class Log(PyoObject):
     """
     Performs a natural log function on audio signal.
 
-    Returns the natural log value of of audio signal as input. 
+    Returns the natural log value of of audio signal as input.
     Values less than 0.0 return 0.0.
 
     :Parent: :py:class:`PyoObject`
@@ -334,7 +334,7 @@ class Log(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -343,7 +343,7 @@ class Log2(PyoObject):
     """
     Performs a base 2 log function on audio signal.
 
-    Returns the base 2 log value of audio signal as input. 
+    Returns the base 2 log value of audio signal as input.
     Values less than 0.0 return 0.0.
 
     :Parent: :py:class:`PyoObject`
@@ -386,7 +386,7 @@ class Log2(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -395,7 +395,7 @@ class Log10(PyoObject):
     """
     Performs a base 10 log function on audio signal.
 
-    Returns the base 10 log value of audio signal as input. 
+    Returns the base 10 log value of audio signal as input.
     Values less than 0.0 return 0.0.
 
     :Parent: :py:class:`PyoObject`
@@ -438,7 +438,7 @@ class Log10(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -447,8 +447,8 @@ class Atan2(PyoObject):
     """
     Computes the principal value of the arc tangent of b/a.
 
-    Computes the principal value of the arc tangent of b/a, 
-    using the signs of both arguments to determine the quadrant 
+    Computes the principal value of the arc tangent of b/a,
+    using the signs of both arguments to determine the quadrant
     of the return value.
 
     :Parent: :py:class:`PyoObject`
@@ -506,14 +506,14 @@ class Atan2(PyoObject):
 
     @property
     def b(self):
-        """float or PyoObject. Numerator.""" 
+        """float or PyoObject. Numerator."""
         return self._b
     @b.setter
     def b(self, x): self.setB(x)
 
     @property
     def a(self):
-        """float or PyoObject. Denominator.""" 
+        """float or PyoObject. Denominator."""
         return self._a
     @a.setter
     def a(self, x): self.setA(x)
@@ -522,7 +522,7 @@ class Floor(PyoObject):
     """
     Rounds to largest integral value not greater than audio signal.
 
-    For each samples in the input signal, rounds to the largest integral 
+    For each samples in the input signal, rounds to the largest integral
     value not greater than the sample value.
 
     :Parent: :py:class:`PyoObject`
@@ -565,7 +565,7 @@ class Floor(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -574,7 +574,7 @@ class Ceil(PyoObject):
     """
     Rounds to smallest integral value greater than or equal to the input signal.
 
-    For each samples in the input signal, rounds to the smallest integral 
+    For each samples in the input signal, rounds to the smallest integral
     value greater than or equal to the sample value.
 
     :Parent: :py:class:`PyoObject`
@@ -617,7 +617,7 @@ class Ceil(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -626,7 +626,7 @@ class Round(PyoObject):
     """
     Rounds to the nearest integer value in a floating-point format.
 
-    For each samples in the input signal, rounds to the nearest integer 
+    For each samples in the input signal, rounds to the nearest integer
     value of the sample value.
 
     :Parent: :py:class:`PyoObject`
@@ -669,7 +669,7 @@ class Round(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -686,7 +686,7 @@ class Tanh(PyoObject):
 
         input : PyoObject
             Input signal, angle in radians.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> import math
@@ -705,7 +705,7 @@ class Tanh(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -719,7 +719,7 @@ class Tanh(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
-    def input(self, x): self.setInput(x)
+    def input(self, x): self.setInput(x)
\ No newline at end of file
diff --git a/pyolib/controls.py b/pyolib/controls.py
index a3682bd..2e99f20 100644
--- a/pyolib/controls.py
+++ b/pyolib/controls.py
@@ -1,32 +1,32 @@
 """
-Objects designed to create parameter's control at audio rate. 
+Objects designed to create parameter's control at audio rate.
 
-These objects can be used to create envelopes, line segments 
-and conversion from python number to audio signal. 
+These objects can be used to create envelopes, line segments
+and conversion from python number to audio signal.
 
-The audio streams of these objects can't be sent to the output 
+The audio streams of these objects can't be sent to the output
 soundcard.
- 
+
 """
 
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+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 sys
 from _core import *
@@ -40,13 +40,13 @@ from types import ListType, TupleType
 class Fader(PyoObject):
     """
     Fadein - fadeout envelope generator.
-    
-    Generate an amplitude envelope between 0 and 1 with control on fade 
+
+    Generate an amplitude envelope between 0 and 1 with control on fade
     times and total duration of the envelope.
-    
-    The play() method starts the envelope and is not called at the 
+
+    The play() method starts the envelope and is not called at the
     object creation time.
-    
+
     :Parent: :py:class:`PyoObject`
 
     :Args:
@@ -56,15 +56,15 @@ class Fader(PyoObject):
         fadeout : float, optional
             Falling time of the envelope in seconds. Defaults to 0.1.
         dur : float, optional
-            Total duration of the envelope. Defaults to 0, which means wait 
+            Total duration of the envelope. Defaults to 0, which means wait
             for the stop() method to start the fadeout.
 
     .. note::
 
         The out() method is bypassed. Fader's signal can not be sent to audio outs.
-        
+
         The play() method starts the envelope.
-        
+
         The stop() calls the envelope's release phase if `dur` = 0.
 
     >>> s = Server().boot()
@@ -74,7 +74,7 @@ class Fader(PyoObject):
     >>> def repeat():
     ...     f.play()
     >>> pat = Pattern(function=repeat, time=2).play()
-    
+
     """
     def __init__(self, fadein=0.01, fadeout=0.1, dur=0, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -90,12 +90,12 @@ class Fader(PyoObject):
     def setFadein(self, x):
         """
         Replace the `fadein` attribute.
-        
+
         :Args:
 
             x : float
                 new `fadein` attribute.
-        
+
         """
         self._fadein = x
         x, lmax = convertArgsToLists(x)
@@ -104,12 +104,12 @@ class Fader(PyoObject):
     def setFadeout(self, x):
         """
         Replace the `fadeout` attribute.
-        
+
         :Args:
 
             x : float
                 new `fadeout` attribute.
-        
+
         """
         self._fadeout = x
         x, lmax = convertArgsToLists(x)
@@ -118,12 +118,12 @@ class Fader(PyoObject):
     def setDur(self, x):
         """
         Replace the `dur` attribute.
-        
+
         :Args:
 
             x : float
                 new `dur` attribute.
-        
+
         """
         self._dur = x
         x, lmax = convertArgsToLists(x)
@@ -137,21 +137,21 @@ class Fader(PyoObject):
 
     @property
     def fadein(self):
-        """float. Rising time of the envelope in seconds.""" 
+        """float. Rising time of the envelope in seconds."""
         return self._fadein
     @fadein.setter
     def fadein(self, x): self.setFadein(x)
 
     @property
     def fadeout(self):
-        """float. Falling time of the envelope in seconds.""" 
+        """float. Falling time of the envelope in seconds."""
         return self._fadeout
     @fadeout.setter
     def fadeout(self, x): self.setFadeout(x)
 
     @property
     def dur(self):
-        """float. Total duration of the envelope.""" 
+        """float. Total duration of the envelope."""
         return self._dur
     @dur.setter
     def dur(self, x): self.setDur(x)
@@ -160,14 +160,14 @@ class Fader(PyoObject):
 class Adsr(PyoObject):
     """
     Attack - Decay - Sustain - Release envelope generator.
-    
-    Calculates the classical ADSR envelope using linear segments. 
-    Duration can be set to 0 to give an infinite sustain. In this 
+
+    Calculates the classical ADSR envelope using linear segments.
+    Duration can be set to 0 to give an infinite sustain. In this
     case, the stop() method calls the envelope release part.
-     
-    The play() method starts the envelope and is not called at the 
+
+    The play() method starts the envelope and is not called at the
     object creation time.
-    
+
     :Parent: :py:class:`PyoObject`
 
     :Args:
@@ -181,16 +181,16 @@ class Adsr(PyoObject):
         release : float, optional
             Duration of the release in seconds. Defaults to 0.1.
         dur : float, optional
-            Total duration of the envelope. Defaults to 0, which means wait 
+            Total duration of the envelope. Defaults to 0, which means wait
             for the stop() method to start the release phase.
-        
-    
+
+
     .. note::
 
         The out() method is bypassed. Adsr's signal can not be sent to audio outs.
 
         The play() method starts the envelope.
-        
+
         The stop() calls the envelope's release phase if `dur` = 0.
 
     >>> s = Server().boot()
@@ -200,7 +200,7 @@ class Adsr(PyoObject):
     >>> def repeat():
     ...     f.play()
     >>> pat = Pattern(function=repeat, time=2).play()
-    
+
     """
     def __init__(self, attack=0.01, decay=0.05, sustain=0.707, release=0.1, dur=0, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -218,12 +218,12 @@ class Adsr(PyoObject):
     def setAttack(self, x):
         """
         Replace the `attack` attribute.
-        
+
         :Args:
 
             x : float
                 new `attack` attribute.
-        
+
         """
         self._attack = x
         x, lmax = convertArgsToLists(x)
@@ -232,12 +232,12 @@ class Adsr(PyoObject):
     def setDecay(self, x):
         """
         Replace the `decay` attribute.
-        
+
         :Args:
 
             x : float
                 new `decay` attribute.
-        
+
         """
         self._decay = x
         x, lmax = convertArgsToLists(x)
@@ -246,12 +246,12 @@ class Adsr(PyoObject):
     def setSustain(self, x):
         """
         Replace the `sustain` attribute.
-        
+
         :Args:
 
             x : float
                 new `sustain` attribute.
-        
+
         """
         self._sustain = x
         x, lmax = convertArgsToLists(x)
@@ -260,12 +260,12 @@ class Adsr(PyoObject):
     def setRelease(self, x):
         """
         Replace the `sustain` attribute.
-        
+
         :Args:
 
             x : float
                 new `sustain` attribute.
-        
+
         """
         self._release = x
         x, lmax = convertArgsToLists(x)
@@ -274,12 +274,12 @@ class Adsr(PyoObject):
     def setDur(self, x):
         """
         Replace the `dur` attribute.
-        
+
         :Args:
 
             x : float
                 new `dur` attribute.
-        
+
         """
         self._dur = x
         x, lmax = convertArgsToLists(x)
@@ -295,54 +295,54 @@ class Adsr(PyoObject):
 
     @property
     def attack(self):
-        """float. Duration of the attack phase in seconds.""" 
+        """float. Duration of the attack phase in seconds."""
         return self._attack
     @attack.setter
     def attack(self, x): self.setAttack(x)
 
     @property
     def decay(self):
-        """float. Duration of the decay phase in seconds.""" 
+        """float. Duration of the decay phase in seconds."""
         return self._decay
     @decay.setter
     def decay(self, x): self.setDecay(x)
 
     @property
     def sustain(self):
-        """float. Amplitude of the sustain phase.""" 
+        """float. Amplitude of the sustain phase."""
         return self._sustain
     @sustain.setter
     def sustain(self, x): self.setSustain(x)
 
     @property
     def release(self):
-        """float. Duration of the release phase in seconds.""" 
+        """float. Duration of the release phase in seconds."""
         return self._release
     @release.setter
     def release(self, x): self.setRelease(x)
 
     @property
     def dur(self):
-        """float. Total duration of the envelope.""" 
+        """float. Total duration of the envelope."""
         return self._dur
     @dur.setter
     def dur(self, x): self.setDur(x)
 
 class Linseg(PyoObject):
     """
-    Trace a series of line segments between specified break-points. 
-    
-    The play() method starts the envelope and is not called at the 
+    Trace a series of line segments between specified break-points.
+
+    The play() method starts the envelope and is not called at the
     object creation time.
-    
+
     :Parent: :py:class:`PyoObject`
 
     :Args:
 
         list : list of tuples
             Points used to construct the line segments. Each tuple is a
-            new point in the form (time, value). 
-            
+            new point in the form (time, value).
+
             Times are given in seconds and must be in increasing order.
         loop : boolean, optional
             Looping mode. Defaults to False.
@@ -360,7 +360,7 @@ class Linseg(PyoObject):
     >>> a = Sine(freq=l, mul=.3).mix(2).out()
     >>> # then call:
     >>> l.play()
-    
+
     """
     def __init__(self, list, loop=False, initToFirstVal=False, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -386,12 +386,12 @@ class Linseg(PyoObject):
     def setList(self, x):
         """
         Replace the `list` attribute.
-        
+
         :Args:
 
             x : list of tuples
                 new `list` attribute.
-        
+
         """
         self._list = x
         if type(x[0]) != ListType:
@@ -407,7 +407,7 @@ class Linseg(PyoObject):
 
             x : list of tuples
                 new `list` attribute.
-        
+
         """
         self.setList(x)
 
@@ -417,12 +417,12 @@ class Linseg(PyoObject):
     def setLoop(self, x):
         """
         Replace the `loop` attribute.
-        
+
         :Args:
 
             x : boolean
                 new `loop` attribute.
-        
+
         """
         self._loop = x
         x, lmax = convertArgsToLists(x)
@@ -433,9 +433,9 @@ class Linseg(PyoObject):
         Opens a grapher window to control the shape of the envelope.
 
         When editing the grapher with the mouse, the new set of points
-        will be send to the object on mouse up. 
+        will be send to the object on mouse up.
 
-        Ctrl+C with focus on the grapher will copy the list of points to the 
+        Ctrl+C with focus on the grapher will copy the list of points to the
         clipboard, giving an easy way to insert the new shape in a script.
 
         :Args:
@@ -447,14 +447,14 @@ class Linseg(PyoObject):
                 Set the min and max values of the Y axis of the graph. If
                 None, min and max are retrieve from the current list of points.
             title : string, optional
-                Title of the window. If none is provided, the name of the 
+                Title of the window. If none is provided, the name of the
                 class is used.
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for the 
-        server GUI before showing the controller window. 
+
+        If `wxnoserver` is set to True, the interpreter will not wait for the
+        server GUI before showing the controller window.
 
         """
         if xlen == None:
@@ -472,23 +472,23 @@ class Linseg(PyoObject):
 
     @property
     def list(self):
-        """float. List of points (time, value).""" 
+        """float. List of points (time, value)."""
         return self._list
     @list.setter
     def list(self, x): self.setList(x)
 
     @property
     def loop(self):
-        """boolean. Looping mode.""" 
+        """boolean. Looping mode."""
         return self._loop
     @loop.setter
     def loop(self, x): self.setLoop(x)
 
 class Expseg(PyoObject):
     """
-    Trace a series of exponential segments between specified break-points. 
+    Trace a series of exponential segments between specified break-points.
 
-    The play() method starts the envelope and is not called at the 
+    The play() method starts the envelope and is not called at the
     object creation time.
 
     :Parent: :py:class:`PyoObject`
@@ -497,8 +497,8 @@ class Expseg(PyoObject):
 
         list : list of tuples
             Points used to construct the line segments. Each tuple is a
-            new point in the form (time, value). 
-            
+            new point in the form (time, value).
+
             Times are given in seconds and must be in increasing order.
         loop : boolean, optional
             Looping mode. Defaults to False.
@@ -506,7 +506,7 @@ class Expseg(PyoObject):
             Exponent factor. Used to control the slope of the curves.
             Defaults to 10.
         inverse : boolean, optional
-            If True, downward slope will be inversed. Useful to create 
+            If True, downward slope will be inversed. Useful to create
             biexponential curves. Defaults to True.
         initToFirstVal : boolean, optional
             If True, audio buffer will be filled at initialization with the
@@ -625,9 +625,9 @@ class Expseg(PyoObject):
         Opens a grapher window to control the shape of the envelope.
 
         When editing the grapher with the mouse, the new set of points
-        will be send to the object on mouse up. 
+        will be send to the object on mouse up.
 
-        Ctrl+C with focus on the grapher will copy the list of points to the 
+        Ctrl+C with focus on the grapher will copy the list of points to the
         clipboard, giving an easy way to insert the new shape in a script.
 
         :Args:
@@ -641,14 +641,14 @@ class Expseg(PyoObject):
                 None, min and max are retrieve from the current list of points.
                 Defaults to None.
             title : string, optional
-                Title of the window. If none is provided, the name of the 
+                Title of the window. If none is provided, the name of the
                 class is used.
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for the 
-        server GUI before showing the controller window. 
+
+        If `wxnoserver` is set to True, the interpreter will not wait for the
+        server GUI before showing the controller window.
 
         """
         if xlen == None:
@@ -666,28 +666,28 @@ class Expseg(PyoObject):
 
     @property
     def list(self):
-        """float. List of points (time, value).""" 
+        """float. List of points (time, value)."""
         return self._list
     @list.setter
     def list(self, x): self.setList(x)
 
     @property
     def loop(self):
-        """boolean. Looping mode.""" 
+        """boolean. Looping mode."""
         return self._loop
     @loop.setter
     def loop(self, x): self.setLoop(x)
 
     @property
     def exp(self):
-        """float. Exponent factor.""" 
+        """float. Exponent factor."""
         return self._exp
     @exp.setter
     def exp(self, x): self.setExp(x)
 
     @property
     def inverse(self):
-        """boolean. Inverse downward slope.""" 
+        """boolean. Inverse downward slope."""
         return self._inverse
     @inverse.setter
     def inverse(self, x): self.setInverse(x)
@@ -695,11 +695,11 @@ class Expseg(PyoObject):
 class SigTo(PyoObject):
     """
     Convert numeric value to PyoObject signal with portamento.
-    
-    When `value` is changed, a ramp is applied from the current 
+
+    When `value` is changed, a ramp is applied from the current
     value to the new value. Can be used with PyoObject to apply
     a linear portamento on an audio signal.
-    
+
     :Parent: :py:class:`PyoObject`
 
     :Args:
@@ -710,7 +710,7 @@ class SigTo(PyoObject):
             Ramp time, in seconds, to reach the new value. Defaults to 0.025.
         init : float, optional
             Initial value of the internal memory. Defaults to 0.
-    
+
     .. note::
 
         The out() method is bypassed. SigTo's signal can not be sent to audio outs.
@@ -767,14 +767,14 @@ class SigTo(PyoObject):
 
     @property
     def value(self):
-        """float or PyoObject. Numerical value to convert.""" 
+        """float or PyoObject. Numerical value to convert."""
         return self._value
     @value.setter
-    def value(self, x): self.setValue(x)    
+    def value(self, x): self.setValue(x)
 
     @property
     def time(self):
-        """float. Ramp time.""" 
+        """float. Ramp time."""
         return self._time
     @time.setter
-    def time(self, x): self.setTime(x)    
+    def time(self, x): self.setTime(x)
\ No newline at end of file
diff --git a/pyolib/dynamics.py b/pyolib/dynamics.py
index f4d6a88..dbe2ca2 100644
--- a/pyolib/dynamics.py
+++ b/pyolib/dynamics.py
@@ -4,23 +4,23 @@ Objects to modify the dynamic range and sample quality of audio signals.
 """
 
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU Lesser General Public
+License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
 from _core import *
 from _maps import *
@@ -28,18 +28,18 @@ from _maps import *
 class Clip(PyoObject):
     """
     Clips a signal to a predefined limit.
-    
+
     :Parent: :py:class:`PyoObject`
 
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         min : float or PyoObject, optional
             Minimum possible value. Defaults to -1.
         max : float or PyoObject, optional
             Maximum possible value. Defaults to 1.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> a = SfPlayer(SNDS_PATH + "/transparent.aif", loop=True)
@@ -60,7 +60,7 @@ class Clip(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -71,11 +71,11 @@ class Clip(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
- 
+
     def setMin(self, x):
         """
         Replace the `min` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -89,7 +89,7 @@ class Clip(PyoObject):
     def setMax(self, x):
         """
         Replace the `max` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -108,21 +108,21 @@ class Clip(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def min(self):
-        """float or PyoObject. Minimum possible value.""" 
+        """float or PyoObject. Minimum possible value."""
         return self._min
     @min.setter
     def min(self, x): self.setMin(x)
 
     @property
     def max(self):
-        """float or PyoObject. Maximum possible value.""" 
+        """float or PyoObject. Maximum possible value."""
         return self._max
     @max.setter
     def max(self, x): self.setMax(x)
@@ -146,7 +146,7 @@ class Mirror(PyoObject):
             Maximum possible value. Defaults to 1.
 
     .. note::
-    
+
         If `min` is higher than `max`, then the output will be the average of the two.
 
     >>> s = Server().boot()
@@ -218,21 +218,21 @@ class Mirror(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def min(self):
-        """float or PyoObject. Minimum possible value.""" 
+        """float or PyoObject. Minimum possible value."""
         return self._min
     @min.setter
     def min(self, x): self.setMin(x)
 
     @property
     def max(self):
-        """float or PyoObject. Maximum possible value.""" 
+        """float or PyoObject. Maximum possible value."""
         return self._max
     @max.setter
     def max(self, x): self.setMax(x)
@@ -240,14 +240,14 @@ class Mirror(PyoObject):
 class Degrade(PyoObject):
     """
     Signal quality reducer.
-    
-    Degrade takes an audio signal and reduces the sampling rate and/or 
+
+    Degrade takes an audio signal and reduces the sampling rate and/or
     bit-depth as specified.
-    
+
     :Parent: :py:class:`PyoObject`
 
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         bitdepth : float or PyoObject, optional
@@ -256,7 +256,7 @@ class Degrade(PyoObject):
         srscale : float or PyoObject, optional
             Sampling rate multiplier. Must be in range 0.0009765625 -> 1.
             Defaults to 1.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> t = SquareTable()
@@ -264,7 +264,7 @@ class Degrade(PyoObject):
     >>> lfo = Sine(freq=.2, mul=6, add=8)
     >>> lfo2 = Sine(freq=.25, mul=.45, add=.55)
     >>> b = Degrade(a, bitdepth=lfo, srscale=lfo2, mul=.3).out()
-    
+
     """
     def __init__(self, input, bitdepth=16, srscale=1.0, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -278,7 +278,7 @@ class Degrade(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -289,11 +289,11 @@ class Degrade(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
- 
+
     def setBitdepth(self, x):
         """
         Replace the `bitdepth` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -307,7 +307,7 @@ class Degrade(PyoObject):
     def setSrscale(self, x):
         """
         Replace the `srscale` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -326,21 +326,21 @@ class Degrade(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def bitdepth(self):
-        """float or PyoObject. Signal quantization in bits.""" 
+        """float or PyoObject. Signal quantization in bits."""
         return self._bitdepth
     @bitdepth.setter
     def bitdepth(self, x): self.setBitdepth(x)
 
     @property
     def srscale(self):
-        """float or PyoObject. Sampling rate multiplier.""" 
+        """float or PyoObject. Sampling rate multiplier."""
         return self._srscale
     @srscale.setter
     def srscale(self, x): self.setSrscale(x)
@@ -349,7 +349,7 @@ class Compress(PyoObject):
     """
     Reduces the dynamic range of an audio signal.
 
-    Compress reduces the volume of loud sounds or amplifies quiet sounds by 
+    Compress reduces the volume of loud sounds or amplifies quiet sounds by
     narrowing or compressing an audio signal's dynamic range.
 
     :Parent: :py:class:`PyoObject`
@@ -359,40 +359,40 @@ class Compress(PyoObject):
         input : PyoObject
             Input signal to process.
         thresh : float or PyoObject, optional
-            Level, expressed in dB, above which the signal is reduced. 
+            Level, expressed in dB, above which the signal is reduced.
             Reference level is 0dB. Defaults to -20.
         ratio : float or PyoObject, optional
-            Determines the input/output ratio for signals above the 
+            Determines the input/output ratio for signals above the
             threshold. Defaults to 2.
         risetime : float or PyoObject, optional
-            Used in amplitude follower, time to reach upward value in 
+            Used in amplitude follower, time to reach upward value in
             seconds. Defaults to 0.01.
         falltime : float or PyoObject, optional
-            Used in amplitude follower, time to reach downward value in 
+            Used in amplitude follower, time to reach downward value in
             seconds. Defaults to 0.1.
         lookahead : float, optional
             Delay length, in ms, for the "look-ahead" buffer. Range is
             0 -> 25 ms. Defaults to 5.0.
         knee : float optional
             Shape of the transfert function around the threshold, specified
-            in the range 0 -> 1. 
-            
-            A value of 0 means a hard knee and a value of 1.0 means a softer 
+            in the range 0 -> 1.
+
+            A value of 0 means a hard knee and a value of 1.0 means a softer
             knee. Defaults to 0.
         outputAmp : boolean, optional
             If True, the object's output signal will be the compression level
-            alone, not the compressed signal. 
-            
-            It can be useful if 2 or more channels need to linked on the same 
+            alone, not the compressed signal.
+
+            It can be useful if 2 or more channels need to linked on the same
             compression slope. Defaults to False.
-            
-            Available at initialization only. 
+
+            Available at initialization only.
 
     >>> s = Server().boot()
     >>> s.start()
     >>> a = SfPlayer(SNDS_PATH + '/transparent.aif', loop=True)
     >>> b = Compress(a, thresh=-24, ratio=6, risetime=.01, falltime=.2, knee=0.5).mix(2).out()
-    
+
     """
     def __init__(self, input, thresh=-20, ratio=2, risetime=0.01, falltime=0.1, lookahead=5.0, knee=0, outputAmp=False, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -410,7 +410,7 @@ class Compress(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -425,7 +425,7 @@ class Compress(PyoObject):
     def setThresh(self, x):
         """
         Replace the `thresh` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -435,11 +435,11 @@ class Compress(PyoObject):
         self._thresh = x
         x, lmax = convertArgsToLists(x)
         [obj.setThresh(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
- 
+
     def setRatio(self, x):
         """
         Replace the `ratio` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -449,11 +449,11 @@ class Compress(PyoObject):
         self._ratio = x
         x, lmax = convertArgsToLists(x)
         [obj.setRatio(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
-        
+
     def setRiseTime(self, x):
         """
         Replace the `risetime` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -467,7 +467,7 @@ class Compress(PyoObject):
     def setFallTime(self, x):
         """
         Replace the `falltime` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -518,28 +518,28 @@ class Compress(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def thresh(self):
-        """float or PyoObject. Level above which the signal is reduced.""" 
+        """float or PyoObject. Level above which the signal is reduced."""
         return self._thresh
     @thresh.setter
     def thresh(self, x): self.setThresh(x)
 
     @property
     def ratio(self):
-        """float or PyoObject. in/out ratio for signals above the threshold.""" 
+        """float or PyoObject. in/out ratio for signals above the threshold."""
         return self._ratio
     @ratio.setter
     def ratio(self, x): self.setRatio(x)
 
     @property
     def risetime(self):
-        """float or PyoObject. Time to reach upward value in seconds.""" 
+        """float or PyoObject. Time to reach upward value in seconds."""
         return self._risetime
     @risetime.setter
     def risetime(self, x): self.setRiseTime(x)
@@ -550,7 +550,7 @@ class Compress(PyoObject):
         return self._falltime
     @falltime.setter
     def falltime(self, x): self.setFallTime(x)
-    
+
     @property
     def lookahead(self):
         """float. Delay length, in ms, of the "look-ahead" buffer."""
@@ -569,12 +569,12 @@ class Gate(PyoObject):
     """
     Allows a signal to pass only when its amplitude is above a set threshold.
 
-    A noise gate is used when the level of the signal is below the level of 
-    the noise floor. The threshold is set above the level of the noise and so when 
-    there is no signal the gate is closed. A noise gate does not remove noise 
-    from the signal. When the gate is open both the signal and the noise will 
+    A noise gate is used when the level of the signal is below the level of
+    the noise floor. The threshold is set above the level of the noise and so when
+    there is no signal the gate is closed. A noise gate does not remove noise
+    from the signal. When the gate is open both the signal and the noise will
     pass through.
-    
+
     :Parent: :py:class:`PyoObject`
 
     :Args:
@@ -582,7 +582,7 @@ class Gate(PyoObject):
         input : PyoObject
             Input signal to process.
         thresh : float or PyoObject, optional
-            Level, expressed in dB, below which the gate is closed. 
+            Level, expressed in dB, below which the gate is closed.
             Reference level is 0dB. Defaults to -70.
         risetime : float or PyoObject, optional
             Time to open the gate in seconds. Defaults to 0.01.
@@ -593,11 +593,11 @@ class Gate(PyoObject):
             0 -> 25 ms. Defaults to 5.0.
         outputAmp : boolean, optional
             If True, the object's output signal will be the gating level
-            alone, not the gated signal. 
-            
-            It can be useful if 2 or more channels need to linked on the 
+            alone, not the gated signal.
+
+            It can be useful if 2 or more channels need to linked on the
             same gating slope. Defaults to False.
-            
+
             Available at initialization only.
 
     >>> s = Server().boot()
@@ -698,21 +698,21 @@ class Gate(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def thresh(self):
-        """float or PyoObject. Level below which the gate is closed.""" 
+        """float or PyoObject. Level below which the gate is closed."""
         return self._thresh
     @thresh.setter
     def thresh(self, x): self.setThresh(x)
 
     @property
     def risetime(self):
-        """float or PyoObject. Time to open the gate in seconds.""" 
+        """float or PyoObject. Time to open the gate in seconds."""
         return self._risetime
     @risetime.setter
     def risetime(self, x): self.setRiseTime(x)
@@ -768,7 +768,7 @@ class Balance(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         Input signal to process.
 
         :Args:
@@ -785,7 +785,7 @@ class Balance(PyoObject):
     def setInput2(self, x, fadetime=0.05):
         """
         Replace the `input2` attribute.
-        
+
         Comparator signal.
 
         :Args:
@@ -802,7 +802,7 @@ class Balance(PyoObject):
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         Cutoff frequency of the lowpass filter, in Hertz.
 
         :Args:
@@ -821,21 +821,21 @@ class Balance(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def input2(self):
-        """PyoObject. Comparator signal.""" 
+        """PyoObject. Comparator signal."""
         return self._input2
     @input2.setter
     def input2(self, x): self.setInput2(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Cutoff frequency of the lowpass filter.""" 
+        """float or PyoObject. Cutoff frequency of the lowpass filter."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
@@ -843,17 +843,17 @@ class Balance(PyoObject):
 class Min(PyoObject):
     """
     Outputs the minimum of two values.
- 
+
     :Parent: :py:class:`PyoObject`
-   
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         comp : float or PyoObject, optional
             Comparison value. If `input` is lower than this value,
             `input` is send to the output, otherwise, `comp` is outputted.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> # Triangle wave
@@ -873,7 +873,7 @@ class Min(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -884,11 +884,11 @@ class Min(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setComp(self, x):
         """
         Replace the `comp` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -902,17 +902,17 @@ class Min(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMap(0,1,"lin", "comp", self._comp), SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-      
+
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def comp(self):
-        """float or PyoObject. Comparison value.""" 
+        """float or PyoObject. Comparison value."""
         return self._comp
     @comp.setter
     def comp(self, x): self.setComp(x)
@@ -920,17 +920,17 @@ class Min(PyoObject):
 class Max(PyoObject):
     """
     Outputs the maximum of two values.
- 
+
     :Parent: :py:class:`PyoObject`
-   
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         comp : float or PyoObject, optional
             Comparison value. If `input` is higher than this value,
             `input` is send to the output, otherwise, `comp` is outputted.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> # Assimetrical clipping
@@ -950,7 +950,7 @@ class Max(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -961,11 +961,11 @@ class Max(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setComp(self, x):
         """
         Replace the `comp` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -979,17 +979,17 @@ class Max(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMap(0,1,"lin", "comp", self._comp), SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-      
+
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def comp(self):
-        """float or PyoObject. Comparison value.""" 
+        """float or PyoObject. Comparison value."""
         return self._comp
     @comp.setter
-    def comp(self, x): self.setComp(x)
+    def comp(self, x): self.setComp(x)
\ No newline at end of file
diff --git a/pyolib/effects.py b/pyolib/effects.py
index cfde21c..aa6ca12 100644
--- a/pyolib/effects.py
+++ b/pyolib/effects.py
@@ -5,32 +5,34 @@ as distortions, delays, chorus and reverbs.
 """
 
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU Lesser General Public
+License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
 from _core import *
 from _maps import *
+from generators import Sine
+from filters import Hilbert
 
 class Disto(PyoObject):
     """
     Arc tangent distortion.
 
-    Apply an arc tangent distortion with controllable drive to the input signal. 
+    Apply an arc tangent distortion with controllable drive to the input signal.
 
     :Parent: :py:class:`PyoObject`
 
@@ -39,10 +41,10 @@ class Disto(PyoObject):
         input : PyoObject
             Input signal to process.
         drive : float or PyoObject, optional
-            Amount of distortion applied to the signal, between 0 and 1. 
+            Amount of distortion applied to the signal, between 0 and 1.
             Defaults to 0.75.
         slope : float or PyoObject, optional
-            Slope of the lowpass filter applied after distortion, 
+            Slope of the lowpass filter applied after distortion,
             between 0 and 1. Defaults to 0.5.
 
     >>> s = Server().boot()
@@ -64,7 +66,7 @@ class Disto(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -75,11 +77,11 @@ class Disto(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
- 
+
     def setDrive(self, x):
         """
         Replace the `drive` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -93,7 +95,7 @@ class Disto(PyoObject):
     def setSlope(self, x):
         """
         Replace the `slope` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -112,21 +114,21 @@ class Disto(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def drive(self):
-        """float or PyoObject. Amount of distortion.""" 
+        """float or PyoObject. Amount of distortion."""
         return self._drive
     @drive.setter
     def drive(self, x): self.setDrive(x)
 
     @property
     def slope(self):
-        """float or PyoObject. Slope of the lowpass filter.""" 
+        """float or PyoObject. Slope of the lowpass filter."""
         return self._slope
     @slope.setter
     def slope(self, x): self.setSlope(x)
@@ -147,18 +149,18 @@ class Delay(PyoObject):
             Amount of output signal sent back into the delay line.
             Defaults to 0.
         maxdelay : float, optional
-            Maximum delay length in seconds. Available only at initialization. 
+            Maximum delay length in seconds. Available only at initialization.
             Defaults to 1.
 
     .. note::
 
         The minimum delay time allowed with Delay is one sample. It can be computed
         with :
-            
+
         onesamp = 1.0 / s.getSamplingRate()
-        
+
     .. seealso::
-        
+
         :py:class:`SDelay`, :py:class:`Waveguide`
 
     >>> s = Server().boot()
@@ -180,7 +182,7 @@ class Delay(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -195,7 +197,7 @@ class Delay(PyoObject):
     def setDelay(self, x):
         """
         Replace the `delay` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -209,7 +211,7 @@ class Delay(PyoObject):
     def setFeedback(self, x):
         """
         Replace the `feedback` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -223,7 +225,7 @@ class Delay(PyoObject):
     def reset(self):
         """
         Reset the memory buffer to zeros.
-        
+
         """
         [obj.reset() for obj in self._base_objs]
 
@@ -235,21 +237,21 @@ class Delay(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to delayed.""" 
+        """PyoObject. Input signal to delayed."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
- 
+
     @property
     def delay(self):
-        """float or PyoObject. Delay time in seconds.""" 
+        """float or PyoObject. Delay time in seconds."""
         return self._delay
     @delay.setter
     def delay(self, x): self.setDelay(x)
 
     @property
     def feedback(self):
-        """float or PyoObject. Amount of output signal sent back into the delay line.""" 
+        """float or PyoObject. Amount of output signal sent back into the delay line."""
         return self._feedback
     @feedback.setter
     def feedback(self, x): self.setFeedback(x)
@@ -267,11 +269,11 @@ class SDelay(PyoObject):
         delay : float or PyoObject, optional
             Delay time in seconds. Defaults to 0.25.
         maxdelay : float, optional
-            Maximum delay length in seconds. Available only at initialization. 
+            Maximum delay length in seconds. Available only at initialization.
             Defaults to 1.
 
     .. seealso::
-        
+
         :py:class:`Delay`, :py:class:`Delay1`
 
     >>> s = Server().boot()
@@ -323,7 +325,7 @@ class SDelay(PyoObject):
     def reset(self):
         """
         Reset the memory buffer to zeros.
-        
+
         """
         [obj.reset() for obj in self._base_objs]
 
@@ -334,14 +336,14 @@ class SDelay(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to delayed.""" 
+        """PyoObject. Input signal to delayed."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def delay(self):
-        """float or PyoObject. Delay time in seconds.""" 
+        """float or PyoObject. Delay time in seconds."""
         return self._delay
     @delay.setter
     def delay(self, x): self.setDelay(x)
@@ -350,7 +352,7 @@ class Waveguide(PyoObject):
     """
     Basic waveguide model.
 
-    This waveguide model consisting of one delay-line with a simple 
+    This waveguide model consisting of one delay-line with a simple
     lowpass filtering and lagrange interpolation.
 
     :Parent: :py:class:`PyoObject`
@@ -360,13 +362,13 @@ class Waveguide(PyoObject):
         input : PyoObject
             Input signal to process.
         freq : float or PyoObject, optional
-            Frequency, in cycle per second, of the waveguide (i.e. the inverse 
+            Frequency, in cycle per second, of the waveguide (i.e. the inverse
             of delay time). Defaults to 100.
         dur : float or PyoObject, optional
-            Duration, in seconds, for the waveguide to drop 40 dB below it's 
+            Duration, in seconds, for the waveguide to drop 40 dB below it's
             maxima. Defaults to 10.
         minfreq : float, optional
-            Minimum possible frequency, used to initialized delay length. 
+            Minimum possible frequency, used to initialized delay length.
             Available only at initialization. Defaults to 20.
 
     >>> s = Server().boot()
@@ -388,7 +390,7 @@ class Waveguide(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -403,7 +405,7 @@ class Waveguide(PyoObject):
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -417,7 +419,7 @@ class Waveguide(PyoObject):
     def setDur(self, x):
         """
         Replace the `dur` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -436,21 +438,21 @@ class Waveguide(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
- 
+
     @property
     def freq(self):
-        """float or PyoObject. Frequency in cycle per second.""" 
+        """float or PyoObject. Frequency in cycle per second."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def dur(self):
-        """float or PyoObject. Resonance duration in seconds.""" 
+        """float or PyoObject. Resonance duration in seconds."""
         return self._dur
     @dur.setter
     def dur(self, x): self.setDur(x)
@@ -469,16 +471,16 @@ class AllpassWG(PyoObject):
         input : PyoObject
             Input signal to process.
         freq : float or PyoObject, optional
-            Frequency, in cycle per second, of the waveguide (i.e. the inverse 
+            Frequency, in cycle per second, of the waveguide (i.e. the inverse
             of delay time). Defaults to 100.
         feed : float or PyoObject, optional
             Amount of output signal (between 0 and 1) sent back into the delay line.
             Defaults to 0.95.
         detune : float or PyoObject, optional
-            Control the depth of the allpass delay-line filter, i.e. the depth of 
+            Control the depth of the allpass delay-line filter, i.e. the depth of
             the detuning. Should be in the range 0 to 1. Defaults to 0.5.
         minfreq : float, optional
-            Minimum possible frequency, used to initialized delay length. 
+            Minimum possible frequency, used to initialized delay length.
             Available only at initialization. Defaults to 20.
 
     >>> s = Server().boot()
@@ -566,28 +568,28 @@ class AllpassWG(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Frequency in cycle per second.""" 
+        """float or PyoObject. Frequency in cycle per second."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def feed(self):
-        """float or PyoObject. Amount of output signal sent back into the delay line.""" 
+        """float or PyoObject. Amount of output signal sent back into the delay line."""
         return self._feed
     @feed.setter
     def feed(self, x): self.setFeed(x)
 
     @property
     def detune(self):
-        """float or PyoObject. Depth of the detuning.""" 
+        """float or PyoObject. Depth of the detuning."""
         return self._detune
     @detune.setter
     def detune(self, x): self.setDetune(x)
@@ -596,9 +598,9 @@ class Freeverb(PyoObject):
     """
     Implementation of Jezar's Freeverb.
 
-    Freeverb is a reverb unit generator based on Jezar's public domain 
-    C++ sources, composed of eight parallel comb filters, followed by four 
-    allpass units in series. Filters on each stream are slightly detuned 
+    Freeverb is a reverb unit generator based on Jezar's public domain
+    C++ sources, composed of eight parallel comb filters, followed by four
+    allpass units in series. Filters on each stream are slightly detuned
     in order to create multi-channel effects.
 
     :Parent: :py:class:`PyoObject`
@@ -608,14 +610,14 @@ class Freeverb(PyoObject):
         input : PyoObject
             Input signal to process.
         size : float or PyoObject, optional
-            Controls the length of the reverb,  between 0 and 1. A higher 
+            Controls the length of the reverb,  between 0 and 1. A higher
             value means longer reverb. Defaults to 0.5.
         damp : float or PyoObject, optional
-            High frequency attenuation, between 0 and 1. A higher value 
-            will result in a faster decay of the high frequency range. 
+            High frequency attenuation, between 0 and 1. A higher value
+            will result in a faster decay of the high frequency range.
             Defaults to 0.5.
         bal : float or PyoObject, optional
-            Balance between wet and dry signal, between 0 and 1. 0 means no 
+            Balance between wet and dry signal, between 0 and 1. 0 means no
             reverb. Defaults to 0.5.
 
     >>> s = Server().boot()
@@ -637,7 +639,7 @@ class Freeverb(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -648,11 +650,11 @@ class Freeverb(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
- 
+
     def setSize(self, x):
         """
         Replace the `size` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -666,7 +668,7 @@ class Freeverb(PyoObject):
     def setDamp(self, x):
         """
         Replace the `damp` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -680,7 +682,7 @@ class Freeverb(PyoObject):
     def setBal(self, x):
         """
         Replace the `bal` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -700,28 +702,28 @@ class Freeverb(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def size(self):
-        """float or PyoObject. Room size.""" 
+        """float or PyoObject. Room size."""
         return self._size
     @size.setter
     def size(self, x): self.setSize(x)
 
     @property
     def damp(self):
-        """float or PyoObject. High frequency damping.""" 
+        """float or PyoObject. High frequency damping."""
         return self._damp
     @damp.setter
     def damp(self, x): self.setDamp(x)
 
     @property
     def bal(self):
-        """float or PyoObject. Balance between wet and dry signal.""" 
+        """float or PyoObject. Balance between wet and dry signal."""
         return self._bal
     @bal.setter
     def bal(self, x): self.setBal(x)
@@ -730,7 +732,7 @@ class Convolve(PyoObject):
     """
     Implements filtering using circular convolution.
 
-    A circular convolution is defined as the integral of the product of two 
+    A circular convolution is defined as the integral of the product of two
     functions after one is reversed and shifted.
 
     :Parent: :py:class:`PyoObject`
@@ -742,12 +744,12 @@ class Convolve(PyoObject):
         table : PyoTableObject
             Table containning the impulse response.
         size : int
-            Length, in samples, of the convolution. Available at initialization 
-            time only. 
-            
-            If the table changes during the performance, its size must egal or 
-            greater than this value. 
-            
+            Length, in samples, of the convolution. Available at initialization
+            time only.
+
+            If the table changes during the performance, its size must egal or
+            greater than this value.
+
             If greater only the first `size` samples will be used.
 
     .. note::
@@ -757,9 +759,9 @@ class Convolve(PyoObject):
 
         Usually convolution generates a high amplitude level, take care of the
         `mul` parameter!
-        
+
     .. seealso::
-        
+
         :py:class:`Follower`
 
     >>> s = Server().boot()
@@ -775,13 +777,13 @@ class Convolve(PyoObject):
         self._table = table
         self._size = size
         self._in_fader = InputFader(input)
-        in_fader, table, size, mul, add, lmax = convertArgsToLists(self._in_fader, table, size, mul, add)                     
+        in_fader, table, size, mul, add, lmax = convertArgsToLists(self._in_fader, table, size, mul, add)
         self._base_objs = [Convolve_base(wrap(in_fader,i), wrap(table,i), wrap(size,i), wrap(mul,i), wrap(add,i)) for i in range(lmax)]
 
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -796,12 +798,12 @@ class Convolve(PyoObject):
     def setTable(self, x):
         """
         Replace the `table` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `table` attribute.
-        
+
         """
         self._table = x
         x, lmax = convertArgsToLists(x)
@@ -809,14 +811,14 @@ class Convolve(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to filter.""" 
+        """PyoObject. Input signal to filter."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def table(self):
-        """PyoTableObject. Table containing the impulse response.""" 
+        """PyoTableObject. Table containing the impulse response."""
         return self._table
     @table.setter
     def table(self, x): self.setTable(x)
@@ -825,8 +827,8 @@ class WGVerb(PyoObject):
     """
     8 delay line mono FDN reverb.
 
-    8 delay line FDN reverb, with feedback matrix based upon physical 
-    modeling scattering junction of 8 lossless waveguides of equal 
+    8 delay line FDN reverb, with feedback matrix based upon physical
+    modeling scattering junction of 8 lossless waveguides of equal
     characteristic impedance.
 
     :Parent: :py:class:`PyoObject`
@@ -839,13 +841,13 @@ class WGVerb(PyoObject):
             Amount of output signal sent back into the delay lines.
             Defaults to 0.5.
 
-            0.6 gives a good small "live" room sound, 0.8 a small hall, 
+            0.6 gives a good small "live" room sound, 0.8 a small hall,
             and 0.9 a large hall.
         cutoff : float or PyoObject, optional
-            cutoff frequency of simple first order lowpass filters in the 
+            cutoff frequency of simple first order lowpass filters in the
             feedback loop of delay lines, in Hz. Defaults to 5000.
         bal : float or PyoObject, optional
-            Balance between wet and dry signal, between 0 and 1. 0 means no 
+            Balance between wet and dry signal, between 0 and 1. 0 means no
             reverb. Defaults to 0.5.
 
     >>> s = Server().boot()
@@ -867,7 +869,7 @@ class WGVerb(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -882,7 +884,7 @@ class WGVerb(PyoObject):
     def setFeedback(self, x):
         """
         Replace the `feedback` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -896,7 +898,7 @@ class WGVerb(PyoObject):
     def setCutoff(self, x):
         """
         Replace the `cutoff` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -910,7 +912,7 @@ class WGVerb(PyoObject):
     def setBal(self, x):
         """
         Replace the `bal` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -930,28 +932,28 @@ class WGVerb(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def feedback(self):
-        """float or PyoObject. Amount of output signal sent back into the delay lines.""" 
+        """float or PyoObject. Amount of output signal sent back into the delay lines."""
         return self._feedback
     @feedback.setter
     def feedback(self, x): self.setFeedback(x)
 
     @property
     def cutoff(self):
-        """float or PyoObject. Lowpass filter cutoff in Hz.""" 
+        """float or PyoObject. Lowpass filter cutoff in Hz."""
         return self._cutoff
     @cutoff.setter
     def cutoff(self, x): self.setCutoff(x)
 
     @property
     def bal(self):
-        """float or PyoObject. wet - dry balance.""" 
+        """float or PyoObject. wet - dry balance."""
         return self._bal
     @bal.setter
     def bal(self, x): self.setBal(x)
@@ -960,9 +962,9 @@ class Chorus(PyoObject):
     """
     8 modulated delay lines chorus processor.
 
-    A chorus effect occurs when individual sounds with roughly the same timbre and 
+    A chorus effect occurs when individual sounds with roughly the same timbre and
     nearly (but never exactly) the same pitch converge and are perceived as one.
-    
+
     :Parent: :py:class:`PyoObject`
 
     :Args:
@@ -975,7 +977,7 @@ class Chorus(PyoObject):
             Amount of output signal sent back into the delay lines.
             Defaults to 0.25.
         bal : float or PyoObject, optional
-            Balance between wet and dry signals, between 0 and 1. 0 means no 
+            Balance between wet and dry signals, between 0 and 1. 0 means no
             chorus. Defaults to 0.5.
 
     >>> s = Server().boot()
@@ -1060,28 +1062,28 @@ class Chorus(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def depth(self):
-        """float or PyoObject. Chorus depth, between 0 and 5.""" 
+        """float or PyoObject. Chorus depth, between 0 and 5."""
         return self._depth
     @depth.setter
     def depth(self, x): self.setDepth(x)
 
     @property
     def feedback(self):
-        """float or PyoObject. Amount of output signal sent back into the delay lines.""" 
+        """float or PyoObject. Amount of output signal sent back into the delay lines."""
         return self._feedback
     @feedback.setter
     def feedback(self, x): self.setFeedback(x)
 
     @property
     def bal(self):
-        """float or PyoObject. wet - dry balance.""" 
+        """float or PyoObject. wet - dry balance."""
         return self._bal
     @bal.setter
     def bal(self, x): self.setBal(x)
@@ -1102,7 +1104,7 @@ class Harmonizer(PyoObject):
             Amount of output signal sent back into the delay line.
             Defaults to 0.
         winsize : float, optional
-            Window size in seconds (max = 1.0). 
+            Window size in seconds (max = 1.0).
             Defaults to 0.1.
 
     >>> s = Server().boot()
@@ -1187,28 +1189,28 @@ class Harmonizer(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to delayed.""" 
+        """PyoObject. Input signal to delayed."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def transpo(self):
-        """float or PyoObject. Transposition factor in semitone.""" 
+        """float or PyoObject. Transposition factor in semitone."""
         return self._transpo
     @transpo.setter
     def transpo(self, x): self.setTranspo(x)
 
     @property
     def feedback(self):
-        """float or PyoObject. Amount of output signal sent back into the delay line.""" 
+        """float or PyoObject. Amount of output signal sent back into the delay line."""
         return self._feedback
     @feedback.setter
     def feedback(self, x): self.setFeedback(x)
 
     @property
     def winsize(self):
-        """float. Window size in seconds (max = 1.0).""" 
+        """float. Window size in seconds (max = 1.0)."""
         return self._winsize
     @winsize.setter
     def winsize(self, x): self.setWinsize(x)
@@ -1216,14 +1218,14 @@ class Harmonizer(PyoObject):
 class Delay1(PyoObject):
     """
     Delays a signal by one sample.
- 
+
     :Parent: :py:class:`PyoObject`
-   
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> # 50th order FIR lowpass filter
@@ -1231,7 +1233,7 @@ class Delay1(PyoObject):
     >>> objs = [Noise(.3)]
     >>> for i in range(order):
     ...     objs.append(Delay1(objs[-1], add=objs[-1]))
-    ...     objs.append(objs[-1] * 0.5)    
+    ...     objs.append(objs[-1] * 0.5)
     >>> out = Sig(objs[-1]).out()
 
     """
@@ -1245,7 +1247,7 @@ class Delay1(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1259,7 +1261,7 @@ class Delay1(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to delayed.""" 
+        """PyoObject. Input signal to delayed."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -1271,11 +1273,11 @@ class STRev(PyoObject):
     Stereo reverb based on WGVerb (8 delay line FDN reverb). A mono
     input will produce two audio streams, left and right channels.
     Therefore, a stereo input will produce four audio streams, left
-    and right channels for each input channel. Position of input 
+    and right channels for each input channel. Position of input
     streams can be set with the `inpos` argument. To achieve a stereo
     reverb, delay line lengths are slightly differents on both channels,
-    but also, pre-delays length and filter cutoff of both channels will 
-    be affected to reflect the input position. 
+    but also, pre-delays length and filter cutoff of both channels will
+    be affected to reflect the input position.
 
     :Parent: :py:class:`PyoObject`
 
@@ -1287,14 +1289,14 @@ class STRev(PyoObject):
             Position of the source, between 0 and 1. 0 means fully left
             and 1 means fully right. Defaults to 0.5.
         revtime : float or PyoObject, optional
-            Duration, in seconds, of the reverberated sound, defined as 
-            the time needed to the sound to drop 40 dB below its peak. 
+            Duration, in seconds, of the reverberated sound, defined as
+            the time needed to the sound to drop 40 dB below its peak.
             Defaults to 1.
         cutoff : float or PyoObject, optional
-            cutoff frequency, in Hz, of a first order lowpass filters in the 
+            cutoff frequency, in Hz, of a first order lowpass filters in the
             feedback loop of delay lines. Defaults to 5000.
         bal : float or PyoObject, optional
-            Balance between wet and dry signal, between 0 and 1. 0 means no 
+            Balance between wet and dry signal, between 0 and 1. 0 means no
             reverb. Defaults to 0.5.
         roomSize : float, optional
             Delay line length scaler, between 0.25 and 4. Values higher than
@@ -1326,7 +1328,7 @@ class STRev(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1341,7 +1343,7 @@ class STRev(PyoObject):
     def setInpos(self, x):
         """
         Replace the `inpos` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -1351,11 +1353,11 @@ class STRev(PyoObject):
         self._inpos = x
         x, lmax = convertArgsToLists(x)
         [obj.setInpos(wrap(x,i)) for i, obj in enumerate(self._base_players)]
- 
+
     def setRevtime(self, x):
         """
         Replace the `revtime` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -1369,7 +1371,7 @@ class STRev(PyoObject):
     def setCutoff(self, x):
         """
         Replace the `cutoff` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -1383,7 +1385,7 @@ class STRev(PyoObject):
     def setBal(self, x):
         """
         Replace the `bal` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -1397,7 +1399,7 @@ class STRev(PyoObject):
     def setRoomSize(self, x):
         """
         Set the room size scaler, between 0.25 and 4.
-        
+
         :Args:
 
             x : float
@@ -1411,7 +1413,7 @@ class STRev(PyoObject):
     def setFirstRefGain(self, x):
         """
         Set the gain of the first reflexions.
-        
+
         :Args:
 
             x : float
@@ -1434,49 +1436,49 @@ class STRev(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def inpos(self):
-        """float or PyoObject. Position of the source.""" 
+        """float or PyoObject. Position of the source."""
         return self._inpos
     @inpos.setter
     def inpos(self, x): self.setInpos(x)
 
     @property
     def revtime(self):
-        """float or PyoObject. Room size.""" 
+        """float or PyoObject. Room size."""
         return self._revtime
     @revtime.setter
     def revtime(self, x): self.setRevtime(x)
 
     @property
     def cutoff(self):
-        """float or PyoObject. High frequency damping.""" 
+        """float or PyoObject. High frequency damping."""
         return self._cutoff
     @cutoff.setter
     def cutoff(self, x): self.setCutoff(x)
 
     @property
     def bal(self):
-        """float or PyoObject. Balance between wet and dry signal.""" 
+        """float or PyoObject. Balance between wet and dry signal."""
         return self._bal
     @bal.setter
     def bal(self, x): self.setBal(x)
 
     @property
     def roomSize(self):
-        """float. Room size scaler, between 0.25 and 4.0.""" 
+        """float. Room size scaler, between 0.25 and 4.0."""
         return self._roomSize
     @roomSize.setter
     def roomSize(self, x): self.setRoomSize(x)
 
     @property
     def firstRefGain(self):
-        """float. Gain, in dB, of the first reflexions.""" 
+        """float. Gain, in dB, of the first reflexions."""
         return self._firstRefGain
     @firstRefGain.setter
     def firstRefGain(self, x): self.setFirstRefGain(x)
@@ -1485,7 +1487,7 @@ class SmoothDelay(PyoObject):
     """
     Artifact free sweepable recursive delay.
 
-    SmoothDelay implements a delay line that does not produce 
+    SmoothDelay implements a delay line that does not produce
     clicks or pitch shifting when the delay time is changing.
 
     :Parent: :py:class:`PyoObject`
@@ -1503,18 +1505,18 @@ class SmoothDelay(PyoObject):
             Crossfade time, in seconds, between overlaped readers.
             Defaults to 0.05.
         maxdelay : float, optional
-            Maximum delay length in seconds. Available only at initialization. 
+            Maximum delay length in seconds. Available only at initialization.
             Defaults to 1.
 
     .. note::
 
-        The minimum delay time allowed with SmoothDelay is one sample. 
+        The minimum delay time allowed with SmoothDelay is one sample.
         It can be computed with :
-            
+
         onesamp = 1.0 / s.getSamplingRate()
-        
+
     .. seealso::
-        
+
         :py:class:`Delay`, :py:class:`Waveguide`
 
     >>> s = Server().boot()
@@ -1538,7 +1540,7 @@ class SmoothDelay(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1553,7 +1555,7 @@ class SmoothDelay(PyoObject):
     def setDelay(self, x):
         """
         Replace the `delay` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -1567,7 +1569,7 @@ class SmoothDelay(PyoObject):
     def setFeedback(self, x):
         """
         Replace the `feedback` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -1581,7 +1583,7 @@ class SmoothDelay(PyoObject):
     def setCrossfade(self, x):
         """
         Replace the `crossfade` attribute.
-        
+
         :Args:
 
             x : float
@@ -1595,7 +1597,7 @@ class SmoothDelay(PyoObject):
     def reset(self):
         """
         Reset the memory buffer to zeros.
-        
+
         """
         [obj.reset() for obj in self._base_objs]
 
@@ -1608,28 +1610,147 @@ class SmoothDelay(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to delayed.""" 
+        """PyoObject. Input signal to delayed."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
- 
+
     @property
     def delay(self):
-        """float or PyoObject. Delay time in seconds.""" 
+        """float or PyoObject. Delay time in seconds."""
         return self._delay
     @delay.setter
     def delay(self, x): self.setDelay(x)
 
     @property
     def feedback(self):
-        """float or PyoObject. Amount of output signal sent back into the delay line.""" 
+        """float or PyoObject. Amount of output signal sent back into the delay line."""
         return self._feedback
     @feedback.setter
     def feedback(self, x): self.setFeedback(x)
 
     @property
     def crossfade(self):
-        """float. Crossfade time, in seconds, between overlaps.""" 
+        """float. Crossfade time, in seconds, between overlaps."""
         return self._crossfade
     @crossfade.setter
     def crossfade(self, x): self.setCrossfade(x)
+
+class FreqShift(PyoObject):
+    """
+    Frequency shifting using single sideband amplitude modulation.
+
+    Shifting frequencies means that the input signal can be detuned,
+    where the harmonic components of the signal are shifted out of
+    harmonic alignment with each other, e.g. a signal with harmonics at
+    100, 200, 300, 400 and 500 Hz, shifted up by 50 Hz, will have harmonics
+    at 150, 250, 350, 450, and 550 Hz.
+
+    :Parent: :py:class:`PyoObject`
+
+    :Args:
+
+        input : PyoObject
+            Input signal to process.
+        shift : float or PyoObject, optional
+            Amount of shifting in Hertz. Defaults to 100.
+
+    >>> s = Server().boot()
+    >>> s.start()
+    >>> a = SineLoop(freq=300, feedback=.1, mul=.3)
+    >>> lf1 = Sine(freq=.04, mul=10)
+    >>> lf2 = Sine(freq=.05, mul=10)
+    >>> b = FreqShift(a, shift=lf1, mul=.5).out()
+    >>> c = FreqShift(a, shift=lf2, mul=.5).out(1)
+
+    """
+    def __init__(self, input, shift=100, mul=1, add=0):
+        PyoObject.__init__(self, mul, add)
+        self._input = input
+        self._shift = shift
+        self._in_fader = InputFader(input)
+        in_fader, shift, mul, add, lmax = convertArgsToLists(self._in_fader, shift, mul, add)
+
+        self._hilb_objs = []
+        self._sin_objs = []
+        self._cos_objs = []
+        self._mod_objs = []
+        self._base_objs = []
+        for i in range(lmax):
+            self._hilb_objs.append(Hilbert(wrap(in_fader,i)))
+            self._sin_objs.append(Sine(freq=wrap(shift,i), mul=.707))
+            self._cos_objs.append(Sine(freq=wrap(shift,i), phase=0.25, mul=.707))
+            self._mod_objs.append(Mix(self._hilb_objs[-1]['real'] * self._sin_objs[-1] + self._hilb_objs[-1]['imag'] * self._cos_objs[-1],
+                                      mul=wrap(mul,i), add=wrap(add,i)))
+            self._base_objs.extend(self._mod_objs[-1].getBaseObjects())
+
+    def play(self, dur=0, delay=0):
+        dur, delay, lmax = convertArgsToLists(dur, delay)
+        [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._hilb_objs)]
+        [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._sin_objs)]
+        [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._cos_objs)]
+        [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._mod_objs)]
+        return PyoObject.play(self, dur, delay)
+
+    def stop(self):
+        [obj.stop() for obj in self._hilb_objs]
+        [obj.stop() for obj in self._sin_objs]
+        [obj.stop() for obj in self._cos_objs]
+        [obj.stop() for obj in self._mod_objs]
+        return PyoObject.stop(self)
+
+    def out(self, chnl=0, inc=1, dur=0, delay=0):
+        dur, delay, lmax = convertArgsToLists(dur, delay)
+        [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._hilb_objs)]
+        [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._sin_objs)]
+        [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._cos_objs)]
+        [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._mod_objs)]
+        return PyoObject.out(self, chnl, inc, dur, delay)
+
+    def setInput(self, x, fadetime=0.05):
+        """
+        Replace the `input` attribute.
+
+        Parameters:
+
+        x : PyoObject
+            New signal to process.
+        fadetime : float, optional
+            Crossfade time between old and new input. Defaults to 0.05.
+
+        """
+        self._input = x
+        self._in_fader.setInput(x, fadetime)
+
+    def setShift(self, x):
+        """
+        Replace the `shift` attribute.
+
+        Parameters:
+
+        x : float or PyoObject
+            New `shift` attribute.
+
+        """
+        self._shift = x
+        x, lmax = convertArgsToLists(x)
+        [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._sin_objs)]
+        [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._cos_objs)]
+
+    def ctrl(self, map_list=None, title=None, wxnoserver=False):
+        self._map_list = [SLMap(-2000., 2000., "lin", "shift", self._shift), SLMapMul(self._mul)]
+        PyoObject.ctrl(self, map_list, title, wxnoserver)
+
+    @property
+    def input(self):
+        """PyoObject. Input signal to pitch shift."""
+        return self._input
+    @input.setter
+    def input(self, x): self.setInput(x)
+
+    @property
+    def shift(self):
+        """float or PyoObject. Amount of pitch shift in Hertz."""
+        return self._shift
+    @shift.setter
+    def shift(self, x): self.setShift(x)
\ No newline at end of file
diff --git a/pyolib/filters.py b/pyolib/filters.py
index 5442a14..ebb5a89 100644
--- a/pyolib/filters.py
+++ b/pyolib/filters.py
@@ -1,57 +1,57 @@
 """
 Different kinds of audio filtering operations.
 
-An audio filter is designed to amplify, pass or attenuate (negative amplification) 
-some frequency ranges. Common types include low-pass, which pass through 
-frequencies below their cutoff frequencies, and progressively attenuates 
-frequencies above the cutoff frequency. A high-pass filter does the opposite, 
-passing high frequencies above the cutoff frequency, and progressively 
-attenuating frequencies below the cutoff frequency. A bandpass filter passes 
-frequencies between its two cutoff frequencies, while attenuating those outside 
-the range. A band-reject filter, attenuates frequencies between its two cutoff 
+An audio filter is designed to amplify, pass or attenuate (negative amplification)
+some frequency ranges. Common types include low-pass, which pass through
+frequencies below their cutoff frequencies, and progressively attenuates
+frequencies above the cutoff frequency. A high-pass filter does the opposite,
+passing high frequencies above the cutoff frequency, and progressively
+attenuating frequencies below the cutoff frequency. A bandpass filter passes
+frequencies between its two cutoff frequencies, while attenuating those outside
+the range. A band-reject filter, attenuates frequencies between its two cutoff
 frequencies, while passing those outside the 'reject' range.
 
-An all-pass filter, passes all frequencies, but affects the phase of any given 
+An all-pass filter, passes all frequencies, but affects the phase of any given
 sinusoidal component according to its frequency.
- 
+
 """
 
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU Lesser General Public
+License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
 from _core import *
 from _maps import *
 
 class Biquad(PyoObject):
     """
-    A sweepable general purpose biquadratic digital filter. 
-    
+    A sweepable general purpose biquadratic digital filter.
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         freq : float or PyoObject, optional
             Cutoff or center frequency of the filter. Defaults to 1000.
         q : float or PyoObject, optional
-            Q of the filter, defined (for bandpass filters) as freq/bandwidth. 
+            Q of the filter, defined (for bandpass filters) as freq/bandwidth.
             Should be between 1 and 500. Defaults to 1.
         type : int, optional
             Filter type. Five possible values :
@@ -60,7 +60,7 @@ class Biquad(PyoObject):
                 2. bandpass
                 3. bandstop
                 4. allpass
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> a = Noise(mul=.7)
@@ -81,7 +81,7 @@ class Biquad(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -92,11 +92,11 @@ class Biquad(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -110,7 +110,7 @@ class Biquad(PyoObject):
     def setQ(self, x):
         """
         Replace the `q` attribute. Should be between 1 and 500.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -124,15 +124,15 @@ class Biquad(PyoObject):
     def setType(self, x):
         """
         Replace the `type` attribute.
-        
+
         :Args:
 
             x : int
-                New `type` attribute. 
+                New `type` attribute.
                     0.lowpass
                     1. highpass
-                    2. bandpass 
-                    3. bandstop 
+                    2. bandpass
+                    3. bandstop
                     4. allpass
 
         """
@@ -141,46 +141,46 @@ class Biquad(PyoObject):
         [obj.setType(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMapFreq(self._freq), SLMapQ(self._q), 
+        self._map_list = [SLMapFreq(self._freq), SLMapQ(self._q),
                           SLMap(0, 4, 'lin', 'type', self._type, res="int", dataOnly=True),
                           SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Cutoff or center frequency of the filter.""" 
+        """float or PyoObject. Cutoff or center frequency of the filter."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def q(self):
-        """float or PyoObject. Q of the filter.""" 
+        """float or PyoObject. Q of the filter."""
         return self._q
     @q.setter
     def q(self, x): self.setQ(x)
 
     @property
     def type(self):
-        """int. Filter type.""" 
+        """int. Filter type."""
         return self._type
     @type.setter
     def type(self, x): self.setType(x)
 
 class Biquadx(PyoObject):
     """
-    A multi-stages sweepable general purpose biquadratic digital filter. 
-    
+    A multi-stages sweepable general purpose biquadratic digital filter.
+
     Biquadx is equivalent to a filter consisting of more layers of Biquad
     with the same arguments, serially connected. It is faster than using
-    a large number of instances of the Biquad object, It uses less memory 
+    a large number of instances of the Biquad object, It uses less memory
     and allows filters with sharper cutoff.
 
     :Parent: :py:class:`PyoObject`
@@ -192,7 +192,7 @@ class Biquadx(PyoObject):
         freq : float or PyoObject, optional
             Cutoff or center frequency of the filter. Defaults to 1000.
         q : float or PyoObject, optional
-            Q of the filter, defined (for bandpass filters) as freq/bandwidth. 
+            Q of the filter, defined (for bandpass filters) as freq/bandwidth.
             Should be between 1 and 500. Defaults to 1.
         type : int, optional
             Filter type. Five possible values :
@@ -272,7 +272,7 @@ class Biquadx(PyoObject):
         :Args:
 
             x : int
-                New `type` attribute. 
+                New `type` attribute.
                 0. lowpass
                 1. highpass
                 2. bandpass
@@ -291,7 +291,7 @@ class Biquadx(PyoObject):
         :Args:
 
             x : int
-                New `stages` attribute. 
+                New `stages` attribute.
 
         """
         self._stages = x
@@ -299,42 +299,42 @@ class Biquadx(PyoObject):
         [obj.setStages(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMapFreq(self._freq), SLMapQ(self._q), 
+        self._map_list = [SLMapFreq(self._freq), SLMapQ(self._q),
                           SLMap(0, 4, 'lin', 'type', self._type, res="int", dataOnly=True),
                           SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Cutoff or center frequency of the filter.""" 
+        """float or PyoObject. Cutoff or center frequency of the filter."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def q(self):
-        """float or PyoObject. Q of the filter.""" 
+        """float or PyoObject. Q of the filter."""
         return self._q
     @q.setter
     def q(self, x): self.setQ(x)
 
     @property
     def type(self):
-        """int. Filter type.""" 
+        """int. Filter type."""
         return self._type
     @type.setter
     def type(self, x): self.setType(x)
 
     @property
     def stages(self):
-        """int. The number of filtering stages.""" 
+        """int. The number of filtering stages."""
         return self._stages
     @stages.setter
     def stages(self, x): self.setStages(x)
@@ -344,14 +344,14 @@ class Biquada(PyoObject):
     A general purpose biquadratic digital filter (floating-point arguments).
 
     A digital biquad filter is a second-order recursive linear filter, containing
-    two poles and two zeros. Biquadi is a "Direct Form 1" implementation of a Biquad 
+    two poles and two zeros. Biquadi is a "Direct Form 1" implementation of a Biquad
     filter:
 
     y[n] = ( b0*x[n] + b1*x[n-1] + b2*x[n-2] - a1*y[n-1] - a2*y[n-2] ) / a0
 
     This object is directly controlled via the six coefficients, as floating-point
-    values or audio stream, of the filter. There is no clipping of the values given as 
-    coefficients, so, unless you know what you do, it is recommended to use the Biquad 
+    values or audio stream, of the filter. There is no clipping of the values given as
+    coefficients, so, unless you know what you do, it is recommended to use the Biquad
     object, which is controlled with frequency, Q and type arguments.
 
     The default values of the object give a lowpass filter with a 1000 Hz cutoff frequency.
@@ -485,9 +485,9 @@ class Biquada(PyoObject):
     def setCoeffs(self, *args, **kwds):
         """
         Replace all filter coefficients.
-    
+
         :Args:
-    
+
             b0 : float or PyoObject, optional
                 New `b0` attribute.
             b1 : float or PyoObject, optional
@@ -500,7 +500,7 @@ class Biquada(PyoObject):
                 New `a1` attribute.
             a2 : float or PyoObject, optional
                 New `a2` attribute.
-    
+
         """
         for i, val in enumerate(args):
             attr = getattr(self, ["_b0", "_b1", "_b2", "_a0", "_a1", "_a2"][i])
@@ -516,81 +516,81 @@ class Biquada(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def b0(self):
-        """float or PyoObject. `b0` coefficient.""" 
+        """float or PyoObject. `b0` coefficient."""
         return self._b0
     @b0.setter
     def b0(self, x): self.setB0(x)
 
     @property
     def b1(self):
-        """float or PyoObject. `b1` coefficient.""" 
+        """float or PyoObject. `b1` coefficient."""
         return self._b1
     @b1.setter
     def b1(self, x): self.setB1(x)
 
     @property
     def b2(self):
-        """float or PyoObject. `b2` coefficient.""" 
+        """float or PyoObject. `b2` coefficient."""
         return self._b2
     @b2.setter
     def b2(self, x): self.setB2(x)
 
     @property
     def a0(self):
-        """float or PyoObject. `a0` coefficient.""" 
+        """float or PyoObject. `a0` coefficient."""
         return self._a0
     @a0.setter
     def a0(self, x): self.setA0(x)
 
     @property
     def a1(self):
-        """float or PyoObject. `a1` coefficient.""" 
+        """float or PyoObject. `a1` coefficient."""
         return self._a1
     @a1.setter
     def a1(self, x): self.setA1(x)
 
     @property
     def a2(self):
-        """float or PyoObject. `a2` coefficient.""" 
+        """float or PyoObject. `a2` coefficient."""
         return self._a2
     @a2.setter
     def a2(self, x): self.setA2(x)
 
 class EQ(PyoObject):
     """
-    Equalizer filter. 
-    
-    EQ is a biquadratic digital filter designed for equalization. It 
-    provides peak/notch and lowshelf/highshelf filters for building 
+    Equalizer filter.
+
+    EQ is a biquadratic digital filter designed for equalization. It
+    provides peak/notch and lowshelf/highshelf filters for building
     parametric equalizers.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         freq : float or PyoObject, optional
             Cutoff or center frequency of the filter. Defaults to 1000.
         q : float or PyoObject, optional
-            Q of the filter, defined as freq/bandwidth. 
+            Q of the filter, defined as freq/bandwidth.
             Should be between 1 and 500. Defaults to 1.
         boost : float or PyoObject, optional
-            Gain, expressed in dB, to add or remove at the center frequency. 
+            Gain, expressed in dB, to add or remove at the center frequency.
             Default to -3.
         type : int, optional
             Filter type. Three possible values :
                 0. peak/notch (default)
                 1. lowshelf
                 2. highshelf
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> amp = Fader(1, 1, mul=.15).play()
@@ -614,7 +614,7 @@ class EQ(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -625,11 +625,11 @@ class EQ(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -643,7 +643,7 @@ class EQ(PyoObject):
     def setQ(self, x):
         """
         Replace the `q` attribute. Should be between 1 and 500.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -657,7 +657,7 @@ class EQ(PyoObject):
     def setBoost(self, x):
         """
         Replace the `boost` attribute, expressed in dB.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -671,11 +671,11 @@ class EQ(PyoObject):
     def setType(self, x):
         """
         Replace the `type` attribute.
-        
+
         :Args:
 
             x : int
-                New `type` attribute. 
+                New `type` attribute.
                 0. peak
                 1. lowshelf
                 2. highshelf
@@ -686,43 +686,43 @@ class EQ(PyoObject):
         [obj.setType(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMapFreq(self._freq), SLMapQ(self._q), 
-                          SLMap(-40.0, 40.0, "lin", "boost", self._boost), 
+        self._map_list = [SLMapFreq(self._freq), SLMapQ(self._q),
+                          SLMap(-40.0, 40.0, "lin", "boost", self._boost),
                           SLMap(0, 2, 'lin', 'type', self._type, res="int", dataOnly=True),
                           SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Cutoff or center frequency of the filter.""" 
+        """float or PyoObject. Cutoff or center frequency of the filter."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def q(self):
-        """float or PyoObject. Q of the filter.""" 
+        """float or PyoObject. Q of the filter."""
         return self._q
     @q.setter
     def q(self, x): self.setQ(x)
 
     @property
     def boost(self):
-        """float or PyoObject. Boost factor of the filter.""" 
+        """float or PyoObject. Boost factor of the filter."""
         return self._boost
     @boost.setter
     def boost(self, x): self.setBoost(x)
 
     @property
     def type(self):
-        """int. Filter type.""" 
+        """int. Filter type."""
         return self._type
     @type.setter
     def type(self, x): self.setType(x)
@@ -730,16 +730,16 @@ class EQ(PyoObject):
 class Tone(PyoObject):
     """
     A first-order recursive low-pass filter with variable frequency response.
- 
+
     :Parent: :py:class:`PyoObject`
-   
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         freq : float or PyoObject, optional
             Cutoff frequency of the filter in hertz. Default to 1000.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> n = Noise(.3)
@@ -758,7 +758,7 @@ class Tone(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -769,11 +769,11 @@ class Tone(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -787,17 +787,17 @@ class Tone(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMapFreq(self._freq), SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-      
+
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Cutoff frequency of the filter.""" 
+        """float or PyoObject. Cutoff frequency of the filter."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
@@ -805,16 +805,16 @@ class Tone(PyoObject):
 class Atone(PyoObject):
     """
     A first-order recursive high-pass filter with variable frequency response.
- 
+
     :Parent: :py:class:`PyoObject`
-   
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         freq : float or PyoObject, optional
             Cutoff frequency of the filter in hertz. Default to 1000.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> n = Noise(.3)
@@ -833,7 +833,7 @@ class Atone(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -844,11 +844,11 @@ class Atone(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -862,17 +862,17 @@ class Atone(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMapFreq(self._freq), SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-      
+
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Cutoff frequency of the filter.""" 
+        """float or PyoObject. Cutoff frequency of the filter."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
@@ -880,12 +880,12 @@ class Atone(PyoObject):
 class Port(PyoObject):
     """
     Exponential portamento.
-    
-    Perform an exponential portamento on an audio signal with 
+
+    Perform an exponential portamento on an audio signal with
     different rising and falling times.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
 
         input : PyoObject
@@ -895,7 +895,7 @@ class Port(PyoObject):
         falltime : float or PyoObject, optional
             Time to reach downward value in seconds. Defaults to 0.05.
         init : float, optional
-            Initial state of the internal memory. Available at intialization 
+            Initial state of the internal memory. Available at intialization
             time only. Defaults to 0.
 
     >>> from random import uniform
@@ -907,7 +907,7 @@ class Port(PyoObject):
     >>> def new_freq():
     ...     x.value = uniform(400, 800)
     >>> pat = Pattern(function=new_freq, time=1).play()
-    
+
     """
     def __init__(self, input, risetime=0.05, falltime=0.05, init=0, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -921,7 +921,7 @@ class Port(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -932,11 +932,11 @@ class Port(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setRiseTime(self, x):
         """
         Replace the `risetime` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -950,7 +950,7 @@ class Port(PyoObject):
     def setFallTime(self, x):
         """
         Replace the `falltime` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -968,14 +968,14 @@ class Port(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def risetime(self):
-        """float or PyoObject. Time to reach upward value in seconds.""" 
+        """float or PyoObject. Time to reach upward value in seconds."""
         return self._risetime
     @risetime.setter
     def risetime(self, x): self.setRiseTime(x)
@@ -990,14 +990,14 @@ class Port(PyoObject):
 class DCBlock(PyoObject):
     """
     Implements the DC blocking filter.
- 
+
     :Parent: :py:class:`PyoObject`
-   
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> n = Noise(.01)
@@ -1015,7 +1015,7 @@ class DCBlock(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1029,7 +1029,7 @@ class DCBlock(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -1037,31 +1037,31 @@ class DCBlock(PyoObject):
 class BandSplit(PyoObject):
     """
     Splits an input signal into multiple frequency bands.
-    
-    The input signal will be separated into `num` bands between `min` 
-    and `max` frequencies using second-order bandpass filters. Each 
-    band will then be assigned to an independent audio stream. 
+
+    The input signal will be separated into `num` bands between `min`
+    and `max` frequencies using second-order bandpass filters. Each
+    band will then be assigned to an independent audio stream.
     Useful for multiband processing.
 
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         num : int, optional
-            Number of frequency bands created. Available at initialization 
+            Number of frequency bands created. Available at initialization
             time only. Defaults to 6.
         min : float, optional
-            Lowest frequency. Available at initialization time only. 
+            Lowest frequency. Available at initialization time only.
             Defaults to 20.
         max : float, optional
-            Highest frequency. Available at initialization time only. 
+            Highest frequency. Available at initialization time only.
             Defaults to 20000.
         q : float or PyoObject, optional
-            Q of the filters, defined as center frequency / bandwidth. 
+            Q of the filters, defined as center frequency / bandwidth.
             Should be between 1 and 500. Defaults to 1.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> lfos = Sine(freq=[.3,.4,.5,.6,.7,.8], mul=.5, add=.5)
@@ -1089,7 +1089,7 @@ class BandSplit(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1104,12 +1104,12 @@ class BandSplit(PyoObject):
     def setQ(self, x):
         """
         Replace the `q` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `q` attribute.
-        
+
         """
         self._q = x
         x, lmax = convertArgsToLists(x)
@@ -1121,26 +1121,26 @@ class BandSplit(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
-    def q(self): 
+    def q(self):
         """float or PyoObject. Q of the filters."""
         return self._q
     @q.setter
-    def q(self, x): self.setQ(x) 
+    def q(self, x): self.setQ(x)
 
 class FourBand(PyoObject):
     """
     Splits an input signal into four frequency bands.
 
-    The input signal will be separated into 4 bands around `freqs` 
-    arguments using fourth-order Linkwitz-Riley lowpass and highpass 
-    filters. Each band will then be assigned to an independent audio 
-    stream. The sum of the four bands reproduces the same signal as 
+    The input signal will be separated into 4 bands around `freqs`
+    arguments using fourth-order Linkwitz-Riley lowpass and highpass
+    filters. Each band will then be assigned to an independent audio
+    stream. The sum of the four bands reproduces the same signal as
     the `input`. Useful for multiband processing.
 
     :Parent: :py:class:`PyoObject`
@@ -1250,61 +1250,61 @@ class FourBand(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
-    def freq1(self): 
+    def freq1(self):
         """float or PyoObject. First crossover frequency."""
         return self._freq1
     @freq1.setter
-    def freq1(self, x): self.setFreq1(x) 
+    def freq1(self, x): self.setFreq1(x)
 
     @property
-    def freq2(self): 
+    def freq2(self):
         """float or PyoObject. Second crossover frequency."""
         return self._freq2
     @freq2.setter
-    def freq2(self, x): self.setFreq2(x) 
+    def freq2(self, x): self.setFreq2(x)
 
     @property
-    def freq3(self): 
+    def freq3(self):
         """float or PyoObject. Third crossover frequency."""
         return self._freq3
     @freq3.setter
-    def freq3(self, x): self.setFreq3(x) 
+    def freq3(self, x): self.setFreq3(x)
 
 class Hilbert(PyoObject):
     """
     Hilbert transform.
-    
-    Hilbert is an IIR filter based implementation of a broad-band 90 degree 
-    phase difference network. The outputs of hilbert have an identical 
-    frequency response to the input (i.e. they sound the same), but the two 
-    outputs have a constant phase difference of 90 degrees, plus or minus some 
-    small amount of error, throughout the entire frequency range. The outputs 
+
+    Hilbert is an IIR filter based implementation of a broad-band 90 degree
+    phase difference network. The outputs of hilbert have an identical
+    frequency response to the input (i.e. they sound the same), but the two
+    outputs have a constant phase difference of 90 degrees, plus or minus some
+    small amount of error, throughout the entire frequency range. The outputs
     are in quadrature.
 
-    Hilbert is useful in the implementation of many digital signal processing 
-    techniques that require a signal in phase quadrature. The real part corresponds 
-    to the cosine output of hilbert, while the imaginary part corresponds to the 
-    sine output. The two outputs have a constant phase difference throughout the 
+    Hilbert is useful in the implementation of many digital signal processing
+    techniques that require a signal in phase quadrature. The real part corresponds
+    to the cosine output of hilbert, while the imaginary part corresponds to the
+    sine output. The two outputs have a constant phase difference throughout the
     audio range that corresponds to the phase relationship between cosine and sine waves.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
-    
+
     .. note::
-    
-        Real and imaginary parts are two separated set of streams. 
+
+        Real and imaginary parts are two separated set of streams.
         The user should call :
-        
+
         |  Hilbert['real'] to retrieve the real part.
         |  Hilbert['imag'] to retrieve the imaginary part.
 
@@ -1346,12 +1346,12 @@ class Hilbert(PyoObject):
     def get(self, identifier="real", all=False):
         """
         Return the first sample of the current buffer as a float.
-        
+
         Can be used to convert audio stream to usable Python data.
-        
+
         "real" or "imag" must be given to `identifier` to specify
         which stream to get value from.
-        
+
         :Args:
 
             identifier : string {"real", "imag"}
@@ -1362,17 +1362,17 @@ class Hilbert(PyoObject):
                 will be returned as a list. Otherwise, only the value
                 of the first object's stream will be returned as a float.
                 Defaults to False.
-                 
+
         """
         if not all:
             return self.__getitem__(identifier)[0]._getStream().getValue()
         else:
             return [obj._getStream().getValue() for obj in self.__getitem__(identifier).getBaseObjects()]
- 
+
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1386,7 +1386,7 @@ class Hilbert(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -1394,7 +1394,7 @@ class Hilbert(PyoObject):
 class Allpass(PyoObject):
     """
     Delay line based allpass filter.
-    
+
     Allpass is based on the combination of feedforward and feedback comb
     filter. This kind of filter is often used in simple digital reverb
     implementations.
@@ -1411,7 +1411,7 @@ class Allpass(PyoObject):
             Amount of output signal sent back into the delay line.
             Defaults to 0.
         maxdelay : float, optional
-            Maximum delay length in seconds. Available only at initialization. 
+            Maximum delay length in seconds. Available only at initialization.
             Defaults to 1.
 
     >>> # SIMPLE REVERB
@@ -1426,7 +1426,7 @@ class Allpass(PyoObject):
     >>> c2 = Tone(b2, 3000, mul=0.2).out()
     >>> c3 = Tone(b3, 1500, mul=0.2).out()
     >>> c4 = Tone(b4, 500, mul=0.2).out()
-    
+
     """
     def __init__(self, input, delay=0.01, feedback=0, maxdelay=1, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -1489,44 +1489,44 @@ class Allpass(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def delay(self):
-        """float or PyoObject. Delay time in seconds.""" 
+        """float or PyoObject. Delay time in seconds."""
         return self._delay
     @delay.setter
     def delay(self, x): self.setDelay(x)
 
     @property
     def feedback(self):
-        """float or PyoObject. Amount of output signal sent back into the delay line.""" 
+        """float or PyoObject. Amount of output signal sent back into the delay line."""
         return self._feedback
     @feedback.setter
     def feedback(self, x): self.setFeedback(x)
 
 class Allpass2(PyoObject):
     """
-    Second-order phase shifter allpass. 
-    
+    Second-order phase shifter allpass.
+
     This kind of filter is used in phaser implementation. The signal
     of this filter, when added to original sound, creates a notch in
     the spectrum at frequencies that are in phase opposition.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         freq : float or PyoObject, optional
             Center frequency of the filter. Defaults to 1000.
         bw : float or PyoObject, optional
             Bandwidth of the filter in Hertz. Defaults to 100.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> # 3 STAGES PHASER
@@ -1551,7 +1551,7 @@ class Allpass2(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1562,11 +1562,11 @@ class Allpass2(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -1580,7 +1580,7 @@ class Allpass2(PyoObject):
     def setBw(self, x):
         """
         Replace the `bw` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -1592,34 +1592,34 @@ class Allpass2(PyoObject):
         [obj.setBw(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMapFreq(self._freq), SLMap(10, 1000, "lin", "bw", self._bw), 
+        self._map_list = [SLMapFreq(self._freq), SLMap(10, 1000, "lin", "bw", self._bw),
                           SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
     def input(self):
-        """PyoObject. Input signal to filter.""" 
+        """PyoObject. Input signal to filter."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Center frequency of the filter.""" 
+        """float or PyoObject. Center frequency of the filter."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def bw(self):
-        """float or PyoObject. Bandwidth of the filter.""" 
+        """float or PyoObject. Bandwidth of the filter."""
         return self._bw
     @bw.setter
     def bw(self, x): self.setBw(x)
 
 class Phaser(PyoObject):
     """
-    Multi-stages second-order phase shifter allpass filters. 
+    Multi-stages second-order phase shifter allpass filters.
 
     Phaser implements `num` number of second-order allpass filters.
 
@@ -1641,7 +1641,7 @@ class Phaser(PyoObject):
         num : int, optional
             The number of allpass stages in series. Defines the number of
             notches in the spectrum. Defaults to 8.
-            
+
             Available at initialization only.
 
     >>> s = Server().boot()
@@ -1737,57 +1737,57 @@ class Phaser(PyoObject):
         [obj.setFeedback(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMap(20, 2000, "log", "freq", self._freq), 
+        self._map_list = [SLMap(20, 2000, "log", "freq", self._freq),
                           SLMap(0.5, 2, "lin", "spread", self._spread),
-                          SLMap(0.5, 100, "log", "q", self._q), 
+                          SLMap(0.5, 100, "log", "q", self._q),
                           SLMap(0, 1, "lin", "feedback", self._feedback),
                           SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Center frequency of the first notch.""" 
+        """float or PyoObject. Center frequency of the first notch."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def spread(self):
-        """float or PyoObject. Spreading factor for upper notch frequencies.""" 
+        """float or PyoObject. Spreading factor for upper notch frequencies."""
         return self._spread
     @spread.setter
     def spread(self, x): self.setSpread(x)
 
     @property
     def q(self):
-        """float or PyoObject. Q factor of the filter.""" 
+        """float or PyoObject. Q factor of the filter."""
         return self._q
     @q.setter
     def q(self, x): self.setQ(x)
 
     @property
     def feedback(self):
-        """float or PyoObject. Feedback factor of the filter.""" 
+        """float or PyoObject. Feedback factor of the filter."""
         return self._feedback
     @feedback.setter
     def feedback(self, x): self.setFeedback(x)
 
 class Vocoder(PyoObject):
     """
-    Applies the spectral envelope of a first sound to the spectrum of a second sound. 
+    Applies the spectral envelope of a first sound to the spectrum of a second sound.
 
-    The vocoder is an analysis/synthesis system, historically used to reproduce 
-    human speech. In the encoder, the first input (spectral envelope) is passed 
-    through a multiband filter, each band is passed through an envelope follower, 
-    and the control signals from the envelope followers are communicated to the 
-    decoder. The decoder applies these (amplitude) control signals to corresponding 
+    The vocoder is an analysis/synthesis system, historically used to reproduce
+    human speech. In the encoder, the first input (spectral envelope) is passed
+    through a multiband filter, each band is passed through an envelope follower,
+    and the control signals from the envelope followers are communicated to the
+    decoder. The decoder applies these (amplitude) control signals to corresponding
     filters modifying the second source (exciter).
 
     :Parent: :py:class:`PyoObject`
@@ -1802,10 +1802,10 @@ class Vocoder(PyoObject):
             Exciter. Spectrum to filter. For best results, this signal must have a
             broadband spectrum with few amplitude variations.
         freq : float or PyoObject, optional
-            Center frequency of the first band. This is the base frequency used to 
+            Center frequency of the first band. This is the base frequency used to
             compute the upper bands. Defaults to 60.
         spread : float or PyoObject, optional
-            Spreading factor for upper band frequencies. Each band is 
+            Spreading factor for upper band frequencies. Each band is
             `freq * pow(order, spread)`, where order is the harmonic rank of the band.
             Defaults to 1.25.
         q : float or PyoObject, optional
@@ -1815,12 +1815,12 @@ class Vocoder(PyoObject):
             Time response of the envelope follower. Lower values mean smoother changes,
             while higher values mean a better time accuracy. Defaults to 0.5.
         stages : int, optional
-            The number of bands in the filter bank. Defines the number of notches in 
+            The number of bands in the filter bank. Defines the number of notches in
             the spectrum. Defaults to 24.
 
     .. note::
 
-        Altough parameters can be audio signals, values are sampled only four times 
+        Altough parameters can be audio signals, values are sampled only four times
         per buffer size. To avoid artefacts, it is recommended to keep variations
         at low rate (< 20 Hz).
 
@@ -1947,9 +1947,9 @@ class Vocoder(PyoObject):
         [obj.setStages(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMap(10, 1000, "log", "freq", self._freq), 
+        self._map_list = [SLMap(10, 1000, "log", "freq", self._freq),
                           SLMap(0.25, 2, "lin", "spread", self._spread),
-                          SLMap(0.5, 200, "log", "q", self._q), 
+                          SLMap(0.5, 200, "log", "q", self._q),
                           SLMap(0, 1, "lin", "slope", self._slope),
                           SLMap(2, 64, 'lin', 'stages',  self._stages, res="int", dataOnly=True),
                           SLMapMul(self._mul)]
@@ -1957,49 +1957,49 @@ class Vocoder(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. The spectral envelope.""" 
+        """PyoObject. The spectral envelope."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def input2(self):
-        """PyoObject. The exciter.""" 
+        """PyoObject. The exciter."""
         return self._input2
     @input2.setter
     def input2(self, x): self.setInput2(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Center frequency of the first band.""" 
+        """float or PyoObject. Center frequency of the first band."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def spread(self):
-        """float or PyoObject. Spreading factor for upper band frequencies.""" 
+        """float or PyoObject. Spreading factor for upper band frequencies."""
         return self._spread
     @spread.setter
     def spread(self, x): self.setSpread(x)
 
     @property
     def q(self):
-        """float or PyoObject. Q factor of the filters.""" 
+        """float or PyoObject. Q factor of the filters."""
         return self._q
     @q.setter
     def q(self, x): self.setQ(x)
 
     @property
     def slope(self):
-        """float or PyoObject. Time response of the envelope follower.""" 
+        """float or PyoObject. Time response of the envelope follower."""
         return self._slope
     @slope.setter
     def slope(self, x): self.setSlope(x)
 
     @property
     def stages(self):
-        """int. The number of bands in the filter bank.""" 
+        """int. The number of bands in the filter bank."""
         return self._stages
     @stages.setter
     def stages(self, x): self.setStages(x)
@@ -2007,9 +2007,9 @@ class Vocoder(PyoObject):
 class IRWinSinc(PyoObject):
     """
     Windowed-sinc filter using circular convolution.
-    
-    IRWinSinc uses circular convolution to implement standard filters like 
-    lowpass, highpass, bandreject and bandpass with very flat passband 
+
+    IRWinSinc uses circular convolution to implement standard filters like
+    lowpass, highpass, bandreject and bandpass with very flat passband
     response and sharp roll-off. User can defined the length, in samples,
     of the impulse response, also known as the filter kernel.
 
@@ -2032,17 +2032,17 @@ class IRWinSinc(PyoObject):
                 2. bandreject
                 3. bandpass
         order : int {even number}, optional
-            Length, in samples, of the filter kernel used for convolution. Available 
+            Length, in samples, of the filter kernel used for convolution. Available
             at initialization time only. Defaults to 256.
-            
-            This value must be even. Higher is the order and sharper is the roll-off 
-            of the filter, but it is also more expensive to compute. 
+
+            This value must be even. Higher is the order and sharper is the roll-off
+            of the filter, but it is also more expensive to compute.
 
     .. note::
 
-        Convolution is very expensive to compute, so the length of the impulse 
+        Convolution is very expensive to compute, so the length of the impulse
         response (the `order` parameter) must be kept very short to run in real time.
-        
+
         Note that although `freq` and `bw` can be PyoObjects, the impulse response of
         the filter is only updated once per buffer size.
 
@@ -2065,7 +2065,7 @@ class IRWinSinc(PyoObject):
             print "order argument of IRWinSinc must be even, set to %i" % order
         self._order = order
         self._in_fader = InputFader(input)
-        in_fader, freq, bw, type, order, mul, add, lmax = convertArgsToLists(self._in_fader, freq, bw, type, order, mul, add)                     
+        in_fader, freq, bw, type, order, mul, add, lmax = convertArgsToLists(self._in_fader, freq, bw, type, order, mul, add)
         self._base_objs = [IRWinSinc_base(wrap(in_fader,i), wrap(freq,i), wrap(bw,i), wrap(type,i), wrap(order,i), wrap(mul,i), wrap(add,i)) for i in range(lmax)]
 
     def setInput(self, x, fadetime=0.05):
@@ -2118,7 +2118,7 @@ class IRWinSinc(PyoObject):
         :Args:
 
             x : int
-                New `type` attribute. 
+                New `type` attribute.
                 0. lowpass
                 1. highpass
                 2. bandreject
@@ -2137,28 +2137,28 @@ class IRWinSinc(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Cutoff or Center frequency of the filter.""" 
+        """float or PyoObject. Cutoff or Center frequency of the filter."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def bw(self):
-        """float or PyoObject. Bandwidth for bandreject and bandpass filters.""" 
+        """float or PyoObject. Bandwidth for bandreject and bandpass filters."""
         return self._bw
     @bw.setter
     def bw(self, x): self.setBw(x)
 
     @property
     def type(self):
-        """int. Filter type {0 = lowpass, 1 = highpass, 2 = bandreject, 3 = bandpass}.""" 
+        """int. Filter type {0 = lowpass, 1 = highpass, 2 = bandreject, 3 = bandpass}."""
         return self._type
     @type.setter
     def type(self, x): self.setType(x)
@@ -2169,8 +2169,8 @@ class IRAverage(PyoObject):
 
     IRAverage uses circular convolution to implement an average filter. This
     filter is designed to reduce the noise in the input signal while keeping
-    as much as possible the step response of the original signal. User can 
-    defined the length, in samples, of the impulse response, also known as 
+    as much as possible the step response of the original signal. User can
+    defined the length, in samples, of the impulse response, also known as
     the filter kernel. This controls the ratio of removed noise vs the fidelity
     of the original step response.
 
@@ -2181,16 +2181,16 @@ class IRAverage(PyoObject):
         input : PyoObject
             Input signal to process.
         order : int {even number}, optional
-            Length, in samples, of the filter kernel used for convolution. Available 
-            at initialization time only. Defaults to 256. 
-            
-            This value must be even. A high order will reduced more noise and will 
-            have a higher damping effect on the step response, but it is also more 
-            expensive to compute. 
+            Length, in samples, of the filter kernel used for convolution. Available
+            at initialization time only. Defaults to 256.
+
+            This value must be even. A high order will reduced more noise and will
+            have a higher damping effect on the step response, but it is also more
+            expensive to compute.
 
     .. note::
 
-        Convolution is very expensive to compute, so the length of the impulse 
+        Convolution is very expensive to compute, so the length of the impulse
         response (the `order` parameter) must be kept very short to run in real time.
 
     >>> s = Server().boot()
@@ -2208,7 +2208,7 @@ class IRAverage(PyoObject):
             print "order argument of IRAverage must be even, set to %i" % order
         self._order = order
         self._in_fader = InputFader(input)
-        in_fader, order, mul, add, lmax = convertArgsToLists(self._in_fader, order, mul, add)                     
+        in_fader, order, mul, add, lmax = convertArgsToLists(self._in_fader, order, mul, add)
         self._base_objs = [IRAverage_base(wrap(in_fader,i), wrap(order,i), wrap(mul,i), wrap(add,i)) for i in range(lmax)]
 
     def setInput(self, x, fadetime=0.05):
@@ -2228,7 +2228,7 @@ class IRAverage(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -2237,10 +2237,10 @@ class IRPulse(PyoObject):
     """
     Comb-like filter using circular convolution.
 
-    IRPulse uses circular convolution to implement standard comb-like 
-    filters consisting of an harmonic series with fundamental `freq` and 
-    a comb filter with the first notch at `bw` frequency. The `type` 
-    parameter defines variations of this pattern. User can defined the length, 
+    IRPulse uses circular convolution to implement standard comb-like
+    filters consisting of an harmonic series with fundamental `freq` and
+    a comb filter with the first notch at `bw` frequency. The `type`
+    parameter defines variations of this pattern. User can defined the length,
     in samples, of the impulse response, also known as the filter kernel.
 
     :Parent: :py:class:`PyoObject`
@@ -2250,7 +2250,7 @@ class IRPulse(PyoObject):
         input : PyoObject
             Input signal to process.
         freq : float or PyoObject, optional
-            Fundamental frequency of the spikes in the filter's spectrum, expressed 
+            Fundamental frequency of the spikes in the filter's spectrum, expressed
             in Hertz. Defaults to 500.
         bw : float or PyoObject, optional
             Frequency, expressed in Hertz, of the first notch in the comb filtering.
@@ -2262,15 +2262,15 @@ class IRPulse(PyoObject):
                 2. Pulse (odd harmonics) & comb
                 3. Pulse (odd harmonics) & comb & lowpass
         order : int {even number}, optional
-            Length, in samples, of the filter kernel used for convolution. Available 
+            Length, in samples, of the filter kernel used for convolution. Available
             at initialization time only. Defaults to 256.
-            
-            This value must be even. Higher is the order and sharper is the roll-off 
-            of the filter, but it is also more expensive to compute. 
+
+            This value must be even. Higher is the order and sharper is the roll-off
+            of the filter, but it is also more expensive to compute.
 
     .. note::
 
-        Convolution is very expensive to compute, so the length of the impulse 
+        Convolution is very expensive to compute, so the length of the impulse
         response (the `order` parameter) must be kept very short to run in real time.
 
         Note that although `freq` and `bw` can be PyoObjects, the impulse response of
@@ -2293,7 +2293,7 @@ class IRPulse(PyoObject):
             print "order argument of IRPulse must be even, set to %i" % order
         self._order = order
         self._in_fader = InputFader(input)
-        in_fader, freq, bw, type, order, mul, add, lmax = convertArgsToLists(self._in_fader, freq, bw, type, order, mul, add)                     
+        in_fader, freq, bw, type, order, mul, add, lmax = convertArgsToLists(self._in_fader, freq, bw, type, order, mul, add)
         self._base_objs = [IRPulse_base(wrap(in_fader,i), wrap(freq,i), wrap(bw,i), wrap(type,i), wrap(order,i), wrap(mul,i), wrap(add,i)) for i in range(lmax)]
 
     def setInput(self, x, fadetime=0.05):
@@ -2365,28 +2365,28 @@ class IRPulse(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Cutoff or Center frequency of the filter.""" 
+        """float or PyoObject. Cutoff or Center frequency of the filter."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def bw(self):
-        """float or PyoObject. Bandwidth for bandreject and bandpass filters.""" 
+        """float or PyoObject. Bandwidth for bandreject and bandpass filters."""
         return self._bw
     @bw.setter
     def bw(self, x): self.setBw(x)
 
     @property
     def type(self):
-        """int. Filter type {0 = pulse, 1 = pulse_lp, 2 = pulse_odd, 3 = pulse_odd_lp}.""" 
+        """int. Filter type {0 = pulse, 1 = pulse_lp, 2 = pulse_odd, 3 = pulse_odd_lp}."""
         return self._type
     @type.setter
     def type(self, x): self.setType(x)
@@ -2395,8 +2395,8 @@ class IRFM(PyoObject):
     """
     Filters a signal with a frequency modulation spectrum using circular convolution.
 
-    IRFM uses circular convolution to implement filtering with a frequency 
-    modulation spectrum. User can defined the length, in samples, of the 
+    IRFM uses circular convolution to implement filtering with a frequency
+    modulation spectrum. User can defined the length, in samples, of the
     impulse response, also known as the filter kernel. The higher the `order`,
     the narrower the bandwidth around each of the FM components.
 
@@ -2409,24 +2409,24 @@ class IRFM(PyoObject):
         carrier : float or PyoObject, optional
             Carrier frequency in cycles per second. Defaults to 1000.
         ratio : float or PyoObject, optional
-            A factor that, when multiplied by the `carrier` parameter, 
+            A factor that, when multiplied by the `carrier` parameter,
             gives the modulator frequency. Defaults to 0.5.
         index : float or PyoObject, optional
             The modulation index. This value multiplied by the modulator
             frequency gives the modulator amplitude. Defaults to 3.
         order : int {even number}, optional
-            Length, in samples, of the filter kernel used for convolution. 
+            Length, in samples, of the filter kernel used for convolution.
             Available at initialization time only. Defaults to 256.
-            
-            This value must be even. Higher is the order and sharper is the 
+
+            This value must be even. Higher is the order and sharper is the
             roll-off of the filter, but it is also more expensive to compute.
 
     .. note::
 
-        Convolution is very expensive to compute, so the length of the impulse 
+        Convolution is very expensive to compute, so the length of the impulse
         response (the `order` parameter) must be kept very short to run in real time.
 
-        Note that although `carrier`, `ratio` and `index` can be PyoObjects, the 
+        Note that although `carrier`, `ratio` and `index` can be PyoObjects, the
         impulse response of the filter is only updated once per buffer size.
 
     >>> s = Server().boot()
@@ -2447,7 +2447,7 @@ class IRFM(PyoObject):
             print "order argument of IRFM must be even, set to %i" % order
         self._order = order
         self._in_fader = InputFader(input)
-        in_fader, carrier, ratio, index, order, mul, add, lmax = convertArgsToLists(self._in_fader, carrier, ratio, index, order, mul, add)                     
+        in_fader, carrier, ratio, index, order, mul, add, lmax = convertArgsToLists(self._in_fader, carrier, ratio, index, order, mul, add)
         self._base_objs = [IRFM_base(wrap(in_fader,i), wrap(carrier,i), wrap(ratio,i), wrap(index,i), wrap(order,i), wrap(mul,i), wrap(add,i)) for i in range(lmax)]
 
     def setInput(self, x, fadetime=0.05):
@@ -2515,58 +2515,58 @@ class IRFM(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def carrier(self):
-        """float or PyoObject. Carrier frequency in Hz.""" 
+        """float or PyoObject. Carrier frequency in Hz."""
         return self._carrier
     @carrier.setter
     def carrier(self, x): self.setCarrier(x)
 
     @property
     def ratio(self):
-        """float or PyoObject. Modulator/carrier ratio.""" 
+        """float or PyoObject. Modulator/carrier ratio."""
         return self._ratio
     @ratio.setter
     def ratio(self, x): self.setRatio(x)
 
     @property
     def index(self):
-        """float or PyoObject. Modulation index.""" 
+        """float or PyoObject. Modulation index."""
         return self._index
     @index.setter
     def index(self, x): self.setIndex(x)
 
 class SVF(PyoObject):
     """
-    Fourth-order state variable filter allowing continuous change of the filter type. 
-    
+    Fourth-order state variable filter allowing continuous change of the filter type.
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         freq : float or PyoObject, optional
-            Cutoff or center frequency of the filter. Defaults to 1000. 
-            
-            Because this filter becomes unstable at higher frequencies, 
+            Cutoff or center frequency of the filter. Defaults to 1000.
+
+            Because this filter becomes unstable at higher frequencies,
             the `freq` parameter is limited to one-sixth of the sampling rate.
         q : float or PyoObject, optional
-            Q of the filter, defined (for bandpass filters) as freq/bandwidth. 
+            Q of the filter, defined (for bandpass filters) as freq/bandwidth.
             Should be between 0.5 and 50. Defaults to 1.
         type : float or PyoObject, optional
-            This value, in the range 0 to 1, controls the filter type crossfade 
+            This value, in the range 0 to 1, controls the filter type crossfade
             on the continuum lowpass-bandpass-highpass.
 
             - 0.0 = lowpass (default)
             - 0.5 = bandpass
             - 1.0 = highpass
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> a = Noise(.2)
@@ -2589,7 +2589,7 @@ class SVF(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -2600,12 +2600,12 @@ class SVF(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setFreq(self, x):
         """
         Replace the `freq` attribute. Limited in the upper bound to
         one-sixth of the sampling rate.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -2619,7 +2619,7 @@ class SVF(PyoObject):
     def setQ(self, x):
         """
         Replace the `q` attribute. Should be between 0.5 and 50.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -2633,14 +2633,14 @@ class SVF(PyoObject):
     def setType(self, x):
         """
         Replace the `type` attribute. Must be in the range 0 to 1.
-        
-        This value allows the filter type to sweep from a lowpass (0) 
-        to a bandpass (0.5) and then, from the bandpass to a highpass (1). 
-        
+
+        This value allows the filter type to sweep from a lowpass (0)
+        to a bandpass (0.5) and then, from the bandpass to a highpass (1).
+
         :Args:
 
             x : float or PyoObject
-                New `type` attribute. 
+                New `type` attribute.
 
         """
         self._type = x
@@ -2648,7 +2648,7 @@ class SVF(PyoObject):
         [obj.setType(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMap(20, 7350, "log", "freq", self._freq), 
+        self._map_list = [SLMap(20, 7350, "log", "freq", self._freq),
                           SLMap(0.5, 10, "log", "q", self._q),
                           SLMap(0, 1, "lin", "type", self._type),
                           SLMapMul(self._mul)]
@@ -2656,28 +2656,28 @@ class SVF(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Cutoff or center frequency of the filter.""" 
+        """float or PyoObject. Cutoff or center frequency of the filter."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def q(self):
-        """float or PyoObject. Q of the filter.""" 
+        """float or PyoObject. Q of the filter."""
         return self._q
     @q.setter
     def q(self, x): self.setQ(x)
 
     @property
     def type(self):
-        """float or PyoObject. Crossfade between filter types.""" 
+        """float or PyoObject. Crossfade between filter types."""
         return self._type
     @type.setter
     def type(self, x): self.setType(x)
@@ -2685,22 +2685,22 @@ class SVF(PyoObject):
 class Average(PyoObject):
     """
     Moving average filter.
-    
+
     As the name implies, the moving average filter operates by averaging a number
     of points from the input signal to produce each point in the output signal.
     In spite of its simplicity, the moving average filter is optimal for
     a common task: reducing random noise while retaining a sharp step response.
 
     :Parent: :py:class:`PyoObject`
-   
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         size : int, optional
-            Filter kernel size, which is the number of samples used in the 
+            Filter kernel size, which is the number of samples used in the
             moving average. Default to 10.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> a = Noise(.025)
@@ -2719,7 +2719,7 @@ class Average(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -2730,11 +2730,11 @@ class Average(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setSize(self, x):
         """
         Replace the `size` attribute.
-        
+
         :Args:
 
             x : int
@@ -2749,43 +2749,43 @@ class Average(PyoObject):
         self._map_list = [SLMap(2, 256, 'lin', 'size', self._size, res="int", dataOnly=True),
                           SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-      
+
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def size(self):
-        """int. Filter kernel size in samples.""" 
+        """int. Filter kernel size in samples."""
         return self._size
     @size.setter
     def size(self, x): self.setSize(x)
 
 class Reson(PyoObject):
     """
-    A second-order resonant bandpass filter. 
-    
+    A second-order resonant bandpass filter.
+
     Reson implements a classic resonant bandpass filter, as described in:
-        
+
     Dodge, C., Jerse, T., "Computer Music, Synthesis, Composition and Performance".
-    
+
     Reson uses less CPU than the equivalent filter with a Biquad object.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         freq : float or PyoObject, optional
             Center frequency of the filter. Defaults to 1000.
         q : float or PyoObject, optional
-            Q of the filter, defined as freq/bandwidth. 
+            Q of the filter, defined as freq/bandwidth.
             Should be between 1 and 500. Defaults to 1.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> a = Noise(mul=.7)
@@ -2805,7 +2805,7 @@ class Reson(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -2816,11 +2816,11 @@ class Reson(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -2834,7 +2834,7 @@ class Reson(PyoObject):
     def setQ(self, x):
         """
         Replace the `q` attribute. Should be between 1 and 500.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -2851,36 +2851,36 @@ class Reson(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Center frequency of the filter.""" 
+        """float or PyoObject. Center frequency of the filter."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def q(self):
-        """float or PyoObject. Q of the filter.""" 
+        """float or PyoObject. Q of the filter."""
         return self._q
     @q.setter
     def q(self, x): self.setQ(x)
 
 class Resonx(PyoObject):
     """
-    A multi-stages second-order resonant bandpass filter. 
-    
+    A multi-stages second-order resonant bandpass filter.
+
     Resonx implements a stack of the classic resonant bandpass filter, as described in:
-        
+
     Dodge, C., Jerse, T., "Computer Music, Synthesis, Composition and Performance".
-    
+
     Resonx is equivalent to a filter consisting of more layers of Reson
     with the same arguments, serially connected. It is faster than using
-    a large number of instances of the Reson object, it uses less memory 
+    a large number of instances of the Reson object, it uses less memory
     and allows filters with sharper cutoff.
 
     :Parent: :py:class:`PyoObject`
@@ -2892,7 +2892,7 @@ class Resonx(PyoObject):
         freq : float or PyoObject, optional
             Center frequency of the filter. Defaults to 1000.
         q : float or PyoObject, optional
-            Q of the filter, defined as freq/bandwidth. 
+            Q of the filter, defined as freq/bandwidth.
             Should be between 1 and 500. Defaults to 1.
         stages : int, optional
             The number of filtering stages in the filter stack. Defaults to 4.
@@ -2964,7 +2964,7 @@ class Resonx(PyoObject):
         :Args:
 
             x : int
-                New `stages` attribute. 
+                New `stages` attribute.
 
         """
         self._stages = x
@@ -2977,28 +2977,28 @@ class Resonx(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Center frequency of the filter.""" 
+        """float or PyoObject. Center frequency of the filter."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def q(self):
-        """float or PyoObject. Q of the filter.""" 
+        """float or PyoObject. Q of the filter."""
         return self._q
     @q.setter
     def q(self, x): self.setQ(x)
 
     @property
     def stages(self):
-        """int. The number of filtering stages.""" 
+        """int. The number of filtering stages."""
         return self._stages
     @stages.setter
     def stages(self, x): self.setStages(x)
@@ -3006,20 +3006,20 @@ class Resonx(PyoObject):
 class ButLP(PyoObject):
     """
     A second-order Butterworth lowpass filter.
-    
+
     ButLP implements a second-order IIR Butterworth lowpass filter,
-    which has a maximally flat passband and a very good precision and 
+    which has a maximally flat passband and a very good precision and
     stopband attenuation.
- 
+
     :Parent: :py:class:`PyoObject`
-   
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         freq : float or PyoObject, optional
             Cutoff frequency of the filter in hertz. Default to 1000.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> n = Noise(.3)
@@ -3038,7 +3038,7 @@ class ButLP(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -3049,11 +3049,11 @@ class ButLP(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -3067,17 +3067,17 @@ class ButLP(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMapFreq(self._freq), SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-      
+
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Cutoff frequency of the filter.""" 
+        """float or PyoObject. Cutoff frequency of the filter."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
@@ -3085,20 +3085,20 @@ class ButLP(PyoObject):
 class ButHP(PyoObject):
     """
     A second-order Butterworth highpass filter.
-    
+
     ButHP implements a second-order IIR Butterworth highpass filter,
-    which has a maximally flat passband and a very good precision and 
+    which has a maximally flat passband and a very good precision and
     stopband attenuation.
- 
+
     :Parent: :py:class:`PyoObject`
-   
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         freq : float or PyoObject, optional
             Cutoff frequency of the filter in hertz. Default to 1000.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> n = Noise(.2)
@@ -3117,7 +3117,7 @@ class ButHP(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -3128,11 +3128,11 @@ class ButHP(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -3146,17 +3146,17 @@ class ButHP(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMapFreq(self._freq), SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-      
+
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Cutoff frequency of the filter.""" 
+        """float or PyoObject. Cutoff frequency of the filter."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
@@ -3164,23 +3164,23 @@ class ButHP(PyoObject):
 class ButBP(PyoObject):
     """
     A second-order Butterworth bandpass filter.
-    
+
     ButBP implements a second-order IIR Butterworth bandpass filter,
-    which has a maximally flat passband and a very good precision and 
+    which has a maximally flat passband and a very good precision and
     stopband attenuation.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         freq : float or PyoObject, optional
             Center frequency of the filter. Defaults to 1000.
         q : float or PyoObject, optional
-            Q of the filter, defined as freq/bandwidth. 
+            Q of the filter, defined as freq/bandwidth.
             Should be between 1 and 500. Defaults to 1.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> a = Noise(mul=.7)
@@ -3200,7 +3200,7 @@ class ButBP(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -3211,11 +3211,11 @@ class ButBP(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -3229,7 +3229,7 @@ class ButBP(PyoObject):
     def setQ(self, x):
         """
         Replace the `q` attribute. Should be between 1 and 500.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -3241,27 +3241,27 @@ class ButBP(PyoObject):
         [obj.setQ(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMapFreq(self._freq), 
+        self._map_list = [SLMapFreq(self._freq),
                           SLMap(1, 100, "log", "q", self._q), SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Center frequency of the filter.""" 
+        """float or PyoObject. Center frequency of the filter."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def q(self):
-        """float or PyoObject. Q of the filter.""" 
+        """float or PyoObject. Q of the filter."""
         return self._q
     @q.setter
     def q(self, x): self.setQ(x)
@@ -3269,23 +3269,23 @@ class ButBP(PyoObject):
 class ButBR(PyoObject):
     """
     A second-order Butterworth band-reject filter.
-    
+
     ButBR implements a second-order IIR Butterworth band-reject filter,
-    which has a maximally flat passband and a very good precision and 
+    which has a maximally flat passband and a very good precision and
     stopband attenuation.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         freq : float or PyoObject, optional
             Center frequency of the filter. Defaults to 1000.
         q : float or PyoObject, optional
-            Q of the filter, defined as freq/bandwidth. 
+            Q of the filter, defined as freq/bandwidth.
             Should be between 1 and 500. Defaults to 1.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> a = Noise(mul=.2)
@@ -3305,7 +3305,7 @@ class ButBR(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -3316,11 +3316,11 @@ class ButBR(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -3334,7 +3334,7 @@ class ButBR(PyoObject):
     def setQ(self, x):
         """
         Replace the `q` attribute. Should be between 1 and 500.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -3346,42 +3346,42 @@ class ButBR(PyoObject):
         [obj.setQ(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMapFreq(self._freq), 
+        self._map_list = [SLMapFreq(self._freq),
                           SLMap(1, 100, "log", "q", self._q), SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Center frequency of the filter.""" 
+        """float or PyoObject. Center frequency of the filter."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def q(self):
-        """float or PyoObject. Q of the filter.""" 
+        """float or PyoObject. Q of the filter."""
         return self._q
     @q.setter
     def q(self, x): self.setQ(x)
 
 class ComplexRes(PyoObject):
     """
-    Complex one-pole resonator filter. 
-    
-    ComplexRes implements a resonator derived from a complex 
+    Complex one-pole resonator filter.
+
+    ComplexRes implements a resonator derived from a complex
     multiplication, which is very similar to a digital filter.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         freq : float or PyoObject, optional
@@ -3389,7 +3389,7 @@ class ComplexRes(PyoObject):
         decay : float or PyoObject, optional
             Decay time, in seconds, for the filter's response.
             Defaults to 0.25.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> env = HannTable()
@@ -3411,7 +3411,7 @@ class ComplexRes(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -3422,11 +3422,11 @@ class ComplexRes(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -3440,7 +3440,7 @@ class ComplexRes(PyoObject):
     def setDecay(self, x):
         """
         Replace the `decay` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -3452,27 +3452,27 @@ class ComplexRes(PyoObject):
         [obj.setDecay(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMapFreq(self._freq), SLMap(0.0001, 10, "log", "decay", self._decay), 
+        self._map_list = [SLMapFreq(self._freq), SLMap(0.0001, 10, "log", "decay", self._decay),
                           SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
     def input(self):
-        """PyoObject. Input signal to filter.""" 
+        """PyoObject. Input signal to filter."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Center frequency of the filter.""" 
+        """float or PyoObject. Center frequency of the filter."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def decay(self):
-        """float or PyoObject. Decay time of the filter's response.""" 
+        """float or PyoObject. Decay time of the filter's response."""
         return self._decay
     @decay.setter
-    def decay(self, x): self.setDecay(x)
+    def decay(self, x): self.setDecay(x)
\ No newline at end of file
diff --git a/pyolib/fourier.py b/pyolib/fourier.py
index 9ab0667..30026cd 100644
--- a/pyolib/fourier.py
+++ b/pyolib/fourier.py
@@ -1,32 +1,32 @@
 """
 Fast Fourier Transform.
 
-A Fast Fourier Transform (FFT) is an efficient algorithm to compute 
+A Fast Fourier Transform (FFT) is an efficient algorithm to compute
 the discrete Fourier transform (DFT) and its inverse (IFFT).
 
-The objects below can be used to perform sound processing in the 
+The objects below can be used to perform sound processing in the
 spectral domain.
 
 """
 
 """
-Copyright 2011 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU Lesser General Public
+License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
 from _core import *
 from _maps import *
@@ -37,17 +37,17 @@ class FFT(PyoObject):
 
     FFT analyses an input signal and converts it into the spectral
     domain. Three audio signals are sent out of the object, the
-    `real` part, from bin 0 (DC) to bin size/2 (Nyquist), the 
-    `imaginary` part, from bin 0 to bin size/2-1, and the bin 
-    number, an increasing count from 0 to size-1. `real` and 
-    `imaginary` buffer's left samples  up to size-1 are filled 
-    with zeros. See notes below for an example of how to retrieve 
+    `real` part, from bin 0 (DC) to bin size/2 (Nyquist), the
+    `imaginary` part, from bin 0 to bin size/2-1, and the bin
+    number, an increasing count from 0 to size-1. `real` and
+    `imaginary` buffer's left samples  up to size-1 are filled
+    with zeros. See notes below for an example of how to retrieve
     each signal component.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         size : int {pow-of-two > 4}, optional
@@ -73,15 +73,15 @@ class FFT(PyoObject):
                 8. Sine (half-sine window)
 
     .. note::
-    
-        FFT has no `out` method. Signal must be converted back to time domain, 
+
+        FFT has no `out` method. Signal must be converted back to time domain,
         with IFFT, before being sent to output.
 
         FFT has no `mul` and `add` attributes.
-        
-        Real, imaginary and bin_number parts are three separated set 
+
+        Real, imaginary and bin_number parts are three separated set
         of audio streams. The user should call :
-        
+
         |  FFT['real'] to retrieve the real part.
         |  FFT['imag'] to retrieve the imaginary part.
         |  FFT['bin'] to retrieve the bin number part.
@@ -120,7 +120,7 @@ class FFT(PyoObject):
             self._real_objs.append(FFT_base(wrap(self._base_players,j), 0, self._mul, self._add))
             self._imag_objs.append(FFT_base(wrap(self._base_players,j), 1, self._mul, self._add))
             self._bin_objs.append(FFT_base(wrap(self._base_players,j), 2, self._mul, self._add))
-            
+
     def __len__(self):
         return len(self._real_objs)
 
@@ -138,12 +138,12 @@ class FFT(PyoObject):
     def get(self, identifier="real", all=False):
         """
         Return the first sample of the current buffer as a float.
-        
+
         Can be used to convert audio stream to usable Python data.
-        
+
         "real", "imag" or "bin" must be given to `identifier` to specify
         which stream to get value from.
-        
+
         :Args:
 
             identifier : string {"real", "imag", "bin"}
@@ -154,17 +154,17 @@ class FFT(PyoObject):
                 will be returned as a list. Otherwise, only the value
                 of the first object's stream will be returned as a float.
                 Defaults to False.
-                 
+
         """
         if not all:
             return self.__getitem__(identifier)[0]._getStream().getValue()
         else:
             return [obj._getStream().getValue() for obj in self.__getitem__(identifier).getBaseObjects()]
- 
+
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -175,7 +175,7 @@ class FFT(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-                    
+
     def play(self, dur=0, delay=0):
         dur, delay, lmax = convertArgsToLists(dur, delay)
         self._base_players = [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._base_players)]
@@ -183,7 +183,7 @@ class FFT(PyoObject):
         self._imag_objs = [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._imag_objs)]
         self._bin_objs = [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._bin_objs)]
         return self
-    
+
     def stop(self):
         [obj.stop() for obj in self._base_players]
         [obj.stop() for obj in self._real_objs]
@@ -197,12 +197,12 @@ class FFT(PyoObject):
     def setSize(self, x):
         """
         Replace the `size` attribute.
-        
+
         :Args:
 
             x : int
                 new `size` attribute.
-        
+
         """
         self._size = x
         x, lmax = convertArgsToLists(x)
@@ -215,12 +215,12 @@ class FFT(PyoObject):
     def setWinType(self, x):
         """
         Replace the `wintype` attribute.
-        
+
         :Args:
 
             x : int
                 new `wintype` attribute.
-        
+
         """
         self._wintype = x
         x, lmax = convertArgsToLists(x)
@@ -228,7 +228,7 @@ class FFT(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -251,17 +251,17 @@ class IFFT(PyoObject):
     """
     Inverse Fast Fourier Transform.
 
-    IFFT takes a signal in the spectral domain and converts it to a 
-    real audio signal using an inverse fast fourier transform. 
+    IFFT takes a signal in the spectral domain and converts it to a
+    real audio signal using an inverse fast fourier transform.
     IFFT takes two signals in input, the `real` and `imaginary` parts
     of an FFT analysis and returns the corresponding real signal.
     These signals must correspond to `real` and `imaginary` parts
     from an FFT object.
 
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         inreal : PyoObject
             Input `real` signal.
         inimag : PyoObject
@@ -269,13 +269,13 @@ class IFFT(PyoObject):
         size : int {pow-of-two > 4}, optional
             FFT size. Must be a power of two greater than 4.
             The FFT size is the number of samples used in each
-            analysis frame. This value must match the `size` 
+            analysis frame. This value must match the `size`
             attribute of the former FFT object. Defaults to 1024.
         overlaps : int, optional
             The number of overlaped analysis block. Must be a
             positive integer. More overlaps can greatly improved
             sound quality synthesis but it is also more CPU
-            expensive. This value must match the `overlaps` 
+            expensive. This value must match the `overlaps`
             atribute of the former FFT object. Defaults to 4.
         wintype : int, optional
             Shape of the envelope used to filter each output frame.
@@ -291,7 +291,7 @@ class IFFT(PyoObject):
                 8. Sine (half-sine window)
 
     .. note::
-    
+
         The number of streams in `inreal` and `inimag` attributes
         must be egal to the output of the former FFT object. In
         most case, it will be `channels of processed sound` * `overlaps`.
@@ -300,7 +300,7 @@ class IFFT(PyoObject):
         signal from the overlapped streams. It is left to the user
         to call the mix(channels of the processed sound) method on
         an IFFT object.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> a = Noise(.25).mix(2)
@@ -330,11 +330,11 @@ class IFFT(PyoObject):
 
     def __len__(self):
         return len(self._inreal)
-        
+
     def setInReal(self, x, fadetime=0.05):
         """
         Replace the `inreal` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -349,7 +349,7 @@ class IFFT(PyoObject):
     def setInImag(self, x, fadetime=0.05):
         """
         Replace the `inimag` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -364,12 +364,12 @@ class IFFT(PyoObject):
     def setSize(self, x):
         """
         Replace the `size` attribute.
-        
+
         :Args:
 
             x : int
                 new `size` attribute.
-        
+
         """
         self._size = x
         x, lmax = convertArgsToLists(x)
@@ -381,12 +381,12 @@ class IFFT(PyoObject):
     def setWinType(self, x):
         """
         Replace the `wintype` attribute.
-        
+
         :Args:
 
             x : int
                 new `wintype` attribute.
-        
+
         """
         self._wintype = x
         x, lmax = convertArgsToLists(x)
@@ -395,17 +395,17 @@ class IFFT(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-      
+
     @property
     def inreal(self):
-        """PyoObject. Real input signal.""" 
+        """PyoObject. Real input signal."""
         return self._inreal
     @inreal.setter
     def inreal(self, x): self.setInReal(x)
 
     @property
     def inimag(self):
-        """PyoObject. Imaginary input signal.""" 
+        """PyoObject. Imaginary input signal."""
         return self._inimag
     @inimag.setter
     def inimag(self, x): self.setInImag(x)
@@ -428,12 +428,12 @@ class CarToPol(PyoObject):
     """
     Performs the cartesian to polar conversion.
 
-    The Cartesian system locates points on a plane by measuring the  horizontal and 
-    vertical distances from an arbitrary origin to a point.  These are usually denoted 
+    The Cartesian system locates points on a plane by measuring the  horizontal and
+    vertical distances from an arbitrary origin to a point.  These are usually denoted
     as a pair of values (X,Y).
 
-    The Polar system locates the point by measuring the straight line distance, usually 
-    denoted by R, from the origin to the point and the angle of an imaginary line from 
+    The Polar system locates the point by measuring the straight line distance, usually
+    denoted by R, from the origin to the point and the angle of an imaginary line from
     the origin to the point measured counterclockwise from the positive X axis.
 
     :Parent: :py:class:`PyoObject`
@@ -446,13 +446,13 @@ class CarToPol(PyoObject):
             Imaginary input signal.
 
     .. note::
-    
+
         Polar coordinates can be retrieve by calling :
-        
+
         |  CarToPol['mag'] to retrieve the magnitude part.
         |  CarToPol['ang'] to retrieve the angle part.
 
-        CarToPol has no `out` method. Signal must be converted back to time domain, 
+        CarToPol has no `out` method. Signal must be converted back to time domain,
         with IFFT, before being sent to output.
 
     >>> s = Server().boot()
@@ -555,14 +555,14 @@ class CarToPol(PyoObject):
 
     @property
     def inreal(self):
-        """PyoObject. Real input signal.""" 
+        """PyoObject. Real input signal."""
         return self._inreal
     @inreal.setter
     def inreal(self, x): self.setInReal(x)
 
     @property
     def inimag(self):
-        """PyoObject. Imaginary input signal.""" 
+        """PyoObject. Imaginary input signal."""
         return self._inimag
     @inimag.setter
     def inimag(self, x): self.setInImag(x)
@@ -571,12 +571,12 @@ class PolToCar(PyoObject):
     """
     Performs the polar to cartesian conversion.
 
-    The Polar system locates the point by measuring the straight line distance, usually 
-    denoted by R, from the origin to the point and the angle of an imaginary line from 
+    The Polar system locates the point by measuring the straight line distance, usually
+    denoted by R, from the origin to the point and the angle of an imaginary line from
     the origin to the point measured counterclockwise from the positive X axis.
 
-    The Cartesian system locates points on a plane by measuring the  horizontal and 
-    vertical distances from an arbitrary origin to a point.  These are usually denoted 
+    The Cartesian system locates points on a plane by measuring the  horizontal and
+    vertical distances from an arbitrary origin to a point.  These are usually denoted
     as a pair of values (X,Y).
 
     :Parent: :py:class:`PyoObject`
@@ -591,11 +591,11 @@ class PolToCar(PyoObject):
     .. note::
 
         Cartesians coordinates can be retrieve by calling :
-        
+
         |  PolToCar['real'] to retrieve the real part.
         |  CarToPol['imag'] to retrieve the imaginary part.
 
-        PolToCar has no `out` method. Signal must be converted back to time domain, 
+        PolToCar has no `out` method. Signal must be converted back to time domain,
         with IFFT, before being sent to output.
 
     >>> s = Server().boot()
@@ -698,14 +698,14 @@ class PolToCar(PyoObject):
 
     @property
     def inmag(self):
-        """PyoObject. Magnitude input signal.""" 
+        """PyoObject. Magnitude input signal."""
         return self._inmag
     @inmag.setter
     def inmag(self, x): self.setInMag(x)
 
     @property
     def inang(self):
-        """PyoObject. Angle input signal.""" 
+        """PyoObject. Angle input signal."""
         return self._inang
     @inang.setter
     def inang(self, x): self.setInAng(x)
@@ -714,14 +714,14 @@ class FrameDelta(PyoObject):
     """
     Computes the phase differences between successive frames.
 
-    The difference between the phase values of successive FFT frames for a given bin 
-    determines the exact frequency of the energy centered in that bin. This is often 
-    known as the phase difference (and sometimes also referred to as phase derivative 
+    The difference between the phase values of successive FFT frames for a given bin
+    determines the exact frequency of the energy centered in that bin. This is often
+    known as the phase difference (and sometimes also referred to as phase derivative
     or instantaneous frequency if it's been subjected to a few additional calculations).
 
-    In order to reconstruct a plausible playback of re-ordered FFT frames, we need to 
-    calculate the phase difference between successive frames and use it to construct a 
-    `running phase` (by simply summing the successive differences with FrameAccum) for 
+    In order to reconstruct a plausible playback of re-ordered FFT frames, we need to
+    calculate the phase difference between successive frames and use it to construct a
+    `running phase` (by simply summing the successive differences with FrameAccum) for
     the output FFT frames.
 
     :Parent: :py:class:`PyoObject`
@@ -739,7 +739,7 @@ class FrameDelta(PyoObject):
 
     .. note::
 
-        FrameDelta has no `out` method. Signal must be converted back to time domain, 
+        FrameDelta has no `out` method. Signal must be converted back to time domain,
         with IFFT, before being sent to output.
 
     >>> s = Server().boot()
@@ -818,14 +818,14 @@ class FrameDelta(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Phase input signal.""" 
+        """PyoObject. Phase input signal."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def framesize(self):
-        """PyoObject. Frame size in samples.""" 
+        """PyoObject. Frame size in samples."""
         return self._framesize
     @framesize.setter
     def framesize(self, x): self.setFrameSize(x)
@@ -834,14 +834,14 @@ class FrameAccum(PyoObject):
     """
     Accumulates the phase differences between successive frames.
 
-    The difference between the phase values of successive FFT frames for a given bin 
-    determines the exact frequency of the energy centered in that bin. This is often 
-    known as the phase difference (and sometimes also referred to as phase derivative 
+    The difference between the phase values of successive FFT frames for a given bin
+    determines the exact frequency of the energy centered in that bin. This is often
+    known as the phase difference (and sometimes also referred to as phase derivative
     or instantaneous frequency if it's been subjected to a few additional calculations).
 
-    In order to reconstruct a plausible playback of re-ordered FFT frames, we need to 
-    calculate the phase difference between successive frames, with FrameDelta, and use 
-    it to construct a `running phase` (by simply summing the successive differences) for 
+    In order to reconstruct a plausible playback of re-ordered FFT frames, we need to
+    calculate the phase difference between successive frames, with FrameDelta, and use
+    it to construct a `running phase` (by simply summing the successive differences) for
     the output FFT frames.
 
     :Parent: :py:class:`PyoObject`
@@ -859,7 +859,7 @@ class FrameAccum(PyoObject):
 
     .. note::
 
-        FrameAccum has no `out` method. Signal must be converted back to time domain, 
+        FrameAccum has no `out` method. Signal must be converted back to time domain,
         with IFFT, before being sent to output.
 
     >>> s = Server().boot()
@@ -938,14 +938,14 @@ class FrameAccum(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Phase input signal.""" 
+        """PyoObject. Phase input signal."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def framesize(self):
-        """PyoObject. Frame size in samples.""" 
+        """PyoObject. Frame size in samples."""
         return self._framesize
     @framesize.setter
     def framesize(self, x): self.setFrameSize(x)
@@ -983,7 +983,7 @@ class Vectral(PyoObject):
 
     .. note::
 
-        Vectral has no `out` method. Signal must be converted back to time domain, 
+        Vectral has no `out` method. Signal must be converted back to time domain,
         with IFFT, before being sent to output.
 
     >>> s = Server().boot()
@@ -1105,57 +1105,57 @@ class Vectral(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Magnitude input signal.""" 
+        """PyoObject. Magnitude input signal."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def framesize(self):
-        """int. Frame size in samples.""" 
+        """int. Frame size in samples."""
         return self._framesize
     @framesize.setter
     def framesize(self, x): self.setFrameSize(x)
 
     @property
     def up(self):
-        """float or PyoObject. Filter coefficient for increasing bins.""" 
+        """float or PyoObject. Filter coefficient for increasing bins."""
         return self._up
     @up.setter
     def up(self, x): self.setUp(x)
 
     @property
     def down(self):
-        """float or PyoObject. Filter coefficient for decreasing bins.""" 
+        """float or PyoObject. Filter coefficient for decreasing bins."""
         return self._down
     @down.setter
     def down(self, x): self.setDown(x)
 
     @property
     def damp(self):
-        """float or PyoObject. High frequencies damping factor.""" 
+        """float or PyoObject. High frequencies damping factor."""
         return self._damp
     @damp.setter
     def damp(self, x): self.setDamp(x)
-    
+
 class CvlVerb(PyoObject):
     """
     Convolution based reverb.
 
-    CvlVerb implements convolution based on a uniformly partitioned overlap-save 
-    algorithm. This object can be used to convolve an input signal with an 
+    CvlVerb implements convolution based on a uniformly partitioned overlap-save
+    algorithm. This object can be used to convolve an input signal with an
     impulse response soundfile to simulate real acoustic spaces.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         impulse : string, optional
-            Path to the impulse response soundfile. The file must have the same 
+            Path to the impulse response soundfile. The file must have the same
             sampling rate as the server to get the proper convolution. Available at
-            initialization time only. Defaults to 'IRMediumHallStereo.wav', located 
+            initialization time only. Defaults to 'IRMediumHallStereo.wav', located
             in pyolib SNDS_PATH folder.
         size : int {pow-of-two}, optional
             The size in samples of each partition of the impulse file. Small size means
@@ -1164,9 +1164,9 @@ class CvlVerb(PyoObject):
             This value must also be greater or equal than the server's buffer size.
             Available at initialization time only. Defaults to 1024.
         bal : float or PyoObject, optional
-            Balance between wet and dry signal, between 0 and 1. 0 means no 
+            Balance between wet and dry signal, between 0 and 1. 0 means no
             reverb. Defaults to 0.25.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> sf = SfPlayer(SNDS_PATH+"/transparent.aif", loop=True, mul=0.5)
@@ -1191,7 +1191,7 @@ class CvlVerb(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1224,14 +1224,14 @@ class CvlVerb(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def bal(self):
-        """float or PyoObject. Wet / dry balance.""" 
+        """float or PyoObject. Wet / dry balance."""
         return self._bal
     @bal.setter
-    def bal(self, x): self.setBal(x)
+    def bal(self, x): self.setBal(x)
\ No newline at end of file
diff --git a/pyolib/generators.py b/pyolib/generators.py
index 72fcfc5..bb15550 100644
--- a/pyolib/generators.py
+++ b/pyolib/generators.py
@@ -7,23 +7,23 @@ processing chain or as parameter's modifiers.
 """
 
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU Lesser General Public
+License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
 from _core import *
 from _maps import *
@@ -34,25 +34,25 @@ from _maps import *
 class Sine(PyoObject):
     """
     A simple sine wave oscillator.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         freq : float or PyoObject, optional
             Frequency in cycles per second. Defaults to 1000.
         phase : float or PyoObject, optional
             Phase of sampling, expressed as a fraction of a cycle (0 to 1).
             Defaults to 0.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`Osc`, :py:class:`Phasor`
 
     >>> s = Server().boot()
     >>> s.start()
     >>> sine = Sine(freq=[400,500], mul=.2).out()
-    
+
     """
     def __init__(self, freq=1000, phase=0, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -64,26 +64,26 @@ class Sine(PyoObject):
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `freq` attribute.
-        
+
         """
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
-        
+
     def setPhase(self, x):
         """
         Replace the `phase` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `phase` attribute.
-        
+
         """
         self._phase = x
         x, lmax = convertArgsToLists(x)
@@ -100,17 +100,17 @@ class Sine(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMapFreq(self._freq), SLMapPhase(self._phase), SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-        
+
     @property
     def freq(self):
-        """float or PyoObject. Frequency in cycles per second.""" 
+        """float or PyoObject. Frequency in cycles per second."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def phase(self):
-        """float or PyoObject. Phase of sampling.""" 
+        """float or PyoObject. Phase of sampling."""
         return self._phase
     @phase.setter
     def phase(self, x): self.setPhase(x)
@@ -118,7 +118,7 @@ class Sine(PyoObject):
 class SineLoop(PyoObject):
     """
     A simple sine wave oscillator with feedback.
-    
+
     The oscillator output, multiplied by `feedback`, is added to the position
     increment and can be used to control the brightness of the oscillator.
 
@@ -129,11 +129,11 @@ class SineLoop(PyoObject):
         freq : float or PyoObject, optional
             Frequency in cycles per second. Defaults to 1000.
         feedback : float or PyoObject, optional
-            Amount of the output signal added to position increment, between 0 and 1. 
+            Amount of the output signal added to position increment, between 0 and 1.
             Controls the brightness. Defaults to 0.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`Sine`, :py:class:`OscLoop`
 
     >>> s = Server().boot()
@@ -183,14 +183,14 @@ class SineLoop(PyoObject):
 
     @property
     def freq(self):
-        """float or PyoObject. Frequency in cycles per second.""" 
+        """float or PyoObject. Frequency in cycles per second."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def feedback(self):
-        """float or PyoObject. Brightness control.""" 
+        """float or PyoObject. Brightness control."""
         return self._feedback
     @feedback.setter
     def feedback(self, x): self.setFeedback(x)
@@ -198,28 +198,28 @@ class SineLoop(PyoObject):
 class Phasor(PyoObject):
     """
     A simple phase incrementor.
-    
+
     Output is a periodic ramp from 0 to 1.
- 
+
     :Parent: :py:class:`PyoObject`
-   
+
     :Args:
-    
+
         freq : float or PyoObject, optional
             Frequency in cycles per second. Defaults to 100.
         phase : float or PyoObject, optional
-            Phase of sampling, expressed as a fraction of a cycle (0 to 1). 
+            Phase of sampling, expressed as a fraction of a cycle (0 to 1).
             Defaults to 0.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`Osc`, :py:class:`Sine`
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> f = Phasor(freq=[1, 1.5], mul=1000, add=500)
     >>> sine = Sine(freq=f, mul=.2).out()
-    
+
     """
     def __init__(self, freq=100, phase=0, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -231,26 +231,26 @@ class Phasor(PyoObject):
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `freq` attribute.
-        
+
         """
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
-        
+
     def setPhase(self, x):
         """
         Replace the `phase` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `phase` attribute.
-        
+
         """
         self._phase = x
         x, lmax = convertArgsToLists(x)
@@ -267,17 +267,17 @@ class Phasor(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMapFreq(self._freq), SLMapPhase(self._phase), SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-        
+
     @property
     def freq(self):
-        """float or PyoObject. Frequency in cycles per second.""" 
+        """float or PyoObject. Frequency in cycles per second."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def phase(self):
-        """float or PyoObject. Phase of sampling.""" 
+        """float or PyoObject. Phase of sampling."""
         return self._phase
     @phase.setter
     def phase(self, x): self.setPhase(x)
@@ -289,19 +289,19 @@ class Input(PyoObject):
     :Parent: :py:class:`PyoObject`
 
     :Args:
-    
+
         chnl : int, optional
             Input channel to read from. Defaults to 0.
 
     .. note::
-    
-        Requires that the Server's duplex mode is set to 1. 
-    
+
+        Requires that the Server's duplex mode is set to 1.
+
     >>> s = Server(duplex=1).boot()
     >>> s.start()
     >>> a = Input(chnl=0, mul=.7)
     >>> b = Delay(a, delay=.25, feedback=.5, mul=.5).out()
-    
+
     """
     def __init__(self, chnl=0, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -316,13 +316,13 @@ class Input(PyoObject):
 class Noise(PyoObject):
     """
     A white noise generator.
-        
+
     :Parent: :py:class:`PyoObject`
 
     >>> s = Server().boot()
     >>> s.start()
     >>> a = Noise(.1).mix(2).out()
-        
+
     """
     def __init__(self, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -351,7 +351,7 @@ class Noise(PyoObject):
 
     @property
     def type(self):
-        """int {0, 1}. Sets the generation algorithm.""" 
+        """int {0, 1}. Sets the generation algorithm."""
         return self._type
     @type.setter
     def type(self, x): self.setType(x)
@@ -365,7 +365,7 @@ class PinkNoise(PyoObject):
     This is an approximation to a -10dB/decade filter using a weighted sum
     of first order filters. It is accurate to within +/-0.05dB above 9.2Hz
     (44100Hz sampling rate).
-    
+
     :Parent: :py:class:`PyoObject`
 
     >>> s = Server().boot()
@@ -386,9 +386,9 @@ class BrownNoise(PyoObject):
     """
     A brown noise generator.
 
-    The spectrum of a brown noise has a power density which decreases 6 dB 
+    The spectrum of a brown noise has a power density which decreases 6 dB
     per octave with increasing frequency (density proportional to 1/f^2).
-    
+
     :Parent: :py:class:`PyoObject`
 
     >>> s = Server().boot()
@@ -408,17 +408,17 @@ class BrownNoise(PyoObject):
 class FM(PyoObject):
     """
     A simple frequency modulation generator.
-    
+
     Implements frequency modulation synthesis based on Chowning's algorithm.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         carrier : float or PyoObject, optional
             Carrier frequency in cycles per second. Defaults to 100.
         ratio : float or PyoObject, optional
-            A factor that, when multiplied by the `carrier` parameter, 
+            A factor that, when multiplied by the `carrier` parameter,
             gives the modulator frequency. Defaults to 0.5.
         index : float or PyoObject, optional
             The modulation index. This value multiplied by the modulator
@@ -430,7 +430,7 @@ class FM(PyoObject):
     >>> m = Metro(4).play()
     >>> tr = TrigEnv(m, table=ind, dur=4)
     >>> f = FM(carrier=[251,250], ratio=[.2498,.2503], index=tr, mul=.2).out()
-    
+
     """
     def __init__(self, carrier=100, ratio=0.5, index=5, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -443,26 +443,26 @@ class FM(PyoObject):
     def setCarrier(self, x):
         """
         Replace the `carrier` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `carrier` attribute.
-        
+
         """
         self._carrier = x
         x, lmax = convertArgsToLists(x)
         [obj.setCarrier(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
-        
+
     def setRatio(self, x):
         """
         Replace the `ratio` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `ratio` attribute.
-        
+
         """
         self._ratio = x
         x, lmax = convertArgsToLists(x)
@@ -471,12 +471,12 @@ class FM(PyoObject):
     def setIndex(self, x):
         """
         Replace the `index` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `index` attribute.
-        
+
         """
         self._index = x
         x, lmax = convertArgsToLists(x)
@@ -488,24 +488,24 @@ class FM(PyoObject):
                           SLMap(0, 20, "lin", "index", self._index),
                           SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-        
+
     @property
     def carrier(self):
-        """float or PyoObject. Carrier frequency in cycles per second.""" 
+        """float or PyoObject. Carrier frequency in cycles per second."""
         return self._carrier
     @carrier.setter
     def carrier(self, x): self.setCarrier(x)
 
     @property
     def ratio(self):
-        """float or PyoObject. Modulator/Carrier ratio.""" 
+        """float or PyoObject. Modulator/Carrier ratio."""
         return self._ratio
     @ratio.setter
     def ratio(self, x): self.setRatio(x)
 
     @property
     def index(self):
-        """float or PyoObject. Modulation index.""" 
+        """float or PyoObject. Modulation index."""
         return self._index
     @index.setter
     def index(self, x): self.setIndex(x)
@@ -524,17 +524,17 @@ class CrossFM(PyoObject):
         carrier : float or PyoObject, optional
             Carrier frequency in cycles per second. Defaults to 100.
         ratio : float or PyoObject, optional
-            A factor that, when multiplied by the `carrier` parameter, 
+            A factor that, when multiplied by the `carrier` parameter,
             gives the modulator frequency. Defaults to 0.5.
         ind1 : float or PyoObject, optional
             The carrier index. This value multiplied by the carrier
             frequency gives the carrier amplitude for modulating the
-            modulation oscillator frequency. 
+            modulation oscillator frequency.
             Defaults to 2.
         ind1 : float or PyoObject, optional
             The modulation index. This value multiplied by the modulation
-            frequency gives the modulation amplitude for modulating the 
-            carrier oscillator frequency. 
+            frequency gives the modulation amplitude for modulating the
+            carrier oscillator frequency.
             Defaults to 2.
 
     >>> s = Server().boot()
@@ -620,28 +620,28 @@ class CrossFM(PyoObject):
 
     @property
     def carrier(self):
-        """float or PyoObject. Carrier frequency in cycles per second.""" 
+        """float or PyoObject. Carrier frequency in cycles per second."""
         return self._carrier
     @carrier.setter
     def carrier(self, x): self.setCarrier(x)
 
     @property
     def ratio(self):
-        """float or PyoObject. Modulator/Carrier ratio.""" 
+        """float or PyoObject. Modulator/Carrier ratio."""
         return self._ratio
     @ratio.setter
     def ratio(self, x): self.setRatio(x)
 
     @property
     def ind1(self):
-        """float or PyoObject. Carrier index.""" 
+        """float or PyoObject. Carrier index."""
         return self._ind1
     @ind1.setter
     def ind1(self, x): self.setInd1(x)
 
     @property
     def ind2(self):
-        """float or PyoObject. Modulation index.""" 
+        """float or PyoObject. Modulation index."""
         return self._ind2
     @ind2.setter
     def ind2(self, x): self.setInd2(x)
@@ -650,7 +650,7 @@ class Blit(PyoObject):
     """
     Band limited impulse train synthesis.
 
-    Impulse train generator with control over the number of harmonics 
+    Impulse train generator with control over the number of harmonics
     in the spectrum, which gives oscillators with very low aliasing.
 
     :Parent: :py:class:`PyoObject`
@@ -712,14 +712,14 @@ class Blit(PyoObject):
 
     @property
     def freq(self):
-        """float or PyoObject. Frequency in cycles per second.""" 
+        """float or PyoObject. Frequency in cycles per second."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def harms(self):
-        """float or PyoObject. Number of harmonics.""" 
+        """float or PyoObject. Number of harmonics."""
         return self._harms
     @harms.setter
     def harms(self, x): self.setHarms(x)
@@ -728,32 +728,32 @@ class Rossler(PyoObject):
     """
     Chaotic attractor for the Rossler system.
 
-    The Rossler attractor is a system of three non-linear ordinary differential 
-    equations. These differential equations define a continuous-time dynamical 
-    system that exhibits chaotic dynamics associated with the fractal properties 
+    The Rossler attractor is a system of three non-linear ordinary differential
+    equations. These differential equations define a continuous-time dynamical
+    system that exhibits chaotic dynamics associated with the fractal properties
     of the attractor.
-    
+
     :Parent: :py:class:`PyoObject`
 
     :Args:
 
         pitch : float or PyoObject, optional
-            Controls the speed, in the range 0 -> 1, of the variations. With values 
-            below 0.2, this object can be used as a low frequency oscillator (LFO) 
-            and above 0.2, it will generate a broad spectrum noise with harmonic peaks. 
+            Controls the speed, in the range 0 -> 1, of the variations. With values
+            below 0.2, this object can be used as a low frequency oscillator (LFO)
+            and above 0.2, it will generate a broad spectrum noise with harmonic peaks.
             Defaults to 0.25.
         chaos : float or PyoObject, optional
-            Controls the chaotic behavior, in the range 0 -> 1, of the oscillator. 
+            Controls the chaotic behavior, in the range 0 -> 1, of the oscillator.
             0 means nearly periodic while 1 is totally chaotic. Defaults to 0.5.
         stereo, boolean, optional
-            If True, 2 streams will be generated, one with the X variable signal of 
+            If True, 2 streams will be generated, one with the X variable signal of
             the algorithm and a second composed of the Y variable signal of the algorithm.
-            These two signal are strongly related in their frequency spectrum but 
+            These two signal are strongly related in their frequency spectrum but
             the Y signal is out-of-phase by approximatly 180 degrees. Useful to create
             alternating LFOs. Available at initialization only. Defaults to False.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`Lorenz`
 
     >>> s = Server().boot()
@@ -810,20 +810,20 @@ class Rossler(PyoObject):
             [obj.setChaos(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMap(0., 1., "lin", "pitch", self._pitch), 
+        self._map_list = [SLMap(0., 1., "lin", "pitch", self._pitch),
                           SLMap(0., 1., "lin", "chaos", self._chaos), SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
     def pitch(self):
-        """float or PyoObject. Speed of the variations.""" 
+        """float or PyoObject. Speed of the variations."""
         return self._pitch
     @pitch.setter
     def pitch(self, x): self.setPitch(x)
 
     @property
     def chaos(self):
-        """float or PyoObject. Chaotic behavior.""" 
+        """float or PyoObject. Chaotic behavior."""
         return self._chaos
     @chaos.setter
     def chaos(self, x): self.setChaos(x)
@@ -832,9 +832,9 @@ class Lorenz(PyoObject):
     """
     Chaotic attractor for the Lorenz system.
 
-    The Lorenz attractor is a system of three non-linear ordinary differential 
-    equations. These differential equations define a continuous-time dynamical 
-    system that exhibits chaotic dynamics associated with the fractal properties 
+    The Lorenz attractor is a system of three non-linear ordinary differential
+    equations. These differential equations define a continuous-time dynamical
+    system that exhibits chaotic dynamics associated with the fractal properties
     of the attractor.
 
     :Parent: :py:class:`PyoObject`
@@ -842,22 +842,22 @@ class Lorenz(PyoObject):
     :Args:
 
         pitch : float or PyoObject, optional
-            Controls the speed, in the range 0 -> 1, of the variations. With values 
-            below 0.2, this object can be used as a low frequency oscillator (LFO) 
-            and above 0.2, it will generate a broad spectrum noise with harmonic peaks. 
+            Controls the speed, in the range 0 -> 1, of the variations. With values
+            below 0.2, this object can be used as a low frequency oscillator (LFO)
+            and above 0.2, it will generate a broad spectrum noise with harmonic peaks.
             Defaults to 0.25.
         chaos : float or PyoObject, optional
-            Controls the chaotic behavior, in the range 0 -> 1, of the oscillator. 
+            Controls the chaotic behavior, in the range 0 -> 1, of the oscillator.
             0 means nearly periodic while 1 is totally chaotic. Defaults to 0.5
         stereo, boolean, optional
-            If True, 2 streams will be generated, one with the X variable signal of 
+            If True, 2 streams will be generated, one with the X variable signal of
             the algorithm and a second composed of the Y variable signal of the algorithm.
-            These two signal are strongly related in their frequency spectrum but 
+            These two signal are strongly related in their frequency spectrum but
             the Y signal is out-of-phase by approximatly 180 degrees. Useful to create
             alternating LFOs. Available at initialization only. Defaults to False.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`Rossler`
 
     >>> s = Server().boot()
@@ -914,20 +914,20 @@ class Lorenz(PyoObject):
             [obj.setChaos(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMap(0., 1., "lin", "pitch", self._pitch), 
+        self._map_list = [SLMap(0., 1., "lin", "pitch", self._pitch),
                           SLMap(0., 1., "lin", "chaos", self._chaos), SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
     def pitch(self):
-        """float or PyoObject. Speed of the variations.""" 
+        """float or PyoObject. Speed of the variations."""
         return self._pitch
     @pitch.setter
     def pitch(self, x): self.setPitch(x)
 
     @property
     def chaos(self):
-        """float or PyoObject. Chaotic behavior.""" 
+        """float or PyoObject. Chaotic behavior."""
         return self._chaos
     @chaos.setter
     def chaos(self, x): self.setChaos(x)
@@ -1016,7 +1016,7 @@ class LFO(PyoObject):
                     5. Bipolar pulse
                     6. Sample and hold
                     7. Modulated Sine
-            
+
 
         """
         self._type = x
@@ -1032,29 +1032,29 @@ class LFO(PyoObject):
 
 
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMapFreq(self._freq), 
-                          SLMap(0., 1., "lin", "sharp", self._sharp), 
-                          SLMap(0, 7, "lin", "type", self._type, "int", dataOnly=True), 
+        self._map_list = [SLMapFreq(self._freq),
+                          SLMap(0., 1., "lin", "sharp", self._sharp),
+                          SLMap(0, 7, "lin", "type", self._type, "int", dataOnly=True),
                           SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
     def freq(self):
-        """float or PyoObject. Oscillator frequency in cycles per second.""" 
+        """float or PyoObject. Oscillator frequency in cycles per second."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def sharp(self):
-        """float or PyoObject. Sharpness factor {0 -> 1}.""" 
+        """float or PyoObject. Sharpness factor {0 -> 1}."""
         return self._sharp
     @sharp.setter
     def sharp(self, x): self.setSharp(x)
 
     @property
     def type(self):
-        """int. Waveform type.""" 
+        """int. Waveform type."""
         return self._type
     @type.setter
     def type(self, x): self.setType(x)
@@ -1062,44 +1062,44 @@ class LFO(PyoObject):
 class SumOsc(PyoObject):
     """
     Discrete summation formulae to produce complex spectra.
-    
+
     This object implements a discrete summation formulae taken from
-    the paper 'The synthesis of complex audio spectra by means of 
+    the paper 'The synthesis of complex audio spectra by means of
     discrete summation formulae' by James A. Moorer. The formulae
     used is of this form:
-        
+
     (sin(theta) - a * sin(theta - beta)) / (1 + a**2 - 2 * a * cos(beta))
-       
-    where 'theta' and 'beta' are periodic functions and 'a' is 
-    the modulation index, providing control over the damping of 
+
+    where 'theta' and 'beta' are periodic functions and 'a' is
+    the modulation index, providing control over the damping of
     the partials.
-    
+
     The resulting sound is related to the family of modulation
     techniques but this formulae express 'one-sided' spectra,
     useful to avoid aliasing from the negative frequencies.
 
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         freq : float or PyoObject, optional
             Base frequency in cycles per second. Defaults to 100.
         ratio : float or PyoObject, optional
-            A factor used to stretch or compress the partial serie by 
-            manipulating the frequency of the modulation oscillator. 
+            A factor used to stretch or compress the partial serie by
+            manipulating the frequency of the modulation oscillator.
             Integer ratios give harmonic spectra. Defaults to 0.5.
         index : float or PyoObject, optional
-            Damping of successive partials, between 0 and 1. With a 
+            Damping of successive partials, between 0 and 1. With a
             value of 0.5, each partial is 6dB lower than the previous
             partial. Defaults to 5.
-        
+
     >>> s = Server().boot()
     >>> s.start()
     >>> ind = LinTable([(0,.3), (20,.85), (300,.7), (1000,.5), (8191,.3)])
     >>> m = Metro(4).play()
     >>> tr = TrigEnv(m, table=ind, dur=4)
     >>> f = SumOsc(freq=[301,300], ratio=[.2498,.2503], index=tr, mul=.2).out()
-    
+
     """
     def __init__(self, freq=100, ratio=0.5, index=0.5, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -1112,26 +1112,26 @@ class SumOsc(PyoObject):
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `freq` attribute.
-        
+
         """
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
-        
+
     def setRatio(self, x):
         """
         Replace the `ratio` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `ratio` attribute.
-        
+
         """
         self._ratio = x
         x, lmax = convertArgsToLists(x)
@@ -1140,12 +1140,12 @@ class SumOsc(PyoObject):
     def setIndex(self, x):
         """
         Replace the `index` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `index` attribute.
-        
+
         """
         self._index = x
         x, lmax = convertArgsToLists(x)
@@ -1157,24 +1157,24 @@ class SumOsc(PyoObject):
                           SLMap(0, 1, "lin", "index", self._index),
                           SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-        
+
     @property
     def freq(self):
-        """float or PyoObject. Base frequency in cycles per second.""" 
+        """float or PyoObject. Base frequency in cycles per second."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def ratio(self):
-        """float or PyoObject. Base/modulator frequency ratio.""" 
+        """float or PyoObject. Base/modulator frequency ratio."""
         return self._ratio
     @ratio.setter
     def ratio(self, x): self.setRatio(x)
 
     @property
     def index(self):
-        """float or PyoObject. Index, high frequency damping.""" 
+        """float or PyoObject. Index, high frequency damping."""
         return self._index
     @index.setter
     def index(self, x): self.setIndex(x)
@@ -1182,37 +1182,37 @@ class SumOsc(PyoObject):
 class SuperSaw(PyoObject):
     """
     Roland JP-8000 Supersaw emulator.
-    
+
     This object implements an emulation of the Roland JP-8000 Supersaw algorithm.
-    The shape of the waveform is produced from 7 sawtooth oscillators detuned 
+    The shape of the waveform is produced from 7 sawtooth oscillators detuned
     against each other over a period of time. It allows control over the depth
     of the detuning and the balance between central and sideband oscillators.
- 
+
     :Parent: :py:class:`PyoObject`
-   
+
     :Args:
-    
+
         freq : float or PyoObject, optional
             Frequency in cycles per second. Defaults to 100.
         detune : float or PyoObject, optional
             Depth of the detuning, between 0 and 1. 0 means all oscillators are
             tuned to the same frequency and 1 means sideband oscillators are at
-            maximum detuning regarding the central frequency. Defaults to 0.5. 
+            maximum detuning regarding the central frequency. Defaults to 0.5.
         bal : float or PyoObject, optional
-            Balance between central oscillator and sideband oscillators. A value 
+            Balance between central oscillator and sideband oscillators. A value
             of 0 outputs only the central oscillator while a value of 1 gives a
             mix of all oscillators with the central one lower than the sidebands.
             Defaults to 0.7.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`Phasor`, :py:class:`SineLoop`
 
     >>> s = Server().boot()
     >>> s.start()
     >>> lfd = Sine([.4,.3], mul=.2, add=.5)
     >>> a = SuperSaw(freq=[49,50], detune=lfd, bal=0.7, mul=0.2).out()
-    
+
     """
     def __init__(self, freq=100, detune=0.5, bal=0.7, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -1225,26 +1225,26 @@ class SuperSaw(PyoObject):
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `freq` attribute.
-        
+
         """
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
-        
+
     def setDetune(self, x):
         """
         Replace the `detune` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `detune` attribute.
-        
+
         """
         self._detune = x
         x, lmax = convertArgsToLists(x)
@@ -1253,40 +1253,40 @@ class SuperSaw(PyoObject):
     def setBal(self, x):
         """
         Replace the `bal` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `bal` attribute.
-        
+
         """
         self._bal = x
         x, lmax = convertArgsToLists(x)
         [obj.setBal(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMapFreq(self._freq), 
-                          SLMap(0, 1, "lin", "detune", self._detune), 
+        self._map_list = [SLMapFreq(self._freq),
+                          SLMap(0, 1, "lin", "detune", self._detune),
                           SLMap(0, 1, "lin", "bal", self._bal), SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-        
+
     @property
     def freq(self):
-        """float or PyoObject. Frequency in cycles per second.""" 
+        """float or PyoObject. Frequency in cycles per second."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def detune(self):
-        """float or PyoObject. Depth of the detuning.""" 
+        """float or PyoObject. Depth of the detuning."""
         return self._detune
     @detune.setter
     def detune(self, x): self.setDetune(x)
 
     @property
     def bal(self):
-        """float or PyoObject. Balance between central and sideband oscillators.""" 
+        """float or PyoObject. Balance between central and sideband oscillators."""
         return self._bal
     @bal.setter
     def bal(self, x): self.setBal(x)
@@ -1294,14 +1294,14 @@ class SuperSaw(PyoObject):
 class RCOsc(PyoObject):
     """
     Waveform aproximation of a RC circuit.
-    
+
     A RC circuit is a capacitor and a resistor in series, giving a logarithmic
     growth followed by an exponential decay.
- 
+
     :Parent: :py:class:`PyoObject`
-   
+
     :Args:
-    
+
         freq : float or PyoObject, optional
             Frequency in cycles per second. Defaults to 100.
         sharp : float or PyoObject, optional
@@ -1309,15 +1309,15 @@ class RCOsc(PyoObject):
             A value of 0 gives a triangular waveform and 1 gives almost a
             square wave. Defaults to 0.25.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`Osc`, :py:class:`LFO`, :py:class:`SineLoop`, :py:class:`SumOsc`
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> fr = RCOsc(freq=[.48,.5], sharp=.2, mul=300, add=600)
     >>> a = RCOsc(freq=fr, sharp=.1, mul=.2).out()
-    
+
     """
     def __init__(self, freq=100, sharp=0.25, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -1329,26 +1329,26 @@ class RCOsc(PyoObject):
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `freq` attribute.
-        
+
         """
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
-        
+
     def setSharp(self, x):
         """
         Replace the `sharp` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `sharp` attribute.
-        
+
         """
         self._sharp = x
         x, lmax = convertArgsToLists(x)
@@ -1364,17 +1364,17 @@ class RCOsc(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMapFreq(self._freq), SLMap(0,1,"lin","sharp",self._sharp), SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-        
+
     @property
     def freq(self):
-        """float or PyoObject. Frequency in cycles per second.""" 
+        """float or PyoObject. Frequency in cycles per second."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def sharp(self):
-        """float or PyoObject. Sharpness of the waveform.""" 
+        """float or PyoObject. Sharpness of the waveform."""
         return self._sharp
     @sharp.setter
-    def sharp(self, x): self.setSharp(x)
+    def sharp(self, x): self.setSharp(x)
\ No newline at end of file
diff --git a/pyolib/matrix.py b/pyolib/matrix.py
index 1fea8c5..0605dbd 100644
--- a/pyolib/matrix.py
+++ b/pyolib/matrix.py
@@ -1,22 +1,21 @@
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+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/>.
 """
 from _core import *
 from _maps import *
@@ -28,7 +27,7 @@ class NewMatrix(PyoMatrixObject):
     """
     Create a new matrix ready for recording.
 
-    Optionally, the matrix can be filled with the contents of the 
+    Optionally, the matrix can be filled with the contents of the
     `init` parameter.
 
     See :py:class:`MatrixRec` to write samples in the matrix.
@@ -44,8 +43,8 @@ class NewMatrix(PyoMatrixObject):
         init : list of list of floats, optional
             Initial matrix. Defaults to None.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`MatrixRec`
 
     >>> s = Server().boot()
@@ -67,13 +66,13 @@ class NewMatrix(PyoMatrixObject):
             self._base_objs = [NewMatrix_base(width, height)]
         else:
             self._base_objs = [NewMatrix_base(width, height, init)]
-            
+
     def replace(self, x):
         """
         Replaces the actual matrix.
-        
+
         :Args:
-        
+
             x : list of list of floats
                 New matrix. Must be of the same size as the actual matrix.
 
@@ -83,9 +82,9 @@ class NewMatrix(PyoMatrixObject):
 
     def getRate(self):
         """
-        Returns the frequency (cycle per second) to give to an 
+        Returns the frequency (cycle per second) to give to an
         oscillator to read the sound at its original pitch.
-        
+
         """
         return self._base_objs[0].getRate()
 
@@ -104,4 +103,4 @@ class NewMatrix(PyoMatrixObject):
 
         """
         [obj.genSineTerrain(freq, phase) for obj in self._base_objs]
-        self.refreshView()
+        self.refreshView()
\ No newline at end of file
diff --git a/pyolib/matrixprocess.py b/pyolib/matrixprocess.py
index 3fa4037..9f7ded9 100644
--- a/pyolib/matrixprocess.py
+++ b/pyolib/matrixprocess.py
@@ -8,23 +8,23 @@ are done by giving row and column positions.
 """
 
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU Lesser General Public
+License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
 from _core import *
 from _maps import *
@@ -37,9 +37,9 @@ class MatrixRec(PyoObject):
     See :py:class:`NewMatrix` to create an empty matrix.
 
     The play method is not called at the object creation time. It starts
-    the recording into the matrix, row after row, until the matrix is full. 
-    Calling the play method again restarts the recording and overwrites 
-    previously recorded samples. The stop method stops the recording. 
+    the recording into the matrix, row after row, until the matrix is full.
+    Calling the play method again restarts the recording and overwrites
+    previously recorded samples. The stop method stops the recording.
     Otherwise, the default behaviour is to record through the end of the matrix.
 
     :Parent: :py:class:`PyoObject`
@@ -51,10 +51,10 @@ class MatrixRec(PyoObject):
         matrix : PyoMatrixObject
             The matrix where to write samples.
         fadetime : float, optional
-            Fade time at the beginning and the end of the recording 
+            Fade time at the beginning and the end of the recording
             in seconds. Defaults to 0.
         delay : int, optional
-            Delay time, in samples, before the recording begins. 
+            Delay time, in samples, before the recording begins.
             Available at initialization time only. Defaults to 0.
 
     .. note::
@@ -63,12 +63,12 @@ class MatrixRec(PyoObject):
 
         MatrixRec has no `mul` and `add` attributes.
 
-        MatrixRec will sends a trigger signal at the end of the recording. 
+        MatrixRec will sends a trigger signal at the end of the recording.
         User can retreive the trigger streams by calling obj['trig']. See
         `TableRec` documentation for an example.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`NewMatrix`
 
     >>> s = Server().boot()
@@ -100,14 +100,14 @@ class MatrixRec(PyoObject):
 
     def setMul(self, x):
         pass
-        
+
     def setAdd(self, x):
-        pass    
+        pass
 
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -122,12 +122,12 @@ class MatrixRec(PyoObject):
     def setMatrix(self, x):
         """
         Replace the `matrix` attribute.
-        
+
         :Args:
 
             x : NewMatrix
                 new `matrix` attribute.
-        
+
         """
         self._matrix = x
         x, lmax = convertArgsToLists(x)
@@ -135,7 +135,7 @@ class MatrixRec(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Audio signal to record in the matrix.""" 
+        """PyoObject. Audio signal to record in the matrix."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -153,8 +153,8 @@ class MatrixRecLoop(PyoObject):
 
     See :py:class:`NewMatrix` to create an empty matrix.
 
-    MatrixRecLoop records samples into the matrix, row after row, until 
-    the matrix is full and then loop back to the beginning. 
+    MatrixRecLoop records samples into the matrix, row after row, until
+    the matrix is full and then loop back to the beginning.
 
     :Parent: :py:class:`PyoObject`
 
@@ -171,12 +171,12 @@ class MatrixRecLoop(PyoObject):
 
         MatrixRecLoop has no `mul` and `add` attributes.
 
-        MatrixRecLoop will sends a trigger signal when reaching the end 
-        of the matrix. User can retreive the trigger streams by calling 
+        MatrixRecLoop will sends a trigger signal when reaching the end
+        of the matrix. User can retreive the trigger streams by calling
         obj['trig']. See `TableRec` documentation for an example.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`NewMatrix`
 
     >>> s = Server().boot()
@@ -209,7 +209,7 @@ class MatrixRecLoop(PyoObject):
         pass
 
     def setAdd(self, x):
-        pass    
+        pass
 
     def setInput(self, x, fadetime=0.05):
         """
@@ -242,7 +242,7 @@ class MatrixRecLoop(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Audio signal to record in the matrix.""" 
+        """PyoObject. Audio signal to record in the matrix."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -295,12 +295,12 @@ class MatrixPointer(PyoObject):
     def setMatrix(self, x):
         """
         Replace the `matrix` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `matrix` attribute.
-        
+
         """
         self._matrix = x
         x, lmax = convertArgsToLists(x)
@@ -309,12 +309,12 @@ class MatrixPointer(PyoObject):
     def setX(self, x):
         """
         Replace the `x` attribute.
-        
+
         :Args:
 
             x : PyoObject
                 new `x` attribute.
-        
+
         """
         self._x = x
         x, lmax = convertArgsToLists(x)
@@ -323,12 +323,12 @@ class MatrixPointer(PyoObject):
     def setY(self, x):
         """
         Replace the `y` attribute.
-        
+
         :Args:
 
             y : PyoObject
                 new `y` attribute.
-        
+
         """
         self._y = x
         x, lmax = convertArgsToLists(x)
@@ -340,21 +340,21 @@ class MatrixPointer(PyoObject):
 
     @property
     def matrix(self):
-        """PyoMatrixObject. Matrix containing the samples.""" 
+        """PyoMatrixObject. Matrix containing the samples."""
         return self._matrix
     @matrix.setter
     def matrix(self, x): self.setMatrix(x)
 
     @property
     def x(self):
-        """PyoObject. Normalized X position in the matrix.""" 
+        """PyoObject. Normalized X position in the matrix."""
         return self._x
     @x.setter
     def x(self, x): self.setX(x)
 
     @property
     def y(self):
-        """PyoObject. Normalized Y position in the matrix.""" 
+        """PyoObject. Normalized Y position in the matrix."""
         return self._y
     @y.setter
     def y(self, x): self.setY(x)
@@ -363,9 +363,9 @@ class MatrixMorph(PyoObject):
     """
     Morphs between multiple PyoMatrixObjects.
 
-    Uses an index into a list of PyoMatrixObjects to morph between adjacent 
-    matrices in the list. The resulting morphed function is written into the 
-    `matrix` object at the beginning of each buffer size. The matrices in the 
+    Uses an index into a list of PyoMatrixObjects to morph between adjacent
+    matrices in the list. The resulting morphed function is written into the
+    `matrix` object at the beginning of each buffer size. The matrices in the
     list and the resulting matrix must be equal in size.
 
     :Parent: :py:class:`PyoObject`
@@ -373,7 +373,7 @@ class MatrixMorph(PyoObject):
     :Args:
 
         input : PyoObject
-            Morphing index between 0 and 1. 0 is the first matrix in the list 
+            Morphing index between 0 and 1. 0 is the first matrix in the list
             and 1 is the last.
         matrix : NewMatrix
             The matrix where to write morphed function.
@@ -417,7 +417,7 @@ class MatrixMorph(PyoObject):
         pass
 
     def setAdd(self, x):
-        pass    
+        pass
 
     def setInput(self, x, fadetime=0.05):
         """
@@ -464,7 +464,7 @@ class MatrixMorph(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Morphing index between 0 and 1.""" 
+        """PyoObject. Morphing index between 0 and 1."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -481,4 +481,4 @@ class MatrixMorph(PyoObject):
         """list of PyoMatrixObject. List of matrices to interpolate from."""
         return self._sources
     @sources.setter
-    def sources(self, x): self.setSources(x)
+    def sources(self, x): self.setSources(x)
\ No newline at end of file
diff --git a/pyolib/midi.py b/pyolib/midi.py
index 5936021..dbed36d 100644
--- a/pyolib/midi.py
+++ b/pyolib/midi.py
@@ -9,23 +9,23 @@ used as controls and can't be sent to the output soundcard.
 """
 
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+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 sys
 from _core import *
@@ -33,18 +33,18 @@ from _maps import *
 
 ######################################################################
 ### MIDI
-######################################################################                                       
+######################################################################
 class Midictl(PyoObject):
     """
     Get the current value of a Midi controller.
-    
-    Get the current value of a controller and optionally map it 
+
+    Get the current value of a controller and optionally map it
     inside a specified range.
 
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         ctlnumber : int
             Controller number.
         minscale : float, optional
@@ -58,9 +58,9 @@ class Midictl(PyoObject):
 
     .. note::
 
-        The out() method is bypassed. Midictl's signal can not be sent 
+        The out() method is bypassed. Midictl's signal can not be sent
         to audio outs.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> m = Midictl(ctlnumber=[107,102], minscale=250, maxscale=1000)
@@ -68,7 +68,7 @@ class Midictl(PyoObject):
     >>> a = Sine(freq=p, mul=.3).out()
     >>> a1 = Sine(freq=p*1.25, mul=.3).out()
     >>> a2 = Sine(freq=p*1.5, mul=.3).out()
-        
+
     """
     def __init__(self, ctlnumber, minscale=0, maxscale=1, init=0, channel=0, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -165,63 +165,63 @@ class Midictl(PyoObject):
         [obj.setInterpolation(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     @property
-    def ctlnumber(self): 
+    def ctlnumber(self):
         """int. Controller number."""
         return self._ctlnumber
     @ctlnumber.setter
-    def ctlnumber(self, x): 
-        self.setCtlNumber(x)   
+    def ctlnumber(self, x):
+        self.setCtlNumber(x)
 
     @property
-    def minscale(self): 
+    def minscale(self):
         """float. Minimum value for scaling."""
         return self._minscale
     @minscale.setter
-    def minscale(self, x): 
-        self.setMinScale(x)   
+    def minscale(self, x):
+        self.setMinScale(x)
 
     @property
-    def maxscale(self): 
+    def maxscale(self):
         """float. Maximum value for scaling."""
         return self._maxscale
     @maxscale.setter
-    def maxscale(self, x): 
-        self.setMaxScale(x)   
+    def maxscale(self, x):
+        self.setMaxScale(x)
 
     @property
-    def channel(self): 
+    def channel(self):
         """int. Midi channel. 0 means all channels."""
         return self._channel
     @channel.setter
-    def channel(self, x): 
-        self.setChannel(x)   
+    def channel(self, x):
+        self.setChannel(x)
 
 class CtlScan(PyoObject):
     """
     Scan the Midi controller's number in input.
-    
+
     Scan the Midi controller's number in input and send it to
     a standard python `function`. Useful to implement a MidiLearn
     algorithm.
 
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
-        function : Python function
+
+        function : Python function (can't be a list)
             Function to be called. The function must be declared
-            with an argument for the controller number in input. Ex.: 
-                
+            with an argument for the controller number in input. Ex.:
+
             def ctl_scan(ctlnum):
                 print ctlnum
-                    
+
         toprint : boolean, optional
-            If True, controller number and value will be print to 
+            If True, controller number and value will be print to
             the console.
 
     .. note::
 
-        The out() method is bypassed. CtlScan's signal can not be sent 
+        The out() method is bypassed. CtlScan's signal can not be sent
         to audio outs.
 
     >>> s = Server()
@@ -231,14 +231,14 @@ class CtlScan(PyoObject):
     >>> def ctl_scan(ctlnum):
     ...     print ctlnum
     >>> a = CtlScan(ctl_scan)
-        
+
     """
     def __init__(self, function, toprint=True):
         PyoObject.__init__(self)
         if not callable(function):
             print >> sys.stderr, 'TypeError: "function" argument of %s must be callable.\n' % self.__class__.__name__
             exit()
-        self._function = function
+        self._function = WeakMethod(function)
         self._toprint = toprint
         self._base_objs = [CtlScan_base(self._function, self._toprint)]
 
@@ -274,9 +274,8 @@ class CtlScan(PyoObject):
                 new `function` attribute.
 
         """
-        self._function = x
-        x, lmax = convertArgsToLists(x)
-        [obj.setFunction(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
+        self._function = WeakMethod(x)
+        [obj.setFunction(self._function) for i, obj in enumerate(self._base_objs)]
 
     def setToprint(self, x):
         """
@@ -293,47 +292,47 @@ class CtlScan(PyoObject):
         [obj.setToprint(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     @property
-    def function(self): 
+    def function(self):
         """Python function. Function to be called."""
         return self._function
     @function.setter
-    def function(self, x): 
-        self.setFunction(x)   
+    def function(self, x):
+        self.setFunction(x)
     @property
-    def toprint(self): 
+    def toprint(self):
         """boolean. If True, print values to the console."""
         return self._toprint
     @toprint.setter
-    def toprint(self, x): 
-        self.setToprint(x)   
+    def toprint(self, x):
+        self.setToprint(x)
 
 class CtlScan2(PyoObject):
     """
     Scan the Midi channel and controller number in input.
 
-    Scan the Midi channel and controller number in input and send them 
-    to a standard python `function`. Useful to implement a MidiLearn 
+    Scan the Midi channel and controller number in input and send them
+    to a standard python `function`. Useful to implement a MidiLearn
     algorithm.
 
     :Parent: :py:class:`PyoObject`
 
     :Args:
 
-        function : Python function
+        function : Python function (can't be a list)
             Function to be called. The function must be declared
-            with two arguments, one for the controller number and 
-            one for the midi channel. Ex.: 
+            with two arguments, one for the controller number and
+            one for the midi channel. Ex.:
 
             def ctl_scan(ctlnum, midichnl):
                 print ctlnum, midichnl
 
         toprint : boolean, optional
-            If True, controller number and value will be print to 
+            If True, controller number and value will be print to
             the console.
 
     .. note::
 
-        The out() method is bypassed. CtlScan2's signal can not be sent 
+        The out() method is bypassed. CtlScan2's signal can not be sent
         to audio outs.
 
     >>> s = Server()
@@ -350,7 +349,7 @@ class CtlScan2(PyoObject):
         if not callable(function):
             print >> sys.stderr, 'TypeError: "function" argument of %s must be callable.\n' % self.__class__.__name__
             exit()
-        self._function = function
+        self._function = WeakMethod(function)
         self._toprint = toprint
         self._base_objs = [CtlScan2_base(self._function, self._toprint)]
 
@@ -375,7 +374,7 @@ class CtlScan2(PyoObject):
 
         """
         [obj.reset() for obj in self._base_objs]
-        
+
     def setFunction(self, x):
         """
         Replace the `function` attribute.
@@ -386,9 +385,8 @@ class CtlScan2(PyoObject):
                 new `function` attribute.
 
         """
-        self._function = x
-        x, lmax = convertArgsToLists(x)
-        [obj.setFunction(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
+        self._function = WeakMethod(x)
+        [obj.setFunction(self._function) for i, obj in enumerate(self._base_objs)]
 
     def setToprint(self, x):
         """
@@ -405,44 +403,44 @@ class CtlScan2(PyoObject):
         [obj.setToprint(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     @property
-    def function(self): 
+    def function(self):
         """Python function. Function to be called."""
         return self._function
     @function.setter
-    def function(self, x): 
-        self.setFunction(x)   
+    def function(self, x):
+        self.setFunction(x)
     @property
-    def toprint(self): 
+    def toprint(self):
         """boolean. If True, print values to the console."""
         return self._toprint
     @toprint.setter
-    def toprint(self, x): 
-        self.setToprint(x)   
+    def toprint(self, x):
+        self.setToprint(x)
 
 class Notein(PyoObject):
     """
     Generates Midi note messages.
-    
-    From a Midi device, takes the notes in the range defined with 
-    `first` and `last` parameters, and outputs up to `poly` 
-    noteon - noteoff streams in the `scale` format (Midi, hertz 
+
+    From a Midi device, takes the notes in the range defined with
+    `first` and `last` parameters, and outputs up to `poly`
+    noteon - noteoff streams in the `scale` format (Midi, hertz
     or transpo).
-    
+
     :Parent: :py:class:`PyoObject`
 
     :Args:
-    
+
         poly : int, optional
             Number of streams of polyphony generated. Defaults to 10.
         scale : int, optional
-            Pitch output format. 
+            Pitch output format.
                 0. Midi
                 1. Hertz
-                2. transpo 
+                2. transpo
+
+            In the transpo mode, the default central key (the key where
+            there is no transposition) is (`first` + `last`) / 2.
 
-            In the transpo mode, the default central key (the key where 
-            there is no transposition) is (`first` + `last`) / 2. 
-            
             The central key can be changed with the setCentralKey method.
         first : int, optional
             Lowest Midi value. Defaults to 0.
@@ -452,24 +450,24 @@ class Notein(PyoObject):
             Midi channel. 0 means all channels. Defaults to 0.
 
     .. note::
-    
-        Pitch and velocity are two separated set of streams. 
+
+        Pitch and velocity are two separated set of streams.
         The user should call :
-        
+
         |  Notein['pitch'] to retrieve pitch streams.
-        |  Notein['velocity'] to retrieve velocity streams.    
+        |  Notein['velocity'] to retrieve velocity streams.
 
         Velocity is automatically scaled between 0 and 1.
 
-        Notein also outputs trigger streams on noteon and noteoff. 
+        Notein also outputs trigger streams on noteon and noteoff.
         These streams can be retrieved with :
-        
+
         |  Notein['trigon'] to retrieve noteon trigger streams.
-        |  Notein['trigoff'] to retrieve noteoff trigger streams.    
-        
-        The out() method is bypassed. Notein's signal can not be sent 
+        |  Notein['trigoff'] to retrieve noteoff trigger streams.
+
+        The out() method is bypassed. Notein's signal can not be sent
         to audio outs.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> notes = Notein(poly=10, scale=1, mul=.5)
@@ -477,7 +475,7 @@ class Notein(PyoObject):
     >>> b = Sine(freq=notes['pitch'], mul=p).out()
     >>> c = Sine(freq=notes['pitch'] * 0.997, mul=p).out()
     >>> d = Sine(freq=notes['pitch'] * 1.005, mul=p).out()
-    
+
     """
     def __init__(self, poly=10, scale=0, first=0, last=127, channel=0, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -499,7 +497,7 @@ class Notein(PyoObject):
             self._base_objs.append(Notein_base(self._base_handler, i, 1, wrap(mul,i), wrap(add,i)))
             self._trig_objs.append(NoteinTrig_base(self._base_handler, i, 0, 1, 0))
             self._trig_objs.append(NoteinTrig_base(self._base_handler, i, 1, 1, 0))
-            
+
     def __getitem__(self, str):
         if str == 'pitch':
             self._pitch_dummy.append(Dummy([self._base_objs[i*2] for i in range(self._poly)]))
@@ -530,7 +528,7 @@ class Notein(PyoObject):
     def setCentralKey(self, x):
         """
         Set the midi key where there is no transposition.
-        
+
         Used for transpo conversion. This value must be greater than or
         equal to `first` and lower than or equal to `last`.
 
@@ -545,7 +543,7 @@ class Notein(PyoObject):
     def setStealing(self, x):
         """
         Activates the stealing mode if True. Defaults to False.
-        
+
         In stealing mode, a new note will overwrite the oldest one
         according to the polyphony. In non-stealing mode, if the
         polyphony is already full, the new notes will be ignored.
@@ -561,12 +559,12 @@ class Notein(PyoObject):
     def get(self, identifier="pitch", all=False):
         """
         Return the first sample of the current buffer as a float.
-        
+
         Can be used to convert audio stream to usable Python data.
-        
+
         "pitch" or "velocity" must be given to `identifier` to specify
         which stream to get value from.
-        
+
         :Args:
 
             identifier : string {"pitch", "velocity"}
@@ -574,17 +572,17 @@ class Notein(PyoObject):
                 Defaults to "pitch".
             all : boolean, optional
                 If True, the first value of each object's stream
-                will be returned as a list. 
-                
-                Otherwise, only the value of the first object's 
+                will be returned as a list.
+
+                Otherwise, only the value of the first object's
                 stream will be returned as a float.
-                 
+
         """
         if not all:
             return self.__getitem__(identifier)[0]._getStream().getValue()
         else:
             return [obj._getStream().getValue() for obj in self.__getitem__(identifier).getBaseObjects()]
-                        
+
     def play(self, dur=0, delay=0):
         self._base_handler.play()
         return PyoObject.play(self, dur, delay)
@@ -597,18 +595,18 @@ class Notein(PyoObject):
         return PyoObject.stop(self)
 
     @property
-    def channel(self): 
+    def channel(self):
         """int. Midi channel. 0 means all channels."""
         return self._channel
     @channel.setter
-    def channel(self, x): 
-        self.setChannel(x)   
+    def channel(self, x):
+        self.setChannel(x)
 
 class Bendin(PyoObject):
     """
     Get the current value of the pitch bend controller.
 
-    Get the current value of the pitch bend controller and optionally 
+    Get the current value of the pitch bend controller and optionally
     maps it inside a specified range.
 
     :Parent: :py:class:`PyoObject`
@@ -622,15 +620,15 @@ class Bendin(PyoObject):
             Output format. Defaults to 0.
                 0. Midi
                 1. transpo.
-                
-            The transpo mode is useful if you want to transpose values that 
+
+            The transpo mode is useful if you want to transpose values that
             are in a frequency (Hz) format.
         channel : int, optional
             Midi channel. 0 means all channels. Defaults to 0.
 
     .. note::
 
-        The out() method is bypassed. Bendin's signal can not be sent 
+        The out() method is bypassed. Bendin's signal can not be sent
         to audio outs.
 
     >>> s = Server().boot()
@@ -697,31 +695,31 @@ class Bendin(PyoObject):
         [obj.setChannel(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     @property
-    def brange(self): 
+    def brange(self):
         """float. Bipolar range of the pitch bend in semitones."""
         return self._brange
     @brange.setter
-    def brange(self, x): self.setBrange(x)   
+    def brange(self, x): self.setBrange(x)
 
     @property
-    def scale(self): 
+    def scale(self):
         """int. Output format. 0 = Midi, 1 = transpo."""
         return self._scale
     @scale.setter
-    def scale(self, x): self.setScale(x)   
+    def scale(self, x): self.setScale(x)
 
     @property
-    def channel(self): 
+    def channel(self):
         """int. Midi channel. 0 means all channels."""
         return self._channel
     @channel.setter
-    def channel(self, x): self.setChannel(x)   
+    def channel(self, x): self.setChannel(x)
 
 class Touchin(PyoObject):
     """
     Get the current value of an after-touch Midi controller.
 
-    Get the current value of an after-touch Midi controller and optionally 
+    Get the current value of an after-touch Midi controller and optionally
     maps it inside a specified range.
 
     :Parent: :py:class:`PyoObject`
@@ -739,7 +737,7 @@ class Touchin(PyoObject):
 
     .. note::
 
-        The out() method is bypassed. Touchin's signal can not be sent 
+        The out() method is bypassed. Touchin's signal can not be sent
         to audio outs.
 
     >>> s = Server().boot()
@@ -806,28 +804,28 @@ class Touchin(PyoObject):
         [obj.setChannel(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     @property
-    def minscale(self): 
+    def minscale(self):
         """float. Minimum value for scaling."""
         return self._minscale
     @minscale.setter
-    def minscale(self, x): 
-        self.setMinScale(x)   
+    def minscale(self, x):
+        self.setMinScale(x)
 
     @property
-    def maxscale(self): 
+    def maxscale(self):
         """float. Maximum value for scaling."""
         return self._maxscale
     @maxscale.setter
     def maxscale(self, x):
-        self.setMaxScale(x)   
+        self.setMaxScale(x)
 
     @property
-    def channel(self): 
+    def channel(self):
         """int. Midi channel. 0 means all channels."""
         return self._channel
     @channel.setter
-    def channel(self, x): 
-        self.setChannel(x)   
+    def channel(self, x):
+        self.setChannel(x)
 
 class Programin(PyoObject):
     """
@@ -844,7 +842,7 @@ class Programin(PyoObject):
 
     .. note::
 
-        The out() method is bypassed. Programin's signal can not be sent 
+        The out() method is bypassed. Programin's signal can not be sent
         to audio outs.
 
     >>> s = Server().boot()
@@ -881,18 +879,18 @@ class Programin(PyoObject):
         [obj.setChannel(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     @property
-    def channel(self): 
+    def channel(self):
         """int. Midi channel. 0 means all channels."""
         return self._channel
     @channel.setter
-    def channel(self, x): 
-        self.setChannel(x)   
+    def channel(self, x):
+        self.setChannel(x)
 
 class MidiAdsr(PyoObject):
     """
     Midi triggered ADSR envelope generator.
 
-    Calculates the classical ADSR envelope using linear segments. 
+    Calculates the classical ADSR envelope using linear segments.
     The envelope starts when it receives a positive value in input,
     this value is used as the peak amplitude of the envelope. The
     `sustain` parameter is a fraction of the peak value and sets
@@ -1016,28 +1014,28 @@ class MidiAdsr(PyoObject):
 
     @property
     def attack(self):
-        """float. Duration of the attack phase in seconds.""" 
+        """float. Duration of the attack phase in seconds."""
         return self._attack
     @attack.setter
     def attack(self, x): self.setAttack(x)
 
     @property
     def decay(self):
-        """float. Duration of the decay phase in seconds.""" 
+        """float. Duration of the decay phase in seconds."""
         return self._decay
     @decay.setter
     def decay(self, x): self.setDecay(x)
 
     @property
     def sustain(self):
-        """float. Amplitude of the sustain phase, as fraction of the peak amplitude.""" 
+        """float. Amplitude of the sustain phase, as fraction of the peak amplitude."""
         return self._sustain
     @sustain.setter
     def sustain(self, x): self.setSustain(x)
 
     @property
     def release(self):
-        """float. Duration of the release phase in seconds.""" 
+        """float. Duration of the release phase in seconds."""
         return self._release
     @release.setter
     def release(self, x): self.setRelease(x)
@@ -1046,11 +1044,11 @@ class MidiDelAdsr(PyoObject):
     """
     Midi triggered ADSR envelope generator with pre-delay.
 
-    Calculates the classical ADSR envelope using linear segments. 
-    The envelope starts after `delay` seconds when it receives a 
-    positive value in input, this value is used as the peak amplitude 
-    of the envelope. The `sustain` parameter is a fraction of the 
-    peak value and sets the real sustain value. A 0 in input (note off) 
+    Calculates the classical ADSR envelope using linear segments.
+    The envelope starts after `delay` seconds when it receives a
+    positive value in input, this value is used as the peak amplitude
+    of the envelope. The `sustain` parameter is a fraction of the
+    peak value and sets the real sustain value. A 0 in input (note off)
     starts the release part of the envelope.
 
     :Parent: :py:class:`PyoObject`
@@ -1062,7 +1060,7 @@ class MidiDelAdsr(PyoObject):
             sets the peak amplitude and starts the envelope. A 0 starts
             the release part of the envelope.
         delay : float, optional
-            Duration of the delay phase, before calling the envelope 
+            Duration of the delay phase, before calling the envelope
             in seconds. Defaults to 0.
         attack : float, optional
             Duration of the attack phase in seconds. Defaults to 0.01.
@@ -1076,7 +1074,7 @@ class MidiDelAdsr(PyoObject):
 
     .. note::
 
-        The out() method is bypassed. MidiDelAdsr's signal can not be sent 
+        The out() method is bypassed. MidiDelAdsr's signal can not be sent
         to audio outs.
 
     >>> s = Server().boot()
@@ -1189,35 +1187,35 @@ class MidiDelAdsr(PyoObject):
 
     @property
     def delay(self):
-        """float. Duration of the delay phase in seconds.""" 
+        """float. Duration of the delay phase in seconds."""
         return self._delay
     @delay.setter
     def delay(self, x): self.setDelay(x)
 
     @property
     def attack(self):
-        """float. Duration of the attack phase in seconds.""" 
+        """float. Duration of the attack phase in seconds."""
         return self._attack
     @attack.setter
     def attack(self, x): self.setAttack(x)
 
     @property
     def decay(self):
-        """float. Duration of the decay phase in seconds.""" 
+        """float. Duration of the decay phase in seconds."""
         return self._decay
     @decay.setter
     def decay(self, x): self.setDecay(x)
 
     @property
     def sustain(self):
-        """float. Amplitude of the sustain phase, as fraction of the peak amplitude.""" 
+        """float. Amplitude of the sustain phase, as fraction of the peak amplitude."""
         return self._sustain
     @sustain.setter
     def sustain(self, x): self.setSustain(x)
 
     @property
     def release(self):
-        """float. Duration of the release phase in seconds.""" 
+        """float. Duration of the release phase in seconds."""
         return self._release
     @release.setter
-    def release(self, x): self.setRelease(x)
+    def release(self, x): self.setRelease(x)
\ No newline at end of file
diff --git a/pyolib/opensndctrl.py b/pyolib/opensndctrl.py
index 2c27ba0..c92a9a5 100644
--- a/pyolib/opensndctrl.py
+++ b/pyolib/opensndctrl.py
@@ -4,7 +4,7 @@ Objects to manage values on an Open Sound Control port.
 OscSend takes the first value of each buffersize and send it on an
 OSC port.
 
-OscReceive creates and returns audio streams from the value in its 
+OscReceive creates and returns audio streams from the value in its
 input port.
 
 The audio streams of these objects are essentially intended to be
@@ -13,23 +13,23 @@ controls and can't be sent to the output soundcard.
 """
 
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+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 sys
 from _core import *
@@ -43,8 +43,8 @@ class OscSend(PyoObject):
     """
     Sends values over a network via the Open Sound Control protocol.
 
-    Uses the OSC protocol to share values to other softwares or other 
-    computers. Only the first value of each input buffersize will be 
+    Uses the OSC protocol to share values to other softwares or other
+    computers. Only the first value of each input buffersize will be
     sent on the OSC port.
 
     :Parent: :py:class:`PyoObject`
@@ -54,27 +54,27 @@ class OscSend(PyoObject):
         input : PyoObject
             Input signal.
         port : int
-            Port on which values are sent. Receiver should listen on the 
+            Port on which values are sent. Receiver should listen on the
             same port.
         address : string
-            Address used on the port to identify values. Address is in 
+            Address used on the port to identify values. Address is in
             the form of a Unix path (ex.: '/pitch').
         host : string, optional
-            IP address of the target computer. The default, '127.0.0.1', 
+            IP address of the target computer. The default, '127.0.0.1',
             is the localhost.
 
     .. note::
 
-        The out() method is bypassed. OscSend's signal can not be sent 
+        The out() method is bypassed. OscSend's signal can not be sent
         to audio outs.
-        
+
         OscSend has no `mul` and `add` attributes.
 
     >>> s = Server().boot()
     >>> s.start()
     >>> a = Sine(freq=[1,1.5], mul=[100,.1], add=[600, .1])
     >>> b = OscSend(a, port=10001, address=['/pitch','/amp'])
-    
+
     """
     def __init__(self, input, port, address, host="127.0.0.1"):
         PyoObject.__init__(self)
@@ -97,20 +97,20 @@ class OscSend(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-            
+
     def out(self, chnl=0, inc=1, dur=0, delay=0):
         return self.play(dur, delay)
 
     def setMul(self, x):
         pass
-        
+
     def setAdd(self, x):
-        pass    
+        pass
 
     def setBufferRate(self, x):
         """
         Sets how many buffers to wait before sending a new value.
-        
+
         :Args:
 
             x : int
@@ -122,17 +122,17 @@ class OscSend(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal.""" 
+        """PyoObject. Input signal."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
-         
+
 class OscReceive(PyoObject):
     """
     Receives values over a network via the Open Sound Control protocol.
 
-    Uses the OSC protocol to receive values from other softwares or 
-    other computers. Get a value at the beginning of each buffersize 
+    Uses the OSC protocol to receive values from other softwares or
+    other computers. Get a value at the beginning of each buffersize
     and fill its buffer with it.
 
     :Parent: :py:class:`PyoObject`
@@ -140,25 +140,25 @@ class OscReceive(PyoObject):
     :Args:
 
         port : int
-            Port on which values are received. Sender should output on 
-            the same port. 
-            
-            Unlike OscSend object, there can be only one port per OscReceive 
-            object. 
-            
+            Port on which values are received. Sender should output on
+            the same port.
+
+            Unlike OscSend object, there can be only one port per OscReceive
+            object.
+
             Available at initialization time only.
         address : string
-            Address used on the port to identify values. Address is in 
+            Address used on the port to identify values. Address is in
             the form of a Unix path (ex.: '/pitch').
 
     .. note::
 
-        Audio streams are accessed with the `address` string parameter. 
+        Audio streams are accessed with the `address` string parameter.
         The user should call :
 
         OscReceive['/pitch'] to retreive stream named '/pitch'.
 
-        The out() method is bypassed. OscReceive's signal can not be sent 
+        The out() method is bypassed. OscReceive's signal can not be sent
         to audio outs.
 
     >>> s = Server().boot()
@@ -240,16 +240,16 @@ class OscReceive(PyoObject):
 
             x : boolean
                 True activates the interpolation, False deactivates it.
-        
+
         """
         [obj.setInterpolation(x) for obj in self._base_objs]
 
     def setValue(self, path, value):
         """
         Sets value for a given address.
-        
+
         :Args:
-        
+
             path : string
                 Address to which the value should be attributed.
             value : float
@@ -262,7 +262,7 @@ class OscReceive(PyoObject):
             if p in self._address:
                 self._mainReceiver.setValue(p, wrap(value,i))
             else:
-                print 'Error: OscReceive.setValue, Illegal address "%s"' % p 
+                print 'Error: OscReceive.setValue, Illegal address "%s"' % p
 
     def get(self, identifier=None, all=False):
         """
@@ -277,7 +277,7 @@ class OscReceive(PyoObject):
 
             identifier : string
                 Address string parameter identifying audio stream.
-                Defaults to None, useful when `all` is True to 
+                Defaults to None, useful when `all` is True to
                 retreive all streams values.
             all : boolean, optional
                 If True, the first value of each object's stream
@@ -290,7 +290,7 @@ class OscReceive(PyoObject):
             return self._base_objs[self._address.index(identifier)]._getStream().getValue()
         else:
             return [obj._getStream().getValue() for obj in self._base_objs]
-             
+
     def out(self, chnl=0, inc=1, dur=0, delay=0):
         return self.play(dur, delay)
 
@@ -298,7 +298,7 @@ class OscDataSend(PyoObject):
     """
     Sends data values over a network via the Open Sound Control protocol.
 
-    Uses the OSC protocol to share values to other softwares or other 
+    Uses the OSC protocol to share values to other softwares or other
     computers. Values are sent on the form of a list containing `types`
     elements.
 
@@ -314,17 +314,17 @@ class OscDataSend(PyoObject):
                 - float : "f"
                 - double : "d"
                 - string : "s"
-                
+
             The string "ssfi" indicates that the value to send will be a list
             containing two strings followed by a float and an integer.
         port : int
-            Port on which values are sent. Receiver should listen on the 
+            Port on which values are sent. Receiver should listen on the
             same port.
         address : string
-            Address used on the port to identify values. Address is in 
+            Address used on the port to identify values. Address is in
             the form of a Unix path (ex.: '/pitch').
         host : string, optional
-            IP address of the target computer. The default, '127.0.0.1', 
+            IP address of the target computer. The default, '127.0.0.1',
             is the localhost.
 
     .. note::
@@ -344,14 +344,14 @@ class OscDataSend(PyoObject):
     >>> a.send(msg)
 
     """
-    def __init__(self, types, port, address, host="127.0.0.1"):    
+    def __init__(self, types, port, address, host="127.0.0.1"):
         PyoObject.__init__(self)
         types, port, address, host, lmax = convertArgsToLists(types, port, address, host)
         self._base_objs = [OscDataSend_base(wrap(types,i), wrap(port,i), wrap(address,i), wrap(host,i)) for i in range(lmax)]
         self._addresses = {}
         for i, adr in enumerate(address):
             self._addresses[adr] = self._base_objs[i]
-            
+
     def out(self, chnl=0, inc=1, dur=0, delay=0):
         return self.play(dur, delay)
 
@@ -359,7 +359,7 @@ class OscDataSend(PyoObject):
         pass
 
     def setAdd(self, x):
-        pass    
+        pass
 
     def getAddresses(self):
         """
@@ -386,13 +386,13 @@ class OscDataSend(PyoObject):
                 The string "ssfi" indicates that the value to send will be a list
                 containing two strings followed by a float and an integer.
             port : int
-                Port on which values are sent. Receiver should listen on the 
+                Port on which values are sent. Receiver should listen on the
                 same port.
             address : string
-                Address used on the port to identify values. Address is in 
+                Address used on the port to identify values. Address is in
                 the form of a Unix path (ex.: '/pitch').
             host : string, optional
-                IP address of the target computer. The default, '127.0.0.1', 
+                IP address of the target computer. The default, '127.0.0.1',
                 is the localhost.
 
         """
@@ -420,9 +420,9 @@ class OscDataSend(PyoObject):
     def send(self, msg, address=None):
         """
         Method used to send `msg` values as a list.
-        
+
         :Args:
-        
+
             msg : list
                 List of values to send. Types of values in list
                 must be of the kind defined of `types` argument
@@ -430,7 +430,7 @@ class OscDataSend(PyoObject):
             address : string, optional
                 Address destination to send values. If None, values
                 will be sent to all addresses managed by the object.
-        
+
         """
         if address == None:
             [obj.send(msg) for obj in self._base_objs]
@@ -441,9 +441,9 @@ class OscDataReceive(PyoObject):
     """
     Receives data values over a network via the Open Sound Control protocol.
 
-    Uses the OSC protocol to receive data values from other softwares or 
+    Uses the OSC protocol to receive data values from other softwares or
     other computers. When a message is received, the function given at the
-    argument `function` is called with the current address destination in 
+    argument `function` is called with the current address destination in
     argument followed by a tuple of values.
 
     :Parent: :py:class:`PyoObject`
@@ -451,17 +451,17 @@ class OscDataReceive(PyoObject):
     :Args:
 
         port : int
-            Port on which values are received. Sender should output on 
-            the same port. Unlike OscDataSend object, there can be only 
-            one port per OscDataReceive object. Available at initialization 
+            Port on which values are received. Sender should output on
+            the same port. Unlike OscDataSend object, there can be only
+            one port per OscDataReceive object. Available at initialization
             time only.
         address : string
-            Address used on the port to identify values. Address is in 
+            Address used on the port to identify values. Address is in
             the form of a Unix path (ex.: "/pitch"). There can be as many
             addresses as needed on a single port.
-        function : callable
+        function : callable (can't be a list)
             This function will be called whenever a message with a known
-            address is received. there can be only one function per 
+            address is received. there can be only one function per
             OscDataReceive object. Available at initialization time only.
 
     .. note::
@@ -496,14 +496,14 @@ class OscDataReceive(PyoObject):
         if not callable(function):
             print >> sys.stderr, 'TypeError: "function" argument of %s must be callable.\n' % self.__class__.__name__
             exit()
-        self._function = function
+        self._function = WeakMethod(function)
         self._address, lmax = convertArgsToLists(address)
         # self._address is linked with list at C level
-        self._base_objs = [OscDataReceive_base(port, self._address, function)]
+        self._base_objs = [OscDataReceive_base(port, self._address, self._function)]
 
     def setMul(self, x):
         pass
-        
+
     def setAdd(self, x):
         pass
 
@@ -513,16 +513,16 @@ class OscDataReceive(PyoObject):
     def getAddresses(self):
         """
         Returns the addresses managed by the object.
-        
+
         """
         return self._address
 
     def addAddress(self, path):
         """
         Adds new address(es) to the object's handler.
-        
+
         :Args:
-        
+
             path : string or list of strings
                 New path(s) to receive from.
 
@@ -551,7 +551,7 @@ class OscListReceive(PyoObject):
     """
     Receives list of values over a network via the Open Sound Control protocol.
 
-    Uses the OSC protocol to receive list of floating-point values from other 
+    Uses the OSC protocol to receive list of floating-point values from other
     softwares or other computers. The list are converted into audio streams.
     Get values at the beginning of each buffersize and fill buffers with them.
 
@@ -560,27 +560,27 @@ class OscListReceive(PyoObject):
     :Args:
 
         port : int
-            Port on which values are received. Sender should output on 
-            the same port. Unlike OscSend object, there can be only one 
-            port per OscListReceive object. Available at initialization time 
+            Port on which values are received. Sender should output on
+            the same port. Unlike OscSend object, there can be only one
+            port per OscListReceive object. Available at initialization time
             only.
         address : string
-            Address used on the port to identify values. Address is in 
+            Address used on the port to identify values. Address is in
             the form of a Unix path (ex.: '/pitch').
         num : int, optional
             Length of the lists in input. The object will generate `num` audio
             streams per given address. Available at initialization time only.
-            This value can't be a list. That means all addresses managed by an 
+            This value can't be a list. That means all addresses managed by an
             OscListReceive object are of the same length. Defaults to 8.
 
     .. note::
 
-        Audio streams are accessed with the `address` string parameter. 
+        Audio streams are accessed with the `address` string parameter.
         The user should call :
 
         OscReceive['/pitch'] to retreive list of streams named '/pitch'.
 
-        The out() method is bypassed. OscReceive's signal can not be sent 
+        The out() method is bypassed. OscReceive's signal can not be sent
         to audio outs.
 
     >>> s = Server().boot()
@@ -605,7 +605,7 @@ class OscListReceive(PyoObject):
         self._address = address
         self._mainReceiver = OscListReceiver_base(port, address, num)
         self._base_objs = [OscListReceive_base(self._mainReceiver, wrap(address,i), j, wrap(mul,i), wrap(add,i)) for i in range(lmax) for j in range(self._num)]
-        
+
     def __getitem__(self, i):
         if type(i) == type(''):
             first = self._address.index(i) * self._num
@@ -679,9 +679,9 @@ class OscListReceive(PyoObject):
     def setValue(self, path, value):
         """
         Sets value for a given address.
-        
+
         :Args:
-        
+
             path : string
                 Address to which the value should be attributed.
             value : list of floats
@@ -701,7 +701,7 @@ class OscListReceive(PyoObject):
                 else:
                     print 'Error: OscListReceive.setValue, value must be of the same length as the `num` attribute.'
             else:
-                print 'Error: OscListReceive.setValue, Illegal address "%s"' % p 
+                print 'Error: OscListReceive.setValue, Illegal address "%s"' % p
 
     def get(self, identifier=None, all=False):
         """
@@ -716,12 +716,12 @@ class OscListReceive(PyoObject):
 
             identifier : string
                 Address string parameter identifying audio stream.
-                Defaults to None, useful when `all` is True to 
+                Defaults to None, useful when `all` is True to
                 retreive all streams values.
             all : boolean, optional
                 If True, the first list of values of each object's stream
-                will be returned as a list of lists. Otherwise, only the 
-                the list of the object's identifier will be returned as a 
+                will be returned as a list of lists. Otherwise, only the
+                the list of the object's identifier will be returned as a
                 list of floats. Defaults to False.
 
         """
@@ -737,4 +737,4 @@ class OscListReceive(PyoObject):
             return outlist
 
     def out(self, chnl=0, inc=1, dur=0, delay=0):
-        return self.play(dur, delay)
+        return self.play(dur, delay)
\ No newline at end of file
diff --git a/pyolib/pan.py b/pyolib/pan.py
index f66eb18..5175edf 100644
--- a/pyolib/pan.py
+++ b/pyolib/pan.py
@@ -1,27 +1,27 @@
 """
-Set of objects to manage audio voice routing and spread of a sound 
+Set of objects to manage audio voice routing and spread of a sound
 signal into a new stereo or multi-channel sound field.
- 
+
 """
 
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+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 sys, random
 from _core import *
@@ -39,13 +39,13 @@ class Pan(PyoObject):
         input : PyoObject
             Input signal to process.
         outs : int, optional
-            Number of channels on the panning circle. Available at 
+            Number of channels on the panning circle. Available at
             initialization time only. Defaults to 2.
         pan : float or PyoObject
-            Position of the sound on the panning circle, between 0 and 1. 
+            Position of the sound on the panning circle, between 0 and 1.
             Defaults to 0.5.
         spread : float or PyoObject
-            Amount of sound leaking to the surrounding channels, 
+            Amount of sound leaking to the surrounding channels,
             between 0 and 1. Defaults to 0.5.
 
     >>> s = Server(nchnls=2).boot()
@@ -53,8 +53,8 @@ class Pan(PyoObject):
     >>> a = Noise(mul=.2)
     >>> lfo = Sine(freq=1, mul=.5, add=.5)
     >>> p = Pan(a, outs=2, pan=lfo).out()
-    
-    """ 
+
+    """
     def __init__(self, input, outs=2, pan=0.5, spread=0.5, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
         self._input = input
@@ -72,7 +72,7 @@ class Pan(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -87,12 +87,12 @@ class Pan(PyoObject):
     def setPan(self, x):
         """
         Replace the `pan` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `pan` attribute.
-        
+
         """
         self._pan = x
         x, lmax = convertArgsToLists(x)
@@ -101,12 +101,12 @@ class Pan(PyoObject):
     def setSpread(self, x):
         """
         Replace the `spread` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `spread` attribute.
-        
+
         """
         self._spread = x
         x, lmax = convertArgsToLists(x)
@@ -124,17 +124,17 @@ class Pan(PyoObject):
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
- 
+
     @property
     def pan(self):
         """float or PyoObject. Position of the sound on the panning circle."""
         return self._pan
     @pan.setter
-    def pan(self, x): self.setPan(x) 
+    def pan(self, x): self.setPan(x)
 
     @property
     def spread(self):
-        """float or PyoObject. Amount of sound leaking to the surrounding channels.""" 
+        """float or PyoObject. Amount of sound leaking to the surrounding channels."""
         return self._spread
     @spread.setter
     def spread(self, x): self.setSpread(x)
@@ -150,10 +150,10 @@ class SPan(PyoObject):
         input : PyoObject
             Input signal to process.
         outs : int, optional
-            Number of channels on the panning circle. Available at 
+            Number of channels on the panning circle. Available at
             initialization time only. Defaults to 2.
         pan : float or PyoObject
-            Position of the sound on the panning circle, between 0 and 1. 
+            Position of the sound on the panning circle, between 0 and 1.
             Defaults to 0.5.
 
     >>> s = Server(nchnls=2).boot()
@@ -179,7 +179,7 @@ class SPan(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -194,12 +194,12 @@ class SPan(PyoObject):
     def setPan(self, x):
         """
         Replace the `pan` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `pan` attribute.
-        
+
         """
         self._pan = x
         x, lmax = convertArgsToLists(x)
@@ -210,14 +210,14 @@ class SPan(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
-    def pan(self): 
+    def pan(self):
         """float or PyoObject. Position of the sound on the panning circle."""
         return self._pan
     @pan.setter
@@ -240,10 +240,10 @@ class Switch(PyoObject):
         input : PyoObject
             Input signal to process.
         outs : int, optional
-            Number of outputs. Available at initialization time only. 
+            Number of outputs. Available at initialization time only.
             Defaults to 2.
         voice : float or PyoObject
-            Voice position pointer, between 0 and (outs-1) / len(input). 
+            Voice position pointer, between 0 and (outs-1) / len(input).
             Defaults to 0.
 
     >>> s = Server(nchnls=2).boot()
@@ -303,14 +303,14 @@ class Switch(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
-    def voice(self): 
+    def voice(self):
         """float or PyoObject. Voice position pointer."""
         return self._voice
     @voice.setter
@@ -320,7 +320,7 @@ class Selector(PyoObject):
     """
     Audio selector.
 
-    Selector takes multiple PyoObjects in input and interpolates between 
+    Selector takes multiple PyoObjects in input and interpolates between
     them to generate a single output.
 
     :Parent: :py:class:`PyoObject`
@@ -330,7 +330,7 @@ class Selector(PyoObject):
         inputs : list of PyoObject
             Audio objects to interpolate from.
         voice : float or PyoObject, optional
-            Voice position pointer, between 0 and len(inputs)-1. 
+            Voice position pointer, between 0 and len(inputs)-1.
             Defaults to 0.
 
     >>> s = Server().boot()
@@ -352,8 +352,8 @@ class Selector(PyoObject):
             try:
                 if len(obj) > self._length: self._length = len(obj)
             except:
-                pass    
-        self._base_objs = []        
+                pass
+        self._base_objs = []
         for i in range(self._lmax):
             for j in range(self._length):
                 choice = []
@@ -361,39 +361,39 @@ class Selector(PyoObject):
                     try:
                         choice.append(obj[j%len(obj)])
                     except:
-                        choice.append(obj)            
+                        choice.append(obj)
                 self._base_objs.append(Selector_base(choice, wrap(voice,i), wrap(mul,i), wrap(add,i)))
 
     def setInputs(self, x):
         """
         Replace the `inputs` attribute.
-        
+
         :Args:
 
             x : list of PyoObject
                 new `inputs` attribute.
-        
+
         """
         self._inputs = x
-        for i in range(self._lmax):           
+        for i in range(self._lmax):
             for j in range(self._length):
                 choice = []
                 for obj in self._inputs:
                     try:
                         choice.append(obj[j%len(obj)])
                     except:
-                        choice.append(obj) 
+                        choice.append(obj)
                 self._base_objs[i+j*self._lmax].setInputs(choice)
 
     def setVoice(self, x):
         """
         Replace the `voice` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `voice` attribute.
-        
+
         """
         self._voice = x
         x, lmax = convertArgsToLists(x)
@@ -405,18 +405,18 @@ class Selector(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def inputs(self): 
+    def inputs(self):
         """List of PyoObjects. Audio objects to interpolate from."""
         return self._inputs
     @inputs.setter
-    def inputs(self, x): 
+    def inputs(self, x):
         self.setInputs(x)
     @property
-    def voice(self): 
+    def voice(self):
         """float or PyoObject. Voice position pointer."""
         return self._voice
     @voice.setter
-    def voice(self, x): 
+    def voice(self, x):
         self.setVoice(x)
 
 class VoiceManager(PyoObject):
@@ -428,7 +428,7 @@ class VoiceManager(PyoObject):
     the same position in the list of triggers given at the argument `triggers`.
 
     Usually, the trigger enabling the voice number will come from the process
-    started with the object output. So, it's common to leave the `triggers` 
+    started with the object output. So, it's common to leave the `triggers`
     argument to None and set the list of triggers afterward with the `setTriggers`
     method. The maximum number of voices generated by the object is the length
     of the trigger list.
@@ -443,8 +443,8 @@ class VoiceManager(PyoObject):
             Trigger stream asking for new voice numbers.
         triggers : PyoObject or list of PyoObject, optional
             List of mono PyoObject sending triggers. Can be a multi-streams
-            PyoObject but not a mix of both. 
-            
+            PyoObject but not a mix of both.
+
             Ordering in the list corresponds to voice numbers. Defaults to None.
 
     >>> s = Server().boot()
@@ -457,7 +457,7 @@ class VoiceManager(PyoObject):
     >>> amp = TrigEnv(sel, table=env, dur=.5, mul=.25)
     >>> synth1 = SineLoop(pit, feedback=.07, mul=amp).out()
     >>> vm.setTriggers(amp["trig"])
-    
+
     """
     def __init__(self, input, triggers=None, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -482,7 +482,7 @@ class VoiceManager(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -497,10 +497,10 @@ class VoiceManager(PyoObject):
     def setTriggers(self, x):
         """
         Replace the `triggers` attribute.
-        
+
         :Args:
 
-            x : PyoObject or list of PyoObject 
+            x : PyoObject or list of PyoObject
                 New `triggers` attribute.
 
         """
@@ -519,25 +519,25 @@ class VoiceManager(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Trigger stream asking for new voice numbers.""" 
+        """PyoObject. Trigger stream asking for new voice numbers."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def triggers(self): 
+    def triggers(self):
         """list of PyoObject. Trigger streams enabling voices."""
         return self._triggers
     @triggers.setter
-    def triggers(self, x): 
+    def triggers(self, x):
         self.setTriggers(x)
 
 class Mixer(PyoObject):
     """
     Audio mixer.
 
-    Mixer mixes multiple inputs to an arbitrary number of outputs 
-    with independant amplitude values per mixing channel and a 
+    Mixer mixes multiple inputs to an arbitrary number of outputs
+    with independant amplitude values per mixing channel and a
     user defined portamento applied on amplitude changes.
 
     :Parent: :py:class:`PyoObject`
@@ -591,14 +591,14 @@ class Mixer(PyoObject):
         time, mul, add, lmax = convertArgsToLists(time, mul, add)
         self._base_players = [Mixer_base(outs, wrap(time,i)) for i in range(chnls)]
         self._base_objs = [MixerVoice_base(self._base_players[j], i, wrap(mul,i), wrap(add,i)) for i in range(outs) for j in range(chnls)]
-        
+
     def __getitem__(self, x):
         if type(x) == SliceType:
             return [self._base_objs[j*self._chnls+i] for j in range(x.start or 0, x.stop or sys.maxint, x.step or 1) for i in range(self._chnls)]
         elif x < len(self._base_objs):
             return [self._base_objs[x*self._chnls+i] for i in range(self._chnls)]
         else:
-            print "'x' too large!"         
+            print "'x' too large!"
 
     def setTime(self, x):
         """
@@ -623,7 +623,7 @@ class Mixer(PyoObject):
         :Args:
 
             voice : int or string
-                Key in the mixer dictionary for this input. If None, a unique key 
+                Key in the mixer dictionary for this input. If None, a unique key
                 between 0 and 32767 will be automatically generated.
             input : PyoObject
                 Audio object to add to the mixer.
@@ -675,7 +675,7 @@ class Mixer(PyoObject):
     def getChannels(self):
         """
         Returns the Mixer's channels dictionary.
-        
+
         """
         return self._inputs
 
@@ -685,7 +685,7 @@ class Mixer(PyoObject):
 
         """
         return self._inputs.keys()
-        
+
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMap(0, 10, 'lin', 'time', self._time, dataOnly=True),
                           SLMapMul(self._mul)]
@@ -693,7 +693,7 @@ class Mixer(PyoObject):
 
     @property
     def time(self):
-        """float. Portamento.""" 
+        """float. Portamento."""
         return self._time
     @time.setter
-    def time(self, x): self.setTime(x)
+    def time(self, x): self.setTime(x)
\ No newline at end of file
diff --git a/pyolib/pattern.py b/pyolib/pattern.py
index e7b2a7c..26549d3 100644
--- a/pyolib/pattern.py
+++ b/pyolib/pattern.py
@@ -1,27 +1,27 @@
 """
-Set of objects that call Python functions from triggers or number counts. 
+Set of objects that call Python functions from triggers or number counts.
 Useful for event sequencing.
 
 """
 
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+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 sys
 from _core import *
@@ -32,11 +32,11 @@ class Pattern(PyoObject):
     """
     Periodically calls a Python function.
 
-    The play() method starts the pattern timer and is not called 
+    The play() method starts the pattern timer and is not called
     at the object creation time.
-            
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
 
         function : Python function
@@ -47,7 +47,7 @@ class Pattern(PyoObject):
     .. note::
 
         The out() method is bypassed. Pattern doesn't return signal.
-        
+
         Pattern has no `mul` and `add` attributes.
 
     >>> s = Server().boot()
@@ -59,7 +59,7 @@ class Pattern(PyoObject):
     ...     a.freq = [f, f+1]
     >>> p = Pattern(pat, .125)
     >>> p.play()
-    
+
     """
     def __init__(self, function, time=1):
         PyoObject.__init__(self)
@@ -71,10 +71,10 @@ class Pattern(PyoObject):
             if not callable(function):
                 print >> sys.stderr, 'TypeError: "function" argument of %s must be callable.\n' % self.__class__.__name__
                 exit()
-        self._function = function
+        self._function = getWeakMethodRef(function)
         self._time = time
         function, time, lmax = convertArgsToLists(function, time)
-        self._base_objs = [Pattern_base(wrap(function,i), wrap(time,i)) for i in range(lmax)]
+        self._base_objs = [Pattern_base(WeakMethod(wrap(function,i)), wrap(time,i)) for i in range(lmax)]
 
     def setFunction(self, x):
         """
@@ -86,19 +86,19 @@ class Pattern(PyoObject):
                 new `function` attribute.
 
         """
-        self._function = x
+        self._function = getWeakMethodRef(x)
         x, lmax = convertArgsToLists(x)
-        [obj.setFunction(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
+        [obj.setFunction(WeakMethod(wrap(x,i))) for i, obj in enumerate(self._base_objs)]
 
     def setTime(self, x):
         """
         Replace the `time` attribute.
-        
+
         :Args:
-        
+
             x : float or PyoObject
                 New `time` attribute.
-        
+
         """
         self._time = x
         x, lmax = convertArgsToLists(x)
@@ -106,7 +106,7 @@ class Pattern(PyoObject):
 
     def out(self, x=0, inc=1, dur=0, delay=0):
         return self.play(dur, delay)
-        
+
     def setMul(self, x):
         pass
 
@@ -122,17 +122,17 @@ class Pattern(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMap(0.125, 4., 'lin', 'time', self._time)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-         
+
     @property
     def function(self):
-        """Python function. Function to be called.""" 
+        """Python function. Function to be called."""
         return self._function
     @function.setter
-    def function(self, x): 
-        self.setFunction(x)   
+    def function(self, x):
+        self.setFunction(x)
     @property
     def time(self):
-        """float or PyoObject. Time, in seconds, between each call.""" 
+        """float or PyoObject. Time, in seconds, between each call."""
         return self._time
     @time.setter
     def time(self, x): self.setTime(x)
@@ -140,13 +140,13 @@ class Pattern(PyoObject):
 class Score(PyoObject):
     """
     Calls functions by incrementation of a preformatted name.
-    
+
     Score takes audio stream containning integers in input and calls
-    a function whose name is the concatenation of `fname` and the changing 
+    a function whose name is the concatenation of `fname` and the changing
     integer.
-    
-    Can be used to sequence events, first by creating functions p0, p1, 
-    p2, etc. and then, by passing a counter to a Score object with "p" 
+
+    Can be used to sequence events, first by creating functions p0, p1,
+    p2, etc. and then, by passing a counter to a Score object with "p"
     as `fname` argument. Functions are called without parameters.
 
     :Parent: :py:class:`PyoObject`
@@ -160,16 +160,16 @@ class Score(PyoObject):
             Name of the functions to be called. Defaults to "event_", meaning
             that the object will call the function "event_0", "event_1", "event_2",
             and so on... Available at initialization time only.
-    
+
     .. note::
 
-        The out() method is bypassed. Score's signal can not be sent 
+        The out() method is bypassed. Score's signal can not be sent
         to audio outs.
 
         Score has no `mul` and `add` attributes.
 
     .. seealso:: :py:class:`Pattern`, :py:class:`TrigFunc`
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> a = SineLoop(freq=[200,300,400,500], feedback=0.05, mul=.1).out()
@@ -182,7 +182,7 @@ class Score(PyoObject):
     >>> m = Metro(1).play()
     >>> c = Counter(m, min=0, max=3)
     >>> sc = Score(c)
-    
+
     """
     def __init__(self, input, fname="event_"):
         PyoObject.__init__(self)
@@ -197,14 +197,14 @@ class Score(PyoObject):
 
     def setMul(self, x):
         pass
-        
+
     def setAdd(self, x):
-        pass    
+        pass
 
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -217,19 +217,19 @@ class Score(PyoObject):
         self._in_fader.setInput(x, fadetime)
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio signal sending integer numbers."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
 
 class CallAfter(PyoObject):
     """
     Calls a Python function after a given time.
-        
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
 
         function : Python function
@@ -238,13 +238,13 @@ class CallAfter(PyoObject):
             Time, in seconds, before the call. Default to 1.
         arg : any Python object, optional
             Argument sent to the called function. Default to None.
-  
+
     .. note::
 
         The out() method is bypassed. CallAfter doesn't return signal.
-        
+
         CallAfter has no `mul` and `add` attributes.
-        
+
         The object is not deleted after the call. The user must delete it himself.
 
     >>> s = Server().boot()
@@ -267,13 +267,13 @@ class CallAfter(PyoObject):
             if not callable(function):
                 print >> sys.stderr, 'TypeError: "function" argument of %s must be callable.\n' % self.__class__.__name__
                 exit()
-        self._function = function
+        self._function = getWeakMethodRef(function)
         function, time, arg, lmax = convertArgsToLists(function, time, arg)
-        self._base_objs = [CallAfter_base(wrap(function,i), wrap(time,i), wrap(arg,i)) for i in range(lmax)]
+        self._base_objs = [CallAfter_base(WeakMethod(wrap(function,i)), wrap(time,i), wrap(arg,i)) for i in range(lmax)]
 
     def out(self, x=0, inc=1, dur=0, delay=0):
         return self.play(dur, delay)
-        
+
     def setMul(self, x):
         pass
 
@@ -284,4 +284,4 @@ class CallAfter(PyoObject):
         pass
 
     def setDiv(self, x):
-        pass
+        pass
\ No newline at end of file
diff --git a/pyolib/phasevoc.py b/pyolib/phasevoc.py
index 379b934..4afd67d 100644
--- a/pyolib/phasevoc.py
+++ b/pyolib/phasevoc.py
@@ -1,30 +1,30 @@
 """
 Phase vocoder.
 
-The phase vocoder is a digital signal processing technique of potentially 
-great musical significance. It can be used to perform very high fidelity 
+The phase vocoder is a digital signal processing technique of potentially
+great musical significance. It can be used to perform very high fidelity
 time scaling, pitch transposition, and myriad other modifications of sounds.
 
 """
 
 """
-Copyright 2011 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU Lesser General Public
+License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
 from _core import *
 from _maps import *
@@ -36,17 +36,17 @@ class PVAnal(PyoPVObject):
     Phase Vocoder analysis object.
 
     PVAnal takes an input sound and performs the phase vocoder
-    analysis on it. This results in two streams, one for the bin's 
-    magnitudes and the other for the bin's true frequencies. These 
-    two streams are used by the PVxxx object family to transform 
+    analysis on it. This results in two streams, one for the bin's
+    magnitudes and the other for the bin's true frequencies. These
+    two streams are used by the PVxxx object family to transform
     the input signal using spectral domain algorithms. The last
     object in the phase vocoder chain must be a PVSynth to perform
     the spectral to time domain conversion.
-    
+
     :Parent: :py:class:`PyoPVObject`
-    
+
     :Args:
-    
+
         input : PyoObject
             Input signal to process.
         size : int {pow-of-two > 4}, optional
@@ -54,12 +54,12 @@ class PVAnal(PyoPVObject):
             Defaults to 1024.
 
             The FFT size is the number of samples used in each
-            analysis frame. 
+            analysis frame.
         overlaps : int, optional
             The number of overlaped analysis block. Must be a
             power of two. Defaults to 4.
-            
-            More overlaps can greatly improved sound quality 
+
+            More overlaps can greatly improved sound quality
             synthesis but it is also more CPU expensive.
         wintype : int, optional
             Shape of the envelope used to filter each input frame.
@@ -90,11 +90,11 @@ class PVAnal(PyoPVObject):
         self._in_fader = InputFader(input)
         in_fader, size, overlaps, wintype, lmax = convertArgsToLists(self._in_fader, size, overlaps, wintype)
         self._base_objs = [PVAnal_base(wrap(in_fader,i), wrap(size,i), wrap(overlaps,i), wrap(wintype,i)) for i in range(lmax)]
- 
+
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -109,12 +109,12 @@ class PVAnal(PyoPVObject):
     def setSize(self, x):
         """
         Replace the `size` attribute.
-        
+
         :Args:
 
             x : int
                 new `size` attribute.
-        
+
         """
         self._size = x
         x, lmax = convertArgsToLists(x)
@@ -123,12 +123,12 @@ class PVAnal(PyoPVObject):
     def setOverlaps(self, x):
         """
         Replace the `overlaps` attribute.
-        
+
         :Args:
 
             x : int
                 new `overlaps` attribute.
-        
+
         """
         self._overlaps = x
         x, lmax = convertArgsToLists(x)
@@ -137,12 +137,12 @@ class PVAnal(PyoPVObject):
     def setWinType(self, x):
         """
         Replace the `wintype` attribute.
-        
+
         :Args:
 
             x : int
                 new `wintype` attribute.
-        
+
         """
         self._wintype = x
         x, lmax = convertArgsToLists(x)
@@ -150,7 +150,7 @@ class PVAnal(PyoPVObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -184,15 +184,15 @@ class PVSynth(PyoObject):
     the spectral to time domain conversion on it. This step
     converts phase vocoder magnitude and true frequency's
     streams back to a real signal.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         input : PyoPVObject
             Phase vocoder streaming object to process.
         wintype : int, optional
-            Shape of the envelope used to filter each input frame. 
+            Shape of the envelope used to filter each input frame.
             Possible shapes are:
                 0. rectangular (no windowing)
                 1. Hamming
@@ -217,11 +217,11 @@ class PVSynth(PyoObject):
         self._wintype = wintype
         input, wintype, mul, add, lmax = convertArgsToLists(self._input, wintype, mul, add)
         self._base_objs = [PVSynth_base(wrap(input,i), wrap(wintype,i), wrap(mul,i), wrap(add,i)) for i in range(lmax)]
- 
+
     def setInput(self, x):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -235,12 +235,12 @@ class PVSynth(PyoObject):
     def setWinType(self, x):
         """
         Replace the `wintype` attribute.
-        
+
         :Args:
 
             x : int
                 new `wintype` attribute.
-        
+
         """
         self._wintype = x
         x, lmax = convertArgsToLists(x)
@@ -252,7 +252,7 @@ class PVSynth(PyoObject):
 
     @property
     def input(self):
-        """PyoPVObject. Input signal to process.""" 
+        """PyoPVObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -269,14 +269,14 @@ class PVAddSynth(PyoObject):
     Phase Vocoder additive synthesis object.
 
     PVAddSynth takes a PyoPVObject as its input and resynthesize
-    the real signal using the magnitude and true frequency's 
-    streams to control amplitude and frequency envelopes of an 
+    the real signal using the magnitude and true frequency's
+    streams to control amplitude and frequency envelopes of an
     oscillator bank.
 
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         input : PyoPVObject
             Phase vocoder streaming object to process.
         pitch : float or PyoObject, optional
@@ -285,12 +285,12 @@ class PVAddSynth(PyoObject):
             Number of oscillators used to synthesize the
             output sound. Defaults to 100.
         first : int, optional
-            The first bin to synthesize, starting from 0. 
+            The first bin to synthesize, starting from 0.
             Defaults to 0.
         inc : int, optional
-            Starting from bin `first`, resynthesize bins 
-            `inc` apart. Defaults to 1. 
-            
+            Starting from bin `first`, resynthesize bins
+            `inc` apart. Defaults to 1.
+
 
     >>> s = Server().boot()
     >>> s.start()
@@ -308,11 +308,11 @@ class PVAddSynth(PyoObject):
         self._inc = inc
         input, pitch, num, first, inc, mul, add, lmax = convertArgsToLists(self._input, pitch, num, first, inc, mul, add)
         self._base_objs = [PVAddSynth_base(wrap(input,i), wrap(pitch,i), wrap(num,i), wrap(first,i), wrap(inc,i), wrap(mul,i), wrap(add,i)) for i in range(lmax)]
- 
+
     def setInput(self, x):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -326,12 +326,12 @@ class PVAddSynth(PyoObject):
     def setPitch(self, x):
         """
         Replace the `pitch` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `pitch` attribute.
-        
+
         """
         self._pitch = x
         x, lmax = convertArgsToLists(x)
@@ -340,12 +340,12 @@ class PVAddSynth(PyoObject):
     def setNum(self, x):
         """
         Replace the `num` attribute.
-        
+
         :Args:
 
             x : int
                 new `num` attribute.
-        
+
         """
         self._num = x
         x, lmax = convertArgsToLists(x)
@@ -354,12 +354,12 @@ class PVAddSynth(PyoObject):
     def setFirst(self, x):
         """
         Replace the `first` attribute.
-        
+
         :Args:
 
             x : int
                 new `first` attribute.
-        
+
         """
         self._first = x
         x, lmax = convertArgsToLists(x)
@@ -368,12 +368,12 @@ class PVAddSynth(PyoObject):
     def setInc(self, x):
         """
         Replace the `inc` attribute.
-        
+
         :Args:
 
             x : int
                 new `inc` attribute.
-        
+
         """
         self._inc = x
         x, lmax = convertArgsToLists(x)
@@ -386,7 +386,7 @@ class PVAddSynth(PyoObject):
 
     @property
     def input(self):
-        """PyoPVObject. Input signal to process.""" 
+        """PyoPVObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -422,11 +422,11 @@ class PVAddSynth(PyoObject):
 class PVTranspose(PyoPVObject):
     """
     Transpose the frequency components of a pv stream.
-    
+
     :Parent: :py:class:`PyoPVObject`
-    
+
     :Args:
-    
+
         input : PyoPVObject
             Phase vocoder streaming object to process.
         transpo : float or PyoObject, optional
@@ -447,11 +447,11 @@ class PVTranspose(PyoPVObject):
         self._transpo = transpo
         input, transpo, lmax = convertArgsToLists(self._input, transpo)
         self._base_objs = [PVTranspose_base(wrap(input,i), wrap(transpo,i)) for i in range(lmax)]
- 
+
     def setInput(self, x):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -465,12 +465,12 @@ class PVTranspose(PyoPVObject):
     def setTranspo(self, x):
         """
         Replace the `transpo` attribute.
-        
+
         :Args:
 
             x : int
                 new `transpo` attribute.
-        
+
         """
         self._transpo = x
         x, lmax = convertArgsToLists(x)
@@ -482,7 +482,7 @@ class PVTranspose(PyoPVObject):
 
     @property
     def input(self):
-        """PyoPVObject. Input signal to process.""" 
+        """PyoPVObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -505,10 +505,10 @@ class PVVerb(PyoPVObject):
         input : PyoPVObject
             Phase vocoder streaming object to process.
         revtime : float or PyoObject, optional
-            Reverberation factor, between 0 and 1. 
+            Reverberation factor, between 0 and 1.
             Defaults to 0.75.
         damp : float or PyoObject, optional
-            High frequency damping factor, between 0 and 1. 
+            High frequency damping factor, between 0 and 1.
             1 means no damping and 0 is the most damping.
             Defaults to 0.75.
 
@@ -529,11 +529,11 @@ class PVVerb(PyoPVObject):
         self._damp = damp
         input, revtime, damp, lmax = convertArgsToLists(self._input, revtime, damp)
         self._base_objs = [PVVerb_base(wrap(input,i), wrap(revtime,i), wrap(damp,i)) for i in range(lmax)]
- 
+
     def setInput(self, x):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -547,12 +547,12 @@ class PVVerb(PyoPVObject):
     def setRevtime(self, x):
         """
         Replace the `revtime` attribute.
-        
+
         :Args:
 
             x : int
                 new `revtime` attribute.
-        
+
         """
         self._revtime = x
         x, lmax = convertArgsToLists(x)
@@ -561,12 +561,12 @@ class PVVerb(PyoPVObject):
     def setDamp(self, x):
         """
         Replace the `damp` attribute.
-        
+
         :Args:
 
             x : int
                 new `damp` attribute.
-        
+
         """
         self._damp = x
         x, lmax = convertArgsToLists(x)
@@ -579,7 +579,7 @@ class PVVerb(PyoPVObject):
 
     @property
     def input(self):
-        """PyoPVObject. Input signal to process.""" 
+        """PyoPVObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -590,7 +590,7 @@ class PVVerb(PyoPVObject):
         return self._revtime
     @revtime.setter
     def revtime(self, x): self.setRevtime(x)
-    
+
     @property
     def damp(self):
         """float or PyoObject. High frequency damping factor."""
@@ -629,11 +629,11 @@ class PVGate(PyoPVObject):
         self._damp = damp
         input, thresh, damp, lmax = convertArgsToLists(self._input, thresh, damp)
         self._base_objs = [PVGate_base(wrap(input,i), wrap(thresh,i), wrap(damp,i)) for i in range(lmax)]
- 
+
     def setInput(self, x):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -647,12 +647,12 @@ class PVGate(PyoPVObject):
     def setThresh(self, x):
         """
         Replace the `thresh` attribute.
-        
+
         :Args:
 
             x : int
                 new `thresh` attribute.
-        
+
         """
         self._thresh = x
         x, lmax = convertArgsToLists(x)
@@ -661,12 +661,12 @@ class PVGate(PyoPVObject):
     def setDamp(self, x):
         """
         Replace the `damp` attribute.
-        
+
         :Args:
 
             x : int
                 new `damp` attribute.
-        
+
         """
         self._damp = x
         x, lmax = convertArgsToLists(x)
@@ -679,7 +679,7 @@ class PVGate(PyoPVObject):
 
     @property
     def input(self):
-        """PyoPVObject. Input signal to process.""" 
+        """PyoPVObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -690,7 +690,7 @@ class PVGate(PyoPVObject):
         return self._thresh
     @thresh.setter
     def thresh(self, x): self.setThresh(x)
-    
+
     @property
     def damp(self):
         """float or PyoObject. Damping factor for low amplitude bins."""
@@ -701,14 +701,14 @@ class PVGate(PyoPVObject):
 class PVCross(PyoPVObject):
     """
     Performs cross-synthesis between two phase vocoder streaming object.
-    
+
     The amplitudes from `input` and `input2` (scaled by `fade` argument)
     are applied to the frequencies of `input`.
 
     :Parent: :py:class:`PyoPVObject`
-    
+
     :Args:
-    
+
         input : PyoPVObject
             Phase vocoder streaming object to process. Frequencies from
             this pv stream are used to compute the output signal.
@@ -716,12 +716,12 @@ class PVCross(PyoPVObject):
             Phase vocoder streaming object which gives the second set of
             magnitudes. Frequencies from this pv stream are not used.
         fade : float or PyoObject, optional
-            Scaling factor for the output amplitudes, between 0 and 1. 
-            0 means amplitudes from `input` and 1 means amplitudes from `input2`. 
+            Scaling factor for the output amplitudes, between 0 and 1.
+            0 means amplitudes from `input` and 1 means amplitudes from `input2`.
             Defaults to 1.
 
     .. note::
-        
+
         The two input pv stream must have the same size and overlaps. It is
         the responsibility of the user to be sure they are consistent. To change
         the size (or the overlaps) of the phase vocoder process, one must
@@ -752,11 +752,11 @@ class PVCross(PyoPVObject):
         self._fade = fade
         input, input2, fade, lmax = convertArgsToLists(self._input, self._input2, fade)
         self._base_objs = [PVCross_base(wrap(input,i), wrap(input2,i), wrap(fade,i)) for i in range(lmax)]
- 
+
     def setInput(self, x):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -770,7 +770,7 @@ class PVCross(PyoPVObject):
     def setInput2(self, x):
         """
         Replace the `input2` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -784,12 +784,12 @@ class PVCross(PyoPVObject):
     def setFade(self, x):
         """
         Replace the `fade` attribute.
-        
+
         :Args:
 
             x : int
                 new `fade` attribute.
-        
+
         """
         self._fade = x
         x, lmax = convertArgsToLists(x)
@@ -801,14 +801,14 @@ class PVCross(PyoPVObject):
 
     @property
     def input(self):
-        """PyoPVObject. Input signal to process.""" 
+        """PyoPVObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def input2(self):
-        """PyoPVObject. Second set of amplitudes.""" 
+        """PyoPVObject. Second set of amplitudes."""
         return self._input2
     @input2.setter
     def input2(self, x): self.setInput2(x)
@@ -825,9 +825,9 @@ class PVMult(PyoPVObject):
     Multiply magnitudes from two phase vocoder streaming object.
 
     :Parent: :py:class:`PyoPVObject`
-    
+
     :Args:
-    
+
         input : PyoPVObject
             Phase vocoder streaming object to process. Frequencies from
             this pv stream are used to compute the output signal.
@@ -836,7 +836,7 @@ class PVMult(PyoPVObject):
             magnitudes. Frequencies from this pv stream are not used.
 
     .. note::
-        
+
         The two input pv stream must have the same size and overlaps. It is
         the responsibility of the user to be sure they are consistent. To change
         the size (or the overlaps) of the phase vocoder process, one must
@@ -866,11 +866,11 @@ class PVMult(PyoPVObject):
         self._input2 = input2
         input, input2, lmax = convertArgsToLists(self._input, self._input2)
         self._base_objs = [PVMult_base(wrap(input,i), wrap(input2,i)) for i in range(lmax)]
- 
+
     def setInput(self, x):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -884,7 +884,7 @@ class PVMult(PyoPVObject):
     def setInput2(self, x):
         """
         Replace the `input2` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -897,14 +897,14 @@ class PVMult(PyoPVObject):
 
     @property
     def input(self):
-        """PyoPVObject. Input signal to process.""" 
+        """PyoPVObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def input2(self):
-        """PyoPVObject. Second set of magnitudes.""" 
+        """PyoPVObject. Second set of magnitudes."""
         return self._input2
     @input2.setter
     def input2(self, x): self.setInput2(x)
@@ -912,15 +912,15 @@ class PVMult(PyoPVObject):
 class PVMorph(PyoPVObject):
     """
     Performs spectral morphing between two phase vocoder streaming object.
-    
-    According to `fade` argument, the amplitudes from `input` and `input2` 
+
+    According to `fade` argument, the amplitudes from `input` and `input2`
     are interpolated linearly while the frequencies are interpolated
     exponentially.
 
     :Parent: :py:class:`PyoPVObject`
-    
+
     :Args:
-    
+
         input : PyoPVObject
             Phase vocoder streaming object which gives the first set of
             magnitudes and frequencies.
@@ -928,11 +928,11 @@ class PVMorph(PyoPVObject):
             Phase vocoder streaming object which gives the second set of
             magnitudes and frequencies.
         fade : float or PyoObject, optional
-            Scaling factor for the output amplitudes and frequencies, 
+            Scaling factor for the output amplitudes and frequencies,
             between 0 and 1. 0 is `input` and 1 in `input2`. Defaults to 0.5.
 
     .. note::
-        
+
         The two input pv stream must have the same size and overlaps. It is
         the responsibility of the user to be sure they are consistent. To change
         the size (or the overlaps) of the phase vocoder process, one must
@@ -963,11 +963,11 @@ class PVMorph(PyoPVObject):
         self._fade = fade
         input, input2, fade, lmax = convertArgsToLists(self._input, self._input2, fade)
         self._base_objs = [PVMorph_base(wrap(input,i), wrap(input2,i), wrap(fade,i)) for i in range(lmax)]
- 
+
     def setInput(self, x):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -981,7 +981,7 @@ class PVMorph(PyoPVObject):
     def setInput2(self, x):
         """
         Replace the `input2` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -995,12 +995,12 @@ class PVMorph(PyoPVObject):
     def setFade(self, x):
         """
         Replace the `fade` attribute.
-        
+
         :Args:
 
             x : int
                 new `fade` attribute.
-        
+
         """
         self._fade = x
         x, lmax = convertArgsToLists(x)
@@ -1012,14 +1012,14 @@ class PVMorph(PyoPVObject):
 
     @property
     def input(self):
-        """PyoPVObject. First input signal.""" 
+        """PyoPVObject. First input signal."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def input2(self):
-        """PyoPVObject. Second input signal.""" 
+        """PyoPVObject. Second input signal."""
         return self._input2
     @input2.setter
     def input2(self, x): self.setInput2(x)
@@ -1034,28 +1034,28 @@ class PVMorph(PyoPVObject):
 class PVFilter(PyoPVObject):
     """
     Spectral filter.
-    
+
     PVFilter filters frequency components of a pv stream
     according to the shape drawn in the table given in
     argument.
-    
+
     :Parent: :py:class:`PyoPVObject`
-    
+
     :Args:
-    
+
         input : PyoPVObject
             Phase vocoder streaming object to process.
         table : PyoTableObject
-            Table containing the filter shape. If the 
+            Table containing the filter shape. If the
             table length is smaller than fftsize/2,
             remaining bins will be set to 0.
         gain : float or PyoObject, optional
-            Gain of the filter applied to the input spectrum. 
+            Gain of the filter applied to the input spectrum.
             Defaults to 1.
         mode : int, optional
             Table scanning mode. Defaults to 0.
-            
-            If 0, bin indexes outside table size are set to 0. 
+
+            If 0, bin indexes outside table size are set to 0.
             If 1, bin indexes are scaled over table length.
 
     >>> s = Server().boot()
@@ -1075,11 +1075,11 @@ class PVFilter(PyoPVObject):
         self._mode = mode
         input, table, gain, mode, lmax = convertArgsToLists(self._input, table, gain, mode)
         self._base_objs = [PVFilter_base(wrap(input,i), wrap(table,i), wrap(gain,i), wrap(mode,i)) for i in range(lmax)]
- 
+
     def setInput(self, x):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -1093,12 +1093,12 @@ class PVFilter(PyoPVObject):
     def setTable(self, x):
         """
         Replace the `table` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `table` attribute.
-        
+
         """
         self._table = x
         x, lmax = convertArgsToLists(x)
@@ -1107,12 +1107,12 @@ class PVFilter(PyoPVObject):
     def setGain(self, x):
         """
         Replace the `gain` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `gain` attribute.
-        
+
         """
         self._gain = x
         x, lmax = convertArgsToLists(x)
@@ -1121,12 +1121,12 @@ class PVFilter(PyoPVObject):
     def setMode(self, x):
         """
         Replace the `mode` attribute.
-        
+
         :Args:
 
             x : int
                 new `mode` attribute.
-        
+
         """
         self._mode = x
         x, lmax = convertArgsToLists(x)
@@ -1138,14 +1138,14 @@ class PVFilter(PyoPVObject):
 
     @property
     def input(self):
-        """PyoPVObject. Input signal to process.""" 
+        """PyoPVObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def table(self):
-        """PyoTableObject. Table containing the filter shape.""" 
+        """PyoTableObject. Table containing the filter shape."""
         return self._table
     @table.setter
     def table(self, x): self.setTable(x)
@@ -1167,35 +1167,35 @@ class PVFilter(PyoPVObject):
 class PVDelay(PyoPVObject):
     """
     Spectral delays.
-    
+
     PVDelay applies different delay times and feedbacks for
-    each bin of a phase vocoder analysis. Delay times and 
+    each bin of a phase vocoder analysis. Delay times and
     feedbacks are specified with PyoTableObjects.
-    
+
     :Parent: :py:class:`PyoPVObject`
-    
+
     :Args:
-    
+
         input : PyoPVObject
             Phase vocoder streaming object to process.
         deltable : PyoTableObject
             Table containing delay times, as integer multipliers
-            of the FFT hopsize (fftsize / overlaps). 
-            
+            of the FFT hopsize (fftsize / overlaps).
+
             If the table length is smaller than fftsize/2,
             remaining bins will be set to 0.
         feedtable : PyoTableObject
-            Table containing feedback values, between -1 and 1. 
-            
+            Table containing feedback values, between -1 and 1.
+
             If the table length is smaller than fftsize/2,
             remaining bins will be set to 0.
         maxdelay : float, optional
-            Maximum delay time in seconds. Available at initialization 
+            Maximum delay time in seconds. Available at initialization
             time only. Defaults to 1.0.
         mode : int, optional
             Tables scanning mode. Defaults to 0.
-            
-            If 0, bin indexes outside table size are set to 0. 
+
+            If 0, bin indexes outside table size are set to 0.
             If 1, bin indexes are scaled over table length.
 
     >>> s = Server().boot()
@@ -1223,11 +1223,11 @@ class PVDelay(PyoPVObject):
         self._mode = mode
         input, deltable, feedtable, maxdelay, mode, lmax = convertArgsToLists(self._input, deltable, feedtable, maxdelay, mode)
         self._base_objs = [PVDelay_base(wrap(input,i), wrap(deltable,i), wrap(feedtable,i), wrap(maxdelay,i), wrap(mode,i)) for i in range(lmax)]
- 
+
     def setInput(self, x):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -1241,12 +1241,12 @@ class PVDelay(PyoPVObject):
     def setDeltable(self, x):
         """
         Replace the `deltable` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `deltable` attribute.
-        
+
         """
         self._deltable = x
         x, lmax = convertArgsToLists(x)
@@ -1255,12 +1255,12 @@ class PVDelay(PyoPVObject):
     def setFeedtable(self, x):
         """
         Replace the `feedtable` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `feedtable` attribute.
-        
+
         """
         self._feedtable = x
         x, lmax = convertArgsToLists(x)
@@ -1269,12 +1269,12 @@ class PVDelay(PyoPVObject):
     def setMode(self, x):
         """
         Replace the `mode` attribute.
-        
+
         :Args:
 
             x : int
                 new `mode` attribute.
-        
+
         """
         self._mode = x
         x, lmax = convertArgsToLists(x)
@@ -1282,14 +1282,14 @@ class PVDelay(PyoPVObject):
 
     @property
     def input(self):
-        """PyoPVObject. Input signal to process.""" 
+        """PyoPVObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def deltable(self):
-        """PyoTableObject. Table containing the delay times.""" 
+        """PyoTableObject. Table containing the delay times."""
         return self._deltable
     @deltable.setter
     def deltable(self, x): self.setDeltable(x)
@@ -1311,28 +1311,28 @@ class PVDelay(PyoPVObject):
 class PVBuffer(PyoPVObject):
     """
     Phase vocoder buffer and playback with transposition.
-    
+
     PVBuffer keeps `length` seconds of pv analysis in memory
     and gives control on playback position and transposition.
-    
+
     :Parent: :py:class:`PyoPVObject`
-    
+
     :Args:
-    
+
         input : PyoPVObject
             Phase vocoder streaming object to process.
         index : PyoObject
-            Playback position, as audio stream, normalized 
-            between 0 and 1. 
+            Playback position, as audio stream, normalized
+            between 0 and 1.
         pitch : float or PyoObject, optional
             Transposition factor. Defaults to 1.
         length : float, optional
-            Memory length in seconds. Available at initialization 
+            Memory length in seconds. Available at initialization
             time only. Defaults to 1.0.
 
     .. note::
-        
-        The play() method can be called to start a new recording of 
+
+        The play() method can be called to start a new recording of
         the current pv input.
 
     >>> s = Server().boot()
@@ -1354,11 +1354,11 @@ class PVBuffer(PyoPVObject):
         self._length = length
         input, index, pitch, length, lmax = convertArgsToLists(self._input, index, pitch, length)
         self._base_objs = [PVBuffer_base(wrap(input,i), wrap(index,i), wrap(pitch,i), wrap(length,i)) for i in range(lmax)]
- 
+
     def setInput(self, x):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -1372,12 +1372,12 @@ class PVBuffer(PyoPVObject):
     def setIndex(self, x):
         """
         Replace the `index` attribute.
-        
+
         :Args:
 
             x : PyoObject
                 new `index` attribute.
-        
+
         """
         self._index = x
         x, lmax = convertArgsToLists(x)
@@ -1386,12 +1386,12 @@ class PVBuffer(PyoPVObject):
     def setPitch(self, x):
         """
         Replace the `pitch` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `pitch` attribute.
-        
+
         """
         self._pitch = x
         x, lmax = convertArgsToLists(x)
@@ -1403,14 +1403,14 @@ class PVBuffer(PyoPVObject):
 
     @property
     def input(self):
-        """PyoPVObject. Input signal to process.""" 
+        """PyoPVObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def index(self):
-        """PyoObject. Reader's normalized position.""" 
+        """PyoObject. Reader's normalized position."""
         return self._index
     @index.setter
     def index(self, x): self.setIndex(x)
@@ -1425,14 +1425,14 @@ class PVBuffer(PyoPVObject):
 class PVShift(PyoPVObject):
     """
     Spectral domain frequency shifter.
-    
+
     PVShift linearly moves the analysis bins by the amount, in Hertz,
-    specified by the the `shift` argument. 
-    
+    specified by the the `shift` argument.
+
     :Parent: :py:class:`PyoPVObject`
-    
+
     :Args:
-    
+
         input : PyoPVObject
             Phase vocoder streaming object to process.
         shift : float or PyoObject, optional
@@ -1452,11 +1452,11 @@ class PVShift(PyoPVObject):
         self._shift = shift
         input, shift, lmax = convertArgsToLists(self._input, shift)
         self._base_objs = [PVShift_base(wrap(input,i), wrap(shift,i)) for i in range(lmax)]
- 
+
     def setInput(self, x):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -1470,12 +1470,12 @@ class PVShift(PyoPVObject):
     def setShift(self, x):
         """
         Replace the `shift` attribute.
-        
+
         :Args:
 
             x : int
                 new `shift` attribute.
-        
+
         """
         self._shift = x
         x, lmax = convertArgsToLists(x)
@@ -1487,7 +1487,7 @@ class PVShift(PyoPVObject):
 
     @property
     def input(self):
-        """PyoPVObject. Input signal to process.""" 
+        """PyoPVObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -1502,15 +1502,15 @@ class PVShift(PyoPVObject):
 class PVAmpMod(PyoPVObject):
     """
     Performs frequency independent amplitude modulations.
-    
-    PVAmpMod modulates the magnitude of each bin of a pv 
-    stream with an independent oscillator. `basefreq` and 
-    `spread` are used to derive the frequency of each 
+
+    PVAmpMod modulates the magnitude of each bin of a pv
+    stream with an independent oscillator. `basefreq` and
+    `spread` are used to derive the frequency of each
     modulating oscillator.
-    
+
     Internally, the following operations are applied to
     derive oscillator frequencies (`i` is the bin number):
-        
+
         spread = spread * 0.001 + 1.0
 
         f_i = basefreq * pow(spread, i)
@@ -1522,7 +1522,7 @@ class PVAmpMod(PyoPVObject):
         input : PyoPVObject
             Phase vocoder streaming object to process.
         basefreq : float or PyoObject, optional
-            Base modulation frequency, in Hertz. 
+            Base modulation frequency, in Hertz.
             Defaults to 1.
         spread : float or PyoObject, optional
             Spreading factor for oscillator frequencies, between
@@ -1543,11 +1543,11 @@ class PVAmpMod(PyoPVObject):
         self._spread = spread
         input, basefreq, spread, lmax = convertArgsToLists(self._input, basefreq, spread)
         self._base_objs = [PVAmpMod_base(wrap(input,i), wrap(basefreq,i), wrap(spread,i)) for i in range(lmax)]
- 
+
     def setInput(self, x):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -1561,12 +1561,12 @@ class PVAmpMod(PyoPVObject):
     def setBasefreq(self, x):
         """
         Replace the `basefreq` attribute.
-        
+
         :Args:
 
             x : int
                 new `basefreq` attribute.
-        
+
         """
         self._basefreq = x
         x, lmax = convertArgsToLists(x)
@@ -1575,12 +1575,12 @@ class PVAmpMod(PyoPVObject):
     def setSpread(self, x):
         """
         Replace the `spread` attribute.
-        
+
         :Args:
 
             x : int
                 new `spread` attribute.
-        
+
         """
         self._spread = x
         x, lmax = convertArgsToLists(x)
@@ -1592,7 +1592,7 @@ class PVAmpMod(PyoPVObject):
 
         """
         [obj.reset() for obj in self._base_objs]
-        
+
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMap(0.1, 20, "log", "basefreq", self._basefreq),
                           SLMap(-1, 1, "lin", "spread", self._spread)]
@@ -1600,7 +1600,7 @@ class PVAmpMod(PyoPVObject):
 
     @property
     def input(self):
-        """PyoPVObject. Input signal to process.""" 
+        """PyoPVObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -1611,7 +1611,7 @@ class PVAmpMod(PyoPVObject):
         return self._basefreq
     @basefreq.setter
     def basefreq(self, x): self.setBasefreq(x)
-    
+
     @property
     def spread(self):
         """float or PyoObject. Modulator's frequency spreading factor."""
@@ -1622,15 +1622,15 @@ class PVAmpMod(PyoPVObject):
 class PVFreqMod(PyoPVObject):
     """
     Performs frequency independent frequency modulations.
-    
-    PVFreqMod modulates the frequency of each bin of a pv 
-    stream with an independent oscillator. `basefreq` and 
-    `spread` are used to derive the frequency of each 
+
+    PVFreqMod modulates the frequency of each bin of a pv
+    stream with an independent oscillator. `basefreq` and
+    `spread` are used to derive the frequency of each
     modulating oscillator.
-    
+
     Internally, the following operations are applied to
     derive oscillator frequencies (`i` is the bin number):
-        
+
         spread = spread * 0.001 + 1.0
 
         f_i = basefreq * pow(spread, i)
@@ -1642,13 +1642,13 @@ class PVFreqMod(PyoPVObject):
         input : PyoPVObject
             Phase vocoder streaming object to process.
         basefreq : float or PyoObject, optional
-            Base modulation frequency, in Hertz. 
+            Base modulation frequency, in Hertz.
             Defaults to 1.
         spread : float or PyoObject, optional
             Spreading factor for oscillator frequencies, between
             -1 and 1. 0 means every oscillator has the same frequency.
         depth : float or PyoObject, optional
-            Amplitude of the modulating oscillators, between 0 and 1. 
+            Amplitude of the modulating oscillators, between 0 and 1.
             Defaults to 0.1.
 
     >>> s = Server().boot()
@@ -1667,11 +1667,11 @@ class PVFreqMod(PyoPVObject):
         self._depth = depth
         input, basefreq, spread, depth, lmax = convertArgsToLists(self._input, basefreq, spread, depth)
         self._base_objs = [PVFreqMod_base(wrap(input,i), wrap(basefreq,i), wrap(spread,i), wrap(depth,i)) for i in range(lmax)]
- 
+
     def setInput(self, x):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -1685,12 +1685,12 @@ class PVFreqMod(PyoPVObject):
     def setBasefreq(self, x):
         """
         Replace the `basefreq` attribute.
-        
+
         :Args:
 
             x : int
                 new `basefreq` attribute.
-        
+
         """
         self._basefreq = x
         x, lmax = convertArgsToLists(x)
@@ -1699,12 +1699,12 @@ class PVFreqMod(PyoPVObject):
     def setSpread(self, x):
         """
         Replace the `spread` attribute.
-        
+
         :Args:
 
             x : int
                 new `spread` attribute.
-        
+
         """
         self._spread = x
         x, lmax = convertArgsToLists(x)
@@ -1713,12 +1713,12 @@ class PVFreqMod(PyoPVObject):
     def setDepth(self, x):
         """
         Replace the `depth` attribute.
-        
+
         :Args:
 
             x : int
                 new `depth` attribute.
-        
+
         """
         self._depth = x
         x, lmax = convertArgsToLists(x)
@@ -1730,7 +1730,7 @@ class PVFreqMod(PyoPVObject):
 
         """
         [obj.reset() for obj in self._base_objs]
-        
+
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMap(0.1, 20, "log", "basefreq", self._basefreq),
                           SLMap(-1, 1, "lin", "spread", self._spread),
@@ -1739,7 +1739,7 @@ class PVFreqMod(PyoPVObject):
 
     @property
     def input(self):
-        """PyoPVObject. Input signal to process.""" 
+        """PyoPVObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -1750,7 +1750,7 @@ class PVFreqMod(PyoPVObject):
         return self._basefreq
     @basefreq.setter
     def basefreq(self, x): self.setBasefreq(x)
-    
+
     @property
     def spread(self):
         """float or PyoObject. Modulator's frequencies spreading factor."""
@@ -1768,21 +1768,21 @@ class PVFreqMod(PyoPVObject):
 class PVBufLoops(PyoPVObject):
     """
     Phase vocoder buffer with bin independent speed playback.
-    
+
     PVBufLoops keeps `length` seconds of pv analysis in memory
-    and gives control on playback position independently for 
+    and gives control on playback position independently for
     every frequency bin.
-    
+
     :Parent: :py:class:`PyoPVObject`
-    
+
     :Args:
-    
+
         input : PyoPVObject
             Phase vocoder streaming object to process.
         low : float or PyoObject, optional
-            Lowest bin speed factor. Defaults to 1.0. 
+            Lowest bin speed factor. Defaults to 1.0.
         high : float or PyoObject, optional
-            Highest bin speed factor. Defaults to 1.0. 
+            Highest bin speed factor. Defaults to 1.0.
         mode : int, optional
             Speed distribution algorithm. Available algorithms are:
                 0. linear, line between `low` and `high` (default)
@@ -1794,12 +1794,12 @@ class PVBufLoops(PyoPVObject):
                 6. rand bi-expon, bipolar exponential random between `low` and `high`
 
         length : float, optional
-            Memory length in seconds. Available at initialization 
+            Memory length in seconds. Available at initialization
             time only. Defaults to 1.0.
 
     .. note::
-        
-        The play() method can be called to start a new recording of 
+
+        The play() method can be called to start a new recording of
         the current pv input.
 
     >>> s = Server().boot()
@@ -1821,11 +1821,11 @@ class PVBufLoops(PyoPVObject):
         self._length = length
         input, low, high, mode, length, lmax = convertArgsToLists(self._input, low, high, mode, length)
         self._base_objs = [PVBufLoops_base(wrap(input,i), wrap(low,i), wrap(high,i), wrap(mode,i), wrap(length,i)) for i in range(lmax)]
- 
+
     def setInput(self, x):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -1839,12 +1839,12 @@ class PVBufLoops(PyoPVObject):
     def setLow(self, x):
         """
         Replace the `low` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `low` attribute.
-        
+
         """
         self._low = x
         x, lmax = convertArgsToLists(x)
@@ -1853,12 +1853,12 @@ class PVBufLoops(PyoPVObject):
     def setHigh(self, x):
         """
         Replace the `high` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `high` attribute.
-        
+
         """
         self._high = x
         x, lmax = convertArgsToLists(x)
@@ -1867,12 +1867,12 @@ class PVBufLoops(PyoPVObject):
     def setMode(self, x):
         """
         Replace the `mode` attribute.
-        
+
         :Args:
 
             x : int
                 new `mode` attribute.
-        
+
         """
         self._mode = x
         x, lmax = convertArgsToLists(x)
@@ -1881,7 +1881,7 @@ class PVBufLoops(PyoPVObject):
     def reset(self):
         """
         Reset pointer positions to 0.
-        
+
         """
         [obj.reset() for obj in self._base_objs]
 
@@ -1892,14 +1892,14 @@ class PVBufLoops(PyoPVObject):
 
     @property
     def input(self):
-        """PyoPVObject. Input signal to process.""" 
+        """PyoPVObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def low(self):
-        """float or PyoObject. Lowest bin speed factor.""" 
+        """float or PyoObject. Lowest bin speed factor."""
         return self._low
     @low.setter
     def low(self, x): self.setLow(x)
@@ -1921,26 +1921,26 @@ class PVBufLoops(PyoPVObject):
 class PVBufTabLoops(PyoPVObject):
     """
     Phase vocoder buffer with bin independent speed playback.
-    
+
     PVBufTabLoops keeps `length` seconds of pv analysis in memory
     and gives control on playback position, using a PyoTableObject,
     independently for every frequency bin.
-    
+
     :Parent: :py:class:`PyoPVObject`
-    
+
     :Args:
-    
+
         input : PyoPVObject
             Phase vocoder streaming object to process.
         speed : PyoTableObject
-            Table which specify the speed of bin playback readers. 
+            Table which specify the speed of bin playback readers.
         length : float, optional
-            Memory length in seconds. Available at initialization 
+            Memory length in seconds. Available at initialization
             time only. Defaults to 1.0.
 
     .. note::
-        
-        The play() method can be called to start a new recording of 
+
+        The play() method can be called to start a new recording of
         the current pv input.
 
     >>> s = Server().boot()
@@ -1961,11 +1961,11 @@ class PVBufTabLoops(PyoPVObject):
         self._length = length
         input, speed, length, lmax = convertArgsToLists(self._input, speed, length)
         self._base_objs = [PVBufTabLoops_base(wrap(input,i), wrap(speed,i), wrap(length,i)) for i in range(lmax)]
- 
+
     def setInput(self, x):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -1979,12 +1979,12 @@ class PVBufTabLoops(PyoPVObject):
     def setSpeed(self, x):
         """
         Replace the `speed` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `speed` attribute.
-        
+
         """
         self._speed = x
         x, lmax = convertArgsToLists(x)
@@ -1993,39 +1993,39 @@ class PVBufTabLoops(PyoPVObject):
     def reset(self):
         """
         Reset pointer positions to 0.
-        
+
         """
         [obj.reset() for obj in self._base_objs]
 
     @property
     def input(self):
-        """PyoPVObject. Input signal to process.""" 
+        """PyoPVObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def speed(self):
-        """PyoTableObject. Table which specify the speed of bin playback readers.""" 
+        """PyoTableObject. Table which specify the speed of bin playback readers."""
         return self._speed
     @speed.setter
     def speed(self, x): self.setSpeed(x)
-    
+
 class PVMix(PyoPVObject):
     """
     Mix the most prominent components from two phase vocoder streaming objects.
 
     :Parent: :py:class:`PyoPVObject`
-    
+
     :Args:
-    
+
         input : PyoPVObject
             Phase vocoder streaming object 1.
         input2 : PyoPVObject
             Phase vocoder streaming object 2.
 
     .. note::
-        
+
         The two input pv stream must have the same size and overlaps. It is
         the responsibility of the user to be sure they are consistent. To change
         the size (or the overlaps) of the phase vocoder process, one must
@@ -2055,11 +2055,11 @@ class PVMix(PyoPVObject):
         self._input2 = input2
         input, input2, lmax = convertArgsToLists(self._input, self._input2)
         self._base_objs = [PVMix_base(wrap(input,i), wrap(input2,i)) for i in range(lmax)]
- 
+
     def setInput(self, x):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -2073,7 +2073,7 @@ class PVMix(PyoPVObject):
     def setInput2(self, x):
         """
         Replace the `input2` attribute.
-        
+
         :Args:
 
             x : PyoPVObject
@@ -2086,14 +2086,14 @@ class PVMix(PyoPVObject):
 
     @property
     def input(self):
-        """PyoPVObject. Phase vocoder streaming object 1.""" 
+        """PyoPVObject. Phase vocoder streaming object 1."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def input2(self):
-        """PyoPVObject. Phase vocoder streaming object 2.""" 
+        """PyoPVObject. Phase vocoder streaming object 2."""
         return self._input2
     @input2.setter
-    def input2(self, x): self.setInput2(x)
+    def input2(self, x): self.setInput2(x)
\ No newline at end of file
diff --git a/pyolib/players.py b/pyolib/players.py
index 3a1f7a4..9812b89 100644
--- a/pyolib/players.py
+++ b/pyolib/players.py
@@ -1,28 +1,28 @@
 """
 Play soundfiles from the disk.
 
-SfMarkerXXX objects use markers features (store in the header) from 
+SfMarkerXXX objects use markers features (store in the header) from
 an AIFF file to create more specific reading patterns.
 
 """
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU Lesser General Public
+License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
 from _core import *
 from _maps import *
@@ -32,33 +32,33 @@ from types import ListType
 class SfPlayer(PyoObject):
     """
     Soundfile player.
-    
-    Reads audio data from a file using one of several available interpolation 
+
+    Reads audio data from a file using one of several available interpolation
     types. User can alter its pitch with the `speed` attribute. The object
-    takes care of sampling rate conversion to match the Server sampling 
+    takes care of sampling rate conversion to match the Server sampling
     rate setting.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         path : string
             Full path name of the sound to read.
         speed : float or PyoObject, optional
-            Transpose the pitch of input sound by this factor. 
+            Transpose the pitch of input sound by this factor.
             Defaults to 1.
-            
-            1 is the original pitch, lower values play sound slower, and higher 
-            values play sound faster. 
-            
-            Negative values results in playing sound backward. 
-            
+
+            1 is the original pitch, lower values play sound slower, and higher
+            values play sound faster.
+
+            Negative values results in playing sound backward.
+
             Although the `speed` attribute accepts audio
             rate signal, its value is updated only once per buffer size.
         loop : bool, optional
             If set to True, sound will play in loop. Defaults to False.
-        offset : float, optional 
-            Time in seconds of input sound to be skipped, assuming speed = 1. 
+        offset : float, optional
+            Time in seconds of input sound to be skipped, assuming speed = 1.
             Defaults to 0.
         interp : int, optional
             Interpolation type. Defaults to 2.
@@ -68,19 +68,19 @@ class SfPlayer(PyoObject):
                 4. cubic
 
     .. note::
-    
-        SfPlayer will sends a trigger signal at the end of the playback if 
-        loop is off or any time it wraps around if loop is on. User can 
+
+        SfPlayer will sends a trigger signal at the end of the playback if
+        loop is off or any time it wraps around if loop is on. User can
         retrieve the trigger streams by calling obj['trig']:
-        
+
         >>> sf = SfPlayer(SNDS_PATH + "/transparent.aif").out()
         >>> trig = TrigRand(sf['trig'])
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> snd = SNDS_PATH + "/transparent.aif"
     >>> sf = SfPlayer(snd, speed=[.75,.8], loop=True, mul=.3).out()
-    
+
     """
     def __init__(self, path, speed=1, loop=False, offset=0, interp=2, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -104,12 +104,12 @@ class SfPlayer(PyoObject):
     def setPath(self, path):
         """
         Sets a new sound to read.
-        
-        The number of channels of the new sound must match those 
+
+        The number of channels of the new sound must match those
         of the sound loaded at initialization time.
-        
+
         :Args:
-        
+
             path : string
                 Full path of the new sound.
 
@@ -129,7 +129,7 @@ class SfPlayer(PyoObject):
         if _snd_chnls != curNchnls:
             print "Soundfile must contains exactly %d channels." % curNchnls
             return
-    
+
         self._path = path
         path, lmax = convertArgsToLists(path)
         [obj.setSound(wrap(path,i)) for i, obj in enumerate(self._base_players)]
@@ -137,12 +137,12 @@ class SfPlayer(PyoObject):
     def setSound(self, path):
         """
         Sets a new sound to read.
-        
-        The number of channels of the new sound must match those 
+
+        The number of channels of the new sound must match those
         of the sound loaded at initialization time.
-        
+
         :Args:
-        
+
             path : string
                 Full path of the new sound.
 
@@ -152,12 +152,12 @@ class SfPlayer(PyoObject):
     def setSpeed(self, x):
         """
         Replace the `speed` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `speed` attribute.
-        
+
         """
         self._speed = x
         x, lmax = convertArgsToLists(x)
@@ -166,12 +166,12 @@ class SfPlayer(PyoObject):
     def setLoop(self, x):
         """
         Replace the `loop` attribute.
-        
+
         :Args:
 
             x : bool {True, False}
                 new `loop` attribute.
-        
+
         """
         self._loop = x
         x, lmax = convertArgsToLists(x)
@@ -182,12 +182,12 @@ class SfPlayer(PyoObject):
     def setOffset(self, x):
         """
         Replace the `offset` attribute.
-        
+
         :Args:
 
             x : float
                 new `offset` attribute.
-        
+
         """
         self._offset = x
         x, lmax = convertArgsToLists(x)
@@ -196,60 +196,60 @@ class SfPlayer(PyoObject):
     def setInterp(self, x):
         """
         Replace the `interp` attribute.
-        
+
         :Args:
 
             x : int {1, 2, 3, 4}
                 new `interp` attribute.
-        
+
         """
         self._interp = x
         x, lmax = convertArgsToLists(x)
         [obj.setInterp(wrap(x,i)) for i, obj in enumerate(self._base_players)]
 
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMap(-2., 2., 'lin', 'speed', self._speed), 
+        self._map_list = [SLMap(-2., 2., 'lin', 'speed', self._speed),
                           SLMap(1, 4, 'lin', 'interp', self._interp, res="int", dataOnly=True),
                           SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def path(self): 
+    def path(self):
         """string. Full path of the sound."""
         return self._path
     @path.setter
     def path(self, x): self.setPath(x)
-          
+
     @property
-    def sound(self): 
+    def sound(self):
         """string. Alias to the `path` attribute."""
         return self._path
     @sound.setter
     def sound(self, x): self.setPath(x)
-    
+
     @property
-    def speed(self): 
+    def speed(self):
         """float or PyoObject. Transposition factor."""
         return self._speed
     @speed.setter
     def speed(self, x): self.setSpeed(x)
 
     @property
-    def loop(self): 
+    def loop(self):
         """bool. Looping mode."""
         return self._loop
     @loop.setter
     def loop(self, x): self.setLoop(x)
 
     @property
-    def offset(self): 
+    def offset(self):
         """float. Time, in seconds, of the first sample to read."""
         return self._offset
     @offset.setter
     def offset(self, x): self.setOffset(x)
 
     @property
-    def interp(self): 
+    def interp(self):
         """int {1, 2, 3, 4}. Interpolation method."""
         return self._interp
     @interp.setter
@@ -258,33 +258,33 @@ class SfPlayer(PyoObject):
 class SfMarkerShuffler(PyoObject):
     """
     AIFF with markers soundfile shuffler.
-    
-    Reads audio data from a AIFF file using one of several available 
-    interpolation types. User can alter its pitch with the `speed` 
-    attribute. The object takes care of sampling rate conversion to 
-    match the Server sampling rate setting. 
-    
+
+    Reads audio data from a AIFF file using one of several available
+    interpolation types. User can alter its pitch with the `speed`
+    attribute. The object takes care of sampling rate conversion to
+    match the Server sampling rate setting.
+
     The reading pointer randomly choose a marker (from the MARK chunk
-    in the header of the AIFF file) as its starting point and reads 
-    the samples until it reaches the following marker. Then, it choose 
+    in the header of the AIFF file) as its starting point and reads
+    the samples until it reaches the following marker. Then, it choose
     another marker and reads from the new position and so on...
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         path : string
             Full path name of the sound to read. Can't e changed after
             initialization.
         speed : float or PyoObject, optional
-            Transpose the pitch of input sound by this factor. 
+            Transpose the pitch of input sound by this factor.
             Defaults to 1.
-            
-            1 is the original pitch, lower values play sound slower, and higher 
-            values play sound faster. 
-            
-            Negative values results in playing sound backward. 
-            
+
+            1 is the original pitch, lower values play sound slower, and higher
+            values play sound faster.
+
+            Negative values results in playing sound backward.
+
             Although the `speed` attribute accepts audio
             rate signal, its value is updated only once per buffer size.
         interp : int, optional
@@ -297,7 +297,7 @@ class SfMarkerShuffler(PyoObject):
     >>> s = Server().boot()
     >>> s.start()
     >>> sf = SfMarkerShuffler(SNDS_PATH + "/transparent.aif", speed=[1,1], mul=.3).out()
-    
+
     """
     def __init__(self, path, speed=1, interp=2, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -314,7 +314,7 @@ class SfMarkerShuffler(PyoObject):
                 sf.close()
                 self._markers = [m[1] for m in markerstmp]
             except:
-                self._markers = []    
+                self._markers = []
             self._base_players.append(SfMarkerShuffler_base(wrap(path,i), self._markers, wrap(speed,i), wrap(interp,i)))
         for i in range(lmax * self._snd_chnls):
             j = i / self._snd_chnls
@@ -323,12 +323,12 @@ class SfMarkerShuffler(PyoObject):
     def setSpeed(self, x):
         """
         Replace the `speed` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `speed` attribute.
-        
+
         """
         self._speed = x
         x, lmax = convertArgsToLists(x)
@@ -337,12 +337,12 @@ class SfMarkerShuffler(PyoObject):
     def setInterp(self, x):
         """
         Replace the `interp` attribute.
-        
+
         :Args:
 
             x : int {1, 2, 3, 4}
                 new `interp` attribute.
-        
+
         """
         self._interp = x
         x, lmax = convertArgsToLists(x)
@@ -351,25 +351,25 @@ class SfMarkerShuffler(PyoObject):
     def getMarkers(self):
         """
         Returns a list of marker time values in samples.
-        
+
         """
         return self._markers
-        
+
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMap(0.01, 2., 'lin', 'speed', self._speed), 
+        self._map_list = [SLMap(0.01, 2., 'lin', 'speed', self._speed),
                           SLMap(1, 4, 'lin', 'interp', self._interp, res="int", dataOnly=True),
                           SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-                    
+
     @property
-    def speed(self): 
+    def speed(self):
         """float or PyoObject. Transposition factor."""
         return self._speed
     @speed.setter
     def speed(self, x): self.setSpeed(x)
 
     @property
-    def interp(self): 
+    def interp(self):
         """int {1, 2, 3, 4}. Interpolation method."""
         return self._interp
     @interp.setter
@@ -379,13 +379,13 @@ class SfMarkerLooper(PyoObject):
     """
     AIFF with markers soundfile looper.
 
-    Reads audio data from a AIFF file using one of several available 
+    Reads audio data from a AIFF file using one of several available
     interpolation types. User can alter its pitch with the `speed`
-    attribute. The object takes care of sampling rate conversion to 
-    match the Server sampling rate setting. 
-    
+    attribute. The object takes care of sampling rate conversion to
+    match the Server sampling rate setting.
+
     The reading pointer loops a specific marker (from the MARK chunk
-    in the header of the AIFF file) until it received a new integer 
+    in the header of the AIFF file) until it received a new integer
     in the `mark` attribute.
 
     :Parent: :py:class:`PyoObject`
@@ -395,18 +395,18 @@ class SfMarkerLooper(PyoObject):
         path : string
             Full path name of the sound to read.
         speed : float or PyoObject, optional
-            Transpose the pitch of input sound by this factor. 
+            Transpose the pitch of input sound by this factor.
             Defaults to 1.
-            
-            1 is the original pitch, lower values play sound slower, and higher 
-            values play sound faster. 
-            
-            Negative values results in playing sound backward. 
-            
+
+            1 is the original pitch, lower values play sound slower, and higher
+            values play sound faster.
+
+            Negative values results in playing sound backward.
+
             Although the `speed` attribute accepts audio
             rate signal, its value is updated only once per buffer size.
         mark : float or PyoObject, optional
-            Integer denoting the marker to loop, in the range 
+            Integer denoting the marker to loop, in the range
             0 -> len(getMarkers()). Defaults to 0.
         interp : int, optional
             Choice of the interpolation method. Defaults to 2.
@@ -438,7 +438,7 @@ class SfMarkerLooper(PyoObject):
                 sf.close()
                 self._markers = [m[1] for m in markerstmp]
             except:
-                self._markers = []    
+                self._markers = []
             self._base_players.append(SfMarkerLooper_base(wrap(path,i), self._markers, wrap(speed,i), wrap(mark,i), wrap(interp,i)))
         for i in range(lmax * self._snd_chnls):
             j = i / self._snd_chnls
@@ -494,29 +494,29 @@ class SfMarkerLooper(PyoObject):
         return self._markers
 
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMap(0.01, 2., 'lin', 'speed', self._speed), 
+        self._map_list = [SLMap(0.01, 2., 'lin', 'speed', self._speed),
                           SLMap(0, len(self._markers)-1, 'lin', 'mark', self._mark, 'int'),
                           SLMap(1, 4, 'lin', 'interp', self._interp, res="int", dataOnly=True),
                           SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def speed(self): 
+    def speed(self):
         """float or PyoObject. Transposition factor."""
         return self._speed
     @speed.setter
     def speed(self, x): self.setSpeed(x)
 
     @property
-    def mark(self): 
+    def mark(self):
         """float or PyoObject. Marker to loop."""
         return self._marker
     @mark.setter
     def mark(self, x): self.setMark(x)
 
     @property
-    def interp(self): 
+    def interp(self):
         """int {1, 2, 3, 4}. Interpolation method."""
         return self._interp
     @interp.setter
-    def interp(self, x): self.setInterp(x)
+    def interp(self, x): self.setInterp(x)
\ No newline at end of file
diff --git a/pyolib/randoms.py b/pyolib/randoms.py
index 737a0e6..0b79845 100644
--- a/pyolib/randoms.py
+++ b/pyolib/randoms.py
@@ -3,23 +3,23 @@ Set of objects that implement different kinds of random noise generators.
 
 """
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+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 sys
 from _core import *
@@ -29,11 +29,11 @@ from types import StringType, ListType
 class Randi(PyoObject):
     """
     Periodic pseudo-random generator with interpolation.
-    
-    Randi generates a pseudo-random number between `min` and `max` 
-    values at a frequency specified by `freq` parameter. Randi will 
+
+    Randi generates a pseudo-random number between `min` and `max`
+    values at a frequency specified by `freq` parameter. Randi will
     produce straight-line interpolation between current number and the next.
-    
+
     :Parent: :py:class:`PyoObject`
 
     :Args:
@@ -44,13 +44,13 @@ class Randi(PyoObject):
             Maximum value for the random generation. Defaults to 1.
         freq : float or PyoObject, optional
             Polling frequency. Defaults to 1.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> freq = Randi(500, 3000, 4)
     >>> noze = Noise().mix(2)
     >>> a = Biquad(noze, freq=freq, q=5, type=2, mul=.5).out()
-   
+
     """
     def __init__(self, min=0., max=1., freq=1., mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -63,12 +63,12 @@ class Randi(PyoObject):
     def setMin(self, x):
         """
         Replace the `min` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `min` attribute.
-        
+
         """
         self._min = x
         x, lmax = convertArgsToLists(x)
@@ -77,12 +77,12 @@ class Randi(PyoObject):
     def setMax(self, x):
         """
         Replace the `max` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `max` attribute.
-        
+
         """
         self._max = x
         x, lmax = convertArgsToLists(x)
@@ -91,12 +91,12 @@ class Randi(PyoObject):
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `freq` attribute.
-        
+
         """
         self._port = x
         x, lmax = convertArgsToLists(x)
@@ -110,35 +110,35 @@ class Randi(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def min(self): 
+    def min(self):
         """float or PyoObject. Minimum value."""
         return self._min
     @min.setter
-    def min(self, x): 
+    def min(self, x):
         self.setMin(x)
     @property
-    def max(self): 
+    def max(self):
         """float or PyoObject. Maximum value."""
         return self._max
     @max.setter
-    def max(self, x): 
+    def max(self, x):
         self.setMax(x)
     @property
-    def freq(self): 
+    def freq(self):
         """float or PyoObject. Polling frequency."""
         return self._freq
     @freq.setter
-    def freq(self, x): 
+    def freq(self, x):
         self.setFreq(x)
 
 class Randh(PyoObject):
     """
     Periodic pseudo-random generator.
-    
-    Randh generates a pseudo-random number between `min` and `max` 
-    values at a frequency specified by `freq` parameter. Randh will 
+
+    Randh generates a pseudo-random number between `min` and `max`
+    values at a frequency specified by `freq` parameter. Randh will
     hold generated value until next generation.
-    
+
     :Parent: :py:class:`PyoObject`
 
     :Args:
@@ -149,13 +149,13 @@ class Randh(PyoObject):
             Maximum value for the random generation. Defaults to 1.
         freq : float or PyoObject, optional
             Polling frequency. Defaults to 1.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> freq = Randh(500, 3000, 4)
     >>> noze = Noise().mix(2)
     >>> a = Biquad(noze, freq=freq, q=5, type=2, mul=.5).out()
-    
+
     """
     def __init__(self, min=0., max=1., freq=1., mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -168,12 +168,12 @@ class Randh(PyoObject):
     def setMin(self, x):
         """
         Replace the `min` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `min` attribute.
-        
+
         """
         self._min = x
         x, lmax = convertArgsToLists(x)
@@ -182,12 +182,12 @@ class Randh(PyoObject):
     def setMax(self, x):
         """
         Replace the `max` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `max` attribute.
-        
+
         """
         self._max = x
         x, lmax = convertArgsToLists(x)
@@ -196,12 +196,12 @@ class Randh(PyoObject):
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `freq` attribute.
-        
+
         """
         self._port = x
         x, lmax = convertArgsToLists(x)
@@ -215,35 +215,35 @@ class Randh(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def min(self): 
+    def min(self):
         """float or PyoObject. Minimum value."""
         return self._min
     @min.setter
-    def min(self, x): 
+    def min(self, x):
         self.setMin(x)
     @property
-    def max(self): 
+    def max(self):
         """float or PyoObject. Maximum value."""
         return self._max
     @max.setter
-    def max(self, x): 
+    def max(self, x):
         self.setMax(x)
     @property
-    def freq(self): 
+    def freq(self):
         """float or PyoObject. Polling frequency."""
         return self._freq
     @freq.setter
-    def freq(self, x): 
+    def freq(self, x):
         self.setFreq(x)
 
 class Choice(PyoObject):
     """
     Periodically choose a new value from a user list.
-    
+
     Choice chooses a new value from a predefined list of floats `choice`
-    at a frequency specified by `freq` parameter. Choice will 
+    at a frequency specified by `freq` parameter. Choice will
     hold choosen value until next generation.
-    
+
     :Parent: :py:class:`PyoObject`
 
     :Args:
@@ -258,7 +258,7 @@ class Choice(PyoObject):
     >>> freqs = midiToHz([60,62,64,65,67,69,71,72])
     >>> rnd = Choice(choice=freqs, freq=[3,4])
     >>> a = SineLoop(rnd, feedback=0.05, mul=.2).out()
-    
+
     """
     def __init__(self, choice, freq=1., mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -274,32 +274,32 @@ class Choice(PyoObject):
             choicelen = len(choice)
             lmax = max(choicelen, lmax)
             self._base_objs = [Choice_base(wrap(choice,i), wrap(freq,i), wrap(mul,i), wrap(add,i)) for i in range(lmax)]
-            
+
     def setChoice(self, x):
         """
         Replace the `choice` attribute.
-        
+
         :Args:
 
             x : list of floats or list of lists of floats
                 new `choice` attribute.
-        
+
         """
         self._choice = x
         if type(x[0]) != ListType:
             [obj.setChoice(self._choice) for i, obj in enumerate(self._base_objs)]
         else:
             [obj.setChoice(wrap(self._choice,i)) for i, obj in enumerate(self._base_objs)]
-                
+
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `freq` attribute.
-        
+
         """
         self._freq = x
         x, lmax = convertArgsToLists(x)
@@ -310,28 +310,28 @@ class Choice(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def choice(self): 
+    def choice(self):
         """list of floats or list of lists of floats. Possible choices."""
         return self._choice
     @choice.setter
-    def choice(self, x): 
+    def choice(self, x):
         self.setChoice(x)
     @property
-    def freq(self): 
+    def freq(self):
         """float or PyoObject. Polling frequency."""
         return self._freq
     @freq.setter
-    def freq(self, x): 
+    def freq(self, x):
         self.setFreq(x)
 
 class RandInt(PyoObject):
     """
     Periodic pseudo-random integer generator.
-    
-    RandInt generates a pseudo-random integer number between 0 and `max` 
-    values at a frequency specified by `freq` parameter. RandInt will 
+
+    RandInt generates a pseudo-random integer number between 0 and `max`
+    values at a frequency specified by `freq` parameter. RandInt will
     hold generated value until the next generation.
-    
+
     :Parent: :py:class:`PyoObject`
 
     :Args:
@@ -346,7 +346,7 @@ class RandInt(PyoObject):
     >>> freq = RandInt(max=10, freq=5, mul=100, add=500)
     >>> jit = Randi(min=0.99, max=1.01, freq=[2.33,3.41])
     >>> a = SineLoop(freq*jit, feedback=0.03, mul=.2).out()
-    
+
     """
     def __init__(self, max=100, freq=1., mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -358,12 +358,12 @@ class RandInt(PyoObject):
     def setMax(self, x):
         """
         Replace the `max` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `max` attribute.
-        
+
         """
         self._max = x
         x, lmax = convertArgsToLists(x)
@@ -372,12 +372,12 @@ class RandInt(PyoObject):
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `freq` attribute.
-        
+
         """
         self._freq = x
         x, lmax = convertArgsToLists(x)
@@ -390,26 +390,26 @@ class RandInt(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def max(self): 
+    def max(self):
         """float or PyoObject. Maximum value."""
         return self._max
     @max.setter
-    def max(self, x): 
+    def max(self, x):
         self.setMax(x)
     @property
-    def freq(self): 
+    def freq(self):
         """float or PyoObject. Polling frequency."""
         return self._freq
     @freq.setter
-    def freq(self, x): 
+    def freq(self, x):
         self.setFreq(x)
 
 class RandDur(PyoObject):
     """
     Recursive time varying pseudo-random generator.
 
-    RandDur generates a pseudo-random number between `min` and `max` 
-    arguments and uses that number to set the delay time before the next 
+    RandDur generates a pseudo-random number between `min` and `max`
+    arguments and uses that number to set the delay time before the next
     generation. RandDur will hold the generated value until next generation.
 
     :Parent: :py:class:`PyoObject`
@@ -473,18 +473,18 @@ class RandDur(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def min(self): 
+    def min(self):
         """float or PyoObject. Minimum value."""
         return self._min
     @min.setter
-    def min(self, x): 
+    def min(self, x):
         self.setMin(x)
     @property
-    def max(self): 
+    def max(self):
         """float or PyoObject. Maximum value."""
         return self._max
     @max.setter
-    def max(self, x): 
+    def max(self, x):
         self.setMax(x)
 
 class Xnoise(PyoObject):
@@ -506,9 +506,9 @@ class Xnoise(PyoObject):
             First parameter. Defaults to 0.5.
         x2 : float or PyoObject, optional
             Second parameter. Defaults to 0.5.
-    
+
     .. note::
-    
+
         Available distributions are:
             0. uniform
             1. linear minimum
@@ -523,7 +523,7 @@ class Xnoise(PyoObject):
             10. poisson
             11. walker (drunk)
             12. loopseg (drunk with looped segments)
-            
+
         Depending on the distribution, `x1` and `x2` parameters are applied
         as follow (names as string, or associated number can be used as `dist`
         parameter):
@@ -564,7 +564,7 @@ class Xnoise(PyoObject):
             11. walker
                  - x1 : maximum value {0.1 -> 1}
                  - x2 : maximum step {0.1 -> 1}
-            12. loopseg 
+            12. loopseg
                  - x1 : maximum value {0.1 -> 1}
                  - x2 : maximum step {0.1 -> 1}
 
@@ -655,32 +655,32 @@ class Xnoise(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def dist(self): 
+    def dist(self):
         """string or int. Distribution type."""
         return self._dist
     @dist.setter
-    def dist(self, x): 
+    def dist(self, x):
         self.setDist(x)
     @property
-    def freq(self): 
+    def freq(self):
         """float or PyoObject. Polling frequency."""
         return self._freq
     @freq.setter
-    def freq(self, x): 
+    def freq(self, x):
         self.setFreq(x)
     @property
-    def x1(self): 
+    def x1(self):
         """float or PyoObject. First parameter."""
         return self._x1
     @x1.setter
-    def x1(self, x): 
+    def x1(self, x):
         self.setX1(x)
     @property
-    def x2(self): 
+    def x2(self):
         """float or PyoObject. Second parameter."""
         return self._x2
     @x2.setter
-    def x2(self, x): 
+    def x2(self, x):
         self.setX2(x)
 
 class XnoiseMidi(PyoObject):
@@ -689,8 +689,8 @@ class XnoiseMidi(PyoObject):
 
     XnoiseMidi implements a few of the most common noise distributions.
     Each distribution generates integer values in the range defined with
-    `mrange` parameter and output can be scaled on midi notes, hertz or 
-    transposition factor. 
+    `mrange` parameter and output can be scaled on midi notes, hertz or
+    transposition factor.
 
     :Parent: :py:class:`PyoObject`
 
@@ -705,16 +705,16 @@ class XnoiseMidi(PyoObject):
         x2 : float or PyoObject, optional
             Second parameter. Defaults to 0.5.
         scale : int {0, 1, 2}, optional
-            Output format. 0 = Midi, 1 = Hertz, 2 = transposition factor. 
-            In the transposition mode, the central key (the key where there 
+            Output format. 0 = Midi, 1 = Hertz, 2 = transposition factor.
+            In the transposition mode, the central key (the key where there
             is no transposition) is (`minrange` + `maxrange`) / 2. Defaults
             to 0.
         mrange : tuple of int, optional
             Minimum and maximum possible values, in Midi notes. Available
             only at initialization time. Defaults to (0, 127).
-    
+
     .. note::
-    
+
         Available distributions are:
             0. uniform
             1. linear minimum
@@ -729,7 +729,7 @@ class XnoiseMidi(PyoObject):
             10. poisson
             11. walker (drunk)
             12. loopseg (drunk with looped segments)
-            
+
         Depending on the distribution, `x1` and `x2` parameters are applied
         as follow (names as string, or associated number can be used as `dist`
         parameter):
@@ -770,7 +770,7 @@ class XnoiseMidi(PyoObject):
             11. walker
                  - x1 : maximum value {0.1 -> 1}
                  - x2 : maximum step {0.1 -> 1}
-            12. loopseg 
+            12. loopseg
                  - x1 : maximum value {0.1 -> 1}
                  - x2 : maximum step {0.1 -> 1}
 
@@ -815,8 +815,8 @@ class XnoiseMidi(PyoObject):
     def setScale(self, x):
         """
         Replace the `scale` attribute.
-        
-        Possible values are: 
+
+        Possible values are:
             0. Midi notes
             1. Hertz
             2. transposition factor (centralkey is (`minrange` + `maxrange`) / 2
@@ -898,39 +898,39 @@ class XnoiseMidi(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def dist(self): 
+    def dist(self):
         """string or int. Distribution type."""
         return self._dist
     @dist.setter
-    def dist(self, x): 
+    def dist(self, x):
         self.setDist(x)
     @property
-    def freq(self): 
+    def freq(self):
         """float or PyoObject. Polling frequency."""
         return self._freq
     @freq.setter
-    def freq(self, x): 
+    def freq(self, x):
         self.setFreq(x)
     @property
-    def x1(self): 
+    def x1(self):
         """float or PyoObject. First parameter."""
         return self._x1
     @x1.setter
-    def x1(self, x): 
+    def x1(self, x):
         self.setX1(x)
     @property
-    def x2(self): 
+    def x2(self):
         """float or PyoObject. Second parameter."""
         return self._x2
     @x2.setter
-    def x2(self, x): 
+    def x2(self, x):
         self.setX2(x)
     @property
-    def scale(self): 
+    def scale(self):
         """int. Output format."""
         return self._scale
     @scale.setter
-    def scale(self, x): 
+    def scale(self, x):
         self.setScale(x)
 
 class XnoiseDur(PyoObject):
@@ -939,8 +939,8 @@ class XnoiseDur(PyoObject):
 
     Xnoise implements a few of the most common noise distributions.
     Each distribution generates values in the range 0 to 1, which are
-    then rescaled between `min` and `max` arguments. The object uses 
-    the generated value to set the delay time before the next generation. 
+    then rescaled between `min` and `max` arguments. The object uses
+    the generated value to set the delay time before the next generation.
     XnoiseDur will hold the value until next generation.
 
     :Parent: :py:class:`PyoObject`
@@ -975,7 +975,7 @@ class XnoiseDur(PyoObject):
             10. poisson
             11. walker (drunk)
             12. loopseg (drunk with looped segments)
-            
+
         Depending on the distribution, `x1` and `x2` parameters are applied
         as follow (names as string, or associated number can be used as `dist`
         parameter):
@@ -1016,7 +1016,7 @@ class XnoiseDur(PyoObject):
             11. walker
                  - x1 : maximum value {0.1 -> 1}
                  - x2 : maximum step {0.1 -> 1}
-            12. loopseg 
+            12. loopseg
                  - x1 : maximum value {0.1 -> 1}
                  - x2 : maximum step {0.1 -> 1}
 
@@ -1123,52 +1123,52 @@ class XnoiseDur(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def dist(self): 
+    def dist(self):
         """string or int. Distribution type."""
         return self._dist
     @dist.setter
-    def dist(self, x): 
+    def dist(self, x):
         self.setDist(x)
     @property
-    def min(self): 
+    def min(self):
         """float or PyoObject. Minimum value."""
         return self._min
     @min.setter
-    def min(self, x): 
+    def min(self, x):
         self.setMin(x)
     @property
-    def max(self): 
+    def max(self):
         """float or PyoObject. Maximum value."""
         return self._max
     @max.setter
-    def max(self, x): 
+    def max(self, x):
         self.setMax(x)
     @property
-    def x1(self): 
+    def x1(self):
         """float or PyoObject. First parameter."""
         return self._x1
     @x1.setter
-    def x1(self, x): 
+    def x1(self, x):
         self.setX1(x)
     @property
-    def x2(self): 
+    def x2(self):
         """float or PyoObject. Second parameter."""
         return self._x2
     @x2.setter
-    def x2(self, x): 
+    def x2(self, x):
         self.setX2(x)
 
 class Urn(PyoObject):
     """
     Periodic pseudo-random integer generator without duplicates.
 
-    Urn generates a pseudo-random integer number between 0 and `max` 
-    values at a frequency specified by `freq` parameter. Urn will 
-    hold generated value until the next generation. Urn works like RandInt, 
+    Urn generates a pseudo-random integer number between 0 and `max`
+    values at a frequency specified by `freq` parameter. Urn will
+    hold generated value until the next generation. Urn works like RandInt,
     except that it keeps track of each number which has been generated. After
     all numbers have been outputed, the pool is reseted and the object send
     a trigger signal.
-    
+
     :Parent: :py:class:`PyoObject`
 
     :Args:
@@ -1180,9 +1180,9 @@ class Urn(PyoObject):
 
     .. note::
 
-        Urn will sends a trigger signal when the pool is empty. 
-        User can retreive the trigger streams by calling obj['trig']. 
-        Useful to synchronize other processes. 
+        Urn will sends a trigger signal when the pool is empty.
+        User can retreive the trigger streams by calling obj['trig'].
+        Useful to synchronize other processes.
 
     >>> s = Server().boot()
     >>> s.start()
@@ -1191,7 +1191,7 @@ class Urn(PyoObject):
     >>> sigL = SineLoop(freq=fr, feedback=.08, mul=0.3).out()
     >>> amp = TrigExpseg(mid["trig"], [(0,0),(.01,.25),(1,0)])
     >>> sigR = SineLoop(midiToHz(84), feedback=0.05, mul=amp).out(1)
-    
+
     """
     def __init__(self, max=100, freq=1., mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -1207,12 +1207,12 @@ class Urn(PyoObject):
     def setMax(self, x):
         """
         Replace the `max` attribute.
-        
+
         :Args:
 
             x : int
                 new `max` attribute.
-        
+
         """
         self._max = x
         x, lmax = convertArgsToLists(x)
@@ -1221,12 +1221,12 @@ class Urn(PyoObject):
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `freq` attribute.
-        
+
         """
         self._freq = x
         x, lmax = convertArgsToLists(x)
@@ -1239,16 +1239,16 @@ class Urn(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def max(self): 
+    def max(self):
         """int. Maximum value."""
         return self._max
     @max.setter
-    def max(self, x): 
+    def max(self, x):
         self.setMax(x)
     @property
-    def freq(self): 
+    def freq(self):
         """float or PyoObject. Polling frequency."""
         return self._freq
     @freq.setter
-    def freq(self, x): 
-        self.setFreq(x)
+    def freq(self, x):
+        self.setFreq(x)
\ No newline at end of file
diff --git a/pyolib/server.py b/pyolib/server.py
index 7c1f134..148da73 100644
--- a/pyolib/server.py
+++ b/pyolib/server.py
@@ -1,76 +1,79 @@
 # -*- coding: utf-8 -*-
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+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
 from _core import *
 from _widgets import createServerGUI
-        
+
 ######################################################################
 ### Proxy of Server object
 ######################################################################
 class Server(object):
     """
     Main processing audio loop callback handler.
-    
-    The Server object handles all communications with Portaudio and 
+
+    The Server object handles all communications with Portaudio and
     Portmidi. It keeps track of all audio streams created as well as
-    connections between them. 
-    
-    An instance of the Server must be booted before defining any 
+    connections between them.
+
+    An instance of the Server must be booted before defining any
     signal processing chain.
 
     :Args:
 
         sr : int, optional
-            Sampling rate used by Portaudio and the Server to compute samples. 
+            Sampling rate used by Portaudio and the Server to compute samples.
             Defaults to 44100.
         nchnls : int, optional
-            Number of input and output channels. Defaults to 2.
+            Number of output channels. The number of input channels will be the
+            same if `ichnls` argument is not defined. Defaults to 2.
         buffersize : int, optional
-            Number of samples that Portaudio will request from the callback loop. 
+            Number of samples that Portaudio will request from the callback loop.
             Defaults to 256.
 
-            This value has an impact on CPU use (a small buffer size is harder 
-            to compute) and on the latency of the system. 
-            
-            Latency is `buffer size / sampling rate` in seconds. 
+            This value has an impact on CPU use (a small buffer size is harder
+            to compute) and on the latency of the system.
+
+            Latency is `buffer size / sampling rate` in seconds.
         duplex : int {0, 1}, optional
-            Input - output mode. 0 is output only and 1 is both ways. 
+            Input - output mode. 0 is output only and 1 is both ways.
             Defaults to 1.
         audio : string {'portaudio', 'pa', 'jack', 'coreaudio', 'offline', 'offline_nb}, optional
             Audio backend to use. 'pa' is equivalent to 'portaudio'. Default is 'portaudio'.
-            
-            'offline' save the audio output in a soundfile as fast as possible in blocking mode, 
+
+            'offline' save the audio output in a soundfile as fast as possible in blocking mode,
 
             ie. the main program doesn't respond until the end of the computation.
-            
-            'offline_nb' save the audio output in a soundfile as fast as possible in non-blocking 
-            mode, 
-            
+
+            'offline_nb' save the audio output in a soundfile as fast as possible in non-blocking
+            mode,
+
             ie. the computation is executed in a separated thread, allowing the program to
-            respond while the computation goes on. 
+            respond while the computation goes on.
 
-            It is the responsibility of the user to make sure that the program doesn't exit before 
+            It is the responsibility of the user to make sure that the program doesn't exit before
             the computation is done.
         jackname : string, optional
             Name of jack client. Defaults to 'pyo'
+        ichnls : int, optional
+            Number of input channels if different of output channels. If None (default), ichnls = nchnls.
 
     .. note::
 
@@ -86,7 +89,8 @@ class Server(object):
         - setMidiOutputDevice(x) : Set the MIDI output device number. See `pm_list_devices()`.
         - setSamplingRate(x) : Set the sampling rate used by the server.
         - setBufferSize(x) : Set the buffer size used by the server.
-        - setNchnls(x) : Set the number of channels used by the server.
+        - setNchnls(x) : Set the number of output (and input if `ichnls` = None) channels used by the server.
+        - setIchnls(x) : Set the number of input channels (if different of output channels) used by the server.
         - setDuplex(x) : Set the duplex mode used by the server.
         - setVerbosity(x) : Set the server's verbosity.
         - reinit(sr, nchnls, buffersize, duplex, audio, jackname) : Reinit the server's settings.
@@ -95,13 +99,18 @@ class Server(object):
     >>> # a sampling rate of 48000 Hz and buffer size of 512
     >>> s = Server(sr=48000, nchnls=8, buffersize=512, duplex=1).boot()
     >>> s.start()
-        
+
     """
-    def __init__(self, sr=44100, nchnls=2, buffersize=256, duplex=1, audio='portaudio', jackname='pyo'):
+    def __init__(self, sr=44100, nchnls=2, buffersize=256, duplex=1,
+                 audio='portaudio', jackname='pyo', ichnls=None):
         if os.environ.has_key("PYO_SERVER_AUDIO") and "offline" not in audio and "embedded" not in audio:
             audio = os.environ["PYO_SERVER_AUDIO"]
         self._time = time
         self._nchnls = nchnls
+        if ichnls == None:
+            self._ichnls = nchnls
+        else:
+            self._ichnls = ichnls
         self._amp = 1.
         self._verbosity = 7
         self._startoffset = 0
@@ -109,10 +118,12 @@ class Server(object):
         self._filename = None
         self._fileformat = 0
         self._sampletype = 0
-        self._server = Server_base(sr, nchnls, buffersize, duplex, audio, jackname)
+        self._server = Server_base(sr, nchnls, buffersize, duplex, audio, jackname, self._ichnls)
         self._server._setDefaultRecPath(os.path.join(os.path.expanduser("~"), "pyo_rec.wav"))
 
     def __del__(self):
+        self.setTime = None
+        self.setRms = None
         if self.getIsBooted():
             if self.getIsStarted():
                 self.stop()
@@ -120,16 +131,21 @@ class Server(object):
             self.shutdown()
             self._time.sleep(.25)
 
-    def reinit(self, sr=44100, nchnls=2, buffersize=256, duplex=1, audio='portaudio', jackname='pyo'):
+    def reinit(self, sr=44100, nchnls=2, buffersize=256, duplex=1,
+               audio='portaudio', jackname='pyo', ichnls=None):
         """
         Reinit the server'settings. Useful to alternate between real-time and offline server.
-        
+
         :Args:
-        
+
             Same as in the __init__ method.
-        
+
         """
         self._nchnls = nchnls
+        if ichnls == None:
+            self._ichnls = nchnls
+        else:
+            self._ichnls = ichnls
         self._amp = 1.
         self._verbosity = 7
         self._startoffset = 0
@@ -138,19 +154,19 @@ class Server(object):
         self._fileformat = 0
         self._sampletype = 0
         self._globalseed = 0
-        self._server.__init__(sr, nchnls, buffersize, duplex, audio, jackname)
+        self._server.__init__(sr, nchnls, buffersize, duplex, audio, jackname, self._ichnls)
 
     def gui(self, locals=None, meter=True, timer=True, exit=True):
         """
         Show the server's user interface.
-        
+
         :Args:
-        
+
             locals : locals namespace {locals(), None}, optional
                 If locals() is given, the interface will show an interpreter extension,
                 giving a way to interact with the running script. Defaults to None.
             meter : boolean, optinal
-                If True, the interface will show a vumeter of the global output signal. 
+                If True, the interface will show a vumeter of the global output signal.
                 Defaults to True.
             timer : boolean, optional
                 If True, the interface will show a clock of the current time.
@@ -159,7 +175,7 @@ class Server(object):
                 If True, the python interpreter will exit when the 'Quit' button is pressed,
                 Otherwise, the GUI will be closed leaving the interpreter alive.
                 Defaults to True.
-            
+
         """
         f, win = createServerGUI(self._nchnls, self.start, self.stop, self.recstart, self.recstop,
                                  self.setAmp, self.getIsStarted(), locals, self.shutdown, meter, timer, self._amp, exit)
@@ -174,16 +190,55 @@ class Server(object):
                 win.MainLoop()
 
     def setTimeCallable(self, func):
+        """
+        Set a function callback that will receive the current time as argument.
+        
+        The function will receive four integers in this format:
+                hours, minutes, seconds, milliseconds
+
+        :Args:
+            
+            func : python callable
+                Python function or method to call with current time as argument.
+
+        """
         self.setTime = func
         self._server.setTimeCallable(self)
 
+    def setMeterCallable(self, func):
+        """
+        Set a function callback that will receive the current rms values as argument.
+        
+        The function will receive a list containing the rms value for each audio channel.
+
+        :Args:
+            
+            func : python callable
+                Python function or method to call with current rms values as argument.
+
+        """
+        self.setRms = func
+        self._server.setAmpCallable(self)
+
     def setMeter(self, meter):
-        self._server.setAmpCallable(meter)
+        """
+        Registers a meter object to the server.
         
+        The object must have a method named `setRms`. This method will be called
+        with the rms values of each audio channel as argument.
+
+        :Args:
+            
+            meter : python object
+                Python object with a `setRms` method.
+
+        """
+        self._server.setAmpCallable(meter)
+
     def setInOutDevice(self, x):
         """
         Set both input and output audio devices. See `pa_list_devices()`.
-        
+
         :Args:
 
             x : int
@@ -191,11 +246,11 @@ class Server(object):
 
         """
         self._server.setInOutDevice(x)
-        
+
     def setInputDevice(self, x):
         """
         Set the audio input device number. See `pa_list_devices()`.
-        
+
         :Args:
 
             x : int
@@ -207,7 +262,7 @@ class Server(object):
     def setOutputDevice(self, x):
         """
         Set the audio output device number. See `pa_list_devices()`.
-        
+
         :Args:
 
             x : int
@@ -219,11 +274,11 @@ class Server(object):
     def setInputOffset(self, x):
         """
         Set the first physical input channel.
-        
+
         Channel number `x` from the soundcard will be assigned to
         server's channel one, channel number `x` + 1 to server's
-        channel two and so on. 
-        
+        channel two and so on.
+
         :Args:
 
             x : int
@@ -236,10 +291,10 @@ class Server(object):
         """
         Set the first physical output channel.
 
-        Server's channel one will be assigned to soundcard's channel 
+        Server's channel one will be assigned to soundcard's channel
         number `x`, server's channel two will be assigned to soundcard's
-        channel number `x` + 1 and so on. 
-        
+        channel number `x` + 1 and so on.
+
         :Args:
 
             x : int
@@ -267,10 +322,10 @@ class Server(object):
     def setMidiInputDevice(self, x):
         """
         Set the Midi input device number. See `pm_list_devices()`.
-        
+
         A number greater than the highest portmidi device index
-        will opened all available input devices. 
-        
+        will opened all available input devices.
+
         :Args:
 
             x : int
@@ -282,7 +337,7 @@ class Server(object):
     def setMidiOutputDevice(self, x):
         """
         Set the Midi output device number. See `pm_list_devices()`.
-        
+
         :Args:
 
             x : int
@@ -290,35 +345,35 @@ class Server(object):
 
         """
         self._server.setMidiOutputDevice(x)
- 
+
     def setSamplingRate(self, x):
         """
         Set the sampling rate used by the server.
-        
+
         :Args:
 
             x : int
                 New sampling rate, must be supported by the soundcard.
 
-        """  
+        """
         self._server.setSamplingRate(x)
-        
+
     def setBufferSize(self, x):
         """
         Set the buffer size used by the server.
-        
+
         :Args:
 
             x : int
                 New buffer size.
 
-        """        
+        """
         self._server.setBufferSize(x)
-  
+
     def setNchnls(self, x):
         """
-        Set the number of channels used by the server.
-        
+        Set the number of output (and input if `ichnls` = None) channels used by the server.
+
         :Args:
 
             x : int
@@ -328,28 +383,41 @@ class Server(object):
         self._nchnls = x
         self._server.setNchnls(x)
 
+    def setIchnls(self, x):
+        """
+        Set the number of input channels (if different of output channels) used by the server.
+
+        :Args:
+
+            x : int
+                New number of input channels.
+
+        """
+        self._ichnls = x
+        self._server.setIchnls(x)
+
     def setDuplex(self, x):
         """
         Set the duplex mode used by the server.
-        
+
         :Args:
 
             x : int {0 or 1}
                 New mode. 0 is output only, 1 is both ways.
 
-        """        
+        """
         self._server.setDuplex(x)
 
     def setVerbosity(self, x):
         """
         Set the server's verbosity.
-        
+
         :Args:
 
             x : int
-                A sum of values to display different levels: 
+                A sum of values to display different levels:
                     - 1 = error
-                    - 2 = message 
+                    - 2 = message
                     - 4 = warning
                     - 8 = debug
 
@@ -360,7 +428,7 @@ class Server(object):
     def setJackAuto(self, xin=True, xout=True):
         """
         Tells the server to auto-connect (or not) Jack ports to System ports.
-        
+
         :Args:
 
             xin : boolean
@@ -368,13 +436,13 @@ class Server(object):
             xout : boolean
                 Output Auto-connection switch. True is enabled (default) and False is disabled.
 
-        """        
+        """
         self._server.setJackAuto(xin, xout)
 
     def setJackAutoConnectInputPorts(self, ports):
         """
         Tells the server to auto-connect Jack input ports to pre-defined Jack ports.
-        
+
         :Args:
 
             ports : string or list of strings
@@ -387,7 +455,7 @@ class Server(object):
     def setJackAutoConnectOutputPorts(self, ports):
         """
         Tells the server to auto-connect Jack output ports to pre-defined Jack ports.
-        
+
         :Args:
 
             ports : string or list of strings
@@ -396,7 +464,7 @@ class Server(object):
         """
         ports, lmax = convertArgsToLists(ports)
         self._server.setJackAutoConnectOutputPorts(ports)
-        
+
     def setGlobalSeed(self, x):
         """
         Set the server's global seed used by random objects.
@@ -408,7 +476,7 @@ class Server(object):
 
                 If zero, randoms will be seeded with the system clock current value.
 
-        """        
+        """
         self._globalseed = x
         self._server.setGlobalSeed(x)
 
@@ -421,15 +489,15 @@ class Server(object):
 
             x : float
                 Starting time of the real-time processing.
-            
-        """        
+
+        """
         self._startoffset = x
         self._server.setStartOffset(x)
 
     def setAmp(self, x):
         """
         Set the overall amplitude.
-        
+
         :Args:
 
             x : float
@@ -438,50 +506,50 @@ class Server(object):
         """
         self._amp = x
         self._server.setAmp(x)
- 
+
     def shutdown(self):
         """
         Shut down and clear the server. This method will erase all objects
-        from the callback loop. This method need to be called before changing 
+        from the callback loop. This method need to be called before changing
         server's parameters like `samplingrate`, `buffersize`, `nchnls`, ...
 
         """
         self._server.shutdown()
-        
+
     def boot(self, newBuffer=True):
         """
-        Boot the server. Must be called before defining any signal processing 
-        chain. Server's parameters like `samplingrate`, `buffersize` or 
-        `nchnls` will be effective after a call to this method. 
-        
+        Boot the server. Must be called before defining any signal processing
+        chain. Server's parameters like `samplingrate`, `buffersize` or
+        `nchnls` will be effective after a call to this method.
+
         :Args:
-            
+
             newBuffer : bool
-                Specify if the buffers need to be allocated or not. Useful to limit 
-                the allocation of new buffers when the buffer size hasn't change. 
-                
-                Therefore, this is useful to limit calls to the Python interpreter 
-                to get the buffers addresses when using Pyo inside a 
-                C/C++ application with the embedded server. 
-                
+                Specify if the buffers need to be allocated or not. Useful to limit
+                the allocation of new buffers when the buffer size hasn't change.
+
+                Therefore, this is useful to limit calls to the Python interpreter
+                to get the buffers addresses when using Pyo inside a
+                C/C++ application with the embedded server.
+
                 Defaults to True.
 
         """
         self._server.boot(newBuffer)
         return self
-        
+
     def start(self):
         """
         Start the audio callback loop and begin processing.
-        
+
         """
         self._server.start()
         return self
-    
+
     def stop(self):
         """
         Stop the audio callback loop.
-        
+
         """
         self._server.stop()
 
@@ -500,8 +568,8 @@ class Server(object):
                 Defaults to None.
             fileformat : int, optional
                 Format type of the audio file. This function will first try to
-                set the format from the filename extension. 
-                
+                set the format from the filename extension.
+
                 If it's not possible, it uses the fileformat parameter. Supported formats are:
                     0. WAV - Microsoft WAV format (little endian) {.wav, .wave} (default)
                     1. AIFF - Apple/SGI AIFF format (big endian) {.aif, .aiff}
@@ -512,8 +580,8 @@ class Server(object):
                     6. CAF - Core Audio File format {.caf}
                     7. OGG - Xiph OGG container {.ogg}
             sampletype : int, optional
-                Bit depth encoding of the audio file. 
-                
+                Bit depth encoding of the audio file.
+
                 SD2 and FLAC only support 16 or 24 bit int. Supported types are:
                     0. 16 bits int (default)
                     1. 24 bits int
@@ -524,7 +592,7 @@ class Server(object):
                     6. A-Law encoded
 
         """
-        
+
         self._dur = dur
         if filename == None:
             filename = os.path.join(os.path.expanduser("~"), "pyo_rec.wav")
@@ -541,20 +609,20 @@ class Server(object):
         self._fileformat = fileformat
         self._sampletype = sampletype
         self._server.recordOptions(dur, filename, fileformat, sampletype)
-        
+
     def recstart(self, filename=None):
         """
         Begins a default recording of the sound that is sent to the
-        soundcard. This will create a file called `pyo_rec.wav` in 
+        soundcard. This will create a file called `pyo_rec.wav` in
         the user's home directory if no path is supplied or defined
-        with recordOptions method. Uses file format and sample type 
-        defined with recordOptions method. 
-        
+        with recordOptions method. Uses file format and sample type
+        defined with recordOptions method.
+
         :Args:
-        
+
             filename : string, optional
                 Name of the file to be created. Defaults to None.
-        
+
         """
         if filename == None:
             if self._filename != None:
@@ -570,33 +638,33 @@ class Server(object):
                     self._fileformat = fileformat
                     self._server.recordOptions(self._dur, filename, self._fileformat, self._sampletype)
 
-        self._server.recstart(filename)    
-        
+        self._server.recstart(filename)
+
     def recstop(self):
         """
         Stop the previously started recording.
-        
+
         """
         self._server.recstop()
 
     def noteout(self, pitch, velocity, channel=0, timestamp=0):
         """
-        Send a MIDI note message to the selected midi output device. 
-        
+        Send a MIDI note message to the selected midi output device.
+
         Arguments can be list of values to generate multiple events
         in one call.
-        
+
         :Args:
-        
+
             pitch : int
                 Midi pitch, between 0 and 127.
             velocity : int
                 Amplitude of the note, between 0 and 127. A note
                 with a velocity of 0 is equivalent to a note off.
             channel : int, optional
-                The Midi channel, between 1 and 16, on which the 
+                The Midi channel, between 1 and 16, on which the
                 note is sent. A channel of 0 means all channels.
-                Defaults to 0. 
+                Defaults to 0.
             timestamp : int, optional
                 The delay time, in milliseconds, before the note
                 is sent on the portmidi stream. A value of 0 means
@@ -607,21 +675,21 @@ class Server(object):
 
     def afterout(self, pitch, velocity, channel=0, timestamp=0):
         """
-        Send an aftertouch message to the selected midi output device. 
-        
+        Send an aftertouch message to the selected midi output device.
+
         Arguments can be list of values to generate multiple events
         in one call.
-        
+
         :Args:
-        
+
             pitch : int
                 Midi key pressed down, between 0 and 127.
             velocity : int
                 Velocity of the pressure, between 0 and 127.
             channel : int, optional
-                The Midi channel, between 1 and 16, on which the 
+                The Midi channel, between 1 and 16, on which the
                 note is sent. A channel of 0 means all channels.
-                Defaults to 0. 
+                Defaults to 0.
             timestamp : int, optional
                 The delay time, in milliseconds, before the note
                 is sent on the portmidi stream. A value of 0 means
@@ -632,21 +700,21 @@ class Server(object):
 
     def ctlout(self, ctlnum, value, channel=0, timestamp=0):
         """
-        Send a control change message to the selected midi output device. 
-        
+        Send a control change message to the selected midi output device.
+
         Arguments can be list of values to generate multiple events
         in one call.
-        
+
         :Args:
-        
+
             ctlnum : int
                 Controller number, between 0 and 127.
             value : int
                 Value of the controller, between 0 and 127.
             channel : int, optional
-                The Midi channel, between 1 and 16, on which the 
+                The Midi channel, between 1 and 16, on which the
                 message is sent. A channel of 0 means all channels.
-                Defaults to 0. 
+                Defaults to 0.
             timestamp : int, optional
                 The delay time, in milliseconds, before the message
                 is sent on the portmidi stream. A value of 0 means
@@ -657,19 +725,19 @@ class Server(object):
 
     def programout(self, value, channel=0, timestamp=0):
         """
-        Send a program change message to the selected midi output device. 
-        
+        Send a program change message to the selected midi output device.
+
         Arguments can be list of values to generate multiple events
         in one call.
-        
+
         :Args:
-        
+
             value : int
                 New program number, between 0 and 127.
             channel : int, optional
-                The Midi channel, between 1 and 16, on which the 
+                The Midi channel, between 1 and 16, on which the
                 message is sent. A channel of 0 means all channels.
-                Defaults to 0. 
+                Defaults to 0.
             timestamp : int, optional
                 The delay time, in milliseconds, before the message
                 is sent on the portmidi stream. A value of 0 means
@@ -680,19 +748,19 @@ class Server(object):
 
     def pressout(self, value, channel=0, timestamp=0):
         """
-        Send a channel pressure message to the selected midi output device. 
-        
+        Send a channel pressure message to the selected midi output device.
+
         Arguments can be list of values to generate multiple events
         in one call.
-        
+
         :Args:
 
             value : int
                 Single greatest pressure value, between 0 and 127.
             channel : int, optional
-                The Midi channel, between 1 and 16, on which the 
+                The Midi channel, between 1 and 16, on which the
                 message is sent. A channel of 0 means all channels.
-                Defaults to 0. 
+                Defaults to 0.
             timestamp : int, optional
                 The delay time, in milliseconds, before the message
                 is sent on the portmidi stream. A value of 0 means
@@ -703,20 +771,20 @@ class Server(object):
 
     def bendout(self, value, channel=0, timestamp=0):
         """
-        Send a pitch bend message to the selected midi output device. 
-        
+        Send a pitch bend message to the selected midi output device.
+
         Arguments can be list of values to generate multiple events
         in one call.
-        
+
         :Args:
 
             value : int
                 14 bits pitch bend value. 8192 is where there is no
                 bending, 0 is full down and 16383 is full up bending.
             channel : int, optional
-                The Midi channel, between 1 and 16, on which the 
+                The Midi channel, between 1 and 16, on which the
                 message is sent. A channel of 0 means all channels.
-                Defaults to 0. 
+                Defaults to 0.
             timestamp : int, optional
                 The delay time, in milliseconds, before the message
                 is sent on the portmidi stream. A value of 0 means
@@ -728,28 +796,28 @@ class Server(object):
     def getStreams(self):
         """
         Return the list of streams loaded in the server.
-        
+
         """
         return self._server.getStreams()
-        
+
     def getSamplingRate(self):
         """
         Return the current sampling rate.
-        
+
         """
         return self._server.getSamplingRate()
-        
+
     def getNchnls(self):
         """
         Return the current number of channels.
-        
+
         """
         return self._server.getNchnls()
-        
+
     def getBufferSize(self):
         """
         Return the current buffer size.
-        
+
         """
         return self._server.getBufferSize()
 
@@ -763,97 +831,97 @@ class Server(object):
     def getIsStarted(self):
         """
         Returns 1 if the server is started, otherwise returns 0.
-        
+
         """
         return self._server.getIsStarted()
 
     def getIsBooted(self):
         """
         Returns 1 if the server is booted, otherwise returns 0.
-        
+
         """
         return self._server.getIsBooted()
 
     def getMidiActive(self):
         """
         Returns 1 if Midi callback is active, otherwise returns 0.
-        
+
         """
         return self._server.getMidiActive()
 
     def getStreams(self):
         """
         Returns the list of Stream objects currently in the Server memory.
-        
+
         """
         return self._server.getStreams()
 
     def getNumberOfStreams(self):
         """
         Returns the number of streams currently in the Server memory.
-        
+
         """
         return len(self._server.getStreams())
 
     def setServer(self):
         """
         Sets this server as the one to use for new objects when using the embedded device
-        
+
         """
         return self._server.setServer()
-    
+
     def getInputAddr(self):
         """
         Return the address of the input buffer
-        
+
         """
         return self._server.getInputAddr()
-        
+
     def getOutputAddr(self):
         """
         Return the address of the output buffer
-        
+
         """
         return self._server.getOutputAddr()
-        
+
     def getServerID(self):
         """
         Return the server ID
-        
+
         """
         return self._server.getServerID()
-        
+
     def getServerAddr(self):
         """
         Return the address of the server
-        
+
         """
         return self._server.getServerAddr()
-        
+
     def getEmbedICallbackAddr(self):
         """
         Return the address of the interleaved embedded callback function
-        
+
         """
         return self._server.getEmbedICallbackAddr()
 
     @property
     def amp(self):
-        """float. Overall amplitude.""" 
+        """float. Overall amplitude."""
         return self._amp
     @amp.setter
-    def amp(self, x): self.setAmp(x) 
+    def amp(self, x): self.setAmp(x)
 
     @property
     def startoffset(self):
-        """float. Starting time of the real-time processing.""" 
+        """float. Starting time of the real-time processing."""
         return self._startoffset
     @startoffset.setter
-    def startoffset(self, x): self.setStartOffset(x) 
+    def startoffset(self, x): self.setStartOffset(x)
 
     @property
     def verbosity(self):
-        """int. Server verbosity.""" 
+        """int. Server verbosity."""
         return self._verbosity
     @verbosity.setter
     def verbosity(self, x):
@@ -864,11 +932,11 @@ class Server(object):
 
     @property
     def globalseed(self):
-        """int. Server global seed.""" 
+        """int. Server global seed."""
         return self._globalseed
     @globalseed.setter
     def globalseed(self, x):
         if (type(x) == int):
             self.setGlobalSeed(x)
         else:
-            raise Exception("global seed must be an integer")
+            raise Exception("global seed must be an integer")
\ No newline at end of file
diff --git a/pyolib/tableprocess.py b/pyolib/tableprocess.py
index a9acdcd..e36094b 100644
--- a/pyolib/tableprocess.py
+++ b/pyolib/tableprocess.py
@@ -1,48 +1,48 @@
 """
 Set of objects to perform operations on PyoTableObjects.
 
-PyoTableObjects are 1 dimension containers. They can be used to 
+PyoTableObjects are 1 dimension containers. They can be used to
 store audio samples or algorithmic sequences for future uses.
 
 """
 
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU Lesser General Public
+License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
 from _core import *
 from _maps import *
 from types import SliceType
- 
+
 class Osc(PyoObject):
     """
     A simple oscillator reading a waveform table.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         table : PyoTableObject
             Table containing the waveform samples.
         freq : float or PyoObject, optional
             Frequency in cycles per second. Defaults to 1000.
         phase : float or PyoObject, optional
-            Phase of sampling, expressed as a fraction of a cycle (0 to 1). 
+            Phase of sampling, expressed as a fraction of a cycle (0 to 1).
             Defaults to 0.
         interp : int, optional
             Choice of the interpolation method. Defaults to 2.
@@ -51,15 +51,15 @@ class Osc(PyoObject):
                 3. cosinus
                 4. cubic
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`Phasor`, :py:class:`Sine`
 
     >>> s = Server().boot()
     >>> s.start()
     >>> t = HarmTable([1,0,.33,0,.2,0,.143,0,.111,0,.091])
     >>> a = Osc(table=t, freq=[100,99.2], mul=.2).out()
-     
+
     """
     def __init__(self, table, freq=1000, phase=0, interp=2, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -73,12 +73,12 @@ class Osc(PyoObject):
     def setTable(self, x):
         """
         Replace the `table` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `table` attribute.
-        
+
         """
         self._table = x
         x, lmax = convertArgsToLists(x)
@@ -87,12 +87,12 @@ class Osc(PyoObject):
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `freq` attribute.
-        
+
         """
         self._freq = x
         x, lmax = convertArgsToLists(x)
@@ -101,12 +101,12 @@ class Osc(PyoObject):
     def setPhase(self, x):
         """
         Replace the `phase` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `phase` attribute.
-        
+
         """
         self._phase = x
         x, lmax = convertArgsToLists(x)
@@ -115,12 +115,12 @@ class Osc(PyoObject):
     def setInterp(self, x):
         """
         Replace the `interp` attribute.
-        
+
         :Args:
 
             x : int {1, 2, 3, 4}
                 new `interp` attribute.
-        
+
         """
         self._interp = x
         x, lmax = convertArgsToLists(x)
@@ -129,7 +129,7 @@ class Osc(PyoObject):
     def reset(self):
         """
         Resets current phase to 0.
-        
+
         """
         [obj.reset() for i, obj in enumerate(self._base_objs)]
 
@@ -142,27 +142,27 @@ class Osc(PyoObject):
 
     @property
     def table(self):
-        """PyoTableObject. Table containing the waveform samples.""" 
+        """PyoTableObject. Table containing the waveform samples."""
         return self._table
     @table.setter
     def table(self, x): self.setTable(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Frequency in cycles per second.""" 
+        """float or PyoObject. Frequency in cycles per second."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
-    def phase(self): 
-        """float or PyoObject. Phase of sampling.""" 
+    def phase(self):
+        """float or PyoObject. Phase of sampling."""
         return self._phase
     @phase.setter
     def phase(self, x): self.setPhase(x)
 
     @property
-    def interp(self): 
+    def interp(self):
         """int {1, 2, 3, 4}. Interpolation method."""
         return self._interp
     @interp.setter
@@ -175,8 +175,8 @@ class OscLoop(PyoObject):
     OscLoop reads a waveform table with linear interpolation and feedback control.
     The oscillator output, multiplied by `feedback`, is added to the position
     increment and can be used to control the brightness of the oscillator.
-    
-    
+
+
     :Parent: :py:class:`PyoObject`
 
     :Args:
@@ -186,18 +186,18 @@ class OscLoop(PyoObject):
         freq : float or PyoObject, optional
             Frequency in cycles per second. Defaults to 1000.
         feedback : float or PyoObject, optional
-            Amount of the output signal added to position increment, between 0 and 1. 
+            Amount of the output signal added to position increment, between 0 and 1.
             Controls the brightness. Defaults to 0.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`Osc`, :py:class:`SineLoop`
 
     >>> s = Server().boot()
     >>> s.start()
     >>> t = HarmTable([1,0,.33,0,.2,0,.143])
     >>> lfo = Sine(.5, 0, .05, .05)
-    >>> a = OscLoop(table=t, freq=[100,99.3], feedback=lfo, mul=.2).out()   
+    >>> a = OscLoop(table=t, freq=[100,99.3], feedback=lfo, mul=.2).out()
 
     """
     def __init__(self, table, freq=1000, feedback=0, mul=1, add=0):
@@ -258,21 +258,21 @@ class OscLoop(PyoObject):
 
     @property
     def table(self):
-        """PyoTableObject. Table containing the waveform samples.""" 
+        """PyoTableObject. Table containing the waveform samples."""
         return self._table
     @table.setter
     def table(self, x): self.setTable(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Frequency in cycles per second.""" 
+        """float or PyoObject. Frequency in cycles per second."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
-    def feedback(self): 
-        """float or PyoObject. Brightness control.""" 
+    def feedback(self):
+        """float or PyoObject. Brightness control."""
         return self._feedback
     @feedback.setter
     def feedback(self, x): self.setFeedback(x)
@@ -293,7 +293,7 @@ class OscTrig(PyoObject):
         freq : float or PyoObject, optional
             Frequency in cycles per second. Defaults to 1000.
         phase : float or PyoObject, optional
-            Phase of sampling, expressed as a fraction of a cycle (0 to 1). 
+            Phase of sampling, expressed as a fraction of a cycle (0 to 1).
             Defaults to 0.
         interp : int, optional
             Choice of the interpolation method. Defaults to 2.
@@ -302,8 +302,8 @@ class OscTrig(PyoObject):
                 3. cosinus
                 4. cubic
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`Osc`, :py:class:`Phasor`, :py:class:`Sine`
 
     >>> s = Server().boot()
@@ -410,34 +410,34 @@ class OscTrig(PyoObject):
 
     @property
     def table(self):
-        """PyoTableObject. Table containing the waveform samples.""" 
+        """PyoTableObject. Table containing the waveform samples."""
         return self._table
     @table.setter
     def table(self, x): self.setTable(x)
 
     @property
     def trig(self):
-        """PyoObject. Trigger signal. Reset pointer position to zero""" 
+        """PyoObject. Trigger signal. Reset pointer position to zero"""
         return self._trig
     @trig.setter
     def trig(self, x): self.setTrig(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Frequency in cycles per second.""" 
+        """float or PyoObject. Frequency in cycles per second."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
-    def phase(self): 
-        """float or PyoObject. Phase of sampling.""" 
+    def phase(self):
+        """float or PyoObject. Phase of sampling."""
         return self._phase
     @phase.setter
     def phase(self, x): self.setPhase(x)
 
     @property
-    def interp(self): 
+    def interp(self):
         """int {1, 2, 3, 4}. Interpolation method."""
         return self._interp
     @interp.setter
@@ -448,13 +448,13 @@ class OscBank(PyoObject):
     Any number of oscillators reading a waveform table.
 
     OscBank mixes the output of any number of oscillators. The frequencies
-    of each oscillator is controlled with two parameters, the base frequency 
-    `freq` and a coefficient of expansion `spread`. Frequencies are computed 
+    of each oscillator is controlled with two parameters, the base frequency
+    `freq` and a coefficient of expansion `spread`. Frequencies are computed
     with the following formula (`n` is the order of the partial):
 
     f_n = freq + freq * spread * n
 
-    The frequencies and amplitudes can be modulated by two random generators 
+    The frequencies and amplitudes can be modulated by two random generators
     with interpolation (each partial have a different set of randoms).
 
     :Parent: :py:class:`PyoObject`
@@ -466,29 +466,29 @@ class OscBank(PyoObject):
         freq : float or PyoObject, optional
             Base frequency in cycles per second. Defaults to 100.
         spread : float or PyoObject, optional
-            Coefficient of expansion used to compute partial frequencies. 
-            If `spread` is 0, all partials will be at the base frequency. 
+            Coefficient of expansion used to compute partial frequencies.
+            If `spread` is 0, all partials will be at the base frequency.
             A value of 1 will generate integer harmonics, a value of 2
             will skip even harmonics and non-integer values will generate
             different series of inharmonic frequencies. Defaults to 1.
         slope : float or PyoObject, optional
-            specifies the multiplier in the series of amplitude coefficients. 
-            This is a power series: the nth partial will have an amplitude of 
+            specifies the multiplier in the series of amplitude coefficients.
+            This is a power series: the nth partial will have an amplitude of
             (slope ** n), i.e. strength values trace an exponential curve.
             Defaults to 1.
         frndf : float or PyoObject, optional
-            Frequency, in cycle per second, of the frequency modulations. 
+            Frequency, in cycle per second, of the frequency modulations.
             Defaults to 1.
         frnda : float or PyoObject, optional
-            Maximum frequency deviation (positive and negative) in portion of 
+            Maximum frequency deviation (positive and negative) in portion of
             the partial frequency. A value of 1 means that the frequency can
-            drift from 0 Hz to twice the partial frequency. A value of 0 
+            drift from 0 Hz to twice the partial frequency. A value of 0
             deactivates the frequency deviations. Defaults to 0.
         arndf : float or PyoObject, optional
-            Frequency, in cycle per second, of the amplitude modulations. 
+            Frequency, in cycle per second, of the amplitude modulations.
             Defaults to 1.
         arnda : float or PyoObject, optional
-            Amount of amplitude deviation. 0 deactivates the amplitude 
+            Amount of amplitude deviation. 0 deactivates the amplitude
             modulations and 1 gives full amplitude modulations.
             Defaults to 0.
         num : int, optional
@@ -500,13 +500,13 @@ class OscBank(PyoObject):
             periodicity between partial frequencies can cause very strange
             artefact. Adding a jitter breaks the periodicity. Defaults to False.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`Osc`
 
     .. note::
 
-        Altough parameters can be audio signals, values are sampled only once 
+        Altough parameters can be audio signals, values are sampled only once
         per buffer size. To avoid artefacts, it is recommended to keep variations
         at low rate (< 20 Hz).
 
@@ -673,63 +673,63 @@ class OscBank(PyoObject):
 
     @property
     def table(self):
-        """PyoTableObject. Table containing the waveform samples.""" 
+        """PyoTableObject. Table containing the waveform samples."""
         return self._table
     @table.setter
     def table(self, x): self.setTable(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Frequency in cycles per second.""" 
+        """float or PyoObject. Frequency in cycles per second."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
-    def spread(self): 
-        """float or PyoObject. Frequency expansion factor.""" 
+    def spread(self):
+        """float or PyoObject. Frequency expansion factor."""
         return self._spread
     @spread.setter
     def spread(self, x): self.setSpread(x)
 
     @property
-    def slope(self): 
-        """float or PyoObject. Multiplier in the series of amplitudes.""" 
+    def slope(self):
+        """float or PyoObject. Multiplier in the series of amplitudes."""
         return self._slope
     @slope.setter
     def slope(self, x): self.setSlope(x)
 
     @property
-    def frndf(self): 
-        """float or PyoObject. Frequency of the frequency modulations.""" 
+    def frndf(self):
+        """float or PyoObject. Frequency of the frequency modulations."""
         return self._frndf
     @frndf.setter
     def frndf(self, x): self.setFrndf(x)
 
     @property
-    def frnda(self): 
-        """float or PyoObject. Maximum frequency deviation from 0 to 1.""" 
+    def frnda(self):
+        """float or PyoObject. Maximum frequency deviation from 0 to 1."""
         return self._frnda
     @frnda.setter
     def frnda(self, x): self.setFrnda(x)
 
     @property
-    def arndf(self): 
-        """float or PyoObject. Frequency of the amplitude modulations.""" 
+    def arndf(self):
+        """float or PyoObject. Frequency of the amplitude modulations."""
         return self._arndf
     @arndf.setter
     def arndf(self, x): self.setArndf(x)
 
     @property
-    def arnda(self): 
-        """float or PyoObject. Amount of amplitude deviation from 0 to 1.""" 
+    def arnda(self):
+        """float or PyoObject. Amount of amplitude deviation from 0 to 1."""
         return self._arnda
     @arnda.setter
     def arnda(self, x): self.setArnda(x)
 
     @property
-    def fjit(self): 
-        """boolean. Jitter added to the parial frequencies.""" 
+    def fjit(self):
+        """boolean. Jitter added to the parial frequencies."""
         return self._fjit
     @fjit.setter
     def fjit(self, x): self.setFjit(x)
@@ -740,7 +740,7 @@ class TableRead(PyoObject):
 
     Read sampled sound from a table, with optional looping mode.
 
-    The play() method starts the playback and is not called at the 
+    The play() method starts the playback and is not called at the
     object creation time.
 
     :Parent: :py:class:`PyoObject`
@@ -752,7 +752,7 @@ class TableRead(PyoObject):
         freq : float or PyoObject, optional
             Frequency in cycles per second. Defaults to 1.
         loop : int {0, 1}, optional
-            Looping mode, 0 means off, 1 means on. 
+            Looping mode, 0 means off, 1 means on.
             Defaults to 0.
         interp : int, optional
             Choice of the interpolation method. Defaults to 2.
@@ -763,22 +763,22 @@ class TableRead(PyoObject):
 
     .. note::
 
-        TableRead will sends a trigger signal at the end of the playback if 
-        loop is off or any time it wraps around if loop is on. User can 
+        TableRead will sends a trigger signal at the end of the playback if
+        loop is off or any time it wraps around if loop is on. User can
         retreive the trigger streams by calling obj['trig']:
 
         >>> tabr = TableRead(SNDS_PATH + "/transparent.aif").out()
         >>> trig = TrigRand(tab['trig'])
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`Osc`
 
     >>> s = Server().boot()
     >>> s.start()
     >>> snd = SndTable(SNDS_PATH + '/transparent.aif')
     >>> freq = snd.getRate()
-    >>> a = TableRead(table=snd, freq=[freq,freq*.99], loop=True, mul=.3).out()   
+    >>> a = TableRead(table=snd, freq=[freq,freq*.99], loop=True, mul=.3).out()
 
     """
     def __init__(self, table, freq=1, loop=0, interp=2, mul=1, add=0):
@@ -794,12 +794,12 @@ class TableRead(PyoObject):
     def setTable(self, x):
         """
         Replace the `table` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `table` attribute.
-        
+
         """
         self._table = x
         x, lmax = convertArgsToLists(x)
@@ -808,12 +808,12 @@ class TableRead(PyoObject):
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `freq` attribute.
-        
+
         """
         self._freq = x
         x, lmax = convertArgsToLists(x)
@@ -822,12 +822,12 @@ class TableRead(PyoObject):
     def setLoop(self, x):
         """
         Replace the `loop` attribute.
-        
+
         :Args:
 
             x : int {0, 1}
                 new `loop` attribute.
-        
+
         """
         self._loop = x
         x, lmax = convertArgsToLists(x)
@@ -836,12 +836,12 @@ class TableRead(PyoObject):
     def setInterp(self, x):
         """
         Replace the `interp` attribute.
-        
+
         :Args:
 
             x : int {1, 2, 3, 4}
                 new `interp` attribute.
-        
+
         """
         self._interp = x
         x, lmax = convertArgsToLists(x)
@@ -856,7 +856,7 @@ class TableRead(PyoObject):
 
 
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
-        self._map_list = [SLMap(0.0001, 1000, 'log', 'freq', self._freq), 
+        self._map_list = [SLMap(0.0001, 1000, 'log', 'freq', self._freq),
                           SLMap(0, 1, 'lin', 'loop', self._loop, res="int", dataOnly=True),
                           SLMap(1, 4, 'lin', 'interp', self._interp, res="int", dataOnly=True),
                           SLMapMul(self._mul)]
@@ -864,27 +864,27 @@ class TableRead(PyoObject):
 
     @property
     def table(self):
-        """PyoTableObject. Table containing the waveform samples.""" 
+        """PyoTableObject. Table containing the waveform samples."""
         return self._table
     @table.setter
     def table(self, x): self.setTable(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Frequency in cycles per second.""" 
+        """float or PyoObject. Frequency in cycles per second."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
-    def loop(self): 
-        """int. Looping mode.""" 
+    def loop(self):
+        """int. Looping mode."""
         return self._loop
     @loop.setter
     def loop(self, x): self.setLoop(x)
 
     @property
-    def interp(self): 
+    def interp(self):
         """int {1, 2, 3, 4}. Interpolation method."""
         return self._interp
     @interp.setter
@@ -894,15 +894,15 @@ class Pulsar(PyoObject):
     """
     Pulsar synthesis oscillator.
 
-    Pulsar synthesis produces a train of sound particles called pulsars 
-    that can make rhythms or tones, depending on the fundamental frequency 
+    Pulsar synthesis produces a train of sound particles called pulsars
+    that can make rhythms or tones, depending on the fundamental frequency
     of the train. Varying the `frac` parameter changes the portion of the
-    period assigned to the waveform and the portion of the period assigned 
-    to its following silence, but maintain the overall pulsar period. This 
+    period assigned to the waveform and the portion of the period assigned
+    to its following silence, but maintain the overall pulsar period. This
     results in an effect much like a sweeping band-pass filter.
 
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
 
         table : PyoTableObject
@@ -912,10 +912,10 @@ class Pulsar(PyoObject):
         freq : float or PyoObject, optional
             Frequency in cycles per second. Defaults to 100.
         frac : float or PyoObject, optional
-            Fraction of the whole period (0 -> 1) given to the waveform. 
+            Fraction of the whole period (0 -> 1) given to the waveform.
             The rest will be filled with zeros. Defaults to 0.5.
         phase : float or PyoObject, optional
-            Phase of sampling, expressed as a fraction of a cycle (0 to 1). 
+            Phase of sampling, expressed as a fraction of a cycle (0 to 1).
             Defaults to 0.
         interp : int, optional
             Choice of the interpolation method. Defaults to 2.
@@ -924,8 +924,8 @@ class Pulsar(PyoObject):
                 3. cosinus
                 4. cubic
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`Osc`
 
     >>> s = Server().boot()
@@ -934,7 +934,7 @@ class Pulsar(PyoObject):
     >>> e = HannTable()
     >>> lfo = Sine([.1,.15], mul=.2, add=.5)
     >>> a = Pulsar(table=w, env=e, freq=80, frac=lfo, mul=.08).out()
-     
+
     """
     def __init__(self, table, env, freq=100, frac=0.5, phase=0, interp=2, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -950,12 +950,12 @@ class Pulsar(PyoObject):
     def setTable(self, x):
         """
         Replace the `table` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `table` attribute.
-        
+
         """
         self._table = x
         x, lmax = convertArgsToLists(x)
@@ -964,12 +964,12 @@ class Pulsar(PyoObject):
     def setEnv(self, x):
         """
         Replace the `env` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `env` attribute.
-        
+
         """
         self._env = x
         x, lmax = convertArgsToLists(x)
@@ -978,12 +978,12 @@ class Pulsar(PyoObject):
     def setFreq(self, x):
         """
         Replace the `freq` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `freq` attribute.
-        
+
         """
         self._freq = x
         x, lmax = convertArgsToLists(x)
@@ -992,12 +992,12 @@ class Pulsar(PyoObject):
     def setFrac(self, x):
         """
         Replace the `frac` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `frac` attribute.
-        
+
         """
         self._frac = x
         x, lmax = convertArgsToLists(x)
@@ -1006,12 +1006,12 @@ class Pulsar(PyoObject):
     def setPhase(self, x):
         """
         Replace the `phase` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `phase` attribute.
-        
+
         """
         self._phase = x
         x, lmax = convertArgsToLists(x)
@@ -1020,7 +1020,7 @@ class Pulsar(PyoObject):
     def setInterp(self, x):
         """
         Replace the `interp` attribute.
-        
+
         :Args:
 
             x : int {1, 2, 3, 4}
@@ -1029,7 +1029,7 @@ class Pulsar(PyoObject):
                     2. linear
                     3. cosinus
                     4. cubic
-        
+
         """
         self._interp = x
         x, lmax = convertArgsToLists(x)
@@ -1045,41 +1045,41 @@ class Pulsar(PyoObject):
 
     @property
     def table(self):
-        """PyoTableObject. Table containing the waveform samples.""" 
+        """PyoTableObject. Table containing the waveform samples."""
         return self._table
     @table.setter
     def table(self, x): self.setTable(x)
 
     @property
     def env(self):
-        """PyoTableObject. Table containing the envelope samples.""" 
+        """PyoTableObject. Table containing the envelope samples."""
         return self._env
     @env.setter
     def env(self, x): self.setEnv(x)
 
     @property
     def freq(self):
-        """float or PyoObject. Frequency in cycles per second.""" 
+        """float or PyoObject. Frequency in cycles per second."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
 
     @property
     def frac(self):
-        """float or PyoObject. Fraction of the period assigned to waveform.""" 
+        """float or PyoObject. Fraction of the period assigned to waveform."""
         return self._frac
     @frac.setter
     def frac(self, x): self.setFrac(x)
 
     @property
-    def phase(self): 
-        """float or PyoObject. Phase of sampling.""" 
+    def phase(self):
+        """float or PyoObject. Phase of sampling."""
         return self._phase
     @phase.setter
     def phase(self, x): self.setPhase(x)
 
     @property
-    def interp(self): 
+    def interp(self):
         """int {1, 2, 3, 4}. Interpolation method."""
         return self._interp
     @interp.setter
@@ -1116,12 +1116,12 @@ class Pointer(PyoObject):
     def setTable(self, x):
         """
         Replace the `table` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `table` attribute.
-        
+
         """
         self._table = x
         x, lmax = convertArgsToLists(x)
@@ -1130,12 +1130,12 @@ class Pointer(PyoObject):
     def setIndex(self, x):
         """
         Replace the `index` attribute.
-        
+
         :Args:
 
             x : PyoObject
                 new `index` attribute.
-        
+
         """
         self._index = x
         x, lmax = convertArgsToLists(x)
@@ -1147,14 +1147,14 @@ class Pointer(PyoObject):
 
     @property
     def table(self):
-        """PyoTableObject. Table containing the waveform samples.""" 
+        """PyoTableObject. Table containing the waveform samples."""
         return self._table
     @table.setter
     def table(self, x): self.setTable(x)
 
     @property
     def index(self):
-        """PyoObject. Index pointer position in the table.""" 
+        """PyoObject. Index pointer position in the table."""
         return self._index
     @index.setter
     def index(self, x): self.setIndex(x)
@@ -1178,10 +1178,10 @@ class Pointer2(PyoObject):
                 3. cosinus
                 4. cubic
         autosmooth : boolean, optional
-            If True, a lowpass filter, following the pitch, is applied on 
-            
-            the output signal to reduce the quantization noise produced 
-            
+            If True, a lowpass filter, following the pitch, is applied on
+
+            the output signal to reduce the quantization noise produced
+
             by very low transpositions. Defaults to True.
 
     >>> s = Server().boot()
@@ -1204,12 +1204,12 @@ class Pointer2(PyoObject):
     def setTable(self, x):
         """
         Replace the `table` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `table` attribute.
-        
+
         """
         self._table = x
         x, lmax = convertArgsToLists(x)
@@ -1218,12 +1218,12 @@ class Pointer2(PyoObject):
     def setIndex(self, x):
         """
         Replace the `index` attribute.
-        
+
         :Args:
 
             x : PyoObject
                 new `index` attribute.
-        
+
         """
         self._index = x
         x, lmax = convertArgsToLists(x)
@@ -1232,7 +1232,7 @@ class Pointer2(PyoObject):
     def setInterp(self, x):
         """
         Replace the `interp` attribute.
-        
+
         :Args:
 
             x : int {1, 2, 3, 4}
@@ -1241,7 +1241,7 @@ class Pointer2(PyoObject):
                     2. linear interpolation
                     3. cosine interpolation
                     4. cubic interpolation (default)
-        
+
         """
         self._interp = x
         x, lmax = convertArgsToLists(x)
@@ -1250,16 +1250,16 @@ class Pointer2(PyoObject):
     def setAutoSmooth(self, x):
         """
         Replace the `autosmooth` attribute.
-        
-        If True, a lowpass filter, following the playback speed, is applied on 
-        the output signal to reduce the quantization noise produced by very 
+
+        If True, a lowpass filter, following the playback speed, is applied on
+        the output signal to reduce the quantization noise produced by very
         low transpositions.
-        
+
         :Args:
 
             x : boolean
                 new `autosmooth` attribute.
-        
+
         """
         self._autosmooth = x
         x, lmax = convertArgsToLists(x)
@@ -1271,27 +1271,27 @@ class Pointer2(PyoObject):
 
     @property
     def table(self):
-        """PyoTableObject. Table containing the waveform samples.""" 
+        """PyoTableObject. Table containing the waveform samples."""
         return self._table
     @table.setter
     def table(self, x): self.setTable(x)
 
     @property
     def index(self):
-        """PyoObject. Index pointer position in the table.""" 
+        """PyoObject. Index pointer position in the table."""
         return self._index
     @index.setter
     def index(self, x): self.setIndex(x)
 
     @property
-    def interp(self): 
+    def interp(self):
         """int {1, 2, 3, 4}. Interpolation method."""
         return self._interp
     @interp.setter
     def interp(self, x): self.setInterp(x)
 
     @property
-    def autosmooth(self): 
+    def autosmooth(self):
         """boolean. Quantization noise filter."""
         return self._autosmooth
     @autosmooth.setter
@@ -1308,7 +1308,7 @@ class TableIndex(PyoObject):
         table : PyoTableObject
             Table containing the samples.
         index : PyoObject
-            Position in the table, as integer audio stream, 
+            Position in the table, as integer audio stream,
             between 0 and table's size - 1.
 
     >>> s = Server().boot()
@@ -1362,14 +1362,14 @@ class TableIndex(PyoObject):
 
     @property
     def table(self):
-        """PyoTableObject. Table containing the samples.""" 
+        """PyoTableObject. Table containing the samples."""
         return self._table
     @table.setter
     def table(self, x): self.setTable(x)
 
     @property
     def index(self):
-        """PyoObject. Position in the table.""" 
+        """PyoObject. Position in the table."""
         return self._index
     @index.setter
     def index(self, x): self.setIndex(x)
@@ -1377,22 +1377,22 @@ class TableIndex(PyoObject):
 class Lookup(PyoObject):
     """
     Uses table to do waveshaping on an audio signal.
-    
+
     Lookup uses a table to apply waveshaping on an input signal
     `index`. The index must be between -1 and 1, it is automatically
     scaled between 0 and len(table)-1 and is used as a position
-    pointer in the table.  
-    
+    pointer in the table.
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
-    
+
         table : PyoTableObject
             Table containing the transfert function.
         index : PyoObject
             Audio signal, between -1 and 1, internally converted to be
             used as the index position in the table.
-        
+
     >>> s = Server().boot()
     >>> s.start()
     >>> lfo = Sine(freq=[.15,.2], mul=.2, add=.25)
@@ -1411,12 +1411,12 @@ class Lookup(PyoObject):
     def setTable(self, x):
         """
         Replace the `table` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `table` attribute.
-        
+
         """
         self._table = x
         x, lmax = convertArgsToLists(x)
@@ -1425,12 +1425,12 @@ class Lookup(PyoObject):
     def setIndex(self, x):
         """
         Replace the `index` attribute.
-        
+
         :Args:
 
             x : PyoObject
                 new `index` attribute.
-        
+
         """
         self._index = x
         x, lmax = convertArgsToLists(x)
@@ -1442,14 +1442,14 @@ class Lookup(PyoObject):
 
     @property
     def table(self):
-        """PyoTableObject. Table containing the transfert function.""" 
+        """PyoTableObject. Table containing the transfert function."""
         return self._table
     @table.setter
     def table(self, x): self.setTable(x)
 
     @property
     def index(self):
-        """PyoObject. Audio input used as the table index.""" 
+        """PyoObject. Audio input used as the table index."""
         return self._index
     @index.setter
     def index(self, x): self.setIndex(x)
@@ -1461,7 +1461,7 @@ class TableRec(PyoObject):
     See `NewTable` to create an empty table.
 
     The play method is not called at the object creation time. It starts
-    the recording into the table until the table is full. Calling the 
+    the recording into the table until the table is full. Calling the
     play method again restarts the recording and overwrites previously
     recorded samples. The stop method stops the recording. Otherwise, the
     default behaviour is to record through the end of the table.
@@ -1475,7 +1475,7 @@ class TableRec(PyoObject):
         table : NewTable
             The table where to write samples.
         fadetime : float, optional
-            Fade time at the beginning and the end of the recording 
+            Fade time at the beginning and the end of the recording
             in seconds. Defaults to 0.
 
     .. note::
@@ -1484,7 +1484,7 @@ class TableRec(PyoObject):
 
         TableRec has no `mul` and `add` attributes.
 
-        TableRec will sends a trigger signal at the end of the recording. 
+        TableRec will sends a trigger signal at the end of the recording.
         User can retrieve the trigger streams by calling obj['trig']. In
         this example, the recorded table will be read automatically after
         a recording:
@@ -1493,12 +1493,12 @@ class TableRec(PyoObject):
         >>> t = NewTable(length=1, chnls=1)
         >>> rec = TableRec(a, table=t, fadetime=0.01)
         >>> tr = TrigEnv(rec['trig'], table=t, dur=1).out()
-        
-        obj['time'] outputs an audio stream of the current recording time, 
+
+        obj['time'] outputs an audio stream of the current recording time,
         in samples.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`NewTable`, :py:class:`TrigTableRec`
 
     >>> s = Server(duplex=1).boot()
@@ -1535,14 +1535,14 @@ class TableRec(PyoObject):
 
     def setMul(self, x):
         pass
-        
+
     def setAdd(self, x):
-        pass    
+        pass
 
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1557,12 +1557,12 @@ class TableRec(PyoObject):
     def setTable(self, x):
         """
         Replace the `table` attribute.
-        
+
         :Args:
 
             x : NewTable
                 new `table` attribute.
-        
+
         """
         self._table = x
         x, lmax = convertArgsToLists(x)
@@ -1570,7 +1570,7 @@ class TableRec(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Audio signal to write in the table.""" 
+        """PyoObject. Audio signal to write in the table."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -1582,13 +1582,139 @@ class TableRec(PyoObject):
     @table.setter
     def table(self, x): self.setTable(x)
 
+class TableWrite(PyoObject):
+    """
+    TableWrite writes samples into a previously created NewTable.
+
+    See `NewTable` to create an empty table.
+
+    TableWrite takes samples from its `input` stream and writes
+    them at a normalized position given by the `pos` stream.
+    Position must be an audio stream, ie. a PyoObject. This
+    object allows fast recording of values coming from an X-Y
+    pad into a table object.
+
+    :Parent: :py:class:`PyoObject`
+
+    :Args:
+
+        input : PyoObject
+            Audio signal to write in the table.
+        pos : PyoObject
+            Audio signal specifying the normalized position (in the
+            range 0 to 1) where to write the `input` samples.
+        table : NewTable
+            The table where to write samples.
+
+    .. note::
+
+        The out() method is bypassed. TableWrite returns no signal.
+
+        TableWrite has no `mul` and `add` attributes.
+
+    .. seealso::
+
+        :py:class:`NewTable`, :py:class:`TableRec`
+
+    >>> s = Server(duplex=1).boot()
+    >>> s.start()
+    >>> tab = NewTable(8192/s.getSamplingRate())
+    >>> tab.view()
+    >>> pos = Phasor(.5)
+    >>> val = Sine(.25)
+    >>> rec = TableWrite(val, pos, tab)
+    >>> pat = Pattern(tab.refreshView, 0.05).play()
+
+    """
+    def __init__(self, input, pos, table):
+        PyoObject.__init__(self)
+        self._input = input
+        self._pos = pos
+        self._table = table
+        self._in_fader = InputFader(input)
+        in_fader, pos, table, lmax = convertArgsToLists(self._in_fader, pos, table)
+        self._base_objs = [TableWrite_base(wrap(in_fader,i), wrap(pos,i), wrap(table,i)) for i in range(len(table))]
+
+    def out(self, chnl=0, inc=1, dur=0, delay=0):
+        return self.play(dur, delay)
+
+    def setMul(self, x):
+        pass
+
+    def setAdd(self, x):
+        pass
+
+    def setInput(self, x, fadetime=0.05):
+        """
+        Replace the `input` attribute.
+
+        :Args:
+
+            x : PyoObject
+                New signal to process.
+            fadetime : float, optional
+                Crossfade time between old and new input. Defaults to 0.05.
+
+        """
+        self._input = x
+        self._in_fader.setInput(x, fadetime)
+
+    def setTable(self, x):
+        """
+        Replace the `table` attribute.
+
+        :Args:
+
+            x : NewTable
+                new `table` attribute.
+
+        """
+        self._table = x
+        x, lmax = convertArgsToLists(x)
+        [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
+
+    def setPos(self, x):
+        """
+        Replace the `pos` attribute.
+
+        :Args:
+
+            x : PyoObject
+                new `pos` attribute.
+
+        """
+        self._pos = x
+        x, lmax = convertArgsToLists(x)
+        [obj.setPos(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
+
+    @property
+    def input(self):
+        """PyoObject. Audio signal to write in the table."""
+        return self._input
+    @input.setter
+    def input(self, x): self.setInput(x)
+
+    @property
+    def table(self):
+        """NewTable. The table where to write samples."""
+        return self._table
+    @table.setter
+    def table(self, x): self.setTable(x)
+
+    @property
+    def pos(self):
+        """PyoObject. Normalized position, as audio stream, where to write samples."""
+        return self._pos
+    @pos.setter
+    def pos(self, x): self.setPos(x)
+
 class TableMorph(PyoObject):
     """
     Morphs between multiple PyoTableObjects.
 
-    Uses an index into a list of PyoTableObjects to morph between adjacent 
-    tables in the list. The resulting morphed function is written into the 
-    `table` object at the beginning of each buffer size. The tables in the 
+    Uses an index into a list of PyoTableObjects to morph between adjacent
+    tables in the list. The resulting morphed function is written into the
+    `table` object at the beginning of each buffer size. The tables in the
     list and the resulting table must be equal in size.
 
     :Parent: :py:class:`PyoObject`
@@ -1596,7 +1722,7 @@ class TableMorph(PyoObject):
     :Args:
 
         input : PyoObject
-            Morphing index between 0 and 1. 0 is the first table in the list 
+            Morphing index between 0 and 1. 0 is the first table in the list
             and 1 is the last.
         table : NewTable
             The table where to write morphed waveform.
@@ -1634,14 +1760,14 @@ class TableMorph(PyoObject):
 
     def setMul(self, x):
         pass
-        
+
     def setAdd(self, x):
-        pass    
+        pass
 
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1656,12 +1782,12 @@ class TableMorph(PyoObject):
     def setTable(self, x):
         """
         Replace the `table` attribute.
-        
+
         :Args:
 
             x : NewTable
                 new `table` attribute.
-        
+
         """
         self._table = x
         x, lmax = convertArgsToLists(x)
@@ -1670,20 +1796,20 @@ class TableMorph(PyoObject):
     def setSources(self, x):
         """
          Replace the `sources` attribute.
-        
+
         :Args:
 
             x : list of PyoTableObject
                 new `sources` attribute.
-              
+
         """
         self._sources = x
         self._base_sources = [source[0] for source in x]
         [obj.setSources(self._base_sources) for i, obj in enumerate(self._base_objs)]
-        
+
     @property
     def input(self):
-        """PyoObject. Morphing index between 0 and 1.""" 
+        """PyoObject. Morphing index between 0 and 1."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -1707,7 +1833,7 @@ class Granulator(PyoObject):
     Granular synthesis generator.
 
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
 
         table : PyoTableObject
@@ -1715,25 +1841,25 @@ class Granulator(PyoObject):
         env : PyoTableObject
             Table containing the grain envelope.
         pitch : float or PyoObject, optional
-            Overall pitch of the granulator. This value transpose the 
+            Overall pitch of the granulator. This value transpose the
             pitch of all grains. Defaults to 1.
         pos : float or PyoObject, optional
-            Pointer position, in samples, in the waveform table. Each 
-            grain sampled the current value of this stream at the beginning 
-            of its envelope and hold it until the end of the grain. 
+            Pointer position, in samples, in the waveform table. Each
+            grain sampled the current value of this stream at the beginning
+            of its envelope and hold it until the end of the grain.
             Defaults to 0.
         dur : float or PyoObject, optional
-            Duration, in seconds, of the grain. Each grain sampled the 
-            current value of this stream at the beginning of its envelope 
+            Duration, in seconds, of the grain. Each grain sampled the
+            current value of this stream at the beginning of its envelope
             and hold it until the end of the grain. Defaults to 0.1.
         grains : int, optional
             Number of grains. Defaults to 8.
         basedur : float, optional
-            Base duration used to calculate the speed of the pointer to 
-            read the grain at its original pitch. By changing the value of 
+            Base duration used to calculate the speed of the pointer to
+            read the grain at its original pitch. By changing the value of
             the `dur` parameter, transposition per grain can be generated.
             Defaults to 0.1.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> snd = SndTable(SNDS_PATH + "/transparent.aif")
@@ -1752,20 +1878,20 @@ class Granulator(PyoObject):
         self._dur = dur
         self._grains = grains
         self._basedur = basedur
-        table, env, pitch, pos, dur, grains, basedur, mul, add, lmax = convertArgsToLists(table, env, pitch, 
+        table, env, pitch, pos, dur, grains, basedur, mul, add, lmax = convertArgsToLists(table, env, pitch,
                                                                         pos, dur, grains, basedur, mul, add)
-        self._base_objs = [Granulator_base(wrap(table,i), wrap(env,i), wrap(pitch,i), wrap(pos,i), wrap(dur,i), 
+        self._base_objs = [Granulator_base(wrap(table,i), wrap(env,i), wrap(pitch,i), wrap(pos,i), wrap(dur,i),
                           wrap(grains,i), wrap(basedur,i), wrap(mul,i), wrap(add,i)) for i in range(lmax)]
 
     def setTable(self, x):
         """
         Replace the `table` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `table` attribute.
-        
+
         """
         self._table = x
         x, lmax = convertArgsToLists(x)
@@ -1774,12 +1900,12 @@ class Granulator(PyoObject):
     def setEnv(self, x):
         """
         Replace the `env` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `env` attribute.
-        
+
         """
         self._env = x
         x, lmax = convertArgsToLists(x)
@@ -1788,12 +1914,12 @@ class Granulator(PyoObject):
     def setPitch(self, x):
         """
         Replace the `pitch` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `pitch` attribute.
-        
+
         """
         self._pitch = x
         x, lmax = convertArgsToLists(x)
@@ -1802,12 +1928,12 @@ class Granulator(PyoObject):
     def setPos(self, x):
         """
         Replace the `pos` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `pos` attribute.
-        
+
         """
         self._pos = x
         x, lmax = convertArgsToLists(x)
@@ -1816,12 +1942,12 @@ class Granulator(PyoObject):
     def setDur(self, x):
         """
         Replace the `dur` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `dur` attribute.
-        
+
         """
         self._dur = x
         x, lmax = convertArgsToLists(x)
@@ -1830,12 +1956,12 @@ class Granulator(PyoObject):
     def setGrains(self, x):
         """
         Replace the `grains` attribute.
-        
+
         :Args:
 
             x : int
                 new `grains` attribute.
-        
+
         """
         self._grains = x
         x, lmax = convertArgsToLists(x)
@@ -1844,12 +1970,12 @@ class Granulator(PyoObject):
     def setBaseDur(self, x):
         """
         Replace the `basedur` attribute.
-        
+
         :Args:
 
             x : float
                 new `basedur` attribute.
-        
+
         """
         self._basedur = x
         x, lmax = convertArgsToLists(x)
@@ -1932,7 +2058,7 @@ class TrigTableRec(PyoObject):
         table : NewTable
             The table where to write samples.
         fadetime : float, optional
-            Fade time at the beginning and the end of the recording 
+            Fade time at the beginning and the end of the recording
             in seconds. Defaults to 0.
 
     .. note::
@@ -1941,14 +2067,14 @@ class TrigTableRec(PyoObject):
 
         TrigTableRec has no `mul` and `add` attributes.
 
-        TrigTableRec will sends a trigger signal at the end of the recording. 
+        TrigTableRec will sends a trigger signal at the end of the recording.
         User can retrieve the trigger streams by calling obj['trig'].
 
-        obj['time'] outputs an audio stream of the current recording time, 
+        obj['time'] outputs an audio stream of the current recording time,
         in samples.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`NewTable`, :py:class:`TableRec`
 
     >>> s = Server().boot()
@@ -1987,7 +2113,7 @@ class TrigTableRec(PyoObject):
         pass
 
     def setAdd(self, x):
-        pass    
+        pass
 
     def setInput(self, x, fadetime=0.05):
         """
@@ -2035,14 +2161,14 @@ class TrigTableRec(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Audio signal to write in the table.""" 
+        """PyoObject. Audio signal to write in the table."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def trig(self):
-        """PyoObject. Audio signal sending triggers.""" 
+        """PyoObject. Audio signal sending triggers."""
         return self._trig
     @trig.setter
     def trig(self, x): self.setTrig(x)
@@ -2058,7 +2184,7 @@ class Looper(PyoObject):
     """
     Crossfading looper.
 
-    Looper reads audio from a PyoTableObject and plays it back in a loop with 
+    Looper reads audio from a PyoTableObject and plays it back in a loop with
     user-defined pitch, start time, duration and crossfade time. The `mode`
     argument allows the user to choose different looping modes.
 
@@ -2069,25 +2195,25 @@ class Looper(PyoObject):
         table : PyoTableObject
             Table containing the waveform samples.
         pitch : float or PyoObject, optional
-            Transposition factor. 1 is normal pitch, 0.5 is one octave lower, 2 is 
+            Transposition factor. 1 is normal pitch, 0.5 is one octave lower, 2 is
             one octave higher. Negative values are not allowed. Defaults to 1.
         start : float or PyoObject, optional
-            Starting point, in seconds, of the loop, updated only once per loop cycle. 
+            Starting point, in seconds, of the loop, updated only once per loop cycle.
             Defaults to 0.
         dur : float or PyoObject, optional
-            Duration, in seconds, of the loop, updated only once per loop cycle. 
+            Duration, in seconds, of the loop, updated only once per loop cycle.
             Defaults to 1.
         xfade : float or PyoObject {0 -> 50}, optional
-            Percent of the loop time used to crossfade readers, updated only once per 
+            Percent of the loop time used to crossfade readers, updated only once per
             loop cycle and clipped between 0 and 50. Defaults to 20.
         mode : int {0, 1, 2, 3}, optional
-            Loop modes. Defaults to 1. 
+            Loop modes. Defaults to 1.
                 0. no loop
-                1. forward 
+                1. forward
                 2. backward
                 3. back-and-forth
         xfadeshape : int {0, 1, 2}, optional
-            Crossfade envelope shape. Defaults to 0. 
+            Crossfade envelope shape. Defaults to 0.
                 0. linear
                 1. equal power
                 2. sigmoid
@@ -2105,8 +2231,8 @@ class Looper(PyoObject):
             to reduce the quantization noise produced by very low transpositions.
             Defaults to False.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`Granulator`, :py:class:`Pointer`
 
     >>> s = Server().boot()
@@ -2132,7 +2258,7 @@ class Looper(PyoObject):
         self._autosmooth = autosmooth
         table, pitch, start, dur, xfade, mode, xfadeshape, startfromloop, interp, autosmooth, mul, add, lmax = convertArgsToLists(
                                         table, pitch, start, dur, xfade, mode, xfadeshape, startfromloop, interp, autosmooth, mul, add)
-        self._base_objs = [Looper_base(wrap(table,i), wrap(pitch,i), wrap(start,i), wrap(dur,i), wrap(xfade,i), wrap(mode,i), 
+        self._base_objs = [Looper_base(wrap(table,i), wrap(pitch,i), wrap(start,i), wrap(dur,i), wrap(xfade,i), wrap(mode,i),
             wrap(xfadeshape,i), wrap(startfromloop,i), wrap(interp,i), wrap(autosmooth,i), wrap(mul,i), wrap(add,i)) for i in range(lmax)]
 
     def setTable(self, x):
@@ -2275,10 +2401,19 @@ class Looper(PyoObject):
         x, lmax = convertArgsToLists(x)
         [obj.setAutoSmooth(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
+    def reset(self):
+        """
+        Resets internal reading pointers to 0.
+
+        """
+        [obj.reset() for obj in self._base_objs]
+
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMap(0.1, 2., 'lin', 'pitch', self._pitch),
                           SLMap(0., self._table.getDur(), 'lin', 'start', self._start),
                           SLMap(0.01, self._table.getDur(), 'lin', 'dur', self._dur),
+                          SLMap(1, 50, 'lin', 'xfade', self._xfade),
+                          SLMap(0, 3, 'lin', 'mode', self._mode, res="int", dataOnly=True),
                           SLMap(0, 2, 'lin', 'xfadeshape', self._xfadeshape, res="int", dataOnly=True),
                           SLMap(1, 4, 'lin', 'interp', self._interp, res="int", dataOnly=True),
                           SLMapMul(self._mul)]
@@ -2353,7 +2488,7 @@ class Looper(PyoObject):
         return self._autosmooth
     @autosmooth.setter
     def autosmooth(self, x): self.setAutoSmooth(x)
-    
+
 class TablePut(PyoObject):
     """
     Writes values, without repetitions, from an audio stream into a DataTable.
@@ -2365,7 +2500,7 @@ class TablePut(PyoObject):
     repetitions.
 
     The play method is not called at the object creation time. It starts
-    the recording into the table until the table is full. Calling the 
+    the recording into the table until the table is full. Calling the
     play method again restarts the recording and overwrites previously
     recorded values. The stop method stops the recording. Otherwise, the
     default behaviour is to record through the end of the table.
@@ -2385,11 +2520,11 @@ class TablePut(PyoObject):
 
         TablePut has no `mul` and `add` attributes.
 
-        TablePut will sends a trigger signal at the end of the recording. 
+        TablePut will sends a trigger signal at the end of the recording.
         User can retrieve the trigger streams by calling obj['trig'].
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`DataTable`, :py:class:`NewTable`, :py:class:`TableRec`
 
     >>> s = Server().boot()
@@ -2417,14 +2552,14 @@ class TablePut(PyoObject):
 
     def setMul(self, x):
         pass
-        
+
     def setAdd(self, x):
-        pass    
+        pass
 
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -2439,12 +2574,12 @@ class TablePut(PyoObject):
     def setTable(self, x):
         """
         Replace the `table` attribute.
-        
+
         :Args:
 
             x : DataTable
                 new `table` attribute.
-        
+
         """
         self._table = x
         x, lmax = convertArgsToLists(x)
@@ -2452,7 +2587,7 @@ class TablePut(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Audio signal to write in the table.""" 
+        """PyoObject. Audio signal to write in the table."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -2463,16 +2598,16 @@ class TablePut(PyoObject):
         return self._table
     @table.setter
     def table(self, x): self.setTable(x)
-    
+
 class Granule(PyoObject):
     """
     Another granular synthesis generator.
 
-    As of pyo 0.7.4, users can call the `setSync` method to change the 
+    As of pyo 0.7.4, users can call the `setSync` method to change the
     granulation mode (either synchronous or asynchronous) of the object.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
 
         table : PyoTableObject
@@ -2485,15 +2620,15 @@ class Granule(PyoObject):
             Pitch of the grains. A new grain gets the current value
             of `pitch` as its reading speed. Defaults to 1.
         pos : float or PyoObject, optional
-            Pointer position, in samples, in the waveform table. Each 
-            grain sampled the current value of this stream at the beginning 
-            of its envelope and hold it until the end of the grain. 
+            Pointer position, in samples, in the waveform table. Each
+            grain sampled the current value of this stream at the beginning
+            of its envelope and hold it until the end of the grain.
             Defaults to 0.
         dur : float or PyoObject, optional
-            Duration, in seconds, of the grain. Each grain sampled the 
-            current value of this stream at the beginning of its envelope 
+            Duration, in seconds, of the grain. Each grain sampled the
+            current value of this stream at the beginning of its envelope
             and hold it until the end of the grain. Defaults to 0.1.
-    
+
     >>> s = Server().boot()
     >>> s.start()
     >>> snd = SndTable(SNDS_PATH+"/transparent.aif")
@@ -2515,18 +2650,18 @@ class Granule(PyoObject):
         self._dur = dur
         self._sync = 1
         table, env, dens, pitch, pos, dur, mul, add, lmax = convertArgsToLists(table, env, dens, pitch, pos, dur, mul, add)
-        self._base_objs = [Granule_base(wrap(table,i), wrap(env,i), wrap(dens,i), wrap(pitch,i), wrap(pos,i), wrap(dur,i), 
+        self._base_objs = [Granule_base(wrap(table,i), wrap(env,i), wrap(dens,i), wrap(pitch,i), wrap(pos,i), wrap(dur,i),
                                            wrap(mul,i), wrap(add,i)) for i in range(lmax)]
 
     def setTable(self, x):
         """
         Replace the `table` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `table` attribute.
-        
+
         """
         self._table = x
         x, lmax = convertArgsToLists(x)
@@ -2535,12 +2670,12 @@ class Granule(PyoObject):
     def setEnv(self, x):
         """
         Replace the `env` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `env` attribute.
-        
+
         """
         self._env = x
         x, lmax = convertArgsToLists(x)
@@ -2549,12 +2684,12 @@ class Granule(PyoObject):
     def setDens(self, x):
         """
         Replace the `dens` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `dens` attribute.
-        
+
         """
         self._dens = x
         x, lmax = convertArgsToLists(x)
@@ -2563,12 +2698,12 @@ class Granule(PyoObject):
     def setPitch(self, x):
         """
         Replace the `pitch` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `pitch` attribute.
-        
+
         """
         self._pitch = x
         x, lmax = convertArgsToLists(x)
@@ -2577,12 +2712,12 @@ class Granule(PyoObject):
     def setPos(self, x):
         """
         Replace the `pos` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `pos` attribute.
-        
+
         """
         self._pos = x
         x, lmax = convertArgsToLists(x)
@@ -2591,12 +2726,12 @@ class Granule(PyoObject):
     def setDur(self, x):
         """
         Replace the `dur` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `dur` attribute.
-        
+
         """
         self._dur = x
         x, lmax = convertArgsToLists(x)
@@ -2605,13 +2740,13 @@ class Granule(PyoObject):
     def setSync(self, x):
         """
         Sets the granulation mode, synchronous or asynchronous.
-        
+
         :Args:
 
             x : boolean
-                True means synchronous granulation (the default) 
+                True means synchronous granulation (the default)
                 while False means asynchronous.
-        
+
         """
         self._sync = x
         x, lmax = convertArgsToLists(x)
@@ -2706,12 +2841,12 @@ class TableScale(PyoObject):
     def setTable(self, x):
         """
         Replace the `table` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `table` attribute.
-        
+
         """
         self._table = x
         x, lmax = convertArgsToLists(x)
@@ -2720,12 +2855,12 @@ class TableScale(PyoObject):
     def setOuttable(self, x):
         """
         Replace the `outtable` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `outtable` attribute.
-        
+
         """
         self._outtable = x
         x, lmax = convertArgsToLists(x)
@@ -2737,14 +2872,14 @@ class TableScale(PyoObject):
 
     @property
     def table(self):
-        """PyoTableObject. Table containing the original values.""" 
+        """PyoTableObject. Table containing the original values."""
         return self._table
     @table.setter
     def table(self, x): self.setTable(x)
 
     @property
     def outtable(self):
-        """PyoTableObject. Scaled output table.""" 
+        """PyoTableObject. Scaled output table."""
         return self._outtable
     @outtable.setter
     def outtable(self, x): self.setOuttable(x)
@@ -2752,9 +2887,9 @@ class TableScale(PyoObject):
 class Particle(PyoObject):
     """
     A full control granular synthesis generator.
-    
+
     :Parent: :py:class:`PyoObject`
-    
+
     :Args:
 
         table : PyoTableObject
@@ -2764,37 +2899,37 @@ class Particle(PyoObject):
         dens : float or PyoObject, optional
             Density of grains per second. Defaults to 50.
         pitch : float or PyoObject, optional
-            Pitch of the grains. Each grain sampled the current value 
-            of this stream at the beginning of its envelope and hold 
+            Pitch of the grains. Each grain sampled the current value
+            of this stream at the beginning of its envelope and hold
             it until the end of the grain. Defaults to 1.
         pos : float or PyoObject, optional
-            Pointer position, in samples, in the waveform table. Each 
-            grain sampled the current value of this stream at the beginning 
-            of its envelope and hold it until the end of the grain. 
+            Pointer position, in samples, in the waveform table. Each
+            grain sampled the current value of this stream at the beginning
+            of its envelope and hold it until the end of the grain.
             Defaults to 0.
         dur : float or PyoObject, optional
-            Duration, in seconds, of the grain. Each grain sampled the 
-            current value of this stream at the beginning of its envelope 
+            Duration, in seconds, of the grain. Each grain sampled the
+            current value of this stream at the beginning of its envelope
             and hold it until the end of the grain. Defaults to 0.1.
         dev : float or PyoObject, optional
             Maximum deviation of the starting time of the grain, between 0 and
-            1 (relative to the current duration of the grain). Each grain sampled 
-            the current value of this stream at the beginning of its envelope 
+            1 (relative to the current duration of the grain). Each grain sampled
+            the current value of this stream at the beginning of its envelope
             and hold it until the end of the grain. Defaults to 0.01.
         pan : float or PyoObject, optional
-            Panning factor of the grain (if chnls=1, this value is skipped). 
-            Each grain sampled the current value of this stream at the beginning 
+            Panning factor of the grain (if chnls=1, this value is skipped).
+            Each grain sampled the current value of this stream at the beginning
             of its envelope and hold it until the end of the grain. Defaults to 0.5.
         chnls : integer, optional
-            Number of output channels per audio stream (if chnls=2 and a stereo sound 
-            table is given at the table argument, the objet will create 4 output 
-            streams, 2 per table channel). Available at initialization only. Defaults to 1. 
+            Number of output channels per audio stream (if chnls=2 and a stereo sound
+            table is given at the table argument, the objet will create 4 output
+            streams, 2 per table channel). Available at initialization only. Defaults to 1.
 
     .. note::
-    
+
         Particle object compensate for the difference between sampling rate of the
-        loaded sound and the current sampling rate of the Server. 
-            
+        loaded sound and the current sampling rate of the Server.
+
     >>> s = Server().boot()
     >>> s.start()
     >>> snd = SndTable(SNDS_PATH+"/transparent.aif")
@@ -2830,12 +2965,12 @@ class Particle(PyoObject):
     def setTable(self, x):
         """
         Replace the `table` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `table` attribute.
-        
+
         """
         self._table = x
         x, lmax = convertArgsToLists(x)
@@ -2844,12 +2979,12 @@ class Particle(PyoObject):
     def setEnv(self, x):
         """
         Replace the `env` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `env` attribute.
-        
+
         """
         self._env = x
         x, lmax = convertArgsToLists(x)
@@ -2858,12 +2993,12 @@ class Particle(PyoObject):
     def setDens(self, x):
         """
         Replace the `dens` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `dens` attribute.
-        
+
         """
         self._dens = x
         x, lmax = convertArgsToLists(x)
@@ -2872,12 +3007,12 @@ class Particle(PyoObject):
     def setPitch(self, x):
         """
         Replace the `pitch` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `pitch` attribute.
-        
+
         """
         self._pitch = x
         x, lmax = convertArgsToLists(x)
@@ -2886,12 +3021,12 @@ class Particle(PyoObject):
     def setPos(self, x):
         """
         Replace the `pos` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `pos` attribute.
-        
+
         """
         self._pos = x
         x, lmax = convertArgsToLists(x)
@@ -2900,12 +3035,12 @@ class Particle(PyoObject):
     def setDur(self, x):
         """
         Replace the `dur` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `dur` attribute.
-        
+
         """
         self._dur = x
         x, lmax = convertArgsToLists(x)
@@ -2914,12 +3049,12 @@ class Particle(PyoObject):
     def setDev(self, x):
         """
         Replace the `dev` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `dev` attribute.
-        
+
         """
         self._dev = x
         x, lmax = convertArgsToLists(x)
@@ -2928,12 +3063,12 @@ class Particle(PyoObject):
     def setPan(self, x):
         """
         Replace the `pan` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `pan` attribute.
-        
+
         """
         self._pan = x
         x, lmax = convertArgsToLists(x)
@@ -3004,4 +3139,4 @@ class Particle(PyoObject):
         """float or PyoObject.Panning of the grain."""
         return self._pan
     @pan.setter
-    def pan(self, x): self.setPan(x)
+    def pan(self, x): self.setPan(x)
\ No newline at end of file
diff --git a/pyolib/tables.py b/pyolib/tables.py
index 7119054..6bdffb0 100644
--- a/pyolib/tables.py
+++ b/pyolib/tables.py
@@ -1,21 +1,21 @@
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU Lesser General Public
+License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
 from _core import *
 from _maps import *
@@ -31,7 +31,7 @@ class HarmTable(PyoTableObject):
     """
     Harmonic waveform generator.
 
-    Generates composite waveforms made up of weighted sums 
+    Generates composite waveforms made up of weighted sums
     of simple sinusoids.
 
     :Parent: :py:class:`PyoTableObject`
@@ -39,7 +39,7 @@ class HarmTable(PyoTableObject):
     :Args:
 
         list : list, optional
-            Relative strengths of the fixed harmonic partial numbers 1,2,3, etc. 
+            Relative strengths of the fixed harmonic partial numbers 1,2,3, etc.
             Defaults to [1].
         size : int, optional
             Table size in samples. Defaults to 8192.
@@ -55,25 +55,25 @@ class HarmTable(PyoTableObject):
         PyoTableObject.__init__(self, size)
         self._list = copy.deepcopy(list)
         self._base_objs = [HarmTable_base(self._list, size)]
-    
+
     def replace(self, list):
         """
-        Redraw the waveform according to a new set of harmonics 
+        Redraw the waveform according to a new set of harmonics
         relative strengths.
-        
+
         :Args:
-        
+
             list : list
-                Relative strengths of the fixed harmonic partial 
+                Relative strengths of the fixed harmonic partial
                 numbers 1,2,3, etc.
 
-        """      
+        """
         self._list = list
         [obj.replace(list) for obj in self._base_objs]
         self.refreshView()
 
     @property
-    def list(self): 
+    def list(self):
         """list. Relative strengths of the fixed harmonic partial numbers."""
         return self._list
     @list.setter
@@ -90,7 +90,7 @@ class SawTable(PyoTableObject):
     :Args:
 
         order : int, optional
-            Number of harmonics sawtooth is made of. 
+            Number of harmonics sawtooth is made of.
             Defaults to 10.
         size : int, optional
             Table size in samples. Defaults to 8192.
@@ -106,24 +106,24 @@ class SawTable(PyoTableObject):
         self._order = order
         list = [1./i for i in range(1,(order+1))]
         self._base_objs = [HarmTable_base(list, size)]
-    
+
     def setOrder(self, x):
         """
         Change the `order` attribute and redraw the waveform.
-        
+
         :Args:
-        
+
             x : int
                 New number of harmonics
 
-        """      
+        """
         self._order = x
         list = [1./i for i in range(1,(self._order+1))]
         [obj.replace(list) for obj in self._base_objs]
         self.refreshView()
 
     @property
-    def order(self): 
+    def order(self):
         """int. Number of harmonics sawtooth is made of."""
         return self._order
     @order.setter
@@ -140,7 +140,7 @@ class SquareTable(PyoTableObject):
     :Args:
 
         order : int, optional
-            Number of harmonics square waveform is made of. The waveform will 
+            Number of harmonics square waveform is made of. The waveform will
             contains `order` odd harmonics. Defaults to 10.
         size : int, optional
             Table size in samples. Defaults to 8192.
@@ -159,31 +159,31 @@ class SquareTable(PyoTableObject):
             if i%2 == 1:
                 list.append(1./i)
             else:
-                list.append(0.)    
+                list.append(0.)
         self._base_objs = [HarmTable_base(list, size)]
-    
+
     def setOrder(self, x):
         """
         Change the `order` attribute and redraw the waveform.
-        
+
         :Args:
-        
+
             x : int
                 New number of harmonics
 
-        """      
+        """
         self._order = x
         list = []
         for i in range(1,(self._order*2)):
             if i%2 == 1:
                 list.append(1./i)
             else:
-                list.append(0.)    
+                list.append(0.)
         [obj.replace(list) for obj in self._base_objs]
         self.refreshView()
 
     @property
-    def order(self): 
+    def order(self):
         """int. Number of harmonics square waveform is made of."""
         return self._order
     @order.setter
@@ -193,17 +193,17 @@ class ChebyTable(PyoTableObject):
     """
     Chebyshev polynomials of the first kind.
 
-    Uses Chebyshev coefficients to generate stored polynomial functions 
-    which, under waveshaping, can be used to split a sinusoid into 
-    harmonic partials having a pre-definable spectrum. 
+    Uses Chebyshev coefficients to generate stored polynomial functions
+    which, under waveshaping, can be used to split a sinusoid into
+    harmonic partials having a pre-definable spectrum.
 
     :Parent: :py:class:`PyoTableObject`
 
     :Args:
 
         list : list, optional
-            Relative strengths of partials numbers 1,2,3, ..., 12 that will 
-            result when a sinusoid of amplitude 1 is waveshaped using this 
+            Relative strengths of partials numbers 1,2,3, ..., 12 that will
+            result when a sinusoid of amplitude 1 is waveshaped using this
             function table. Up to 12 partials can be specified. Defaults to [1].
         size : int, optional
             Table size in samples. Defaults to 8192.
@@ -220,29 +220,29 @@ class ChebyTable(PyoTableObject):
         PyoTableObject.__init__(self, size)
         self._list = copy.deepcopy(list)
         self._base_objs = [ChebyTable_base(self._list, size)]
-    
+
     def replace(self, list):
         """
-        Redraw the waveform according to a new set of harmonics 
-        relative strengths that will result when a sinusoid of 
+        Redraw the waveform according to a new set of harmonics
+        relative strengths that will result when a sinusoid of
         amplitude 1 is waveshaped using this function table.
-        
+
         :Args:
-        
+
             list : list
-                Relative strengths of the fixed harmonic partial 
+                Relative strengths of the fixed harmonic partial
                 numbers 1,2,3, ..., 12. Up to 12 partials can be specified.
 
-        """ 
+        """
         self._list = list
         [obj.replace(list) for obj in self._base_objs]
         self.refreshView()
 
     def getNormTable(self):
         """
-        Return a DataTable filled with the normalization function 
+        Return a DataTable filled with the normalization function
         corresponding to the current polynomial.
-        
+
         """
         if sum(self._list[1::2]) == 0:
             data = self._base_objs[0].getNormTable(0)
@@ -251,15 +251,15 @@ class ChebyTable(PyoTableObject):
         return DataTable(size=len(data), init=data).normalize()
 
     @property
-    def list(self): 
+    def list(self):
         """list. Relative strengths of the fixed harmonic partial numbers."""
         return self._list
     @list.setter
     def list(self, x): self.replace(x)
-        
+
 class HannTable(PyoTableObject):
     """
-    Generates Hanning window function. 
+    Generates Hanning window function.
 
     :Parent: :py:class:`PyoTableObject`
 
@@ -282,7 +282,7 @@ class HannTable(PyoTableObject):
 
 class SincTable(PyoTableObject):
     """
-    Generates sinc window function. 
+    Generates sinc window function.
 
     :Parent: :py:class:`PyoTableObject`
 
@@ -337,13 +337,13 @@ class SincTable(PyoTableObject):
         self.refreshView()
 
     @property
-    def freq(self): 
+    def freq(self):
         """float. Frequency of the sinc function."""
         return self._freq
     @freq.setter
     def freq(self, x): self.setFreq(x)
     @property
-    def windowed(self): 
+    def windowed(self):
         """boolean. Windowed flag."""
         return self._windowed
     @windowed.setter
@@ -351,7 +351,7 @@ class SincTable(PyoTableObject):
 
 class WinTable(PyoTableObject):
     """
-    Generates different kind of windowing functions. 
+    Generates different kind of windowing functions.
 
     :Parent: :py:class:`PyoTableObject`
 
@@ -399,7 +399,7 @@ class WinTable(PyoTableObject):
         self.refreshView()
 
     @property
-    def type(self): 
+    def type(self):
         """int. Windowing function."""
         return self._type
     @type.setter
@@ -407,9 +407,9 @@ class WinTable(PyoTableObject):
 
 class ParaTable(PyoTableObject):
     """
-    Generates parabola window function. 
+    Generates parabola window function.
 
-    The parabola is a conic section, the intersection of a right circular conical 
+    The parabola is a conic section, the intersection of a right circular conical
     surface and a plane parallel to a generating straight line of that surface.
 
     :Parent: :py:class:`PyoTableObject`
@@ -440,17 +440,17 @@ class LinTable(PyoTableObject):
     :Args:
 
         list : list, optional
-            List of tuples indicating location and value of each points 
-            in the table. The default, [(0,0.), (8191, 1.)], creates a 
-            straight line from 0.0 at location 0 to 1.0 at the end of the 
+            List of tuples indicating location and value of each points
+            in the table. The default, [(0,0.), (8191, 1.)], creates a
+            straight line from 0.0 at location 0 to 1.0 at the end of the
             table (size - 1). Location must be an integer.
         size : int, optional
             Table size in samples. Defaults to 8192.
 
     .. note::
 
-        Locations in the list must be in increasing order. If the last value 
-        is less than size, the rest of the table will be filled with zeros. 
+        Locations in the list must be in increasing order. If the last value
+        is less than size, the rest of the table will be filled with zeros.
 
     >>> s = Server().boot()
     >>> s.start()
@@ -468,18 +468,18 @@ class LinTable(PyoTableObject):
             size = list[-1][0] + 1
             self._size = size
         self._base_objs = [LinTable_base(copy.deepcopy(list), size)]
-    
+
     def replace(self, list):
         """
         Draw a new envelope according to the new `list` parameter.
-        
+
         :Args:
-        
+
             list : list
-                List of tuples indicating location and value of each points 
+                List of tuples indicating location and value of each points
                 in the table. Location must be integer.
 
-        """ 
+        """
         self._list = list
         [obj.replace(list) for obj in self._base_objs]
         self.refreshView()
@@ -487,14 +487,14 @@ class LinTable(PyoTableObject):
     def loadRecFile(self, filename, tolerance=0.02):
         """
         Import an automation recording file in the table.
-        
+
         loadRecFile takes a recording file, usually from a ControlRec object,
         as `filename` parameter, applies a filtering pre-processing to eliminate
-        redundancies and loads the result in the table as a list of points. 
-        Filtering process can be controled with the `tolerance` parameter. 
-        
+        redundancies and loads the result in the table as a list of points.
+        Filtering process can be controled with the `tolerance` parameter.
+
         :Args:
-        
+
             filename : string
                 Full path of an automation recording file.
             tolerance : float, optional
@@ -530,9 +530,9 @@ class LinTable(PyoTableObject):
         Opens a grapher window to control the shape of the envelope.
 
         When editing the grapher with the mouse, the new set of points
-        will be send to the object on mouse up. 
-        
-        Ctrl+C with focus on the grapher will copy the list of points to the 
+        will be send to the object on mouse up.
+
+        Ctrl+C with focus on the grapher will copy the list of points to the
         clipboard, giving an easy way to insert the new shape in a script.
 
         :Args:
@@ -541,21 +541,21 @@ class LinTable(PyoTableObject):
                 Set the min and max values of the Y axis of the graph.
                 Defaults to (0.0, 1.0).
             title : string, optional
-                Title of the window. If none is provided, the name of the 
+                Title of the window. If none is provided, the name of the
                 class is used.
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for 
-        the server GUI before showing the controller window. 
+
+        If `wxnoserver` is set to True, the interpreter will not wait for
+        the server GUI before showing the controller window.
 
         """
         createGraphWindow(self, 0, self._size, yrange, title, wxnoserver)
 
     @property
     def list(self):
-        """list. List of tuples indicating location and value of each points in the table.""" 
+        """list. List of tuples indicating location and value of each points in the table."""
         return self.getPoints()
     @list.setter
     def list(self, x): self.replace(x)
@@ -569,18 +569,18 @@ class LogTable(PyoTableObject):
     :Args:
 
         list : list, optional
-            List of tuples indicating location and value of each points 
-            in the table. The default, [(0,0.), (8191, 1.)], creates a 
-            logarithmic line from 0.0 at location 0 to 1.0 at the end of 
+            List of tuples indicating location and value of each points
+            in the table. The default, [(0,0.), (8191, 1.)], creates a
+            logarithmic line from 0.0 at location 0 to 1.0 at the end of
             the table (size - 1). Location must be an integer.
         size : int, optional
             Table size in samples. Defaults to 8192.
 
     .. note::
 
-        Locations in the list must be in increasing order. If the last value 
-        is less than size, the rest of the table will be filled with zeros. 
-        
+        Locations in the list must be in increasing order. If the last value
+        is less than size, the rest of the table will be filled with zeros.
+
         Values must be greater than 0.0.
 
     >>> s = Server().boot()
@@ -606,10 +606,10 @@ class LogTable(PyoTableObject):
         :Args:
 
             list : list
-                List of tuples indicating location and value of each points 
+                List of tuples indicating location and value of each points
                 in the table. Location must be integer.
 
-        """ 
+        """
         self._list = list
         [obj.replace(list) for obj in self._base_objs]
         self.refreshView()
@@ -620,8 +620,8 @@ class LogTable(PyoTableObject):
 
         loadRecFile takes a recording file, usually from a ControlRec object,
         as `filename` parameter, applies a filtering pre-processing to eliminate
-        redundancies and loads the result in the table as a list of points. 
-        Filtering process can be controled with the `tolerance` parameter. 
+        redundancies and loads the result in the table as a list of points.
+        Filtering process can be controled with the `tolerance` parameter.
 
         :Args:
 
@@ -660,9 +660,9 @@ class LogTable(PyoTableObject):
         Opens a grapher window to control the shape of the envelope.
 
         When editing the grapher with the mouse, the new set of points
-        will be send to the object on mouse up. 
+        will be send to the object on mouse up.
 
-        Ctrl+C with focus on the grapher will copy the list of points to the 
+        Ctrl+C with focus on the grapher will copy the list of points to the
         clipboard, giving an easy way to insert the new shape in a script.
 
         :Args:
@@ -671,21 +671,21 @@ class LogTable(PyoTableObject):
                 Set the min and max values of the Y axis of the graph.
                 Defaults to (0.0, 1.0).
             title : string, optional
-                Title of the window. If none is provided, the name of the 
+                Title of the window. If none is provided, the name of the
                 class is used.
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for 
-        the server GUI before showing the controller window. 
+
+        If `wxnoserver` is set to True, the interpreter will not wait for
+        the server GUI before showing the controller window.
 
         """
         createGraphWindow(self, 4, self._size, yrange, title, wxnoserver)
 
     @property
     def list(self):
-        """list. List of tuples indicating location and value of each points in the table.""" 
+        """list. List of tuples indicating location and value of each points in the table."""
         return self.getPoints()
     @list.setter
     def list(self, x): self.replace(x)
@@ -699,17 +699,17 @@ class CosLogTable(PyoTableObject):
     :Args:
 
         list : list, optional
-            List of tuples indicating location and value of each points 
-            in the table. The default, [(0,0.), (8191, 1.)], creates a 
-            logarithmic line from 0.0 at location 0 to 1.0 at the end of 
+            List of tuples indicating location and value of each points
+            in the table. The default, [(0,0.), (8191, 1.)], creates a
+            logarithmic line from 0.0 at location 0 to 1.0 at the end of
             the table (size - 1). Location must be an integer.
         size : int, optional
             Table size in samples. Defaults to 8192.
 
     .. note::
 
-        Locations in the list must be in increasing order. If the last value 
-        is less than size, the rest of the table will be filled with zeros. 
+        Locations in the list must be in increasing order. If the last value
+        is less than size, the rest of the table will be filled with zeros.
 
         Values must be greater than 0.0.
 
@@ -736,10 +736,10 @@ class CosLogTable(PyoTableObject):
         :Args:
 
             list : list
-                List of tuples indicating location and value of each points 
+                List of tuples indicating location and value of each points
                 in the table. Location must be integer.
 
-        """ 
+        """
         self._list = list
         [obj.replace(list) for obj in self._base_objs]
         self.refreshView()
@@ -750,8 +750,8 @@ class CosLogTable(PyoTableObject):
 
         loadRecFile takes a recording file, usually from a ControlRec object,
         as `filename` parameter, applies a filtering pre-processing to eliminate
-        redundancies and loads the result in the table as a list of points. 
-        Filtering process can be controled with the `tolerance` parameter. 
+        redundancies and loads the result in the table as a list of points.
+        Filtering process can be controled with the `tolerance` parameter.
 
         :Args:
 
@@ -790,9 +790,9 @@ class CosLogTable(PyoTableObject):
         Opens a grapher window to control the shape of the envelope.
 
         When editing the grapher with the mouse, the new set of points
-        will be send to the object on mouse up. 
+        will be send to the object on mouse up.
 
-        Ctrl+C with focus on the grapher will copy the list of points to the 
+        Ctrl+C with focus on the grapher will copy the list of points to the
         clipboard, giving an easy way to insert the new shape in a script.
 
         :Args:
@@ -801,21 +801,21 @@ class CosLogTable(PyoTableObject):
                 Set the min and max values of the Y axis of the graph.
                 Defaults to (0.0, 1.0).
             title : string, optional
-                Title of the window. If none is provided, the name of the 
+                Title of the window. If none is provided, the name of the
                 class is used.
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for 
-        the server GUI before showing the controller window. 
+
+        If `wxnoserver` is set to True, the interpreter will not wait for
+        the server GUI before showing the controller window.
 
         """
         createGraphWindow(self, 5, self._size, yrange, title, wxnoserver)
 
     @property
     def list(self):
-        """list. List of tuples indicating location and value of each points in the table.""" 
+        """list. List of tuples indicating location and value of each points in the table."""
         return self.getPoints()
     @list.setter
     def list(self, x): self.replace(x)
@@ -829,17 +829,17 @@ class CosTable(PyoTableObject):
     :Args:
 
         list : list, optional
-            List of tuples indicating location and value of each points 
-            in the table. The default, [(0,0.), (8191, 1.)], creates a 
-            cosine line from 0.0 at location 0 to 1.0 at the end of the 
+            List of tuples indicating location and value of each points
+            in the table. The default, [(0,0.), (8191, 1.)], creates a
+            cosine line from 0.0 at location 0 to 1.0 at the end of the
             table (size - 1). Location must be an integer.
         size : int, optional
             Table size in samples. Defaults to 8192.
 
     .. note::
 
-        Locations in the list must be in increasing order. If the last value 
-        is less than size, the rest of the table will be filled with zeros. 
+        Locations in the list must be in increasing order. If the last value
+        is less than size, the rest of the table will be filled with zeros.
 
     >>> s = Server().boot()
     >>> s.start()
@@ -857,18 +857,18 @@ class CosTable(PyoTableObject):
             size = list[-1][0] + 1
             self._size = size
         self._base_objs = [CosTable_base(copy.deepcopy(list), size)]
-    
+
     def replace(self, list):
         """
         Draw a new envelope according to the new `list` parameter.
-        
+
         :Args:
-        
+
             list : list
-                List of tuples indicating location and value of each points 
+                List of tuples indicating location and value of each points
                 in the table. Location must be integer.
 
-        """      
+        """
         self._list = list
         [obj.replace(list) for obj in self._base_objs]
         self.refreshView()
@@ -879,8 +879,8 @@ class CosTable(PyoTableObject):
 
         loadRecFile takes a recording file, usually from a ControlRec object,
         as `filename` parameter, applies a filtering pre-processing to eliminate
-        redundancies and loads the result in the table as a list of points. 
-        Filtering process can be controled with the `tolerance` parameter. 
+        redundancies and loads the result in the table as a list of points.
+        Filtering process can be controled with the `tolerance` parameter.
 
         :Args:
 
@@ -919,9 +919,9 @@ class CosTable(PyoTableObject):
         Opens a grapher window to control the shape of the envelope.
 
         When editing the grapher with the mouse, the new set of points
-        will be send to the object on mouse up. 
+        will be send to the object on mouse up.
 
-        Ctrl+C with focus on the grapher will copy the list of points to the 
+        Ctrl+C with focus on the grapher will copy the list of points to the
         clipboard, giving an easy way to insert the new shape in a script.
 
         :Args:
@@ -930,21 +930,21 @@ class CosTable(PyoTableObject):
                 Set the min and max values of the Y axis of the graph.
                 Defaults to (0.0, 1.0).
             title : string, optional
-                Title of the window. If none is provided, the name of the 
+                Title of the window. If none is provided, the name of the
                 class is used.
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for 
-        the server GUI before showing the controller window. 
+
+        If `wxnoserver` is set to True, the interpreter will not wait for
+        the server GUI before showing the controller window.
 
         """
         createGraphWindow(self, 1, self._size, yrange, title, wxnoserver)
 
     @property
     def list(self):
-        """list. List of tuples indicating location and value of each points in the table.""" 
+        """list. List of tuples indicating location and value of each points in the table."""
         return self.getPoints()
     @list.setter
     def list(self, x): self.replace(x)
@@ -955,8 +955,8 @@ class CurveTable(PyoTableObject):
 
     CurveTable uses Hermite interpolation (sort of cubic interpolation)
     to calculate each points of the curve. This algorithm allows tension
-    and biasing controls. Tension can be used to tighten up the curvature 
-    at the known points. The bias is used to twist the curve about the 
+    and biasing controls. Tension can be used to tighten up the curvature
+    at the known points. The bias is used to twist the curve about the
     known points.
 
     :Parent: :py:class:`PyoTableObject`
@@ -964,23 +964,23 @@ class CurveTable(PyoTableObject):
     :Args:
 
         list : list, optional
-            List of tuples indicating location and value of each points 
-            in the table. The default, [(0,0.), (8191, 1.)], creates a 
-            curved line from 0.0 at location 0 to 1.0 at the end of the 
+            List of tuples indicating location and value of each points
+            in the table. The default, [(0,0.), (8191, 1.)], creates a
+            curved line from 0.0 at location 0 to 1.0 at the end of the
             table (size - 1). Location must be an integer.
         tension : float, optional
             Curvature at the known points. 1 is high, 0 normal, -1 is low.
             Defaults to 0.
         bias : float, optional
             Curve attraction (for each segments) toward bundary points.
-            0 is even, positive is towards first point, negative is towards 
+            0 is even, positive is towards first point, negative is towards
             the second point. Defaults to 0.
         size : int, optional
             Table size in samples. Defaults to 8192.
 
     .. note::
 
-        Locations in the list must be in increasing order. If the last value 
+        Locations in the list must be in increasing order. If the last value
         is less than size, the rest of the table will be filled with zeros.
 
         High tension or bias values can create unstable or very loud table,
@@ -1008,14 +1008,14 @@ class CurveTable(PyoTableObject):
     def setTension(self, x):
         """
         Replace the `tension` attribute.
-        
+
         1 is high, 0 normal, -1 is low.
-        
+
         :Args:
-        
+
             x : float
                 New `tension` attribute.
-        
+
         """
         self._tension = x
         [obj.setTension(x) for obj in self._base_objs]
@@ -1024,31 +1024,31 @@ class CurveTable(PyoTableObject):
     def setBias(self, x):
         """
         Replace the `bias` attribute.
-        
-        0 is even, positive is towards first point, negative is towards 
+
+        0 is even, positive is towards first point, negative is towards
         the second point.
-        
+
         :Args:
-        
+
             x : float
                 New `bias` attribute.
-        
+
         """
         self._bias = x
         [obj.setBias(x) for obj in self._base_objs]
         self.refreshView()
-     
+
     def replace(self, list):
         """
         Draw a new envelope according to the new `list` parameter.
-        
+
         :Args:
-        
+
             list : list
-                List of tuples indicating location and value of each points 
+                List of tuples indicating location and value of each points
                 in the table. Location must be integer.
 
-        """      
+        """
         self._list = list
         [obj.replace(list) for obj in self._base_objs]
         self.refreshView()
@@ -1059,8 +1059,8 @@ class CurveTable(PyoTableObject):
 
         loadRecFile takes a recording file, usually from a ControlRec object,
         as `filename` parameter, applies a filtering pre-processing to eliminate
-        redundancies and loads the result in the table as a list of points. 
-        Filtering process can be controled with the `tolerance` parameter. 
+        redundancies and loads the result in the table as a list of points.
+        Filtering process can be controled with the `tolerance` parameter.
 
         :Args:
 
@@ -1086,7 +1086,7 @@ class CurveTable(PyoTableObject):
             self._list = values
             obj.replace(values)
         self.refreshView()
-        
+
     def getPoints(self):
         """
         Returns list of points of the current table.
@@ -1099,9 +1099,9 @@ class CurveTable(PyoTableObject):
         Opens a grapher window to control the shape of the envelope.
 
         When editing the grapher with the mouse, the new set of points
-        will be send to the object on mouse up. 
+        will be send to the object on mouse up.
 
-        Ctrl+C with focus on the grapher will copy the list of points to the 
+        Ctrl+C with focus on the grapher will copy the list of points to the
         clipboard, giving an easy way to insert the new shape in a script.
 
         :Args:
@@ -1110,35 +1110,35 @@ class CurveTable(PyoTableObject):
                 Set the min and max values of the Y axis of the graph.
                 Defaults to (0.0, 1.0).
             title : string, optional
-                Title of the window. If none is provided, the name of the 
+                Title of the window. If none is provided, the name of the
                 class is used.
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for 
-        the server GUI before showing the controller window. 
+
+        If `wxnoserver` is set to True, the interpreter will not wait for
+        the server GUI before showing the controller window.
 
         """
         createGraphWindow(self, 3, self._size, yrange, title, wxnoserver)
 
     @property
     def tension(self):
-        """float. Curvature tension.""" 
+        """float. Curvature tension."""
         return self._tension
     @tension.setter
     def tension(self, x): self.setTension(x)
 
     @property
     def bias(self):
-        """float. Curve Attraction.""" 
+        """float. Curve Attraction."""
         return self._bias
     @bias.setter
     def bias(self, x): self.setBias(x)
 
     @property
     def list(self):
-        """list. List of tuples indicating location and value of each points in the table.""" 
+        """list. List of tuples indicating location and value of each points in the table."""
         return self.getPoints()
     @list.setter
     def list(self, x): self.replace(x)
@@ -1152,22 +1152,22 @@ class ExpTable(PyoTableObject):
     :Args:
 
         list : list, optional
-            List of tuples indicating location and value of each points 
-            in the table. The default, [(0,0.), (8192, 1.)], creates a 
-            exponential line from 0.0 at location 0 to 1.0 at the end of 
+            List of tuples indicating location and value of each points
+            in the table. The default, [(0,0.), (8192, 1.)], creates a
+            exponential line from 0.0 at location 0 to 1.0 at the end of
             the table. Location must be an integer.
         exp : float, optional
             Exponent factor. Used to control the slope of the curve.
             Defaults to 10.
         inverse : boolean, optional
-            If True, downward slope will be inversed. Useful to create 
+            If True, downward slope will be inversed. Useful to create
             biexponential curves. Defaults to True.
         size : int, optional
             Table size in samples. Defaults to 8192.
 
     .. note::
 
-        Locations in the list must be in increasing order. If the last value 
+        Locations in the list must be in increasing order. If the last value
         is less than size, the rest of the table will be filled with zeros.
 
     >>> s = Server().boot()
@@ -1191,12 +1191,12 @@ class ExpTable(PyoTableObject):
     def setExp(self, x):
         """
         Replace the `exp` attribute.
-        
+
         :Args:
-        
+
             x : float
                 New `exp` attribute.
-        
+
         """
         self._exp = x
         [obj.setExp(x) for obj in self._base_objs]
@@ -1205,25 +1205,25 @@ class ExpTable(PyoTableObject):
     def setInverse(self, x):
         """
         Replace the `inverse` attribute.
-        
+
         :Args:
-        
+
             x : boolean
                 New `inverse` attribute.
-        
+
         """
         self._inverse = x
         [obj.setInverse(x) for obj in self._base_objs]
         self.refreshView()
-  
+
     def replace(self, list):
         """
         Draw a new envelope according to the new `list` parameter.
-        
+
         :Args:
-        
+
             list : list
-                List of tuples indicating location and value of each points 
+                List of tuples indicating location and value of each points
                 in the table. Location must be integer.
 
         """
@@ -1237,8 +1237,8 @@ class ExpTable(PyoTableObject):
 
         loadRecFile takes a recording file, usually from a ControlRec object,
         as `filename` parameter, applies a filtering pre-processing to eliminate
-        redundancies and loads the result in the table as a list of points. 
-        Filtering process can be controled with the `tolerance` parameter. 
+        redundancies and loads the result in the table as a list of points.
+        Filtering process can be controled with the `tolerance` parameter.
 
         :Args:
 
@@ -1264,7 +1264,7 @@ class ExpTable(PyoTableObject):
             self._list = values
             obj.replace(values)
         self.refreshView()
-        
+
     def getPoints(self):
         """
         Returns list of points of the current table.
@@ -1277,9 +1277,9 @@ class ExpTable(PyoTableObject):
         Opens a grapher window to control the shape of the envelope.
 
         When editing the grapher with the mouse, the new set of points
-        will be send to the object on mouse up. 
+        will be send to the object on mouse up.
 
-        Ctrl+C with focus on the grapher will copy the list of points to the 
+        Ctrl+C with focus on the grapher will copy the list of points to the
         clipboard, giving an easy way to insert the new shape in a script.
 
         :Args:
@@ -1288,33 +1288,33 @@ class ExpTable(PyoTableObject):
                 Set the min and max values of the Y axis of the graph.
                 Defaults to (0.0, 1.0).
             title : string, optional
-                Title of the window. If none is provided, the name of the 
+                Title of the window. If none is provided, the name of the
                 class is used.
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for 
-        the server GUI before showing the controller window. 
+
+        If `wxnoserver` is set to True, the interpreter will not wait for
+        the server GUI before showing the controller window.
 
         """
         createGraphWindow(self, 2, self._size, yrange, title, wxnoserver)
 
     @property
     def exp(self):
-        """float. Exponent factor.""" 
+        """float. Exponent factor."""
         return self._exp
     @exp.setter
     def exp(self, x): self.setExp(x)
     @property
     def inverse(self):
-        """boolean. Inverse factor.""" 
+        """boolean. Inverse factor."""
         return self._inverse
     @inverse.setter
     def inverse(self, x): self.setInverse(x)
     @property
     def list(self):
-        """list. List of tuples indicating location and value of each points in the table.""" 
+        """list. List of tuples indicating location and value of each points in the table."""
         return self.getPoints()
     @list.setter
     def list(self, x): self.replace(x)
@@ -1323,7 +1323,7 @@ class SndTable(PyoTableObject):
     """
     Transfers data from a soundfile into a function table.
 
-    If `chnl` is None, the table will contain as many table streams as 
+    If `chnl` is None, the table will contain as many table streams as
     necessary to read all channels of the loaded sound.
 
     :Parent: :py:class:`PyoTableObject`
@@ -1337,11 +1337,11 @@ class SndTable(PyoTableObject):
             Channel number to read in. Available at initialization time only.
             The default (None) reads all channels.
         start : float, optional
-            Begins reading at `start` seconds into the file. Available at 
+            Begins reading at `start` seconds into the file. Available at
             initialization time only. Defaults to 0.
         stop : float, optional
-            Stops reading at `stop` seconds into the file. Available at 
-            initialization time only. The default (None) means the end of 
+            Stops reading at `stop` seconds into the file. Available at
+            initialization time only. The default (None) means the end of
             the file.
 
     >>> s = Server().boot()
@@ -1386,20 +1386,20 @@ class SndTable(PyoTableObject):
     def setSound(self, path, start=0, stop=None):
         """
         Load a new sound in the table.
-        
+
         Keeps the number of channels of the sound loaded at initialization.
-        If the new sound has less channels, it will wrap around and load 
-        the same channels many times. If the new sound has more channels, 
+        If the new sound has less channels, it will wrap around and load
+        the same channels many times. If the new sound has more channels,
         the extra channels will be skipped.
-        
+
         :Args:
-        
+
             path : string
                 Full path of the new sound.
             start : float, optional
                 Begins reading at `start` seconds into the file. Defaults to 0.
             stop : float, optional
-                Stops reading at `stop` seconds into the file. The default (None) 
+                Stops reading at `stop` seconds into the file. The default (None)
                 means the end of the file.
 
         """
@@ -1432,8 +1432,8 @@ class SndTable(PyoTableObject):
         Append a sound to the one already in the table with crossfade.
 
         Keeps the number of channels of the sound loaded at initialization.
-        If the new sound has less channels, it will wrap around and load 
-        the same channels many times. If the new sound has more channels, 
+        If the new sound has less channels, it will wrap around and load
+        the same channels many times. If the new sound has more channels,
         the extra channels will be skipped.
 
         :Args:
@@ -1441,12 +1441,12 @@ class SndTable(PyoTableObject):
             path : string
                 Full path of the new sound.
             crossfade : float, optional
-                Crossfade time, in seconds, between the sound already in the table 
+                Crossfade time, in seconds, between the sound already in the table
                 and the new one. Defaults to 0.
             start : float, optional
                 Begins reading at `start` seconds into the file. Defaults to 0.
             stop : float, optional
-                Stops reading at `stop` seconds into the file. The default, None, 
+                Stops reading at `stop` seconds into the file. The default, None,
                 means the end of the file.
 
         """
@@ -1477,12 +1477,12 @@ class SndTable(PyoTableObject):
         """
         Insert a sound into the one already in the table with crossfade.
 
-        Insert a sound at position `pos`, specified in seconds, 
+        Insert a sound at position `pos`, specified in seconds,
         with crossfading at the beginning and the end of the insertion.
-        
+
         Keeps the number of channels of the sound loaded at initialization.
-        If the new sound has less channels, it will wrap around and load 
-        the same channels many times. If the new sound has more channels, 
+        If the new sound has less channels, it will wrap around and load
+        the same channels many times. If the new sound has more channels,
         the extra channels will be skipped.
 
         :Args:
@@ -1493,12 +1493,12 @@ class SndTable(PyoTableObject):
                 Position in the table, in seconds, where to insert the new sound.
                 Defaults to 0.
             crossfade : float, optional
-                Crossfade time, in seconds, between the sound already in the table 
+                Crossfade time, in seconds, between the sound already in the table
                 and the new one. Defaults to 0.
             start : float, optional
                 Begins reading at `start` seconds into the file. Defaults to 0.
             stop : float, optional
-                Stops reading at `stop` seconds into the file. The default, None, 
+                Stops reading at `stop` seconds into the file. The default, None,
                 means the end of the file.
 
         """
@@ -1527,9 +1527,9 @@ class SndTable(PyoTableObject):
 
     def getRate(self):
         """
-        Return the frequency in cps at which the sound will be read at its 
+        Return the frequency in cps at which the sound will be read at its
         original pitch.
-        
+
         """
         if type(self._path) == ListType:
             return [obj.getRate() for obj in self._base_objs]
@@ -1539,18 +1539,18 @@ class SndTable(PyoTableObject):
     def getDur(self, all=True):
         """
         Return the duration of the sound in seconds.
-        
+
         :Args:
-        
+
             all : boolean
                 If the table contains more than one sound and `all` is True,
                 returns a list of all durations. Otherwise, returns only the
                 first duration as a float.
-        
+
         """
         if type(self._path) == ListType:
             _dur = [1./obj.getRate() for obj in self._base_objs]
-        else:    
+        else:
             _dur = 1./self._base_objs[0].getRate()
 
         if all:
@@ -1569,7 +1569,7 @@ class SndTable(PyoTableObject):
         Return the size of the table in samples.
 
         :Args:
-        
+
             all : boolean
                 If the table contains more than one sound and `all` is True,
                 returns a list of all sizes. Otherwise, returns only the
@@ -1595,17 +1595,17 @@ class SndTable(PyoTableObject):
         These lists can be draw on a DC (WxPython) with a DrawLines method.
 
         :Args:
-            
+
             size : tuple
                 Size, (X, Y) pixel values, of the waveform container window.
             begin : float, optional
                 First position in the the table, in seconds, where to get samples.
                 Defaults to 0.
             end : float, optional
-                Last position in the table, in seconds, where to get samples. 
-                
+                Last position in the table, in seconds, where to get samples.
+
                 if this value is set to 0, that means the end of the table. Defaults to 0.
-                 
+
         """
         w, h = size
         chnls = len(self._base_objs)
@@ -1619,12 +1619,12 @@ class SndTable(PyoTableObject):
     def getEnvelope(self, points):
         """
         Return the amplitude envelope of the table.
-        
-        Return a list, of length `chnl`, of lists of length `points` filled 
+
+        Return a list, of length `chnl`, of lists of length `points` filled
         with the amplitude envelope of the table.
-        
+
         :Args:
-        
+
             points : int
                 Number of points of the amplitude analysis.
 
@@ -1638,16 +1638,16 @@ class SndTable(PyoTableObject):
         :Args:
 
             title : string, optional
-                Window title. Defaults to "Table waveform". 
+                Window title. Defaults to "Table waveform".
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
             mouse_callback : callable
-                If provided, this function will be called with the mouse 
+                If provided, this function will be called with the mouse
                 position, inside the frame, as argument. Defaults to None.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for 
-        the server GUI before showing the controller window. 
+
+        If `wxnoserver` is set to True, the interpreter will not wait for
+        the server GUI before showing the controller window.
 
         """
         createSndViewTableWindow(self, title, wxnoserver, self.__class__.__name__, mouse_callback)
@@ -1658,35 +1658,35 @@ class SndTable(PyoTableObject):
 
     @property
     def sound(self):
-        """string. Full path of the sound.""" 
+        """string. Full path of the sound."""
         return self._path
     @sound.setter
     def sound(self, x): self.setSound(x)
 
     @property
     def path(self):
-        """string. Full path of the sound.""" 
+        """string. Full path of the sound."""
         return self._path
     @path.setter
     def path(self, x): self.setSound(x)
 
     @property
     def chnl(self):
-        """int. Channel to read in.""" 
+        """int. Channel to read in."""
         return self._chnl
     @chnl.setter
     def chnl(self, x): print "'chnl' attribute is read-only."
 
     @property
     def start(self):
-        """float. Start point, in seconds, to read into the file.""" 
+        """float. Start point, in seconds, to read into the file."""
         return self._start
     @start.setter
     def start(self, x): print "'start' attribute is read-only."
 
     @property
     def stop(self):
-        """float. Stop point, in seconds, to read into the file.""" 
+        """float. Stop point, in seconds, to read into the file."""
         return self._stop
     @stop.setter
     def stop(self, x): print "SndTable 'stop' attribute is read-only."
@@ -1699,7 +1699,7 @@ class SndTable(PyoTableObject):
 
 class NewTable(PyoTableObject):
     """
-    Create an empty table ready for recording. 
+    Create an empty table ready for recording.
 
     See :py:class:`TableRec` to write samples in the table.
 
@@ -1710,17 +1710,17 @@ class NewTable(PyoTableObject):
         length : float
             Length of the table in seconds.
         chnls : int, optional
-            Number of channels that will be handled by the table. 
+            Number of channels that will be handled by the table.
             Defaults to 1.
         init : list of floats, optional
             Initial table. List of list can match the number of channels,
-            otherwise, the list will be loaded in all tablestreams. 
+            otherwise, the list will be loaded in all tablestreams.
             Defaults to None.
         feedback : float, optional
             Amount of old data to mix with a new recording. Defaults to 0.0.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`DataTable`, :py:class:`TableRec`
 
     >>> s = Server(duplex=1).boot()
@@ -1744,7 +1744,7 @@ class NewTable(PyoTableObject):
         if init == None:
             self._base_objs = [NewTable_base(length, None, feedback) for i in range(chnls)]
         else:
-            if type(init[0]) != ListType: 
+            if type(init[0]) != ListType:
                 init = [init]
             self._base_objs = [NewTable_base(length, wrap(init,i), feedback) for i in range(chnls)]
         self._size = self._base_objs[0].getSize()
@@ -1752,17 +1752,17 @@ class NewTable(PyoTableObject):
     def replace(self, x):
         """
         Replaces the actual table.
-        
+
         :Args:
-        
+
             x : list of floats
                 New table. Must be of the same size as the actual table.
 
-                List of list can match the number of channels, otherwise, 
+                List of list can match the number of channels, otherwise,
                 the list will be loaded in all tablestreams.
 
         """
-        if type(x[0]) != ListType: 
+        if type(x[0]) != ListType:
             x = [x]
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
         self.refreshView()
@@ -1783,25 +1783,25 @@ class NewTable(PyoTableObject):
     def getLength(self):
         """
         Returns the length of the table in seconds.
-        
+
         """
         return self._base_objs[0].getLength()
 
     def getDur(self, all=True):
         """
         Returns the length of the table in seconds.
-        
+
         The `all` argument is there for compatibility with SndTable but
         is not used for now.
-        
+
         """
         return self._base_objs[0].getLength()
-        
+
     def getRate(self):
         """
-        Returns the frequency (cycle per second) to give to an 
+        Returns the frequency (cycle per second) to give to an
         oscillator to read the sound at its original pitch.
-        
+
         """
         return self._base_objs[0].getRate()
 
@@ -1811,15 +1811,15 @@ class NewTable(PyoTableObject):
         These lists can be draw on a DC (WxPython) with a DrawLines method.
 
         :Args:
-            
+
             size : tuple
                 Size, (X, Y) pixel values, of the waveform container window.
             begin : float, optional
                 First position in the the table, in seconds, where to get samples.
                 Defaults to 0.
             end : float, optional
-                Last position in the table, in seconds, where to get samples. 
-                
+                Last position in the table, in seconds, where to get samples.
+
                 if this value is set to 0, that means the end of the table. Defaults to 0.
 
         """
@@ -1839,16 +1839,16 @@ class NewTable(PyoTableObject):
         :Args:
 
             title : string, optional
-                Window title. Defaults to "Table waveform". 
+                Window title. Defaults to "Table waveform".
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
             mouse_callback : callable
-                If provided, this function will be called with the mouse 
+                If provided, this function will be called with the mouse
                 position, inside the frame, as argument. Defaults to None.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for 
-        the server GUI before showing the controller window. 
+
+        If `wxnoserver` is set to True, the interpreter will not wait for
+        the server GUI before showing the controller window.
 
         """
         createSndViewTableWindow(self, title, wxnoserver, self.__class__.__name__, mouse_callback)
@@ -1859,28 +1859,28 @@ class NewTable(PyoTableObject):
 
     @property
     def length(self):
-        """float. Length of the table in seconds.""" 
+        """float. Length of the table in seconds."""
         return self._length
     @length.setter
     def length(self, x): print "'length' attribute is read-only."
 
     @property
     def chnls(self):
-        """int. Number of channels that will be handled by the table.""" 
+        """int. Number of channels that will be handled by the table."""
         return self._chnls
     @chnls.setter
     def chnls(self, x): print "'chnls' attribute is read-only."
 
     @property
     def init(self):
-        """list of floats. Initial table.""" 
+        """list of floats. Initial table."""
         return self._init
     @init.setter
     def init(self, x): print "'init' attribute is read-only."
 
     @property
     def feedback(self):
-        """float. Amount of old data to mix with a new recording.""" 
+        """float. Amount of old data to mix with a new recording."""
         return self._feedback
     @feedback.setter
     def feedback(self, x): self.setFeedback(x)
@@ -1904,14 +1904,14 @@ class DataTable(PyoTableObject):
         size : int
             Size of the table in samples.
         chnls : int, optional
-            Number of channels that will be handled by the table. 
+            Number of channels that will be handled by the table.
             Defaults to 1.
         init : list of floats, optional
             Initial table. List of list can match the number of channels,
-            otherwise, the list will be loaded in all tablestreams. 
+            otherwise, the list will be loaded in all tablestreams.
+
+    .. seealso::
 
-    .. seealso:: 
-        
         :py:class:`NewTable`, :py:class:`TableRec`
 
     >>> s = Server().boot()
@@ -1943,19 +1943,19 @@ class DataTable(PyoTableObject):
 
             x : list of floats
                 New table. Must be of the same size as the actual table.
-                
-                List of list can match the number of channels, otherwise, 
+
+                List of list can match the number of channels, otherwise,
                 the list will be loaded in all tablestreams.
 
         """
-        if type(x[0]) != ListType: 
+        if type(x[0]) != ListType:
             x = [x]
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
         self.refreshView()
 
     def getRate(self):
         """
-        Returns the frequency (cycle per second) to give to an 
+        Returns the frequency (cycle per second) to give to an
         oscillator to read the sound at its original pitch.
 
         """
@@ -1966,7 +1966,7 @@ class DataTable(PyoTableObject):
         Opens a multislider window to control the data values.
 
         When editing the grapher with the mouse, the new values are
-        sent to the object to replace the table content. 
+        sent to the object to replace the table content.
 
         :Args:
 
@@ -1974,35 +1974,179 @@ class DataTable(PyoTableObject):
                 Set the min and max values of the Y axis of the multislider.
                 Defaults to (0.0, 1.0).
             title : string, optional
-                Title of the window. If none is provided, the name of the 
+                Title of the window. If none is provided, the name of the
                 class is used.
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for 
-        the server GUI before showing the controller window. 
+
+        If `wxnoserver` is set to True, the interpreter will not wait for
+        the server GUI before showing the controller window.
 
         """
         createDataGraphWindow(self, yrange, title, wxnoserver)
 
     @property
     def size(self):
-        """int. Length of the table in samples.""" 
+        """int. Length of the table in samples."""
         return self._size
     @size.setter
     def size(self, x): print "DataTable 'size' attribute is read-only."
 
     @property
     def chnls(self):
-        """int. Number of channels that will be handled by the table.""" 
+        """int. Number of channels that will be handled by the table."""
         return self._chnls
     @chnls.setter
     def chnls(self, x): print "'chnls' attribute is read-only."
 
     @property
     def init(self):
-        """list of floats. Initial table.""" 
+        """list of floats. Initial table."""
         return self._init
     @init.setter
     def init(self, x): print "'init' attribute is read-only."
+
+class AtanTable(PyoTableObject):
+    """
+    Generates an arctangent transfert function.
+
+    This table allow the creation the classic arctangent transfert functions,
+    useful in distortion design. See Lookup object for a simple table lookup
+    process.
+
+    :Parent: :py:class:`PyoTableObject`
+
+    :Args:
+
+        slope : float, optional
+            Slope of the arctangent function, between 0 and 1. Defaults to 0.5.
+        size : int, optional
+            Table size in samples. Defaults to 8192.
+
+    >>> import math
+    >>> s = Server().boot()
+    >>> s.start()
+    >>> t = AtanTable(slope=0.8)
+    >>> a = Sine(freq=[149,150])
+    >>> l = Lookup(table=t, index=a, mul=0.3).out()
+
+    """
+    def __init__(self, slope=0.5, size=8192):
+        PyoTableObject.__init__(self, size)
+        self._slope = slope
+        self._base_objs = [AtanTable_base(slope, size)]
+
+    def setSlope(self, x):
+        """
+        Change the slope of the arctangent function. This will redraw the table.
+
+        :Args:
+
+            x : float
+                New slope between 0 and 1.
+
+        """
+        self._slope = x
+        [obj.setSlope(x) for obj in self._base_objs]
+        self.refreshView()
+
+    @property
+    def slope(self):
+        """float. slope of the arctangent function."""
+        return self._slope
+    @slope.setter
+    def slope(self, x): self.setSlope(x)
+
+class PartialTable(PyoTableObject):
+    """
+    Inharmonic waveform generator.
+
+    Generates waveforms made of inharmonic components. Partials are
+    given as a list of 2-values tuple, where the first one is the
+    partial number (can be float) and the second one is the strength
+    of the partial.
+
+    The object uses the first two decimal values of each partial to
+    compute a higher harmonic at a multiple of 100 (so each component
+    is in reality truly harmonic). If the oscillator has a frequency
+    divided by 100, the real desired partials will be restituted.
+
+    The list:
+
+    [(1, 1), (1.1, 0.7), (1.15, 0.5)] will draw a table with:
+
+    harmonic 100 : amplitude = 1
+    harmonic 110 : amplitude = 0.7
+    harmonic 115 : amplitude = 0.5
+
+    To listen to a signal composed of 200, 220 and 230 Hz, one should
+    declared an oscillator like this (frequency of 200Hz divided by 100):
+
+    a = Osc(t, freq=2, mul=0.5).out()
+
+    :Parent: :py:class:`PyoTableObject`
+
+    :Args:
+
+        list : list of tuple, optional
+            List of 2-values tuples. First value is the partial number (float up
+            to two decimal values) and second value is its amplitude (relative to
+            the other harmonics). Defaults to [(1,1), (1.33,0.5),(1.67,0.3)].
+        size : int, optional
+            Table size in samples. Because computed harmonics are very high in
+            frequency, the table size must be bigger than a classic HarmTable.
+            Defaults to 65536.
+
+    >>> s = Server().boot()
+    >>> s.start()
+    >>> t = PartialTable([(1,1), (2.37, 0.5), (4.55, 0.3)]).normalize()
+    >>> # Play with fundamentals 199 and 200 Hz
+    >>> a = Osc(table=t, freq=[1.99,2], mul=.2).out()
+
+    """
+    def __init__(self, list=[(1,1), (1.33,0.5),(1.67,0.3)], size=65536):
+        PyoTableObject.__init__(self, size)
+        self._list = list
+        self._par_table = HarmTable(self._create_list(), size)
+        self._base_objs = self._par_table.getBaseObjects()
+        self.normalize()
+
+    def _create_list(self):
+        # internal method used to compute the harmonics's weight
+        hrms = [(int(x*100.), y) for x, y in self._list]
+        l = []
+        ind = 0
+        for i in range(10000):
+            if i == hrms[ind][0]:
+                l.append(hrms[ind][1])
+                ind += 1
+                if ind == len(hrms):
+                    break
+            else:
+                l.append(0)
+        return l
+
+    def replace(self, list):
+        """
+        Redraw the waveform according to a new set of harmonics
+        relative strengths.
+
+        :Args:
+
+            list : list of tuples
+                Each tuple contains the partial number, as a float,
+                and its strength.
+
+        """
+        self._list = list
+        [obj.replace(self._create_list()) for obj in self._base_objs]
+        self.normalize()
+        self.refreshView()
+
+    @property
+    def list(self):
+        """list. List of partial numbers and strength."""
+        return self._list
+    @list.setter
+    def list(self, x): self.replace(x)
\ No newline at end of file
diff --git a/pyolib/triggers.py b/pyolib/triggers.py
index a3a88f4..0125b62 100644
--- a/pyolib/triggers.py
+++ b/pyolib/triggers.py
@@ -3,35 +3,36 @@ Set of objects to manage triggers streams.
 
 A trigger is an audio signal with a value of 1 surrounded by 0s.
 
-TrigXXX objects use this kind of signal to generate different 
+TrigXXX objects use this kind of signal to generate different
 processes with sampling rate time accuracy.
 
 """
 
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+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 sys
 from _core import *
 from _maps import *
 from _widgets import createGraphWindow
 from types import SliceType, ListType, TupleType
+import weakref
 
 class Trig(PyoObject):
     """
@@ -82,7 +83,7 @@ class Metro(PyoObject):
 
     A trigger is an audio signal with a value of 1 surrounded by 0s.
 
-    The play() method starts the metro and is not called at the object 
+    The play() method starts the metro and is not called at the object
     creation time.
 
     :Parent: :py:class:`PyoObject`
@@ -92,9 +93,9 @@ class Metro(PyoObject):
         time : float or PyoObject, optional
             Time between each trigger in seconds. Defaults to 1.
         poly : int, optional
-            Metronome polyphony. Denotes how many independent streams are 
+            Metronome polyphony. Denotes how many independent streams are
             generated by the metronome, allowing overlapping processes.
-            
+
             Available only at initialization. Defaults to 1.
 
     .. note::
@@ -122,12 +123,12 @@ class Metro(PyoObject):
     def setTime(self, x):
         """
         Replace the `time` attribute.
-        
+
         :Args:
-        
+
             x : float or PyoObject
                 New `time` attribute.
-        
+
         """
         self._time = x
         x, lmax = convertArgsToLists(x)
@@ -135,7 +136,7 @@ class Metro(PyoObject):
 
     def out(self, chnl=0, inc=1, dur=0, delay=0):
         return self.play(dur, delay)
-        
+
     def setMul(self, x):
         pass
 
@@ -151,10 +152,10 @@ class Metro(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMap(0.001, 1., 'log', 'time', self._time)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-         
+
     @property
     def time(self):
-        """float or PyoObject. Time between each trigger in seconds.""" 
+        """float or PyoObject. Time between each trigger in seconds."""
         return self._time
     @time.setter
     def time(self, x): self.setTime(x)
@@ -165,7 +166,7 @@ class Seq(PyoObject):
 
     A trigger is an audio signal with a value of 1 surrounded by 0s.
 
-    The play() method starts the sequence and is not called at the object 
+    The play() method starts the sequence and is not called at the object
     creation time.
 
     :Parent: :py:class:`PyoObject`
@@ -179,7 +180,7 @@ class Seq(PyoObject):
         poly : int, optional
             Seq polyphony. Denotes how many independent streams are
             generated by the metronome, allowing overlapping processes.
-            
+
             Available only at initialization. Defaults to 1.
 
     .. note::
@@ -211,7 +212,7 @@ class Seq(PyoObject):
         else:
             seqlen = len(seq)
             lmax = max(seqlen, lmax)
-            self._base_players = [Seqer_base(wrap(time,i), wrap(seq,i), poly) for i in range(lmax)]            
+            self._base_players = [Seqer_base(wrap(time,i), wrap(seq,i), poly) 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):
@@ -265,14 +266,14 @@ class Seq(PyoObject):
 
     @property
     def time(self):
-        """float or PyoObject. Base time between each trigger in seconds.""" 
+        """float or PyoObject. Base time between each trigger in seconds."""
         return self._time
     @time.setter
     def time(self, x): self.setTime(x)
 
     @property
     def seq(self):
-        """List of ints. Sequence of beat durations in time's unit.""" 
+        """List of ints. Sequence of beat durations in time's unit."""
         return self._seq
     @seq.setter
     def seq(self, x): self.setSeq(x)
@@ -285,7 +286,7 @@ class Cloud(PyoObject):
 
     A trigger is an audio signal with a value of 1 surrounded by 0s.
 
-    The play() method starts the Cloud and is not called at the object 
+    The play() method starts the Cloud and is not called at the object
     creation time.
 
     :Parent: :py:class:`PyoObject`
@@ -295,9 +296,9 @@ class Cloud(PyoObject):
         density : float or PyoObject, optional
             Average number of triggers per second. Defaults to 10.
         poly : int, optional
-            Cloud polyphony. Denotes how many independent streams are 
+            Cloud polyphony. Denotes how many independent streams are
             generated by the object, allowing overlapping processes.
-            
+
             Available only at initialization. Defaults to 1.
 
     .. note::
@@ -326,20 +327,20 @@ class Cloud(PyoObject):
     def setDensity(self, x):
         """
         Replace the `density` attribute.
-        
+
         :Args:
-        
+
             x : float or PyoObject
                 New `density` attribute.
-        
+
         """
         self._density = x
         x, lmax = convertArgsToLists(x)
         [obj.setDensity(wrap(x,i)) for i, obj in enumerate(self._base_players)]
-       
+
     def out(self, chnl=0, inc=1, dur=0, delay=0):
         return self.play(dur, delay)
-        
+
     def setMul(self, x):
         pass
 
@@ -355,10 +356,10 @@ class Cloud(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMap(0, 100., 'lin', 'density', self._density)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-         
+
     @property
     def density(self):
-        """float or PyoObject. Average density of triggers generation.""" 
+        """float or PyoObject. Average density of triggers generation."""
         return self._density
     @density.setter
     def density(self, x): self.setDensity(x)
@@ -366,7 +367,7 @@ class Cloud(PyoObject):
 class Beat(PyoObject):
     """
     Generates algorithmic trigger patterns.
-    
+
     A trigger is an audio signal with a value of 1 surrounded by 0s.
 
     Beat generates measures of length `taps` and uses weight parameters
@@ -375,13 +376,13 @@ class Beat(PyoObject):
 
     User can store the current pattern in one of the 32 preset slots with
     the store() method and recall it later with recall(x).
-    
+
     A preset is a list where the first value is the number of beats in the
     measure, followed by 1s and 0s. For a 4/4 measure with only down beats:
-    
-    [16, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0] 
-    
-    The play() method starts the Beat and is not called at the object 
+
+    [16, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0]
+
+    The play() method starts the Beat and is not called at the object
     creation time.
 
     :Parent: :py:class:`PyoObject`
@@ -399,22 +400,22 @@ class Beat(PyoObject):
         w3 : int {0 -> 100}, optional
             Probability for the weakest beats. Defaults to 30.
         poly : int, optional
-            Beat polyphony. Denotes how many independent streams are 
+            Beat polyphony. Denotes how many independent streams are
             generated by the object, allowing overlapping processes.
-            
+
             Available only at initialization. Defaults to 1.
 
     .. note::
 
         Beat outputs many signals identified with a string between brackets:
-        
-        |  obj['tap'] returns audio stream of the current tap of the measure.  
-        |  obj['amp'] returns audio stream of the current beat amplitude.  
-        |  obj['dur'] returns audio stream of the current beat duration in seconds.  
+
+        |  obj['tap'] returns audio stream of the current tap of the measure.
+        |  obj['amp'] returns audio stream of the current beat amplitude.
+        |  obj['dur'] returns audio stream of the current beat duration in seconds.
         |  obj['end'] returns audio stream with a trigger just before the end of the measure.
 
         obj without brackets returns the generated trigger stream of the measure.
-         
+
         The out() method is bypassed. Beat's signal can not be sent to audio outs.
 
         Beat has no `mul` and `add` attributes.
@@ -467,7 +468,7 @@ class Beat(PyoObject):
         if i < len(self._base_objs):
             return self._base_objs[i]
         else:
-            print "'i' too large!"         
+            print "'i' too large!"
 
     def get(self, identifier="amp", all=False):
         """
@@ -485,9 +486,9 @@ class Beat(PyoObject):
                 Defaults to "amp".
             all : boolean, optional
                 If True, the first value of each object's stream
-                will be returned as a list. 
-                
-                If False, only the value of the first object's 
+                will be returned as a list.
+
+                If False, only the value of the first object's
                 stream will be returned as a float.
 
         """
@@ -499,14 +500,14 @@ class Beat(PyoObject):
     def reset(self):
         """
         Reset internal counters to initialization values.
-        
+
         """
         [obj.reset() for obj in self._base_players]
 
     def new(self):
         """
         Generates a new pattern with the current parameters.
-        
+
         """
         [obj.new() for i, obj in enumerate(self._base_players)]
 
@@ -520,9 +521,9 @@ class Beat(PyoObject):
     def store(self, x):
         """
         Store the current pattern in memory `x`.
-        
+
         :Args:
-        
+
             x : int
                 Memory number. 0 <= x < 32.
 
@@ -540,7 +541,7 @@ class Beat(PyoObject):
 
         """
         [obj.recall(x) for i, obj in enumerate(self._base_players)]
-        
+
     def getPresets(self):
         """
         Returns the list of stored presets.
@@ -548,22 +549,22 @@ class Beat(PyoObject):
         """
         if len(self._base_players) == 1:
             return self._base_players[0].getPresets()
-        else:    
+        else:
             return [obj.getPresets() for obj in self._base_players]
 
     def setPresets(self, x):
         """
         Store a list presets.
-        
+
         :Args:
-        
+
             x : list
                 List of presets.
 
         """
         if len(self._base_players) == 1:
             return self._base_players[0].setPresets(x)
-        else:    
+        else:
             return [obj.setPresets(x[i]) for i, obj in enumerate(self._base_players)]
 
     def setTime(self, x):
@@ -629,11 +630,11 @@ class Beat(PyoObject):
 
         """
         self.setWeights(w3=x)
-        
+
     def setWeights(self, w1=None, w2=None, w3=None):
         """
         Replace the weight attributes.
-        
+
         Arguments set to `None` remain unchanged.
 
         :Args:
@@ -692,35 +693,35 @@ class Beat(PyoObject):
 
     @property
     def time(self):
-        """float or PyoObject. Time, in seconds, between each beat.""" 
+        """float or PyoObject. Time, in seconds, between each beat."""
         return self._time
     @time.setter
     def time(self, x): self.setTime(x)
 
     @property
     def taps(self):
-        """int. Number of beats in the generated pattern.""" 
+        """int. Number of beats in the generated pattern."""
         return self._taps
     @taps.setter
     def taps(self, x): self.setTaps(x)
 
     @property
     def w1(self):
-        """int. Probability for down beats.""" 
+        """int. Probability for down beats."""
         return self._w1
     @w1.setter
     def w1(self, x): self.setW1(x)
 
     @property
     def w2(self):
-        """int. Probability for up beats.""" 
+        """int. Probability for up beats."""
         return self._w2
     @w2.setter
     def w2(self, x): self.setW2(x)
 
     @property
     def w3(self):
-        """int. Probability for other beats.""" 
+        """int. Probability for other beats."""
         return self._w3
     @w3.setter
     def w3(self, x): self.setW3(x)
@@ -729,8 +730,8 @@ class TrigRandInt(PyoObject):
     """
     Pseudo-random integer generator.
 
-    TrigRandInt generates a pseudo-random number integer number between 
-    0 and `max` values each time it receives a trigger in its `input` 
+    TrigRandInt generates a pseudo-random number integer number between
+    0 and `max` values each time it receives a trigger in its `input`
     parameter. The value is kept until the next trigger.
 
     :Parent: :py:class:`PyoObject`
@@ -744,7 +745,7 @@ class TrigRandInt(PyoObject):
 
     .. note::
 
-        The out() method is bypassed. TrigRandInt's signal can not be sent 
+        The out() method is bypassed. TrigRandInt's signal can not be sent
         to audio outs.
 
     >>> s = Server().boot()
@@ -802,26 +803,26 @@ class TrigRandInt(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio trigger signal."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def max(self): 
+    def max(self):
         """float or PyoObject. Maximum value."""
         return self._max
     @max.setter
-    def max(self, x): 
+    def max(self, x):
         self.setMax(x)
 
 class TrigRand(PyoObject):
     """
     Pseudo-random number generator.
 
-    TrigRand generates a pseudo-random number between `min` and `max` 
-    values each time it receives a trigger in its `input` parameter. 
+    TrigRand generates a pseudo-random number between `min` and `max`
+    values each time it receives a trigger in its `input` parameter.
     The value is kept until the next trigger.
 
     :Parent: :py:class:`PyoObject`
@@ -837,7 +838,7 @@ class TrigRand(PyoObject):
         port : float, optional
             Portamento. Time to reach a new value. Defaults to 0.
         init : float, optional
-            Initial value. Available at initialization time only. 
+            Initial value. Available at initialization time only.
             Defaults to 0.
 
     >>> s = Server().boot()
@@ -862,7 +863,7 @@ class TrigRand(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -873,16 +874,16 @@ class TrigRand(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setMin(self, x):
         """
         Replace the `min` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `min` attribute.
-        
+
         """
         self._min = x
         x, lmax = convertArgsToLists(x)
@@ -891,12 +892,12 @@ class TrigRand(PyoObject):
     def setMax(self, x):
         """
         Replace the `max` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `max` attribute.
-        
+
         """
         self._max = x
         x, lmax = convertArgsToLists(x)
@@ -905,12 +906,12 @@ class TrigRand(PyoObject):
     def setPort(self, x):
         """
         Replace the `port` attribute.
-        
+
         :Args:
 
             x : float
                 new `port` attribute.
-        
+
         """
         self._port = x
         x, lmax = convertArgsToLists(x)
@@ -923,40 +924,40 @@ class TrigRand(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio trigger signal."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def min(self): 
+    def min(self):
         """float or PyoObject. Minimum value."""
         return self._min
     @min.setter
-    def min(self, x): 
+    def min(self, x):
         self.setMin(x)
     @property
-    def max(self): 
+    def max(self):
         """float or PyoObject. Maximum value."""
         return self._max
     @max.setter
-    def max(self, x): 
+    def max(self, x):
         self.setMax(x)
     @property
-    def port(self): 
+    def port(self):
         """float. Ramp time."""
         return self._port
     @port.setter
-    def port(self, x): 
+    def port(self, x):
         self.setPort(x)
 
 class TrigChoice(PyoObject):
     """
     Random generator from user's defined values.
 
-    TrigChoice chooses randomly a new value in list `choice` each 
-    time it receives a trigger in its `input` parameter. The value 
+    TrigChoice chooses randomly a new value in list `choice` each
+    time it receives a trigger in its `input` parameter. The value
     is kept until the next trigger.
 
     :Parent: :py:class:`PyoObject`
@@ -970,7 +971,7 @@ class TrigChoice(PyoObject):
         port : float, optional
             Portamento. Time to reach a new value. Defaults to 0.
         init : float, optional
-            Initial value. Available at initialization time only. 
+            Initial value. Available at initialization time only.
             Defaults to 0.
 
     >>> s = Server().boot()
@@ -1002,7 +1003,7 @@ class TrigChoice(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1013,16 +1014,16 @@ class TrigChoice(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setChoice(self, x):
         """
         Replace the `choice` attribute.
-        
+
         :Args:
 
             x : list of floats
                 new `choice` attribute.
-        
+
         """
         self._choice = x
         if type(x[0]) != ListType:
@@ -1033,44 +1034,44 @@ class TrigChoice(PyoObject):
     def setPort(self, x):
         """
         Replace the `port` attribute.
-        
+
         :Args:
 
             x : float
                 new `port` attribute.
-        
+
         """
         self._port = x
         x, lmax = convertArgsToLists(x)
         [obj.setPort(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio trigger signal."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def choice(self): 
+    def choice(self):
         """list of floats. Possible values."""
         return self._choice
     @choice.setter
-    def choice(self, x): 
+    def choice(self, x):
         self.setChoice(x)
     @property
-    def port(self): 
+    def port(self):
         """float. Ramp time."""
         return self._port
     @port.setter
-    def port(self, x): 
+    def port(self, x):
         self.setPort(x)
 
 class TrigFunc(PyoObject):
     """
     Python function callback.
 
-    TrigFunc calls the function given at parameter `function` each 
+    TrigFunc calls the function given at parameter `function` each
     time it receives a trigger in its `input` parameter.
 
     :Parent: :py:class:`PyoObject`
@@ -1087,7 +1088,7 @@ class TrigFunc(PyoObject):
 
     .. note::
 
-        The out() method is bypassed. TrigFunc's signal can not be sent 
+        The out() method is bypassed. TrigFunc's signal can not be sent
         to audio outs.
 
         TrigFunc has no `mul` and `add` attributes.
@@ -1119,25 +1120,25 @@ class TrigFunc(PyoObject):
                 print >> sys.stderr, 'TypeError: "function" argument of %s must be callable.\n' % self.__class__.__name__
                 exit()
         self._input = input
-        self._function = function
+        self._function = getWeakMethodRef(function)
         self._arg = arg
         self._in_fader = InputFader(input)
         in_fader, function, arg, lmax = convertArgsToLists(self._in_fader, function, arg)
-        self._base_objs = [TrigFunc_base(wrap(in_fader,i), wrap(function,i), wrap(arg,i)) for i in range(lmax)]
+        self._base_objs = [TrigFunc_base(wrap(in_fader,i), WeakMethod(wrap(function,i)), wrap(arg,i)) for i in range(lmax)]
 
     def out(self, chnl=0, inc=1, dur=0, delay=0):
         return self.play(dur, delay)
 
     def setMul(self, x):
         pass
-        
+
     def setAdd(self, x):
-        pass    
+        pass
 
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1148,20 +1149,20 @@ class TrigFunc(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setFunction(self, x):
         """
         Replace the `function` attribute.
-        
+
         :Args:
 
             x : Python function
                 new `function` attribute.
-        
+
         """
-        self._function = x
+        self._function = getWeakMethodRef(x)
         x, lmax = convertArgsToLists(x)
-        [obj.setFunction(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
+        [obj.setFunction(WeakMethod(wrap(x,i))) for i, obj in enumerate(self._base_objs)]
 
     def setArg(self, x):
         """
@@ -1178,32 +1179,32 @@ class TrigFunc(PyoObject):
         [obj.setArg(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio trigger signal."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def function(self): 
+    def function(self):
         """Python callable. Function to be called."""
         return self._function
     @function.setter
-    def function(self, x): 
+    def function(self, x):
         self.setFunction(x)
     @property
-    def arg(self): 
+    def arg(self):
         """Anything. Callable's argument."""
         return self._arg
     @arg.setter
-    def arg(self, x): 
+    def arg(self, x):
         self.setArg(x)
-     
+
 class TrigEnv(PyoObject):
     """
     Envelope reader generator.
 
-    TrigEnv starts reading an envelope in `dur` seconds each time it 
+    TrigEnv starts reading an envelope in `dur` seconds each time it
     receives a trigger in its `input` parameter.
 
     :Parent: :py:class:`PyoObject`
@@ -1225,9 +1226,9 @@ class TrigEnv(PyoObject):
 
     .. note::
 
-        TrigEnv will sends a trigger signal at the end of the playback. 
-        User can retreive the trigger streams by calling obj['trig']. 
-        Useful to synchronize other processes. 
+        TrigEnv will sends a trigger signal at the end of the playback.
+        User can retreive the trigger streams by calling obj['trig'].
+        Useful to synchronize other processes.
 
     >>> s = Server().boot()
     >>> s.start()
@@ -1252,7 +1253,7 @@ class TrigEnv(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1267,26 +1268,26 @@ class TrigEnv(PyoObject):
     def setTable(self, x):
         """
         Replace the `table` attribute.
-        
+
         :Args:
 
             x : PyoTableObject
                 new `table` attribute.
-        
+
         """
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
-        
+
     def setDur(self, x):
         """
         Replace the `dur` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `dur` attribute.
-        
+
         """
         self._dur = x
         x, lmax = convertArgsToLists(x)
@@ -1295,12 +1296,12 @@ class TrigEnv(PyoObject):
     def setInterp(self, x):
         """
         Replace the `interp` attribute.
-        
+
         :Args:
 
             x : int {1, 2, 3, 4}
                 new `interp` attribute.
-        
+
         """
         self._interp = x
         x, lmax = convertArgsToLists(x)
@@ -1311,39 +1312,39 @@ class TrigEnv(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio trigger signal."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def table(self): 
+    def table(self):
         """PyoTableObject. Envelope table."""
         return self._table
     @table.setter
-    def table(self, x): 
+    def table(self, x):
         self.setTable(x)
     @property
-    def dur(self): 
+    def dur(self):
         """float or PyoObject. Duration in seconds."""
         return self._dur
     @dur.setter
-    def dur(self, x): 
+    def dur(self, x):
         self.setDur(x)
     @property
-    def interp(self): 
+    def interp(self):
         """int {1, 2, 3, 4}, Interpolation method."""
         return self._interp
     @interp.setter
-    def interp(self, x): 
+    def interp(self, x):
         self.setInterp(x)
 
 class TrigLinseg(PyoObject):
     """
     Line segments trigger.
 
-    TrigLinseg starts reading a break-points line segments each time it 
+    TrigLinseg starts reading a break-points line segments each time it
     receives a trigger in its `input` parameter.
 
     :Parent: :py:class:`PyoObject`
@@ -1354,17 +1355,17 @@ class TrigLinseg(PyoObject):
             Audio signal sending triggers.
         list : list of tuples
             Points used to construct the line segments. Each tuple is a
-            new point in the form (time, value). 
-            
+            new point in the form (time, value).
+
             Times are given in seconds and must be in increasing order.
 
     .. note::
 
-        TrigLinseg will sends a trigger signal at the end of the playback. 
-        User can retreive the trigger streams by calling obj['trig']. 
-        Useful to synchronize other processes. 
+        TrigLinseg will sends a trigger signal at the end of the playback.
+        User can retreive the trigger streams by calling obj['trig'].
+        Useful to synchronize other processes.
 
-        The out() method is bypassed. TrigLinseg's signal can not be sent 
+        The out() method is bypassed. TrigLinseg's signal can not be sent
         to audio outs.
 
     >>> s = Server().boot()
@@ -1395,7 +1396,7 @@ class TrigLinseg(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1410,12 +1411,12 @@ class TrigLinseg(PyoObject):
     def setList(self, x):
         """
         Replace the `list` attribute.
-        
+
         :Args:
 
             x : list of tuples
                 new `list` attribute.
-        
+
         """
         self._list = x
         [obj.setList(x) for i, obj in enumerate(self._base_objs)]
@@ -1444,9 +1445,9 @@ class TrigLinseg(PyoObject):
         Opens a grapher window to control the shape of the envelope.
 
         When editing the grapher with the mouse, the new set of points
-        will be send to the object on mouse up. 
+        will be send to the object on mouse up.
 
-        Ctrl+C with focus on the grapher will copy the list of points to the 
+        Ctrl+C with focus on the grapher will copy the list of points to the
         clipboard, giving an easy way to insert the new shape in a script.
 
         :Args:
@@ -1460,14 +1461,14 @@ class TrigLinseg(PyoObject):
                 None, min and max are retrieve from the current list of points.
                 Defaults to None.
             title : string, optional
-                Title of the window. If none is provided, the name of the 
+                Title of the window. If none is provided, the name of the
                 class is used.
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for 
-        the server GUI before showing the controller window. 
+
+        If `wxnoserver` is set to True, the interpreter will not wait for
+        the server GUI before showing the controller window.
 
         """
         if xlen == None:
@@ -1484,25 +1485,25 @@ class TrigLinseg(PyoObject):
         createGraphWindow(self, 0, xlen, yrange, title, wxnoserver)
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio trigger signal."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def list(self): 
+    def list(self):
         """list of tuples. Points used to construct the line segments."""
         return self._list
     @list.setter
-    def list(self, x): 
+    def list(self, x):
         self.setList(x)
 
 class TrigExpseg(PyoObject):
     """
     Exponential segments trigger.
 
-    TrigExpseg starts reading break-points exponential segments each time 
+    TrigExpseg starts reading break-points exponential segments each time
     it receives a trigger in its `input` parameter.
 
     :Parent: :py:class:`PyoObject`
@@ -1513,21 +1514,21 @@ class TrigExpseg(PyoObject):
             Audio signal sending triggers.
         list : list of tuples
             Points used to construct the line segments. Each tuple is a
-            new point in the form (time, value). 
-            
+            new point in the form (time, value).
+
             Times are given in seconds and must be in increasing order.
         exp : float, optional
             Exponent factor. Used to control the slope of the curves.
             Defaults to 10.
         inverse : boolean, optional
-            If True, downward slope will be inversed. Useful to create 
+            If True, downward slope will be inversed. Useful to create
             biexponential curves. Defaults to True.
 
     .. note::
 
         TrigExpseg will sends a trigger signal at the end of the playback.
         User can retreive the trigger streams by calling obj['trig'].
-        Useful to synchronize other processes. 
+        Useful to synchronize other processes.
 
         The out() method is bypassed. TrigExpseg's signal can not be sent
         to audio outs.
@@ -1562,7 +1563,7 @@ class TrigExpseg(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1577,12 +1578,12 @@ class TrigExpseg(PyoObject):
     def setList(self, x):
         """
         Replace the `list` attribute.
-        
+
         :Args:
 
             x : list of tuples
                 new `list` attribute.
-        
+
         """
         self._list = x
         [obj.setList(x) for i, obj in enumerate(self._base_objs)]
@@ -1639,9 +1640,9 @@ class TrigExpseg(PyoObject):
         Opens a grapher window to control the shape of the envelope.
 
         When editing the grapher with the mouse, the new set of points
-        will be send to the object on mouse up. 
+        will be send to the object on mouse up.
 
-        Ctrl+C with focus on the grapher will copy the list of points to the 
+        Ctrl+C with focus on the grapher will copy the list of points to the
         clipboard, giving an easy way to insert the new shape in a script.
 
         :Args:
@@ -1655,14 +1656,14 @@ class TrigExpseg(PyoObject):
                 None, min and max are retrieve from the current list of points.
                 Defaults to None.
             title : string, optional
-                Title of the window. If none is provided, the name of the 
+                Title of the window. If none is provided, the name of the
                 class is used.
             wxnoserver : boolean, optional
-                With wxPython graphical toolkit, if True, tells the 
+                With wxPython graphical toolkit, if True, tells the
                 interpreter that there will be no server window.
-                
-        If `wxnoserver` is set to True, the interpreter will not wait for 
-        the server GUI before showing the controller window. 
+
+        If `wxnoserver` is set to True, the interpreter will not wait for
+        the server GUI before showing the controller window.
 
         """
         if xlen == None:
@@ -1679,40 +1680,40 @@ class TrigExpseg(PyoObject):
         createGraphWindow(self, 2, xlen, yrange, title, wxnoserver)
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio trigger signal."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def list(self): 
+    def list(self):
         """list of tuples. Points used to construct the line segments."""
         return self._list
     @list.setter
-    def list(self, x): 
+    def list(self, x):
         self.setList(x)
     @property
-    def exp(self): 
+    def exp(self):
         """float. Exponent factor."""
         return self._exp
     @exp.setter
-    def exp(self, x): 
+    def exp(self, x):
         self.setExp(x)
     @property
-    def inverse(self): 
+    def inverse(self):
         """boolean. Inversion of downward slope."""
         return self._inverse
     @inverse.setter
-    def inverse(self, x): 
+    def inverse(self, x):
         self.setInverse(x)
 
 class TrigXnoise(PyoObject):
     """
     Triggered X-class pseudo-random generator.
 
-    Xnoise implements a few of the most common noise distributions. 
-    A new value is generated each time the object receive a trigger 
+    Xnoise implements a few of the most common noise distributions.
+    A new value is generated each time the object receive a trigger
     in input. Each distribution generates values in the range 0 and 1.
 
     :Parent: :py:class:`PyoObject`
@@ -1744,7 +1745,7 @@ class TrigXnoise(PyoObject):
             10. poisson
             11. walker (drunk)
             12. loopseg (drunk with looped segments)
-            
+
         Depending on the distribution, `x1` and `x2` parameters are applied
         as follow (names as string, or associated number can be used as `dist`
         parameter):
@@ -1785,7 +1786,7 @@ class TrigXnoise(PyoObject):
             11. walker
                  - x1 : maximum value {0.1 -> 1}
                  - x2 : maximum step {0.1 -> 1}
-            12. loopseg 
+            12. loopseg
                  - x1 : maximum value {0.1 -> 1}
                  - x2 : maximum step {0.1 -> 1}
 
@@ -1871,42 +1872,42 @@ class TrigXnoise(PyoObject):
         [obj.setX2(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio trigger signal."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def dist(self): 
+    def dist(self):
         """string or int. Distribution type."""
         return self._dist
     @dist.setter
-    def dist(self, x): 
+    def dist(self, x):
         self.setDist(x)
     @property
-    def x1(self): 
+    def x1(self):
         """float or PyoObject. First parameter."""
         return self._x1
     @x1.setter
-    def x1(self, x): 
+    def x1(self, x):
         self.setX1(x)
     @property
-    def x2(self): 
+    def x2(self):
         """float or PyoObject. Second parameter."""
         return self._x2
     @x2.setter
-    def x2(self, x): 
+    def x2(self, x):
         self.setX2(x)
 
 class TrigXnoiseMidi(PyoObject):
     """
     Triggered X-class midi notes pseudo-random generator.
 
-    Xnoise implements a few of the most common noise distributions. 
-    A new value is generated each time the object receive a trigger 
-    in input. Each distribution generates integer values in the range 
-    defined with `mrange` parameter and output can be scaled on midi 
+    Xnoise implements a few of the most common noise distributions.
+    A new value is generated each time the object receive a trigger
+    in input. Each distribution generates integer values in the range
+    defined with `mrange` parameter and output can be scaled on midi
     notes, hertz or transposition factor.
 
     :Parent: :py:class:`PyoObject`
@@ -1925,7 +1926,7 @@ class TrigXnoiseMidi(PyoObject):
         Output format. 0 = MIDI, 1 = Hertz, 2 = transposition factor.
          Defaults to 0.
 
-        In the transposition mode, the central key (the key where there 
+        In the transposition mode, the central key (the key where there
         is no transposition) is (`minrange` + `maxrange`) / 2.
     mrange : tuple of int, optional
         Minimum and maximum possible values, in Midi notes. Available
@@ -1947,7 +1948,7 @@ class TrigXnoiseMidi(PyoObject):
             10. poisson
             11. walker (drunk)
             12. loopseg (drunk with looped segments)
-            
+
         Depending on the distribution, `x1` and `x2` parameters are applied
         as follow (names as string, or associated number can be used as `dist`
         parameter):
@@ -1988,7 +1989,7 @@ class TrigXnoiseMidi(PyoObject):
             11. walker
                  - x1 : maximum value {0.1 -> 1}
                  - x2 : maximum step {0.1 -> 1}
-            12. loopseg 
+            12. loopseg
                  - x1 : maximum value {0.1 -> 1}
                  - x2 : maximum step {0.1 -> 1}
 
@@ -2051,7 +2052,7 @@ class TrigXnoiseMidi(PyoObject):
         """
         Replace the `scale` attribute.
 
-        Possible values are: 
+        Possible values are:
             0. Midi notes
             1. Hertz
             2. transposition factor (centralkey is (`minrange` + `maxrange`) / 2
@@ -2111,47 +2112,47 @@ class TrigXnoiseMidi(PyoObject):
         [obj.setX2(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio trigger signal."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def dist(self): 
+    def dist(self):
         """string or int. Distribution type."""
         return self._dist
     @dist.setter
-    def dist(self, x): 
+    def dist(self, x):
         self.setDist(x)
     @property
-    def x1(self): 
+    def x1(self):
         """float or PyoObject. First parameter."""
         return self._x1
     @x1.setter
-    def x1(self, x): 
+    def x1(self, x):
         self.setX1(x)
     @property
-    def x2(self): 
+    def x2(self):
         """float or PyoObject. Second parameter."""
         return self._x2
     @x2.setter
-    def x2(self, x): 
+    def x2(self, x):
         self.setX2(x)
     @property
-    def scale(self): 
+    def scale(self):
         """int. Output format."""
         return self._scale
     @scale.setter
-    def scale(self, x): 
+    def scale(self, x):
         self.setScale(x)
 
 class Counter(PyoObject):
     """
     Integer count generator.
 
-    Counter keeps track of all triggers received, outputs the current 
-    count constrained within `min` and `max` range, and can be set to 
+    Counter keeps track of all triggers received, outputs the current
+    count constrained within `min` and `max` range, and can be set to
     count up, down, or up-and-down.
 
 
@@ -2164,7 +2165,7 @@ class Counter(PyoObject):
         min : int, optional
             Minimum value of the count, included in the count. Defaults to 0.
         max : int, optional
-            Maximum value of the count. excluded of the count. 
+            Maximum value of the count. excluded of the count.
             The counter will count up to max - 1. Defaults to 100.
         dir : int {0, 1, 2}, optional
             Direction of the count. Defaults to 0. Three possible values:
@@ -2174,11 +2175,11 @@ class Counter(PyoObject):
 
     .. note::
 
-        The out() method is bypassed. Counter's signal can not be sent 
+        The out() method is bypassed. Counter's signal can not be sent
         to audio outs.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`Select`
 
     >>> s = Server().boot()
@@ -2204,7 +2205,7 @@ class Counter(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -2215,16 +2216,16 @@ class Counter(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setMin(self, x):
         """
         Replace the `min` attribute.
-        
+
         :Args:
 
             x : int
                 new `min` attribute.
-        
+
         """
         self._min = x
         x, lmax = convertArgsToLists(x)
@@ -2233,12 +2234,12 @@ class Counter(PyoObject):
     def setMax(self, x):
         """
         Replace the `max` attribute.
-        
+
         :Args:
 
             x : int
                 new `max` attribute.
-        
+
         """
         self._max = x
         x, lmax = convertArgsToLists(x)
@@ -2247,12 +2248,12 @@ class Counter(PyoObject):
     def setDir(self, x):
         """
         Replace the `dir` attribute.
-        
+
         :Args:
 
             x : int {0, 1, 2}
                 new `dir` attribute.
-        
+
         """
         self._dir = x
         x, lmax = convertArgsToLists(x)
@@ -2281,32 +2282,32 @@ class Counter(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio trigger signal."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def min(self): 
+    def min(self):
         """int. Minimum value."""
         return self._min
     @min.setter
-    def min(self, x): 
+    def min(self, x):
         self.setMin(x)
     @property
-    def max(self): 
+    def max(self):
         """int. Maximum value."""
         return self._max
     @max.setter
-    def max(self, x): 
+    def max(self, x):
         self.setMax(x)
     @property
-    def dir(self): 
+    def dir(self):
         """int. Direction of the count."""
         return self._dir
     @dir.setter
-    def dir(self, x): 
+    def dir(self, x):
         self.setDir(x)
 
 class Select(PyoObject):
@@ -2328,11 +2329,11 @@ class Select(PyoObject):
 
     .. note::
 
-        The out() method is bypassed. Select's signal can not be sent 
+        The out() method is bypassed. Select's signal can not be sent
         to audio outs.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`Counter`
 
     >>> s = Server().boot()
@@ -2360,7 +2361,7 @@ class Select(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -2371,16 +2372,16 @@ class Select(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setValue(self, x):
         """
         Replace the `value` attribute.
-        
+
         :Args:
 
             x : int
                 new `value` attribute.
-        
+
         """
         self._value = x
         x, lmax = convertArgsToLists(x)
@@ -2391,18 +2392,18 @@ class Select(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio signal."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def value(self): 
+    def value(self):
         """int. Matching value."""
         return self._value
     @value.setter
-    def value(self, x): 
+    def value(self, x):
         self.setValue(x)
 
 class Change(PyoObject):
@@ -2418,7 +2419,7 @@ class Change(PyoObject):
 
     .. note::
 
-        The out() method is bypassed. Change's signal can not be sent 
+        The out() method is bypassed. Change's signal can not be sent
         to audio outs.
 
     >>> s = Server().boot()
@@ -2443,7 +2444,7 @@ class Change(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -2456,19 +2457,19 @@ class Change(PyoObject):
         self._in_fader.setInput(x, fadetime)
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio signal."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
 
 class Thresh(PyoObject):
     """
     Informs when a signal crosses a threshold.
-    
-    Thresh sends a trigger when a signal crosses a threshold. The `dir` 
-    parameter can be used to set the crossing mode, down-up, up-down, or 
+
+    Thresh sends a trigger when a signal crosses a threshold. The `dir`
+    parameter can be used to set the crossing mode, down-up, up-down, or
     both.
 
     :Parent: :py:class:`PyoObject`
@@ -2483,18 +2484,18 @@ class Thresh(PyoObject):
             There are three modes of using Thresh:
                 0. down-up (default)
                     sends a trigger when current value is higher than the
-                    threshold, while old value was equal to or lower than 
+                    threshold, while old value was equal to or lower than
                     the threshold.
                 1. up-down
                     sends a trigger when current value is lower than the
-                    threshold, while old value was equal to or higher than 
+                    threshold, while old value was equal to or higher than
                     the threshold.
                 2. both direction
                     sends a trigger in both the two previous cases.
-    
+
     .. note::
 
-        The out() method is bypassed. Thresh's signal can not be sent 
+        The out() method is bypassed. Thresh's signal can not be sent
         to audio outs.
 
     >>> s = Server().boot()
@@ -2504,7 +2505,7 @@ class Thresh(PyoObject):
     >>> t = LinTable([(0,0), (50,1), (250,.3), (8191,0)])
     >>> env = TrigEnv(b, table=t, dur=.5, mul=.3)
     >>> sine = Sine(freq=[500,600,700], mul=env).out()
-    
+
     """
     def __init__(self, input, threshold=0., dir=0, mul=1, add=0):
         PyoObject.__init__(self, mul, add)
@@ -2521,7 +2522,7 @@ class Thresh(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -2532,16 +2533,16 @@ class Thresh(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setThreshold(self, x):
         """
         Replace the `threshold` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
                 new `threshold` attribute.
-        
+
         """
         self._threshold = x
         x, lmax = convertArgsToLists(x)
@@ -2550,37 +2551,37 @@ class Thresh(PyoObject):
     def setDir(self, x):
         """
         Replace the `dir` attribute.
-        
+
         :Args:
 
             x : int {0, 1, 2}
                 new `dir` attribute.
-        
+
         """
         self._dir = x
         x, lmax = convertArgsToLists(x)
         [obj.setDir(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio signal."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def threshold(self): 
+    def threshold(self):
         """float or PyoObject. Threshold value."""
         return self._threshold
     @threshold.setter
-    def threshold(self, x): 
+    def threshold(self, x):
         self.setThreshold(x)
     @property
-    def dir(self): 
+    def dir(self):
         """int. User mode."""
         return self._dir
     @dir.setter
-    def dir(self, x): 
+    def dir(self, x):
         self.setDir(x)
 
 class Percent(PyoObject):
@@ -2597,12 +2598,12 @@ class Percent(PyoObject):
         input : PyoObject
             Audio signal sending triggers.
         percent : float or PyoObject, optional
-            How much percentage of triggers to let pass, 
+            How much percentage of triggers to let pass,
             between 0 and 100. Defaults to 50.
 
     .. note::
 
-        The out() method is bypassed. Percent's signal can not 
+        The out() method is bypassed. Percent's signal can not
         be sent to audio outs.
 
     >>> s = Server().boot()
@@ -2661,27 +2662,27 @@ class Percent(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio signal."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def percent(self): 
+    def percent(self):
         """float or PyoObject. Percentage value."""
         return self._percent
     @percent.setter
-    def percent(self, x): 
+    def percent(self, x):
         self.setPercent(x)
 
 class Timer(PyoObject):
     """
     Reports elapsed time between two trigs.
 
-    A trigger in `input2` signal starts an internal timer. The next trigger 
-    in `input` signal stops it and reports the elapsed time between the two 
-    triggers. Useful for filtering triggers that are too close to each other. 
+    A trigger in `input2` signal starts an internal timer. The next trigger
+    in `input` signal stops it and reports the elapsed time between the two
+    triggers. Useful for filtering triggers that are too close to each other.
 
     :Parent: :py:class:`PyoObject`
 
@@ -2750,14 +2751,14 @@ class Timer(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Timer stop signal.""" 
+        """PyoObject. Timer stop signal."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def input2(self):
-        """PyoObject. Timer start signal.""" 
+        """PyoObject. Timer start signal."""
         return self._input2
     @input2.setter
     def input2(self, x): self.setInput2(x)
@@ -2767,7 +2768,7 @@ class Iter(PyoObject):
     Triggers iterate over a list of values.
 
     Iter loops over a list of user-defined values. When a trigger is received
-    in `input`, Iter moves up to the next value in the list, with wrap-around. 
+    in `input`, Iter moves up to the next value in the list, with wrap-around.
 
     :Parent: :py:class:`PyoObject`
 
@@ -2778,7 +2779,7 @@ class Iter(PyoObject):
         choice : list of floats
             Sequence of values over which to iterate.
         init : float, optional
-            Initial value. Available at initialization time only. 
+            Initial value. Available at initialization time only.
             Defaults to 0.
 
     >>> s = Server().boot()
@@ -2842,36 +2843,36 @@ class Iter(PyoObject):
     def reset(self, x=0):
         """
         Resets the current count.
-        
+
         :Args:
-        
+
             x : int, optional
                 Value where to reset the count. Defaults to 0.
-        
+
         """
         [obj.reset(x) for obj in self._base_objs]
-        
+
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio trigger signal."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def choice(self): 
+    def choice(self):
         """list of floats. Possible values."""
         return self._choice
     @choice.setter
-    def choice(self, x): 
+    def choice(self, x):
         self.setChoice(x)
 
 class Count(PyoObject):
     """
     Counts integers at audio rate.
 
-    Count generates a signal increasing by 1 each sample when it receives a 
-    trigger. It can be used to do sample playback using TableIndex. 
+    Count generates a signal increasing by 1 each sample when it receives a
+    trigger. It can be used to do sample playback using TableIndex.
 
     :Parent: :py:class:`PyoObject`
 
@@ -2883,8 +2884,8 @@ class Count(PyoObject):
             Minimum value of the count, included in the count. Defaults to 0.
         max : int, optional
             Maximum value of the count. excluded of the count. Defaults to 0.
-            
-            A value of 0 eliminates the maximum, and the count continues 
+
+            A value of 0 eliminates the maximum, and the count continues
             increasing without resetting.
 
     >>> s = Server().boot()
@@ -2953,32 +2954,32 @@ class Count(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Trigger signal. Start/Restart the count."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def min(self): 
+    def min(self):
         """int. Minimum value."""
         return self._min
     @min.setter
-    def min(self, x): 
+    def min(self, x):
         self.setMin(x)
     @property
-    def max(self): 
+    def max(self):
         """int. Maximum value."""
         return self._max
     @max.setter
-    def max(self, x): 
+    def max(self, x):
         self.setMax(x)
 
 class NextTrig(PyoObject):
     """
     A trigger in the second stream opens a gate only for the next one in the first stream.
 
-    When the gate is opened by a trigger in `input2` signal, the next trigger 
+    When the gate is opened by a trigger in `input2` signal, the next trigger
     in `input` signal is allowed to pass and automatically closes the gate.
 
     :Parent: :py:class:`PyoObject`
@@ -3045,18 +3046,18 @@ class NextTrig(PyoObject):
         self._in_fader2.setInput(x, fadetime)
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Incoming trigger stream signal."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def input2(self): 
+    def input2(self):
         """PyoObject. Trigger stream opening the gate."""
         return self._input2
     @input2.setter
-    def input2(self, x): 
+    def input2(self, x):
         self.setInput2(x)
 
 class TrigVal(PyoObject):
@@ -3079,7 +3080,7 @@ class TrigVal(PyoObject):
 
     .. note::
 
-        The out() method is bypassed. TrigVal's signal can not be sent 
+        The out() method is bypassed. TrigVal's signal can not be sent
         to audio outs.
 
     >>> s = Server().boot()
@@ -3138,30 +3139,30 @@ class TrigVal(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio trigger signal."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def value(self): 
+    def value(self):
         """float or PyoObject. Next value."""
         return self._value
     @value.setter
-    def value(self, x): 
+    def value(self, x):
         self.setValue(x)
 
 class Euclide(PyoObject):
     """
     Euclidean rhythm generator.
-    
-    This object generates euclidean trigger patterns, resulting in onsets 
+
+    This object generates euclidean trigger patterns, resulting in onsets
     in the rhythm to be as equidistant as possible.
-    
+
     A trigger is an audio signal with a value of 1 surrounded by 0s.
-    
-    The play() method starts the Euclide and is not called at the object 
+
+    The play() method starts the Euclide and is not called at the object
     creation time.
 
     :Parent: :py:class:`PyoObject`
@@ -3171,28 +3172,28 @@ class Euclide(PyoObject):
         time : float or PyoObject, optional
             Time, in seconds, between each beat of the pattern. Defaults to 0.125.
         taps : int, optional
-            Number of beats in the generated pattern (measure length), max = 64. 
+            Number of beats in the generated pattern (measure length), max = 64.
             Defaults to 16.
         onsets : int, optional
-            Number of onsets (a positive tap) in the generated pattern. 
+            Number of onsets (a positive tap) in the generated pattern.
             Defaults to 10.
         poly : int, optional
-            Beat polyphony. Denotes how many independent streams are 
+            Beat polyphony. Denotes how many independent streams are
             generated by the object, allowing overlapping processes.
-            
+
             Available only at initialization. Defaults to 1.
 
     .. note::
 
         Euclide outputs many signals identified with a string between brackets:
 
-        |  obj['tap'] returns audio stream of the current tap of the measure.  
-        |  obj['amp'] returns audio stream of the current beat amplitude.  
-        |  obj['dur'] returns audio stream of the current beat duration in seconds.  
+        |  obj['tap'] returns audio stream of the current tap of the measure.
+        |  obj['amp'] returns audio stream of the current beat amplitude.
+        |  obj['dur'] returns audio stream of the current beat duration in seconds.
         |  obj['end'] returns audio stream with a trigger just before the end of the measure.
-        
+
         obj without brackets returns the generated trigger stream of the measure.
-         
+
         The out() method is bypassed. Euclide's signal can not be sent to audio outs.
 
         Euclide has no `mul` and `add` attributes.
@@ -3231,8 +3232,8 @@ class Euclide(PyoObject):
 
     def __generate__(self, m, k):
         """
-        Generates the euclidean rhythm for `m` onsets 
-        in a measure of length `k` (number of taps). 
+        Generates the euclidean rhythm for `m` onsets
+        in a measure of length `k` (number of taps).
         Looping implementation, faster than recursive.
         """
         if m > k: m = k
@@ -3241,7 +3242,7 @@ class Euclide(PyoObject):
         while k > 1:
             if m > k:
                 m, k = k, m-k
-                mv, kv = mv+kv, mv  
+                mv, kv = mv+kv, mv
             else:
                 m, k = m, k-m
                 mv, kv = mv+kv, kv
@@ -3265,7 +3266,7 @@ class Euclide(PyoObject):
         if i < len(self._base_objs):
             return self._base_objs[i]
         else:
-            print "'i' too large!"         
+            print "'i' too large!"
 
     def get(self, identifier="amp", all=False):
         """
@@ -3283,9 +3284,9 @@ class Euclide(PyoObject):
                 Defaults to "amp".
             all : boolean, optional
                 If True, the first value of each object's stream
-                will be returned as a list. 
-                
-                If False, only the value of the first object's 
+                will be returned as a list.
+
+                If False, only the value of the first object's
                 stream will be returned as a float.
 
         """
@@ -3345,7 +3346,7 @@ class Euclide(PyoObject):
     def reset(self):
         """
         Reset internal counters to initialization values.
-        
+
         """
         [obj.reset() for obj in self._base_players]
 
@@ -3387,21 +3388,21 @@ class Euclide(PyoObject):
 
     @property
     def time(self):
-        """float or PyoObject. Time, in seconds, between each beat.""" 
+        """float or PyoObject. Time, in seconds, between each beat."""
         return self._time
     @time.setter
     def time(self, x): self.setTime(x)
 
     @property
     def taps(self):
-        """int. Number of beats in the generated pattern.""" 
+        """int. Number of beats in the generated pattern."""
         return self._taps
     @taps.setter
     def taps(self, x): self.setTaps(x)
 
     @property
     def onsets(self):
-        """int. Number of onsets in the generated pattern.""" 
+        """int. Number of onsets in the generated pattern."""
         return self._onsets
     @onsets.setter
     def onsets(self, x): self.setOnsets(x)
@@ -3409,13 +3410,13 @@ class Euclide(PyoObject):
 class TrigBurst(PyoObject):
     """
     Generates a time/amplitude expandable trigger pattern.
-    
+
     A trigger is an audio signal with a value of 1 surrounded by 0s.
-    
+
     When TrigBurst receives a trigger in its `input` argument, it starts
     to output `count` triggers with a variable delay between each trigger
-    of the pattern. If `expand` is less than 1.0, the delay becomes shorter, 
-    if it is greater than 1.0, the delay becomes longer. 
+    of the pattern. If `expand` is less than 1.0, the delay becomes shorter,
+    if it is greater than 1.0, the delay becomes longer.
 
     :Parent: :py:class:`PyoObject`
 
@@ -3434,22 +3435,22 @@ class TrigBurst(PyoObject):
             Amplitude power serie factor. Each amplitude in the serie is the
             current amplitude (starting at 1) times `ampfade` factor. Defaults to 1.0.
         poly : int, optional
-            Voice polyphony. Denotes how many independent streams are 
+            Voice polyphony. Denotes how many independent streams are
             generated by the object, allowing overlapping processes.
-            
+
             Available only at initialization. Defaults to 1.
 
     .. note::
 
         TrigBurst outputs many signals identified with a string between brackets:
-        
-        |  obj['tap'] returns audio stream of the current tap of the serie.  
-        |  obj['amp'] returns audio stream of the current beat amplitude.  
-        |  obj['dur'] returns audio stream of the current beat duration in seconds.  
+
+        |  obj['tap'] returns audio stream of the current tap of the serie.
+        |  obj['amp'] returns audio stream of the current beat amplitude.
+        |  obj['dur'] returns audio stream of the current beat duration in seconds.
         |  obj['end'] returns audio stream with a trigger just before the end of the serie.
 
         obj without brackets returns the generated trigger stream of the serie.
-         
+
         The out() method is bypassed. TrigBurst's signal can not be sent to audio outs.
 
         TrigBurst has no `mul` and `add` attributes.
@@ -3503,7 +3504,7 @@ class TrigBurst(PyoObject):
         if i < len(self._base_objs):
             return self._base_objs[i]
         else:
-            print "'i' too large!"         
+            print "'i' too large!"
 
     def get(self, identifier="amp", all=False):
         """
@@ -3521,9 +3522,9 @@ class TrigBurst(PyoObject):
                 Defaults to "amp".
             all : boolean, optional
                 If True, the first value of each object's stream
-                will be returned as a list. 
-                
-                If False, only the value of the first object's 
+                will be returned as a list.
+
+                If False, only the value of the first object's
                 stream will be returned as a float.
 
         """
@@ -3535,7 +3536,7 @@ class TrigBurst(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -3641,7 +3642,7 @@ class TrigBurst(PyoObject):
         PyoObject.ctrl(self, map_list, title, wxnoserver)
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio trigger signal."""
         return self._input
     @input.setter
@@ -3649,28 +3650,28 @@ class TrigBurst(PyoObject):
 
     @property
     def time(self):
-        """float or PyoObject. Base time, in seconds, between each trig.""" 
+        """float or PyoObject. Base time, in seconds, between each trig."""
         return self._time
     @time.setter
     def time(self, x): self.setTime(x)
 
     @property
     def count(self):
-        """int. Number of triggers in the generated serie.""" 
+        """int. Number of triggers in the generated serie."""
         return self._count
     @count.setter
     def count(self, x): self.setCount(x)
 
     @property
     def expand(self):
-        """float. Time's power expansion factor.""" 
+        """float. Time's power expansion factor."""
         return self._expand
     @expand.setter
     def expand(self, x): self.setExpand(x)
 
     @property
     def ampfade(self):
-        """float. Amplitude's power expansion factor.""" 
+        """float. Amplitude's power expansion factor."""
         return self._ampfade
     @ampfade.setter
-    def ampfade(self, x): self.setAmpfade(x)
+    def ampfade(self, x): self.setAmpfade(x)
\ No newline at end of file
diff --git a/pyolib/utils.py b/pyolib/utils.py
index fb2cd06..6683ce7 100644
--- a/pyolib/utils.py
+++ b/pyolib/utils.py
@@ -4,23 +4,23 @@ Miscellaneous objects.
 """
 
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU Lesser General Public
+License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
 from _core import *
 from _maps import *
@@ -32,11 +32,11 @@ class Clean_objects(threading.Thread):
     Stops and deletes PyoObjects after a given time.
 
     The start() method starts the thread timer (must be called).
-    
+
     :Args:
 
         time : float
-            Time, in seconds, to wait before calling stop on the given 
+            Time, in seconds, to wait before calling stop on the given
             objects and deleting them.
         *args : PyoObject(s)
             Objects to delete.
@@ -48,20 +48,20 @@ class Clean_objects(threading.Thread):
     >>> c = Biquad(a, freq=500, q=2, mul=b).out()
     >>> dump = Clean_objects(6, a, b, c)
     >>> dump.start()
-    
+
     """
     def __init__(self, time, *args):
         threading.Thread.__init__(self)
         self.t = time
         self.args = args
-        
+
     def run(self):
         time.sleep(self.t)
         for arg in self.args:
             try: arg.stop()
             except: pass
         for arg in self.args:
-            del arg 
+            del arg
 
 class Print(PyoObject):
     """
@@ -85,7 +85,7 @@ class Print(PyoObject):
 
     .. note::
 
-        The out() method is bypassed. Print's signal can not be sent to 
+        The out() method is bypassed. Print's signal can not be sent to
         audio outs.
 
         Print has no `mul` and `add` attributes.
@@ -110,7 +110,7 @@ class Print(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -125,7 +125,7 @@ class Print(PyoObject):
     def setMethod(self, x):
         """
         Replace the `method` attribute.
-        
+
         :Args:
 
             x : int {0, 1}
@@ -169,28 +169,28 @@ class Print(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal.""" 
+        """PyoObject. Input signal."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def method(self):
-        """int. Controls when a value is printed.""" 
+        """int. Controls when a value is printed."""
         return self._method
     @method.setter
     def method(self, x): self.setMethod(x)
 
     @property
     def interval(self):
-        """float. For method 0, interval, in seconds, between each print.""" 
+        """float. For method 0, interval, in seconds, between each print."""
         return self._interval
     @interval.setter
     def interval(self, x): self.setInterval(x)
 
     @property
     def message(self):
-        """str. Message to print before the current value.""" 
+        """str. Message to print before the current value."""
         return self._message
     @message.setter
     def message(self, x): self.setMessage(x)
@@ -200,11 +200,11 @@ class Snap(PyoObject):
     Snap input values on a user's defined midi scale.
 
     Snap takes an audio input of floating-point values from 0
-    to 127 and output the nearest value in the `choice` parameter. 
-    `choice` can be defined on any number of octaves and the real 
-    snapping values will be automatically expended. The object 
-    will take care of the input octave range. According to `scale` 
-    parameter, output can be in midi notes, hertz or transposition 
+    to 127 and output the nearest value in the `choice` parameter.
+    `choice` can be defined on any number of octaves and the real
+    snapping values will be automatically expended. The object
+    will take care of the input octave range. According to `scale`
+    parameter, output can be in midi notes, hertz or transposition
     factor (centralkey = 60).
 
     :Parent: :py:class:`PyoObject`
@@ -221,7 +221,7 @@ class Snap(PyoObject):
                 1. Hertz
                 2. transposition factor
 
-            In the transpo mode, the central key (the key where there 
+            In the transpo mode, the central key (the key where there
             is no transposition) is 60.
 
     >>> s = Server().boot()
@@ -255,7 +255,7 @@ class Snap(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -266,16 +266,16 @@ class Snap(PyoObject):
         """
         self._input = x
         self._in_fader.setInput(x, fadetime)
-        
+
     def setChoice(self, x):
         """
         Replace the `choice` attribute.
-        
+
         :Args:
 
             x : list of floats
                 new `choice` attribute.
-        
+
         """
         self._choice = x
         [obj.setChoice(x) for i, obj in enumerate(self._base_objs)]
@@ -283,8 +283,8 @@ class Snap(PyoObject):
     def setScale(self, x):
         """
         Replace the `scale` attribute.
-        
-        Possible values are: 
+
+        Possible values are:
             0. Midi notes
             1. Hertz
             2. transposition factor (centralkey = 60)
@@ -300,25 +300,25 @@ class Snap(PyoObject):
         [obj.setScale(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     @property
-    def input(self): 
+    def input(self):
         """PyoObject. Audio signal to transform."""
         return self._input
     @input.setter
-    def input(self, x): 
+    def input(self, x):
         self.setInput(x)
     @property
-    def choice(self): 
+    def choice(self):
         """list of floats. Possible values."""
         return self._choice
     @choice.setter
-    def choice(self, x): 
+    def choice(self, x):
         self.setChoice(x)
     @property
-    def scale(self): 
+    def scale(self):
         """int. Output format."""
         return self._scale
     @scale.setter
-    def scale(self, x): 
+    def scale(self, x):
         self.setScale(x)
 
 class Interp(PyoObject):
@@ -358,7 +358,7 @@ class Interp(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -373,7 +373,7 @@ class Interp(PyoObject):
     def setInput2(self, x, fadetime=0.05):
         """
         Replace the `input2` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -384,11 +384,11 @@ class Interp(PyoObject):
         """
         self._input2 = x
         self._in_fader2.setInput(x, fadetime)
-        
+
     def setInterp(self, x):
         """
         Replace the `interp` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -402,34 +402,34 @@ class Interp(PyoObject):
     def ctrl(self, map_list=None, title=None, wxnoserver=False):
         self._map_list = [SLMap(0., 1., "lin", "interp", self._interp), SLMapMul(self._mul)]
         PyoObject.ctrl(self, map_list, title, wxnoserver)
-      
+
     @property
     def input(self):
-        """PyoObject. First input signal.""" 
+        """PyoObject. First input signal."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def input2(self):
-        """PyoObject. Second input signal.""" 
+        """PyoObject. Second input signal."""
         return self._input2
     @input2.setter
     def input2(self, x): self.setInput2(x)
 
     @property
     def interp(self):
-        """float or PyoObject. Averaging value.""" 
+        """float or PyoObject. Averaging value."""
         return self._interp
     @interp.setter
     def interp(self, x): self.setInterp(x)
 
 class SampHold(PyoObject):
     """
-    Performs a sample-and-hold operation on its input. 
+    Performs a sample-and-hold operation on its input.
 
-    SampHold performs a sample-and-hold operation on its input according 
-    to the value of `controlsig`. If `controlsig` equals `value`, the input 
+    SampHold performs a sample-and-hold operation on its input according
+    to the value of `controlsig`. If `controlsig` equals `value`, the input
     is sampled and held until next sampling.
 
     :Parent: :py:class:`PyoObject`
@@ -464,7 +464,7 @@ class SampHold(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -479,7 +479,7 @@ class SampHold(PyoObject):
     def setControlsig(self, x, fadetime=0.05):
         """
         Replace the `controlsig` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -490,11 +490,11 @@ class SampHold(PyoObject):
         """
         self._controlsig = x
         self._in_fader2.setInput(x, fadetime)
-        
+
     def setValue(self, x):
         """
         Replace the `value` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -507,21 +507,21 @@ class SampHold(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal.""" 
+        """PyoObject. Input signal."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def controlsig(self):
-        """PyoObject. Control signal.""" 
+        """PyoObject. Control signal."""
         return self._controlsig
     @controlsig.setter
     def controlsig(self, x): self.setControlsig(x)
 
     @property
     def value(self):
-        """float or PyoObject. Target value.""" 
+        """float or PyoObject. Target value."""
         return self._value
     @value.setter
     def value(self, x): self.setValue(x)
@@ -530,7 +530,7 @@ class Record(PyoObject):
     """
     Writes input sound in an audio file on the disk.
 
-    `input` parameter must be a valid PyoObject or an addition of 
+    `input` parameter must be a valid PyoObject or an addition of
     PyoObjects, parameters can't be in list format.
 
     :Parent: :py:class:`PyoObject`
@@ -546,8 +546,8 @@ class Record(PyoObject):
         fileformat : int, optional
             Format type of the audio file. Defaults to 0.
 
-            Record will first try to set the format from the filename extension. 
-            
+            Record will first try to set the format from the filename extension.
+
             If it's not possible, it uses the fileformat parameter. Supported formats are:
                 0. WAV - Microsoft WAV format (little endian) {.wav, .wave}
                 1. AIFF - Apple/SGI AIFF format (big endian) {.aif, .aiff}
@@ -558,8 +558,8 @@ class Record(PyoObject):
                 6. CAF - Core Audio File format {.caf}
                 7. OGG - Xiph OGG container {.ogg}
         sampletype : int, optional
-            Bit depth encoding of the audio file. 
-            
+            Bit depth encoding of the audio file.
+
             SD2 and FLAC only support 16 or 24 bit int. Supported types are:
                 0. 16 bits int (default)
                 1. 24 bits int
@@ -570,18 +570,18 @@ class Record(PyoObject):
                 6. A-Law encoded
         buffering : int, optional
             Number of bufferSize to wait before writing samples to disk.
-            
+
             High buffering uses more memory but improves performance.
             Defaults to 4.
 
     .. note::
 
-        All parameters can only be set at intialization time.    
+        All parameters can only be set at intialization time.
 
-        The stop() method must be called on the object to close the file 
+        The stop() method must be called on the object to close the file
         properly.
 
-        The out() method is bypassed. Record's signal can not be sent to 
+        The out() method is bypassed. Record's signal can not be sent to
         audio outs.
 
         Record has no `mul` and `add` attributes.
@@ -603,6 +603,7 @@ class Record(PyoObject):
     def __init__(self, input, filename, chnls=2, fileformat=0, sampletype=0, buffering=4):
         PyoObject.__init__(self)
         self._input = input
+        self._in_fader = InputFader(input)
         ext = filename.rsplit('.')
         if len(ext) >= 2:
             ext = ext[-1].lower()
@@ -612,18 +613,40 @@ class Record(PyoObject):
                 print 'Warning: Unknown file extension. Using fileformat value.'
         else:
             print 'Warning: Filename has no extension. Using fileformat value.'
-        self._base_objs = [Record_base(self._input.getBaseObjects(), filename, chnls, fileformat, sampletype, buffering)]
+        self._base_objs = [Record_base(self._in_fader.getBaseObjects(), filename, chnls, fileformat, sampletype, buffering)]
 
     def out(self, chnl=0, inc=1, dur=0, delay=0):
         return self.play(dur, delay)
 
+    def setInput(self, x, fadetime=0.05):
+        """
+        Replace the `input` attribute.
+
+        :Args:
+
+            x : PyoObject
+                New signal to process.
+            fadetime : float, optional
+                Crossfade time between old and new input. Default to 0.05.
+
+        """
+        self._input = x
+        self._in_fader.setInput(x, fadetime)
+
+    @property
+    def input(self):
+        """PyoObject. Input signal to filter."""
+        return self._input
+    @input.setter
+    def input(self, x): self.setInput(x)
+
 class Denorm(PyoObject):
     """
     Mixes low level noise to an input signal.
 
-    Mixes low level (~1e-24 for floats, and ~1e-60 for doubles) noise to a an input signal. 
-    Can be used before IIR filters and reverbs to avoid denormalized numbers which may 
-    otherwise result in significantly increased CPU usage. 
+    Mixes low level (~1e-24 for floats, and ~1e-60 for doubles) noise to a an input signal.
+    Can be used before IIR filters and reverbs to avoid denormalized numbers which may
+    otherwise result in significantly increased CPU usage.
 
     :Parent: :py:class:`PyoObject`
 
@@ -664,7 +687,7 @@ class Denorm(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to filter.""" 
+        """PyoObject. Input signal to filter."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -680,7 +703,7 @@ class ControlRec(PyoObject):
     Each line in the text files contains two values, the absolute time
     in seconds and the sampled value.
 
-    The play() method starts the recording and is not called at the 
+    The play() method starts the recording and is not called at the
     object creation time.
 
     :Parent: :py:class:`PyoObject`
@@ -691,35 +714,35 @@ class ControlRec(PyoObject):
             Input signal to sample.
         filename : string
             Full path (without extension) used to create the files.
-             
+
             "_000" will be added to file's names with increasing digits
-            according to the number of streams in input. 
-            
-            The same filename can be passed to a ControlRead object to 
+            according to the number of streams in input.
+
+            The same filename can be passed to a ControlRead object to
             read all related files.
         rate : int, optional
             Rate at which the input values are sampled. Defaults to 1000.
         dur : float, optional
             Duration of the recording, in seconds. If 0.0, the recording
-            won't stop until the end of the performance. 
-            
-            If greater than 0.0, the `stop` method is automatically called 
+            won't stop until the end of the performance.
+
+            If greater than 0.0, the `stop` method is automatically called
             at the end of the recording.
 
     .. note::
 
-        All parameters can only be set at intialization time.    
+        All parameters can only be set at intialization time.
 
-        The write() method must be called on the object to write the files 
+        The write() method must be called on the object to write the files
         on the disk.
 
-        The out() method is bypassed. ControlRec's signal can not be sent to 
+        The out() method is bypassed. ControlRec's signal can not be sent to
         audio outs.
 
         ControlRec has no `mul` and `add` attributes.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`ControlRead`
 
     >>> s = Server().boot()
@@ -752,7 +775,7 @@ class ControlRec(PyoObject):
     def write(self):
         """
         Writes recorded values in text files on the disk.
-        
+
         """
         for i, obj in enumerate(self._base_objs):
             f = open(os.path.join(self._path, "%s_%03d" % (self._name, i)), "w")
@@ -770,17 +793,17 @@ class ControlRead(PyoObject):
     :Args:
 
         filename : string
-            Full path (without extension) used to create the files. 
-            
-            Usually the same filename as the one given to a ControlRec 
-            object to record automation. 
-            
+            Full path (without extension) used to create the files.
+
+            Usually the same filename as the one given to a ControlRec
+            object to record automation.
+
             The directory will be scaned and all files
             named "filename_xxx" will add a new stream in the object.
         rate : int, optional
             Rate at which the values are sampled. Defaults to 1000.
         loop : boolean, optional
-            Looping mode, False means off, True means on. 
+            Looping mode, False means off, True means on.
             Defaults to False.
         interp : int, optional
             Choice of the interpolation method.
@@ -791,19 +814,19 @@ class ControlRead(PyoObject):
 
     .. note::
 
-        ControlRead will sends a trigger signal at the end of the playback if 
-        loop is off or any time it wraps around if loop is on. User can 
+        ControlRead will sends a trigger signal at the end of the playback if
+        loop is off or any time it wraps around if loop is on. User can
         retreive the trigger streams by calling obj['trig']:
 
         >>> rnds = ControlRead(home+"/freq_auto", loop=True)
         >>> t = SndTable(SNDS_PATH+"/transparent.aif")
         >>> loop = TrigEnv(rnds["trig"], t, dur=[.2,.3,.4,.5], mul=.5).out()
 
-        The out() method is bypassed. ControlRead's signal can not be sent to 
+        The out() method is bypassed. ControlRead's signal can not be sent to
         audio outs.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`ControlRec`
 
     >>> s = Server().boot()
@@ -880,20 +903,20 @@ class ControlRead(PyoObject):
 
     @property
     def rate(self):
-        """int. Sampling frequency in cycles per second.""" 
+        """int. Sampling frequency in cycles per second."""
         return self._rate
     @rate.setter
     def rate(self, x): self.setRate(x)
 
     @property
-    def loop(self): 
-        """boolean. Looping mode.""" 
+    def loop(self):
+        """boolean. Looping mode."""
         return self._loop
     @loop.setter
     def loop(self, x): self.setLoop(x)
 
     @property
-    def interp(self): 
+    def interp(self):
         """int {1, 2, 3, 4}. Interpolation method."""
         return self._interp
     @interp.setter
@@ -910,7 +933,7 @@ class NoteinRec(PyoObject):
     Each line in the text files contains three values, the absolute time
     in seconds, the Midi pitch and the normalized velocity.
 
-    The play() method starts the recording and is not called at the 
+    The play() method starts the recording and is not called at the
     object creation time.
 
     :Parent: :py:class:`PyoObject`
@@ -921,27 +944,27 @@ class NoteinRec(PyoObject):
             Notein signal to sample.
         filename : string
             Full path (without extension) used to create the files.
-             
+
             "_000" will be added to file's names with increasing digits
-            according to the number of streams in input. 
-            
-            The same filename can be passed to a NoteinRead object to read 
+            according to the number of streams in input.
+
+            The same filename can be passed to a NoteinRead object to read
             all related files.
 
     .. note::
 
-        All parameters can only be set at intialization time.    
+        All parameters can only be set at intialization time.
 
-        The `write` method must be called on the object to write the files 
+        The `write` method must be called on the object to write the files
         on the disk.
 
-        The out() method is bypassed. NoteinRec's signal can not be sent to 
+        The out() method is bypassed. NoteinRec's signal can not be sent to
         audio outs.
 
         NoteinRec has no `mul` and `add` attributes.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`NoteinRead`
 
     >>> s = Server().boot()
@@ -984,32 +1007,32 @@ class NoteinRead(PyoObject):
     :Args:
 
         filename : string
-            Full path (without extension) used to create the files. 
-            
-            Usually the same filename as the one given to a NoteinRec 
-            object to record automation. 
-            
+            Full path (without extension) used to create the files.
+
+            Usually the same filename as the one given to a NoteinRec
+            object to record automation.
+
             The directory will be scaned and all files
             named "filename_xxx" will add a new stream in the object.
         loop : boolean, optional
-            Looping mode, False means off, True means on. 
+            Looping mode, False means off, True means on.
             Defaults to False.
 
     .. note::
 
-        NoteinRead will sends a trigger signal at the end of the playback if 
-        loop is off or any time it wraps around if loop is on. User can 
+        NoteinRead will sends a trigger signal at the end of the playback if
+        loop is off or any time it wraps around if loop is on. User can
         retreive the trigger streams by calling obj['trig']:
 
         >>> notes = NoteinRead(home+"/notes_rec", loop=True)
         >>> t = SndTable(SNDS_PATH+"/transparent.aif")
         >>> loop = TrigEnv(notes["trig"], t, dur=[.2,.3,.4,.5], mul=.25).out()
 
-        The out() method is bypassed. NoteinRead's signal can not be sent to 
+        The out() method is bypassed. NoteinRead's signal can not be sent to
         audio outs.
 
-    .. seealso:: 
-        
+    .. seealso::
+
         :py:class:`NoteinRec`
 
     >>> s = Server().boot()
@@ -1059,12 +1082,12 @@ class NoteinRead(PyoObject):
     def get(self, identifier="pitch", all=False):
         """
         Return the first sample of the current buffer as a float.
-        
+
         Can be used to convert audio stream to usable Python data.
-        
+
         "pitch" or "velocity" must be given to `identifier` to specify
         which stream to get value from.
-        
+
         :Args:
 
             identifier : string {"pitch", "velocity"}
@@ -1072,11 +1095,11 @@ class NoteinRead(PyoObject):
                 Defaults to "pitch".
             all : boolean, optional
                 If True, the first value of each object's stream
-                will be returned as a list. 
-                
-                If False, only the value of the first object's stream 
+                will be returned as a list.
+
+                If False, only the value of the first object's stream
                 will be returned as a float.
-                 
+
         """
         if not all:
             return self.__getitem__(identifier)[0]._getStream().getValue()
@@ -1101,8 +1124,8 @@ class NoteinRead(PyoObject):
         [obj.setLoop(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
     @property
-    def loop(self): 
-        """boolean. Looping mode.""" 
+    def loop(self):
+        """boolean. Looping mode."""
         return self._loop
     @loop.setter
     def loop(self, x): self.setLoop(x)
@@ -1155,7 +1178,7 @@ class DBToA(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -1209,7 +1232,7 @@ class AToDB(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -1218,9 +1241,9 @@ class Scale(PyoObject):
     """
     Maps an input range of audio values to an output range.
 
-    Scale maps an input range of audio values to an output range. 
-    The ranges can be specified with `min` and `max` reversed for 
-    invert-mapping. If specified, the mapping can also be exponential. 
+    Scale maps an input range of audio values to an output range.
+    The ranges can be specified with `min` and `max` reversed for
+    invert-mapping. If specified, the mapping can also be exponential.
 
     :Parent: :py:class:`PyoObject`
 
@@ -1237,7 +1260,7 @@ class Scale(PyoObject):
         outmax : float or PyoObject, optional
             Maximum output value. Defaults to 1.
         exp : float, optional
-            Exponent value, specifies the nature of the scaling curve. 
+            Exponent value, specifies the nature of the scaling curve.
             Values between 0 and 1 give a reversed curve.  Defaults to 1.0.
 
     >>> s = Server().boot()
@@ -1358,28 +1381,28 @@ class Scale(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def inmin(self):
-        """float or PyoObject. Minimum input value.""" 
+        """float or PyoObject. Minimum input value."""
         return self._inmin
     @inmin.setter
     def inmin(self, x): self.setInMin(x)
 
     @property
     def inmax(self):
-        """float or PyoObject. Maximum input value.""" 
+        """float or PyoObject. Maximum input value."""
         return self._inmax
     @inmax.setter
     def inmax(self, x): self.setInMax(x)
 
     @property
     def outmin(self):
-        """float or PyoObject. Minimum output value.""" 
+        """float or PyoObject. Minimum output value."""
         return self._outmin
     @outmin.setter
     def outmin(self, x): self.setOutMin(x)
@@ -1444,7 +1467,7 @@ class CentsToTranspo(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -1496,7 +1519,7 @@ class TranspoToCents(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -1505,7 +1528,7 @@ class MToF(PyoObject):
     """
     Returns the frequency (Hz) equivalent to a midi note.
 
-    Returns the frequency (Hz) equivalent to a midi note, 
+    Returns the frequency (Hz) equivalent to a midi note,
     60 = 261.62556530066814 Hz.
 
     :Parent: :py:class:`PyoObject`
@@ -1548,7 +1571,7 @@ class MToF(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -1557,7 +1580,7 @@ class FToM(PyoObject):
     """
     Returns the midi note equivalent to a frequency in Hz.
 
-    Returns the midi note equivalent to a frequency in Hz, 
+    Returns the midi note equivalent to a frequency in Hz,
     440.0 (hz) = 69.
 
     :Parent: :py:class:`PyoObject`
@@ -1603,7 +1626,7 @@ class FToM(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
@@ -1622,7 +1645,7 @@ class MToT(PyoObject):
         input : PyoObject
             Input signal as midi note.
         centralkey : float, optional
-            The midi note that returns a transposition factor of 1, 
+            The midi note that returns a transposition factor of 1,
             that is to say no transposition. Defaults to 60.
 
     >>> s = Server().boot()
@@ -1676,13 +1699,13 @@ class MToT(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
     @property
     def centralkey(self):
-        """float. The midi note that returns no transposition.""" 
+        """float. The midi note that returns no transposition."""
         return self._centralkey
     @centralkey.setter
     def centralkey(self, x): self.setCentralKey(x)
@@ -1773,31 +1796,31 @@ class Between(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal to process.""" 
+        """PyoObject. Input signal to process."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def min(self):
-        """float or PyoObject. Minimum range value.""" 
+        """float or PyoObject. Minimum range value."""
         return self._min
     @min.setter
     def min(self, x): self.setMin(x)
 
     @property
     def max(self):
-        """float or PyoObject. Maximum range value.""" 
+        """float or PyoObject. Maximum range value."""
         return self._max
     @max.setter
     def max(self, x): self.setMax(x)
 
 class TrackHold(PyoObject):
     """
-    Performs a track-and-hold operation on its input. 
+    Performs a track-and-hold operation on its input.
 
     TrackHold lets pass the signal in `input` without modification but hold
-    a sample according to the value of `controlsig`. If `controlsig` equals 
+    a sample according to the value of `controlsig`. If `controlsig` equals
     `value`, the input is sampled and held, otherwise, it passes thru.
 
     :Parent: :py:class:`PyoObject`
@@ -1832,7 +1855,7 @@ class TrackHold(PyoObject):
     def setInput(self, x, fadetime=0.05):
         """
         Replace the `input` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1847,7 +1870,7 @@ class TrackHold(PyoObject):
     def setControlsig(self, x, fadetime=0.05):
         """
         Replace the `controlsig` attribute.
-        
+
         :Args:
 
             x : PyoObject
@@ -1858,11 +1881,11 @@ class TrackHold(PyoObject):
         """
         self._controlsig = x
         self._in_fader2.setInput(x, fadetime)
-        
+
     def setValue(self, x):
         """
         Replace the `value` attribute.
-        
+
         :Args:
 
             x : float or PyoObject
@@ -1875,21 +1898,21 @@ class TrackHold(PyoObject):
 
     @property
     def input(self):
-        """PyoObject. Input signal.""" 
+        """PyoObject. Input signal."""
         return self._input
     @input.setter
     def input(self, x): self.setInput(x)
 
     @property
     def controlsig(self):
-        """PyoObject. Control signal.""" 
+        """PyoObject. Control signal."""
         return self._controlsig
     @controlsig.setter
     def controlsig(self, x): self.setControlsig(x)
 
     @property
     def value(self):
-        """float or PyoObject. Target value.""" 
+        """float or PyoObject. Target value."""
         return self._value
     @value.setter
-    def value(self, x): self.setValue(x)
+    def value(self, x): self.setValue(x)
\ No newline at end of file
diff --git a/scripts/html_man.py b/scripts/html_man.py
index a127f07..ba0c575 100644
--- a/scripts/html_man.py
+++ b/scripts/html_man.py
@@ -1,22 +1,21 @@
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+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, inspect, shutil
 from types import ListType
diff --git a/scripts/release_doc_src.sh b/scripts/release_doc_src.sh
index 78c8449..128bf69 100644
--- 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.7.4
+version=0.7.5
 replace=XXX
 
 doc_rep=pyo_XXX-doc
diff --git a/setup.py b/setup.py
index d67d090..2e5c607 100644
--- a/setup.py
+++ b/setup.py
@@ -1,29 +1,29 @@
 # -*- coding: utf-8 -*-
 """
-Copyright 2010 Olivier Belanger
+Copyright 2009-2015 Olivier Belanger
 
 This file is part of pyo, a python module to help digital signal
 processing script creation.
 
 pyo is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
 
 pyo is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with pyo.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU Lesser General Public
+License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
 
 from distutils.core import setup, Extension
 import os, sys, getopt
 import time
 
-pyo_version = "0.7.4"
+pyo_version = "0.7.5"
 build_osx_with_jack_support = False
 compile_externals = False
 
@@ -62,6 +62,9 @@ if '--compile-externals' in sys.argv:
     sys.argv.remove('--compile-externals') 
     macros.append(('COMPILE_EXTERNALS',None))
 
+if sys.platform == "darwin":
+    macros.append(('_OSX_', None))
+
 path = 'src/engine/'
 files = ['pyomodule.c', 'servermodule.c', 'pvstreammodule.c', 'streammodule.c', 'dummymodule.c', 
         'mixmodule.c', 'inputfadermodule.c', 'interpolation.c', 'fft.c', "wind.c"]
@@ -104,7 +107,7 @@ else:
 extensions = []
 for extension_name, extra_macros in zip(extension_names, extra_macros_per_extension):
     extensions.append(Extension(extension_name, source_files, include_dirs=include_dirs, library_dirs=library_dirs,
-                                libraries=libraries, extra_compile_args=['-Wno-strict-prototypes', '-O3'],
+                                libraries=libraries, extra_compile_args=['-Wno-strict-prototypes', '-O3', '-Wno-strict-aliasing'],
                                 define_macros=macros + extra_macros))
 
 if compile_externals:
diff --git a/src/engine/dummymodule.c b/src/engine/dummymodule.c
index f2bcdc5..1aeaa31 100644
--- a/src/engine/dummymodule.c
+++ b/src/engine/dummymodule.c
@@ -1,22 +1,22 @@
-/*************************************************************************
-* Copyright 2010 Olivier Belanger                                        *                  
-*                                                                        * 
-* This file is part of pyo, a python module to help digital signal       *
-* processing script creation.                                            *  
-*                                                                        * 
-* pyo is free software: you can redistribute it and/or modify            *
-* it under the terms of the GNU General Public License as published by   *
-* the Free Software Foundation, either version 3 of the License, or      *
-* (at your option) any later version.                                    * 
-*                                                                        *
-* pyo is distributed in the hope that it will be useful,                 *
-* but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
-* GNU General Public License for more details.                           *
-*                                                                        *
-* You should have received a copy of the GNU General Public License      *
-* along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
-*************************************************************************/
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
+ * This file is part of pyo, a python module to help digital signal       *
+ * processing script creation.                                            *
+ *                                                                        *
+ * pyo is free software: you can redistribute it and/or modify            *
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
+ *                                                                        *
+ * pyo is distributed in the hope that it will be useful,                 *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ * GNU 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/>.   *
+ *************************************************************************/
 
 #include <Python.h>
 #include "structmember.h"
@@ -43,31 +43,31 @@ Dummy_setProcMode(Dummy *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Dummy_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Dummy_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Dummy_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Dummy_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Dummy_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Dummy_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Dummy_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Dummy_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Dummy_postprocessing_revareva;
             break;
     }
@@ -80,7 +80,7 @@ Dummy_compute_next_data_frame(Dummy *self)
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = in[i];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -93,7 +93,7 @@ Dummy_traverse(Dummy *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Dummy_clear(Dummy *self)
 {
     pyo_CLEAR
@@ -110,21 +110,21 @@ Dummy_dealloc(Dummy* self)
     self->ob_type->tp_free((PyObject*)self);
 }
 
-PyObject * 
+PyObject *
 Dummy_initialize(Dummy *self)
 {
     int i;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Dummy_compute_next_data_frame);
     self->mode_func_ptr = Dummy_setProcMode;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     Stream_setStreamActive(self->stream, 1);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -146,17 +146,17 @@ Dummy_setInput(Dummy *self, PyObject *arg)
     (*self->mode_func_ptr)(self);
 
     Dummy_compute_next_data_frame(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject * Dummy_getServer(Dummy* self) { GET_SERVER };
 static PyObject * Dummy_getStream(Dummy* self) { GET_STREAM };
-static PyObject * Dummy_setMul(Dummy *self, PyObject *arg) { SET_MUL };	
-static PyObject * Dummy_setAdd(Dummy *self, PyObject *arg) { SET_ADD };	
-static PyObject * Dummy_setSub(Dummy *self, PyObject *arg) { SET_SUB };	
-static PyObject * Dummy_setDiv(Dummy *self, PyObject *arg) { SET_DIV };	
+static PyObject * Dummy_setMul(Dummy *self, PyObject *arg) { SET_MUL };
+static PyObject * Dummy_setAdd(Dummy *self, PyObject *arg) { SET_ADD };
+static PyObject * Dummy_setSub(Dummy *self, PyObject *arg) { SET_SUB };
+static PyObject * Dummy_setDiv(Dummy *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Dummy_play(Dummy *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Dummy_out(Dummy *self, PyObject *args, PyObject *kwds) { OUT };
@@ -302,36 +302,36 @@ static void
 TriggerDummy_setProcMode(TriggerDummy *self) {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TriggerDummy_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TriggerDummy_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TriggerDummy_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TriggerDummy_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TriggerDummy_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TriggerDummy_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TriggerDummy_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TriggerDummy_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TriggerDummy_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
@@ -341,7 +341,7 @@ TriggerDummy_compute_next_data_frame(TriggerDummy *self)
     MYFLT *tmp = TriggerStream_getData((TriggerStream *)self->input_stream);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -354,11 +354,11 @@ TriggerDummy_traverse(TriggerDummy *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 TriggerDummy_clear(TriggerDummy *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->input);    
+    Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
     return 0;
 }
@@ -378,34 +378,34 @@ TriggerDummy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp;
     TriggerDummy *self;
     self = (TriggerDummy *)type->tp_alloc(type, 0);
-    
+
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TriggerDummy_compute_next_data_frame);
     self->mode_func_ptr = TriggerDummy_setProcMode;
 
     static char *kwlist[] = {"input", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O", kwlist, &inputtmp))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     INIT_INPUT_TRIGGER_STREAM
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * TriggerDummy_getServer(TriggerDummy* self) { GET_SERVER };
 static PyObject * TriggerDummy_getStream(TriggerDummy* self) { GET_STREAM };
-static PyObject * TriggerDummy_setMul(TriggerDummy *self, PyObject *arg) { SET_MUL };	
-static PyObject * TriggerDummy_setAdd(TriggerDummy *self, PyObject *arg) { SET_ADD };	
-static PyObject * TriggerDummy_setSub(TriggerDummy *self, PyObject *arg) { SET_SUB };	
-static PyObject * TriggerDummy_setDiv(TriggerDummy *self, PyObject *arg) { SET_DIV };	
+static PyObject * TriggerDummy_setMul(TriggerDummy *self, PyObject *arg) { SET_MUL };
+static PyObject * TriggerDummy_setAdd(TriggerDummy *self, PyObject *arg) { SET_ADD };
+static PyObject * TriggerDummy_setSub(TriggerDummy *self, PyObject *arg) { SET_SUB };
+static PyObject * TriggerDummy_setDiv(TriggerDummy *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TriggerDummy_play(TriggerDummy *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TriggerDummy_stop(TriggerDummy *self) { STOP };
@@ -435,7 +435,7 @@ static PyMethodDef TriggerDummy_methods[] = {
     {"setMul", (PyCFunction)TriggerDummy_setMul, METH_O, "Sets oscillator mul factor."},
     {"setAdd", (PyCFunction)TriggerDummy_setAdd, METH_O, "Sets oscillator add factor."},
     {"setSub", (PyCFunction)TriggerDummy_setSub, METH_O, "Sets inverse add factor."},
-    {"setDiv", (PyCFunction)TriggerDummy_setDiv, METH_O, "Sets inverse mul factor."},        
+    {"setDiv", (PyCFunction)TriggerDummy_setDiv, METH_O, "Sets inverse mul factor."},
     {NULL}  /* Sentinel */
 };
 static PyNumberMethods TriggerDummy_as_number = {
@@ -520,4 +520,4 @@ PyTypeObject TriggerDummyType = {
     0,      /* tp_init */
     0,                         /* tp_alloc */
     TriggerDummy_new,                 /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/engine/fft.c b/src/engine/fft.c
index dcaaff3..ebd8530 100644
--- a/src/engine/fft.c
+++ b/src/engine/fft.c
@@ -1,14 +1,33 @@
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
+ * This file is part of pyo, a python module to help digital signal       *
+ * processing script creation.                                            *
+ *                                                                        *
+ * pyo is free software: you can redistribute it and/or modify            *
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
+ *                                                                        *
+ * pyo is distributed in the hope that it will be useful,                 *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ * GNU 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/>.   *
+ *************************************************************************/
 /******************************************************
 **	                 FFT library
 **
-**  (one-dimensional complex and real FFTs for array 
+**  (one-dimensional complex and real FFTs for array
 **  lengths of 2^n)
 **
 **	Author: Toth Laszlo (tothl at inf.u-szeged.hu)
-**  
+**
 **	Research Group on Artificial Intelligence
 **  H-6720 Szeged, Aradi vertanuk tere 1, Hungary
-**	
+**
 **	Last modified: 97.05.29
 **
 **  Modified by belangeo 2011.05.25
@@ -55,12 +74,12 @@ void fft_compute_radix2_twiddle(MYFLT *twiddle, int size) {
 ** Sorensen in-place split-radix FFT for real values
 ** data: array of doubles:
 ** re(0),re(1),re(2),...,re(size-1)
-** 
+**
 ** output:
 ** re(0),re(1),re(2),...,re(size/2),im(size/2-1),...,im(1)
 ** normalized by array length
 **
-** Source: 
+** Source:
 ** Sorensen et al: Real-Valued Fast Fourier Transform Algorithms,
 ** IEEE Trans. ASSP, ASSP-35, No. 6, June 1987
 **************************************************************** */
@@ -83,16 +102,16 @@ void realfft_split(MYFLT *data, MYFLT *outdata, int n, MYFLT **twiddle) {
 	    k = n2;
 	    while (k<=j){
 			j -= k;
-			k >>= 1;	
+			k >>= 1;
 		}
 	    j += k;
     }
-	
+
 	/* length two butterflies */
 	i0 = 0;
 	id = 4;
     do {
-        for (; i0<n4; i0+=id){ 
+        for (; i0<n4; i0+=id){
 		    i1 = i0 + 1;
 			t1 = data[i0];
 			data[i0] = t1 + data[i1];
@@ -105,14 +124,14 @@ void realfft_split(MYFLT *data, MYFLT *outdata, int n, MYFLT **twiddle) {
 
     /* L shaped butterflies */
     n2 = 2;
-    for(k=n; k>2; k>>=1) {  
+    for(k=n; k>2; k>>=1) {
 	    n2 <<= 1; /* power of two from 4 to n */
 	    n4 = n2 >> 2;
 	    n8 = n2 >> 3;
 	    pas = n / n2;
 	    i1 = 0;
 	    id = n2 << 1;
-	    do { 
+	    do {
 	        for (; i1<n; i1+=id){
 			    i2 = i1 + n4;
 			    i3 = i2 + n4;
@@ -138,16 +157,16 @@ void realfft_split(MYFLT *data, MYFLT *outdata, int n, MYFLT **twiddle) {
 	        i1 = id - n2;
 	        id <<= 1;
 	    } while ( i1<n );
-	    for (j=2; j<=n8; j++){ 
+	    for (j=2; j<=n8; j++){
 	        pos = (j-1) * pas;
 	        cc1 = twiddle[0][pos];
 	        ss1 = twiddle[1][pos];
 	        cc3 = twiddle[2][pos];
-	        ss3 = twiddle[3][pos]; 
+	        ss3 = twiddle[3][pos];
 	        i = 0;
 	        id = n2 << 1;
 	        do {
-		        for (; i<n; i+=id){  
+		        for (; i<n; i+=id){
 			        i1 = i + j - 1;
 			        i2 = i1 + n4;
 			        i3 = i2 + n4;
@@ -185,7 +204,7 @@ void realfft_split(MYFLT *data, MYFLT *outdata, int n, MYFLT **twiddle) {
     }
 
 	/* division with array length */
-    for(i=0; i<n; i++) 
+    for(i=0; i<n; i++)
         outdata[i] = data[i] / n;
 }
 
@@ -193,12 +212,12 @@ void realfft_split(MYFLT *data, MYFLT *outdata, int n, MYFLT **twiddle) {
 ** Sorensen in-place inverse split-radix FFT for real values
 ** data: array of doubles:
 ** re(0),re(1),re(2),...,re(size/2),im(size/2-1),...,im(1)
-** 
+**
 ** output:
 ** re(0),re(1),re(2),...,re(size-1)
 ** NOT normalized by array length
 **
-** Source: 
+** Source:
 ** Sorensen et al: Real-Valued Fast Fourier Transform Algorithms,
 ** IEEE Trans. ASSP, ASSP-35, No. 6, June 1987
 ****************************************************************** */
@@ -208,19 +227,19 @@ void irealfft_split(MYFLT *data, MYFLT *outdata, int n, MYFLT **twiddle) {
     int i,j,k,i5,i6,i7,i8,i0,id,i1,i2,i3,i4,n2,n4,n8,n1;
     int pas, pos;
     MYFLT t1,t2,t3,t4,t5,ss1,ss3,cc1,cc3,sqrt2;
-  
+
     sqrt2 = 1.4142135623730951; /* sqrt(2.0) */
-  
+
     n1 = n - 1;
     n2 = n << 1;
-    for(k=n; k>2; k>>=1) {  
+    for(k=n; k>2; k>>=1) {
 	    id = n2;
 	    n2 >>= 1;
 	    n4 = n2 >> 2;
 	    n8 = n2 >> 3;
 	    pas = n / n2;
 	    i1 = 0;
-	    do { 
+	    do {
 	        for (; i1<n; i1+=id) {
 			    i2 = i1 + n4;
 			    i3 = i2 + n4;
@@ -247,7 +266,7 @@ void irealfft_split(MYFLT *data, MYFLT *outdata, int n, MYFLT **twiddle) {
 	        i1 = id - n2;
 	        id <<= 1;
 	    } while ( i1<n1 );
-	    for (j=2; j<=n8; j++) {  
+	    for (j=2; j<=n8; j++) {
 	        pos = (j-1) * pas;
 	        cc1 = twiddle[0][pos];
 	        ss1 = twiddle[1][pos];
@@ -256,7 +275,7 @@ void irealfft_split(MYFLT *data, MYFLT *outdata, int n, MYFLT **twiddle) {
 	        i = 0;
 	        id = n2 << 1;
 	        do {
-		        for (; i<n; i+=id) {  
+		        for (; i<n; i+=id) {
 			        i1 = i + j - 1;
 			        i2 = i1 + n4;
 			        i3 = i2 + n4;
@@ -287,13 +306,13 @@ void irealfft_split(MYFLT *data, MYFLT *outdata, int n, MYFLT **twiddle) {
 		        id <<= 1;
 		    } while(i<n1);
 	    }
-    }	
+    }
 
     /*----------------------*/
 	i0 = 0;
 	id = 4;
     do {
-        for (; i0<n1; i0+=id) { 
+        for (; i0<n1; i0+=id) {
 		    i1 = i0 + 1;
 			t1 = data[i0];
 			data[i0] = t1 + data[i1];
@@ -314,12 +333,12 @@ void irealfft_split(MYFLT *data, MYFLT *outdata, int n, MYFLT **twiddle) {
 	    k = n2;
 	    while (k<=j) {
 			j -= k;
-			k >>= 1;	
+			k >>= 1;
 		}
 	    j += k;
     }
     for (i=0; i<n; i++)
-        outdata[i] = data[i];	
+        outdata[i] = data[i];
 }
 
 /* *****************************************************
@@ -327,7 +346,7 @@ void irealfft_split(MYFLT *data, MYFLT *outdata, int n, MYFLT **twiddle) {
 ** data: array of doubles:
 ** re(0),im(0),re(1),im(1),...,re(size-1),im(size-1)
 ** it means that size=array_length/2 !!
-** 
+**
 ** suggested use:
 ** intput in normal order
 ** output in bit-reversed order
@@ -360,7 +379,7 @@ void dif_butterfly(MYFLT *data, int size, MYFLT *twiddle){
                 *(l1) = xr; *(l1+1) = xi;
                 *(l2) = yr; *(l2+1) = yi;
                 angle += astep;
-		    } 
+		    }
         }
     }
 }
@@ -415,7 +434,7 @@ void inverse_dit_butterfly(MYFLT *data, int size, MYFLT *twiddle){
 ** it means that size=array_length/2 !!
 **
 ** Source: Rabiner-Gold: Theory and Application of DSP,
-** Prentice Hall,1978 
+** Prentice Hall,1978
 ******************************************************* */
 void unshuffle(MYFLT *data, int size){
 
@@ -433,14 +452,14 @@ void unshuffle(MYFLT *data, int size){
         k = m;
         while (k <= j) {
             j -= k;
-            k >>= 1;	
+            k >>= 1;
         }
         j += k;
     }
 }
 
 /* *****************************************************
-** used by realfft 
+** used by realfft
 ** parameters as above
 **
 ** Source: Brigham: The Fast Fourier Transform
@@ -456,7 +475,7 @@ void realize(MYFLT *data, int size) {
     xr = *l1;
     xi = *(l1+1);
     *l1 = xr + xi;
-    *(l1+1) = xr - xi; 
+    *(l1+1) = xr - xi;
 	l1 += 2;
 	astep = PI / size;
     for(ang=astep; l1<=l2; l1+=2, l2-=2, ang+=astep) {
@@ -469,14 +488,14 @@ void realize(MYFLT *data, int size) {
         dr = yr * wr - yi * wi;
         di = yr * wi + yi * wr;
         *l1 = xr + dr;
-        *(l1+1) = xi + di;      
+        *(l1+1) = xi + di;
         *l2 = xr - dr;
         *(l2+1) = -xi + di;
 	}
 }
 
 /* *****************************************************
-** used by inverse realfft 
+** used by inverse realfft
 ** parameters as above
 **
 ** Source: Brigham: The Fast Fourier Transform
@@ -492,7 +511,7 @@ void unrealize(MYFLT *data, int size) {
     xr = (*l1) / 2;
     xi = (*(l1+1)) / 2;
     *l1 = xr + xi;
-    *(l1+1) = xr - xi; 
+    *(l1+1) = xr - xi;
 	l1 += 2;
 	astep = PI / size;
     for(ang=astep; l1<=l2; l1+=2, l2-=2, ang+=astep){
@@ -505,7 +524,7 @@ void unrealize(MYFLT *data, int size) {
         dr = yr * wr - yi * wi;
         di = yr * wi + yi * wr;
         *l2 = xr + dr;
-        *(l1+1) = xi + di;      
+        *(l1+1) = xi + di;
         *l1 = xr - dr;
         *(l2+1) = -xi + di;
 	}
@@ -516,7 +535,7 @@ void unrealize(MYFLT *data, int size) {
 ** (by the so-called "packing method")
 ** data: array of doubles:
 ** re(0),re(1),re(2),...,re(size-1)
-** 
+**
 ** output:
 ** re(0),re(size/2),re(1),im(1),re(2),im(2),...,re(size/2-1),im(size/2-1)
 ** normalized by array length
@@ -541,8 +560,8 @@ void realfft_packed(MYFLT *data, MYFLT *outdata, int size, MYFLT *twiddle) {
 ** in-place Radix-2 inverse FFT for real values
 ** (by the so-called "packing method")
 ** data: array of doubles:
-** re(0),re(size/2),re(1),im(1),re(2),im(2),...,re(size/2-1),im(size/2-1) 
-** 
+** re(0),re(size/2),re(1),im(1),re(2),im(2),...,re(size/2-1),im(size/2-1)
+**
 ** output:
 ** re(0),re(1),re(2),...,re(size-1)
 ** NOT normalized by array length
@@ -562,4 +581,3 @@ void irealfft_packed(MYFLT *data, MYFLT *outdata, int size, MYFLT *twiddle) {
 	for (i=0; i<size; i++)
 	    outdata[i] = data[i] * 2;
 }
-
diff --git a/src/engine/inputfadermodule.c b/src/engine/inputfadermodule.c
index a8b26f1..7a59fab 100644
--- a/src/engine/inputfadermodule.c
+++ b/src/engine/inputfadermodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -40,40 +40,40 @@ typedef struct {
 
 static void InputFader_setProcMode(InputFader *self) {};
 
-static void InputFader_process_only_first(InputFader *self) 
+static void InputFader_process_only_first(InputFader *self)
 {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input1_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = in[i];
     }
 }
 
-static void InputFader_process_only_second(InputFader *self) 
+static void InputFader_process_only_second(InputFader *self)
 {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input2_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = in[i];
     }
 }
 
-static void InputFader_process_one(InputFader *self) 
+static void InputFader_process_one(InputFader *self)
 {
     int i;
     MYFLT sclfade, val;
     MYFLT *in1 = Stream_getData((Stream *)self->input1_stream);
     MYFLT *in2 = Stream_getData((Stream *)self->input2_stream);
-    
+
     val = 0.0;
     sclfade = 1. / self->fadetime;
     for (i=0; i<self->bufsize; i++) {
         if (self->currentTime < self->fadetime) {
             val = MYSQRT(self->currentTime * sclfade);
             self->currentTime += self->sampleToSec;
-        }    
+        }
         else
             val = 1.;
 
@@ -84,7 +84,7 @@ static void InputFader_process_one(InputFader *self)
 
 }
 
-static void InputFader_process_two(InputFader *self) 
+static void InputFader_process_two(InputFader *self)
 {
     int i;
     MYFLT sclfade, val;
@@ -97,10 +97,10 @@ static void InputFader_process_two(InputFader *self)
         if (self->currentTime < self->fadetime) {
             val = MYSQRT(self->currentTime * sclfade);
             self->currentTime += self->sampleToSec;
-        }    
+        }
         else
             val = 1.;
-        
+
         self->data[i] = in2[i] * val + in1[i] * (1 - val);
     }
     if (val == 1.)
@@ -109,7 +109,7 @@ static void InputFader_process_two(InputFader *self)
 
 static void
 InputFader_compute_next_data_frame(InputFader *self)
-{   
+{
     (*self->proc_func_ptr)(self);
 }
 
@@ -124,7 +124,7 @@ InputFader_traverse(InputFader *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 InputFader_clear(InputFader *self)
 {
     pyo_CLEAR
@@ -150,15 +150,15 @@ InputFader_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp=NULL, *streamtmp;
     InputFader *self;
     self = (InputFader *)type->tp_alloc(type, 0);
-    
+
     self->switcher = 0;
     self->fadetime = 0.05;
     self->currentTime = 0.0;
-    
+
     INIT_OBJECT_COMMON
 
     self->sampleToSec = 1. / self->sr;
-    
+
     Stream_setFunctionPtr(self->stream, InputFader_compute_next_data_frame);
     self->mode_func_ptr = InputFader_setProcMode;
     self->proc_func_ptr = InputFader_process_only_first;
@@ -166,7 +166,7 @@ InputFader_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     static char *kwlist[] = {"input", NULL};
 
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O", kwlist, &inputtmp))
-        Py_RETURN_NONE; 
+        Py_RETURN_NONE;
 
     if ( PyObject_HasAttrString((PyObject *)inputtmp, "server") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"input\" argument must be a PyoObject.\n");
@@ -179,9 +179,9 @@ InputFader_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     Py_INCREF(streamtmp);
     Py_XDECREF(self->input1_stream);
     self->input1_stream = (Stream *)streamtmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     return (PyObject *)self;
 }
 
@@ -193,13 +193,13 @@ InputFader_setInput(InputFader *self, PyObject *args, PyObject *kwds)
     static char *kwlist[] = {"input", "fadetime", NULL};
 
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_F, kwlist, &tmp, &self->fadetime))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     self->switcher = (self->switcher + 1) % 2;
     self->currentTime = 0.0;
     if (self->fadetime == 0)
         self->fadetime = 0.0001;
-    
+
     Py_INCREF(tmp);
 
     if (self->switcher == 0) {
@@ -219,11 +219,11 @@ InputFader_setInput(InputFader *self, PyObject *args, PyObject *kwds)
         Py_XDECREF(self->input2_stream);
         self->input2_stream = (Stream *)streamtmp;
         self->proc_func_ptr = InputFader_process_two;
-	}    
-    
+	}
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject * InputFader_getServer(InputFader* self) { GET_SERVER };
 static PyObject * InputFader_getStream(InputFader* self) { GET_STREAM };
@@ -291,4 +291,3 @@ PyTypeObject InputFaderType = {
     0,                         /* tp_alloc */
     InputFader_new,                 /* tp_new */
 };
-
diff --git a/src/engine/interpolation.c b/src/engine/interpolation.c
index 00ee8c2..ac986a0 100644
--- a/src/engine/interpolation.c
+++ b/src/engine/interpolation.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include "interpolation.h"
@@ -36,7 +36,7 @@ MYFLT cosine(MYFLT *buf, int index, MYFLT frac, int size) {
     MYFLT frac2;
     MYFLT x1 = buf[index];
     MYFLT x2 = buf[index+1];
-    
+
     frac2 = (1.0 - MYCOS(frac * M_PI)) * 0.5;
     return (x1 + (x2 - x1) * frac2);
 }
@@ -45,7 +45,7 @@ MYFLT cubic(MYFLT *buf, int index, MYFLT frac, int size) {
     MYFLT x0, x3, a0, a1, a2, a3;
     MYFLT x1 = buf[index];
     MYFLT x2 = buf[index+1];
-    
+
     if (index == 0) {
         x0 = x1 + (x1 - x2);
         x3 = buf[index + 2];
@@ -53,16 +53,16 @@ MYFLT cubic(MYFLT *buf, int index, MYFLT frac, int size) {
     else if (index >= (size-2)) {
         x0 = buf[index - 1];
         x3 = x2 + (x2 - x1);
-    }    
+    }
     else {
         x0 = buf[index - 1];
         x3 = buf[index + 2];
     }
-    
+
     a3 = frac * frac; a3 -= 1.0; a3 *= (1.0 / 6.0);
     a2 = (frac + 1.0) * 0.5; a0 = a2 - 1.0;
     a1 = a3 * 3.0; a2 -= a1; a0 -= a3; a1 -= frac;
     a0 *= frac; a1 *= frac; a2 *= frac; a3 *= frac; a1 += 1.0;
 
     return (a0*x0+a1*x1+a2*x2+a3*x3);
-}
+}
\ No newline at end of file
diff --git a/src/engine/mixmodule.c b/src/engine/mixmodule.c
index 5f40ea0..6353431 100644
--- a/src/engine/mixmodule.c
+++ b/src/engine/mixmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -49,39 +49,39 @@ Mix_setProcMode(Mix *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Mix_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Mix_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Mix_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Mix_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Mix_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Mix_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Mix_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Mix_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Mix_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Mix_compute_next_data_frame(Mix *self)
-{   
+{
     int i, j;
     MYFLT old;
     PyObject *stream;
@@ -96,13 +96,13 @@ Mix_compute_next_data_frame(Mix *self)
         for (j=0; j<self->bufsize; j++) {
             old = buffer[j];
             buffer[j] = in[j] + old;
-        }    
-    }    
-    
+        }
+    }
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = buffer[i];
     }
-    
+
     (*self->muladd_func_ptr)(self);
 }
 
@@ -114,7 +114,7 @@ Mix_traverse(Mix *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Mix_clear(Mix *self)
 {
     pyo_CLEAR
@@ -148,12 +148,12 @@ Mix_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     static char *kwlist[] = {"input", "mul", "add", NULL};
 
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
-        Py_RETURN_NONE; 
+        Py_RETURN_NONE;
 
     Py_INCREF(inputtmp);
     Py_XDECREF(self->input);
     self->input = inputtmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
@@ -161,19 +161,19 @@ Mix_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-            
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Mix_getServer(Mix* self) { GET_SERVER };
 static PyObject * Mix_getStream(Mix* self) { GET_STREAM };
-static PyObject * Mix_setMul(Mix *self, PyObject *arg) { SET_MUL };	
-static PyObject * Mix_setAdd(Mix *self, PyObject *arg) { SET_ADD };	
-static PyObject * Mix_setSub(Mix *self, PyObject *arg) { SET_SUB };	
+static PyObject * Mix_setMul(Mix *self, PyObject *arg) { SET_MUL };
+static PyObject * Mix_setAdd(Mix *self, PyObject *arg) { SET_ADD };
+static PyObject * Mix_setSub(Mix *self, PyObject *arg) { SET_SUB };
 static PyObject * Mix_setDiv(Mix *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Mix_play(Mix *self, PyObject *args, PyObject *kwds) { PLAY };
@@ -294,4 +294,3 @@ PyTypeObject MixType = {
     0,                         /* tp_alloc */
     Mix_new,                 /* tp_new */
 };
-
diff --git a/src/engine/pvstreammodule.c b/src/engine/pvstreammodule.c
index 6b183dc..12cded6 100644
--- a/src/engine/pvstreammodule.c
+++ b/src/engine/pvstreammodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -53,7 +53,7 @@ MYFLT **
 PVStream_getMagn(PVStream *self)
 {
     return (MYFLT **)self->magn;
-}    
+}
 
 MYFLT **
 PVStream_getFreq(PVStream *self)
@@ -71,19 +71,19 @@ void
 PVStream_setFFTsize(PVStream *self, int fftsize)
 {
     self->fftsize = fftsize;
-}    
+}
 
 void
 PVStream_setOlaps(PVStream *self, int olaps)
 {
     self->olaps = olaps;
-}    
+}
 
 void
 PVStream_setMagn(PVStream *self, MYFLT **data)
 {
     self->magn = data;
-}    
+}
 
 void
 PVStream_setFreq(PVStream *self, MYFLT **data)
@@ -139,4 +139,4 @@ PyTypeObject PVStreamType = {
     0, /* tp_init */
     0, /* tp_alloc */
     0, /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/engine/pyomodule.c b/src/engine/pyomodule.c
index 24c05c5..a7a2f89 100644
--- a/src/engine/pyomodule.c
+++ b/src/engine/pyomodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -30,7 +30,7 @@
 #include "tablemodule.h"
 #include "matrixmodule.h"
 
-/** Note : 
+/** Note :
  ** Add an argument to pa_get_* and pm_get_* functions to allow printing to the console
  **/
 
@@ -77,7 +77,7 @@ portaudio_get_version_text() {
 static PyObject *
 portaudio_count_host_apis(){
     PaError err;
-    PaHostApiIndex numApis; 
+    PaHostApiIndex numApis;
 
     err = Pa_Initialize();
     if (err != paNoError) {
@@ -101,7 +101,7 @@ static PyObject*
 portaudio_list_host_apis(){
     PaError err;
     PaHostApiIndex n, i;
-	
+
     err = Pa_Initialize();
     if (err != paNoError) {
         portaudio_assert(err, "Pa_Initialize");
@@ -117,7 +117,7 @@ portaudio_list_host_apis(){
                 assert(info);
                 fprintf(stdout, "index: %i, id: %i, name: %s, num devices: %i, default in: %i, default out: %i\n", i, (int)info->type, info->name, (int)info->deviceCount, (int)info->defaultInputDevice, (int)info->defaultOutputDevice);
             }
-        }        
+        }
     }
     Py_RETURN_NONE;
 }
@@ -132,7 +132,7 @@ static PyObject*
 portaudio_get_default_host_api(){
     PaError err;
     PaHostApiIndex i;
-	
+
     err = Pa_Initialize();
     if (err != paNoError) {
         portaudio_assert(err, "Pa_Initialize");
@@ -154,7 +154,7 @@ static PyObject*
 portaudio_count_devices(){
     PaError err;
     PaDeviceIndex numDevices;
-	
+
 	err = Pa_Initialize();
     if (err != paNoError) {
         portaudio_assert(err, "Pa_Initialize");
@@ -164,7 +164,7 @@ portaudio_count_devices(){
         numDevices = Pa_GetDeviceCount();
         if( numDevices < 0 )
             portaudio_assert(numDevices, "Pa_GetDeviceCount");
-        return PyInt_FromLong(numDevices);        
+        return PyInt_FromLong(numDevices);
     }
 
 }
@@ -187,7 +187,7 @@ static PyObject*
 portaudio_list_devices(){
     PaError err;
     PaDeviceIndex n, i;
-	
+
 	err = Pa_Initialize();
     if (err != paNoError) {
         portaudio_assert(err, "Pa_Initialize");
@@ -203,15 +203,15 @@ portaudio_list_devices(){
             for (i=0; i < n; ++i){
                 const PaDeviceInfo *info = Pa_GetDeviceInfo(i);
                 assert(info);
-                
+
                 if (info->maxInputChannels > 0)
                     fprintf(stdout, "%i: IN, name: %s, host api index: %i, default sr: %i Hz, latency: %f s\n", i, info->name, (int)info->hostApi, (int)info->defaultSampleRate, (float)info->defaultLowInputLatency);
-                
+
                 if (info->maxOutputChannels > 0)
                     fprintf(stdout, "%i: OUT, name: %s, host api index: %i, default sr: %i Hz, latency: %f s\n", i, info->name, (int)info->hostApi, (int)info->defaultSampleRate, (float)info->defaultLowOutputLatency);
             }
             printf("\n");
-        }        
+        }
     }
     Py_RETURN_NONE;
 }
@@ -272,7 +272,7 @@ portaudio_get_devices_infos(){
                 }
             }
             return Py_BuildValue("(OO)", inDict, outDict);
-        }        
+        }
     }
 }
 
@@ -290,7 +290,7 @@ portaudio_get_output_devices(){
     PyObject *list, *list_index;
     list = PyList_New(0);
     list_index = PyList_New(0);
-    	
+
 	err = Pa_Initialize();
     if (err != paNoError) {
         portaudio_assert(err, "Pa_Initialize");
@@ -305,14 +305,14 @@ portaudio_get_output_devices(){
         else {
             for (i=0; i < n; ++i){
                 const PaDeviceInfo *info=Pa_GetDeviceInfo(i);
-                assert(info);                
+                assert(info);
                 if (info->maxOutputChannels > 0){
                     PyList_Append(list, PyString_FromString(info->name));
                     PyList_Append(list_index, PyInt_FromLong(i));
                 }
             }
             return Py_BuildValue("OO", list, list_index);
-        }        
+        }
     }
 }
 
@@ -330,7 +330,7 @@ x: int\n        Device index as listed by Portaudio (see pa_get_output_devices).
 >>> if maxouts >= 2 and maxins >= 2:\n\
 ...     nchnls = 2\n\
 >>> else:\n\
-...     nchnls = 1\n\n" 
+...     nchnls = 1\n\n"
 
 static PyObject*
 portaudio_get_output_max_channels(PyObject *self, PyObject *arg){
@@ -350,9 +350,9 @@ portaudio_get_output_max_channels(PyObject *self, PyObject *arg){
         }
         else {
             const PaDeviceInfo *info=Pa_GetDeviceInfo(i);
-            assert(info);         
+            assert(info);
             return PyInt_FromLong(info->maxOutputChannels);
-        }        
+        }
     }
 }
 
@@ -370,7 +370,7 @@ x: int\n        Device index as listed by Portaudio (see pa_get_input_devices).\
 >>> if maxouts >= 2 and maxins >= 2:\n\
 ...     nchnls = 2\n\
 >>> else:\n\
-...     nchnls = 1\n\n" 
+...     nchnls = 1\n\n"
 
 static PyObject*
 portaudio_get_input_max_channels(PyObject *self, PyObject *arg){
@@ -390,9 +390,9 @@ portaudio_get_input_max_channels(PyObject *self, PyObject *arg){
         }
         else {
             const PaDeviceInfo *info=Pa_GetDeviceInfo(i);
-            assert(info);         
+            assert(info);
             return PyInt_FromLong(info->maxInputChannels);
-        }        
+        }
     }
 }
 
@@ -406,11 +406,11 @@ static PyObject*
 portaudio_get_input_devices(){
     PaError err;
     PaDeviceIndex n, i;
-    
+
     PyObject *list, *list_index;
     list = PyList_New(0);
     list_index = PyList_New(0);
-    
+
 	err = Pa_Initialize();
     if (err != paNoError) {
         portaudio_assert(err, "Pa_Initialize");
@@ -425,14 +425,14 @@ portaudio_get_input_devices(){
         else {
             for (i=0; i < n; ++i){
                 const PaDeviceInfo *info=Pa_GetDeviceInfo(i);
-                assert(info);                
+                assert(info);
                 if (info->maxInputChannels > 0){
                     PyList_Append(list, PyString_FromString(info->name));
                     PyList_Append(list_index, PyInt_FromLong(i));
                 }
             }
-            return Py_BuildValue("OO", list, list_index);            
-        }        
+            return Py_BuildValue("OO", list, list_index);
+        }
     }
 }
 
@@ -447,7 +447,7 @@ static PyObject*
 portaudio_get_default_input(){
     PaError err;
     PaDeviceIndex i;
-	
+
 	err = Pa_Initialize();
     if (err != paNoError) {
         portaudio_assert(err, "Pa_Initialize");
@@ -455,7 +455,7 @@ portaudio_get_default_input(){
 	}
     else {
         i = Pa_GetDefaultInputDevice();
-        return PyInt_FromLong(i);        
+        return PyInt_FromLong(i);
     }
 
 }
@@ -471,7 +471,7 @@ static PyObject*
 portaudio_get_default_output(){
     PaError err;
     PaDeviceIndex i;
-	
+
 	err = Pa_Initialize();
     if (err != paNoError) {
         portaudio_assert(err, "Pa_Initialize");
@@ -480,7 +480,7 @@ portaudio_get_default_output(){
     else {
         i = Pa_GetDefaultOutputDevice();
         return PyInt_FromLong(i);
-        
+
     }
 }
 
@@ -515,11 +515,11 @@ portmidi_list_devices(){
     printf("MIDI devices:\n");
     for (i = 0; i < Pm_CountDevices(); i++) {
         const PmDeviceInfo *info = Pm_GetDeviceInfo(i);
-        if (info->input && info->output) 
+        if (info->input && info->output)
             printf("%d: IN/OUT, name: %s, interface: %s\n", i, info->name, info->interf);
-        else if (info->input) 
+        else if (info->input)
             printf("%d: IN, name: %s, interface: %s\n", i, info->name, info->interf);
-        else if (info->output) 
+        else if (info->output)
             printf("%d: OUT, name: %s, interface: %s\n", i, info->name, info->interf);
     }
     printf("\n");
@@ -594,7 +594,7 @@ portmidi_get_output_devices(){
 static PyObject *
 portmidi_get_default_input(){
     PmDeviceID i;
-    
+
     i = Pm_GetDefaultInputDeviceID();
     if (i < 0)
         printf("pm_get_default_input: no midi input device found.\n");
@@ -618,7 +618,7 @@ portmidi_get_default_output(){
 }
 
 /****** Libsndfile utilities ******/
-static int 
+static int
 libsndfile_get_format(int fileformat, int sampletype) {
     int format = 0;
     switch (fileformat) {
@@ -689,7 +689,7 @@ print : boolean, optional\n        If True, sndinfo will print sound infos to th
 
 static PyObject *
 sndinfo(PyObject *self, PyObject *args, PyObject *kwds) {
-    
+
     SNDFILE *sf;
     SF_INFO info;
     char *pathtmp;
@@ -814,18 +814,18 @@ sndinfo(PyObject *self, PyObject *args, PyObject *kwds) {
             sampletype = malloc(strlen("Unknown...") + 1);
             strcpy(sampletype, "Unknown...");
         }
-    
+
         if (print)
-            fprintf(stdout, "name: %s\nnumber of frames: %i\nduration: %.4f sec\nsr: %.2f\nchannels: %i\nformat: %s\nsample type: %s\n", 
+            fprintf(stdout, "name: %s\nnumber of frames: %i\nduration: %.4f sec\nsr: %.2f\nchannels: %i\nformat: %s\nsample type: %s\n",
                     path, (int)info.frames, ((float)info.frames / info.samplerate), (float)info.samplerate, (int)info.channels, fileformat, sampletype);
-        PyObject *sndinfo = PyTuple_Pack(6, PyInt_FromLong(info.frames), PyFloat_FromDouble((float)info.frames / info.samplerate), 
+        PyObject *sndinfo = PyTuple_Pack(6, PyInt_FromLong(info.frames), PyFloat_FromDouble((float)info.frames / info.samplerate),
             PyFloat_FromDouble(info.samplerate), PyInt_FromLong(info.channels), PyString_FromString(fileformat), PyString_FromString(sampletype));
         sf_close(sf);
         free(path);
         free(sampletype);
         return sndinfo;
     }
-}    
+}
 
 #define savefile_info \
 "\nCreates an audio file from a list of floats.\n\n:Args:\n\n    \
@@ -874,7 +874,7 @@ savefile(PyObject *self, PyObject *args, PyObject *kwds) {
 
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "Os|iiii", kwlist, &samples, &recpath, &sr, &channels, &fileformat, &sampletype))
         return PyInt_FromLong(-1);
-    
+
     recinfo.samplerate = sr;
     recinfo.channels = channels;
     recinfo.format = libsndfile_get_format(fileformat, sampletype);
@@ -897,8 +897,8 @@ savefile(PyObject *self, PyObject *args, PyObject *kwds) {
             for (j=0; j<channels; j++) {
                 sampsarray[i*channels+j] = PyFloat_AS_DOUBLE(PyList_GET_ITEM(PyList_GET_ITEM(samples, j), i));
             }
-        }    
-    }    
+        }
+    }
     if (! (recfile = sf_open(recpath, SFM_WRITE, &recinfo))) {
         printf ("savefile: failed to open output file %s.\n", recpath);
         return PyInt_FromLong(-1);
@@ -906,8 +906,8 @@ savefile(PyObject *self, PyObject *args, PyObject *kwds) {
     SF_WRITE(recfile, sampsarray, size);
     sf_close(recfile);
     free(sampsarray);
-    
-    Py_RETURN_NONE;    
+
+    Py_RETURN_NONE;
 }
 
 #define savefileFromTable_info \
@@ -956,10 +956,10 @@ savefileFromTable(PyObject *self, PyObject *args, PyObject *kwds) {
     SNDFILE *recfile;
     SF_INFO recinfo;
     static char *kwlist[] = {"table", "path", "fileformat", "sampletype", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "Os|ii", kwlist, &table, &recpath, &fileformat, &sampletype))
         return PyInt_FromLong(-1);
-    
+
     base_objs = PyObject_GetAttrString(table, "_base_objs");
     channels = PyList_Size(base_objs);
     tablestreamlist = PyList_New(channels);
@@ -968,7 +968,7 @@ savefileFromTable(PyObject *self, PyObject *args, PyObject *kwds) {
     }
     sr = (int)TableStream_getSamplingRate((PyObject *)PyList_GetItem(tablestreamlist, 0));
     size = TableStream_getSize((PyObject *)PyList_GetItem(tablestreamlist, 0));
-    
+
     recinfo.samplerate = sr;
     recinfo.channels = channels;
     recinfo.format = libsndfile_get_format(fileformat, sampletype);
@@ -979,7 +979,7 @@ savefileFromTable(PyObject *self, PyObject *args, PyObject *kwds) {
         Py_XDECREF(tablestreamlist);
         return PyInt_FromLong(-1);
     }
-    
+
     if (channels == 1) {
         MYFLT *data;
         if (size < (sr * 60)) {
@@ -1036,14 +1036,14 @@ savefileFromTable(PyObject *self, PyObject *args, PyObject *kwds) {
                 SF_WRITE(recfile, sampsarray, num_items * channels);
             } while (num_items == (sr * 30));
         }
-    }    
+    }
 
     sf_close(recfile);
     free(sampsarray);
     Py_XDECREF(base_objs);
     Py_XDECREF(tablestreamlist);
-    
-    Py_RETURN_NONE;    
+
+    Py_RETURN_NONE;
 }
 
 /****** Sampling rate conversions ******/
@@ -1093,7 +1093,7 @@ void gen_lp_impulse(MYFLT *array, int size, float freq) {
     MYFLT vsum = 0.0;
     MYFLT envPointerScaling = 1.0 / (size + 1) * 1024.0;
     MYFLT sincScaling = (MYFLT)half;
-    
+
     for (i=0; i<half; i++) {
         pp = i * envPointerScaling;
         ppi = (int)pp;
@@ -1114,7 +1114,7 @@ void gen_lp_impulse(MYFLT *array, int size, float freq) {
     }
     for (i=1; i<half; i++) {
         array[half+i] = array[half-i];
-    }    
+    }
 }
 
 /*
@@ -1129,7 +1129,7 @@ void lp_conv(MYFLT *samples, MYFLT *impulse, int num_samps, int size, int gain)
     int i, j, count, tmp_count;
     MYFLT val;
     MYFLT intmp[size];
-    
+
     for (i=0; i<size; i++) {
         intmp[i] = 0.0;
     }
@@ -1166,10 +1166,10 @@ upsamp(PyObject *self, PyObject *args, PyObject *kwds)
     int up = 4;
     int order = 128;
     static char *kwlist[] = {"path", "outfile", "up", "order", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "ss|ii", kwlist, &inpath, &outpath, &up, &order))
         return PyInt_FromLong(-1);
-    
+
     /* opening input soundfile */
     info.format = 0;
     sf = sf_open(inpath, SFM_READ, &info);
@@ -1188,16 +1188,16 @@ upsamp(PyObject *self, PyObject *args, PyObject *kwds)
     samples = (MYFLT **)malloc(snd_chnls * sizeof(MYFLT *));
     for(i=0; i<snd_chnls; i++)
         samples[i] = (MYFLT *)malloc(snd_size * sizeof(MYFLT));
-    
+
     for (i=0; i<num_items; i++)
         samples[i%snd_chnls][(int)(i/snd_chnls)] = tmp[i];
     free(tmp);
-    
+
     /* upsampling */
     upsamples = (MYFLT **)malloc(snd_chnls * sizeof(MYFLT *));
     for(i=0; i<snd_chnls; i++)
         upsamples[i] = (MYFLT *)malloc(snd_size * up * sizeof(MYFLT));
-    
+
     for (i=0; i<snd_size; i++) {
         for (j=0; j<snd_chnls; j++) {
             upsamples[j][i*up] = samples[j][i];
@@ -1206,7 +1206,7 @@ upsamp(PyObject *self, PyObject *args, PyObject *kwds)
             }
         }
     }
-    
+
     if (order > 2) {
         /* apply lowpass filter */
         sincfunc = (MYFLT *)malloc(order * sizeof(MYFLT));
@@ -1216,7 +1216,7 @@ upsamp(PyObject *self, PyObject *args, PyObject *kwds)
         }
         free(sincfunc);
     }
-    
+
     /* save upsampled file */
     info.samplerate = snd_sr * up;
     tmp = (MYFLT *)malloc(num_items * up * sizeof(MYFLT));
@@ -1224,8 +1224,8 @@ upsamp(PyObject *self, PyObject *args, PyObject *kwds)
         for (j=0; j<snd_chnls; j++) {
             tmp[i*snd_chnls+j] = upsamples[j][i];
         }
-    }    
-    
+    }
+
     if (! (sf = sf_open(outpath, SFM_WRITE, &info))) {
         printf ("upsamp: failed to open output file %s.\n", outpath);
         free(tmp);
@@ -1240,7 +1240,7 @@ upsamp(PyObject *self, PyObject *args, PyObject *kwds)
 
     SF_WRITE(sf, tmp, num_items * up);
     sf_close(sf);
-    
+
     /* clean-up */
     free(tmp);
     for (i=0; i<snd_chnls; i++) {
@@ -1249,8 +1249,8 @@ upsamp(PyObject *self, PyObject *args, PyObject *kwds)
     }
     free(samples);
     free(upsamples);
-    
-    Py_RETURN_NONE;    
+
+    Py_RETURN_NONE;
 }
 
 static PyObject *
@@ -1269,10 +1269,10 @@ downsamp(PyObject *self, PyObject *args, PyObject *kwds)
     int down = 4;
     int order = 128;
     static char *kwlist[] = {"path", "outfile", "down", "order", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "ss|ii", kwlist, &inpath, &outpath, &down, &order))
         return PyInt_FromLong(-1);
-    
+
     /* opening input soundfile */
     info.format = 0;
     sf = sf_open(inpath, SFM_READ, &info);
@@ -1291,7 +1291,7 @@ downsamp(PyObject *self, PyObject *args, PyObject *kwds)
     samples = (MYFLT **)malloc(snd_chnls * sizeof(MYFLT *));
     for(i=0; i<snd_chnls; i++)
         samples[i] = (MYFLT *)malloc(snd_size * sizeof(MYFLT));
-    
+
     for (i=0; i<num_items; i++)
         samples[i%snd_chnls][(int)(i/snd_chnls)] = tmp[i];
     free(tmp);
@@ -1305,7 +1305,7 @@ downsamp(PyObject *self, PyObject *args, PyObject *kwds)
         }
         free(sincfunc);
     }
-    
+
     /* downsampling */
     samples_per_channels = (snd_size / down) + (snd_size % down);
     downsamples = (MYFLT **)malloc(snd_chnls * sizeof(MYFLT *));
@@ -1321,7 +1321,7 @@ downsamp(PyObject *self, PyObject *args, PyObject *kwds)
             if (i*down < snd_size)
                 downsamples[j][i] = samples[j][i*down];
             else
-                downsamples[j][i] = 0.0;            
+                downsamples[j][i] = 0.0;
         }
     }
 
@@ -1333,7 +1333,7 @@ downsamp(PyObject *self, PyObject *args, PyObject *kwds)
             tmp[i*snd_chnls+j] = downsamples[j][i];
         }
     }
-       
+
     if (! (sf = sf_open(outpath, SFM_WRITE, &info))) {
         printf("downsamp: failed to open the output file %s.\n", outpath);
         free(tmp);
@@ -1345,10 +1345,10 @@ downsamp(PyObject *self, PyObject *args, PyObject *kwds)
         free(downsamples);
         return PyInt_FromLong(-1);
     }
-    
+
     SF_WRITE(sf, tmp, snd_chnls * samples_per_channels);
     sf_close(sf);
-    
+
     /* clean-up */
     free(tmp);
     for (i=0; i<snd_chnls; i++) {
@@ -1357,8 +1357,8 @@ downsamp(PyObject *self, PyObject *args, PyObject *kwds)
     }
     free(samples);
     free(downsamples);
-    
-    Py_RETURN_NONE;    
+
+    Py_RETURN_NONE;
 }
 
 /****** Algorithm utilities ******/
@@ -1418,18 +1418,18 @@ reducePoints(PyObject *self, PyObject *args, PyObject *kwds)
     int *pnUseFlag;
     MYFLT dTolerance = .02;
         MYFLT xMax, yMin, yMax;
-        
+
         static char *kwlist[] = {"pointlist", "tolerance", NULL};
-        
+
         if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_F, kwlist, &pointlist, &dTolerance))
             return PyInt_FromLong(-1);
-        
+
         nPointsCount = PyList_Size(pointlist);
-        
+
         pPointsX = (MYFLT *)malloc(nPointsCount * sizeof(MYFLT));
         pPointsY = (MYFLT *)malloc(nPointsCount * sizeof(MYFLT));
         pnUseFlag = (int *)malloc(nPointsCount * sizeof(int));
-        
+
         tup = PyList_GET_ITEM(pointlist, 0);
         if (PyTuple_Check(tup) == 1) {
             for (i=0; i<nPointsCount; i++) {
@@ -1456,7 +1456,7 @@ reducePoints(PyObject *self, PyObject *args, PyObject *kwds)
                 yMin = pPointsY[i];
             else if (pPointsY[i] > yMax)
                 yMax = pPointsY[i];
-        }    
+        }
     for (i=0; i<nPointsCount; i++) {
         pPointsX[i] = pPointsX[i] / xMax;
         pPointsY[i] = (pPointsY[i] - yMin) / yMax;
@@ -1516,15 +1516,15 @@ reducePoints(PyObject *self, PyObject *args, PyObject *kwds)
             StackPush( nVertexIndexMaxDistance, nFloaterIndex );
         }
     }
-    
-    pPointsOut = PyList_New(0);    
+
+    pPointsOut = PyList_New(0);
     for (i=0; i<nPointsCount; i++) {
         if (pnUseFlag[i] == 1) {
             PyList_Append(pPointsOut, PyList_GET_ITEM(pointlist, i));
         }
-    }        
+    }
 
-    return pPointsOut;    
+    return pPointsOut;
 }
 
 #define distanceToSegment_info \
@@ -1554,9 +1554,9 @@ distanceToSegment(PyObject *self, PyObject *args, PyObject *kwds)
     int xlog = 0;
     int ylog = 0;
     MYFLT xp[2], xp1[2], xp2[2], closest[2];
-    
+
     static char *kwlist[] = {"p", "p1", "p2", "xmin", "xmax", "ymin", "ymax", "xlog", "ylog", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_OOO_FFFFII, kwlist, &p, &p1, &p2, &xmin, &xmax, &ymin, &ymax, &xlog, &ylog))
         return PyInt_FromLong(-1);
 
@@ -1579,13 +1579,13 @@ distanceToSegment(PyObject *self, PyObject *args, PyObject *kwds)
         yscale = ymax - ymin;
         xp[1] = PyFloat_AsDouble(PyNumber_Float(PySequence_Fast_GET_ITEM(pf, 1))) / yscale;
         xp1[1] = PyFloat_AsDouble(PyNumber_Float(PySequence_Fast_GET_ITEM(pf1, 1))) / yscale;
-        xp2[1] = PyFloat_AsDouble(PyNumber_Float(PySequence_Fast_GET_ITEM(pf2, 1))) / yscale;        
+        xp2[1] = PyFloat_AsDouble(PyNumber_Float(PySequence_Fast_GET_ITEM(pf2, 1))) / yscale;
     }
     else {
         yscale = MYLOG10(ymax / ymin);
         xp[1] = MYLOG10(PyFloat_AsDouble(PyNumber_Float(PySequence_Fast_GET_ITEM(pf, 1))) / ymin) / yscale;
         xp1[1] = MYLOG10(PyFloat_AsDouble(PyNumber_Float(PySequence_Fast_GET_ITEM(pf1, 1))) / ymin) / yscale;
-        xp2[1] = MYLOG10(PyFloat_AsDouble(PyNumber_Float(PySequence_Fast_GET_ITEM(pf2, 1))) / ymin) / yscale;        
+        xp2[1] = MYLOG10(PyFloat_AsDouble(PyNumber_Float(PySequence_Fast_GET_ITEM(pf2, 1))) / ymin) / yscale;
     }
 
     xDelta = xp2[0] - xp1[0]; yDelta = xp2[1] - xp1[1];
@@ -1622,7 +1622,7 @@ static PyObject *
 linToCosCurve(PyObject *self, PyObject *args, PyObject *kwds)
 {
     PyObject *data, *fdata, *out, *inout, *ftup, *yrange=NULL, *fyrange=NULL;
-    int i, j, datasize, steps; 
+    int i, j, datasize, steps;
     double tmp, x1, x2, y1, y2, mu, ydiff, log10ymin, log10ymax;
     double *xdata, *ydata, *cxdata, *cydata;
     double totaldur = 1.0;
@@ -1632,12 +1632,12 @@ linToCosCurve(PyObject *self, PyObject *args, PyObject *kwds)
     double inc = 1.0 / num;
     int log = 0;
     int count = 0;
-    
+
     static char *kwlist[] = {"data", "yrange", "totaldur", "points", "log", NULL};
 
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|Odii", kwlist, &data, &yrange, &totaldur, &num, &log))
         Py_RETURN_NONE;
-    
+
     if (yrange) {
         fyrange = PySequence_Fast(yrange, NULL);
         ymin = PyFloat_AsDouble(PyNumber_Float(PySequence_Fast_GET_ITEM(fyrange, 0)));
@@ -1646,12 +1646,12 @@ linToCosCurve(PyObject *self, PyObject *args, PyObject *kwds)
     ydiff = ymax - ymin;
     log10ymin = log10(ymin);
     log10ymax = log10(ymax);
-    
+
     fdata = PySequence_Fast(data, NULL);
     datasize = PySequence_Size(fdata);
     xdata = (double *)malloc(datasize * sizeof(double));
     ydata = (double *)malloc(datasize * sizeof(double));
-    
+
     /* acquire data + normalization */
     if (log == 0) {
         for (i=0; i<datasize; i++) {
@@ -1669,12 +1669,12 @@ linToCosCurve(PyObject *self, PyObject *args, PyObject *kwds)
             xdata[i] = tmp / totaldur;
             tmp = PyFloat_AsDouble(PyNumber_Float(PySequence_Fast_GET_ITEM(ftup, 1)));
             ydata[i] = log10(tmp / ymin) / log10(ymax / ymin);
-        }        
+        }
     }
 
     cxdata = (double *)malloc((num+5) * sizeof(double));
     cydata = (double *)malloc((num+5) * sizeof(double));
-    
+
     /* generates cos interpolation */
     for (i=0; i<(datasize-1); i++) {
         x1 = xdata[i];
@@ -1692,7 +1692,7 @@ linToCosCurve(PyObject *self, PyObject *args, PyObject *kwds)
     }
     cxdata[count] = xdata[datasize-1];
     cydata[count++] = ydata[datasize-1];
-    
+
     /* denormalization */
     if (log == 0) {
         for (i=0; i<count; i++) {
@@ -1704,7 +1704,7 @@ linToCosCurve(PyObject *self, PyObject *args, PyObject *kwds)
         for (i=0; i<count; i++) {
             cxdata[i] *= totaldur;
             cydata[i] = pow(10.0, cydata[i] * (log10ymax - log10ymin) + log10ymin);
-        }        
+        }
     }
 
     /* output Python's list of lists */
@@ -1715,7 +1715,7 @@ linToCosCurve(PyObject *self, PyObject *args, PyObject *kwds)
         PyList_SET_ITEM(inout, 1, PyFloat_FromDouble(cydata[i]));
         PyList_SET_ITEM(out, i, inout);
     }
-    
+
     free(xdata);
     free(ydata);
     free(cxdata);
@@ -1757,9 +1757,9 @@ rescale(PyObject *self, PyObject *args, PyObject *kwds)
     int ylog = 0;
     int i, cnt;
     int type; // 0 = float, 1 = list of floats
-    
+
     static char *kwlist[] = {"data", "xmin", "xmax", "ymin", "ymax", "xlog", "ylog", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_FFFFII, kwlist, &data, &xmin, &xmax, &ymin, &ymax, &xlog, &ylog))
         return PyInt_FromLong(-1);
 
@@ -1787,7 +1787,7 @@ rescale(PyObject *self, PyObject *args, PyObject *kwds)
                 PyList_SET_ITEM(out, i, PyFloat_FromDouble((val - xmin) * curscl + ymin));
             }
             return out;
-        }        
+        }
     }
     else if (xlog == 0 && ylog == 1) {
         if (xmin == 0)
@@ -1813,7 +1813,7 @@ rescale(PyObject *self, PyObject *args, PyObject *kwds)
                 PyList_SET_ITEM(out, i, PyFloat_FromDouble(MYPOW(10.0, val * curscl + ymin)));
             }
             return out;
-        }        
+        }
     }
     else if (xlog == 1 && ylog == 0) {
         datascl = MYLOG10(xmax / xmin);
@@ -1832,7 +1832,7 @@ rescale(PyObject *self, PyObject *args, PyObject *kwds)
                 PyList_SET_ITEM(out, i, PyFloat_FromDouble(val * curscl + ymin));
             }
             return out;
-        }        
+        }
     }
     else if (xlog == 1 && ylog == 1) {
         datascl = MYLOG10(xmax / xmin);
@@ -1852,7 +1852,7 @@ rescale(PyObject *self, PyObject *args, PyObject *kwds)
                 PyList_SET_ITEM(out, i, PyFloat_FromDouble(MYPOW(10.0, val * curscl + ymin)));
             }
             return out;
-        }        
+        }
     }
     else {
         Py_INCREF(Py_None);
@@ -1882,9 +1882,9 @@ floatmap(PyObject *self, PyObject *args, PyObject *kwds)
     MYFLT min = 0.0;
     MYFLT max = 1.0;
     MYFLT exp = 1.0;
-    
+
     static char *kwlist[] = {"x", "min", "max", "exp", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_F_FFF, kwlist, &x, &min, &max, &exp))
         return PyInt_FromLong(-1);
 
@@ -1942,7 +1942,7 @@ midiToHz(PyObject *self, PyObject *arg) {
     }
     else
         Py_RETURN_NONE;
-}    
+}
 
 #define hzToMidi_info \
 "\nConverts a frequency in Hertz to a midi note value.\n\n:Args:\n\n    \
@@ -1987,7 +1987,7 @@ hzToMidi(PyObject *self, PyObject *arg) {
     }
     else
         Py_RETURN_NONE;
-}    
+}
 
 #define midiToTranspo_info \
 "\nConverts a midi note value to transposition factor (central key = 60).\n\n:Args:\n\n    \
@@ -2032,7 +2032,7 @@ midiToTranspo(PyObject *self, PyObject *arg) {
     }
     else
         Py_RETURN_NONE;
-}    
+}
 
 #define sampsToSec_info \
 "\nReturns the duration in seconds equivalent to the number of samples given as an argument.\n\n:Args:\n\n    \
@@ -2084,7 +2084,7 @@ sampsToSec(PyObject *self, PyObject *arg) {
     }
     else
         Py_RETURN_NONE;
-}                         
+}
 
 #define secToSamps_info \
 "\nReturns the number of samples equivalent to the duration in seconds given as an argument.\n\n:Args:\n\n    \
@@ -2136,7 +2136,7 @@ secToSamps(PyObject *self, PyObject *arg) {
     }
     else
         Py_RETURN_NONE;
-}                         
+}
 
 /************* Server quieries *************/
 #define serverCreated_info \
@@ -2149,10 +2149,14 @@ True\n\n"
 
 static PyObject *
 serverCreated(PyObject *self) {
-    if (PyServer_get_server() != NULL)
-        Py_RETURN_TRUE;
-    else
-        Py_RETURN_FALSE;
+    if (PyServer_get_server() != NULL) {
+        Py_INCREF(Py_True);
+        return Py_True;
+    }
+    else {
+        Py_INCREF(Py_False);
+        return Py_False;
+    }
 }
 
 #define serverBooted_info \
@@ -2171,14 +2175,19 @@ serverBooted(PyObject *self) {
     if (PyServer_get_server() != NULL) {
         server = PyServer_get_server();
         boot = PyInt_AsLong(PyObject_CallMethod(server, "getIsBooted", NULL));
-        if (boot == 0)
-            Py_RETURN_FALSE;
-        else
-            Py_RETURN_TRUE;
+        if (boot == 0) {
+            Py_INCREF(Py_False);
+            return Py_False;
+        }
+        else {
+            Py_INCREF(Py_True);
+            return Py_True;
+        }
     }
     else {
         printf("Warning: A Server must be created before calling `serverBooted` function.\n");
-        Py_RETURN_FALSE;
+        Py_INCREF(Py_False);
+        return Py_False;
     }
 }
 
@@ -2240,7 +2249,7 @@ init_pyo64(void)
 #endif
 {
     PyObject *m;
-    
+
     m = Py_InitModule3(LIB_BASE_NAME, pyo_functions, "Python digital signal processing module.");
 
 #ifndef NO_MESSAGES
@@ -2293,6 +2302,7 @@ init_pyo64(void)
     module_add_object(m, "TableMorph_base", &TableMorphType);
     module_add_object(m, "TrigTableRec_base", &TrigTableRecType);
     module_add_object(m, "TrigTableRecTimeStream_base", &TrigTableRecTimeStreamType);
+    module_add_object(m, "TableWrite_base", &TableWriteType);
     module_add_object(m, "TablePut_base", &TablePutType);
     module_add_object(m, "NewMatrix_base", &NewMatrixType);
     module_add_object(m, "MatrixPointer_base", &MatrixPointerType);
@@ -2539,6 +2549,7 @@ init_pyo64(void)
     module_add_object(m, "PeakAmp_base", &PeakAmpType);
     module_add_object(m, "MainParticle_base", &MainParticleType);
     module_add_object(m, "Particle_base", &ParticleType);
+    module_add_object(m, "AtanTable_base", &AtanTableType);
 
     PyModule_AddStringConstant(m, "PYO_VERSION", PYO_VERSION);
 #ifdef COMPILE_EXTERNALS
@@ -2552,4 +2563,4 @@ init_pyo64(void)
 #else
     PyModule_AddIntConstant(m, "USE_DOUBLE", 1);
 #endif
-}
+}
\ No newline at end of file
diff --git a/src/engine/servermodule.c b/src/engine/servermodule.c
index 373fb3f..26fdb7d 100644
--- a/src/engine/servermodule.c
+++ b/src/engine/servermodule.c
@@ -1,25 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
- *                                                                        *
- * Octobre 2013 : Multiple servers facility and embeded backend added by  *
- * Guillaume Barrette. See embeded possibilities at:                      *
- * https://github.com/guibarrette/PyoPlug                                 *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -111,7 +107,7 @@ Server_warning(Server *self, char * format, ...)
 
 void
 Server_debug(Server *self, char * format, ...)
-{    
+{
     // Debug messages should print internal information which might be necessary for debugging internal conditions.
     if (self->verbosity & 8) {
         char buffer[256];
@@ -125,7 +121,7 @@ Server_debug(Server *self, char * format, ...)
 }
 
 /* Portmidi get input events */
-static void portmidiGetEvents(Server *self) 
+static void portmidiGetEvents(Server *self)
 {
     int i;
     PmError result;
@@ -135,10 +131,10 @@ static void portmidiGetEvents(Server *self)
         do {
             result = Pm_Poll(self->midiin[i]);
             if (result) {
-                if (Pm_Read(self->midiin[i], &buffer, 1) == pmBufferOverflow) 
+                if (Pm_Read(self->midiin[i], &buffer, 1) == pmBufferOverflow)
                     continue;
                 self->midiEvents[self->midi_count++] = buffer;
-            }    
+            }
         } while (result);
     }
 }
@@ -156,7 +152,7 @@ static void portaudio_assert(PaError ecode, const char* cmdName) {
 }
 
 /* Portaudio callback function */
-static int 
+static int
 pa_callback_interleaved( const void *inputBuffer, void *outputBuffer,
                             unsigned long framesPerBuffer,
                             const PaStreamCallbackTimeInfo* timeInfo,
@@ -168,7 +164,7 @@ pa_callback_interleaved( const void *inputBuffer, void *outputBuffer,
 
     assert(framesPerBuffer == server->bufferSize);
     int i, j, bufchnls, index1, index2;
-    
+
     /* avoid unused variable warnings */
     (void) timeInfo;
     (void) statusFlags;
@@ -176,14 +172,14 @@ pa_callback_interleaved( const void *inputBuffer, void *outputBuffer,
     if (server->withPortMidi == 1) {
         portmidiGetEvents(server);
     }
-    
+
     if (server->duplex == 1) {
         float *in = (float *)inputBuffer;
-        bufchnls = server->nchnls + server->input_offset;
+        bufchnls = server->ichnls + server->input_offset;
         for (i=0; i<server->bufferSize; i++) {
-            index1 = i * server->nchnls;
+            index1 = i * server->ichnls;
             index2 = i * bufchnls + server->input_offset;
-            for (j=0; j<server->nchnls; j++) {
+            for (j=0; j<server->ichnls; j++) {
                 server->input_buffer[index1+j] = (MYFLT)in[index2+j];
             }
         }
@@ -199,18 +195,16 @@ pa_callback_interleaved( const void *inputBuffer, void *outputBuffer,
         }
     }
     server->midi_count = 0;
-    
-    if (server->server_started == 1) {
-        if (server->server_stopped == 1 && server->currentAmp < 0.0001)
-            server->server_started = 0;
-        return paContinue;
-    }    
-    else {
+
+#ifdef _OSX_
+    if (server->server_stopped == 1)
         return paComplete;
-    }
+    else
+#endif
+        return paContinue;
 }
 
-static int 
+static int
 pa_callback_nonInterleaved( const void *inputBuffer, void *outputBuffer,
                         unsigned long framesPerBuffer,
                         const PaStreamCallbackTimeInfo* timeInfo,
@@ -219,14 +213,14 @@ pa_callback_nonInterleaved( const void *inputBuffer, void *outputBuffer,
 {
     float **out = (float **)outputBuffer;
     Server *server = (Server *) arg;
-    
+
     assert(framesPerBuffer == server->bufferSize);
     int i, j;
-    
+
     /* avoid unused variable warnings */
     (void) timeInfo;
     (void) statusFlags;
-    
+
     if (server->withPortMidi == 1) {
         portmidiGetEvents(server);
     }
@@ -234,8 +228,8 @@ pa_callback_nonInterleaved( const void *inputBuffer, void *outputBuffer,
     if (server->duplex == 1) {
         float **in = (float **)inputBuffer;
         for (i=0; i<server->bufferSize; i++) {
-            for (j=0; j<server->nchnls; j++) {
-                server->input_buffer[(i*server->nchnls)+j] = (MYFLT)in[j+server->input_offset][i];
+            for (j=0; j<server->ichnls; j++) {
+                server->input_buffer[(i*server->ichnls)+j] = (MYFLT)in[j+server->input_offset][i];
             }
         }
     }
@@ -247,15 +241,13 @@ pa_callback_nonInterleaved( const void *inputBuffer, void *outputBuffer,
         }
     }
     server->midi_count = 0;
-    
-    if (server->server_started == 1) {
-        if (server->server_stopped == 1 && server->currentAmp < 0.0001)
-            server->server_started = 0;
-        return paContinue;
-    }    
-    else {
+
+#ifdef _OSX_
+    if (server->server_stopped == 1)
         return paComplete;
-    }
+    else
+#endif
+        return paContinue;
 }
 
 #ifdef USE_JACK
@@ -267,24 +259,24 @@ jack_callback (jack_nframes_t nframes, void *arg)
     int i, j;
     Server *server = (Server *) arg;
     assert(nframes == server->bufferSize);
-    jack_default_audio_sample_t *in_buffers[server->nchnls], *out_buffers[server->nchnls];
+    jack_default_audio_sample_t *in_buffers[server->ichnls], *out_buffers[server->nchnls];
 
     if (server->withPortMidi == 1) {
         portmidiGetEvents(server);
     }
     PyoJackBackendData *be_data = (PyoJackBackendData *) server->audio_be_data;
-    for (i = 0; i < server->nchnls; i++) {
+    for (i = 0; i < server->ichnls; i++) {
         in_buffers[i] = jack_port_get_buffer (be_data->jack_in_ports[i+server->input_offset], server->bufferSize);
     }
     for (i = 0; i < server->nchnls; i++) {
         out_buffers[i] = jack_port_get_buffer (be_data->jack_out_ports[i+server->output_offset], server->bufferSize);
-        
+
     }
     /* jack audio data is not interleaved */
     if (server->duplex == 1) {
         for (i=0; i<server->bufferSize; i++) {
-            for (j=0; j<server->nchnls; j++) {
-                server->input_buffer[(i*server->nchnls)+j] = (MYFLT) in_buffers[j][i];
+            for (j=0; j<server->ichnls; j++) {
+                server->input_buffer[(i*server->ichnls)+j] = (MYFLT) in_buffers[j][i];
             }
         }
     }
@@ -295,7 +287,7 @@ jack_callback (jack_nframes_t nframes, void *arg)
         }
     }
     server->midi_count = 0;
-    return 0;    
+    return 0;
 }
 
 static int
@@ -348,16 +340,16 @@ OSStatus coreaudio_input_callback(AudioDeviceID device, const AudioTimeStamp* in
     const AudioBuffer* inputBuf = inInputData->mBuffers;
     float *bufdata = (float*)inputBuf->mData;
     bufchnls = inputBuf->mNumberChannels;
-    servchnls = server->nchnls < bufchnls ? server->nchnls : bufchnls;
+    servchnls = server->ichnls < bufchnls ? server->ichnls : bufchnls;
     for (i=0; i<server->bufferSize; i++) {
         off1chnls = i*bufchnls+server->input_offset;
         off2chnls = i*servchnls;
         for (j=0; j<servchnls; j++) {
             server->input_buffer[off2chnls+j] = (MYFLT)bufdata[off1chnls+j];
         }
-    }    
-    return kAudioHardwareNoError;     
-} 
+    }
+    return kAudioHardwareNoError;
+}
 
 OSStatus coreaudio_output_callback(AudioDeviceID device, const AudioTimeStamp* inNow,
                                    const AudioBufferList* inInputData,
@@ -374,7 +366,7 @@ OSStatus coreaudio_output_callback(AudioDeviceID device, const AudioTimeStamp* i
     if (server->withPortMidi == 1) {
         portmidiGetEvents(server);
     }
-    
+
     Server_process_buffers(server);
     AudioBuffer* outputBuf = outOutputData->mBuffers;
     bufchnls = outputBuf->mNumberChannels;
@@ -385,31 +377,26 @@ OSStatus coreaudio_output_callback(AudioDeviceID device, const AudioTimeStamp* i
         off2chnls = i*servchnls;
         for(j=0; j<servchnls; j++) {
             bufdata[off1chnls+j] = server->output_buffer[off2chnls+j];
-        }    
+        }
     }
     server->midi_count = 0;
 
-    if (server->server_started == 1) {
-        if (server->server_stopped == 1 && server->currentAmp < 0.0001)
-            coreaudio_stop_callback(server);
-    }        
-
     return kAudioHardwareNoError;
-}    
+}
 
 int
-coreaudio_stop_callback(Server *self) 
+coreaudio_stop_callback(Server *self)
 {
     OSStatus err = kAudioHardwareNoError;
-    
+
     if (self->duplex == 1) {
         err = AudioDeviceStop(self->input, coreaudio_input_callback);
         if (err != kAudioHardwareNoError) {
             Server_error(self, "Input AudioDeviceStop failed %d\n", (int)err);
             return -1;
-        }        
+        }
     }
-    
+
     err = AudioDeviceStop(self->output, coreaudio_output_callback);
     if (err != kAudioHardwareNoError) {
         Server_error(self, "Output AudioDeviceStop failed %d\n", (int)err);
@@ -423,7 +410,7 @@ coreaudio_stop_callback(Server *self)
 
 static int
 offline_process_block(Server *arg)
-{    
+{
     Server *server = (Server *) arg;
     Server_process_buffers(server);
     return 0;
@@ -459,7 +446,7 @@ Server_pa_init(Server *self)
     if (self->output == -1)
         outDevice = Pa_GetDefaultOutputDevice(); /* default output device */
     else
-        outDevice = (PaDeviceIndex) self->output; /* selected output device */ 
+        outDevice = (PaDeviceIndex) self->output; /* selected output device */
     if (self->input == -1)
         inDevice = Pa_GetDefaultInputDevice(); /* default input device */
     else
@@ -485,12 +472,12 @@ Server_pa_init(Server *self)
         sampleFormat = paFloat32;
         streamCallback = pa_callback_interleaved;
     }
-     else {
+    else {
         Server_debug(self, "Portaudio uses interleaved callback.\n");
         sampleFormat = paFloat32;
         streamCallback = pa_callback_interleaved;
     }
-    
+
 
     /* setup output and input streams */
     memset(&outputParameters, 0, sizeof(outputParameters));
@@ -503,7 +490,7 @@ Server_pa_init(Server *self)
     if (self->duplex == 1) {
         memset(&inputParameters, 0, sizeof(inputParameters));
         inputParameters.device = inDevice;
-        inputParameters.channelCount = self->nchnls + self->input_offset;
+        inputParameters.channelCount = self->ichnls + self->input_offset;
         inputParameters.sampleFormat = sampleFormat;
         inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultHighInputLatency ;
         inputParameters.hostApiSpecificStreamInfo = NULL;
@@ -511,16 +498,44 @@ Server_pa_init(Server *self)
 
     if (self->input == -1 && self->output == -1) {
         if (self->duplex == 1)
-            err = Pa_OpenDefaultStream(&be_data->stream, self->nchnls + self->input_offset, self->nchnls + self->output_offset, sampleFormat, self->samplingRate, self->bufferSize, streamCallback, (void *) self);
+            err = Pa_OpenDefaultStream(&be_data->stream,
+                                       self->ichnls + self->input_offset,
+                                       self->nchnls + self->output_offset,
+                                       sampleFormat,
+                                       self->samplingRate,
+                                       self->bufferSize,
+                                       streamCallback,
+                                       (void *) self);
         else
-            err = Pa_OpenDefaultStream(&be_data->stream, 0, self->nchnls + self->output_offset, sampleFormat, self->samplingRate, self->bufferSize, streamCallback, (void *) self);
+            err = Pa_OpenDefaultStream(&be_data->stream,
+                                       0,
+                                       self->nchnls + self->output_offset,
+                                       sampleFormat,
+                                       self->samplingRate,
+                                       self->bufferSize,
+                                       streamCallback,
+                                       (void *) self);
     }
     else {
         if (self->duplex == 1)
-            err = Pa_OpenStream(&be_data->stream, &inputParameters, &outputParameters, self->samplingRate, self->bufferSize, paNoFlag, streamCallback,  (void *) self);
+            err = Pa_OpenStream(&be_data->stream,
+                                &inputParameters,
+                                &outputParameters,
+                                self->samplingRate,
+                                self->bufferSize,
+                                paNoFlag,
+                                streamCallback,
+                                (void *) self);
         else
-            err = Pa_OpenStream(&be_data->stream, (PaStreamParameters *) NULL, &outputParameters, self->samplingRate, self->bufferSize, paNoFlag, streamCallback,  (void *) self);
-    }        
+            err = Pa_OpenStream(&be_data->stream,
+                                (PaStreamParameters *) NULL,
+                                &outputParameters,
+                                self->samplingRate,
+                                self->bufferSize,
+                                paNoFlag,
+                                streamCallback,
+                                (void *) self);
+    }
     portaudio_assert(err, "Pa_OpenStream");
     if (err < 0) {
         Server_error(self, "Portaudio error: %s", Pa_GetErrorText(err));
@@ -537,53 +552,60 @@ Server_pa_deinit(Server *self)
 
     if (Pa_IsStreamActive(be_data->stream) || ! Pa_IsStreamStopped(be_data->stream)) {
         self->server_started = 0;
-        err = Pa_StopStream(be_data->stream);
-        portaudio_assert(err, "Pa_StopStream");
+        err = Pa_AbortStream(be_data->stream);
+        portaudio_assert(err, "Pa_AbortStream");
     }
-    
+
     err = Pa_CloseStream(be_data->stream);
     portaudio_assert(err, "Pa_CloseStream");
-    
+
     err = Pa_Terminate();
     portaudio_assert(err, "Pa_Terminate");
-    
+
     free(self->audio_be_data);
     return err;
 }
 
-int 
+int
 Server_pa_start(Server *self)
 {
     PaError err;
     PyoPaBackendData *be_data = (PyoPaBackendData *) self->audio_be_data;
 
     if (Pa_IsStreamActive(be_data->stream) || ! Pa_IsStreamStopped(be_data->stream)) {
-        err = Pa_StopStream(be_data->stream);
-        portaudio_assert(err, "Pa_StopStream");
+        err = Pa_AbortStream(be_data->stream);
+        portaudio_assert(err, "Pa_AbortStream");
     }
     err = Pa_StartStream(be_data->stream);
     portaudio_assert(err, "Pa_StartStream");
     return err;
 }
 
-int 
+int
 Server_pa_stop(Server *self)
 {
-    self->timeStep = (int)(0.1 * self->samplingRate);
-    self->amp = 0.;
+    PaError err;
+    PyoPaBackendData *be_data = (PyoPaBackendData *) self->audio_be_data;
+
+    if (Pa_IsStreamActive(be_data->stream) || ! Pa_IsStreamStopped(be_data->stream)) {
+#ifndef _OSX_
+        err = Pa_AbortStream(be_data->stream);
+        portaudio_assert(err, "Pa_AbortStream");
+#endif
+    }
+    self->server_started = 0;
     self->server_stopped = 1;
     return 0;
 }
 
 #ifdef USE_JACK
-
 int
 Server_jack_autoconnect (Server *self)
 {
     const char **ports;
     int i, j, num = 0, ret = 0;
     PyoJackBackendData *be_data = (PyoJackBackendData *) self->audio_be_data;
-    
+
     if (self->jackautoin) {
         if ((ports = jack_get_ports (be_data->jack_client, "system", NULL, JackPortIsOutput)) == NULL) {
             Server_error(self, "Jack: Cannot find any physical capture ports called 'system'\n");
@@ -600,13 +622,13 @@ Server_jack_autoconnect (Server *self)
         }
         free (ports);
     }
-    
+
     if (self->jackautoout) {
         if ((ports = jack_get_ports (be_data->jack_client, "system", NULL, JackPortIsInput)) == NULL) {
             Server_error(self, "Jack: Cannot find any physical playback ports called 'system'\n");
             ret = -1;
         }
-        
+
         i=0;
         while(ports[i]!=NULL && be_data->jack_out_ports[i] != NULL){
             if (jack_connect (be_data->jack_client, jack_port_name (be_data->jack_out_ports[i]), ports[i])) {
@@ -663,7 +685,7 @@ Server_jack_autoconnect (Server *self)
 
 int
 Server_jack_init (Server *self)
-{   
+{
     char client_name[32];
     char name[16];
     const char *server_name = "server";
@@ -678,7 +700,7 @@ Server_jack_init (Server *self)
     assert(self->audio_be_data == NULL);
     PyoJackBackendData *be_data = (PyoJackBackendData *) malloc(sizeof(PyoJackBackendData *));
     self->audio_be_data = (void *) be_data;
-    be_data->jack_in_ports = (jack_port_t **) calloc(self->nchnls + self->input_offset, sizeof(jack_port_t *));
+    be_data->jack_in_ports = (jack_port_t **) calloc(self->ichnls + self->input_offset, sizeof(jack_port_t *));
     be_data->jack_out_ports = (jack_port_t **) calloc(self->nchnls + self->output_offset, sizeof(jack_port_t *));
     strncpy(client_name,self->serverName, 32);
     be_data->jack_client = jack_client_open (client_name, options, &status, server_name);
@@ -697,7 +719,7 @@ Server_jack_init (Server *self)
         strcpy(self->serverName, jack_get_client_name(be_data->jack_client));
         Server_warning(self, "Jack name `%s' assigned\n", self->serverName);
     }
-    
+
     sampleRate = jack_get_sample_rate (be_data->jack_client);
     if (sampleRate != self->samplingRate) {
         self->samplingRate = (double)sampleRate;
@@ -720,13 +742,13 @@ Server_jack_init (Server *self)
         Server_debug(self, "Jack engine buffer size: %" PRIu32 "\n", bufferSize);
     }
 
-    nchnls = total_nchnls = self->nchnls + self->input_offset;
+    nchnls = total_nchnls = self->ichnls + self->input_offset;
     while (nchnls-- > 0) {
         index = total_nchnls - nchnls - 1;
         ret = sprintf(name, "input_%i", index + 1);
         if (ret > 0) {
             be_data->jack_in_ports[index]
-            = jack_port_register (be_data->jack_client, name, 
+            = jack_port_register (be_data->jack_client, name,
                                   JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
         }
 
@@ -741,8 +763,8 @@ Server_jack_init (Server *self)
         index = total_nchnls - nchnls - 1;
         ret = sprintf(name, "output_%i", index + 1);
         if (ret > 0) {
-            be_data->jack_out_ports[index] 
-            = jack_port_register (be_data->jack_client, name, 
+            be_data->jack_out_ports[index]
+            = jack_port_register (be_data->jack_client, name,
                                   JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
         }
         if ((be_data->jack_out_ports[index] == NULL)) {
@@ -757,7 +779,7 @@ Server_jack_init (Server *self)
     return 0;
 }
 
-int 
+int
 Server_jack_deinit (Server *self)
 {
     int ret = 0;
@@ -769,7 +791,7 @@ Server_jack_deinit (Server *self)
     return ret;
 }
 
-int 
+int
 Server_jack_start (Server *self)
 {
     PyoJackBackendData *be_data = (PyoJackBackendData *) self->audio_be_data;
@@ -780,12 +802,11 @@ Server_jack_start (Server *self)
         Server_shut_down(self);
         return -1;
     }
-    //if (self->jackauto)
     Server_jack_autoconnect(self);
     return 0;
 }
 
-int 
+int
 Server_jack_stop (Server *self)
 {
     PyoJackBackendData *be_data = (PyoJackBackendData *) self->audio_be_data;
@@ -808,15 +829,15 @@ Server_coreaudio_init(Server *self)
     AudioDeviceID mInputDevice = kAudioDeviceUnknown;
     Boolean writable;
     AudioTimeStamp now;
-    
+
     now.mFlags = kAudioTimeStampHostTimeValid;
     now.mHostTime = AudioGetCurrentHostTime();
 
     /************************************/
     /* List Coreaudio available devices */
-    /************************************/    
+    /************************************/
     err = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices, &count, 0);
-    AudioDeviceID *devices = (AudioDeviceID*) malloc(count);    
+    AudioDeviceID *devices = (AudioDeviceID*) malloc(count);
     err = AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &count, devices);
     if (err != kAudioHardwareNoError) {
         Server_error(self, "Get kAudioHardwarePropertyDevices error %s\n", (char*)&err);
@@ -832,7 +853,7 @@ Server_coreaudio_init(Server *self)
             Server_error(self, "Info kAudioDevicePropertyDeviceName error %s A %d %08X\n", (char*)&err, i, devices[i]);
             break;
         }
-        
+
         char *name = (char*)malloc(count);
         err = AudioDeviceGetProperty(devices[i], 0, false, kAudioDevicePropertyDeviceName, &count, name);
         if (err != kAudioHardwareNoError) {
@@ -842,16 +863,16 @@ Server_coreaudio_init(Server *self)
         }
         Server_debug(self, "   %d : \"%s\"\n", i, name);
         free(name);
-    }    
-    
+    }
+
     /************************************/
     /* Acquire input and output devices */
-    /************************************/    
-    /* Acquire input audio device */    
+    /************************************/
+    /* Acquire input audio device */
     if (self->duplex == 1) {
         if (self->input != -1)
             mInputDevice = devices[self->input];
-        
+
         if (mInputDevice==kAudioDeviceUnknown) {
             count = sizeof(mInputDevice);
             err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, &count, (void *) &mInputDevice);
@@ -859,12 +880,12 @@ Server_coreaudio_init(Server *self)
                 Server_error(self, "Get kAudioHardwarePropertyDefaultInputDevice error %s\n", (char*)&err);
                 return -1;
             }
-        }     
-        
+        }
+
         err = AudioDeviceGetPropertyInfo(mInputDevice, 0, false, kAudioDevicePropertyDeviceName, &namelen, 0);
         if (err != kAudioHardwareNoError) {
             Server_error(self, "Info kAudioDevicePropertyDeviceName error %s A %08X\n", (char*)&err, mInputDevice);
-        }    
+        }
         name = (char*)malloc(namelen);
         err = AudioDeviceGetProperty(mInputDevice, 0, false, kAudioDevicePropertyDeviceName, &namelen, name);
         if (err != kAudioHardwareNoError) {
@@ -873,12 +894,12 @@ Server_coreaudio_init(Server *self)
         Server_debug(self, "Coreaudio : Uses input device : \"%s\"\n", name);
         self->input = mInputDevice;
         free(name);
-    }    
-    
-    /* Acquire output audio device */    
+    }
+
+    /* Acquire output audio device */
     if (self->output != -1)
         mOutputDevice = devices[self->output];
-        
+
     if (mOutputDevice==kAudioDeviceUnknown) {
         count = sizeof(mOutputDevice);
         err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &count, (void *) &mOutputDevice);
@@ -891,7 +912,7 @@ Server_coreaudio_init(Server *self)
     err = AudioDeviceGetPropertyInfo(mOutputDevice, 0, false, kAudioDevicePropertyDeviceName, &namelen, 0);
     if (err != kAudioHardwareNoError) {
         Server_error(self, "Info kAudioDevicePropertyDeviceName error %s A %08X\n", (char*)&err, mOutputDevice);
-    }    
+    }
     name = (char*)malloc(namelen);
     err = AudioDeviceGetProperty(mOutputDevice, 0, false, kAudioDevicePropertyDeviceName, &namelen, name);
     if (err != kAudioHardwareNoError) {
@@ -900,7 +921,7 @@ Server_coreaudio_init(Server *self)
     Server_debug(self, "Coreaudio : Uses output device : \"%s\"\n", name);
     self->output = mOutputDevice;
     free(name);
-    
+
     /*************************************************/
     /* Get in/out buffer frame and buffer frame size */
     /*************************************************/
@@ -915,13 +936,13 @@ Server_coreaudio_init(Server *self)
         if (err != kAudioHardwareNoError)
             Server_error(self, "Get kAudioDevicePropertyBufferFrameSize error %s\n", (char*)&err);
         Server_debug(self, "Coreaudio : Coreaudio input device buffer size = %ld\n", bufferSize);
-    
+
         count = sizeof(AudioValueRange);
         err = AudioDeviceGetProperty(mInputDevice, 0, false, kAudioDevicePropertyBufferSizeRange, &count, &range);
         if (err != kAudioHardwareNoError)
             Server_error(self, "Get kAudioDevicePropertyBufferSizeRange error %s\n", (char*)&err);
         Server_debug(self, "Coreaudio : Coreaudio input device buffer size range = %f -> %f\n", range.mMinimum, range.mMaximum);
-    
+
         /* Get input device sampling rate */
         count = sizeof(Float64);
         err = AudioDeviceGetProperty(mInputDevice, 0, false, kAudioDevicePropertyNominalSampleRate, &count, &sampleRate);
@@ -929,7 +950,7 @@ Server_coreaudio_init(Server *self)
             Server_debug(self, "Get kAudioDevicePropertyNominalSampleRate error %s\n", (char*)&err);
         Server_debug(self, "Coreaudio : Coreaudio input device sampling rate = %.2f\n", sampleRate);
     }
-    
+
     /* Get output device buffer frame size and buffer frame size range */
     count = sizeof(UInt32);
     err = AudioDeviceGetProperty(mOutputDevice, 0, false, kAudioDevicePropertyBufferFrameSize, &count, &bufferSize);
@@ -942,7 +963,7 @@ Server_coreaudio_init(Server *self)
     if (err != kAudioHardwareNoError)
         Server_error(self, "Get kAudioDevicePropertyBufferSizeRange error %s\n", (char*)&err);
     Server_debug(self, "Coreaudio : Coreaudio output device buffer size range = %.2f -> %.2f\n", range.mMinimum, range.mMaximum);
-    
+
     /* Get output device sampling rate */
     count = sizeof(Float64);
     err = AudioDeviceGetProperty(mOutputDevice, 0, false, kAudioDevicePropertyNominalSampleRate, &count, &sampleRate);
@@ -950,7 +971,7 @@ Server_coreaudio_init(Server *self)
         Server_debug(self, "Get kAudioDevicePropertyNominalSampleRate error %s\n", (char*)&err);
     Server_debug(self, "Coreaudio : Coreaudio output device sampling rate = %.2f\n", sampleRate);
 
-    
+
     /****************************************/
     /********* Set audio properties *********/
     /****************************************/
@@ -965,7 +986,7 @@ Server_coreaudio_init(Server *self)
             Server_error(self, "set kAudioDevicePropertyBufferFrameSize error %4.4s\n", (char*)&err);
         else
             Server_debug(self, "pyo buffer size set to output device buffer size : %i\n", self->bufferSize);
-    } 
+    }
     else
         Server_debug(self, "Coreaudio : Changed output device buffer size successfully: %i\n", self->bufferSize);
 
@@ -973,8 +994,8 @@ Server_coreaudio_init(Server *self)
         err = AudioDeviceSetProperty(mInputDevice, &now, 0, false, kAudioDevicePropertyBufferFrameSize, count, &self->bufferSize);
         if (err != kAudioHardwareNoError) {
             Server_error(self, "set kAudioDevicePropertyBufferFrameSize error %4.4s\n", (char*)&err);
-        }    
-    }    
+        }
+    }
 
     /* set/get the sampling rate for the devices */
     count = sizeof(double);
@@ -982,23 +1003,23 @@ Server_coreaudio_init(Server *self)
     err = AudioDeviceSetProperty(mOutputDevice, &now, 0, false, kAudioDevicePropertyNominalSampleRate, count, &pyoSamplingRate);
     if (err != kAudioHardwareNoError) {
         Server_error(self, "set kAudioDevicePropertyNominalSampleRate error %s\n", (char*)&err);
-        self->samplingRate = (double)sampleRate;        
+        self->samplingRate = (double)sampleRate;
         err = AudioDeviceSetProperty(mOutputDevice, &now, 0, false, kAudioDevicePropertyNominalSampleRate, count, &sampleRate);
         if (err != kAudioHardwareNoError)
             Server_error(self, "set kAudioDevicePropertyNominalSampleRate error %s\n", (char*)&err);
-        else    
+        else
             Server_debug(self, "pyo sampling rate set to output device sampling rate : %i\n", self->samplingRate);
     }
     else
         Server_debug(self, "Coreaudio : Changed output device sampling rate successfully: %.2f\n", self->samplingRate);
-    
+
     if (self->duplex ==1) {
         pyoSamplingRate = self->samplingRate;
         err = AudioDeviceSetProperty(mInputDevice, &now, 0, false, kAudioDevicePropertyNominalSampleRate, count, &pyoSamplingRate);
         if (err != kAudioHardwareNoError) {
             Server_error(self, "set kAudioDevicePropertyNominalSampleRate error %s\n", (char*)&err);
         }
-    }    
+    }
 
 
     /****************************************/
@@ -1013,14 +1034,14 @@ Server_coreaudio_init(Server *self)
         err = AudioDeviceGetProperty(mInputDevice, 0, true, kAudioDevicePropertyStreamFormat, &count, &inputStreamDescription);
         if (err != kAudioHardwareNoError)
             Server_debug(self, "Get kAudioDevicePropertyStreamFormat error %s\n", (char*)&err);
-    
+
         /*
         inputStreamDescription.mSampleRate = (Float64)self->samplingRate;
-    
+
         err = AudioDeviceSetProperty(mInputDevice, &now, 0, false, kAudioDevicePropertyStreamFormat, count, &inputStreamDescription);
         if (err != kAudioHardwareNoError)
             Server_debug(self, "-- Set kAudioDevicePropertyStreamFormat error %s\n", (char*)&err);
-    
+
         // Print new input stream description
         err = AudioDeviceGetProperty(mInputDevice, 0, true, kAudioDevicePropertyStreamFormat, &count, &inputStreamDescription);
         if (err != kAudioHardwareNoError)
@@ -1030,7 +1051,7 @@ Server_coreaudio_init(Server *self)
         Server_debug(self, "Coreaudio : Coreaudio driver input stream bytes per frame = %i\n", inputStreamDescription.mBytesPerFrame);
         Server_debug(self, "Coreaudio : Coreaudio driver input stream number of channels = %i\n", inputStreamDescription.mChannelsPerFrame);
     }
-    
+
     /* Get output device stream configuration */
     count = sizeof(AudioStreamBasicDescription);
     err = AudioDeviceGetProperty(mOutputDevice, 0, false, kAudioDevicePropertyStreamFormat, &count, &outputStreamDescription);
@@ -1039,11 +1060,11 @@ Server_coreaudio_init(Server *self)
 
     /*
     outputStreamDescription.mSampleRate = (Float64)self->samplingRate;
-    
+
     err = AudioDeviceSetProperty(mOutputDevice, &now, 0, false, kAudioDevicePropertyStreamFormat, count, &outputStreamDescription);
     if (err != kAudioHardwareNoError)
         Server_debug(self, "Set kAudioDevicePropertyStreamFormat error %s\n", (char*)&err);
-    
+
     // Print new output stream description
     err = AudioDeviceGetProperty(mOutputDevice, 0, false, kAudioDevicePropertyStreamFormat, &count, &outputStreamDescription);
     if (err != kAudioHardwareNoError)
@@ -1062,7 +1083,7 @@ Server_coreaudio_init(Server *self)
         if (err != kAudioHardwareNoError) {
             Server_error(self, "Input AudioDeviceAddIOProc failed %d\n", (int)err);
             return -1;
-        }        
+        }
         err = AudioDeviceGetPropertyInfo(self->input, 0, true, kAudioDevicePropertyIOProcStreamUsage, &propertySize, &writable);
         AudioHardwareIOProcStreamUsage *input_su = (AudioHardwareIOProcStreamUsage*)malloc(propertySize);
         input_su->mIOProc = (void*)coreaudio_input_callback;
@@ -1072,7 +1093,7 @@ Server_coreaudio_init(Server *self)
         }
         err = AudioDeviceSetProperty(self->input, &now, 0, true, kAudioDevicePropertyIOProcStreamUsage, propertySize, input_su);
     }
-    
+
     err = AudioDeviceAddIOProc(self->output, coreaudio_output_callback, (void *) self);    // setup our device with an IO proc
     if (err != kAudioHardwareNoError) {
         Server_error(self, "Output AudioDeviceAddIOProc failed %d\n", (int)err);
@@ -1086,11 +1107,11 @@ Server_coreaudio_init(Server *self)
         output_su->mStreamIsOn[i] = 1;
     }
     err = AudioDeviceSetProperty(self->output, &now, 0, false, kAudioDevicePropertyIOProcStreamUsage, propertySize, output_su);
-    
+
     return 0;
 }
 
-int 
+int
 Server_coreaudio_deinit(Server *self)
 {
     OSStatus err = kAudioHardwareNoError;
@@ -1100,19 +1121,19 @@ Server_coreaudio_deinit(Server *self)
         if (err != kAudioHardwareNoError) {
             Server_error(self, "Input AudioDeviceRemoveIOProc failed %d\n", (int)err);
             return -1;
-        }    
+        }
     }
-    
+
     err = AudioDeviceRemoveIOProc(self->output, coreaudio_output_callback);
     if (err != kAudioHardwareNoError) {
         Server_error(self, "Output AudioDeviceRemoveIOProc failed %d\n", (int)err);
         return -1;
     }
-    
+
     return 0;
 }
 
-int 
+int
 Server_coreaudio_start(Server *self)
 {
     OSStatus err = kAudioHardwareNoError;
@@ -1122,22 +1143,21 @@ Server_coreaudio_start(Server *self)
         if (err != kAudioHardwareNoError) {
             Server_error(self, "Input AudioDeviceStart failed %d\n", (int)err);
             return -1;
-        }        
+        }
     }
-    
+
     err = AudioDeviceStart(self->output, coreaudio_output_callback);
     if (err != kAudioHardwareNoError) {
         Server_error(self, "Output AudioDeviceStart failed %d\n", (int)err);
         return -1;
     }
     return 0;
-} 
+}
 
 int
 Server_coreaudio_stop(Server *self)
 {
-    self->timeStep = (int)(0.1 * self->samplingRate);
-    self->amp = 0.;
+    coreaudio_stop_callback(self);
     self->server_stopped = 1;
     return 0;
 }
@@ -1156,13 +1176,13 @@ Server_offline_deinit(Server *self)
     return 0;
 }
 
-void 
+void
 *Server_offline_thread(void *arg)
 {
     int numBlocks;
     Server *self;
     self = (Server *)arg;
-    
+
     if (self->recdur < 0) {
         Server_error(self,"Duration must be specified for Offline Server (see Server.recordOptions).");
     }
@@ -1172,12 +1192,12 @@ void
         Server_debug(self,"Number of blocks: %i\n", numBlocks);
         Server_start_rec_internal(self, self->recpath);
         while (numBlocks-- > 0 && self->server_stopped == 0) {
-            offline_process_block((Server *) self); 
+            offline_process_block((Server *) self);
         }
         self->server_started = 0;
         self->record = 0;
         sf_close(self->recfile);
-        Server_message(self,"Offline Server rendering finished.\n");         
+        Server_message(self,"Offline Server rendering finished.\n");
     }
     return NULL;
 }
@@ -1194,7 +1214,7 @@ int
 Server_offline_start(Server *self)
 {
     int numBlocks;
-    
+
     if (self->recdur < 0) {
         Server_error(self,"Duration must be specified for Offline Server (see Server.recordOptions).");
         return -1;
@@ -1204,12 +1224,12 @@ Server_offline_start(Server *self)
     Server_debug(self,"Number of blocks: %i\n", numBlocks);
     Server_start_rec_internal(self, self->recpath);
     while (numBlocks-- > 0 && self->server_stopped == 0) {
-        offline_process_block((Server *) self); 
+        offline_process_block((Server *) self);
     }
     self->server_started = 0;
     self->record = 0;
     sf_close(self->recfile);
-    Server_message(self,"Offline Server rendering finished.\n"); 
+    Server_message(self,"Offline Server rendering finished.\n");
     return 0;
 }
 
@@ -1267,7 +1287,7 @@ Server_embedded_ni_start(Server *self)
             self->output_buffer[i+(self->bufferSize*(j+1))-self->bufferSize] = out[(i*self->nchnls)+j];
         }
     }
-    
+
     return 0;
 }
 
@@ -1278,12 +1298,12 @@ Server_embedded_ni_startIdx(int idx)
     return 0;
 }
 
-void 
+void
 *Server_embedded_thread(void *arg)
 {
     Server *self;
     self = (Server *)arg;
-    
+
     Server_process_buffers(self);
 
     return NULL;
@@ -1297,7 +1317,7 @@ Server_embedded_nb_start(Server *self)
     return 0;
 }
 
-/* this stop function is not very useful since the processing is stopped at the end 
+/* this stop function is not very useful since the processing is stopped at the end
 of every processing callback, but function put to not break pyo */
 int
 Server_embedded_stop(Server *self)
@@ -1313,7 +1333,7 @@ Server_embedded_stop(Server *self)
 static inline void
 Server_process_buffers(Server *server)
 {
-    float *out = server->output_buffer;    
+    float *out = server->output_buffer;
     MYFLT buffer[server->nchnls][server->bufferSize];
     int i, j, chnl;
     int nchnls = server->nchnls;
@@ -1336,7 +1356,7 @@ Server_process_buffers(Server *server)
             }
             if (Stream_getDuration(stream_tmp) != 0) {
                 Stream_IncrementDurationCount(stream_tmp);
-            }    
+            }
         }
         else if (Stream_getBufferCountWait(stream_tmp) != 0)
             Stream_IncrementBufferCount(stream_tmp);
@@ -1354,7 +1374,7 @@ Server_process_buffers(Server *server)
         server->stepVal = (amp - server->currentAmp) / server->timeStep;
         server->lastAmp = amp;
     }
-    
+
     for (i=0; i < server->bufferSize; i++){
         if (server->timeCount < server->timeStep) {
             server->currentAmp += server->stepVal;
@@ -1384,17 +1404,17 @@ Server_process_gui(Server *server)
             if (outAmp > rms[j])
                 rms[j] = outAmp;
         }
-    }    
+    }
     if (server->gcount <= server->numPass) {
-        for (j=0; j<server->nchnls; j++) {            
+        for (j=0; j<server->nchnls; j++) {
             server->lastRms[j] = (rms[j] + server->lastRms[j]) * 0.5;
-        }    
+        }
         server->gcount++;
     }
     else {
-        for (j=0; j<server->nchnls; j++) {            
+        for (j=0; j<server->nchnls; j++) {
             server->lastRms[j] = (rms[j] + server->lastRms[j]) * 0.5;
-        }  
+        }
         switch (server->nchnls) {
             case 1:
                 PyObject_CallMethod((PyObject *)server->GUI, "setRms", "f", server->lastRms[0]);
@@ -1420,7 +1440,7 @@ Server_process_gui(Server *server)
             case 8:
                 PyObject_CallMethod((PyObject *)server->GUI, "setRms", "ffffffff", server->lastRms[0], server->lastRms[1], server->lastRms[2], server->lastRms[3], server->lastRms[4], server->lastRms[5], server->lastRms[6], server->lastRms[7]);
                 break;
-        }        
+        }
         server->gcount = 0;
     }
 }
@@ -1431,7 +1451,7 @@ Server_process_time(Server *server)
     int hours, minutes, seconds, milliseconds;
     float sr = server->samplingRate;
     double sampsToSecs;
-    
+
     if (server->tcount <= server->timePass) {
         server->tcount++;
     }
@@ -1443,14 +1463,14 @@ Server_process_time(Server *server)
         hours = minutes / 60;
         minutes = minutes % 60;
         seconds = seconds % 60;
-        PyObject_CallMethod((PyObject *)server->TIME, "setTime", "iiii", hours, minutes, seconds, milliseconds);   
+        PyObject_CallMethod((PyObject *)server->TIME, "setTime", "iiii", hours, minutes, seconds, milliseconds);
         server->tcount = 0;
     }
 }
 
 /***************************************************/
 
-/* Global function called by any new audio object to 
+/* Global function called by any new audio object to
  get a pointer to the server */
 PyObject *
 PyServer_get_server()
@@ -1471,7 +1491,7 @@ Server_shut_down(Server *self)
     if (self->server_started == 1) {
         Server_stop((Server *)self);
     }
-    
+
     for (i=0; i<num_rnd_objs; i++) {
         rnd_objs_count[i] = 0;
     }
@@ -1479,26 +1499,26 @@ Server_shut_down(Server *self)
     switch (self->audio_be_type) {
         case PyoPortaudio:
             ret = Server_pa_deinit(self);
-            break;     
+            break;
         case PyoCoreaudio:
-#ifdef USE_COREAUDIO       
+#ifdef USE_COREAUDIO
             ret = Server_coreaudio_deinit(self);
-#endif      
-            break;          
-        case PyoJack:    
-#ifdef USE_JACK    
+#endif
+            break;
+        case PyoJack:
+#ifdef USE_JACK
             ret = Server_jack_deinit(self);
-#endif 
-            break;       
+#endif
+            break;
         case PyoOffline:
-            ret = Server_offline_deinit(self);  
-            break;         
+            ret = Server_offline_deinit(self);
+            break;
         case PyoOfflineNB:
-            ret = Server_offline_deinit(self);  
-            break;         
+            ret = Server_offline_deinit(self);
+            break;
         case PyoEmbedded:
             ret = Server_embedded_deinit(self);
-            break;    
+            break;
     }
     self->server_booted = 0;
     if (ret < 0) {
@@ -1520,9 +1540,9 @@ Server_traverse(Server *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Server_clear(Server *self)
-{    
+{
     Py_CLEAR(self->streams);
     Py_CLEAR(self->jackAutoConnectInputPorts);
     Py_CLEAR(self->jackAutoConnectOutputPorts);
@@ -1531,7 +1551,7 @@ Server_clear(Server *self)
 
 static void
 Server_dealloc(Server* self)
-{  
+{
     if (self->server_booted == 1)
         Server_shut_down(self);
     Server_clear(self);
@@ -1548,16 +1568,19 @@ Server_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     /* Unused variables to allow the safety check of the embeded audio backend. */
     double samplingRate = 44100.0;
     int  nchnls = 2;
+    int  ichnls = 2;
     int  bufferSize = 256;
     int  duplex = 0;
     char *audioType = "portaudio";
     char *serverName = "pyo";
-        
-    static char *kwlist[] = {"sr", "nchnls", "buffersize", "duplex", "audio", "jackname", NULL};
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, "|diiiss", kwlist, 
-            &samplingRate, &nchnls, &bufferSize, &duplex, &audioType, &serverName))
-        Py_RETURN_FALSE;
-        
+
+    static char *kwlist[] = {"sr", "nchnls", "buffersize", "duplex", "audio", "jackname", "ichnls", NULL};
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "|diiissi", kwlist,
+            &samplingRate, &nchnls, &bufferSize, &duplex, &audioType, &serverName, &ichnls)) {
+        Py_INCREF(Py_False);
+        return Py_False;
+    }
+
     if (strcmp(audioType, "embedded") != 0)
     {
         if (PyServer_get_server() != NULL) {
@@ -1588,6 +1611,7 @@ Server_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->jackAutoConnectOutputPorts = PyList_New(0);
     self->samplingRate = 44100.0;
     self->nchnls = 2;
+    self->ichnls = 2;
     self->record = 0;
     self->bufferSize = 256;
     self->duplex = 0;
@@ -1618,14 +1642,13 @@ Server_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 static int
 Server_init(Server *self, PyObject *args, PyObject *kwds)
 {
-    static char *kwlist[] = {"sr", "nchnls", "buffersize", "duplex", "audio", "jackname", NULL};
-    
+    static char *kwlist[] = {"sr", "nchnls", "buffersize", "duplex", "audio", "jackname", "ichnls", NULL};
+
     char *audioType = "portaudio";
     char *serverName = "pyo";
 
-    //Server_debug(self, "Server_init. Compiled " TIMESTAMP "\n");  // Only for debugging purposes
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, "|diiiss", kwlist, 
-            &self->samplingRate, &self->nchnls, &self->bufferSize, &self->duplex, &audioType, &serverName))
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "|diiissi", kwlist,
+            &self->samplingRate, &self->nchnls, &self->bufferSize, &self->duplex, &audioType, &serverName, &self->ichnls))
         return -1;
     if (strcmp(audioType, "jack") == 0) {
         self->audio_be_type = PyoJack;
@@ -1635,13 +1658,13 @@ Server_init(Server *self, PyObject *args, PyObject *kwds)
     }
     else if (strcmp(audioType, "coreaudio") == 0) {
         self->audio_be_type = PyoCoreaudio;
-    }    
+    }
     else if (strcmp(audioType, "offline") == 0) {
         self->audio_be_type = PyoOffline;
-    } 
+    }
     else if (strcmp(audioType, "offline_nb") == 0) {
         self->audio_be_type = PyoOfflineNB;
-    } 
+    }
     else if (strcmp(audioType, "embedded") == 0) {
         self->audio_be_type = PyoEmbedded;
     }
@@ -1661,7 +1684,7 @@ static PyObject *
 Server_setDefaultRecPath(Server *self, PyObject *args, PyObject *kwds)
 {
     static char *kwlist[] = {"path", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &self->recpath))
         return PyInt_FromLong(-1);
 
@@ -1794,6 +1817,24 @@ Server_setNchnls(Server *self, PyObject *arg)
 }
 
 static PyObject *
+Server_setIchnls(Server *self, PyObject *arg)
+{
+    if (self->server_booted) {
+        Server_warning(self, "Can't change number of input channels for booted server.\n");
+        Py_INCREF(Py_None);
+        return Py_None;
+    }
+    if (arg != NULL && PyInt_Check(arg)) {
+        self->ichnls = PyInt_AsLong(arg);
+    }
+    else {
+        Server_error(self, "Number of input channels must be an integer.\n");
+    }
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+
+static PyObject *
 Server_setBufferSize(Server *self, PyObject *arg)
 {
     if (self->server_booted) {
@@ -1831,7 +1872,7 @@ static PyObject *
 Server_setJackAuto(Server *self, PyObject *args)
 {
     int in=1, out=1;
-    
+
     if (! PyArg_ParseTuple(args, "ii", &in, &out)) {
         Py_INCREF(Py_None);
         return Py_None;
@@ -1884,7 +1925,7 @@ static PyObject *
 Server_setGlobalSeed(Server *self, PyObject *arg)
 {
     unsigned int tmp;
-    
+
     if (arg != NULL) {
         if (PyInt_Check(arg)) {
             tmp = PyInt_AsLong(arg);
@@ -1898,7 +1939,7 @@ Server_setGlobalSeed(Server *self, PyObject *arg)
     }
     else
         self->globalSeed = 0;
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1930,7 +1971,7 @@ Server_setAmp(Server *self, PyObject *arg)
 {
     if (arg != NULL) {
         int check = PyNumber_Check(arg);
-        
+
         if (check) {
             self->amp = PyFloat_AsDouble(PyNumber_Float(arg));
             if (self->amp != 0.0)
@@ -1946,13 +1987,13 @@ Server_setAmpCallable(Server *self, PyObject *arg)
 {
     int i;
     PyObject *tmp;
-    
+
     if (arg == NULL) {
         Server_error(self,"The amplitude callable attribute must be a method.\n");
         Py_INCREF(Py_None);
         return Py_None;
     }
-    
+
     tmp = arg;
     Py_XDECREF(self->GUI);
     Py_INCREF(tmp);
@@ -1962,16 +2003,16 @@ Server_setAmpCallable(Server *self, PyObject *arg)
     for (i=0; i<self->nchnls; i++) {
         self->lastRms[i] = 0.0;
     }
-    
+
     for (i=1; i<100; i++) {
         if ((self->bufferSize * i / self->samplingRate) > 0.045) {
             self->numPass = i;
             break;
         }
-    } 
+    }
     self->gcount = 0;
     self->withGUI = 1;
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1981,13 +2022,13 @@ Server_setTimeCallable(Server *self, PyObject *arg)
 {
     int i;
     PyObject *tmp;
-    
+
     if (arg == NULL) {
         Server_error(self,"The time callable attribute must be a method.\n");
         Py_INCREF(Py_None);
         return Py_None;
     }
-    
+
     tmp = arg;
     Py_XDECREF(self->TIME);
     Py_INCREF(tmp);
@@ -1998,10 +2039,10 @@ Server_setTimeCallable(Server *self, PyObject *arg)
             self->timePass = i;
             break;
         }
-    } 
+    }
     self->tcount = 0;
     self->withTIME = 1;
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2011,12 +2052,12 @@ Server_setVerbosity(Server *self, PyObject *arg)
 {
     if (arg != NULL) {
         int check = PyInt_Check(arg);
-        
+
         if (check) {
             self->verbosity = PyInt_AsLong(arg);
         }
     }
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2026,12 +2067,12 @@ Server_setStartOffset(Server *self, PyObject *arg)
 {
     if (arg != NULL) {
         int check = PyNumber_Check(arg);
-        
+
         if (check) {
             self->startoffset = PyFloat_AsDouble(PyNumber_Float(arg));
         }
     }
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2040,7 +2081,7 @@ int
 Server_pm_init(Server *self)
 {
     int i = 0;
-   /* Initializing MIDI */    
+   /* Initializing MIDI */
     PmError pmerr;
 
     pmerr = Pm_Initialize();
@@ -2049,12 +2090,12 @@ Server_pm_init(Server *self)
         self->withPortMidi = 0;
         self->withPortMidiOut = 0;
         return -1;
-    }    
+    }
     else {
         Server_debug(self, "Portmidi initialized.\n");
         self->withPortMidi = 1;
         self->withPortMidiOut = 1;
-    }    
+    }
 
     if (self->withPortMidi == 1) {
         self->midiin_count = self->midiout_count = 0;
@@ -2070,11 +2111,11 @@ Server_pm_init(Server *self)
                     if (info->input) {
                         pmerr = Pm_OpenInput(&self->midiin[0], self->midi_input, NULL, 100, NULL, NULL);
                         if (pmerr) {
-                            Server_warning(self, 
+                            Server_warning(self,
                                  "Portmidi warning: could not open midi input %d (%s): %s\n",
                                  self->midi_input, info->name, Pm_GetErrorText(pmerr));
                             self->withPortMidi = 0;
-                        }    
+                        }
                         else {
                             Server_debug(self, "Midi input (%s) opened.\n", info->name);
                             self->midiin_count = 1;
@@ -2095,10 +2136,10 @@ Server_pm_init(Server *self)
                         if (info->input) {
                             pmerr = Pm_OpenInput(&self->midiin[self->midiin_count], i, NULL, 100, NULL, NULL);
                             if (pmerr) {
-                                Server_warning(self, 
+                                Server_warning(self,
                                      "Portmidi warning: could not open midi input %d (%s): %s\n",
                                      0, info->name, Pm_GetErrorText(pmerr));
-                            }    
+                            }
                             else {
                                 Server_debug(self, "Midi input (%s) opened.\n", info->name);
                                 self->midiin_count++;
@@ -2113,7 +2154,7 @@ Server_pm_init(Server *self)
                     Server_warning(self, "Portmidi warning: no input device!\n");
                     self->withPortMidi = 0;
             }
-            
+
             if (self->midi_output < num_devices) {
                 if (self->midi_output == -1)
                     self->midi_output = Pm_GetDefaultOutputDeviceID();
@@ -2124,13 +2165,13 @@ Server_pm_init(Server *self)
                         Pt_Start(1, 0, 0); /* start a timer with millisecond accuracy */
                         pmerr = Pm_OpenOutput(&self->midiout[0], self->midi_output, NULL, 0, NULL, NULL, 1);
                         if (pmerr) {
-                            Server_warning(self, 
+                            Server_warning(self,
                                      "Portmidi warning: could not open midi output %d (%s): %s\n",
                                      self->midi_output, outinfo->name, Pm_GetErrorText(pmerr));
                             self->withPortMidiOut = 0;
                             if (Pt_Started())
                                 Pt_Stop();
-                        }    
+                        }
                         else {
                             Server_debug(self, "Midi output (%s) opened.\n", outinfo->name);
                             self->midiout_count = 1;
@@ -2152,10 +2193,10 @@ Server_pm_init(Server *self)
                         if (outinfo->output) {
                             pmerr = Pm_OpenOutput(&self->midiout[self->midiout_count], i, NULL, 100, NULL, NULL, 1);
                             if (pmerr) {
-                                Server_warning(self, 
+                                Server_warning(self,
                                      "Portmidi warning: could not open midi output %d (%s): %s\n",
                                      0, outinfo->name, Pm_GetErrorText(pmerr));
-                            }    
+                            }
                             else {
                                 Server_debug(self, "Midi output (%s) opened.\n", outinfo->name);
                                 self->midiout_count++;
@@ -2178,20 +2219,20 @@ Server_pm_init(Server *self)
                 Pm_Terminate();
                 Server_warning(self, "Portmidi closed.\n");
             }
-        }    
+        }
         else {
             Server_warning(self, "Portmidi warning: no midi device found!\nPortmidi closed.\n");
             self->withPortMidi = 0;
             self->withPortMidiOut = 0;
             Pm_Terminate();
-        }    
+        }
     }
     if (self->withPortMidi == 1) {
         self->midi_count = 0;
         for (i=0; i<self->midiin_count; i++) {
             Pm_SetFilter(self->midiin[i], PM_FILT_ACTIVE | PM_FILT_CLOCK);
         }
-    } 
+    }
     return 0;
 }
 
@@ -2269,14 +2310,16 @@ Server_boot(Server *self, PyObject *arg)
         if (self->input_buffer) {
             free(self->input_buffer);
         }
-        self->input_buffer = (MYFLT *)calloc(self->bufferSize * self->nchnls, sizeof(MYFLT));
+        self->input_buffer = (MYFLT *)calloc(self->bufferSize * self->ichnls, sizeof(MYFLT));
         if (self->output_buffer) {
             free(self->output_buffer);
         }
         self->output_buffer = (float *)calloc(self->bufferSize * self->nchnls, sizeof(float));
     }
-    for (i=0; i<self->bufferSize*self->nchnls; i++) {
+    for (i=0; i<self->bufferSize*self->ichnls; i++) {
         self->input_buffer[i] = 0.0;
+    }
+    for (i=0; i<self->bufferSize*self->nchnls; i++) {
         self->output_buffer[i] = 0.0;
     }
     if (audioerr == 0) {
@@ -2285,8 +2328,8 @@ Server_boot(Server *self, PyObject *arg)
     else {
         self->server_booted = 0;
         Server_error(self, "\nServer not booted.\n");
-    }    
-    
+    }
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2306,7 +2349,7 @@ Server_start(Server *self)
         Py_INCREF(Py_None);
         return Py_None;
     }
-    
+
     Server_debug(self, "Server_start: number of streams %d\n", self->stream_count);
 
     /* Ensure Python is set up for threading */
@@ -2326,34 +2369,34 @@ Server_start(Server *self)
         int numBlocks = ceil(self->startoffset * self->samplingRate/self->bufferSize);
         self->lastAmp = 1.0; self->amp = 0.0;
         while (numBlocks-- > 0) {
-            offline_process_block((Server *) self); 
+            offline_process_block((Server *) self);
         }
         Server_message(self,"Offline rendering completed. Start realtime processing.\n");
         self->startoffset = 0.0;
-    }    
+    }
 
     self->amp = self->resetAmp;
 
     switch (self->audio_be_type) {
         case PyoPortaudio:
             err = Server_pa_start(self);
-            break;          
+            break;
         case PyoCoreaudio:
-#ifdef USE_COREAUDIO  
+#ifdef USE_COREAUDIO
             err = Server_coreaudio_start(self);
-#endif     
-            break;           
-        case PyoJack:  
-#ifdef USE_JACK      
+#endif
+            break;
+        case PyoJack:
+#ifdef USE_JACK
             err = Server_jack_start(self);
-#endif    
+#endif
             break;
         case PyoOffline:
             err = Server_offline_start(self);
-            break;           
+            break;
         case PyoOfflineNB:
             err = Server_offline_nb_start(self);
-            break;           
+            break;
         case PyoEmbedded:
             err = Server_embedded_nb_start(self);
             break;
@@ -2379,23 +2422,23 @@ Server_stop(Server *self)
     switch (self->audio_be_type) {
         case PyoPortaudio:
             err = Server_pa_stop(self);
-            break;          
+            break;
         case PyoCoreaudio:
-#ifdef USE_COREAUDIO  
+#ifdef USE_COREAUDIO
             err = Server_coreaudio_stop(self);
-#endif            
-            break;        
+#endif
+            break;
         case PyoJack:
-#ifdef USE_JACK    
+#ifdef USE_JACK
             err = Server_jack_stop(self);
-#endif            
+#endif
             break;
         case PyoOffline:
             err = Server_offline_stop(self);
-            break;    
+            break;
         case PyoOfflineNB:
             err = Server_offline_stop(self);
-            break;    
+            break;
         case PyoEmbedded:
             err = Server_embedded_stop(self);
             break;
@@ -2430,34 +2473,34 @@ Server_stop(Server *self)
 
 static PyObject *
 Server_recordOptions(Server *self, PyObject *args, PyObject *kwds)
-{    
+{
     static char *kwlist[] = {"dur", "filename", "fileformat", "sampletype", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "d|sii", kwlist, &self->recdur, &self->recpath, &self->recformat, &self->rectype)) {
         return PyInt_FromLong(-1);
     }
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject *
 Server_start_rec(Server *self, PyObject *args, PyObject *kwds)
-{    
+{
     char *filename=NULL;
-    
+
     static char *kwlist[] = {"filename", NULL};
 
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|s", kwlist, &filename)) {
         return PyInt_FromLong(-1);
     }
     Server_start_rec_internal(self, filename);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
-static int 
+static int
 Server_start_rec_internal(Server *self, char *filename)
 {
     /* Prepare sfinfo */
@@ -2523,7 +2566,7 @@ Server_start_rec_internal(Server *self, char *filename)
     /* Open the output file. */
     if (filename == NULL) {
         Server_debug(self, "recpath : %s\n", self->recpath);
-        if (! (self->recfile = sf_open(self->recpath, SFM_WRITE, &self->recinfo))) {   
+        if (! (self->recfile = sf_open(self->recpath, SFM_WRITE, &self->recinfo))) {
             Server_error(self, "Not able to open output file %s.\n", self->recpath);
             Server_debug(self, "%s\n", sf_strerror(self->recfile));
             return -1;
@@ -2531,13 +2574,13 @@ Server_start_rec_internal(Server *self, char *filename)
     }
     else {
         Server_debug(self, "filename : %s\n", filename);
-        if (! (self->recfile = sf_open(filename, SFM_WRITE, &self->recinfo))) {   
+        if (! (self->recfile = sf_open(filename, SFM_WRITE, &self->recinfo))) {
             Server_error(self, "Not able to open output file %s.\n", filename);
             Server_debug(self, "%s\n", sf_strerror(self->recfile));
             return -1;
         }
     }
-    
+
     self->record = 1;
     return 0;
 }
@@ -2547,7 +2590,7 @@ Server_stop_rec(Server *self, PyObject *args)
 {
     self->record = 0;
     sf_close(self->recfile);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2556,10 +2599,10 @@ static PyObject *
 Server_addStream(Server *self, PyObject *args)
 {
     PyObject *tmp;
-    
+
     if (! PyArg_ParseTuple(args, "O", &tmp))
-        return PyInt_FromLong(-1); 
-        
+        return PyInt_FromLong(-1);
+
     if (tmp == NULL) {
         Server_error(self, "Server_addStream needs a pyo object as argument.\n");
         return PyInt_FromLong(-1);
@@ -2568,7 +2611,7 @@ Server_addStream(Server *self, PyObject *args)
     PyList_Append(self->streams, tmp);
 
     self->stream_count++;
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2578,7 +2621,7 @@ Server_removeStream(Server *self, int id)
 {
     int i, sid;
     Stream *stream_tmp;
-    
+
     for (i=0; i<self->stream_count; i++) {
         stream_tmp = (Stream *)PyList_GET_ITEM(self->streams, i);
         sid = Stream_getStreamId(stream_tmp);
@@ -2591,7 +2634,7 @@ Server_removeStream(Server *self, int id)
     }
 
     Py_INCREF(Py_None);
-    return Py_None;    
+    return Py_None;
 }
 
 PyObject *
@@ -2601,11 +2644,11 @@ Server_changeStreamPosition(Server *self, PyObject *args)
     Stream *ref_stream_tmp, *cur_stream_tmp, *stream_tmp;
 
     if (! PyArg_ParseTuple(args, "OO", &ref_stream_tmp, &cur_stream_tmp))
-        return PyInt_FromLong(-1); 
+        return PyInt_FromLong(-1);
 
     rsid = Stream_getStreamId(ref_stream_tmp);
     csid = Stream_getStreamId(cur_stream_tmp);
-    
+
     for (i=0; i<self->stream_count; i++) {
         stream_tmp = (Stream *)PyList_GET_ITEM(self->streams, i);
         sid = Stream_getStreamId(stream_tmp);
@@ -2629,7 +2672,7 @@ Server_changeStreamPosition(Server *self, PyObject *args)
     self->stream_count++;
 
     Py_INCREF(Py_None);
-    return Py_None;    
+    return Py_None;
 }
 
 PyObject *
@@ -2640,7 +2683,7 @@ Server_noteout(Server *self, PyObject *args)
     PmTimestamp timestamp;
 
     if (! PyArg_ParseTuple(args, "iiii", &pit, &vel, &chan, &timestamp))
-        return PyInt_FromLong(-1); 
+        return PyInt_FromLong(-1);
 
     if (self->withPortMidiOut) {
         curtime = Pt_Time();
@@ -2654,7 +2697,7 @@ Server_noteout(Server *self, PyObject *args)
         }
     }
     Py_INCREF(Py_None);
-    return Py_None;    
+    return Py_None;
 }
 
 PyObject *
@@ -2665,7 +2708,7 @@ Server_afterout(Server *self, PyObject *args)
     PmTimestamp timestamp;
 
     if (! PyArg_ParseTuple(args, "iiii", &pit, &vel, &chan, &timestamp))
-        return PyInt_FromLong(-1); 
+        return PyInt_FromLong(-1);
 
     if (self->withPortMidiOut) {
         curtime = Pt_Time();
@@ -2679,7 +2722,7 @@ Server_afterout(Server *self, PyObject *args)
         }
     }
     Py_INCREF(Py_None);
-    return Py_None;    
+    return Py_None;
 }
 
 PyObject *
@@ -2690,7 +2733,7 @@ Server_ctlout(Server *self, PyObject *args)
     PmTimestamp timestamp;
 
     if (! PyArg_ParseTuple(args, "iiii", &ctlnum, &value, &chan, &timestamp))
-        return PyInt_FromLong(-1); 
+        return PyInt_FromLong(-1);
 
     if (self->withPortMidiOut) {
         curtime = Pt_Time();
@@ -2704,7 +2747,7 @@ Server_ctlout(Server *self, PyObject *args)
         }
     }
     Py_INCREF(Py_None);
-    return Py_None;    
+    return Py_None;
 }
 
 PyObject *
@@ -2715,7 +2758,7 @@ Server_programout(Server *self, PyObject *args)
     PmTimestamp timestamp;
 
     if (! PyArg_ParseTuple(args, "iii", &value, &chan, &timestamp))
-        return PyInt_FromLong(-1); 
+        return PyInt_FromLong(-1);
 
     if (self->withPortMidiOut) {
         curtime = Pt_Time();
@@ -2729,7 +2772,7 @@ Server_programout(Server *self, PyObject *args)
         }
     }
     Py_INCREF(Py_None);
-    return Py_None;    
+    return Py_None;
 }
 
 PyObject *
@@ -2740,7 +2783,7 @@ Server_pressout(Server *self, PyObject *args)
     PmTimestamp timestamp;
 
     if (! PyArg_ParseTuple(args, "iii", &value, &chan, &timestamp))
-        return PyInt_FromLong(-1); 
+        return PyInt_FromLong(-1);
 
     if (self->withPortMidiOut) {
         curtime = Pt_Time();
@@ -2765,7 +2808,7 @@ Server_bendout(Server *self, PyObject *args)
     PmTimestamp timestamp;
 
     if (! PyArg_ParseTuple(args, "iii", &value, &chan, &timestamp))
-        return PyInt_FromLong(-1); 
+        return PyInt_FromLong(-1);
 
     if (self->withPortMidiOut) {
         curtime = Pt_Time();
@@ -2781,7 +2824,7 @@ Server_bendout(Server *self, PyObject *args)
         }
     }
     Py_INCREF(Py_None);
-    return Py_None;    
+    return Py_None;
 }
 
 MYFLT *
@@ -2812,6 +2855,12 @@ Server_getNchnls(Server *self)
 }
 
 static PyObject *
+Server_getIchnls(Server *self)
+{
+    return PyInt_FromLong(self->ichnls);
+}
+
+static PyObject *
 Server_getGlobalSeed(Server *self)
 {
     return PyInt_FromLong(self->globalSeed);
@@ -2922,7 +2971,8 @@ static PyMethodDef Server_methods[] = {
     {"setMidiOutputDevice", (PyCFunction)Server_setMidiOutputDevice, METH_O, "Sets MIDI output device."},
     {"setSamplingRate", (PyCFunction)Server_setSamplingRate, METH_O, "Sets the server's sampling rate."},
     {"setBufferSize", (PyCFunction)Server_setBufferSize, METH_O, "Sets the server's buffer size."},
-    {"setNchnls", (PyCFunction)Server_setNchnls, METH_O, "Sets the server's number of channels."},
+    {"setNchnls", (PyCFunction)Server_setNchnls, METH_O, "Sets the server's number of output/input channels."},
+    {"setIchnls", (PyCFunction)Server_setIchnls, METH_O, "Sets the server's number of input channels."},
     {"setDuplex", (PyCFunction)Server_setDuplex, METH_O, "Sets the server's duplex mode (0 = only out, 1 = in/out)."},
     {"setJackAuto", (PyCFunction)Server_setJackAuto, METH_VARARGS, "Tells the server to auto-connect Jack ports (0 = disable, 1 = enable)."},
     {"setJackAutoConnectInputPorts", (PyCFunction)Server_setJackAutoConnectInputPorts, METH_O, "Sets a list of ports to auto-connect inputs when using Jack."},
@@ -2954,7 +3004,8 @@ static PyMethodDef Server_methods[] = {
     {"bendout", (PyCFunction)Server_bendout, METH_VARARGS, "Send a pitch bend event to Portmidi output stream."},
     {"getStreams", (PyCFunction)Server_getStreams, METH_NOARGS, "Returns the list of streams added to the server."},
     {"getSamplingRate", (PyCFunction)Server_getSamplingRate, METH_NOARGS, "Returns the server's sampling rate."},
-    {"getNchnls", (PyCFunction)Server_getNchnls, METH_NOARGS, "Returns the server's current number of channels."},
+    {"getNchnls", (PyCFunction)Server_getNchnls, METH_NOARGS, "Returns the server's current number of output channels."},
+    {"getIchnls", (PyCFunction)Server_getIchnls, METH_NOARGS, "Returns the server's current number of input channels."},
     {"getGlobalSeed", (PyCFunction)Server_getGlobalSeed, METH_NOARGS, "Returns the server's global seed."},
     {"getBufferSize", (PyCFunction)Server_getBufferSize, METH_NOARGS, "Returns the server's buffer size."},
     {"getIsBooted", (PyCFunction)Server_getIsBooted, METH_NOARGS, "Returns 1 if the server is booted, otherwise returns 0."},
@@ -3015,4 +3066,4 @@ PyTypeObject ServerType = {
     (initproc)Server_init,      /* tp_init */
     0,                         /* tp_alloc */
     Server_new,                 /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/engine/streammodule.c b/src/engine/streammodule.c
index e67b6bc..ccbe3b8 100644
--- a/src/engine/streammodule.c
+++ b/src/engine/streammodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -28,8 +28,8 @@
 
 int stream_id = 1;
 
-int 
-Stream_getNewStreamId() 
+int
+Stream_getNewStreamId()
 {
     return stream_id++;
 }
@@ -37,14 +37,14 @@ Stream_getNewStreamId()
 static int
 Stream_traverse(Stream *self, visitproc visit, void *arg)
 {
-    Py_VISIT(self->streamobject);    
+    Py_VISIT(self->streamobject);
     return 0;
 }
 
-static int 
+static int
 Stream_clear(Stream *self)
 {
-    Py_CLEAR(self->streamobject);    
+    Py_CLEAR(self->streamobject);
     return 0;
 }
 
@@ -96,13 +96,13 @@ MYFLT *
 Stream_getData(Stream *self)
 {
     return (MYFLT *)self->data;
-}    
+}
 
 void
 Stream_setData(Stream *self, MYFLT *data)
 {
     self->data = data;
-}    
+}
 
 void Stream_setFunctionPtr(Stream *self, void *ptr)
 {
@@ -112,9 +112,9 @@ void Stream_setFunctionPtr(Stream *self, void *ptr)
 void Stream_callFunction(Stream *self)
 {
     (*self->funcptr)(self->streamobject);
-}    
+}
 
-void Stream_IncrementBufferCount(Stream *self) 
+void Stream_IncrementBufferCount(Stream *self)
 {
     self->bufferCount++;
     if (self->bufferCount >= self->bufferCountWait) {
@@ -123,7 +123,7 @@ void Stream_IncrementBufferCount(Stream *self)
     }
 }
 
-void Stream_IncrementDurationCount(Stream *self) 
+void Stream_IncrementDurationCount(Stream *self)
 {
     self->bufferCount++;
     if (self->bufferCount >= self->duration) {
@@ -152,19 +152,27 @@ Stream_getStreamObject(Stream *self)
 PyObject *
 Stream_isPlaying(Stream *self)
 {
-    if (self->active || self->todac)
-        Py_RETURN_TRUE;
-    else 
-        Py_RETURN_FALSE;
+    if (self->active || self->todac) {
+        Py_INCREF(Py_True);
+        return Py_True;
+    }
+    else {
+        Py_INCREF(Py_False);
+        return Py_False;
+    }
 }
 
 PyObject *
 Stream_isOutputting(Stream *self)
 {
-    if (self->todac)
-        Py_RETURN_TRUE;
-    else 
-        Py_RETURN_FALSE;
+    if (self->todac) {
+        Py_INCREF(Py_True);
+        return Py_True;
+    }
+    else {
+        Py_INCREF(Py_False);
+        return Py_False;
+    }
 }
 
 static PyMethodDef Stream_methods[] = {
@@ -254,13 +262,13 @@ MYFLT *
 TriggerStream_getData(TriggerStream *self)
 {
     return (MYFLT *)self->data;
-}    
+}
 
 void
 TriggerStream_setData(TriggerStream *self, MYFLT *data)
 {
     self->data = data;
-}    
+}
 
 PyTypeObject TriggerStreamType = {
     PyObject_HEAD_INIT(NULL)
@@ -304,4 +312,4 @@ PyTypeObject TriggerStreamType = {
     0, /* tp_init */
     0, /* tp_alloc */
     0, /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/engine/wind.c b/src/engine/wind.c
index 8fc1f94..f0ba09d 100644
--- a/src/engine/wind.c
+++ b/src/engine/wind.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2011 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *                                                                        *
  * Envelope window generator :                                            *
  *      0 : Rectangular (no window)                                       *
@@ -35,8 +35,8 @@
 void gen_window(MYFLT *window, int size, int wintype) {
     int i;
     MYFLT arg;
-   
-    switch (wintype) { 
+
+    switch (wintype) {
         case 0:
             /* Rectangular */
             for (i=0; i<size; i++) {
@@ -122,4 +122,3 @@ void gen_window(MYFLT *window, int size, int wintype) {
     }
     return;
 }
-
diff --git a/src/objects/analysismodule.c b/src/objects/analysismodule.c
index 36509be..a9cfe9a 100644
--- a/src/objects/analysismodule.c
+++ b/src/objects/analysismodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 #include <Python.h>
 #include "structmember.h"
@@ -37,7 +37,7 @@ typedef struct {
     Stream *input_stream;
     PyObject *freq;
     Stream *freq_stream;
-    int modebuffer[3]; // need at least 2 slots for mul & add 
+    int modebuffer[3]; // need at least 2 slots for mul & add
     MYFLT follow;
     MYFLT last_freq;
     MYFLT factor;
@@ -55,7 +55,7 @@ Follower_filters_i(Follower *self) {
         self->factor = MYEXP(-1.0 / (self->sr / freq));
         self->last_freq = freq;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         absin = in[i];
         if (absin < 0.0)
@@ -68,10 +68,10 @@ static void
 Follower_filters_a(Follower *self) {
     MYFLT freq, absin;
     int i;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         freq = fr[i];
         if (freq != self->last_freq) {
@@ -81,7 +81,7 @@ Follower_filters_a(Follower *self) {
         absin = in[i];
         if (absin < 0.0)
             absin = -absin;
-        self->follow = self->data[i] = absin + self->factor * (self->follow - absin);        
+        self->follow = self->data[i] = absin + self->factor * (self->follow - absin);
     }
 }
 
@@ -101,50 +101,50 @@ Follower_setProcMode(Follower *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Follower_filters_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Follower_filters_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Follower_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Follower_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Follower_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Follower_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Follower_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Follower_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Follower_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Follower_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Follower_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Follower_compute_next_data_frame(Follower *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -154,19 +154,19 @@ Follower_traverse(Follower *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
     return 0;
 }
 
-static int 
+static int
 Follower_clear(Follower *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
     return 0;
 }
 
@@ -185,7 +185,7 @@ Follower_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Follower *self;
     self = (Follower *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(20);
     self->follow = 0.0;
     self->last_freq = -1.0;
@@ -193,32 +193,32 @@ Follower_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Follower_compute_next_data_frame);
     self->mode_func_ptr = Follower_setProcMode;
 
     static char *kwlist[] = {"input", "freq", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOO", kwlist, &inputtmp, &freqtmp, &multmp, &addtmp))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     INIT_INPUT_STREAM
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -226,10 +226,10 @@ Follower_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Follower_getServer(Follower* self) { GET_SERVER };
 static PyObject * Follower_getStream(Follower* self) { GET_STREAM };
-static PyObject * Follower_setMul(Follower *self, PyObject *arg) { SET_MUL };	
-static PyObject * Follower_setAdd(Follower *self, PyObject *arg) { SET_ADD };	
-static PyObject * Follower_setSub(Follower *self, PyObject *arg) { SET_SUB };	
-static PyObject * Follower_setDiv(Follower *self, PyObject *arg) { SET_DIV };	
+static PyObject * Follower_setMul(Follower *self, PyObject *arg) { SET_MUL };
+static PyObject * Follower_setAdd(Follower *self, PyObject *arg) { SET_ADD };
+static PyObject * Follower_setSub(Follower *self, PyObject *arg) { SET_SUB };
+static PyObject * Follower_setDiv(Follower *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Follower_play(Follower *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Follower_stop(Follower *self) { STOP };
@@ -247,14 +247,14 @@ static PyObject *
 Follower_setFreq(Follower *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -270,9 +270,9 @@ Follower_setFreq(Follower *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -395,7 +395,7 @@ typedef struct {
     Stream *risetime_stream;
     PyObject *falltime;
     Stream *falltime_stream;
-    int modebuffer[4]; // need at least 2 slots for mul & add 
+    int modebuffer[4]; // need at least 2 slots for mul & add
     MYFLT follow;
     MYFLT last_risetime;
     MYFLT last_falltime;
@@ -407,7 +407,7 @@ static void
 Follower2_filters_ii(Follower2 *self) {
     MYFLT absin, risetime, falltime;
     int i;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     risetime = PyFloat_AS_DOUBLE(self->risetime);
     if (risetime <= 0.0)
@@ -415,7 +415,7 @@ Follower2_filters_ii(Follower2 *self) {
     falltime = PyFloat_AS_DOUBLE(self->falltime);
     if (falltime <= 0.0)
         falltime = 0.001;
-    
+
     if (risetime != self->last_risetime) {
         self->risefactor = MYEXP(-1.0 / (self->sr * risetime));
         self->last_risetime = risetime;
@@ -425,7 +425,7 @@ Follower2_filters_ii(Follower2 *self) {
         self->fallfactor = MYEXP(-1.0 / (self->sr * falltime));
         self->last_falltime = falltime;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         absin = in[i];
         if (absin < 0.0)
@@ -441,7 +441,7 @@ static void
 Follower2_filters_ai(Follower2 *self) {
     MYFLT absin, risetime, falltime;
     int i;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *rise = Stream_getData((Stream *)self->risetime_stream);
     falltime = PyFloat_AS_DOUBLE(self->falltime);
@@ -452,7 +452,7 @@ Follower2_filters_ai(Follower2 *self) {
         self->fallfactor = MYEXP(-1.0 / (self->sr * falltime));
         self->last_falltime = falltime;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         risetime = rise[i];
         if (risetime <= 0.0)
@@ -475,13 +475,13 @@ static void
 Follower2_filters_ia(Follower2 *self) {
     MYFLT absin, risetime, falltime;
     int i;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     risetime = PyFloat_AS_DOUBLE(self->risetime);
     if (risetime <= 0.0)
         risetime = 0.001;
     MYFLT *fall = Stream_getData((Stream *)self->falltime_stream);
-    
+
     if (risetime != self->last_risetime) {
         self->risefactor = MYEXP(-1.0 / (self->sr * risetime));
         self->last_risetime = risetime;
@@ -494,7 +494,7 @@ Follower2_filters_ia(Follower2 *self) {
         if (falltime != self->last_falltime) {
             self->fallfactor = MYEXP(-1.0 / (self->sr * falltime));
             self->last_falltime = falltime;
-        }        
+        }
         absin = in[i];
         if (absin < 0.0)
             absin = -absin;
@@ -509,7 +509,7 @@ static void
 Follower2_filters_aa(Follower2 *self) {
     MYFLT absin, risetime, falltime;
     int i;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *rise = Stream_getData((Stream *)self->risetime_stream);
     MYFLT *fall = Stream_getData((Stream *)self->falltime_stream);
@@ -528,7 +528,7 @@ Follower2_filters_aa(Follower2 *self) {
         if (falltime != self->last_falltime) {
             self->fallfactor = MYEXP(-1.0 / (self->sr * falltime));
             self->last_falltime = falltime;
-        }        
+        }
         absin = in[i];
         if (absin < 0.0)
             absin = -absin;
@@ -555,56 +555,56 @@ Follower2_setProcMode(Follower2 *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Follower2_filters_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Follower2_filters_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = Follower2_filters_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Follower2_filters_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Follower2_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Follower2_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Follower2_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Follower2_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Follower2_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Follower2_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Follower2_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Follower2_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Follower2_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Follower2_compute_next_data_frame(Follower2 *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -614,23 +614,23 @@ Follower2_traverse(Follower2 *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->risetime);    
-    Py_VISIT(self->risetime_stream);    
-    Py_VISIT(self->falltime);    
-    Py_VISIT(self->falltime_stream);    
+    Py_VISIT(self->risetime);
+    Py_VISIT(self->risetime_stream);
+    Py_VISIT(self->falltime);
+    Py_VISIT(self->falltime_stream);
     return 0;
 }
 
-static int 
+static int
 Follower2_clear(Follower2 *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->risetime);    
-    Py_CLEAR(self->risetime_stream);    
-    Py_CLEAR(self->falltime);    
-    Py_CLEAR(self->falltime_stream);    
+    Py_CLEAR(self->risetime);
+    Py_CLEAR(self->risetime_stream);
+    Py_CLEAR(self->falltime);
+    Py_CLEAR(self->falltime_stream);
     return 0;
 }
 
@@ -649,7 +649,7 @@ Follower2_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *risetimetmp=NULL, *falltimetmp=NULL, *multmp=NULL, *addtmp=NULL;
     Follower2 *self;
     self = (Follower2 *)type->tp_alloc(type, 0);
-    
+
     self->risetime = PyFloat_FromDouble(0.01);
     self->falltime = PyFloat_FromDouble(0.1);
     self->follow = 0.0;
@@ -660,36 +660,36 @@ Follower2_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Follower2_compute_next_data_frame);
     self->mode_func_ptr = Follower2_setProcMode;
 
     static char *kwlist[] = {"input", "risetime", "falltime", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOO", kwlist, &inputtmp, &risetimetmp, &falltimetmp, &multmp, &addtmp))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     INIT_INPUT_STREAM
-    
+
     if (risetimetmp) {
         PyObject_CallMethod((PyObject *)self, "setRisetime", "O", risetimetmp);
     }
-    
+
     if (falltimetmp) {
         PyObject_CallMethod((PyObject *)self, "setFalltime", "O", falltimetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -697,10 +697,10 @@ Follower2_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Follower2_getServer(Follower2* self) { GET_SERVER };
 static PyObject * Follower2_getStream(Follower2* self) { GET_STREAM };
-static PyObject * Follower2_setMul(Follower2 *self, PyObject *arg) { SET_MUL };	
-static PyObject * Follower2_setAdd(Follower2 *self, PyObject *arg) { SET_ADD };	
-static PyObject * Follower2_setSub(Follower2 *self, PyObject *arg) { SET_SUB };	
-static PyObject * Follower2_setDiv(Follower2 *self, PyObject *arg) { SET_DIV };	
+static PyObject * Follower2_setMul(Follower2 *self, PyObject *arg) { SET_MUL };
+static PyObject * Follower2_setAdd(Follower2 *self, PyObject *arg) { SET_ADD };
+static PyObject * Follower2_setSub(Follower2 *self, PyObject *arg) { SET_SUB };
+static PyObject * Follower2_setDiv(Follower2 *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Follower2_play(Follower2 *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Follower2_stop(Follower2 *self) { STOP };
@@ -718,14 +718,14 @@ static PyObject *
 Follower2_setRisetime(Follower2 *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->risetime);
@@ -741,9 +741,9 @@ Follower2_setRisetime(Follower2 *self, PyObject *arg)
         self->risetime_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -752,14 +752,14 @@ static PyObject *
 Follower2_setFalltime(Follower2 *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->falltime);
@@ -775,9 +775,9 @@ Follower2_setFalltime(Follower2 *self, PyObject *arg)
         self->falltime_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -910,7 +910,7 @@ ZCross_process(ZCross *self) {
     int count = 0;
     MYFLT inval;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = self->lastValue;
         inval = in[i];
@@ -942,44 +942,44 @@ ZCross_setProcMode(ZCross *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = ZCross_process;
- 
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = ZCross_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = ZCross_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = ZCross_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = ZCross_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = ZCross_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = ZCross_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = ZCross_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = ZCross_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = ZCross_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 ZCross_compute_next_data_frame(ZCross *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -992,7 +992,7 @@ ZCross_traverse(ZCross *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 ZCross_clear(ZCross *self)
 {
     pyo_CLEAR
@@ -1016,33 +1016,33 @@ ZCross_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     ZCross *self;
     self = (ZCross *)type->tp_alloc(type, 0);
-    
+
     self->thresh = 0.0;
     self->lastValue = self->lastSample = 0.0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, ZCross_compute_next_data_frame);
     self->mode_func_ptr = ZCross_setProcMode;
 
     static char *kwlist[] = {"input", "thresh", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_FOO, kwlist, &inputtmp, &self->thresh, &multmp, &addtmp))
-        Py_RETURN_NONE; 
+        Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -1050,10 +1050,10 @@ ZCross_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * ZCross_getServer(ZCross* self) { GET_SERVER };
 static PyObject * ZCross_getStream(ZCross* self) { GET_STREAM };
-static PyObject * ZCross_setMul(ZCross *self, PyObject *arg) { SET_MUL };	
-static PyObject * ZCross_setAdd(ZCross *self, PyObject *arg) { SET_ADD };	
-static PyObject * ZCross_setSub(ZCross *self, PyObject *arg) { SET_SUB };	
-static PyObject * ZCross_setDiv(ZCross *self, PyObject *arg) { SET_DIV };	
+static PyObject * ZCross_setMul(ZCross *self, PyObject *arg) { SET_MUL };
+static PyObject * ZCross_setAdd(ZCross *self, PyObject *arg) { SET_ADD };
+static PyObject * ZCross_setSub(ZCross *self, PyObject *arg) { SET_SUB };
+static PyObject * ZCross_setDiv(ZCross *self, PyObject *arg) { SET_DIV };
 
 static PyObject * ZCross_play(ZCross *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * ZCross_stop(ZCross *self) { STOP };
@@ -1074,13 +1074,13 @@ ZCross_setThresh(ZCross *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->thresh = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
 	}
-  
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -1249,12 +1249,12 @@ Yin_process(Yin *self) {
     int i, j, period, tau = 0;
     MYFLT candidate, tmp = 0.0, tmp2 = 0.0, b = 0.0;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->cutoff != self->last_cutoff) {
         if (self->cutoff <= 1.0)
             self->cutoff = 1.0;
         else if (self->cutoff >= self->sr*0.5)
-            self->cutoff = self->sr*0.5;        
+            self->cutoff = self->sr*0.5;
         self->last_cutoff = self->cutoff;
         b = 2.0 - MYCOS(TWOPI * self->cutoff / self->sr);
         self->c2 = (b - MYSQRT(b * b - 1.0));
@@ -1265,7 +1265,7 @@ Yin_process(Yin *self) {
         self->input_buffer[self->input_count] = self->y1;
         if (self->input_count++ == self->winsize) {
             self->input_count = 0;
- 
+
             self->yin_buffer[0] = 1.0;
             for (tau = 1; tau < self->halfsize; tau++) {
                 self->yin_buffer[tau] = 0.0;
@@ -1285,10 +1285,10 @@ Yin_process(Yin *self) {
             candidate = quadraticInterpolation(self->yin_buffer, min_elem_pos(self->yin_buffer, self->halfsize), self->halfsize);
 
         founded:
-            
+
             candidate = self->sr / candidate;
             if (candidate > self->minfreq && candidate < self->maxfreq)
-                self->pitch = candidate;           
+                self->pitch = candidate;
 
         }
         self->data[i] = self->pitch;
@@ -1310,44 +1310,44 @@ Yin_setProcMode(Yin *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = Yin_process;
- 
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Yin_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Yin_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Yin_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Yin_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Yin_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Yin_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Yin_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Yin_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Yin_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Yin_compute_next_data_frame(Yin *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1360,7 +1360,7 @@ Yin_traverse(Yin *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Yin_clear(Yin *self)
 {
     pyo_CLEAR
@@ -1386,7 +1386,7 @@ Yin_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     Yin *self;
     self = (Yin *)type->tp_alloc(type, 0);
-    
+
     self->winsize = 1024;
     self->halfsize = 512;
     self->input_count = 0;
@@ -1399,40 +1399,40 @@ Yin_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->y1 = self->c2 = 0.0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Yin_compute_next_data_frame);
     self->mode_func_ptr = Yin_setProcMode;
 
     static char *kwlist[] = {"input", "tolerance", "minfreq", "maxfreq", "cutoff", "winsize", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_FFFFIOO, kwlist, &inputtmp, &self->tolerance, &self->minfreq, &self->maxfreq, &self->cutoff, &self->winsize, &multmp, &addtmp))
-        Py_RETURN_NONE; 
+        Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     if (self->winsize % 2 == 1)
         self->winsize += 1;
 
-    self->input_buffer = (MYFLT *)realloc(self->input_buffer, self->winsize * sizeof(MYFLT)); 
+    self->input_buffer = (MYFLT *)realloc(self->input_buffer, self->winsize * sizeof(MYFLT));
     for (i=0; i<self->winsize; i++)
         self->input_buffer[i] = 0.0;
 
     self->halfsize = self->winsize / 2;
-    self->yin_buffer = (MYFLT *)realloc(self->yin_buffer, self->halfsize * sizeof(MYFLT)); 
+    self->yin_buffer = (MYFLT *)realloc(self->yin_buffer, self->halfsize * sizeof(MYFLT));
     for (i=0; i<self->halfsize; i++)
         self->yin_buffer[i] = 0.0;
-       
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -1440,10 +1440,10 @@ Yin_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Yin_getServer(Yin* self) { GET_SERVER };
 static PyObject * Yin_getStream(Yin* self) { GET_STREAM };
-static PyObject * Yin_setMul(Yin *self, PyObject *arg) { SET_MUL };	
-static PyObject * Yin_setAdd(Yin *self, PyObject *arg) { SET_ADD };	
-static PyObject * Yin_setSub(Yin *self, PyObject *arg) { SET_SUB };	
-static PyObject * Yin_setDiv(Yin *self, PyObject *arg) { SET_DIV };	
+static PyObject * Yin_setMul(Yin *self, PyObject *arg) { SET_MUL };
+static PyObject * Yin_setAdd(Yin *self, PyObject *arg) { SET_ADD };
+static PyObject * Yin_setSub(Yin *self, PyObject *arg) { SET_SUB };
+static PyObject * Yin_setDiv(Yin *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Yin_play(Yin *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Yin_stop(Yin *self) { STOP };
@@ -1464,13 +1464,13 @@ Yin_setTolerance(Yin *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->tolerance = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
 	}
-  
+
 	Py_RETURN_NONE;
 }
 
@@ -1481,13 +1481,13 @@ Yin_setMinfreq(Yin *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->minfreq = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
 	}
-  
+
 	Py_RETURN_NONE;
 }
 
@@ -1498,13 +1498,13 @@ Yin_setMaxfreq(Yin *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->maxfreq = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
 	}
-  
+
 	Py_RETURN_NONE;
 }
 
@@ -1515,13 +1515,13 @@ Yin_setCutoff(Yin *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->cutoff = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
 	}
-  
+
 	Py_RETURN_NONE;
 }
 
@@ -1660,8 +1660,8 @@ Centroid_alloc_memories(Centroid *self) {
     self->hsize = self->size / 2;
     n8 = self->size >> 3;
     self->inframe = (MYFLT *)realloc(self->inframe, self->size * sizeof(MYFLT));
-    self->outframe = (MYFLT *)realloc(self->outframe, self->size * sizeof(MYFLT));       
-    self->input_buffer = (MYFLT *)realloc(self->input_buffer, self->size * sizeof(MYFLT));    
+    self->outframe = (MYFLT *)realloc(self->outframe, self->size * sizeof(MYFLT));
+    self->input_buffer = (MYFLT *)realloc(self->input_buffer, self->size * sizeof(MYFLT));
     for (i=0; i<self->size; i++)
         self->inframe[i] = self->outframe[i] = self->input_buffer[i] = 0.0;
     self->twiddle = (MYFLT **)realloc(self->twiddle, 4 * sizeof(MYFLT *));
@@ -1681,11 +1681,11 @@ Centroid_process_i(Centroid *self) {
     for (i=0; i<self->bufsize; i++) {
         self->input_buffer[self->incount] = in[i];
         self->data[i] = self->centroid;
-        
+
         self->incount++;
         if (self->incount == self->size) {
             self->incount = self->hsize;
-            
+
             for (i=0; i<self->size; i++) {
                 self->inframe[i] = self->input_buffer[i] * self->window[i];
             }
@@ -1703,9 +1703,9 @@ Centroid_process_i(Centroid *self) {
             self->centroid *= 0.5;
             for (i=0; i<self->hsize; i++) {
                 self->input_buffer[i] = self->input_buffer[i + self->hsize];
-            }            
+            }
         }
-    } 
+    }
 }
 
 static void Centroid_postprocessing_ii(Centroid *self) { POST_PROCESSING_II };
@@ -1720,38 +1720,38 @@ static void Centroid_postprocessing_revareva(Centroid *self) { POST_PROCESSING_R
 
 static void
 Centroid_setProcMode(Centroid *self)
-{        
+{
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
     self->proc_func_ptr = Centroid_process_i;
-      
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Centroid_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Centroid_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Centroid_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Centroid_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Centroid_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Centroid_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Centroid_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Centroid_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Centroid_postprocessing_revareva;
             break;
     }
@@ -1760,7 +1760,7 @@ Centroid_setProcMode(Centroid *self)
 static void
 Centroid_compute_next_data_frame(Centroid *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1773,7 +1773,7 @@ Centroid_traverse(Centroid *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Centroid_clear(Centroid *self)
 {
     pyo_CLEAR
@@ -1806,7 +1806,7 @@ Centroid_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     Centroid *self;
     self = (Centroid *)type->tp_alloc(type, 0);
-    
+
     self->centroid = 0;
     self->size = 1024;
     INIT_OBJECT_COMMON
@@ -1814,7 +1814,7 @@ Centroid_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = Centroid_setProcMode;
 
     static char *kwlist[] = {"input", "size", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iOO", kwlist, &inputtmp, &self->size, &multmp, &addtmp))
         Py_RETURN_NONE;
 
@@ -1822,7 +1822,7 @@ Centroid_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         printf("Warning : Centroid size less than buffer size!\nCentroid size set to buffersize: %d\n", self->bufsize);
         self->size = self->bufsize;
     }
-    
+
     k = 1;
     while (k < self->size)
         k <<= 1;
@@ -1833,13 +1833,13 @@ Centroid_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     Centroid_alloc_memories(self);
 
     self->incount = self->hsize;
@@ -1851,10 +1851,10 @@ Centroid_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Centroid_getServer(Centroid* self) { GET_SERVER };
 static PyObject * Centroid_getStream(Centroid* self) { GET_STREAM };
-static PyObject * Centroid_setMul(Centroid *self, PyObject *arg) { SET_MUL };    
-static PyObject * Centroid_setAdd(Centroid *self, PyObject *arg) { SET_ADD };    
-static PyObject * Centroid_setSub(Centroid *self, PyObject *arg) { SET_SUB };    
-static PyObject * Centroid_setDiv(Centroid *self, PyObject *arg) { SET_DIV };    
+static PyObject * Centroid_setMul(Centroid *self, PyObject *arg) { SET_MUL };
+static PyObject * Centroid_setAdd(Centroid *self, PyObject *arg) { SET_ADD };
+static PyObject * Centroid_setSub(Centroid *self, PyObject *arg) { SET_SUB };
+static PyObject * Centroid_setDiv(Centroid *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Centroid_play(Centroid *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Centroid_stop(Centroid *self) { STOP };
@@ -2006,7 +2006,7 @@ AttackDetector_process(AttackDetector *self) {
     int i, ind;
     MYFLT absin;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = 0.0;
         absin = in[i];
@@ -2063,44 +2063,44 @@ AttackDetector_setProcMode(AttackDetector *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = AttackDetector_process;
- 
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = AttackDetector_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = AttackDetector_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = AttackDetector_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = AttackDetector_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = AttackDetector_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = AttackDetector_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = AttackDetector_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = AttackDetector_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = AttackDetector_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 AttackDetector_compute_next_data_frame(AttackDetector *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2113,7 +2113,7 @@ AttackDetector_traverse(AttackDetector *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 AttackDetector_clear(AttackDetector *self)
 {
     pyo_CLEAR
@@ -2138,7 +2138,7 @@ AttackDetector_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     AttackDetector *self;
     self = (AttackDetector *)type->tp_alloc(type, 0);
-    
+
     self->deltime = 0.005;
     self->cutoff = 10.0;
     self->maxthresh = 3.0;
@@ -2153,34 +2153,34 @@ AttackDetector_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->timer = 0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, AttackDetector_compute_next_data_frame);
     self->mode_func_ptr = AttackDetector_setProcMode;
 
     static char *kwlist[] = {"input", "deltime", "cutoff", "maxthresh", "minthresh", "reltime", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_FFFFFOO, kwlist, &inputtmp, &self->deltime, &self->cutoff, &self->maxthresh, &self->minthresh, &self->reltime, &multmp, &addtmp))
-        Py_RETURN_NONE; 
+        Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     self->memsize = (int)(0.055 * self->sr + 0.5);
     self->buffer = (MYFLT *)realloc(self->buffer, (self->memsize+1) * sizeof(MYFLT));
     for (i=0; i<(self->memsize+1); i++) {
         self->buffer[i] = 0.0;
-    }    
-       
+    }
+
     if (self->deltime < 0.001) self->deltime = 0.001;
     else if (self->deltime > 0.05) self->deltime = 0.05;
     self->sampdel = (int)(self->deltime * self->sr);
@@ -2208,10 +2208,10 @@ AttackDetector_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * AttackDetector_getServer(AttackDetector* self) { GET_SERVER };
 static PyObject * AttackDetector_getStream(AttackDetector* self) { GET_STREAM };
-static PyObject * AttackDetector_setMul(AttackDetector *self, PyObject *arg) { SET_MUL };	
-static PyObject * AttackDetector_setAdd(AttackDetector *self, PyObject *arg) { SET_ADD };	
-static PyObject * AttackDetector_setSub(AttackDetector *self, PyObject *arg) { SET_SUB };	
-static PyObject * AttackDetector_setDiv(AttackDetector *self, PyObject *arg) { SET_DIV };	
+static PyObject * AttackDetector_setMul(AttackDetector *self, PyObject *arg) { SET_MUL };
+static PyObject * AttackDetector_setAdd(AttackDetector *self, PyObject *arg) { SET_ADD };
+static PyObject * AttackDetector_setSub(AttackDetector *self, PyObject *arg) { SET_SUB };
+static PyObject * AttackDetector_setDiv(AttackDetector *self, PyObject *arg) { SET_DIV };
 
 static PyObject * AttackDetector_play(AttackDetector *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * AttackDetector_stop(AttackDetector *self) { STOP };
@@ -2232,16 +2232,16 @@ AttackDetector_setDeltime(AttackDetector *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->deltime = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
         if (self->deltime < 0.001) self->deltime = 0.001;
         else if (self->deltime > 0.05) self->deltime = 0.05;
         self->sampdel = (int)(self->deltime * self->sr);
 	}
-  
+
 	Py_RETURN_NONE;
 }
 
@@ -2252,16 +2252,16 @@ AttackDetector_setCutoff(AttackDetector *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->cutoff = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
         if (self->cutoff < 1.0) self->cutoff = 1.0;
         else if (self->cutoff > 1000.0) self->cutoff = 1000.0;
         self->folfactor = MYEXP(-TWOPI * self->cutoff / self->sr);
 	}
-  
+
 	Py_RETURN_NONE;
 }
 
@@ -2272,15 +2272,15 @@ AttackDetector_setMaxthresh(AttackDetector *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->maxthresh = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
         if (self->maxthresh < 0.0) self->maxthresh = 0.0;
         else if (self->maxthresh > 18.0) self->maxthresh = 18.0;
 	}
-  
+
 	Py_RETURN_NONE;
 }
 
@@ -2291,15 +2291,15 @@ AttackDetector_setMinthresh(AttackDetector *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->minthresh = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
         if (self->minthresh < -90.0) self->minthresh = -90.0;
         else if (self->minthresh > 0.0) self->minthresh = 0.0;
 	}
-  
+
 	Py_RETURN_NONE;
 }
 
@@ -2310,15 +2310,15 @@ AttackDetector_setReltime(AttackDetector *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->reltime = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
         if (self->reltime < 0.001) self->reltime = 0.001;
         self->maxtime = (long)(self->reltime * self->sr + 0.5);
 	}
-  
+
 	Py_RETURN_NONE;
 }
 
@@ -2464,7 +2464,7 @@ Scope_display(Scope *self) {
     int i, ipos;
     MYFLT pos, step, mag, h2;
     PyObject *points, *tuple;
-    
+
     step = self->size / (MYFLT)(self->width);
     h2 = self->height * 0.5;
 
@@ -2485,7 +2485,7 @@ Scope_display(Scope *self) {
 static void
 Scope_compute_next_data_frame(Scope *self)
 {
-    Scope_generate(self); 
+    Scope_generate(self);
 }
 
 static int
@@ -2497,7 +2497,7 @@ Scope_traverse(Scope *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Scope_clear(Scope *self)
 {
     pyo_CLEAR
@@ -2532,19 +2532,19 @@ Scope_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     Stream_setFunctionPtr(self->stream, Scope_compute_next_data_frame);
 
     static char *kwlist[] = {"input", "length", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_F, kwlist, &inputtmp, &length))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     maxsize = (int)(self->sr * 0.25);
-    self->buffer = (MYFLT *)realloc(self->buffer, maxsize * sizeof(MYFLT)); 
+    self->buffer = (MYFLT *)realloc(self->buffer, maxsize * sizeof(MYFLT));
     self->size = (int)(length * self->sr);
     if (self->size > maxsize)
         self->size = maxsize;
     self->pointer = 0;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     return (PyObject *)self;
@@ -2568,40 +2568,40 @@ Scope_setLength(Scope *self, PyObject *arg)
         if (self->size > maxsize)
             self->size = maxsize;
         self->pointer = 0;
-    }    
+    }
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Scope_setGain(Scope *self, PyObject *arg)
 {
     if (PyNumber_Check(arg)) {
         self->gain = PyFloat_AsDouble(PyNumber_Float(arg));
-    }    
+    }
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Scope_setWidth(Scope *self, PyObject *arg)
 {
     if (PyInt_Check(arg)) {
         self->width = PyInt_AsLong(arg);
-    }    
+    }
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Scope_setHeight(Scope *self, PyObject *arg)
 {
     if (PyInt_Check(arg)) {
         self->height = PyInt_AsLong(arg);
-    }    
+    }
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Scope_members[] = {
 {"server", T_OBJECT_EX, offsetof(Scope, server), 0, "Pyo server."},
@@ -2672,7 +2672,7 @@ typedef struct {
     pyo_audio_HEAD
     PyObject *input;
     Stream *input_stream;
-    int modebuffer[2]; // need at least 2 slots for mul & add 
+    int modebuffer[2]; // need at least 2 slots for mul & add
     MYFLT follow;
 } PeakAmp;
 
@@ -2682,7 +2682,7 @@ PeakAmp_filters_i(PeakAmp *self) {
     int i;
 
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     peak = 0.0;
     for (i=0; i<self->bufsize; i++) {
         absin = in[i];
@@ -2710,43 +2710,43 @@ PeakAmp_setProcMode(PeakAmp *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = PeakAmp_filters_i;
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = PeakAmp_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = PeakAmp_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = PeakAmp_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = PeakAmp_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = PeakAmp_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = PeakAmp_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = PeakAmp_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = PeakAmp_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = PeakAmp_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 PeakAmp_compute_next_data_frame(PeakAmp *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2759,7 +2759,7 @@ PeakAmp_traverse(PeakAmp *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 PeakAmp_clear(PeakAmp *self)
 {
     pyo_CLEAR
@@ -2783,32 +2783,32 @@ PeakAmp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     PeakAmp *self;
     self = (PeakAmp *)type->tp_alloc(type, 0);
-    
+
     self->follow = 0.0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, PeakAmp_compute_next_data_frame);
     self->mode_func_ptr = PeakAmp_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -2816,10 +2816,10 @@ PeakAmp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * PeakAmp_getServer(PeakAmp* self) { GET_SERVER };
 static PyObject * PeakAmp_getStream(PeakAmp* self) { GET_STREAM };
-static PyObject * PeakAmp_setMul(PeakAmp *self, PyObject *arg) { SET_MUL };	
-static PyObject * PeakAmp_setAdd(PeakAmp *self, PyObject *arg) { SET_ADD };	
-static PyObject * PeakAmp_setSub(PeakAmp *self, PyObject *arg) { SET_SUB };	
-static PyObject * PeakAmp_setDiv(PeakAmp *self, PyObject *arg) { SET_DIV };	
+static PyObject * PeakAmp_setMul(PeakAmp *self, PyObject *arg) { SET_MUL };
+static PyObject * PeakAmp_setAdd(PeakAmp *self, PyObject *arg) { SET_ADD };
+static PyObject * PeakAmp_setSub(PeakAmp *self, PyObject *arg) { SET_SUB };
+static PyObject * PeakAmp_setDiv(PeakAmp *self, PyObject *arg) { SET_DIV };
 
 static PyObject * PeakAmp_play(PeakAmp *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * PeakAmp_stop(PeakAmp *self) { STOP };
@@ -2943,4 +2943,4 @@ PeakAmp_members,                                 /* tp_members */
 0,                          /* tp_init */
 0,                                              /* tp_alloc */
 PeakAmp_new,                                     /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/arithmeticmodule.c b/src/objects/arithmeticmodule.c
index 79157db..6bfc398 100644
--- a/src/objects/arithmeticmodule.c
+++ b/src/objects/arithmeticmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -40,7 +40,7 @@ static void
 M_Sin_process(M_Sin *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = MYSIN(in[i]);
     }
@@ -61,44 +61,44 @@ M_Sin_setProcMode(M_Sin *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = M_Sin_process;
- 
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = M_Sin_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = M_Sin_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = M_Sin_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = M_Sin_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = M_Sin_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = M_Sin_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = M_Sin_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = M_Sin_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = M_Sin_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 M_Sin_compute_next_data_frame(M_Sin *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -111,7 +111,7 @@ M_Sin_traverse(M_Sin *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 M_Sin_clear(M_Sin *self)
 {
     pyo_CLEAR
@@ -138,28 +138,28 @@ M_Sin_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, M_Sin_compute_next_data_frame);
     self->mode_func_ptr = M_Sin_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -167,10 +167,10 @@ M_Sin_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * M_Sin_getServer(M_Sin* self) { GET_SERVER };
 static PyObject * M_Sin_getStream(M_Sin* self) { GET_STREAM };
-static PyObject * M_Sin_setMul(M_Sin *self, PyObject *arg) { SET_MUL };	
-static PyObject * M_Sin_setAdd(M_Sin *self, PyObject *arg) { SET_ADD };	
-static PyObject * M_Sin_setSub(M_Sin *self, PyObject *arg) { SET_SUB };	
-static PyObject * M_Sin_setDiv(M_Sin *self, PyObject *arg) { SET_DIV };	
+static PyObject * M_Sin_setMul(M_Sin *self, PyObject *arg) { SET_MUL };
+static PyObject * M_Sin_setAdd(M_Sin *self, PyObject *arg) { SET_ADD };
+static PyObject * M_Sin_setSub(M_Sin *self, PyObject *arg) { SET_SUB };
+static PyObject * M_Sin_setDiv(M_Sin *self, PyObject *arg) { SET_DIV };
 
 static PyObject * M_Sin_play(M_Sin *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * M_Sin_out(M_Sin *self, PyObject *args, PyObject *kwds) { OUT };
@@ -305,7 +305,7 @@ static void
 M_Cos_process(M_Cos *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = MYCOS(in[i]);
     }
@@ -326,44 +326,44 @@ M_Cos_setProcMode(M_Cos *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = M_Cos_process;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = M_Cos_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = M_Cos_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = M_Cos_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = M_Cos_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = M_Cos_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = M_Cos_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = M_Cos_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = M_Cos_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = M_Cos_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 M_Cos_compute_next_data_frame(M_Cos *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -376,7 +376,7 @@ M_Cos_traverse(M_Cos *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 M_Cos_clear(M_Cos *self)
 {
     pyo_CLEAR
@@ -400,31 +400,31 @@ M_Cos_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     M_Cos *self;
     self = (M_Cos *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, M_Cos_compute_next_data_frame);
     self->mode_func_ptr = M_Cos_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -432,10 +432,10 @@ M_Cos_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * M_Cos_getServer(M_Cos* self) { GET_SERVER };
 static PyObject * M_Cos_getStream(M_Cos* self) { GET_STREAM };
-static PyObject * M_Cos_setMul(M_Cos *self, PyObject *arg) { SET_MUL };	
-static PyObject * M_Cos_setAdd(M_Cos *self, PyObject *arg) { SET_ADD };	
-static PyObject * M_Cos_setSub(M_Cos *self, PyObject *arg) { SET_SUB };	
-static PyObject * M_Cos_setDiv(M_Cos *self, PyObject *arg) { SET_DIV };	
+static PyObject * M_Cos_setMul(M_Cos *self, PyObject *arg) { SET_MUL };
+static PyObject * M_Cos_setAdd(M_Cos *self, PyObject *arg) { SET_ADD };
+static PyObject * M_Cos_setSub(M_Cos *self, PyObject *arg) { SET_SUB };
+static PyObject * M_Cos_setDiv(M_Cos *self, PyObject *arg) { SET_DIV };
 
 static PyObject * M_Cos_play(M_Cos *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * M_Cos_out(M_Cos *self, PyObject *args, PyObject *kwds) { OUT };
@@ -570,7 +570,7 @@ static void
 M_Tan_process(M_Tan *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = MYTAN(in[i]);
     }
@@ -591,44 +591,44 @@ M_Tan_setProcMode(M_Tan *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = M_Tan_process;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = M_Tan_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = M_Tan_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = M_Tan_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = M_Tan_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = M_Tan_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = M_Tan_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = M_Tan_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = M_Tan_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = M_Tan_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 M_Tan_compute_next_data_frame(M_Tan *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -641,7 +641,7 @@ M_Tan_traverse(M_Tan *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 M_Tan_clear(M_Tan *self)
 {
     pyo_CLEAR
@@ -665,31 +665,31 @@ M_Tan_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     M_Tan *self;
     self = (M_Tan *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, M_Tan_compute_next_data_frame);
     self->mode_func_ptr = M_Tan_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -697,10 +697,10 @@ M_Tan_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * M_Tan_getServer(M_Tan* self) { GET_SERVER };
 static PyObject * M_Tan_getStream(M_Tan* self) { GET_STREAM };
-static PyObject * M_Tan_setMul(M_Tan *self, PyObject *arg) { SET_MUL };	
-static PyObject * M_Tan_setAdd(M_Tan *self, PyObject *arg) { SET_ADD };	
-static PyObject * M_Tan_setSub(M_Tan *self, PyObject *arg) { SET_SUB };	
-static PyObject * M_Tan_setDiv(M_Tan *self, PyObject *arg) { SET_DIV };	
+static PyObject * M_Tan_setMul(M_Tan *self, PyObject *arg) { SET_MUL };
+static PyObject * M_Tan_setAdd(M_Tan *self, PyObject *arg) { SET_ADD };
+static PyObject * M_Tan_setSub(M_Tan *self, PyObject *arg) { SET_SUB };
+static PyObject * M_Tan_setDiv(M_Tan *self, PyObject *arg) { SET_DIV };
 
 static PyObject * M_Tan_play(M_Tan *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * M_Tan_out(M_Tan *self, PyObject *args, PyObject *kwds) { OUT };
@@ -836,12 +836,12 @@ M_Abs_process(M_Abs *self) {
     int i;
     MYFLT inval;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
         if (inval < 0.0)
             self->data[i] = -inval;
-        else 
+        else
             self->data[i] = inval;
     }
 }
@@ -861,44 +861,44 @@ M_Abs_setProcMode(M_Abs *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = M_Abs_process;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = M_Abs_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = M_Abs_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = M_Abs_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = M_Abs_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = M_Abs_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = M_Abs_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = M_Abs_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = M_Abs_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = M_Abs_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 M_Abs_compute_next_data_frame(M_Abs *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -911,7 +911,7 @@ M_Abs_traverse(M_Abs *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 M_Abs_clear(M_Abs *self)
 {
     pyo_CLEAR
@@ -935,31 +935,31 @@ M_Abs_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     M_Abs *self;
     self = (M_Abs *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, M_Abs_compute_next_data_frame);
     self->mode_func_ptr = M_Abs_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -967,10 +967,10 @@ M_Abs_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * M_Abs_getServer(M_Abs* self) { GET_SERVER };
 static PyObject * M_Abs_getStream(M_Abs* self) { GET_STREAM };
-static PyObject * M_Abs_setMul(M_Abs *self, PyObject *arg) { SET_MUL };	
-static PyObject * M_Abs_setAdd(M_Abs *self, PyObject *arg) { SET_ADD };	
-static PyObject * M_Abs_setSub(M_Abs *self, PyObject *arg) { SET_SUB };	
-static PyObject * M_Abs_setDiv(M_Abs *self, PyObject *arg) { SET_DIV };	
+static PyObject * M_Abs_setMul(M_Abs *self, PyObject *arg) { SET_MUL };
+static PyObject * M_Abs_setAdd(M_Abs *self, PyObject *arg) { SET_ADD };
+static PyObject * M_Abs_setSub(M_Abs *self, PyObject *arg) { SET_SUB };
+static PyObject * M_Abs_setDiv(M_Abs *self, PyObject *arg) { SET_DIV };
 
 static PyObject * M_Abs_play(M_Abs *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * M_Abs_out(M_Abs *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1106,12 +1106,12 @@ M_Sqrt_process(M_Sqrt *self) {
     int i;
     MYFLT inval;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
         if (inval < 0.0)
             self->data[i] = 0.0;
-        else 
+        else
             self->data[i] = MYSQRT(inval);
     }
 }
@@ -1131,44 +1131,44 @@ M_Sqrt_setProcMode(M_Sqrt *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = M_Sqrt_process;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = M_Sqrt_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = M_Sqrt_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = M_Sqrt_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = M_Sqrt_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = M_Sqrt_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = M_Sqrt_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = M_Sqrt_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = M_Sqrt_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = M_Sqrt_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 M_Sqrt_compute_next_data_frame(M_Sqrt *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1181,7 +1181,7 @@ M_Sqrt_traverse(M_Sqrt *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 M_Sqrt_clear(M_Sqrt *self)
 {
     pyo_CLEAR
@@ -1205,31 +1205,31 @@ M_Sqrt_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     M_Sqrt *self;
     self = (M_Sqrt *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, M_Sqrt_compute_next_data_frame);
     self->mode_func_ptr = M_Sqrt_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -1237,10 +1237,10 @@ M_Sqrt_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * M_Sqrt_getServer(M_Sqrt* self) { GET_SERVER };
 static PyObject * M_Sqrt_getStream(M_Sqrt* self) { GET_STREAM };
-static PyObject * M_Sqrt_setMul(M_Sqrt *self, PyObject *arg) { SET_MUL };	
-static PyObject * M_Sqrt_setAdd(M_Sqrt *self, PyObject *arg) { SET_ADD };	
-static PyObject * M_Sqrt_setSub(M_Sqrt *self, PyObject *arg) { SET_SUB };	
-static PyObject * M_Sqrt_setDiv(M_Sqrt *self, PyObject *arg) { SET_DIV };	
+static PyObject * M_Sqrt_setMul(M_Sqrt *self, PyObject *arg) { SET_MUL };
+static PyObject * M_Sqrt_setAdd(M_Sqrt *self, PyObject *arg) { SET_ADD };
+static PyObject * M_Sqrt_setSub(M_Sqrt *self, PyObject *arg) { SET_SUB };
+static PyObject * M_Sqrt_setDiv(M_Sqrt *self, PyObject *arg) { SET_DIV };
 
 static PyObject * M_Sqrt_play(M_Sqrt *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * M_Sqrt_out(M_Sqrt *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1376,12 +1376,12 @@ M_Log_process(M_Log *self) {
     int i;
     MYFLT inval;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
         if (inval <= 0.0)
             self->data[i] = 0.0;
-        else 
+        else
             self->data[i] = MYLOG(inval);
     }
 }
@@ -1401,44 +1401,44 @@ M_Log_setProcMode(M_Log *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = M_Log_process;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = M_Log_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = M_Log_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = M_Log_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = M_Log_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = M_Log_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = M_Log_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = M_Log_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = M_Log_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = M_Log_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 M_Log_compute_next_data_frame(M_Log *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1451,7 +1451,7 @@ M_Log_traverse(M_Log *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 M_Log_clear(M_Log *self)
 {
     pyo_CLEAR
@@ -1475,31 +1475,31 @@ M_Log_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     M_Log *self;
     self = (M_Log *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, M_Log_compute_next_data_frame);
     self->mode_func_ptr = M_Log_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -1507,10 +1507,10 @@ M_Log_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * M_Log_getServer(M_Log* self) { GET_SERVER };
 static PyObject * M_Log_getStream(M_Log* self) { GET_STREAM };
-static PyObject * M_Log_setMul(M_Log *self, PyObject *arg) { SET_MUL };	
-static PyObject * M_Log_setAdd(M_Log *self, PyObject *arg) { SET_ADD };	
-static PyObject * M_Log_setSub(M_Log *self, PyObject *arg) { SET_SUB };	
-static PyObject * M_Log_setDiv(M_Log *self, PyObject *arg) { SET_DIV };	
+static PyObject * M_Log_setMul(M_Log *self, PyObject *arg) { SET_MUL };
+static PyObject * M_Log_setAdd(M_Log *self, PyObject *arg) { SET_ADD };
+static PyObject * M_Log_setSub(M_Log *self, PyObject *arg) { SET_SUB };
+static PyObject * M_Log_setDiv(M_Log *self, PyObject *arg) { SET_DIV };
 
 static PyObject * M_Log_play(M_Log *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * M_Log_out(M_Log *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1646,12 +1646,12 @@ M_Log10_process(M_Log10 *self) {
     int i;
     MYFLT inval;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
         if (inval <= 0.0)
             self->data[i] = 0.0;
-        else 
+        else
             self->data[i] = MYLOG10(inval);
     }
 }
@@ -1671,44 +1671,44 @@ M_Log10_setProcMode(M_Log10 *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = M_Log10_process;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = M_Log10_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = M_Log10_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = M_Log10_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = M_Log10_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = M_Log10_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = M_Log10_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = M_Log10_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = M_Log10_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = M_Log10_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 M_Log10_compute_next_data_frame(M_Log10 *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1721,7 +1721,7 @@ M_Log10_traverse(M_Log10 *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 M_Log10_clear(M_Log10 *self)
 {
     pyo_CLEAR
@@ -1745,31 +1745,31 @@ M_Log10_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     M_Log10 *self;
     self = (M_Log10 *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, M_Log10_compute_next_data_frame);
     self->mode_func_ptr = M_Log10_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -1777,10 +1777,10 @@ M_Log10_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * M_Log10_getServer(M_Log10* self) { GET_SERVER };
 static PyObject * M_Log10_getStream(M_Log10* self) { GET_STREAM };
-static PyObject * M_Log10_setMul(M_Log10 *self, PyObject *arg) { SET_MUL };	
-static PyObject * M_Log10_setAdd(M_Log10 *self, PyObject *arg) { SET_ADD };	
-static PyObject * M_Log10_setSub(M_Log10 *self, PyObject *arg) { SET_SUB };	
-static PyObject * M_Log10_setDiv(M_Log10 *self, PyObject *arg) { SET_DIV };	
+static PyObject * M_Log10_setMul(M_Log10 *self, PyObject *arg) { SET_MUL };
+static PyObject * M_Log10_setAdd(M_Log10 *self, PyObject *arg) { SET_ADD };
+static PyObject * M_Log10_setSub(M_Log10 *self, PyObject *arg) { SET_SUB };
+static PyObject * M_Log10_setDiv(M_Log10 *self, PyObject *arg) { SET_DIV };
 
 static PyObject * M_Log10_play(M_Log10 *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * M_Log10_out(M_Log10 *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1916,12 +1916,12 @@ M_Log2_process(M_Log2 *self) {
     int i;
     MYFLT inval;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
         if (inval <= 0.0)
             self->data[i] = 0.0;
-        else 
+        else
             self->data[i] = MYLOG2(inval);
     }
 }
@@ -1941,44 +1941,44 @@ M_Log2_setProcMode(M_Log2 *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = M_Log2_process;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = M_Log2_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = M_Log2_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = M_Log2_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = M_Log2_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = M_Log2_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = M_Log2_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = M_Log2_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = M_Log2_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = M_Log2_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 M_Log2_compute_next_data_frame(M_Log2 *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1991,7 +1991,7 @@ M_Log2_traverse(M_Log2 *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 M_Log2_clear(M_Log2 *self)
 {
     pyo_CLEAR
@@ -2015,31 +2015,31 @@ M_Log2_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     M_Log2 *self;
     self = (M_Log2 *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, M_Log2_compute_next_data_frame);
     self->mode_func_ptr = M_Log2_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -2047,10 +2047,10 @@ M_Log2_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * M_Log2_getServer(M_Log2* self) { GET_SERVER };
 static PyObject * M_Log2_getStream(M_Log2* self) { GET_STREAM };
-static PyObject * M_Log2_setMul(M_Log2 *self, PyObject *arg) { SET_MUL };	
-static PyObject * M_Log2_setAdd(M_Log2 *self, PyObject *arg) { SET_ADD };	
-static PyObject * M_Log2_setSub(M_Log2 *self, PyObject *arg) { SET_SUB };	
-static PyObject * M_Log2_setDiv(M_Log2 *self, PyObject *arg) { SET_DIV };	
+static PyObject * M_Log2_setMul(M_Log2 *self, PyObject *arg) { SET_MUL };
+static PyObject * M_Log2_setAdd(M_Log2 *self, PyObject *arg) { SET_ADD };
+static PyObject * M_Log2_setSub(M_Log2 *self, PyObject *arg) { SET_SUB };
+static PyObject * M_Log2_setDiv(M_Log2 *self, PyObject *arg) { SET_DIV };
 
 static PyObject * M_Log2_play(M_Log2 *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * M_Log2_out(M_Log2 *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2186,10 +2186,10 @@ typedef struct {
 static void
 M_Pow_readframes_ii(M_Pow *self) {
     int i;
-    
+
     MYFLT base = PyFloat_AS_DOUBLE(self->base);
     MYFLT exp = PyFloat_AS_DOUBLE(self->exponent);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = MYPOW(base, exp);
     }
@@ -2198,10 +2198,10 @@ M_Pow_readframes_ii(M_Pow *self) {
 static void
 M_Pow_readframes_ai(M_Pow *self) {
     int i;
-    
+
     MYFLT *base = Stream_getData((Stream *)self->base_stream);
     MYFLT exp = PyFloat_AS_DOUBLE(self->exponent);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = MYPOW(base[i], exp);
     }
@@ -2210,10 +2210,10 @@ M_Pow_readframes_ai(M_Pow *self) {
 static void
 M_Pow_readframes_ia(M_Pow *self) {
     int i;
-    
+
     MYFLT base = PyFloat_AS_DOUBLE(self->base);
     MYFLT *exp = Stream_getData((Stream *)self->exponent_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = MYPOW(base, exp[i]);
     }
@@ -2222,10 +2222,10 @@ M_Pow_readframes_ia(M_Pow *self) {
 static void
 M_Pow_readframes_aa(M_Pow *self) {
     int i;
-    
+
     MYFLT *base = Stream_getData((Stream *)self->base_stream);
     MYFLT *exp = Stream_getData((Stream *)self->exponent_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = MYPOW(base[i], exp[i]);
     }
@@ -2247,56 +2247,56 @@ M_Pow_setProcMode(M_Pow *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = M_Pow_readframes_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = M_Pow_readframes_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = M_Pow_readframes_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = M_Pow_readframes_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = M_Pow_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = M_Pow_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = M_Pow_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = M_Pow_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = M_Pow_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = M_Pow_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = M_Pow_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = M_Pow_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = M_Pow_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 M_Pow_compute_next_data_frame(M_Pow *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2304,21 +2304,21 @@ static int
 M_Pow_traverse(M_Pow *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->exponent);    
-    Py_VISIT(self->exponent_stream);    
-    Py_VISIT(self->base);    
-    Py_VISIT(self->base_stream);    
+    Py_VISIT(self->exponent);
+    Py_VISIT(self->exponent_stream);
+    Py_VISIT(self->base);
+    Py_VISIT(self->base_stream);
     return 0;
 }
 
-static int 
+static int
 M_Pow_clear(M_Pow *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->exponent);    
-    Py_CLEAR(self->exponent_stream);    
-    Py_CLEAR(self->base);    
-    Py_CLEAR(self->base_stream);    
+    Py_CLEAR(self->exponent);
+    Py_CLEAR(self->exponent_stream);
+    Py_CLEAR(self->base);
+    Py_CLEAR(self->base_stream);
     return 0;
 }
 
@@ -2337,41 +2337,41 @@ M_Pow_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *basetmp=NULL, *exponenttmp=NULL, *multmp=NULL, *addtmp=NULL;
     M_Pow *self;
     self = (M_Pow *)type->tp_alloc(type, 0);
-    
+
     self->base = PyFloat_FromDouble(10);
     self->exponent = PyFloat_FromDouble(1);
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, M_Pow_compute_next_data_frame);
     self->mode_func_ptr = M_Pow_setProcMode;
-    
+
     static char *kwlist[] = {"base", "exponent", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOOO", kwlist, &basetmp, &exponenttmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (basetmp) {
         PyObject_CallMethod((PyObject *)self, "setBase", "O", basetmp);
     }
-    
+
     if (exponenttmp) {
         PyObject_CallMethod((PyObject *)self, "setExponent", "O", exponenttmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -2379,10 +2379,10 @@ M_Pow_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * M_Pow_getServer(M_Pow* self) { GET_SERVER };
 static PyObject * M_Pow_getStream(M_Pow* self) { GET_STREAM };
-static PyObject * M_Pow_setMul(M_Pow *self, PyObject *arg) { SET_MUL };	
-static PyObject * M_Pow_setAdd(M_Pow *self, PyObject *arg) { SET_ADD };	
-static PyObject * M_Pow_setSub(M_Pow *self, PyObject *arg) { SET_SUB };	
-static PyObject * M_Pow_setDiv(M_Pow *self, PyObject *arg) { SET_DIV };	
+static PyObject * M_Pow_setMul(M_Pow *self, PyObject *arg) { SET_MUL };
+static PyObject * M_Pow_setAdd(M_Pow *self, PyObject *arg) { SET_ADD };
+static PyObject * M_Pow_setSub(M_Pow *self, PyObject *arg) { SET_SUB };
+static PyObject * M_Pow_setDiv(M_Pow *self, PyObject *arg) { SET_DIV };
 
 static PyObject * M_Pow_play(M_Pow *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * M_Pow_out(M_Pow *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2401,14 +2401,14 @@ static PyObject *
 M_Pow_setBase(M_Pow *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->base);
@@ -2424,25 +2424,25 @@ M_Pow_setBase(M_Pow *self, PyObject *arg)
         self->base_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 M_Pow_setExponent(M_Pow *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->exponent);
@@ -2458,12 +2458,12 @@ M_Pow_setExponent(M_Pow *self, PyObject *arg)
         self->exponent_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef M_Pow_members[] = {
     {"server", T_OBJECT_EX, offsetof(M_Pow, server), 0, "Pyo server."},
@@ -2589,10 +2589,10 @@ typedef struct {
 static void
 M_Atan2_readframes_ii(M_Atan2 *self) {
     int i;
-    
+
     MYFLT b = PyFloat_AS_DOUBLE(self->b);
     MYFLT a = PyFloat_AS_DOUBLE(self->a);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = MYATAN2(b, a);
     }
@@ -2601,10 +2601,10 @@ M_Atan2_readframes_ii(M_Atan2 *self) {
 static void
 M_Atan2_readframes_ai(M_Atan2 *self) {
     int i;
-    
+
     MYFLT *b = Stream_getData((Stream *)self->b_stream);
     MYFLT a = PyFloat_AS_DOUBLE(self->a);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = MYATAN2(b[i], a);
     }
@@ -2613,10 +2613,10 @@ M_Atan2_readframes_ai(M_Atan2 *self) {
 static void
 M_Atan2_readframes_ia(M_Atan2 *self) {
     int i;
-    
+
     MYFLT b = PyFloat_AS_DOUBLE(self->b);
     MYFLT *a = Stream_getData((Stream *)self->a_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = MYATAN2(b, a[i]);
     }
@@ -2625,10 +2625,10 @@ M_Atan2_readframes_ia(M_Atan2 *self) {
 static void
 M_Atan2_readframes_aa(M_Atan2 *self) {
     int i;
-    
+
     MYFLT *b = Stream_getData((Stream *)self->b_stream);
     MYFLT *a = Stream_getData((Stream *)self->a_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = MYATAN2(b[i], a[i]);
     }
@@ -2650,56 +2650,56 @@ M_Atan2_setProcMode(M_Atan2 *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = M_Atan2_readframes_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = M_Atan2_readframes_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = M_Atan2_readframes_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = M_Atan2_readframes_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = M_Atan2_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = M_Atan2_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = M_Atan2_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = M_Atan2_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = M_Atan2_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = M_Atan2_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = M_Atan2_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = M_Atan2_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = M_Atan2_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 M_Atan2_compute_next_data_frame(M_Atan2 *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2707,21 +2707,21 @@ static int
 M_Atan2_traverse(M_Atan2 *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->b);    
-    Py_VISIT(self->b_stream);    
-    Py_VISIT(self->a);    
-    Py_VISIT(self->a_stream);    
+    Py_VISIT(self->b);
+    Py_VISIT(self->b_stream);
+    Py_VISIT(self->a);
+    Py_VISIT(self->a_stream);
     return 0;
 }
 
-static int 
+static int
 M_Atan2_clear(M_Atan2 *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->b);    
-    Py_CLEAR(self->b_stream);    
-    Py_CLEAR(self->a);    
-    Py_CLEAR(self->a_stream);    
+    Py_CLEAR(self->b);
+    Py_CLEAR(self->b_stream);
+    Py_CLEAR(self->a);
+    Py_CLEAR(self->a_stream);
     return 0;
 }
 
@@ -2740,52 +2740,52 @@ M_Atan2_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *btmp=NULL, *atmp=NULL, *multmp=NULL, *addtmp=NULL;
     M_Atan2 *self;
     self = (M_Atan2 *)type->tp_alloc(type, 0);
-    
+
     self->a = PyFloat_FromDouble(1);
     self->b = PyFloat_FromDouble(1);
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, M_Atan2_compute_next_data_frame);
     self->mode_func_ptr = M_Atan2_setProcMode;
 
     static char *kwlist[] = {"b", "a", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOOO", kwlist, &btmp, &atmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (btmp) {
         PyObject_CallMethod((PyObject *)self, "setB", "O", btmp);
     }
-    
+
     if (atmp) {
         PyObject_CallMethod((PyObject *)self, "setA", "O", atmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * M_Atan2_getServer(M_Atan2* self) { GET_SERVER };
 static PyObject * M_Atan2_getStream(M_Atan2* self) { GET_STREAM };
-static PyObject * M_Atan2_setMul(M_Atan2 *self, PyObject *arg) { SET_MUL };	
-static PyObject * M_Atan2_setAdd(M_Atan2 *self, PyObject *arg) { SET_ADD };	
-static PyObject * M_Atan2_setSub(M_Atan2 *self, PyObject *arg) { SET_SUB };	
-static PyObject * M_Atan2_setDiv(M_Atan2 *self, PyObject *arg) { SET_DIV };	
+static PyObject * M_Atan2_setMul(M_Atan2 *self, PyObject *arg) { SET_MUL };
+static PyObject * M_Atan2_setAdd(M_Atan2 *self, PyObject *arg) { SET_ADD };
+static PyObject * M_Atan2_setSub(M_Atan2 *self, PyObject *arg) { SET_SUB };
+static PyObject * M_Atan2_setDiv(M_Atan2 *self, PyObject *arg) { SET_DIV };
 
 static PyObject * M_Atan2_play(M_Atan2 *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * M_Atan2_out(M_Atan2 *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2804,14 +2804,14 @@ static PyObject *
 M_Atan2_setB(M_Atan2 *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->b);
@@ -2827,25 +2827,25 @@ M_Atan2_setB(M_Atan2 *self, PyObject *arg)
         self->b_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 M_Atan2_setA(M_Atan2 *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->a);
@@ -2861,12 +2861,12 @@ M_Atan2_setA(M_Atan2 *self, PyObject *arg)
         self->a_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef M_Atan2_members[] = {
     {"server", T_OBJECT_EX, offsetof(M_Atan2, server), 0, "Pyo server."},
@@ -2991,7 +2991,7 @@ static void
 M_Floor_process(M_Floor *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = MYFLOOR(in[i]);
     }
@@ -3012,44 +3012,44 @@ M_Floor_setProcMode(M_Floor *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = M_Floor_process;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = M_Floor_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = M_Floor_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = M_Floor_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = M_Floor_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = M_Floor_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = M_Floor_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = M_Floor_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = M_Floor_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = M_Floor_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 M_Floor_compute_next_data_frame(M_Floor *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3062,7 +3062,7 @@ M_Floor_traverse(M_Floor *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 M_Floor_clear(M_Floor *self)
 {
     pyo_CLEAR
@@ -3086,31 +3086,31 @@ M_Floor_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     M_Floor *self;
     self = (M_Floor *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, M_Floor_compute_next_data_frame);
     self->mode_func_ptr = M_Floor_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -3118,10 +3118,10 @@ M_Floor_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * M_Floor_getServer(M_Floor* self) { GET_SERVER };
 static PyObject * M_Floor_getStream(M_Floor* self) { GET_STREAM };
-static PyObject * M_Floor_setMul(M_Floor *self, PyObject *arg) { SET_MUL };	
-static PyObject * M_Floor_setAdd(M_Floor *self, PyObject *arg) { SET_ADD };	
-static PyObject * M_Floor_setSub(M_Floor *self, PyObject *arg) { SET_SUB };	
-static PyObject * M_Floor_setDiv(M_Floor *self, PyObject *arg) { SET_DIV };	
+static PyObject * M_Floor_setMul(M_Floor *self, PyObject *arg) { SET_MUL };
+static PyObject * M_Floor_setAdd(M_Floor *self, PyObject *arg) { SET_ADD };
+static PyObject * M_Floor_setSub(M_Floor *self, PyObject *arg) { SET_SUB };
+static PyObject * M_Floor_setDiv(M_Floor *self, PyObject *arg) { SET_DIV };
 
 static PyObject * M_Floor_play(M_Floor *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * M_Floor_out(M_Floor *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3256,7 +3256,7 @@ static void
 M_Ceil_process(M_Ceil *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = MYCEIL(in[i]);
     }
@@ -3277,44 +3277,44 @@ M_Ceil_setProcMode(M_Ceil *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = M_Ceil_process;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = M_Ceil_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = M_Ceil_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = M_Ceil_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = M_Ceil_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = M_Ceil_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = M_Ceil_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = M_Ceil_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = M_Ceil_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = M_Ceil_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 M_Ceil_compute_next_data_frame(M_Ceil *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3327,7 +3327,7 @@ M_Ceil_traverse(M_Ceil *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 M_Ceil_clear(M_Ceil *self)
 {
     pyo_CLEAR
@@ -3351,31 +3351,31 @@ M_Ceil_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     M_Ceil *self;
     self = (M_Ceil *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, M_Ceil_compute_next_data_frame);
     self->mode_func_ptr = M_Ceil_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -3383,10 +3383,10 @@ M_Ceil_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * M_Ceil_getServer(M_Ceil* self) { GET_SERVER };
 static PyObject * M_Ceil_getStream(M_Ceil* self) { GET_STREAM };
-static PyObject * M_Ceil_setMul(M_Ceil *self, PyObject *arg) { SET_MUL };	
-static PyObject * M_Ceil_setAdd(M_Ceil *self, PyObject *arg) { SET_ADD };	
-static PyObject * M_Ceil_setSub(M_Ceil *self, PyObject *arg) { SET_SUB };	
-static PyObject * M_Ceil_setDiv(M_Ceil *self, PyObject *arg) { SET_DIV };	
+static PyObject * M_Ceil_setMul(M_Ceil *self, PyObject *arg) { SET_MUL };
+static PyObject * M_Ceil_setAdd(M_Ceil *self, PyObject *arg) { SET_ADD };
+static PyObject * M_Ceil_setSub(M_Ceil *self, PyObject *arg) { SET_SUB };
+static PyObject * M_Ceil_setDiv(M_Ceil *self, PyObject *arg) { SET_DIV };
 
 static PyObject * M_Ceil_play(M_Ceil *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * M_Ceil_out(M_Ceil *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3521,7 +3521,7 @@ static void
 M_Round_process(M_Round *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = MYROUND(in[i]);
     }
@@ -3542,44 +3542,44 @@ M_Round_setProcMode(M_Round *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = M_Round_process;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = M_Round_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = M_Round_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = M_Round_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = M_Round_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = M_Round_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = M_Round_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = M_Round_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = M_Round_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = M_Round_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 M_Round_compute_next_data_frame(M_Round *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3592,7 +3592,7 @@ M_Round_traverse(M_Round *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 M_Round_clear(M_Round *self)
 {
     pyo_CLEAR
@@ -3616,31 +3616,31 @@ M_Round_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     M_Round *self;
     self = (M_Round *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, M_Round_compute_next_data_frame);
     self->mode_func_ptr = M_Round_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -3648,10 +3648,10 @@ M_Round_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * M_Round_getServer(M_Round* self) { GET_SERVER };
 static PyObject * M_Round_getStream(M_Round* self) { GET_STREAM };
-static PyObject * M_Round_setMul(M_Round *self, PyObject *arg) { SET_MUL };	
-static PyObject * M_Round_setAdd(M_Round *self, PyObject *arg) { SET_ADD };	
-static PyObject * M_Round_setSub(M_Round *self, PyObject *arg) { SET_SUB };	
-static PyObject * M_Round_setDiv(M_Round *self, PyObject *arg) { SET_DIV };	
+static PyObject * M_Round_setMul(M_Round *self, PyObject *arg) { SET_MUL };
+static PyObject * M_Round_setAdd(M_Round *self, PyObject *arg) { SET_ADD };
+static PyObject * M_Round_setSub(M_Round *self, PyObject *arg) { SET_SUB };
+static PyObject * M_Round_setDiv(M_Round *self, PyObject *arg) { SET_DIV };
 
 static PyObject * M_Round_play(M_Round *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * M_Round_out(M_Round *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3786,7 +3786,7 @@ static void
 M_Tanh_process(M_Tanh *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = MYTANH(in[i]);
     }
@@ -3807,44 +3807,44 @@ M_Tanh_setProcMode(M_Tanh *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = M_Tanh_process;
- 
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = M_Tanh_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = M_Tanh_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = M_Tanh_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = M_Tanh_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = M_Tanh_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = M_Tanh_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = M_Tanh_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = M_Tanh_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = M_Tanh_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 M_Tanh_compute_next_data_frame(M_Tanh *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3857,7 +3857,7 @@ M_Tanh_traverse(M_Tanh *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 M_Tanh_clear(M_Tanh *self)
 {
     pyo_CLEAR
@@ -3884,28 +3884,28 @@ M_Tanh_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, M_Tanh_compute_next_data_frame);
     self->mode_func_ptr = M_Tanh_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -3913,10 +3913,10 @@ M_Tanh_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * M_Tanh_getServer(M_Tanh* self) { GET_SERVER };
 static PyObject * M_Tanh_getStream(M_Tanh* self) { GET_STREAM };
-static PyObject * M_Tanh_setMul(M_Tanh *self, PyObject *arg) { SET_MUL };	
-static PyObject * M_Tanh_setAdd(M_Tanh *self, PyObject *arg) { SET_ADD };	
-static PyObject * M_Tanh_setSub(M_Tanh *self, PyObject *arg) { SET_SUB };	
-static PyObject * M_Tanh_setDiv(M_Tanh *self, PyObject *arg) { SET_DIV };	
+static PyObject * M_Tanh_setMul(M_Tanh *self, PyObject *arg) { SET_MUL };
+static PyObject * M_Tanh_setAdd(M_Tanh *self, PyObject *arg) { SET_ADD };
+static PyObject * M_Tanh_setSub(M_Tanh *self, PyObject *arg) { SET_SUB };
+static PyObject * M_Tanh_setDiv(M_Tanh *self, PyObject *arg) { SET_DIV };
 
 static PyObject * M_Tanh_play(M_Tanh *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * M_Tanh_out(M_Tanh *self, PyObject *args, PyObject *kwds) { OUT };
@@ -4035,4 +4035,4 @@ M_Tanh_members,                                 /* tp_members */
 0,                          /* tp_init */
 0,                                              /* tp_alloc */
 M_Tanh_new,                                     /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/bandsplitmodule.c b/src/objects/bandsplitmodule.c
index a48e717..304de37 100644
--- a/src/objects/bandsplitmodule.c
+++ b/src/objects/bandsplitmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -57,26 +57,26 @@ typedef struct {
 
 static void
 BandSplitter_compute_variables(BandSplitter *self, MYFLT q)
-{    
+{
     int i;
     MYFLT freq;
     for (i=0; i<self->bands; i++) {
         freq = self->band_freqs[i];
-        if (freq <= 1) 
+        if (freq <= 1)
             freq = 1;
         else if (freq >= self->halfSr)
             freq = self->halfSr;
-    
+
         MYFLT w0 = self->TwoPiOnSr * freq;
         MYFLT c = MYCOS(w0);
         MYFLT alpha = MYSIN(w0) / (2 * q);
-    
+
         self->b0[i] = alpha;
         self->b2[i] = -alpha;
         self->a0[i] = 1 + alpha;
         self->a1[i] = -2 * c;
         self->a2[i] = 1 - alpha;
-    }    
+    }
 }
 
 static void
@@ -84,7 +84,7 @@ BandSplitter_setFrequencies(BandSplitter *self)
 {
     int i;
     MYFLT frac = 1. / self->bands;
-    for (i=0; i<self->bands; i++) {        
+    for (i=0; i<self->bands; i++) {
         self->band_freqs[i] = MYPOW(MYPOW(self->max_freq/self->min_freq, frac), i) * self->min_freq;
     }
 }
@@ -94,23 +94,23 @@ BandSplitter_filters_i(BandSplitter *self) {
     MYFLT val;
     int j, i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         for (j=0; j<self->bands; j++) {
             self->x1[j] = self->x2[j] = self->y1[j] = self->y2[j] = in[0];
-        }    
+        }
         self->init = 0;
     }
-    
+
     for (j=0; j<self->bands; j++) {
-        for (i=0; i<self->bufsize; i++) {        
+        for (i=0; i<self->bufsize; i++) {
             val = ( (self->b0[j] * in[i]) + (self->b2[j] * self->x2[j]) - (self->a1[j] * self->y1[j]) - (self->a2[j] * self->y2[j]) ) / self->a0[j];
             self->y2[j] = self->y1[j];
             self->y1[j] = val;
             self->x2[j] = self->x1[j];
             self->x1[j] = in[i];
             self->buffer_streams[i + j * self->bufsize] = val;
-        }    
+        }
     }
 }
 
@@ -119,11 +119,11 @@ BandSplitter_filters_a(BandSplitter *self) {
     MYFLT val;
     int j, i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         for (j=0; j<self->bands; j++) {
             self->x1[j] = self->x2[j] = self->y1[j] = self->y2[j] = in[0];
-        }    
+        }
         self->init = 0;
     }
 
@@ -138,7 +138,7 @@ BandSplitter_filters_a(BandSplitter *self) {
             self->x2[j] = self->x1[j];
             self->x1[j] = in[i];
             self->buffer_streams[i + j * self->bufsize] = val;
-        }    
+        }
     }
 }
 
@@ -146,28 +146,28 @@ MYFLT *
 BandSplitter_getSamplesBuffer(BandSplitter *self)
 {
     return (MYFLT *)self->buffer_streams;
-}    
+}
 
 static void
 BandSplitter_setProcMode(BandSplitter *self)
 {
     int procmode;
     procmode = self->modebuffer[0];
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = BandSplitter_filters_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = BandSplitter_filters_a;
             break;
-    }    
+    }
 }
 
 static void
 BandSplitter_compute_next_data_frame(BandSplitter *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -181,7 +181,7 @@ BandSplitter_traverse(BandSplitter *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 BandSplitter_clear(BandSplitter *self)
 {
     pyo_CLEAR
@@ -223,23 +223,23 @@ BandSplitter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->bands = 4;
     self->q = PyFloat_FromDouble(1.);
     self->init = 1;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, BandSplitter_compute_next_data_frame);
     self->mode_func_ptr = BandSplitter_setProcMode;
-    
+
     self->halfSr = self->sr / 2.;
     self->TwoPiOnSr = TWOPI / self->sr;
 
     static char *kwlist[] = {"input", "bands", "min", "max", "q", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_IFFO, kwlist, &inputtmp, &self->bands, &self->min_freq, &self->max_freq, &qtmp))
         Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->band_freqs = (MYFLT *)realloc(self->band_freqs, self->bands * sizeof(MYFLT));
     self->x1 = (MYFLT *)realloc(self->x1, self->bands * sizeof(MYFLT));
     self->x2 = (MYFLT *)realloc(self->x2, self->bands * sizeof(MYFLT));
@@ -270,14 +270,14 @@ static PyObject *
 BandSplitter_setQ(BandSplitter *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->q);
@@ -299,7 +299,7 @@ BandSplitter_setQ(BandSplitter *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject * BandSplitter_getServer(BandSplitter* self) { GET_SERVER };
 static PyObject * BandSplitter_getStream(BandSplitter* self) { GET_STREAM };
@@ -373,7 +373,7 @@ typedef struct {
     pyo_audio_HEAD
     BandSplitter *mainSplitter;
     int modebuffer[2];
-    int chnl; 
+    int chnl;
 } BandSplit;
 
 static void BandSplit_postprocessing_ii(BandSplit *self) { POST_PROCESSING_II };
@@ -391,33 +391,33 @@ BandSplit_setProcMode(BandSplit *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = BandSplit_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = BandSplit_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = BandSplit_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = BandSplit_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = BandSplit_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = BandSplit_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = BandSplit_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = BandSplit_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = BandSplit_postprocessing_revareva;
             break;
     }
@@ -432,7 +432,7 @@ BandSplit_compute_next_data_frame(BandSplit *self)
     tmp = BandSplitter_getSamplesBuffer((BandSplitter *)self->mainSplitter);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -444,11 +444,11 @@ BandSplit_traverse(BandSplit *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 BandSplit_clear(BandSplit *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainSplitter);    
+    Py_CLEAR(self->mainSplitter);
     return 0;
 }
 
@@ -467,45 +467,45 @@ BandSplit_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL, *multmp=NULL, *addtmp=NULL;
     BandSplit *self;
     self = (BandSplit *)type->tp_alloc(type, 0);
-    
+
     self->chnl = 0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, BandSplit_compute_next_data_frame);
     self->mode_func_ptr = BandSplit_setProcMode;
 
     static char *kwlist[] = {"mainSplitter", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iOO", kwlist, &maintmp, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainSplitter);
     Py_INCREF(maintmp);
     self->mainSplitter = (BandSplitter *)maintmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * BandSplit_getServer(BandSplit* self) { GET_SERVER };
 static PyObject * BandSplit_getStream(BandSplit* self) { GET_STREAM };
-static PyObject * BandSplit_setMul(BandSplit *self, PyObject *arg) { SET_MUL };	
-static PyObject * BandSplit_setAdd(BandSplit *self, PyObject *arg) { SET_ADD };	
-static PyObject * BandSplit_setSub(BandSplit *self, PyObject *arg) { SET_SUB };	
-static PyObject * BandSplit_setDiv(BandSplit *self, PyObject *arg) { SET_DIV };	
+static PyObject * BandSplit_setMul(BandSplit *self, PyObject *arg) { SET_MUL };
+static PyObject * BandSplit_setAdd(BandSplit *self, PyObject *arg) { SET_ADD };
+static PyObject * BandSplit_setSub(BandSplit *self, PyObject *arg) { SET_SUB };
+static PyObject * BandSplit_setDiv(BandSplit *self, PyObject *arg) { SET_DIV };
 
 static PyObject * BandSplit_play(BandSplit *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * BandSplit_out(BandSplit *self, PyObject *args, PyObject *kwds) { OUT };
@@ -668,7 +668,7 @@ typedef struct {
 
 static void
 FourBandMain_compute_variables(FourBandMain *self, double freq, int band)
-{    
+{
     double wc = TWOPI * freq;
     double wc2 = wc * wc;
     double wc3 = wc2 * wc;
@@ -683,31 +683,31 @@ FourBandMain_compute_variables(FourBandMain *self, double freq, int band)
     double a_tmp = 4.0 * wc2 * k2 + 2.0 * sq_tmp1 + k4 + 2.0 * sq_tmp2 + wc4;
     double wc4_a_tmp = wc4 / a_tmp;
     double k4_a_tmp = k4 / a_tmp;
-    
+
     /* common */
     self->b1[band] = (4.0 * (wc4 + sq_tmp1 - k4 - sq_tmp2)) / a_tmp;
     self->b2[band] = (6.0 * wc4 - 8.0 * wc2 * k2 + 6.0 * k4) / a_tmp;
     self->b3[band] = (4.0 * (wc4 - sq_tmp1 + sq_tmp2 - k4)) / a_tmp;
     self->b4[band] = (k4 - 2.0 * sq_tmp1 + wc4 - 2.0 * sq_tmp2 + 4.0 * wc2 * k2) / a_tmp;
-    
+
     /* lowpass */
     self->la0[band] = wc4_a_tmp;
     self->la1[band] = 4.0 * wc4_a_tmp;
     self->la2[band] = 6.0 * wc4_a_tmp;
-    
+
     /* highpass */
     self->ha0[band] = k4_a_tmp;
     self->ha1[band] = -4.0 * k4_a_tmp;
-    self->ha2[band] = 6.0 * k4_a_tmp;    
+    self->ha2[band] = 6.0 * k4_a_tmp;
 }
 
 static void
 FourBandMain_filters(FourBandMain *self) {
     double val, inval, tmp, f1, f2, f3;
     int i, j, j1, ind, ind1;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->modebuffer[0] == 0)
         f1 = PyFloat_AS_DOUBLE(self->freq1);
     else
@@ -720,7 +720,7 @@ FourBandMain_filters(FourBandMain *self) {
         f3 = PyFloat_AS_DOUBLE(self->freq3);
     else
         f3 = (double)Stream_getData((Stream *)self->freq3_stream)[0];
-    
+
     if (f1 != self->last_freq1) {
         self->last_freq1 = f1;
         FourBandMain_compute_variables(self, f1, 0);
@@ -735,12 +735,12 @@ FourBandMain_filters(FourBandMain *self) {
         self->last_freq3 = f3;
         FourBandMain_compute_variables(self, f3, 2);
     }
-    
-    
-    for (i=0; i<self->bufsize; i++) {   
+
+
+    for (i=0; i<self->bufsize; i++) {
         inval = (double)in[i];
         /* First band */
-        val = self->la0[0] * inval + self->la1[0] * self->x1[0] + self->la2[0] * self->x2[0] + self->la1[0] * self->x3[0] + self->la0[0] * self->x4[0] - 
+        val = self->la0[0] * inval + self->la1[0] * self->x1[0] + self->la2[0] * self->x2[0] + self->la1[0] * self->x3[0] + self->la0[0] * self->x4[0] -
               self->b1[0] * self->y1[0] - self->b2[0] * self->y2[0] - self->b3[0] * self->y3[0] - self->b4[0] * self->y4[0];
         self->y4[0] = self->y3[0];
         self->y3[0] = self->y2[0];
@@ -751,13 +751,13 @@ FourBandMain_filters(FourBandMain *self) {
         self->x2[0] = self->x1[0];
         self->x1[0] = inval;
         self->buffer_streams[i] = (MYFLT)val;
-        
+
         /* Second and third bands */
         for (j=0; j<2; j++) {
             j1 = j + 1;
             ind = j * 2 + 1;
             ind1 = ind + 1;
-            tmp = self->ha0[j] * inval + self->ha1[j] * self->x1[ind] + self->ha2[j] * self->x2[ind] + self->ha1[j] * self->x3[ind] + self->ha0[j] * self->x4[ind] - 
+            tmp = self->ha0[j] * inval + self->ha1[j] * self->x1[ind] + self->ha2[j] * self->x2[ind] + self->ha1[j] * self->x3[ind] + self->ha0[j] * self->x4[ind] -
                   self->b1[j] * self->y1[ind] - self->b2[j] * self->y2[ind] - self->b3[j] * self->y3[ind] - self->b4[j] * self->y4[ind];
             self->y4[ind] = self->y3[ind];
             self->y3[ind] = self->y2[ind];
@@ -767,8 +767,8 @@ FourBandMain_filters(FourBandMain *self) {
             self->x3[ind] = self->x2[ind];
             self->x2[ind] = self->x1[ind];
             self->x1[ind] = inval;
-            
-            val = self->la0[j1] * tmp + self->la1[j1] * self->x1[ind1] + self->la2[j1] * self->x2[ind1] + self->la1[j1] * self->x3[ind1] + self->la0[j1] * self->x4[ind1] - 
+
+            val = self->la0[j1] * tmp + self->la1[j1] * self->x1[ind1] + self->la2[j1] * self->x2[ind1] + self->la1[j1] * self->x3[ind1] + self->la0[j1] * self->x4[ind1] -
                   self->b1[j1] * self->y1[ind1] - self->b2[j1] * self->y2[ind1] - self->b3[j1] * self->y3[ind1] - self->b4[j1] * self->y4[ind1];
             self->y4[ind1] = self->y3[ind1];
             self->y3[ind1] = self->y2[ind1];
@@ -778,11 +778,11 @@ FourBandMain_filters(FourBandMain *self) {
             self->x3[ind1] = self->x2[ind1];
             self->x2[ind1] = self->x1[ind1];
             self->x1[ind1] = tmp;
-            
-            self->buffer_streams[i + j1 * self->bufsize] = (MYFLT)val;            
+
+            self->buffer_streams[i + j1 * self->bufsize] = (MYFLT)val;
         }
 
-        val = self->ha0[2] * inval + self->ha1[2] * self->x1[5] + self->ha2[2] * self->x2[5] + self->ha1[2] * self->x3[5] + self->ha0[2] * self->x4[5] - 
+        val = self->ha0[2] * inval + self->ha1[2] * self->x1[5] + self->ha2[2] * self->x2[5] + self->ha1[2] * self->x3[5] + self->ha0[2] * self->x4[5] -
               self->b1[2] * self->y1[5] - self->b2[2] * self->y2[5] - self->b3[2] * self->y3[5] - self->b4[2] * self->y4[5];
         self->y4[5] = self->y3[5];
         self->y3[5] = self->y2[5];
@@ -793,14 +793,14 @@ FourBandMain_filters(FourBandMain *self) {
         self->x2[5] = self->x1[5];
         self->x1[5] = inval;
         self->buffer_streams[i + 3 * self->bufsize] = (MYFLT)val;
-    }    
+    }
 }
 
 MYFLT *
 FourBandMain_getSamplesBuffer(FourBandMain *self)
 {
     return (MYFLT *)self->buffer_streams;
-}    
+}
 
 static void
 FourBandMain_setProcMode(FourBandMain *self)
@@ -811,7 +811,7 @@ FourBandMain_setProcMode(FourBandMain *self)
 static void
 FourBandMain_compute_next_data_frame(FourBandMain *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -829,7 +829,7 @@ FourBandMain_traverse(FourBandMain *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 FourBandMain_clear(FourBandMain *self)
 {
     pyo_CLEAR
@@ -860,12 +860,12 @@ FourBandMain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freq1tmp=NULL, *freq2tmp=NULL, *freq3tmp=NULL;
     FourBandMain *self;
     self = (FourBandMain *)type->tp_alloc(type, 0);
-    
+
     self->freq1 = PyFloat_FromDouble(150);
     self->freq2 = PyFloat_FromDouble(500);
     self->freq3 = PyFloat_FromDouble(2000);
     self->last_freq1 = self->last_freq2 = self->last_freq3 = -1.0;
-    
+
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
     self->modebuffer[2] = 0;
@@ -875,14 +875,14 @@ FourBandMain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = FourBandMain_setProcMode;
 
     static char *kwlist[] = {"input", "freq1", "freq2", "freq3", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOO", kwlist, &inputtmp, &freq1tmp, &freq2tmp, &freq3tmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     for (i=0; i<6; i++) {
         self->x1[i] = self->x2[i] = self->x3[i] = self->x4[i] = self->y1[i] = self->y2[i] = self->y3[i] = self->y4[i] = 0.0;
     }
@@ -892,7 +892,7 @@ FourBandMain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     for (i=0; i<(4 * self->bufsize); i++) {
         self->buffer_streams[i] = 0.0;
     }
-    
+
     if (freq1tmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq1", "O", freq1tmp);
     }
@@ -904,9 +904,9 @@ FourBandMain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (freq3tmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq3", "O", freq3tmp);
     }
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
@@ -914,14 +914,14 @@ static PyObject *
 FourBandMain_setFreq1(FourBandMain *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq1);
@@ -940,20 +940,20 @@ FourBandMain_setFreq1(FourBandMain *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 FourBandMain_setFreq2(FourBandMain *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq2);
@@ -972,20 +972,20 @@ FourBandMain_setFreq2(FourBandMain *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 FourBandMain_setFreq3(FourBandMain *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq3);
@@ -1004,7 +1004,7 @@ FourBandMain_setFreq3(FourBandMain *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject * FourBandMain_getServer(FourBandMain* self) { GET_SERVER };
 static PyObject * FourBandMain_getStream(FourBandMain* self) { GET_STREAM };
@@ -1082,7 +1082,7 @@ typedef struct {
     pyo_audio_HEAD
     FourBandMain *mainSplitter;
     int modebuffer[2];
-    int chnl; 
+    int chnl;
 } FourBand;
 
 static void FourBand_postprocessing_ii(FourBand *self) { POST_PROCESSING_II };
@@ -1100,33 +1100,33 @@ FourBand_setProcMode(FourBand *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = FourBand_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = FourBand_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = FourBand_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = FourBand_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = FourBand_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = FourBand_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = FourBand_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = FourBand_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = FourBand_postprocessing_revareva;
             break;
     }
@@ -1141,7 +1141,7 @@ FourBand_compute_next_data_frame(FourBand *self)
     tmp = FourBandMain_getSamplesBuffer((FourBandMain *)self->mainSplitter);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1153,11 +1153,11 @@ FourBand_traverse(FourBand *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 FourBand_clear(FourBand *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainSplitter);    
+    Py_CLEAR(self->mainSplitter);
     return 0;
 }
 
@@ -1176,45 +1176,45 @@ FourBand_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL, *multmp=NULL, *addtmp=NULL;
     FourBand *self;
     self = (FourBand *)type->tp_alloc(type, 0);
-    
+
     self->chnl = 0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, FourBand_compute_next_data_frame);
     self->mode_func_ptr = FourBand_setProcMode;
 
     static char *kwlist[] = {"mainSplitter", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iOO", kwlist, &maintmp, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainSplitter);
     Py_INCREF(maintmp);
     self->mainSplitter = (FourBandMain *)maintmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * FourBand_getServer(FourBand* self) { GET_SERVER };
 static PyObject * FourBand_getStream(FourBand* self) { GET_STREAM };
-static PyObject * FourBand_setMul(FourBand *self, PyObject *arg) { SET_MUL };	
-static PyObject * FourBand_setAdd(FourBand *self, PyObject *arg) { SET_ADD };	
-static PyObject * FourBand_setSub(FourBand *self, PyObject *arg) { SET_SUB };	
-static PyObject * FourBand_setDiv(FourBand *self, PyObject *arg) { SET_DIV };	
+static PyObject * FourBand_setMul(FourBand *self, PyObject *arg) { SET_MUL };
+static PyObject * FourBand_setAdd(FourBand *self, PyObject *arg) { SET_ADD };
+static PyObject * FourBand_setSub(FourBand *self, PyObject *arg) { SET_SUB };
+static PyObject * FourBand_setDiv(FourBand *self, PyObject *arg) { SET_DIV };
 
 static PyObject * FourBand_play(FourBand *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * FourBand_out(FourBand *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1332,4 +1332,4 @@ PyTypeObject FourBandType = {
     0,      /* tp_init */
     0,                         /* tp_alloc */
     FourBand_new,                 /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/chorusmodule.c b/src/objects/chorusmodule.c
index c6de4f6..e70e1d4 100644
--- a/src/objects/chorusmodule.c
+++ b/src/objects/chorusmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -66,7 +66,7 @@ static void
 Chorus_process_ii(Chorus *self) {
     MYFLT lfo, pos, val, fpart, inval;
     int i, j, ipart;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT dpth = PyFloat_AS_DOUBLE(self->depth);
     MYFLT feed = PyFloat_AS_DOUBLE(self->feedback);
@@ -74,16 +74,16 @@ Chorus_process_ii(Chorus *self) {
     if (dpth < 0)
         dpth = 0;
     else if (dpth > 5)
-        dpth = 5;        
-    
+        dpth = 5;
+
     if (feed < 0)
         feed = 0;
     else if (feed > 1)
         feed = 1;
- 
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
-        
+
         self->total_signal = 0.0;
         for (j=0; j<8; j++) {
             if (self->pointerPos[j] < 0.0)
@@ -94,7 +94,7 @@ Chorus_process_ii(Chorus *self) {
             fpart = self->pointerPos[j] - ipart;
             lfo = self->delay_devs[j] * dpth * (LFO_ARRAY[ipart] * (1.0 - fpart) + LFO_ARRAY[ipart+1] * fpart) + self->delays[j];
             self->pointerPos[j] += self->inc[j];
-            
+
             pos = self->in_count[j] - lfo;
             if (pos < 0)
                 pos += self->size[j];
@@ -102,23 +102,23 @@ Chorus_process_ii(Chorus *self) {
             fpart = pos - ipart;
             val = (self->buffer[j][ipart] * (1.0 - fpart) + self->buffer[j][ipart+1] * fpart);
             self->total_signal += val;
-            
+
             self->buffer[j][self->in_count[j]] = inval + val * feed;
             if (self->in_count[j] == 0)
                 self->buffer[j][self->size[j]] = self->buffer[j][self->in_count[j]];
             self->in_count[j]++;
             if (self->in_count[j] >= self->size[j])
                 self->in_count[j] = 0;
-        } 
+        }
         self->data[i] = self->total_signal * 0.25;
-    }    
+    }
 }
 
 static void
 Chorus_process_ai(Chorus *self) {
     MYFLT lfo, pos, val, fpart, inval, dpth;
     int i, j, ipart;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *depth = Stream_getData((Stream *)self->depth_stream);
     MYFLT feed = PyFloat_AS_DOUBLE(self->feedback);
@@ -129,7 +129,7 @@ Chorus_process_ai(Chorus *self) {
         if (dpth < 0)
             dpth = 0;
         else if (dpth > 5)
-            dpth = 5;        
+            dpth = 5;
 
         self->total_signal = 0.0;
         for (j=0; j<8; j++) {
@@ -141,7 +141,7 @@ Chorus_process_ai(Chorus *self) {
             fpart = self->pointerPos[j] - ipart;
             lfo = self->delay_devs[j] * dpth * (LFO_ARRAY[ipart] * (1.0 - fpart) + LFO_ARRAY[ipart+1] * fpart) + self->delays[j];
             self->pointerPos[j] += self->inc[j];
-            
+
             pos = self->in_count[j] - lfo;
             if (pos < 0)
                 pos += self->size[j];
@@ -149,35 +149,35 @@ Chorus_process_ai(Chorus *self) {
             fpart = pos - ipart;
             val = (self->buffer[j][ipart] * (1.0 - fpart) + self->buffer[j][ipart+1] * fpart);
             self->total_signal += val;
-            
+
             self->buffer[j][self->in_count[j]] = inval + val * feed;
             if (self->in_count[j] == 0)
                 self->buffer[j][self->size[j]] = self->buffer[j][self->in_count[j]];
             self->in_count[j]++;
             if (self->in_count[j] >= self->size[j])
                 self->in_count[j] = 0;
-        } 
+        }
         self->data[i] = self->total_signal * 0.25;
-    }    
+    }
 }
 
 static void
 Chorus_process_ia(Chorus *self) {
     MYFLT lfo, pos, val, fpart, inval, feed;
     int i, j, ipart;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT dpth = PyFloat_AS_DOUBLE(self->depth);
     MYFLT *feedback = Stream_getData((Stream *)self->feedback_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
         feed = feedback[i];
         if (feed < 0)
             feed = 0;
         else if (feed > 1)
-            feed = 1;        
-        
+            feed = 1;
+
         self->total_signal = 0.0;
         for (j=0; j<8; j++) {
             if (self->pointerPos[j] < 0.0)
@@ -188,7 +188,7 @@ Chorus_process_ia(Chorus *self) {
             fpart = self->pointerPos[j] - ipart;
             lfo = self->delay_devs[j] * dpth * (LFO_ARRAY[ipart] * (1.0 - fpart) + LFO_ARRAY[ipart+1] * fpart) + self->delays[j];
             self->pointerPos[j] += self->inc[j];
-            
+
             pos = self->in_count[j] - lfo;
             if (pos < 0)
                 pos += self->size[j];
@@ -196,27 +196,27 @@ Chorus_process_ia(Chorus *self) {
             fpart = pos - ipart;
             val = (self->buffer[j][ipart] * (1.0 - fpart) + self->buffer[j][ipart+1] * fpart);
             self->total_signal += val;
-            
+
             self->buffer[j][self->in_count[j]] = inval + val * feed;
             if (self->in_count[j] == 0)
                 self->buffer[j][self->size[j]] = self->buffer[j][self->in_count[j]];
             self->in_count[j]++;
             if (self->in_count[j] >= self->size[j])
                 self->in_count[j] = 0;
-        } 
+        }
         self->data[i] = self->total_signal * 0.25;
-    }    
+    }
 }
 
 static void
 Chorus_process_aa(Chorus *self) {
     MYFLT lfo, pos, val, fpart, inval, dpth, feed;
     int i, j, ipart;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *depth = Stream_getData((Stream *)self->depth_stream);
     MYFLT *feedback = Stream_getData((Stream *)self->feedback_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
         dpth = depth[i];
@@ -224,12 +224,12 @@ Chorus_process_aa(Chorus *self) {
         if (dpth < 0)
             dpth = 0;
         else if (dpth > 5)
-            dpth = 5;        
+            dpth = 5;
         if (feed < 0)
             feed = 0;
         else if (feed > 1)
-            feed = 1;        
-        
+            feed = 1;
+
         self->total_signal = 0.0;
         for (j=0; j<8; j++) {
             if (self->pointerPos[j] < 0.0)
@@ -240,7 +240,7 @@ Chorus_process_aa(Chorus *self) {
             fpart = self->pointerPos[j] - ipart;
             lfo = self->delay_devs[j] * dpth * (LFO_ARRAY[ipart] * (1.0 - fpart) + LFO_ARRAY[ipart+1] * fpart) + self->delays[j];
             self->pointerPos[j] += self->inc[j];
-            
+
             pos = self->in_count[j] - lfo;
             if (pos < 0)
                 pos += self->size[j];
@@ -248,31 +248,31 @@ Chorus_process_aa(Chorus *self) {
             fpart = pos - ipart;
             val = (self->buffer[j][ipart] * (1.0 - fpart) + self->buffer[j][ipart+1] * fpart);
             self->total_signal += val;
-            
+
             self->buffer[j][self->in_count[j]] = inval + val * feed;
             if (self->in_count[j] == 0)
                 self->buffer[j][self->size[j]] = self->buffer[j][self->in_count[j]];
             self->in_count[j]++;
             if (self->in_count[j] >= self->size[j])
                 self->in_count[j] = 0;
-        } 
+        }
         self->data[i] = self->total_signal * 0.25;
-    }    
+    }
 }
 
 static void
 Chorus_mix_i(Chorus *self) {
     int i;
     MYFLT val;
-    
+
     MYFLT mix = PyFloat_AS_DOUBLE(self->mix);
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (mix < 0.0)
         mix = 0.0;
     else if (mix > 1.0)
         mix = 1.0;
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = in[i] * (1.0 - mix) + self->data[i] * mix;
         self->data[i] = val;
@@ -283,17 +283,17 @@ static void
 Chorus_mix_a(Chorus *self) {
     int i;
     MYFLT mix, val;
-    
+
     MYFLT *mi = Stream_getData((Stream *)self->mix_stream);
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         mix = mi[i];
         if (mix < 0.0)
             mix = 0.0;
         else if (mix > 1.0)
             mix = 1.0;
-        
+
         val = in[i] * (1.0 - mix) + self->data[i] * mix;
         self->data[i] = val;
     }
@@ -316,66 +316,66 @@ Chorus_setProcMode(Chorus *self)
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
     mixmode = self->modebuffer[4];
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Chorus_process_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Chorus_process_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = Chorus_process_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Chorus_process_aa;
             break;
-    } 
+    }
     switch (mixmode) {
-        case 0:    
+        case 0:
             self->mix_func_ptr = Chorus_mix_i;
             break;
-        case 1:    
+        case 1:
             self->mix_func_ptr = Chorus_mix_a;
             break;
-    }        
-            
+    }
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Chorus_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Chorus_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Chorus_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Chorus_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Chorus_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Chorus_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Chorus_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Chorus_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Chorus_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 Chorus_compute_next_data_frame(Chorus *self)
 {
-    (*self->proc_func_ptr)(self); 
-    (*self->mix_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
+    (*self->mix_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -384,28 +384,28 @@ Chorus_traverse(Chorus *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->input);
-    Py_VISIT(self->input_stream);    
-    Py_VISIT(self->feedback);    
-    Py_VISIT(self->feedback_stream);    
-    Py_VISIT(self->depth);    
-    Py_VISIT(self->depth_stream);    
-    Py_VISIT(self->mix);    
-    Py_VISIT(self->mix_stream);    
+    Py_VISIT(self->input_stream);
+    Py_VISIT(self->feedback);
+    Py_VISIT(self->feedback_stream);
+    Py_VISIT(self->depth);
+    Py_VISIT(self->depth_stream);
+    Py_VISIT(self->mix);
+    Py_VISIT(self->mix_stream);
     return 0;
 }
 
-static int 
+static int
 Chorus_clear(Chorus *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
-    Py_CLEAR(self->input_stream);    
-    Py_CLEAR(self->feedback);    
-    Py_CLEAR(self->feedback_stream);    
-    Py_CLEAR(self->depth);    
-    Py_CLEAR(self->depth_stream);    
-    Py_CLEAR(self->mix);    
-    Py_CLEAR(self->mix_stream);    
+    Py_CLEAR(self->input_stream);
+    Py_CLEAR(self->feedback);
+    Py_CLEAR(self->feedback_stream);
+    Py_CLEAR(self->depth);
+    Py_CLEAR(self->depth_stream);
+    Py_CLEAR(self->mix);
+    Py_CLEAR(self->mix_stream);
     return 0;
 }
 
@@ -416,7 +416,7 @@ Chorus_dealloc(Chorus* self)
     pyo_DEALLOC
     for (i=0; i<8; i++) {
         free(self->buffer[i]);
-    }    
+    }
     Chorus_clear(self);
     self->ob_type->tp_free((PyObject*)self);
 }
@@ -430,7 +430,7 @@ Chorus_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *depthtmp=NULL, *feedbacktmp=NULL, *mixtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Chorus *self;
     self = (Chorus *)type->tp_alloc(type, 0);
-    
+
     self->feedback = PyFloat_FromDouble(0.5);
     self->depth = PyFloat_FromDouble(1.0);
     self->mix = PyFloat_FromDouble(0.5);
@@ -441,13 +441,13 @@ Chorus_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
 	self->modebuffer[4] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Chorus_compute_next_data_frame);
     self->mode_func_ptr = Chorus_setProcMode;
- 
+
     srfac = self->sr / 44100.0;
-   
+
     for (i=0; i<8; i++) {
         self->in_count[i] = 0;
         self->delays[i] = chorusParams[i][0] * srfac;
@@ -456,16 +456,16 @@ Chorus_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     }
 
     static char *kwlist[] = {"input", "depth", "feedback", "mix", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOOO", kwlist, &inputtmp, &depthtmp, &feedbacktmp, &mixtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     if (depthtmp) {
         PyObject_CallMethod((PyObject *)self, "setDepth", "O", depthtmp);
     }
-    
+
     if (feedbacktmp) {
         PyObject_CallMethod((PyObject *)self, "setFeedback", "O", feedbacktmp);
     }
@@ -473,15 +473,15 @@ Chorus_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (mixtmp) {
         PyObject_CallMethod((PyObject *)self, "setMix", "O", mixtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     for (i=0; i<8; i++) {
@@ -489,20 +489,20 @@ Chorus_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         self->buffer[i] = (MYFLT *)realloc(self->buffer[i], (self->size[i]+1) * sizeof(MYFLT));
         for (j=0; j<(self->size[i]+1); j++) {
             self->buffer[i][j] = 0.;
-        }    
-    }    
-    
+        }
+    }
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Chorus_getServer(Chorus* self) { GET_SERVER };
 static PyObject * Chorus_getStream(Chorus* self) { GET_STREAM };
-static PyObject * Chorus_setMul(Chorus *self, PyObject *arg) { SET_MUL };	
-static PyObject * Chorus_setAdd(Chorus *self, PyObject *arg) { SET_ADD };	
-static PyObject * Chorus_setSub(Chorus *self, PyObject *arg) { SET_SUB };	
-static PyObject * Chorus_setDiv(Chorus *self, PyObject *arg) { SET_DIV };	
+static PyObject * Chorus_setMul(Chorus *self, PyObject *arg) { SET_MUL };
+static PyObject * Chorus_setAdd(Chorus *self, PyObject *arg) { SET_ADD };
+static PyObject * Chorus_setSub(Chorus *self, PyObject *arg) { SET_SUB };
+static PyObject * Chorus_setDiv(Chorus *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Chorus_play(Chorus *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Chorus_out(Chorus *self, PyObject *args, PyObject *kwds) { OUT };
@@ -521,14 +521,14 @@ static PyObject *
 Chorus_setDepth(Chorus *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->depth);
@@ -544,9 +544,9 @@ Chorus_setDepth(Chorus *self, PyObject *arg)
         self->depth_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -555,14 +555,14 @@ static PyObject *
 Chorus_setFeedback(Chorus *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->feedback);
@@ -578,25 +578,25 @@ Chorus_setFeedback(Chorus *self, PyObject *arg)
         self->feedback_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Chorus_setMix(Chorus *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->mix);
@@ -612,12 +612,12 @@ Chorus_setMix(Chorus *self, PyObject *arg)
         self->mix_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Chorus_members[] = {
 {"server", T_OBJECT_EX, offsetof(Chorus, server), 0, "Pyo server."},
@@ -729,4 +729,4 @@ Chorus_members,             /* tp_members */
 0,      /* tp_init */
 0,                         /* tp_alloc */
 Chorus_new,                 /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/compressmodule.c b/src/objects/compressmodule.c
index 30233ac..f899ffd 100644
--- a/src/objects/compressmodule.c
+++ b/src/objects/compressmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -39,13 +39,13 @@ typedef struct {
     Stream *falltime_stream;
     Stream *thresh_stream;
     Stream *ratio_stream;
-    int modebuffer[6]; // need at least 2 slots for mul & add 
+    int modebuffer[6]; // need at least 2 slots for mul & add
     int outputAmp;
     MYFLT follow;
     MYFLT knee;
     long lh_delay;
     long lh_size;
-    long lh_in_count;    
+    long lh_in_count;
     MYFLT *lh_buffer;
 } Compress;
 
@@ -67,9 +67,9 @@ Compress_compress_soft(Compress *self) {
     MYFLT risetime, falltime, thresh, ratio;
     int i;
     long ind;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->modebuffer[2] == 0)
         risetime = PyFloat_AS_DOUBLE(self->risetime);
     else
@@ -91,7 +91,7 @@ Compress_compress_soft(Compress *self) {
     else
         ratio = Stream_getData((Stream *)self->ratio_stream)[0];
 
-    ratio = 1.0 / ratio;    
+    ratio = 1.0 / ratio;
     risetime = MYEXP(-1.0 / (self->sr * risetime));
     falltime = MYEXP(-1.0 / (self->sr * falltime));
     knee = self->knee * 0.999 + 0.001; /* 0 = hard knee, 1 = soft knee */
@@ -104,25 +104,25 @@ Compress_compress_soft(Compress *self) {
 
     for (i=0; i<self->bufsize; i++) {
         /* Envelope follower */
-        absin = in[i];  
+        absin = in[i];
         if (absin < 0.0)
             absin = -absin;
         if (self->follow < absin)
             self->follow = absin + risetime * (self->follow - absin);
         else
             self->follow = absin + falltime * (self->follow - absin);
-        
+
         /* Look ahead */
         ind = self->lh_in_count - self->lh_delay;
         if (ind < 0)
             ind += self->lh_size;
         samp = self->lh_buffer[ind];
-        
+
         self->lh_buffer[self->lh_in_count] = in[i];
         self->lh_in_count++;
         if (self->lh_in_count >= self->lh_size)
             self->lh_in_count = 0;
-        
+
         /* Compress signal */
         outa = 1.0;
         if (self->follow > ampthresh) { /* Above threshold */
@@ -137,7 +137,7 @@ Compress_compress_soft(Compress *self) {
             indb = 20.0 * MYLOG10(C_clip(self->follow));
             diff = indb - thresh;
             outdb = diff - diff * kneeratio;
-            outa = MYPOW(10.0, -outdb * 0.05);            
+            outa = MYPOW(10.0, -outdb * 0.05);
         }
         if (self->outputAmp == 0)
             self->data[i] = samp * C_clip(outa);
@@ -161,42 +161,42 @@ Compress_setProcMode(Compress *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Compress_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Compress_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Compress_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Compress_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Compress_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Compress_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Compress_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Compress_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Compress_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 Compress_compute_next_data_frame(Compress *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -206,31 +206,31 @@ Compress_traverse(Compress *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->risetime);    
-    Py_VISIT(self->risetime_stream);    
-    Py_VISIT(self->falltime);    
-    Py_VISIT(self->falltime_stream);    
-    Py_VISIT(self->thresh);    
-    Py_VISIT(self->thresh_stream);    
-    Py_VISIT(self->ratio);    
-    Py_VISIT(self->ratio_stream);    
+    Py_VISIT(self->risetime);
+    Py_VISIT(self->risetime_stream);
+    Py_VISIT(self->falltime);
+    Py_VISIT(self->falltime_stream);
+    Py_VISIT(self->thresh);
+    Py_VISIT(self->thresh_stream);
+    Py_VISIT(self->ratio);
+    Py_VISIT(self->ratio_stream);
     return 0;
 }
 
-static int 
+static int
 Compress_clear(Compress *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->risetime);    
-    Py_CLEAR(self->risetime_stream);    
-    Py_CLEAR(self->falltime);    
-    Py_CLEAR(self->falltime_stream);    
-    Py_CLEAR(self->thresh);    
-    Py_CLEAR(self->thresh_stream);    
-    Py_CLEAR(self->ratio);    
-    Py_CLEAR(self->ratio_stream);    
+    Py_CLEAR(self->risetime);
+    Py_CLEAR(self->risetime_stream);
+    Py_CLEAR(self->falltime);
+    Py_CLEAR(self->falltime_stream);
+    Py_CLEAR(self->thresh);
+    Py_CLEAR(self->thresh_stream);
+    Py_CLEAR(self->ratio);
+    Py_CLEAR(self->ratio_stream);
     return 0;
 }
 
@@ -251,7 +251,7 @@ Compress_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *looktmp=NULL, *kneetmp=NULL;
     Compress *self;
     self = (Compress *)type->tp_alloc(type, 0);
-    
+
     self->thresh = PyFloat_FromDouble(-20.0);
     self->ratio = PyFloat_FromDouble(2.0);
     self->risetime = PyFloat_FromDouble(0.01);
@@ -274,49 +274,49 @@ Compress_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = Compress_setProcMode;
 
     static char *kwlist[] = {"input", "thresh", "ratio", "risetime", "falltime", "lookahead", "knee", "outputAmp", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOOOOiOO", kwlist, &inputtmp, &threshtmp, &ratiotmp, &risetimetmp, &falltimetmp, &looktmp, &kneetmp, &self->outputAmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (threshtmp) {
         PyObject_CallMethod((PyObject *)self, "setThresh", "O", threshtmp);
     }
-   
+
     if (ratiotmp) {
         PyObject_CallMethod((PyObject *)self, "setRatio", "O", ratiotmp);
     }
-   
+
     if (risetimetmp) {
         PyObject_CallMethod((PyObject *)self, "setRiseTime", "O", risetimetmp);
     }
-    
+
     if (falltimetmp) {
         PyObject_CallMethod((PyObject *)self, "setFallTime", "O", falltimetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
 
     PyObject_CallMethod((PyObject *)self, "setLookAhead", "O", looktmp);
     PyObject_CallMethod((PyObject *)self, "setKnee", "O", kneetmp);
-    
+
     self->lh_size = (long)(0.025 * self->sr + 0.5);
     self->lh_buffer = (MYFLT *)realloc(self->lh_buffer, (self->lh_size+1) * sizeof(MYFLT));
     for (i=0; i<(self->lh_size+1); i++) {
         self->lh_buffer[i] = 0.;
-    }    
+    }
 
     self->proc_func_ptr = Compress_compress_soft;
 
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -324,10 +324,10 @@ Compress_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Compress_getServer(Compress* self) { GET_SERVER };
 static PyObject * Compress_getStream(Compress* self) { GET_STREAM };
-static PyObject * Compress_setMul(Compress *self, PyObject *arg) { SET_MUL };	
-static PyObject * Compress_setAdd(Compress *self, PyObject *arg) { SET_ADD };	
-static PyObject * Compress_setSub(Compress *self, PyObject *arg) { SET_SUB };	
-static PyObject * Compress_setDiv(Compress *self, PyObject *arg) { SET_DIV };	
+static PyObject * Compress_setMul(Compress *self, PyObject *arg) { SET_MUL };
+static PyObject * Compress_setAdd(Compress *self, PyObject *arg) { SET_ADD };
+static PyObject * Compress_setSub(Compress *self, PyObject *arg) { SET_SUB };
+static PyObject * Compress_setDiv(Compress *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Compress_play(Compress *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Compress_out(Compress *self, PyObject *args, PyObject *kwds) { OUT };
@@ -346,14 +346,14 @@ static PyObject *
 Compress_setThresh(Compress *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->thresh);
@@ -369,23 +369,23 @@ Compress_setThresh(Compress *self, PyObject *arg)
         self->thresh_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-        
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Compress_setRatio(Compress *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->ratio);
@@ -404,20 +404,20 @@ Compress_setRatio(Compress *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Compress_setRiseTime(Compress *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->risetime);
@@ -436,20 +436,20 @@ Compress_setRiseTime(Compress *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Compress_setFallTime(Compress *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->falltime);
@@ -468,13 +468,13 @@ Compress_setFallTime(Compress *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Compress_setLookAhead(Compress *self, PyObject *arg)
 {
     MYFLT tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
@@ -490,18 +490,18 @@ Compress_setLookAhead(Compress *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Compress_setKnee(Compress *self, PyObject *arg)
 {
     MYFLT tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	if (PyNumber_Check(arg)) {
 		tmp = PyFloat_AsDouble(PyNumber_Float(arg));
         if (tmp >= 0.0 && tmp <= 1.0)
@@ -512,7 +512,7 @@ Compress_setKnee(Compress *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Compress_members[] = {
 {"server", T_OBJECT_EX, offsetof(Compress, server), 0, "Pyo server."},
@@ -644,7 +644,7 @@ typedef struct {
     Stream *risetime_stream;
     PyObject *falltime;
     Stream *falltime_stream;
-    int modebuffer[5]; // need at least 2 slots for mul & add 
+    int modebuffer[5]; // need at least 2 slots for mul & add
     int outputAmp;
     MYFLT lpfollow;
     MYFLT lpfactor;
@@ -655,7 +655,7 @@ typedef struct {
     MYFLT fallfactor;
     long lh_delay;
     long lh_size;
-    long lh_in_count;    
+    long lh_in_count;
     MYFLT *lh_buffer;
 } Gate;
 
@@ -663,9 +663,9 @@ static void
 Gate_filters_iii(Gate *self) {
     MYFLT samp, absin, thresh, ampthresh, risetime, falltime;
     int i, ind;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     thresh = PyFloat_AS_DOUBLE(self->thresh);
     risetime = PyFloat_AS_DOUBLE(self->risetime);
     if (risetime <= 0.0)
@@ -673,23 +673,23 @@ Gate_filters_iii(Gate *self) {
     falltime = PyFloat_AS_DOUBLE(self->falltime);
     if (falltime <= 0.0)
         falltime = GATE_MIN_RAMP_TIME;
-    
+
     if (risetime != self->last_risetime) {
         self->risefactor = MYEXP(-1.0 / (self->sr * risetime));
         self->last_risetime = risetime;
     }
-    
+
     if (falltime != self->last_falltime) {
         self->fallfactor = MYEXP(-1.0 / (self->sr * falltime));
         self->last_falltime = falltime;
     }
-    
+
     ampthresh = MYPOW(10.0, thresh * 0.05);
     for (i=0; i<self->bufsize; i++) {
         /* Follower */
         absin = in[i] * in[i];
         self->lpfollow = absin + self->lpfactor * (self->lpfollow - absin);
-        
+
         /* Gate slope */
         if (self->lpfollow >= ampthresh)
             self->gate = 1.0 + self->risefactor * (self->gate - 1.0);
@@ -701,12 +701,12 @@ Gate_filters_iii(Gate *self) {
         if (ind < 0)
             ind += self->lh_size;
         samp = self->lh_buffer[ind];
-        
+
         self->lh_buffer[self->lh_in_count] = in[i];
         self->lh_in_count++;
         if (self->lh_in_count >= self->lh_size)
             self->lh_in_count = 0;
-        
+
         /* Gate the signal */
         if (self->outputAmp == 0)
             self->data[i] = samp * self->gate;
@@ -719,8 +719,8 @@ static void
 Gate_filters_aii(Gate *self) {
     MYFLT samp, absin, thresh, ampthresh, risetime, falltime;
     int i, ind;
-    
-    MYFLT *in = Stream_getData((Stream *)self->input_stream);    
+
+    MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *tr = Stream_getData((Stream *)self->thresh_stream);
 
     risetime = PyFloat_AS_DOUBLE(self->risetime);
@@ -729,41 +729,41 @@ Gate_filters_aii(Gate *self) {
     falltime = PyFloat_AS_DOUBLE(self->falltime);
     if (falltime <= 0.0)
         falltime = GATE_MIN_RAMP_TIME;
-    
+
     if (risetime != self->last_risetime) {
         self->risefactor = MYEXP(-1.0 / (self->sr * risetime));
         self->last_risetime = risetime;
     }
-    
+
     if (falltime != self->last_falltime) {
         self->fallfactor = MYEXP(-1.0 / (self->sr * falltime));
         self->last_falltime = falltime;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         thresh = tr[i];
         ampthresh = MYPOW(10.0, thresh * 0.05);
         /* Follower */
         absin = in[i] * in[i];
         self->lpfollow = absin + self->lpfactor * (self->lpfollow - absin);
-        
+
         /* Gate slope */
         if (self->lpfollow >= ampthresh)
             self->gate = 1.0 + self->risefactor * (self->gate - 1.0);
         else
             self->gate = self->fallfactor * self->gate;
-        
+
         /* Look ahead */
         ind = self->lh_in_count - self->lh_delay;
         if (ind < 0)
             ind += self->lh_size;
         samp = self->lh_buffer[ind];
-        
+
         self->lh_buffer[self->lh_in_count] = in[i];
         self->lh_in_count++;
         if (self->lh_in_count >= self->lh_size)
             self->lh_in_count = 0;
-        
+
         /* Gate the signal */
         if (self->outputAmp == 0)
             self->data[i] = samp * self->gate;
@@ -776,7 +776,7 @@ static void
 Gate_filters_iai(Gate *self) {
     MYFLT samp, absin, thresh, ampthresh, risetime, falltime;
     int i, ind;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
 
     thresh = PyFloat_AS_DOUBLE(self->thresh);
@@ -790,7 +790,7 @@ Gate_filters_iai(Gate *self) {
         self->fallfactor = MYEXP(-1.0 / (self->sr * falltime));
         self->last_falltime = falltime;
     }
-    
+
     ampthresh = MYPOW(10.0, thresh * 0.05);
     for (i=0; i<self->bufsize; i++) {
         risetime = rise[i];
@@ -800,28 +800,28 @@ Gate_filters_iai(Gate *self) {
             self->risefactor = MYEXP(-1.0 / (self->sr * risetime));
             self->last_risetime = risetime;
         }
-        
+
         /* Follower */
         absin = in[i] * in[i];
         self->lpfollow = absin + self->lpfactor * (self->lpfollow - absin);
-        
+
         /* Gate slope */
         if (self->lpfollow >= ampthresh)
             self->gate = 1.0 + self->risefactor * (self->gate - 1.0);
         else
             self->gate = self->fallfactor * self->gate;
-        
+
         /* Look ahead */
         ind = self->lh_in_count - self->lh_delay;
         if (ind < 0)
             ind += self->lh_size;
         samp = self->lh_buffer[ind];
-        
+
         self->lh_buffer[self->lh_in_count] = in[i];
         self->lh_in_count++;
         if (self->lh_in_count >= self->lh_size)
             self->lh_in_count = 0;
-        
+
         /* Gate the signal */
         if (self->outputAmp == 0)
             self->data[i] = samp * self->gate;
@@ -834,21 +834,21 @@ static void
 Gate_filters_aai(Gate *self) {
     MYFLT samp, absin, thresh, ampthresh, risetime, falltime;
     int i, ind;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     MYFLT *tr = Stream_getData((Stream *)self->thresh_stream);
     MYFLT *rise = Stream_getData((Stream *)self->risetime_stream);
-    
+
     falltime = PyFloat_AS_DOUBLE(self->falltime);
     if (falltime <= 0.0)
         falltime = GATE_MIN_RAMP_TIME;
-    
+
     if (falltime != self->last_falltime) {
         self->fallfactor = MYEXP(-1.0 / (self->sr * falltime));
         self->last_falltime = falltime;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         thresh = tr[i];
         ampthresh = MYPOW(10.0, thresh * 0.05);
@@ -859,28 +859,28 @@ Gate_filters_aai(Gate *self) {
             self->risefactor = MYEXP(-1.0 / (self->sr * risetime));
             self->last_risetime = risetime;
         }
-        
+
         /* Follower */
         absin = in[i] * in[i];
         self->lpfollow = absin + self->lpfactor * (self->lpfollow - absin);
-        
+
         /* Gate slope */
         if (self->lpfollow >= ampthresh)
             self->gate = 1.0 + self->risefactor * (self->gate - 1.0);
         else
             self->gate = self->fallfactor * self->gate;
-        
+
         /* Look ahead */
         ind = self->lh_in_count - self->lh_delay;
         if (ind < 0)
             ind += self->lh_size;
         samp = self->lh_buffer[ind];
-        
+
         self->lh_buffer[self->lh_in_count] = in[i];
         self->lh_in_count++;
         if (self->lh_in_count >= self->lh_size)
             self->lh_in_count = 0;
-        
+
         /* Gate the signal */
         if (self->outputAmp == 0)
             self->data[i] = samp * self->gate;
@@ -893,15 +893,15 @@ static void
 Gate_filters_iia(Gate *self) {
     MYFLT samp, absin, thresh, ampthresh, risetime, falltime;
     int i, ind;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     thresh = PyFloat_AS_DOUBLE(self->thresh);
     risetime = PyFloat_AS_DOUBLE(self->risetime);
     if (risetime <= 0.0)
         risetime = GATE_MIN_RAMP_TIME;
     MYFLT *fall = Stream_getData((Stream *)self->falltime_stream);
-    
+
     if (risetime != self->last_risetime) {
         self->risefactor = MYEXP(-1.0 / (self->sr * risetime));
         self->last_risetime = risetime;
@@ -916,28 +916,28 @@ Gate_filters_iia(Gate *self) {
             self->fallfactor = MYEXP(-1.0 / (self->sr * falltime));
             self->last_falltime = falltime;
         }
-        
+
         /* Follower */
         absin = in[i] * in[i];
         self->lpfollow = absin + self->lpfactor * (self->lpfollow - absin);
-        
+
         /* Gate slope */
         if (self->lpfollow >= ampthresh)
             self->gate = 1.0 + self->risefactor * (self->gate - 1.0);
         else
             self->gate = self->fallfactor * self->gate;
-        
+
         /* Look ahead */
         ind = self->lh_in_count - self->lh_delay;
         if (ind < 0)
             ind += self->lh_size;
         samp = self->lh_buffer[ind];
-        
+
         self->lh_buffer[self->lh_in_count] = in[i];
         self->lh_in_count++;
         if (self->lh_in_count >= self->lh_size)
             self->lh_in_count = 0;
-        
+
         /* Gate the signal */
         if (self->outputAmp == 0)
             self->data[i] = samp * self->gate;
@@ -950,20 +950,20 @@ static void
 Gate_filters_aia(Gate *self) {
     MYFLT samp, absin, thresh, ampthresh, risetime, falltime;
     int i, ind;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     MYFLT *tr = Stream_getData((Stream *)self->thresh_stream);
     risetime = PyFloat_AS_DOUBLE(self->risetime);
     if (risetime <= 0.0)
         risetime = GATE_MIN_RAMP_TIME;
     MYFLT *fall = Stream_getData((Stream *)self->falltime_stream);
-    
+
     if (risetime != self->last_risetime) {
         self->risefactor = MYEXP(-1.0 / (self->sr * risetime));
         self->last_risetime = risetime;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         thresh = tr[i];
         ampthresh = MYPOW(10.0, thresh * 0.05);
@@ -974,28 +974,28 @@ Gate_filters_aia(Gate *self) {
             self->fallfactor = MYEXP(-1.0 / (self->sr * falltime));
             self->last_falltime = falltime;
         }
-        
+
         /* Follower */
         absin = in[i] * in[i];
         self->lpfollow = absin + self->lpfactor * (self->lpfollow - absin);
-        
+
         /* Gate slope */
         if (self->lpfollow >= ampthresh)
             self->gate = 1.0 + self->risefactor * (self->gate - 1.0);
         else
             self->gate = self->fallfactor * self->gate;
-        
+
         /* Look ahead */
         ind = self->lh_in_count - self->lh_delay;
         if (ind < 0)
             ind += self->lh_size;
         samp = self->lh_buffer[ind];
-        
+
         self->lh_buffer[self->lh_in_count] = in[i];
         self->lh_in_count++;
         if (self->lh_in_count >= self->lh_size)
             self->lh_in_count = 0;
-        
+
         /* Gate the signal */
         if (self->outputAmp == 0)
             self->data[i] = samp * self->gate;
@@ -1008,9 +1008,9 @@ static void
 Gate_filters_iaa(Gate *self) {
     MYFLT samp, absin, thresh, ampthresh, risetime, falltime;
     int i, ind;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     thresh = PyFloat_AS_DOUBLE(self->thresh);
     MYFLT *rise = Stream_getData((Stream *)self->risetime_stream);
     MYFLT *fall = Stream_getData((Stream *)self->falltime_stream);
@@ -1031,28 +1031,28 @@ Gate_filters_iaa(Gate *self) {
             self->fallfactor = MYEXP(-1.0 / (self->sr * falltime));
             self->last_falltime = falltime;
         }
-        
+
         /* Follower */
         absin = in[i] * in[i];
         self->lpfollow = absin + self->lpfactor * (self->lpfollow - absin);
-        
+
         /* Gate slope */
         if (self->lpfollow >= ampthresh)
             self->gate = 1.0 + self->risefactor * (self->gate - 1.0);
         else
             self->gate = self->fallfactor * self->gate;
-        
+
         /* Look ahead */
         ind = self->lh_in_count - self->lh_delay;
         if (ind < 0)
             ind += self->lh_size;
         samp = self->lh_buffer[ind];
-        
+
         self->lh_buffer[self->lh_in_count] = in[i];
         self->lh_in_count++;
         if (self->lh_in_count >= self->lh_size)
             self->lh_in_count = 0;
-        
+
         /* Gate the signal */
         if (self->outputAmp == 0)
             self->data[i] = samp * self->gate;
@@ -1065,13 +1065,13 @@ static void
 Gate_filters_aaa(Gate *self) {
     MYFLT samp, absin, thresh, ampthresh, risetime, falltime;
     int i, ind;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     MYFLT *tr = Stream_getData((Stream *)self->thresh_stream);
     MYFLT *rise = Stream_getData((Stream *)self->risetime_stream);
     MYFLT *fall = Stream_getData((Stream *)self->falltime_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         thresh = tr[i];
         ampthresh = MYPOW(10.0, thresh * 0.05);
@@ -1089,28 +1089,28 @@ Gate_filters_aaa(Gate *self) {
             self->fallfactor = MYEXP(-1.0 / (self->sr * falltime));
             self->last_falltime = falltime;
         }
-        
+
         /* Follower */
         absin = in[i] * in[i];
         self->lpfollow = absin + self->lpfactor * (self->lpfollow - absin);
-        
+
         /* Gate slope */
         if (self->lpfollow >= ampthresh)
             self->gate = 1.0 + self->risefactor * (self->gate - 1.0);
         else
             self->gate = self->fallfactor * self->gate;
-        
+
         /* Look ahead */
         ind = self->lh_in_count - self->lh_delay;
         if (ind < 0)
             ind += self->lh_size;
         samp = self->lh_buffer[ind];
-        
+
         self->lh_buffer[self->lh_in_count] = in[i];
         self->lh_in_count++;
         if (self->lh_in_count >= self->lh_size)
             self->lh_in_count = 0;
-        
+
         /* Gate the signal */
         if (self->outputAmp == 0)
             self->data[i] = samp * self->gate;
@@ -1135,68 +1135,68 @@ Gate_setProcMode(Gate *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10 + self->modebuffer[4] * 100;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Gate_filters_iii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Gate_filters_aii;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = Gate_filters_iai;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Gate_filters_aai;
             break;
-        case 100:    
+        case 100:
             self->proc_func_ptr = Gate_filters_iia;
             break;
-        case 101:    
+        case 101:
             self->proc_func_ptr = Gate_filters_aia;
             break;
-        case 110:    
+        case 110:
             self->proc_func_ptr = Gate_filters_iaa;
             break;
-        case 111:    
+        case 111:
             self->proc_func_ptr = Gate_filters_aaa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Gate_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Gate_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Gate_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Gate_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Gate_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Gate_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Gate_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Gate_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Gate_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Gate_compute_next_data_frame(Gate *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1206,27 +1206,27 @@ Gate_traverse(Gate *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->thresh);    
-    Py_VISIT(self->thresh_stream);    
-    Py_VISIT(self->risetime);    
-    Py_VISIT(self->risetime_stream);    
-    Py_VISIT(self->falltime);    
-    Py_VISIT(self->falltime_stream);    
+    Py_VISIT(self->thresh);
+    Py_VISIT(self->thresh_stream);
+    Py_VISIT(self->risetime);
+    Py_VISIT(self->risetime_stream);
+    Py_VISIT(self->falltime);
+    Py_VISIT(self->falltime_stream);
     return 0;
 }
 
-static int 
+static int
 Gate_clear(Gate *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->thresh);    
-    Py_CLEAR(self->thresh_stream);    
-    Py_CLEAR(self->risetime);    
-    Py_CLEAR(self->risetime_stream);    
-    Py_CLEAR(self->falltime);    
-    Py_CLEAR(self->falltime_stream);    
+    Py_CLEAR(self->thresh);
+    Py_CLEAR(self->thresh_stream);
+    Py_CLEAR(self->risetime);
+    Py_CLEAR(self->risetime_stream);
+    Py_CLEAR(self->falltime);
+    Py_CLEAR(self->falltime_stream);
     return 0;
 }
 
@@ -1247,7 +1247,7 @@ Gate_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *looktmp=NULL;
     Gate *self;
     self = (Gate *)type->tp_alloc(type, 0);
-    
+
     self->thresh = PyFloat_FromDouble(-70.0);
     self->risetime = PyFloat_FromDouble(0.01);
     self->falltime = PyFloat_FromDouble(0.05);
@@ -1263,51 +1263,51 @@ Gate_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->lh_delay = 0;
     self->lh_in_count = 0;
     self->outputAmp = 0;
-    
+
     INIT_OBJECT_COMMON
-    
+
     self->lpfactor = MYEXP(-1.0 / (self->sr / 20.0));
 
     Stream_setFunctionPtr(self->stream, Gate_compute_next_data_frame);
     self->mode_func_ptr = Gate_setProcMode;
 
     static char *kwlist[] = {"input", "thresh", "risetime", "falltime", "lookahead", "outputAmp", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOOiOO", kwlist, &inputtmp, &threshtmp, &risetimetmp, &falltimetmp, &looktmp, &self->outputAmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     if (threshtmp) {
         PyObject_CallMethod((PyObject *)self, "setThresh", "O", threshtmp);
     }
-    
+
     if (risetimetmp) {
         PyObject_CallMethod((PyObject *)self, "setRiseTime", "O", risetimetmp);
     }
-    
+
     if (falltimetmp) {
         PyObject_CallMethod((PyObject *)self, "setFallTime", "O", falltimetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
 
     PyObject_CallMethod((PyObject *)self, "setLookAhead", "O", looktmp);
-    
+
     self->lh_size = (long)(0.025 * self->sr + 0.5);
     self->lh_buffer = (MYFLT *)realloc(self->lh_buffer, (self->lh_size+1) * sizeof(MYFLT));
     for (i=0; i<(self->lh_size+1); i++) {
         self->lh_buffer[i] = 0.;
-    }    
-    
+    }
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -1315,10 +1315,10 @@ Gate_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Gate_getServer(Gate* self) { GET_SERVER };
 static PyObject * Gate_getStream(Gate* self) { GET_STREAM };
-static PyObject * Gate_setMul(Gate *self, PyObject *arg) { SET_MUL };	
-static PyObject * Gate_setAdd(Gate *self, PyObject *arg) { SET_ADD };	
-static PyObject * Gate_setSub(Gate *self, PyObject *arg) { SET_SUB };	
-static PyObject * Gate_setDiv(Gate *self, PyObject *arg) { SET_DIV };	
+static PyObject * Gate_setMul(Gate *self, PyObject *arg) { SET_MUL };
+static PyObject * Gate_setAdd(Gate *self, PyObject *arg) { SET_ADD };
+static PyObject * Gate_setSub(Gate *self, PyObject *arg) { SET_SUB };
+static PyObject * Gate_setDiv(Gate *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Gate_play(Gate *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Gate_out(Gate *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1337,14 +1337,14 @@ static PyObject *
 Gate_setThresh(Gate *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->thresh);
@@ -1360,9 +1360,9 @@ Gate_setThresh(Gate *self, PyObject *arg)
         self->thresh_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -1371,14 +1371,14 @@ static PyObject *
 Gate_setRiseTime(Gate *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->risetime);
@@ -1394,9 +1394,9 @@ Gate_setRiseTime(Gate *self, PyObject *arg)
         self->risetime_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -1405,14 +1405,14 @@ static PyObject *
 Gate_setFallTime(Gate *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->falltime);
@@ -1428,9 +1428,9 @@ Gate_setFallTime(Gate *self, PyObject *arg)
         self->falltime_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -1439,12 +1439,12 @@ static PyObject *
 Gate_setLookAhead(Gate *self, PyObject *arg)
 {
     MYFLT tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	if (PyNumber_Check(arg)) {
 		tmp = PyFloat_AsDouble(PyNumber_Float(arg));
         if (tmp <= 25.0)
@@ -1452,10 +1452,10 @@ Gate_setLookAhead(Gate *self, PyObject *arg)
         else
             printf("lookahead must be less than 25.0 ms.\n");
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Gate_members[] = {
     {"server", T_OBJECT_EX, offsetof(Gate, server), 0, "Pyo server."},
@@ -1581,7 +1581,7 @@ typedef struct {
     Stream *input2_stream;
     PyObject *freq;
     Stream *freq_stream;
-    int modebuffer[3]; // need at least 2 slots for mul & add 
+    int modebuffer[3]; // need at least 2 slots for mul & add
     MYFLT follow1;
     MYFLT follow2;
     MYFLT last_freq;
@@ -1595,13 +1595,13 @@ Balance_filters_i(Balance *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *in2 = Stream_getData((Stream *)self->input2_stream);
     freq = PyFloat_AS_DOUBLE(self->freq);
-    
+
     if (freq < 0.1)
         freq = 0.1;
-    
+
     if (freq != self->last_freq) {
         self->factor = MYEXP(-1.0 / (self->sr / freq));
-        self->last_freq = freq;    
+        self->last_freq = freq;
     }
 
     for (i=0; i<self->bufsize; i++) {
@@ -1614,7 +1614,7 @@ Balance_filters_i(Balance *self) {
         absin = in2[i];
         if (absin < 0.0)
             absin = -absin;
-        self->follow2 = absin + self->factor * (self->follow2 - absin);        
+        self->follow2 = absin + self->factor * (self->follow2 - absin);
         self->data[i] = in[i] * (self->follow2 / self->follow1);
     }
 }
@@ -1626,15 +1626,15 @@ Balance_filters_a(Balance *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *in2 = Stream_getData((Stream *)self->input2_stream);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-        
+
     for (i=0; i<self->bufsize; i++) {
         freq = fr[i];
         if (freq < 0.1)
             freq = 0.1;
-        
+
         if (freq != self->last_freq) {
             self->factor = MYEXP(-1.0 / (self->sr / freq));
-            self->last_freq = freq;    
+            self->last_freq = freq;
         }
         absin = in[i];
         if (absin < 0.0)
@@ -1645,7 +1645,7 @@ Balance_filters_a(Balance *self) {
         absin = in2[i];
         if (absin < 0.0)
             absin = -absin;
-        self->follow2 = absin + self->factor * (self->follow2 - absin);        
+        self->follow2 = absin + self->factor * (self->follow2 - absin);
         self->data[i] = in[i] * (self->follow2 / self->follow1);
     }
 }
@@ -1666,50 +1666,50 @@ Balance_setProcMode(Balance *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Balance_filters_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Balance_filters_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Balance_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Balance_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Balance_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Balance_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Balance_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Balance_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Balance_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Balance_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Balance_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Balance_compute_next_data_frame(Balance *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1721,12 +1721,12 @@ Balance_traverse(Balance *self, visitproc visit, void *arg)
     Py_VISIT(self->input_stream);
     Py_VISIT(self->input2);
     Py_VISIT(self->input2_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
     return 0;
 }
 
-static int 
+static int
 Balance_clear(Balance *self)
 {
     pyo_CLEAR
@@ -1734,8 +1734,8 @@ Balance_clear(Balance *self)
     Py_CLEAR(self->input_stream);
     Py_CLEAR(self->input2);
     Py_CLEAR(self->input2_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
     return 0;
 }
 
@@ -1754,7 +1754,7 @@ Balance_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *input2tmp, *input2_streamtmp, *freqtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Balance *self;
     self = (Balance *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(10);
     self->follow1 = self->follow2 = 0.0;
     self->last_freq = -1.0;
@@ -1762,50 +1762,50 @@ Balance_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Balance_compute_next_data_frame);
     self->mode_func_ptr = Balance_setProcMode;
-    
+
     static char *kwlist[] = {"input", "input2", "freq", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OOO", kwlist, &inputtmp, &input2tmp, &freqtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     Py_XDECREF(self->input2);
     self->input2 = input2tmp;
     input2_streamtmp = PyObject_CallMethod((PyObject *)self->input2, "_getStream", NULL);
     Py_INCREF(input2_streamtmp);
     Py_XDECREF(self->input2_stream);
     self->input2_stream = (Stream *)input2_streamtmp;
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Balance_getServer(Balance* self) { GET_SERVER };
 static PyObject * Balance_getStream(Balance* self) { GET_STREAM };
-static PyObject * Balance_setMul(Balance *self, PyObject *arg) { SET_MUL };	
-static PyObject * Balance_setAdd(Balance *self, PyObject *arg) { SET_ADD };	
-static PyObject * Balance_setSub(Balance *self, PyObject *arg) { SET_SUB };	
-static PyObject * Balance_setDiv(Balance *self, PyObject *arg) { SET_DIV };	
+static PyObject * Balance_setMul(Balance *self, PyObject *arg) { SET_MUL };
+static PyObject * Balance_setAdd(Balance *self, PyObject *arg) { SET_ADD };
+static PyObject * Balance_setSub(Balance *self, PyObject *arg) { SET_SUB };
+static PyObject * Balance_setDiv(Balance *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Balance_play(Balance *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Balance_out(Balance *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1824,14 +1824,14 @@ static PyObject *
 Balance_setFreq(Balance *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -1847,9 +1847,9 @@ Balance_setFreq(Balance *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -1962,4 +1962,3 @@ PyTypeObject BalanceType = {
     0,                                              /* tp_alloc */
     Balance_new,                                     /* tp_new */
 };
-
diff --git a/src/objects/convolvemodule.c b/src/objects/convolvemodule.c
index f19da5a..d0f2c8e 100644
--- a/src/objects/convolvemodule.c
+++ b/src/objects/convolvemodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -36,7 +36,7 @@ typedef struct {
     PyObject *table;
     PyObject *input;
     Stream *input_stream;
-    int modebuffer[2]; // need at least 2 slots for mul & add 
+    int modebuffer[2]; // need at least 2 slots for mul & add
     MYFLT *input_tmp;
     int size;
     int count;
@@ -57,7 +57,7 @@ Convolve_filters(Convolve *self) {
                 tmp_count += self->size;
             self->data[i] += self->input_tmp[tmp_count--] * impulse[j];
         }
-        
+
         self->count++;
         if (self->count == self->size)
             self->count = 0;
@@ -80,44 +80,44 @@ Convolve_setProcMode(Convolve *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = Convolve_filters;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Convolve_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Convolve_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Convolve_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Convolve_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Convolve_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Convolve_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Convolve_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Convolve_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Convolve_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Convolve_compute_next_data_frame(Convolve *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -131,7 +131,7 @@ Convolve_traverse(Convolve *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Convolve_clear(Convolve *self)
 {
     pyo_CLEAR
@@ -157,20 +157,20 @@ Convolve_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *tabletmp, *multmp=NULL, *addtmp=NULL;
     Convolve *self;
     self = (Convolve *)type->tp_alloc(type, 0);
-    
+
     self->count = 0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Convolve_compute_next_data_frame);
     self->mode_func_ptr = Convolve_setProcMode;
 
     static char *kwlist[] = {"input", "table", "size", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OOi|OO", kwlist, &inputtmp, &tabletmp, &self->size, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     if ( PyObject_HasAttrString((PyObject *)tabletmp, "getTableStream") == 0 ) {
@@ -179,17 +179,17 @@ Convolve_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     }
     Py_XDECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tabletmp, "getTableStream", "");
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     self->input_tmp = (MYFLT *)realloc(self->input_tmp, self->size * sizeof(MYFLT));
@@ -202,10 +202,10 @@ Convolve_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Convolve_getServer(Convolve* self) { GET_SERVER };
 static PyObject * Convolve_getStream(Convolve* self) { GET_STREAM };
-static PyObject * Convolve_setMul(Convolve *self, PyObject *arg) { SET_MUL };	
-static PyObject * Convolve_setAdd(Convolve *self, PyObject *arg) { SET_ADD };	
-static PyObject * Convolve_setSub(Convolve *self, PyObject *arg) { SET_SUB };	
-static PyObject * Convolve_setDiv(Convolve *self, PyObject *arg) { SET_DIV };	
+static PyObject * Convolve_setMul(Convolve *self, PyObject *arg) { SET_MUL };
+static PyObject * Convolve_setAdd(Convolve *self, PyObject *arg) { SET_ADD };
+static PyObject * Convolve_setSub(Convolve *self, PyObject *arg) { SET_SUB };
+static PyObject * Convolve_setDiv(Convolve *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Convolve_play(Convolve *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Convolve_out(Convolve *self, PyObject *args, PyObject *kwds) { OUT };
@@ -231,19 +231,19 @@ static PyObject *
 Convolve_setTable(Convolve *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Convolve_members[] = {
 {"server", T_OBJECT_EX, offsetof(Convolve, server), 0, "Pyo server."},
@@ -364,7 +364,7 @@ typedef struct {
     Stream *freq_stream;
     PyObject *bandwidth;
     Stream *bandwidth_stream;
-    int modebuffer[4]; // need at least 2 slots for mul & add 
+    int modebuffer[4]; // need at least 2 slots for mul & add
     MYFLT *impulse;
     MYFLT *impulse_tmp;
     MYFLT *input_tmp;
@@ -377,14 +377,14 @@ typedef struct {
     MYFLT last_bandwidth;
 } IRWinSinc;
 
-static void 
+static void
 IRWinSinc_alloc_memory(IRWinSinc *self) {
     int i;
     if ((self->order % 2) != 0)
         self->order += 1;
-    
+
     self->size = self->order + 1;
-    
+
     self->input_tmp = (MYFLT *)realloc(self->input_tmp, self->size * sizeof(MYFLT));
     self->impulse = (MYFLT *)realloc(self->impulse, self->size * sizeof(MYFLT));
     self->impulse_tmp = (MYFLT *)realloc(self->impulse_tmp, self->size * sizeof(MYFLT));
@@ -397,12 +397,12 @@ static void
 IRWinSinc_create_impulse(IRWinSinc *self, MYFLT freq, MYFLT bandwidth) {
     int i, half, ipart;
     MYFLT val, fpart, sum, invSum, env, envPointer, envPointerScaling, sincScaling, w;
-    
+
     half = self->order / 2;
     sum = 0.0;
     envPointerScaling = 1.0 / self->size * 512.0;
     sincScaling = self->order / 2.0;
-    
+
     if (freq < 1)
         freq = 1.0;
     else if (freq > (self->sr*0.5))
@@ -412,12 +412,12 @@ IRWinSinc_create_impulse(IRWinSinc *self, MYFLT freq, MYFLT bandwidth) {
         bandwidth = 1.0;
     else if (bandwidth > (self->sr*0.5))
         bandwidth = self->sr*0.5;
-    
+
     if (self->filtertype <= 1)
         w = TWOPI * freq / self->sr;
     else
         w = TWOPI * (freq - bandwidth / 2.0) / self->sr;
-    
+
     /* LOWPASS */
     for (i=0; i<half; i++) {
         envPointer = i * envPointerScaling;
@@ -438,7 +438,7 @@ IRWinSinc_create_impulse(IRWinSinc *self, MYFLT freq, MYFLT bandwidth) {
     for (i=half+1; i<self->size; i++) {
         self->impulse[i] = self->impulse[self->order-i];
     }
-    
+
     /* HIGHPASS */
     if (self->filtertype == 1) {
         for (i=0; i<self->size; i++) {
@@ -446,7 +446,7 @@ IRWinSinc_create_impulse(IRWinSinc *self, MYFLT freq, MYFLT bandwidth) {
         }
         self->impulse[half] = self->impulse[half] + 1.0;
     }
-    
+
     /* BANDREJECT */
     if (self->filtertype >= 2) {
         sum = 0.0;
@@ -482,7 +482,7 @@ IRWinSinc_create_impulse(IRWinSinc *self, MYFLT freq, MYFLT bandwidth) {
             for (i=0; i<self->size; i++) {
                 self->impulse[i] = -self->impulse[i];
             }
-            self->impulse[half] = self->impulse[half] + 1.0;            
+            self->impulse[half] = self->impulse[half] + 1.0;
         }
     }
 }
@@ -491,9 +491,9 @@ static void
 IRWinSinc_filters(IRWinSinc *self) {
     int i,j,tmp_count;
     MYFLT freq, bw;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->modebuffer[2] == 0)
         freq = PyFloat_AS_DOUBLE(self->freq);
     else {
@@ -506,14 +506,14 @@ IRWinSinc_filters(IRWinSinc *self) {
         MYFLT *band = Stream_getData((Stream *)self->bandwidth_stream);
         bw = band[0];
     }
-    
+
     if (freq != self->last_freq || bw != self->last_bandwidth || self->changed == 1) {
         IRWinSinc_create_impulse(self, freq, bw);
         self->last_freq = freq;
         self->last_bandwidth = bw;
         self->changed = 0;
     }
-        
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = 0.0;
         tmp_count = self->count;
@@ -522,7 +522,7 @@ IRWinSinc_filters(IRWinSinc *self) {
                 tmp_count += self->size;
             self->data[i] += self->input_tmp[tmp_count--] * self->impulse[j];
         }
-        
+
         self->count++;
         if (self->count == self->size)
             self->count = 0;
@@ -545,44 +545,44 @@ IRWinSinc_setProcMode(IRWinSinc *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = IRWinSinc_filters;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = IRWinSinc_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = IRWinSinc_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = IRWinSinc_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = IRWinSinc_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = IRWinSinc_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = IRWinSinc_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = IRWinSinc_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = IRWinSinc_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = IRWinSinc_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 IRWinSinc_compute_next_data_frame(IRWinSinc *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -592,23 +592,23 @@ IRWinSinc_traverse(IRWinSinc *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->bandwidth);    
-    Py_VISIT(self->bandwidth_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->bandwidth);
+    Py_VISIT(self->bandwidth_stream);
     return 0;
 }
 
-static int 
+static int
 IRWinSinc_clear(IRWinSinc *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->bandwidth);    
-    Py_CLEAR(self->bandwidth_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->bandwidth);
+    Py_CLEAR(self->bandwidth_stream);
     return 0;
 }
 
@@ -630,7 +630,7 @@ IRWinSinc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *bandwidthtmp=NULL, *multmp=NULL, *addtmp=NULL;
     IRWinSinc *self;
     self = (IRWinSinc *)type->tp_alloc(type, 0);
-    
+
     self->last_freq = -1.0;
     self->last_bandwidth = -1.0;
     self->freq = PyFloat_FromDouble(1000.0);
@@ -643,16 +643,16 @@ IRWinSinc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, IRWinSinc_compute_next_data_frame);
     self->mode_func_ptr = IRWinSinc_setProcMode;
 
     static char *kwlist[] = {"input", "freq", "bw", "type", "order", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOiiOO", kwlist, &inputtmp, &freqtmp, &bandwidthtmp, &self->filtertype, &self->order, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     if (freqtmp) {
@@ -662,19 +662,19 @@ IRWinSinc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (bandwidthtmp) {
         PyObject_CallMethod((PyObject *)self, "setBandwidth", "O", bandwidthtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     IRWinSinc_alloc_memory(self);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -682,10 +682,10 @@ IRWinSinc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * IRWinSinc_getServer(IRWinSinc* self) { GET_SERVER };
 static PyObject * IRWinSinc_getStream(IRWinSinc* self) { GET_STREAM };
-static PyObject * IRWinSinc_setMul(IRWinSinc *self, PyObject *arg) { SET_MUL };	
-static PyObject * IRWinSinc_setAdd(IRWinSinc *self, PyObject *arg) { SET_ADD };	
-static PyObject * IRWinSinc_setSub(IRWinSinc *self, PyObject *arg) { SET_SUB };	
-static PyObject * IRWinSinc_setDiv(IRWinSinc *self, PyObject *arg) { SET_DIV };	
+static PyObject * IRWinSinc_setMul(IRWinSinc *self, PyObject *arg) { SET_MUL };
+static PyObject * IRWinSinc_setAdd(IRWinSinc *self, PyObject *arg) { SET_ADD };
+static PyObject * IRWinSinc_setSub(IRWinSinc *self, PyObject *arg) { SET_SUB };
+static PyObject * IRWinSinc_setDiv(IRWinSinc *self, PyObject *arg) { SET_DIV };
 
 static PyObject * IRWinSinc_play(IRWinSinc *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * IRWinSinc_out(IRWinSinc *self, PyObject *args, PyObject *kwds) { OUT };
@@ -704,14 +704,14 @@ static PyObject *
 IRWinSinc_setFreq(IRWinSinc *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -730,20 +730,20 @@ IRWinSinc_setFreq(IRWinSinc *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 IRWinSinc_setBandwidth(IRWinSinc *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->bandwidth);
@@ -762,19 +762,19 @@ IRWinSinc_setBandwidth(IRWinSinc *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 IRWinSinc_setType(IRWinSinc *self, PyObject *arg)
 {
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		self->filtertype = PyInt_AsLong(arg);
         self->changed = 1;
@@ -782,7 +782,7 @@ IRWinSinc_setType(IRWinSinc *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef IRWinSinc_members[] = {
     {"server", T_OBJECT_EX, offsetof(IRWinSinc, server), 0, "Pyo server."},
@@ -902,7 +902,7 @@ typedef struct {
     pyo_audio_HEAD
     PyObject *input;
     Stream *input_stream;
-    int modebuffer[2]; // need at least 2 slots for mul & add 
+    int modebuffer[2]; // need at least 2 slots for mul & add
     MYFLT *impulse;
     MYFLT *input_tmp;
     int count;
@@ -910,15 +910,15 @@ typedef struct {
     int size;
 } IRAverage;
 
-static void 
+static void
 IRAverage_alloc_memory(IRAverage *self) {
     int i;
     MYFLT val, sum;
     if ((self->order % 2) != 0)
         self->order += 1;
-    
+
     self->size = self->order + 1;
-    
+
     self->input_tmp = (MYFLT *)realloc(self->input_tmp, self->size * sizeof(MYFLT));
     self->impulse = (MYFLT *)realloc(self->impulse, self->size * sizeof(MYFLT));
 
@@ -937,9 +937,9 @@ IRAverage_alloc_memory(IRAverage *self) {
 static void
 IRAverage_filters(IRAverage *self) {
     int i,j,tmp_count;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-        
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = 0.0;
         tmp_count = self->count;
@@ -948,7 +948,7 @@ IRAverage_filters(IRAverage *self) {
                 tmp_count += self->size;
             self->data[i] += self->input_tmp[tmp_count--] * self->impulse[j];
         }
-        
+
         self->count++;
         if (self->count == self->size)
             self->count = 0;
@@ -971,44 +971,44 @@ IRAverage_setProcMode(IRAverage *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = IRAverage_filters;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = IRAverage_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = IRAverage_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = IRAverage_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = IRAverage_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = IRAverage_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = IRAverage_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = IRAverage_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = IRAverage_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = IRAverage_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 IRAverage_compute_next_data_frame(IRAverage *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1021,7 +1021,7 @@ IRAverage_traverse(IRAverage *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 IRAverage_clear(IRAverage *self)
 {
     pyo_CLEAR
@@ -1047,35 +1047,35 @@ IRAverage_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     IRAverage *self;
     self = (IRAverage *)type->tp_alloc(type, 0);
-    
+
     self->order = 32;
     self->count = 0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, IRAverage_compute_next_data_frame);
     self->mode_func_ptr = IRAverage_setProcMode;
 
     static char *kwlist[] = {"input", "order", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iOO", kwlist, &inputtmp, &self->order, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     IRAverage_alloc_memory(self);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -1083,10 +1083,10 @@ IRAverage_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * IRAverage_getServer(IRAverage* self) { GET_SERVER };
 static PyObject * IRAverage_getStream(IRAverage* self) { GET_STREAM };
-static PyObject * IRAverage_setMul(IRAverage *self, PyObject *arg) { SET_MUL };	
-static PyObject * IRAverage_setAdd(IRAverage *self, PyObject *arg) { SET_ADD };	
-static PyObject * IRAverage_setSub(IRAverage *self, PyObject *arg) { SET_SUB };	
-static PyObject * IRAverage_setDiv(IRAverage *self, PyObject *arg) { SET_DIV };	
+static PyObject * IRAverage_setMul(IRAverage *self, PyObject *arg) { SET_MUL };
+static PyObject * IRAverage_setAdd(IRAverage *self, PyObject *arg) { SET_ADD };
+static PyObject * IRAverage_setSub(IRAverage *self, PyObject *arg) { SET_SUB };
+static PyObject * IRAverage_setDiv(IRAverage *self, PyObject *arg) { SET_DIV };
 
 static PyObject * IRAverage_play(IRAverage *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * IRAverage_out(IRAverage *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1218,7 +1218,7 @@ typedef struct {
     Stream *freq_stream;
     PyObject *bandwidth;
     Stream *bandwidth_stream;
-    int modebuffer[4]; // need at least 2 slots for mul & add 
+    int modebuffer[4]; // need at least 2 slots for mul & add
     MYFLT *impulse;
     MYFLT *input_tmp;
     int count;
@@ -1230,14 +1230,14 @@ typedef struct {
     MYFLT last_bandwidth;
 } IRPulse;
 
-static void 
+static void
 IRPulse_alloc_memory(IRPulse *self) {
     int i;
     if ((self->order % 2) != 0)
         self->order += 1;
-    
+
     self->size = self->order + 1;
-    
+
     self->input_tmp = (MYFLT *)realloc(self->input_tmp, self->size * sizeof(MYFLT));
     self->impulse = (MYFLT *)realloc(self->impulse, self->size * sizeof(MYFLT));
     for (i=0; i<self->size; i++) {
@@ -1249,19 +1249,19 @@ static void
 IRPulse_create_impulse(IRPulse *self, MYFLT freq, MYFLT bandwidth) {
     int i, n, w, bw, dir, gate;
     MYFLT val, sum;
-    
+
     sum = 0.0;
-    
+
     if (freq < 1)
         freq = 1.0;
     else if (freq > (self->sr*0.5))
         freq = self->sr*0.5;
-    
+
     if (bandwidth < 1)
         bandwidth = 1.0;
     else if (bandwidth > (self->sr*0.5))
         bandwidth = self->sr*0.5;
-    
+
     switch (self->filtertype) {
         case 0:
             /* PULSE */
@@ -1296,11 +1296,11 @@ IRPulse_create_impulse(IRPulse *self, MYFLT freq, MYFLT bandwidth) {
                 else {
                     self->impulse[i] = 0.0;
                 }
-                
+
             }
             for (i=0; i<self->size; i++) {
                 self->impulse[i] /= sum;
-            }            
+            }
             break;
         case 2:
             /* PULSEODD */
@@ -1365,9 +1365,9 @@ static void
 IRPulse_filters(IRPulse *self) {
     int i,j,tmp_count;
     MYFLT freq, bw;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->modebuffer[2] == 0)
         freq = PyFloat_AS_DOUBLE(self->freq);
     else {
@@ -1380,14 +1380,14 @@ IRPulse_filters(IRPulse *self) {
         MYFLT *band = Stream_getData((Stream *)self->bandwidth_stream);
         bw = band[0];
     }
-    
+
     if (freq != self->last_freq || bw != self->last_bandwidth || self->changed == 1) {
         IRPulse_create_impulse(self, freq, bw);
         self->last_freq = freq;
         self->last_bandwidth = bw;
         self->changed = 0;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = 0.0;
         tmp_count = self->count;
@@ -1396,7 +1396,7 @@ IRPulse_filters(IRPulse *self) {
                 tmp_count += self->size;
             self->data[i] += self->input_tmp[tmp_count--] * self->impulse[j];
         }
-        
+
         self->count++;
         if (self->count == self->size)
             self->count = 0;
@@ -1419,44 +1419,44 @@ IRPulse_setProcMode(IRPulse *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = IRPulse_filters;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = IRPulse_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = IRPulse_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = IRPulse_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = IRPulse_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = IRPulse_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = IRPulse_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = IRPulse_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = IRPulse_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = IRPulse_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 IRPulse_compute_next_data_frame(IRPulse *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1466,23 +1466,23 @@ IRPulse_traverse(IRPulse *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->bandwidth);    
-    Py_VISIT(self->bandwidth_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->bandwidth);
+    Py_VISIT(self->bandwidth_stream);
     return 0;
 }
 
-static int 
+static int
 IRPulse_clear(IRPulse *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->bandwidth);    
-    Py_CLEAR(self->bandwidth_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->bandwidth);
+    Py_CLEAR(self->bandwidth_stream);
     return 0;
 }
 
@@ -1503,7 +1503,7 @@ IRPulse_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *bandwidthtmp=NULL, *multmp=NULL, *addtmp=NULL;
     IRPulse *self;
     self = (IRPulse *)type->tp_alloc(type, 0);
-    
+
     self->last_freq = -1.0;
     self->last_bandwidth = -1.0;
     self->freq = PyFloat_FromDouble(500.0);
@@ -1516,38 +1516,38 @@ IRPulse_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, IRPulse_compute_next_data_frame);
     self->mode_func_ptr = IRPulse_setProcMode;
 
     static char *kwlist[] = {"input", "freq", "bw", "type", "order", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOiiOO", kwlist, &inputtmp, &freqtmp, &bandwidthtmp, &self->filtertype, &self->order, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (bandwidthtmp) {
         PyObject_CallMethod((PyObject *)self, "setBandwidth", "O", bandwidthtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     IRPulse_alloc_memory(self);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -1555,10 +1555,10 @@ IRPulse_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * IRPulse_getServer(IRPulse* self) { GET_SERVER };
 static PyObject * IRPulse_getStream(IRPulse* self) { GET_STREAM };
-static PyObject * IRPulse_setMul(IRPulse *self, PyObject *arg) { SET_MUL };	
-static PyObject * IRPulse_setAdd(IRPulse *self, PyObject *arg) { SET_ADD };	
-static PyObject * IRPulse_setSub(IRPulse *self, PyObject *arg) { SET_SUB };	
-static PyObject * IRPulse_setDiv(IRPulse *self, PyObject *arg) { SET_DIV };	
+static PyObject * IRPulse_setMul(IRPulse *self, PyObject *arg) { SET_MUL };
+static PyObject * IRPulse_setAdd(IRPulse *self, PyObject *arg) { SET_ADD };
+static PyObject * IRPulse_setSub(IRPulse *self, PyObject *arg) { SET_SUB };
+static PyObject * IRPulse_setDiv(IRPulse *self, PyObject *arg) { SET_DIV };
 
 static PyObject * IRPulse_play(IRPulse *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * IRPulse_out(IRPulse *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1577,14 +1577,14 @@ static PyObject *
 IRPulse_setFreq(IRPulse *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -1600,23 +1600,23 @@ IRPulse_setFreq(IRPulse *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 IRPulse_setBandwidth(IRPulse *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->bandwidth);
@@ -1632,30 +1632,30 @@ IRPulse_setBandwidth(IRPulse *self, PyObject *arg)
         self->bandwidth_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 IRPulse_setType(IRPulse *self, PyObject *arg)
 {
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		self->filtertype = PyInt_AsLong(arg);
         self->changed = 1;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef IRPulse_members[] = {
     {"server", T_OBJECT_EX, offsetof(IRPulse, server), 0, "Pyo server."},
@@ -1781,7 +1781,7 @@ typedef struct {
     Stream *ratio_stream;
     PyObject *index;
     Stream *index_stream;
-    int modebuffer[5]; // need at least 2 slots for mul & add 
+    int modebuffer[5]; // need at least 2 slots for mul & add
     MYFLT *impulse;
     MYFLT *input_tmp;
     int count;
@@ -1792,14 +1792,14 @@ typedef struct {
     MYFLT last_index;
 } IRFM;
 
-static void 
+static void
 IRFM_alloc_memory(IRFM *self) {
     int i;
     if ((self->order % 2) != 0)
         self->order += 1;
-    
+
     self->size = self->order + 1;
-    
+
     self->input_tmp = (MYFLT *)realloc(self->input_tmp, self->size * sizeof(MYFLT));
     self->impulse = (MYFLT *)realloc(self->impulse, self->size * sizeof(MYFLT));
     for (i=0; i<self->size; i++) {
@@ -1816,12 +1816,12 @@ IRFM_create_impulse(IRFM *self, MYFLT carrier, MYFLT ratio, MYFLT index) {
         carrier = 1.0;
     else if (carrier > (self->sr*0.5))
         carrier = self->sr*0.5;
-    
+
     if (ratio < 0.0001)
         ratio = 0.0001;
     else if (ratio > (self->sr*0.5))
         ratio = self->sr*0.5;
-    
+
     if (index < 0)
         index = 0.0;
 
@@ -1847,9 +1847,9 @@ static void
 IRFM_filters(IRFM *self) {
     int i,j,tmp_count;
     MYFLT carrier, ratio, index;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->modebuffer[2] == 0)
         carrier = PyFloat_AS_DOUBLE(self->carrier);
     else {
@@ -1868,14 +1868,14 @@ IRFM_filters(IRFM *self) {
         MYFLT *ind = Stream_getData((Stream *)self->index_stream);
         index = ind[0];
     }
-    
+
     if (carrier != self->last_carrier || ratio != self->last_ratio || index != self->last_index) {
         IRFM_create_impulse(self, carrier, ratio, index);
         self->last_carrier = carrier;
         self->last_ratio = ratio;
         self->last_index = index;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = 0.0;
         tmp_count = self->count;
@@ -1884,7 +1884,7 @@ IRFM_filters(IRFM *self) {
                 tmp_count += self->size;
             self->data[i] += self->input_tmp[tmp_count--] * self->impulse[j];
         }
-        
+
         self->count++;
         if (self->count == self->size)
             self->count = 0;
@@ -1907,44 +1907,44 @@ IRFM_setProcMode(IRFM *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = IRFM_filters;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = IRFM_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = IRFM_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = IRFM_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = IRFM_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = IRFM_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = IRFM_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = IRFM_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = IRFM_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = IRFM_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 IRFM_compute_next_data_frame(IRFM *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1954,27 +1954,27 @@ IRFM_traverse(IRFM *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->carrier);    
-    Py_VISIT(self->carrier_stream);    
-    Py_VISIT(self->ratio);    
-    Py_VISIT(self->ratio_stream);    
-    Py_VISIT(self->index);    
-    Py_VISIT(self->index_stream);    
+    Py_VISIT(self->carrier);
+    Py_VISIT(self->carrier_stream);
+    Py_VISIT(self->ratio);
+    Py_VISIT(self->ratio_stream);
+    Py_VISIT(self->index);
+    Py_VISIT(self->index_stream);
     return 0;
 }
 
-static int 
+static int
 IRFM_clear(IRFM *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->carrier);    
-    Py_CLEAR(self->carrier_stream);    
-    Py_CLEAR(self->ratio);    
-    Py_CLEAR(self->ratio_stream);    
-    Py_CLEAR(self->index);    
-    Py_CLEAR(self->index_stream);    
+    Py_CLEAR(self->carrier);
+    Py_CLEAR(self->carrier_stream);
+    Py_CLEAR(self->ratio);
+    Py_CLEAR(self->ratio_stream);
+    Py_CLEAR(self->index);
+    Py_CLEAR(self->index_stream);
     return 0;
 }
 
@@ -1995,7 +1995,7 @@ IRFM_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *carriertmp=NULL, *ratiotmp=NULL, *indextmp=NULL, *multmp=NULL, *addtmp=NULL;
     IRFM *self;
     self = (IRFM *)type->tp_alloc(type, 0);
-    
+
     self->last_carrier = -1.0;
     self->last_ratio = -1.0;
     self->last_index = -1.0;
@@ -2009,22 +2009,22 @@ IRFM_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
 	self->modebuffer[4] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, IRFM_compute_next_data_frame);
     self->mode_func_ptr = IRFM_setProcMode;
 
     static char *kwlist[] = {"input", "carrier", "ratio", "index", "order", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOiOO", kwlist, &inputtmp, &carriertmp, &ratiotmp, &indextmp, &self->order, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (carriertmp) {
         PyObject_CallMethod((PyObject *)self, "setCarrier", "O", carriertmp);
     }
-    
+
     if (ratiotmp) {
         PyObject_CallMethod((PyObject *)self, "setRatio", "O", ratiotmp);
     }
@@ -2032,19 +2032,19 @@ IRFM_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (indextmp) {
         PyObject_CallMethod((PyObject *)self, "setIndex", "O", indextmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     IRFM_alloc_memory(self);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -2052,10 +2052,10 @@ IRFM_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * IRFM_getServer(IRFM* self) { GET_SERVER };
 static PyObject * IRFM_getStream(IRFM* self) { GET_STREAM };
-static PyObject * IRFM_setMul(IRFM *self, PyObject *arg) { SET_MUL };	
-static PyObject * IRFM_setAdd(IRFM *self, PyObject *arg) { SET_ADD };	
-static PyObject * IRFM_setSub(IRFM *self, PyObject *arg) { SET_SUB };	
-static PyObject * IRFM_setDiv(IRFM *self, PyObject *arg) { SET_DIV };	
+static PyObject * IRFM_setMul(IRFM *self, PyObject *arg) { SET_MUL };
+static PyObject * IRFM_setAdd(IRFM *self, PyObject *arg) { SET_ADD };
+static PyObject * IRFM_setSub(IRFM *self, PyObject *arg) { SET_SUB };
+static PyObject * IRFM_setDiv(IRFM *self, PyObject *arg) { SET_DIV };
 
 static PyObject * IRFM_play(IRFM *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * IRFM_out(IRFM *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2074,14 +2074,14 @@ static PyObject *
 IRFM_setCarrier(IRFM *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->carrier);
@@ -2097,23 +2097,23 @@ IRFM_setCarrier(IRFM *self, PyObject *arg)
         self->carrier_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 IRFM_setRatio(IRFM *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->ratio);
@@ -2129,23 +2129,23 @@ IRFM_setRatio(IRFM *self, PyObject *arg)
         self->ratio_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 IRFM_setIndex(IRFM *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->index);
@@ -2161,10 +2161,10 @@ IRFM_setIndex(IRFM *self, PyObject *arg)
         self->index_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef IRFM_members[] = {
     {"server", T_OBJECT_EX, offsetof(IRFM, server), 0, "Pyo server."},
@@ -2276,4 +2276,4 @@ PyTypeObject IRFMType = {
     0,                          /* tp_init */
     0,                                              /* tp_alloc */
     IRFM_new,                                     /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/delaymodule.c b/src/objects/delaymodule.c
index bec9a2b..aad6855 100644
--- a/src/objects/delaymodule.c
+++ b/src/objects/delaymodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -50,7 +50,7 @@ Delay_process_ii(Delay *self) {
 
     MYFLT del = PyFloat_AS_DOUBLE(self->delay);
     MYFLT feed = PyFloat_AS_DOUBLE(self->feedback);
-    
+
     if (del < self->oneOverSr)
         del = self->oneOverSr;
     else if (del > self->maxdelay)
@@ -61,9 +61,9 @@ Delay_process_ii(Delay *self) {
         feed = 0;
     else if (feed > 1)
         feed = 1;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         xind = self->in_count - sampdel;
         if (xind < 0)
@@ -72,7 +72,7 @@ Delay_process_ii(Delay *self) {
         frac = xind - ind;
         val = self->buffer[ind] * (1.0 - frac) + self->buffer[ind+1] * frac;
         self->data[i] = val;
-        
+
         self->buffer[self->in_count] = in[i] + (val * feed);
         if (self->in_count == 0)
             self->buffer[self->size] = self->buffer[self->in_count];
@@ -88,16 +88,16 @@ Delay_process_ai(Delay *self) {
     int i;
     long ind;
 
-    MYFLT *delobj = Stream_getData((Stream *)self->delay_stream);    
+    MYFLT *delobj = Stream_getData((Stream *)self->delay_stream);
     MYFLT feed = PyFloat_AS_DOUBLE(self->feedback);
 
     if (feed < 0)
         feed = 0;
     else if (feed > 1)
         feed = 1;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         del = delobj[i];
         if (del < self->oneOverSr)
@@ -112,7 +112,7 @@ Delay_process_ai(Delay *self) {
         frac = xind - ind;
         val = self->buffer[ind] * (1.0 - frac) + self->buffer[ind+1] * frac;
         self->data[i] = val;
-        
+
         self->buffer[self->in_count] = in[i]  + (val * feed);
         if (self->in_count == 0)
             self->buffer[self->size] = self->buffer[self->in_count];
@@ -127,18 +127,18 @@ Delay_process_ia(Delay *self) {
     MYFLT val, xind, frac, feed;
     int i;
     long ind;
-    
+
     MYFLT del = PyFloat_AS_DOUBLE(self->delay);
-    MYFLT *fdb = Stream_getData((Stream *)self->feedback_stream);    
-    
+    MYFLT *fdb = Stream_getData((Stream *)self->feedback_stream);
+
     if (del < self->oneOverSr)
         del = self->oneOverSr;
     else if (del > self->maxdelay)
         del = self->maxdelay;
     MYFLT sampdel = del * self->sr;
-       
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         xind = self->in_count - sampdel;
         if (xind < 0)
@@ -153,7 +153,7 @@ Delay_process_ia(Delay *self) {
             feed = 0;
         else if (feed > 1)
             feed = 1;
-        
+
         self->buffer[self->in_count] = in[i] + (val * feed);
         if (self->in_count == 0)
             self->buffer[self->size] = self->buffer[self->in_count];
@@ -168,12 +168,12 @@ Delay_process_aa(Delay *self) {
     MYFLT val, xind, frac, sampdel, feed, del;
     int i;
     long ind;
-    
-    MYFLT *delobj = Stream_getData((Stream *)self->delay_stream);    
-    MYFLT *fdb = Stream_getData((Stream *)self->feedback_stream);    
-  
+
+    MYFLT *delobj = Stream_getData((Stream *)self->delay_stream);
+    MYFLT *fdb = Stream_getData((Stream *)self->feedback_stream);
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         del = delobj[i];
         if (del < self->oneOverSr)
@@ -188,13 +188,13 @@ Delay_process_aa(Delay *self) {
         frac = xind - ind;
         val = self->buffer[ind] * (1.0 - frac) + self->buffer[ind+1] * frac;
         self->data[i] = val;
-        
+
         feed = fdb[i];
         if (feed < 0)
             feed = 0;
         else if (feed > 1)
             feed = 1;
-        
+
         self->buffer[self->in_count] = in[i] + (val * feed);
         if (self->in_count == 0)
             self->buffer[self->size] = self->buffer[self->in_count];
@@ -222,54 +222,54 @@ Delay_setProcMode(Delay *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Delay_process_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Delay_process_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = Delay_process_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Delay_process_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Delay_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Delay_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Delay_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Delay_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Delay_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Delay_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Delay_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Delay_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Delay_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 Delay_compute_next_data_frame(Delay *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -278,24 +278,24 @@ Delay_traverse(Delay *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->input);
-    Py_VISIT(self->input_stream);    
-    Py_VISIT(self->delay);    
-    Py_VISIT(self->delay_stream);    
-    Py_VISIT(self->feedback);    
-    Py_VISIT(self->feedback_stream);    
+    Py_VISIT(self->input_stream);
+    Py_VISIT(self->delay);
+    Py_VISIT(self->delay_stream);
+    Py_VISIT(self->feedback);
+    Py_VISIT(self->feedback_stream);
     return 0;
 }
 
-static int 
+static int
 Delay_clear(Delay *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
-    Py_CLEAR(self->input_stream);    
-    Py_CLEAR(self->delay);    
-    Py_CLEAR(self->delay_stream);    
-    Py_CLEAR(self->feedback);    
-    Py_CLEAR(self->feedback_stream);    
+    Py_CLEAR(self->input_stream);
+    Py_CLEAR(self->delay);
+    Py_CLEAR(self->delay_stream);
+    Py_CLEAR(self->feedback);
+    Py_CLEAR(self->feedback_stream);
     return 0;
 }
 
@@ -326,7 +326,7 @@ Delay_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[3] = 0;
 
     INIT_OBJECT_COMMON
-    
+
     self->oneOverSr = 1.0 / self->sr;
 
     Stream_setFunctionPtr(self->stream, Delay_compute_next_data_frame);
@@ -346,7 +346,7 @@ Delay_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (feedbacktmp) {
         PyObject_CallMethod((PyObject *)self, "setFeedback", "O", feedbacktmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
@@ -354,7 +354,7 @@ Delay_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-            
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     self->size = (long)(self->maxdelay * self->sr + 0.5);
@@ -362,19 +362,19 @@ Delay_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->buffer = (MYFLT *)realloc(self->buffer, (self->size+1) * sizeof(MYFLT));
     for (i=0; i<(self->size+1); i++) {
         self->buffer[i] = 0.;
-    }    
+    }
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Delay_getServer(Delay* self) { GET_SERVER };
 static PyObject * Delay_getStream(Delay* self) { GET_STREAM };
-static PyObject * Delay_setMul(Delay *self, PyObject *arg) { SET_MUL };	
-static PyObject * Delay_setAdd(Delay *self, PyObject *arg) { SET_ADD };	
-static PyObject * Delay_setSub(Delay *self, PyObject *arg) { SET_SUB };	
-static PyObject * Delay_setDiv(Delay *self, PyObject *arg) { SET_DIV };	
+static PyObject * Delay_setMul(Delay *self, PyObject *arg) { SET_MUL };
+static PyObject * Delay_setAdd(Delay *self, PyObject *arg) { SET_ADD };
+static PyObject * Delay_setSub(Delay *self, PyObject *arg) { SET_SUB };
+static PyObject * Delay_setDiv(Delay *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Delay_play(Delay *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Delay_out(Delay *self, PyObject *args, PyObject *kwds) { OUT };
@@ -393,12 +393,12 @@ static PyObject *
 Delay_setDelay(Delay *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
 
 	tmp = arg;
@@ -416,25 +416,25 @@ Delay_setDelay(Delay *self, PyObject *arg)
         self->delay_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Delay_setFeedback(Delay *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->feedback);
@@ -450,12 +450,12 @@ Delay_setFeedback(Delay *self, PyObject *arg)
         self->feedback_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Delay_reset(Delay *self)
@@ -463,7 +463,7 @@ Delay_reset(Delay *self)
     int i;
     for (i=0; i<(self->size+1); i++) {
         self->buffer[i] = 0.;
-    }    
+    }
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -594,11 +594,11 @@ typedef struct {
 
 static void
 SDelay_process_i(SDelay *self) {
-    int i; 
+    int i;
     long ind;
-    
+
     MYFLT del = PyFloat_AS_DOUBLE(self->delay);
-    
+
     if (del < 0.)
         del = 0.;
     else if (del > self->maxdelay)
@@ -615,13 +615,13 @@ SDelay_process_i(SDelay *self) {
                 self->in_count = 0;
         }
     }
-    else {    
+    else {
         for (i=0; i<self->bufsize; i++) {
             ind = self->in_count - sampdel;
             if (ind < 0)
                 ind += self->size;
             self->data[i] = self->buffer[ind];
-        
+
             self->buffer[self->in_count] = in[i];
             self->in_count++;
             if (self->in_count >= self->size)
@@ -633,12 +633,12 @@ SDelay_process_i(SDelay *self) {
 static void
 SDelay_process_a(SDelay *self) {
     MYFLT del;
-    int i; 
+    int i;
     long ind, sampdel;
-    
+
     MYFLT *delobj = Stream_getData((Stream *)self->delay_stream);
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         del = delobj[i];
         if (del < 0.)
@@ -677,50 +677,50 @@ SDelay_setProcMode(SDelay *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = SDelay_process_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = SDelay_process_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = SDelay_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = SDelay_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = SDelay_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = SDelay_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = SDelay_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = SDelay_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = SDelay_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = SDelay_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = SDelay_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 SDelay_compute_next_data_frame(SDelay *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -729,20 +729,20 @@ SDelay_traverse(SDelay *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->input);
-    Py_VISIT(self->input_stream);    
-    Py_VISIT(self->delay);    
-    Py_VISIT(self->delay_stream);    
+    Py_VISIT(self->input_stream);
+    Py_VISIT(self->delay);
+    Py_VISIT(self->delay_stream);
     return 0;
 }
 
-static int 
+static int
 SDelay_clear(SDelay *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
-    Py_CLEAR(self->input_stream);    
-    Py_CLEAR(self->delay);    
-    Py_CLEAR(self->delay_stream);    
+    Py_CLEAR(self->input_stream);
+    Py_CLEAR(self->delay);
+    Py_CLEAR(self->delay_stream);
     return 0;
 }
 
@@ -762,46 +762,46 @@ SDelay_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *delaytmp=NULL, *multmp=NULL, *addtmp=NULL;
     SDelay *self;
     self = (SDelay *)type->tp_alloc(type, 0);
-    
+
     self->delay = PyFloat_FromDouble(0.25);
     self->maxdelay = 1;
     self->in_count = 0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, SDelay_compute_next_data_frame);
     self->mode_func_ptr = SDelay_setProcMode;
 
     static char *kwlist[] = {"input", "delay", "maxdelay", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_OFOO, kwlist, &inputtmp, &delaytmp, &self->maxdelay, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (delaytmp) {
         PyObject_CallMethod((PyObject *)self, "setDelay", "O", delaytmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->size = (long)(self->maxdelay * self->sr + 0.5);
-    
+
     self->buffer = (MYFLT *)realloc(self->buffer, (self->size+1) * sizeof(MYFLT));
     for (i=0; i<(self->size+1); i++) {
         self->buffer[i] = 0.;
-    }    
-    
+    }
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -809,10 +809,10 @@ SDelay_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * SDelay_getServer(SDelay* self) { GET_SERVER };
 static PyObject * SDelay_getStream(SDelay* self) { GET_STREAM };
-static PyObject * SDelay_setMul(SDelay *self, PyObject *arg) { SET_MUL };	
-static PyObject * SDelay_setAdd(SDelay *self, PyObject *arg) { SET_ADD };	
-static PyObject * SDelay_setSub(SDelay *self, PyObject *arg) { SET_SUB };	
-static PyObject * SDelay_setDiv(SDelay *self, PyObject *arg) { SET_DIV };	
+static PyObject * SDelay_setMul(SDelay *self, PyObject *arg) { SET_MUL };
+static PyObject * SDelay_setAdd(SDelay *self, PyObject *arg) { SET_ADD };
+static PyObject * SDelay_setSub(SDelay *self, PyObject *arg) { SET_SUB };
+static PyObject * SDelay_setDiv(SDelay *self, PyObject *arg) { SET_DIV };
 
 static PyObject * SDelay_play(SDelay *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * SDelay_out(SDelay *self, PyObject *args, PyObject *kwds) { OUT };
@@ -831,14 +831,14 @@ static PyObject *
 SDelay_setDelay(SDelay *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->delay);
@@ -854,12 +854,12 @@ SDelay_setDelay(SDelay *self, PyObject *arg)
         self->delay_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 SDelay_reset(SDelay *self)
@@ -867,7 +867,7 @@ SDelay_reset(SDelay *self)
     int i;
     for (i=0; i<(self->size+1); i++) {
         self->buffer[i] = 0.;
-    }    
+    }
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -1013,9 +1013,9 @@ static void
 Waveguide_process_ii(Waveguide *self) {
     MYFLT val, x, y, sampdel, frac, feed, tmp;
     int i, ind, isamp;
-    
+
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
-    MYFLT dur = PyFloat_AS_DOUBLE(self->dur); 
+    MYFLT dur = PyFloat_AS_DOUBLE(self->dur);
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
 
     /* Check boundaries */
@@ -1023,11 +1023,11 @@ Waveguide_process_ii(Waveguide *self) {
         fr = self->minfreq;
     else if (fr >= self->nyquist)
         fr = self->nyquist;
-    
+
     if (dur <= 0)
         dur = 0.1;
-    
-    
+
+
     sampdel = self->lastSampDel;
     feed = self->lastFeed;
     /* lagrange coeffs and feedback coeff */
@@ -1042,25 +1042,25 @@ Waveguide_process_ii(Waveguide *self) {
         self->coeffs[2] = frac*(frac-1)*(frac-3)*(frac-4)/4.0;
         self->coeffs[3] = -frac*(frac-1)*(frac-2)*(frac-4)/6.0;
         self->coeffs[4] = frac*(frac-1)*(frac-2)*(frac-3)/24.0;
-        
+
         self->lastDur = dur;
         feed = MYPOW(100, -1.0/(fr*dur));
         self->lastFeed = feed;
-    } 
+    }
     else if (dur != self->lastDur) {
         self->lastDur = dur;
         feed = MYPOW(100, -1.0/(fr*dur));
         self->lastFeed = feed;
     }
-    
+
     /* pick a new value in th delay line */
-    isamp = (int)sampdel;  
+    isamp = (int)sampdel;
     for (i=0; i<self->bufsize; i++) {
         ind = self->in_count - isamp;
         if (ind < 0)
             ind += self->size;
         val = self->buffer[ind];
-        
+
         /* simple lowpass filtering */
         tmp = val;
         val = (val + self->lpsamp) * 0.5;
@@ -1080,7 +1080,7 @@ Waveguide_process_ii(Waveguide *self) {
         self->yn1 = y;
 
         self->data[i] = y;
-        
+
         /* write current value in the delay line */
         self->buffer[self->in_count] = in[i] + (x * feed);
         if (self->in_count == 0)
@@ -1095,11 +1095,11 @@ static void
 Waveguide_process_ai(Waveguide *self) {
     MYFLT val, x, y, sampdel, frac, feed, freq, tmp;
     int i, ind, isamp;
-    
+
     MYFLT *fr =Stream_getData((Stream *)self->freq_stream);
-    MYFLT dur = PyFloat_AS_DOUBLE(self->dur); 
+    MYFLT dur = PyFloat_AS_DOUBLE(self->dur);
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     /* Check dur boundary */
     if (dur <= 0)
         dur = 0.1;
@@ -1126,7 +1126,7 @@ Waveguide_process_ai(Waveguide *self) {
             self->coeffs[2] = frac*(frac-1)*(frac-3)*(frac-4)/4.0;
             self->coeffs[3] = -frac*(frac-1)*(frac-2)*(frac-4)/6.0;
             self->coeffs[4] = frac*(frac-1)*(frac-2)*(frac-3)/24.0;
-            
+
             self->lastDur = dur;
             feed = MYPOW(100, -1.0/(freq*dur));
             self->lastFeed = feed;
@@ -1138,18 +1138,18 @@ Waveguide_process_ai(Waveguide *self) {
         }
 
         /* pick a new value in th delay line */
-        isamp = (int)sampdel;        
-        
+        isamp = (int)sampdel;
+
         ind = self->in_count - isamp;
         if (ind < 0)
             ind += self->size;
         val = self->buffer[ind];
-        
+
         /* simple lowpass filtering */
         tmp = val;
         val = (val + self->lpsamp) * 0.5;
         self->lpsamp = tmp;
-        
+
         /* lagrange filtering */
         x = (val*self->coeffs[0])+(self->lagrange[0]*self->coeffs[1])+(self->lagrange[1]*self->coeffs[2])+
             (self->lagrange[2]*self->coeffs[3])+(self->lagrange[3]*self->coeffs[4]);
@@ -1162,9 +1162,9 @@ Waveguide_process_ai(Waveguide *self) {
         y = x - self->xn1 + 0.995 * self->yn1;
         self->xn1 = x;
         self->yn1 = y;
-        
+
         self->data[i] = y;
-        
+
         /* write current value in the delay line */
         self->buffer[self->in_count] = in[i] + (x * feed);
         if (self->in_count == 0)
@@ -1180,11 +1180,11 @@ static void
 Waveguide_process_ia(Waveguide *self) {
     MYFLT val, x, y, sampdel, frac, feed, dur, tmp;
     int i, ind, isamp;
-    
+
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *du = Stream_getData((Stream *)self->dur_stream);
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     /* Check boundaries */
     if (fr < self->minfreq)
         fr = self->minfreq;
@@ -1205,9 +1205,9 @@ Waveguide_process_ia(Waveguide *self) {
         self->coeffs[3] = -frac*(frac-1)*(frac-2)*(frac-4)/6.0;
         self->coeffs[4] = frac*(frac-1)*(frac-2)*(frac-3)/24.0;
     }
-    
+
     /* pick a new value in th delay line */
-    isamp = (int)sampdel;  
+    isamp = (int)sampdel;
     for (i=0; i<self->bufsize; i++) {
         feed = self->lastFeed;
         dur = du[i];
@@ -1222,12 +1222,12 @@ Waveguide_process_ia(Waveguide *self) {
         if (ind < 0)
             ind += self->size;
         val = self->buffer[ind];
-        
+
         /* simple lowpass filtering */
         tmp = val;
         val = (val + self->lpsamp) * 0.5;
         self->lpsamp = tmp;
-        
+
         /* lagrange filtering */
         x = (val*self->coeffs[0])+(self->lagrange[0]*self->coeffs[1])+(self->lagrange[1]*self->coeffs[2])+
             (self->lagrange[2]*self->coeffs[3])+(self->lagrange[3]*self->coeffs[4]);
@@ -1240,9 +1240,9 @@ Waveguide_process_ia(Waveguide *self) {
         y = x - self->xn1 + 0.995 * self->yn1;
         self->xn1 = x;
         self->yn1 = y;
-        
+
         self->data[i] = y;
-        
+
         /* write current value in the delay line */
         self->buffer[self->in_count] = in[i] + (x * feed);
         if (self->in_count == 0)
@@ -1258,11 +1258,11 @@ static void
 Waveguide_process_aa(Waveguide *self) {
     MYFLT val, x, y, sampdel, frac, feed, freq, dur, tmp;
     int i, ind, isamp;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    MYFLT *du = Stream_getData((Stream *)self->dur_stream); 
+    MYFLT *du = Stream_getData((Stream *)self->dur_stream);
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         freq = fr[i];
         dur = du[i];
@@ -1274,7 +1274,7 @@ Waveguide_process_aa(Waveguide *self) {
 
         if (dur <= 0)
             dur = 0.1;
-        
+
         sampdel = self->lastSampDel;
         feed = self->lastFeed;
         /* lagrange coeffs and feedback coeff */
@@ -1289,7 +1289,7 @@ Waveguide_process_aa(Waveguide *self) {
             self->coeffs[2] = frac*(frac-1)*(frac-3)*(frac-4)/4.0;
             self->coeffs[3] = -frac*(frac-1)*(frac-2)*(frac-4)/6.0;
             self->coeffs[4] = frac*(frac-1)*(frac-2)*(frac-3)/24.0;
-            
+
             self->lastDur = dur;
             feed = MYPOW(100, -1.0/(freq*dur));
             self->lastFeed = feed;
@@ -1299,20 +1299,20 @@ Waveguide_process_aa(Waveguide *self) {
             feed = MYPOW(100, -1.0/(freq*dur));
             self->lastFeed = feed;
         }
-        
+
         /* pick a new value in th delay line */
-        isamp = (int)sampdel;        
-        
+        isamp = (int)sampdel;
+
         ind = self->in_count - isamp;
         if (ind < 0)
             ind += self->size;
         val = self->buffer[ind];
-        
+
         /* simple lowpass filtering */
         tmp = val;
         val = (val + self->lpsamp) * 0.5;
         self->lpsamp = tmp;
-        
+
         /* lagrange filtering */
         x = (val*self->coeffs[0])+(self->lagrange[0]*self->coeffs[1])+(self->lagrange[1]*self->coeffs[2])+
             (self->lagrange[2]*self->coeffs[3])+(self->lagrange[3]*self->coeffs[4]);
@@ -1320,14 +1320,14 @@ Waveguide_process_aa(Waveguide *self) {
         self->lagrange[2] = self->lagrange[1];
         self->lagrange[1] = self->lagrange[0];
         self->lagrange[0] = val;
-  
+
         /* DC filtering */
         y = x - self->xn1 + 0.995 * self->yn1;
         self->xn1 = x;
         self->yn1 = y;
-        
+
         self->data[i] = y;
-        
+
         /* write current value in the delay line */
         self->buffer[self->in_count] = in[i] + (x * feed);
         if (self->in_count == 0)
@@ -1354,56 +1354,56 @@ Waveguide_setProcMode(Waveguide *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Waveguide_process_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Waveguide_process_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = Waveguide_process_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Waveguide_process_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Waveguide_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Waveguide_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Waveguide_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Waveguide_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Waveguide_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Waveguide_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Waveguide_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Waveguide_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Waveguide_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 Waveguide_compute_next_data_frame(Waveguide *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1412,24 +1412,24 @@ Waveguide_traverse(Waveguide *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->input);
-    Py_VISIT(self->input_stream);    
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->dur);    
-    Py_VISIT(self->dur_stream);    
+    Py_VISIT(self->input_stream);
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->dur);
+    Py_VISIT(self->dur_stream);
     return 0;
 }
 
-static int 
+static int
 Waveguide_clear(Waveguide *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
-    Py_CLEAR(self->input_stream);    
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->dur);    
-    Py_CLEAR(self->dur_stream);    
+    Py_CLEAR(self->input_stream);
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->dur);
+    Py_CLEAR(self->dur_stream);
     return 0;
 }
 
@@ -1449,7 +1449,7 @@ Waveguide_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *durtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Waveguide *self;
     self = (Waveguide *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(100);
     self->dur = PyFloat_FromDouble(0.99);
     self->minfreq = 20;
@@ -1461,64 +1461,64 @@ Waveguide_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->lpsamp = 0.0;
     for(i=0; i<4; i++) {
         self->lagrange[i] = 0.0;
-    }    
+    }
     self->xn1 = 0.0;
     self->yn1 = 0.0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-    
+
     INIT_OBJECT_COMMON
-    
+
     self->nyquist = (MYFLT)self->sr * 0.45;
 
     Stream_setFunctionPtr(self->stream, Waveguide_compute_next_data_frame);
     self->mode_func_ptr = Waveguide_setProcMode;
 
     static char *kwlist[] = {"input", "freq", "dur", "minfreq", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_OOFOO, kwlist, &inputtmp, &freqtmp, &durtmp, &self->minfreq, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (durtmp) {
         PyObject_CallMethod((PyObject *)self, "setDur", "O", durtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->size = (long)(1.0 / self->minfreq * self->sr + 0.5);
-    
+
     self->buffer = (MYFLT *)realloc(self->buffer, (self->size+1) * sizeof(MYFLT));
     for (i=0; i<(self->size+1); i++) {
         self->buffer[i] = 0.;
-    }    
-    
+    }
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Waveguide_getServer(Waveguide* self) { GET_SERVER };
 static PyObject * Waveguide_getStream(Waveguide* self) { GET_STREAM };
-static PyObject * Waveguide_setMul(Waveguide *self, PyObject *arg) { SET_MUL };	
-static PyObject * Waveguide_setAdd(Waveguide *self, PyObject *arg) { SET_ADD };	
-static PyObject * Waveguide_setSub(Waveguide *self, PyObject *arg) { SET_SUB };	
-static PyObject * Waveguide_setDiv(Waveguide *self, PyObject *arg) { SET_DIV };	
+static PyObject * Waveguide_setMul(Waveguide *self, PyObject *arg) { SET_MUL };
+static PyObject * Waveguide_setAdd(Waveguide *self, PyObject *arg) { SET_ADD };
+static PyObject * Waveguide_setSub(Waveguide *self, PyObject *arg) { SET_SUB };
+static PyObject * Waveguide_setDiv(Waveguide *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Waveguide_play(Waveguide *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Waveguide_out(Waveguide *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1537,14 +1537,14 @@ static PyObject *
 Waveguide_setFreq(Waveguide *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -1560,25 +1560,25 @@ Waveguide_setFreq(Waveguide *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Waveguide_setDur(Waveguide *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->dur);
@@ -1594,12 +1594,12 @@ Waveguide_setDur(Waveguide *self, PyObject *arg)
         self->dur_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Waveguide_members[] = {
 {"server", T_OBJECT_EX, offsetof(Waveguide, server), 0, "Pyo server."},
@@ -1745,12 +1745,12 @@ AllpassWG_process_iii(AllpassWG *self) {
     int i, j;
     long ind;
     MYFLT val, y, xind, sampdel, frac, freqshift, alpsampdel, alpsampdelin, alpdetune;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
-    MYFLT feed = PyFloat_AS_DOUBLE(self->feed); 
+    MYFLT feed = PyFloat_AS_DOUBLE(self->feed);
     MYFLT detune = PyFloat_AS_DOUBLE(self->detune);
-    
+
     /* Check boundaries */
     if (fr < self->minfreq)
         fr = self->minfreq;
@@ -1767,7 +1767,7 @@ AllpassWG_process_iii(AllpassWG *self) {
         detune = 0.05;
     else if (detune > 1.0)
         detune = 1.0;
-    
+
     sampdel = self->sr / (fr * freqshift);
     alpdetune = detune * self->alpsize;
 
@@ -1779,7 +1779,7 @@ AllpassWG_process_iii(AllpassWG *self) {
         ind = (long)xind;
         frac = xind - ind;
         val = self->buffer[ind] + (self->buffer[ind+1] - self->buffer[ind]) * frac;
-        
+
         /* all-pass filter */
         for (j=0; j<3; j++) {
             xind = self->alp_in_count[j] - (alpdetune * alp_chorus_factor[j]);
@@ -1798,19 +1798,19 @@ AllpassWG_process_iii(AllpassWG *self) {
             if (self->alp_in_count[j] == self->alpsize)
                 self->alp_in_count[j] = 0;
         }
-        
+
         /* DC filtering and output */
         y = val - self->xn1 + 0.995 * self->yn1;
         self->xn1 = val;
         self->data[i] = self->yn1 = y;
-        
+
         /* write current value in the delay line */
         self->buffer[self->in_count] = in[i] + val * feed;
         if (self->in_count == 0)
             self->buffer[self->size] = self->buffer[0];
         self->in_count++;
         if (self->in_count == self->size)
-            self->in_count = 0;        
+            self->in_count = 0;
     }
 }
 
@@ -1819,12 +1819,12 @@ AllpassWG_process_aii(AllpassWG *self) {
     int i, j;
     long ind;
     MYFLT val, y, xind, sampdel, frac, fr, freqshift, alpsampdel, alpsampdelin, alpdetune;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *freq = Stream_getData((Stream *)self->freq_stream);
-    MYFLT feed = PyFloat_AS_DOUBLE(self->feed); 
+    MYFLT feed = PyFloat_AS_DOUBLE(self->feed);
     MYFLT detune = PyFloat_AS_DOUBLE(self->detune);
-    
+
     feed *= 0.4525;
     if (feed > 0.4525)
         feed = 0.4525;
@@ -1836,7 +1836,7 @@ AllpassWG_process_aii(AllpassWG *self) {
         detune = 0.05;
     else if (detune > 1.0)
         detune = 1.0;
-    
+
     alpdetune = detune * self->alpsize;
     for (i=0; i<self->bufsize; i++) {
         fr = freq[i];
@@ -1844,7 +1844,7 @@ AllpassWG_process_aii(AllpassWG *self) {
             fr = self->minfreq;
         else if (fr >= self->nyquist)
             fr = self->nyquist;
-        
+
         /* pick a new value in the delay line */
         sampdel = self->sr / (fr * freqshift);
         xind = self->in_count - sampdel;
@@ -1853,7 +1853,7 @@ AllpassWG_process_aii(AllpassWG *self) {
         ind = (long)xind;
         frac = xind - ind;
         val = self->buffer[ind] + (self->buffer[ind+1] - self->buffer[ind]) * frac;
-        
+
         /* all-pass filter */
         for (j=0; j<3; j++) {
             xind = self->alp_in_count[j] - (alpdetune * alp_chorus_factor[j]);
@@ -1872,19 +1872,19 @@ AllpassWG_process_aii(AllpassWG *self) {
             if (self->alp_in_count[j] == self->alpsize)
                 self->alp_in_count[j] = 0;
         }
-        
+
         /* DC filtering and output */
         y = val - self->xn1 + 0.995 * self->yn1;
         self->xn1 = val;
         self->data[i] = self->yn1 = y;
-        
+
         /* write current value in the delay line */
         self->buffer[self->in_count] = in[i] + val * feed;
         if (self->in_count == 0)
             self->buffer[self->size] = self->buffer[0];
         self->in_count++;
         if (self->in_count == self->size)
-            self->in_count = 0;        
+            self->in_count = 0;
     }
 }
 
@@ -1893,12 +1893,12 @@ AllpassWG_process_iai(AllpassWG *self) {
     int i, j;
     long ind;
     MYFLT val, y, xind, sampdel, frac, feed, freqshift, alpsampdel, alpsampdelin, alpdetune;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
-    MYFLT *fdb = Stream_getData((Stream *)self->feed_stream); 
+    MYFLT *fdb = Stream_getData((Stream *)self->feed_stream);
     MYFLT detune = PyFloat_AS_DOUBLE(self->detune);
-    
+
     /* Check boundaries */
     if (fr < self->minfreq)
         fr = self->minfreq;
@@ -1910,10 +1910,10 @@ AllpassWG_process_iai(AllpassWG *self) {
         detune = 0.05;
     else if (detune > 1.0)
         detune = 1.0;
-    
+
     sampdel = self->sr / (fr * freqshift);
     alpdetune = detune * self->alpsize;
-    
+
     for (i=0; i<self->bufsize; i++) {
         feed = fdb[i] * 0.4525;
         if (feed > 0.4525)
@@ -1927,7 +1927,7 @@ AllpassWG_process_iai(AllpassWG *self) {
         ind = (long)xind;
         frac = xind - ind;
         val = self->buffer[ind] + (self->buffer[ind+1] - self->buffer[ind]) * frac;
-        
+
         /* all-pass filter */
         for (j=0; j<3; j++) {
             xind = self->alp_in_count[j] - (alpdetune * alp_chorus_factor[j]);
@@ -1946,19 +1946,19 @@ AllpassWG_process_iai(AllpassWG *self) {
             if (self->alp_in_count[j] == self->alpsize)
                 self->alp_in_count[j] = 0;
         }
-        
+
         /* DC filtering and output */
         y = val - self->xn1 + 0.995 * self->yn1;
         self->xn1 = val;
         self->data[i] = self->yn1 = y;
-        
+
         /* write current value in the delay line */
         self->buffer[self->in_count] = in[i] + val * feed;
         if (self->in_count == 0)
             self->buffer[self->size] = self->buffer[0];
         self->in_count++;
         if (self->in_count == self->size)
-            self->in_count = 0;        
+            self->in_count = 0;
     }
 }
 
@@ -1967,19 +1967,19 @@ AllpassWG_process_aai(AllpassWG *self) {
     int i, j;
     long ind;
     MYFLT val, y, xind, sampdel, frac, fr, feed, freqshift, alpsampdel, alpsampdelin, alpdetune;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *freq = Stream_getData((Stream *)self->freq_stream);
-    MYFLT *fdb = Stream_getData((Stream *)self->feed_stream); 
+    MYFLT *fdb = Stream_getData((Stream *)self->feed_stream);
     MYFLT detune = PyFloat_AS_DOUBLE(self->detune);
-    
+
     freqshift = detune * 0.5 + 1.;
     detune = detune * 0.95 + 0.05;
     if (detune < 0.05)
         detune = 0.05;
     else if (detune > 1.0)
         detune = 1.0;
-    
+
     alpdetune = detune * self->alpsize;
     for (i=0; i<self->bufsize; i++) {
         fr = freq[i];
@@ -1992,7 +1992,7 @@ AllpassWG_process_aai(AllpassWG *self) {
             feed = 0.4525;
         else if (feed < 0)
             feed = 0;
-        
+
         /* pick a new value in the delay line */
         sampdel = self->sr / (fr * freqshift);
         xind = self->in_count - sampdel;
@@ -2001,7 +2001,7 @@ AllpassWG_process_aai(AllpassWG *self) {
         ind = (long)xind;
         frac = xind - ind;
         val = self->buffer[ind] + (self->buffer[ind+1] - self->buffer[ind]) * frac;
-        
+
         /* all-pass filter */
         for (j=0; j<3; j++) {
             xind = self->alp_in_count[j] - (alpdetune * alp_chorus_factor[j]);
@@ -2020,19 +2020,19 @@ AllpassWG_process_aai(AllpassWG *self) {
             if (self->alp_in_count[j] == self->alpsize)
                 self->alp_in_count[j] = 0;
         }
-        
+
         /* DC filtering and output */
         y = val - self->xn1 + 0.995 * self->yn1;
         self->xn1 = val;
         self->data[i] = self->yn1 = y;
-        
+
         /* write current value in the delay line */
         self->buffer[self->in_count] = in[i] + val * feed;
         if (self->in_count == 0)
             self->buffer[self->size] = self->buffer[0];
         self->in_count++;
         if (self->in_count == self->size)
-            self->in_count = 0;        
+            self->in_count = 0;
     }
 }
 
@@ -2041,12 +2041,12 @@ AllpassWG_process_iia(AllpassWG *self) {
     int i, j;
     long ind;
     MYFLT val, y, xind, sampdel, frac, detune, freqshift, alpsampdel, alpsampdelin, alpdetune;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
-    MYFLT feed = PyFloat_AS_DOUBLE(self->feed); 
+    MYFLT feed = PyFloat_AS_DOUBLE(self->feed);
     MYFLT *det = Stream_getData((Stream *)self->detune_stream);
-    
+
     /* Check boundaries */
     if (fr < self->minfreq)
         fr = self->minfreq;
@@ -2057,7 +2057,7 @@ AllpassWG_process_iia(AllpassWG *self) {
         feed = 0.4525;
     else if (feed < 0)
         feed = 0;
-    
+
     for (i=0; i<self->bufsize; i++) {
         detune = det[i];
         freqshift = detune * 0.5 + 1.;
@@ -2066,7 +2066,7 @@ AllpassWG_process_iia(AllpassWG *self) {
             detune = 0.05;
         else if (detune > 1.0)
             detune = 1.0;
-        
+
         /* pick a new value in the delay line */
         sampdel = self->sr / (fr * freqshift);
         xind = self->in_count - sampdel;
@@ -2075,7 +2075,7 @@ AllpassWG_process_iia(AllpassWG *self) {
         ind = (long)xind;
         frac = xind - ind;
         val = self->buffer[ind] + (self->buffer[ind+1] - self->buffer[ind]) * frac;
-        
+
         /* all-pass filter */
         alpdetune = detune * self->alpsize;
         for (j=0; j<3; j++) {
@@ -2107,7 +2107,7 @@ AllpassWG_process_iia(AllpassWG *self) {
             self->buffer[self->size] = self->buffer[0];
         self->in_count++;
         if (self->in_count == self->size)
-            self->in_count = 0;        
+            self->in_count = 0;
     }
 }
 
@@ -2116,18 +2116,18 @@ AllpassWG_process_aia(AllpassWG *self) {
     int i, j;
     long ind;
     MYFLT val, y, xind, sampdel, frac, fr, detune, freqshift, alpsampdel, alpsampdelin, alpdetune;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *freq = Stream_getData((Stream *)self->freq_stream);
-    MYFLT feed = PyFloat_AS_DOUBLE(self->feed); 
+    MYFLT feed = PyFloat_AS_DOUBLE(self->feed);
     MYFLT *det = Stream_getData((Stream *)self->detune_stream);
-    
+
     feed *= 0.4525;
     if (feed > 0.4525)
         feed = 0.4525;
     else if (feed < 0)
         feed = 0;
-    
+
     for (i=0; i<self->bufsize; i++) {
         fr = freq[i];
         if (fr < self->minfreq)
@@ -2141,7 +2141,7 @@ AllpassWG_process_aia(AllpassWG *self) {
             detune = 0.05;
         else if (detune > 1.0)
             detune = 1.0;
-        
+
         /* pick a new value in the delay line */
         sampdel = self->sr / (fr * freqshift);
         xind = self->in_count - sampdel;
@@ -2150,7 +2150,7 @@ AllpassWG_process_aia(AllpassWG *self) {
         ind = (long)xind;
         frac = xind - ind;
         val = self->buffer[ind] + (self->buffer[ind+1] - self->buffer[ind]) * frac;
-        
+
         /* all-pass filter */
         alpdetune = detune * self->alpsize;
         for (j=0; j<3; j++) {
@@ -2170,19 +2170,19 @@ AllpassWG_process_aia(AllpassWG *self) {
             if (self->alp_in_count[j] == self->alpsize)
                 self->alp_in_count[j] = 0;
         }
-        
+
         /* DC filtering and output */
         y = val - self->xn1 + 0.995 * self->yn1;
         self->xn1 = val;
         self->data[i] = self->yn1 = y;
-        
+
         /* write current value in the delay line */
         self->buffer[self->in_count] = in[i] + val * feed;
         if (self->in_count == 0)
             self->buffer[self->size] = self->buffer[0];
         self->in_count++;
         if (self->in_count == self->size)
-            self->in_count = 0;        
+            self->in_count = 0;
     }
 }
 
@@ -2191,18 +2191,18 @@ AllpassWG_process_iaa(AllpassWG *self) {
     int i, j;
     long ind;
     MYFLT val, y, xind, sampdel, frac, feed, detune, freqshift, alpsampdel, alpsampdelin, alpdetune;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
-    MYFLT *fdb = Stream_getData((Stream *)self->feed_stream); 
+    MYFLT *fdb = Stream_getData((Stream *)self->feed_stream);
     MYFLT *det = Stream_getData((Stream *)self->detune_stream);
-    
+
     /* Check boundaries */
     if (fr < self->minfreq)
         fr = self->minfreq;
     else if (fr >= self->nyquist)
         fr = self->nyquist;
-    
+
     for (i=0; i<self->bufsize; i++) {
         feed = fdb[i] * 0.4525;
         if (feed > 0.4525)
@@ -2216,7 +2216,7 @@ AllpassWG_process_iaa(AllpassWG *self) {
             detune = 0.05;
         else if (detune > 1.0)
             detune = 1.0;
-        
+
         /* pick a new value in the delay line */
         sampdel = self->sr / (fr * freqshift);
         xind = self->in_count - sampdel;
@@ -2225,7 +2225,7 @@ AllpassWG_process_iaa(AllpassWG *self) {
         ind = (long)xind;
         frac = xind - ind;
         val = self->buffer[ind] + (self->buffer[ind+1] - self->buffer[ind]) * frac;
-        
+
         /* all-pass filter */
         alpdetune = detune * self->alpsize;
         for (j=0; j<3; j++) {
@@ -2245,19 +2245,19 @@ AllpassWG_process_iaa(AllpassWG *self) {
             if (self->alp_in_count[j] == self->alpsize)
                 self->alp_in_count[j] = 0;
         }
-        
+
         /* DC filtering and output */
         y = val - self->xn1 + 0.995 * self->yn1;
         self->xn1 = val;
         self->data[i] = self->yn1 = y;
-        
+
         /* write current value in the delay line */
         self->buffer[self->in_count] = in[i] + val * feed;
         if (self->in_count == 0)
             self->buffer[self->size] = self->buffer[0];
         self->in_count++;
         if (self->in_count == self->size)
-            self->in_count = 0;        
+            self->in_count = 0;
     }
 }
 
@@ -2266,10 +2266,10 @@ AllpassWG_process_aaa(AllpassWG *self) {
     int i, j;
     long ind;
     MYFLT val, y, xind, sampdel, frac, fr, feed, detune, freqshift, alpsampdel, alpsampdelin, alpdetune;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *freq = Stream_getData((Stream *)self->freq_stream);
-    MYFLT *fdb = Stream_getData((Stream *)self->feed_stream); 
+    MYFLT *fdb = Stream_getData((Stream *)self->feed_stream);
     MYFLT *det = Stream_getData((Stream *)self->detune_stream);
 
     for (i=0; i<self->bufsize; i++) {
@@ -2290,7 +2290,7 @@ AllpassWG_process_aaa(AllpassWG *self) {
             detune = 0.05;
         else if (detune > 1.0)
             detune = 1.0;
-        
+
         /* pick a new value in the delay line */
         sampdel = self->sr / (fr * freqshift);
         xind = self->in_count - sampdel;
@@ -2299,7 +2299,7 @@ AllpassWG_process_aaa(AllpassWG *self) {
         ind = (long)xind;
         frac = xind - ind;
         val = self->buffer[ind] + (self->buffer[ind+1] - self->buffer[ind]) * frac;
-        
+
         /* all-pass filter */
         alpdetune = detune * self->alpsize;
         for (j=0; j<3; j++) {
@@ -2319,19 +2319,19 @@ AllpassWG_process_aaa(AllpassWG *self) {
             if (self->alp_in_count[j] == self->alpsize)
                 self->alp_in_count[j] = 0;
         }
-        
+
         /* DC filtering and output */
         y = val - self->xn1 + 0.995 * self->yn1;
         self->xn1 = val;
         self->data[i] = self->yn1 = y;
-        
+
         /* write current value in the delay line */
         self->buffer[self->in_count] = in[i] + val * feed;
         if (self->in_count == 0)
             self->buffer[self->size] = self->buffer[0];
         self->in_count++;
         if (self->in_count == self->size)
-            self->in_count = 0;        
+            self->in_count = 0;
     }
 }
 
@@ -2351,68 +2351,68 @@ AllpassWG_setProcMode(AllpassWG *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10 + self->modebuffer[4] * 100;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = AllpassWG_process_iii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = AllpassWG_process_aii;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = AllpassWG_process_iai;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = AllpassWG_process_aai;
             break;
-        case 100:    
+        case 100:
             self->proc_func_ptr = AllpassWG_process_iia;
             break;
-        case 101:    
+        case 101:
             self->proc_func_ptr = AllpassWG_process_aia;
             break;
-        case 110:    
+        case 110:
             self->proc_func_ptr = AllpassWG_process_iaa;
             break;
-        case 111:    
+        case 111:
             self->proc_func_ptr = AllpassWG_process_aaa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = AllpassWG_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = AllpassWG_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = AllpassWG_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = AllpassWG_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = AllpassWG_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = AllpassWG_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = AllpassWG_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = AllpassWG_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = AllpassWG_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 AllpassWG_compute_next_data_frame(AllpassWG *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2421,28 +2421,28 @@ AllpassWG_traverse(AllpassWG *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->input);
-    Py_VISIT(self->input_stream);    
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->feed);    
-    Py_VISIT(self->feed_stream);    
-    Py_VISIT(self->detune);    
-    Py_VISIT(self->detune_stream);    
+    Py_VISIT(self->input_stream);
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->feed);
+    Py_VISIT(self->feed_stream);
+    Py_VISIT(self->detune);
+    Py_VISIT(self->detune_stream);
     return 0;
 }
 
-static int 
+static int
 AllpassWG_clear(AllpassWG *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
-    Py_CLEAR(self->input_stream);    
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->feed);    
-    Py_CLEAR(self->feed_stream);    
-    Py_CLEAR(self->detune);    
-    Py_CLEAR(self->detune_stream);    
+    Py_CLEAR(self->input_stream);
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->feed);
+    Py_CLEAR(self->feed_stream);
+    Py_CLEAR(self->detune);
+    Py_CLEAR(self->detune_stream);
     return 0;
 }
 
@@ -2466,7 +2466,7 @@ AllpassWG_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *feedtmp=NULL, *detunetmp=NULL, *multmp=NULL, *addtmp=NULL;
     AllpassWG *self;
     self = (AllpassWG *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(100);
     self->feed = PyFloat_FromDouble(0.);
     self->detune = PyFloat_FromDouble(0.5);
@@ -2479,47 +2479,47 @@ AllpassWG_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
 	self->modebuffer[4] = 0;
-    
+
     INIT_OBJECT_COMMON
-    
+
     self->nyquist = (MYFLT)self->sr * 0.45;
 
     Stream_setFunctionPtr(self->stream, AllpassWG_compute_next_data_frame);
     self->mode_func_ptr = AllpassWG_setProcMode;
 
     static char *kwlist[] = {"input", "freq", "feed", "detune", "minfreq", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_OOOFOO, kwlist, &inputtmp, &freqtmp, &feedtmp, &detunetmp, &self->minfreq, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (feedtmp) {
         PyObject_CallMethod((PyObject *)self, "setFeed", "O", feedtmp);
     }
     if (detunetmp) {
         PyObject_CallMethod((PyObject *)self, "setDetune", "O", detunetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
-    self->size = (long)(1.0 / self->minfreq * self->sr + 0.5);    
+
+    self->size = (long)(1.0 / self->minfreq * self->sr + 0.5);
     self->buffer = (MYFLT *)realloc(self->buffer, (self->size+1) * sizeof(MYFLT));
     for (i=0; i<(self->size+1); i++) {
         self->buffer[i] = 0.;
-    }    
+    }
 
     self->alpsize = (int)(self->sr * 0.0025);
     for (i=0; i<3; i++) {
@@ -2527,19 +2527,19 @@ AllpassWG_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         for (j=0; j<(self->alpsize+1); j++) {
             self->alpbuffer[i][j] = 0.;
         }
-    }    
-    
+    }
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * AllpassWG_getServer(AllpassWG* self) { GET_SERVER };
 static PyObject * AllpassWG_getStream(AllpassWG* self) { GET_STREAM };
-static PyObject * AllpassWG_setMul(AllpassWG *self, PyObject *arg) { SET_MUL };	
-static PyObject * AllpassWG_setAdd(AllpassWG *self, PyObject *arg) { SET_ADD };	
-static PyObject * AllpassWG_setSub(AllpassWG *self, PyObject *arg) { SET_SUB };	
-static PyObject * AllpassWG_setDiv(AllpassWG *self, PyObject *arg) { SET_DIV };	
+static PyObject * AllpassWG_setMul(AllpassWG *self, PyObject *arg) { SET_MUL };
+static PyObject * AllpassWG_setAdd(AllpassWG *self, PyObject *arg) { SET_ADD };
+static PyObject * AllpassWG_setSub(AllpassWG *self, PyObject *arg) { SET_SUB };
+static PyObject * AllpassWG_setDiv(AllpassWG *self, PyObject *arg) { SET_DIV };
 
 static PyObject * AllpassWG_play(AllpassWG *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * AllpassWG_out(AllpassWG *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2558,14 +2558,14 @@ static PyObject *
 AllpassWG_setFreq(AllpassWG *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -2581,25 +2581,25 @@ AllpassWG_setFreq(AllpassWG *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 AllpassWG_setFeed(AllpassWG *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->feed);
@@ -2615,25 +2615,25 @@ AllpassWG_setFeed(AllpassWG *self, PyObject *arg)
         self->feed_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 AllpassWG_setDetune(AllpassWG *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->detune);
@@ -2649,12 +2649,12 @@ AllpassWG_setDetune(AllpassWG *self, PyObject *arg)
         self->detune_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef AllpassWG_members[] = {
     {"server", T_OBJECT_EX, offsetof(AllpassWG, server), 0, "Pyo server."},
@@ -2775,7 +2775,7 @@ typedef struct {
     pyo_audio_HEAD
     PyObject *input;
     Stream *input_stream;
-    int modebuffer[2]; // need at least 2 slots for mul & add 
+    int modebuffer[2]; // need at least 2 slots for mul & add
     MYFLT x1;
 } Delay1;
 
@@ -2805,44 +2805,44 @@ Delay1_setProcMode(Delay1 *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-       
+
     self->proc_func_ptr = Delay1_filters;
 
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Delay1_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Delay1_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Delay1_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Delay1_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Delay1_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Delay1_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Delay1_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Delay1_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Delay1_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Delay1_compute_next_data_frame(Delay1 *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2855,7 +2855,7 @@ Delay1_traverse(Delay1 *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Delay1_clear(Delay1 *self)
 {
     pyo_CLEAR
@@ -2879,32 +2879,32 @@ Delay1_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     Delay1 *self;
     self = (Delay1 *)type->tp_alloc(type, 0);
-    
+
     self->x1 = 0.0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Delay1_compute_next_data_frame);
     self->mode_func_ptr = Delay1_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -2912,10 +2912,10 @@ Delay1_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Delay1_getServer(Delay1* self) { GET_SERVER };
 static PyObject * Delay1_getStream(Delay1* self) { GET_STREAM };
-static PyObject * Delay1_setMul(Delay1 *self, PyObject *arg) { SET_MUL };	
-static PyObject * Delay1_setAdd(Delay1 *self, PyObject *arg) { SET_ADD };	
-static PyObject * Delay1_setSub(Delay1 *self, PyObject *arg) { SET_SUB };	
-static PyObject * Delay1_setDiv(Delay1 *self, PyObject *arg) { SET_DIV };	
+static PyObject * Delay1_setMul(Delay1 *self, PyObject *arg) { SET_MUL };
+static PyObject * Delay1_setAdd(Delay1 *self, PyObject *arg) { SET_ADD };
+static PyObject * Delay1_setSub(Delay1 *self, PyObject *arg) { SET_SUB };
+static PyObject * Delay1_setDiv(Delay1 *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Delay1_play(Delay1 *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Delay1_out(Delay1 *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3071,7 +3071,7 @@ SmoothDelay_process_ii(SmoothDelay *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT del = PyFloat_AS_DOUBLE(self->delay);
     MYFLT feed = PyFloat_AS_DOUBLE(self->feedback);
-    
+
     if (del < self->oneOverSr) del = self->oneOverSr;
     else if (del > self->maxdelay) del = self->maxdelay;
 
@@ -3106,7 +3106,7 @@ SmoothDelay_process_ii(SmoothDelay *self) {
         sum = val * self->amp1;
         self->amp1 += self->inc1;
         if (self->amp1 < 0) self->amp1 = 0.0;
-        else if (self->amp1 > 1) self->amp1 = 1.0; 
+        else if (self->amp1 > 1) self->amp1 = 1.0;
 
         xind = self->in_count - self->sampdel2;
         while (xind < 0)
@@ -3117,17 +3117,17 @@ SmoothDelay_process_ii(SmoothDelay *self) {
         sum += val * self->amp2;
         self->amp2 += self->inc2;
         if (self->amp2 < 0) self->amp2 = 0.0;
-        else if (self->amp2 > 1) self->amp2 = 1.0; 
-        
+        else if (self->amp2 > 1) self->amp2 = 1.0;
+
         self->data[i] = sum;
-        
+
         self->buffer[self->in_count] = in[i] + (sum * feed);
         if (self->in_count == 0)
             self->buffer[self->size] = self->buffer[0];
         self->in_count++;
         if (self->in_count >= self->size)
             self->in_count = 0;
-            
+
         self->timer++;
         if (self->timer == self->sampdel)
             self->timer = 0;
@@ -3178,7 +3178,7 @@ SmoothDelay_process_ai(SmoothDelay *self) {
         sum = val * self->amp1;
         self->amp1 += self->inc1;
         if (self->amp1 < 0) self->amp1 = 0.0;
-        else if (self->amp1 > 1) self->amp1 = 1.0; 
+        else if (self->amp1 > 1) self->amp1 = 1.0;
 
         xind = self->in_count - self->sampdel2;
         while (xind < 0)
@@ -3189,17 +3189,17 @@ SmoothDelay_process_ai(SmoothDelay *self) {
         sum += val * self->amp2;
         self->amp2 += self->inc2;
         if (self->amp2 < 0) self->amp2 = 0.0;
-        else if (self->amp2 > 1) self->amp2 = 1.0; 
-        
+        else if (self->amp2 > 1) self->amp2 = 1.0;
+
         self->data[i] = sum;
-        
+
         self->buffer[self->in_count] = in[i] + (sum * feed);
         if (self->in_count == 0)
             self->buffer[self->size] = self->buffer[0];
         self->in_count++;
         if (self->in_count >= self->size)
             self->in_count = 0;
-            
+
         self->timer++;
         if (self->timer == self->sampdel)
             self->timer = 0;
@@ -3215,7 +3215,7 @@ SmoothDelay_process_ia(SmoothDelay *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT del = PyFloat_AS_DOUBLE(self->delay);
     MYFLT *fd = Stream_getData((Stream *)self->feedback_stream);
-    
+
     if (del < self->oneOverSr) del = self->oneOverSr;
     else if (del > self->maxdelay) del = self->maxdelay;
 
@@ -3250,7 +3250,7 @@ SmoothDelay_process_ia(SmoothDelay *self) {
         sum = val * self->amp1;
         self->amp1 += self->inc1;
         if (self->amp1 < 0) self->amp1 = 0.0;
-        else if (self->amp1 > 1) self->amp1 = 1.0; 
+        else if (self->amp1 > 1) self->amp1 = 1.0;
 
         xind = self->in_count - self->sampdel2;
         while (xind < 0)
@@ -3261,17 +3261,17 @@ SmoothDelay_process_ia(SmoothDelay *self) {
         sum += val * self->amp2;
         self->amp2 += self->inc2;
         if (self->amp2 < 0) self->amp2 = 0.0;
-        else if (self->amp2 > 1) self->amp2 = 1.0; 
-        
+        else if (self->amp2 > 1) self->amp2 = 1.0;
+
         self->data[i] = sum;
-        
+
         self->buffer[self->in_count] = in[i] + (sum * feed);
         if (self->in_count == 0)
             self->buffer[self->size] = self->buffer[0];
         self->in_count++;
         if (self->in_count >= self->size)
             self->in_count = 0;
-            
+
         self->timer++;
         if (self->timer == self->sampdel)
             self->timer = 0;
@@ -3322,7 +3322,7 @@ SmoothDelay_process_aa(SmoothDelay *self) {
         sum = val * self->amp1;
         self->amp1 += self->inc1;
         if (self->amp1 < 0) self->amp1 = 0.0;
-        else if (self->amp1 > 1) self->amp1 = 1.0; 
+        else if (self->amp1 > 1) self->amp1 = 1.0;
 
         xind = self->in_count - self->sampdel2;
         while (xind < 0)
@@ -3333,17 +3333,17 @@ SmoothDelay_process_aa(SmoothDelay *self) {
         sum += val * self->amp2;
         self->amp2 += self->inc2;
         if (self->amp2 < 0) self->amp2 = 0.0;
-        else if (self->amp2 > 1) self->amp2 = 1.0; 
-        
+        else if (self->amp2 > 1) self->amp2 = 1.0;
+
         self->data[i] = sum;
-        
+
         self->buffer[self->in_count] = in[i] + (sum * feed);
         if (self->in_count == 0)
             self->buffer[self->size] = self->buffer[0];
         self->in_count++;
         if (self->in_count >= self->size)
             self->in_count = 0;
-            
+
         self->timer++;
         if (self->timer == self->sampdel)
             self->timer = 0;
@@ -3368,54 +3368,54 @@ SmoothDelay_setProcMode(SmoothDelay *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = SmoothDelay_process_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = SmoothDelay_process_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = SmoothDelay_process_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = SmoothDelay_process_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = SmoothDelay_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = SmoothDelay_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = SmoothDelay_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = SmoothDelay_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = SmoothDelay_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = SmoothDelay_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = SmoothDelay_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = SmoothDelay_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = SmoothDelay_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 SmoothDelay_compute_next_data_frame(SmoothDelay *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3424,24 +3424,24 @@ SmoothDelay_traverse(SmoothDelay *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->input);
-    Py_VISIT(self->input_stream);    
-    Py_VISIT(self->delay);    
-    Py_VISIT(self->delay_stream);    
-    Py_VISIT(self->feedback);    
-    Py_VISIT(self->feedback_stream);    
+    Py_VISIT(self->input_stream);
+    Py_VISIT(self->delay);
+    Py_VISIT(self->delay_stream);
+    Py_VISIT(self->feedback);
+    Py_VISIT(self->feedback_stream);
     return 0;
 }
 
-static int 
+static int
 SmoothDelay_clear(SmoothDelay *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
-    Py_CLEAR(self->input_stream);    
-    Py_CLEAR(self->delay);    
-    Py_CLEAR(self->delay_stream);    
-    Py_CLEAR(self->feedback);    
-    Py_CLEAR(self->feedback_stream);    
+    Py_CLEAR(self->input_stream);
+    Py_CLEAR(self->delay);
+    Py_CLEAR(self->delay_stream);
+    Py_CLEAR(self->feedback);
+    Py_CLEAR(self->feedback_stream);
     return 0;
 }
 
@@ -3478,7 +3478,7 @@ SmoothDelay_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[3] = 0;
 
     INIT_OBJECT_COMMON
-    
+
     self->oneOverSr = self->sampdel1 = self->sampdel2 = 1.0 / self->sr;
 
     Stream_setFunctionPtr(self->stream, SmoothDelay_compute_next_data_frame);
@@ -3498,7 +3498,7 @@ SmoothDelay_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (feedbacktmp) {
         PyObject_CallMethod((PyObject *)self, "setFeedback", "O", feedbacktmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
@@ -3506,7 +3506,7 @@ SmoothDelay_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-            
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     self->size = (long)(self->maxdelay * self->sr + 0.5);
@@ -3514,19 +3514,19 @@ SmoothDelay_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->buffer = (MYFLT *)realloc(self->buffer, (self->size+1) * sizeof(MYFLT));
     for (i=0; i<(self->size+1); i++) {
         self->buffer[i] = 0.;
-    }    
+    }
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * SmoothDelay_getServer(SmoothDelay* self) { GET_SERVER };
 static PyObject * SmoothDelay_getStream(SmoothDelay* self) { GET_STREAM };
-static PyObject * SmoothDelay_setMul(SmoothDelay *self, PyObject *arg) { SET_MUL };	
-static PyObject * SmoothDelay_setAdd(SmoothDelay *self, PyObject *arg) { SET_ADD };	
-static PyObject * SmoothDelay_setSub(SmoothDelay *self, PyObject *arg) { SET_SUB };	
-static PyObject * SmoothDelay_setDiv(SmoothDelay *self, PyObject *arg) { SET_DIV };	
+static PyObject * SmoothDelay_setMul(SmoothDelay *self, PyObject *arg) { SET_MUL };
+static PyObject * SmoothDelay_setAdd(SmoothDelay *self, PyObject *arg) { SET_ADD };
+static PyObject * SmoothDelay_setSub(SmoothDelay *self, PyObject *arg) { SET_SUB };
+static PyObject * SmoothDelay_setDiv(SmoothDelay *self, PyObject *arg) { SET_DIV };
 
 static PyObject * SmoothDelay_play(SmoothDelay *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * SmoothDelay_out(SmoothDelay *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3545,12 +3545,12 @@ static PyObject *
 SmoothDelay_setDelay(SmoothDelay *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
 
 	tmp = arg;
@@ -3568,25 +3568,25 @@ SmoothDelay_setDelay(SmoothDelay *self, PyObject *arg)
         self->delay_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 SmoothDelay_setFeedback(SmoothDelay *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->feedback);
@@ -3602,12 +3602,12 @@ SmoothDelay_setFeedback(SmoothDelay *self, PyObject *arg)
         self->feedback_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 SmoothDelay_setCrossfade(SmoothDelay *self, PyObject *arg)
@@ -3616,13 +3616,13 @@ SmoothDelay_setCrossfade(SmoothDelay *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->crossfade = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
 	}
-  
+
 	Py_RETURN_NONE;
 }
 
@@ -3632,7 +3632,7 @@ SmoothDelay_reset(SmoothDelay *self)
     int i;
     for (i=0; i<(self->size+1); i++) {
         self->buffer[i] = 0.;
-    }    
+    }
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -3747,4 +3747,4 @@ PyTypeObject SmoothDelayType = {
     0,      /* tp_init */
     0,                         /* tp_alloc */
     SmoothDelay_new,                 /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/distomodule.c b/src/objects/distomodule.c
index 89cbb1c..67bca8c 100644
--- a/src/objects/distomodule.c
+++ b/src/objects/distomodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -58,7 +58,7 @@ Disto_transform_ii(Disto *self) {
 
     MYFLT drv = .4 - _clip(PyFloat_AS_DOUBLE(self->drive)) * .3999;
     MYFLT slp = _clip(PyFloat_AS_DOUBLE(self->slope));
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = MYATAN2(in[i], drv);
         self->data[i] = val;
@@ -79,13 +79,13 @@ Disto_transform_ai(Disto *self) {
 
     MYFLT *drive = Stream_getData((Stream *)self->drive_stream);
     MYFLT slp = _clip(PyFloat_AS_DOUBLE(self->slope));
-    
+
     for (i=0; i<self->bufsize; i++) {
         drv = .4 - _clip(drive[i]) * .3999;
         val = MYATAN2(in[i], drv);
         self->data[i] = val;
     }
-    
+
     coeff = 1.0 - slp;
     for (i=0; i<self->bufsize; i++) {
         val = self->data[i] * coeff + self->y1 * slp;
@@ -99,10 +99,10 @@ Disto_transform_ia(Disto *self) {
     MYFLT val, coeff, slp;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     MYFLT drv = .4 - _clip(PyFloat_AS_DOUBLE(self->drive)) * .3999;
     MYFLT *slope = Stream_getData((Stream *)self->slope_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = MYATAN2(in[i], drv);
         self->data[i] = val;
@@ -121,10 +121,10 @@ Disto_transform_aa(Disto *self) {
     MYFLT val, drv, coeff, slp;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     MYFLT *drive = Stream_getData((Stream *)self->drive_stream);
     MYFLT *slope = Stream_getData((Stream *)self->slope_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         drv = .4 - _clip(drive[i]) * .3999;
         val = MYATAN2(in[i], drv);
@@ -157,54 +157,54 @@ Disto_setProcMode(Disto *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Disto_transform_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Disto_transform_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Disto_transform_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Disto_transform_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Disto_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Disto_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Disto_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Disto_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Disto_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Disto_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Disto_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Disto_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Disto_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Disto_compute_next_data_frame(Disto *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -213,24 +213,24 @@ Disto_traverse(Disto *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->input);
-    Py_VISIT(self->input_stream);    
-    Py_VISIT(self->drive);    
-    Py_VISIT(self->drive_stream);    
-    Py_VISIT(self->slope);    
-    Py_VISIT(self->slope_stream);    
+    Py_VISIT(self->input_stream);
+    Py_VISIT(self->drive);
+    Py_VISIT(self->drive_stream);
+    Py_VISIT(self->slope);
+    Py_VISIT(self->slope_stream);
     return 0;
 }
 
-static int 
+static int
 Disto_clear(Disto *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->drive);    
-    Py_CLEAR(self->drive_stream);    
-    Py_CLEAR(self->slope);    
-    Py_CLEAR(self->slope_stream);    
+    Py_CLEAR(self->drive);
+    Py_CLEAR(self->drive_stream);
+    Py_CLEAR(self->slope);
+    Py_CLEAR(self->slope_stream);
     return 0;
 }
 
@@ -268,7 +268,7 @@ Disto_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
-    
+
     if (drivetmp) {
         PyObject_CallMethod((PyObject *)self, "setDrive", "O", drivetmp);
     }
@@ -276,7 +276,7 @@ Disto_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (slopetmp) {
         PyObject_CallMethod((PyObject *)self, "setSlope", "O", slopetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
@@ -284,20 +284,20 @@ Disto_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-            
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Disto_getServer(Disto* self) { GET_SERVER };
 static PyObject * Disto_getStream(Disto* self) { GET_STREAM };
-static PyObject * Disto_setMul(Disto *self, PyObject *arg) { SET_MUL };	
-static PyObject * Disto_setAdd(Disto *self, PyObject *arg) { SET_ADD };	
-static PyObject * Disto_setSub(Disto *self, PyObject *arg) { SET_SUB };	
-static PyObject * Disto_setDiv(Disto *self, PyObject *arg) { SET_DIV };	
+static PyObject * Disto_setMul(Disto *self, PyObject *arg) { SET_MUL };
+static PyObject * Disto_setAdd(Disto *self, PyObject *arg) { SET_ADD };
+static PyObject * Disto_setSub(Disto *self, PyObject *arg) { SET_SUB };
+static PyObject * Disto_setDiv(Disto *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Disto_play(Disto *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Disto_out(Disto *self, PyObject *args, PyObject *kwds) { OUT };
@@ -316,14 +316,14 @@ static PyObject *
 Disto_setDrive(Disto *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->drive);
@@ -339,25 +339,25 @@ Disto_setDrive(Disto *self, PyObject *arg)
         self->drive_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Disto_setSlope(Disto *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->slope);
@@ -373,12 +373,12 @@ Disto_setSlope(Disto *self, PyObject *arg)
         self->slope_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Disto_members[] = {
     {"server", T_OBJECT_EX, offsetof(Disto, server), 0, "Pyo server."},
@@ -512,7 +512,7 @@ Clip_transform_ii(Clip *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT mi = PyFloat_AS_DOUBLE(self->min);
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = in[i];
         if(val < mi)
@@ -531,7 +531,7 @@ Clip_transform_ai(Clip *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *mi = Stream_getData((Stream *)self->min_stream);
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = in[i];
         mini = mi[i];
@@ -551,7 +551,7 @@ Clip_transform_ia(Clip *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT mi = PyFloat_AS_DOUBLE(self->min);
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = in[i];
         maxi = ma[i];
@@ -563,7 +563,7 @@ Clip_transform_ia(Clip *self) {
             self->data[i] = val;
     }
 }
-    
+
 static void
 Clip_transform_aa(Clip *self) {
     MYFLT val, mini, maxi;
@@ -571,7 +571,7 @@ Clip_transform_aa(Clip *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *mi = Stream_getData((Stream *)self->min_stream);
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = in[i];
         mini = mi[i];
@@ -601,56 +601,56 @@ Clip_setProcMode(Clip *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Clip_transform_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Clip_transform_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Clip_transform_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Clip_transform_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Clip_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Clip_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Clip_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Clip_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Clip_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Clip_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Clip_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Clip_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Clip_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Clip_compute_next_data_frame(Clip *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -659,24 +659,24 @@ Clip_traverse(Clip *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->input);
-    Py_VISIT(self->input_stream);    
-    Py_VISIT(self->min);    
-    Py_VISIT(self->min_stream);    
-    Py_VISIT(self->max);    
-    Py_VISIT(self->max_stream);    
+    Py_VISIT(self->input_stream);
+    Py_VISIT(self->min);
+    Py_VISIT(self->min_stream);
+    Py_VISIT(self->max);
+    Py_VISIT(self->max_stream);
     return 0;
 }
 
-static int 
+static int
 Clip_clear(Clip *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->min);    
-    Py_CLEAR(self->min_stream);    
-    Py_CLEAR(self->max);    
-    Py_CLEAR(self->max_stream);    
+    Py_CLEAR(self->min);
+    Py_CLEAR(self->min_stream);
+    Py_CLEAR(self->max);
+    Py_CLEAR(self->max_stream);
     return 0;
 }
 
@@ -695,54 +695,54 @@ Clip_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *mintmp=NULL, *maxtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Clip *self;
     self = (Clip *)type->tp_alloc(type, 0);
-    
+
     self->min = PyFloat_FromDouble(-1.0);
     self->max = PyFloat_FromDouble(1.0);
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Clip_compute_next_data_frame);
     self->mode_func_ptr = Clip_setProcMode;
 
     static char *kwlist[] = {"input", "min", "max", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOO", kwlist, &inputtmp, &mintmp, &maxtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (mintmp) {
         PyObject_CallMethod((PyObject *)self, "setMin", "O", mintmp);
     }
-    
+
     if (maxtmp) {
         PyObject_CallMethod((PyObject *)self, "setMax", "O", maxtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Clip_getServer(Clip* self) { GET_SERVER };
 static PyObject * Clip_getStream(Clip* self) { GET_STREAM };
-static PyObject * Clip_setMul(Clip *self, PyObject *arg) { SET_MUL };	
-static PyObject * Clip_setAdd(Clip *self, PyObject *arg) { SET_ADD };	
-static PyObject * Clip_setSub(Clip *self, PyObject *arg) { SET_SUB };	
-static PyObject * Clip_setDiv(Clip *self, PyObject *arg) { SET_DIV };	
+static PyObject * Clip_setMul(Clip *self, PyObject *arg) { SET_MUL };
+static PyObject * Clip_setAdd(Clip *self, PyObject *arg) { SET_ADD };
+static PyObject * Clip_setSub(Clip *self, PyObject *arg) { SET_SUB };
+static PyObject * Clip_setDiv(Clip *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Clip_play(Clip *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Clip_out(Clip *self, PyObject *args, PyObject *kwds) { OUT };
@@ -761,14 +761,14 @@ static PyObject *
 Clip_setMin(Clip *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->min);
@@ -784,25 +784,25 @@ Clip_setMin(Clip *self, PyObject *arg)
         self->min_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Clip_setMax(Clip *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->max);
@@ -818,12 +818,12 @@ Clip_setMax(Clip *self, PyObject *arg)
         self->max_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Clip_members[] = {
 {"server", T_OBJECT_EX, offsetof(Clip, server), 0, "Pyo server."},
@@ -957,7 +957,7 @@ Mirror_transform_ii(Mirror *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT mi = PyFloat_AS_DOUBLE(self->min);
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
-    
+
     if (mi >= ma) {
         avg = (mi + ma) * 0.5;
         for (i=0; i<self->bufsize; i++) {
@@ -985,7 +985,7 @@ Mirror_transform_ai(Mirror *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *mini = Stream_getData((Stream *)self->min_stream);
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = in[i];
         mi = mini[i];
@@ -1000,7 +1000,7 @@ Mirror_transform_ai(Mirror *self) {
                 else
                     val = mi + mi - val;
             }
-            self->data[i] = val;            
+            self->data[i] = val;
         }
     }
 }
@@ -1012,7 +1012,7 @@ Mirror_transform_ia(Mirror *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT mi = PyFloat_AS_DOUBLE(self->min);
     MYFLT *maxi = Stream_getData((Stream *)self->max_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = in[i];
         ma = maxi[i];
@@ -1027,7 +1027,7 @@ Mirror_transform_ia(Mirror *self) {
                 else
                     val = mi + mi - val;
             }
-            self->data[i] = val;            
+            self->data[i] = val;
         }
     }
 }
@@ -1039,7 +1039,7 @@ Mirror_transform_aa(Mirror *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *mini = Stream_getData((Stream *)self->min_stream);
     MYFLT *maxi = Stream_getData((Stream *)self->max_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = in[i];
         mi = mini[i];
@@ -1055,7 +1055,7 @@ Mirror_transform_aa(Mirror *self) {
                 else
                     val = mi + mi - val;
             }
-            self->data[i] = val;            
+            self->data[i] = val;
         }
     }
 }
@@ -1076,56 +1076,56 @@ Mirror_setProcMode(Mirror *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Mirror_transform_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Mirror_transform_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Mirror_transform_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Mirror_transform_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Mirror_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Mirror_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Mirror_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Mirror_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Mirror_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Mirror_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Mirror_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Mirror_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Mirror_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Mirror_compute_next_data_frame(Mirror *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1134,24 +1134,24 @@ Mirror_traverse(Mirror *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->input);
-    Py_VISIT(self->input_stream);    
-    Py_VISIT(self->min);    
-    Py_VISIT(self->min_stream);    
-    Py_VISIT(self->max);    
-    Py_VISIT(self->max_stream);    
+    Py_VISIT(self->input_stream);
+    Py_VISIT(self->min);
+    Py_VISIT(self->min_stream);
+    Py_VISIT(self->max);
+    Py_VISIT(self->max_stream);
     return 0;
 }
 
-static int 
+static int
 Mirror_clear(Mirror *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->min);    
-    Py_CLEAR(self->min_stream);    
-    Py_CLEAR(self->max);    
-    Py_CLEAR(self->max_stream);    
+    Py_CLEAR(self->min);
+    Py_CLEAR(self->min_stream);
+    Py_CLEAR(self->max);
+    Py_CLEAR(self->max_stream);
     return 0;
 }
 
@@ -1170,54 +1170,54 @@ Mirror_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *mintmp=NULL, *maxtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Mirror *self;
     self = (Mirror *)type->tp_alloc(type, 0);
-    
+
     self->min = PyFloat_FromDouble(0.0);
     self->max = PyFloat_FromDouble(1.0);
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Mirror_compute_next_data_frame);
     self->mode_func_ptr = Mirror_setProcMode;
 
     static char *kwlist[] = {"input", "min", "max", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOO", kwlist, &inputtmp, &mintmp, &maxtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (mintmp) {
         PyObject_CallMethod((PyObject *)self, "setMin", "O", mintmp);
     }
-    
+
     if (maxtmp) {
         PyObject_CallMethod((PyObject *)self, "setMax", "O", maxtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Mirror_getServer(Mirror* self) { GET_SERVER };
 static PyObject * Mirror_getStream(Mirror* self) { GET_STREAM };
-static PyObject * Mirror_setMul(Mirror *self, PyObject *arg) { SET_MUL };	
-static PyObject * Mirror_setAdd(Mirror *self, PyObject *arg) { SET_ADD };	
-static PyObject * Mirror_setSub(Mirror *self, PyObject *arg) { SET_SUB };	
-static PyObject * Mirror_setDiv(Mirror *self, PyObject *arg) { SET_DIV };	
+static PyObject * Mirror_setMul(Mirror *self, PyObject *arg) { SET_MUL };
+static PyObject * Mirror_setAdd(Mirror *self, PyObject *arg) { SET_ADD };
+static PyObject * Mirror_setSub(Mirror *self, PyObject *arg) { SET_SUB };
+static PyObject * Mirror_setDiv(Mirror *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Mirror_play(Mirror *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Mirror_out(Mirror *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1236,14 +1236,14 @@ static PyObject *
 Mirror_setMin(Mirror *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->min);
@@ -1259,25 +1259,25 @@ Mirror_setMin(Mirror *self, PyObject *arg)
         self->min_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Mirror_setMax(Mirror *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->max);
@@ -1293,12 +1293,12 @@ Mirror_setMax(Mirror *self, PyObject *arg)
         self->max_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Mirror_members[] = {
     {"server", T_OBJECT_EX, offsetof(Mirror, server), 0, "Pyo server."},
@@ -1432,7 +1432,7 @@ Wrap_transform_ii(Wrap *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT mi = PyFloat_AS_DOUBLE(self->min);
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
-    
+
     if (mi >= ma) {
         avg = (mi + ma) * 0.5;
         for (i=0; i<self->bufsize; i++) {
@@ -1453,7 +1453,7 @@ Wrap_transform_ii(Wrap *self) {
                 val = tmp * rng + mi;
                 if (val == ma)
                     val = mi;
-            }    
+            }
             self->data[i] = val;
         }
     }
@@ -1466,7 +1466,7 @@ Wrap_transform_ai(Wrap *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *mini = Stream_getData((Stream *)self->min_stream);
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = in[i];
         mi = mini[i];
@@ -1486,8 +1486,8 @@ Wrap_transform_ai(Wrap *self) {
                 val = tmp * rng + mi;
                 if (val == ma)
                     val = mi;
-            }    
-            self->data[i] = val;            
+            }
+            self->data[i] = val;
         }
     }
 }
@@ -1499,7 +1499,7 @@ Wrap_transform_ia(Wrap *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT mi = PyFloat_AS_DOUBLE(self->min);
     MYFLT *maxi = Stream_getData((Stream *)self->max_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = in[i];
         ma = maxi[i];
@@ -1519,8 +1519,8 @@ Wrap_transform_ia(Wrap *self) {
                 val = tmp * rng + mi;
                 if (val == ma)
                     val = mi;
-            }    
-            self->data[i] = val;            
+            }
+            self->data[i] = val;
         }
     }
 }
@@ -1532,7 +1532,7 @@ Wrap_transform_aa(Wrap *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *mini = Stream_getData((Stream *)self->min_stream);
     MYFLT *maxi = Stream_getData((Stream *)self->max_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = in[i];
         mi = mini[i];
@@ -1553,8 +1553,8 @@ Wrap_transform_aa(Wrap *self) {
                 val = tmp * rng + mi;
                 if (val == ma)
                     val = mi;
-            }    
-            self->data[i] = val;            
+            }
+            self->data[i] = val;
         }
     }
 }
@@ -1575,56 +1575,56 @@ Wrap_setProcMode(Wrap *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Wrap_transform_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Wrap_transform_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Wrap_transform_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Wrap_transform_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Wrap_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Wrap_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Wrap_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Wrap_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Wrap_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Wrap_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Wrap_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Wrap_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Wrap_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Wrap_compute_next_data_frame(Wrap *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1633,24 +1633,24 @@ Wrap_traverse(Wrap *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->input);
-    Py_VISIT(self->input_stream);    
-    Py_VISIT(self->min);    
-    Py_VISIT(self->min_stream);    
-    Py_VISIT(self->max);    
-    Py_VISIT(self->max_stream);    
+    Py_VISIT(self->input_stream);
+    Py_VISIT(self->min);
+    Py_VISIT(self->min_stream);
+    Py_VISIT(self->max);
+    Py_VISIT(self->max_stream);
     return 0;
 }
 
-static int 
+static int
 Wrap_clear(Wrap *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->min);    
-    Py_CLEAR(self->min_stream);    
-    Py_CLEAR(self->max);    
-    Py_CLEAR(self->max_stream);    
+    Py_CLEAR(self->min);
+    Py_CLEAR(self->min_stream);
+    Py_CLEAR(self->max);
+    Py_CLEAR(self->max_stream);
     return 0;
 }
 
@@ -1669,54 +1669,54 @@ Wrap_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *mintmp=NULL, *maxtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Wrap *self;
     self = (Wrap *)type->tp_alloc(type, 0);
-    
+
     self->min = PyFloat_FromDouble(0.0);
     self->max = PyFloat_FromDouble(1.0);
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Wrap_compute_next_data_frame);
     self->mode_func_ptr = Wrap_setProcMode;
 
     static char *kwlist[] = {"input", "min", "max", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOO", kwlist, &inputtmp, &mintmp, &maxtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (mintmp) {
         PyObject_CallMethod((PyObject *)self, "setMin", "O", mintmp);
     }
-    
+
     if (maxtmp) {
         PyObject_CallMethod((PyObject *)self, "setMax", "O", maxtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Wrap_getServer(Wrap* self) { GET_SERVER };
 static PyObject * Wrap_getStream(Wrap* self) { GET_STREAM };
-static PyObject * Wrap_setMul(Wrap *self, PyObject *arg) { SET_MUL };	
-static PyObject * Wrap_setAdd(Wrap *self, PyObject *arg) { SET_ADD };	
-static PyObject * Wrap_setSub(Wrap *self, PyObject *arg) { SET_SUB };	
-static PyObject * Wrap_setDiv(Wrap *self, PyObject *arg) { SET_DIV };	
+static PyObject * Wrap_setMul(Wrap *self, PyObject *arg) { SET_MUL };
+static PyObject * Wrap_setAdd(Wrap *self, PyObject *arg) { SET_ADD };
+static PyObject * Wrap_setSub(Wrap *self, PyObject *arg) { SET_SUB };
+static PyObject * Wrap_setDiv(Wrap *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Wrap_play(Wrap *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Wrap_out(Wrap *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1735,14 +1735,14 @@ static PyObject *
 Wrap_setMin(Wrap *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->min);
@@ -1758,25 +1758,25 @@ Wrap_setMin(Wrap *self, PyObject *arg)
         self->min_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Wrap_setMax(Wrap *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->max);
@@ -1792,12 +1792,12 @@ Wrap_setMax(Wrap *self, PyObject *arg)
         self->max_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Wrap_members[] = {
     {"server", T_OBJECT_EX, offsetof(Wrap, server), 0, "Pyo server."},
@@ -1926,7 +1926,7 @@ typedef struct {
     int modebuffer[4];
 } Degrade;
 
-static MYFLT 
+static MYFLT
 _bit_clip(MYFLT x) {
     if (x < 1.0)
         return 1.0;
@@ -1936,7 +1936,7 @@ _bit_clip(MYFLT x) {
         return x;
 }
 
-static MYFLT 
+static MYFLT
 _sr_clip(MYFLT x) {
     // half sr ten times
     if (x <= 0.0009765625)
@@ -1951,23 +1951,23 @@ static void
 Degrade_transform_ii(Degrade *self) {
     MYFLT bitscl, ibitscl, newsr;
     int i, nsamps, tmp;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT bitdepth = _bit_clip(PyFloat_AS_DOUBLE(self->bitdepth));
     MYFLT srscale = _sr_clip(PyFloat_AS_DOUBLE(self->srscale));
-    
+
     bitscl = MYPOW(2.0, bitdepth-1);
     ibitscl = 1.0 / bitscl;
-    
+
     newsr = self->sr * srscale;
     nsamps = (int)(self->sr / newsr);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->sampsCount++;
         if (self->sampsCount >= nsamps) {
             self->sampsCount = 0;
             tmp = (int)(in[i] * bitscl + 0.5);
-            self->value = tmp * ibitscl;    
+            self->value = tmp * ibitscl;
         }
         self->data[i] = self->value;
     }
@@ -1977,14 +1977,14 @@ static void
 Degrade_transform_ai(Degrade *self) {
     MYFLT bitscl, ibitscl, newsr;
     int i, nsamps, tmp;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *bitdepth = Stream_getData((Stream *)self->bitdepth_stream);
     MYFLT srscale = _sr_clip(PyFloat_AS_DOUBLE(self->srscale));
 
     newsr = self->sr * srscale;
     nsamps = (int)(self->sr / newsr);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->sampsCount++;
         if (self->sampsCount >= nsamps) {
@@ -1992,7 +1992,7 @@ Degrade_transform_ai(Degrade *self) {
             bitscl = MYPOW(2.0, _bit_clip(bitdepth[i])-1);
             ibitscl = 1.0 / bitscl;
             tmp = (int)(in[i] * bitscl + 0.5);
-            self->value = tmp * ibitscl;    
+            self->value = tmp * ibitscl;
         }
         self->data[i] = self->value;
     }
@@ -2002,11 +2002,11 @@ static void
 Degrade_transform_ia(Degrade *self) {
     MYFLT bitscl, ibitscl, newsr;
     int i, nsamps, tmp;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT bitdepth = _bit_clip(PyFloat_AS_DOUBLE(self->bitdepth));
     MYFLT *srscale = Stream_getData((Stream *)self->srscale_stream);
-    
+
     bitscl = MYPOW(2.0, bitdepth-1);
     ibitscl = 1.0 / bitscl;
 
@@ -2017,7 +2017,7 @@ Degrade_transform_ia(Degrade *self) {
         if (self->sampsCount >= nsamps) {
             self->sampsCount = 0;
             tmp = (int)(in[i] * bitscl + 0.5);
-            self->value = tmp * ibitscl;    
+            self->value = tmp * ibitscl;
         }
         self->data[i] = self->value;
     }
@@ -2027,7 +2027,7 @@ static void
 Degrade_transform_aa(Degrade *self) {
     MYFLT bitscl, ibitscl, newsr;
     int i, nsamps, tmp;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *bitdepth = Stream_getData((Stream *)self->bitdepth_stream);
     MYFLT *srscale = Stream_getData((Stream *)self->srscale_stream);
@@ -2041,7 +2041,7 @@ Degrade_transform_aa(Degrade *self) {
             bitscl = MYPOW(2.0, _bit_clip(bitdepth[i])-1);
             ibitscl = 1.0 / bitscl;
             tmp = (int)(in[i] * bitscl + 0.5);
-            self->value = tmp * ibitscl;    
+            self->value = tmp * ibitscl;
         }
         self->data[i] = self->value;
     }
@@ -2063,56 +2063,56 @@ Degrade_setProcMode(Degrade *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Degrade_transform_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Degrade_transform_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Degrade_transform_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Degrade_transform_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Degrade_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Degrade_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Degrade_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Degrade_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Degrade_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Degrade_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Degrade_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Degrade_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Degrade_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Degrade_compute_next_data_frame(Degrade *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2121,24 +2121,24 @@ Degrade_traverse(Degrade *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->input);
-    Py_VISIT(self->input_stream);    
-    Py_VISIT(self->bitdepth);    
-    Py_VISIT(self->bitdepth_stream);    
-    Py_VISIT(self->srscale);    
-    Py_VISIT(self->srscale_stream);    
+    Py_VISIT(self->input_stream);
+    Py_VISIT(self->bitdepth);
+    Py_VISIT(self->bitdepth_stream);
+    Py_VISIT(self->srscale);
+    Py_VISIT(self->srscale_stream);
     return 0;
 }
 
-static int 
+static int
 Degrade_clear(Degrade *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->bitdepth);    
-    Py_CLEAR(self->bitdepth_stream);    
-    Py_CLEAR(self->srscale);    
-    Py_CLEAR(self->srscale_stream);    
+    Py_CLEAR(self->bitdepth);
+    Py_CLEAR(self->bitdepth_stream);
+    Py_CLEAR(self->srscale);
+    Py_CLEAR(self->srscale_stream);
     return 0;
 }
 
@@ -2157,7 +2157,7 @@ Degrade_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *bitdepthtmp=NULL, *srscaletmp=NULL, *multmp=NULL, *addtmp=NULL;
     Degrade *self;
     self = (Degrade *)type->tp_alloc(type, 0);
-    
+
     self->bitdepth = PyFloat_FromDouble(16);
     self->srscale = PyFloat_FromDouble(1.0);
     self->value = 0.0;
@@ -2166,47 +2166,47 @@ Degrade_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Degrade_compute_next_data_frame);
     self->mode_func_ptr = Degrade_setProcMode;
 
     static char *kwlist[] = {"input", "bitdepth", "srscale", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOO", kwlist, &inputtmp, &bitdepthtmp, &srscaletmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (bitdepthtmp) {
         PyObject_CallMethod((PyObject *)self, "setBitdepth", "O", bitdepthtmp);
     }
-    
+
     if (srscaletmp) {
         PyObject_CallMethod((PyObject *)self, "setSrscale", "O", srscaletmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Degrade_getServer(Degrade* self) { GET_SERVER };
 static PyObject * Degrade_getStream(Degrade* self) { GET_STREAM };
-static PyObject * Degrade_setMul(Degrade *self, PyObject *arg) { SET_MUL };	
-static PyObject * Degrade_setAdd(Degrade *self, PyObject *arg) { SET_ADD };	
-static PyObject * Degrade_setSub(Degrade *self, PyObject *arg) { SET_SUB };	
-static PyObject * Degrade_setDiv(Degrade *self, PyObject *arg) { SET_DIV };	
+static PyObject * Degrade_setMul(Degrade *self, PyObject *arg) { SET_MUL };
+static PyObject * Degrade_setAdd(Degrade *self, PyObject *arg) { SET_ADD };
+static PyObject * Degrade_setSub(Degrade *self, PyObject *arg) { SET_SUB };
+static PyObject * Degrade_setDiv(Degrade *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Degrade_play(Degrade *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Degrade_out(Degrade *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2225,14 +2225,14 @@ static PyObject *
 Degrade_setBitdepth(Degrade *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->bitdepth);
@@ -2248,25 +2248,25 @@ Degrade_setBitdepth(Degrade *self, PyObject *arg)
         self->bitdepth_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Degrade_setSrscale(Degrade *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->srscale);
@@ -2282,12 +2282,12 @@ Degrade_setSrscale(Degrade *self, PyObject *arg)
         self->srscale_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Degrade_members[] = {
 {"server", T_OBJECT_EX, offsetof(Degrade, server), 0, "Pyo server."},
@@ -2408,7 +2408,7 @@ typedef struct {
     Stream *input_stream;
     PyObject *comp;
     Stream *comp_stream;
-    int modebuffer[3]; // need at least 2 slots for mul & add 
+    int modebuffer[3]; // need at least 2 slots for mul & add
 } Min;
 
 static void
@@ -2427,7 +2427,7 @@ Min_process_a(Min *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *cp = Stream_getData((Stream *)self->comp_stream);
-        
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = in[i] < cp[i] ? in[i] : cp[i];
     }
@@ -2449,50 +2449,50 @@ Min_setProcMode(Min *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Min_process_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Min_process_a;
             break;
-    } 
+    }
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Min_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Min_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Min_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Min_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Min_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Min_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Min_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Min_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Min_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Min_compute_next_data_frame(Min *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2502,19 +2502,19 @@ Min_traverse(Min *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->comp);    
-    Py_VISIT(self->comp_stream);    
+    Py_VISIT(self->comp);
+    Py_VISIT(self->comp_stream);
     return 0;
 }
 
-static int 
+static int
 Min_clear(Min *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->comp);    
-    Py_CLEAR(self->comp_stream);    
+    Py_CLEAR(self->comp);
+    Py_CLEAR(self->comp_stream);
     return 0;
 }
 
@@ -2533,38 +2533,38 @@ Min_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *comptmp=NULL, *multmp=NULL, *addtmp=NULL;
     Min *self;
     self = (Min *)type->tp_alloc(type, 0);
-    
+
     self->comp = PyFloat_FromDouble(0.5);
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
     self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
 
     Stream_setFunctionPtr(self->stream, Min_compute_next_data_frame);
     self->mode_func_ptr = Min_setProcMode;
 
     static char *kwlist[] = {"input", "comp", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOO", kwlist, &inputtmp, &comptmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (comptmp) {
         PyObject_CallMethod((PyObject *)self, "setComp", "O", comptmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -2572,10 +2572,10 @@ Min_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Min_getServer(Min* self) { GET_SERVER };
 static PyObject * Min_getStream(Min* self) { GET_STREAM };
-static PyObject * Min_setMul(Min *self, PyObject *arg) { SET_MUL };    
-static PyObject * Min_setAdd(Min *self, PyObject *arg) { SET_ADD };    
-static PyObject * Min_setSub(Min *self, PyObject *arg) { SET_SUB };    
-static PyObject * Min_setDiv(Min *self, PyObject *arg) { SET_DIV };    
+static PyObject * Min_setMul(Min *self, PyObject *arg) { SET_MUL };
+static PyObject * Min_setAdd(Min *self, PyObject *arg) { SET_ADD };
+static PyObject * Min_setSub(Min *self, PyObject *arg) { SET_SUB };
+static PyObject * Min_setDiv(Min *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Min_play(Min *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Min_out(Min *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2594,14 +2594,14 @@ static PyObject *
 Min_setComp(Min *self, PyObject *arg)
 {
     PyObject *tmp, *streamtmp;
-    
+
     if (arg == NULL) {
         Py_INCREF(Py_None);
         return Py_None;
     }
-    
+
     int isNumber = PyNumber_Check(arg);
-    
+
     tmp = arg;
     Py_INCREF(tmp);
     Py_DECREF(self->comp);
@@ -2617,9 +2617,9 @@ Min_setComp(Min *self, PyObject *arg)
         self->comp_stream = (Stream *)streamtmp;
         self->modebuffer[2] = 1;
     }
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2741,7 +2741,7 @@ typedef struct {
     Stream *input_stream;
     PyObject *comp;
     Stream *comp_stream;
-    int modebuffer[3]; // need at least 2 slots for mul & add 
+    int modebuffer[3]; // need at least 2 slots for mul & add
 } Max;
 
 static void
@@ -2760,7 +2760,7 @@ Max_process_a(Max *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *cp = Stream_getData((Stream *)self->comp_stream);
-        
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = in[i] > cp[i] ? in[i] : cp[i];
     }
@@ -2782,50 +2782,50 @@ Max_setProcMode(Max *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Max_process_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Max_process_a;
             break;
-    } 
+    }
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Max_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Max_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Max_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Max_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Max_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Max_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Max_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Max_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Max_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Max_compute_next_data_frame(Max *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2835,19 +2835,19 @@ Max_traverse(Max *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->comp);    
-    Py_VISIT(self->comp_stream);    
+    Py_VISIT(self->comp);
+    Py_VISIT(self->comp_stream);
     return 0;
 }
 
-static int 
+static int
 Max_clear(Max *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->comp);    
-    Py_CLEAR(self->comp_stream);    
+    Py_CLEAR(self->comp);
+    Py_CLEAR(self->comp_stream);
     return 0;
 }
 
@@ -2866,38 +2866,38 @@ Max_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *comptmp=NULL, *multmp=NULL, *addtmp=NULL;
     Max *self;
     self = (Max *)type->tp_alloc(type, 0);
-    
+
     self->comp = PyFloat_FromDouble(0.5);
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
     self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
 
     Stream_setFunctionPtr(self->stream, Max_compute_next_data_frame);
     self->mode_func_ptr = Max_setProcMode;
 
     static char *kwlist[] = {"input", "comp", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOO", kwlist, &inputtmp, &comptmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (comptmp) {
         PyObject_CallMethod((PyObject *)self, "setComp", "O", comptmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -2905,10 +2905,10 @@ Max_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Max_getServer(Max* self) { GET_SERVER };
 static PyObject * Max_getStream(Max* self) { GET_STREAM };
-static PyObject * Max_setMul(Max *self, PyObject *arg) { SET_MUL };    
-static PyObject * Max_setAdd(Max *self, PyObject *arg) { SET_ADD };    
-static PyObject * Max_setSub(Max *self, PyObject *arg) { SET_SUB };    
-static PyObject * Max_setDiv(Max *self, PyObject *arg) { SET_DIV };    
+static PyObject * Max_setMul(Max *self, PyObject *arg) { SET_MUL };
+static PyObject * Max_setAdd(Max *self, PyObject *arg) { SET_ADD };
+static PyObject * Max_setSub(Max *self, PyObject *arg) { SET_SUB };
+static PyObject * Max_setDiv(Max *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Max_play(Max *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Max_out(Max *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2927,14 +2927,14 @@ static PyObject *
 Max_setComp(Max *self, PyObject *arg)
 {
     PyObject *tmp, *streamtmp;
-    
+
     if (arg == NULL) {
         Py_INCREF(Py_None);
         return Py_None;
     }
-    
+
     int isNumber = PyNumber_Check(arg);
-    
+
     tmp = arg;
     Py_INCREF(tmp);
     Py_DECREF(self->comp);
@@ -2950,9 +2950,9 @@ Max_setComp(Max *self, PyObject *arg)
         self->comp_stream = (Stream *)streamtmp;
         self->modebuffer[2] = 1;
     }
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -3063,4 +3063,4 @@ Max_members,                                 /* tp_members */
 0,                          /* tp_init */
 0,                                              /* tp_alloc */
 Max_new,                                     /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/fadermodule.c b/src/objects/fadermodule.c
index bd6310e..2ea07e5 100644
--- a/src/objects/fadermodule.c
+++ b/src/objects/fadermodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -38,7 +38,7 @@ typedef struct {
     MYFLT sampleToSec;
 } Fader;
 
-static void Fader_internal_stop(Fader *self) { 
+static void Fader_internal_stop(Fader *self) {
     int i;
     Stream_setStreamActive(self->stream, 0);
     Stream_setStreamChnl(self->stream, 0);
@@ -69,7 +69,7 @@ Fader_generate_auto(Fader *self) {
             val = (self->duration - self->currentTime) / self->release;
         else
             val = 1.;
-        
+
         self->data[i] = val;
         self->currentTime += self->sampleToSec;
     }
@@ -84,24 +84,24 @@ Fader_generate_wait(Fader *self) {
         Fader_internal_stop((Fader *)self);
         return;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (self->fademode == 0) {
-            
+
             if (self->currentTime <= self->attack)
                 val = self->currentTime / self->attack;
             else
                 val = 1.;
-            self->topValue = val;    
-        }    
-        else {  
+            self->topValue = val;
+        }
+        else {
             if (self->currentTime <= self->release)
                 val = (1. - self->currentTime / self->release) * self->topValue;
-            else 
+            else
                 val = 0.;
-        }    
+        }
         self->data[i] = val;
-        self->currentTime += self->sampleToSec;    
+        self->currentTime += self->sampleToSec;
     }
 }
 
@@ -120,47 +120,47 @@ Fader_setProcMode(Fader *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     if (self->duration == 0.0)
         self->proc_func_ptr = Fader_generate_wait;
     else
-        self->proc_func_ptr = Fader_generate_auto;        
-        
+        self->proc_func_ptr = Fader_generate_auto;
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Fader_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Fader_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Fader_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Fader_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Fader_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Fader_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Fader_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Fader_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Fader_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Fader_compute_next_data_frame(Fader *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -171,7 +171,7 @@ Fader_traverse(Fader *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Fader_clear(Fader *self)
 {
     pyo_CLEAR
@@ -193,7 +193,7 @@ Fader_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *multmp=NULL, *addtmp=NULL;
     Fader *self;
     self = (Fader *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
     self->topValue = 0.0;
@@ -207,39 +207,39 @@ Fader_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Fader_compute_next_data_frame);
     self->mode_func_ptr = Fader_setProcMode;
-    
+
     Stream_setStreamActive(self->stream, 0);
-    
+
     self->sampleToSec = 1. / self->sr;
 
     static char *kwlist[] = {"fadein", "fadeout", "dur", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE__FFFOO, kwlist, &self->attack, &self->release, &self->duration, &multmp, &addtmp))
         Py_RETURN_NONE;
- 
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Fader_getServer(Fader* self) { GET_SERVER };
 static PyObject * Fader_getStream(Fader* self) { GET_STREAM };
-static PyObject * Fader_setMul(Fader *self, PyObject *arg) { SET_MUL };	
-static PyObject * Fader_setAdd(Fader *self, PyObject *arg) { SET_ADD };	
-static PyObject * Fader_setSub(Fader *self, PyObject *arg) { SET_SUB };	
-static PyObject * Fader_setDiv(Fader *self, PyObject *arg) { SET_DIV };	
+static PyObject * Fader_setMul(Fader *self, PyObject *arg) { SET_MUL };
+static PyObject * Fader_setAdd(Fader *self, PyObject *arg) { SET_ADD };
+static PyObject * Fader_setSub(Fader *self, PyObject *arg) { SET_SUB };
+static PyObject * Fader_setDiv(Fader *self, PyObject *arg) { SET_DIV };
 
-static PyObject * Fader_play(Fader *self, PyObject *args, PyObject *kwds) 
+static PyObject * Fader_play(Fader *self, PyObject *args, PyObject *kwds)
 {
     self->fademode = 0;
     self->ended = 0;
@@ -416,7 +416,7 @@ typedef struct {
     MYFLT sampleToSec;
 } Adsr;
 
-static void Adsr_internal_stop(Adsr *self) { 
+static void Adsr_internal_stop(Adsr *self) {
     int i;
     Stream_setStreamActive(self->stream, 0);
     Stream_setStreamChnl(self->stream, 0);
@@ -430,7 +430,7 @@ static void
 Adsr_generate_auto(Adsr *self) {
     MYFLT val, invatt, invdec, invrel;
     int i;
-    
+
     invatt = 1.0 / self->attack;
     invdec = 1.0 / self->decay;
     invrel = 1.0 / self->release;
@@ -448,7 +448,7 @@ Adsr_generate_auto(Adsr *self) {
             val = (self->duration - self->currentTime) * invrel * self->sustain;
         else
             val = self->sustain;
-        
+
         self->data[i] = val;
         self->currentTime += self->sampleToSec;
     }
@@ -461,14 +461,14 @@ Adsr_generate_wait(Adsr *self) {
 
     if (self->fademode == 1 && self->currentTime > self->release)
         Adsr_internal_stop((Adsr *)self);
-    
+
     invatt = 1.0 / self->attack;
     invdec = 1.0 / self->decay;
     invrel = 1.0 / self->release;
 
     for (i=0; i<self->bufsize; i++) {
         if (self->fademode == 0) {
-            
+
             if (self->currentTime <= self->attack)
                 val = self->currentTime * invatt;
             else if (self->currentTime <= (self->attack + self->decay))
@@ -476,16 +476,16 @@ Adsr_generate_wait(Adsr *self) {
             else
                 val = self->sustain;
             self->topValue = val;
-        }    
-        else {  
+        }
+        else {
             if (self->currentTime <= self->release) {
                 val = self->topValue * (1. - self->currentTime * invrel);
             }
-            else 
+            else
                 val = 0.;
-        }    
+        }
         self->data[i] = val;
-        self->currentTime += self->sampleToSec;    
+        self->currentTime += self->sampleToSec;
     }
 }
 
@@ -504,47 +504,47 @@ Adsr_setProcMode(Adsr *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     if (self->duration == 0.0)
         self->proc_func_ptr = Adsr_generate_wait;
     else
-        self->proc_func_ptr = Adsr_generate_auto;        
-    
+        self->proc_func_ptr = Adsr_generate_auto;
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Adsr_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Adsr_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Adsr_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Adsr_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Adsr_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Adsr_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Adsr_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Adsr_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Adsr_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Adsr_compute_next_data_frame(Adsr *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -555,7 +555,7 @@ Adsr_traverse(Adsr *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Adsr_clear(Adsr *self)
 {
     pyo_CLEAR
@@ -577,7 +577,7 @@ Adsr_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *multmp=NULL, *addtmp=NULL;
     Adsr *self;
     self = (Adsr *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
     self->topValue = 0.0;
@@ -588,30 +588,30 @@ Adsr_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->release = 0.1;
     self->duration = 0.0;
     self->currentTime = 0.0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Adsr_compute_next_data_frame);
     self->mode_func_ptr = Adsr_setProcMode;
-    
+
     Stream_setStreamActive(self->stream, 0);
-    
+
     self->sampleToSec = 1. / self->sr;
 
     static char *kwlist[] = {"attack", "decay", "sustain", "release", "dur", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE__FFFFFOO, kwlist, &self->attack, &self->decay, &self->sustain, &self->release, &self->duration, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     if (self->attack < 0.000001)
         self->attack = 0.000001;
     if (self->decay < 0.000001)
@@ -624,18 +624,18 @@ Adsr_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         self->sustain = 1.0;
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Adsr_getServer(Adsr* self) { GET_SERVER };
 static PyObject * Adsr_getStream(Adsr* self) { GET_STREAM };
-static PyObject * Adsr_setMul(Adsr *self, PyObject *arg) { SET_MUL };	
-static PyObject * Adsr_setAdd(Adsr *self, PyObject *arg) { SET_ADD };	
-static PyObject * Adsr_setSub(Adsr *self, PyObject *arg) { SET_SUB };	
-static PyObject * Adsr_setDiv(Adsr *self, PyObject *arg) { SET_DIV };	
+static PyObject * Adsr_setMul(Adsr *self, PyObject *arg) { SET_MUL };
+static PyObject * Adsr_setAdd(Adsr *self, PyObject *arg) { SET_ADD };
+static PyObject * Adsr_setSub(Adsr *self, PyObject *arg) { SET_SUB };
+static PyObject * Adsr_setDiv(Adsr *self, PyObject *arg) { SET_DIV };
 
-static PyObject * Adsr_play(Adsr *self, PyObject *args, PyObject *kwds) 
+static PyObject * Adsr_play(Adsr *self, PyObject *args, PyObject *kwds)
 {
     self->fademode = 0;
     self->currentTime = 0.0;
@@ -652,7 +652,7 @@ Adsr_stop(Adsr *self)
     }
     else
         Adsr_internal_stop((Adsr *)self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -857,12 +857,12 @@ Linseg_convert_pointslist(Linseg *self) {
     }
 }
 
-static void 
+static void
 Linseg_reinit(Linseg *self) {
     if (self->newlist == 1) {
         Linseg_convert_pointslist((Linseg *)self);
         self->newlist = 0;
-    }    
+    }
     self->currentTime = 0.0;
     self->currentValue = self->targets[0];
     self->which = 0;
@@ -872,7 +872,7 @@ Linseg_reinit(Linseg *self) {
 static void
 Linseg_generate(Linseg *self) {
     int i;
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (self->flag == 1) {
             if (self->currentTime >= self->times[self->which]) {
@@ -883,8 +883,8 @@ Linseg_generate(Linseg *self) {
                     else {
                         self->flag = 0;
                         self->currentValue = self->targets[self->which-1];
-                    }    
-                }    
+                    }
+                }
                 else {
                     if ((self->times[self->which] - self->times[self->which-1]) <= 0)
                         self->increment = self->targets[self->which] - self->currentValue;
@@ -893,9 +893,9 @@ Linseg_generate(Linseg *self) {
                 }
             }
             if (self->currentTime <= self->times[self->listsize-1])
-                self->currentValue += self->increment;            
+                self->currentValue += self->increment;
             self->data[i] = (MYFLT)self->currentValue;
-            self->currentTime += self->sampleToSec;    
+            self->currentTime += self->sampleToSec;
         }
         else
             self->data[i] = (MYFLT)self->currentValue;
@@ -917,44 +917,44 @@ Linseg_setProcMode(Linseg *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = Linseg_generate;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Linseg_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Linseg_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Linseg_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Linseg_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Linseg_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Linseg_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Linseg_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Linseg_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Linseg_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Linseg_compute_next_data_frame(Linseg *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -966,7 +966,7 @@ Linseg_traverse(Linseg *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Linseg_clear(Linseg *self)
 {
     pyo_CLEAR
@@ -991,22 +991,22 @@ Linseg_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *pointslist=NULL, *multmp=NULL, *addtmp=NULL;
     Linseg *self;
     self = (Linseg *)type->tp_alloc(type, 0);
-    
+
     self->loop = 0;
     self->newlist = 1;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Linseg_compute_next_data_frame);
     self->mode_func_ptr = Linseg_setProcMode;
-    
+
     Stream_setStreamActive(self->stream, 0);
-    
+
     self->sampleToSec = 1. / self->sr;
 
     static char *kwlist[] = {"list", "loop", "initToFirstVal", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iiOO", kwlist, &pointslist, &self->loop, &initToFirstVal, &multmp, &addtmp))
         Py_RETURN_NONE;
 
@@ -1014,36 +1014,36 @@ Linseg_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     Py_XDECREF(self->pointslist);
     self->pointslist = pointslist;
     Linseg_convert_pointslist((Linseg *)self);
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     if (initToFirstVal) {
         for (i=0; i<self->bufsize; i++) {
             self->data[i] = self->targets[0];
         }
     }
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Linseg_getServer(Linseg* self) { GET_SERVER };
 static PyObject * Linseg_getStream(Linseg* self) { GET_STREAM };
-static PyObject * Linseg_setMul(Linseg *self, PyObject *arg) { SET_MUL };	
-static PyObject * Linseg_setAdd(Linseg *self, PyObject *arg) { SET_ADD };	
-static PyObject * Linseg_setSub(Linseg *self, PyObject *arg) { SET_SUB };	
-static PyObject * Linseg_setDiv(Linseg *self, PyObject *arg) { SET_DIV };	
+static PyObject * Linseg_setMul(Linseg *self, PyObject *arg) { SET_MUL };
+static PyObject * Linseg_setAdd(Linseg *self, PyObject *arg) { SET_ADD };
+static PyObject * Linseg_setSub(Linseg *self, PyObject *arg) { SET_SUB };
+static PyObject * Linseg_setDiv(Linseg *self, PyObject *arg) { SET_DIV };
 
-static PyObject * Linseg_play(Linseg *self, PyObject *args, PyObject *kwds) 
+static PyObject * Linseg_play(Linseg *self, PyObject *args, PyObject *kwds)
 {
     Linseg_reinit((Linseg *)self);
     PLAY
@@ -1067,18 +1067,18 @@ Linseg_setList(Linseg *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the list attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyList_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The points list attribute value must be a list of tuples.");
         return PyInt_FromLong(-1);
     }
-    
+
     Py_INCREF(value);
     Py_DECREF(self->pointslist);
-    self->pointslist = value; 
-    
+    self->pointslist = value;
+
     self->newlist = 1;
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1090,9 +1090,9 @@ Linseg_setLoop(Linseg *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->loop = PyInt_AsLong(arg);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1232,7 +1232,7 @@ static void
 Expseg_convert_pointslist(Expseg *self) {
     int i;
     PyObject *tup;
-    
+
     self->listsize = PyList_Size(self->pointslist);
     self->targets = (MYFLT *)realloc(self->targets, self->listsize * sizeof(MYFLT));
     self->times = (MYFLT *)realloc(self->times, self->listsize * sizeof(MYFLT));
@@ -1243,12 +1243,12 @@ Expseg_convert_pointslist(Expseg *self) {
     }
 }
 
-static void 
+static void
 Expseg_reinit(Expseg *self) {
     if (self->newlist == 1) {
         Expseg_convert_pointslist((Expseg *)self);
         self->newlist = 0;
-    }    
+    }
     self->currentTime = 0.0;
     self->currentValue = self->targets[0];
     self->which = 0;
@@ -1261,7 +1261,7 @@ static void
 Expseg_generate(Expseg *self) {
     int i;
     double scl;
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (self->flag == 1) {
             if (self->currentTime >= self->times[self->which]) {
@@ -1272,8 +1272,8 @@ Expseg_generate(Expseg *self) {
                     else {
                         self->flag = 0;
                         self->currentValue = self->targets[self->which-1];
-                    }    
-                }    
+                    }
+                }
                 else {
                     self->range = self->targets[self->which] - self->targets[self->which-1];
                     self->steps = (self->times[self->which] - self->times[self->which-1]) * self->sr;
@@ -1281,8 +1281,8 @@ Expseg_generate(Expseg *self) {
                         self->inc = 1.0;
                     else
                         self->inc = 1.0 / self->steps;
-                }    
-                self->pointer = 0.0;   
+                }
+                self->pointer = 0.0;
             }
             if (self->currentTime <= self->times[self->listsize-1]) {
                 if (self->pointer >= 1.0)
@@ -1294,9 +1294,9 @@ Expseg_generate(Expseg *self) {
 
                 self->currentValue = scl * self->range + self->targets[self->which-1];
                 self->pointer += self->inc;
-            }    
+            }
             self->data[i] = (MYFLT)self->currentValue;
-            self->currentTime += self->sampleToSec;    
+            self->currentTime += self->sampleToSec;
         }
         else
             self->data[i] = (MYFLT)self->currentValue;
@@ -1318,44 +1318,44 @@ Expseg_setProcMode(Expseg *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = Expseg_generate;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Expseg_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Expseg_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Expseg_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Expseg_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Expseg_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Expseg_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Expseg_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Expseg_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Expseg_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Expseg_compute_next_data_frame(Expseg *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1367,7 +1367,7 @@ Expseg_traverse(Expseg *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Expseg_clear(Expseg *self)
 {
     pyo_CLEAR
@@ -1392,40 +1392,40 @@ Expseg_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *pointslist=NULL, *multmp=NULL, *addtmp=NULL;
     Expseg *self;
     self = (Expseg *)type->tp_alloc(type, 0);
-    
+
     self->loop = 0;
     self->newlist = 1;
     self->exp = self->exp_tmp = 10;
     self->inverse = self->inverse_tmp = 1;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Expseg_compute_next_data_frame);
     self->mode_func_ptr = Expseg_setProcMode;
-    
+
     Stream_setStreamActive(self->stream, 0);
-    
+
     self->sampleToSec = 1. / self->sr;
 
     static char *kwlist[] = {"list", "loop", "exp", "inverse", "initToFirstVal", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|idiiOO", kwlist, &pointslist, &self->loop, &self->exp_tmp, &self->inverse_tmp, &initToFirstVal, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     Py_INCREF(pointslist);
     Py_XDECREF(self->pointslist);
     self->pointslist = pointslist;
     Expseg_convert_pointslist((Expseg *)self);
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     if (initToFirstVal) {
@@ -1435,18 +1435,18 @@ Expseg_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     }
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Expseg_getServer(Expseg* self) { GET_SERVER };
 static PyObject * Expseg_getStream(Expseg* self) { GET_STREAM };
-static PyObject * Expseg_setMul(Expseg *self, PyObject *arg) { SET_MUL };	
-static PyObject * Expseg_setAdd(Expseg *self, PyObject *arg) { SET_ADD };	
-static PyObject * Expseg_setSub(Expseg *self, PyObject *arg) { SET_SUB };	
-static PyObject * Expseg_setDiv(Expseg *self, PyObject *arg) { SET_DIV };	
+static PyObject * Expseg_setMul(Expseg *self, PyObject *arg) { SET_MUL };
+static PyObject * Expseg_setAdd(Expseg *self, PyObject *arg) { SET_ADD };
+static PyObject * Expseg_setSub(Expseg *self, PyObject *arg) { SET_SUB };
+static PyObject * Expseg_setDiv(Expseg *self, PyObject *arg) { SET_DIV };
 
-static PyObject * Expseg_play(Expseg *self, PyObject *args, PyObject *kwds) 
+static PyObject * Expseg_play(Expseg *self, PyObject *args, PyObject *kwds)
 {
     Expseg_reinit((Expseg *)self);
     PLAY
@@ -1470,18 +1470,18 @@ Expseg_setList(Expseg *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the list attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyList_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The points list attribute value must be a list of tuples.");
         return PyInt_FromLong(-1);
     }
-    
+
     Py_INCREF(value);
     Py_DECREF(self->pointslist);
-    self->pointslist = value; 
-    
+    self->pointslist = value;
+
     self->newlist = 1;
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1493,9 +1493,9 @@ Expseg_setLoop(Expseg *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->loop = PyInt_AsLong(arg);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1507,9 +1507,9 @@ Expseg_setExp(Expseg *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->exp_tmp = PyFloat_AsDouble(PyNumber_Float(arg));
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1521,9 +1521,9 @@ Expseg_setInverse(Expseg *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->inverse_tmp = PyInt_AsLong(PyNumber_Int(arg));
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1635,4 +1635,4 @@ PyTypeObject ExpsegType = {
     0,      /* tp_init */
     0,                         /* tp_alloc */
     Expseg_new,                 /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/fftmodule.c b/src/objects/fftmodule.c
index f9e6106..f8d6f6d 100644
--- a/src/objects/fftmodule.c
+++ b/src/objects/fftmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -29,7 +29,7 @@
 #include "wind.h"
 #include "sndfile.h"
 
-static int 
+static int
 isPowerOfTwo(int x) {
     return (x != 0) && ((x & (x - 1)) == 0);
 }
@@ -57,7 +57,7 @@ FFTMain_realloc_memories(FFTMain *self) {
     self->hsize = self->size / 2;
     n8 = self->size >> 3;
     self->inframe = (MYFLT *)realloc(self->inframe, self->size * sizeof(MYFLT));
-    self->outframe = (MYFLT *)realloc(self->outframe, self->size * sizeof(MYFLT));    
+    self->outframe = (MYFLT *)realloc(self->outframe, self->size * sizeof(MYFLT));
     for (i=0; i<self->size; i++)
         self->inframe[i] = self->outframe[i] = 0.0;
     self->buffer_streams = (MYFLT *)realloc(self->buffer_streams, 3 * self->bufsize * sizeof(MYFLT));
@@ -78,7 +78,7 @@ static void
 FFTMain_filters(FFTMain *self) {
     int i, incount;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-   
+
     incount = self->incount;
 
     for (i=0; i<self->bufsize; i++) {
@@ -99,10 +99,10 @@ FFTMain_filters(FFTMain *self) {
         }
         incount++;
         if (incount >= self->size) {
-            incount -= self->size;      
+            incount -= self->size;
             realfft_split(self->inframe, self->outframe, self->size, self->twiddle);
         }
-    } 
+    }
 
     /*
     for (i=0; i<self->bufsize; i++) {
@@ -113,12 +113,12 @@ FFTMain_filters(FFTMain *self) {
                 self->buffer_streams[i+self->bufsize] = self->outframe[incount*2+1];
             }
             else
-                self->buffer_streams[i] = self->buffer_streams[i+self->bufsize] = 0.0; 
+                self->buffer_streams[i] = self->buffer_streams[i+self->bufsize] = 0.0;
             self->buffer_streams[i+self->bufsize*2] = (MYFLT)incount;
         }
         incount++;
         if (incount >= self->size) {
-            incount -= self->size;      
+            incount -= self->size;
             realfft_packed(self->inframe, self->outframe, self->size, self->twiddle2);
         }
     }
@@ -130,18 +130,18 @@ MYFLT *
 FFTMain_getSamplesBuffer(FFTMain *self)
 {
     return (MYFLT *)self->buffer_streams;
-}    
+}
 
 static void
 FFTMain_setProcMode(FFTMain *self)
-{        
-    self->proc_func_ptr = FFTMain_filters;  
+{
+    self->proc_func_ptr = FFTMain_filters;
 }
 
 static void
 FFTMain_compute_next_data_frame(FFTMain *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -153,7 +153,7 @@ FFTMain_traverse(FFTMain *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 FFTMain_clear(FFTMain *self)
 {
     pyo_CLEAR
@@ -187,7 +187,7 @@ FFTMain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp;
     FFTMain *self;
     self = (FFTMain *)type->tp_alloc(type, 0);
-    
+
     self->size = 1024;
     self->wintype = 2;
     INIT_OBJECT_COMMON
@@ -195,12 +195,12 @@ FFTMain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = FFTMain_setProcMode;
 
     static char *kwlist[] = {"input", "size", "hopsize", "wintype", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iii", kwlist, &inputtmp, &self->size, &self->hopsize, &self->wintype))
         Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     FFTMain_realloc_memories(self);
@@ -219,7 +219,7 @@ static PyObject * FFTMain_stop(FFTMain *self) { STOP };
 static PyObject *
 FFTMain_setSize(FFTMain *self, PyObject *args, PyObject *kwds)
 {
-    int size, hopsize;    
+    int size, hopsize;
 
     static char *kwlist[] = {"size", "hopsize", NULL};
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "ii", kwlist, &size, &hopsize)) {
@@ -234,19 +234,19 @@ FFTMain_setSize(FFTMain *self, PyObject *args, PyObject *kwds)
     }
     else
         printf("FFT size must be a power of two!\n");
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject *
 FFTMain_setWinType(FFTMain *self, PyObject *arg)
-{    
+{
     if (PyLong_Check(arg) || PyInt_Check(arg)) {
         self->wintype = PyLong_AsLong(arg);
         gen_window(self->window, self->size, self->wintype);
-    }    
-    
+    }
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -335,33 +335,33 @@ FFT_setProcMode(FFT *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = FFT_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = FFT_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = FFT_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = FFT_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = FFT_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = FFT_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = FFT_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = FFT_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = FFT_postprocessing_revareva;
             break;
     }
@@ -376,7 +376,7 @@ FFT_compute_next_data_frame(FFT *self)
     tmp = FFTMain_getSamplesBuffer((FFTMain *)self->mainSplitter);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -388,11 +388,11 @@ FFT_traverse(FFT *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 FFT_clear(FFT *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainSplitter);    
+    Py_CLEAR(self->mainSplitter);
     return 0;
 }
 
@@ -411,33 +411,33 @@ FFT_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL, *multmp=NULL, *addtmp=NULL;
     FFT *self;
     self = (FFT *)type->tp_alloc(type, 0);
-    
+
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, FFT_compute_next_data_frame);
     self->mode_func_ptr = FFT_setProcMode;
 
     static char *kwlist[] = {"mainSplitter", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "Oi|OO", kwlist, &maintmp, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainSplitter);
     Py_INCREF(maintmp);
     self->mainSplitter = (FFTMain *)maintmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -445,10 +445,10 @@ FFT_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * FFT_getServer(FFT* self) { GET_SERVER };
 static PyObject * FFT_getStream(FFT* self) { GET_STREAM };
-static PyObject * FFT_setMul(FFT *self, PyObject *arg) { SET_MUL };    
-static PyObject * FFT_setAdd(FFT *self, PyObject *arg) { SET_ADD };    
-static PyObject * FFT_setSub(FFT *self, PyObject *arg) { SET_SUB };    
-static PyObject * FFT_setDiv(FFT *self, PyObject *arg) { SET_DIV };    
+static PyObject * FFT_setMul(FFT *self, PyObject *arg) { SET_MUL };
+static PyObject * FFT_setAdd(FFT *self, PyObject *arg) { SET_ADD };
+static PyObject * FFT_setSub(FFT *self, PyObject *arg) { SET_SUB };
+static PyObject * FFT_setDiv(FFT *self, PyObject *arg) { SET_DIV };
 
 static PyObject * FFT_play(FFT *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * FFT_stop(FFT *self) { STOP };
@@ -578,7 +578,7 @@ typedef struct {
     int wintype;
     int incount;
     MYFLT *inframe;
-    MYFLT *outframe;    
+    MYFLT *outframe;
     MYFLT *window;
     MYFLT **twiddle;
     MYFLT *twiddle2;
@@ -591,7 +591,7 @@ IFFT_realloc_memories(IFFT *self) {
     self->hsize = self->size / 2;
     n8 = self->size >> 3;
     self->inframe = (MYFLT *)realloc(self->inframe, self->size * sizeof(MYFLT));
-    self->outframe = (MYFLT *)realloc(self->outframe, self->size * sizeof(MYFLT));    
+    self->outframe = (MYFLT *)realloc(self->outframe, self->size * sizeof(MYFLT));
     for (i=0; i<self->size; i++)
         self->inframe[i] = self->outframe[i] = 0.0;
     self->twiddle = (MYFLT **)realloc(self->twiddle, 4 * sizeof(MYFLT *));
@@ -627,7 +627,7 @@ IFFT_filters(IFFT *self) {
         }
         incount++;
         if (incount >= self->size) {
-            incount -= self->size;      
+            incount -= self->size;
             irealfft_split(self->inframe, self->outframe, self->size, self->twiddle);
         }
     }
@@ -642,11 +642,11 @@ IFFT_filters(IFFT *self) {
         }
         incount++;
         if (incount >= self->size) {
-            incount -= self->size;      
+            incount -= self->size;
             irealfft_packed(self->inframe, self->outframe, self->size, self->twiddle2);
         }
     }
-    */ 
+    */
     self->incount = incount;
 }
 
@@ -667,42 +667,42 @@ IFFT_setProcMode(IFFT *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
     self->proc_func_ptr = IFFT_filters;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = IFFT_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = IFFT_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = IFFT_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = IFFT_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = IFFT_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = IFFT_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = IFFT_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = IFFT_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = IFFT_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 IFFT_compute_next_data_frame(IFFT *self)
-{   
-    (*self->proc_func_ptr)(self);    
+{
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -717,7 +717,7 @@ IFFT_traverse(IFFT *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 IFFT_clear(IFFT *self)
 {
     pyo_CLEAR
@@ -780,7 +780,7 @@ IFFT_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     Py_INCREF(inreal_streamtmp);
     Py_XDECREF(self->inreal_stream);
     self->inreal_stream = (Stream *)inreal_streamtmp;
- 
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
@@ -788,22 +788,22 @@ IFFT_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-            
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
-    IFFT_realloc_memories(self);    
+    IFFT_realloc_memories(self);
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * IFFT_getServer(IFFT* self) { GET_SERVER };
 static PyObject * IFFT_getStream(IFFT* self) { GET_STREAM };
-static PyObject * IFFT_setMul(IFFT *self, PyObject *arg) { SET_MUL };    
-static PyObject * IFFT_setAdd(IFFT *self, PyObject *arg) { SET_ADD };    
-static PyObject * IFFT_setSub(IFFT *self, PyObject *arg) { SET_SUB };    
-static PyObject * IFFT_setDiv(IFFT *self, PyObject *arg) { SET_DIV };    
+static PyObject * IFFT_setMul(IFFT *self, PyObject *arg) { SET_MUL };
+static PyObject * IFFT_setAdd(IFFT *self, PyObject *arg) { SET_ADD };
+static PyObject * IFFT_setSub(IFFT *self, PyObject *arg) { SET_SUB };
+static PyObject * IFFT_setDiv(IFFT *self, PyObject *arg) { SET_DIV };
 
 static PyObject * IFFT_play(IFFT *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * IFFT_out(IFFT *self, PyObject *args, PyObject *kwds) { OUT };
@@ -821,7 +821,7 @@ static PyObject * IFFT_inplace_div(IFFT *self, PyObject *arg) { INPLACE_DIV };
 static PyObject *
 IFFT_setSize(IFFT *self, PyObject *args, PyObject *kwds)
 {
-    int size, hopsize;    
+    int size, hopsize;
 
     static char *kwlist[] = {"size", "hopsize", NULL};
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "ii", kwlist, &size, &hopsize)) {
@@ -836,19 +836,19 @@ IFFT_setSize(IFFT *self, PyObject *args, PyObject *kwds)
     }
     else
         printf("IFFT size must be a power of two!\n");
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject *
 IFFT_setWinType(IFFT *self, PyObject *arg)
-{    
+{
     if (PyLong_Check(arg) || PyInt_Check(arg)) {
         self->wintype = PyLong_AsLong(arg);
         gen_window(self->window, self->size, self->wintype);
-    }    
-    
+    }
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1005,35 +1005,35 @@ CarToPol_setProcMode(CarToPol *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = CarToPol_generate;
 
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = CarToPol_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = CarToPol_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = CarToPol_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = CarToPol_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = CarToPol_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = CarToPol_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = CarToPol_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = CarToPol_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = CarToPol_postprocessing_revareva;
             break;
     }
@@ -1042,7 +1042,7 @@ CarToPol_setProcMode(CarToPol *self)
 static void
 CarToPol_compute_next_data_frame(CarToPol *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1057,7 +1057,7 @@ CarToPol_traverse(CarToPol *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 CarToPol_clear(CarToPol *self)
 {
     pyo_CLEAR
@@ -1083,49 +1083,49 @@ CarToPol_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *input2tmp, *input2_streamtmp, *multmp=NULL, *addtmp=NULL;
     CarToPol *self;
     self = (CarToPol *)type->tp_alloc(type, 0);
-    
+
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, CarToPol_compute_next_data_frame);
     self->mode_func_ptr = CarToPol_setProcMode;
 
     static char *kwlist[] = {"input", "input2", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OOi|OO", kwlist, &inputtmp, &input2tmp, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     Py_XDECREF(self->input2);
     self->input2 = input2tmp;
     input2_streamtmp = PyObject_CallMethod((PyObject *)self->input2, "_getStream", NULL);
     Py_INCREF(input2_streamtmp);
     Py_XDECREF(self->input2_stream);
     self->input2_stream = (Stream *)input2_streamtmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * CarToPol_getServer(CarToPol* self) { GET_SERVER };
 static PyObject * CarToPol_getStream(CarToPol* self) { GET_STREAM };
-static PyObject * CarToPol_setMul(CarToPol *self, PyObject *arg) { SET_MUL };    
-static PyObject * CarToPol_setAdd(CarToPol *self, PyObject *arg) { SET_ADD };    
-static PyObject * CarToPol_setSub(CarToPol *self, PyObject *arg) { SET_SUB };    
-static PyObject * CarToPol_setDiv(CarToPol *self, PyObject *arg) { SET_DIV };    
+static PyObject * CarToPol_setMul(CarToPol *self, PyObject *arg) { SET_MUL };
+static PyObject * CarToPol_setAdd(CarToPol *self, PyObject *arg) { SET_ADD };
+static PyObject * CarToPol_setSub(CarToPol *self, PyObject *arg) { SET_SUB };
+static PyObject * CarToPol_setDiv(CarToPol *self, PyObject *arg) { SET_DIV };
 
 static PyObject * CarToPol_play(CarToPol *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * CarToPol_stop(CarToPol *self) { STOP };
@@ -1260,7 +1260,7 @@ PolToCar_generate(PolToCar *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *in2 = Stream_getData((Stream *)self->input2_stream);
-    
+
     if (self->chnl == 0) {
         for (i=0; i<self->bufsize; i++) {
             self->data[i] = in[i] * MYCOS(in2[i]);
@@ -1288,35 +1288,35 @@ PolToCar_setProcMode(PolToCar *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = PolToCar_generate;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = PolToCar_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = PolToCar_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = PolToCar_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = PolToCar_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = PolToCar_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = PolToCar_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = PolToCar_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = PolToCar_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = PolToCar_postprocessing_revareva;
             break;
     }
@@ -1325,7 +1325,7 @@ PolToCar_setProcMode(PolToCar *self)
 static void
 PolToCar_compute_next_data_frame(PolToCar *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1340,7 +1340,7 @@ PolToCar_traverse(PolToCar *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 PolToCar_clear(PolToCar *self)
 {
     pyo_CLEAR
@@ -1366,49 +1366,49 @@ PolToCar_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *input2tmp, *input2_streamtmp, *multmp=NULL, *addtmp=NULL;
     PolToCar *self;
     self = (PolToCar *)type->tp_alloc(type, 0);
-    
+
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, PolToCar_compute_next_data_frame);
     self->mode_func_ptr = PolToCar_setProcMode;
 
     static char *kwlist[] = {"input", "input2", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OOi|OO", kwlist, &inputtmp, &input2tmp, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     Py_XDECREF(self->input2);
     self->input2 = input2tmp;
     input2_streamtmp = PyObject_CallMethod((PyObject *)self->input2, "_getStream", NULL);
     Py_INCREF(input2_streamtmp);
     Py_XDECREF(self->input2_stream);
     self->input2_stream = (Stream *)input2_streamtmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * PolToCar_getServer(PolToCar* self) { GET_SERVER };
 static PyObject * PolToCar_getStream(PolToCar* self) { GET_STREAM };
-static PyObject * PolToCar_setMul(PolToCar *self, PyObject *arg) { SET_MUL };    
-static PyObject * PolToCar_setAdd(PolToCar *self, PyObject *arg) { SET_ADD };    
-static PyObject * PolToCar_setSub(PolToCar *self, PyObject *arg) { SET_SUB };    
-static PyObject * PolToCar_setDiv(PolToCar *self, PyObject *arg) { SET_DIV };    
+static PyObject * PolToCar_setMul(PolToCar *self, PyObject *arg) { SET_MUL };
+static PyObject * PolToCar_setAdd(PolToCar *self, PyObject *arg) { SET_ADD };
+static PyObject * PolToCar_setSub(PolToCar *self, PyObject *arg) { SET_SUB };
+static PyObject * PolToCar_setDiv(PolToCar *self, PyObject *arg) { SET_DIV };
 
 static PyObject * PolToCar_play(PolToCar *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * PolToCar_stop(PolToCar *self) { STOP };
@@ -1530,10 +1530,10 @@ PyTypeObject PolToCarType = {
 
 typedef struct {
     pyo_audio_HEAD
-    PyObject *input; 
+    PyObject *input;
     int inputSize;
     int modebuffer[2];
-    int frameSize; 
+    int frameSize;
     int overlaps;
     int hopsize;
     int count;
@@ -1552,7 +1552,7 @@ FrameDeltaMain_generate(FrameDeltaMain *self) {
         for (i=0; i<self->bufsize; i++) {
             ins[j][i] = in[i];
         }
-    }   
+    }
     for (i=0; i<self->bufsize; i++) {
         for (j=0; j<self->overlaps; j++) {
             curPhase = ins[j][i];
@@ -1570,7 +1570,7 @@ FrameDeltaMain_generate(FrameDeltaMain *self) {
             while (diff > PI) {
                 diff -= TWOPI;
             }
-            self->frameBuffer[j][self->count] = curPhase;            
+            self->frameBuffer[j][self->count] = curPhase;
             self->buffer_streams[i+j*self->bufsize] = diff;
         }
         self->count++;
@@ -1583,18 +1583,18 @@ MYFLT *
 FrameDeltaMain_getSamplesBuffer(FrameDeltaMain *self)
 {
     return (MYFLT *)self->buffer_streams;
-}    
+}
 
 static void
 FrameDeltaMain_setProcMode(FrameDeltaMain *self)
-{    
+{
     self->proc_func_ptr = FrameDeltaMain_generate;
 }
 
 static void
 FrameDeltaMain_compute_next_data_frame(FrameDeltaMain *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -1605,7 +1605,7 @@ FrameDeltaMain_traverse(FrameDeltaMain *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 FrameDeltaMain_clear(FrameDeltaMain *self)
 {
     pyo_CLEAR
@@ -1634,24 +1634,24 @@ FrameDeltaMain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp;
     FrameDeltaMain *self;
     self = (FrameDeltaMain *)type->tp_alloc(type, 0);
-    
+
     self->count = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, FrameDeltaMain_compute_next_data_frame);
     self->mode_func_ptr = FrameDeltaMain_setProcMode;
 
     static char *kwlist[] = {"input", "frameSize", "overlaps", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "Oii", kwlist, &inputtmp, &self->frameSize, &self->overlaps))
         Py_RETURN_NONE;
-    
+
     if (inputtmp) {
         PyObject_CallMethod((PyObject *)self, "setInput", "O", inputtmp);
     }
 
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->hopsize = self->frameSize / self->overlaps;
     self->frameBuffer = (MYFLT **)realloc(self->frameBuffer, self->overlaps * sizeof(MYFLT *));
     for(i=0; i<self->overlaps; i++) {
@@ -1666,7 +1666,7 @@ FrameDeltaMain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     }
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
@@ -1680,29 +1680,29 @@ static PyObject *
 FrameDeltaMain_setInput(FrameDeltaMain *self, PyObject *arg)
 {
     PyObject *tmp;
-    
+
     if (! PyList_Check(arg)) {
         PyErr_SetString(PyExc_TypeError, "The inputs attribute must be a list.");
         Py_INCREF(Py_None);
         return Py_None;
     }
-    
+
     tmp = arg;
     self->inputSize = PyList_Size(tmp);
     Py_INCREF(tmp);
     Py_XDECREF(self->input);
     self->input = tmp;
-    
+
     Py_INCREF(Py_None);
     return Py_None;
-}    
+}
 
 static PyObject *
 FrameDeltaMain_setFrameSize(FrameDeltaMain *self, PyObject *arg)
-{    
+{
     int i, j, tmp;
 
-    if (PyInt_Check(arg)) { 
+    if (PyInt_Check(arg)) {
         tmp = PyLong_AsLong(arg);
         if (isPowerOfTwo(tmp)) {
             self->frameSize = tmp;
@@ -1721,7 +1721,7 @@ FrameDeltaMain_setFrameSize(FrameDeltaMain *self, PyObject *arg)
     }
     else
         printf("frameSize must be a power of two!\n");
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1810,33 +1810,33 @@ FrameDelta_setProcMode(FrameDelta *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = FrameDelta_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = FrameDelta_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = FrameDelta_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = FrameDelta_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = FrameDelta_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = FrameDelta_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = FrameDelta_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = FrameDelta_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = FrameDelta_postprocessing_revareva;
             break;
     }
@@ -1851,7 +1851,7 @@ FrameDelta_compute_next_data_frame(FrameDelta *self)
     tmp = FrameDeltaMain_getSamplesBuffer((FrameDeltaMain *)self->mainSplitter);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1863,11 +1863,11 @@ FrameDelta_traverse(FrameDelta *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 FrameDelta_clear(FrameDelta *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainSplitter);    
+    Py_CLEAR(self->mainSplitter);
     return 0;
 }
 
@@ -1886,44 +1886,44 @@ FrameDelta_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL, *multmp=NULL, *addtmp=NULL;
     FrameDelta *self;
     self = (FrameDelta *)type->tp_alloc(type, 0);
-    
+
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, FrameDelta_compute_next_data_frame);
     self->mode_func_ptr = FrameDelta_setProcMode;
 
     static char *kwlist[] = {"mainSplitter", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "Oi|OO", kwlist, &maintmp, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainSplitter);
     Py_INCREF(maintmp);
     self->mainSplitter = (FrameDeltaMain *)maintmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * FrameDelta_getServer(FrameDelta* self) { GET_SERVER };
 static PyObject * FrameDelta_getStream(FrameDelta* self) { GET_STREAM };
-static PyObject * FrameDelta_setMul(FrameDelta *self, PyObject *arg) { SET_MUL };    
-static PyObject * FrameDelta_setAdd(FrameDelta *self, PyObject *arg) { SET_ADD };    
-static PyObject * FrameDelta_setSub(FrameDelta *self, PyObject *arg) { SET_SUB };    
-static PyObject * FrameDelta_setDiv(FrameDelta *self, PyObject *arg) { SET_DIV };    
+static PyObject * FrameDelta_setMul(FrameDelta *self, PyObject *arg) { SET_MUL };
+static PyObject * FrameDelta_setAdd(FrameDelta *self, PyObject *arg) { SET_ADD };
+static PyObject * FrameDelta_setSub(FrameDelta *self, PyObject *arg) { SET_SUB };
+static PyObject * FrameDelta_setDiv(FrameDelta *self, PyObject *arg) { SET_DIV };
 
 static PyObject * FrameDelta_play(FrameDelta *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * FrameDelta_out(FrameDelta *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2045,10 +2045,10 @@ PyTypeObject FrameDeltaType = {
 
 typedef struct {
     pyo_audio_HEAD
-    PyObject *input; 
+    PyObject *input;
     int inputSize;
     int modebuffer[2];
-    int frameSize; 
+    int frameSize;
     int overlaps;
     int hopsize;
     int count;
@@ -2060,14 +2060,14 @@ static void
 FrameAccumMain_generate(FrameAccumMain *self) {
     int i, j, which, where;
     MYFLT curPhase, lastPhase, diff;
-    
+
     MYFLT ins[self->overlaps][self->bufsize];
     for (j=0; j<self->overlaps; j++) {
         MYFLT *in = Stream_getData((Stream *)PyObject_CallMethod((PyObject *)PyList_GET_ITEM(self->input, j), "_getStream", NULL));
         for (i=0; i<self->bufsize; i++) {
             ins[j][i] = in[i];
         }
-    }   
+    }
     for (i=0; i<self->bufsize; i++) {
         for (j=0; j<self->overlaps; j++) {
             curPhase = ins[j][i];
@@ -2079,7 +2079,7 @@ FrameAccumMain_generate(FrameAccumMain *self) {
                 where += self->frameSize;
             lastPhase = self->frameBuffer[which][where];
             diff = curPhase + lastPhase;
-            self->frameBuffer[j][self->count] = diff;            
+            self->frameBuffer[j][self->count] = diff;
             self->buffer_streams[i+j*self->bufsize] = diff;
         }
         self->count++;
@@ -2092,18 +2092,18 @@ MYFLT *
 FrameAccumMain_getSamplesBuffer(FrameAccumMain *self)
 {
     return (MYFLT *)self->buffer_streams;
-}    
+}
 
 static void
 FrameAccumMain_setProcMode(FrameAccumMain *self)
-{    
+{
     self->proc_func_ptr = FrameAccumMain_generate;
 }
 
 static void
 FrameAccumMain_compute_next_data_frame(FrameAccumMain *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -2114,7 +2114,7 @@ FrameAccumMain_traverse(FrameAccumMain *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 FrameAccumMain_clear(FrameAccumMain *self)
 {
     pyo_CLEAR
@@ -2143,24 +2143,24 @@ FrameAccumMain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp;
     FrameAccumMain *self;
     self = (FrameAccumMain *)type->tp_alloc(type, 0);
-    
+
     self->count = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, FrameAccumMain_compute_next_data_frame);
     self->mode_func_ptr = FrameAccumMain_setProcMode;
 
     static char *kwlist[] = {"input", "framesize", "overlaps", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "Oii", kwlist, &inputtmp, &self->frameSize, &self->overlaps))
         Py_RETURN_NONE;
-    
+
     if (inputtmp) {
         PyObject_CallMethod((PyObject *)self, "setInput", "O", inputtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->hopsize = self->frameSize / self->overlaps;
     self->frameBuffer = (MYFLT **)realloc(self->frameBuffer, self->overlaps * sizeof(MYFLT *));
     for(i=0; i<self->overlaps; i++) {
@@ -2173,9 +2173,9 @@ FrameAccumMain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     for (i=0; i<(self->overlaps*self->bufsize); i++) {
         self->buffer_streams[i] = 0.0;
     }
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
@@ -2189,34 +2189,34 @@ static PyObject *
 FrameAccumMain_setInput(FrameAccumMain *self, PyObject *arg)
 {
     PyObject *tmp;
-    
+
     if (! PyList_Check(arg)) {
         PyErr_SetString(PyExc_TypeError, "The inputs attribute must be a list.");
         Py_INCREF(Py_None);
         return Py_None;
     }
-    
+
     tmp = arg;
     self->inputSize = PyList_Size(tmp);
     Py_INCREF(tmp);
     Py_XDECREF(self->input);
     self->input = tmp;
-    
+
     Py_INCREF(Py_None);
     return Py_None;
-}    
+}
 
 static PyObject *
 FrameAccumMain_setFrameSize(FrameAccumMain *self, PyObject *arg)
-{    
+{
     int i, j, tmp;
-    
-    if (PyInt_Check(arg)) { 
+
+    if (PyInt_Check(arg)) {
         tmp = PyLong_AsLong(arg);
         if (isPowerOfTwo(tmp)) {
             self->frameSize = tmp;
             self->hopsize = self->frameSize / self->overlaps;
-            
+
             self->frameBuffer = (MYFLT **)realloc(self->frameBuffer, self->overlaps * sizeof(MYFLT *));
             for(i=0; i<self->overlaps; i++) {
                 self->frameBuffer[i] = (MYFLT *)malloc(self->frameSize * sizeof(MYFLT));
@@ -2224,13 +2224,13 @@ FrameAccumMain_setFrameSize(FrameAccumMain *self, PyObject *arg)
                     self->frameBuffer[i][j] = 0.0;
                 }
             }
-            
+
             self->count = 0;
         }
     }
     else
         printf("frameSize must be a power of two!\n");
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2319,33 +2319,33 @@ FrameAccum_setProcMode(FrameAccum *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = FrameAccum_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = FrameAccum_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = FrameAccum_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = FrameAccum_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = FrameAccum_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = FrameAccum_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = FrameAccum_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = FrameAccum_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = FrameAccum_postprocessing_revareva;
             break;
     }
@@ -2360,7 +2360,7 @@ FrameAccum_compute_next_data_frame(FrameAccum *self)
     tmp = FrameAccumMain_getSamplesBuffer((FrameAccumMain *)self->mainSplitter);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2372,11 +2372,11 @@ FrameAccum_traverse(FrameAccum *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 FrameAccum_clear(FrameAccum *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainSplitter);    
+    Py_CLEAR(self->mainSplitter);
     return 0;
 }
 
@@ -2395,44 +2395,44 @@ FrameAccum_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL, *multmp=NULL, *addtmp=NULL;
     FrameAccum *self;
     self = (FrameAccum *)type->tp_alloc(type, 0);
-    
+
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, FrameAccum_compute_next_data_frame);
     self->mode_func_ptr = FrameAccum_setProcMode;
 
     static char *kwlist[] = {"mainSplitter", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "Oi|OO", kwlist, &maintmp, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainSplitter);
     Py_INCREF(maintmp);
     self->mainSplitter = (FrameAccumMain *)maintmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * FrameAccum_getServer(FrameAccum* self) { GET_SERVER };
 static PyObject * FrameAccum_getStream(FrameAccum* self) { GET_STREAM };
-static PyObject * FrameAccum_setMul(FrameAccum *self, PyObject *arg) { SET_MUL };    
-static PyObject * FrameAccum_setAdd(FrameAccum *self, PyObject *arg) { SET_ADD };    
-static PyObject * FrameAccum_setSub(FrameAccum *self, PyObject *arg) { SET_SUB };    
-static PyObject * FrameAccum_setDiv(FrameAccum *self, PyObject *arg) { SET_DIV };    
+static PyObject * FrameAccum_setMul(FrameAccum *self, PyObject *arg) { SET_MUL };
+static PyObject * FrameAccum_setAdd(FrameAccum *self, PyObject *arg) { SET_ADD };
+static PyObject * FrameAccum_setSub(FrameAccum *self, PyObject *arg) { SET_SUB };
+static PyObject * FrameAccum_setDiv(FrameAccum *self, PyObject *arg) { SET_DIV };
 
 static PyObject * FrameAccum_play(FrameAccum *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * FrameAccum_out(FrameAccum *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2554,7 +2554,7 @@ PyTypeObject FrameAccumType = {
 
 typedef struct {
     pyo_audio_HEAD
-    PyObject *input; 
+    PyObject *input;
     PyObject *up;
     Stream *up_stream;
     PyObject *down;
@@ -2563,7 +2563,7 @@ typedef struct {
     Stream *damp_stream;
     int inputSize;
     int modebuffer[5];
-    int frameSize; 
+    int frameSize;
     int overlaps;
     int hopsize;
     int count;
@@ -2575,9 +2575,9 @@ static void
 VectralMain_generate(VectralMain *self) {
     int i, j, which, where, bin, halfSize;
     MYFLT curMag, lastMag, diff, slope, up, down, damp;
-    
+
     halfSize = self->frameSize / 2;
-    
+
     if (self->modebuffer[2] == 0)
         up = PyFloat_AS_DOUBLE(self->up);
     else
@@ -2607,14 +2607,14 @@ VectralMain_generate(VectralMain *self) {
     else if (damp > 1.0)
         damp = 1.0;
     damp = damp * 0.1 + 0.9;
-    
+
     MYFLT ins[self->overlaps][self->bufsize];
     for (j=0; j<self->overlaps; j++) {
         MYFLT *in = Stream_getData((Stream *)PyObject_CallMethod((PyObject *)PyList_GET_ITEM(self->input, j), "_getStream", NULL));
         for (i=0; i<self->bufsize; i++) {
             ins[j][i] = in[i];
         }
-    }   
+    }
     for (i=0; i<self->bufsize; i++) {
         for (j=0; j<self->overlaps; j++) {
             which = j - 1;
@@ -2634,7 +2634,7 @@ VectralMain_generate(VectralMain *self) {
                 curMag = curMag * down + lastMag * (1.0 - down);
             else if (diff >= 0.0)
                 curMag = curMag * up + lastMag * (1.0 - up);
-            self->frameBuffer[j][self->count] = curMag;            
+            self->frameBuffer[j][self->count] = curMag;
             self->buffer_streams[i+j*self->bufsize] = curMag;
         }
         self->count++;
@@ -2647,18 +2647,18 @@ MYFLT *
 VectralMain_getSamplesBuffer(VectralMain *self)
 {
     return (MYFLT *)self->buffer_streams;
-}    
+}
 
 static void
 VectralMain_setProcMode(VectralMain *self)
-{    
+{
     self->proc_func_ptr = VectralMain_generate;
 }
 
 static void
 VectralMain_compute_next_data_frame(VectralMain *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -2666,26 +2666,26 @@ VectralMain_traverse(VectralMain *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->input);
-    Py_VISIT(self->up);    
-    Py_VISIT(self->up_stream);    
-    Py_VISIT(self->down);    
-    Py_VISIT(self->down_stream);    
-    Py_VISIT(self->damp);    
-    Py_VISIT(self->damp_stream);    
+    Py_VISIT(self->up);
+    Py_VISIT(self->up_stream);
+    Py_VISIT(self->down);
+    Py_VISIT(self->down_stream);
+    Py_VISIT(self->damp);
+    Py_VISIT(self->damp_stream);
     return 0;
 }
 
-static int 
+static int
 VectralMain_clear(VectralMain *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
-    Py_CLEAR(self->up);    
-    Py_CLEAR(self->up_stream);    
-    Py_CLEAR(self->down);    
-    Py_CLEAR(self->down_stream);    
-    Py_CLEAR(self->damp);    
-    Py_CLEAR(self->damp_stream);    
+    Py_CLEAR(self->up);
+    Py_CLEAR(self->up_stream);
+    Py_CLEAR(self->down);
+    Py_CLEAR(self->down_stream);
+    Py_CLEAR(self->damp);
+    Py_CLEAR(self->damp_stream);
     return 0;
 }
 
@@ -2710,7 +2710,7 @@ VectralMain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *uptmp=NULL, *downtmp=NULL, *damptmp=NULL;
     VectralMain *self;
     self = (VectralMain *)type->tp_alloc(type, 0);
-    
+
     self->up = PyFloat_FromDouble(1.0);
     self->down = PyFloat_FromDouble(0.7);
     self->damp = PyFloat_FromDouble(0.9);
@@ -2720,16 +2720,16 @@ VectralMain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->modebuffer[2] = 0;
     self->modebuffer[3] = 0;
     self->modebuffer[4] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, VectralMain_compute_next_data_frame);
     self->mode_func_ptr = VectralMain_setProcMode;
 
     static char *kwlist[] = {"input", "frameSize", "overlaps", "up", "down", "damp", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "Oii|OOO", kwlist, &inputtmp, &self->frameSize, &self->overlaps, &uptmp, &downtmp, &damptmp))
         Py_RETURN_NONE;
-    
+
     if (inputtmp) {
         PyObject_CallMethod((PyObject *)self, "setInput", "O", inputtmp);
     }
@@ -2745,9 +2745,9 @@ VectralMain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (damptmp) {
         PyObject_CallMethod((PyObject *)self, "setDamp", "O", damptmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->hopsize = self->frameSize / self->overlaps;
     self->frameBuffer = (MYFLT **)realloc(self->frameBuffer, self->overlaps * sizeof(MYFLT *));
     for(i=0; i<self->overlaps; i++) {
@@ -2760,9 +2760,9 @@ VectralMain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     for (i=0; i<(self->overlaps*self->bufsize); i++) {
         self->buffer_streams[i] = 0.0;
     }
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
@@ -2776,29 +2776,29 @@ static PyObject *
 VectralMain_setInput(VectralMain *self, PyObject *arg)
 {
     PyObject *tmp;
-    
+
     if (! PyList_Check(arg)) {
         PyErr_SetString(PyExc_TypeError, "The inputs attribute must be a list.");
         Py_INCREF(Py_None);
         return Py_None;
     }
-    
+
     tmp = arg;
     self->inputSize = PyList_Size(tmp);
     Py_INCREF(tmp);
     Py_XDECREF(self->input);
     self->input = tmp;
-    
+
     Py_INCREF(Py_None);
     return Py_None;
-}    
+}
 
 static PyObject *
 VectralMain_setFrameSize(VectralMain *self, PyObject *arg)
-{    
+{
     int i, j, tmp;
-    
-    if (PyInt_Check(arg)) { 
+
+    if (PyInt_Check(arg)) {
         tmp = PyLong_AsLong(arg);
         if (isPowerOfTwo(tmp)) {
             self->frameSize = tmp;
@@ -2811,13 +2811,13 @@ VectralMain_setFrameSize(VectralMain *self, PyObject *arg)
                     self->frameBuffer[i][j] = 0.0;
                 }
             }
-            
+
             self->count = 0;
         }
     }
     else
         printf("frameSize must be a power of two!\n");
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2826,14 +2826,14 @@ static PyObject *
 VectralMain_setUp(VectralMain *self, PyObject *arg)
 {
     PyObject *tmp, *streamtmp;
-    
+
     if (arg == NULL) {
         Py_INCREF(Py_None);
         return Py_None;
     }
-    
+
     int isNumber = PyNumber_Check(arg);
-    
+
     tmp = arg;
     Py_INCREF(tmp);
     Py_DECREF(self->up);
@@ -2849,23 +2849,23 @@ VectralMain_setUp(VectralMain *self, PyObject *arg)
         self->up_stream = (Stream *)streamtmp;
         self->modebuffer[2] = 1;
     }
-    
+
     Py_INCREF(Py_None);
     return Py_None;
-}    
+}
 
 static PyObject *
 VectralMain_setDown(VectralMain *self, PyObject *arg)
 {
     PyObject *tmp, *streamtmp;
-    
+
     if (arg == NULL) {
         Py_INCREF(Py_None);
         return Py_None;
     }
-    
+
     int isNumber = PyNumber_Check(arg);
-    
+
     tmp = arg;
     Py_INCREF(tmp);
     Py_DECREF(self->down);
@@ -2881,23 +2881,23 @@ VectralMain_setDown(VectralMain *self, PyObject *arg)
         self->down_stream = (Stream *)streamtmp;
         self->modebuffer[3] = 1;
     }
-    
+
     Py_INCREF(Py_None);
     return Py_None;
-}    
+}
 
 static PyObject *
 VectralMain_setDamp(VectralMain *self, PyObject *arg)
 {
     PyObject *tmp, *streamtmp;
-    
+
     if (arg == NULL) {
         Py_INCREF(Py_None);
         return Py_None;
     }
-    
+
     int isNumber = PyNumber_Check(arg);
-    
+
     tmp = arg;
     Py_INCREF(tmp);
     Py_DECREF(self->damp);
@@ -2913,10 +2913,10 @@ VectralMain_setDamp(VectralMain *self, PyObject *arg)
         self->damp_stream = (Stream *)streamtmp;
         self->modebuffer[4] = 1;
     }
-    
+
     Py_INCREF(Py_None);
     return Py_None;
-}    
+}
 
 static PyMemberDef VectralMain_members[] = {
     {"server", T_OBJECT_EX, offsetof(VectralMain, server), 0, "Pyo server."},
@@ -3005,33 +3005,33 @@ Vectral_setProcMode(Vectral *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Vectral_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Vectral_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Vectral_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Vectral_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Vectral_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Vectral_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Vectral_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Vectral_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Vectral_postprocessing_revareva;
             break;
     }
@@ -3046,7 +3046,7 @@ Vectral_compute_next_data_frame(Vectral *self)
     tmp = VectralMain_getSamplesBuffer((VectralMain *)self->mainSplitter);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3058,11 +3058,11 @@ Vectral_traverse(Vectral *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Vectral_clear(Vectral *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainSplitter);    
+    Py_CLEAR(self->mainSplitter);
     return 0;
 }
 
@@ -3081,44 +3081,44 @@ Vectral_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL, *multmp=NULL, *addtmp=NULL;
     Vectral *self;
     self = (Vectral *)type->tp_alloc(type, 0);
-    
+
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Vectral_compute_next_data_frame);
     self->mode_func_ptr = Vectral_setProcMode;
 
     static char *kwlist[] = {"mainSplitter", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "Oi|OO", kwlist, &maintmp, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainSplitter);
     Py_INCREF(maintmp);
     self->mainSplitter = (VectralMain *)maintmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Vectral_getServer(Vectral* self) { GET_SERVER };
 static PyObject * Vectral_getStream(Vectral* self) { GET_STREAM };
-static PyObject * Vectral_setMul(Vectral *self, PyObject *arg) { SET_MUL };    
-static PyObject * Vectral_setAdd(Vectral *self, PyObject *arg) { SET_ADD };    
-static PyObject * Vectral_setSub(Vectral *self, PyObject *arg) { SET_SUB };    
-static PyObject * Vectral_setDiv(Vectral *self, PyObject *arg) { SET_DIV };    
+static PyObject * Vectral_setMul(Vectral *self, PyObject *arg) { SET_MUL };
+static PyObject * Vectral_setAdd(Vectral *self, PyObject *arg) { SET_ADD };
+static PyObject * Vectral_setSub(Vectral *self, PyObject *arg) { SET_SUB };
+static PyObject * Vectral_setDiv(Vectral *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Vectral_play(Vectral *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Vectral_out(Vectral *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3274,13 +3274,13 @@ CvlVerb_alloc_memories(CvlVerb *self) {
     self->hsize = self->size / 2;
     self->size2 = self->size * 2;
     n8 = self->size2 >> 3;
-    self->real = (MYFLT *)realloc(self->real, self->size * sizeof(MYFLT));    
-    self->imag = (MYFLT *)realloc(self->imag, self->size * sizeof(MYFLT));    
+    self->real = (MYFLT *)realloc(self->real, self->size * sizeof(MYFLT));
+    self->imag = (MYFLT *)realloc(self->imag, self->size * sizeof(MYFLT));
     self->inframe = (MYFLT *)realloc(self->inframe, self->size2 * sizeof(MYFLT));
-    self->outframe = (MYFLT *)realloc(self->outframe, self->size2 * sizeof(MYFLT));       
-    self->last_half_frame = (MYFLT *)realloc(self->last_half_frame, self->size * sizeof(MYFLT));    
-    self->input_buffer = (MYFLT *)realloc(self->input_buffer, self->size * sizeof(MYFLT));    
-    self->output_buffer = (MYFLT *)realloc(self->output_buffer, self->size2 * sizeof(MYFLT));    
+    self->outframe = (MYFLT *)realloc(self->outframe, self->size2 * sizeof(MYFLT));
+    self->last_half_frame = (MYFLT *)realloc(self->last_half_frame, self->size * sizeof(MYFLT));
+    self->input_buffer = (MYFLT *)realloc(self->input_buffer, self->size * sizeof(MYFLT));
+    self->output_buffer = (MYFLT *)realloc(self->output_buffer, self->size2 * sizeof(MYFLT));
     for (i=0; i<self->size2; i++)
         self->inframe[i] = self->outframe[i] = self->output_buffer[i] = 0.0;
     for (i=0; i<self->size; i++)
@@ -3308,7 +3308,7 @@ CvlVerb_analyse_impulse(CvlVerb *self) {
     snd_sr = info.samplerate;
     snd_chnls = info.channels;
     num_items = snd_size * snd_chnls;
-    
+
     if (snd_sr != self->sr) {
         printf("CvlVerb warning : Impulse sampling rate does't match the sampling rate of the server.\n");
     }
@@ -3331,8 +3331,8 @@ CvlVerb_analyse_impulse(CvlVerb *self) {
 
     self->impulse_real = (MYFLT **)realloc(self->impulse_real, self->num_iter * sizeof(MYFLT *));
     self->impulse_imag = (MYFLT **)realloc(self->impulse_imag, self->num_iter * sizeof(MYFLT *));
-    self->accum_real = (MYFLT **)realloc(self->accum_real, self->num_iter * sizeof(MYFLT *));    
-    self->accum_imag = (MYFLT **)realloc(self->accum_imag, self->num_iter * sizeof(MYFLT *)); 
+    self->accum_real = (MYFLT **)realloc(self->accum_real, self->num_iter * sizeof(MYFLT *));
+    self->accum_imag = (MYFLT **)realloc(self->accum_imag, self->num_iter * sizeof(MYFLT *));
     for(i=0; i<self->num_iter; i++) {
         self->impulse_real[i] = (MYFLT *)malloc(self->size * sizeof(MYFLT));
         self->impulse_imag[i] = (MYFLT *)malloc(self->size * sizeof(MYFLT));
@@ -3346,7 +3346,7 @@ CvlVerb_analyse_impulse(CvlVerb *self) {
 
     inframe = (MYFLT *)malloc(self->size2 * sizeof(MYFLT));
     outframe = (MYFLT *)malloc(self->size2 * sizeof(MYFLT));
-    
+
     for (j=0; j<self->num_iter; j++) {
         num = j * self->size;
         for (i=0; i<self->size; i++) {
@@ -3354,7 +3354,7 @@ CvlVerb_analyse_impulse(CvlVerb *self) {
         }
         for (i=self->size; i<self->size2; i++) {
             inframe[i] = 0.0;
-        }        
+        }
         realfft_split(inframe, outframe, self->size2, self->twiddle);
         self->impulse_real[j][0] = outframe[0];
         self->impulse_imag[j][0] = 0.0;
@@ -3363,7 +3363,7 @@ CvlVerb_analyse_impulse(CvlVerb *self) {
             self->impulse_imag[j][i] = outframe[self->size2 - i];
         }
     }
-    
+
     free(tmp);
     free(tmp2);
     free(inframe);
@@ -3385,11 +3385,11 @@ CvlVerb_process_i(CvlVerb *self) {
     for (i=0; i<self->bufsize; i++) {
         self->input_buffer[self->incount] = in[i];
         self->data[i] = (self->output_buffer[self->incount] * 100 * bal) + (in[i] * gdry);
-        
+
         self->incount++;
         if (self->incount == self->size) {
             self->incount = 0;
-            
+
             k = self->current_iter - 1;
             if (k < 0)
                 k += self->num_iter;
@@ -3430,7 +3430,7 @@ CvlVerb_process_i(CvlVerb *self) {
             if (self->current_iter == self->num_iter)
                 self->current_iter = 0;
         }
-    } 
+    }
 }
 
 static void
@@ -3449,11 +3449,11 @@ CvlVerb_process_a(CvlVerb *self) {
         gdry = 1.0 - gwet;
         self->input_buffer[self->incount] = in[i];
         self->data[i] = (self->output_buffer[self->incount] * 100 * gwet) + in[i] * gdry;
-        
+
         self->incount++;
         if (self->incount == self->size) {
             self->incount = 0;
-            
+
             k = self->current_iter - 1;
             if (k < 0)
                 k += self->num_iter;
@@ -3494,7 +3494,7 @@ CvlVerb_process_a(CvlVerb *self) {
             if (self->current_iter == self->num_iter)
                 self->current_iter = 0;
         }
-    } 
+    }
 }
 
 static void CvlVerb_postprocessing_ii(CvlVerb *self) { POST_PROCESSING_II };
@@ -3509,46 +3509,46 @@ static void CvlVerb_postprocessing_revareva(CvlVerb *self) { POST_PROCESSING_REV
 
 static void
 CvlVerb_setProcMode(CvlVerb *self)
-{        
+{
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
     switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = CvlVerb_process_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = CvlVerb_process_a;
             break;
-    }     
-      
+    }
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = CvlVerb_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = CvlVerb_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = CvlVerb_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = CvlVerb_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = CvlVerb_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = CvlVerb_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = CvlVerb_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = CvlVerb_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = CvlVerb_postprocessing_revareva;
             break;
     }
@@ -3557,7 +3557,7 @@ CvlVerb_setProcMode(CvlVerb *self)
 static void
 CvlVerb_compute_next_data_frame(CvlVerb *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3572,7 +3572,7 @@ CvlVerb_traverse(CvlVerb *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 CvlVerb_clear(CvlVerb *self)
 {
     pyo_CLEAR
@@ -3602,7 +3602,7 @@ CvlVerb_dealloc(CvlVerb* self)
         free(self->impulse_imag[i]);
         free(self->accum_real[i]);
         free(self->accum_imag[i]);
-    }    
+    }
     free(self->impulse_real);
     free(self->impulse_imag);
     free(self->accum_real);
@@ -3620,7 +3620,7 @@ CvlVerb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *baltmp=NULL, *multmp=NULL, *addtmp=NULL;
     CvlVerb *self;
     self = (CvlVerb *)type->tp_alloc(type, 0);
-    
+
     self->bal = PyFloat_FromDouble(0.25);
     self->size = 1024;
     self->chnl = 0;
@@ -3631,7 +3631,7 @@ CvlVerb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = CvlVerb_setProcMode;
 
     static char *kwlist[] = {"input", "impulse", "bal", "size", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "Os|OiiOO", kwlist, &inputtmp, &self->impulse_path, &baltmp, &self->size, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
 
@@ -3639,7 +3639,7 @@ CvlVerb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         printf("Warning : CvlVerb size less than buffer size!\nCvlVerb size set to buffersize: %d\n", self->bufsize);
         self->size = self->bufsize;
     }
-    
+
     k = 1;
     while (k < self->size)
         k <<= 1;
@@ -3654,13 +3654,13 @@ CvlVerb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     CvlVerb_alloc_memories(self);
     CvlVerb_analyse_impulse(self);
 
@@ -3673,14 +3673,14 @@ static PyObject *
 CvlVerb_setBal(CvlVerb *self, PyObject *arg)
 {
     PyObject *tmp, *streamtmp;
-    
+
     if (arg == NULL) {
         Py_INCREF(Py_None);
         return Py_None;
     }
-    
+
     int isNumber = PyNumber_Check(arg);
-    
+
     tmp = arg;
     Py_INCREF(tmp);
     Py_DECREF(self->bal);
@@ -3698,17 +3698,17 @@ CvlVerb_setBal(CvlVerb *self, PyObject *arg)
     }
 
     (*self->mode_func_ptr)(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
-}    
+}
 
 static PyObject * CvlVerb_getServer(CvlVerb* self) { GET_SERVER };
 static PyObject * CvlVerb_getStream(CvlVerb* self) { GET_STREAM };
-static PyObject * CvlVerb_setMul(CvlVerb *self, PyObject *arg) { SET_MUL };    
-static PyObject * CvlVerb_setAdd(CvlVerb *self, PyObject *arg) { SET_ADD };    
-static PyObject * CvlVerb_setSub(CvlVerb *self, PyObject *arg) { SET_SUB };    
-static PyObject * CvlVerb_setDiv(CvlVerb *self, PyObject *arg) { SET_DIV };    
+static PyObject * CvlVerb_setMul(CvlVerb *self, PyObject *arg) { SET_MUL };
+static PyObject * CvlVerb_setAdd(CvlVerb *self, PyObject *arg) { SET_ADD };
+static PyObject * CvlVerb_setSub(CvlVerb *self, PyObject *arg) { SET_SUB };
+static PyObject * CvlVerb_setDiv(CvlVerb *self, PyObject *arg) { SET_DIV };
 
 static PyObject * CvlVerb_play(CvlVerb *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * CvlVerb_out(CvlVerb *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3852,9 +3852,9 @@ typedef struct {
     MYFLT *input_buffer;
     MYFLT *inframe;
     MYFLT *outframe;
-    MYFLT *magnitude;    
-    MYFLT *last_magnitude;    
-    MYFLT *tmpmag;    
+    MYFLT *magnitude;
+    MYFLT *last_magnitude;
+    MYFLT *tmpmag;
     MYFLT *window;
     MYFLT **twiddle;
 } Spectrum;
@@ -3866,12 +3866,12 @@ Spectrum_realloc_memories(Spectrum *self) {
     n8 = self->size >> 3;
     self->input_buffer = (MYFLT *)realloc(self->input_buffer, self->size * sizeof(MYFLT));
     self->inframe = (MYFLT *)realloc(self->inframe, self->size * sizeof(MYFLT));
-    self->outframe = (MYFLT *)realloc(self->outframe, self->size * sizeof(MYFLT));    
+    self->outframe = (MYFLT *)realloc(self->outframe, self->size * sizeof(MYFLT));
     for (i=0; i<self->size; i++)
         self->input_buffer[i] = self->inframe[i] = self->outframe[i] = 0.0;
-    self->magnitude = (MYFLT *)realloc(self->magnitude, self->hsize * sizeof(MYFLT));    
-    self->last_magnitude = (MYFLT *)realloc(self->last_magnitude, self->hsize * sizeof(MYFLT));    
-    self->tmpmag = (MYFLT *)realloc(self->tmpmag, (self->hsize+6) * sizeof(MYFLT));    
+    self->magnitude = (MYFLT *)realloc(self->magnitude, self->hsize * sizeof(MYFLT));
+    self->last_magnitude = (MYFLT *)realloc(self->last_magnitude, self->hsize * sizeof(MYFLT));
+    self->tmpmag = (MYFLT *)realloc(self->tmpmag, (self->hsize+6) * sizeof(MYFLT));
     for (i=0; i<self->hsize; i++)
         self->magnitude[i] = self->last_magnitude[i] = self->tmpmag[i+3] = 0.0;
     self->twiddle = (MYFLT **)realloc(self->twiddle, 4 * sizeof(MYFLT *));
@@ -3890,7 +3890,7 @@ Spectrum_display(Spectrum *self) {
     MYFLT pos, step, frac, iw, mag, h4;
     MYFLT logmin, logrange;
     PyObject *points, *tuple;
-    
+
     b1 = (int)(self->freqone / self->freqPerBin);
     b2 = (int)(self->freqtwo / self->freqPerBin);
     bins = b2 - b1;
@@ -3928,7 +3928,7 @@ Spectrum_display(Spectrum *self) {
             tuple = PyTuple_New(2);
             mag = ((self->magnitude[p1] + (self->magnitude[p1+1] - self->magnitude[p1]) * frac) * 0.7 * self->gain);
             mag = mag > 0.001 ? mag : 0.001;
-            mag = (60.0 + (20.0 * MYLOG10(mag))) * 0.01666 * h4; 
+            mag = (60.0 + (20.0 * MYLOG10(mag))) * 0.01666 * h4;
             PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(i));
             PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(self->height - (int)mag));
             PyList_SET_ITEM(points, i+1, tuple);
@@ -3962,13 +3962,13 @@ Spectrum_display(Spectrum *self) {
             tuple = PyTuple_New(2);
             mag = ((self->magnitude[p1] + (self->magnitude[p1+1] - self->magnitude[p1]) * frac) * 0.7 * self->gain);
             mag = mag > 0.001 ? mag : 0.001;
-            mag = (60.0 + (20.0 * MYLOG10(mag))) * 0.01666 * self->height; 
+            mag = (60.0 + (20.0 * MYLOG10(mag))) * 0.01666 * self->height;
             PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(i));
             PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(self->height - (int)mag));
             PyList_SET_ITEM(points, i+1, tuple);
         }
     }
-    
+
     return points;
 }
 
@@ -3977,7 +3977,7 @@ Spectrum_filters(Spectrum *self) {
     int i, j = 0, impos = 0;
     MYFLT tmp = 0.0;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->input_buffer[self->incount] = in[i];
         self->incount++;
@@ -3996,9 +3996,9 @@ Spectrum_filters(Spectrum *self) {
                 self->tmpmag[j+3] = self->last_magnitude[j] = tmp + self->last_magnitude[j] * 0.5;
             }
             for (j=0; j<self->hsize; j++) {
-                tmp =   (self->tmpmag[j] + self->tmpmag[j+6]) * 0.05 + 
-                        (self->tmpmag[j+1] + self->tmpmag[j+5]) * 0.15 + 
-                        (self->tmpmag[j+2] + self->tmpmag[j+4])* 0.3 + 
+                tmp =   (self->tmpmag[j] + self->tmpmag[j+6]) * 0.05 +
+                        (self->tmpmag[j+1] + self->tmpmag[j+5]) * 0.15 +
+                        (self->tmpmag[j+2] + self->tmpmag[j+4])* 0.3 +
                         self->tmpmag[j+3] * 0.5;
                 self->magnitude[j] = tmp;
                 self->input_buffer[j] = self->input_buffer[j+self->hsize];
@@ -4009,14 +4009,14 @@ Spectrum_filters(Spectrum *self) {
 
 static void
 Spectrum_setProcMode(Spectrum *self)
-{        
-    self->proc_func_ptr = Spectrum_filters;  
+{
+    self->proc_func_ptr = Spectrum_filters;
 }
 
 static void
 Spectrum_compute_next_data_frame(Spectrum *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -4028,7 +4028,7 @@ Spectrum_traverse(Spectrum *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Spectrum_clear(Spectrum *self)
 {
     pyo_CLEAR
@@ -4064,7 +4064,7 @@ Spectrum_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp;
     Spectrum *self;
     self = (Spectrum *)type->tp_alloc(type, 0);
-    
+
     self->size = 1024;
     self->wintype = 2;
 
@@ -4078,17 +4078,17 @@ Spectrum_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->height = 400;
     self->fscaling = 0;
     self->mscaling = 1;
-    
+
     Stream_setFunctionPtr(self->stream, Spectrum_compute_next_data_frame);
     self->mode_func_ptr = Spectrum_setProcMode;
 
     static char *kwlist[] = {"input", "size", "wintype", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|ii", kwlist, &inputtmp, &self->size, &self->wintype))
         Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     if (!isPowerOfTwo(self->size)) {
@@ -4113,7 +4113,7 @@ static PyObject * Spectrum_stop(Spectrum *self) { STOP };
 
 static PyObject *
 Spectrum_setSize(Spectrum *self, PyObject *arg)
-{    
+{
     int tmp;
     if (PyLong_Check(arg) || PyInt_Check(arg)) {
         tmp = PyInt_AsLong(arg);
@@ -4123,27 +4123,27 @@ Spectrum_setSize(Spectrum *self, PyObject *arg)
         }
         else
             printf("FFT size must be a power of two!\n");
-    }    
-    
+    }
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject *
 Spectrum_setWinType(Spectrum *self, PyObject *arg)
-{    
+{
     if (PyLong_Check(arg) || PyInt_Check(arg)) {
         self->wintype = PyLong_AsLong(arg);
         gen_window(self->window, self->size, self->wintype);
-    }    
-    
+    }
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject *
 Spectrum_setLowbound(Spectrum *self, PyObject *arg)
-{    
+{
     MYFLT tmp;
     if (PyNumber_Check(arg)) {
         tmp = PyFloat_AsDouble(PyNumber_Float(arg));
@@ -4151,7 +4151,7 @@ Spectrum_setLowbound(Spectrum *self, PyObject *arg)
             self->freqone = tmp * self->sr;
         else
             self->freqone = 0.0;
-    }    
+    }
     else
         self->freqone = 0.0;
 
@@ -4166,7 +4166,7 @@ Spectrum_getLowfreq(Spectrum *self)
 
 static PyObject *
 Spectrum_setHighbound(Spectrum *self, PyObject *arg)
-{    
+{
     MYFLT tmp;
     if (PyNumber_Check(arg)) {
         tmp = PyFloat_AsDouble(PyNumber_Float(arg));
@@ -4177,7 +4177,7 @@ Spectrum_setHighbound(Spectrum *self, PyObject *arg)
     }
     else
         self->freqtwo = self->sr * 0.5;
-    
+
     return PyFloat_FromDouble(MYFLOOR(self->freqtwo / self->freqPerBin) * self->freqPerBin);
 }
 
@@ -4189,50 +4189,50 @@ Spectrum_getHighfreq(Spectrum *self)
 
 static PyObject *
 Spectrum_setWidth(Spectrum *self, PyObject *arg)
-{    
+{
     if (PyInt_Check(arg) || PyLong_Check(arg))
         self->width = PyLong_AsLong(arg);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject *
 Spectrum_setHeight(Spectrum *self, PyObject *arg)
-{    
+{
     if (PyInt_Check(arg) || PyLong_Check(arg))
         self->height = PyLong_AsLong(arg);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject *
 Spectrum_setFscaling(Spectrum *self, PyObject *arg)
-{    
+{
     if (PyInt_Check(arg) || PyLong_Check(arg))
         self->fscaling = PyLong_AsLong(arg);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject *
 Spectrum_setMscaling(Spectrum *self, PyObject *arg)
-{    
+{
     if (PyInt_Check(arg) || PyLong_Check(arg))
         self->mscaling = PyLong_AsLong(arg);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject *
 Spectrum_setGain(Spectrum *self, PyObject *arg)
-{    
+{
     if (PyNumber_Check(arg))
         self->gain = PyFloat_AsDouble(PyNumber_Float(arg));
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -4304,4 +4304,4 @@ Spectrum_members,                                 /* tp_members */
 0,                          /* tp_init */
 0,                                              /* tp_alloc */
 Spectrum_new,                                     /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/filtremodule.c b/src/objects/filtremodule.c
index eb8fb7f..5d77198 100644
--- a/src/objects/filtremodule.c
+++ b/src/objects/filtremodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -26,7 +26,7 @@
 #include "servermodule.h"
 #include "dummymodule.h"
 
-static MYFLT HALF_COS_ARRAY[513] = {1.0, 0.99998110153278696, 0.99992440684545181, 0.99982991808087995, 0.99969763881045715, 0.99952757403393411, 0.99931973017923825, 0.99907411510222999, 0.99879073808640628, 0.99846960984254973, 0.99811074250832332, 0.99771414964781235, 0.99727984625101107, 0.99680784873325645, 0.99629817493460782, 0.99575084411917214, 0.99516587697437664, 0.99454329561018584, 0.99388312355826691, 0.9931853857710996, 0.99245010862103322, 0.99167731989928998, 0.99086704881491472, 0.99001932599367026, 0.98913418347688054, 0.98821165472021921, 0.9872517745924454, 0.98625457937408512, 0.98522010675606064, 0.98414839583826585, 0.98303948712808786, 0.98189342253887657, 0.98071024538836005, 0.97949000039700762, 0.97823273368633901, 0.9769384927771817, 0.97560732658787452, 0.97423928543241856, 0.97283442101857576, 0.97139278644591409, 0.96991443620380113, 0.96839942616934394, 0.96684781360527761, 0.96525965715780015, 0.96363501685435693, 0.96197395410137099, 0.96027653168192206, 0.95854281375337425, 0.95677286584495025, 0.95496675485525528, 0.95312454904974775, 0.95124631805815985, 0.94933213287186513, 0.94738206584119555, 0.94539619067270686, 0.9433745824263926, 0.94131731751284708, 0.9392244736903772, 0.93709613006206383, 0.9349323670727715, 0.93273326650610799, 0.93049891148133324, 0.92822938645021758, 0.92592477719384991, 0.92358517081939495, 0.92121065575680161, 0.91880132175545981, 0.91635725988080907, 0.91387856251089561, 0.91136532333288145, 0.90881763733950294, 0.9062356008254806, 0.90361931138387919, 0.90096886790241915, 0.89828437055973898, 0.89556592082160869, 0.89281362143709486, 0.89002757643467667, 0.88720789111831455, 0.8843546720634694, 0.88146802711307481, 0.87854806537346075, 0.87559489721022943, 0.8726086342440843, 0.86958938934661101, 0.86653727663601088, 0.86345241147278784, 0.86033491045538835, 0.85718489141579368, 0.85400247341506719, 0.8507877767388532, 0.84754092289283123, 0.8442620345981231, 0.84095123578665476, 0.8376086515964718, 0.83423440836700968, 0.83082863363431847, 0.82739145612624232, 0.82392300575755428, 0.82042341362504534, 0.81689281200256991, 0.81333133433604599, 0.80973911523841147, 0.80611629048453592, 0.80246299700608914, 0.79877937288636502, 0.7950655573550629, 0.79132169078302494, 0.78754791467693042, 0.78374437167394739, 0.77991120553634141, 0.77604856114604148, 0.77215658449916424, 0.76823542270049605, 0.76428522395793219, 0.7603061375768756, 0.75629831395459302, 0.75226190457453135, 0.74819706200059122, 0.7441039398713607, 0.73998269289430851, 0.73583347683993672, 0.73165644853589207, 0.72745176586103977, 0.72321958773949491, 0.71896007413461649, 0.71467338604296105, 0.71035968548819706, 0.70601913551498185, 0.70165190018279788, 0.69725814455975277, 0.69283803471633953, 0.68839173771916018, 0.68391942162461061, 0.6794212554725293, 0.67489740927980701, 0.67034805403396192, 0.66577336168667567, 0.66117350514729512, 0.65654865827629605, 0.65189899587871258, 0.64722469369752944, 0.6425259284070397, 0.63780287760616672, 0.63305571981175202, 0.62828463445180749, 0.62348980185873359, 0.61867140326250347, 0.61382962078381298, 0.60896463742719675, 0.60407663707411186, 0.59916580447598711, 0.59423232524724023, 0.58927638585826192, 0.58429817362836856, 0.57929787671872113, 0.57427568412521424, 0.56923178567133192, 0.56416637200097319, 0.55907963457124654, 0.55397176564523298, 0.5488429582847193, 0.5436934063429012, 0.53852330445705543, 0.53333284804118442, 0.52812223327862839, 0.52289165711465235, 0.51764131724900009, 0.51237141212842374, 0.50708214093918114, 0.50177370359950879, 0.49644630075206486, 0.49110013375634509, 0.48573540468107329, 0.48035231629656205, 0.47495107206705045, 0.46953187614301212, 0.46409493335344021, 0.45864044919810504, 0.45316862983978612, 0.44767968209648135, 0.44217381343358825, 0.43665123195606403, 0.43111214640055828, 0.42555676612752463, 0.41998530111330729, 0.41439796194220363, 0.40879495979850627, 0.40317650645851943, 0.39754281428255606, 0.3918940962069094, 0.38623056573580644, 0.38055243693333718, 0.3748599244153632, 0.36915324334140731, 0.36343260940651945, 0.35769823883312568, 0.35195034836285416, 0.34618915524834432, 0.34041487724503472, 0.33462773260293199, 0.32882794005836308, 0.32301571882570607, 0.31719128858910622, 0.31135486949417079, 0.30550668213964982, 0.29964694756909749, 0.29377588726251663, 0.28789372312798917, 0.28200067749328667, 0.27609697309746906, 0.27018283308246382, 0.26425848098463345, 0.25832414072632598, 0.25238003660741054, 0.24642639329680122, 0.24046343582396335, 0.23449138957040974, 0.22851048026118126, 0.22252093395631445, 0.21652297704229864, 0.21051683622351761, 0.20450273851368242, 0.19848091122724945, 0.19245158197082995, 0.18641497863458675, 0.1803713293836198, 0.17432086264934399, 0.16826380712085329, 0.16220039173627876, 0.15613084567413366, 0.1500553983446527, 0.14397427938112045, 0.13788771863119115, 0.13179594614820278, 0.12569919218247999, 0.11959768717263308, 0.11349166173684638, 0.10738134666416307, 0.10126697290576155, 0.095148771566225324, 0.089026973894809708, 0.082901811276699419, 0.076773515224264705, 0.070642317368309157, 0.064508449449316344, 0.058372143308689985, 0.052233630879990445, 0.046093144180169916, 0.039950915300801082, 0.033807176399306589, 0.027662159690182372, 0.021516097436222258, 0.01536922193973846, 0.0092217655337806046, 0.0030739605733557966, -0.0030739605733554522, -0.0092217655337804832, -0.015369221939738116, -0.021516097436222133, -0.027662159690182025, -0.033807176399306464, -0.039950915300800735, -0.046093144180169791, -0.052233630879990098, -0.05837214330868986, -0.064508449449316232, -0.07064231736830906, -0.076773515224264371, -0.082901811276699308, -0.089026973894809375, -0.095148771566225213, -0.10126697290576121, -0.10738134666416296, -0.11349166173684605, -0.11959768717263299, -0.12569919218247966, -0.13179594614820267, -0.13788771863119104, -0.14397427938112034, -0.15005539834465259, -0.15613084567413354, -0.16220039173627843, -0.16826380712085318, -0.17432086264934366, -0.18037132938361969, -0.18641497863458642, -0.19245158197082984, -0.19848091122724912, -0.20450273851368231, -0.21051683622351727, -0.21652297704229853, -0.22252093395631434, -0.22851048026118118, -0.23449138957040966, -0.24046343582396323, -0.24642639329680088, -0.25238003660741043, -0.25832414072632565, -0.26425848098463334, -0.27018283308246349, -0.27609697309746895, -0.28200067749328633, -0.28789372312798905, -0.2937758872625163, -0.29964694756909738, -0.30550668213964971, -0.31135486949417068, -0.31719128858910589, -0.32301571882570601, -0.32882794005836274, -0.33462773260293188, -0.34041487724503444, -0.3461891552483442, -0.35195034836285388, -0.35769823883312557, -0.36343260940651911, -0.3691532433414072, -0.37485992441536287, -0.38055243693333707, -0.38623056573580633, -0.39189409620690935, -0.39754281428255578, -0.40317650645851938, -0.408794959798506, -0.41439796194220352, -0.41998530111330723, -0.42555676612752458, -0.43111214640055795, -0.43665123195606392, -0.44217381343358819, -0.44767968209648107, -0.45316862983978584, -0.45864044919810493, -0.46409493335344015, -0.46953187614301223, -0.47495107206704995, -0.48035231629656183, -0.4857354046810729, -0.49110013375634509, -0.4964463007520647, -0.50177370359950857, -0.5070821409391808, -0.51237141212842352, -0.51764131724899998, -0.52289165711465191, -0.52812223327862795, -0.53333284804118419, -0.53852330445705532, -0.5436934063429012, -0.54884295828471885, -0.55397176564523276, -0.55907963457124621, -0.56416637200097308, -0.5692317856713317, -0.57427568412521401, -0.57929787671872079, -0.58429817362836844, -0.5892763858582617, -0.5942323252472399, -0.59916580447598666, -0.60407663707411174, -0.60896463742719653, -0.61382962078381298, -0.61867140326250303, -0.62348980185873337, -0.62828463445180716, -0.6330557198117519, -0.6378028776061665, -0.64252592840703937, -0.64722469369752911, -0.65189899587871247, -0.65654865827629583, -0.66117350514729478, -0.66577336168667522, -0.67034805403396169, -0.67489740927980679, -0.6794212554725293, -0.68391942162461028, -0.68839173771915996, -0.6928380347163392, -0.69725814455975266, -0.70165190018279777, -0.70601913551498163, -0.71035968548819683, -0.71467338604296105, -0.71896007413461638, -0.72321958773949468, -0.72745176586103955, -0.73165644853589207, -0.73583347683993661, -0.73998269289430874, -0.74410393987136036, -0.74819706200059111, -0.75226190457453113, -0.75629831395459302, -0.76030613757687548, -0.76428522395793208, -0.76823542270049594, -0.77215658449916424, -0.77604856114604126, -0.77991120553634119, -0.78374437167394717, -0.78754791467693031, -0.79132169078302472, -0.7950655573550629, -0.79877937288636469, -0.80246299700608903, -0.80611629048453581, -0.80973911523841147, -0.81333133433604599, -0.8168928120025698, -0.82042341362504512, -0.82392300575755417, -0.82739145612624221, -0.83082863363431825, -0.83423440836700946, -0.8376086515964718, -0.84095123578665465, -0.8442620345981231, -0.84754092289283089, -0.85078777673885309, -0.85400247341506696, -0.85718489141579368, -0.86033491045538824, -0.86345241147278773, -0.86653727663601066, -0.86958938934661101, -0.87260863424408419, -0.87559489721022921, -0.87854806537346053, -0.88146802711307481, -0.88435467206346929, -0.88720789111831455, -0.89002757643467667, -0.89281362143709475, -0.89556592082160857, -0.89828437055973898, -0.90096886790241903, -0.90361931138387908, -0.90623560082548038, -0.90881763733950294, -0.91136532333288134, -0.9138785625108955, -0.91635725988080885, -0.91880132175545981, -0.92121065575680139, -0.92358517081939495, -0.9259247771938498, -0.92822938645021758, -0.93049891148133312, -0.93273326650610799, -0.9349323670727715, -0.93709613006206383, -0.93922447369037709, -0.94131731751284708, -0.9433745824263926, -0.94539619067270697, -0.94738206584119544, -0.94933213287186502, -0.95124631805815973, -0.95312454904974775, -0.95496675485525517, -0.95677286584495025, -0.95854281375337413, -0.96027653168192206, -0.96197395410137099, -0.96363501685435693, -0.96525965715780004, -0.9668478136052775, -0.96839942616934394, -0.96991443620380113, -0.97139278644591398, -0.97283442101857565, -0.97423928543241844, -0.97560732658787452, -0.9769384927771817, -0.9782327336863389, -0.97949000039700751, -0.98071024538836005, -0.98189342253887657, -0.98303948712808775, -0.98414839583826574, -0.98522010675606064, -0.98625457937408501, -0.9872517745924454, -0.98821165472021921, -0.98913418347688054, -0.99001932599367015, -0.99086704881491472, -0.99167731989928998, -0.99245010862103311, -0.99318538577109949, -0.99388312355826691, -0.99454329561018584, -0.99516587697437653, -0.99575084411917214, -0.99629817493460782, -0.99680784873325645, -0.99727984625101107, -0.99771414964781235, -0.99811074250832332, -0.99846960984254973, -0.99879073808640628, -0.99907411510222999, -0.99931973017923825, -0.99952757403393411, -0.99969763881045715, -0.99982991808087995, -0.99992440684545181, -0.99998110153278685, -1.0, -1.0}; 
+static MYFLT HALF_COS_ARRAY[513] = {1.0, 0.99998110153278696, 0.99992440684545181, 0.99982991808087995, 0.99969763881045715, 0.99952757403393411, 0.99931973017923825, 0.99907411510222999, 0.99879073808640628, 0.99846960984254973, 0.99811074250832332, 0.99771414964781235, 0.99727984625101107, 0.99680784873325645, 0.99629817493460782, 0.99575084411917214, 0.99516587697437664, 0.99454329561018584, 0.99388312355826691, 0.9931853857710996, 0.99245010862103322, 0.99167731989928998, 0.99086704881491472, 0.99001932599367026, 0.98913418347688054, 0.98821165472021921, 0.9872517745924454, 0.98625457937408512, 0.98522010675606064, 0.98414839583826585, 0.98303948712808786, 0.98189342253887657, 0.98071024538836005, 0.97949000039700762, 0.97823273368633901, 0.9769384927771817, 0.97560732658787452, 0.97423928543241856, 0.97283442101857576, 0.97139278644591409, 0.96991443620380113, 0.96839942616934394, 0.96684781360527761, 0.96525965715780015, 0.96363501685435693, 0.96197395410137099, 0.96027653168192206, 0.95854281375337425, 0.95677286584495025, 0.95496675485525528, 0.95312454904974775, 0.95124631805815985, 0.94933213287186513, 0.94738206584119555, 0.94539619067270686, 0.9433745824263926, 0.94131731751284708, 0.9392244736903772, 0.93709613006206383, 0.9349323670727715, 0.93273326650610799, 0.93049891148133324, 0.92822938645021758, 0.92592477719384991, 0.92358517081939495, 0.92121065575680161, 0.91880132175545981, 0.91635725988080907, 0.91387856251089561, 0.91136532333288145, 0.90881763733950294, 0.9062356008254806, 0.90361931138387919, 0.90096886790241915, 0.89828437055973898, 0.89556592082160869, 0.89281362143709486, 0.89002757643467667, 0.88720789111831455, 0.8843546720634694, 0.88146802711307481, 0.87854806537346075, 0.87559489721022943, 0.8726086342440843, 0.86958938934661101, 0.86653727663601088, 0.86345241147278784, 0.86033491045538835, 0.85718489141579368, 0.85400247341506719, 0.8507877767388532, 0.84754092289283123, 0.8442620345981231, 0.84095123578665476, 0.8376086515964718, 0.83423440836700968, 0.83082863363431847, 0.82739145612624232, 0.82392300575755428, 0.82042341362504534, 0.81689281200256991, 0.81333133433604599, 0.80973911523841147, 0.80611629048453592, 0.80246299700608914, 0.79877937288636502, 0.7950655573550629, 0.79132169078302494, 0.78754791467693042, 0.78374437167394739, 0.77991120553634141, 0.77604856114604148, 0.77215658449916424, 0.76823542270049605, 0.76428522395793219, 0.7603061375768756, 0.75629831395459302, 0.75226190457453135, 0.74819706200059122, 0.7441039398713607, 0.73998269289430851, 0.73583347683993672, 0.73165644853589207, 0.72745176586103977, 0.72321958773949491, 0.71896007413461649, 0.71467338604296105, 0.71035968548819706, 0.70601913551498185, 0.70165190018279788, 0.69725814455975277, 0.69283803471633953, 0.68839173771916018, 0.68391942162461061, 0.6794212554725293, 0.67489740927980701, 0.67034805403396192, 0.66577336168667567, 0.66117350514729512, 0.65654865827629605, 0.65189899587871258, 0.64722469369752944, 0.6425259284070397, 0.63780287760616672, 0.63305571981175202, 0.62828463445180749, 0.62348980185873359, 0.61867140326250347, 0.61382962078381298, 0.60896463742719675, 0.60407663707411186, 0.59916580447598711, 0.59423232524724023, 0.58927638585826192, 0.58429817362836856, 0.57929787671872113, 0.57427568412521424, 0.56923178567133192, 0.56416637200097319, 0.55907963457124654, 0.55397176564523298, 0.5488429582847193, 0.5436934063429012, 0.53852330445705543, 0.53333284804118442, 0.52812223327862839, 0.52289165711465235, 0.51764131724900009, 0.51237141212842374, 0.50708214093918114, 0.50177370359950879, 0.49644630075206486, 0.49110013375634509, 0.48573540468107329, 0.48035231629656205, 0.47495107206705045, 0.46953187614301212, 0.46409493335344021, 0.45864044919810504, 0.45316862983978612, 0.44767968209648135, 0.44217381343358825, 0.43665123195606403, 0.43111214640055828, 0.42555676612752463, 0.41998530111330729, 0.41439796194220363, 0.40879495979850627, 0.40317650645851943, 0.39754281428255606, 0.3918940962069094, 0.38623056573580644, 0.38055243693333718, 0.3748599244153632, 0.36915324334140731, 0.36343260940651945, 0.35769823883312568, 0.35195034836285416, 0.34618915524834432, 0.34041487724503472, 0.33462773260293199, 0.32882794005836308, 0.32301571882570607, 0.31719128858910622, 0.31135486949417079, 0.30550668213964982, 0.29964694756909749, 0.29377588726251663, 0.28789372312798917, 0.28200067749328667, 0.27609697309746906, 0.27018283308246382, 0.26425848098463345, 0.25832414072632598, 0.25238003660741054, 0.24642639329680122, 0.24046343582396335, 0.23449138957040974, 0.22851048026118126, 0.22252093395631445, 0.21652297704229864, 0.21051683622351761, 0.20450273851368242, 0.19848091122724945, 0.19245158197082995, 0.18641497863458675, 0.1803713293836198, 0.17432086264934399, 0.16826380712085329, 0.16220039173627876, 0.15613084567413366, 0.1500553983446527, 0.14397427938112045, 0.13788771863119115, 0.13179594614820278, 0.12569919218247999, 0.11959768717263308, 0.11349166173684638, 0.10738134666416307, 0.10126697290576155, 0.095148771566225324, 0.089026973894809708, 0.082901811276699419, 0.076773515224264705, 0.070642317368309157, 0.064508449449316344, 0.058372143308689985, 0.052233630879990445, 0.046093144180169916, 0.039950915300801082, 0.033807176399306589, 0.027662159690182372, 0.021516097436222258, 0.01536922193973846, 0.0092217655337806046, 0.0030739605733557966, -0.0030739605733554522, -0.0092217655337804832, -0.015369221939738116, -0.021516097436222133, -0.027662159690182025, -0.033807176399306464, -0.039950915300800735, -0.046093144180169791, -0.052233630879990098, -0.05837214330868986, -0.064508449449316232, -0.07064231736830906, -0.076773515224264371, -0.082901811276699308, -0.089026973894809375, -0.095148771566225213, -0.10126697290576121, -0.10738134666416296, -0.11349166173684605, -0.11959768717263299, -0.12569919218247966, -0.13179594614820267, -0.13788771863119104, -0.14397427938112034, -0.15005539834465259, -0.15613084567413354, -0.16220039173627843, -0.16826380712085318, -0.17432086264934366, -0.18037132938361969, -0.18641497863458642, -0.19245158197082984, -0.19848091122724912, -0.20450273851368231, -0.21051683622351727, -0.21652297704229853, -0.22252093395631434, -0.22851048026118118, -0.23449138957040966, -0.24046343582396323, -0.24642639329680088, -0.25238003660741043, -0.25832414072632565, -0.26425848098463334, -0.27018283308246349, -0.27609697309746895, -0.28200067749328633, -0.28789372312798905, -0.2937758872625163, -0.29964694756909738, -0.30550668213964971, -0.31135486949417068, -0.31719128858910589, -0.32301571882570601, -0.32882794005836274, -0.33462773260293188, -0.34041487724503444, -0.3461891552483442, -0.35195034836285388, -0.35769823883312557, -0.36343260940651911, -0.3691532433414072, -0.37485992441536287, -0.38055243693333707, -0.38623056573580633, -0.39189409620690935, -0.39754281428255578, -0.40317650645851938, -0.408794959798506, -0.41439796194220352, -0.41998530111330723, -0.42555676612752458, -0.43111214640055795, -0.43665123195606392, -0.44217381343358819, -0.44767968209648107, -0.45316862983978584, -0.45864044919810493, -0.46409493335344015, -0.46953187614301223, -0.47495107206704995, -0.48035231629656183, -0.4857354046810729, -0.49110013375634509, -0.4964463007520647, -0.50177370359950857, -0.5070821409391808, -0.51237141212842352, -0.51764131724899998, -0.52289165711465191, -0.52812223327862795, -0.53333284804118419, -0.53852330445705532, -0.5436934063429012, -0.54884295828471885, -0.55397176564523276, -0.55907963457124621, -0.56416637200097308, -0.5692317856713317, -0.57427568412521401, -0.57929787671872079, -0.58429817362836844, -0.5892763858582617, -0.5942323252472399, -0.59916580447598666, -0.60407663707411174, -0.60896463742719653, -0.61382962078381298, -0.61867140326250303, -0.62348980185873337, -0.62828463445180716, -0.6330557198117519, -0.6378028776061665, -0.64252592840703937, -0.64722469369752911, -0.65189899587871247, -0.65654865827629583, -0.66117350514729478, -0.66577336168667522, -0.67034805403396169, -0.67489740927980679, -0.6794212554725293, -0.68391942162461028, -0.68839173771915996, -0.6928380347163392, -0.69725814455975266, -0.70165190018279777, -0.70601913551498163, -0.71035968548819683, -0.71467338604296105, -0.71896007413461638, -0.72321958773949468, -0.72745176586103955, -0.73165644853589207, -0.73583347683993661, -0.73998269289430874, -0.74410393987136036, -0.74819706200059111, -0.75226190457453113, -0.75629831395459302, -0.76030613757687548, -0.76428522395793208, -0.76823542270049594, -0.77215658449916424, -0.77604856114604126, -0.77991120553634119, -0.78374437167394717, -0.78754791467693031, -0.79132169078302472, -0.7950655573550629, -0.79877937288636469, -0.80246299700608903, -0.80611629048453581, -0.80973911523841147, -0.81333133433604599, -0.8168928120025698, -0.82042341362504512, -0.82392300575755417, -0.82739145612624221, -0.83082863363431825, -0.83423440836700946, -0.8376086515964718, -0.84095123578665465, -0.8442620345981231, -0.84754092289283089, -0.85078777673885309, -0.85400247341506696, -0.85718489141579368, -0.86033491045538824, -0.86345241147278773, -0.86653727663601066, -0.86958938934661101, -0.87260863424408419, -0.87559489721022921, -0.87854806537346053, -0.88146802711307481, -0.88435467206346929, -0.88720789111831455, -0.89002757643467667, -0.89281362143709475, -0.89556592082160857, -0.89828437055973898, -0.90096886790241903, -0.90361931138387908, -0.90623560082548038, -0.90881763733950294, -0.91136532333288134, -0.9138785625108955, -0.91635725988080885, -0.91880132175545981, -0.92121065575680139, -0.92358517081939495, -0.9259247771938498, -0.92822938645021758, -0.93049891148133312, -0.93273326650610799, -0.9349323670727715, -0.93709613006206383, -0.93922447369037709, -0.94131731751284708, -0.9433745824263926, -0.94539619067270697, -0.94738206584119544, -0.94933213287186502, -0.95124631805815973, -0.95312454904974775, -0.95496675485525517, -0.95677286584495025, -0.95854281375337413, -0.96027653168192206, -0.96197395410137099, -0.96363501685435693, -0.96525965715780004, -0.9668478136052775, -0.96839942616934394, -0.96991443620380113, -0.97139278644591398, -0.97283442101857565, -0.97423928543241844, -0.97560732658787452, -0.9769384927771817, -0.9782327336863389, -0.97949000039700751, -0.98071024538836005, -0.98189342253887657, -0.98303948712808775, -0.98414839583826574, -0.98522010675606064, -0.98625457937408501, -0.9872517745924454, -0.98821165472021921, -0.98913418347688054, -0.99001932599367015, -0.99086704881491472, -0.99167731989928998, -0.99245010862103311, -0.99318538577109949, -0.99388312355826691, -0.99454329561018584, -0.99516587697437653, -0.99575084411917214, -0.99629817493460782, -0.99680784873325645, -0.99727984625101107, -0.99771414964781235, -0.99811074250832332, -0.99846960984254973, -0.99879073808640628, -0.99907411510222999, -0.99931973017923825, -0.99952757403393411, -0.99969763881045715, -0.99982991808087995, -0.99992440684545181, -0.99998110153278685, -1.0, -1.0};
 
 typedef struct {
     pyo_audio_HEAD
@@ -38,7 +38,7 @@ typedef struct {
     Stream *q_stream;
     void (*coeffs_func_ptr)();
     int init;
-    int modebuffer[4]; // need at least 2 slots for mul & add 
+    int modebuffer[4]; // need at least 2 slots for mul & add
     int filtertype;
     MYFLT nyquist;
     // sample memories
@@ -59,7 +59,7 @@ typedef struct {
     MYFLT a2;
 } Biquad;
 
-static void 
+static void
 Biquad_compute_coeffs_lp(Biquad *self)
 {
     self->b0 = self->b2 = (1 - self->c) / 2;
@@ -69,7 +69,7 @@ Biquad_compute_coeffs_lp(Biquad *self)
     self->a2 = 1 - self->alpha;
 }
 
-static void 
+static void
 Biquad_compute_coeffs_hp(Biquad *self)
 {
     self->b0 = (1 + self->c) / 2;
@@ -80,7 +80,7 @@ Biquad_compute_coeffs_hp(Biquad *self)
     self->a2 = 1 - self->alpha;
 }
 
-static void 
+static void
 Biquad_compute_coeffs_bp(Biquad *self)
 {
     self->b0 = self->alpha;
@@ -91,7 +91,7 @@ Biquad_compute_coeffs_bp(Biquad *self)
     self->a2 = 1 - self->alpha;
 }
 
-static void 
+static void
 Biquad_compute_coeffs_bs(Biquad *self)
 {
     self->b0 = 1;
@@ -101,7 +101,7 @@ Biquad_compute_coeffs_bs(Biquad *self)
     self->a2 = 1 - self->alpha;
 }
 
-static void 
+static void
 Biquad_compute_coeffs_ap(Biquad *self)
 {
     self->b0 = self->a2 = 1 - self->alpha;
@@ -111,14 +111,14 @@ Biquad_compute_coeffs_ap(Biquad *self)
 
 static void
 Biquad_compute_variables(Biquad *self, MYFLT freq, MYFLT q)
-{    
-    if (freq <= 1) 
+{
+    if (freq <= 1)
         freq = 1;
     else if (freq >= self->nyquist)
         freq = self->nyquist;
     if (q < 0.1)
         q = 0.1;
-    
+
     self->w0 = TWOPI * freq / self->sr;
     self->c = MYCOS(self->w0);
     self->alpha = MYSIN(self->w0) / (2 * q);
@@ -135,7 +135,7 @@ Biquad_filters_ii(Biquad *self) {
         self->x1 = self->x2 = self->y1 = self->y2 = in[0];
         self->init = 0;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = ( (self->b0 * in[i]) + (self->b1 * self->x1) + (self->b2 * self->x2) - (self->a1 * self->y1) - (self->a2 * self->y2) ) / self->a0;
         self->y2 = self->y1;
@@ -151,7 +151,7 @@ Biquad_filters_ai(Biquad *self) {
     MYFLT val, q;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         self->x1 = self->x2 = self->y1 = self->y2 = in[0];
         self->init = 0;
@@ -159,7 +159,7 @@ Biquad_filters_ai(Biquad *self) {
 
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     q = PyFloat_AS_DOUBLE(self->q);
-    
+
     for (i=0; i<self->bufsize; i++) {
         Biquad_compute_variables(self, fr[i], q);
         val = ( (self->b0 * in[i]) + (self->b1 * self->x1) + (self->b2 * self->x2) - (self->a1 * self->y1) - (self->a2 * self->y2) ) / self->a0;
@@ -176,15 +176,15 @@ Biquad_filters_ia(Biquad *self) {
     MYFLT val, fr;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         self->x1 = self->x2 = self->y1 = self->y2 = in[0];
         self->init = 0;
     }
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *q = Stream_getData((Stream *)self->q_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         Biquad_compute_variables(self, fr, q[i]);
         val = ( (self->b0 * in[i]) + (self->b1 * self->x1) + (self->b2 * self->x2) - (self->a1 * self->y1) - (self->a2 * self->y2) ) / self->a0;
@@ -201,7 +201,7 @@ Biquad_filters_aa(Biquad *self) {
     MYFLT val;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         self->x1 = self->x2 = self->y1 = self->y2 = in[0];
         self->init = 0;
@@ -255,57 +255,57 @@ Biquad_setProcMode(Biquad *self)
             self->coeffs_func_ptr = Biquad_compute_coeffs_ap;
             break;
     }
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             Biquad_compute_variables(self, PyFloat_AS_DOUBLE(self->freq), PyFloat_AS_DOUBLE(self->q));
             self->proc_func_ptr = Biquad_filters_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Biquad_filters_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Biquad_filters_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Biquad_filters_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Biquad_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Biquad_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Biquad_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Biquad_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Biquad_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Biquad_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Biquad_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Biquad_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Biquad_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Biquad_compute_next_data_frame(Biquad *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -315,23 +315,23 @@ Biquad_traverse(Biquad *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->q);    
-    Py_VISIT(self->q_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->q);
+    Py_VISIT(self->q_stream);
     return 0;
 }
 
-static int 
+static int
 Biquad_clear(Biquad *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->q);    
-    Py_CLEAR(self->q_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->q);
+    Py_CLEAR(self->q_stream);
     return 0;
 }
 
@@ -350,7 +350,7 @@ Biquad_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *qtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Biquad *self;
     self = (Biquad *)type->tp_alloc(type, 0);
-        
+
     self->freq = PyFloat_FromDouble(1000);
     self->q = PyFloat_FromDouble(1);
     self->filtertype = 0;
@@ -361,9 +361,9 @@ Biquad_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->init = 1;
 
     INIT_OBJECT_COMMON
-    
+
     self->nyquist = (MYFLT)self->sr * 0.49;
-    
+
     Stream_setFunctionPtr(self->stream, Biquad_compute_next_data_frame);
     self->mode_func_ptr = Biquad_setProcMode;
 
@@ -373,7 +373,7 @@ Biquad_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
@@ -381,7 +381,7 @@ Biquad_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (qtmp) {
         PyObject_CallMethod((PyObject *)self, "setQ", "O", qtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
@@ -389,7 +389,7 @@ Biquad_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-            
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
@@ -399,10 +399,10 @@ Biquad_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Biquad_getServer(Biquad* self) { GET_SERVER };
 static PyObject * Biquad_getStream(Biquad* self) { GET_STREAM };
-static PyObject * Biquad_setMul(Biquad *self, PyObject *arg) { SET_MUL };	
-static PyObject * Biquad_setAdd(Biquad *self, PyObject *arg) { SET_ADD };	
-static PyObject * Biquad_setSub(Biquad *self, PyObject *arg) { SET_SUB };	
-static PyObject * Biquad_setDiv(Biquad *self, PyObject *arg) { SET_DIV };	
+static PyObject * Biquad_setMul(Biquad *self, PyObject *arg) { SET_MUL };
+static PyObject * Biquad_setAdd(Biquad *self, PyObject *arg) { SET_ADD };
+static PyObject * Biquad_setSub(Biquad *self, PyObject *arg) { SET_SUB };
+static PyObject * Biquad_setDiv(Biquad *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Biquad_play(Biquad *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Biquad_out(Biquad *self, PyObject *args, PyObject *kwds) { OUT };
@@ -421,14 +421,14 @@ static PyObject *
 Biquad_setFreq(Biquad *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -444,25 +444,25 @@ Biquad_setFreq(Biquad *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Biquad_setQ(Biquad *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->q);
@@ -478,33 +478,33 @@ Biquad_setQ(Biquad *self, PyObject *arg)
         self->q_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Biquad_setType(Biquad *self, PyObject *arg)
 {
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		self->filtertype = PyInt_AsLong(arg);
 	}
 
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Biquad_members[] = {
     {"server", T_OBJECT_EX, offsetof(Biquad, server), 0, "Pyo server."},
@@ -627,7 +627,7 @@ typedef struct {
     Stream *q_stream;
     void (*coeffs_func_ptr)();
     int init;
-    int modebuffer[4]; // need at least 2 slots for mul & add 
+    int modebuffer[4]; // need at least 2 slots for mul & add
     int filtertype;
     int stages;
     MYFLT nyquist;
@@ -659,7 +659,7 @@ Biquadx_allocate_memories(Biquadx *self)
     self->init = 1;
 }
 
-static void 
+static void
 Biquadx_compute_coeffs_lp(Biquadx *self)
 {
     self->b0 = self->b2 = (1 - self->c) / 2;
@@ -669,7 +669,7 @@ Biquadx_compute_coeffs_lp(Biquadx *self)
     self->a2 = 1 - self->alpha;
 }
 
-static void 
+static void
 Biquadx_compute_coeffs_hp(Biquadx *self)
 {
     self->b0 = (1 + self->c) / 2;
@@ -680,7 +680,7 @@ Biquadx_compute_coeffs_hp(Biquadx *self)
     self->a2 = 1 - self->alpha;
 }
 
-static void 
+static void
 Biquadx_compute_coeffs_bp(Biquadx *self)
 {
     self->b0 = self->alpha;
@@ -691,7 +691,7 @@ Biquadx_compute_coeffs_bp(Biquadx *self)
     self->a2 = 1 - self->alpha;
 }
 
-static void 
+static void
 Biquadx_compute_coeffs_bs(Biquadx *self)
 {
     self->b0 = 1;
@@ -701,7 +701,7 @@ Biquadx_compute_coeffs_bs(Biquadx *self)
     self->a2 = 1 - self->alpha;
 }
 
-static void 
+static void
 Biquadx_compute_coeffs_ap(Biquadx *self)
 {
     self->b0 = self->a2 = 1 - self->alpha;
@@ -711,14 +711,14 @@ Biquadx_compute_coeffs_ap(Biquadx *self)
 
 static void
 Biquadx_compute_variables(Biquadx *self, MYFLT freq, MYFLT q)
-{    
-    if (freq <= 1) 
+{
+    if (freq <= 1)
         freq = 1;
     else if (freq >= self->nyquist)
         freq = self->nyquist;
     if (q < 0.1)
         q = 0.1;
-    
+
     self->w0 = TWOPI * freq / self->sr;
     self->c = MYCOS(self->w0);
     self->alpha = MYSIN(self->w0) / (2 * q);
@@ -730,18 +730,18 @@ Biquadx_filters_ii(Biquadx *self) {
     MYFLT vin, vout;
     int i, j;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         for (i=0; i<self->stages; i++) {
             self->x1[i] = self->x2[i] = self->y1[i] = self->y2[i] = in[0];
-        }    
+        }
         self->init = 0;
     }
-    
+
     vout = 0.0;
     for (i=0; i<self->bufsize; i++) {
         vin = in[i];
-        for (j=0; j<self->stages; j++) {   
+        for (j=0; j<self->stages; j++) {
             vout = ( (self->b0 * vin) + (self->b1 * self->x1[j]) + (self->b2 * self->x2[j]) - (self->a1 * self->y1[j]) - (self->a2 * self->y2[j]) ) / self->a0;
             self->x2[j] = self->x1[j];
             self->x1[j] = vin;
@@ -757,22 +757,22 @@ Biquadx_filters_ai(Biquadx *self) {
     MYFLT vin, vout, q;
     int i, j;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         for (i=0; i<self->stages; i++) {
             self->x1[i] = self->x2[i] = self->y1[i] = self->y2[i] = in[0];
-        }    
+        }
         self->init = 0;
     }
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     q = PyFloat_AS_DOUBLE(self->q);
-    
+
     vout = 0.0;
     for (i=0; i<self->bufsize; i++) {
         Biquadx_compute_variables(self, fr[i], q);
         vin = in[i];
-        for (j=0; j<self->stages; j++) {   
+        for (j=0; j<self->stages; j++) {
             vout = ( (self->b0 * vin) + (self->b1 * self->x1[j]) + (self->b2 * self->x2[j]) - (self->a1 * self->y1[j]) - (self->a2 * self->y2[j]) ) / self->a0;
             self->x2[j] = self->x1[j];
             self->x1[j] = vin;
@@ -788,22 +788,22 @@ Biquadx_filters_ia(Biquadx *self) {
     MYFLT vin, vout, fr;
     int i, j;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         for (i=0; i<self->stages; i++) {
             self->x1[i] = self->x2[i] = self->y1[i] = self->y2[i] = in[0];
-        }    
+        }
         self->init = 0;
     }
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *q = Stream_getData((Stream *)self->q_stream);
-    
+
     vout = 0.0;
     for (i=0; i<self->bufsize; i++) {
         Biquadx_compute_variables(self, fr, q[i]);
         vin = in[i];
-        for (j=0; j<self->stages; j++) {   
+        for (j=0; j<self->stages; j++) {
             vout = ( (self->b0 * vin) + (self->b1 * self->x1[j]) + (self->b2 * self->x2[j]) - (self->a1 * self->y1[j]) - (self->a2 * self->y2[j]) ) / self->a0;
             self->x2[j] = self->x1[j];
             self->x1[j] = vin;
@@ -819,22 +819,22 @@ Biquadx_filters_aa(Biquadx *self) {
     MYFLT vin, vout;
     int i, j;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         for (i=0; i<self->stages; i++) {
             self->x1[i] = self->x2[i] = self->y1[i] = self->y2[i] = in[0];
-        }    
+        }
         self->init = 0;
     }
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT *q = Stream_getData((Stream *)self->q_stream);
-    
+
     vout = 0.0;
     for (i=0; i<self->bufsize; i++) {
         Biquadx_compute_variables(self, fr[i], q[i]);
         vin = in[i];
-        for (j=0; j<self->stages; j++) {   
+        for (j=0; j<self->stages; j++) {
             vout = ( (self->b0 * vin) + (self->b1 * self->x1[j]) + (self->b2 * self->x2[j]) - (self->a1 * self->y1[j]) - (self->a2 * self->y2[j]) ) / self->a0;
             self->x2[j] = self->x1[j];
             self->x1[j] = vin;
@@ -861,7 +861,7 @@ Biquadx_setProcMode(Biquadx *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (self->filtertype) {
         case 0:
             self->coeffs_func_ptr = Biquadx_compute_coeffs_lp;
@@ -879,57 +879,57 @@ Biquadx_setProcMode(Biquadx *self)
             self->coeffs_func_ptr = Biquadx_compute_coeffs_ap;
             break;
     }
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             Biquadx_compute_variables(self, PyFloat_AS_DOUBLE(self->freq), PyFloat_AS_DOUBLE(self->q));
             self->proc_func_ptr = Biquadx_filters_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Biquadx_filters_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Biquadx_filters_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Biquadx_filters_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Biquadx_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Biquadx_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Biquadx_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Biquadx_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Biquadx_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Biquadx_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Biquadx_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Biquadx_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Biquadx_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Biquadx_compute_next_data_frame(Biquadx *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -939,23 +939,23 @@ Biquadx_traverse(Biquadx *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->q);    
-    Py_VISIT(self->q_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->q);
+    Py_VISIT(self->q_stream);
     return 0;
 }
 
-static int 
+static int
 Biquadx_clear(Biquadx *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->q);    
-    Py_CLEAR(self->q_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->q);
+    Py_CLEAR(self->q_stream);
     return 0;
 }
 
@@ -978,7 +978,7 @@ Biquadx_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *qtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Biquadx *self;
     self = (Biquadx *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(1000);
     self->q = PyFloat_FromDouble(1);
     self->filtertype = 0;
@@ -988,37 +988,37 @@ Biquadx_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
     self->init = 1;
-    
+
     INIT_OBJECT_COMMON
-    
+
     self->nyquist = (MYFLT)self->sr * 0.49;
 
     Stream_setFunctionPtr(self->stream, Biquadx_compute_next_data_frame);
     self->mode_func_ptr = Biquadx_setProcMode;
 
     static char *kwlist[] = {"input", "freq", "q", "type", "stages", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOiiOO", kwlist, &inputtmp, &freqtmp, &qtmp, &self->filtertype, &self->stages, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (qtmp) {
         PyObject_CallMethod((PyObject *)self, "setQ", "O", qtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     Biquadx_allocate_memories(self);
@@ -1030,10 +1030,10 @@ Biquadx_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Biquadx_getServer(Biquadx* self) { GET_SERVER };
 static PyObject * Biquadx_getStream(Biquadx* self) { GET_STREAM };
-static PyObject * Biquadx_setMul(Biquadx *self, PyObject *arg) { SET_MUL };	
-static PyObject * Biquadx_setAdd(Biquadx *self, PyObject *arg) { SET_ADD };	
-static PyObject * Biquadx_setSub(Biquadx *self, PyObject *arg) { SET_SUB };	
-static PyObject * Biquadx_setDiv(Biquadx *self, PyObject *arg) { SET_DIV };	
+static PyObject * Biquadx_setMul(Biquadx *self, PyObject *arg) { SET_MUL };
+static PyObject * Biquadx_setAdd(Biquadx *self, PyObject *arg) { SET_ADD };
+static PyObject * Biquadx_setSub(Biquadx *self, PyObject *arg) { SET_SUB };
+static PyObject * Biquadx_setDiv(Biquadx *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Biquadx_play(Biquadx *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Biquadx_out(Biquadx *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1052,14 +1052,14 @@ static PyObject *
 Biquadx_setFreq(Biquadx *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -1075,25 +1075,25 @@ Biquadx_setFreq(Biquadx *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Biquadx_setQ(Biquadx *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->q);
@@ -1109,45 +1109,45 @@ Biquadx_setQ(Biquadx *self, PyObject *arg)
         self->q_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Biquadx_setType(Biquadx *self, PyObject *arg)
 {
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		self->filtertype = PyInt_AsLong(arg);
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Biquadx_setStages(Biquadx *self, PyObject *arg)
 {
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		self->stages = PyInt_AsLong(arg);
         Biquadx_allocate_memories(self);
@@ -1155,7 +1155,7 @@ Biquadx_setStages(Biquadx *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Biquadx_members[] = {
     {"server", T_OBJECT_EX, offsetof(Biquadx, server), 0, "Pyo server."},
@@ -1282,7 +1282,7 @@ typedef struct {
     Stream *a1_stream;
     Stream *a2_stream;
     int init;
-    int modebuffer[2]; // need at least 2 slots for mul & add 
+    int modebuffer[2]; // need at least 2 slots for mul & add
     // sample memories
     MYFLT x1;
     MYFLT x2;
@@ -1306,7 +1306,7 @@ Biquada_filters(Biquada *self) {
         self->x1 = self->x2 = self->y1 = self->y2 = in[0];
         self->init = 0;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = ( (b0[i] * in[i]) + (b1[i] * self->x1) + (b2[i] * self->x2) - (a1[i] * self->y1) - (a2[i] * self->y2) ) / a0[i];
         self->y2 = self->y1;
@@ -1331,44 +1331,44 @@ Biquada_setProcMode(Biquada *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = Biquada_filters;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Biquada_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Biquada_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Biquada_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Biquada_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Biquada_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Biquada_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Biquada_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Biquada_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Biquada_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Biquada_compute_next_data_frame(Biquada *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1387,7 +1387,7 @@ Biquada_traverse(Biquada *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Biquada_clear(Biquada *self)
 {
     pyo_CLEAR
@@ -1417,21 +1417,21 @@ Biquada_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *b0tmp, *b1tmp, *b2tmp, *a0tmp, *a1tmp, *a2tmp, *multmp=NULL, *addtmp=NULL;
     Biquada *self;
     self = (Biquada *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
     self->init = 1;
-    
+
     INIT_OBJECT_COMMON
-    
+
     Stream_setFunctionPtr(self->stream, Biquada_compute_next_data_frame);
     self->mode_func_ptr = Biquada_setProcMode;
 
     static char *kwlist[] = {"input", "b0", "b1", "b2", "a0", "a1", "a2", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OOOOOOOOO", kwlist, &inputtmp, &b0tmp, &b1tmp, &b2tmp, &a0tmp, &a1tmp, &a2tmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     if (b0tmp)
@@ -1450,9 +1450,9 @@ Biquada_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     if (addtmp)
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -1460,10 +1460,10 @@ Biquada_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Biquada_getServer(Biquada* self) { GET_SERVER };
 static PyObject * Biquada_getStream(Biquada* self) { GET_STREAM };
-static PyObject * Biquada_setMul(Biquada *self, PyObject *arg) { SET_MUL };	
-static PyObject * Biquada_setAdd(Biquada *self, PyObject *arg) { SET_ADD };	
-static PyObject * Biquada_setSub(Biquada *self, PyObject *arg) { SET_SUB };	
-static PyObject * Biquada_setDiv(Biquada *self, PyObject *arg) { SET_DIV };	
+static PyObject * Biquada_setMul(Biquada *self, PyObject *arg) { SET_MUL };
+static PyObject * Biquada_setAdd(Biquada *self, PyObject *arg) { SET_ADD };
+static PyObject * Biquada_setSub(Biquada *self, PyObject *arg) { SET_SUB };
+static PyObject * Biquada_setDiv(Biquada *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Biquada_play(Biquada *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Biquada_out(Biquada *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1480,99 +1480,99 @@ static PyObject * Biquada_inplace_div(Biquada *self, PyObject *arg) { INPLACE_DI
 
 static PyObject *
 Biquada_setB0(Biquada *self, PyObject *arg)
-{	
+{
 	PyObject *streamtmp;
 
 	if (arg == NULL)
 		Py_RETURN_NONE;
-    
+
     streamtmp = PyObject_CallMethod((PyObject *)arg, "_getStream", NULL);
     Py_INCREF(streamtmp);
     Py_XDECREF(self->b0_stream);
     self->b0_stream = (Stream *)streamtmp;
-    
+
 	Py_RETURN_NONE;
-}	
+}
 
 static PyObject *
 Biquada_setB1(Biquada *self, PyObject *arg)
-{	
+{
 	PyObject *streamtmp;
 
 	if (arg == NULL)
 		Py_RETURN_NONE;
-    
+
     streamtmp = PyObject_CallMethod((PyObject *)arg, "_getStream", NULL);
     Py_INCREF(streamtmp);
     Py_XDECREF(self->b1_stream);
     self->b1_stream = (Stream *)streamtmp;
-    
+
 	Py_RETURN_NONE;
-}	
+}
 
 static PyObject *
 Biquada_setB2(Biquada *self, PyObject *arg)
-{	
+{
 	PyObject *streamtmp;
-    
+
 	if (arg == NULL)
 		Py_RETURN_NONE;
-    
+
     streamtmp = PyObject_CallMethod((PyObject *)arg, "_getStream", NULL);
     Py_INCREF(streamtmp);
     Py_XDECREF(self->b2_stream);
     self->b2_stream = (Stream *)streamtmp;
-    
+
 	Py_RETURN_NONE;
-}	
+}
 
 static PyObject *
 Biquada_setA0(Biquada *self, PyObject *arg)
-{	
+{
 	PyObject *streamtmp;
-    
+
 	if (arg == NULL)
 		Py_RETURN_NONE;
-    
+
     streamtmp = PyObject_CallMethod((PyObject *)arg, "_getStream", NULL);
     Py_INCREF(streamtmp);
     Py_XDECREF(self->a0_stream);
     self->a0_stream = (Stream *)streamtmp;
-    
+
 	Py_RETURN_NONE;
-}	
+}
 
 static PyObject *
 Biquada_setA1(Biquada *self, PyObject *arg)
-{	
+{
 	PyObject *streamtmp;
-    
+
 	if (arg == NULL)
 		Py_RETURN_NONE;
-    
+
     streamtmp = PyObject_CallMethod((PyObject *)arg, "_getStream", NULL);
     Py_INCREF(streamtmp);
     Py_XDECREF(self->a1_stream);
     self->a1_stream = (Stream *)streamtmp;
-    
+
 	Py_RETURN_NONE;
-}	
+}
 
 static PyObject *
 Biquada_setA2(Biquada *self, PyObject *arg)
-{	
+{
 	PyObject *streamtmp;
-    
+
 	if (arg == NULL)
 		Py_RETURN_NONE;
-    
+
     streamtmp = PyObject_CallMethod((PyObject *)arg, "_getStream", NULL);
     Py_INCREF(streamtmp);
     Py_XDECREF(self->a2_stream);
     self->a2_stream = (Stream *)streamtmp;
-    
+
 	Py_RETURN_NONE;
-}	
+}
 
 static PyMemberDef Biquada_members[] = {
     {"server", T_OBJECT_EX, offsetof(Biquada, server), 0, "Pyo server."},
@@ -1699,7 +1699,7 @@ typedef struct {
     Stream *boost_stream;
     void (*coeffs_func_ptr)();
     int init;
-    int modebuffer[5]; // need at least 2 slots for mul & add 
+    int modebuffer[5]; // need at least 2 slots for mul & add
     int filtertype;
     MYFLT nyquist;
     // sample memories
@@ -1721,12 +1721,12 @@ typedef struct {
     MYFLT a2;
 } EQ;
 
-static void 
+static void
 EQ_compute_coeffs_peak(EQ *self)
 {
     MYFLT alphaMul = self->alpha * self->A;
     MYFLT alphaDiv = self->alpha / self->A;
-    
+
     self->b0 = 1.0 + alphaMul;
     self->b1 = self->a1 = -2.0 * self->c;
     self->b2 = 1.0 - alphaMul;
@@ -1735,43 +1735,43 @@ EQ_compute_coeffs_peak(EQ *self)
 }
 
 static void
-EQ_compute_coeffs_lowshelf(EQ *self) 
+EQ_compute_coeffs_lowshelf(EQ *self)
 {
     MYFLT twoSqrtAAlpha = MYSQRT(self->A * 2.0)*self->alpha;
     MYFLT AminOneC = (self->A - 1.0) * self->c;
     MYFLT AAddOneC = (self->A + 1.0) * self->c;
-    
+
     self->b0 = self->A * ((self->A + 1.0) - AminOneC + twoSqrtAAlpha);
     self->b1 = 2.0 * self->A * ((self->A - 1.0) - AAddOneC);
     self->b2 = self->A * ((self->A + 1.0) - AminOneC - twoSqrtAAlpha);
     self->a0 = (self->A + 1.0) + AminOneC + twoSqrtAAlpha;
     self->a1 = -2.0 * ((self->A - 1.0) + AAddOneC);
     self->a2 = (self->A + 1.0) + AminOneC - twoSqrtAAlpha;
-}    
+}
 
 static void
-EQ_compute_coeffs_highshelf(EQ *self) 
+EQ_compute_coeffs_highshelf(EQ *self)
 {
     MYFLT twoSqrtAAlpha = MYSQRT(self->A * 2.0)*self->alpha;
     MYFLT AminOneC = (self->A - 1.0) * self->c;
     MYFLT AAddOneC = (self->A + 1.0) * self->c;
-    
+
     self->b0 = self->A * ((self->A + 1.0) + AminOneC + twoSqrtAAlpha);
     self->b1 = -2.0 * self->A * ((self->A - 1.0) + AAddOneC);
     self->b2 = self->A * ((self->A + 1.0) + AminOneC - twoSqrtAAlpha);
     self->a0 = (self->A + 1.0) - AminOneC + twoSqrtAAlpha;
     self->a1 = 2.0 * ((self->A - 1.0) - AAddOneC);
     self->a2 = (self->A + 1.0) - AminOneC - twoSqrtAAlpha;
-}    
+}
 
 static void
 EQ_compute_variables(EQ *self, MYFLT freq, MYFLT q, MYFLT boost)
-{    
-    if (freq <= 1) 
+{
+    if (freq <= 1)
         freq = 1;
     else if (freq >= self->nyquist)
         freq = self->nyquist;
-    
+
     self->A = MYPOW(10.0, boost/40.0);
     self->w0 = TWOPI * freq / self->sr;
     self->c = MYCOS(self->w0);
@@ -1784,12 +1784,12 @@ EQ_filters_iii(EQ *self) {
     MYFLT val;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         self->x1 = self->x2 = self->y1 = self->y2 = in[0];
         self->init = 0;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = ( (self->b0 * in[i]) + (self->b1 * self->x1) + (self->b2 * self->x2) - (self->a1 * self->y1) - (self->a2 * self->y2) ) / self->a0;
         self->y2 = self->y1;
@@ -1805,16 +1805,16 @@ EQ_filters_aii(EQ *self) {
     MYFLT val, q, boost;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         self->x1 = self->x2 = self->y1 = self->y2 = in[0];
         self->init = 0;
     }
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     q = PyFloat_AS_DOUBLE(self->q);
     boost = PyFloat_AS_DOUBLE(self->boost);
-    
+
     for (i=0; i<self->bufsize; i++) {
         EQ_compute_variables(self, fr[i], q, boost);
         val = ( (self->b0 * in[i]) + (self->b1 * self->x1) + (self->b2 * self->x2) - (self->a1 * self->y1) - (self->a2 * self->y2) ) / self->a0;
@@ -1831,16 +1831,16 @@ EQ_filters_iai(EQ *self) {
     MYFLT val, fr, boost;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         self->x1 = self->x2 = self->y1 = self->y2 = in[0];
         self->init = 0;
     }
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *q = Stream_getData((Stream *)self->q_stream);
     boost = PyFloat_AS_DOUBLE(self->boost);
-    
+
     for (i=0; i<self->bufsize; i++) {
         EQ_compute_variables(self, fr, q[i], boost);
         val = ( (self->b0 * in[i]) + (self->b1 * self->x1) + (self->b2 * self->x2) - (self->a1 * self->y1) - (self->a2 * self->y2) ) / self->a0;
@@ -1857,16 +1857,16 @@ EQ_filters_aai(EQ *self) {
     MYFLT val, boost;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         self->x1 = self->x2 = self->y1 = self->y2 = in[0];
         self->init = 0;
     }
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT *q = Stream_getData((Stream *)self->q_stream);
     boost = PyFloat_AS_DOUBLE(self->boost);
-    
+
     for (i=0; i<self->bufsize; i++) {
         EQ_compute_variables(self, fr[i], q[i], boost);
         val = ( (self->b0 * in[i]) + (self->b1 * self->x1) + (self->b2 * self->x2) - (self->a1 * self->y1) - (self->a2 * self->y2) ) / self->a0;
@@ -1883,7 +1883,7 @@ EQ_filters_iia(EQ *self) {
     MYFLT val, fr, q;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         self->x1 = self->x2 = self->y1 = self->y2 = in[0];
         self->init = 0;
@@ -1909,16 +1909,16 @@ EQ_filters_aia(EQ *self) {
     MYFLT val, q;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         self->x1 = self->x2 = self->y1 = self->y2 = in[0];
         self->init = 0;
     }
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     q = PyFloat_AS_DOUBLE(self->q);
     MYFLT *boost = Stream_getData((Stream *)self->boost_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         EQ_compute_variables(self, fr[i], q, boost[i]);
         val = ( (self->b0 * in[i]) + (self->b1 * self->x1) + (self->b2 * self->x2) - (self->a1 * self->y1) - (self->a2 * self->y2) ) / self->a0;
@@ -1935,16 +1935,16 @@ EQ_filters_iaa(EQ *self) {
     MYFLT val, fr;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         self->x1 = self->x2 = self->y1 = self->y2 = in[0];
         self->init = 0;
     }
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *q = Stream_getData((Stream *)self->q_stream);
     MYFLT *boost = Stream_getData((Stream *)self->boost_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         EQ_compute_variables(self, fr, q[i], boost[i]);
         val = ( (self->b0 * in[i]) + (self->b1 * self->x1) + (self->b2 * self->x2) - (self->a1 * self->y1) - (self->a2 * self->y2) ) / self->a0;
@@ -1961,16 +1961,16 @@ EQ_filters_aaa(EQ *self) {
     MYFLT val;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         self->x1 = self->x2 = self->y1 = self->y2 = in[0];
         self->init = 0;
     }
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT *q = Stream_getData((Stream *)self->q_stream);
     MYFLT *boost = Stream_getData((Stream *)self->boost_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         EQ_compute_variables(self, fr[i], q[i], boost[i]);
         val = ( (self->b0 * in[i]) + (self->b1 * self->x1) + (self->b2 * self->x2) - (self->a1 * self->y1) - (self->a2 * self->y2) ) / self->a0;
@@ -1998,7 +1998,7 @@ EQ_setProcMode(EQ *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10 + self->modebuffer[4] * 100;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (self->filtertype) {
         case 0:
             self->coeffs_func_ptr = EQ_compute_coeffs_peak;
@@ -2010,69 +2010,69 @@ EQ_setProcMode(EQ *self)
             self->coeffs_func_ptr = EQ_compute_coeffs_highshelf;
             break;
     }
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             EQ_compute_variables(self, PyFloat_AS_DOUBLE(self->freq), PyFloat_AS_DOUBLE(self->q), PyFloat_AS_DOUBLE(self->boost));
             self->proc_func_ptr = EQ_filters_iii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = EQ_filters_aii;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = EQ_filters_iai;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = EQ_filters_aai;
             break;
-        case 100:    
+        case 100:
             self->proc_func_ptr = EQ_filters_iia;
             break;
-        case 101:    
+        case 101:
             self->proc_func_ptr = EQ_filters_aia;
             break;
-        case 110:        
+        case 110:
             self->proc_func_ptr = EQ_filters_iaa;
             break;
-        case 111:    
+        case 111:
             self->proc_func_ptr = EQ_filters_aaa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = EQ_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = EQ_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = EQ_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = EQ_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = EQ_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = EQ_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = EQ_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = EQ_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = EQ_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 EQ_compute_next_data_frame(EQ *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2082,24 +2082,24 @@ EQ_traverse(EQ *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->q);    
-    Py_VISIT(self->q_stream);    
-    Py_VISIT(self->boost);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->q);
+    Py_VISIT(self->q_stream);
+    Py_VISIT(self->boost);
     Py_VISIT(self->boost_stream);
     return 0;
 }
 
-static int 
+static int
 EQ_clear(EQ *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->q);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->q);
     Py_CLEAR(self->q_stream);
     Py_CLEAR(self->boost);
     Py_CLEAR(self->boost_stream);
@@ -2121,7 +2121,7 @@ EQ_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *qtmp=NULL, *boosttmp=NULL, *multmp=NULL, *addtmp=NULL;
     EQ *self;
     self = (EQ *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(1000);
     self->q = PyFloat_FromDouble(1);
     self->boost = PyFloat_FromDouble(-3.0);
@@ -2132,7 +2132,7 @@ EQ_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[3] = 0;
 	self->modebuffer[4] = 0;
     self->init = 1;
-    
+
     INIT_OBJECT_COMMON
 
     self->nyquist = (MYFLT)self->sr * 0.49;
@@ -2141,16 +2141,16 @@ EQ_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = EQ_setProcMode;
 
     static char *kwlist[] = {"input", "freq", "q", "boost", "type", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOiOO", kwlist, &inputtmp, &freqtmp, &qtmp, &boosttmp, &self->filtertype, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (qtmp) {
         PyObject_CallMethod((PyObject *)self, "setQ", "O", qtmp);
     }
@@ -2158,17 +2158,17 @@ EQ_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (boosttmp) {
         PyObject_CallMethod((PyObject *)self, "setBoost", "O", boosttmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -2176,10 +2176,10 @@ EQ_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * EQ_getServer(EQ* self) { GET_SERVER };
 static PyObject * EQ_getStream(EQ* self) { GET_STREAM };
-static PyObject * EQ_setMul(EQ *self, PyObject *arg) { SET_MUL };	
-static PyObject * EQ_setAdd(EQ *self, PyObject *arg) { SET_ADD };	
-static PyObject * EQ_setSub(EQ *self, PyObject *arg) { SET_SUB };	
-static PyObject * EQ_setDiv(EQ *self, PyObject *arg) { SET_DIV };	
+static PyObject * EQ_setMul(EQ *self, PyObject *arg) { SET_MUL };
+static PyObject * EQ_setAdd(EQ *self, PyObject *arg) { SET_ADD };
+static PyObject * EQ_setSub(EQ *self, PyObject *arg) { SET_SUB };
+static PyObject * EQ_setDiv(EQ *self, PyObject *arg) { SET_DIV };
 
 static PyObject * EQ_play(EQ *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * EQ_out(EQ *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2198,14 +2198,14 @@ static PyObject *
 EQ_setFreq(EQ *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -2221,25 +2221,25 @@ EQ_setFreq(EQ *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 EQ_setQ(EQ *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->q);
@@ -2255,25 +2255,25 @@ EQ_setQ(EQ *self, PyObject *arg)
         self->q_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 EQ_setBoost(EQ *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->boost);
@@ -2289,33 +2289,33 @@ EQ_setBoost(EQ *self, PyObject *arg)
         self->boost_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 EQ_setType(EQ *self, PyObject *arg)
 {
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		self->filtertype = PyInt_AsLong(arg);
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef EQ_members[] = {
 {"server", T_OBJECT_EX, offsetof(EQ, server), 0, "Pyo server."},
@@ -2439,13 +2439,13 @@ typedef struct {
     PyObject *falltime;
     Stream *risetime_stream;
     Stream *falltime_stream;
-    int modebuffer[4]; // need at least 2 slots for mul & add 
+    int modebuffer[4]; // need at least 2 slots for mul & add
     MYFLT y1; // sample memory
     MYFLT x1;
     int dir;
 } Port;
 
-static void 
+static void
 direction(Port *self, MYFLT val)
 {
     if (val == self->x1)
@@ -2455,8 +2455,8 @@ direction(Port *self, MYFLT val)
     else
         self->dir = 0;
     self->x1 = val;
-}    
-    
+}
+
 static void
 Port_filters_ii(Port *self) {
     MYFLT val;
@@ -2484,10 +2484,10 @@ Port_filters_ai(Port *self) {
     MYFLT *risetime = Stream_getData((Stream *)self->risetime_stream);
     MYFLT falltime = PyFloat_AS_DOUBLE(self->falltime);
     MYFLT fallfactor = 1. / ((falltime + 0.001) * self->sr);
-    
+
     for (i=0; i<self->bufsize; i++) {
         direction(self, in[i]);
-        risefactor = (*risetime++ + 0.001) * self->sr;  
+        risefactor = (*risetime++ + 0.001) * self->sr;
         if (self->dir == 1)
             val = self->y1 + (*in++ - self->y1) / risefactor;
         else
@@ -2505,10 +2505,10 @@ Port_filters_ia(Port *self) {
     MYFLT *falltime = Stream_getData((Stream *)self->falltime_stream);
     MYFLT risetime = PyFloat_AS_DOUBLE(self->risetime);
     MYFLT risefactor = 1. / ((risetime + 0.001) * self->sr);
-    
+
     for (i=0; i<self->bufsize; i++) {
         direction(self, in[i]);
-        fallfactor = (*falltime++ + 0.001) * self->sr;  
+        fallfactor = (*falltime++ + 0.001) * self->sr;
         if (self->dir == 1)
             val = self->y1 + (*in++ - self->y1) * risefactor;
         else
@@ -2525,11 +2525,11 @@ Port_filters_aa(Port *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *risetime = Stream_getData((Stream *)self->risetime_stream);
     MYFLT *falltime = Stream_getData((Stream *)self->falltime_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         direction(self, in[i]);
-        risefactor = (*risetime++ + 0.001) * self->sr;  
-        fallfactor = (*falltime++ + 0.001) * self->sr;  
+        risefactor = (*risetime++ + 0.001) * self->sr;
+        fallfactor = (*falltime++ + 0.001) * self->sr;
         if (self->dir == 1)
             val = self->y1 + (*in++ - self->y1) / risefactor;
         else
@@ -2557,54 +2557,54 @@ Port_setProcMode(Port *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Port_filters_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Port_filters_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = Port_filters_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Port_filters_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Port_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Port_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Port_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Port_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Port_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Port_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Port_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Port_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Port_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 Port_compute_next_data_frame(Port *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2614,23 +2614,23 @@ Port_traverse(Port *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->risetime);    
-    Py_VISIT(self->risetime_stream);    
-    Py_VISIT(self->falltime);    
-    Py_VISIT(self->falltime_stream);    
+    Py_VISIT(self->risetime);
+    Py_VISIT(self->risetime_stream);
+    Py_VISIT(self->falltime);
+    Py_VISIT(self->falltime_stream);
     return 0;
 }
 
-static int 
+static int
 Port_clear(Port *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->risetime);    
-    Py_CLEAR(self->risetime_stream);    
-    Py_CLEAR(self->falltime);    
-    Py_CLEAR(self->falltime_stream);    
+    Py_CLEAR(self->risetime);
+    Py_CLEAR(self->risetime_stream);
+    Py_CLEAR(self->falltime);
+    Py_CLEAR(self->falltime_stream);
     return 0;
 }
 
@@ -2650,7 +2650,7 @@ Port_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *risetimetmp=NULL, *falltimetmp=NULL, *multmp=NULL, *addtmp=NULL;
     Port *self;
     self = (Port *)type->tp_alloc(type, 0);
-    
+
     self->risetime = PyFloat_FromDouble(0.05);
     self->falltime = PyFloat_FromDouble(0.05);
 	self->modebuffer[0] = 0;
@@ -2660,18 +2660,18 @@ Port_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->y1 = 0.0;
     self->x1 = 0.0;
     self->dir = 1;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Port_compute_next_data_frame);
     self->mode_func_ptr = Port_setProcMode;
 
     static char *kwlist[] = {"input", "risetime", "falltime", "init", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_OOFOO, kwlist, &inputtmp, &risetimetmp, &falltimetmp, &inittmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (risetimetmp) {
         PyObject_CallMethod((PyObject *)self, "setRiseTime", "O", risetimetmp);
     }
@@ -2679,20 +2679,20 @@ Port_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (falltimetmp) {
         PyObject_CallMethod((PyObject *)self, "setFallTime", "O", falltimetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
 
     if (inittmp != 0.0)
         self->x1 = self->y1 = inittmp;
-        
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -2700,10 +2700,10 @@ Port_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Port_getServer(Port* self) { GET_SERVER };
 static PyObject * Port_getStream(Port* self) { GET_STREAM };
-static PyObject * Port_setMul(Port *self, PyObject *arg) { SET_MUL };	
-static PyObject * Port_setAdd(Port *self, PyObject *arg) { SET_ADD };	
-static PyObject * Port_setSub(Port *self, PyObject *arg) { SET_SUB };	
-static PyObject * Port_setDiv(Port *self, PyObject *arg) { SET_DIV };	
+static PyObject * Port_setMul(Port *self, PyObject *arg) { SET_MUL };
+static PyObject * Port_setAdd(Port *self, PyObject *arg) { SET_ADD };
+static PyObject * Port_setSub(Port *self, PyObject *arg) { SET_SUB };
+static PyObject * Port_setDiv(Port *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Port_play(Port *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Port_out(Port *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2722,14 +2722,14 @@ static PyObject *
 Port_setRiseTime(Port *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->risetime);
@@ -2745,25 +2745,25 @@ Port_setRiseTime(Port *self, PyObject *arg)
         self->risetime_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Port_setFallTime(Port *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->falltime);
@@ -2779,12 +2779,12 @@ Port_setFallTime(Port *self, PyObject *arg)
         self->falltime_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Port_members[] = {
 {"server", T_OBJECT_EX, offsetof(Port, server), 0, "Pyo server."},
@@ -2905,7 +2905,7 @@ typedef struct {
     Stream *input_stream;
     PyObject *freq;
     Stream *freq_stream;
-    int modebuffer[3]; // need at least 2 slots for mul & add 
+    int modebuffer[3]; // need at least 2 slots for mul & add
     MYFLT lastFreq;
     MYFLT nyquist;
     // sample memories
@@ -2921,18 +2921,18 @@ Tone_filters_i(Tone *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
-        
+
     if (fr != self->lastFreq) {
         if (fr <= 1.0)
             fr = 1.0;
         else if (fr >= self->nyquist)
-            fr = self->nyquist;        
+            fr = self->nyquist;
         self->lastFreq = fr;
         b = 2.0 - MYCOS(TWOPI * fr / self->sr);
         self->c2 = (b - MYSQRT(b * b - 1.0));
         self->c1 = 1.0 - self->c2;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = self->c1 * in[i] + self->c2 * self->y1;
         self->data[i] = val;
@@ -2946,14 +2946,14 @@ Tone_filters_a(Tone *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-        
+
     for (i=0; i<self->bufsize; i++) {
-        freq = fr[i];        
+        freq = fr[i];
         if (freq != self->lastFreq) {
             if (freq <= 1.0)
                 freq = 1.0;
             else if (freq >= self->nyquist)
-                freq = self->nyquist;            
+                freq = self->nyquist;
             self->lastFreq = freq;
             b = 2.0 - MYCOS(TWOPI * freq / self->sr);
             self->c2 = (b - MYSQRT(b * b - 1.0));
@@ -2981,50 +2981,50 @@ Tone_setProcMode(Tone *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Tone_filters_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Tone_filters_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Tone_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Tone_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Tone_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Tone_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Tone_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Tone_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Tone_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Tone_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Tone_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Tone_compute_next_data_frame(Tone *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3034,19 +3034,19 @@ Tone_traverse(Tone *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
     return 0;
 }
 
-static int 
+static int
 Tone_clear(Tone *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
     return 0;
 }
 
@@ -3065,14 +3065,14 @@ Tone_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Tone *self;
     self = (Tone *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(1000);
     self->lastFreq = -1.0;
     self->y1 = self->c1 = self->c2 = 0.0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
 
     self->nyquist = (MYFLT)self->sr * 0.49;
@@ -3081,26 +3081,26 @@ Tone_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = Tone_setProcMode;
 
     static char *kwlist[] = {"input", "freq", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOO", kwlist, &inputtmp, &freqtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -3108,10 +3108,10 @@ Tone_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Tone_getServer(Tone* self) { GET_SERVER };
 static PyObject * Tone_getStream(Tone* self) { GET_STREAM };
-static PyObject * Tone_setMul(Tone *self, PyObject *arg) { SET_MUL };	
-static PyObject * Tone_setAdd(Tone *self, PyObject *arg) { SET_ADD };	
-static PyObject * Tone_setSub(Tone *self, PyObject *arg) { SET_SUB };	
-static PyObject * Tone_setDiv(Tone *self, PyObject *arg) { SET_DIV };	
+static PyObject * Tone_setMul(Tone *self, PyObject *arg) { SET_MUL };
+static PyObject * Tone_setAdd(Tone *self, PyObject *arg) { SET_ADD };
+static PyObject * Tone_setSub(Tone *self, PyObject *arg) { SET_SUB };
+static PyObject * Tone_setDiv(Tone *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Tone_play(Tone *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Tone_out(Tone *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3130,14 +3130,14 @@ static PyObject *
 Tone_setFreq(Tone *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -3153,9 +3153,9 @@ Tone_setFreq(Tone *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -3277,7 +3277,7 @@ typedef struct {
     Stream *input_stream;
     PyObject *freq;
     Stream *freq_stream;
-    int modebuffer[3]; // need at least 2 slots for mul & add 
+    int modebuffer[3]; // need at least 2 slots for mul & add
     MYFLT lastFreq;
     MYFLT nyquist;
     // sample memories
@@ -3293,18 +3293,18 @@ Atone_filters_i(Atone *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
-        
+
     if (fr != self->lastFreq) {
         if (fr <= 1.0)
             fr = 1.0;
         else if (fr >= self->nyquist)
-            fr = self->nyquist;        
+            fr = self->nyquist;
         self->lastFreq = fr;
         b = 2.0 - MYCOS(TWOPI * fr / self->sr);
         self->c2 = (b - MYSQRT(b * b - 1.0));
         self->c1 = 1.0 - self->c2;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->y1 = val = self->c1 * in[i] + self->c2 * self->y1;
         self->data[i] = in[i] - val;
@@ -3317,14 +3317,14 @@ Atone_filters_a(Atone *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-        
+
     for (i=0; i<self->bufsize; i++) {
-        freq = fr[i];        
+        freq = fr[i];
         if (freq != self->lastFreq) {
             if (freq <= 1.0)
                 freq = 1.0;
             else if (freq >= self->nyquist)
-                freq = self->nyquist;            
+                freq = self->nyquist;
             self->lastFreq = freq;
             b = 2.0 - MYCOS(TWOPI * freq / self->sr);
             self->c2 = (b - MYSQRT(b * b - 1.0));
@@ -3351,50 +3351,50 @@ Atone_setProcMode(Atone *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Atone_filters_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Atone_filters_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Atone_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Atone_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Atone_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Atone_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Atone_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Atone_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Atone_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Atone_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Atone_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Atone_compute_next_data_frame(Atone *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3404,19 +3404,19 @@ Atone_traverse(Atone *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
     return 0;
 }
 
-static int 
+static int
 Atone_clear(Atone *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
     return 0;
 }
 
@@ -3435,14 +3435,14 @@ Atone_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Atone *self;
     self = (Atone *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(1000);
     self->lastFreq = -1.0;
     self->y1 = self->c1 = self->c2 = 0.0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
 
     self->nyquist = (MYFLT)self->sr * 0.49;
@@ -3451,26 +3451,26 @@ Atone_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = Atone_setProcMode;
 
     static char *kwlist[] = {"input", "freq", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOO", kwlist, &inputtmp, &freqtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -3478,10 +3478,10 @@ Atone_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Atone_getServer(Atone* self) { GET_SERVER };
 static PyObject * Atone_getStream(Atone* self) { GET_STREAM };
-static PyObject * Atone_setMul(Atone *self, PyObject *arg) { SET_MUL };	
-static PyObject * Atone_setAdd(Atone *self, PyObject *arg) { SET_ADD };	
-static PyObject * Atone_setSub(Atone *self, PyObject *arg) { SET_SUB };	
-static PyObject * Atone_setDiv(Atone *self, PyObject *arg) { SET_DIV };	
+static PyObject * Atone_setMul(Atone *self, PyObject *arg) { SET_MUL };
+static PyObject * Atone_setAdd(Atone *self, PyObject *arg) { SET_ADD };
+static PyObject * Atone_setSub(Atone *self, PyObject *arg) { SET_SUB };
+static PyObject * Atone_setDiv(Atone *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Atone_play(Atone *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Atone_out(Atone *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3500,14 +3500,14 @@ static PyObject *
 Atone_setFreq(Atone *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -3523,9 +3523,9 @@ Atone_setFreq(Atone *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -3645,7 +3645,7 @@ typedef struct {
     pyo_audio_HEAD
     PyObject *input;
     Stream *input_stream;
-    int modebuffer[2]; // need at least 2 slots for mul & add 
+    int modebuffer[2]; // need at least 2 slots for mul & add
     // sample memories
     MYFLT x1;
     MYFLT y1;
@@ -3680,44 +3680,44 @@ DCBlock_setProcMode(DCBlock *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-       
+
     self->proc_func_ptr = DCBlock_filters;
 
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = DCBlock_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = DCBlock_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = DCBlock_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = DCBlock_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = DCBlock_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = DCBlock_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = DCBlock_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = DCBlock_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = DCBlock_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 DCBlock_compute_next_data_frame(DCBlock *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3730,7 +3730,7 @@ DCBlock_traverse(DCBlock *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 DCBlock_clear(DCBlock *self)
 {
     pyo_CLEAR
@@ -3754,32 +3754,32 @@ DCBlock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     DCBlock *self;
     self = (DCBlock *)type->tp_alloc(type, 0);
-    
+
     self->x1 = self->y1 = 0.0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, DCBlock_compute_next_data_frame);
     self->mode_func_ptr = DCBlock_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -3787,10 +3787,10 @@ DCBlock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * DCBlock_getServer(DCBlock* self) { GET_SERVER };
 static PyObject * DCBlock_getStream(DCBlock* self) { GET_STREAM };
-static PyObject * DCBlock_setMul(DCBlock *self, PyObject *arg) { SET_MUL };	
-static PyObject * DCBlock_setAdd(DCBlock *self, PyObject *arg) { SET_ADD };	
-static PyObject * DCBlock_setSub(DCBlock *self, PyObject *arg) { SET_SUB };	
-static PyObject * DCBlock_setDiv(DCBlock *self, PyObject *arg) { SET_DIV };	
+static PyObject * DCBlock_setMul(DCBlock *self, PyObject *arg) { SET_MUL };
+static PyObject * DCBlock_setAdd(DCBlock *self, PyObject *arg) { SET_ADD };
+static PyObject * DCBlock_setSub(DCBlock *self, PyObject *arg) { SET_SUB };
+static PyObject * DCBlock_setDiv(DCBlock *self, PyObject *arg) { SET_DIV };
 
 static PyObject * DCBlock_play(DCBlock *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * DCBlock_out(DCBlock *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3930,23 +3930,23 @@ static void
 Allpass_process_ii(Allpass *self) {
     MYFLT val, xind, frac;
     int i, ind;
-    
+
     MYFLT del = PyFloat_AS_DOUBLE(self->delay);
     MYFLT feed = PyFloat_AS_DOUBLE(self->feedback);
-    
+
     if (del < 0.)
         del = 0.;
     else if (del > self->maxDelay)
         del = self->maxDelay;
     MYFLT sampdel = del * self->sr;
-    
+
     if (feed < 0)
         feed = 0;
     else if (feed > 1)
         feed = 1;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         xind = self->in_count - sampdel;
         if (xind < 0)
@@ -3955,7 +3955,7 @@ Allpass_process_ii(Allpass *self) {
         frac = xind - ind;
         val = self->buffer[ind] * (1.0 - frac) + self->buffer[ind+1] * frac;
         self->data[i] = val * (1.0 - (feed * feed)) + in[i] * -feed;
-        
+
         self->buffer[self->in_count] = in[i] + (val * feed);
         if (self->in_count == 0)
             self->buffer[self->size] = self->buffer[0];
@@ -3969,17 +3969,17 @@ static void
 Allpass_process_ai(Allpass *self) {
     MYFLT val, xind, frac, sampdel, del;
     int i, ind;
-    
-    MYFLT *delobj = Stream_getData((Stream *)self->delay_stream);    
+
+    MYFLT *delobj = Stream_getData((Stream *)self->delay_stream);
     MYFLT feed = PyFloat_AS_DOUBLE(self->feedback);
-    
+
     if (feed < 0)
         feed = 0;
     else if (feed > 1)
         feed = 1;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         del = delobj[i];
         if (del < 0.)
@@ -3994,7 +3994,7 @@ Allpass_process_ai(Allpass *self) {
         frac = xind - ind;
         val = self->buffer[ind] * (1.0 - frac) + self->buffer[ind+1] * frac;
         self->data[i] = val * (1.0 - (feed * feed)) + in[i] * -feed;
-        
+
         self->buffer[self->in_count] = in[i]  + (val * feed);
         if (self->in_count == 0)
             self->buffer[self->size] = self->buffer[0];
@@ -4008,18 +4008,18 @@ static void
 Allpass_process_ia(Allpass *self) {
     MYFLT val, xind, frac, feed;
     int i, ind;
-    
+
     MYFLT del = PyFloat_AS_DOUBLE(self->delay);
-    MYFLT *fdb = Stream_getData((Stream *)self->feedback_stream);    
-    
+    MYFLT *fdb = Stream_getData((Stream *)self->feedback_stream);
+
     if (del < 0.)
         del = 0.;
     else if (del > self->maxDelay)
         del = self->maxDelay;
     MYFLT sampdel = del * self->sr;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         feed = fdb[i];
         if (feed < 0)
@@ -4047,12 +4047,12 @@ static void
 Allpass_process_aa(Allpass *self) {
     MYFLT val, xind, frac, sampdel, feed, del;
     int i, ind;
-    
-    MYFLT *delobj = Stream_getData((Stream *)self->delay_stream);    
-    MYFLT *fdb = Stream_getData((Stream *)self->feedback_stream);    
-    
+
+    MYFLT *delobj = Stream_getData((Stream *)self->delay_stream);
+    MYFLT *fdb = Stream_getData((Stream *)self->feedback_stream);
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         del = delobj[i];
         feed = fdb[i];
@@ -4072,7 +4072,7 @@ Allpass_process_aa(Allpass *self) {
         frac = xind - ind;
         val = self->buffer[ind] * (1.0 - frac) + self->buffer[ind+1] * frac;
         self->data[i] = val * (1.0 - (feed * feed)) + in[i] * -feed;
-          
+
         self->buffer[self->in_count] = in[i] + (val * feed);
         if (self->in_count == 0)
             self->buffer[self->size] = self->buffer[0];
@@ -4098,56 +4098,56 @@ Allpass_setProcMode(Allpass *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Allpass_process_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Allpass_process_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = Allpass_process_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Allpass_process_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Allpass_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Allpass_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Allpass_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Allpass_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Allpass_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Allpass_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Allpass_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Allpass_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Allpass_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 Allpass_compute_next_data_frame(Allpass *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -4156,24 +4156,24 @@ Allpass_traverse(Allpass *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->input);
-    Py_VISIT(self->input_stream);    
-    Py_VISIT(self->delay);    
-    Py_VISIT(self->delay_stream);    
-    Py_VISIT(self->feedback);    
-    Py_VISIT(self->feedback_stream);    
+    Py_VISIT(self->input_stream);
+    Py_VISIT(self->delay);
+    Py_VISIT(self->delay_stream);
+    Py_VISIT(self->feedback);
+    Py_VISIT(self->feedback_stream);
     return 0;
 }
 
-static int 
+static int
 Allpass_clear(Allpass *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
-    Py_CLEAR(self->input_stream);    
-    Py_CLEAR(self->delay);    
-    Py_CLEAR(self->delay_stream);    
-    Py_CLEAR(self->feedback);    
-    Py_CLEAR(self->feedback_stream);    
+    Py_CLEAR(self->input_stream);
+    Py_CLEAR(self->delay);
+    Py_CLEAR(self->delay_stream);
+    Py_CLEAR(self->feedback);
+    Py_CLEAR(self->feedback_stream);
     return 0;
 }
 
@@ -4193,7 +4193,7 @@ Allpass_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *delaytmp=NULL, *feedbacktmp=NULL, *multmp=NULL, *addtmp=NULL;
     Allpass *self;
     self = (Allpass *)type->tp_alloc(type, 0);
-    
+
     self->delay = PyFloat_FromDouble(0);
     self->feedback = PyFloat_FromDouble(0);
     self->maxDelay = 1;
@@ -4202,43 +4202,43 @@ Allpass_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Allpass_compute_next_data_frame);
     self->mode_func_ptr = Allpass_setProcMode;
-    
+
     static char *kwlist[] = {"input", "delay", "feedback", "maxDelay", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_OOFOO, kwlist, &inputtmp, &delaytmp, &feedbacktmp, &self->maxDelay, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (delaytmp) {
         PyObject_CallMethod((PyObject *)self, "setDelay", "O", delaytmp);
     }
-    
+
     if (feedbacktmp) {
         PyObject_CallMethod((PyObject *)self, "setFeedback", "O", feedbacktmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->size = self->maxDelay * self->sr + 0.5;
-    
+
     self->buffer = (MYFLT *)realloc(self->buffer, (self->size+1) * sizeof(MYFLT));
     for (i=0; i<(self->size+1); i++) {
         self->buffer[i] = 0.;
-    }    
-    
+    }
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -4246,10 +4246,10 @@ Allpass_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Allpass_getServer(Allpass* self) { GET_SERVER };
 static PyObject * Allpass_getStream(Allpass* self) { GET_STREAM };
-static PyObject * Allpass_setMul(Allpass *self, PyObject *arg) { SET_MUL };	
-static PyObject * Allpass_setAdd(Allpass *self, PyObject *arg) { SET_ADD };	
-static PyObject * Allpass_setSub(Allpass *self, PyObject *arg) { SET_SUB };	
-static PyObject * Allpass_setDiv(Allpass *self, PyObject *arg) { SET_DIV };	
+static PyObject * Allpass_setMul(Allpass *self, PyObject *arg) { SET_MUL };
+static PyObject * Allpass_setAdd(Allpass *self, PyObject *arg) { SET_ADD };
+static PyObject * Allpass_setSub(Allpass *self, PyObject *arg) { SET_SUB };
+static PyObject * Allpass_setDiv(Allpass *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Allpass_play(Allpass *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Allpass_out(Allpass *self, PyObject *args, PyObject *kwds) { OUT };
@@ -4268,14 +4268,14 @@ static PyObject *
 Allpass_setDelay(Allpass *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->delay);
@@ -4291,25 +4291,25 @@ Allpass_setDelay(Allpass *self, PyObject *arg)
         self->delay_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Allpass_setFeedback(Allpass *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->feedback);
@@ -4325,12 +4325,12 @@ Allpass_setFeedback(Allpass *self, PyObject *arg)
         self->feedback_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Allpass_members[] = {
     {"server", T_OBJECT_EX, offsetof(Allpass, server), 0, "Pyo server."},
@@ -4451,7 +4451,7 @@ typedef struct {
     PyObject *bw;
     Stream *bw_stream;
     int init;
-    int modebuffer[4]; // need at least 2 slots for mul & add 
+    int modebuffer[4]; // need at least 2 slots for mul & add
     MYFLT oneOnSr;
     MYFLT nyquist;
     // sample memories
@@ -4464,16 +4464,16 @@ typedef struct {
 
 static void
 Allpass2_compute_variables(Allpass2 *self, MYFLT freq, MYFLT bw)
-{    
+{
     MYFLT radius, angle;
-    if (freq <= 1) 
+    if (freq <= 1)
         freq = 1;
     else if (freq >= self->nyquist)
         freq = self->nyquist;
-    
+
     radius = MYPOW(E, -PI * bw * self->oneOnSr);
     angle = TWOPI * freq * self->oneOnSr;
-    
+
     self->alpha = radius * radius;
     self->beta = -2.0 * radius * MYCOS(angle);
 }
@@ -4483,12 +4483,12 @@ Allpass2_filters_ii(Allpass2 *self) {
     MYFLT val;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         self->y1 = self->y2 = in[0];
         self->init = 0;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = in[i] + (self->y1 * -self->beta) + (self->y2 * -self->alpha);
         self->data[i] = (val * self->alpha) + (self->y1 * self->beta) + self->y2;
@@ -4502,15 +4502,15 @@ Allpass2_filters_ai(Allpass2 *self) {
     MYFLT val, bw;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         self->y1 = self->y2 = in[0];
         self->init = 0;
     }
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     bw = PyFloat_AS_DOUBLE(self->bw);
-    
+
     for (i=0; i<self->bufsize; i++) {
         Allpass2_compute_variables(self, fr[i], bw);
         val = in[i] + (self->y1 * -self->beta) + (self->y2 * -self->alpha);
@@ -4525,15 +4525,15 @@ Allpass2_filters_ia(Allpass2 *self) {
     MYFLT val, fr;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         self->y1 = self->y2 = in[0];
         self->init = 0;
     }
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *bw = Stream_getData((Stream *)self->bw_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         Allpass2_compute_variables(self, fr, bw[i]);
         val = in[i] + (self->y1 * -self->beta) + (self->y2 * -self->alpha);
@@ -4548,15 +4548,15 @@ Allpass2_filters_aa(Allpass2 *self) {
     MYFLT val;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->init == 1) {
         self->y1 = self->y2 = in[0];
         self->init = 0;
     }
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT *bw = Stream_getData((Stream *)self->bw_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         Allpass2_compute_variables(self, fr[i], bw[i]);
         val = in[i] + (self->y1 * -self->beta) + (self->y2 * -self->alpha);
@@ -4584,55 +4584,55 @@ Allpass2_setProcMode(Allpass2 *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
 	switch (procmode) {
-        case 0:    
+        case 0:
             Allpass2_compute_variables(self, PyFloat_AS_DOUBLE(self->freq), PyFloat_AS_DOUBLE(self->bw));
             self->proc_func_ptr = Allpass2_filters_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Allpass2_filters_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Allpass2_filters_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Allpass2_filters_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Allpass2_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Allpass2_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Allpass2_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Allpass2_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Allpass2_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Allpass2_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Allpass2_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Allpass2_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Allpass2_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Allpass2_compute_next_data_frame(Allpass2 *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -4642,23 +4642,23 @@ Allpass2_traverse(Allpass2 *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->bw);    
-    Py_VISIT(self->bw_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->bw);
+    Py_VISIT(self->bw_stream);
     return 0;
 }
 
-static int 
+static int
 Allpass2_clear(Allpass2 *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->bw);    
-    Py_CLEAR(self->bw_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->bw);
+    Py_CLEAR(self->bw_stream);
     return 0;
 }
 
@@ -4677,7 +4677,7 @@ Allpass2_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *bwtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Allpass2 *self;
     self = (Allpass2 *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(1000);
     self->bw = PyFloat_FromDouble(100);
 	self->modebuffer[0] = 0;
@@ -4685,9 +4685,9 @@ Allpass2_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
     self->init = 1;
-    
+
     INIT_OBJECT_COMMON
-    
+
     self->oneOnSr = 1.0 / self->sr;
     self->nyquist = (MYFLT)self->sr * 0.49;
 
@@ -4695,30 +4695,30 @@ Allpass2_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = Allpass2_setProcMode;
 
     static char *kwlist[] = {"input", "freq", "bw", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOO", kwlist, &inputtmp, &freqtmp, &bwtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (bwtmp) {
         PyObject_CallMethod((PyObject *)self, "setBw", "O", bwtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -4726,10 +4726,10 @@ Allpass2_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Allpass2_getServer(Allpass2* self) { GET_SERVER };
 static PyObject * Allpass2_getStream(Allpass2* self) { GET_STREAM };
-static PyObject * Allpass2_setMul(Allpass2 *self, PyObject *arg) { SET_MUL };	
-static PyObject * Allpass2_setAdd(Allpass2 *self, PyObject *arg) { SET_ADD };	
-static PyObject * Allpass2_setSub(Allpass2 *self, PyObject *arg) { SET_SUB };	
-static PyObject * Allpass2_setDiv(Allpass2 *self, PyObject *arg) { SET_DIV };	
+static PyObject * Allpass2_setMul(Allpass2 *self, PyObject *arg) { SET_MUL };
+static PyObject * Allpass2_setAdd(Allpass2 *self, PyObject *arg) { SET_ADD };
+static PyObject * Allpass2_setSub(Allpass2 *self, PyObject *arg) { SET_SUB };
+static PyObject * Allpass2_setDiv(Allpass2 *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Allpass2_play(Allpass2 *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Allpass2_out(Allpass2 *self, PyObject *args, PyObject *kwds) { OUT };
@@ -4748,14 +4748,14 @@ static PyObject *
 Allpass2_setFreq(Allpass2 *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -4771,25 +4771,25 @@ Allpass2_setFreq(Allpass2 *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Allpass2_setBw(Allpass2 *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->bw);
@@ -4805,12 +4805,12 @@ Allpass2_setBw(Allpass2 *self, PyObject *arg)
         self->bw_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Allpass2_members[] = {
 {"server", T_OBJECT_EX, offsetof(Allpass2, server), 0, "Pyo server."},
@@ -4938,7 +4938,7 @@ typedef struct {
     PyObject *feedback;
     Stream *feedback_stream;
     int stages;
-    int modebuffer[6]; // need at least 2 slots for mul & add 
+    int modebuffer[6]; // need at least 2 slots for mul & add
     MYFLT halfSr;
     MYFLT minusPiOnSr;
     MYFLT twoPiOnSr;
@@ -4958,35 +4958,35 @@ Phaser_clip(MYFLT x) {
         return -1.0;
     else if (x > 1.0)
         return 1.0;
-    else 
+    else
         return x;
-}    
+}
 
 static void
 Phaser_compute_variables(Phaser *self, MYFLT freq, MYFLT spread, MYFLT q)
-{    
+{
     int i, ipart;
     MYFLT radius, angle, fr, qfactor, pos, fpart;
 
     qfactor = 1.0 / q * self->minusPiOnSr;
     fr = freq;
     for (i=0; i<self->stages; i++) {
-        if (fr <= 20) 
+        if (fr <= 20)
             fr = 20;
         else if (fr >= self->halfSr)
             fr = self->halfSr;
-    
+
         radius = MYPOW(E, fr * qfactor);
         angle = fr * self->twoPiOnSr;
-    
+
         self->alpha[i] = radius * radius;
-        
+
         pos = angle * self->norm_arr_pos;
         ipart = (int)pos;
         fpart = pos - ipart;
         self->beta[i] = -2.0 * radius * (HALF_COS_ARRAY[i] * (1.0 - fpart) + HALF_COS_ARRAY[i+1] * fpart);
         fr *= spread;
-    }    
+    }
 }
 
 static void
@@ -5007,7 +5007,7 @@ Phaser_filters_iii(Phaser *self) {
             }
             self->data[i] = self->tmp;
         }
-    }    
+    }
     else {
         MYFLT *feed = Stream_getData((Stream *)self->feedback_stream);
         for (i=0; i<self->bufsize; i++) {
@@ -5031,7 +5031,7 @@ Phaser_filters_aii(Phaser *self) {
     MYFLT *freq = Stream_getData((Stream *)self->freq_stream);
     MYFLT spread = PyFloat_AS_DOUBLE(self->spread);
     MYFLT q = PyFloat_AS_DOUBLE(self->q);
-    
+
     if (self->modebuffer[5] == 0) {
         MYFLT feed = Phaser_clip(PyFloat_AS_DOUBLE(self->feedback));
         for (i=0; i<self->bufsize; i++) {
@@ -5045,7 +5045,7 @@ Phaser_filters_aii(Phaser *self) {
             }
             self->data[i] = self->tmp;
         }
-    }    
+    }
     else {
         MYFLT *feed = Stream_getData((Stream *)self->feedback_stream);
         for (i=0; i<self->bufsize; i++) {
@@ -5070,7 +5070,7 @@ Phaser_filters_iai(Phaser *self) {
     MYFLT freq = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *spread = Stream_getData((Stream *)self->spread_stream);
     MYFLT q = PyFloat_AS_DOUBLE(self->q);
-    
+
     if (self->modebuffer[5] == 0) {
         MYFLT feed = Phaser_clip(PyFloat_AS_DOUBLE(self->feedback));
         for (i=0; i<self->bufsize; i++) {
@@ -5084,7 +5084,7 @@ Phaser_filters_iai(Phaser *self) {
             }
             self->data[i] = self->tmp;
         }
-    }    
+    }
     else {
         MYFLT *feed = Stream_getData((Stream *)self->feedback_stream);
         for (i=0; i<self->bufsize; i++) {
@@ -5109,7 +5109,7 @@ Phaser_filters_aai(Phaser *self) {
     MYFLT *freq = Stream_getData((Stream *)self->freq_stream);
     MYFLT *spread = Stream_getData((Stream *)self->spread_stream);
     MYFLT q = PyFloat_AS_DOUBLE(self->q);
-    
+
     if (self->modebuffer[5] == 0) {
         MYFLT feed = Phaser_clip(PyFloat_AS_DOUBLE(self->feedback));
         for (i=0; i<self->bufsize; i++) {
@@ -5123,7 +5123,7 @@ Phaser_filters_aai(Phaser *self) {
             }
             self->data[i] = self->tmp;
         }
-    }    
+    }
     else {
         MYFLT *feed = Stream_getData((Stream *)self->feedback_stream);
         for (i=0; i<self->bufsize; i++) {
@@ -5148,7 +5148,7 @@ Phaser_filters_iia(Phaser *self) {
     MYFLT freq = PyFloat_AS_DOUBLE(self->freq);
     MYFLT spread = PyFloat_AS_DOUBLE(self->spread);
     MYFLT *q = Stream_getData((Stream *)self->q_stream);
-    
+
     if (self->modebuffer[5] == 0) {
         MYFLT feed = Phaser_clip(PyFloat_AS_DOUBLE(self->feedback));
         for (i=0; i<self->bufsize; i++) {
@@ -5162,7 +5162,7 @@ Phaser_filters_iia(Phaser *self) {
             }
             self->data[i] = self->tmp;
         }
-    }    
+    }
     else {
         MYFLT *feed = Stream_getData((Stream *)self->feedback_stream);
         for (i=0; i<self->bufsize; i++) {
@@ -5187,7 +5187,7 @@ Phaser_filters_aia(Phaser *self) {
     MYFLT *freq = Stream_getData((Stream *)self->freq_stream);
     MYFLT spread = PyFloat_AS_DOUBLE(self->spread);
     MYFLT *q = Stream_getData((Stream *)self->q_stream);
-    
+
     if (self->modebuffer[5] == 0) {
         MYFLT feed = Phaser_clip(PyFloat_AS_DOUBLE(self->feedback));
         for (i=0; i<self->bufsize; i++) {
@@ -5201,7 +5201,7 @@ Phaser_filters_aia(Phaser *self) {
             }
             self->data[i] = self->tmp;
         }
-    }    
+    }
     else {
         MYFLT *feed = Stream_getData((Stream *)self->feedback_stream);
         for (i=0; i<self->bufsize; i++) {
@@ -5226,7 +5226,7 @@ Phaser_filters_iaa(Phaser *self) {
     MYFLT freq = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *spread = Stream_getData((Stream *)self->spread_stream);
     MYFLT *q = Stream_getData((Stream *)self->q_stream);
-    
+
     if (self->modebuffer[5] == 0) {
         MYFLT feed = Phaser_clip(PyFloat_AS_DOUBLE(self->feedback));
         for (i=0; i<self->bufsize; i++) {
@@ -5240,7 +5240,7 @@ Phaser_filters_iaa(Phaser *self) {
             }
             self->data[i] = self->tmp;
         }
-    }    
+    }
     else {
         MYFLT *feed = Stream_getData((Stream *)self->feedback_stream);
         for (i=0; i<self->bufsize; i++) {
@@ -5265,7 +5265,7 @@ Phaser_filters_aaa(Phaser *self) {
     MYFLT *freq = Stream_getData((Stream *)self->freq_stream);
     MYFLT *spread = Stream_getData((Stream *)self->spread_stream);
     MYFLT *q = Stream_getData((Stream *)self->q_stream);
-    
+
     if (self->modebuffer[5] == 0) {
         MYFLT feed = Phaser_clip(PyFloat_AS_DOUBLE(self->feedback));
         for (i=0; i<self->bufsize; i++) {
@@ -5279,7 +5279,7 @@ Phaser_filters_aaa(Phaser *self) {
             }
             self->data[i] = self->tmp;
         }
-    }    
+    }
     else {
         MYFLT *feed = Stream_getData((Stream *)self->feedback_stream);
         for (i=0; i<self->bufsize; i++) {
@@ -5312,69 +5312,69 @@ Phaser_setProcMode(Phaser *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10 + self->modebuffer[4] * 100;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             Phaser_compute_variables(self, PyFloat_AS_DOUBLE(self->freq), PyFloat_AS_DOUBLE(self->spread), PyFloat_AS_DOUBLE(self->q));
             self->proc_func_ptr = Phaser_filters_iii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Phaser_filters_aii;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Phaser_filters_iai;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Phaser_filters_aai;
             break;
-        case 100:    
+        case 100:
             self->proc_func_ptr = Phaser_filters_iia;
             break;
-        case 101:    
+        case 101:
             self->proc_func_ptr = Phaser_filters_aia;
             break;
-        case 110:        
+        case 110:
             self->proc_func_ptr = Phaser_filters_iaa;
             break;
-        case 111:    
+        case 111:
             self->proc_func_ptr = Phaser_filters_aaa;
-            break;            
-    } 
+            break;
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Phaser_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Phaser_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Phaser_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Phaser_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Phaser_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Phaser_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Phaser_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Phaser_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Phaser_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Phaser_compute_next_data_frame(Phaser *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -5384,31 +5384,31 @@ Phaser_traverse(Phaser *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->spread);    
-    Py_VISIT(self->spread_stream);    
-    Py_VISIT(self->q);    
-    Py_VISIT(self->q_stream);    
-    Py_VISIT(self->feedback);    
-    Py_VISIT(self->feedback_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->spread);
+    Py_VISIT(self->spread_stream);
+    Py_VISIT(self->q);
+    Py_VISIT(self->q_stream);
+    Py_VISIT(self->feedback);
+    Py_VISIT(self->feedback_stream);
     return 0;
 }
 
-static int 
+static int
 Phaser_clear(Phaser *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->spread);    
-    Py_CLEAR(self->spread_stream);    
-    Py_CLEAR(self->q);    
-    Py_CLEAR(self->q_stream);    
-    Py_CLEAR(self->feedback);    
-    Py_CLEAR(self->feedback_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->spread);
+    Py_CLEAR(self->spread_stream);
+    Py_CLEAR(self->q);
+    Py_CLEAR(self->q_stream);
+    Py_CLEAR(self->feedback);
+    Py_CLEAR(self->feedback_stream);
     return 0;
 }
 
@@ -5431,7 +5431,7 @@ Phaser_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *spreadtmp=NULL, *qtmp=NULL, *feedbacktmp=NULL, *multmp=NULL, *addtmp=NULL;
     Phaser *self;
     self = (Phaser *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(1000.0);
     self->spread = PyFloat_FromDouble(1.0);
     self->q = PyFloat_FromDouble(10.0);
@@ -5444,30 +5444,30 @@ Phaser_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[3] = 0;
 	self->modebuffer[4] = 0;
 	self->modebuffer[5] = 0;
-    
+
     INIT_OBJECT_COMMON
-    
+
     self->halfSr = (MYFLT)self->sr * 0.49;
     self->minusPiOnSr = -PI / self->sr;
     self->twoPiOnSr = TWOPI / self->sr;
     self->norm_arr_pos = 1.0 / PI * 512.0;
-    
+
     Stream_setFunctionPtr(self->stream, Phaser_compute_next_data_frame);
     self->mode_func_ptr = Phaser_setProcMode;
 
     static char *kwlist[] = {"input", "freq", "spread", "q", "feedback", "num", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOOiOO", kwlist, &inputtmp, &freqtmp, &spreadtmp, &qtmp, &feedbacktmp, &self->stages, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     self->y1 = (MYFLT *)realloc(self->y1, self->stages * sizeof(MYFLT));
     self->y2 = (MYFLT *)realloc(self->y2, self->stages * sizeof(MYFLT));
     self->alpha = (MYFLT *)realloc(self->alpha, self->stages * sizeof(MYFLT));
     self->beta = (MYFLT *)realloc(self->beta, self->stages * sizeof(MYFLT));
-    
-    
+
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
@@ -5475,7 +5475,7 @@ Phaser_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (spreadtmp) {
         PyObject_CallMethod((PyObject *)self, "setSpread", "O", spreadtmp);
     }
-    
+
     if (qtmp) {
         PyObject_CallMethod((PyObject *)self, "setQ", "O", qtmp);
     }
@@ -5483,19 +5483,19 @@ Phaser_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (feedbacktmp) {
         PyObject_CallMethod((PyObject *)self, "setFeedback", "O", feedbacktmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     for (i=0; i<self->stages; i++) {
         self->y1[i] = self->y2[i] = 0.0;
     }
@@ -5505,10 +5505,10 @@ Phaser_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Phaser_getServer(Phaser* self) { GET_SERVER };
 static PyObject * Phaser_getStream(Phaser* self) { GET_STREAM };
-static PyObject * Phaser_setMul(Phaser *self, PyObject *arg) { SET_MUL };	
-static PyObject * Phaser_setAdd(Phaser *self, PyObject *arg) { SET_ADD };	
-static PyObject * Phaser_setSub(Phaser *self, PyObject *arg) { SET_SUB };	
-static PyObject * Phaser_setDiv(Phaser *self, PyObject *arg) { SET_DIV };	
+static PyObject * Phaser_setMul(Phaser *self, PyObject *arg) { SET_MUL };
+static PyObject * Phaser_setAdd(Phaser *self, PyObject *arg) { SET_ADD };
+static PyObject * Phaser_setSub(Phaser *self, PyObject *arg) { SET_SUB };
+static PyObject * Phaser_setDiv(Phaser *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Phaser_play(Phaser *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Phaser_out(Phaser *self, PyObject *args, PyObject *kwds) { OUT };
@@ -5527,14 +5527,14 @@ static PyObject *
 Phaser_setFreq(Phaser *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -5550,25 +5550,25 @@ Phaser_setFreq(Phaser *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Phaser_setSpread(Phaser *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->spread);
@@ -5584,25 +5584,25 @@ Phaser_setSpread(Phaser *self, PyObject *arg)
         self->spread_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Phaser_setQ(Phaser *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->q);
@@ -5618,25 +5618,25 @@ Phaser_setQ(Phaser *self, PyObject *arg)
         self->q_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Phaser_setFeedback(Phaser *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->feedback);
@@ -5655,7 +5655,7 @@ Phaser_setFeedback(Phaser *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Phaser_members[] = {
     {"server", T_OBJECT_EX, offsetof(Phaser, server), 0, "Pyo server."},
@@ -5795,7 +5795,7 @@ typedef struct {
     int flag;
     MYFLT nyquist;
     MYFLT twoPiOnSr;
-    int modebuffer[6]; // need at least 2 slots for mul & add 
+    int modebuffer[6]; // need at least 2 slots for mul & add
     // sample memories
     MYFLT *y1;
     MYFLT *y2;
@@ -5832,24 +5832,24 @@ Vocoder_allocate_memories(Vocoder *self)
             self->yy1[i2j] = self->yy2[i2j] = self->y1[i2j] = self->y2[i2j] = 0.0;
         }
     }
-    self->flag = 1; 
+    self->flag = 1;
 }
 
 static void
 Vocoder_compute_variables(Vocoder *self, MYFLT base, MYFLT spread, MYFLT q)
-{    
+{
     int i;
     MYFLT w0, c, alpha, freq, invqfac;
-    
+
     invqfac = 1.0 / (2.0 * q);
 
     for (i=0; i<self->stages; i++) {
         freq = base * MYPOW(i+1, spread);
-        if (freq <= 10) 
+        if (freq <= 10)
             freq = 10.0;
         else if (freq >= self->nyquist)
             freq = self->nyquist;
-        
+
         w0 = self->twoPiOnSr * freq;
         c = MYCOS(w0);
         alpha = MYSIN(w0) * invqfac;
@@ -5860,21 +5860,21 @@ Vocoder_compute_variables(Vocoder *self, MYFLT base, MYFLT spread, MYFLT q)
         self->a2[i] = 1.0 - alpha;
     }
 }
-    
+
 static void
 Vocoder_filters_iii(Vocoder *self) {
     int i, j, j2;
     MYFLT vin, vout, vin2, vout2, w, w2, freq, spread, q, slope, output, amp;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *in2 = Stream_getData((Stream *)self->input2_stream);
-    
+
     freq = PyFloat_AS_DOUBLE(self->freq);
     spread = PyFloat_AS_DOUBLE(self->spread);
     q = PyFloat_AS_DOUBLE(self->q);
     if (q < 0.1)
         q = 0.1;
     amp = q * 10.0;
-    
+
     if (self->modebuffer[5] == 0)
         slope = PyFloat_AS_DOUBLE(self->slope);
     else
@@ -5896,7 +5896,7 @@ Vocoder_filters_iii(Vocoder *self) {
         self->flag = 0;
         Vocoder_compute_variables(self, freq, spread, q);
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         output = 0.0;
         vin = in[i];
@@ -5908,26 +5908,26 @@ Vocoder_filters_iii(Vocoder *self) {
             vout = (self->b0[j] * w) + (self->b2[j] * self->y2[j2]);
             self->y2[j2] = self->y1[j2];
             self->y1[j2] = w;
-            
+
             /* Exciter part filter 1 */
             w2 = ( vin2 - (self->a1[j] * self->yy1[j2]) - (self->a2[j] * self->yy2[j2]) ) * self->a0[j];
             vout2 = (self->b0[j] * w2) + (self->b2[j] * self->yy2[j2]);
             self->yy2[j2] = self->yy1[j2];
             self->yy1[j2] = w2;
-            
+
             j2++;
             /* Analysis part filter 2 */
             w = ( vout - (self->a1[j] * self->y1[j2]) - (self->a2[j] * self->y2[j2]) ) * self->a0[j];
             vout = (self->b0[j] * w) + (self->b2[j] * self->y2[j2]);
             self->y2[j2] = self->y1[j2];
             self->y1[j2] = w;
-            
+
             /* Exciter part filter 2 */
             w2 = ( vout2 - (self->a1[j] * self->yy1[j2]) - (self->a2[j] * self->yy2[j2]) ) * self->a0[j];
             vout2 = (self->b0[j] * w2) + (self->b2[j] * self->yy2[j2]);
             self->yy2[j2] = self->yy1[j2];
             self->yy1[j2] = w2;
-            
+
             /* Follower */
             if (vout < 0.0)
                 vout = -vout;
@@ -5953,7 +5953,7 @@ Vocoder_filters_aii(Vocoder *self) {
     if (q < 0.1)
         q = 0.1;
     amp = q * 10.0;
-        
+
     if (self->modebuffer[5] == 0)
         slope = PyFloat_AS_DOUBLE(self->slope);
     else
@@ -5966,7 +5966,7 @@ Vocoder_filters_aii(Vocoder *self) {
         self->last_slope = slope;
         self->factor = MYEXP(-1.0 / (self->sr / ((slope * 48.0) + 2.0)));
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (count == 0)
             freq = fr[i];
@@ -5991,26 +5991,26 @@ Vocoder_filters_aii(Vocoder *self) {
             vout = (self->b0[j] * w) + (self->b2[j] * self->y2[j2]);
             self->y2[j2] = self->y1[j2];
             self->y1[j2] = w;
-                        
+
             /* Exciter part filter 1 */
             w2 = ( vin2 - (self->a1[j] * self->yy1[j2]) - (self->a2[j] * self->yy2[j2]) ) * self->a0[j];
             vout2 = (self->b0[j] * w2) + (self->b2[j] * self->yy2[j2]);
             self->yy2[j2] = self->yy1[j2];
             self->yy1[j2] = w2;
-            
+
             j2++;
             /* Analysis part filter 2 */
             w = ( vout - (self->a1[j] * self->y1[j2]) - (self->a2[j] * self->y2[j2]) ) * self->a0[j];
             vout = (self->b0[j] * w) + (self->b2[j] * self->y2[j2]);
             self->y2[j2] = self->y1[j2];
             self->y1[j2] = w;
-            
+
             /* Exciter part filter 2 */
             w2 = ( vout2 - (self->a1[j] * self->yy1[j2]) - (self->a2[j] * self->yy2[j2]) ) * self->a0[j];
             vout2 = (self->b0[j] * w2) + (self->b2[j] * self->yy2[j2]);
             self->yy2[j2] = self->yy1[j2];
             self->yy1[j2] = w2;
-            
+
             /* Follower */
             if (vout < 0.0)
                 vout = -vout;
@@ -6028,7 +6028,7 @@ Vocoder_filters_iai(Vocoder *self) {
     MYFLT vin, vout, vin2, vout2, w, w2, freq, q, slope, output, amp;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *in2 = Stream_getData((Stream *)self->input2_stream);
-    
+
     freq = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *sprd = Stream_getData((Stream *)self->spread_stream);
     MYFLT spread = sprd[0];
@@ -6036,7 +6036,7 @@ Vocoder_filters_iai(Vocoder *self) {
     if (q < 0.1)
         q = 0.1;
     amp = q * 10.0;
-    
+
     if (self->modebuffer[5] == 0)
         slope = PyFloat_AS_DOUBLE(self->slope);
     else
@@ -6049,7 +6049,7 @@ Vocoder_filters_iai(Vocoder *self) {
         self->last_slope = slope;
         self->factor = MYEXP(-1.0 / (self->sr / ((slope * 48.0) + 2.0)));
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (count == 0)
             spread = sprd[i];
@@ -6074,26 +6074,26 @@ Vocoder_filters_iai(Vocoder *self) {
             vout = (self->b0[j] * w) + (self->b2[j] * self->y2[j2]);
             self->y2[j2] = self->y1[j2];
             self->y1[j2] = w;
-            
+
             /* Exciter part filter 1 */
             w2 = ( vin2 - (self->a1[j] * self->yy1[j2]) - (self->a2[j] * self->yy2[j2]) ) * self->a0[j];
             vout2 = (self->b0[j] * w2) + (self->b2[j] * self->yy2[j2]);
             self->yy2[j2] = self->yy1[j2];
             self->yy1[j2] = w2;
-            
+
             j2++;
             /* Analysis part filter 2 */
             w = ( vout - (self->a1[j] * self->y1[j2]) - (self->a2[j] * self->y2[j2]) ) * self->a0[j];
             vout = (self->b0[j] * w) + (self->b2[j] * self->y2[j2]);
             self->y2[j2] = self->y1[j2];
             self->y1[j2] = w;
-            
+
             /* Exciter part filter 2 */
             w2 = ( vout2 - (self->a1[j] * self->yy1[j2]) - (self->a2[j] * self->yy2[j2]) ) * self->a0[j];
             vout2 = (self->b0[j] * w2) + (self->b2[j] * self->yy2[j2]);
             self->yy2[j2] = self->yy1[j2];
             self->yy1[j2] = w2;
-            
+
             /* Follower */
             if (vout < 0.0)
                 vout = -vout;
@@ -6101,7 +6101,7 @@ Vocoder_filters_iai(Vocoder *self) {
             output += vout2 * self->follow[j];
         }
         self->data[i] = output * amp;
-    }    
+    }
 }
 
 static void
@@ -6111,7 +6111,7 @@ Vocoder_filters_aai(Vocoder *self) {
     MYFLT vin, vout, vin2, vout2, w, w2, q, slope, output, amp;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *in2 = Stream_getData((Stream *)self->input2_stream);
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT freq = fr[0];
     MYFLT *sprd = Stream_getData((Stream *)self->spread_stream);
@@ -6120,7 +6120,7 @@ Vocoder_filters_aai(Vocoder *self) {
     if (q < 0.1)
         q = 0.1;
     amp = q * 10.0;
-    
+
     if (self->modebuffer[5] == 0)
         slope = PyFloat_AS_DOUBLE(self->slope);
     else
@@ -6133,7 +6133,7 @@ Vocoder_filters_aai(Vocoder *self) {
         self->last_slope = slope;
         self->factor = MYEXP(-1.0 / (self->sr / ((slope * 48.0) + 2.0)));
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (count == 0) {
             freq = fr[i];
@@ -6160,26 +6160,26 @@ Vocoder_filters_aai(Vocoder *self) {
             vout = (self->b0[j] * w) + (self->b2[j] * self->y2[j2]);
             self->y2[j2] = self->y1[j2];
             self->y1[j2] = w;
-            
+
             /* Exciter part filter 1 */
             w2 = ( vin2 - (self->a1[j] * self->yy1[j2]) - (self->a2[j] * self->yy2[j2]) ) * self->a0[j];
             vout2 = (self->b0[j] * w2) + (self->b2[j] * self->yy2[j2]);
             self->yy2[j2] = self->yy1[j2];
             self->yy1[j2] = w2;
-            
+
             j2++;
             /* Analysis part filter 2 */
             w = ( vout - (self->a1[j] * self->y1[j2]) - (self->a2[j] * self->y2[j2]) ) * self->a0[j];
             vout = (self->b0[j] * w) + (self->b2[j] * self->y2[j2]);
             self->y2[j2] = self->y1[j2];
             self->y1[j2] = w;
-            
+
             /* Exciter part filter 2 */
             w2 = ( vout2 - (self->a1[j] * self->yy1[j2]) - (self->a2[j] * self->yy2[j2]) ) * self->a0[j];
             vout2 = (self->b0[j] * w2) + (self->b2[j] * self->yy2[j2]);
             self->yy2[j2] = self->yy1[j2];
             self->yy1[j2] = w2;
-            
+
             /* Follower */
             if (vout < 0.0)
                 vout = -vout;
@@ -6187,7 +6187,7 @@ Vocoder_filters_aai(Vocoder *self) {
             output += vout2 * self->follow[j];
         }
         self->data[i] = output * amp;
-    }    
+    }
 }
 
 static void
@@ -6197,7 +6197,7 @@ Vocoder_filters_iia(Vocoder *self) {
     MYFLT vin, vout, vin2, vout2, w, w2, freq, spread, slope, output, amp = 1.0;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *in2 = Stream_getData((Stream *)self->input2_stream);
-    
+
     freq = PyFloat_AS_DOUBLE(self->freq);
     spread = PyFloat_AS_DOUBLE(self->spread);
     MYFLT *qstr = Stream_getData((Stream *)self->q_stream);
@@ -6214,13 +6214,13 @@ Vocoder_filters_iia(Vocoder *self) {
         self->last_slope = slope;
         self->factor = MYEXP(-1.0 / (self->sr / ((slope * 48.0) + 2.0)));
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (count == 0) {
             q = qstr[i];
             if (q < 0.1)
                 q = 0.1;
-            amp = q * 10.0;            
+            amp = q * 10.0;
         }
         else if (count >= maxcount)
             count = 0;
@@ -6243,26 +6243,26 @@ Vocoder_filters_iia(Vocoder *self) {
             vout = (self->b0[j] * w) + (self->b2[j] * self->y2[j2]);
             self->y2[j2] = self->y1[j2];
             self->y1[j2] = w;
-            
+
             /* Exciter part filter 1 */
             w2 = ( vin2 - (self->a1[j] * self->yy1[j2]) - (self->a2[j] * self->yy2[j2]) ) * self->a0[j];
             vout2 = (self->b0[j] * w2) + (self->b2[j] * self->yy2[j2]);
             self->yy2[j2] = self->yy1[j2];
             self->yy1[j2] = w2;
-            
+
             j2++;
             /* Analysis part filter 2 */
             w = ( vout - (self->a1[j] * self->y1[j2]) - (self->a2[j] * self->y2[j2]) ) * self->a0[j];
             vout = (self->b0[j] * w) + (self->b2[j] * self->y2[j2]);
             self->y2[j2] = self->y1[j2];
             self->y1[j2] = w;
-            
+
             /* Exciter part filter 2 */
             w2 = ( vout2 - (self->a1[j] * self->yy1[j2]) - (self->a2[j] * self->yy2[j2]) ) * self->a0[j];
             vout2 = (self->b0[j] * w2) + (self->b2[j] * self->yy2[j2]);
             self->yy2[j2] = self->yy1[j2];
             self->yy1[j2] = w2;
-            
+
             /* Follower */
             if (vout < 0.0)
                 vout = -vout;
@@ -6270,7 +6270,7 @@ Vocoder_filters_iia(Vocoder *self) {
             output += vout2 * self->follow[j];
         }
         self->data[i] = output * amp;
-    }    
+    }
 }
 
 static void
@@ -6280,7 +6280,7 @@ Vocoder_filters_aia(Vocoder *self) {
     MYFLT vin, vout, vin2, vout2, w, w2, spread, slope, output, amp = 1.0;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *in2 = Stream_getData((Stream *)self->input2_stream);
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT freq = fr[0];
     spread = PyFloat_AS_DOUBLE(self->spread);
@@ -6298,14 +6298,14 @@ Vocoder_filters_aia(Vocoder *self) {
         self->last_slope = slope;
         self->factor = MYEXP(-1.0 / (self->sr / ((slope * 48.0) + 2.0)));
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (count == 0) {
             freq = fr[i];
             q = qstr[i];
             if (q < 0.1)
                 q = 0.1;
-            amp = q * 10.0;            
+            amp = q * 10.0;
         }
         else if (count >= maxcount)
             count = 0;
@@ -6328,26 +6328,26 @@ Vocoder_filters_aia(Vocoder *self) {
             vout = (self->b0[j] * w) + (self->b2[j] * self->y2[j2]);
             self->y2[j2] = self->y1[j2];
             self->y1[j2] = w;
-            
+
             /* Exciter part filter 1 */
             w2 = ( vin2 - (self->a1[j] * self->yy1[j2]) - (self->a2[j] * self->yy2[j2]) ) * self->a0[j];
             vout2 = (self->b0[j] * w2) + (self->b2[j] * self->yy2[j2]);
             self->yy2[j2] = self->yy1[j2];
             self->yy1[j2] = w2;
-            
+
             j2++;
             /* Analysis part filter 2 */
             w = ( vout - (self->a1[j] * self->y1[j2]) - (self->a2[j] * self->y2[j2]) ) * self->a0[j];
             vout = (self->b0[j] * w) + (self->b2[j] * self->y2[j2]);
             self->y2[j2] = self->y1[j2];
             self->y1[j2] = w;
-            
+
             /* Exciter part filter 2 */
             w2 = ( vout2 - (self->a1[j] * self->yy1[j2]) - (self->a2[j] * self->yy2[j2]) ) * self->a0[j];
             vout2 = (self->b0[j] * w2) + (self->b2[j] * self->yy2[j2]);
             self->yy2[j2] = self->yy1[j2];
             self->yy1[j2] = w2;
-            
+
             /* Follower */
             if (vout < 0.0)
                 vout = -vout;
@@ -6355,7 +6355,7 @@ Vocoder_filters_aia(Vocoder *self) {
             output += vout2 * self->follow[j];
         }
         self->data[i] = output * amp;
-    }    
+    }
 }
 
 static void
@@ -6365,7 +6365,7 @@ Vocoder_filters_iaa(Vocoder *self) {
     MYFLT vin, vout, vin2, vout2, w, w2, freq, slope, output, amp = 1.0;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *in2 = Stream_getData((Stream *)self->input2_stream);
-    
+
     freq = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *sprd = Stream_getData((Stream *)self->spread_stream);
     MYFLT spread = sprd[0];
@@ -6383,14 +6383,14 @@ Vocoder_filters_iaa(Vocoder *self) {
         self->last_slope = slope;
         self->factor = MYEXP(-1.0 / (self->sr / ((slope * 48.0) + 2.0)));
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (count == 0) {
             spread = sprd[i];
             q = qstr[i];
             if (q < 0.1)
                 q = 0.1;
-            amp = q * 10.0;            
+            amp = q * 10.0;
         }
         else if (count >= maxcount)
             count = 0;
@@ -6413,26 +6413,26 @@ Vocoder_filters_iaa(Vocoder *self) {
             vout = (self->b0[j] * w) + (self->b2[j] * self->y2[j2]);
             self->y2[j2] = self->y1[j2];
             self->y1[j2] = w;
-            
+
             /* Exciter part filter 1 */
             w2 = ( vin2 - (self->a1[j] * self->yy1[j2]) - (self->a2[j] * self->yy2[j2]) ) * self->a0[j];
             vout2 = (self->b0[j] * w2) + (self->b2[j] * self->yy2[j2]);
             self->yy2[j2] = self->yy1[j2];
             self->yy1[j2] = w2;
-            
+
             j2++;
             /* Analysis part filter 2 */
             w = ( vout - (self->a1[j] * self->y1[j2]) - (self->a2[j] * self->y2[j2]) ) * self->a0[j];
             vout = (self->b0[j] * w) + (self->b2[j] * self->y2[j2]);
             self->y2[j2] = self->y1[j2];
             self->y1[j2] = w;
-            
+
             /* Exciter part filter 2 */
             w2 = ( vout2 - (self->a1[j] * self->yy1[j2]) - (self->a2[j] * self->yy2[j2]) ) * self->a0[j];
             vout2 = (self->b0[j] * w2) + (self->b2[j] * self->yy2[j2]);
             self->yy2[j2] = self->yy1[j2];
             self->yy1[j2] = w2;
-            
+
             /* Follower */
             if (vout < 0.0)
                 vout = -vout;
@@ -6440,7 +6440,7 @@ Vocoder_filters_iaa(Vocoder *self) {
             output += vout2 * self->follow[j];
         }
         self->data[i] = output * amp;
-    }    
+    }
 }
 
 static void
@@ -6450,7 +6450,7 @@ Vocoder_filters_aaa(Vocoder *self) {
     MYFLT vin, vout, vin2, vout2, w, w2, slope, output, amp = 1.0;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *in2 = Stream_getData((Stream *)self->input2_stream);
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT freq = fr[0];
     MYFLT *sprd = Stream_getData((Stream *)self->spread_stream);
@@ -6469,7 +6469,7 @@ Vocoder_filters_aaa(Vocoder *self) {
         self->last_slope = slope;
         self->factor = MYEXP(-1.0 / (self->sr / ((slope * 99.0) + 1.0)));
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (count == 0) {
             freq = fr[i];
@@ -6477,7 +6477,7 @@ Vocoder_filters_aaa(Vocoder *self) {
             q = qstr[i];
             if (q < 0.1)
                 q = 0.1;
-            amp = q * 10.0;            
+            amp = q * 10.0;
         }
         else if (count >= maxcount)
             count = 0;
@@ -6500,26 +6500,26 @@ Vocoder_filters_aaa(Vocoder *self) {
             vout = (self->b0[j] * w) + (self->b2[j] * self->y2[j2]);
             self->y2[j2] = self->y1[j2];
             self->y1[j2] = w;
-            
+
             /* Exciter part filter 1 */
             w2 = ( vin2 - (self->a1[j] * self->yy1[j2]) - (self->a2[j] * self->yy2[j2]) ) * self->a0[j];
             vout2 = (self->b0[j] * w2) + (self->b2[j] * self->yy2[j2]);
             self->yy2[j2] = self->yy1[j2];
             self->yy1[j2] = w2;
-            
+
             j2++;
             /* Analysis part filter 2 */
             w = ( vout - (self->a1[j] * self->y1[j2]) - (self->a2[j] * self->y2[j2]) ) * self->a0[j];
             vout = (self->b0[j] * w) + (self->b2[j] * self->y2[j2]);
             self->y2[j2] = self->y1[j2];
             self->y1[j2] = w;
-            
+
             /* Exciter part filter 2 */
             w2 = ( vout2 - (self->a1[j] * self->yy1[j2]) - (self->a2[j] * self->yy2[j2]) ) * self->a0[j];
             vout2 = (self->b0[j] * w2) + (self->b2[j] * self->yy2[j2]);
             self->yy2[j2] = self->yy1[j2];
             self->yy1[j2] = w2;
-            
+
             /* Follower */
             if (vout < 0.0)
                 vout = -vout;
@@ -6527,7 +6527,7 @@ Vocoder_filters_aaa(Vocoder *self) {
             output += vout2 * self->follow[j];
         }
         self->data[i] = output * amp;
-    }    
+    }
 }
 
 static void Vocoder_postprocessing_ii(Vocoder *self) { POST_PROCESSING_II };
@@ -6548,66 +6548,66 @@ Vocoder_setProcMode(Vocoder *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Vocoder_filters_iii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Vocoder_filters_aii;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Vocoder_filters_iai;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Vocoder_filters_aai;
             break;
-        case 100:    
+        case 100:
             self->proc_func_ptr = Vocoder_filters_iia;
             break;
-        case 101:    
+        case 101:
             self->proc_func_ptr = Vocoder_filters_aia;
             break;
-        case 110:        
+        case 110:
             self->proc_func_ptr = Vocoder_filters_iaa;
             break;
-        case 111:    
+        case 111:
             self->proc_func_ptr = Vocoder_filters_aaa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Vocoder_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Vocoder_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Vocoder_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Vocoder_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Vocoder_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Vocoder_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Vocoder_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Vocoder_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Vocoder_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Vocoder_compute_next_data_frame(Vocoder *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -6619,18 +6619,18 @@ Vocoder_traverse(Vocoder *self, visitproc visit, void *arg)
     Py_VISIT(self->input_stream);
     Py_VISIT(self->input2);
     Py_VISIT(self->input2_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->spread);    
-    Py_VISIT(self->spread_stream);    
-    Py_VISIT(self->q);    
-    Py_VISIT(self->q_stream);    
-    Py_VISIT(self->slope);    
-    Py_VISIT(self->slope_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->spread);
+    Py_VISIT(self->spread_stream);
+    Py_VISIT(self->q);
+    Py_VISIT(self->q_stream);
+    Py_VISIT(self->slope);
+    Py_VISIT(self->slope_stream);
     return 0;
 }
 
-static int 
+static int
 Vocoder_clear(Vocoder *self)
 {
     pyo_CLEAR
@@ -6638,12 +6638,12 @@ Vocoder_clear(Vocoder *self)
     Py_CLEAR(self->input_stream);
     Py_CLEAR(self->input2);
     Py_CLEAR(self->input2_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
     Py_CLEAR(self->spread);
     Py_CLEAR(self->spread_stream);
-    Py_CLEAR(self->q);    
-    Py_CLEAR(self->q_stream);    
+    Py_CLEAR(self->q);
+    Py_CLEAR(self->q_stream);
     Py_CLEAR(self->slope);
     Py_CLEAR(self->slope_stream);
     return 0;
@@ -6674,7 +6674,7 @@ Vocoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *input2tmp, *input2_streamtmp, *freqtmp=NULL, *spreadtmp=NULL, *qtmp=NULL, *slopetmp=NULL, *multmp=NULL, *addtmp=NULL;
     Vocoder *self;
     self = (Vocoder *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(60);
     self->spread = PyFloat_FromDouble(1.25);
     self->q = PyFloat_FromDouble(20);
@@ -6690,33 +6690,33 @@ Vocoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[3] = 0;
 	self->modebuffer[4] = 0;
 	self->modebuffer[5] = 0;
-    
+
     INIT_OBJECT_COMMON
-    
+
     self->nyquist = (MYFLT)self->sr * 0.49;
     self->twoPiOnSr = (MYFLT)(TWOPI / self->sr);
-    
+
     Stream_setFunctionPtr(self->stream, Vocoder_compute_next_data_frame);
     self->mode_func_ptr = Vocoder_setProcMode;
 
     static char *kwlist[] = {"input", "input2", "freq", "spread", "q", "slope", "stages", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OOOOiOO", kwlist, &inputtmp, &input2tmp, &freqtmp, &spreadtmp, &qtmp, &slopetmp, &self->stages, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     if ( PyObject_HasAttrString((PyObject *)input2tmp, "server") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"input2\" argument of Vocoder must be a PyoObject.\n");
         Py_RETURN_NONE;
-    }    
+    }
     Py_XDECREF(self->input2);
     self->input2 = input2tmp;
     input2_streamtmp = PyObject_CallMethod((PyObject *)self->input2, "_getStream", NULL);
     Py_INCREF(input2_streamtmp);
     Py_XDECREF(self->input2_stream);
     self->input2_stream = (Stream *)input2_streamtmp;
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
@@ -6724,7 +6724,7 @@ Vocoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (spreadtmp) {
         PyObject_CallMethod((PyObject *)self, "setSpread", "O", spreadtmp);
     }
-    
+
     if (qtmp) {
         PyObject_CallMethod((PyObject *)self, "setQ", "O", qtmp);
     }
@@ -6732,19 +6732,19 @@ Vocoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (slopetmp) {
         PyObject_CallMethod((PyObject *)self, "setSlope", "O", slopetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     Vocoder_allocate_memories(self);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -6752,10 +6752,10 @@ Vocoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Vocoder_getServer(Vocoder* self) { GET_SERVER };
 static PyObject * Vocoder_getStream(Vocoder* self) { GET_STREAM };
-static PyObject * Vocoder_setMul(Vocoder *self, PyObject *arg) { SET_MUL };	
-static PyObject * Vocoder_setAdd(Vocoder *self, PyObject *arg) { SET_ADD };	
-static PyObject * Vocoder_setSub(Vocoder *self, PyObject *arg) { SET_SUB };	
-static PyObject * Vocoder_setDiv(Vocoder *self, PyObject *arg) { SET_DIV };	
+static PyObject * Vocoder_setMul(Vocoder *self, PyObject *arg) { SET_MUL };
+static PyObject * Vocoder_setAdd(Vocoder *self, PyObject *arg) { SET_ADD };
+static PyObject * Vocoder_setSub(Vocoder *self, PyObject *arg) { SET_SUB };
+static PyObject * Vocoder_setDiv(Vocoder *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Vocoder_play(Vocoder *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Vocoder_out(Vocoder *self, PyObject *args, PyObject *kwds) { OUT };
@@ -6774,14 +6774,14 @@ static PyObject *
 Vocoder_setFreq(Vocoder *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -6797,25 +6797,25 @@ Vocoder_setFreq(Vocoder *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Vocoder_setSpread(Vocoder *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->spread);
@@ -6831,25 +6831,25 @@ Vocoder_setSpread(Vocoder *self, PyObject *arg)
         self->spread_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Vocoder_setQ(Vocoder *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->q);
@@ -6865,25 +6865,25 @@ Vocoder_setQ(Vocoder *self, PyObject *arg)
         self->q_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Vocoder_setSlope(Vocoder *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->slope);
@@ -6899,32 +6899,32 @@ Vocoder_setSlope(Vocoder *self, PyObject *arg)
         self->slope_stream = (Stream *)streamtmp;
 		self->modebuffer[5] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Vocoder_setStages(Vocoder *self, PyObject *arg)
 {
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		self->stages = PyInt_AsLong(arg);
         Vocoder_allocate_memories(self);
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Vocoder_members[] = {
     {"server", T_OBJECT_EX, offsetof(Vocoder, server), 0, "Pyo server."},
@@ -7052,7 +7052,7 @@ typedef struct {
     Stream *q_stream;
     PyObject *type;
     Stream *type_stream;
-    int modebuffer[5]; // need at least 2 slots for mul & add 
+    int modebuffer[5]; // need at least 2 slots for mul & add
     MYFLT srOverSix;
     MYFLT last_freq;
     MYFLT piOverSr;
@@ -7073,21 +7073,21 @@ SVF_filters_iii(SVF *self) {
     freq = PyFloat_AS_DOUBLE(self->freq);
     q = PyFloat_AS_DOUBLE(self->q);
     type = PyFloat_AS_DOUBLE(self->type);
-    
+
     if (freq < 0.1)
         freq = 0.1;
     else if (freq > self->srOverSix)
         freq = self->srOverSix;
-    
+
     if (freq != self->last_freq) {
         self->last_freq = freq;
         self->w = 2.0 * MYSIN(freq * self->piOverSr);
     }
-    
+
     if (q < 0.5)
         q = 0.5;
     q1 = 1.0 / q;
-    
+
     if (type < 0.0)
         type = 0.0;
     else if (type > 1.0)
@@ -7124,7 +7124,7 @@ SVF_filters_aii(SVF *self) {
     if (q < 0.5)
         q = 0.5;
     q1 = 1.0 / q;
-    
+
     if (type < 0.0)
         type = 0.0;
     else if (type > 1.0)
@@ -7139,7 +7139,7 @@ SVF_filters_aii(SVF *self) {
             freq = 0.1;
         else if (freq > self->srOverSix)
             freq = self->srOverSix;
-        
+
         if (freq != self->last_freq) {
             self->last_freq = freq;
             self->w = 2.0 * MYSIN(freq * self->piOverSr);
@@ -7167,12 +7167,12 @@ SVF_filters_iai(SVF *self) {
     freq = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *qst = Stream_getData((Stream *)self->q_stream);
     type = PyFloat_AS_DOUBLE(self->type);
-    
+
     if (freq < 0.1)
         freq = 0.1;
     else if (freq > self->srOverSix)
         freq = self->srOverSix;
-    
+
     if (freq != self->last_freq) {
         self->last_freq = freq;
         self->w = 2.0 * MYSIN(freq * self->piOverSr);
@@ -7214,7 +7214,7 @@ SVF_filters_aai(SVF *self) {
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT *qst = Stream_getData((Stream *)self->q_stream);
     type = PyFloat_AS_DOUBLE(self->type);
-    
+
     if (type < 0.0)
         type = 0.0;
     else if (type > 1.0)
@@ -7230,7 +7230,7 @@ SVF_filters_aai(SVF *self) {
             freq = 0.1;
         else if (freq > self->srOverSix)
             freq = self->srOverSix;
-        
+
         if (freq != self->last_freq) {
             self->last_freq = freq;
             self->w = 2.0 * MYSIN(freq * self->piOverSr);
@@ -7261,17 +7261,17 @@ SVF_filters_iia(SVF *self) {
     freq = PyFloat_AS_DOUBLE(self->freq);
     q = PyFloat_AS_DOUBLE(self->q);
     MYFLT *tp = Stream_getData((Stream *)self->type_stream);
-    
+
     if (freq < 0.1)
         freq = 0.1;
     else if (freq > self->srOverSix)
         freq = self->srOverSix;
-    
+
     if (freq != self->last_freq) {
         self->last_freq = freq;
         self->w = 2.0 * MYSIN(freq * self->piOverSr);
     }
-    
+
     if (q < 0.5)
         q = 0.5;
     q1 = 1.0 / q;
@@ -7320,7 +7320,7 @@ SVF_filters_aia(SVF *self) {
             freq = 0.1;
         else if (freq > self->srOverSix)
             freq = self->srOverSix;
-        
+
         if (freq != self->last_freq) {
             self->last_freq = freq;
             self->w = 2.0 * MYSIN(freq * self->piOverSr);
@@ -7331,7 +7331,7 @@ SVF_filters_aia(SVF *self) {
             type = 1.0;
         lowgain = (type <= 0.5) ? (0.5 - type) : 0.0;
         highgain = (type >= 0.5) ? (type - 0.5) : 0.0;
-        bandgain = (type <= 0.5) ? type : (1.0 - type);        
+        bandgain = (type <= 0.5) ? type : (1.0 - type);
         low = self->y2 + self->w * self->y1;
         high = in[i] - low - q1 * self->y1;
         band = self->w * high + self->y1;
@@ -7355,12 +7355,12 @@ SVF_filters_iaa(SVF *self) {
     freq = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *qst = Stream_getData((Stream *)self->q_stream);
     MYFLT *tp = Stream_getData((Stream *)self->type_stream);
-    
+
     if (freq < 0.1)
         freq = 0.1;
     else if (freq > self->srOverSix)
         freq = self->srOverSix;
-    
+
     if (freq != self->last_freq) {
         self->last_freq = freq;
         self->w = 2.0 * MYSIN(freq * self->piOverSr);
@@ -7411,7 +7411,7 @@ SVF_filters_aaa(SVF *self) {
             freq = 0.1;
         else if (freq > self->srOverSix)
             freq = self->srOverSix;
-        
+
         if (freq != self->last_freq) {
             self->last_freq = freq;
             self->w = 2.0 * MYSIN(freq * self->piOverSr);
@@ -7425,7 +7425,7 @@ SVF_filters_aaa(SVF *self) {
             type = 1.0;
         lowgain = (type <= 0.5) ? (0.5 - type) : 0.0;
         highgain = (type >= 0.5) ? (type - 0.5) : 0.0;
-        bandgain = (type <= 0.5) ? type : (1.0 - type);        
+        bandgain = (type <= 0.5) ? type : (1.0 - type);
         low = self->y2 + self->w * self->y1;
         high = in[i] - low - q1 * self->y1;
         band = self->w * high + self->y1;
@@ -7457,68 +7457,68 @@ SVF_setProcMode(SVF *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10 + self->modebuffer[4] * 100;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = SVF_filters_iii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = SVF_filters_aii;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = SVF_filters_iai;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = SVF_filters_aai;
             break;
-        case 100:    
+        case 100:
             self->proc_func_ptr = SVF_filters_iia;
             break;
-        case 101:    
+        case 101:
             self->proc_func_ptr = SVF_filters_aia;
             break;
-        case 110:        
+        case 110:
             self->proc_func_ptr = SVF_filters_iaa;
             break;
-        case 111:    
+        case 111:
             self->proc_func_ptr = SVF_filters_aaa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = SVF_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = SVF_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = SVF_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = SVF_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = SVF_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = SVF_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = SVF_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = SVF_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = SVF_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 SVF_compute_next_data_frame(SVF *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -7528,27 +7528,27 @@ SVF_traverse(SVF *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->q);    
-    Py_VISIT(self->q_stream);    
-    Py_VISIT(self->type);    
-    Py_VISIT(self->type_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->q);
+    Py_VISIT(self->q_stream);
+    Py_VISIT(self->type);
+    Py_VISIT(self->type_stream);
     return 0;
 }
 
-static int 
+static int
 SVF_clear(SVF *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->q);    
-    Py_CLEAR(self->q_stream);    
-    Py_CLEAR(self->type);    
-    Py_CLEAR(self->type_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->q);
+    Py_CLEAR(self->q_stream);
+    Py_CLEAR(self->type);
+    Py_CLEAR(self->type_stream);
     return 0;
 }
 
@@ -7567,7 +7567,7 @@ SVF_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *qtmp=NULL, *typetmp=NULL, *multmp=NULL, *addtmp=NULL;
     SVF *self;
     self = (SVF *)type->tp_alloc(type, 0);
-        
+
     self->freq = PyFloat_FromDouble(1000);
     self->q = PyFloat_FromDouble(1);
     self->type = PyFloat_FromDouble(0);
@@ -7580,10 +7580,10 @@ SVF_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->last_freq = -1.0;
 
     INIT_OBJECT_COMMON
-    
+
     self->srOverSix = (MYFLT)self->sr / 6.0;
     self->piOverSr = PI / self->sr;
-    
+
     Stream_setFunctionPtr(self->stream, SVF_compute_next_data_frame);
     self->mode_func_ptr = SVF_setProcMode;
 
@@ -7593,7 +7593,7 @@ SVF_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
@@ -7605,7 +7605,7 @@ SVF_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (typetmp) {
         PyObject_CallMethod((PyObject *)self, "setType", "O", typetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
@@ -7613,7 +7613,7 @@ SVF_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-            
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
@@ -7623,10 +7623,10 @@ SVF_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * SVF_getServer(SVF* self) { GET_SERVER };
 static PyObject * SVF_getStream(SVF* self) { GET_STREAM };
-static PyObject * SVF_setMul(SVF *self, PyObject *arg) { SET_MUL };	
-static PyObject * SVF_setAdd(SVF *self, PyObject *arg) { SET_ADD };	
-static PyObject * SVF_setSub(SVF *self, PyObject *arg) { SET_SUB };	
-static PyObject * SVF_setDiv(SVF *self, PyObject *arg) { SET_DIV };	
+static PyObject * SVF_setMul(SVF *self, PyObject *arg) { SET_MUL };
+static PyObject * SVF_setAdd(SVF *self, PyObject *arg) { SET_ADD };
+static PyObject * SVF_setSub(SVF *self, PyObject *arg) { SET_SUB };
+static PyObject * SVF_setDiv(SVF *self, PyObject *arg) { SET_DIV };
 
 static PyObject * SVF_play(SVF *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * SVF_out(SVF *self, PyObject *args, PyObject *kwds) { OUT };
@@ -7645,14 +7645,14 @@ static PyObject *
 SVF_setFreq(SVF *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -7668,25 +7668,25 @@ SVF_setFreq(SVF *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 SVF_setQ(SVF *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->q);
@@ -7702,25 +7702,25 @@ SVF_setQ(SVF *self, PyObject *arg)
         self->q_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 SVF_setType(SVF *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->type);
@@ -7736,12 +7736,12 @@ SVF_setType(SVF *self, PyObject *arg)
         self->type_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef SVF_members[] = {
     {"server", T_OBJECT_EX, offsetof(SVF, server), 0, "Pyo server."},
@@ -7871,7 +7871,7 @@ typedef struct {
 
 static void
 Average_process_i(Average *self) {
-    int i; 
+    int i;
 
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
 
@@ -7929,44 +7929,44 @@ Average_setProcMode(Average *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
- 
+
     self->proc_func_ptr = Average_process_i;
 
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Average_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Average_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Average_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Average_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Average_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Average_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Average_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Average_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Average_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 Average_compute_next_data_frame(Average *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -7975,16 +7975,16 @@ Average_traverse(Average *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->input);
-    Py_VISIT(self->input_stream);       
+    Py_VISIT(self->input_stream);
     return 0;
 }
 
-static int 
+static int
 Average_clear(Average *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
-    Py_CLEAR(self->input_stream);      
+    Py_CLEAR(self->input_stream);
     return 0;
 }
 
@@ -8004,7 +8004,7 @@ Average_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     Average *self;
     self = (Average *)type->tp_alloc(type, 0);
-    
+
     self->size = 10;
     self->init = 1;
     self->in_count = 0;
@@ -8017,30 +8017,30 @@ Average_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = Average_setProcMode;
 
     static char *kwlist[] = {"input", "size", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iOO", kwlist, &inputtmp, &self->size, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->halfSize = (int)(self->size / 2);
     self->oneOnSize = 1.0 / (double)self->size;
-    
+
     self->buffer = (MYFLT *)realloc(self->buffer, (self->size) * sizeof(MYFLT));
     for (i=0; i<(self->size); i++) {
         self->buffer[i] = 0.;
-    }    
-    
+    }
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -8048,10 +8048,10 @@ Average_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Average_getServer(Average* self) { GET_SERVER };
 static PyObject * Average_getStream(Average* self) { GET_STREAM };
-static PyObject * Average_setMul(Average *self, PyObject *arg) { SET_MUL };	
-static PyObject * Average_setAdd(Average *self, PyObject *arg) { SET_ADD };	
-static PyObject * Average_setSub(Average *self, PyObject *arg) { SET_SUB };	
-static PyObject * Average_setDiv(Average *self, PyObject *arg) { SET_DIV };	
+static PyObject * Average_setMul(Average *self, PyObject *arg) { SET_MUL };
+static PyObject * Average_setAdd(Average *self, PyObject *arg) { SET_ADD };
+static PyObject * Average_setSub(Average *self, PyObject *arg) { SET_SUB };
+static PyObject * Average_setDiv(Average *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Average_play(Average *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Average_out(Average *self, PyObject *args, PyObject *kwds) { OUT };
@@ -8074,25 +8074,25 @@ Average_setSize(Average *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		self->size = PyInt_AsLong(arg);
         self->halfSize = (int)(self->size / 2);
         self->oneOnSize = 1.0 / (double)self->size;
         self->init = 1;
         self->in_count = 0;
-        self->currentValue = 0.0;        
+        self->currentValue = 0.0;
         self->buffer = (MYFLT *)realloc(self->buffer, (self->size) * sizeof(MYFLT));
         for (i=0; i<(self->size); i++) {
             self->buffer[i] = 0.;
-        }    
+        }
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Average_members[] = {
     {"server", T_OBJECT_EX, offsetof(Average, server), 0, "Pyo server."},
@@ -8209,7 +8209,7 @@ typedef struct {
     Stream *freq_stream;
     PyObject *q;
     Stream *q_stream;
-    int modebuffer[4]; // need at least 2 slots for mul & add 
+    int modebuffer[4]; // need at least 2 slots for mul & add
     MYFLT nyquist;
     MYFLT last_freq;
     MYFLT last_q;
@@ -8225,20 +8225,20 @@ typedef struct {
     MYFLT a;
 } Reson;
 
-static void 
+static void
 Reson_compute_coeffs(Reson *self, MYFLT freq, MYFLT q)
 {
     MYFLT bw;
-    
+
     if (freq < 0.1)
         freq = 0.1;
     else if (freq > self->nyquist)
         freq = self->nyquist;
     if (q < 0.1)
         q = 0.1;
-    
+
     bw = freq / q;
-    
+
     self->b2 = MYEXP(-self->twopiOverSr * bw);
     self->b1 = (-4.0 * self->b2) / (1.0 + self->b2) * MYCOS(freq * self->twopiOverSr);
     self->a = 1.0 - MYSQRT(self->b2);
@@ -8251,7 +8251,7 @@ Reson_filters_ii(Reson *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     fr = PyFloat_AS_DOUBLE(self->freq);
     q = PyFloat_AS_DOUBLE(self->q);
-   
+
     if (fr != self->last_freq || q != self->last_q) {
         self->last_freq = fr;
         self->last_q = q;
@@ -8297,7 +8297,7 @@ Reson_filters_ia(Reson *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *qst = Stream_getData((Stream *)self->q_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         q = qst[i];
         if (fr != self->last_freq || q != self->last_q) {
@@ -8353,56 +8353,56 @@ Reson_setProcMode(Reson *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Reson_filters_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Reson_filters_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Reson_filters_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Reson_filters_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Reson_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Reson_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Reson_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Reson_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Reson_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Reson_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Reson_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Reson_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Reson_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Reson_compute_next_data_frame(Reson *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -8412,23 +8412,23 @@ Reson_traverse(Reson *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->q);    
-    Py_VISIT(self->q_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->q);
+    Py_VISIT(self->q_stream);
     return 0;
 }
 
-static int 
+static int
 Reson_clear(Reson *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->q);    
-    Py_CLEAR(self->q_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->q);
+    Py_CLEAR(self->q_stream);
     return 0;
 }
 
@@ -8447,7 +8447,7 @@ Reson_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *qtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Reson *self;
     self = (Reson *)type->tp_alloc(type, 0);
-        
+
     self->freq = PyFloat_FromDouble(1000);
     self->q = PyFloat_FromDouble(1);
     self->last_freq = self->last_q = -1.0;
@@ -8459,10 +8459,10 @@ Reson_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[3] = 0;
 
     INIT_OBJECT_COMMON
-    
+
     self->nyquist = (MYFLT)self->sr * 0.49;
     self->twopiOverSr = TWOPI / (MYFLT)self->sr;
-    
+
     Stream_setFunctionPtr(self->stream, Reson_compute_next_data_frame);
     self->mode_func_ptr = Reson_setProcMode;
 
@@ -8472,7 +8472,7 @@ Reson_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
@@ -8480,7 +8480,7 @@ Reson_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (qtmp) {
         PyObject_CallMethod((PyObject *)self, "setQ", "O", qtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
@@ -8488,7 +8488,7 @@ Reson_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-            
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
@@ -8498,10 +8498,10 @@ Reson_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Reson_getServer(Reson* self) { GET_SERVER };
 static PyObject * Reson_getStream(Reson* self) { GET_STREAM };
-static PyObject * Reson_setMul(Reson *self, PyObject *arg) { SET_MUL };	
-static PyObject * Reson_setAdd(Reson *self, PyObject *arg) { SET_ADD };	
-static PyObject * Reson_setSub(Reson *self, PyObject *arg) { SET_SUB };	
-static PyObject * Reson_setDiv(Reson *self, PyObject *arg) { SET_DIV };	
+static PyObject * Reson_setMul(Reson *self, PyObject *arg) { SET_MUL };
+static PyObject * Reson_setAdd(Reson *self, PyObject *arg) { SET_ADD };
+static PyObject * Reson_setSub(Reson *self, PyObject *arg) { SET_SUB };
+static PyObject * Reson_setDiv(Reson *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Reson_play(Reson *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Reson_out(Reson *self, PyObject *args, PyObject *kwds) { OUT };
@@ -8520,14 +8520,14 @@ static PyObject *
 Reson_setFreq(Reson *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -8543,25 +8543,25 @@ Reson_setFreq(Reson *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Reson_setQ(Reson *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->q);
@@ -8577,12 +8577,12 @@ Reson_setQ(Reson *self, PyObject *arg)
         self->q_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Reson_members[] = {
     {"server", T_OBJECT_EX, offsetof(Reson, server), 0, "Pyo server."},
@@ -8702,7 +8702,7 @@ typedef struct {
     Stream *freq_stream;
     PyObject *q;
     Stream *q_stream;
-    int modebuffer[4]; // need at least 2 slots for mul & add 
+    int modebuffer[4]; // need at least 2 slots for mul & add
     int stages;
     MYFLT nyquist;
     MYFLT last_freq;
@@ -8732,20 +8732,20 @@ Resonx_allocate_memories(Resonx *self)
     }
 }
 
-static void 
+static void
 Resonx_compute_coeffs(Resonx *self, MYFLT freq, MYFLT q)
 {
     MYFLT bw;
-    
+
     if (freq < 0.1)
         freq = 0.1;
     else if (freq > self->nyquist)
         freq = self->nyquist;
     if (q < 0.1)
         q = 0.1;
-    
+
     bw = freq / q;
-    
+
     self->b2 = MYEXP(-self->twopiOverSr * bw);
     self->b1 = (-4.0 * self->b2) / (1.0 + self->b2) * MYCOS(freq * self->twopiOverSr);
     self->a = 1.0 - MYSQRT(self->b2);
@@ -8758,7 +8758,7 @@ Resonx_filters_ii(Resonx *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     fr = PyFloat_AS_DOUBLE(self->freq);
     q = PyFloat_AS_DOUBLE(self->q);
-   
+
     if (fr != self->last_freq || q != self->last_q) {
         self->last_freq = fr;
         self->last_q = q;
@@ -8768,7 +8768,7 @@ Resonx_filters_ii(Resonx *self) {
     vout = 0.0;
     for (i=0; i<self->bufsize; i++) {
         vin = in[i];
-        for (j=0; j<self->stages; j++) { 
+        for (j=0; j<self->stages; j++) {
             vout = (self->a * vin) - (self->a * self->x2[j]) - (self->b1 * self->y1[j]) - (self->b2 * self->y2[j]);
             self->x2[j] = self->x1[j];
             self->x1[j] = vin;
@@ -8796,7 +8796,7 @@ Resonx_filters_ai(Resonx *self) {
             self->last_q = q;
             Resonx_compute_coeffs(self, fr, q);
         }
-        for (j=0; j<self->stages; j++) { 
+        for (j=0; j<self->stages; j++) {
             vout = (self->a * vin) - (self->a * self->x2[j]) - (self->b1 * self->y1[j]) - (self->b2 * self->y2[j]);
             self->x2[j] = self->x1[j];
             self->x1[j] = vin;
@@ -8824,7 +8824,7 @@ Resonx_filters_ia(Resonx *self) {
             self->last_q = q;
             Resonx_compute_coeffs(self, fr, q);
         }
-        for (j=0; j<self->stages; j++) { 
+        for (j=0; j<self->stages; j++) {
             vout = (self->a * vin) - (self->a * self->x2[j]) - (self->b1 * self->y1[j]) - (self->b2 * self->y2[j]);
             self->x2[j] = self->x1[j];
             self->x1[j] = vin;
@@ -8853,7 +8853,7 @@ Resonx_filters_aa(Resonx *self) {
             self->last_q = q;
             Resonx_compute_coeffs(self, fr, q);
         }
-        for (j=0; j<self->stages; j++) { 
+        for (j=0; j<self->stages; j++) {
             vout = (self->a * vin) - (self->a * self->x2[j]) - (self->b1 * self->y1[j]) - (self->b2 * self->y2[j]);
             self->x2[j] = self->x1[j];
             self->x1[j] = vin;
@@ -8880,56 +8880,56 @@ Resonx_setProcMode(Resonx *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Resonx_filters_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Resonx_filters_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Resonx_filters_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Resonx_filters_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Resonx_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Resonx_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Resonx_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Resonx_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Resonx_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Resonx_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Resonx_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Resonx_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Resonx_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Resonx_compute_next_data_frame(Resonx *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -8939,23 +8939,23 @@ Resonx_traverse(Resonx *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->q);    
-    Py_VISIT(self->q_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->q);
+    Py_VISIT(self->q_stream);
     return 0;
 }
 
-static int 
+static int
 Resonx_clear(Resonx *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->q);    
-    Py_CLEAR(self->q_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->q);
+    Py_CLEAR(self->q_stream);
     return 0;
 }
 
@@ -8978,7 +8978,7 @@ Resonx_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *qtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Resonx *self;
     self = (Resonx *)type->tp_alloc(type, 0);
-        
+
     self->freq = PyFloat_FromDouble(1000);
     self->q = PyFloat_FromDouble(1);
     self->last_freq = self->last_q = -1.0;
@@ -8990,10 +8990,10 @@ Resonx_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[3] = 0;
 
     INIT_OBJECT_COMMON
-    
+
     self->nyquist = (MYFLT)self->sr * 0.49;
     self->twopiOverSr = TWOPI / (MYFLT)self->sr;
-    
+
     Stream_setFunctionPtr(self->stream, Resonx_compute_next_data_frame);
     self->mode_func_ptr = Resonx_setProcMode;
 
@@ -9003,7 +9003,7 @@ Resonx_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
@@ -9011,7 +9011,7 @@ Resonx_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (qtmp) {
         PyObject_CallMethod((PyObject *)self, "setQ", "O", qtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
@@ -9019,7 +9019,7 @@ Resonx_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-            
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     Resonx_allocate_memories(self);
@@ -9031,10 +9031,10 @@ Resonx_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Resonx_getServer(Resonx* self) { GET_SERVER };
 static PyObject * Resonx_getStream(Resonx* self) { GET_STREAM };
-static PyObject * Resonx_setMul(Resonx *self, PyObject *arg) { SET_MUL };	
-static PyObject * Resonx_setAdd(Resonx *self, PyObject *arg) { SET_ADD };	
-static PyObject * Resonx_setSub(Resonx *self, PyObject *arg) { SET_SUB };	
-static PyObject * Resonx_setDiv(Resonx *self, PyObject *arg) { SET_DIV };	
+static PyObject * Resonx_setMul(Resonx *self, PyObject *arg) { SET_MUL };
+static PyObject * Resonx_setAdd(Resonx *self, PyObject *arg) { SET_ADD };
+static PyObject * Resonx_setSub(Resonx *self, PyObject *arg) { SET_SUB };
+static PyObject * Resonx_setDiv(Resonx *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Resonx_play(Resonx *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Resonx_out(Resonx *self, PyObject *args, PyObject *kwds) { OUT };
@@ -9053,14 +9053,14 @@ static PyObject *
 Resonx_setFreq(Resonx *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -9076,25 +9076,25 @@ Resonx_setFreq(Resonx *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Resonx_setQ(Resonx *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->q);
@@ -9110,24 +9110,24 @@ Resonx_setQ(Resonx *self, PyObject *arg)
         self->q_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Resonx_setStages(Resonx *self, PyObject *arg)
 {
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		self->stages = PyInt_AsLong(arg);
         Resonx_allocate_memories(self);
@@ -9135,7 +9135,7 @@ Resonx_setStages(Resonx *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Resonx_members[] = {
     {"server", T_OBJECT_EX, offsetof(Resonx, server), 0, "Pyo server."},
@@ -9257,7 +9257,7 @@ typedef struct {
     Stream *input_stream;
     PyObject *freq;
     Stream *freq_stream;
-    int modebuffer[3]; // need at least 2 slots for mul & add 
+    int modebuffer[3]; // need at least 2 slots for mul & add
     MYFLT lastFreq;
     MYFLT nyquist;
     MYFLT piOnSr;
@@ -9281,12 +9281,12 @@ ButLP_filters_i(ButLP *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
-        
+
     if (fr != self->lastFreq) {
         if (fr <= 1.0)
             fr = 1.0;
         else if (fr >= self->nyquist)
-            fr = self->nyquist;            
+            fr = self->nyquist;
         self->lastFreq = fr;
         c = 1.0 / MYTAN(self->piOnSr * fr);
         c2 = c * c;
@@ -9311,14 +9311,14 @@ ButLP_filters_a(ButLP *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *freq = Stream_getData((Stream *)self->freq_stream);
-        
+
     for (i=0; i<self->bufsize; i++) {
-        fr = freq[i];        
+        fr = freq[i];
         if (fr != self->lastFreq) {
             if (fr <= 1.0)
                 fr = 1.0;
             else if (fr >= self->nyquist)
-                fr = self->nyquist;            
+                fr = self->nyquist;
             self->lastFreq = fr;
             c = 1.0 / MYTAN(self->piOnSr * fr);
             c2 = c * c;
@@ -9351,50 +9351,50 @@ ButLP_setProcMode(ButLP *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = ButLP_filters_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = ButLP_filters_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = ButLP_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = ButLP_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = ButLP_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = ButLP_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = ButLP_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = ButLP_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = ButLP_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = ButLP_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = ButLP_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 ButLP_compute_next_data_frame(ButLP *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -9404,19 +9404,19 @@ ButLP_traverse(ButLP *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
     return 0;
 }
 
-static int 
+static int
 ButLP_clear(ButLP *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
     return 0;
 }
 
@@ -9435,14 +9435,14 @@ ButLP_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *multmp=NULL, *addtmp=NULL;
     ButLP *self;
     self = (ButLP *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(1000);
     self->lastFreq = -1.0;
     self->x1 = self->x2 = self->y1 = self->y2 = self->a0 = self->a1 = self->a2 = self->b1 = self->b2 = 0.0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
 
     self->nyquist = (MYFLT)self->sr * 0.49;
@@ -9453,26 +9453,26 @@ ButLP_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = ButLP_setProcMode;
 
     static char *kwlist[] = {"input", "freq", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOO", kwlist, &inputtmp, &freqtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -9480,10 +9480,10 @@ ButLP_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * ButLP_getServer(ButLP* self) { GET_SERVER };
 static PyObject * ButLP_getStream(ButLP* self) { GET_STREAM };
-static PyObject * ButLP_setMul(ButLP *self, PyObject *arg) { SET_MUL };	
-static PyObject * ButLP_setAdd(ButLP *self, PyObject *arg) { SET_ADD };	
-static PyObject * ButLP_setSub(ButLP *self, PyObject *arg) { SET_SUB };	
-static PyObject * ButLP_setDiv(ButLP *self, PyObject *arg) { SET_DIV };	
+static PyObject * ButLP_setMul(ButLP *self, PyObject *arg) { SET_MUL };
+static PyObject * ButLP_setAdd(ButLP *self, PyObject *arg) { SET_ADD };
+static PyObject * ButLP_setSub(ButLP *self, PyObject *arg) { SET_SUB };
+static PyObject * ButLP_setDiv(ButLP *self, PyObject *arg) { SET_DIV };
 
 static PyObject * ButLP_play(ButLP *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * ButLP_out(ButLP *self, PyObject *args, PyObject *kwds) { OUT };
@@ -9502,14 +9502,14 @@ static PyObject *
 ButLP_setFreq(ButLP *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -9525,9 +9525,9 @@ ButLP_setFreq(ButLP *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -9649,7 +9649,7 @@ typedef struct {
     Stream *input_stream;
     PyObject *freq;
     Stream *freq_stream;
-    int modebuffer[3]; // need at least 2 slots for mul & add 
+    int modebuffer[3]; // need at least 2 slots for mul & add
     MYFLT lastFreq;
     MYFLT nyquist;
     MYFLT piOnSr;
@@ -9673,12 +9673,12 @@ ButHP_filters_i(ButHP *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
-        
+
     if (fr != self->lastFreq) {
         if (fr <= 1.0)
             fr = 1.0;
         else if (fr >= self->nyquist)
-            fr = self->nyquist;            
+            fr = self->nyquist;
         self->lastFreq = fr;
         c = MYTAN(self->piOnSr * fr);
         c2 = c * c;
@@ -9703,14 +9703,14 @@ ButHP_filters_a(ButHP *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *freq = Stream_getData((Stream *)self->freq_stream);
-        
+
     for (i=0; i<self->bufsize; i++) {
-        fr = freq[i];        
+        fr = freq[i];
         if (fr != self->lastFreq) {
             if (fr <= 1.0)
                 fr = 1.0;
             else if (fr >= self->nyquist)
-                fr = self->nyquist;            
+                fr = self->nyquist;
             self->lastFreq = fr;
             c = MYTAN(self->piOnSr * fr);
             c2 = c * c;
@@ -9743,50 +9743,50 @@ ButHP_setProcMode(ButHP *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = ButHP_filters_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = ButHP_filters_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = ButHP_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = ButHP_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = ButHP_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = ButHP_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = ButHP_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = ButHP_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = ButHP_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = ButHP_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = ButHP_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 ButHP_compute_next_data_frame(ButHP *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -9796,19 +9796,19 @@ ButHP_traverse(ButHP *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
     return 0;
 }
 
-static int 
+static int
 ButHP_clear(ButHP *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
     return 0;
 }
 
@@ -9827,14 +9827,14 @@ ButHP_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *multmp=NULL, *addtmp=NULL;
     ButHP *self;
     self = (ButHP *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(1000);
     self->lastFreq = -1.0;
     self->x1 = self->x2 = self->y1 = self->y2 = self->a0 = self->a1 = self->a2 = self->b1 = self->b2 = 0.0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
 
     self->nyquist = (MYFLT)self->sr * 0.49;
@@ -9845,26 +9845,26 @@ ButHP_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = ButHP_setProcMode;
 
     static char *kwlist[] = {"input", "freq", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOO", kwlist, &inputtmp, &freqtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -9872,10 +9872,10 @@ ButHP_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * ButHP_getServer(ButHP* self) { GET_SERVER };
 static PyObject * ButHP_getStream(ButHP* self) { GET_STREAM };
-static PyObject * ButHP_setMul(ButHP *self, PyObject *arg) { SET_MUL };	
-static PyObject * ButHP_setAdd(ButHP *self, PyObject *arg) { SET_ADD };	
-static PyObject * ButHP_setSub(ButHP *self, PyObject *arg) { SET_SUB };	
-static PyObject * ButHP_setDiv(ButHP *self, PyObject *arg) { SET_DIV };	
+static PyObject * ButHP_setMul(ButHP *self, PyObject *arg) { SET_MUL };
+static PyObject * ButHP_setAdd(ButHP *self, PyObject *arg) { SET_ADD };
+static PyObject * ButHP_setSub(ButHP *self, PyObject *arg) { SET_SUB };
+static PyObject * ButHP_setDiv(ButHP *self, PyObject *arg) { SET_DIV };
 
 static PyObject * ButHP_play(ButHP *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * ButHP_out(ButHP *self, PyObject *args, PyObject *kwds) { OUT };
@@ -9894,14 +9894,14 @@ static PyObject *
 ButHP_setFreq(ButHP *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -9917,9 +9917,9 @@ ButHP_setFreq(ButHP *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -10043,7 +10043,7 @@ typedef struct {
     Stream *freq_stream;
     PyObject *q;
     Stream *q_stream;
-    int modebuffer[4]; // need at least 2 slots for mul & add 
+    int modebuffer[4]; // need at least 2 slots for mul & add
     MYFLT nyquist;
     MYFLT last_freq;
     MYFLT last_q;
@@ -10060,22 +10060,22 @@ typedef struct {
     MYFLT b2;
 } ButBP;
 
-static void 
+static void
 ButBP_compute_coeffs(ButBP *self, MYFLT freq, MYFLT q)
 {
     MYFLT bw, c, d;
-    
+
     if (freq < 1.0)
         freq = 1.0;
     else if (freq > self->nyquist)
         freq = self->nyquist;
     if (q < 1.0)
         q = 1.0;
-    
+
     bw = freq / q;
     c = 1.0 / MYTAN(self->piOnSr * bw);
     d = 2.0 * MYCOS(2.0 * self->piOnSr * freq);
-    
+
     self->a0 = 1.0 / (1.0 + c);
     self->a2 = -self->a0;
     self->b1 = self->a2 * c * d;
@@ -10089,7 +10089,7 @@ ButBP_filters_ii(ButBP *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     fr = PyFloat_AS_DOUBLE(self->freq);
     q = PyFloat_AS_DOUBLE(self->q);
-   
+
     if (fr != self->last_freq || q != self->last_q) {
         self->last_freq = fr;
         self->last_q = q;
@@ -10135,7 +10135,7 @@ ButBP_filters_ia(ButBP *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *qst = Stream_getData((Stream *)self->q_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         q = qst[i];
         if (fr != self->last_freq || q != self->last_q) {
@@ -10191,56 +10191,56 @@ ButBP_setProcMode(ButBP *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = ButBP_filters_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = ButBP_filters_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = ButBP_filters_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = ButBP_filters_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = ButBP_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = ButBP_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = ButBP_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = ButBP_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = ButBP_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = ButBP_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = ButBP_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = ButBP_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = ButBP_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 ButBP_compute_next_data_frame(ButBP *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -10250,23 +10250,23 @@ ButBP_traverse(ButBP *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->q);    
-    Py_VISIT(self->q_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->q);
+    Py_VISIT(self->q_stream);
     return 0;
 }
 
-static int 
+static int
 ButBP_clear(ButBP *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->q);    
-    Py_CLEAR(self->q_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->q);
+    Py_CLEAR(self->q_stream);
     return 0;
 }
 
@@ -10285,7 +10285,7 @@ ButBP_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *qtmp=NULL, *multmp=NULL, *addtmp=NULL;
     ButBP *self;
     self = (ButBP *)type->tp_alloc(type, 0);
-        
+
     self->freq = PyFloat_FromDouble(1000);
     self->q = PyFloat_FromDouble(1);
     self->last_freq = self->last_q = -1.0;
@@ -10297,10 +10297,10 @@ ButBP_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[3] = 0;
 
     INIT_OBJECT_COMMON
-    
+
     self->nyquist = (MYFLT)self->sr * 0.49;
     self->piOnSr = PI / (MYFLT)self->sr;
-    
+
     Stream_setFunctionPtr(self->stream, ButBP_compute_next_data_frame);
     self->mode_func_ptr = ButBP_setProcMode;
 
@@ -10310,7 +10310,7 @@ ButBP_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
@@ -10318,7 +10318,7 @@ ButBP_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (qtmp) {
         PyObject_CallMethod((PyObject *)self, "setQ", "O", qtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
@@ -10326,7 +10326,7 @@ ButBP_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-            
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
@@ -10336,10 +10336,10 @@ ButBP_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * ButBP_getServer(ButBP* self) { GET_SERVER };
 static PyObject * ButBP_getStream(ButBP* self) { GET_STREAM };
-static PyObject * ButBP_setMul(ButBP *self, PyObject *arg) { SET_MUL };	
-static PyObject * ButBP_setAdd(ButBP *self, PyObject *arg) { SET_ADD };	
-static PyObject * ButBP_setSub(ButBP *self, PyObject *arg) { SET_SUB };	
-static PyObject * ButBP_setDiv(ButBP *self, PyObject *arg) { SET_DIV };	
+static PyObject * ButBP_setMul(ButBP *self, PyObject *arg) { SET_MUL };
+static PyObject * ButBP_setAdd(ButBP *self, PyObject *arg) { SET_ADD };
+static PyObject * ButBP_setSub(ButBP *self, PyObject *arg) { SET_SUB };
+static PyObject * ButBP_setDiv(ButBP *self, PyObject *arg) { SET_DIV };
 
 static PyObject * ButBP_play(ButBP *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * ButBP_out(ButBP *self, PyObject *args, PyObject *kwds) { OUT };
@@ -10358,14 +10358,14 @@ static PyObject *
 ButBP_setFreq(ButBP *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -10381,25 +10381,25 @@ ButBP_setFreq(ButBP *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 ButBP_setQ(ButBP *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->q);
@@ -10415,12 +10415,12 @@ ButBP_setQ(ButBP *self, PyObject *arg)
         self->q_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef ButBP_members[] = {
     {"server", T_OBJECT_EX, offsetof(ButBP, server), 0, "Pyo server."},
@@ -10543,7 +10543,7 @@ typedef struct {
     Stream *freq_stream;
     PyObject *q;
     Stream *q_stream;
-    int modebuffer[4]; // need at least 2 slots for mul & add 
+    int modebuffer[4]; // need at least 2 slots for mul & add
     MYFLT nyquist;
     MYFLT last_freq;
     MYFLT last_q;
@@ -10561,22 +10561,22 @@ typedef struct {
     MYFLT b2;
 } ButBR;
 
-static void 
+static void
 ButBR_compute_coeffs(ButBR *self, MYFLT freq, MYFLT q)
 {
     MYFLT bw, c, d;
-    
+
     if (freq < 1.0)
         freq = 1.0;
     else if (freq > self->nyquist)
         freq = self->nyquist;
     if (q < 1.0)
         q = 1.0;
-    
+
     bw = freq / q;
     c = MYTAN(self->piOnSr * bw);
     d = 2.0 * MYCOS(2.0 * self->piOnSr * freq);
-    
+
     self->a0 = self->a2 = 1.0 / (1.0 + c);
     self->a1 = self->b1 = -self->a0 * d;
     self->b2 = self->a0 * (1.0 - c);
@@ -10589,7 +10589,7 @@ ButBR_filters_ii(ButBR *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     fr = PyFloat_AS_DOUBLE(self->freq);
     q = PyFloat_AS_DOUBLE(self->q);
-   
+
     if (fr != self->last_freq || q != self->last_q) {
         self->last_freq = fr;
         self->last_q = q;
@@ -10635,7 +10635,7 @@ ButBR_filters_ia(ButBR *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *qst = Stream_getData((Stream *)self->q_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         q = qst[i];
         if (fr != self->last_freq || q != self->last_q) {
@@ -10691,56 +10691,56 @@ ButBR_setProcMode(ButBR *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = ButBR_filters_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = ButBR_filters_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = ButBR_filters_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = ButBR_filters_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = ButBR_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = ButBR_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = ButBR_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = ButBR_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = ButBR_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = ButBR_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = ButBR_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = ButBR_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = ButBR_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 ButBR_compute_next_data_frame(ButBR *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -10750,23 +10750,23 @@ ButBR_traverse(ButBR *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->q);    
-    Py_VISIT(self->q_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->q);
+    Py_VISIT(self->q_stream);
     return 0;
 }
 
-static int 
+static int
 ButBR_clear(ButBR *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->q);    
-    Py_CLEAR(self->q_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->q);
+    Py_CLEAR(self->q_stream);
     return 0;
 }
 
@@ -10785,7 +10785,7 @@ ButBR_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *qtmp=NULL, *multmp=NULL, *addtmp=NULL;
     ButBR *self;
     self = (ButBR *)type->tp_alloc(type, 0);
-        
+
     self->freq = PyFloat_FromDouble(1000);
     self->q = PyFloat_FromDouble(1);
     self->last_freq = self->last_q = -1.0;
@@ -10797,10 +10797,10 @@ ButBR_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[3] = 0;
 
     INIT_OBJECT_COMMON
-    
+
     self->nyquist = (MYFLT)self->sr * 0.49;
     self->piOnSr = PI / (MYFLT)self->sr;
-    
+
     Stream_setFunctionPtr(self->stream, ButBR_compute_next_data_frame);
     self->mode_func_ptr = ButBR_setProcMode;
 
@@ -10810,7 +10810,7 @@ ButBR_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
@@ -10818,7 +10818,7 @@ ButBR_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (qtmp) {
         PyObject_CallMethod((PyObject *)self, "setQ", "O", qtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
@@ -10826,7 +10826,7 @@ ButBR_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-            
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
@@ -10836,10 +10836,10 @@ ButBR_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * ButBR_getServer(ButBR* self) { GET_SERVER };
 static PyObject * ButBR_getStream(ButBR* self) { GET_STREAM };
-static PyObject * ButBR_setMul(ButBR *self, PyObject *arg) { SET_MUL };	
-static PyObject * ButBR_setAdd(ButBR *self, PyObject *arg) { SET_ADD };	
-static PyObject * ButBR_setSub(ButBR *self, PyObject *arg) { SET_SUB };	
-static PyObject * ButBR_setDiv(ButBR *self, PyObject *arg) { SET_DIV };	
+static PyObject * ButBR_setMul(ButBR *self, PyObject *arg) { SET_MUL };
+static PyObject * ButBR_setAdd(ButBR *self, PyObject *arg) { SET_ADD };
+static PyObject * ButBR_setSub(ButBR *self, PyObject *arg) { SET_SUB };
+static PyObject * ButBR_setDiv(ButBR *self, PyObject *arg) { SET_DIV };
 
 static PyObject * ButBR_play(ButBR *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * ButBR_out(ButBR *self, PyObject *args, PyObject *kwds) { OUT };
@@ -10858,14 +10858,14 @@ static PyObject *
 ButBR_setFreq(ButBR *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -10881,25 +10881,25 @@ ButBR_setFreq(ButBR *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 ButBR_setQ(ButBR *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->q);
@@ -10915,12 +10915,12 @@ ButBR_setQ(ButBR *self, PyObject *arg)
         self->q_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef ButBR_members[] = {
     {"server", T_OBJECT_EX, offsetof(ButBR, server), 0, "Pyo server."},
@@ -11043,7 +11043,7 @@ typedef struct {
     Stream *freq_stream;
     PyObject *decay;
     Stream *decay_stream;
-    int modebuffer[4]; // need at least 2 slots for mul & add 
+    int modebuffer[4]; // need at least 2 slots for mul & add
     MYFLT last_freq;
     MYFLT last_decay;
     MYFLT oneOnSr;
@@ -11062,9 +11062,9 @@ ComplexRes_filters_ii(ComplexRes *self) {
     int i;
     MYFLT ang, x, y;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    MYFLT freq = PyFloat_AS_DOUBLE(self->freq); 
+    MYFLT freq = PyFloat_AS_DOUBLE(self->freq);
     MYFLT decay = PyFloat_AS_DOUBLE(self->decay);
-    
+
     if (decay <= 0.0001)
         decay = 0.0001;
 
@@ -11081,7 +11081,7 @@ ComplexRes_filters_ii(ComplexRes *self) {
     for (i=0; i<self->bufsize; i++) {
         x = self->coeffx * self->x - self->coeffy * self->y + in[i];
         y = self->coeffy * self->x + self->coeffx * self->y;
-        self->data[i] = y * self->norm;        
+        self->data[i] = y * self->norm;
         self->x = x;
         self->y = y;
     }
@@ -11104,7 +11104,7 @@ ComplexRes_filters_ai(ComplexRes *self) {
         self->last_decay = decay;
         check = 1;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         freq = fr[i];
         if (freq != self->last_freq || check) {
@@ -11116,7 +11116,7 @@ ComplexRes_filters_ai(ComplexRes *self) {
         }
         x = self->coeffx * self->x - self->coeffy * self->y + in[i];
         y = self->coeffy * self->x + self->coeffx * self->y;
-        self->data[i] = y * self->norm;        
+        self->data[i] = y * self->norm;
         self->x = x;
         self->y = y;
     }
@@ -11129,7 +11129,7 @@ ComplexRes_filters_ia(ComplexRes *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT freq = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *dec = Stream_getData((Stream *)self->decay_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         decay = dec[i];
         if (decay <= 0.0001)
@@ -11145,7 +11145,7 @@ ComplexRes_filters_ia(ComplexRes *self) {
         }
         x = self->coeffx * self->x - self->coeffy * self->y + in[i];
         y = self->coeffy * self->x + self->coeffx * self->y;
-        self->data[i] = y * self->norm;        
+        self->data[i] = y * self->norm;
         self->x = x;
         self->y = y;
     }
@@ -11158,7 +11158,7 @@ ComplexRes_filters_aa(ComplexRes *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT *dec = Stream_getData((Stream *)self->decay_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         freq = fr[i];
         decay = dec[i];
@@ -11175,7 +11175,7 @@ ComplexRes_filters_aa(ComplexRes *self) {
         }
         x = self->coeffx * self->x - self->coeffy * self->y + in[i];
         y = self->coeffy * self->x + self->coeffx * self->y;
-        self->data[i] = y * self->norm;        
+        self->data[i] = y * self->norm;
         self->x = x;
         self->y = y;
     }
@@ -11199,54 +11199,54 @@ ComplexRes_setProcMode(ComplexRes *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = ComplexRes_filters_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = ComplexRes_filters_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = ComplexRes_filters_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = ComplexRes_filters_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = ComplexRes_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = ComplexRes_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = ComplexRes_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = ComplexRes_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = ComplexRes_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = ComplexRes_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = ComplexRes_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = ComplexRes_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = ComplexRes_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 ComplexRes_compute_next_data_frame(ComplexRes *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -11256,23 +11256,23 @@ ComplexRes_traverse(ComplexRes *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->decay);    
-    Py_VISIT(self->decay_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->decay);
+    Py_VISIT(self->decay_stream);
     return 0;
 }
 
-static int 
+static int
 ComplexRes_clear(ComplexRes *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->decay);    
-    Py_CLEAR(self->decay_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->decay);
+    Py_CLEAR(self->decay_stream);
     return 0;
 }
 
@@ -11291,7 +11291,7 @@ ComplexRes_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *freqtmp=NULL, *decaytmp=NULL, *multmp=NULL, *addtmp=NULL;
     ComplexRes *self;
     self = (ComplexRes *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(1000);
     self->decay = PyFloat_FromDouble(.25);
     self->last_freq = self->last_decay = -1.0;
@@ -11303,39 +11303,39 @@ ComplexRes_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-    
+
     INIT_OBJECT_COMMON
-    
+
     self->oneOnSr = 1.0 / self->sr;
 
     Stream_setFunctionPtr(self->stream, ComplexRes_compute_next_data_frame);
     self->mode_func_ptr = ComplexRes_setProcMode;
 
     static char *kwlist[] = {"input", "freq", "decay", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOO", kwlist, &inputtmp, &freqtmp, &decaytmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (decaytmp) {
         PyObject_CallMethod((PyObject *)self, "setDecay", "O", decaytmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -11343,10 +11343,10 @@ ComplexRes_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * ComplexRes_getServer(ComplexRes* self) { GET_SERVER };
 static PyObject * ComplexRes_getStream(ComplexRes* self) { GET_STREAM };
-static PyObject * ComplexRes_setMul(ComplexRes *self, PyObject *arg) { SET_MUL };	
-static PyObject * ComplexRes_setAdd(ComplexRes *self, PyObject *arg) { SET_ADD };	
-static PyObject * ComplexRes_setSub(ComplexRes *self, PyObject *arg) { SET_SUB };	
-static PyObject * ComplexRes_setDiv(ComplexRes *self, PyObject *arg) { SET_DIV };	
+static PyObject * ComplexRes_setMul(ComplexRes *self, PyObject *arg) { SET_MUL };
+static PyObject * ComplexRes_setAdd(ComplexRes *self, PyObject *arg) { SET_ADD };
+static PyObject * ComplexRes_setSub(ComplexRes *self, PyObject *arg) { SET_SUB };
+static PyObject * ComplexRes_setDiv(ComplexRes *self, PyObject *arg) { SET_DIV };
 
 static PyObject * ComplexRes_play(ComplexRes *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * ComplexRes_out(ComplexRes *self, PyObject *args, PyObject *kwds) { OUT };
@@ -11365,14 +11365,14 @@ static PyObject *
 ComplexRes_setFreq(ComplexRes *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -11388,25 +11388,25 @@ ComplexRes_setFreq(ComplexRes *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 ComplexRes_setDecay(ComplexRes *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->decay);
@@ -11422,12 +11422,12 @@ ComplexRes_setDecay(ComplexRes *self, PyObject *arg)
         self->decay_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef ComplexRes_members[] = {
 {"server", T_OBJECT_EX, offsetof(ComplexRes, server), 0, "Pyo server."},
@@ -11537,4 +11537,4 @@ ComplexRes_members,                                 /* tp_members */
 0,                          /* tp_init */
 0,                                              /* tp_alloc */
 ComplexRes_new,                                     /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/freeverbmodule.c b/src/objects/freeverbmodule.c
index 9f98523..2558d79 100644
--- a/src/objects/freeverbmodule.c
+++ b/src/objects/freeverbmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -31,20 +31,20 @@
 #define NUM_ALLPASS      4
 
 static const MYFLT comb_delays[NUM_COMB] = {
-1116.0 / DEFAULT_SRATE, 
-1188.0 / DEFAULT_SRATE, 
-1277.0 / DEFAULT_SRATE, 
+1116.0 / DEFAULT_SRATE,
+1188.0 / DEFAULT_SRATE,
+1277.0 / DEFAULT_SRATE,
 1356.0 / DEFAULT_SRATE,
-1422.0 / DEFAULT_SRATE, 
-1491.0 / DEFAULT_SRATE, 
-1557.0 / DEFAULT_SRATE, 
+1422.0 / DEFAULT_SRATE,
+1491.0 / DEFAULT_SRATE,
+1557.0 / DEFAULT_SRATE,
 1617.0 / DEFAULT_SRATE
 };
 
 static const MYFLT allpass_delays[NUM_ALLPASS] = {
-556.0 / DEFAULT_SRATE, 
-441.0 / DEFAULT_SRATE, 
-341.0 / DEFAULT_SRATE, 
+556.0 / DEFAULT_SRATE,
+441.0 / DEFAULT_SRATE,
+341.0 / DEFAULT_SRATE,
 225.0 / DEFAULT_SRATE
 };
 
@@ -86,7 +86,7 @@ _clip(MYFLT x)
         return x;
 }
 
-static int 
+static int
 Freeverb_calc_nsamples(Freeverb *self, MYFLT delTime)
 {
     return (int)(delTime * self->sr + 0.5);
@@ -108,10 +108,10 @@ Freeverb_transform_iii(Freeverb *self) {
 
     mix1 = MYSQRT(mix);
     mix2 = MYSQRT(1.0 - mix);
-    
+
     MYFLT tmp[self->bufsize];
     memset(&tmp, 0, sizeof(tmp));
-    
+
     for (j=0; j<self->bufsize; j++) {
         for (i=0; i<NUM_COMB; i++) {
             x = self->comb_buf[i][self->comb_bufPos[i]];
@@ -124,7 +124,7 @@ Freeverb_transform_iii(Freeverb *self) {
                 self->comb_bufPos[i] = 0;
         }
     }
-    
+
     for (i=0; i<NUM_ALLPASS; i++) {
         for (j=0; j<self->bufsize; j++) {
             x = self->allpass_buf[i][self->allpass_bufPos[i]] - tmp[j];
@@ -134,33 +134,33 @@ Freeverb_transform_iii(Freeverb *self) {
             if (self->allpass_bufPos[i] >= self->allpass_nSamples[i])
                 self->allpass_bufPos[i] = 0;
             tmp[j] = x;
-        }    
+        }
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = (tmp[i] * fixedGain * mix1) + (in[i] * mix2);
-    }    
+    }
 }
 
 static void
 Freeverb_transform_aii(Freeverb *self) {
     MYFLT x, feedback, damp1, damp2, mix1, mix2;
     int i, j;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *siz = Stream_getData((Stream *)self->size_stream);
     MYFLT dam = _clip(PyFloat_AS_DOUBLE(self->damp));
     MYFLT mix = _clip(PyFloat_AS_DOUBLE(self->mix));
-    
+
     damp1 = dam * scaleDamp;
     damp2 = 1.0 - damp1;
-    
+
     mix1 = MYSQRT(mix);
     mix2 = MYSQRT(1.0 - mix);
-    
+
     MYFLT tmp[self->bufsize];
     memset(&tmp, 0, sizeof(tmp));
-    
+
     for (j=0; j<self->bufsize; j++) {
         feedback = _clip(siz[j]) * scaleRoom + offsetRoom;
         for (i=0; i<NUM_COMB; i++) {
@@ -174,7 +174,7 @@ Freeverb_transform_aii(Freeverb *self) {
                 self->comb_bufPos[i] = 0;
         }
     }
-    
+
     for (i=0; i<NUM_ALLPASS; i++) {
         for (j=0; j<self->bufsize; j++) {
             x = self->allpass_buf[i][self->allpass_bufPos[i]] - tmp[j];
@@ -184,32 +184,32 @@ Freeverb_transform_aii(Freeverb *self) {
             if (self->allpass_bufPos[i] >= self->allpass_nSamples[i])
                 self->allpass_bufPos[i] = 0;
             tmp[j] = x;
-        }    
+        }
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = (tmp[i] * fixedGain * mix1) + (in[i] * mix2);
-    }    
+    }
 }
 
 static void
 Freeverb_transform_iai(Freeverb *self) {
     MYFLT x, feedback, damp1, damp2, mix1, mix2;
     int i, j;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT siz = _clip(PyFloat_AS_DOUBLE(self->size));
     MYFLT *dam = Stream_getData((Stream *)self->damp_stream);
     MYFLT mix = _clip(PyFloat_AS_DOUBLE(self->mix));
-    
+
     feedback = siz * scaleRoom + offsetRoom;
-    
+
     mix1 = MYSQRT(mix);
     mix2 = MYSQRT(1.0 - mix);
-    
+
     MYFLT tmp[self->bufsize];
     memset(&tmp, 0, sizeof(tmp));
-    
+
     for (j=0; j<self->bufsize; j++) {
         damp1 = _clip(dam[j]) * scaleDamp;
         damp2 = 1.0 - damp1;
@@ -224,7 +224,7 @@ Freeverb_transform_iai(Freeverb *self) {
                 self->comb_bufPos[i] = 0;
         }
     }
-    
+
     for (i=0; i<NUM_ALLPASS; i++) {
         for (j=0; j<self->bufsize; j++) {
             x = self->allpass_buf[i][self->allpass_bufPos[i]] - tmp[j];
@@ -234,19 +234,19 @@ Freeverb_transform_iai(Freeverb *self) {
             if (self->allpass_bufPos[i] >= self->allpass_nSamples[i])
                 self->allpass_bufPos[i] = 0;
             tmp[j] = x;
-        }    
+        }
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = (tmp[i] * fixedGain * mix1) + (in[i] * mix2);
-    }    
+    }
 }
 
 static void
 Freeverb_transform_aai(Freeverb *self) {
     MYFLT x, feedback, damp1, damp2, mix1, mix2;
     int i, j;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *siz = Stream_getData((Stream *)self->size_stream);
     MYFLT *dam = Stream_getData((Stream *)self->damp_stream);
@@ -257,7 +257,7 @@ Freeverb_transform_aai(Freeverb *self) {
 
     MYFLT tmp[self->bufsize];
     memset(&tmp, 0, sizeof(tmp));
-    
+
     for (j=0; j<self->bufsize; j++) {
         feedback = _clip(siz[j]) * scaleRoom + offsetRoom;
         damp1 = _clip(dam[j]) * scaleDamp;
@@ -273,7 +273,7 @@ Freeverb_transform_aai(Freeverb *self) {
                 self->comb_bufPos[i] = 0;
         }
     }
-    
+
     for (i=0; i<NUM_ALLPASS; i++) {
         for (j=0; j<self->bufsize; j++) {
             x = self->allpass_buf[i][self->allpass_bufPos[i]] - tmp[j];
@@ -283,31 +283,31 @@ Freeverb_transform_aai(Freeverb *self) {
             if (self->allpass_bufPos[i] >= self->allpass_nSamples[i])
                 self->allpass_bufPos[i] = 0;
             tmp[j] = x;
-        }    
+        }
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = (tmp[i] * fixedGain * mix1) + (in[i] * mix2);
-    }    
+    }
 }
 
 static void
 Freeverb_transform_iia(Freeverb *self) {
     MYFLT x, feedback, damp1, damp2, mix1, mix2, mixtmp;
     int i, j;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT siz = _clip(PyFloat_AS_DOUBLE(self->size));
     MYFLT dam = _clip(PyFloat_AS_DOUBLE(self->damp));
     MYFLT *mix = Stream_getData((Stream *)self->mix_stream);
-    
+
     feedback = siz * scaleRoom + offsetRoom;
     damp1 = dam * scaleDamp;
     damp2 = 1.0 - damp1;
 
     MYFLT tmp[self->bufsize];
     memset(&tmp, 0, sizeof(tmp));
-    
+
     for (j=0; j<self->bufsize; j++) {
         for (i=0; i<NUM_COMB; i++) {
             x = self->comb_buf[i][self->comb_bufPos[i]];
@@ -320,7 +320,7 @@ Freeverb_transform_iia(Freeverb *self) {
                 self->comb_bufPos[i] = 0;
         }
     }
-    
+
     for (i=0; i<NUM_ALLPASS; i++) {
         for (j=0; j<self->bufsize; j++) {
             x = self->allpass_buf[i][self->allpass_bufPos[i]] - tmp[j];
@@ -330,33 +330,33 @@ Freeverb_transform_iia(Freeverb *self) {
             if (self->allpass_bufPos[i] >= self->allpass_nSamples[i])
                 self->allpass_bufPos[i] = 0;
             tmp[j] = x;
-        }    
+        }
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         mixtmp = _clip(mix[i]);
         mix1 = MYSQRT(mixtmp);
         mix2 = MYSQRT(1.0 - mixtmp);
         self->data[i] = (tmp[i] * fixedGain * mix1) + (in[i] * mix2);
-    }    
+    }
 }
 
 static void
 Freeverb_transform_aia(Freeverb *self) {
     MYFLT x, feedback, damp1, damp2, mix1, mix2, mixtmp;
     int i, j;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *siz = Stream_getData((Stream *)self->size_stream);
     MYFLT dam = _clip(PyFloat_AS_DOUBLE(self->damp));
     MYFLT *mix = Stream_getData((Stream *)self->mix_stream);
-    
+
     damp1 = dam * scaleDamp;
     damp2 = 1.0 - damp1;
-    
+
     MYFLT tmp[self->bufsize];
     memset(&tmp, 0, sizeof(tmp));
-    
+
     for (j=0; j<self->bufsize; j++) {
         feedback = _clip(siz[j]) * scaleRoom + offsetRoom;
         for (i=0; i<NUM_COMB; i++) {
@@ -370,7 +370,7 @@ Freeverb_transform_aia(Freeverb *self) {
                 self->comb_bufPos[i] = 0;
         }
     }
-    
+
     for (i=0; i<NUM_ALLPASS; i++) {
         for (j=0; j<self->bufsize; j++) {
             x = self->allpass_buf[i][self->allpass_bufPos[i]] - tmp[j];
@@ -380,32 +380,32 @@ Freeverb_transform_aia(Freeverb *self) {
             if (self->allpass_bufPos[i] >= self->allpass_nSamples[i])
                 self->allpass_bufPos[i] = 0;
             tmp[j] = x;
-        }    
+        }
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         mixtmp = _clip(mix[i]);
         mix1 = MYSQRT(mixtmp);
         mix2 = MYSQRT(1.0 - mixtmp);
         self->data[i] = (tmp[i] * fixedGain * mix1) + (in[i] * mix2);
-    }    
+    }
 }
 
 static void
 Freeverb_transform_iaa(Freeverb *self) {
     MYFLT x, feedback, damp1, damp2, mix1, mix2, mixtmp;
     int i, j;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT siz = _clip(PyFloat_AS_DOUBLE(self->size));
     MYFLT *dam = Stream_getData((Stream *)self->damp_stream);
     MYFLT *mix = Stream_getData((Stream *)self->mix_stream);
-    
+
     feedback = siz * scaleRoom + offsetRoom;
-    
+
     MYFLT tmp[self->bufsize];
     memset(&tmp, 0, sizeof(tmp));
-    
+
     for (j=0; j<self->bufsize; j++) {
         damp1 = _clip(dam[j]) * scaleDamp;
         damp2 = 1.0 - damp1;
@@ -420,7 +420,7 @@ Freeverb_transform_iaa(Freeverb *self) {
                 self->comb_bufPos[i] = 0;
         }
     }
-    
+
     for (i=0; i<NUM_ALLPASS; i++) {
         for (j=0; j<self->bufsize; j++) {
             x = self->allpass_buf[i][self->allpass_bufPos[i]] - tmp[j];
@@ -430,30 +430,30 @@ Freeverb_transform_iaa(Freeverb *self) {
             if (self->allpass_bufPos[i] >= self->allpass_nSamples[i])
                 self->allpass_bufPos[i] = 0;
             tmp[j] = x;
-        }    
+        }
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         mixtmp = _clip(mix[i]);
         mix1 = MYSQRT(mixtmp);
         mix2 = MYSQRT(1.0 - mixtmp);
         self->data[i] = (tmp[i] * fixedGain * mix1) + (in[i] * mix2);
-    }    
+    }
 }
 
 static void
 Freeverb_transform_aaa(Freeverb *self) {
     MYFLT x, feedback, damp1, damp2, mix1, mix2, mixtmp;
     int i, j;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *siz = Stream_getData((Stream *)self->size_stream);
     MYFLT *dam = Stream_getData((Stream *)self->damp_stream);
     MYFLT *mix = Stream_getData((Stream *)self->mix_stream);
-        
+
     MYFLT tmp[self->bufsize];
     memset(&tmp, 0, sizeof(tmp));
-    
+
     for (j=0; j<self->bufsize; j++) {
         feedback = _clip(siz[j]) * scaleRoom + offsetRoom;
         damp1 = _clip(dam[j]) * scaleDamp;
@@ -469,7 +469,7 @@ Freeverb_transform_aaa(Freeverb *self) {
                 self->comb_bufPos[i] = 0;
         }
     }
-    
+
     for (i=0; i<NUM_ALLPASS; i++) {
         for (j=0; j<self->bufsize; j++) {
             x = self->allpass_buf[i][self->allpass_bufPos[i]] - tmp[j];
@@ -479,15 +479,15 @@ Freeverb_transform_aaa(Freeverb *self) {
             if (self->allpass_bufPos[i] >= self->allpass_nSamples[i])
                 self->allpass_bufPos[i] = 0;
             tmp[j] = x;
-        }    
+        }
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         mixtmp = _clip(mix[i]);
         mix1 = MYSQRT(mixtmp);
         mix2 = MYSQRT(1.0 - mixtmp);
         self->data[i] = (tmp[i] * fixedGain * mix1) + (in[i] * mix2);
-    }    
+    }
 }
 
 static void Freeverb_postprocessing_ii(Freeverb *self) { POST_PROCESSING_II };
@@ -508,66 +508,66 @@ Freeverb_setProcMode(Freeverb *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Freeverb_transform_iii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Freeverb_transform_aii;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Freeverb_transform_iai;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Freeverb_transform_aai;
             break;
-        case 100:        
+        case 100:
             self->proc_func_ptr = Freeverb_transform_iia;
             break;
-        case 101:    
+        case 101:
             self->proc_func_ptr = Freeverb_transform_aia;
             break;
-        case 110:        
+        case 110:
             self->proc_func_ptr = Freeverb_transform_iaa;
             break;
-        case 111:    
+        case 111:
             self->proc_func_ptr = Freeverb_transform_aaa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Freeverb_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Freeverb_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Freeverb_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Freeverb_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Freeverb_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Freeverb_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Freeverb_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Freeverb_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Freeverb_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Freeverb_compute_next_data_frame(Freeverb *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -576,28 +576,28 @@ Freeverb_traverse(Freeverb *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->input);
-    Py_VISIT(self->input_stream);    
-    Py_VISIT(self->size);    
-    Py_VISIT(self->size_stream);    
-    Py_VISIT(self->damp);    
-    Py_VISIT(self->damp_stream);    
-    Py_VISIT(self->mix);    
-    Py_VISIT(self->mix_stream);    
+    Py_VISIT(self->input_stream);
+    Py_VISIT(self->size);
+    Py_VISIT(self->size_stream);
+    Py_VISIT(self->damp);
+    Py_VISIT(self->damp_stream);
+    Py_VISIT(self->mix);
+    Py_VISIT(self->mix_stream);
     return 0;
 }
 
-static int 
+static int
 Freeverb_clear(Freeverb *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->size);    
-    Py_CLEAR(self->size_stream);    
-    Py_CLEAR(self->damp);    
-    Py_CLEAR(self->damp_stream);    
-    Py_CLEAR(self->mix);    
-    Py_CLEAR(self->mix_stream);    
+    Py_CLEAR(self->size);
+    Py_CLEAR(self->size_stream);
+    Py_CLEAR(self->damp);
+    Py_CLEAR(self->damp_stream);
+    Py_CLEAR(self->mix);
+    Py_CLEAR(self->mix_stream);
     return 0;
 }
 
@@ -611,7 +611,7 @@ Freeverb_dealloc(Freeverb* self)
     }
     for(i=0; i<NUM_ALLPASS; i++) {
         free(self->allpass_buf[i]);
-    }    
+    }
     Freeverb_clear(self);
     self->ob_type->tp_free((PyObject*)self);
 }
@@ -633,7 +633,7 @@ Freeverb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
 	self->modebuffer[4] = 0;
-    
+
     self->srFactor = pow((DEFAULT_SRATE/self->sr), 0.8);
 
     INIT_OBJECT_COMMON
@@ -658,7 +658,7 @@ Freeverb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (mixtmp) {
         PyObject_CallMethod((PyObject *)self, "setMix", "O", mixtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
@@ -666,13 +666,13 @@ Freeverb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-            
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
 
     Server_generateSeed((Server *)self->server, FREEVERB_ID);
-    
+
     rndSamps = (rand()/(MYFLT)(RAND_MAX) * 20 + 10) / DEFAULT_SRATE;
     for(i=0; i<NUM_COMB; i++) {
         nsamps = Freeverb_calc_nsamples((Freeverb *)self, comb_delays[i] + rndSamps);
@@ -683,7 +683,7 @@ Freeverb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         for(j=0; j<nsamps; j++) {
             self->comb_buf[i][j] = 0.0;
         }
-    }    
+    }
         for(i=0; i<NUM_ALLPASS; i++) {
             nsamps = Freeverb_calc_nsamples((Freeverb *)self, allpass_delays[i] + rndSamps);
             self->allpass_buf[i] = (MYFLT *)realloc(self->allpass_buf[i], (nsamps+1) * sizeof(MYFLT));
@@ -693,16 +693,16 @@ Freeverb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
                 self->allpass_buf[i][j] = 0.0;
             }
     }
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Freeverb_getServer(Freeverb* self) { GET_SERVER };
 static PyObject * Freeverb_getStream(Freeverb* self) { GET_STREAM };
-static PyObject * Freeverb_setMul(Freeverb *self, PyObject *arg) { SET_MUL };	
-static PyObject * Freeverb_setAdd(Freeverb *self, PyObject *arg) { SET_ADD };	
-static PyObject * Freeverb_setSub(Freeverb *self, PyObject *arg) { SET_SUB };	
-static PyObject * Freeverb_setDiv(Freeverb *self, PyObject *arg) { SET_DIV };	
+static PyObject * Freeverb_setMul(Freeverb *self, PyObject *arg) { SET_MUL };
+static PyObject * Freeverb_setAdd(Freeverb *self, PyObject *arg) { SET_ADD };
+static PyObject * Freeverb_setSub(Freeverb *self, PyObject *arg) { SET_SUB };
+static PyObject * Freeverb_setDiv(Freeverb *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Freeverb_play(Freeverb *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Freeverb_out(Freeverb *self, PyObject *args, PyObject *kwds) { OUT };
@@ -721,14 +721,14 @@ static PyObject *
 Freeverb_setSize(Freeverb *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->size);
@@ -744,25 +744,25 @@ Freeverb_setSize(Freeverb *self, PyObject *arg)
         self->size_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Freeverb_setDamp(Freeverb *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->damp);
@@ -778,25 +778,25 @@ Freeverb_setDamp(Freeverb *self, PyObject *arg)
         self->damp_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Freeverb_setMix(Freeverb *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->mix);
@@ -812,9 +812,9 @@ Freeverb_setMix(Freeverb *self, PyObject *arg)
         self->mix_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -928,4 +928,4 @@ PyTypeObject FreeverbType = {
     0,      /* tp_init */
     0,                         /* tp_alloc */
     Freeverb_new,                 /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/granulatormodule.c b/src/objects/granulatormodule.c
index a996aea..6610ba3 100644
--- a/src/objects/granulatormodule.c
+++ b/src/objects/granulatormodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -56,23 +56,23 @@ static void
 Granulator_transform_iii(Granulator *self) {
     MYFLT val, x, x1, inc, index, fpart, amp, ppos;
     int i, j, ipart;
-    
+
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *envlist = TableStream_getData(self->env);
     int envsize = TableStream_getSize(self->env);
-    
+
     MYFLT pit = PyFloat_AS_DOUBLE(self->pitch);
     MYFLT pos = PyFloat_AS_DOUBLE(self->pos);
     MYFLT dur = PyFloat_AS_DOUBLE(self->dur);
-    
+
     inc = pit * (1.0 / self->basedur) / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = 0.0;
         self->pointerPos += inc;
-        
+
         for (j=0; j<self->ngrains; j++) {
             ppos = self->pointerPos + self->gphase[j];
             if (ppos >= 1.0) {
@@ -85,13 +85,13 @@ Granulator_transform_iii(Granulator *self) {
             x = envlist[ipart];
             x1 = envlist[ipart+1];
             amp = x + (x1 - x) * fpart;
-            
+
             if (ppos < self->lastppos[j]) {
                 self->startPos[j] = pos;
                 self->gsize[j] = dur * self->sr;
             }
             self->lastppos[j] = ppos;
-            
+
             // compute sampling
             index = ppos * self->gsize[j] + self->startPos[j];
             if (index >= 0 && index < size) {
@@ -103,39 +103,39 @@ Granulator_transform_iii(Granulator *self) {
             }
             else
                 val = 0.0;
-            
+
             self->data[i] += (val * amp);
         }
-        
+
         if (self->pointerPos < 0)
             self->pointerPos += 1.0;
         else if (self->pointerPos >= 1)
             self->pointerPos -= 1.0;
-    }    
+    }
 }
 
 static void
 Granulator_transform_aii(Granulator *self) {
     MYFLT val, x, x1, inc, index, fpart, amp, ppos, frtosamps;
     int i, j, ipart;
-    
+
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *envlist = TableStream_getData(self->env);
     int envsize = TableStream_getSize(self->env);
-    
+
     MYFLT *pit = Stream_getData((Stream *)self->pitch_stream);
     MYFLT pos = PyFloat_AS_DOUBLE(self->pos);
     MYFLT dur = PyFloat_AS_DOUBLE(self->dur);
-    
+
     frtosamps = (1.0 / self->basedur) / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = 0.0;
         inc = pit[i] * frtosamps;
         self->pointerPos += inc;
-        
+
         for (j=0; j<self->ngrains; j++) {
             ppos = self->pointerPos + self->gphase[j];
             if (ppos >= 1.0) {
@@ -148,13 +148,13 @@ Granulator_transform_aii(Granulator *self) {
             x = envlist[ipart];
             x1 = envlist[ipart+1];
             amp = x + (x1 - x) * fpart;
-            
+
             if (ppos < self->lastppos[j]) {
                 self->startPos[j] = pos;
                 self->gsize[j] = dur * self->sr;
             }
             self->lastppos[j] = ppos;
-            
+
             // compute sampling
             index = ppos * self->gsize[j] + self->startPos[j];
             if (index >= 0 && index < size) {
@@ -166,15 +166,15 @@ Granulator_transform_aii(Granulator *self) {
             }
             else
                 val = 0.0;
-            
+
             self->data[i] += (val * amp);
         }
-        
+
         if (self->pointerPos < 0)
             self->pointerPos += 1.0;
         else if (self->pointerPos >= 1)
             self->pointerPos -= 1.0;
-    }    
+    }
 }
 
 static void
@@ -193,9 +193,9 @@ Granulator_transform_iai(Granulator *self) {
     MYFLT dur = PyFloat_AS_DOUBLE(self->dur);
 
     inc = pit * (1.0 / self->basedur) / self->sr;
-    
+
     MYFLT gsize = dur * self->sr;
-    
+
     for (j=0; j<self->ngrains; j++) {
         self->gsize[j] = gsize;
     }
@@ -203,7 +203,7 @@ Granulator_transform_iai(Granulator *self) {
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = 0.0;
         self->pointerPos += inc;
-        
+
         for (j=0; j<self->ngrains; j++) {
             ppos = self->pointerPos + self->gphase[j];
             if (ppos >= 1.0) {
@@ -221,7 +221,7 @@ Granulator_transform_iai(Granulator *self) {
                 self->startPos[j] = pos[i];
             }
             self->lastppos[j] = ppos;
-            
+
             // compute sampling
             index = ppos * self->gsize[j] + self->startPos[j];
             if (index >= 0 && index < size) {
@@ -236,36 +236,36 @@ Granulator_transform_iai(Granulator *self) {
 
             self->data[i] += (val * amp);
         }
-        
+
         if (self->pointerPos < 0)
             self->pointerPos += 1.0;
         else if (self->pointerPos >= 1)
             self->pointerPos -= 1.0;
-    }    
+    }
 }
 
 static void
 Granulator_transform_aai(Granulator *self) {
     MYFLT val, x, x1, inc, index, fpart, amp, ppos, frtosamps;
     int i, j, ipart;
-    
+
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *envlist = TableStream_getData(self->env);
     int envsize = TableStream_getSize(self->env);
-    
+
     MYFLT *pit = Stream_getData((Stream *)self->pitch_stream);
     MYFLT *pos = Stream_getData((Stream *)self->pos_stream);
     MYFLT dur = PyFloat_AS_DOUBLE(self->dur);
-    
+
     frtosamps = (1.0 / self->basedur) / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = 0.0;
         inc = pit[i] * frtosamps;
         self->pointerPos += inc;
-        
+
         for (j=0; j<self->ngrains; j++) {
             ppos = self->pointerPos + self->gphase[j];
             if (ppos >= 1.0) {
@@ -278,13 +278,13 @@ Granulator_transform_aai(Granulator *self) {
             x = envlist[ipart];
             x1 = envlist[ipart+1];
             amp = x + (x1 - x) * fpart;
-            
+
             if (ppos < self->lastppos[j]) {
                 self->startPos[j] = pos[i];
                 self->gsize[j] = dur * self->sr;
             }
             self->lastppos[j] = ppos;
-            
+
             // compute sampling
             index = ppos * self->gsize[j] + self->startPos[j];
             if (index >= 0 && index < size) {
@@ -296,38 +296,38 @@ Granulator_transform_aai(Granulator *self) {
             }
             else
                 val = 0.0;
-            
+
             self->data[i] += (val * amp);
         }
-        
+
         if (self->pointerPos < 0)
             self->pointerPos += 1.0;
         else if (self->pointerPos >= 1)
             self->pointerPos -= 1.0;
     }
-} 
+}
 
 static void
 Granulator_transform_iia(Granulator *self) {
     MYFLT val, x, x1, inc, index, fpart, amp, ppos;
     int i, j, ipart;
-    
+
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *envlist = TableStream_getData(self->env);
     int envsize = TableStream_getSize(self->env);
-    
+
     MYFLT pit = PyFloat_AS_DOUBLE(self->pitch);
     MYFLT pos = PyFloat_AS_DOUBLE(self->pos);
     MYFLT *dur = Stream_getData((Stream *)self->dur_stream);
-    
+
     inc = pit * (1.0 / self->basedur) / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = 0.0;
         self->pointerPos += inc;
-        
+
         for (j=0; j<self->ngrains; j++) {
             ppos = self->pointerPos + self->gphase[j];
             if (ppos >= 1.0) {
@@ -340,13 +340,13 @@ Granulator_transform_iia(Granulator *self) {
             x = envlist[ipart];
             x1 = envlist[ipart+1];
             amp = x + (x1 - x) * fpart;
-            
+
             if (ppos < self->lastppos[j]) {
                 self->startPos[j] = pos;
                 self->gsize[j] = dur[i] * self->sr;
             }
             self->lastppos[j] = ppos;
-            
+
             // compute sampling
             index = ppos * self->gsize[j] + self->startPos[j];
             if (index >= 0 && index < size) {
@@ -358,39 +358,39 @@ Granulator_transform_iia(Granulator *self) {
             }
             else
                 val = 0.0;
-            
+
             self->data[i] += (val * amp);
         }
-        
+
         if (self->pointerPos < 0)
             self->pointerPos += 1.0;
         else if (self->pointerPos >= 1)
             self->pointerPos -= 1.0;
-    }     
+    }
 }
 
 static void
 Granulator_transform_aia(Granulator *self) {
     MYFLT val, x, x1, inc, index, fpart, amp, ppos, frtosamps;
     int i, j, ipart;
-    
+
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *envlist = TableStream_getData(self->env);
     int envsize = TableStream_getSize(self->env);
-    
+
     MYFLT *pit = Stream_getData((Stream *)self->pitch_stream);
     MYFLT pos = PyFloat_AS_DOUBLE(self->pos);
     MYFLT *dur = Stream_getData((Stream *)self->dur_stream);
-    
+
     frtosamps = (1.0 / self->basedur) / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = 0.0;
         inc = pit[i] * frtosamps;
         self->pointerPos += inc;
-        
+
         for (j=0; j<self->ngrains; j++) {
             ppos = self->pointerPos + self->gphase[j];
             if (ppos >= 1.0) {
@@ -403,13 +403,13 @@ Granulator_transform_aia(Granulator *self) {
             x = envlist[ipart];
             x1 = envlist[ipart+1];
             amp = x + (x1 - x) * fpart;
-            
+
             if (ppos < self->lastppos[j]) {
                 self->startPos[j] = pos;
                 self->gsize[j] = dur[i] * self->sr;
             }
             self->lastppos[j] = ppos;
-            
+
             // compute sampling
             index = ppos * self->gsize[j] + self->startPos[j];
             if (index >= 0 && index < size) {
@@ -421,38 +421,38 @@ Granulator_transform_aia(Granulator *self) {
             }
             else
                 val = 0.0;
-            
+
             self->data[i] += (val * amp);
         }
-        
+
         if (self->pointerPos < 0)
             self->pointerPos += 1.0;
         else if (self->pointerPos >= 1)
             self->pointerPos -= 1.0;
-    } 
+    }
 }
 
 static void
 Granulator_transform_iaa(Granulator *self) {
     MYFLT val, x, x1, inc, index, fpart, amp, ppos;
     int i, j, ipart;
-    
+
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *envlist = TableStream_getData(self->env);
     int envsize = TableStream_getSize(self->env);
-    
+
     MYFLT pit = PyFloat_AS_DOUBLE(self->pitch);
     MYFLT *pos = Stream_getData((Stream *)self->pos_stream);
     MYFLT *dur = Stream_getData((Stream *)self->dur_stream);
-    
+
     inc = pit * (1.0 / self->basedur) / self->sr;
 
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = 0.0;
         self->pointerPos += inc;
-        
+
         for (j=0; j<self->ngrains; j++) {
             ppos = self->pointerPos + self->gphase[j];
             if (ppos >= 1.0) {
@@ -465,13 +465,13 @@ Granulator_transform_iaa(Granulator *self) {
             x = envlist[ipart];
             x1 = envlist[ipart+1];
             amp = x + (x1 - x) * fpart;
-            
+
             if (ppos < self->lastppos[j]) {
                 self->startPos[j] = pos[i];
                 self->gsize[j] = dur[i] * self->sr;
             }
             self->lastppos[j] = ppos;
-            
+
             // compute sampling
             index = ppos * self->gsize[j] + self->startPos[j];
             if (index >= 0 && index < size) {
@@ -483,39 +483,39 @@ Granulator_transform_iaa(Granulator *self) {
             }
             else
                 val = 0.0;
-            
+
             self->data[i] += (val * amp);
         }
-        
+
         if (self->pointerPos < 0)
             self->pointerPos += 1.0;
         else if (self->pointerPos >= 1)
             self->pointerPos -= 1.0;
-    }    
+    }
 }
 
 static void
-Granulator_transform_aaa(Granulator *self) { 
+Granulator_transform_aaa(Granulator *self) {
     MYFLT val, x, x1, inc, index, fpart, amp, ppos, frtosamps;
     int i, j, ipart;
-    
+
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *envlist = TableStream_getData(self->env);
     int envsize = TableStream_getSize(self->env);
-    
+
     MYFLT *pit = Stream_getData((Stream *)self->pitch_stream);
     MYFLT *pos = Stream_getData((Stream *)self->pos_stream);
     MYFLT *dur = Stream_getData((Stream *)self->dur_stream);
-    
+
     frtosamps = (1.0 / self->basedur) / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = 0.0;
         inc = pit[i] * frtosamps;
         self->pointerPos += inc;
-        
+
         for (j=0; j<self->ngrains; j++) {
             ppos = self->pointerPos + self->gphase[j];
             if (ppos >= 1.0) {
@@ -528,13 +528,13 @@ Granulator_transform_aaa(Granulator *self) {
             x = envlist[ipart];
             x1 = envlist[ipart+1];
             amp = x + (x1 - x) * fpart;
-            
+
             if (ppos < self->lastppos[j]) {
                 self->startPos[j] = pos[i];
                 self->gsize[j] = dur[i] * self->sr;
             }
             self->lastppos[j] = ppos;
-            
+
             // compute sampling
             index = ppos * self->gsize[j] + self->startPos[j];
             if (index >= 0 && index < size) {
@@ -546,15 +546,15 @@ Granulator_transform_aaa(Granulator *self) {
             }
             else
                 val = 0.0;
-            
+
             self->data[i] += (val * amp);
         }
-        
+
         if (self->pointerPos < 0)
             self->pointerPos += 1.0;
         else if (self->pointerPos >= 1)
             self->pointerPos -= 1.0;
-    } 
+    }
 }
 
 static void Granulator_postprocessing_ii(Granulator *self) { POST_PROCESSING_II };
@@ -575,66 +575,66 @@ Granulator_setProcMode(Granulator *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Granulator_transform_iii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Granulator_transform_aii;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Granulator_transform_iai;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Granulator_transform_aai;
             break;
-        case 100:        
+        case 100:
             self->proc_func_ptr = Granulator_transform_iia;
             break;
-        case 101:    
+        case 101:
             self->proc_func_ptr = Granulator_transform_aia;
             break;
-        case 110:        
+        case 110:
             self->proc_func_ptr = Granulator_transform_iaa;
             break;
-        case 111:    
+        case 111:
             self->proc_func_ptr = Granulator_transform_aaa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Granulator_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Granulator_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Granulator_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Granulator_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Granulator_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Granulator_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Granulator_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Granulator_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Granulator_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Granulator_compute_next_data_frame(Granulator *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -644,27 +644,27 @@ Granulator_traverse(Granulator *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->table);
     Py_VISIT(self->env);
-    Py_VISIT(self->pitch);    
-    Py_VISIT(self->pitch_stream);    
-    Py_VISIT(self->pos);    
-    Py_VISIT(self->pos_stream);    
-    Py_VISIT(self->dur);    
-    Py_VISIT(self->dur_stream);    
+    Py_VISIT(self->pitch);
+    Py_VISIT(self->pitch_stream);
+    Py_VISIT(self->pos);
+    Py_VISIT(self->pos_stream);
+    Py_VISIT(self->dur);
+    Py_VISIT(self->dur_stream);
     return 0;
 }
 
-static int 
+static int
 Granulator_clear(Granulator *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->table);
     Py_CLEAR(self->env);
-    Py_CLEAR(self->pitch);    
-    Py_CLEAR(self->pitch_stream);    
-    Py_CLEAR(self->pos);    
-    Py_CLEAR(self->pos_stream);    
-    Py_CLEAR(self->dur);    
-    Py_CLEAR(self->dur_stream);    
+    Py_CLEAR(self->pitch);
+    Py_CLEAR(self->pitch_stream);
+    Py_CLEAR(self->pos);
+    Py_CLEAR(self->pos_stream);
+    Py_CLEAR(self->dur);
+    Py_CLEAR(self->dur_stream);
     return 0;
 }
 
@@ -672,7 +672,7 @@ static void
 Granulator_dealloc(Granulator* self)
 {
     pyo_DEALLOC
-    free(self->startPos);   
+    free(self->startPos);
     free(self->gphase);
     free(self->gsize);
     free(self->lastppos);
@@ -723,7 +723,7 @@ Granulator_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     }
     Py_XDECREF(self->env);
     self->env = PyObject_CallMethod((PyObject *)envtmp, "getTableStream", "");
-    
+
     if (pitchtmp) {
         PyObject_CallMethod((PyObject *)self, "setPitch", "O", pitchtmp);
     }
@@ -735,7 +735,7 @@ Granulator_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (durtmp) {
         PyObject_CallMethod((PyObject *)self, "setDur", "O", durtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
@@ -743,7 +743,7 @@ Granulator_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     self->startPos = (MYFLT *)realloc(self->startPos, self->ngrains * sizeof(MYFLT));
@@ -752,7 +752,7 @@ Granulator_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->lastppos = (MYFLT *)realloc(self->lastppos, self->ngrains * sizeof(MYFLT));
 
     Server_generateSeed((Server *)self->server, GRANULATOR_ID);
-    
+
     for (i=0; i<self->ngrains; i++) {
         phase = ((MYFLT)i/self->ngrains) * (1.0 + ((rand()/((MYFLT)(RAND_MAX)+1)*2.0-1.0) * 0.01));
         if (phase < 0.0)
@@ -763,18 +763,18 @@ Granulator_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         self->startPos[i] = self->gsize[i] = 0.0;
         self->lastppos[i] = 1.0;
     }
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Granulator_getServer(Granulator* self) { GET_SERVER };
 static PyObject * Granulator_getStream(Granulator* self) { GET_STREAM };
-static PyObject * Granulator_setMul(Granulator *self, PyObject *arg) { SET_MUL };	
-static PyObject * Granulator_setAdd(Granulator *self, PyObject *arg) { SET_ADD };	
-static PyObject * Granulator_setSub(Granulator *self, PyObject *arg) { SET_SUB };	
-static PyObject * Granulator_setDiv(Granulator *self, PyObject *arg) { SET_DIV };	
+static PyObject * Granulator_setMul(Granulator *self, PyObject *arg) { SET_MUL };
+static PyObject * Granulator_setAdd(Granulator *self, PyObject *arg) { SET_ADD };
+static PyObject * Granulator_setSub(Granulator *self, PyObject *arg) { SET_SUB };
+static PyObject * Granulator_setDiv(Granulator *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Granulator_play(Granulator *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Granulator_out(Granulator *self, PyObject *args, PyObject *kwds) { OUT };
@@ -793,14 +793,14 @@ static PyObject *
 Granulator_setPitch(Granulator *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->pitch);
@@ -816,25 +816,25 @@ Granulator_setPitch(Granulator *self, PyObject *arg)
         self->pitch_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Granulator_setPos(Granulator *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->pos);
@@ -850,25 +850,25 @@ Granulator_setPos(Granulator *self, PyObject *arg)
         self->pos_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Granulator_setDur(Granulator *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->dur);
@@ -884,9 +884,9 @@ Granulator_setDur(Granulator *self, PyObject *arg)
         self->dur_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -902,19 +902,19 @@ static PyObject *
 Granulator_setTable(Granulator *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Granulator_getEnv(Granulator* self)
@@ -927,33 +927,33 @@ static PyObject *
 Granulator_setEnv(Granulator *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->env);
     self->env = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Granulator_setBaseDur(Granulator *self, PyObject *arg)
-{	
+{
 	if (arg != NULL)
         self->basedur = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
-        
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Granulator_setGrains(Granulator *self, PyObject *arg)
-{	
+{
     int i;
     MYFLT phase;
 	if (PyLong_Check(arg) || PyInt_Check(arg)) {
@@ -962,7 +962,7 @@ Granulator_setGrains(Granulator *self, PyObject *arg)
         self->gsize = (MYFLT *)realloc(self->gsize, self->ngrains * sizeof(MYFLT));
         self->gphase = (MYFLT *)realloc(self->gphase, self->ngrains * sizeof(MYFLT));
         self->lastppos = (MYFLT *)realloc(self->lastppos, self->ngrains * sizeof(MYFLT));
-        
+
         for (i=0; i<self->ngrains; i++) {
             phase = ((MYFLT)i/self->ngrains) * (1.0 + ((rand()/((MYFLT)(RAND_MAX)+1)*2.0-1.0) * 0.01));
             if (phase < 0.0)
@@ -972,12 +972,12 @@ Granulator_setGrains(Granulator *self, PyObject *arg)
             self->gphase[i] = phase;
             self->startPos[i] = self->gsize[i] = 0.0;
             self->lastppos[i] = 1.0;
-        }  
-    }    
-    
+        }
+    }
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Granulator_members[] = {
     {"server", T_OBJECT_EX, offsetof(Granulator, server), 0, "Pyo server."},
@@ -1112,8 +1112,9 @@ typedef struct {
     int xfadeshape;
     int startfromloop;
     int init;
-    int mode; /* 0 = no loop, 1 = forward, 2 = backward, 3 = back-and-forth */
+    int mode[2]; /* 0 = no loop, 1 = forward, 2 = backward, 3 = back-and-forth */
     int tmpmode;
+    int direction[2];
     double pointerPos[2];
     int active[2];
     long loopstart[2];
@@ -1133,8 +1134,7 @@ typedef struct {
     MYFLT y2;
     // variables
     MYFLT c1;
-    MYFLT c2;
-    
+
 } Looper;
 
 static void
@@ -1156,7 +1156,7 @@ Looper_reset(Looper *self, int x, int which, int init) {
         xfade = PyFloat_AS_DOUBLE(self->xfade);
     else
         xfade = Stream_getData((Stream *)self->xfade_stream)[x];
-    
+
     if (start < 0.0)
         start = 0.0;
     else if (start > (size/tableSr))
@@ -1176,18 +1176,16 @@ Looper_reset(Looper *self, int x, int which, int init) {
         self->fader = LOOPER_SIGMOID_FADE;
     else
         self->fader = LOOPER_LINEAR_FADE;
-    
-    if (self->tmpmode != self->mode) {
-        self->mode = self->tmpmode;
-        self->active[0] = self->active[1] = 0;
-        which = 0;
-    }
-    
-    switch (self->mode) {
+
+    if (self->tmpmode != self->mode[which])
+        self->mode[which] = self->tmpmode;
+
+    switch (self->mode[which]) {
         case 0:
             self->loopstart[which] = 0;
             self->loopend[which] = (long)size;
-                self->crossfadedur[which] = 5;
+            if (self->crossfadedur[which] < 1)
+                self->crossfadedur[which] = 1;
             self->crossfadescaling[which] = 1.0 / self->crossfadedur[which] * 512.0;
             if (init == 1 && self->startfromloop == 0) {
                 self->minfadepoint[which] = self->crossfadedur[which];
@@ -1197,15 +1195,15 @@ Looper_reset(Looper *self, int x, int which, int init) {
             else {
                 self->minfadepoint[which] = self->loopstart[which] + self->crossfadedur[which];
                 self->maxfadepoint[which] = self->loopend[which] - self->crossfadedur[which];
-                self->pointerPos[which] = self->loopstart[which];        
-            }            
+                self->pointerPos[which] = self->loopstart[which];
+            }
             break;
         case 1:
             self->loopstart[which] = (long)(start * tableSr);
             self->loopend[which] = (long)((start + dur) * tableSr);
             self->crossfadedur[which] = (long)((self->loopend[which] - self->loopstart[which]) * xfade * 0.01);
-            if (self->crossfadedur[which] < 5)
-                self->crossfadedur[which] = 5;
+            if (self->crossfadedur[which] < 1)
+                self->crossfadedur[which] = 1;
             self->crossfadescaling[which] = 1.0 / self->crossfadedur[which] * 512.0;
             if (init == 1 && self->startfromloop == 0) {
                 self->minfadepoint[which] = self->crossfadedur[which];
@@ -1215,15 +1213,15 @@ Looper_reset(Looper *self, int x, int which, int init) {
             else {
                 self->minfadepoint[which] = self->loopstart[which] + self->crossfadedur[which];
                 self->maxfadepoint[which] = self->loopend[which] - self->crossfadedur[which];
-                self->pointerPos[which] = self->loopstart[which];        
-            }            
+                self->pointerPos[which] = self->loopstart[which];
+            }
             break;
         case 2:
             self->loopstart[which] = (long)((start + dur) * tableSr);
-            self->loopend[which] = (long)((start) * tableSr);
+            self->loopend[which] = (long)(start * tableSr);
             self->crossfadedur[which] = (long)((self->loopstart[which] - self->loopend[which]) * xfade * 0.01);
-            if (self->crossfadedur[which] < 5)
-                self->crossfadedur[which] = 5;
+            if (self->crossfadedur[which] < 1)
+                self->crossfadedur[which] = 1;
             self->crossfadescaling[which] = 1.0 / self->crossfadedur[which] * 512.0;
             if (init == 1 && self->startfromloop == 0) {
                 self->minfadepoint[which] = size - self->crossfadedur[which];
@@ -1233,16 +1231,29 @@ Looper_reset(Looper *self, int x, int which, int init) {
             else {
                 self->minfadepoint[which] = self->loopstart[which] - self->crossfadedur[which];
                 self->maxfadepoint[which] = self->loopend[which] + self->crossfadedur[which];
-                self->pointerPos[which] = self->loopstart[which];        
-            }            
+                self->pointerPos[which] = self->loopstart[which];
+            }
             break;
         case 3:
-            if (which == 0) {
+            if (self->direction[1-which] == 0) {
+                self->direction[which] = 1;
+                self->loopstart[which] = (long)((start + dur) * tableSr);
+                self->loopend[which] = (long)(start * tableSr);
+                self->crossfadedur[which] = (long)((self->loopstart[which] - self->loopend[which]) * xfade * 0.01);
+                if (self->crossfadedur[which] < 1)
+                    self->crossfadedur[which] = 1;
+                self->crossfadescaling[which] = 1.0 / self->crossfadedur[which] * 512.0;
+                self->minfadepoint[which] = self->loopstart[which] - self->crossfadedur[which];
+                self->maxfadepoint[which] = self->loopend[which] + self->crossfadedur[which];
+                self->pointerPos[which] = self->loopstart[which];
+            }
+            else {
+                self->direction[which] = 0;
                 self->loopstart[which] = (long)(start * tableSr);
                 self->loopend[which] = (long)((start + dur) * tableSr);
                 self->crossfadedur[which] = (long)((self->loopend[which] - self->loopstart[which]) * xfade * 0.01);
-                if (self->crossfadedur[which] < 5)
-                    self->crossfadedur[which] = 5;
+                if (self->crossfadedur[which] < 1)
+                    self->crossfadedur[which] = 1;
                 self->crossfadescaling[which] = 1.0 / self->crossfadedur[which] * 512.0;
                 if (init == 1 && self->startfromloop == 0) {
                     self->minfadepoint[which] = self->crossfadedur[which];
@@ -1252,32 +1263,26 @@ Looper_reset(Looper *self, int x, int which, int init) {
                 else {
                     self->minfadepoint[which] = self->loopstart[which] + self->crossfadedur[which];
                     self->maxfadepoint[which] = self->loopend[which] - self->crossfadedur[which];
-                    self->pointerPos[which] = self->loopstart[which];        
+                    self->pointerPos[which] = self->loopstart[which];
                 }
             }
-            else {
-                self->loopstart[which] = (long)((start + dur) * tableSr);
-                self->loopend[which] = (long)(start * tableSr);
-                self->crossfadedur[which] = (long)((self->loopstart[which] - self->loopend[which]) * xfade * 0.01);
-                if (self->crossfadedur[which] < 5)
-                    self->crossfadedur[which] = 5;
-                self->crossfadescaling[which] = 1.0 / self->crossfadedur[which] * 512.0;
-                self->minfadepoint[which] = self->loopstart[which] - self->crossfadedur[which];
-                self->maxfadepoint[which] = self->loopend[which] + self->crossfadedur[which];
-                self->pointerPos[which] = self->loopstart[which];
-            }
             break;
     }
-
     self->active[which] = 1;
 }
 
+static MYFLT
+Looper_get_amp(Looper *self, MYFLT pos) {
+    int ipart = (int)pos;
+    return self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * (pos - ipart);
+}
+
 static void
 Looper_transform_i(Looper *self) {
-    MYFLT fpart, amp, fr, b;
+    MYFLT fpart, amp, fr;
     double pit;
     int i, j, ipart;
-    
+
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
     double tableSr = TableStream_getSamplingRate(self->table);
@@ -1285,68 +1290,51 @@ Looper_transform_i(Looper *self) {
     MYFLT pitval = PyFloat_AS_DOUBLE(self->pitch);
     if (pitval < 0.0)
         pitval = 0.0;
-    
+
     pit = pitval * tableSr / self->sr;
-    
+
     if (self->active[0] == 0 && self->active[1] == 0) {
         Looper_reset(self, 0, 0, 1);
     }
-    
-    switch (self->mode) {
-        case 0:            
-            for (i=0; i<self->bufsize; i++) {
-                self->data[i] = 0.0;
-                if (self->active[0] == 1) {
-                    if (self->pointerPos[0] > size)
-                        self->data[i] += 0.0;
-                    else {
-                        if (self->pointerPos[0] < self->minfadepoint[0]) {
-                            fpart = (self->pointerPos[0] - self->loopstart[0]) * self->crossfadescaling[0];
-                            ipart = (int)fpart;
-                            fpart = fpart - ipart;
-                            amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
+
+    for (i=0; i<self->bufsize; i++) {
+        self->data[i] = 0.0;
+        for (j=0; j<2; j++) {
+            if (self->active[j] == 1) {
+                switch (self->mode[j]) {
+                    case 0:
+                        if (self->pointerPos[j] >= 0 && self->pointerPos[j] < size) {
+                            if (self->pointerPos[j] < self->minfadepoint[j]) {
+                                fpart = (self->pointerPos[j] - self->loopstart[j]) * self->crossfadescaling[j];
+                                amp = Looper_get_amp(self, fpart);
+                            }
+                            else if (self->pointerPos[j] > self->maxfadepoint[j]) {
+                                fpart = (self->loopend[j] - self->pointerPos[j]) * self->crossfadescaling[j];
+                                amp = Looper_get_amp(self, fpart);
+                            }
+                            else
+                                amp = 1.0;
+                            ipart = (int)self->pointerPos[j];
+                            fpart = self->pointerPos[j] - ipart;
+                            self->data[i] += (*self->interp_func_ptr)(tablelist, ipart, fpart, size) * amp;
                         }
-                        else if (self->pointerPos[0] > self->maxfadepoint[0]) {
-                            fpart = (self->loopend[0] - self->pointerPos[0]) * self->crossfadescaling[0];
-                            ipart = (int)fpart;
-                            fpart = fpart - ipart;
-                            amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
+                        self->pointerPos[j] += pit;
+                        if (self->pointerPos[j] < 0.0)
+                            self->pointerPos[j] = 0.0;
+                        else if (self->pointerPos[j] >= self->loopend[j]) {
+                            self->active[j] = 0;
+                            PyObject_CallMethod((PyObject *)self, "stop", NULL);
                         }
-                        else
-                            amp = 1.0;
-                        ipart = (int)self->pointerPos[0];
-                        fpart = self->pointerPos[0] - ipart;
-                        self->data[i] += (*self->interp_func_ptr)(tablelist, ipart, fpart, size) * amp;
-                    }
-                    self->pointerPos[0] += pit;
-                    if (self->pointerPos[0] < 0)
-                        self->pointerPos[0] = 0.0;
-                    else if (self->pointerPos[0] >= self->loopend[0]) {
-                        self->active[0] = 0;
-                        PyObject_CallMethod((PyObject *)self, "stop", NULL);
-                    }
-                }
-            }
-            break;
-        case 1:
-            for (i=0; i<self->bufsize; i++) {
-                self->data[i] = 0.0;
-                for (j=0; j<2; j++) {
-                    if (self->active[j] == 1) {
-                        if (self->pointerPos[j] > size)
-                            self->data[i] += 0.0;
-                        else {
+                        break;
+                    case 1:
+                        if (self->pointerPos[j] >= 0 && self->pointerPos[j] < size) {
                             if (self->pointerPos[j] < self->minfadepoint[j]) {
                                 fpart = (self->pointerPos[j] - self->loopstart[j]) * self->crossfadescaling[j];
-                                ipart = (int)fpart;
-                                fpart = fpart - ipart;
-                                amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
+                                amp = Looper_get_amp(self, fpart);
                             }
                             else if (self->pointerPos[j] > self->maxfadepoint[j]) {
                                 fpart = (self->loopend[j] - self->pointerPos[j]) * self->crossfadescaling[j];
-                                ipart = (int)fpart;
-                                fpart = fpart - ipart;
-                                amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
+                                amp = Looper_get_amp(self, fpart);
                             }
                             else
                                 amp = 1.0;
@@ -1355,35 +1343,22 @@ Looper_transform_i(Looper *self) {
                             self->data[i] += (*self->interp_func_ptr)(tablelist, ipart, fpart, size) * amp;
                         }
                         self->pointerPos[j] += pit;
-                        if (self->pointerPos[j] < 0)
+                        if (self->pointerPos[j] < 0.0)
                             self->pointerPos[j] = 0.0;
                         else if (self->pointerPos[j] > self->maxfadepoint[j] && self->active[1-j] == 0)
-                            Looper_reset(self, i, 1-j, 0);                    
-                        else if (self->pointerPos[j] >= self->loopend[j])
+                            Looper_reset(self, i, 1-j, 0);
+                        if (self->pointerPos[j] >= self->loopend[j])
                             self->active[j] = 0;
-                    }
-                }
-            }
-            break;
-        case 2:
-            for (i=0; i<self->bufsize; i++) {
-                self->data[i] = 0.0;
-                for (j=0; j<2; j++) {
-                    if (self->active[j] == 1) {
-                        if (self->pointerPos[j] < 0.0)
-                            self->data[i] += 0.0;
-                        else {
+                        break;
+                    case 2:
+                        if (self->pointerPos[j] >= 0 && self->pointerPos[j] < size) {
                             if (self->pointerPos[j] > self->minfadepoint[j]) {
                                 fpart = (self->loopstart[j] - self->pointerPos[j]) * self->crossfadescaling[j];
-                                ipart = (int)fpart;
-                                fpart = fpart - ipart;
-                                amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
+                                amp = Looper_get_amp(self, fpart);
                             }
                             else if (self->pointerPos[j] < self->maxfadepoint[j]) {
                                 fpart = (self->pointerPos[j] - self->loopend[j]) * self->crossfadescaling[j];
-                                ipart = (int)fpart;
-                                fpart = fpart - ipart;
-                                amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
+                                amp = Looper_get_amp(self, fpart);
                             }
                             else
                                 amp = 1.0;
@@ -1395,92 +1370,77 @@ Looper_transform_i(Looper *self) {
                         if (self->pointerPos[j] >= size)
                             self->pointerPos[j] = size-1;
                         else if (self->pointerPos[j] < self->maxfadepoint[j] && self->active[1-j] == 0)
-                            Looper_reset(self, i, 1-j, 0);                    
-                        else if (self->pointerPos[j] <= self->loopend[j])
+                            Looper_reset(self, i, 1-j, 0);
+                        if (self->pointerPos[j] <= self->loopend[j])
                             self->active[j] = 0;
-                    }
-                }
-            }
-            break;
-        case 3:
-            for (i=0; i<self->bufsize; i++) {
-                self->data[i] = 0.0;
-                if (self->active[0] == 1) {
-                    if (self->pointerPos[0] > size)
-                        self->data[i] += 0.0;
-                    else {
-                        if (self->pointerPos[0] < self->minfadepoint[0]) {
-                            fpart = (self->pointerPos[0] - self->loopstart[0]) * self->crossfadescaling[0];
-                            ipart = (int)fpart;
-                            fpart = fpart - ipart;
-                            amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
-                        }
-                        else if (self->pointerPos[0] > self->maxfadepoint[0]) {
-                            fpart = (self->loopend[0] - self->pointerPos[0]) * self->crossfadescaling[0];
-                            ipart = (int)fpart;
-                            fpart = fpart - ipart;
-                            amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
-                        }
-                        else
-                            amp = 1.0;
-                        ipart = (int)self->pointerPos[0];
-                        fpart = self->pointerPos[0] - ipart;
-                        self->data[i] += (*self->interp_func_ptr)(tablelist, ipart, fpart, size) * amp;
-                    }
-                    self->pointerPos[0] += pit;
-                    if (self->pointerPos[0] < 0)
-                        self->pointerPos[0] = 0.0;
-                    else if (self->pointerPos[0] > self->maxfadepoint[0] && self->active[1] == 0)
-                        Looper_reset(self, i, 1, 0);                    
-                    else if (self->pointerPos[0] >= self->loopend[0])
-                        self->active[0] = 0;
-                } 
-                if (self->active[1] == 1) {
-                    if (self->pointerPos[1] < 0.0)
-                        self->data[i] += 0.0;
-                    else {
-                        if (self->pointerPos[1] > self->minfadepoint[1]) {
-                            fpart = (self->loopstart[1] - self->pointerPos[1]) * self->crossfadescaling[1];
-                            ipart = (int)fpart;
-                            fpart = fpart - ipart;
-                            amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
+                        break;
+                    case 3:
+                        if (self->direction[j] == 0) {
+                            if (self->pointerPos[j] >= 0 && self->pointerPos[j] < size) {
+                                if (self->pointerPos[j] < self->minfadepoint[j]) {
+                                    fpart = (self->pointerPos[j] - self->loopstart[j]) * self->crossfadescaling[j];
+                                    amp = Looper_get_amp(self, fpart);
+                                }
+                                else if (self->pointerPos[j] > self->maxfadepoint[j]) {
+                                    fpart = (self->loopend[j] - self->pointerPos[j]) * self->crossfadescaling[j];
+                                    amp = Looper_get_amp(self, fpart);
+                                }
+                                else
+                                    amp = 1.0;
+                                ipart = (int)self->pointerPos[j];
+                                fpart = self->pointerPos[j] - ipart;
+                                self->data[i] += (*self->interp_func_ptr)(tablelist, ipart, fpart, size) * amp;
+                            }
+                            self->pointerPos[j] += pit;
+                            if (self->pointerPos[j] < 0.0)
+                                self->pointerPos[j] = 0.0;
+                            else if (self->pointerPos[j] > self->maxfadepoint[j] && self->active[1-j] == 0)
+                                Looper_reset(self, i, 1-j, 0);
+                            if (self->pointerPos[j] >= self->loopend[j])
+                                self->active[j] = 0;
                         }
-                        else if (self->pointerPos[1] < self->maxfadepoint[1]) {
-                            fpart = (self->pointerPos[1] - self->loopend[1]) * self->crossfadescaling[1];
-                            ipart = (int)fpart;
-                            fpart = fpart - ipart;
-                            amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
+                        else {
+                            if (self->pointerPos[j] >= 0 && self->pointerPos[j] < size) {
+                                if (self->pointerPos[j] > self->minfadepoint[j]) {
+                                    fpart = (self->loopstart[j] - self->pointerPos[j]) * self->crossfadescaling[j];
+                                    amp = Looper_get_amp(self, fpart);
+                                }
+                                else if (self->pointerPos[j] < self->maxfadepoint[j]) {
+                                    fpart = (self->pointerPos[j] - self->loopend[j]) * self->crossfadescaling[j];
+                                    amp = Looper_get_amp(self, fpart);
+                                }
+                                else
+                                    amp = 1.0;
+                                ipart = (int)self->pointerPos[j];
+                                fpart = self->pointerPos[j] - ipart;
+                                self->data[i] += (*self->interp_func_ptr)(tablelist, ipart, fpart, size) * amp;
+                            }
+                            self->pointerPos[j] -= pit;
+                            if (self->pointerPos[j] >= size)
+                                self->pointerPos[j] = size-1;
+                            else if (self->pointerPos[j] < self->maxfadepoint[j] && self->active[1-j] == 0)
+                                Looper_reset(self, i, 1-j, 0);
+                            if (self->pointerPos[j] <= self->loopend[j])
+                                self->active[j] = 0;
                         }
-                        else
-                            amp = 1.0;
-                        ipart = (int)self->pointerPos[1];
-                        fpart = self->pointerPos[1] - ipart;
-                        self->data[i] += (*self->interp_func_ptr)(tablelist, ipart, fpart, size) * amp;
-                    }
-                    self->pointerPos[1] -= pit;
-                    if (self->pointerPos[1] >= size)
-                        self->pointerPos[1] = size-1;
-                    else if (self->pointerPos[1] < self->maxfadepoint[1] && self->active[0] == 0)
-                        Looper_reset(self, i, 0, 0);                    
-                    else if (self->pointerPos[1] <= self->loopend[1])
-                        self->active[1] = 0;
-                }
+                        break;
+                } // end of switch
             }
-            break;
+        }
     }
 
     /* Automatic smoothering of low transposition */
-    if (self->autosmooth == 1 && pitval < 1.0 && pit > 0.0) {
+    if (self->autosmooth == 1 && pitval < 1.0) {
         if (self->lastpitch != pitval) {
             self->lastpitch = pitval;
-            fr = pitval * tableSr * 0.45;
-            b = 2.0 - MYCOS(TWOPI * fr / self->sr);
-            self->c2 = (b - MYSQRT(b * b - 1.0));
-            self->c1 = 1.0 - self->c2;
+            if (pitval < 0.001)
+                pitval = 0.001;
+            fr = pitval * self->sr * 0.45;
+            self->c1 = MYEXP(-TWOPI * fr / self->sr);
         }
         for (i=0; i<self->bufsize; i++) {
-            self->y1 = self->c1 * self->data[i] + self->c2 * self->y1;
-            self->y2 = self->c1 * self->y1 + self->c2 * self->y2;
+            self->y1 = self->data[i] + (self->y1 - self->data[i]) * self->c1;
+            self->y2 = self->y1 + (self->y2 - self->y1) * self->c1;
             self->data[i] = self->y2;
         }
     }
@@ -1488,84 +1448,64 @@ Looper_transform_i(Looper *self) {
 
 static void
 Looper_transform_a(Looper *self) {
-    MYFLT fpart, amp, fr, b;
-    double pit;
+    MYFLT fpart, amp, fr, pitval;
+    double pit, srFactor;
     int i, j, ipart;
-    
+
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
     double tableSr = TableStream_getSamplingRate(self->table);
-    double ratio = tableSr / self->sr;
-    
+
     MYFLT *pitch = Stream_getData((Stream *)self->pitch_stream);
-    
+
+    srFactor = tableSr / self->sr;
+
     if (self->active[0] == 0 && self->active[1] == 0) {
         Looper_reset(self, 0, 0, 1);
     }
-    
-    switch (self->mode) {
-        case 0:            
-            for (i=0; i<self->bufsize; i++) {
-                self->data[i] = 0.0;
-                pit = pitch[i];
-                if (pit < 0.0)
-                    pit = 0.0;    
-                pit = pit * ratio;
-                if (self->active[0] == 1) {
-                    if (self->pointerPos[0] > size)
-                        self->data[i] += 0.0;
-                    else {
-                        if (self->pointerPos[0] < self->minfadepoint[0]) {
-                            fpart = (self->pointerPos[0] - self->loopstart[0]) * self->crossfadescaling[0];
-                            ipart = (int)fpart;
-                            fpart = fpart - ipart;
-                            amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
+
+    for (i=0; i<self->bufsize; i++) {
+        self->data[i] = 0.0;
+        pitval = pitch[i];
+        if (pitval < 0.0)
+            pitval = 0.0;
+        pit = pitval * srFactor;
+        for (j=0; j<2; j++) {
+            if (self->active[j] == 1) {
+                switch (self->mode[j]) {
+                    case 0:
+                        if (self->pointerPos[j] >= 0 && self->pointerPos[j] < size) {
+                            if (self->pointerPos[j] < self->minfadepoint[j]) {
+                                fpart = (self->pointerPos[j] - self->loopstart[j]) * self->crossfadescaling[j];
+                                amp = Looper_get_amp(self, fpart);
+                            }
+                            else if (self->pointerPos[j] > self->maxfadepoint[j]) {
+                                fpart = (self->loopend[j] - self->pointerPos[j]) * self->crossfadescaling[j];
+                                amp = Looper_get_amp(self, fpart);
+                            }
+                            else
+                                amp = 1.0;
+                            ipart = (int)self->pointerPos[j];
+                            fpart = self->pointerPos[j] - ipart;
+                            self->data[i] += (*self->interp_func_ptr)(tablelist, ipart, fpart, size) * amp;
                         }
-                        else if (self->pointerPos[0] > self->maxfadepoint[0]) {
-                            fpart = (self->loopend[0] - self->pointerPos[0]) * self->crossfadescaling[0];
-                            ipart = (int)fpart;
-                            fpart = fpart - ipart;
-                            amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
+                        self->pointerPos[j] += pit;
+                        if (self->pointerPos[j] < 0.0)
+                            self->pointerPos[j] = 0.0;
+                        else if (self->pointerPos[j] >= self->loopend[j]) {
+                            self->active[j] = 0;
+                            PyObject_CallMethod((PyObject *)self, "stop", NULL);
                         }
-                        else
-                            amp = 1.0;
-                        ipart = (int)self->pointerPos[0];
-                        fpart = self->pointerPos[0] - ipart;
-                        self->data[i] += (*self->interp_func_ptr)(tablelist, ipart, fpart, size) * amp;
-                    }
-                    self->pointerPos[0] += pit;
-                    if (self->pointerPos[0] < 0)
-                        self->pointerPos[0] = 0.0;
-                    else if (self->pointerPos[0] >= self->loopend[0]) {
-                        self->active[0] = 0;
-                        PyObject_CallMethod((PyObject *)self, "stop", NULL);
-                    }
-                }
-            }
-            break;
-        case 1:
-            for (i=0; i<self->bufsize; i++) {
-                self->data[i] = 0.0;
-                pit = pitch[i];
-                if (pit < 0.0)
-                    pit = 0.0;    
-                pit = pit * ratio;
-                for (j=0; j<2; j++) {
-                    if (self->active[j] == 1) {
-                        if (self->pointerPos[j] > size)
-                            self->data[i] += 0.0;
-                        else {
+                        break;
+                    case 1:
+                        if (self->pointerPos[j] >= 0 && self->pointerPos[j] < size) {
                             if (self->pointerPos[j] < self->minfadepoint[j]) {
                                 fpart = (self->pointerPos[j] - self->loopstart[j]) * self->crossfadescaling[j];
-                                ipart = (int)fpart;
-                                fpart = fpart - ipart;
-                                amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
+                                amp = Looper_get_amp(self, fpart);
                             }
                             else if (self->pointerPos[j] > self->maxfadepoint[j]) {
                                 fpart = (self->loopend[j] - self->pointerPos[j]) * self->crossfadescaling[j];
-                                ipart = (int)fpart;
-                                fpart = fpart - ipart;
-                                amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
+                                amp = Looper_get_amp(self, fpart);
                             }
                             else
                                 amp = 1.0;
@@ -1574,39 +1514,22 @@ Looper_transform_a(Looper *self) {
                             self->data[i] += (*self->interp_func_ptr)(tablelist, ipart, fpart, size) * amp;
                         }
                         self->pointerPos[j] += pit;
-                        if (self->pointerPos[j] < 0)
+                        if (self->pointerPos[j] < 0.0)
                             self->pointerPos[j] = 0.0;
                         else if (self->pointerPos[j] > self->maxfadepoint[j] && self->active[1-j] == 0)
-                            Looper_reset(self, i, 1-j, 0);                    
-                        else if (self->pointerPos[j] >= self->loopend[j])
+                            Looper_reset(self, i, 1-j, 0);
+                        if (self->pointerPos[j] >= self->loopend[j])
                             self->active[j] = 0;
-                    }
-                }
-            }
-            break;
-        case 2:
-            for (i=0; i<self->bufsize; i++) {
-                self->data[i] = 0.0;
-                pit = pitch[i];
-                if (pit < 0.0)
-                    pit = 0.0;    
-                pit = pit * ratio;
-                for (j=0; j<2; j++) {
-                    if (self->active[j] == 1) {
-                        if (self->pointerPos[j] < 0.0)
-                            self->data[i] += 0.0;
-                        else {
+                        break;
+                    case 2:
+                        if (self->pointerPos[j] >= 0 && self->pointerPos[j] < size) {
                             if (self->pointerPos[j] > self->minfadepoint[j]) {
                                 fpart = (self->loopstart[j] - self->pointerPos[j]) * self->crossfadescaling[j];
-                                ipart = (int)fpart;
-                                fpart = fpart - ipart;
-                                amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
+                                amp = Looper_get_amp(self, fpart);
                             }
                             else if (self->pointerPos[j] < self->maxfadepoint[j]) {
                                 fpart = (self->pointerPos[j] - self->loopend[j]) * self->crossfadescaling[j];
-                                ipart = (int)fpart;
-                                fpart = fpart - ipart;
-                                amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
+                                amp = Looper_get_amp(self, fpart);
                             }
                             else
                                 amp = 1.0;
@@ -1618,102 +1541,80 @@ Looper_transform_a(Looper *self) {
                         if (self->pointerPos[j] >= size)
                             self->pointerPos[j] = size-1;
                         else if (self->pointerPos[j] < self->maxfadepoint[j] && self->active[1-j] == 0)
-                            Looper_reset(self, i, 1-j, 0);                    
-                        else if (self->pointerPos[j] <= self->loopend[j])
+                            Looper_reset(self, i, 1-j, 0);
+                        if (self->pointerPos[j] <= self->loopend[j])
                             self->active[j] = 0;
-                    }
-                }
-            }
-            break;
-        case 3:
-            for (i=0; i<self->bufsize; i++) {
-                self->data[i] = 0.0;
-                pit = pitch[i];
-                if (pit < 0.0)
-                    pit = 0.0;    
-                pit = pit * ratio;
-                if (self->active[0] == 1) {
-                    if (self->pointerPos[0] > size)
-                        self->data[i] += 0.0;
-                    else {
-                        if (self->pointerPos[0] < self->minfadepoint[0]) {
-                            fpart = (self->pointerPos[0] - self->loopstart[0]) * self->crossfadescaling[0];
-                            ipart = (int)fpart;
-                            fpart = fpart - ipart;
-                            amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
-                        }
-                        else if (self->pointerPos[0] > self->maxfadepoint[0]) {
-                            fpart = (self->loopend[0] - self->pointerPos[0]) * self->crossfadescaling[0];
-                            ipart = (int)fpart;
-                            fpart = fpart - ipart;
-                            amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
-                        }
-                        else
-                            amp = 1.0;
-                        ipart = (int)self->pointerPos[0];
-                        fpart = self->pointerPos[0] - ipart;
-                        self->data[i] += (*self->interp_func_ptr)(tablelist, ipart, fpart, size) * amp;
-                    }
-                    self->pointerPos[0] += pit;
-                    if (self->pointerPos[0] < 0)
-                        self->pointerPos[0] = 0.0;
-                    else if (self->pointerPos[0] > self->maxfadepoint[0] && self->active[1] == 0)
-                        Looper_reset(self, i, 1, 0);                    
-                    else if (self->pointerPos[0] >= self->loopend[0])
-                        self->active[0] = 0;
-                } 
-                if (self->active[1] == 1) {
-                    if (self->pointerPos[1] < 0.0)
-                        self->data[i] += 0.0;
-                    else {
-                        if (self->pointerPos[1] > self->minfadepoint[1]) {
-                            fpart = (self->loopstart[1] - self->pointerPos[1]) * self->crossfadescaling[1];
-                            ipart = (int)fpart;
-                            fpart = fpart - ipart;
-                            amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
+                        break;
+                    case 3:
+                        if (self->direction[j] == 0) {
+                            if (self->pointerPos[j] >= 0 && self->pointerPos[j] < size) {
+                                if (self->pointerPos[j] < self->minfadepoint[j]) {
+                                    fpart = (self->pointerPos[j] - self->loopstart[j]) * self->crossfadescaling[j];
+                                    amp = Looper_get_amp(self, fpart);
+                                }
+                                else if (self->pointerPos[j] > self->maxfadepoint[j]) {
+                                    fpart = (self->loopend[j] - self->pointerPos[j]) * self->crossfadescaling[j];
+                                    amp = Looper_get_amp(self, fpart);
+                                }
+                                else
+                                    amp = 1.0;
+                                ipart = (int)self->pointerPos[j];
+                                fpart = self->pointerPos[j] - ipart;
+                                self->data[i] += (*self->interp_func_ptr)(tablelist, ipart, fpart, size) * amp;
+                            }
+                            self->pointerPos[j] += pit;
+                            if (self->pointerPos[j] < 0.0)
+                                self->pointerPos[j] = 0.0;
+                            else if (self->pointerPos[j] > self->maxfadepoint[j] && self->active[1-j] == 0)
+                                Looper_reset(self, i, 1-j, 0);
+                            if (self->pointerPos[j] >= self->loopend[j])
+                                self->active[j] = 0;
                         }
-                        else if (self->pointerPos[1] < self->maxfadepoint[1]) {
-                            fpart = (self->pointerPos[1] - self->loopend[1]) * self->crossfadescaling[1];
-                            ipart = (int)fpart;
-                            fpart = fpart - ipart;
-                            amp = self->fader[ipart] + (self->fader[ipart+1] - self->fader[ipart]) * fpart;
+                        else {
+                            if (self->pointerPos[j] >= 0 && self->pointerPos[j] < size) {
+                                if (self->pointerPos[j] > self->minfadepoint[j]) {
+                                    fpart = (self->loopstart[j] - self->pointerPos[j]) * self->crossfadescaling[j];
+                                    amp = Looper_get_amp(self, fpart);
+                                }
+                                else if (self->pointerPos[j] < self->maxfadepoint[j]) {
+                                    fpart = (self->pointerPos[j] - self->loopend[j]) * self->crossfadescaling[j];
+                                    amp = Looper_get_amp(self, fpart);
+                                }
+                                else
+                                    amp = 1.0;
+                                ipart = (int)self->pointerPos[j];
+                                fpart = self->pointerPos[j] - ipart;
+                                self->data[i] += (*self->interp_func_ptr)(tablelist, ipart, fpart, size) * amp;
+                            }
+                            self->pointerPos[j] -= pit;
+                            if (self->pointerPos[j] >= size)
+                                self->pointerPos[j] = size-1;
+                            else if (self->pointerPos[j] < self->maxfadepoint[j] && self->active[1-j] == 0)
+                                Looper_reset(self, i, 1-j, 0);
+                            if (self->pointerPos[j] <= self->loopend[j])
+                                self->active[j] = 0;
                         }
-                        else
-                            amp = 1.0;
-                        ipart = (int)self->pointerPos[1];
-                        fpart = self->pointerPos[1] - ipart;
-                        self->data[i] += (*self->interp_func_ptr)(tablelist, ipart, fpart, size) * amp;
-                    }
-                    self->pointerPos[1] -= pit;
-                    if (self->pointerPos[1] >= size)
-                        self->pointerPos[1] = size-1;
-                    else if (self->pointerPos[1] < self->maxfadepoint[1] && self->active[0] == 0)
-                        Looper_reset(self, i, 0, 0);                    
-                    else if (self->pointerPos[1] <= self->loopend[1])
-                        self->active[1] = 0;
-                }
+                        break;
+                } // end of switch
             }
-            break;
+        }
     }
+
     /* Automatic smoothering of low transposition */
     if (self->autosmooth == 1) {
         for (i=0; i<self->bufsize; i++) {
-            pit = pitch[i];
-            if (pit < 0.0)
-                pit = 0.0;    
-            if (pit < 1.0 && pit > 0.0) {
-                if (self->lastpitch != pit) {
-                    self->lastpitch = pit;
-                    fr = pit * tableSr * 0.45;
-                    b = 2.0 - MYCOS(TWOPI * fr / self->sr);
-                    self->c2 = (b - MYSQRT(b * b - 1.0));
-                    self->c1 = 1.0 - self->c2;
-                }
-                for (i=0; i<self->bufsize; i++) {
-                    self->y1 = self->c1 * self->data[i] + self->c2 * self->y1;
-                    self->y2 = self->c1 * self->y1 + self->c2 * self->y2;
-                    self->data[i] = self->y2;
+            pitval = pitch[i];
+            if (pitval < 0.001)
+                pitval = 0.001;
+            if (pitval < 1.0) {
+                if (self->lastpitch != pitval) {
+                    self->lastpitch = pitval;
+                    fr = pitval * self->sr * 0.45;
+                    self->c1 = MYEXP(-TWOPI * fr / self->sr);
                 }
+                self->y1 = self->data[i] + (self->y1 - self->data[i]) * self->c1;
+                self->y2 = self->y1 + (self->y2 - self->y1) * self->c1;
+                self->data[i] = self->y2;
             }
         }
     }
@@ -1735,50 +1636,50 @@ Looper_setProcMode(Looper *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Looper_transform_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Looper_transform_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Looper_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Looper_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Looper_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Looper_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Looper_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Looper_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Looper_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Looper_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Looper_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Looper_compute_next_data_frame(Looper *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1787,30 +1688,30 @@ Looper_traverse(Looper *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->table);
-    Py_VISIT(self->pitch);    
-    Py_VISIT(self->pitch_stream);    
-    Py_VISIT(self->start);    
-    Py_VISIT(self->start_stream);    
-    Py_VISIT(self->dur);    
-    Py_VISIT(self->dur_stream);    
-    Py_VISIT(self->xfade);    
-    Py_VISIT(self->xfade_stream);    
+    Py_VISIT(self->pitch);
+    Py_VISIT(self->pitch_stream);
+    Py_VISIT(self->start);
+    Py_VISIT(self->start_stream);
+    Py_VISIT(self->dur);
+    Py_VISIT(self->dur_stream);
+    Py_VISIT(self->xfade);
+    Py_VISIT(self->xfade_stream);
     return 0;
 }
 
-static int 
+static int
 Looper_clear(Looper *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->table);
-    Py_CLEAR(self->pitch);    
-    Py_CLEAR(self->pitch_stream);    
-    Py_CLEAR(self->start);    
-    Py_CLEAR(self->start_stream);    
-    Py_CLEAR(self->dur);    
-    Py_CLEAR(self->dur_stream);    
-    Py_CLEAR(self->xfade);    
-    Py_CLEAR(self->xfade_stream);    
+    Py_CLEAR(self->pitch);
+    Py_CLEAR(self->pitch_stream);
+    Py_CLEAR(self->start);
+    Py_CLEAR(self->start_stream);
+    Py_CLEAR(self->dur);
+    Py_CLEAR(self->dur_stream);
+    Py_CLEAR(self->xfade);
+    Py_CLEAR(self->xfade_stream);
     return 0;
 }
 
@@ -1829,19 +1730,20 @@ Looper_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *tabletmp, *pitchtmp=NULL, *starttmp=NULL, *durtmp=NULL, *xfadetmp=NULL, *multmp=NULL, *addtmp=NULL;
     Looper *self;
     self = (Looper *)type->tp_alloc(type, 0);
-    
+
     self->pitch = PyFloat_FromDouble(1.0);
     self->start = PyFloat_FromDouble(0.0);
     self->dur = PyFloat_FromDouble(1.0);
     self->xfade = PyFloat_FromDouble(20.0);
     self->lastpitch = -1.0;
     self->autosmooth = 0;
-    self->y1 = self->y2 = 0.0;
+    self->y1 = self->y2 = self->c1 = 0.0;
     self->xfadeshape = 0;
     self->startfromloop = 0;
     self->interp = 2;
     self->init = 1;
-    self->mode = self->tmpmode = 1;
+    self->mode[0] = self->mode[1] = self->tmpmode = 1;
+    self->direction[0] = self->direction[1] = 0;
     self->pointerPos[0] = self->pointerPos[1] = 0.0;
     self->active[0] = self->active[1] = 0;
 	self->modebuffer[0] = 0;
@@ -1849,16 +1751,16 @@ Looper_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
 	self->modebuffer[4] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Looper_compute_next_data_frame);
     self->mode_func_ptr = Looper_setProcMode;
 
     static char *kwlist[] = {"table", "pitch", "start", "dur", "xfade", "mode", "xfadeshape", "startfromloop", "interp", "autosmooth", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOOiiiiiOO", kwlist, &tabletmp, &pitchtmp, &starttmp, &durtmp, &xfadetmp, &self->tmpmode, &self->xfadeshape, &self->startfromloop, &self->interp, &self->autosmooth, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if ( PyObject_HasAttrString((PyObject *)tabletmp, "getTableStream") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"table\" argument of Looper must be a PyoTableObject.\n");
         Py_RETURN_NONE;
@@ -1869,11 +1771,11 @@ Looper_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (pitchtmp) {
         PyObject_CallMethod((PyObject *)self, "setPitch", "O", pitchtmp);
     }
-    
+
     if (starttmp) {
         PyObject_CallMethod((PyObject *)self, "setStart", "O", starttmp);
     }
-    
+
     if (durtmp) {
         PyObject_CallMethod((PyObject *)self, "setDur", "O", durtmp);
     }
@@ -1881,35 +1783,35 @@ Looper_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (xfadetmp) {
         PyObject_CallMethod((PyObject *)self, "setXfade", "O", xfadetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     if (self->tmpmode >= 0 && self->tmpmode < 4)
-        self->mode = self->tmpmode;
+        self->mode[0] = self->mode[1] = self->tmpmode;
     else
-        self->mode = self->tmpmode = 1;
+        self->mode[0] = self->mode[1] = self->tmpmode = 1;
 
     SET_INTERP_POINTER
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Looper_getServer(Looper* self) { GET_SERVER };
 static PyObject * Looper_getStream(Looper* self) { GET_STREAM };
-static PyObject * Looper_setMul(Looper *self, PyObject *arg) { SET_MUL };	
-static PyObject * Looper_setAdd(Looper *self, PyObject *arg) { SET_ADD };	
-static PyObject * Looper_setSub(Looper *self, PyObject *arg) { SET_SUB };	
-static PyObject * Looper_setDiv(Looper *self, PyObject *arg) { SET_DIV };	
+static PyObject * Looper_setMul(Looper *self, PyObject *arg) { SET_MUL };
+static PyObject * Looper_setAdd(Looper *self, PyObject *arg) { SET_ADD };
+static PyObject * Looper_setSub(Looper *self, PyObject *arg) { SET_SUB };
+static PyObject * Looper_setDiv(Looper *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Looper_play(Looper *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Looper_out(Looper *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1928,14 +1830,14 @@ static PyObject *
 Looper_setPitch(Looper *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->pitch);
@@ -1951,25 +1853,25 @@ Looper_setPitch(Looper *self, PyObject *arg)
         self->pitch_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Looper_setStart(Looper *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->start);
@@ -1988,20 +1890,20 @@ Looper_setStart(Looper *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Looper_setDur(Looper *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->dur);
@@ -2026,14 +1928,14 @@ static PyObject *
 Looper_setXfade(Looper *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->xfade);
@@ -2065,19 +1967,19 @@ static PyObject *
 Looper_setTable(Looper *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Looper_setStartFromLoop(Looper *self, PyObject *arg)
@@ -2086,13 +1988,13 @@ Looper_setStartFromLoop(Looper *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		self->startfromloop = PyInt_AsLong(arg);
-    }  
-    
+    }
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2104,12 +2006,12 @@ Looper_setXfadeShape(Looper *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		self->xfadeshape = PyInt_AsLong(arg);
-    }  
+    }
 
     Py_INCREF(Py_None);
     return Py_None;
@@ -2123,15 +2025,15 @@ Looper_setMode(Looper *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		tmp = PyInt_AsLong(arg);
         if (tmp >= 0 && tmp < 4)
             self->tmpmode = tmp;
-    }  
-    
+    }
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2143,15 +2045,15 @@ Looper_setInterp(Looper *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     int isNumber = PyNumber_Check(arg);
-    
+
 	if (isNumber == 1) {
 		self->interp = PyInt_AsLong(PyNumber_Int(arg));
-    }  
-    
+    }
+
     SET_INTERP_POINTER
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2163,17 +2065,25 @@ Looper_setAutoSmooth(Looper *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		self->autosmooth = PyInt_AsLong(arg);
-    }  
-    
+    }
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
+static PyObject *
+Looper_on_reset(Looper *self) {
+    self->pointerPos[0] = self->pointerPos[1] = 0.0;
+    self->active[0] = self->active[1] = 0;
+    Py_INCREF(Py_None);
+    return Py_None;
+};
+
 static PyMemberDef Looper_members[] = {
     {"server", T_OBJECT_EX, offsetof(Looper, server), 0, "Pyo server."},
     {"stream", T_OBJECT_EX, offsetof(Looper, stream), 0, "Stream object."},
@@ -2204,6 +2114,7 @@ static PyMethodDef Looper_methods[] = {
     {"setStartFromLoop", (PyCFunction)Looper_setStartFromLoop, METH_O, "Sets init pointer position."},
     {"setInterp", (PyCFunction)Looper_setInterp, METH_O, "Sets oscillator interpolation mode."},
     {"setAutoSmooth", (PyCFunction)Looper_setAutoSmooth, METH_O, "Activate lowpass filter for transposition below 1."},
+    {"reset", (PyCFunction)Looper_on_reset, METH_NOARGS, "Resets internal counters."},
 	{"setMul", (PyCFunction)Looper_setMul, METH_O, "Sets granulator mul factor."},
 	{"setAdd", (PyCFunction)Looper_setAdd, METH_O, "Sets granulator add factor."},
     {"setSub", (PyCFunction)Looper_setSub, METH_O, "Sets inverse add factor."},
@@ -2295,7 +2206,7 @@ PyTypeObject LooperType = {
     Looper_new,                 /* tp_new */
 };
 
-static const MYFLT Granule_MAX_GRAINS = 4096; 
+static const MYFLT Granule_MAX_GRAINS = 4096;
 typedef struct {
     pyo_audio_HEAD
     PyObject *table;
@@ -2324,21 +2235,21 @@ typedef struct {
 static void
 Granule_transform_i(Granule *self) {
     MYFLT dens, inc, index, amp, phase;
-    int i, j, ipart, flag = 0; 
-    MYFLT pit = 0, pos = 0, dur = 0; 
-    
+    int i, j, ipart, flag = 0;
+    MYFLT pit = 0, pos = 0, dur = 0;
+
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *envlist = TableStream_getData(self->env);
     int envsize = TableStream_getSize(self->env);
-    
+
     dens = PyFloat_AS_DOUBLE(self->dens);
     if (dens < 0.0)
         dens = 0.0;
-    
+
     inc = dens * self->oneOnSr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = 0.0;
 
@@ -2413,18 +2324,18 @@ Granule_transform_i(Granule *self) {
             }
         }
         flag = 0;
-    }    
+    }
 }
 
 static void
 Granule_transform_a(Granule *self) {
     MYFLT index, amp, phase;
     int i, j, ipart, flag = 0;
-    MYFLT pit = 0, pos = 0, dur = 0; 
-    
+    MYFLT pit = 0, pos = 0, dur = 0;
+
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *envlist = TableStream_getData(self->env);
     int envsize = TableStream_getSize(self->env);
 
@@ -2504,7 +2415,7 @@ Granule_transform_a(Granule *self) {
             }
         }
         flag = 0;
-    }    
+    }
 }
 
 static void Granule_postprocessing_ii(Granule *self) { POST_PROCESSING_II };
@@ -2525,48 +2436,48 @@ Granule_setProcMode(Granule *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Granule_transform_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Granule_transform_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Granule_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Granule_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Granule_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Granule_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Granule_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Granule_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Granule_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Granule_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Granule_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Granule_compute_next_data_frame(Granule *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2576,31 +2487,31 @@ Granule_traverse(Granule *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->table);
     Py_VISIT(self->env);
-    Py_VISIT(self->dens);    
-    Py_VISIT(self->dens_stream);    
-    Py_VISIT(self->pitch);    
-    Py_VISIT(self->pitch_stream);    
-    Py_VISIT(self->pos);    
-    Py_VISIT(self->pos_stream);    
-    Py_VISIT(self->dur);    
-    Py_VISIT(self->dur_stream);    
+    Py_VISIT(self->dens);
+    Py_VISIT(self->dens_stream);
+    Py_VISIT(self->pitch);
+    Py_VISIT(self->pitch_stream);
+    Py_VISIT(self->pos);
+    Py_VISIT(self->pos_stream);
+    Py_VISIT(self->dur);
+    Py_VISIT(self->dur_stream);
     return 0;
 }
 
-static int 
+static int
 Granule_clear(Granule *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->table);
     Py_CLEAR(self->env);
-    Py_CLEAR(self->dens);    
-    Py_CLEAR(self->dens_stream);    
-    Py_CLEAR(self->pitch);    
-    Py_CLEAR(self->pitch_stream);    
-    Py_CLEAR(self->pos);    
-    Py_CLEAR(self->pos_stream);    
-    Py_CLEAR(self->dur);    
-    Py_CLEAR(self->dur_stream);    
+    Py_CLEAR(self->dens);
+    Py_CLEAR(self->dens_stream);
+    Py_CLEAR(self->pitch);
+    Py_CLEAR(self->pitch_stream);
+    Py_CLEAR(self->pos);
+    Py_CLEAR(self->pos_stream);
+    Py_CLEAR(self->dur);
+    Py_CLEAR(self->dur_stream);
     return 0;
 }
 
@@ -2608,7 +2519,7 @@ static void
 Granule_dealloc(Granule* self)
 {
     pyo_DEALLOC
-    free(self->gpos);   
+    free(self->gpos);
     free(self->glen);
     free(self->inc);
     free(self->flags);
@@ -2640,7 +2551,7 @@ Granule_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[5] = 0;
 
     INIT_OBJECT_COMMON
-    
+
     self->oneOnSr = 1.0 / self->sr;
     self->srOnRandMax = self->sr / (MYFLT)RAND_MAX;
 
@@ -2669,7 +2580,7 @@ Granule_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (denstmp) {
         PyObject_CallMethod((PyObject *)self, "setDens", "O", denstmp);
     }
-    
+
     if (pitchtmp) {
         PyObject_CallMethod((PyObject *)self, "setPitch", "O", pitchtmp);
     }
@@ -2681,7 +2592,7 @@ Granule_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (durtmp) {
         PyObject_CallMethod((PyObject *)self, "setDur", "O", durtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
@@ -2689,7 +2600,7 @@ Granule_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     self->gpos = (MYFLT *)realloc(self->gpos, Granule_MAX_GRAINS * sizeof(MYFLT));
@@ -2697,25 +2608,25 @@ Granule_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->inc = (MYFLT *)realloc(self->inc, Granule_MAX_GRAINS * sizeof(MYFLT));
     self->phase = (MYFLT *)realloc(self->phase, Granule_MAX_GRAINS * sizeof(MYFLT));
     self->flags = (int *)realloc(self->flags, Granule_MAX_GRAINS * sizeof(int));
-    
+
     for (i=0; i<Granule_MAX_GRAINS; i++) {
         self->gpos[i] = self->glen[i] = self->inc[i] = self->phase[i] = 0.0;
         self->flags[i] = 0;
     }
-  
+
     Server_generateSeed((Server *)self->server, GRANULE_ID);
-  
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Granule_getServer(Granule* self) { GET_SERVER };
 static PyObject * Granule_getStream(Granule* self) { GET_STREAM };
-static PyObject * Granule_setMul(Granule *self, PyObject *arg) { SET_MUL };	
-static PyObject * Granule_setAdd(Granule *self, PyObject *arg) { SET_ADD };	
-static PyObject * Granule_setSub(Granule *self, PyObject *arg) { SET_SUB };	
-static PyObject * Granule_setDiv(Granule *self, PyObject *arg) { SET_DIV };	
+static PyObject * Granule_setMul(Granule *self, PyObject *arg) { SET_MUL };
+static PyObject * Granule_setAdd(Granule *self, PyObject *arg) { SET_ADD };
+static PyObject * Granule_setSub(Granule *self, PyObject *arg) { SET_SUB };
+static PyObject * Granule_setDiv(Granule *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Granule_play(Granule *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Granule_out(Granule *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2734,14 +2645,14 @@ static PyObject *
 Granule_setDens(Granule *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->dens);
@@ -2757,25 +2668,25 @@ Granule_setDens(Granule *self, PyObject *arg)
         self->dens_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Granule_setPitch(Granule *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->pitch);
@@ -2794,20 +2705,20 @@ Granule_setPitch(Granule *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Granule_setPos(Granule *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->pos);
@@ -2826,20 +2737,20 @@ Granule_setPos(Granule *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Granule_setDur(Granule *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->dur);
@@ -2871,19 +2782,19 @@ static PyObject *
 Granule_setTable(Granule *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Granule_getEnv(Granule* self)
@@ -2896,19 +2807,19 @@ static PyObject *
 Granule_setEnv(Granule *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->env);
     self->env = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Granule_setSync(Granule *self, PyObject *arg)
@@ -2923,7 +2834,7 @@ Granule_setSync(Granule *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Granule_members[] = {
     {"server", T_OBJECT_EX, offsetof(Granule, server), 0, "Pyo server."},
@@ -3045,7 +2956,7 @@ PyTypeObject GranuleType = {
     Granule_new,                 /* tp_new */
 };
 
-static const MYFLT MAINPARTICLE_MAX_GRAINS = 4096; 
+static const MYFLT MAINPARTICLE_MAX_GRAINS = 4096;
 typedef struct {
     pyo_audio_HEAD
     PyObject *table;
@@ -3085,25 +2996,25 @@ typedef struct {
 static void
 MainParticle_transform_mono_i(MainParticle *self) {
     MYFLT dens, inc, index, amp, phase, val;
-    int i, j, ipart, flag = 0; 
-    MYFLT pit = 0, pos = 0, dur = 0, dev = 0; 
-    
+    int i, j, ipart, flag = 0;
+    MYFLT pit = 0, pos = 0, dur = 0, dev = 0;
+
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *envlist = TableStream_getData(self->env);
     int envsize = TableStream_getSize(self->env);
-    
+
     dens = PyFloat_AS_DOUBLE(self->dens);
     if (dens < 0.0)
         dens = 0.0;
-    
+
     inc = dens * self->oneOnSr * self->devFactor;
 
     for (i=0; i<self->bufsize*self->chnls; i++) {
         self->buffer_streams[i] = 0.0;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->timer += inc;
         if (self->timer >= 1.0) {
@@ -3179,27 +3090,27 @@ MainParticle_transform_mono_i(MainParticle *self) {
             }
         }
         flag = 0;
-    }    
+    }
 }
 
 static void
 MainParticle_transform_mono_a(MainParticle *self) {
     MYFLT dens, index, amp, phase, val;
-    int i, j, ipart, flag = 0; 
-    MYFLT pit = 0, pos = 0, dur = 0, dev = 0; 
-    
+    int i, j, ipart, flag = 0;
+    MYFLT pit = 0, pos = 0, dur = 0, dev = 0;
+
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *envlist = TableStream_getData(self->env);
     int envsize = TableStream_getSize(self->env);
-    
+
     MYFLT *density = Stream_getData((Stream *)self->dens_stream);
 
     for (i=0; i<self->bufsize*self->chnls; i++) {
         self->buffer_streams[i] = 0.0;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (density[i] < 0.0)
             dens = 0.0;
@@ -3279,31 +3190,31 @@ MainParticle_transform_mono_a(MainParticle *self) {
             }
         }
         flag = 0;
-    }    
+    }
 }
 
 static void
 MainParticle_transform_i(MainParticle *self) {
     MYFLT dens, inc, index, amp, phase, val, min = 0;
-    int i, j, l, l1, ipart, flag = 0; 
-    MYFLT pit = 0, pos = 0, dur = 0, dev = 0, pan = 0; 
-    
+    int i, j, l, l1, ipart, flag = 0;
+    MYFLT pit = 0, pos = 0, dur = 0, dev = 0, pan = 0;
+
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *envlist = TableStream_getData(self->env);
     int envsize = TableStream_getSize(self->env);
-    
+
     dens = PyFloat_AS_DOUBLE(self->dens);
     if (dens < 0.0)
         dens = 0.0;
-    
+
     inc = dens * self->oneOnSr * self->devFactor;
 
     for (i=0; i<self->bufsize*self->chnls; i++) {
         self->buffer_streams[i] = 0.0;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->timer += inc;
         if (self->timer >= 1.0) {
@@ -3380,7 +3291,7 @@ MainParticle_transform_i(MainParticle *self) {
                                 self->k1[j] = l1 * self->bufsize;
                                 if (l == self->chnls)
                                     self->k2[j] = 0;
-                                else                    
+                                else
                                     self->k2[j] = l * self->bufsize;
                                 break;
                             }
@@ -3413,27 +3324,27 @@ MainParticle_transform_i(MainParticle *self) {
             }
         }
         flag = 0;
-    }    
+    }
 }
 
 static void
 MainParticle_transform_a(MainParticle *self) {
     MYFLT dens, index, amp, phase, val, min = 0;
-    int i, j, l, l1, ipart, flag = 0; 
-    MYFLT pit = 0, pos = 0, dur = 0, dev = 0, pan = 0; 
-    
+    int i, j, l, l1, ipart, flag = 0;
+    MYFLT pit = 0, pos = 0, dur = 0, dev = 0, pan = 0;
+
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *envlist = TableStream_getData(self->env);
     int envsize = TableStream_getSize(self->env);
-    
+
     MYFLT *density = Stream_getData((Stream *)self->dens_stream);
 
     for (i=0; i<self->bufsize*self->chnls; i++) {
         self->buffer_streams[i] = 0.0;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (density[i] < 0.0)
             dens = 0.0;
@@ -3514,7 +3425,7 @@ MainParticle_transform_a(MainParticle *self) {
                                 self->k1[j] = l1 * self->bufsize;
                                 if (l == self->chnls)
                                     self->k2[j] = 0;
-                                else                    
+                                else
                                     self->k2[j] = l * self->bufsize;
                                 break;
                             }
@@ -3547,7 +3458,7 @@ MainParticle_transform_a(MainParticle *self) {
             }
         }
         flag = 0;
-    }    
+    }
 }
 
 static void
@@ -3562,19 +3473,19 @@ MainParticle_setProcMode(MainParticle *self)
             else
                 self->proc_func_ptr = MainParticle_transform_i;
             break;
-        case 1:    
+        case 1:
             if (self->chnls == 1)
                 self->proc_func_ptr = MainParticle_transform_mono_a;
             else
                 self->proc_func_ptr = MainParticle_transform_a;
             break;
-    } 
+    }
 }
 
 static void
 MainParticle_compute_next_data_frame(MainParticle *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -3583,39 +3494,39 @@ MainParticle_traverse(MainParticle *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->table);
     Py_VISIT(self->env);
-    Py_VISIT(self->dens);    
-    Py_VISIT(self->dens_stream);    
-    Py_VISIT(self->pitch);    
-    Py_VISIT(self->pitch_stream);    
-    Py_VISIT(self->pos);    
-    Py_VISIT(self->pos_stream);    
-    Py_VISIT(self->dur);    
-    Py_VISIT(self->dur_stream);    
-    Py_VISIT(self->dev);    
-    Py_VISIT(self->dev_stream);    
-    Py_VISIT(self->pan);    
-    Py_VISIT(self->pan_stream);    
+    Py_VISIT(self->dens);
+    Py_VISIT(self->dens_stream);
+    Py_VISIT(self->pitch);
+    Py_VISIT(self->pitch_stream);
+    Py_VISIT(self->pos);
+    Py_VISIT(self->pos_stream);
+    Py_VISIT(self->dur);
+    Py_VISIT(self->dur_stream);
+    Py_VISIT(self->dev);
+    Py_VISIT(self->dev_stream);
+    Py_VISIT(self->pan);
+    Py_VISIT(self->pan_stream);
     return 0;
 }
 
-static int 
+static int
 MainParticle_clear(MainParticle *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->table);
     Py_CLEAR(self->env);
-    Py_CLEAR(self->dens);    
-    Py_CLEAR(self->dens_stream);    
-    Py_CLEAR(self->pitch);    
-    Py_CLEAR(self->pitch_stream);    
-    Py_CLEAR(self->pos);    
-    Py_CLEAR(self->pos_stream);    
-    Py_CLEAR(self->dur);    
-    Py_CLEAR(self->dur_stream);    
-    Py_CLEAR(self->dev);    
-    Py_CLEAR(self->dev_stream);    
-    Py_CLEAR(self->pan);    
-    Py_CLEAR(self->pan_stream);    
+    Py_CLEAR(self->dens);
+    Py_CLEAR(self->dens_stream);
+    Py_CLEAR(self->pitch);
+    Py_CLEAR(self->pitch_stream);
+    Py_CLEAR(self->pos);
+    Py_CLEAR(self->pos_stream);
+    Py_CLEAR(self->dur);
+    Py_CLEAR(self->dur_stream);
+    Py_CLEAR(self->dev);
+    Py_CLEAR(self->dev_stream);
+    Py_CLEAR(self->pan);
+    Py_CLEAR(self->pan_stream);
     return 0;
 }
 
@@ -3623,7 +3534,7 @@ static void
 MainParticle_dealloc(MainParticle* self)
 {
     pyo_DEALLOC
-    free(self->gpos);   
+    free(self->gpos);
     free(self->glen);
     free(self->inc);
     free(self->flags);
@@ -3669,7 +3580,7 @@ MainParticle_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[5] = 0;
 
     INIT_OBJECT_COMMON
-    
+
     self->oneOnSr = 1.0 / self->sr;
     self->srOnRandMax = self->sr / (MYFLT)RAND_MAX;
 
@@ -3699,7 +3610,7 @@ MainParticle_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (denstmp) {
         PyObject_CallMethod((PyObject *)self, "setDens", "O", denstmp);
     }
-    
+
     if (pitchtmp) {
         PyObject_CallMethod((PyObject *)self, "setPitch", "O", pitchtmp);
     }
@@ -3711,7 +3622,7 @@ MainParticle_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (durtmp) {
         PyObject_CallMethod((PyObject *)self, "setDur", "O", durtmp);
     }
-    
+
     if (devtmp) {
         PyObject_CallMethod((PyObject *)self, "setDev", "O", devtmp);
     }
@@ -3719,7 +3630,7 @@ MainParticle_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (pantmp) {
         PyObject_CallMethod((PyObject *)self, "setPan", "O", pantmp);
     }
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     if (self->chnls < 1)
@@ -3734,21 +3645,21 @@ MainParticle_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->flags = (int *)realloc(self->flags, MAINPARTICLE_MAX_GRAINS * sizeof(int));
     self->k1 = (int *)realloc(self->k1, MAINPARTICLE_MAX_GRAINS * sizeof(int));
     self->k2 = (int *)realloc(self->k2, MAINPARTICLE_MAX_GRAINS * sizeof(int));
-    
+
     for (i=0; i<MAINPARTICLE_MAX_GRAINS; i++) {
         self->gpos[i] = self->glen[i] = self->inc[i] = self->phase[i] = self->amp1[i] = self->amp2[i] = 0.0;
         self->flags[i] = self->k1[i] = self->k2[i] = 0;
     }
-  
+
     self->buffer_streams = (MYFLT *)realloc(self->buffer_streams, self->bufsize * self->chnls * sizeof(MYFLT));
     for (i=0; i<self->bufsize*self->chnls; i++) {
         self->buffer_streams[i] = 0.0;
     }
 
     Server_generateSeed((Server *)self->server, MAINPARTICLE_ID);
-  
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
@@ -3762,14 +3673,14 @@ static PyObject *
 MainParticle_setDens(MainParticle *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->dens);
@@ -3785,25 +3696,25 @@ MainParticle_setDens(MainParticle *self, PyObject *arg)
         self->dens_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 MainParticle_setPitch(MainParticle *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->pitch);
@@ -3822,20 +3733,20 @@ MainParticle_setPitch(MainParticle *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 MainParticle_setPos(MainParticle *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->pos);
@@ -3854,20 +3765,20 @@ MainParticle_setPos(MainParticle *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 MainParticle_setDur(MainParticle *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->dur);
@@ -3892,14 +3803,14 @@ static PyObject *
 MainParticle_setDev(MainParticle *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->dev);
@@ -3924,14 +3835,14 @@ static PyObject *
 MainParticle_setPan(MainParticle *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->pan);
@@ -3963,20 +3874,20 @@ static PyObject *
 MainParticle_setTable(MainParticle *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->table);
-    self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");    
+    self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
     self->srScale = TableStream_getSamplingRate(self->table) / self->sr;
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 MainParticle_getEnv(MainParticle* self)
@@ -3989,16 +3900,16 @@ static PyObject *
 MainParticle_setEnv(MainParticle *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->env);
     self->env = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -4099,33 +4010,33 @@ Particle_setProcMode(Particle *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Particle_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Particle_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Particle_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Particle_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Particle_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Particle_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Particle_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Particle_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Particle_postprocessing_revareva;
             break;
     }
@@ -4140,7 +4051,7 @@ Particle_compute_next_data_frame(Particle *self)
     tmp = MainParticle_getSamplesBuffer((MainParticle *)self->mainSplitter);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -4152,11 +4063,11 @@ Particle_traverse(Particle *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Particle_clear(Particle *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainSplitter);    
+    Py_CLEAR(self->mainSplitter);
     return 0;
 }
 
@@ -4175,44 +4086,44 @@ Particle_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL, *multmp=NULL, *addtmp=NULL;
     Particle *self;
     self = (Particle *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Particle_compute_next_data_frame);
     self->mode_func_ptr = Particle_setProcMode;
 
     static char *kwlist[] = {"mainSplitter", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "Oi|OO", kwlist, &maintmp, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainSplitter);
     Py_INCREF(maintmp);
     self->mainSplitter = (MainParticle *)maintmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Particle_getServer(Particle* self) { GET_SERVER };
 static PyObject * Particle_getStream(Particle* self) { GET_STREAM };
-static PyObject * Particle_setMul(Particle *self, PyObject *arg) { SET_MUL };	
-static PyObject * Particle_setAdd(Particle *self, PyObject *arg) { SET_ADD };	
-static PyObject * Particle_setSub(Particle *self, PyObject *arg) { SET_SUB };	
-static PyObject * Particle_setDiv(Particle *self, PyObject *arg) { SET_DIV };	
+static PyObject * Particle_setMul(Particle *self, PyObject *arg) { SET_MUL };
+static PyObject * Particle_setAdd(Particle *self, PyObject *arg) { SET_ADD };
+static PyObject * Particle_setSub(Particle *self, PyObject *arg) { SET_SUB };
+static PyObject * Particle_setDiv(Particle *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Particle_play(Particle *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Particle_out(Particle *self, PyObject *args, PyObject *kwds) { OUT };
@@ -4330,4 +4241,4 @@ Particle_members,             /* tp_members */
 0,      /* tp_init */
 0,                         /* tp_alloc */
 Particle_new,                 /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/harmonizermodule.c b/src/objects/harmonizermodule.c
index 2bc85e4..94f3c6f 100644
--- a/src/objects/harmonizermodule.c
+++ b/src/objects/harmonizermodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -47,7 +47,7 @@ static void
 Harmonizer_transform_ii(Harmonizer *self) {
     MYFLT val, amp, inc, ratio, rate, del, xind, pos, envpos, fpart;
     int i, ipart;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT trans = PyFloat_AS_DOUBLE(self->transpo);
     MYFLT feed = PyFloat_AS_DOUBLE(self->feedback);
@@ -55,11 +55,11 @@ Harmonizer_transform_ii(Harmonizer *self) {
         feed = 0.0;
     else if (feed > 1.0)
         feed = 1.0;
-    
+
     ratio = MYPOW(2.0, trans/12.0);
-	rate = (ratio-1.0) / self->winsize;	
+	rate = (ratio-1.0) / self->winsize;
     inc = -rate / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
 		/* first overlap */
 		pos = self->pointerPos;
@@ -67,7 +67,7 @@ Harmonizer_transform_ii(Harmonizer *self) {
 		ipart = (int)envpos;
 		fpart = envpos - ipart;
 		amp = ENVELOPE[ipart] + (ENVELOPE[ipart+1] - ENVELOPE[ipart]) * fpart;
-        
+
 		del = pos * self->winsize;
         xind = self->in_count - (del * self->sr);
         if (xind < 0)
@@ -85,7 +85,7 @@ Harmonizer_transform_ii(Harmonizer *self) {
 		ipart = (int)envpos;
 		fpart = envpos - ipart;
 		amp = ENVELOPE[ipart] + (ENVELOPE[ipart+1] - ENVELOPE[ipart]) * fpart;
-		
+
 		del = pos * self->winsize;
         xind = self->in_count - (del * self->sr);
         if (xind < 0)
@@ -94,27 +94,27 @@ Harmonizer_transform_ii(Harmonizer *self) {
         fpart = xind - ipart;
         val = self->buffer[ipart] + (self->buffer[ipart+1] - self->buffer[ipart]) * fpart;
         self->data[i] += (val * amp);
-		
+
         self->pointerPos += inc;
         if (self->pointerPos < 0.0)
             self->pointerPos += 1.0;
         else if (self->pointerPos >= 1.0)
             self->pointerPos -= 1.0;
-		
+
 		self->buffer[self->in_count] = in[i]  + (self->data[i] * feed);
         if (self->in_count == 0)
             self->buffer[(int)self->sr] = self->buffer[0];
         self->in_count++;
         if (self->in_count >= self->sr)
             self->in_count = 0;
-    }    
+    }
 }
 
 static void
 Harmonizer_transform_ai(Harmonizer *self) {
     MYFLT val, amp, inc, ratio, rate, del, xind, pos, envpos, fpart;
     int i, ipart;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *trans = Stream_getData((Stream *)self->transpo_stream);
     MYFLT feed = PyFloat_AS_DOUBLE(self->feedback);
@@ -122,21 +122,21 @@ Harmonizer_transform_ai(Harmonizer *self) {
         feed = 0.0;
     else if (feed > 1.0)
         feed = 1.0;
-    
+
 	MYFLT oneOnWinsize = 1.0 / self->winsize;
 	MYFLT oneOnSr = 1.0 / self->sr;
     for (i=0; i<self->bufsize; i++) {
 		ratio = MYPOW(2.0, trans[i]/12.0);
-		rate = (ratio-1.0) * oneOnWinsize;	
+		rate = (ratio-1.0) * oneOnWinsize;
 		inc = -rate * oneOnSr;;
-		
+
 		/* first overlap */
 		pos = self->pointerPos;
 		envpos = pos * 8192.0;
 		ipart = (int)envpos;
 		fpart = envpos - ipart;
 		amp = ENVELOPE[ipart] + (ENVELOPE[ipart+1] - ENVELOPE[ipart]) * fpart;
-		
+
 		del = pos * self->winsize;
         xind = self->in_count - (del * self->sr);
         if (xind < 0)
@@ -145,7 +145,7 @@ Harmonizer_transform_ai(Harmonizer *self) {
         fpart = xind - ipart;
         val = self->buffer[ipart] + (self->buffer[ipart+1] - self->buffer[ipart]) * fpart;
         self->data[i] = val * amp;
-		
+
 		/* second overlap */
 		pos = self->pointerPos + 0.5;
         if (pos >= 1)
@@ -154,7 +154,7 @@ Harmonizer_transform_ai(Harmonizer *self) {
 		ipart = (int)envpos;
 		fpart = envpos - ipart;
 		amp = ENVELOPE[ipart] + (ENVELOPE[ipart+1] - ENVELOPE[ipart]) * fpart;
-		
+
 		del = pos * self->winsize;
         xind = self->in_count - (del * self->sr);
         if (xind < 0)
@@ -163,35 +163,35 @@ Harmonizer_transform_ai(Harmonizer *self) {
         fpart = xind - ipart;
         val = self->buffer[ipart] + (self->buffer[ipart+1] - self->buffer[ipart]) * fpart;
         self->data[i] += (val * amp);
-		
+
         self->pointerPos += inc;
         if (self->pointerPos < 0)
             self->pointerPos += 1.0;
         else if (self->pointerPos >= 1)
             self->pointerPos -= 1.0;
-		
+
 		self->buffer[self->in_count] = in[i]  + (self->data[i] * feed);
         if (self->in_count == 0)
             self->buffer[(int)self->sr] = self->buffer[0];
         self->in_count++;
         if (self->in_count >= self->sr)
             self->in_count = 0;
-    }  
+    }
 }
 
 static void
 Harmonizer_transform_ia(Harmonizer *self) {
     MYFLT val, amp, inc, ratio, rate, del, xind, pos, envpos, fpart, feedback;
     int i, ipart;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT trans = PyFloat_AS_DOUBLE(self->transpo);
     MYFLT *feed = Stream_getData((Stream *)self->feedback_stream);
-	
+
 	ratio = MYPOW(2.0, trans/12.0);
-	rate = (ratio-1.0) / self->winsize;	
+	rate = (ratio-1.0) / self->winsize;
     inc = -rate / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (feed[i] < 0.0)
             feedback = 0.0;
@@ -206,7 +206,7 @@ Harmonizer_transform_ia(Harmonizer *self) {
 		ipart = (int)envpos;
 		fpart = envpos - ipart;
 		amp = ENVELOPE[ipart] + (ENVELOPE[ipart+1] - ENVELOPE[ipart]) * fpart;
-		
+
 		del = pos * self->winsize;
         xind = self->in_count - (del * self->sr);
         if (xind < 0)
@@ -215,7 +215,7 @@ Harmonizer_transform_ia(Harmonizer *self) {
         fpart = xind - ipart;
         val = self->buffer[ipart] + (self->buffer[ipart+1] - self->buffer[ipart]) * fpart;
         self->data[i] = val * amp;
-		
+
 		/* second overlap */
 		pos = self->pointerPos + 0.5;
         if (pos > 1)
@@ -224,7 +224,7 @@ Harmonizer_transform_ia(Harmonizer *self) {
 		ipart = (int)envpos;
 		fpart = envpos - ipart;
 		amp = ENVELOPE[ipart] + (ENVELOPE[ipart+1] - ENVELOPE[ipart]) * fpart;
-		
+
 		del = pos * self->winsize;
         xind = self->in_count - (del * self->sr);
         if (xind < 0)
@@ -233,38 +233,38 @@ Harmonizer_transform_ia(Harmonizer *self) {
         fpart = xind - ipart;
         val = self->buffer[ipart] + (self->buffer[ipart+1] - self->buffer[ipart]) * fpart;
         self->data[i] += (val * amp);
-		
+
         self->pointerPos += inc;
         if (self->pointerPos < 0)
             self->pointerPos += 1.0;
         else if (self->pointerPos >= 1)
             self->pointerPos -= 1.0;
-		
+
 		self->buffer[self->in_count] = in[i]  + (self->data[i] * feedback);
         if (self->in_count == 0)
             self->buffer[(int)self->sr] = self->buffer[0];
         self->in_count++;
         if (self->in_count >= self->sr)
             self->in_count = 0;
-    }  
+    }
 }
 
 static void
 Harmonizer_transform_aa(Harmonizer *self) {
     MYFLT val, amp, inc, ratio, rate, del, xind, pos, envpos, fpart, feedback;
     int i, ipart;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *trans = Stream_getData((Stream *)self->transpo_stream);
     MYFLT *feed = Stream_getData((Stream *)self->feedback_stream);
-	
+
 	MYFLT oneOnWinsize = 1.0 / self->winsize;
 	MYFLT oneOnSr = 1.0 / self->sr;
     for (i=0; i<self->bufsize; i++) {
 		ratio = MYPOW(2.0, trans[i]/12.0);
-		rate = (ratio-1.0) * oneOnWinsize;	
+		rate = (ratio-1.0) * oneOnWinsize;
 		inc = -rate * oneOnSr;;
-		
+
         if (feed[i] < 0.0)
             feedback = 0.0;
         else if (feed[i] > 1.0)
@@ -278,7 +278,7 @@ Harmonizer_transform_aa(Harmonizer *self) {
 		ipart = (int)envpos;
 		fpart = envpos - ipart;
 		amp = ENVELOPE[ipart] + (ENVELOPE[ipart+1] - ENVELOPE[ipart]) * fpart;
-		
+
 		del = pos * self->winsize;
         xind = self->in_count - (del * self->sr);
         if (xind < 0)
@@ -287,7 +287,7 @@ Harmonizer_transform_aa(Harmonizer *self) {
         fpart = xind - ipart;
         val = self->buffer[ipart] + (self->buffer[ipart+1] - self->buffer[ipart]) * fpart;
         self->data[i] = val * amp;
-		
+
 		/* second overlap */
 		pos = self->pointerPos + 0.5;
         if (pos > 1)
@@ -296,7 +296,7 @@ Harmonizer_transform_aa(Harmonizer *self) {
 		ipart = (int)envpos;
 		fpart = envpos - ipart;
 		amp = ENVELOPE[ipart] + (ENVELOPE[ipart+1] - ENVELOPE[ipart]) * fpart;
-		
+
 		del = pos * self->winsize;
         xind = self->in_count - (del * self->sr);
         if (xind < 0)
@@ -305,13 +305,13 @@ Harmonizer_transform_aa(Harmonizer *self) {
         fpart = xind - ipart;
         val = self->buffer[ipart] + (self->buffer[ipart+1] - self->buffer[ipart]) * fpart;
         self->data[i] += (val * amp);
-		
+
         self->pointerPos += inc;
         if (self->pointerPos < 0)
             self->pointerPos += 1.0;
         else if (self->pointerPos >= 1)
             self->pointerPos -= 1.0;
-		
+
 		self->buffer[self->in_count] = in[i]  + (self->data[i] * feedback);
         if (self->in_count == 0)
             self->buffer[(int)self->sr] = self->buffer[0];
@@ -319,7 +319,7 @@ Harmonizer_transform_aa(Harmonizer *self) {
         if (self->in_count >= self->sr)
             self->in_count = 0;
     }
-} 
+}
 
 static void Harmonizer_feedbacktprocessing_ii(Harmonizer *self) { POST_PROCESSING_II };
 static void Harmonizer_feedbacktprocessing_ai(Harmonizer *self) { POST_PROCESSING_AI };
@@ -339,54 +339,54 @@ Harmonizer_setProcMode(Harmonizer *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Harmonizer_transform_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Harmonizer_transform_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Harmonizer_transform_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Harmonizer_transform_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Harmonizer_feedbacktprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Harmonizer_feedbacktprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Harmonizer_feedbacktprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Harmonizer_feedbacktprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Harmonizer_feedbacktprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Harmonizer_feedbacktprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Harmonizer_feedbacktprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Harmonizer_feedbacktprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Harmonizer_feedbacktprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Harmonizer_compute_next_data_frame(Harmonizer *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -396,23 +396,23 @@ Harmonizer_traverse(Harmonizer *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->transpo);    
-    Py_VISIT(self->transpo_stream);    
-    Py_VISIT(self->feedback);    
-    Py_VISIT(self->feedback_stream);    
+    Py_VISIT(self->transpo);
+    Py_VISIT(self->transpo_stream);
+    Py_VISIT(self->feedback);
+    Py_VISIT(self->feedback_stream);
     return 0;
 }
 
-static int 
+static int
 Harmonizer_clear(Harmonizer *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->transpo);    
-    Py_CLEAR(self->transpo_stream);    
-    Py_CLEAR(self->feedback);    
-    Py_CLEAR(self->feedback_stream);    
+    Py_CLEAR(self->transpo);
+    Py_CLEAR(self->transpo_stream);
+    Py_CLEAR(self->feedback);
+    Py_CLEAR(self->feedback_stream);
     return 0;
 }
 
@@ -470,14 +470,14 @@ Harmonizer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     self->buffer = (MYFLT *)realloc(self->buffer, (self->sr+1) * sizeof(MYFLT));
     for (i=0; i<(self->sr+1); i++) {
         self->buffer[i] = 0.;
-    }    
-	
+    }
+
     if (wintmp > 0.0 && wintmp <= 1.0)
         self->winsize = wintmp;
     else
@@ -490,10 +490,10 @@ Harmonizer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Harmonizer_getServer(Harmonizer* self) { GET_SERVER };
 static PyObject * Harmonizer_getStream(Harmonizer* self) { GET_STREAM };
-static PyObject * Harmonizer_setMul(Harmonizer *self, PyObject *arg) { SET_MUL };	
-static PyObject * Harmonizer_setAdd(Harmonizer *self, PyObject *arg) { SET_ADD };	
-static PyObject * Harmonizer_setSub(Harmonizer *self, PyObject *arg) { SET_SUB };	
-static PyObject * Harmonizer_setDiv(Harmonizer *self, PyObject *arg) { SET_DIV };	
+static PyObject * Harmonizer_setMul(Harmonizer *self, PyObject *arg) { SET_MUL };
+static PyObject * Harmonizer_setAdd(Harmonizer *self, PyObject *arg) { SET_ADD };
+static PyObject * Harmonizer_setSub(Harmonizer *self, PyObject *arg) { SET_SUB };
+static PyObject * Harmonizer_setDiv(Harmonizer *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Harmonizer_play(Harmonizer *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Harmonizer_out(Harmonizer *self, PyObject *args, PyObject *kwds) { OUT };
@@ -512,14 +512,14 @@ static PyObject *
 Harmonizer_setTranspo(Harmonizer *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->transpo);
@@ -535,25 +535,25 @@ Harmonizer_setTranspo(Harmonizer *self, PyObject *arg)
         self->transpo_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Harmonizer_setFeedback(Harmonizer *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->feedback);
@@ -569,12 +569,12 @@ Harmonizer_setFeedback(Harmonizer *self, PyObject *arg)
         self->feedback_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Harmonizer_setWinsize(Harmonizer *self, PyObject *arg)
@@ -587,7 +587,7 @@ Harmonizer_setWinsize(Harmonizer *self, PyObject *arg)
         else
             printf("winsize lower than 0.0 or larger than 1.0 second!\n");
 	}
-	
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -702,4 +702,3 @@ PyTypeObject HarmonizerType = {
     0,                         /* tp_alloc */
     Harmonizer_new,                 /* tp_new */
 };
-
diff --git a/src/objects/hilbertmodule.c b/src/objects/hilbertmodule.c
index 5c860e7..639bff1 100644
--- a/src/objects/hilbertmodule.c
+++ b/src/objects/hilbertmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -38,23 +38,23 @@ typedef struct {
 } HilbertMain;
 
 /* 6th order allpass poles */
-static const MYFLT poles[12] = {.3609, 2.7412, 11.1573, 44.7581, 179.6242, 798.4578, 
+static const MYFLT poles[12] = {.3609, 2.7412, 11.1573, 44.7581, 179.6242, 798.4578,
                     1.2524, 5.5671, 22.3423, 89.6271, 364.7914, 2770.1114};
 
 static void
 HilbertMain_compute_variables(HilbertMain *self)
-{    
+{
     int i;
     MYFLT polefreq[12];
     MYFLT rc[12];
     MYFLT alpha[12];
-    
+
     for (i=0; i<12; i++) {
         polefreq[i] = poles[i] * 15.0;
         rc[i] = 1.0 / (TWOPI * polefreq[i]);
         alpha[i] = 1.0 / rc[i];
         self->coefs[i] = - (1.0 - (alpha[i] / (2.0 * self->sr))) / (1.0 + (alpha[i] / (2.0 * self->sr)));
-    }    
+    }
 }
 
 static void
@@ -62,7 +62,7 @@ HilbertMain_filters(HilbertMain *self) {
     MYFLT xn1, xn2, yn1, yn2;
     int j, i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         xn1 = in[i];
         for (j=0; j<6; j++) {
@@ -75,32 +75,32 @@ HilbertMain_filters(HilbertMain *self) {
         xn2 = in[i];
         for (j=6; j<12; j++) {
             yn2 = self->coefs[j] * (xn2 - self->y1[j]) + self->x1[j];
-            self->x1[j] = xn1;
-            self->y1[j] = yn1;
+            self->x1[j] = xn2;
+            self->y1[j] = yn2;
             xn2 = yn2;
         }
         self->buffer_streams[i] = yn1;
         self->buffer_streams[i+self->bufsize] = yn2;
-        
-    }    
+
+    }
 }
 
 MYFLT *
 HilbertMain_getSamplesBuffer(HilbertMain *self)
 {
     return (MYFLT *)self->buffer_streams;
-}    
+}
 
 static void
 HilbertMain_setProcMode(HilbertMain *self)
-{        
-    self->proc_func_ptr = HilbertMain_filters;  
+{
+    self->proc_func_ptr = HilbertMain_filters;
 }
 
 static void
 HilbertMain_compute_next_data_frame(HilbertMain *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -112,7 +112,7 @@ HilbertMain_traverse(HilbertMain *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 HilbertMain_clear(HilbertMain *self)
 {
     pyo_CLEAR
@@ -137,7 +137,7 @@ HilbertMain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp;
     HilbertMain *self;
     self = (HilbertMain *)type->tp_alloc(type, 0);
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, HilbertMain_compute_next_data_frame);
     self->mode_func_ptr = HilbertMain_setProcMode;
@@ -148,12 +148,12 @@ HilbertMain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     }
 
     static char *kwlist[] = {"input", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O", kwlist, &inputtmp))
         Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     self->buffer_streams = (MYFLT *)realloc(self->buffer_streams, 2 * self->bufsize * sizeof(MYFLT));
@@ -253,33 +253,33 @@ Hilbert_setProcMode(Hilbert *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Hilbert_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Hilbert_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Hilbert_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Hilbert_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Hilbert_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Hilbert_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Hilbert_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Hilbert_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Hilbert_postprocessing_revareva;
             break;
     }
@@ -294,7 +294,7 @@ Hilbert_compute_next_data_frame(Hilbert *self)
     tmp = HilbertMain_getSamplesBuffer((HilbertMain *)self->mainSplitter);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -306,11 +306,11 @@ Hilbert_traverse(Hilbert *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Hilbert_clear(Hilbert *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainSplitter);    
+    Py_CLEAR(self->mainSplitter);
     return 0;
 }
 
@@ -329,44 +329,44 @@ Hilbert_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL, *multmp=NULL, *addtmp=NULL;
     Hilbert *self;
     self = (Hilbert *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Hilbert_compute_next_data_frame);
     self->mode_func_ptr = Hilbert_setProcMode;
 
     static char *kwlist[] = {"mainSplitter", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "Oi|OO", kwlist, &maintmp, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainSplitter);
     Py_INCREF(maintmp);
     self->mainSplitter = (HilbertMain *)maintmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Hilbert_getServer(Hilbert* self) { GET_SERVER };
 static PyObject * Hilbert_getStream(Hilbert* self) { GET_STREAM };
-static PyObject * Hilbert_setMul(Hilbert *self, PyObject *arg) { SET_MUL };	
-static PyObject * Hilbert_setAdd(Hilbert *self, PyObject *arg) { SET_ADD };	
-static PyObject * Hilbert_setSub(Hilbert *self, PyObject *arg) { SET_SUB };	
-static PyObject * Hilbert_setDiv(Hilbert *self, PyObject *arg) { SET_DIV };	
+static PyObject * Hilbert_setMul(Hilbert *self, PyObject *arg) { SET_MUL };
+static PyObject * Hilbert_setAdd(Hilbert *self, PyObject *arg) { SET_ADD };
+static PyObject * Hilbert_setSub(Hilbert *self, PyObject *arg) { SET_SUB };
+static PyObject * Hilbert_setDiv(Hilbert *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Hilbert_play(Hilbert *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Hilbert_out(Hilbert *self, PyObject *args, PyObject *kwds) { OUT };
@@ -484,4 +484,4 @@ Hilbert_members,             /* tp_members */
 0,      /* tp_init */
 0,                         /* tp_alloc */
 Hilbert_new,                 /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/inputmodule.c b/src/objects/inputmodule.c
index 5661103..cd3df62 100644
--- a/src/objects/inputmodule.c
+++ b/src/objects/inputmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -48,46 +48,46 @@ Input_setProcMode(Input *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Input_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Input_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Input_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Input_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Input_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Input_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Input_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Input_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Input_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 Input_compute_next_data_frame(Input *self)
-{   
+{
     int i;
     MYFLT *tmp;
     tmp = Server_getInputBuffer((Server *)self->server);
-    for (i=0; i<self->bufsize*self->nchnls; i++) {
-        if ((i % self->nchnls) == self->chnl)
-            self->data[(int)(i/self->nchnls)] = tmp[i];
-    }    
+    for (i=0; i<self->bufsize*self->ichnls; i++) {
+        if ((i % self->ichnls) == self->chnl)
+            self->data[(int)(i/self->ichnls)] = tmp[i];
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -98,7 +98,7 @@ Input_traverse(Input *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Input_clear(Input *self)
 {
     pyo_CLEAR
@@ -133,7 +133,7 @@ Input_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|iOO", kwlist, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
- 
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
@@ -141,20 +141,20 @@ Input_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-            
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Input_getServer(Input* self) { GET_SERVER };
 static PyObject * Input_getStream(Input* self) { GET_STREAM };
-static PyObject * Input_setMul(Input *self, PyObject *arg) { SET_MUL };	
-static PyObject * Input_setAdd(Input *self, PyObject *arg) { SET_ADD };	
-static PyObject * Input_setSub(Input *self, PyObject *arg) { SET_SUB };	
-static PyObject * Input_setDiv(Input *self, PyObject *arg) { SET_DIV };	
+static PyObject * Input_setMul(Input *self, PyObject *arg) { SET_MUL };
+static PyObject * Input_setAdd(Input *self, PyObject *arg) { SET_ADD };
+static PyObject * Input_setSub(Input *self, PyObject *arg) { SET_SUB };
+static PyObject * Input_setDiv(Input *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Input_play(Input *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Input_out(Input *self, PyObject *args, PyObject *kwds) { OUT };
@@ -273,4 +273,3 @@ PyTypeObject InputType = {
     0,                         /* tp_alloc */
     Input_new,                 /* tp_new */
 };
-
diff --git a/src/objects/lfomodule.c b/src/objects/lfomodule.c
index b1a2bdb..f8ccbcd 100644
--- a/src/objects/lfomodule.c
+++ b/src/objects/lfomodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -32,7 +32,7 @@ typedef struct {
     Stream *freq_stream;
     PyObject *sharp;
     Stream *sharp_stream;
-    int modebuffer[4]; // need at least 2 slots for mul & add 
+    int modebuffer[4]; // need at least 2 slots for mul & add
     int wavetype;
     MYFLT oneOverPiOverTwo;
     MYFLT srOverFour;
@@ -66,7 +66,7 @@ LFO_generates_ii(LFO *self) {
             maxHarms = (int)(self->srOverFour/freq);
             numh = sharp * 46.0 + 4.0;
             if (numh > maxHarms)
-                numh = maxHarms;   
+                numh = maxHarms;
                 for (i=0; i<self->bufsize; i++) {
                     pointer = self->pointerPos * 2.0 - 1.0;
                     val = pointer - MYTANH(numh * pointer) / MYTANH(numh);
@@ -75,14 +75,14 @@ LFO_generates_ii(LFO *self) {
                     if (self->pointerPos < 0)
                         self->pointerPos += 1.0;
                     else if (self->pointerPos >= 1)
-                        self->pointerPos -= 1.0;        
-                }            
+                        self->pointerPos -= 1.0;
+                }
             break;
         case 1: /* Saw down */
             maxHarms = (int)(self->srOverFour/freq);
             numh = sharp * 46.0 + 4.0;
             if (numh > maxHarms)
-                numh = maxHarms;   
+                numh = maxHarms;
                 for (i=0; i<self->bufsize; i++) {
                     pointer = self->pointerPos * 2.0 - 1.0;
                     val = -(pointer - MYTANH(numh * pointer) / MYTANH(numh));
@@ -91,14 +91,14 @@ LFO_generates_ii(LFO *self) {
                     if (self->pointerPos < 0)
                         self->pointerPos += 1.0;
                     else if (self->pointerPos >= 1)
-                        self->pointerPos -= 1.0;        
-                }            
+                        self->pointerPos -= 1.0;
+                }
             break;
         case 2: /* Square */
             maxHarms = (int)(self->srOverEight/freq);
             numh = sharp * 46.0 + 4.0;
             if (numh > maxHarms)
-                numh = maxHarms;    
+                numh = maxHarms;
                 for (i=0; i<self->bufsize; i++) {
                     val = MYATAN(numh * MYSIN(TWOPI*self->pointerPos));
                     self->data[i] = val * self->oneOverPiOverTwo;
@@ -106,15 +106,15 @@ LFO_generates_ii(LFO *self) {
                     if (self->pointerPos < 0)
                         self->pointerPos += 1.0;
                     else if (self->pointerPos >= 1)
-                        self->pointerPos -= 1.0;        
-                }            
+                        self->pointerPos -= 1.0;
+                }
             break;
         case 3: /* Triangle */
             maxHarms = (int)(self->srOverFour/freq);
             if ((sharp * 36.0) > maxHarms)
                 numh = (MYFLT)(maxHarms / 36.0);
             else
-                numh = sharp;    
+                numh = sharp;
             for (i=0; i<self->bufsize; i++) {
                 v1 = MYTAN(MYSIN(TWOPI*self->pointerPos));
                 pointer = self->pointerPos + 0.25;
@@ -127,8 +127,8 @@ LFO_generates_ii(LFO *self) {
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 4: /* Pulse */
             maxHarms = (int)(self->srOverEight/freq);
@@ -144,14 +144,14 @@ LFO_generates_ii(LFO *self) {
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 5: /* Bi-Pulse */
             maxHarms = (int)(self->srOverEight/freq);
             numh = MYFLOOR(sharp * 46.0 + 4.0);
             if (numh > maxHarms)
-                numh = maxHarms;    
+                numh = maxHarms;
             if (MYFMOD(numh, 2.0) == 0.0)
                 numh += 1.0;
             for (i=0; i<self->bufsize; i++) {
@@ -161,8 +161,8 @@ LFO_generates_ii(LFO *self) {
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 6: /* SAH */
             numh = 1.0 - sharp;
@@ -186,7 +186,7 @@ LFO_generates_ii(LFO *self) {
                     val = self->sahCurrentValue;
                 }
                 self->data[i] = val;
-            }            
+            }
             break;
         case 7: /* Sine-mod */
             inc2 = inc * sharp;
@@ -203,7 +203,7 @@ LFO_generates_ii(LFO *self) {
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
                     self->pointerPos -= 1.0;
-            }            
+            }
             break;
         default:
             break;
@@ -215,7 +215,7 @@ LFO_generates_ai(LFO *self) {
     MYFLT val, inc, freq, sharp, pointer, numh;
     MYFLT v1, v2, inc2, fade;
     int i, maxHarms;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     if (fr[0] <= 0) {
         return;
@@ -225,7 +225,7 @@ LFO_generates_ai(LFO *self) {
         sharp = 0.0;
     else if (sharp > 1.0)
         sharp = 1.0;
-    
+
     switch (self->wavetype) {
         case 0: /* Saw up */
             for (i=0; i<self->bufsize; i++) {
@@ -234,7 +234,7 @@ LFO_generates_ai(LFO *self) {
                 maxHarms = (int)(self->srOverFour/freq);
                 numh = sharp * 46.0 + 4.0;
                 if (numh > maxHarms)
-                    numh = maxHarms;   
+                    numh = maxHarms;
                 pointer = self->pointerPos * 2.0 - 1.0;
                 val = pointer - MYTANH(numh * pointer) / MYTANH(numh);
                 self->data[i] = val;
@@ -242,8 +242,8 @@ LFO_generates_ai(LFO *self) {
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 1: /* Saw down */
             for (i=0; i<self->bufsize; i++) {
@@ -252,7 +252,7 @@ LFO_generates_ai(LFO *self) {
                 maxHarms = (int)(self->srOverFour/freq);
                 numh = sharp * 46.0 + 4.0;
                 if (numh > maxHarms)
-                    numh = maxHarms;   
+                    numh = maxHarms;
                 pointer = self->pointerPos * 2.0 - 1.0;
                 val = -(pointer - MYTANH(numh * pointer) / MYTANH(numh));
                 self->data[i] = val;
@@ -260,8 +260,8 @@ LFO_generates_ai(LFO *self) {
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 2: /* Square */
             for (i=0; i<self->bufsize; i++) {
@@ -270,15 +270,15 @@ LFO_generates_ai(LFO *self) {
                 maxHarms = (int)(self->srOverEight/freq);
                 numh = sharp * 46.0 + 4.0;
                 if (numh > maxHarms)
-                    numh = maxHarms;    
+                    numh = maxHarms;
                 val = MYATAN(numh * MYSIN(TWOPI*self->pointerPos));
                 self->data[i] = val * self->oneOverPiOverTwo;
                 self->pointerPos += inc;
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 3: /* Triangle */
             for (i=0; i<self->bufsize; i++) {
@@ -288,7 +288,7 @@ LFO_generates_ai(LFO *self) {
                 if ((sharp * 36.0) > maxHarms)
                     numh = (MYFLT)(maxHarms / 36.0);
                 else
-                    numh = sharp;    
+                    numh = sharp;
                 v1 = MYTAN(MYSIN(TWOPI*self->pointerPos));
                 pointer = self->pointerPos + 0.25;
                 if (pointer > 1.0)
@@ -300,8 +300,8 @@ LFO_generates_ai(LFO *self) {
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 4: /* Pulse */
             for (i=0; i<self->bufsize; i++) {
@@ -319,8 +319,8 @@ LFO_generates_ai(LFO *self) {
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 5: /* Bi-Pulse */
             for (i=0; i<self->bufsize; i++) {
@@ -329,7 +329,7 @@ LFO_generates_ai(LFO *self) {
                 maxHarms = (int)(self->srOverEight/freq);
                 numh = MYFLOOR(sharp * 46.0 + 4.0);
                 if (numh > maxHarms)
-                    numh = maxHarms;    
+                    numh = maxHarms;
                 if (MYFMOD(numh, 2.0) == 0.0)
                     numh += 1.0;
                 val = MYTAN(MYPOW(MYSIN(TWOPI*self->pointerPos), numh));
@@ -338,8 +338,8 @@ LFO_generates_ai(LFO *self) {
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 6: /* SAH */
             numh = 1.0 - sharp;
@@ -365,7 +365,7 @@ LFO_generates_ai(LFO *self) {
                     val = self->sahCurrentValue;
                 }
                 self->data[i] = val;
-            }            
+            }
             break;
         case 7: /* Sine-mod */
             for (i=0; i<self->bufsize; i++) {
@@ -384,11 +384,11 @@ LFO_generates_ai(LFO *self) {
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
                     self->pointerPos -= 1.0;
-            }            
+            }
             break;
         default:
             break;
-    }    
+    }
 }
 
 static void
@@ -396,14 +396,14 @@ LFO_generates_ia(LFO *self) {
     MYFLT val, inc, freq, sharp, pointer, numh;
     MYFLT v1, v2, inc2, fade;
     int i, maxHarms;
-    
+
     freq = PyFloat_AS_DOUBLE(self->freq);
     if (freq <= 0) {
         return;
     }
     MYFLT *sh = Stream_getData((Stream *)self->sharp_stream);
     inc = freq / self->sr;
-    
+
     switch (self->wavetype) {
         case 0: /* Saw up */
             maxHarms = (int)(self->srOverFour/freq);
@@ -415,7 +415,7 @@ LFO_generates_ia(LFO *self) {
                     sharp = 1.0;
                 numh = sharp * 46.0 + 4.0;
                 if (numh > maxHarms)
-                    numh = maxHarms;   
+                    numh = maxHarms;
                 pointer = self->pointerPos * 2.0 - 1.0;
                 val = pointer - MYTANH(numh * pointer) / MYTANH(numh);
                 self->data[i] = val;
@@ -423,8 +423,8 @@ LFO_generates_ia(LFO *self) {
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 1: /* Saw down */
             maxHarms = (int)(self->srOverFour/freq);
@@ -436,7 +436,7 @@ LFO_generates_ia(LFO *self) {
                     sharp = 1.0;
                 numh = sharp * 46.0 + 4.0;
                 if (numh > maxHarms)
-                    numh = maxHarms;   
+                    numh = maxHarms;
                 pointer = self->pointerPos * 2.0 - 1.0;
                 val = -(pointer - MYTANH(numh * pointer) / MYTANH(numh));
                 self->data[i] = val;
@@ -444,8 +444,8 @@ LFO_generates_ia(LFO *self) {
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 2: /* Square */
             maxHarms = (int)(self->srOverEight/freq);
@@ -457,15 +457,15 @@ LFO_generates_ia(LFO *self) {
                     sharp = 1.0;
                 numh = sharp * 46.0 + 4.0;
                 if (numh > maxHarms)
-                    numh = maxHarms;   
+                    numh = maxHarms;
                 val = MYATAN(numh * MYSIN(TWOPI*self->pointerPos));
                 self->data[i] = val * self->oneOverPiOverTwo;
                 self->pointerPos += inc;
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 3: /* Triangle */
             maxHarms = (int)(self->srOverFour/freq);
@@ -478,7 +478,7 @@ LFO_generates_ia(LFO *self) {
                 if ((sharp * 36.0) > maxHarms)
                     numh = (MYFLT)(maxHarms / 36.0);
                 else
-                    numh = sharp;    
+                    numh = sharp;
                 v1 = MYTAN(MYSIN(TWOPI*self->pointerPos));
                 pointer = self->pointerPos + 0.25;
                 if (pointer > 1.0)
@@ -490,8 +490,8 @@ LFO_generates_ia(LFO *self) {
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 4: /* Pulse */
             maxHarms = (int)(self->srOverEight/freq);
@@ -512,8 +512,8 @@ LFO_generates_ia(LFO *self) {
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 5: /* Bi-Pulse */
             maxHarms = (int)(self->srOverEight/freq);
@@ -534,8 +534,8 @@ LFO_generates_ia(LFO *self) {
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 6: /* SAH */
             for (i=0; i<self->bufsize; i++) {
@@ -564,7 +564,7 @@ LFO_generates_ia(LFO *self) {
                     val = self->sahCurrentValue;
                 }
                 self->data[i] = val;
-            }            
+            }
             break;
         case 7: /* Sine-mod */
             for (i=0; i<self->bufsize; i++) {
@@ -586,7 +586,7 @@ LFO_generates_ia(LFO *self) {
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
                     self->pointerPos -= 1.0;
-            }            
+            }
             break;
         default:
             break;
@@ -598,13 +598,13 @@ LFO_generates_aa(LFO *self) {
     MYFLT val, inc, freq, sharp, pointer, numh;
     MYFLT v1, v2, inc2, fade;
     int i, maxHarms;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     if (fr[0] <= 0) {
         return;
     }
     MYFLT *sh = Stream_getData((Stream *)self->sharp_stream);
-    
+
     switch (self->wavetype) {
         case 0: /* Saw up */
             for (i=0; i<self->bufsize; i++) {
@@ -618,7 +618,7 @@ LFO_generates_aa(LFO *self) {
                 maxHarms = (int)(self->srOverFour/freq);
                 numh = sharp * 46.0 + 4.0;
                 if (numh > maxHarms)
-                    numh = maxHarms;   
+                    numh = maxHarms;
                 pointer = self->pointerPos * 2.0 - 1.0;
                 val = pointer - MYTANH(numh * pointer) / MYTANH(numh);
                 self->data[i] = val;
@@ -626,8 +626,8 @@ LFO_generates_aa(LFO *self) {
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 1: /* Saw down */
             for (i=0; i<self->bufsize; i++) {
@@ -641,7 +641,7 @@ LFO_generates_aa(LFO *self) {
                 maxHarms = (int)(self->srOverFour/freq);
                 numh = sharp * 46.0 + 4.0;
                 if (numh > maxHarms)
-                    numh = maxHarms;   
+                    numh = maxHarms;
                 pointer = self->pointerPos * 2.0 - 1.0;
                 val = -(pointer - MYTANH(numh * pointer) / MYTANH(numh));
                 self->data[i] = val;
@@ -649,8 +649,8 @@ LFO_generates_aa(LFO *self) {
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 2: /* Square */
             for (i=0; i<self->bufsize; i++) {
@@ -664,15 +664,15 @@ LFO_generates_aa(LFO *self) {
                 maxHarms = (int)(self->srOverEight/freq);
                 numh = sharp * 46.0 + 4.0;
                 if (numh > maxHarms)
-                    numh = maxHarms;    
+                    numh = maxHarms;
                 val = MYATAN(numh * MYSIN(TWOPI*self->pointerPos));
                 self->data[i] = val * self->oneOverPiOverTwo;
                 self->pointerPos += inc;
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 3: /* Triangle */
             for (i=0; i<self->bufsize; i++) {
@@ -687,7 +687,7 @@ LFO_generates_aa(LFO *self) {
                 if ((sharp * 36.0) > maxHarms)
                     numh = (MYFLT)(maxHarms / 36.0);
                 else
-                    numh = sharp;    
+                    numh = sharp;
                 v1 = MYTAN(MYSIN(TWOPI*self->pointerPos));
                 pointer = self->pointerPos + 0.25;
                 if (pointer > 1.0)
@@ -699,8 +699,8 @@ LFO_generates_aa(LFO *self) {
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 4: /* Pulse */
             for (i=0; i<self->bufsize; i++) {
@@ -723,8 +723,8 @@ LFO_generates_aa(LFO *self) {
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 5: /* Bi-Pulse */
             for (i=0; i<self->bufsize; i++) {
@@ -738,7 +738,7 @@ LFO_generates_aa(LFO *self) {
                 maxHarms = (int)(self->srOverEight/freq);
                 numh = MYFLOOR(sharp * 46.0 + 4.0);
                 if (numh > maxHarms)
-                    numh = maxHarms;    
+                    numh = maxHarms;
                 if (MYFMOD(numh, 2.0) == 0.0)
                     numh += 1.0;
                 val = MYTAN(MYPOW(MYSIN(TWOPI*self->pointerPos), numh));
@@ -747,8 +747,8 @@ LFO_generates_aa(LFO *self) {
                 if (self->pointerPos < 0)
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
-                    self->pointerPos -= 1.0;        
-            }            
+                    self->pointerPos -= 1.0;
+            }
             break;
         case 6: /* SAH */
             for (i=0; i<self->bufsize; i++) {
@@ -779,7 +779,7 @@ LFO_generates_aa(LFO *self) {
                     val = self->sahCurrentValue;
                 }
                 self->data[i] = val;
-            }            
+            }
             break;
         case 7: /* Sine-mod */
             for (i=0; i<self->bufsize; i++) {
@@ -803,7 +803,7 @@ LFO_generates_aa(LFO *self) {
                     self->pointerPos += 1.0;
                 else if (self->pointerPos >= 1)
                     self->pointerPos -= 1.0;
-            }            
+            }
             break;
         default:
             break;
@@ -826,56 +826,56 @@ LFO_setProcMode(LFO *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = LFO_generates_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = LFO_generates_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = LFO_generates_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = LFO_generates_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = LFO_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = LFO_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = LFO_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = LFO_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = LFO_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = LFO_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = LFO_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = LFO_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = LFO_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 LFO_compute_next_data_frame(LFO *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -883,21 +883,21 @@ static int
 LFO_traverse(LFO *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->sharp);    
-    Py_VISIT(self->sharp_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->sharp);
+    Py_VISIT(self->sharp_stream);
     return 0;
 }
 
-static int 
+static int
 LFO_clear(LFO *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->sharp);    
-    Py_CLEAR(self->sharp_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->sharp);
+    Py_CLEAR(self->sharp_stream);
     return 0;
 }
 
@@ -916,7 +916,7 @@ LFO_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *freqtmp=NULL, *sharptmp=NULL, *multmp=NULL, *addtmp=NULL;
     LFO *self;
     self = (LFO *)type->tp_alloc(type, 0);
-        
+
     self->freq = PyFloat_FromDouble(100);
     self->sharp = PyFloat_FromDouble(0.5);
     self->oneOverPiOverTwo = 1.0 / (PI / 2.0);
@@ -930,7 +930,7 @@ LFO_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[3] = 0;
 
     INIT_OBJECT_COMMON
-    
+
     self->srOverFour = (MYFLT)self->sr * 0.25;
     self->srOverEight = (MYFLT)self->sr * 0.125;
     Stream_setFunctionPtr(self->stream, LFO_compute_next_data_frame);
@@ -948,7 +948,7 @@ LFO_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (sharptmp) {
         PyObject_CallMethod((PyObject *)self, "setSharp", "O", sharptmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
@@ -956,13 +956,13 @@ LFO_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-            
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     Server_generateSeed((Server *)self->server, LFO_ID);
 
     self->sahCurrentValue = self->sahLastValue = rand()/((MYFLT)(RAND_MAX)*0.5) - 1.0;
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -970,10 +970,10 @@ LFO_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * LFO_getServer(LFO* self) { GET_SERVER };
 static PyObject * LFO_getStream(LFO* self) { GET_STREAM };
-static PyObject * LFO_setMul(LFO *self, PyObject *arg) { SET_MUL };	
-static PyObject * LFO_setAdd(LFO *self, PyObject *arg) { SET_ADD };	
-static PyObject * LFO_setSub(LFO *self, PyObject *arg) { SET_SUB };	
-static PyObject * LFO_setDiv(LFO *self, PyObject *arg) { SET_DIV };	
+static PyObject * LFO_setMul(LFO *self, PyObject *arg) { SET_MUL };
+static PyObject * LFO_setAdd(LFO *self, PyObject *arg) { SET_ADD };
+static PyObject * LFO_setSub(LFO *self, PyObject *arg) { SET_SUB };
+static PyObject * LFO_setDiv(LFO *self, PyObject *arg) { SET_DIV };
 
 static PyObject * LFO_play(LFO *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * LFO_out(LFO *self, PyObject *args, PyObject *kwds) { OUT };
@@ -992,14 +992,14 @@ static PyObject *
 LFO_setFreq(LFO *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -1015,25 +1015,25 @@ LFO_setFreq(LFO *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 LFO_setSharp(LFO *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->sharp);
@@ -1049,25 +1049,25 @@ LFO_setSharp(LFO *self, PyObject *arg)
         self->sharp_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 LFO_setType(LFO *self, PyObject *arg)
 {
     int tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		tmp = PyInt_AsLong(arg);
         if (tmp >= 0 && tmp < 8)
@@ -1075,13 +1075,13 @@ LFO_setType(LFO *self, PyObject *arg)
 	}
 
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
-static PyObject * 
-LFO_reset(LFO *self) 
+static PyObject *
+LFO_reset(LFO *self)
 {
     self->pointerPos = 0.0;
     self->sahPointerPos = 0.0;
@@ -1199,4 +1199,4 @@ PyTypeObject LFOType = {
     0,                          /* tp_init */
     0,                                              /* tp_alloc */
     LFO_new,                                     /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/matrixmodule.c b/src/objects/matrixmodule.c
index 9178518..1b7b068 100644
--- a/src/objects/matrixmodule.c
+++ b/src/objects/matrixmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -72,7 +72,7 @@ MatrixStream_getInterpPointFromPos(MatrixStream *self, MYFLT x, MYFLT y)
         while (xpos >= self->width) {
             xpos -= self->width;
         }
-    }    
+    }
 
     ypos = y * self->height;
     if (ypos < 0)
@@ -81,11 +81,11 @@ MatrixStream_getInterpPointFromPos(MatrixStream *self, MYFLT x, MYFLT y)
         while (ypos >= self->height) {
             ypos -= self->height;
         }
-    }    
+    }
 
     xipart = (int)xpos;
     xfpart = xpos - xipart;
-        
+
     yipart = (int)ypos;
     yfpart = ypos - yipart;
 
@@ -93,33 +93,33 @@ MatrixStream_getInterpPointFromPos(MatrixStream *self, MYFLT x, MYFLT y)
     x2 = self->data[yipart+1][xipart]; // (0, 1)
     x3 = self->data[yipart][xipart+1]; // (1, 0)
     x4 = self->data[yipart+1][xipart+1]; // (1, 1)
-        
+
     return (x1*(1-yfpart)*(1-xfpart) + x2*yfpart*(1-xfpart) + x3*(1-yfpart)*xfpart + x4*yfpart*xfpart);
 }
 
-MYFLT 
+MYFLT
 MatrixStream_getPointFromPos(MatrixStream *self, long x, long y)
 {
     return self->data[y][x];
-}    
+}
 
 void
 MatrixStream_setData(MatrixStream *self, MYFLT **data)
 {
     self->data = data;
-}    
+}
 
 void
 MatrixStream_setWidth(MatrixStream *self, int size)
 {
     self->width = size;
-}    
+}
 
 void
 MatrixStream_setHeight(MatrixStream *self, int size)
 {
     self->height = size;
-}    
+}
 
 PyTypeObject MatrixStreamType = {
 PyObject_HEAD_INIT(NULL)
@@ -172,7 +172,7 @@ typedef struct {
     int y_pointer;
 } NewMatrix;
 
-MYFLT 
+MYFLT
 NewMatrix_clip(MYFLT val, MYFLT min, MYFLT max) {
     if (val < min) return min;
     else if (val > max) return max;
@@ -191,7 +191,7 @@ NewMatrix_recordChunkAllRow(NewMatrix *self, MYFLT *data, long datasize)
             self->y_pointer++;
             if (self->y_pointer >= self->height)
                 self->y_pointer = 0;
-        }    
+        }
     }
     Py_INCREF(Py_None);
     return Py_None;
@@ -204,7 +204,7 @@ NewMatrix_traverse(NewMatrix *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 NewMatrix_clear(NewMatrix *self)
 {
     pyo_matrix_CLEAR
@@ -217,7 +217,7 @@ NewMatrix_dealloc(NewMatrix* self)
     int i;
     for (i=0; i<(self->height+1); i++) {
         free(self->data[i]);
-    }    
+    }
     free(self->data);
     NewMatrix_clear(self);
     self->ob_type->tp_free((PyObject*)self);
@@ -229,41 +229,41 @@ NewMatrix_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     int i, j;
     PyObject *inittmp=NULL;
     NewMatrix *self;
-    
+
     self = (NewMatrix *)type->tp_alloc(type, 0);
-    
+
     self->server = PyServer_get_server();
-    
+
     self->x_pointer = self->y_pointer = 0;
-    
+
     MAKE_NEW_MATRIXSTREAM(self->matrixstream, &MatrixStreamType, NULL);
 
     static char *kwlist[] = {"width", "height", "init", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "ii|O", kwlist, &self->width, &self->height, &inittmp))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     self->data = (MYFLT **)realloc(self->data, (self->height + 1) * sizeof(MYFLT *));
-    
+
     for (i=0; i<(self->height+1); i++) {
         self->data[i] = (MYFLT *)malloc((self->width + 1) * sizeof(MYFLT));
     }
-    
+
     for(i=0; i<(self->height+1); i++) {
         for (j=0; j<(self->width+1); j++) {
             self->data[i][j] = 0.0;
-        }    
+        }
     }
-    
+
     MatrixStream_setWidth(self->matrixstream, self->width);
     MatrixStream_setHeight(self->matrixstream, self->height);
-    
+
     if (inittmp) {
         PyObject_CallMethod((PyObject *)self, "setMatrix", "O", inittmp);
     }
-    
+
     MatrixStream_setData(self->matrixstream, self->data);
-    
+
     return (PyObject *)self;
 }
 
@@ -306,16 +306,16 @@ NewMatrix_getData(NewMatrix *self)
 {
     int i, j;
     PyObject *matrix, *samples;
-    
+
     matrix = PyList_New(self->height);
     for(i=0; i<self->height; i++) {
         samples = PyList_New(self->width);
         for (j=0; j<self->width; j++) {
             PyList_SetItem(samples, j, PyFloat_FromDouble(self->data[i][j]));
-        }    
+        }
         PyList_SetItem(matrix, i, samples);
     }
-    
+
     return matrix;
 };
 
@@ -324,14 +324,14 @@ NewMatrix_getViewData(NewMatrix *self)
 {
     int i, j;
     PyObject *matrix;
-    
+
     matrix = PyList_New(self->width*self->height);
     for(i=0; i<self->height; i++) {
         for (j=0; j<self->width; j++) {
             PyList_SET_ITEM(matrix, i*self->width+j, PyFloat_FromDouble(self->data[i][j]*128+128));
-        }    
+        }
     }
-    
+
     return matrix;
 };
 
@@ -345,7 +345,7 @@ NewMatrix_setMatrix(NewMatrix *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the list attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyList_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The matrix value value must be a list.");
         return PyInt_FromLong(-1);
@@ -357,16 +357,16 @@ NewMatrix_setMatrix(NewMatrix *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "New matrix must be of the same size as actual matrix.");
         return PyInt_FromLong(-1);
     }
-    
+
     for(i=0; i<self->height; i++) {
         innerlist = PyList_GetItem(value, i);
         for (j=0; j<self->width; j++) {
             self->data[i][j] = PyFloat_AS_DOUBLE(PyNumber_Float(PyList_GET_ITEM(innerlist, j)));
-        }    
+        }
     }
 
     Py_INCREF(Py_None);
-    return Py_None;    
+    return Py_None;
 }
 
 static PyObject *
@@ -377,10 +377,10 @@ NewMatrix_genSineTerrain(NewMatrix *self, PyObject *args, PyObject *kwds)
     MYFLT freq = 1;
     MYFLT phase = 0.0625;
     static char *kwlist[] = {"freq", "phase", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE__FF, kwlist, &freq, &phase))
         return PyInt_FromLong(-1);
-    
+
     xfreq = TWOPI * freq;
     xsize = 1.0 / self->width;
     for (i=0; i<self->height; i++) {
@@ -390,7 +390,7 @@ NewMatrix_genSineTerrain(NewMatrix *self, PyObject *args, PyObject *kwds)
         }
     }
     Py_INCREF(Py_None);
-    return Py_None;    
+    return Py_None;
 }
 
 static PyMemberDef NewMatrix_members[] = {
@@ -485,9 +485,9 @@ MatrixRec_compute_next_data_frame(MatrixRec *self)
     int width = NewMatrix_getWidth((NewMatrix *)self->matrix);
     int height = NewMatrix_getHeight((NewMatrix *)self->matrix);
     int size = width * height;
-   
+
     int off = self->delay - self->delayCount;
- 
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
     }
@@ -502,12 +502,12 @@ MatrixRec_compute_next_data_frame(MatrixRec *self)
             else
                 self->trigsBuffer[num-1] = 1.0;
             self->active = 0;
-        }    
+        }
     }
-    
-    if (self->pointer < size) {   
+
+    if (self->pointer < size) {
         upBound = size - self->fadeInSample;
-       
+
         if (off == 0)
             num2 = num;
         else if ((num-off) <= 0)
@@ -518,7 +518,7 @@ MatrixRec_compute_next_data_frame(MatrixRec *self)
         MYFLT buffer[num2];
         memset(&buffer, 0, sizeof(buffer));
         MYFLT *in = Stream_getData((Stream *)self->input_stream);
-        
+
         for (i=0; i<num; i++) {
             if (self->delayCount < self->delay) {
                 self->delayCount++;
@@ -535,7 +535,7 @@ MatrixRec_compute_next_data_frame(MatrixRec *self)
             }
         }
         NewMatrix_recordChunkAllRow((NewMatrix *)self->matrix, buffer, num2);
-    }    
+    }
 }
 
 static int
@@ -545,18 +545,18 @@ MatrixRec_traverse(MatrixRec *self, visitproc visit, void *arg)
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
     Py_VISIT(self->matrix);
-    Py_VISIT(self->trig_stream);    
+    Py_VISIT(self->trig_stream);
     return 0;
 }
 
-static int 
+static int
 MatrixRec_clear(MatrixRec *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
     Py_CLEAR(self->matrix);
-    Py_CLEAR(self->trig_stream);    
+    Py_CLEAR(self->trig_stream);
     return 0;
 }
 
@@ -576,36 +576,36 @@ MatrixRec_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *matrixtmp;
     MatrixRec *self;
     self = (MatrixRec *)type->tp_alloc(type, 0);
-    
+
     self->pointer = 0;
     self->active = 1;
     self->fadetime = 0.;
     self->delay = self->delayCount = 0;
-    
+
     INIT_OBJECT_COMMON
-    
+
     Stream_setFunctionPtr(self->stream, MatrixRec_compute_next_data_frame);
     Stream_setStreamActive(self->stream, 0);
 
     static char *kwlist[] = {"input", "matrix", "fadetime", "delay", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_OO_FI, kwlist, &inputtmp, &matrixtmp, &self->fadetime, &self->delay))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     INIT_INPUT_STREAM
 
     Py_XDECREF(self->matrix);
     Py_INCREF(matrixtmp);
     self->matrix = (NewMatrix *)matrixtmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->trigsBuffer = (MYFLT *)realloc(self->trigsBuffer, self->bufsize * sizeof(MYFLT));
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
-    }    
-    
+    }
+
     MAKE_NEW_TRIGGER_STREAM(self->trig_stream, &TriggerStreamType, NULL);
     TriggerStream_setData(self->trig_stream, self->trigsBuffer);
 
@@ -615,7 +615,7 @@ MatrixRec_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if ((self->fadetime * self->sr) > (size * 0.5))
         self->fadetime = size * 0.5 / self->sr;
     self->fadeInSample = roundf(self->fadetime * self->sr + 0.5);
-    
+
     return (PyObject *)self;
 }
 
@@ -623,12 +623,12 @@ static PyObject * MatrixRec_getServer(MatrixRec* self) { GET_SERVER };
 static PyObject * MatrixRec_getStream(MatrixRec* self) { GET_STREAM };
 static PyObject * MatrixRec_getTriggerStream(MatrixRec* self) { GET_TRIGGER_STREAM };
 
-static PyObject * MatrixRec_play(MatrixRec *self, PyObject *args, PyObject *kwds) 
-{ 
+static PyObject * MatrixRec_play(MatrixRec *self, PyObject *args, PyObject *kwds)
+{
     self->pointer = 0;
     self->active = 1;
     self->delayCount = 0;
-    PLAY 
+    PLAY
 };
 
 static PyObject * MatrixRec_stop(MatrixRec *self) { STOP };
@@ -637,20 +637,20 @@ static PyObject *
 MatrixRec_setMatrix(MatrixRec *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
     Py_INCREF(tmp);
 	Py_DECREF(self->matrix);
     self->matrix = (NewMatrix *)tmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef MatrixRec_members[] = {
     {"server", T_OBJECT_EX, offsetof(MatrixRec, server), 0, "Pyo server."},
@@ -737,7 +737,7 @@ MatrixRecLoop_compute_next_data_frame(MatrixRecLoop *self)
     MYFLT buffer[self->bufsize];
     memset(&buffer, 0, sizeof(buffer));
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-        
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
         buffer[i] = in[i];
@@ -756,18 +756,18 @@ MatrixRecLoop_traverse(MatrixRecLoop *self, visitproc visit, void *arg)
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
     Py_VISIT(self->matrix);
-    Py_VISIT(self->trig_stream);    
+    Py_VISIT(self->trig_stream);
     return 0;
 }
 
-static int 
+static int
 MatrixRecLoop_clear(MatrixRecLoop *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
     Py_CLEAR(self->matrix);
-    Py_CLEAR(self->trig_stream);    
+    Py_CLEAR(self->trig_stream);
     return 0;
 }
 
@@ -787,32 +787,32 @@ MatrixRecLoop_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *matrixtmp;
     MatrixRecLoop *self;
     self = (MatrixRecLoop *)type->tp_alloc(type, 0);
-    
+
     self->pointer = 0;
-    
+
     INIT_OBJECT_COMMON
-    
+
     Stream_setFunctionPtr(self->stream, MatrixRecLoop_compute_next_data_frame);
-    
+
     static char *kwlist[] = {"input", "matrix", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist, &inputtmp, &matrixtmp))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     INIT_INPUT_STREAM
 
     Py_XDECREF(self->matrix);
     Py_INCREF(matrixtmp);
     self->matrix = (NewMatrix *)matrixtmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->trigsBuffer = (MYFLT *)realloc(self->trigsBuffer, self->bufsize * sizeof(MYFLT));
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
-    }    
-    
+    }
+
     MAKE_NEW_TRIGGER_STREAM(self->trig_stream, &TriggerStreamType, NULL);
     TriggerStream_setData(self->trig_stream, self->trigsBuffer);
 
@@ -830,20 +830,20 @@ static PyObject *
 MatrixRecLoop_setMatrix(MatrixRecLoop *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
     Py_INCREF(tmp);
 	Py_DECREF(self->matrix);
     self->matrix = (NewMatrix *)tmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef MatrixRecLoop_members[] = {
     {"server", T_OBJECT_EX, offsetof(MatrixRecLoop, server), 0, "Pyo server."},
@@ -934,32 +934,32 @@ MatrixMorph_compute_next_data_frame(MatrixMorph *self)
     int x, y;
     long i, j, width, height, numsamps, index;
     MYFLT input, interp, interp1;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     width = NewMatrix_getWidth((NewMatrix *)self->matrix);
     height = NewMatrix_getHeight((NewMatrix *)self->matrix);
     numsamps = width * height;
     int len = PyList_Size(self->sources);
-    
+
     input = MatrixMorph_clip(in[0]);
-    
+
     interp = input * (len - 1);
-    x = (int)(interp);   
+    x = (int)(interp);
     y = x + 1;
-    
+
     MatrixStream *tab1 = (MatrixStream *)PyObject_CallMethod((PyObject *)PyList_GET_ITEM(self->sources, x), "getMatrixStream", "");
     MatrixStream *tab2 = (MatrixStream *)PyObject_CallMethod((PyObject *)PyList_GET_ITEM(self->sources, y), "getMatrixStream", "");
-    
+
     interp = MYFMOD(interp, 1.0);
     interp1 = 1. - interp;
-    
+
     for (i=0; i<height; i++) {
         for (j=0; j<width; j++) {
             index = i*width+j;
             self->buffer[index] = MatrixStream_getPointFromPos(tab1, j, i) * interp1 + MatrixStream_getPointFromPos(tab2, j, i) * interp;
-        }    
-    }    
-    
+        }
+    }
+
     NewMatrix_recordChunkAllRow((NewMatrix *)self->matrix, self->buffer, numsamps);
 }
 
@@ -974,7 +974,7 @@ MatrixMorph_traverse(MatrixMorph *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 MatrixMorph_clear(MatrixMorph *self)
 {
     pyo_CLEAR
@@ -1002,16 +1002,16 @@ MatrixMorph_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *matrixtmp, *sourcestmp;
     MatrixMorph *self;
     self = (MatrixMorph *)type->tp_alloc(type, 0);
-    
+
     INIT_OBJECT_COMMON
-    
+
     Stream_setFunctionPtr(self->stream, MatrixMorph_compute_next_data_frame);
 
     static char *kwlist[] = {"input", "matrix", "sources", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OOO", kwlist, &inputtmp, &matrixtmp, &sourcestmp))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     INIT_INPUT_STREAM
 
     Py_XDECREF(self->matrix);
@@ -1026,9 +1026,9 @@ MatrixMorph_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     Py_XDECREF(self->sources);
     Py_INCREF(sourcestmp);
     self->sources = (PyObject *)sourcestmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     return (PyObject *)self;
 }
 
@@ -1042,38 +1042,38 @@ static PyObject *
 MatrixMorph_setMatrix(MatrixMorph *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
     Py_INCREF(tmp);
 	Py_DECREF(self->matrix);
     self->matrix = (PyObject *)tmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
 
 static PyObject *
 MatrixMorph_setSources(MatrixMorph *self, PyObject *arg)
-{	
+{
     if (arg == NULL) {
         PyErr_SetString(PyExc_TypeError, "Cannot delete the list attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyList_Check(arg)) {
         PyErr_SetString(PyExc_TypeError, "The amplitude list attribute value must be a list.");
         return PyInt_FromLong(-1);
     }
-    
+
     Py_INCREF(arg);
     Py_DECREF(self->sources);
     self->sources = arg;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -1138,4 +1138,3 @@ PyTypeObject MatrixMorphType = {
     0,                         /* tp_alloc */
     MatrixMorph_new,                 /* tp_new */
 };
-
diff --git a/src/objects/matrixprocessmodule.c b/src/objects/matrixprocessmodule.c
index ef30191..78a51f7 100644
--- a/src/objects/matrixprocessmodule.c
+++ b/src/objects/matrixprocessmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -70,40 +70,40 @@ MatrixPointer_setProcMode(MatrixPointer *self)
     self->proc_func_ptr = MatrixPointer_readframes;
 
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = MatrixPointer_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = MatrixPointer_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = MatrixPointer_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = MatrixPointer_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = MatrixPointer_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = MatrixPointer_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = MatrixPointer_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = MatrixPointer_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = MatrixPointer_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 MatrixPointer_compute_next_data_frame(MatrixPointer *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -112,22 +112,22 @@ MatrixPointer_traverse(MatrixPointer *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->matrix);
-    Py_VISIT(self->x);    
-    Py_VISIT(self->x_stream);    
-    Py_VISIT(self->y);    
-    Py_VISIT(self->y_stream);    
+    Py_VISIT(self->x);
+    Py_VISIT(self->x_stream);
+    Py_VISIT(self->y);
+    Py_VISIT(self->y_stream);
     return 0;
 }
 
-static int 
+static int
 MatrixPointer_clear(MatrixPointer *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->matrix);
-    Py_CLEAR(self->x);    
-    Py_CLEAR(self->x_stream);    
-    Py_CLEAR(self->y);    
-    Py_CLEAR(self->y_stream);    
+    Py_CLEAR(self->x);
+    Py_CLEAR(self->x_stream);
+    Py_CLEAR(self->y);
+    Py_CLEAR(self->y_stream);
     return 0;
 }
 
@@ -146,26 +146,26 @@ MatrixPointer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *matrixtmp, *xtmp, *ytmp, *multmp=NULL, *addtmp=NULL;
     MatrixPointer *self;
     self = (MatrixPointer *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, MatrixPointer_compute_next_data_frame);
     self->mode_func_ptr = MatrixPointer_setProcMode;
 
     static char *kwlist[] = {"matrix", "x", "y", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OOO|OO", kwlist, &matrixtmp, &xtmp, &ytmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if ( PyObject_HasAttrString((PyObject *)matrixtmp, "getMatrixStream") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"matrix\" argument of MatrixPointer must be a PyoMatrixObject.\n");
         Py_RETURN_NONE;
     }
     Py_XDECREF(self->matrix);
     self->matrix = PyObject_CallMethod((PyObject *)matrixtmp, "getMatrixStream", "");
-    
+
     if (xtmp) {
         PyObject_CallMethod((PyObject *)self, "setX", "O", xtmp);
     }
@@ -173,26 +173,26 @@ MatrixPointer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (ytmp) {
         PyObject_CallMethod((PyObject *)self, "setY", "O", ytmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * MatrixPointer_getServer(MatrixPointer* self) { GET_SERVER };
 static PyObject * MatrixPointer_getStream(MatrixPointer* self) { GET_STREAM };
-static PyObject * MatrixPointer_setMul(MatrixPointer *self, PyObject *arg) { SET_MUL };	
-static PyObject * MatrixPointer_setAdd(MatrixPointer *self, PyObject *arg) { SET_ADD };	
-static PyObject * MatrixPointer_setSub(MatrixPointer *self, PyObject *arg) { SET_SUB };	
-static PyObject * MatrixPointer_setDiv(MatrixPointer *self, PyObject *arg) { SET_DIV };	
+static PyObject * MatrixPointer_setMul(MatrixPointer *self, PyObject *arg) { SET_MUL };
+static PyObject * MatrixPointer_setAdd(MatrixPointer *self, PyObject *arg) { SET_ADD };
+static PyObject * MatrixPointer_setSub(MatrixPointer *self, PyObject *arg) { SET_SUB };
+static PyObject * MatrixPointer_setDiv(MatrixPointer *self, PyObject *arg) { SET_DIV };
 
 static PyObject * MatrixPointer_play(MatrixPointer *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * MatrixPointer_out(MatrixPointer *self, PyObject *args, PyObject *kwds) { OUT };
@@ -218,12 +218,12 @@ static PyObject *
 MatrixPointer_setMatrix(MatrixPointer *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
     if ( PyObject_HasAttrString((PyObject *)tmp, "getMatrixStream") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"matrix\" argument of MatrixPointer must be a PyoMatrixObject.\n");
@@ -232,28 +232,28 @@ MatrixPointer_setMatrix(MatrixPointer *self, PyObject *arg)
 
 	Py_DECREF(self->matrix);
     self->matrix = PyObject_CallMethod((PyObject *)tmp, "getMatrixStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 MatrixPointer_setX(MatrixPointer *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 
 	if (PyObject_HasAttrString((PyObject *)tmp, "server") == 0) {
         PyErr_SetString(PyExc_TypeError, "\"x\" attribute of MatrixPointer must be a PyoObject.\n");
         Py_RETURN_NONE;
 	}
-	
+
 	Py_INCREF(tmp);
 	Py_XDECREF(self->x);
 
@@ -262,40 +262,40 @@ MatrixPointer_setX(MatrixPointer *self, PyObject *arg)
     Py_INCREF(streamtmp);
     Py_XDECREF(self->x_stream);
     self->x_stream = (Stream *)streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 MatrixPointer_setY(MatrixPointer *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 
 	if (PyObject_HasAttrString((PyObject *)tmp, "server") == 0) {
         PyErr_SetString(PyExc_TypeError, "\"y\" attribute of MatrixPointer must be a PyoObject.\n");
         Py_RETURN_NONE;
 	}
-	
+
 	Py_INCREF(tmp);
 	Py_XDECREF(self->y);
-    
+
     self->y = tmp;
     streamtmp = PyObject_CallMethod((PyObject *)self->y, "_getStream", NULL);
     Py_INCREF(streamtmp);
     Py_XDECREF(self->y_stream);
     self->y_stream = (Stream *)streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef MatrixPointer_members[] = {
 {"server", T_OBJECT_EX, offsetof(MatrixPointer, server), 0, "Pyo server."},
@@ -407,4 +407,4 @@ MatrixPointer_members,             /* tp_members */
 0,      /* tp_init */
 0,                         /* tp_alloc */
 MatrixPointer_new,                 /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/metromodule.c b/src/objects/metromodule.c
index 2deeb00..8efc518 100644
--- a/src/objects/metromodule.c
+++ b/src/objects/metromodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -44,23 +44,23 @@ Metro_generate_i(Metro *self) {
     MYFLT val;
     double tm, off;
     int i;
-    
+
     tm = PyFloat_AS_DOUBLE(self->time);
     off = tm * self->offset;
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (self->currentTime >= tm) {
             val = 0;
             self->currentTime -= tm;
             self->flag = 1;
-        }    
+        }
         else if (self->currentTime >= off && self->flag == 1) {
             val = 1;
             self->flag = 0;
-        }    
+        }
         else
             val = 0;
-        
+
         self->data[i] = val;
         self->currentTime += self->sampleToSec;
     }
@@ -71,9 +71,9 @@ Metro_generate_a(Metro *self) {
     MYFLT val;
     double off, tmd;
     int i;
-    
+
     MYFLT *tm = Stream_getData((Stream *)self->time_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         tmd = (double)tm[i];
         off = tmd * self->offset;
@@ -85,10 +85,10 @@ Metro_generate_a(Metro *self) {
         else if (self->currentTime >= off && self->flag == 1) {
             val = 1;
             self->flag = 0;
-        }    
+        }
         else
             val = 0;
-        
+
         self->data[i] = val;
         self->currentTime += self->sampleToSec;
     }
@@ -112,48 +112,48 @@ Metro_setProcMode(Metro *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
     switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = Metro_generate_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Metro_generate_a;
             break;
     }
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Metro_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Metro_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Metro_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Metro_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Metro_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Metro_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Metro_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Metro_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Metro_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 Metro_compute_next_data_frame(Metro *self)
 {
-    (*self->proc_func_ptr)(self);    
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -161,16 +161,16 @@ static int
 Metro_traverse(Metro *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->time);    
-    Py_VISIT(self->time_stream);    
+    Py_VISIT(self->time);
+    Py_VISIT(self->time_stream);
     return 0;
 }
 
-static int 
+static int
 Metro_clear(Metro *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->time);    
+    Py_CLEAR(self->time);
     Py_CLEAR(self->time_stream);
     return 0;
 }
@@ -190,7 +190,7 @@ Metro_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *timetmp=NULL;
     Metro *self;
     self = (Metro *)type->tp_alloc(type, 0);
-    
+
     self->time = PyFloat_FromDouble(1.);
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
@@ -207,27 +207,27 @@ Metro_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->currentTime = 0.;
 
     static char *kwlist[] = {"time", "offset", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|Od", kwlist, &timetmp, &self->offset))
         Py_RETURN_NONE;
 
     if (timetmp) {
         PyObject_CallMethod((PyObject *)self, "setTime", "O", timetmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Metro_getServer(Metro* self) { GET_SERVER };
 static PyObject * Metro_getStream(Metro* self) { GET_STREAM };
-static PyObject * Metro_setMul(Metro *self, PyObject *arg) { SET_MUL };	
-static PyObject * Metro_setAdd(Metro *self, PyObject *arg) { SET_ADD };	
-static PyObject * Metro_setSub(Metro *self, PyObject *arg) { SET_SUB };	
-static PyObject * Metro_setDiv(Metro *self, PyObject *arg) { SET_DIV };	
+static PyObject * Metro_setMul(Metro *self, PyObject *arg) { SET_MUL };
+static PyObject * Metro_setAdd(Metro *self, PyObject *arg) { SET_ADD };
+static PyObject * Metro_setSub(Metro *self, PyObject *arg) { SET_SUB };
+static PyObject * Metro_setDiv(Metro *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Metro_play(Metro *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Metro_stop(Metro *self) { STOP };
@@ -245,14 +245,14 @@ static PyObject *
 Metro_setTime(Metro *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->time);
@@ -268,12 +268,12 @@ Metro_setTime(Metro *self, PyObject *arg)
         self->time_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Metro_members[] = {
 {"server", T_OBJECT_EX, offsetof(Metro, server), 0, "Pyo server."},
@@ -290,7 +290,7 @@ static PyMethodDef Metro_methods[] = {
 {"play", (PyCFunction)Metro_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
 {"stop", (PyCFunction)Metro_stop, METH_NOARGS, "Stops computing."},
 {"setTime", (PyCFunction)Metro_setTime, METH_O, "Sets time factor."},
-{"setMul", (PyCFunction)Metro_setMul, METH_O, "Sets oscillator mul factor."}, 
+{"setMul", (PyCFunction)Metro_setMul, METH_O, "Sets oscillator mul factor."},
 {"setAdd", (PyCFunction)Metro_setAdd, METH_O, "Sets oscillator add factor."},
 {"setSub", (PyCFunction)Metro_setSub, METH_O, "Sets inverse add factor."},
 {"setDiv", (PyCFunction)Metro_setDiv, METH_O, "Sets inverse mul factor."},
@@ -408,7 +408,7 @@ static void
 Seqer_reset(Seqer *self)
 {
     int i;
-    
+
     self->seqsize = PyList_Size(self->tmp);
     self->seq = (int *)realloc(self->seq, self->seqsize * sizeof(int));
     for (i=0; i<self->seqsize; i++) {
@@ -421,18 +421,18 @@ static void
 Seqer_generate_i(Seqer *self) {
     double tm;
     int i;
-    
+
     tm = PyFloat_AS_DOUBLE(self->time);
 
     if (self->currentTime == -1.0) {
         self->currentTime = tm;
-    }    
-    
+    }
+
     for (i=0; i<(self->poly*self->bufsize); i++) {
         self->buffer_streams[i] = 0.0;
     }
-        
-    for (i=0; i<self->bufsize; i++) {   
+
+    for (i=0; i<self->bufsize; i++) {
         self->currentTime += self->sampleToSec;
         if (self->currentTime >= tm) {
             self->currentTime -= tm;
@@ -448,9 +448,9 @@ Seqer_generate_i(Seqer *self) {
                     self->tap = 0;
                     if (self->newseq == 1)
                         Seqer_reset(self);
-                }    
-            } 
-        }    
+                }
+            }
+        }
     }
 }
 
@@ -458,18 +458,18 @@ static void
 Seqer_generate_a(Seqer *self) {
     double tm;
     int i;
-    
+
     MYFLT *time = Stream_getData((Stream *)self->time_stream);
-    
+
     if (self->currentTime == -1.0) {
         self->currentTime = time[0];
-    }    
-    
+    }
+
     for (i=0; i<(self->poly*self->bufsize); i++) {
         self->buffer_streams[i] = 0.0;
     }
-    
-    for (i=0; i<self->bufsize; i++) {   
+
+    for (i=0; i<self->bufsize; i++) {
         tm = (double)time[i];
         self->currentTime += self->sampleToSec;
         if (self->currentTime >= tm) {
@@ -486,9 +486,9 @@ Seqer_generate_a(Seqer *self) {
                     self->tap = 0;
                     if (self->newseq == 1)
                         Seqer_reset(self);
-                }    
-            } 
-        }    
+                }
+            }
+        }
     }
 }
 
@@ -496,17 +496,17 @@ MYFLT *
 Seqer_getSamplesBuffer(Seqer *self)
 {
     return (MYFLT *)self->buffer_streams;
-}    
+}
 
 static void
 Seqer_setProcMode(Seqer *self)
 {
     int procmode = self->modebuffer[0];
     switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = Seqer_generate_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Seqer_generate_a;
             break;
     }
@@ -515,24 +515,24 @@ Seqer_setProcMode(Seqer *self)
 static void
 Seqer_compute_next_data_frame(Seqer *self)
 {
-    (*self->proc_func_ptr)(self);    
+    (*self->proc_func_ptr)(self);
 }
 
 static int
 Seqer_traverse(Seqer *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->time);    
-    Py_VISIT(self->time_stream);  
+    Py_VISIT(self->time);
+    Py_VISIT(self->time_stream);
     Py_VISIT(self->tmp);
     return 0;
 }
 
-static int 
+static int
 Seqer_clear(Seqer *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->time);    
+    Py_CLEAR(self->time);
     Py_CLEAR(self->time_stream);
     Py_CLEAR(self->tmp);
     return 0;
@@ -554,7 +554,7 @@ Seqer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *timetmp=NULL, *seqtmp=NULL;
     Seqer *self;
     self = (Seqer *)type->tp_alloc(type, 0);
-    
+
     self->time = PyFloat_FromDouble(1.);
     self->flag = 1;
     self->poly = 1;
@@ -567,21 +567,21 @@ Seqer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->count = 0;
     self->voiceCount = 0;
 	self->modebuffer[0] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Seqer_compute_next_data_frame);
     self->mode_func_ptr = Seqer_setProcMode;
-    
+
     Stream_setStreamActive(self->stream, 0);
-    
+
     self->sampleToSec = 1.0 / self->sr;
     self->currentTime = -1.0;
 
     static char *kwlist[] = {"time", "seq", "poly", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist, &timetmp, &seqtmp, &self->poly))
         Py_RETURN_NONE;
-    
+
     if (timetmp) {
         PyObject_CallMethod((PyObject *)self, "setTime", "O", timetmp);
     }
@@ -589,13 +589,13 @@ Seqer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (seqtmp) {
         PyObject_CallMethod((PyObject *)self, "setSeq", "O", seqtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     self->buffer_streams = (MYFLT *)realloc(self->buffer_streams, self->poly * self->bufsize * sizeof(MYFLT));
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
@@ -609,14 +609,14 @@ static PyObject *
 Seqer_setTime(Seqer *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->time);
@@ -632,25 +632,25 @@ Seqer_setTime(Seqer *self, PyObject *arg)
         self->time_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Seqer_setSeq(Seqer *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isList = PyList_Check(arg);
-	
+
 	if (isList == 1) {
         tmp = arg;
         Py_INCREF(tmp);
@@ -658,10 +658,10 @@ Seqer_setSeq(Seqer *self, PyObject *arg)
         self->tmp = tmp;
         self->newseq = 1;
     }
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Seqer_members[] = {
     {"server", T_OBJECT_EX, offsetof(Seqer, server), 0, "Pyo server."},
@@ -728,7 +728,7 @@ PyTypeObject SeqerType = {
 typedef struct {
     pyo_audio_HEAD
     Seqer *mainPlayer;
-    int chnl; 
+    int chnl;
     int modebuffer[2];
 } Seq;
 
@@ -746,36 +746,36 @@ static void
 Seq_setProcMode(Seq *self) {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Seq_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Seq_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Seq_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Seq_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Seq_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Seq_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Seq_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Seq_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Seq_postprocessing_revareva;
             break;
-    }      
+    }
 }
 
 static void
@@ -787,7 +787,7 @@ Seq_compute_next_data_frame(Seq *self)
     tmp = Seqer_getSamplesBuffer((Seqer *)self->mainPlayer);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -799,11 +799,11 @@ Seq_traverse(Seq *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Seq_clear(Seq *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainPlayer);    
+    Py_CLEAR(self->mainPlayer);
     return 0;
 }
 
@@ -822,37 +822,37 @@ Seq_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL;
     Seq *self;
     self = (Seq *)type->tp_alloc(type, 0);
-    
+
     self->chnl = 0;
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Seq_compute_next_data_frame);
     self->mode_func_ptr = Seq_setProcMode;
 
     static char *kwlist[] = {"mainPlayer", "chnl", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|i", kwlist, &maintmp, &self->chnl))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainPlayer);
     Py_INCREF(maintmp);
     self->mainPlayer = (Seqer *)maintmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Seq_getServer(Seq* self) { GET_SERVER };
 static PyObject * Seq_getStream(Seq* self) { GET_STREAM };
-static PyObject * Seq_setMul(Seq *self, PyObject *arg) { SET_MUL };	
-static PyObject * Seq_setAdd(Seq *self, PyObject *arg) { SET_ADD };	
-static PyObject * Seq_setSub(Seq *self, PyObject *arg) { SET_SUB };	
-static PyObject * Seq_setDiv(Seq *self, PyObject *arg) { SET_DIV };	
+static PyObject * Seq_setMul(Seq *self, PyObject *arg) { SET_MUL };
+static PyObject * Seq_setAdd(Seq *self, PyObject *arg) { SET_ADD };
+static PyObject * Seq_setSub(Seq *self, PyObject *arg) { SET_SUB };
+static PyObject * Seq_setDiv(Seq *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Seq_play(Seq *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Seq_out(Seq *self, PyObject *args, PyObject *kwds) { OUT };
@@ -884,7 +884,7 @@ static PyMethodDef Seq_methods[] = {
     {"setMul", (PyCFunction)Seq_setMul, METH_O, "Sets oscillator mul factor."},
     {"setAdd", (PyCFunction)Seq_setAdd, METH_O, "Sets oscillator add factor."},
     {"setSub", (PyCFunction)Seq_setSub, METH_O, "Sets inverse add factor."},
-    {"setDiv", (PyCFunction)Seq_setDiv, METH_O, "Sets inverse mul factor."},    
+    {"setDiv", (PyCFunction)Seq_setDiv, METH_O, "Sets inverse mul factor."},
     {NULL}  /* Sentinel */
 };
 
@@ -998,7 +998,7 @@ Clouder_generate_i(Clouder *self) {
     for (i=0; i<(self->poly*self->bufsize); i++) {
         self->buffer_streams[i] = 0.0;
     }
-    
+
     dens *= 0.5;
     for (i=0; i<self->bufsize; i++) {
         rnd = (int)(rand() / (MYFLT)RAND_MAX * self->sr);
@@ -1006,7 +1006,7 @@ Clouder_generate_i(Clouder *self) {
             self->buffer_streams[i + self->voiceCount++ * self->bufsize] = 1.0;
             if (self->voiceCount == self->poly)
                 self->voiceCount = 0;
-        }        
+        }
     }
 }
 
@@ -1014,27 +1014,27 @@ static void
 Clouder_generate_a(Clouder *self) {
     MYFLT dens;
     int i, rnd;
-    
+
     MYFLT *density = Stream_getData((Stream *)self->density_stream);
 
     for (i=0; i<(self->poly*self->bufsize); i++) {
         self->buffer_streams[i] = 0.0;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         dens = density[i];
         if (dens <= 0.0)
             dens = 0.0;
         else if (dens > self->sr)
             dens = self->sr;
-        
+
         dens *= 0.5;
         rnd = (int)(rand() / (MYFLT)RAND_MAX * self->sr);
         if (rnd < dens) {
             self->buffer_streams[i + self->voiceCount++ * self->bufsize] = 1.0;
             if (self->voiceCount == self->poly)
                 self->voiceCount = 0;
-        } 
+        }
     }
 }
 
@@ -1042,17 +1042,17 @@ MYFLT *
 Clouder_getSamplesBuffer(Clouder *self)
 {
     return (MYFLT *)self->buffer_streams;
-}    
+}
 
 static void
 Clouder_setProcMode(Clouder *self)
 {
     int procmode = self->modebuffer[0];
     switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = Clouder_generate_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Clouder_generate_a;
             break;
     }
@@ -1061,23 +1061,23 @@ Clouder_setProcMode(Clouder *self)
 static void
 Clouder_compute_next_data_frame(Clouder *self)
 {
-    (*self->proc_func_ptr)(self);    
+    (*self->proc_func_ptr)(self);
 }
 
 static int
 Clouder_traverse(Clouder *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->density);    
-    Py_VISIT(self->density_stream);    
+    Py_VISIT(self->density);
+    Py_VISIT(self->density_stream);
     return 0;
 }
 
-static int 
+static int
 Clouder_clear(Clouder *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->density);    
+    Py_CLEAR(self->density);
     Py_CLEAR(self->density_stream);
     return 0;
 }
@@ -1098,35 +1098,35 @@ Clouder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *densitytmp=NULL;
     Clouder *self;
     self = (Clouder *)type->tp_alloc(type, 0);
-    
+
     self->density = PyFloat_FromDouble(10.0);
     self->poly = 1;
     self->voiceCount = 0;
 	self->modebuffer[0] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Clouder_compute_next_data_frame);
     self->mode_func_ptr = Clouder_setProcMode;
-    
+
     Stream_setStreamActive(self->stream, 0);
 
     static char *kwlist[] = {"density", "poly", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|Oi", kwlist, &densitytmp, &self->poly))
         Py_RETURN_NONE;
-    
+
     if (densitytmp) {
         PyObject_CallMethod((PyObject *)self, "setDensity", "O", densitytmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     Server_generateSeed((Server *)self->server, CLOUD_ID);
 
     self->buffer_streams = (MYFLT *)realloc(self->buffer_streams, self->poly * self->bufsize * sizeof(MYFLT));
-    
+
     return (PyObject *)self;
 }
 
@@ -1140,14 +1140,14 @@ static PyObject *
 Clouder_setDensity(Clouder *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->density);
@@ -1163,12 +1163,12 @@ Clouder_setDensity(Clouder *self, PyObject *arg)
         self->density_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Clouder_members[] = {
 {"server", T_OBJECT_EX, offsetof(Clouder, server), 0, "Pyo server."},
@@ -1234,7 +1234,7 @@ Clouder_new,                 /* tp_new */
 typedef struct {
     pyo_audio_HEAD
     Clouder *mainPlayer;
-    int chnl; 
+    int chnl;
     int modebuffer[2];
 } Cloud;
 
@@ -1252,36 +1252,36 @@ static void
 Cloud_setProcMode(Cloud *self) {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Cloud_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Cloud_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Cloud_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Cloud_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Cloud_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Cloud_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Cloud_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Cloud_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Cloud_postprocessing_revareva;
             break;
-    }      
+    }
 }
 
 static void
@@ -1293,7 +1293,7 @@ Cloud_compute_next_data_frame(Cloud *self)
     tmp = Clouder_getSamplesBuffer((Clouder *)self->mainPlayer);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1305,11 +1305,11 @@ Cloud_traverse(Cloud *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Cloud_clear(Cloud *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainPlayer);    
+    Py_CLEAR(self->mainPlayer);
     return 0;
 }
 
@@ -1328,37 +1328,37 @@ Cloud_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL;
     Cloud *self;
     self = (Cloud *)type->tp_alloc(type, 0);
-    
+
     self->chnl = 0;
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Cloud_compute_next_data_frame);
     self->mode_func_ptr = Cloud_setProcMode;
 
     static char *kwlist[] = {"mainPlayer", "chnl", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|i", kwlist, &maintmp, &self->chnl))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainPlayer);
     Py_INCREF(maintmp);
     self->mainPlayer = (Clouder *)maintmp;
 
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Cloud_getServer(Cloud* self) { GET_SERVER };
 static PyObject * Cloud_getStream(Cloud* self) { GET_STREAM };
-static PyObject * Cloud_setMul(Cloud *self, PyObject *arg) { SET_MUL };	
-static PyObject * Cloud_setAdd(Cloud *self, PyObject *arg) { SET_ADD };	
-static PyObject * Cloud_setSub(Cloud *self, PyObject *arg) { SET_SUB };	
-static PyObject * Cloud_setDiv(Cloud *self, PyObject *arg) { SET_DIV };	
+static PyObject * Cloud_setMul(Cloud *self, PyObject *arg) { SET_MUL };
+static PyObject * Cloud_setAdd(Cloud *self, PyObject *arg) { SET_ADD };
+static PyObject * Cloud_setSub(Cloud *self, PyObject *arg) { SET_SUB };
+static PyObject * Cloud_setDiv(Cloud *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Cloud_play(Cloud *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Cloud_out(Cloud *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1390,7 +1390,7 @@ static PyMethodDef Cloud_methods[] = {
 {"setMul", (PyCFunction)Cloud_setMul, METH_O, "Sets oscillator mul factor."},
 {"setAdd", (PyCFunction)Cloud_setAdd, METH_O, "Sets oscillator add factor."},
 {"setSub", (PyCFunction)Cloud_setSub, METH_O, "Sets inverse add factor."},
-{"setDiv", (PyCFunction)Cloud_setDiv, METH_O, "Sets inverse mul factor."},    
+{"setDiv", (PyCFunction)Cloud_setDiv, METH_O, "Sets inverse mul factor."},
 {NULL}  /* Sentinel */
 };
 
@@ -1502,36 +1502,36 @@ Trig_setProcMode(Trig *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Trig_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Trig_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Trig_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Trig_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Trig_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Trig_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Trig_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Trig_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Trig_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
@@ -1540,7 +1540,7 @@ Trig_compute_next_data_frame(Trig *self)
     if (self->flag == 1) {
         self->data[0] = 1.0;
         self->flag = 0;
-    }    
+    }
     else
         self->data[0] = 0.0;
     (*self->muladd_func_ptr)(self);
@@ -1553,7 +1553,7 @@ Trig_traverse(Trig *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Trig_clear(Trig *self)
 {
     pyo_CLEAR
@@ -1574,38 +1574,38 @@ Trig_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     int i;
     Trig *self;
     self = (Trig *)type->tp_alloc(type, 0);
-    
+
     self->flag = 1;
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Trig_compute_next_data_frame);
     self->mode_func_ptr = Trig_setProcMode;
 
     static char *kwlist[] = {NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "", kwlist))
         Py_RETURN_NONE;
 
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Trig_getServer(Trig* self) { GET_SERVER };
 static PyObject * Trig_getStream(Trig* self) { GET_STREAM };
-static PyObject * Trig_setMul(Trig *self, PyObject *arg) { SET_MUL };	
-static PyObject * Trig_setAdd(Trig *self, PyObject *arg) { SET_ADD };	
-static PyObject * Trig_setSub(Trig *self, PyObject *arg) { SET_SUB };	
-static PyObject * Trig_setDiv(Trig *self, PyObject *arg) { SET_DIV };	
+static PyObject * Trig_setMul(Trig *self, PyObject *arg) { SET_MUL };
+static PyObject * Trig_setAdd(Trig *self, PyObject *arg) { SET_ADD };
+static PyObject * Trig_setSub(Trig *self, PyObject *arg) { SET_SUB };
+static PyObject * Trig_setDiv(Trig *self, PyObject *arg) { SET_DIV };
 
-static PyObject * Trig_play(Trig *self, PyObject *args, PyObject *kwds) 
-{ 
+static PyObject * Trig_play(Trig *self, PyObject *args, PyObject *kwds)
+{
     self->flag = 1;
-    PLAY 
+    PLAY
 };
 
 static PyObject * Trig_stop(Trig *self) { STOP };
@@ -1780,7 +1780,7 @@ Beater_defineAccent(int n) {
         return 0.5;
 }
 
-static void 
+static void
 Beater_restore(Beater *self) {
     int i;
     self->fillEnd = 0;
@@ -1789,9 +1789,9 @@ Beater_restore(Beater *self) {
         self->sequence[i] = self->tmp_sequence[i];
         self->durations[i] = self->tmp_durations[i];
     }
-}    
-    
-static void 
+}
+
+static void
 Beater_makeTable(Beater *self, int fill) {
 	short i;
 	short len;
@@ -1813,25 +1813,25 @@ Beater_makeTable(Beater *self, int fill) {
             self->tmp_accentTable[i] = self->accentTable[i];
             self->tmp_sequence[i] = self->sequence[i];
             self->tmp_durations[i] = self->durations[i];
-        }    
+        }
     }
-    
+
 	if ((self->taps % 7) == 0) {
 		len = 7;
 		for (i=0; i < self->taps; i++) {
             if ((i % len) == 4  || (i % len) == 2) {
                 self->tapProb[i] = w2;
                 self->accentTable[i] = Beater_defineAccent(2);
-            }	
+            }
             else if ((i % len) == 0) {
                 self->tapProb[i] = w1;
                 self->accentTable[i] = Beater_defineAccent(1);
-            }	
+            }
             else {
                 self->tapProb[i] = w3;
                 self->accentTable[i] = Beater_defineAccent(3);
-            }	
-		}	
+            }
+		}
 	}
 	else if ((self->taps % 6) == 0) {
 		len = 6;
@@ -1839,7 +1839,7 @@ Beater_makeTable(Beater *self, int fill) {
             if ((i % len) == 3) {
                 self->tapProb[i] = w2;
                 self->accentTable[i] = Beater_defineAccent(2);
-            }	
+            }
             else if ((i % len) == 0) {
                 self->tapProb[i] = w1;
                 self->accentTable[i] = Beater_defineAccent(1);
@@ -1847,8 +1847,8 @@ Beater_makeTable(Beater *self, int fill) {
             else {
                 self->tapProb[i] = w3;
                 self->accentTable[i] = Beater_defineAccent(3);
-            }		
-		}	
+            }
+		}
 	}
 	else if ((self->taps % 5) == 0) {
 		len = 5;
@@ -1856,7 +1856,7 @@ Beater_makeTable(Beater *self, int fill) {
             if ((i % len) == 3) {
                 self->tapProb[i] = w2;
                 self->accentTable[i] = Beater_defineAccent(2);
-            }	
+            }
             else if ((i % len) == 0) {
                 self->tapProb[i] = w1;
                 self->accentTable[i] = Beater_defineAccent(1);
@@ -1864,25 +1864,25 @@ Beater_makeTable(Beater *self, int fill) {
             else {
                 self->tapProb[i] = w3;
                 self->accentTable[i] = Beater_defineAccent(3);
-            }		
-		}	
+            }
+		}
 	}
 	else if ((self->taps % 4) == 0) {
 		len = 4;
-		for (i=0; i < self->taps; i++) {	
+		for (i=0; i < self->taps; i++) {
             if ((i % len) == 2) {
                 self->tapProb[i] = w2;
                 self->accentTable[i] = Beater_defineAccent(2);
-            }	
+            }
             else if ((i % len) == 0) {
                 self->tapProb[i] = w1;
                 self->accentTable[i] = Beater_defineAccent(1);
-            }	
+            }
             else {
                 self->tapProb[i] = w3;
                 self->accentTable[i] = Beater_defineAccent(3);
-            }	
-		}	
+            }
+		}
 	}
 	else if ((self->taps % 3) == 0) {
 		len = 3;
@@ -1894,8 +1894,8 @@ Beater_makeTable(Beater *self, int fill) {
             else {
                 self->tapProb[i] = w3;
                 self->accentTable[i] = Beater_defineAccent(3);
-            }	
-		}	
+            }
+		}
 	}
 	else if ((self->taps % 2) == 0) {
 		len = 2;
@@ -1907,22 +1907,22 @@ Beater_makeTable(Beater *self, int fill) {
             else {
                 self->tapProb[i] = w3;
                 self->accentTable[i] = Beater_defineAccent(3);
-            }	
-		}	
-	}		
+            }
+		}
+	}
 }
 
-static void 
+static void
 Beater_makeSequence(Beater *self) {
 	short i, j;
-    
+
 	j = 0;
 	for (i=0; i < self->taps; i++) {
 		if ((rand() % 100) < self->tapProb[i]) {
 			self->sequence[i] = 1;
 			self->tapList[j++] = i;
-		}	
-		else	
+		}
+		else
 			self->sequence[i] = 0;
 	}
 
@@ -1932,7 +1932,7 @@ Beater_makeSequence(Beater *self) {
 static void
 Beater_calculateDurations(Beater *self) {
     int i;
-    
+
     for (i=0; i < (self->tapLength-1); i++) {
 		self->durations[self->tapList[i]] = (self->tapList[i+1] - self->tapList[i]) * self->tapDur - 0.005;
 	}
@@ -1940,24 +1940,24 @@ Beater_calculateDurations(Beater *self) {
 }
 
 static void
-Beater_makePresetActive(Beater *self, int n) 
+Beater_makePresetActive(Beater *self, int n)
 {
     int i, j, len;
-    
+
     self->preCall = -1;
     len = self->preset[n][0];
     if (len != self->taps) {
         self->taps = len;
         Beater_makeTable(self, 0);
     }
-    
+
     j = 0;
     for (i=0; i<self->taps; i++) {
         self->sequence[i] = self->preset[n][i+1];
         if (self->sequence[i] == 1)
             self->tapList[j++] = i;
     }
-    
+
     self->tapLength = j;
 }
 
@@ -1965,20 +1965,20 @@ static void
 Beater_generate_i(Beater *self) {
     int i, j;
     double tm;
-    
+
     tm = PyFloat_AS_DOUBLE(self->time);
-    
+
     self->tapDur = (MYFLT)tm;
     Beater_calculateDurations(self);
 
     if (self->currentTime == -1.0) {
         self->currentTime = tm;
-    }    
-    
+    }
+
     for (i=0; i<(self->poly*self->bufsize); i++) {
         self->buffer_streams[i] = self->end_buffer_streams[i] = 0.0;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->tap_buffer_streams[i + self->voiceCount * self->bufsize] = (MYFLT)self->currentTap;
         for (j=0; j<self->poly; j++) {
@@ -2007,11 +2007,11 @@ Beater_generate_i(Beater *self) {
                     Beater_restore(self);
                     Beater_makeTable(self, 0);
                     Beater_makeSequence(self);
-                }    
+                }
                 else if (self->fillEnd == 1 && self->preCall != -1) {
                     Beater_restore(self);
                     Beater_makePresetActive(self, self->preCall);
-                }    
+                }
                 else if (self->fillEnd == 1) {
                     Beater_restore(self);
                 }
@@ -2023,7 +2023,7 @@ Beater_generate_i(Beater *self) {
                     self->newFlag == 1) {
                     Beater_makeTable(self, 0);
                     Beater_makeSequence(self);
-                }    
+                }
             }
         }
         self->currentTime += self->sampleToSec;
@@ -2034,7 +2034,7 @@ static void
 Beater_generate_a(Beater *self) {
     double tm;
     int i, j;
-    
+
     MYFLT *time = Stream_getData((Stream *)self->time_stream);
 
     self->tapDur = time[0];
@@ -2042,12 +2042,12 @@ Beater_generate_a(Beater *self) {
 
     if (self->currentTime == -1.0) {
         self->currentTime = (double)time[0];
-    }    
-    
+    }
+
     for (i=0; i<(self->poly*self->bufsize); i++) {
         self->buffer_streams[i] = self->end_buffer_streams[i] = 0.0;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         tm = (double)time[i];
         self->tap_buffer_streams[i + self->voiceCount * self->bufsize] = (MYFLT)self->currentTap;
@@ -2081,7 +2081,7 @@ Beater_generate_a(Beater *self) {
                 else if (self->fillEnd == 1 && self->preCall != -1) {
                     Beater_restore(self);
                     Beater_makePresetActive(self, self->preCall);
-                }    
+                }
                 else if (self->fillEnd == 1) {
                     Beater_restore(self);
                 }
@@ -2094,7 +2094,7 @@ Beater_generate_a(Beater *self) {
                     self->tapDur = time[i];
                     Beater_makeTable(self, 0);
                     Beater_makeSequence(self);
-                }    
+                }
             }
         }
         self->currentTime += self->sampleToSec;
@@ -2105,41 +2105,41 @@ MYFLT *
 Beater_getSamplesBuffer(Beater *self)
 {
     return (MYFLT *)self->buffer_streams;
-}    
+}
 
 MYFLT *
 Beater_getTapBuffer(Beater *self)
 {
     return (MYFLT *)self->tap_buffer_streams;
-}    
+}
 
 MYFLT *
 Beater_getAmpBuffer(Beater *self)
 {
     return (MYFLT *)self->amp_buffer_streams;
-}    
+}
 
 MYFLT *
 Beater_getDurBuffer(Beater *self)
 {
     return (MYFLT *)self->dur_buffer_streams;
-}    
+}
 
 MYFLT *
 Beater_getEndBuffer(Beater *self)
 {
     return (MYFLT *)self->end_buffer_streams;
-}    
+}
 
 static void
 Beater_setProcMode(Beater *self)
 {
     int procmode = self->modebuffer[0];
     switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = Beater_generate_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Beater_generate_a;
             break;
     }
@@ -2148,23 +2148,23 @@ Beater_setProcMode(Beater *self)
 static void
 Beater_compute_next_data_frame(Beater *self)
 {
-    (*self->proc_func_ptr)(self);    
+    (*self->proc_func_ptr)(self);
 }
 
 static int
 Beater_traverse(Beater *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->time);    
-    Py_VISIT(self->time_stream);    
+    Py_VISIT(self->time);
+    Py_VISIT(self->time_stream);
     return 0;
 }
 
-static int 
+static int
 Beater_clear(Beater *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->time);    
+    Py_CLEAR(self->time);
     Py_CLEAR(self->time_stream);
     return 0;
 }
@@ -2190,20 +2190,20 @@ Beater_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *timetmp=NULL;
     Beater *self;
     self = (Beater *)type->tp_alloc(type, 0);
-    
+
     for (i=0; i<32; i++) {
         for (j=0; j<64; j++) {
             self->preset[i][j] = 0;
         }
     }
-    
+
     self->preCall = -1;
     self->time = PyFloat_FromDouble(0.125);
     self->tapDur = 0.125;
     self->poly = 1;
     self->voiceCount = 0;
 	self->modebuffer[0] = 0;
-    
+
     self->taps = 16;
     self->tapCount = 0;
     self->currentTap = 0;
@@ -2213,31 +2213,31 @@ Beater_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->last_taps = self->last_weight1 = self->last_weight2 = self->last_weight3 = -1;
     self->newFlag = self->fillStart = self->fillEnd = 0;
     self->tapLength = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Beater_compute_next_data_frame);
     self->mode_func_ptr = Beater_setProcMode;
-    
+
     self->sampleToSec = 1. / self->sr;
     self->currentTime = -1.0;
 
     Stream_setStreamActive(self->stream, 0);
 
     static char *kwlist[] = {"time", "taps", "weight1", "weight2", "weight3", "poly", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|Oiiiii", kwlist, &timetmp, &self->taps, &self->weight1, &self->weight2, &self->weight3, &self->poly))
         Py_RETURN_NONE;
-    
+
     if (timetmp) {
         PyObject_CallMethod((PyObject *)self, "setTime", "O", timetmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     Server_generateSeed((Server *)self->server, BEATER_ID);
-    
+
     self->buffer_streams = (MYFLT *)realloc(self->buffer_streams, self->poly * self->bufsize * sizeof(MYFLT));
     self->tap_buffer_streams = (MYFLT *)realloc(self->tap_buffer_streams, self->poly * self->bufsize * sizeof(MYFLT));
     self->amp_buffer_streams = (MYFLT *)realloc(self->amp_buffer_streams, self->poly * self->bufsize * sizeof(MYFLT));
@@ -2247,13 +2247,13 @@ Beater_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         self->buffer_streams[i] = self->tap_buffer_streams[i] = self->amp_buffer_streams[i] = self->dur_buffer_streams[i] = self->end_buffer_streams[i] = 0.0;
     }
     self->amplitudes = (MYFLT *)realloc(self->amplitudes, self->poly * sizeof(MYFLT));
-    for (i=0; i<self->poly; i++) { 
+    for (i=0; i<self->poly; i++) {
         self->amplitudes[i] = 0.0;
     }
-        
+
     Beater_makeTable(self, 0);
     Beater_makeSequence(self);
-    
+
     return (PyObject *)self;
 }
 
@@ -2267,14 +2267,14 @@ static PyObject *
 Beater_setTime(Beater *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->time);
@@ -2293,12 +2293,12 @@ Beater_setTime(Beater *self, PyObject *arg)
         MYFLT *time = Stream_getData((Stream *)self->time_stream);
         self->tapDur = time[0];
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Beater_reset(Beater *self)
@@ -2313,26 +2313,26 @@ Beater_reset(Beater *self)
 
 static PyObject *
 Beater_setTaps(Beater *self, PyObject *arg)
-{    
+{
 	if (PyInt_Check(arg))
         self->taps = PyInt_AS_LONG(arg);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Beater_setWeights(Beater *self, PyObject *args, PyObject *kwds)
-{    
+{
     PyObject *w1=NULL, *w2=NULL, *w3=NULL;
-    
+
     static char *kwlist[] = {"weight1", "weight2", "weight3", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOO", kwlist, &w1, &w2, &w3)) {
         Py_INCREF(Py_None);
         return Py_None;
-    }    
-    
+    }
+
 	if (PyInt_Check(w1))
         self->weight1 = PyInt_AS_LONG(w1);
 
@@ -2344,11 +2344,11 @@ Beater_setWeights(Beater *self, PyObject *args, PyObject *kwds)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Beater_newPattern(Beater *self)
-{    
+{
     self->newFlag = 1;
 	Py_INCREF(Py_None);
 	return Py_None;
@@ -2356,7 +2356,7 @@ Beater_newPattern(Beater *self)
 
 static PyObject *
 Beater_fillPattern(Beater *self)
-{    
+{
     self->fillStart = 1;
 	Py_INCREF(Py_None);
 	return Py_None;
@@ -2366,17 +2366,17 @@ static PyObject *
 Beater_storePreset(Beater *self, PyObject *arg)
 {
     int i, n;
-    
+
     if (PyInt_Check(arg)) {
         n = PyInt_AS_LONG(arg);
         self->preset[n][0] = self->taps;
         for (i=0; i<self->taps; i++) {
             self->preset[n][i+1] = self->sequence[i];
-        }    
+        }
     }
 
 	Py_INCREF(Py_None);
-	return Py_None;    
+	return Py_None;
 }
 
 static PyObject *
@@ -2388,32 +2388,32 @@ Beater_recallPreset(Beater *self, PyObject *arg)
         if (x >= 0 && x < 32)
             self->preCall = x;
     }
-    
+
     if (Stream_getStreamActive(self->stream) == 0)
         Beater_makePresetActive(self, self->preCall);
-    
+
     Py_INCREF(Py_None);
-    return Py_None;    
+    return Py_None;
 
-}        
+}
 
 static PyObject *
 Beater_getPresets(Beater *self) {
     int i, j;
     PyObject *list, *tmp;
-    
+
     list = PyList_New(0);
     for (i=0; i<32; i++) {
         if (self->preset[i][0] != 0) {
             tmp = PyList_New(0);
-            PyList_Append(tmp, PyInt_FromLong(self->preset[i][0])); 
+            PyList_Append(tmp, PyInt_FromLong(self->preset[i][0]));
             for (j=0; j<self->preset[i][0]; j++) {
                 PyList_Append(tmp, PyInt_FromLong(self->preset[i][j+1]));
             }
             PyList_Append(list, tmp);
         }
     }
-    
+
     return list;
 }
 
@@ -2429,14 +2429,14 @@ Beater_setPresets(Beater *self, PyObject *arg) {
             if (PyList_Check(tmp)) {
                 len2 = PyInt_AsLong(PyList_GetItem(tmp, 0));
                 self->preset[i][0] = len2;
-                for (j=0; j<len2; j++) {                    
+                for (j=0; j<len2; j++) {
                     self->preset[i][j+1] = PyInt_AsLong(PyList_GetItem(tmp, j+1));
                 }
             }
         }
-    }    
+    }
     Py_INCREF(Py_None);
-    return Py_None;    
+    return Py_None;
 }
 
 static PyMemberDef Beater_members[] = {
@@ -2512,7 +2512,7 @@ PyTypeObject BeaterType = {
 typedef struct {
     pyo_audio_HEAD
     Beater *mainPlayer;
-    int chnl; 
+    int chnl;
     int modebuffer[2];
 } Beat;
 
@@ -2530,36 +2530,36 @@ static void
 Beat_setProcMode(Beat *self) {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Beat_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Beat_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Beat_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Beat_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Beat_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Beat_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Beat_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Beat_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Beat_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
@@ -2571,7 +2571,7 @@ Beat_compute_next_data_frame(Beat *self)
     tmp = Beater_getSamplesBuffer((Beater *)self->mainPlayer);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2583,11 +2583,11 @@ Beat_traverse(Beat *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Beat_clear(Beat *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainPlayer);    
+    Py_CLEAR(self->mainPlayer);
     return 0;
 }
 
@@ -2606,37 +2606,37 @@ Beat_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL;
     Beat *self;
     self = (Beat *)type->tp_alloc(type, 0);
-    
+
     self->chnl = 0;
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Beat_compute_next_data_frame);
     self->mode_func_ptr = Beat_setProcMode;
 
     static char *kwlist[] = {"mainPlayer", "chnl", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|i", kwlist, &maintmp, &self->chnl))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainPlayer);
     Py_INCREF(maintmp);
     self->mainPlayer = (Beater *)maintmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Beat_getServer(Beat* self) { GET_SERVER };
 static PyObject * Beat_getStream(Beat* self) { GET_STREAM };
-static PyObject * Beat_setMul(Beat *self, PyObject *arg) { SET_MUL };	
-static PyObject * Beat_setAdd(Beat *self, PyObject *arg) { SET_ADD };	
-static PyObject * Beat_setSub(Beat *self, PyObject *arg) { SET_SUB };	
-static PyObject * Beat_setDiv(Beat *self, PyObject *arg) { SET_DIV };	
+static PyObject * Beat_setMul(Beat *self, PyObject *arg) { SET_MUL };
+static PyObject * Beat_setAdd(Beat *self, PyObject *arg) { SET_ADD };
+static PyObject * Beat_setSub(Beat *self, PyObject *arg) { SET_SUB };
+static PyObject * Beat_setDiv(Beat *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Beat_play(Beat *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Beat_out(Beat *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2762,7 +2762,7 @@ PyTypeObject BeatType = {
 typedef struct {
     pyo_audio_HEAD
     Beater *mainPlayer;
-    int chnl; 
+    int chnl;
     int modebuffer[2];
 } BeatTapStream;
 
@@ -2780,36 +2780,36 @@ static void
 BeatTapStream_setProcMode(BeatTapStream *self) {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = BeatTapStream_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = BeatTapStream_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = BeatTapStream_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = BeatTapStream_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = BeatTapStream_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = BeatTapStream_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = BeatTapStream_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = BeatTapStream_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = BeatTapStream_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
@@ -2821,7 +2821,7 @@ BeatTapStream_compute_next_data_frame(BeatTapStream *self)
     tmp = Beater_getTapBuffer((Beater *)self->mainPlayer);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2833,11 +2833,11 @@ BeatTapStream_traverse(BeatTapStream *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 BeatTapStream_clear(BeatTapStream *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainPlayer);    
+    Py_CLEAR(self->mainPlayer);
     return 0;
 }
 
@@ -2856,37 +2856,37 @@ BeatTapStream_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL;
     BeatTapStream *self;
     self = (BeatTapStream *)type->tp_alloc(type, 0);
-    
+
     self->chnl = 0;
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, BeatTapStream_compute_next_data_frame);
     self->mode_func_ptr = BeatTapStream_setProcMode;
 
     static char *kwlist[] = {"mainPlayer", "chnl", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|i", kwlist, &maintmp, &self->chnl))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainPlayer);
     Py_INCREF(maintmp);
     self->mainPlayer = (Beater *)maintmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * BeatTapStream_getServer(BeatTapStream* self) { GET_SERVER };
 static PyObject * BeatTapStream_getStream(BeatTapStream* self) { GET_STREAM };
-static PyObject * BeatTapStream_setMul(BeatTapStream *self, PyObject *arg) { SET_MUL };	
-static PyObject * BeatTapStream_setAdd(BeatTapStream *self, PyObject *arg) { SET_ADD };	
-static PyObject * BeatTapStream_setSub(BeatTapStream *self, PyObject *arg) { SET_SUB };	
-static PyObject * BeatTapStream_setDiv(BeatTapStream *self, PyObject *arg) { SET_DIV };	
+static PyObject * BeatTapStream_setMul(BeatTapStream *self, PyObject *arg) { SET_MUL };
+static PyObject * BeatTapStream_setAdd(BeatTapStream *self, PyObject *arg) { SET_ADD };
+static PyObject * BeatTapStream_setSub(BeatTapStream *self, PyObject *arg) { SET_SUB };
+static PyObject * BeatTapStream_setDiv(BeatTapStream *self, PyObject *arg) { SET_DIV };
 
 static PyObject * BeatTapStream_play(BeatTapStream *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * BeatTapStream_out(BeatTapStream *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2918,7 +2918,7 @@ static PyMethodDef BeatTapStream_methods[] = {
     {"setMul", (PyCFunction)BeatTapStream_setMul, METH_O, "Sets oscillator mul factor."},
     {"setAdd", (PyCFunction)BeatTapStream_setAdd, METH_O, "Sets oscillator add factor."},
     {"setSub", (PyCFunction)BeatTapStream_setSub, METH_O, "Sets inverse add factor."},
-    {"setDiv", (PyCFunction)BeatTapStream_setDiv, METH_O, "Sets inverse mul factor."},    
+    {"setDiv", (PyCFunction)BeatTapStream_setDiv, METH_O, "Sets inverse mul factor."},
     {NULL}  /* Sentinel */
 };
 
@@ -3012,7 +3012,7 @@ PyTypeObject BeatTapStreamType = {
 typedef struct {
     pyo_audio_HEAD
     Beater *mainPlayer;
-    int chnl; 
+    int chnl;
     int modebuffer[2];
 } BeatAmpStream;
 
@@ -3030,36 +3030,36 @@ static void
 BeatAmpStream_setProcMode(BeatAmpStream *self) {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = BeatAmpStream_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = BeatAmpStream_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = BeatAmpStream_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = BeatAmpStream_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = BeatAmpStream_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = BeatAmpStream_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = BeatAmpStream_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = BeatAmpStream_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = BeatAmpStream_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
@@ -3071,7 +3071,7 @@ BeatAmpStream_compute_next_data_frame(BeatAmpStream *self)
     tmp = Beater_getAmpBuffer((Beater *)self->mainPlayer);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3083,11 +3083,11 @@ BeatAmpStream_traverse(BeatAmpStream *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 BeatAmpStream_clear(BeatAmpStream *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainPlayer);    
+    Py_CLEAR(self->mainPlayer);
     return 0;
 }
 
@@ -3106,37 +3106,37 @@ BeatAmpStream_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL;
     BeatAmpStream *self;
     self = (BeatAmpStream *)type->tp_alloc(type, 0);
-    
+
     self->chnl = 0;
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, BeatAmpStream_compute_next_data_frame);
     self->mode_func_ptr = BeatAmpStream_setProcMode;
 
     static char *kwlist[] = {"mainPlayer", "chnl", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|i", kwlist, &maintmp, &self->chnl))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainPlayer);
     Py_INCREF(maintmp);
     self->mainPlayer = (Beater *)maintmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * BeatAmpStream_getServer(BeatAmpStream* self) { GET_SERVER };
 static PyObject * BeatAmpStream_getStream(BeatAmpStream* self) { GET_STREAM };
-static PyObject * BeatAmpStream_setMul(BeatAmpStream *self, PyObject *arg) { SET_MUL };	
-static PyObject * BeatAmpStream_setAdd(BeatAmpStream *self, PyObject *arg) { SET_ADD };	
-static PyObject * BeatAmpStream_setSub(BeatAmpStream *self, PyObject *arg) { SET_SUB };	
-static PyObject * BeatAmpStream_setDiv(BeatAmpStream *self, PyObject *arg) { SET_DIV };	
+static PyObject * BeatAmpStream_setMul(BeatAmpStream *self, PyObject *arg) { SET_MUL };
+static PyObject * BeatAmpStream_setAdd(BeatAmpStream *self, PyObject *arg) { SET_ADD };
+static PyObject * BeatAmpStream_setSub(BeatAmpStream *self, PyObject *arg) { SET_SUB };
+static PyObject * BeatAmpStream_setDiv(BeatAmpStream *self, PyObject *arg) { SET_DIV };
 
 static PyObject * BeatAmpStream_play(BeatAmpStream *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * BeatAmpStream_out(BeatAmpStream *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3168,7 +3168,7 @@ static PyMethodDef BeatAmpStream_methods[] = {
     {"setMul", (PyCFunction)BeatAmpStream_setMul, METH_O, "Sets oscillator mul factor."},
     {"setAdd", (PyCFunction)BeatAmpStream_setAdd, METH_O, "Sets oscillator add factor."},
     {"setSub", (PyCFunction)BeatAmpStream_setSub, METH_O, "Sets inverse add factor."},
-    {"setDiv", (PyCFunction)BeatAmpStream_setDiv, METH_O, "Sets inverse mul factor."},    
+    {"setDiv", (PyCFunction)BeatAmpStream_setDiv, METH_O, "Sets inverse mul factor."},
     {NULL}  /* Sentinel */
 };
 
@@ -3262,7 +3262,7 @@ PyTypeObject BeatAmpStreamType = {
 typedef struct {
     pyo_audio_HEAD
     Beater *mainPlayer;
-    int chnl; 
+    int chnl;
     int modebuffer[2];
 } BeatDurStream;
 
@@ -3280,36 +3280,36 @@ static void
 BeatDurStream_setProcMode(BeatDurStream *self) {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = BeatDurStream_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = BeatDurStream_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = BeatDurStream_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = BeatDurStream_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = BeatDurStream_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = BeatDurStream_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = BeatDurStream_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = BeatDurStream_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = BeatDurStream_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
@@ -3321,7 +3321,7 @@ BeatDurStream_compute_next_data_frame(BeatDurStream *self)
     tmp = Beater_getDurBuffer((Beater *)self->mainPlayer);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3333,11 +3333,11 @@ BeatDurStream_traverse(BeatDurStream *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 BeatDurStream_clear(BeatDurStream *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainPlayer);    
+    Py_CLEAR(self->mainPlayer);
     return 0;
 }
 
@@ -3356,37 +3356,37 @@ BeatDurStream_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL;
     BeatDurStream *self;
     self = (BeatDurStream *)type->tp_alloc(type, 0);
-    
+
     self->chnl = 0;
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, BeatDurStream_compute_next_data_frame);
     self->mode_func_ptr = BeatDurStream_setProcMode;
 
     static char *kwlist[] = {"mainPlayer", "chnl", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|i", kwlist, &maintmp, &self->chnl))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainPlayer);
     Py_INCREF(maintmp);
     self->mainPlayer = (Beater *)maintmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * BeatDurStream_getServer(BeatDurStream* self) { GET_SERVER };
 static PyObject * BeatDurStream_getStream(BeatDurStream* self) { GET_STREAM };
-static PyObject * BeatDurStream_setMul(BeatDurStream *self, PyObject *arg) { SET_MUL };	
-static PyObject * BeatDurStream_setAdd(BeatDurStream *self, PyObject *arg) { SET_ADD };	
-static PyObject * BeatDurStream_setSub(BeatDurStream *self, PyObject *arg) { SET_SUB };	
-static PyObject * BeatDurStream_setDiv(BeatDurStream *self, PyObject *arg) { SET_DIV };	
+static PyObject * BeatDurStream_setMul(BeatDurStream *self, PyObject *arg) { SET_MUL };
+static PyObject * BeatDurStream_setAdd(BeatDurStream *self, PyObject *arg) { SET_ADD };
+static PyObject * BeatDurStream_setSub(BeatDurStream *self, PyObject *arg) { SET_SUB };
+static PyObject * BeatDurStream_setDiv(BeatDurStream *self, PyObject *arg) { SET_DIV };
 
 static PyObject * BeatDurStream_play(BeatDurStream *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * BeatDurStream_out(BeatDurStream *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3512,7 +3512,7 @@ PyTypeObject BeatDurStreamType = {
 typedef struct {
     pyo_audio_HEAD
     Beater *mainPlayer;
-    int chnl; 
+    int chnl;
     int modebuffer[2];
 } BeatEndStream;
 
@@ -3530,36 +3530,36 @@ static void
 BeatEndStream_setProcMode(BeatEndStream *self) {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = BeatEndStream_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = BeatEndStream_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = BeatEndStream_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = BeatEndStream_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = BeatEndStream_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = BeatEndStream_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = BeatEndStream_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = BeatEndStream_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = BeatEndStream_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
@@ -3571,7 +3571,7 @@ BeatEndStream_compute_next_data_frame(BeatEndStream *self)
     tmp = Beater_getEndBuffer((Beater *)self->mainPlayer);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3583,11 +3583,11 @@ BeatEndStream_traverse(BeatEndStream *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 BeatEndStream_clear(BeatEndStream *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainPlayer);    
+    Py_CLEAR(self->mainPlayer);
     return 0;
 }
 
@@ -3606,37 +3606,37 @@ BeatEndStream_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL;
     BeatEndStream *self;
     self = (BeatEndStream *)type->tp_alloc(type, 0);
-    
+
     self->chnl = 0;
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, BeatEndStream_compute_next_data_frame);
     self->mode_func_ptr = BeatEndStream_setProcMode;
 
     static char *kwlist[] = {"mainPlayer", "chnl", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|i", kwlist, &maintmp, &self->chnl))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainPlayer);
     Py_INCREF(maintmp);
     self->mainPlayer = (Beater *)maintmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * BeatEndStream_getServer(BeatEndStream* self) { GET_SERVER };
 static PyObject * BeatEndStream_getStream(BeatEndStream* self) { GET_STREAM };
-static PyObject * BeatEndStream_setMul(BeatEndStream *self, PyObject *arg) { SET_MUL };	
-static PyObject * BeatEndStream_setAdd(BeatEndStream *self, PyObject *arg) { SET_ADD };	
-static PyObject * BeatEndStream_setSub(BeatEndStream *self, PyObject *arg) { SET_SUB };	
-static PyObject * BeatEndStream_setDiv(BeatEndStream *self, PyObject *arg) { SET_DIV };	
+static PyObject * BeatEndStream_setMul(BeatEndStream *self, PyObject *arg) { SET_MUL };
+static PyObject * BeatEndStream_setAdd(BeatEndStream *self, PyObject *arg) { SET_ADD };
+static PyObject * BeatEndStream_setSub(BeatEndStream *self, PyObject *arg) { SET_SUB };
+static PyObject * BeatEndStream_setDiv(BeatEndStream *self, PyObject *arg) { SET_DIV };
 
 static PyObject * BeatEndStream_play(BeatEndStream *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * BeatEndStream_out(BeatEndStream *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3668,7 +3668,7 @@ static PyMethodDef BeatEndStream_methods[] = {
     {"setMul", (PyCFunction)BeatEndStream_setMul, METH_O, "Sets oscillator mul factor."},
     {"setAdd", (PyCFunction)BeatEndStream_setAdd, METH_O, "Sets oscillator add factor."},
     {"setSub", (PyCFunction)BeatEndStream_setSub, METH_O, "Sets inverse add factor."},
-    {"setDiv", (PyCFunction)BeatEndStream_setDiv, METH_O, "Sets inverse mul factor."},    
+    {"setDiv", (PyCFunction)BeatEndStream_setDiv, METH_O, "Sets inverse mul factor."},
     {NULL}  /* Sentinel */
 };
 
@@ -3792,13 +3792,13 @@ typedef struct {
 static void
 TrigBurster_generate_i(TrigBurster *self) {
     int i, j;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<(self->poly*self->bufsize); i++) {
         self->buffer_streams[i] = self->end_buffer_streams[i] = 0.0;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1.0) {
             self->flag = 1;
@@ -3839,31 +3839,31 @@ MYFLT *
 TrigBurster_getSamplesBuffer(TrigBurster *self)
 {
     return (MYFLT *)self->buffer_streams;
-}    
+}
 
 MYFLT *
 TrigBurster_getTapBuffer(TrigBurster *self)
 {
     return (MYFLT *)self->tap_buffer_streams;
-}    
+}
 
 MYFLT *
 TrigBurster_getAmpBuffer(TrigBurster *self)
 {
     return (MYFLT *)self->amp_buffer_streams;
-}    
+}
 
 MYFLT *
 TrigBurster_getDurBuffer(TrigBurster *self)
 {
     return (MYFLT *)self->dur_buffer_streams;
-}    
+}
 
 MYFLT *
 TrigBurster_getEndBuffer(TrigBurster *self)
 {
     return (MYFLT *)self->end_buffer_streams;
-}    
+}
 
 static void
 TrigBurster_setProcMode(TrigBurster *self)
@@ -3874,7 +3874,7 @@ TrigBurster_setProcMode(TrigBurster *self)
 static void
 TrigBurster_compute_next_data_frame(TrigBurster *self)
 {
-    (*self->proc_func_ptr)(self);    
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -3886,7 +3886,7 @@ TrigBurster_traverse(TrigBurster *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 TrigBurster_clear(TrigBurster *self)
 {
     pyo_CLEAR
@@ -3918,8 +3918,8 @@ TrigBurster_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp;
     TrigBurster *self;
     self = (TrigBurster *)type->tp_alloc(type, 0);
-    
-    
+
+
     self->poly = 1;
     self->voiceCount = 0;
     self->time = self->a_time = 0.25;
@@ -3930,24 +3930,24 @@ TrigBurster_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->targetTime = 0.0;
     self->currentTime = -1.0;
     self->flag = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TrigBurster_compute_next_data_frame);
     self->mode_func_ptr = TrigBurster_setProcMode;
-    
+
     self->sampleToSec = 1. / self->sr;
 
     Stream_setStreamActive(self->stream, 1);
 
     static char *kwlist[] = {"input", "time", "count", "expand", "ampfade", "poly", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_FIFFI, kwlist, &inputtmp, &self->time, &self->count, &self->expand, &self->ampfade, &self->poly))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     self->buffer_streams = (MYFLT *)realloc(self->buffer_streams, self->poly * self->bufsize * sizeof(MYFLT));
@@ -3978,51 +3978,51 @@ static PyObject * TrigBurster_stop(TrigBurster *self) { STOP };
 
 static PyObject *
 TrigBurster_setTime(TrigBurster *self, PyObject *arg)
-{    
+{
 	if (PyNumber_Check(arg))
         self->time = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
-        if (self->time <= 0.01) 
+        if (self->time <= 0.01)
             self->time = 0.01;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TrigBurster_setCount(TrigBurster *self, PyObject *arg)
-{    
+{
 	if (PyInt_Check(arg))
         self->count = PyInt_AS_LONG(arg);
-        if (self->count < 1) 
+        if (self->count < 1)
             self->count = 1;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TrigBurster_setExpand(TrigBurster *self, PyObject *arg)
-{    
+{
 	if (PyNumber_Check(arg))
         self->expand = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
-        if (self->expand <= 0.1) 
+        if (self->expand <= 0.1)
             self->expand = 0.1;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TrigBurster_setAmpfade(TrigBurster *self, PyObject *arg)
-{    
+{
 	if (PyNumber_Check(arg))
         self->ampfade = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
-        if (self->ampfade <= 0.1) 
+        if (self->ampfade <= 0.1)
             self->ampfade = 0.1;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef TrigBurster_members[] = {
     {"server", T_OBJECT_EX, offsetof(TrigBurster, server), 0, "Pyo server."},
@@ -4091,7 +4091,7 @@ PyTypeObject TrigBursterType = {
 typedef struct {
     pyo_audio_HEAD
     TrigBurster *mainPlayer;
-    int chnl; 
+    int chnl;
     int modebuffer[2];
 } TrigBurst;
 
@@ -4109,36 +4109,36 @@ static void
 TrigBurst_setProcMode(TrigBurst *self) {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TrigBurst_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TrigBurst_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TrigBurst_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TrigBurst_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TrigBurst_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TrigBurst_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TrigBurst_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TrigBurst_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TrigBurst_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
@@ -4150,7 +4150,7 @@ TrigBurst_compute_next_data_frame(TrigBurst *self)
     tmp = TrigBurster_getSamplesBuffer((TrigBurster *)self->mainPlayer);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -4162,11 +4162,11 @@ TrigBurst_traverse(TrigBurst *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 TrigBurst_clear(TrigBurst *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainPlayer);    
+    Py_CLEAR(self->mainPlayer);
     return 0;
 }
 
@@ -4185,37 +4185,37 @@ TrigBurst_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL;
     TrigBurst *self;
     self = (TrigBurst *)type->tp_alloc(type, 0);
-    
+
     self->chnl = 0;
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TrigBurst_compute_next_data_frame);
     self->mode_func_ptr = TrigBurst_setProcMode;
 
     static char *kwlist[] = {"mainPlayer", "chnl", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|i", kwlist, &maintmp, &self->chnl))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainPlayer);
     Py_INCREF(maintmp);
     self->mainPlayer = (TrigBurster *)maintmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * TrigBurst_getServer(TrigBurst* self) { GET_SERVER };
 static PyObject * TrigBurst_getStream(TrigBurst* self) { GET_STREAM };
-static PyObject * TrigBurst_setMul(TrigBurst *self, PyObject *arg) { SET_MUL };	
-static PyObject * TrigBurst_setAdd(TrigBurst *self, PyObject *arg) { SET_ADD };	
-static PyObject * TrigBurst_setSub(TrigBurst *self, PyObject *arg) { SET_SUB };	
-static PyObject * TrigBurst_setDiv(TrigBurst *self, PyObject *arg) { SET_DIV };	
+static PyObject * TrigBurst_setMul(TrigBurst *self, PyObject *arg) { SET_MUL };
+static PyObject * TrigBurst_setAdd(TrigBurst *self, PyObject *arg) { SET_ADD };
+static PyObject * TrigBurst_setSub(TrigBurst *self, PyObject *arg) { SET_SUB };
+static PyObject * TrigBurst_setDiv(TrigBurst *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TrigBurst_play(TrigBurst *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TrigBurst_out(TrigBurst *self, PyObject *args, PyObject *kwds) { OUT };
@@ -4341,7 +4341,7 @@ PyTypeObject TrigBurstType = {
 typedef struct {
     pyo_audio_HEAD
     TrigBurster *mainPlayer;
-    int chnl; 
+    int chnl;
     int modebuffer[2];
 } TrigBurstTapStream;
 
@@ -4359,36 +4359,36 @@ static void
 TrigBurstTapStream_setProcMode(TrigBurstTapStream *self) {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TrigBurstTapStream_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TrigBurstTapStream_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TrigBurstTapStream_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TrigBurstTapStream_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TrigBurstTapStream_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TrigBurstTapStream_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TrigBurstTapStream_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TrigBurstTapStream_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TrigBurstTapStream_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
@@ -4400,7 +4400,7 @@ TrigBurstTapStream_compute_next_data_frame(TrigBurstTapStream *self)
     tmp = TrigBurster_getTapBuffer((TrigBurster *)self->mainPlayer);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -4412,11 +4412,11 @@ TrigBurstTapStream_traverse(TrigBurstTapStream *self, visitproc visit, void *arg
     return 0;
 }
 
-static int 
+static int
 TrigBurstTapStream_clear(TrigBurstTapStream *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainPlayer);    
+    Py_CLEAR(self->mainPlayer);
     return 0;
 }
 
@@ -4435,37 +4435,37 @@ TrigBurstTapStream_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL;
     TrigBurstTapStream *self;
     self = (TrigBurstTapStream *)type->tp_alloc(type, 0);
-    
+
     self->chnl = 0;
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TrigBurstTapStream_compute_next_data_frame);
     self->mode_func_ptr = TrigBurstTapStream_setProcMode;
 
     static char *kwlist[] = {"mainPlayer", "chnl", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|i", kwlist, &maintmp, &self->chnl))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainPlayer);
     Py_INCREF(maintmp);
     self->mainPlayer = (TrigBurster *)maintmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * TrigBurstTapStream_getServer(TrigBurstTapStream* self) { GET_SERVER };
 static PyObject * TrigBurstTapStream_getStream(TrigBurstTapStream* self) { GET_STREAM };
-static PyObject * TrigBurstTapStream_setMul(TrigBurstTapStream *self, PyObject *arg) { SET_MUL };	
-static PyObject * TrigBurstTapStream_setAdd(TrigBurstTapStream *self, PyObject *arg) { SET_ADD };	
-static PyObject * TrigBurstTapStream_setSub(TrigBurstTapStream *self, PyObject *arg) { SET_SUB };	
-static PyObject * TrigBurstTapStream_setDiv(TrigBurstTapStream *self, PyObject *arg) { SET_DIV };	
+static PyObject * TrigBurstTapStream_setMul(TrigBurstTapStream *self, PyObject *arg) { SET_MUL };
+static PyObject * TrigBurstTapStream_setAdd(TrigBurstTapStream *self, PyObject *arg) { SET_ADD };
+static PyObject * TrigBurstTapStream_setSub(TrigBurstTapStream *self, PyObject *arg) { SET_SUB };
+static PyObject * TrigBurstTapStream_setDiv(TrigBurstTapStream *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TrigBurstTapStream_play(TrigBurstTapStream *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TrigBurstTapStream_out(TrigBurstTapStream *self, PyObject *args, PyObject *kwds) { OUT };
@@ -4497,7 +4497,7 @@ static PyMethodDef TrigBurstTapStream_methods[] = {
     {"setMul", (PyCFunction)TrigBurstTapStream_setMul, METH_O, "Sets oscillator mul factor."},
     {"setAdd", (PyCFunction)TrigBurstTapStream_setAdd, METH_O, "Sets oscillator add factor."},
     {"setSub", (PyCFunction)TrigBurstTapStream_setSub, METH_O, "Sets inverse add factor."},
-    {"setDiv", (PyCFunction)TrigBurstTapStream_setDiv, METH_O, "Sets inverse mul factor."},    
+    {"setDiv", (PyCFunction)TrigBurstTapStream_setDiv, METH_O, "Sets inverse mul factor."},
     {NULL}  /* Sentinel */
 };
 
@@ -4591,7 +4591,7 @@ PyTypeObject TrigBurstTapStreamType = {
 typedef struct {
     pyo_audio_HEAD
     TrigBurster *mainPlayer;
-    int chnl; 
+    int chnl;
     int modebuffer[2];
 } TrigBurstAmpStream;
 
@@ -4609,36 +4609,36 @@ static void
 TrigBurstAmpStream_setProcMode(TrigBurstAmpStream *self) {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TrigBurstAmpStream_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TrigBurstAmpStream_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TrigBurstAmpStream_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TrigBurstAmpStream_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TrigBurstAmpStream_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TrigBurstAmpStream_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TrigBurstAmpStream_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TrigBurstAmpStream_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TrigBurstAmpStream_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
@@ -4650,7 +4650,7 @@ TrigBurstAmpStream_compute_next_data_frame(TrigBurstAmpStream *self)
     tmp = TrigBurster_getAmpBuffer((TrigBurster *)self->mainPlayer);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -4662,11 +4662,11 @@ TrigBurstAmpStream_traverse(TrigBurstAmpStream *self, visitproc visit, void *arg
     return 0;
 }
 
-static int 
+static int
 TrigBurstAmpStream_clear(TrigBurstAmpStream *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainPlayer);    
+    Py_CLEAR(self->mainPlayer);
     return 0;
 }
 
@@ -4685,37 +4685,37 @@ TrigBurstAmpStream_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL;
     TrigBurstAmpStream *self;
     self = (TrigBurstAmpStream *)type->tp_alloc(type, 0);
-    
+
     self->chnl = 0;
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TrigBurstAmpStream_compute_next_data_frame);
     self->mode_func_ptr = TrigBurstAmpStream_setProcMode;
 
     static char *kwlist[] = {"mainPlayer", "chnl", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|i", kwlist, &maintmp, &self->chnl))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainPlayer);
     Py_INCREF(maintmp);
     self->mainPlayer = (TrigBurster *)maintmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * TrigBurstAmpStream_getServer(TrigBurstAmpStream* self) { GET_SERVER };
 static PyObject * TrigBurstAmpStream_getStream(TrigBurstAmpStream* self) { GET_STREAM };
-static PyObject * TrigBurstAmpStream_setMul(TrigBurstAmpStream *self, PyObject *arg) { SET_MUL };	
-static PyObject * TrigBurstAmpStream_setAdd(TrigBurstAmpStream *self, PyObject *arg) { SET_ADD };	
-static PyObject * TrigBurstAmpStream_setSub(TrigBurstAmpStream *self, PyObject *arg) { SET_SUB };	
-static PyObject * TrigBurstAmpStream_setDiv(TrigBurstAmpStream *self, PyObject *arg) { SET_DIV };	
+static PyObject * TrigBurstAmpStream_setMul(TrigBurstAmpStream *self, PyObject *arg) { SET_MUL };
+static PyObject * TrigBurstAmpStream_setAdd(TrigBurstAmpStream *self, PyObject *arg) { SET_ADD };
+static PyObject * TrigBurstAmpStream_setSub(TrigBurstAmpStream *self, PyObject *arg) { SET_SUB };
+static PyObject * TrigBurstAmpStream_setDiv(TrigBurstAmpStream *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TrigBurstAmpStream_play(TrigBurstAmpStream *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TrigBurstAmpStream_out(TrigBurstAmpStream *self, PyObject *args, PyObject *kwds) { OUT };
@@ -4747,7 +4747,7 @@ static PyMethodDef TrigBurstAmpStream_methods[] = {
     {"setMul", (PyCFunction)TrigBurstAmpStream_setMul, METH_O, "Sets oscillator mul factor."},
     {"setAdd", (PyCFunction)TrigBurstAmpStream_setAdd, METH_O, "Sets oscillator add factor."},
     {"setSub", (PyCFunction)TrigBurstAmpStream_setSub, METH_O, "Sets inverse add factor."},
-    {"setDiv", (PyCFunction)TrigBurstAmpStream_setDiv, METH_O, "Sets inverse mul factor."},    
+    {"setDiv", (PyCFunction)TrigBurstAmpStream_setDiv, METH_O, "Sets inverse mul factor."},
     {NULL}  /* Sentinel */
 };
 
@@ -4841,7 +4841,7 @@ PyTypeObject TrigBurstAmpStreamType = {
 typedef struct {
     pyo_audio_HEAD
     TrigBurster *mainPlayer;
-    int chnl; 
+    int chnl;
     int modebuffer[2];
 } TrigBurstDurStream;
 
@@ -4859,36 +4859,36 @@ static void
 TrigBurstDurStream_setProcMode(TrigBurstDurStream *self) {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TrigBurstDurStream_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TrigBurstDurStream_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TrigBurstDurStream_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TrigBurstDurStream_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TrigBurstDurStream_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TrigBurstDurStream_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TrigBurstDurStream_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TrigBurstDurStream_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TrigBurstDurStream_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
@@ -4900,7 +4900,7 @@ TrigBurstDurStream_compute_next_data_frame(TrigBurstDurStream *self)
     tmp = TrigBurster_getDurBuffer((TrigBurster *)self->mainPlayer);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -4912,11 +4912,11 @@ TrigBurstDurStream_traverse(TrigBurstDurStream *self, visitproc visit, void *arg
     return 0;
 }
 
-static int 
+static int
 TrigBurstDurStream_clear(TrigBurstDurStream *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainPlayer);    
+    Py_CLEAR(self->mainPlayer);
     return 0;
 }
 
@@ -4935,37 +4935,37 @@ TrigBurstDurStream_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL;
     TrigBurstDurStream *self;
     self = (TrigBurstDurStream *)type->tp_alloc(type, 0);
-    
+
     self->chnl = 0;
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TrigBurstDurStream_compute_next_data_frame);
     self->mode_func_ptr = TrigBurstDurStream_setProcMode;
 
     static char *kwlist[] = {"mainPlayer", "chnl", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|i", kwlist, &maintmp, &self->chnl))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainPlayer);
     Py_INCREF(maintmp);
     self->mainPlayer = (TrigBurster *)maintmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * TrigBurstDurStream_getServer(TrigBurstDurStream* self) { GET_SERVER };
 static PyObject * TrigBurstDurStream_getStream(TrigBurstDurStream* self) { GET_STREAM };
-static PyObject * TrigBurstDurStream_setMul(TrigBurstDurStream *self, PyObject *arg) { SET_MUL };	
-static PyObject * TrigBurstDurStream_setAdd(TrigBurstDurStream *self, PyObject *arg) { SET_ADD };	
-static PyObject * TrigBurstDurStream_setSub(TrigBurstDurStream *self, PyObject *arg) { SET_SUB };	
-static PyObject * TrigBurstDurStream_setDiv(TrigBurstDurStream *self, PyObject *arg) { SET_DIV };	
+static PyObject * TrigBurstDurStream_setMul(TrigBurstDurStream *self, PyObject *arg) { SET_MUL };
+static PyObject * TrigBurstDurStream_setAdd(TrigBurstDurStream *self, PyObject *arg) { SET_ADD };
+static PyObject * TrigBurstDurStream_setSub(TrigBurstDurStream *self, PyObject *arg) { SET_SUB };
+static PyObject * TrigBurstDurStream_setDiv(TrigBurstDurStream *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TrigBurstDurStream_play(TrigBurstDurStream *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TrigBurstDurStream_out(TrigBurstDurStream *self, PyObject *args, PyObject *kwds) { OUT };
@@ -5091,7 +5091,7 @@ PyTypeObject TrigBurstDurStreamType = {
 typedef struct {
     pyo_audio_HEAD
     TrigBurster *mainPlayer;
-    int chnl; 
+    int chnl;
     int modebuffer[2];
 } TrigBurstEndStream;
 
@@ -5109,36 +5109,36 @@ static void
 TrigBurstEndStream_setProcMode(TrigBurstEndStream *self) {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TrigBurstEndStream_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TrigBurstEndStream_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TrigBurstEndStream_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TrigBurstEndStream_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TrigBurstEndStream_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TrigBurstEndStream_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TrigBurstEndStream_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TrigBurstEndStream_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TrigBurstEndStream_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
@@ -5150,7 +5150,7 @@ TrigBurstEndStream_compute_next_data_frame(TrigBurstEndStream *self)
     tmp = TrigBurster_getEndBuffer((TrigBurster *)self->mainPlayer);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -5162,11 +5162,11 @@ TrigBurstEndStream_traverse(TrigBurstEndStream *self, visitproc visit, void *arg
     return 0;
 }
 
-static int 
+static int
 TrigBurstEndStream_clear(TrigBurstEndStream *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainPlayer);    
+    Py_CLEAR(self->mainPlayer);
     return 0;
 }
 
@@ -5185,37 +5185,37 @@ TrigBurstEndStream_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL;
     TrigBurstEndStream *self;
     self = (TrigBurstEndStream *)type->tp_alloc(type, 0);
-    
+
     self->chnl = 0;
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TrigBurstEndStream_compute_next_data_frame);
     self->mode_func_ptr = TrigBurstEndStream_setProcMode;
 
     static char *kwlist[] = {"mainPlayer", "chnl", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|i", kwlist, &maintmp, &self->chnl))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainPlayer);
     Py_INCREF(maintmp);
     self->mainPlayer = (TrigBurster *)maintmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * TrigBurstEndStream_getServer(TrigBurstEndStream* self) { GET_SERVER };
 static PyObject * TrigBurstEndStream_getStream(TrigBurstEndStream* self) { GET_STREAM };
-static PyObject * TrigBurstEndStream_setMul(TrigBurstEndStream *self, PyObject *arg) { SET_MUL };	
-static PyObject * TrigBurstEndStream_setAdd(TrigBurstEndStream *self, PyObject *arg) { SET_ADD };	
-static PyObject * TrigBurstEndStream_setSub(TrigBurstEndStream *self, PyObject *arg) { SET_SUB };	
-static PyObject * TrigBurstEndStream_setDiv(TrigBurstEndStream *self, PyObject *arg) { SET_DIV };	
+static PyObject * TrigBurstEndStream_setMul(TrigBurstEndStream *self, PyObject *arg) { SET_MUL };
+static PyObject * TrigBurstEndStream_setAdd(TrigBurstEndStream *self, PyObject *arg) { SET_ADD };
+static PyObject * TrigBurstEndStream_setSub(TrigBurstEndStream *self, PyObject *arg) { SET_SUB };
+static PyObject * TrigBurstEndStream_setDiv(TrigBurstEndStream *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TrigBurstEndStream_play(TrigBurstEndStream *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TrigBurstEndStream_out(TrigBurstEndStream *self, PyObject *args, PyObject *kwds) { OUT };
@@ -5247,7 +5247,7 @@ static PyMethodDef TrigBurstEndStream_methods[] = {
     {"setMul", (PyCFunction)TrigBurstEndStream_setMul, METH_O, "Sets oscillator mul factor."},
     {"setAdd", (PyCFunction)TrigBurstEndStream_setAdd, METH_O, "Sets oscillator add factor."},
     {"setSub", (PyCFunction)TrigBurstEndStream_setSub, METH_O, "Sets inverse add factor."},
-    {"setDiv", (PyCFunction)TrigBurstEndStream_setDiv, METH_O, "Sets inverse mul factor."},    
+    {"setDiv", (PyCFunction)TrigBurstEndStream_setDiv, METH_O, "Sets inverse mul factor."},
     {NULL}  /* Sentinel */
 };
 
@@ -5333,4 +5333,4 @@ PyTypeObject TrigBurstEndStreamType = {
     0,      /* tp_init */
     0,                         /* tp_alloc */
     TrigBurstEndStream_new,                 /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/midimodule.c b/src/objects/midimodule.c
index f9be648..3f20b29 100644
--- a/src/objects/midimodule.c
+++ b/src/objects/midimodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -39,7 +39,7 @@ CtlScan_setProcMode(CtlScan *self) {}
 
 static void
 CtlScan_compute_next_data_frame(CtlScan *self)
-{   
+{
     PmEvent *buffer;
     int i, count;
 
@@ -61,7 +61,7 @@ CtlScan_compute_next_data_frame(CtlScan *self)
                     PyObject_Call((PyObject *)self->callable, tup, NULL);
                 }
                 if (self->toprint == 1)
-                    printf("ctl number : %i, ctl value : %i, midi channel : %i\n", self->ctlnumber, value, status - 0xB0 + 1);    
+                    printf("ctl number : %i, ctl value : %i, midi channel : %i\n", self->ctlnumber, value, status - 0xB0 + 1);
             }
         }
     }
@@ -75,7 +75,7 @@ CtlScan_traverse(CtlScan *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 CtlScan_clear(CtlScan *self)
 {
     pyo_CLEAR
@@ -95,7 +95,7 @@ static PyObject *
 CtlScan_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     int i;
-    PyObject *calltmp=NULL;    
+    PyObject *calltmp=NULL;
     CtlScan *self;
     self = (CtlScan *)type->tp_alloc(type, 0);
 
@@ -116,7 +116,7 @@ CtlScan_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     }
 
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     return (PyObject *)self;
 }
 
@@ -126,9 +126,9 @@ static PyObject * CtlScan_getStream(CtlScan* self) { GET_STREAM };
 static PyObject * CtlScan_play(CtlScan *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * CtlScan_stop(CtlScan *self) { STOP };
 
-static PyObject * 
-CtlScan_reset(CtlScan *self) 
-{ 
+static PyObject *
+CtlScan_reset(CtlScan *self)
+{
     self->ctlnumber = -1;
 	Py_INCREF(Py_None);
 	return Py_None;
@@ -138,18 +138,18 @@ static PyObject *
 CtlScan_setFunction(CtlScan *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (! PyCallable_Check(arg)) {
         PyErr_SetString(PyExc_TypeError, "The callable attribute must be a valid Python function.");
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     tmp = arg;
     Py_XDECREF(self->callable);
     Py_INCREF(tmp);
     self->callable = tmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -157,11 +157,11 @@ CtlScan_setFunction(CtlScan *self, PyObject *arg)
 static PyObject *
 CtlScan_setToprint(CtlScan *self, PyObject *arg)
 {
-	
+
 	if (PyInt_Check(arg)) {
 	    self->toprint = PyInt_AsLong(arg);
     }
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -237,20 +237,20 @@ CtlScan2_setProcMode(CtlScan2 *self) {}
 
 static void
 CtlScan2_compute_next_data_frame(CtlScan2 *self)
-{   
+{
     PmEvent *buffer;
     int i, count, midichnl;
-    
+
     buffer = Server_getMidiEventBuffer((Server *)self->server);
     count = Server_getMidiEventCount((Server *)self->server);
-    
+
     if (count > 0) {
         PyObject *tup;
         for (i=count-1; i>=0; i--) {
             int status = Pm_MessageStatus(buffer[i].message);	// Temp note event holders
             int number = Pm_MessageData1(buffer[i].message);
             int value = Pm_MessageData2(buffer[i].message);
-            
+
             if ((status & 0xF0) == 0xB0) {
                 midichnl = status - 0xB0 + 1;
                 if (number != self->ctlnumber || midichnl != self->midichnl) {
@@ -262,7 +262,7 @@ CtlScan2_compute_next_data_frame(CtlScan2 *self)
                     PyObject_Call((PyObject *)self->callable, tup, NULL);
                 }
                 if (self->toprint == 1)
-                    printf("ctl number : %i, ctl value : %i, midi channel : %i\n", self->ctlnumber, value, midichnl);    
+                    printf("ctl number : %i, ctl value : %i, midi channel : %i\n", self->ctlnumber, value, midichnl);
             }
         }
     }
@@ -276,7 +276,7 @@ CtlScan2_traverse(CtlScan2 *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 CtlScan2_clear(CtlScan2 *self)
 {
     pyo_CLEAR
@@ -296,28 +296,28 @@ static PyObject *
 CtlScan2_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     int i;
-    PyObject *calltmp=NULL;    
+    PyObject *calltmp=NULL;
     CtlScan2 *self;
     self = (CtlScan2 *)type->tp_alloc(type, 0);
-    
+
     self->ctlnumber = self->midichnl = -1;
     self->toprint = 1;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, CtlScan2_compute_next_data_frame);
     self->mode_func_ptr = CtlScan2_setProcMode;
-    
+
     static char *kwlist[] = {"callable", "toprint", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|i", kwlist, &calltmp, &self->toprint))
         Py_RETURN_NONE;
-    
+
     if (calltmp) {
         PyObject_CallMethod((PyObject *)self, "setFunction", "O", calltmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     return (PyObject *)self;
 }
 
@@ -327,9 +327,9 @@ static PyObject * CtlScan2_getStream(CtlScan2* self) { GET_STREAM };
 static PyObject * CtlScan2_play(CtlScan2 *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * CtlScan2_stop(CtlScan2 *self) { STOP };
 
-static PyObject * 
-CtlScan2_reset(CtlScan2 *self) 
-{ 
+static PyObject *
+CtlScan2_reset(CtlScan2 *self)
+{
     self->ctlnumber = self->midichnl = -1;
 	Py_INCREF(Py_None);
 	return Py_None;
@@ -339,18 +339,18 @@ static PyObject *
 CtlScan2_setFunction(CtlScan2 *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (! PyCallable_Check(arg)) {
         PyErr_SetString(PyExc_TypeError, "The callable attribute must be a valid Python function.");
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     tmp = arg;
     Py_XDECREF(self->callable);
     Py_INCREF(tmp);
     self->callable = tmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -358,11 +358,11 @@ CtlScan2_setFunction(CtlScan2 *self, PyObject *arg)
 static PyObject *
 CtlScan2_setToprint(CtlScan2 *self, PyObject *arg)
 {
-	
+
 	if (PyInt_Check(arg)) {
 	    self->toprint = PyInt_AsLong(arg);
     }
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -456,31 +456,31 @@ Midictl_setProcMode(Midictl *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Midictl_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Midictl_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Midictl_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Midictl_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Midictl_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Midictl_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Midictl_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Midictl_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Midictl_postprocessing_revareva;
             break;
     }
@@ -494,7 +494,7 @@ void translateMidi(Midictl *self, PmEvent *buffer, int count)
         int status = Pm_MessageStatus(buffer[i].message);	// Temp note event holders
         int number = Pm_MessageData1(buffer[i].message);
         int value = Pm_MessageData2(buffer[i].message);
-        
+
         if (self->channel == 0) {
             if ((status & 0xF0) == 0xB0)
                 ok = 1;
@@ -513,12 +513,12 @@ void translateMidi(Midictl *self, PmEvent *buffer, int count)
             self->value = (value / 127.) * (self->maxscale - self->minscale) + self->minscale;
             break;
         }
-    }    
+    }
 }
 
 static void
 Midictl_compute_next_data_frame(Midictl *self)
-{   
+{
     PmEvent *tmp;
     int i, count;
     MYFLT step;
@@ -528,7 +528,7 @@ Midictl_compute_next_data_frame(Midictl *self)
 
     if (count > 0)
         translateMidi((Midictl *)self, tmp, count);
-    
+
     if (self->interp == 0) {
         for (i=0; i<self->bufsize; i++) {
             self->data[i] = self->value;
@@ -538,7 +538,7 @@ Midictl_compute_next_data_frame(Midictl *self)
         step = (self->value - self->oldValue) / self->bufsize;
         for (i=0; i<self->bufsize; i++) {
             self->data[i] = self->oldValue + step;
-        }          
+        }
     }
     (*self->muladd_func_ptr)(self);
 }
@@ -550,7 +550,7 @@ Midictl_traverse(Midictl *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Midictl_clear(Midictl *self)
 {
     pyo_CLEAR
@@ -568,7 +568,7 @@ Midictl_dealloc(Midictl* self)
 static PyObject *
 Midictl_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
-    int i;    
+    int i;
     PyObject *multmp=NULL, *addtmp=NULL;
     Midictl *self;
     self = (Midictl *)type->tp_alloc(type, 0);
@@ -590,7 +590,7 @@ Midictl_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_I_FFFIOO, kwlist, &self->ctlnumber, &self->minscale, &self->maxscale, &self->oldValue, &self->channel, &multmp, &addtmp))
         Py_RETURN_NONE;
- 
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
@@ -598,22 +598,22 @@ Midictl_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-            
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     self->value = self->oldValue;
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Midictl_getServer(Midictl* self) { GET_SERVER };
 static PyObject * Midictl_getStream(Midictl* self) { GET_STREAM };
-static PyObject * Midictl_setMul(Midictl *self, PyObject *arg) { SET_MUL };	
-static PyObject * Midictl_setAdd(Midictl *self, PyObject *arg) { SET_ADD };	
-static PyObject * Midictl_setSub(Midictl *self, PyObject *arg) { SET_SUB };	
-static PyObject * Midictl_setDiv(Midictl *self, PyObject *arg) { SET_DIV };	
+static PyObject * Midictl_setMul(Midictl *self, PyObject *arg) { SET_MUL };
+static PyObject * Midictl_setAdd(Midictl *self, PyObject *arg) { SET_ADD };
+static PyObject * Midictl_setSub(Midictl *self, PyObject *arg) { SET_SUB };
+static PyObject * Midictl_setDiv(Midictl *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Midictl_play(Midictl *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Midictl_stop(Midictl *self) { STOP };
@@ -631,14 +631,14 @@ static PyObject *
 Midictl_setInterpolation(Midictl *self, PyObject *arg)
 {
     int tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isNum = PyInt_Check(arg);
-    
+
 	if (isNum == 1) {
 		tmp = PyInt_AsLong(arg);
         if (tmp == 0)
@@ -646,7 +646,7 @@ Midictl_setInterpolation(Midictl *self, PyObject *arg)
         else
             self->interp = 1;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -655,19 +655,19 @@ static PyObject *
 Midictl_setValue(Midictl *self, PyObject *arg)
 {
     int tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isNum = PyNumber_Check(arg);
-    
+
 	if (isNum == 1) {
 		tmp = PyFloat_AsDouble(PyNumber_Float(arg));
         self->oldValue = self->value = tmp;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -676,56 +676,56 @@ static PyObject *
 Midictl_setMinScale(Midictl *self, PyObject *arg)
 {
     int tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isNum = PyNumber_Check(arg);
-    
+
 	if (isNum == 1) {
 		tmp = PyFloat_AsDouble(PyNumber_Float(arg));
         self->minscale = tmp;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Midictl_setMaxScale(Midictl *self, PyObject *arg)
 {
     int tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isNum = PyNumber_Check(arg);
-    
+
 	if (isNum == 1) {
 		tmp = PyFloat_AsDouble(PyNumber_Float(arg));
         self->maxscale = tmp;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Midictl_setCtlNumber(Midictl *self, PyObject *arg)
 {
     int tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		tmp = PyInt_AsLong(arg);
         if (tmp >= 0 && tmp < 128)
@@ -734,29 +734,29 @@ Midictl_setCtlNumber(Midictl *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Midictl_setChannel(Midictl *self, PyObject *arg)
 {
     int tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		tmp = PyInt_AsLong(arg);
         if (tmp >= 0 && tmp < 128)
             self->channel = tmp;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Midictl_members[] = {
     {"server", T_OBJECT_EX, offsetof(Midictl, server), 0, "Pyo server."},
@@ -894,33 +894,33 @@ Bendin_setProcMode(Bendin *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Bendin_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Bendin_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Bendin_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Bendin_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Bendin_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Bendin_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Bendin_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Bendin_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Bendin_postprocessing_revareva;
             break;
     }
@@ -935,7 +935,7 @@ void Bendin_translateMidi(Bendin *self, PmEvent *buffer, int count)
         int status = Pm_MessageStatus(buffer[i].message);	// Temp note event holders
         int number = Pm_MessageData1(buffer[i].message);
         int value = Pm_MessageData2(buffer[i].message);
-        
+
         if (self->channel == 0) {
             if ((status & 0xF0) == 0xe0)
                 ok = 1;
@@ -948,7 +948,7 @@ void Bendin_translateMidi(Bendin *self, PmEvent *buffer, int count)
             else
                 ok = 0;
         }
-        
+
         if (ok == 1) {
             self->oldValue = self->value;
             val = (number + (value << 7) - 8192) / 8192.0 * self->range;
@@ -958,26 +958,26 @@ void Bendin_translateMidi(Bendin *self, PmEvent *buffer, int count)
                 self->value = MYPOW(1.0594630943593, val);
             break;
         }
-    }    
+    }
 }
 
 static void
 Bendin_compute_next_data_frame(Bendin *self)
-{   
+{
     PmEvent *tmp;
     int i, count;
-    
+
     tmp = Server_getMidiEventBuffer((Server *)self->server);
     count = Server_getMidiEventCount((Server *)self->server);
-    
+
     if (count > 0)
         Bendin_translateMidi((Bendin *)self, tmp, count);
     MYFLT step = (self->value - self->oldValue) / self->bufsize;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = self->oldValue + step;
-    }  
-    
+    }
+
     (*self->muladd_func_ptr)(self);
 }
 
@@ -988,7 +988,7 @@ Bendin_traverse(Bendin *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Bendin_clear(Bendin *self)
 {
     pyo_CLEAR
@@ -1007,10 +1007,10 @@ static PyObject *
 Bendin_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     int i;
-    PyObject *multmp=NULL, *addtmp=NULL;    
+    PyObject *multmp=NULL, *addtmp=NULL;
     Bendin *self;
     self = (Bendin *)type->tp_alloc(type, 0);
-    
+
     self->channel = 0;
     self->scale = 0;
     self->value = 0.;
@@ -1018,42 +1018,42 @@ Bendin_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->range = 2.;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Bendin_compute_next_data_frame);
     self->mode_func_ptr = Bendin_setProcMode;
 
     static char *kwlist[] = {"brange", "scale", "channel", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE__FIIOO, kwlist, &self->range, &self->scale, &self->channel, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     if (self->scale == 0)
         self->oldValue = self->value = 0.;
     else
         self->oldValue = self->value = 1.;
-        
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Bendin_getServer(Bendin* self) { GET_SERVER };
 static PyObject * Bendin_getStream(Bendin* self) { GET_STREAM };
-static PyObject * Bendin_setMul(Bendin *self, PyObject *arg) { SET_MUL };	
-static PyObject * Bendin_setAdd(Bendin *self, PyObject *arg) { SET_ADD };	
-static PyObject * Bendin_setSub(Bendin *self, PyObject *arg) { SET_SUB };	
-static PyObject * Bendin_setDiv(Bendin *self, PyObject *arg) { SET_DIV };	
+static PyObject * Bendin_setMul(Bendin *self, PyObject *arg) { SET_MUL };
+static PyObject * Bendin_setAdd(Bendin *self, PyObject *arg) { SET_ADD };
+static PyObject * Bendin_setSub(Bendin *self, PyObject *arg) { SET_SUB };
+static PyObject * Bendin_setDiv(Bendin *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Bendin_play(Bendin *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Bendin_stop(Bendin *self) { STOP };
@@ -1071,58 +1071,58 @@ static PyObject *
 Bendin_setBrange(Bendin *self, PyObject *arg)
 {
     MYFLT tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isNum = PyNumber_Check(arg);
-    
+
 	if (isNum == 1) {
 		tmp = PyFloat_AsDouble(PyNumber_Float(arg));
         if (tmp >= 0.0 && tmp < 128.0)
             self->range = tmp;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Bendin_setChannel(Bendin *self, PyObject *arg)
 {
     int tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		tmp = PyInt_AsLong(arg);
         if (tmp >= 0 && tmp < 128)
             self->channel = tmp;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Bendin_setScale(Bendin *self, PyObject *arg)
 {
     int tmp;
-    
+
     if (arg == NULL) {
         Py_INCREF(Py_None);
         return Py_None;
     }
-    
+
     int isInt = PyInt_Check(arg);
-    
+
     if (isInt == 1) {
         tmp = PyInt_AsLong(arg);
         if (tmp == 0)
@@ -1130,10 +1130,10 @@ Bendin_setScale(Bendin *self, PyObject *arg)
         else if (tmp == 1)
             self->scale = 1;
     }
-    
+
     Py_INCREF(Py_None);
     return Py_None;
-}	
+}
 
 
 static PyMemberDef Bendin_members[] = {
@@ -1269,33 +1269,33 @@ Touchin_setProcMode(Touchin *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Touchin_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Touchin_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Touchin_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Touchin_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Touchin_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Touchin_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Touchin_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Touchin_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Touchin_postprocessing_revareva;
             break;
     }
@@ -1322,32 +1322,32 @@ void Touchin_translateMidi(Touchin *self, PmEvent *buffer, int count)
             else
                 ok = 0;
         }
-        
+
         if (ok == 1) {
             self->oldValue = self->value;
             self->value = (number / 127.) * (self->maxscale - self->minscale) + self->minscale;
             break;
         }
-    }    
+    }
 }
 
 static void
 Touchin_compute_next_data_frame(Touchin *self)
-{   
+{
     PmEvent *tmp;
     int i, count;
-    
+
     tmp = Server_getMidiEventBuffer((Server *)self->server);
     count = Server_getMidiEventCount((Server *)self->server);
-    
+
     if (count > 0)
         Touchin_translateMidi((Touchin *)self, tmp, count);
     MYFLT step = (self->value - self->oldValue) / self->bufsize;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = self->oldValue + step;
-    }  
-    
+    }
+
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1358,7 +1358,7 @@ Touchin_traverse(Touchin *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Touchin_clear(Touchin *self)
 {
     pyo_CLEAR
@@ -1377,10 +1377,10 @@ static PyObject *
 Touchin_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     int i;
-    PyObject *multmp=NULL, *addtmp=NULL;    
+    PyObject *multmp=NULL, *addtmp=NULL;
     Touchin *self;
     self = (Touchin *)type->tp_alloc(type, 0);
-    
+
     self->channel = 0;
     self->value = 0.;
     self->oldValue = 0.;
@@ -1388,39 +1388,39 @@ Touchin_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->maxscale = 1.;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Touchin_compute_next_data_frame);
     self->mode_func_ptr = Touchin_setProcMode;
 
     static char *kwlist[] = {"minscale", "maxscale", "init", "channel", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE__FFFIOO, kwlist, &self->minscale, &self->maxscale, &self->oldValue, &self->channel, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->value = self->oldValue;
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Touchin_getServer(Touchin* self) { GET_SERVER };
 static PyObject * Touchin_getStream(Touchin* self) { GET_STREAM };
-static PyObject * Touchin_setMul(Touchin *self, PyObject *arg) { SET_MUL };	
-static PyObject * Touchin_setAdd(Touchin *self, PyObject *arg) { SET_ADD };	
-static PyObject * Touchin_setSub(Touchin *self, PyObject *arg) { SET_SUB };	
-static PyObject * Touchin_setDiv(Touchin *self, PyObject *arg) { SET_DIV };	
+static PyObject * Touchin_setMul(Touchin *self, PyObject *arg) { SET_MUL };
+static PyObject * Touchin_setAdd(Touchin *self, PyObject *arg) { SET_ADD };
+static PyObject * Touchin_setSub(Touchin *self, PyObject *arg) { SET_SUB };
+static PyObject * Touchin_setDiv(Touchin *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Touchin_play(Touchin *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Touchin_stop(Touchin *self) { STOP };
@@ -1438,65 +1438,65 @@ static PyObject *
 Touchin_setMinScale(Touchin *self, PyObject *arg)
 {
     int tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isNum = PyNumber_Check(arg);
-    
+
 	if (isNum == 1) {
 		tmp = PyFloat_AsDouble(PyNumber_Float(arg));
             self->minscale = tmp;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Touchin_setMaxScale(Touchin *self, PyObject *arg)
 {
     int tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isNum = PyNumber_Check(arg);
-    
+
 	if (isNum == 1) {
 		tmp = PyFloat_AsDouble(PyNumber_Float(arg));
         self->maxscale = tmp;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Touchin_setChannel(Touchin *self, PyObject *arg)
 {
     int tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		tmp = PyInt_AsLong(arg);
         if (tmp >= 0 && tmp < 128)
             self->channel = tmp;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Touchin_members[] = {
     {"server", T_OBJECT_EX, offsetof(Touchin, server), 0, "Pyo server."},
@@ -1627,33 +1627,33 @@ Programin_setProcMode(Programin *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Programin_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Programin_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Programin_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Programin_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Programin_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Programin_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Programin_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Programin_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Programin_postprocessing_revareva;
             break;
     }
@@ -1663,11 +1663,11 @@ Programin_setProcMode(Programin *self)
 void Programin_translateMidi(Programin *self, PmEvent *buffer, int count)
 {
     int i, ok;
-    
+
     for (i=count-1; i>=0; i--) {
         int status = Pm_MessageStatus(buffer[i].message);	// Temp note event holders
         int number = Pm_MessageData1(buffer[i].message);
-        
+
         if (self->channel == 0) {
             if ((status & 0xF0) == 0xc0)
                 ok = 1;
@@ -1680,30 +1680,30 @@ void Programin_translateMidi(Programin *self, PmEvent *buffer, int count)
             else
                 ok = 0;
         }
-        
+
         if (ok == 1) {
             self->value = (MYFLT)number;
             break;
         }
-    }    
+    }
 }
 
 static void
 Programin_compute_next_data_frame(Programin *self)
-{   
+{
     PmEvent *tmp;
     int i, count;
-    
+
     tmp = Server_getMidiEventBuffer((Server *)self->server);
     count = Server_getMidiEventCount((Server *)self->server);
-    
+
     if (count > 0)
         Programin_translateMidi((Programin *)self, tmp, count);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = self->value;
-    }  
-    
+    }
+
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1714,7 +1714,7 @@ Programin_traverse(Programin *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Programin_clear(Programin *self)
 {
     pyo_CLEAR
@@ -1733,45 +1733,45 @@ static PyObject *
 Programin_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     int i;
-    PyObject *multmp=NULL, *addtmp=NULL;    
+    PyObject *multmp=NULL, *addtmp=NULL;
     Programin *self;
     self = (Programin *)type->tp_alloc(type, 0);
-    
+
     self->channel = 0;
     self->value = 0.;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Programin_compute_next_data_frame);
     self->mode_func_ptr = Programin_setProcMode;
 
     static char *kwlist[] = {"channel", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "iOO", kwlist, &self->channel, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Programin_getServer(Programin* self) { GET_SERVER };
 static PyObject * Programin_getStream(Programin* self) { GET_STREAM };
-static PyObject * Programin_setMul(Programin *self, PyObject *arg) { SET_MUL };	
-static PyObject * Programin_setAdd(Programin *self, PyObject *arg) { SET_ADD };	
-static PyObject * Programin_setSub(Programin *self, PyObject *arg) { SET_SUB };	
-static PyObject * Programin_setDiv(Programin *self, PyObject *arg) { SET_DIV };	
+static PyObject * Programin_setMul(Programin *self, PyObject *arg) { SET_MUL };
+static PyObject * Programin_setAdd(Programin *self, PyObject *arg) { SET_ADD };
+static PyObject * Programin_setSub(Programin *self, PyObject *arg) { SET_SUB };
+static PyObject * Programin_setDiv(Programin *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Programin_play(Programin *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Programin_stop(Programin *self) { STOP };
@@ -1789,23 +1789,23 @@ static PyObject *
 Programin_setChannel(Programin *self, PyObject *arg)
 {
     int tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		tmp = PyInt_AsLong(arg);
         if (tmp >= 0 && tmp < 128)
             self->channel = tmp;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Programin_members[] = {
     {"server", T_OBJECT_EX, offsetof(Programin, server), 0, "Pyo server."},
@@ -1937,7 +1937,7 @@ pitchIsIn(int *buf, int pitch, int len) {
         if (buf[i*2] == pitch) {
             isIn = 1;
             break;
-        }    
+        }
     }
     return isIn;
 }
@@ -1950,7 +1950,7 @@ int firstEmpty(int *buf, int len) {
         if (buf[i*2+1] == 0) {
             voice = i;
             break;
-        }    
+        }
     }
     return voice;
 }
@@ -1964,8 +1964,8 @@ int nextEmptyVoice(int *buf, int voice, int len) {
             next = tmp;
             break;
         }
-    }    
-    return next;    
+    }
+    return next;
 }
 
 int whichVoice(int *buf, int pitch, int len) {
@@ -1984,7 +1984,7 @@ int whichVoice(int *buf, int pitch, int len) {
 void grabMidiNotes(MidiNote *self, PmEvent *buffer, int count)
 {
     int i, ok, voice, kind;
-    
+
     for (i=0; i<count; i++) {
         int status = Pm_MessageStatus(buffer[i].message);	// Temp note event holders
         int pitch = Pm_MessageData1(buffer[i].message);
@@ -2002,7 +2002,7 @@ void grabMidiNotes(MidiNote *self, PmEvent *buffer, int count)
             else
                 ok = 0;
         }
-        
+
         if (ok == 1) {
             if ((status & 0xF0) == 0x80)
                 kind = 0;
@@ -2028,7 +2028,7 @@ void grabMidiNotes(MidiNote *self, PmEvent *buffer, int count)
                     self->notebuf[self->vcount*2+1] = velocity;
                     self->trigger_streams[self->bufsize*(self->vcount*2)] = 1.0;
                 }
-            }    
+            }
             else if (pitchIsIn(self->notebuf, pitch, self->voices) == 1 && kind == 0 && pitch >= self->first && pitch <= self->last) {
                 //printf("%i, %i, %i\n", status, pitch, velocity);
                 voice = whichVoice(self->notebuf, pitch, self->voices);
@@ -2037,23 +2037,23 @@ void grabMidiNotes(MidiNote *self, PmEvent *buffer, int count)
                 self->trigger_streams[self->bufsize*(voice*2+1)] = 1.0;
             }
         }
-    }    
-}    
+    }
+}
 
 static void
 MidiNote_compute_next_data_frame(MidiNote *self)
-{   
+{
     PmEvent *tmp;
     int i, count;
 
     for (i=0; i<self->bufsize*self->voices*2; i++) {
         self->trigger_streams[i] = 0.0;
     }
-    
+
     tmp = Server_getMidiEventBuffer((Server *)self->server);
     count = Server_getMidiEventCount((Server *)self->server);
     if (count > 0)
-        grabMidiNotes((MidiNote *)self, tmp, count);  
+        grabMidiNotes((MidiNote *)self, tmp, count);
 }
 
 static int
@@ -2063,7 +2063,7 @@ MidiNote_traverse(MidiNote *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 MidiNote_clear(MidiNote *self)
 {
     pyo_CLEAR
@@ -2090,7 +2090,7 @@ static PyObject *
 MidiNote_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     int i;
-    
+
     MidiNote *self;
     self = (MidiNote *)type->tp_alloc(type, 0);
 
@@ -2101,13 +2101,13 @@ MidiNote_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->last = 127;
     self->channel = 0;
     self->stealing = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, MidiNote_compute_next_data_frame);
     self->mode_func_ptr = MidiNote_setProcMode;
 
     static char *kwlist[] = {"voices", "scale", "first", "last", "channel", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|iiiii", kwlist, &self->voices, &self->scale, &self->first, &self->last, &self->channel))
         Py_RETURN_NONE;
 
@@ -2126,9 +2126,9 @@ MidiNote_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     }
 
     self->centralkey = (self->first + self->last) / 2;
-    
+
     (*self->mode_func_ptr)(self);
-     
+
     return (PyObject *)self;
 }
 
@@ -2161,62 +2161,62 @@ static PyObject *
 MidiNote_setChannel(MidiNote *self, PyObject *arg)
 {
     int tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		tmp = PyInt_AsLong(arg);
         if (tmp >= 0 && tmp < 128)
             self->channel = tmp;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 MidiNote_setCentralKey(MidiNote *self, PyObject *arg)
 {
     int tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1) {
 		tmp = PyInt_AsLong(arg);
         if (tmp >= self->first && tmp <= self->last)
             self->centralkey = tmp;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 MidiNote_setStealing(MidiNote *self, PyObject *arg)
-{	
+{
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-	
+
 	int isInt = PyInt_Check(arg);
-    
+
 	if (isInt == 1)
 		self->stealing = PyInt_AsLong(arg);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef MidiNote_members[] = {
 {"server", T_OBJECT_EX, offsetof(MidiNote, server), 0, "Pyo server."},
@@ -2302,33 +2302,33 @@ Notein_setProcMode(Notein *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Notein_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Notein_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Notein_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Notein_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Notein_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Notein_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Notein_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Notein_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Notein_postprocessing_revareva;
             break;
     }
@@ -2339,18 +2339,18 @@ Notein_compute_next_data_frame(Notein *self)
 {
     int i;
     MYFLT tmp = MidiNote_getValue(self->handler, self->voice, self->mode);
-    
+
     if (self->mode == 0 && tmp != -1) {
         for (i=0; i<self->bufsize; i++) {
             self->data[i] = tmp;
-        }    
-    } 
+        }
+    }
     else if (self->mode == 1) {
         for (i=0; i<self->bufsize; i++) {
             self->data[i] = tmp;
-        }         
+        }
         (*self->muladd_func_ptr)(self);
-    }    
+    }
 }
 
 static int
@@ -2361,11 +2361,11 @@ Notein_traverse(Notein *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Notein_clear(Notein *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->handler);    
+    Py_CLEAR(self->handler);
     return 0;
 }
 
@@ -2384,46 +2384,46 @@ Notein_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *handlertmp=NULL, *multmp=NULL, *addtmp=NULL;
     Notein *self;
     self = (Notein *)type->tp_alloc(type, 0);
-    
+
     self->voice = 0;
     self->mode = 0;
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Notein_compute_next_data_frame);
     self->mode_func_ptr = Notein_setProcMode;
 
     static char *kwlist[] = {"handler", "voice", "mode", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iiOO", kwlist, &handlertmp, &self->voice, &self->mode, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->handler);
     Py_INCREF(handlertmp);
     self->handler = (MidiNote *)handlertmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Notein_getServer(Notein* self) { GET_SERVER };
 static PyObject * Notein_getStream(Notein* self) { GET_STREAM };
-static PyObject * Notein_setMul(Notein *self, PyObject *arg) { SET_MUL };	
-static PyObject * Notein_setAdd(Notein *self, PyObject *arg) { SET_ADD };	
-static PyObject * Notein_setSub(Notein *self, PyObject *arg) { SET_SUB };	
-static PyObject * Notein_setDiv(Notein *self, PyObject *arg) { SET_DIV };	
+static PyObject * Notein_setMul(Notein *self, PyObject *arg) { SET_MUL };
+static PyObject * Notein_setAdd(Notein *self, PyObject *arg) { SET_ADD };
+static PyObject * Notein_setSub(Notein *self, PyObject *arg) { SET_SUB };
+static PyObject * Notein_setDiv(Notein *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Notein_play(Notein *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Notein_stop(Notein *self) { STOP };
@@ -2565,33 +2565,33 @@ NoteinTrig_setProcMode(NoteinTrig *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = NoteinTrig_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = NoteinTrig_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = NoteinTrig_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = NoteinTrig_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = NoteinTrig_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = NoteinTrig_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = NoteinTrig_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = NoteinTrig_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = NoteinTrig_postprocessing_revareva;
             break;
     }
@@ -2602,10 +2602,10 @@ NoteinTrig_compute_next_data_frame(NoteinTrig *self)
 {
     int i;
     MYFLT *tmp = MidiNote_get_trigger_buffer(self->handler);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[self->bufsize*(self->voice*2+self->mode)+i];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2617,11 +2617,11 @@ NoteinTrig_traverse(NoteinTrig *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 NoteinTrig_clear(NoteinTrig *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->handler);    
+    Py_CLEAR(self->handler);
     return 0;
 }
 
@@ -2640,46 +2640,46 @@ NoteinTrig_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *handlertmp=NULL, *multmp=NULL, *addtmp=NULL;
     NoteinTrig *self;
     self = (NoteinTrig *)type->tp_alloc(type, 0);
-    
+
     self->voice = 0;
     self->mode = 0;
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, NoteinTrig_compute_next_data_frame);
     self->mode_func_ptr = NoteinTrig_setProcMode;
 
     static char *kwlist[] = {"handler", "voice", "mode", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iiOO", kwlist, &handlertmp, &self->voice, &self->mode, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->handler);
     Py_INCREF(handlertmp);
     self->handler = (MidiNote *)handlertmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * NoteinTrig_getServer(NoteinTrig* self) { GET_SERVER };
 static PyObject * NoteinTrig_getStream(NoteinTrig* self) { GET_STREAM };
-static PyObject * NoteinTrig_setMul(NoteinTrig *self, PyObject *arg) { SET_MUL };	
-static PyObject * NoteinTrig_setAdd(NoteinTrig *self, PyObject *arg) { SET_ADD };	
-static PyObject * NoteinTrig_setSub(NoteinTrig *self, PyObject *arg) { SET_SUB };	
-static PyObject * NoteinTrig_setDiv(NoteinTrig *self, PyObject *arg) { SET_DIV };	
+static PyObject * NoteinTrig_setMul(NoteinTrig *self, PyObject *arg) { SET_MUL };
+static PyObject * NoteinTrig_setAdd(NoteinTrig *self, PyObject *arg) { SET_ADD };
+static PyObject * NoteinTrig_setSub(NoteinTrig *self, PyObject *arg) { SET_SUB };
+static PyObject * NoteinTrig_setDiv(NoteinTrig *self, PyObject *arg) { SET_DIV };
 
 static PyObject * NoteinTrig_play(NoteinTrig *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * NoteinTrig_stop(NoteinTrig *self) { STOP };
@@ -2837,7 +2837,7 @@ MidiAdsr_generates(MidiAdsr *self) {
             self->sustainAmp = self->initAmp * self->sustain;
             self->currentTime = 0.0;
             self->invAttack = 1.0 / self->attack;
-            self->invDecay = 1.0 / self->decay; 
+            self->invDecay = 1.0 / self->decay;
             self->attackPlusDecay = self->attack + self->decay;
             self->initAmpMinusOffsetAmp = self->initAmp - self->offsetAmp;
             self->initAmpMinusSustainAmp = self->initAmp - self->sustainAmp;
@@ -2847,7 +2847,7 @@ MidiAdsr_generates(MidiAdsr *self) {
             self->currentTime = 0.0;
             self->invRelease = 1.0 / self->release;
         }
-        
+
         if (self->fademode == 1) {
             if (self->currentTime <= self->attack)
                 val = self->currentTime * self->invAttack * self->initAmpMinusOffsetAmp + self->offsetAmp;
@@ -2856,15 +2856,15 @@ MidiAdsr_generates(MidiAdsr *self) {
             else
                 val = self->sustainAmp;
             self->topValue = val;
-        }    
-        else {  
+        }
+        else {
             if (self->currentTime <= self->release)
                 val = self->topValue * (1. - self->currentTime * self->invRelease);
-            else 
+            else
                 val = 0.;
-        }    
+        }
         self->data[i] = val;
-        self->currentTime += self->sampleToSec;    
+        self->currentTime += self->sampleToSec;
     }
 }
 
@@ -2883,44 +2883,44 @@ MidiAdsr_setProcMode(MidiAdsr *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = MidiAdsr_generates;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = MidiAdsr_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = MidiAdsr_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = MidiAdsr_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = MidiAdsr_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = MidiAdsr_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = MidiAdsr_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = MidiAdsr_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = MidiAdsr_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = MidiAdsr_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 MidiAdsr_compute_next_data_frame(MidiAdsr *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2933,7 +2933,7 @@ MidiAdsr_traverse(MidiAdsr *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 MidiAdsr_clear(MidiAdsr *self)
 {
     pyo_CLEAR
@@ -2957,7 +2957,7 @@ MidiAdsr_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     MidiAdsr *self;
     self = (MidiAdsr *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
     self->topValue = 0.0;
@@ -2968,7 +2968,7 @@ MidiAdsr_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->sustain = 0.707;
     self->release = 0.1;
     self->currentTime = 0.0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, MidiAdsr_compute_next_data_frame);
     self->mode_func_ptr = MidiAdsr_setProcMode;
@@ -2976,22 +2976,22 @@ MidiAdsr_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->sampleToSec = 1. / self->sr;
 
     static char *kwlist[] = {"input", "attack", "decay", "sustain", "release", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_FFFFOO, kwlist, &inputtmp, &self->attack, &self->decay, &self->sustain, &self->release, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     if (self->attack < 0.000001)
         self->attack = 0.000001;
     if (self->decay < 0.000001)
@@ -3010,10 +3010,10 @@ MidiAdsr_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * MidiAdsr_getServer(MidiAdsr* self) { GET_SERVER };
 static PyObject * MidiAdsr_getStream(MidiAdsr* self) { GET_STREAM };
-static PyObject * MidiAdsr_setMul(MidiAdsr *self, PyObject *arg) { SET_MUL };	
-static PyObject * MidiAdsr_setAdd(MidiAdsr *self, PyObject *arg) { SET_ADD };	
-static PyObject * MidiAdsr_setSub(MidiAdsr *self, PyObject *arg) { SET_SUB };	
-static PyObject * MidiAdsr_setDiv(MidiAdsr *self, PyObject *arg) { SET_DIV };	
+static PyObject * MidiAdsr_setMul(MidiAdsr *self, PyObject *arg) { SET_MUL };
+static PyObject * MidiAdsr_setAdd(MidiAdsr *self, PyObject *arg) { SET_ADD };
+static PyObject * MidiAdsr_setSub(MidiAdsr *self, PyObject *arg) { SET_SUB };
+static PyObject * MidiAdsr_setDiv(MidiAdsr *self, PyObject *arg) { SET_DIV };
 
 static PyObject * MidiAdsr_play(MidiAdsr *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * MidiAdsr_stop(MidiAdsr *self) { STOP }
@@ -3045,7 +3045,7 @@ MidiAdsr_setDecay(MidiAdsr *self, PyObject *arg)
     self->decay = PyFloat_AsDouble(PyNumber_Float(arg));
     if (self->decay < 0.000001)
         self->decay = 0.000001;
-    self->invDecay = 1.0 / self->decay; 
+    self->invDecay = 1.0 / self->decay;
     self->attackPlusDecay = self->attack + self->decay;
     Py_INCREF(Py_None);
     return Py_None;
@@ -3214,9 +3214,9 @@ static void
 MidiDelAdsr_generates(MidiDelAdsr *self) {
     MYFLT val;
     int i;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (self->fademode == 0 && in[i] > 0.0) {
             self->fademode = 1;
@@ -3225,7 +3225,7 @@ MidiDelAdsr_generates(MidiDelAdsr *self) {
             self->sustainAmp = self->initAmp * self->sustain;
             self->currentTime = 0.0;
             self->invAttack = 1.0 / self->attack;
-            self->invDecay = 1.0 / self->decay; 
+            self->invDecay = 1.0 / self->decay;
             self->delayPlusAttack = self->delay + self->attack;
             self->delayPlusAttackPlusDecay = self->delay + self->attack + self->decay;
             self->initAmpMinusOffsetAmp = self->initAmp - self->offsetAmp;
@@ -3236,7 +3236,7 @@ MidiDelAdsr_generates(MidiDelAdsr *self) {
             self->currentTime = 0.0;
             self->invRelease = 1.0 / self->release;
         }
-        
+
         if (self->fademode == 1) {
             if (self->currentTime < self->delay)
                 val = 0.0;
@@ -3247,15 +3247,15 @@ MidiDelAdsr_generates(MidiDelAdsr *self) {
             else
                 val = self->sustainAmp;
             self->topValue = val;
-        }    
-        else {  
+        }
+        else {
             if (self->currentTime <= self->release)
                 val = self->topValue * (1. - self->currentTime * self->invRelease);
-            else 
+            else
                 val = 0.;
-        }    
+        }
         self->data[i] = val;
-        self->currentTime += self->sampleToSec;    
+        self->currentTime += self->sampleToSec;
     }
 }
 
@@ -3274,44 +3274,44 @@ MidiDelAdsr_setProcMode(MidiDelAdsr *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = MidiDelAdsr_generates;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = MidiDelAdsr_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = MidiDelAdsr_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = MidiDelAdsr_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = MidiDelAdsr_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = MidiDelAdsr_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = MidiDelAdsr_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = MidiDelAdsr_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = MidiDelAdsr_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = MidiDelAdsr_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 MidiDelAdsr_compute_next_data_frame(MidiDelAdsr *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3324,7 +3324,7 @@ MidiDelAdsr_traverse(MidiDelAdsr *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 MidiDelAdsr_clear(MidiDelAdsr *self)
 {
     pyo_CLEAR
@@ -3348,7 +3348,7 @@ MidiDelAdsr_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     MidiDelAdsr *self;
     self = (MidiDelAdsr *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
     self->topValue = 0.0;
@@ -3360,28 +3360,28 @@ MidiDelAdsr_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->sustain = 0.707;
     self->release = 0.1;
     self->currentTime = 0.0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, MidiDelAdsr_compute_next_data_frame);
     self->mode_func_ptr = MidiDelAdsr_setProcMode;
-    
+
     self->sampleToSec = 1. / self->sr;
 
     static char *kwlist[] = {"input", "delay", "attack", "decay", "sustain", "release", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_FFFFFOO, kwlist, &inputtmp, &self->delay, &self->attack, &self->decay, &self->sustain, &self->release, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     if (self->attack < 0.000001)
@@ -3394,18 +3394,18 @@ MidiDelAdsr_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         self->sustain = 0.0;
     else if (self->sustain > 1.0)
         self->sustain = 1.0;
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * MidiDelAdsr_getServer(MidiDelAdsr* self) { GET_SERVER };
 static PyObject * MidiDelAdsr_getStream(MidiDelAdsr* self) { GET_STREAM };
-static PyObject * MidiDelAdsr_setMul(MidiDelAdsr *self, PyObject *arg) { SET_MUL };	
-static PyObject * MidiDelAdsr_setAdd(MidiDelAdsr *self, PyObject *arg) { SET_ADD };	
-static PyObject * MidiDelAdsr_setSub(MidiDelAdsr *self, PyObject *arg) { SET_SUB };	
-static PyObject * MidiDelAdsr_setDiv(MidiDelAdsr *self, PyObject *arg) { SET_DIV };	
+static PyObject * MidiDelAdsr_setMul(MidiDelAdsr *self, PyObject *arg) { SET_MUL };
+static PyObject * MidiDelAdsr_setAdd(MidiDelAdsr *self, PyObject *arg) { SET_ADD };
+static PyObject * MidiDelAdsr_setSub(MidiDelAdsr *self, PyObject *arg) { SET_SUB };
+static PyObject * MidiDelAdsr_setDiv(MidiDelAdsr *self, PyObject *arg) { SET_DIV };
 
 static PyObject * MidiDelAdsr_play(MidiDelAdsr *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * MidiDelAdsr_stop(MidiDelAdsr *self) { STOP }
@@ -3448,7 +3448,7 @@ MidiDelAdsr_setDecay(MidiDelAdsr *self, PyObject *arg)
     self->decay = PyFloat_AsDouble(PyNumber_Float(arg));
     if (self->decay < 0.000001)
         self->decay = 0.000001;
-    self->invDecay = 1.0 / self->decay; 
+    self->invDecay = 1.0 / self->decay;
     self->delayPlusAttackPlusDecay = self->delay + self->attack + self->decay;
     Py_INCREF(Py_None);
     return Py_None;
@@ -3586,4 +3586,3 @@ PyTypeObject MidiDelAdsrType = {
     0,                         /* tp_alloc */
     MidiDelAdsr_new,                 /* tp_new */
 };
-
diff --git a/src/objects/noisemodule.c b/src/objects/noisemodule.c
index 681b905..2245fad 100644
--- a/src/objects/noisemodule.c
+++ b/src/objects/noisemodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -44,7 +44,7 @@ Noise_generate(Noise *self) {
 static void
 Noise_generate_cheap(Noise *self) {
     int i;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->seed = (self->seed * 15625 + 1) & 0xFFFF;
         self->data[i] = (self->seed - 0x8000) * 3.0517578125e-05;
@@ -66,7 +66,7 @@ Noise_setProcMode(Noise *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (self->type) {
         case 0:
             self->proc_func_ptr = Noise_generate;
@@ -76,31 +76,31 @@ Noise_setProcMode(Noise *self)
             break;
     }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Noise_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Noise_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Noise_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Noise_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Noise_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Noise_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Noise_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Noise_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Noise_postprocessing_revareva;
             break;
     }
@@ -109,7 +109,7 @@ Noise_setProcMode(Noise *self)
 static void
 Noise_compute_next_data_frame(Noise *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -120,7 +120,7 @@ Noise_traverse(Noise *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Noise_clear(Noise *self)
 {
     pyo_CLEAR
@@ -142,7 +142,7 @@ Noise_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *multmp=NULL, *addtmp=NULL;
     Noise *self;
     self = (Noise *)type->tp_alloc(type, 0);
-    
+
     self->type = 0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
@@ -152,35 +152,35 @@ Noise_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = Noise_setProcMode;
 
     static char *kwlist[] = {"mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OO", kwlist, &multmp, &addtmp))
-        Py_RETURN_NONE; 
- 
+        Py_RETURN_NONE;
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     Server_generateSeed((Server *)self->server, NOISE_ID);
-    
+
     self->seed = rand();
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Noise_getServer(Noise* self) { GET_SERVER };
 static PyObject * Noise_getStream(Noise* self) { GET_STREAM };
-static PyObject * Noise_setMul(Noise *self, PyObject *arg) { SET_MUL };	
-static PyObject * Noise_setAdd(Noise *self, PyObject *arg) { SET_ADD };	
-static PyObject * Noise_setSub(Noise *self, PyObject *arg) { SET_SUB };	
-static PyObject * Noise_setDiv(Noise *self, PyObject *arg) { SET_DIV };	
+static PyObject * Noise_setMul(Noise *self, PyObject *arg) { SET_MUL };
+static PyObject * Noise_setAdd(Noise *self, PyObject *arg) { SET_ADD };
+static PyObject * Noise_setSub(Noise *self, PyObject *arg) { SET_SUB };
+static PyObject * Noise_setDiv(Noise *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Noise_play(Noise *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Noise_out(Noise *self, PyObject *args, PyObject *kwds) { OUT };
@@ -197,12 +197,12 @@ static PyObject * Noise_inplace_div(Noise *self, PyObject *arg) { INPLACE_DIV };
 
 static PyObject *
 Noise_setType(Noise *self, PyObject *arg)
-{	
+{
     if (arg == NULL) {
         Py_INCREF(Py_None);
         return Py_None;
     }
-    
+
     if (PyInt_AS_LONG(arg) == 0)
         self->type = 0;
     else if (PyInt_AS_LONG(arg) == 1)
@@ -212,7 +212,7 @@ Noise_setType(Noise *self, PyObject *arg)
 
     Py_INCREF(Py_None);
     return Py_None;
-}	
+}
 
 static PyMemberDef Noise_members[] = {
 {"server", T_OBJECT_EX, offsetof(Noise, server), 0, "Pyo server."},
@@ -336,7 +336,7 @@ static void
 PinkNoise_generate(PinkNoise *self) {
     MYFLT in, val;
     int i;
-    
+
     for (i=0; i<self->bufsize; i++) {
         in = rand()/((MYFLT)(RAND_MAX)+1)*1.98-0.99;
         self->c0 = self->c0 * 0.99886 + in * 0.0555179;
@@ -366,33 +366,33 @@ PinkNoise_setProcMode(PinkNoise *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = PinkNoise_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = PinkNoise_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = PinkNoise_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = PinkNoise_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = PinkNoise_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = PinkNoise_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = PinkNoise_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = PinkNoise_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = PinkNoise_postprocessing_revareva;
             break;
     }
@@ -401,7 +401,7 @@ PinkNoise_setProcMode(PinkNoise *self)
 static void
 PinkNoise_compute_next_data_frame(PinkNoise *self)
 {
-    PinkNoise_generate(self); 
+    PinkNoise_generate(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -412,7 +412,7 @@ PinkNoise_traverse(PinkNoise *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 PinkNoise_clear(PinkNoise *self)
 {
     pyo_CLEAR
@@ -434,32 +434,32 @@ PinkNoise_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *multmp=NULL, *addtmp=NULL;
     PinkNoise *self;
     self = (PinkNoise *)type->tp_alloc(type, 0);
-    
+
     self->c0 = self->c1 = self->c2 = self->c3 = self->c4 = self->c5 = self->c6 = 0.0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, PinkNoise_compute_next_data_frame);
     self->mode_func_ptr = PinkNoise_setProcMode;
 
     static char *kwlist[] = {"mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OO", kwlist, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     Server_generateSeed((Server *)self->server, PINKNOISE_ID);
 
     return (PyObject *)self;
@@ -467,10 +467,10 @@ PinkNoise_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * PinkNoise_getServer(PinkNoise* self) { GET_SERVER };
 static PyObject * PinkNoise_getStream(PinkNoise* self) { GET_STREAM };
-static PyObject * PinkNoise_setMul(PinkNoise *self, PyObject *arg) { SET_MUL };	
-static PyObject * PinkNoise_setAdd(PinkNoise *self, PyObject *arg) { SET_ADD };	
-static PyObject * PinkNoise_setSub(PinkNoise *self, PyObject *arg) { SET_SUB };	
-static PyObject * PinkNoise_setDiv(PinkNoise *self, PyObject *arg) { SET_DIV };	
+static PyObject * PinkNoise_setMul(PinkNoise *self, PyObject *arg) { SET_MUL };
+static PyObject * PinkNoise_setAdd(PinkNoise *self, PyObject *arg) { SET_ADD };
+static PyObject * PinkNoise_setSub(PinkNoise *self, PyObject *arg) { SET_SUB };
+static PyObject * PinkNoise_setDiv(PinkNoise *self, PyObject *arg) { SET_DIV };
 
 static PyObject * PinkNoise_play(PinkNoise *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * PinkNoise_out(PinkNoise *self, PyObject *args, PyObject *kwds) { OUT };
@@ -602,7 +602,7 @@ static void
 BrownNoise_generate(BrownNoise *self) {
     MYFLT rnd, val;
     int i;
-    
+
     for (i=0; i<self->bufsize; i++) {
         rnd = rand()/((MYFLT)(RAND_MAX)+1)*1.98-0.99;
         val = self->c1 * rnd + self->c2 * self->y1;
@@ -626,33 +626,33 @@ BrownNoise_setProcMode(BrownNoise *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = BrownNoise_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = BrownNoise_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = BrownNoise_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = BrownNoise_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = BrownNoise_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = BrownNoise_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = BrownNoise_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = BrownNoise_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = BrownNoise_postprocessing_revareva;
             break;
     }
@@ -661,7 +661,7 @@ BrownNoise_setProcMode(BrownNoise *self)
 static void
 BrownNoise_compute_next_data_frame(BrownNoise *self)
 {
-    BrownNoise_generate(self); 
+    BrownNoise_generate(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -672,7 +672,7 @@ BrownNoise_traverse(BrownNoise *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 BrownNoise_clear(BrownNoise *self)
 {
     pyo_CLEAR
@@ -695,47 +695,47 @@ BrownNoise_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *multmp=NULL, *addtmp=NULL;
     BrownNoise *self;
     self = (BrownNoise *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
     self->y1 = self->c1 = self->c2 = 0.0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, BrownNoise_compute_next_data_frame);
     self->mode_func_ptr = BrownNoise_setProcMode;
 
     static char *kwlist[] = {"mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OO", kwlist, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     b = 2.0 - MYCOS(TWOPI * 20.0 / self->sr);
     self->c2 = (b - MYSQRT(b * b - 1.0));
     self->c1 = 1.0 - self->c2;
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     Server_generateSeed((Server *)self->server, BROWNNOISE_ID);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * BrownNoise_getServer(BrownNoise* self) { GET_SERVER };
 static PyObject * BrownNoise_getStream(BrownNoise* self) { GET_STREAM };
-static PyObject * BrownNoise_setMul(BrownNoise *self, PyObject *arg) { SET_MUL };	
-static PyObject * BrownNoise_setAdd(BrownNoise *self, PyObject *arg) { SET_ADD };	
-static PyObject * BrownNoise_setSub(BrownNoise *self, PyObject *arg) { SET_SUB };	
-static PyObject * BrownNoise_setDiv(BrownNoise *self, PyObject *arg) { SET_DIV };	
+static PyObject * BrownNoise_setMul(BrownNoise *self, PyObject *arg) { SET_MUL };
+static PyObject * BrownNoise_setAdd(BrownNoise *self, PyObject *arg) { SET_ADD };
+static PyObject * BrownNoise_setSub(BrownNoise *self, PyObject *arg) { SET_SUB };
+static PyObject * BrownNoise_setDiv(BrownNoise *self, PyObject *arg) { SET_DIV };
 
 static PyObject * BrownNoise_play(BrownNoise *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * BrownNoise_out(BrownNoise *self, PyObject *args, PyObject *kwds) { OUT };
@@ -854,4 +854,3 @@ PyTypeObject BrownNoiseType = {
     0,                         /* tp_alloc */
     BrownNoise_new,                 /* tp_new */
 };
-
diff --git a/src/objects/oscbankmodule.c b/src/objects/oscbankmodule.c
index 9f98380..b8a8f3f 100644
--- a/src/objects/oscbankmodule.c
+++ b/src/objects/oscbankmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -87,7 +87,7 @@ OscBank_setFrequencies(OscBank *self, MYFLT freq, MYFLT spread) {
     int i, seed;
     MYFLT rnd;
     MYFLT scl = freq * spread;
-    
+
     if (self->fjit == 1) {
         seed = rand();
         for (i=0; i<self->stages; i++) {
@@ -133,7 +133,7 @@ OscBank_pickNewArnds(OscBank *self, MYFLT arndf, MYFLT arnda) {
         arnda = 0.0;
     else if (arnda > 1.0)
         arnda = 1.0;
-    
+
     seed = rand();
     for (i=0; i<self->stages; i++) {
         self->aOldValues[i] = self->aValues[i];
@@ -154,7 +154,7 @@ OscBank_readframes(OscBank *self) {
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = 0.0;
     }
-    
+
     if (self->modebuffer[2] == 0)
         freq = PyFloat_AS_DOUBLE(self->freq);
     else
@@ -183,7 +183,7 @@ OscBank_readframes(OscBank *self) {
         arnda = PyFloat_AS_DOUBLE(self->arnda);
     else
         arnda = Stream_getData((Stream *)self->arnda_stream)[0];
-    
+
     if (freq != self->lastFreq || spread != self->lastSpread) {
         self->lastFreq = freq;
         self->lastSpread = spread;
@@ -201,7 +201,7 @@ OscBank_readframes(OscBank *self) {
 
     if (frnda == 0.0 && arnda == 0.0) {
         amp = self->amplitude;
-        for (j=0; j<self->stages; j++) {          
+        for (j=0; j<self->stages; j++) {
             inc = self->frequencies[j] * tabscl;
             pos = self->pointerPos[j];
             for (i=0; i<self->bufsize; i++) {
@@ -289,7 +289,7 @@ OscBank_readframes(OscBank *self) {
         }
         self->atime += self->ainc;
     }
-    
+
 }
 
 static void OscBank_postprocessing_ii(OscBank *self) { POST_PROCESSING_II };
@@ -311,40 +311,40 @@ OscBank_setProcMode(OscBank *self)
     self->proc_func_ptr = OscBank_readframes;
 
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = OscBank_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = OscBank_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = OscBank_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = OscBank_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = OscBank_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = OscBank_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = OscBank_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = OscBank_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = OscBank_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 OscBank_compute_next_data_frame(OscBank *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -353,42 +353,42 @@ OscBank_traverse(OscBank *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->table);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->spread);    
-    Py_VISIT(self->spread_stream);    
-    Py_VISIT(self->slope);    
-    Py_VISIT(self->slope_stream); 
-    Py_VISIT(self->frndf);    
-    Py_VISIT(self->frndf_stream); 
-    Py_VISIT(self->frnda);    
-    Py_VISIT(self->frnda_stream); 
-    Py_VISIT(self->arndf);    
-    Py_VISIT(self->arndf_stream); 
-    Py_VISIT(self->arnda);    
-    Py_VISIT(self->arnda_stream); 
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->spread);
+    Py_VISIT(self->spread_stream);
+    Py_VISIT(self->slope);
+    Py_VISIT(self->slope_stream);
+    Py_VISIT(self->frndf);
+    Py_VISIT(self->frndf_stream);
+    Py_VISIT(self->frnda);
+    Py_VISIT(self->frnda_stream);
+    Py_VISIT(self->arndf);
+    Py_VISIT(self->arndf_stream);
+    Py_VISIT(self->arnda);
+    Py_VISIT(self->arnda_stream);
     return 0;
 }
 
-static int 
+static int
 OscBank_clear(OscBank *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->table);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->spread);    
-    Py_CLEAR(self->spread_stream);    
-    Py_CLEAR(self->slope);    
-    Py_CLEAR(self->slope_stream);    
-    Py_CLEAR(self->frndf);    
-    Py_CLEAR(self->frndf_stream); 
-    Py_CLEAR(self->frnda);    
-    Py_CLEAR(self->frnda_stream); 
-    Py_CLEAR(self->arndf);    
-    Py_CLEAR(self->arndf_stream); 
-    Py_CLEAR(self->arnda);    
-    Py_CLEAR(self->arnda_stream); 
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->spread);
+    Py_CLEAR(self->spread_stream);
+    Py_CLEAR(self->slope);
+    Py_CLEAR(self->slope_stream);
+    Py_CLEAR(self->frndf);
+    Py_CLEAR(self->frndf_stream);
+    Py_CLEAR(self->frnda);
+    Py_CLEAR(self->frnda_stream);
+    Py_CLEAR(self->arndf);
+    Py_CLEAR(self->arndf_stream);
+    Py_CLEAR(self->arnda);
+    Py_CLEAR(self->arnda_stream);
     return 0;
 }
 
@@ -415,7 +415,7 @@ OscBank_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *tabletmp, *freqtmp=NULL, *spreadtmp=NULL, *slopetmp=NULL, *frndftmp=NULL, *frndatmp=NULL, *arndftmp=NULL, *arndatmp=NULL, *multmp=NULL, *addtmp=NULL;
     OscBank *self;
     self = (OscBank *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(100.0);
     self->spread = PyFloat_FromDouble(1.0);
     self->slope = PyFloat_FromDouble(0.9);
@@ -440,14 +440,14 @@ OscBank_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[6] = 0;
 	self->modebuffer[7] = 0;
 	self->modebuffer[8] = 0;
-    
+
     INIT_OBJECT_COMMON
 
     Stream_setFunctionPtr(self->stream, OscBank_compute_next_data_frame);
     self->mode_func_ptr = OscBank_setProcMode;
 
     static char *kwlist[] = {"table", "freq", "spread", "slope", "frndf", "frnda", "arndf", "arnda", "num", "fjit", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOOOOOiiOO", kwlist, &tabletmp, &freqtmp, &spreadtmp, &slopetmp, &frndftmp, &frndatmp, &arndftmp, &arndatmp, &self->stages, &self->fjit, &multmp, &addtmp))
         Py_RETURN_NONE;
 
@@ -461,7 +461,7 @@ OscBank_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (spreadtmp) {
         PyObject_CallMethod((PyObject *)self, "setSpread", "O", spreadtmp);
     }
@@ -483,17 +483,17 @@ OscBank_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (arndatmp) {
         PyObject_CallMethod((PyObject *)self, "setArnda", "O", arndatmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     self->pointerPos = (MYFLT *)realloc(self->pointerPos, self->stages * sizeof(MYFLT));
@@ -504,11 +504,11 @@ OscBank_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->aOldValues = (MYFLT *)realloc(self->aOldValues, self->stages * sizeof(MYFLT));
     self->aValues = (MYFLT *)realloc(self->aValues, self->stages * sizeof(MYFLT));
     self->aDiffs = (MYFLT *)realloc(self->aDiffs, self->stages * sizeof(MYFLT));
-    
+
     for (i=0; i<self->stages; i++) {
         self->pointerPos[i] = self->frequencies[i] = self->fOldValues[i] = self->fValues[i] = self->fDiffs[i] = self->aOldValues[i] = self->aValues[i] = self->aDiffs[i] = 0.0;
     }
-    
+
     self->amplitude = 1. / self->stages;
 
     Server_generateSeed((Server *)self->server, OSCBANK_ID);
@@ -518,10 +518,10 @@ OscBank_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * OscBank_getServer(OscBank* self) { GET_SERVER };
 static PyObject * OscBank_getStream(OscBank* self) { GET_STREAM };
-static PyObject * OscBank_setMul(OscBank *self, PyObject *arg) { SET_MUL };	
-static PyObject * OscBank_setAdd(OscBank *self, PyObject *arg) { SET_ADD };	
-static PyObject * OscBank_setSub(OscBank *self, PyObject *arg) { SET_SUB };	
-static PyObject * OscBank_setDiv(OscBank *self, PyObject *arg) { SET_DIV };	
+static PyObject * OscBank_setMul(OscBank *self, PyObject *arg) { SET_MUL };
+static PyObject * OscBank_setAdd(OscBank *self, PyObject *arg) { SET_ADD };
+static PyObject * OscBank_setSub(OscBank *self, PyObject *arg) { SET_SUB };
+static PyObject * OscBank_setDiv(OscBank *self, PyObject *arg) { SET_DIV };
 
 static PyObject * OscBank_play(OscBank *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * OscBank_out(OscBank *self, PyObject *args, PyObject *kwds) { OUT };
@@ -547,32 +547,32 @@ static PyObject *
 OscBank_setTable(OscBank *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 OscBank_setFreq(OscBank *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -591,20 +591,20 @@ OscBank_setFreq(OscBank *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 OscBank_setSpread(OscBank *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->spread);
@@ -623,20 +623,20 @@ OscBank_setSpread(OscBank *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 OscBank_setSlope(OscBank *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->slope);
@@ -652,23 +652,23 @@ OscBank_setSlope(OscBank *self, PyObject *arg)
         self->slope_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 OscBank_setFrndf(OscBank *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->frndf);
@@ -684,23 +684,23 @@ OscBank_setFrndf(OscBank *self, PyObject *arg)
         self->frndf_stream = (Stream *)streamtmp;
 		self->modebuffer[5] = 1;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 OscBank_setFrnda(OscBank *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->frnda);
@@ -716,23 +716,23 @@ OscBank_setFrnda(OscBank *self, PyObject *arg)
         self->frnda_stream = (Stream *)streamtmp;
 		self->modebuffer[6] = 1;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 OscBank_setArndf(OscBank *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->arndf);
@@ -748,23 +748,23 @@ OscBank_setArndf(OscBank *self, PyObject *arg)
         self->arndf_stream = (Stream *)streamtmp;
 		self->modebuffer[7] = 1;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 OscBank_setArnda(OscBank *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->arnda);
@@ -780,14 +780,14 @@ OscBank_setArnda(OscBank *self, PyObject *arg)
         self->arnda_stream = (Stream *)streamtmp;
 		self->modebuffer[8] = 1;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 OscBank_setFjit(OscBank *self, PyObject *arg)
-{	
+{
     int isInt = PyInt_Check(arg);
 
 	if (isInt) {
@@ -796,7 +796,7 @@ OscBank_setFjit(OscBank *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef OscBank_members[] = {
     {"server", T_OBJECT_EX, offsetof(OscBank, server), 0, "Pyo server."},
@@ -918,4 +918,3 @@ PyTypeObject OscBankType = {
     0,                                              /* tp_alloc */
     OscBank_new,                                     /* tp_new */
 };
-
diff --git a/src/objects/oscilmodule.c b/src/objects/oscilmodule.c
index 722521e..aac2444 100644
--- a/src/objects/oscilmodule.c
+++ b/src/objects/oscilmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -29,8 +29,8 @@
 #include "interpolation.h"
 
 static MYFLT SINE_ARRAY[513] = {0.0, 0.012271538285719925, 0.024541228522912288, 0.036807222941358832, 0.049067674327418015, 0.061320736302208578, 0.073564563599667426, 0.085797312344439894, 0.098017140329560604, 0.11022220729388306, 0.1224106751992162, 0.13458070850712617, 0.14673047445536175, 0.15885814333386145, 0.17096188876030122, 0.18303988795514095, 0.19509032201612825, 0.20711137619221856, 0.2191012401568698, 0.23105810828067111, 0.24298017990326387, 0.25486565960451457, 0.26671275747489837, 0.27851968938505306, 0.29028467725446233, 0.30200594931922808, 0.31368174039889152, 0.32531029216226293, 0.33688985339222005, 0.34841868024943456, 0.35989503653498811, 0.37131719395183754, 0.38268343236508978, 0.3939920400610481, 0.40524131400498986, 0.41642956009763715, 0.42755509343028208, 0.43861623853852766, 0.44961132965460654, 0.46053871095824001, 0.47139673682599764, 0.48218377207912272, 0.49289819222978404, 0.50353838372571758, 0.51410274419322166, 0.52458968267846895, 0.53499761988709715, 0.54532498842204646, 0.55557023301960218, 0.56573181078361312, 0.57580819141784534, 0.58579785745643886, 0.59569930449243336, 0.60551104140432555, 0.61523159058062682, 0.62485948814238634, 0.63439328416364549, 0.64383154288979139, 0.65317284295377676, 0.66241577759017178, 0.67155895484701833, 0.68060099779545302, 0.68954054473706683, 0.69837624940897292, 0.70710678118654746, 0.71573082528381859, 0.72424708295146689, 0.7326542716724127, 0.74095112535495899, 0.74913639452345926, 0.75720884650648446, 0.76516726562245885, 0.77301045336273688, 0.78073722857209438, 0.78834642762660623, 0.79583690460888346, 0.80320753148064483, 0.81045719825259477, 0.81758481315158371, 0.82458930278502529, 0.83146961230254512, 0.83822470555483797, 0.84485356524970701, 0.8513551931052652, 0.85772861000027212, 0.8639728561215867, 0.87008699110871135, 0.87607009419540649, 0.88192126434835494, 0.88763962040285393, 0.89322430119551532, 0.89867446569395382, 0.90398929312344334, 0.90916798309052238, 0.91420975570353069, 0.91911385169005777, 0.92387953251128674, 0.92850608047321548, 0.93299279883473885, 0.93733901191257496, 0.94154406518302081, 0.94560732538052128, 0.94952818059303667, 0.95330604035419375, 0.95694033573220894, 0.96043051941556579, 0.96377606579543984, 0.96697647104485207, 0.97003125319454397, 0.97293995220556007, 0.97570213003852857, 0.97831737071962765, 0.98078528040323043, 0.98310548743121629, 0.98527764238894122, 0.98730141815785843, 0.98917650996478101, 0.99090263542778001, 0.99247953459870997, 0.99390697000235606, 0.99518472667219682, 0.996312612182778, 0.99729045667869021, 0.99811811290014918, 0.99879545620517241, 0.99932238458834954, 0.99969881869620425, 0.9999247018391445, 1.0, 0.9999247018391445, 0.99969881869620425, 0.99932238458834954, 0.99879545620517241, 0.99811811290014918, 0.99729045667869021, 0.996312612182778, 0.99518472667219693, 0.99390697000235606, 0.99247953459870997, 0.99090263542778001, 0.98917650996478101, 0.98730141815785843, 0.98527764238894122, 0.98310548743121629, 0.98078528040323043, 0.97831737071962765, 0.97570213003852857, 0.97293995220556018, 0.97003125319454397, 0.96697647104485207, 0.96377606579543984, 0.9604305194155659, 0.95694033573220894, 0.95330604035419386, 0.94952818059303667, 0.94560732538052139, 0.94154406518302081, 0.93733901191257496, 0.93299279883473885, 0.92850608047321559, 0.92387953251128674, 0.91911385169005777, 0.91420975570353069, 0.90916798309052249, 0.90398929312344345, 0.89867446569395393, 0.89322430119551521, 0.88763962040285393, 0.88192126434835505, 0.8760700941954066, 0.87008699110871146, 0.86397285612158681, 0.85772861000027212, 0.8513551931052652, 0.84485356524970723, 0.83822470555483819, 0.83146961230254546, 0.82458930278502529, 0.81758481315158371, 0.81045719825259477, 0.80320753148064494, 0.79583690460888357, 0.78834642762660634, 0.7807372285720946, 0.7730104533627371, 0.76516726562245907, 0.75720884650648479, 0.74913639452345926, 0.74095112535495899, 0.73265427167241282, 0.724247082951467, 0.71573082528381871, 0.70710678118654757, 0.69837624940897292, 0.68954054473706705, 0.68060099779545324, 0.67155895484701855, 0.66241577759017201, 0.65317284295377664, 0.64383154288979139, 0.63439328416364549, 0.62485948814238634, 0.61523159058062693, 0.60551104140432555, 0.59569930449243347, 0.58579785745643898, 0.57580819141784545, 0.56573181078361345, 0.55557023301960218, 0.54532498842204635, 0.53499761988709715, 0.52458968267846895, 0.51410274419322177, 0.50353838372571758, 0.49289819222978415, 0.48218377207912289, 0.47139673682599781, 0.46053871095824023, 0.44961132965460687, 0.43861623853852755, 0.42755509343028203, 0.41642956009763715, 0.40524131400498986, 0.39399204006104815, 0.38268343236508984, 0.37131719395183765, 0.35989503653498833, 0.34841868024943479, 0.33688985339222027, 0.3253102921622632, 0.31368174039889141, 0.30200594931922803, 0.29028467725446233, 0.27851968938505312, 0.26671275747489848, 0.25486565960451468, 0.24298017990326404, 0.2310581082806713, 0.21910124015687002, 0.20711137619221884, 0.19509032201612858, 0.1830398879551409, 0.17096188876030119, 0.15885814333386145, 0.1467304744553618, 0.13458070850712628, 0.12241067519921635, 0.11022220729388325, 0.09801714032956084, 0.085797312344440158, 0.073564563599667745, 0.061320736302208495, 0.049067674327417973, 0.036807222941358832, 0.024541228522912326, 0.012271538285720007, 1.2246467991473532e-16, -0.012271538285719761, -0.024541228522912083, -0.036807222941358582, -0.049067674327417724, -0.061320736302208245, -0.073564563599667496, -0.085797312344439922, -0.09801714032956059, -0.110222207293883, -0.1224106751992161, -0.13458070850712606, -0.14673047445536158, -0.15885814333386122, -0.17096188876030097, -0.18303988795514067, -0.19509032201612836, -0.20711137619221862, -0.21910124015686983, -0.23105810828067111, -0.24298017990326382, -0.25486565960451446, -0.26671275747489825, -0.27851968938505289, -0.29028467725446216, -0.30200594931922781, -0.31368174039889118, -0.32531029216226304, -0.33688985339222011, -0.34841868024943456, -0.35989503653498811, -0.37131719395183749, -0.38268343236508967, -0.39399204006104793, -0.40524131400498969, -0.41642956009763693, -0.42755509343028181, -0.43861623853852733, -0.44961132965460665, -0.46053871095824006, -0.47139673682599764, -0.48218377207912272, -0.49289819222978393, -0.50353838372571746, -0.51410274419322155, -0.52458968267846873, -0.53499761988709693, -0.54532498842204613, -0.55557023301960196, -0.56573181078361323, -0.57580819141784534, -0.58579785745643886, -0.59569930449243325, -0.60551104140432543, -0.61523159058062671, -0.62485948814238623, -0.63439328416364527, -0.64383154288979128, -0.65317284295377653, -0.66241577759017178, -0.67155895484701844, -0.68060099779545302, -0.68954054473706683, -0.6983762494089728, -0.70710678118654746, -0.71573082528381848, -0.72424708295146667, -0.73265427167241259, -0.74095112535495877, -0.74913639452345904, -0.75720884650648423, -0.76516726562245885, -0.77301045336273666, -0.78073722857209438, -0.78834642762660589, -0.79583690460888334, -0.80320753148064505, -0.81045719825259466, -0.81758481315158371, -0.82458930278502507, -0.83146961230254524, -0.83822470555483775, -0.84485356524970712, -0.85135519310526486, -0.85772861000027201, -0.86397285612158647, -0.87008699110871135, -0.87607009419540671, -0.88192126434835494, -0.88763962040285405, -0.89322430119551521, -0.89867446569395382, -0.90398929312344312, -0.90916798309052238, -0.91420975570353047, -0.91911385169005766, -0.92387953251128652, -0.92850608047321548, -0.93299279883473896, -0.93733901191257485, -0.94154406518302081, -0.94560732538052117, -0.94952818059303667, -0.95330604035419375, -0.95694033573220882, -0.96043051941556568, -0.96377606579543984, -0.96697647104485218, -0.97003125319454397, -0.97293995220556018, -0.97570213003852846, -0.97831737071962765, -0.98078528040323032, -0.98310548743121629, -0.98527764238894111, -0.98730141815785832, -0.9891765099647809, -0.99090263542778001, -0.99247953459871008, -0.99390697000235606, -0.99518472667219693, -0.996312612182778, -0.99729045667869021, -0.99811811290014918, -0.99879545620517241, -0.99932238458834943, -0.99969881869620425, -0.9999247018391445, -1.0, -0.9999247018391445, -0.99969881869620425, -0.99932238458834954, -0.99879545620517241, -0.99811811290014918, -0.99729045667869021, -0.996312612182778, -0.99518472667219693, -0.99390697000235606, -0.99247953459871008, -0.99090263542778001, -0.9891765099647809, -0.98730141815785843, -0.98527764238894122, -0.9831054874312164, -0.98078528040323043, -0.97831737071962777, -0.97570213003852857, -0.97293995220556029, -0.97003125319454397, -0.96697647104485229, -0.96377606579543995, -0.96043051941556579, -0.95694033573220894, -0.95330604035419375, -0.94952818059303679, -0.94560732538052128, -0.94154406518302092, -0.93733901191257496, -0.93299279883473907, -0.92850608047321559, -0.92387953251128663, -0.91911385169005788, -0.91420975570353058, -0.90916798309052249, -0.90398929312344334, -0.89867446569395404, -0.89322430119551532, -0.88763962040285416, -0.88192126434835505, -0.87607009419540693, -0.87008699110871146, -0.8639728561215867, -0.85772861000027223, -0.85135519310526508, -0.84485356524970734, -0.83822470555483797, -0.83146961230254557, -0.82458930278502529, -0.81758481315158404, -0.81045719825259488, -0.80320753148064528, -0.79583690460888368, -0.78834642762660612, -0.78073722857209471, -0.77301045336273688, -0.76516726562245918, -0.75720884650648457, -0.7491363945234597, -0.74095112535495922, -0.73265427167241315, -0.72424708295146711, -0.71573082528381904, -0.70710678118654768, -0.69837624940897269, -0.68954054473706716, -0.68060099779545302, -0.67155895484701866, -0.66241577759017178, -0.65317284295377709, -0.6438315428897915, -0.63439328416364593, -0.62485948814238645, -0.61523159058062737, -0.60551104140432566, -0.59569930449243325, -0.58579785745643909, -0.57580819141784523, -0.56573181078361356, -0.55557023301960218, -0.5453249884220468, -0.53499761988709726, -0.52458968267846939, -0.51410274419322188, -0.50353838372571813, -0.49289819222978426, -0.48218377207912261, -0.47139673682599792, -0.46053871095823995, -0.44961132965460698, -0.43861623853852766, -0.42755509343028253, -0.41642956009763726, -0.40524131400499042, -0.39399204006104827, -0.38268343236509039, -0.37131719395183777, -0.359895036534988, -0.3484186802494349, -0.33688985339222, -0.32531029216226331, -0.31368174039889152, -0.30200594931922853, -0.29028467725446244, -0.27851968938505367, -0.26671275747489859, -0.25486565960451435, -0.24298017990326418, -0.23105810828067103, -0.21910124015687016, -0.20711137619221853, -0.19509032201612872, -0.18303988795514103, -0.17096188876030177, -0.15885814333386158, -0.14673047445536239, -0.13458070850712642, -0.12241067519921603, -0.11022220729388338, -0.09801714032956052, -0.085797312344440282, -0.073564563599667426, -0.06132073630220905, -0.049067674327418091, -0.036807222941359394, -0.024541228522912451, -0.012271538285720572, 0.0};
-static MYFLT COSINE_ARRAY[513] = {1.0, 0.9999247018391445, 0.9996988186962042, 0.9993223845883495, 0.9987954562051724, 0.9981181129001492, 0.9972904566786902, 0.996312612182778, 0.9951847266721969, 0.9939069700023561, 0.99247953459871, 0.99090263542778, 0.989176509964781, 0.9873014181578584, 0.9852776423889412, 0.9831054874312163, 0.9807852804032304, 0.9783173707196277, 0.9757021300385286, 0.9729399522055602, 0.970031253194544, 0.9669764710448521, 0.9637760657954398, 0.9604305194155658, 0.9569403357322088, 0.9533060403541939, 0.9495281805930367, 0.9456073253805213, 0.9415440651830208, 0.937339011912575, 0.932992798834739, 0.9285060804732156, 0.9238795325112867, 0.9191138516900578, 0.9142097557035307, 0.9091679830905224, 0.9039892931234433, 0.8986744656939538, 0.8932243011955153, 0.8876396204028539, 0.881921264348355, 0.8760700941954066, 0.8700869911087115, 0.8639728561215868, 0.8577286100002721, 0.8513551931052652, 0.8448535652497071, 0.8382247055548381, 0.8314696123025452, 0.8245893027850253, 0.8175848131515837, 0.8104571982525948, 0.8032075314806449, 0.7958369046088836, 0.7883464276266063, 0.7807372285720945, 0.773010453362737, 0.765167265622459, 0.7572088465064846, 0.7491363945234594, 0.7409511253549591, 0.7326542716724128, 0.724247082951467, 0.7157308252838186, 0.7071067811865476, 0.6983762494089729, 0.6895405447370669, 0.6806009977954531, 0.6715589548470183, 0.6624157775901718, 0.6531728429537768, 0.6438315428897915, 0.6343932841636455, 0.6248594881423865, 0.6152315905806268, 0.6055110414043255, 0.5956993044924335, 0.5857978574564389, 0.5758081914178453, 0.5657318107836132, 0.5555702330196023, 0.5453249884220465, 0.5349976198870973, 0.5245896826784688, 0.5141027441932217, 0.5035383837257176, 0.4928981922297841, 0.48218377207912283, 0.4713967368259978, 0.46053871095824, 0.4496113296546066, 0.4386162385385277, 0.4275550934302822, 0.4164295600976373, 0.40524131400498986, 0.3939920400610481, 0.38268343236508984, 0.3713171939518376, 0.3598950365349883, 0.3484186802494345, 0.33688985339222005, 0.325310292162263, 0.3136817403988916, 0.3020059493192282, 0.29028467725446233, 0.27851968938505306, 0.2667127574748984, 0.2548656596045146, 0.24298017990326398, 0.23105810828067128, 0.21910124015686977, 0.20711137619221856, 0.19509032201612833, 0.18303988795514106, 0.17096188876030136, 0.1588581433338614, 0.14673047445536175, 0.13458070850712622, 0.12241067519921628, 0.11022220729388318, 0.09801714032956077, 0.08579731234443988, 0.07356456359966745, 0.06132073630220865, 0.049067674327418126, 0.03680722294135899, 0.024541228522912264, 0.012271538285719944, 6.123031769111886e-17, -0.012271538285719823, -0.024541228522912142, -0.036807222941358866, -0.04906767432741801, -0.06132073630220853, -0.07356456359966733, -0.08579731234443976, -0.09801714032956065, -0.11022220729388306, -0.12241067519921615, -0.1345807085071261, -0.14673047445536164, -0.15885814333386128, -0.17096188876030124, -0.18303988795514092, -0.1950903220161282, -0.20711137619221845, -0.21910124015686966, -0.23105810828067114, -0.24298017990326387, -0.2548656596045145, -0.2667127574748983, -0.27851968938505295, -0.29028467725446216, -0.3020059493192281, -0.3136817403988914, -0.32531029216226287, -0.33688985339221994, -0.3484186802494344, -0.35989503653498817, -0.3713171939518375, -0.3826834323650897, -0.393992040061048, -0.40524131400498975, -0.416429560097637, -0.42755509343028186, -0.4386162385385274, -0.4496113296546067, -0.46053871095824006, -0.4713967368259977, -0.4821837720791227, -0.492898192229784, -0.5035383837257175, -0.5141027441932217, -0.5245896826784687, -0.534997619887097, -0.5453249884220462, -0.555570233019602, -0.5657318107836132, -0.5758081914178453, -0.5857978574564389, -0.5956993044924334, -0.6055110414043254, -0.6152315905806267, -0.6248594881423862, -0.6343932841636454, -0.6438315428897913, -0.6531728429537765, -0.6624157775901719, -0.6715589548470184, -0.680600997795453, -0.6895405447370669, -0.6983762494089728, -0.7071067811865475, -0.7157308252838186, -0.7242470829514668, -0.7326542716724127, -0.7409511253549589, -0.7491363945234591, -0.7572088465064846, -0.765167265622459, -0.773010453362737, -0.7807372285720945, -0.7883464276266062, -0.7958369046088835, -0.8032075314806448, -0.8104571982525947, -0.8175848131515836, -0.8245893027850251, -0.8314696123025453, -0.8382247055548381, -0.8448535652497071, -0.8513551931052652, -0.857728610000272, -0.8639728561215867, -0.8700869911087113, -0.8760700941954065, -0.8819212643483549, -0.8876396204028538, -0.8932243011955152, -0.8986744656939539, -0.9039892931234433, -0.9091679830905224, -0.9142097557035307, -0.9191138516900578, -0.9238795325112867, -0.9285060804732155, -0.9329927988347388, -0.9373390119125748, -0.9415440651830207, -0.9456073253805212, -0.9495281805930367, -0.9533060403541939, -0.9569403357322088, -0.9604305194155658, 
--0.9637760657954398, -0.9669764710448521, -0.970031253194544, -0.9729399522055601, -0.9757021300385285, -0.9783173707196275, -0.9807852804032304, -0.9831054874312163, -0.9852776423889412, -0.9873014181578584, -0.989176509964781, -0.99090263542778, -0.99247953459871, -0.9939069700023561, -0.9951847266721968, -0.996312612182778, -0.9972904566786902, -0.9981181129001492, -0.9987954562051724, -0.9993223845883495, -0.9996988186962042, -0.9999247018391445, -1.0, -0.9999247018391445, -0.9996988186962042, -0.9993223845883495, -0.9987954562051724, -0.9981181129001492, -0.9972904566786902, -0.996312612182778, -0.9951847266721969, -0.9939069700023561, -0.99247953459871, -0.99090263542778, -0.989176509964781, -0.9873014181578584, -0.9852776423889413, -0.9831054874312164, -0.9807852804032304, -0.9783173707196277, -0.9757021300385286, -0.9729399522055602, -0.970031253194544, -0.9669764710448522, -0.96377606579544, -0.9604305194155659, -0.9569403357322089, -0.953306040354194, -0.9495281805930368, -0.9456073253805213, -0.9415440651830208, -0.937339011912575, -0.932992798834739, -0.9285060804732156, -0.9238795325112868, -0.9191138516900578, -0.9142097557035307, -0.9091679830905225, -0.9039892931234434, -0.898674465693954, -0.8932243011955153, -0.8876396204028539, -0.881921264348355, -0.8760700941954066, -0.8700869911087115, -0.8639728561215868, -0.8577286100002721, -0.8513551931052653, -0.8448535652497072, -0.8382247055548382, -0.8314696123025455, -0.8245893027850253, -0.8175848131515837, -0.8104571982525948, -0.8032075314806449, -0.7958369046088836, -0.7883464276266063, -0.7807372285720946, -0.7730104533627371, -0.7651672656224591, -0.7572088465064848, -0.7491363945234593, -0.7409511253549591, -0.7326542716724128, -0.724247082951467, -0.7157308252838187, -0.7071067811865477, -0.698376249408973, -0.689540544737067, -0.6806009977954532, -0.6715589548470187, -0.662415777590172, -0.6531728429537771, -0.6438315428897915, -0.6343932841636459, -0.6248594881423865, -0.6152315905806273, -0.6055110414043257, -0.5956993044924331, -0.5857978574564391, -0.5758081914178452, -0.5657318107836135, -0.5555702330196022, -0.5453249884220468, -0.5349976198870973, -0.5245896826784694, -0.5141027441932218, -0.503538383725718, -0.4928981922297842, -0.48218377207912255, -0.47139673682599786, -0.4605387109582399, -0.44961132965460693, -0.4386162385385276, -0.4275550934302825, -0.4164295600976372, -0.40524131400499036, -0.3939920400610482, -0.38268343236509034, -0.37131719395183777, -0.35989503653498794, -0.34841868024943484, -0.33688985339221994, -0.3253102921622633, -0.31368174039889146, -0.30200594931922853, -0.29028467725446244, -0.2785196893850536, -0.26671275747489853, -0.25486565960451435, -0.24298017990326412, -0.23105810828067094, -0.2191012401568701, -0.20711137619221848, -0.19509032201612866, -0.18303988795514095, -0.1709618887603017, -0.15885814333386153, -0.1467304744553623, -0.13458070850712636, -0.12241067519921596, -0.11022220729388331, -0.09801714032956045, -0.08579731234444023, -0.07356456359966736, -0.061320736302208995, -0.04906767432741803, -0.03680722294135933, -0.02454122852291239, -0.012271538285720512, -1.836909530733566e-16, 0.012271538285720144, 0.02454122852291202, 0.036807222941358964, 0.04906767432741766, 0.06132073630220863, 0.07356456359966698, 0.08579731234443985, 0.09801714032956009, 0.11022220729388293, 0.1224106751992156, 0.13458070850712597, 0.14673047445536194, 0.15885814333386117, 0.17096188876030133, 0.1830398879551406, 0.1950903220161283, 0.20711137619221812, 0.21910124015686974, 0.23105810828067058, 0.24298017990326376, 0.25486565960451396, 0.2667127574748982, 0.2785196893850533, 0.29028467725446205, 0.30200594931922814, 0.31368174039889113, 0.3253102921622629, 0.3368898533922196, 0.3484186802494345, 0.3598950365349876, 0.3713171939518374, 0.38268343236509, 0.3939920400610479, 0.40524131400499, 0.4164295600976369, 0.42755509343028214, 0.43861623853852727, 0.4496113296546066, 0.46053871095823956, 0.4713967368259976, 0.4821837720791222, 0.49289819222978387, 0.5035383837257178, 0.5141027441932216, 0.5245896826784691, 0.5349976198870969, 0.5453249884220465, 0.5555702330196018, 0.5657318107836131, 0.5758081914178449, 0.5857978574564388, 0.5956993044924329, 0.6055110414043253, 0.615231590580627, 0.6248594881423861, 0.6343932841636456, 0.6438315428897912, 0.6531728429537768, 0.6624157775901715, 0.6715589548470183, 0.6806009977954527, 0.6895405447370668, 0.6983762494089724, 0.7071067811865474, 0.7157308252838188, 0.7242470829514667, 0.7326542716724129, 0.7409511253549589, 0.7491363945234594, 0.7572088465064842, 0.7651672656224588, 0.7730104533627367, 0.7807372285720944, 0.7883464276266059, 0.7958369046088833, 0.803207531480645, 0.8104571982525947, 0.8175848131515837, 0.8245893027850251, 0.8314696123025452, 0.8382247055548377, 
+static MYFLT COSINE_ARRAY[513] = {1.0, 0.9999247018391445, 0.9996988186962042, 0.9993223845883495, 0.9987954562051724, 0.9981181129001492, 0.9972904566786902, 0.996312612182778, 0.9951847266721969, 0.9939069700023561, 0.99247953459871, 0.99090263542778, 0.989176509964781, 0.9873014181578584, 0.9852776423889412, 0.9831054874312163, 0.9807852804032304, 0.9783173707196277, 0.9757021300385286, 0.9729399522055602, 0.970031253194544, 0.9669764710448521, 0.9637760657954398, 0.9604305194155658, 0.9569403357322088, 0.9533060403541939, 0.9495281805930367, 0.9456073253805213, 0.9415440651830208, 0.937339011912575, 0.932992798834739, 0.9285060804732156, 0.9238795325112867, 0.9191138516900578, 0.9142097557035307, 0.9091679830905224, 0.9039892931234433, 0.8986744656939538, 0.8932243011955153, 0.8876396204028539, 0.881921264348355, 0.8760700941954066, 0.8700869911087115, 0.8639728561215868, 0.8577286100002721, 0.8513551931052652, 0.8448535652497071, 0.8382247055548381, 0.8314696123025452, 0.8245893027850253, 0.8175848131515837, 0.8104571982525948, 0.8032075314806449, 0.7958369046088836, 0.7883464276266063, 0.7807372285720945, 0.773010453362737, 0.765167265622459, 0.7572088465064846, 0.7491363945234594, 0.7409511253549591, 0.7326542716724128, 0.724247082951467, 0.7157308252838186, 0.7071067811865476, 0.6983762494089729, 0.6895405447370669, 0.6806009977954531, 0.6715589548470183, 0.6624157775901718, 0.6531728429537768, 0.6438315428897915, 0.6343932841636455, 0.6248594881423865, 0.6152315905806268, 0.6055110414043255, 0.5956993044924335, 0.5857978574564389, 0.5758081914178453, 0.5657318107836132, 0.5555702330196023, 0.5453249884220465, 0.5349976198870973, 0.5245896826784688, 0.5141027441932217, 0.5035383837257176, 0.4928981922297841, 0.48218377207912283, 0.4713967368259978, 0.46053871095824, 0.4496113296546066, 0.4386162385385277, 0.4275550934302822, 0.4164295600976373, 0.40524131400498986, 0.3939920400610481, 0.38268343236508984, 0.3713171939518376, 0.3598950365349883, 0.3484186802494345, 0.33688985339222005, 0.325310292162263, 0.3136817403988916, 0.3020059493192282, 0.29028467725446233, 0.27851968938505306, 0.2667127574748984, 0.2548656596045146, 0.24298017990326398, 0.23105810828067128, 0.21910124015686977, 0.20711137619221856, 0.19509032201612833, 0.18303988795514106, 0.17096188876030136, 0.1588581433338614, 0.14673047445536175, 0.13458070850712622, 0.12241067519921628, 0.11022220729388318, 0.09801714032956077, 0.08579731234443988, 0.07356456359966745, 0.06132073630220865, 0.049067674327418126, 0.03680722294135899, 0.024541228522912264, 0.012271538285719944, 6.123031769111886e-17, -0.012271538285719823, -0.024541228522912142, -0.036807222941358866, -0.04906767432741801, -0.06132073630220853, -0.07356456359966733, -0.08579731234443976, -0.09801714032956065, -0.11022220729388306, -0.12241067519921615, -0.1345807085071261, -0.14673047445536164, -0.15885814333386128, -0.17096188876030124, -0.18303988795514092, -0.1950903220161282, -0.20711137619221845, -0.21910124015686966, -0.23105810828067114, -0.24298017990326387, -0.2548656596045145, -0.2667127574748983, -0.27851968938505295, -0.29028467725446216, -0.3020059493192281, -0.3136817403988914, -0.32531029216226287, -0.33688985339221994, -0.3484186802494344, -0.35989503653498817, -0.3713171939518375, -0.3826834323650897, -0.393992040061048, -0.40524131400498975, -0.416429560097637, -0.42755509343028186, -0.4386162385385274, -0.4496113296546067, -0.46053871095824006, -0.4713967368259977, -0.4821837720791227, -0.492898192229784, -0.5035383837257175, -0.5141027441932217, -0.5245896826784687, -0.534997619887097, -0.5453249884220462, -0.555570233019602, -0.5657318107836132, -0.5758081914178453, -0.5857978574564389, -0.5956993044924334, -0.6055110414043254, -0.6152315905806267, -0.6248594881423862, -0.6343932841636454, -0.6438315428897913, -0.6531728429537765, -0.6624157775901719, -0.6715589548470184, -0.680600997795453, -0.6895405447370669, -0.6983762494089728, -0.7071067811865475, -0.7157308252838186, -0.7242470829514668, -0.7326542716724127, -0.7409511253549589, -0.7491363945234591, -0.7572088465064846, -0.765167265622459, -0.773010453362737, -0.7807372285720945, -0.7883464276266062, -0.7958369046088835, -0.8032075314806448, -0.8104571982525947, -0.8175848131515836, -0.8245893027850251, -0.8314696123025453, -0.8382247055548381, -0.8448535652497071, -0.8513551931052652, -0.857728610000272, -0.8639728561215867, -0.8700869911087113, -0.8760700941954065, -0.8819212643483549, -0.8876396204028538, -0.8932243011955152, -0.8986744656939539, -0.9039892931234433, -0.9091679830905224, -0.9142097557035307, -0.9191138516900578, -0.9238795325112867, -0.9285060804732155, -0.9329927988347388, -0.9373390119125748, -0.9415440651830207, -0.9456073253805212, -0.9495281805930367, -0.9533060403541939, -0.9569403357322088, -0.9604305194155658,
+-0.9637760657954398, -0.9669764710448521, -0.970031253194544, -0.9729399522055601, -0.9757021300385285, -0.9783173707196275, -0.9807852804032304, -0.9831054874312163, -0.9852776423889412, -0.9873014181578584, -0.989176509964781, -0.99090263542778, -0.99247953459871, -0.9939069700023561, -0.9951847266721968, -0.996312612182778, -0.9972904566786902, -0.9981181129001492, -0.9987954562051724, -0.9993223845883495, -0.9996988186962042, -0.9999247018391445, -1.0, -0.9999247018391445, -0.9996988186962042, -0.9993223845883495, -0.9987954562051724, -0.9981181129001492, -0.9972904566786902, -0.996312612182778, -0.9951847266721969, -0.9939069700023561, -0.99247953459871, -0.99090263542778, -0.989176509964781, -0.9873014181578584, -0.9852776423889413, -0.9831054874312164, -0.9807852804032304, -0.9783173707196277, -0.9757021300385286, -0.9729399522055602, -0.970031253194544, -0.9669764710448522, -0.96377606579544, -0.9604305194155659, -0.9569403357322089, -0.953306040354194, -0.9495281805930368, -0.9456073253805213, -0.9415440651830208, -0.937339011912575, -0.932992798834739, -0.9285060804732156, -0.9238795325112868, -0.9191138516900578, -0.9142097557035307, -0.9091679830905225, -0.9039892931234434, -0.898674465693954, -0.8932243011955153, -0.8876396204028539, -0.881921264348355, -0.8760700941954066, -0.8700869911087115, -0.8639728561215868, -0.8577286100002721, -0.8513551931052653, -0.8448535652497072, -0.8382247055548382, -0.8314696123025455, -0.8245893027850253, -0.8175848131515837, -0.8104571982525948, -0.8032075314806449, -0.7958369046088836, -0.7883464276266063, -0.7807372285720946, -0.7730104533627371, -0.7651672656224591, -0.7572088465064848, -0.7491363945234593, -0.7409511253549591, -0.7326542716724128, -0.724247082951467, -0.7157308252838187, -0.7071067811865477, -0.698376249408973, -0.689540544737067, -0.6806009977954532, -0.6715589548470187, -0.662415777590172, -0.6531728429537771, -0.6438315428897915, -0.6343932841636459, -0.6248594881423865, -0.6152315905806273, -0.6055110414043257, -0.5956993044924331, -0.5857978574564391, -0.5758081914178452, -0.5657318107836135, -0.5555702330196022, -0.5453249884220468, -0.5349976198870973, -0.5245896826784694, -0.5141027441932218, -0.503538383725718, -0.4928981922297842, -0.48218377207912255, -0.47139673682599786, -0.4605387109582399, -0.44961132965460693, -0.4386162385385276, -0.4275550934302825, -0.4164295600976372, -0.40524131400499036, -0.3939920400610482, -0.38268343236509034, -0.37131719395183777, -0.35989503653498794, -0.34841868024943484, -0.33688985339221994, -0.3253102921622633, -0.31368174039889146, -0.30200594931922853, -0.29028467725446244, -0.2785196893850536, -0.26671275747489853, -0.25486565960451435, -0.24298017990326412, -0.23105810828067094, -0.2191012401568701, -0.20711137619221848, -0.19509032201612866, -0.18303988795514095, -0.1709618887603017, -0.15885814333386153, -0.1467304744553623, -0.13458070850712636, -0.12241067519921596, -0.11022220729388331, -0.09801714032956045, -0.08579731234444023, -0.07356456359966736, -0.061320736302208995, -0.04906767432741803, -0.03680722294135933, -0.02454122852291239, -0.012271538285720512, -1.836909530733566e-16, 0.012271538285720144, 0.02454122852291202, 0.036807222941358964, 0.04906767432741766, 0.06132073630220863, 0.07356456359966698, 0.08579731234443985, 0.09801714032956009, 0.11022220729388293, 0.1224106751992156, 0.13458070850712597, 0.14673047445536194, 0.15885814333386117, 0.17096188876030133, 0.1830398879551406, 0.1950903220161283, 0.20711137619221812, 0.21910124015686974, 0.23105810828067058, 0.24298017990326376, 0.25486565960451396, 0.2667127574748982, 0.2785196893850533, 0.29028467725446205, 0.30200594931922814, 0.31368174039889113, 0.3253102921622629, 0.3368898533922196, 0.3484186802494345, 0.3598950365349876, 0.3713171939518374, 0.38268343236509, 0.3939920400610479, 0.40524131400499, 0.4164295600976369, 0.42755509343028214, 0.43861623853852727, 0.4496113296546066, 0.46053871095823956, 0.4713967368259976, 0.4821837720791222, 0.49289819222978387, 0.5035383837257178, 0.5141027441932216, 0.5245896826784691, 0.5349976198870969, 0.5453249884220465, 0.5555702330196018, 0.5657318107836131, 0.5758081914178449, 0.5857978574564388, 0.5956993044924329, 0.6055110414043253, 0.615231590580627, 0.6248594881423861, 0.6343932841636456, 0.6438315428897912, 0.6531728429537768, 0.6624157775901715, 0.6715589548470183, 0.6806009977954527, 0.6895405447370668, 0.6983762494089724, 0.7071067811865474, 0.7157308252838188, 0.7242470829514667, 0.7326542716724129, 0.7409511253549589, 0.7491363945234594, 0.7572088465064842, 0.7651672656224588, 0.7730104533627367, 0.7807372285720944, 0.7883464276266059, 0.7958369046088833, 0.803207531480645, 0.8104571982525947, 0.8175848131515837, 0.8245893027850251, 0.8314696123025452, 0.8382247055548377,
 0.844853565249707, 0.8513551931052649, 0.857728610000272, 0.8639728561215864, 0.8700869911087113, 0.8760700941954067, 0.8819212643483548, 0.8876396204028539, 0.8932243011955151, 0.8986744656939538, 0.9039892931234431, 0.9091679830905224, 0.9142097557035305, 0.9191138516900577, 0.9238795325112865, 0.9285060804732155, 0.932992798834739, 0.9373390119125748, 0.9415440651830208, 0.9456073253805212, 0.9495281805930367, 0.9533060403541936, 0.9569403357322088, 0.9604305194155657, 0.9637760657954398, 0.9669764710448522, 0.970031253194544, 0.9729399522055602, 0.9757021300385285, 0.9783173707196277, 0.9807852804032303, 0.9831054874312163, 0.9852776423889411, 0.9873014181578583, 0.9891765099647809, 0.99090263542778, 0.99247953459871, 0.9939069700023561, 0.9951847266721969, 0.996312612182778, 0.9972904566786902, 0.9981181129001492, 0.9987954562051724, 0.9993223845883494, 0.9996988186962042, 0.9999247018391445, 1.0};
 static MYFLT ONE_OVER_512 = 1.0 / 512.0;
 static const MYFLT ROSSLER_SCALE     = 0.05757;
@@ -74,11 +74,11 @@ static void
 Sine_readframes_ii(Sine *self) {
     MYFLT inc, fr, ph, pos, fpart;
     int i, ipart;
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     ph = PyFloat_AS_DOUBLE(self->phase) * 512;
     inc = fr * 512 / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->pointerPos = Sine_clip(self->pointerPos);
         pos = self->pointerPos + ph;
@@ -95,10 +95,10 @@ static void
 Sine_readframes_ai(Sine *self) {
     MYFLT inc, ph, pos, fpart, fac;
     int i, ipart;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     ph = PyFloat_AS_DOUBLE(self->phase) * 512;
-    
+
     fac = 512 / self->sr;
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] * fac;
@@ -117,11 +117,11 @@ static void
 Sine_readframes_ia(Sine *self) {
     MYFLT inc, fr, pos, fpart;
     int i, ipart;
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *ph = Stream_getData((Stream *)self->phase_stream);
     inc = fr * 512 / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->pointerPos = Sine_clip(self->pointerPos);
         pos = self->pointerPos + ph[i] * 512;
@@ -138,10 +138,10 @@ static void
 Sine_readframes_aa(Sine *self) {
     MYFLT inc, pos, fpart, fac;
     int i, ipart;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT *ph = Stream_getData((Stream *)self->phase_stream);
-    
+
     fac = 512 / self->sr;
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] * fac;
@@ -172,48 +172,48 @@ Sine_setProcMode(Sine *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = Sine_readframes_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Sine_readframes_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = Sine_readframes_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Sine_readframes_aa;
             break;
-    } 
-    
+    }
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Sine_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Sine_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Sine_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Sine_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Sine_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Sine_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Sine_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Sine_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Sine_postprocessing_revareva;
             break;
     }
@@ -222,7 +222,7 @@ Sine_setProcMode(Sine *self)
 static void
 Sine_compute_next_data_frame(Sine *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -230,21 +230,21 @@ static int
 Sine_traverse(Sine *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->phase);    
-    Py_VISIT(self->phase_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->phase);
+    Py_VISIT(self->phase_stream);
     return 0;
 }
 
-static int 
+static int
 Sine_clear(Sine *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->phase);    
-    Py_CLEAR(self->phase_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->phase);
+    Py_CLEAR(self->phase_stream);
     return 0;
 }
 
@@ -264,7 +264,7 @@ Sine_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     Sine *self;
     self = (Sine *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(1000);
     self->phase = PyFloat_FromDouble(0.0);
 	self->modebuffer[0] = 0;
@@ -272,34 +272,34 @@ Sine_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
     self->pointerPos = 0.;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Sine_compute_next_data_frame);
     self->mode_func_ptr = Sine_setProcMode;
-    
+
     static char *kwlist[] = {"freq", "phase", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOOO", kwlist, &freqtmp, &phasetmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (phasetmp) {
         PyObject_CallMethod((PyObject *)self, "setPhase", "O", phasetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -307,10 +307,10 @@ Sine_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Sine_getServer(Sine* self) { GET_SERVER };
 static PyObject * Sine_getStream(Sine* self) { GET_STREAM };
-static PyObject * Sine_setMul(Sine *self, PyObject *arg) { SET_MUL };	
-static PyObject * Sine_setAdd(Sine *self, PyObject *arg) { SET_ADD };	
-static PyObject * Sine_setSub(Sine *self, PyObject *arg) { SET_SUB };	
-static PyObject * Sine_setDiv(Sine *self, PyObject *arg) { SET_DIV };	
+static PyObject * Sine_setMul(Sine *self, PyObject *arg) { SET_MUL };
+static PyObject * Sine_setAdd(Sine *self, PyObject *arg) { SET_ADD };
+static PyObject * Sine_setSub(Sine *self, PyObject *arg) { SET_SUB };
+static PyObject * Sine_setDiv(Sine *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Sine_play(Sine *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Sine_out(Sine *self, PyObject *args, PyObject *kwds) { OUT };
@@ -329,14 +329,14 @@ static PyObject *
 Sine_setFreq(Sine *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -352,25 +352,25 @@ Sine_setFreq(Sine *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Sine_setPhase(Sine *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->phase);
@@ -386,15 +386,15 @@ Sine_setPhase(Sine *self, PyObject *arg)
         self->phase_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
-static PyObject * 
-Sine_reset(Sine *self) 
+static PyObject *
+Sine_reset(Sine *self)
 {
     self->pointerPos = 0.0;
     Py_INCREF(Py_None);
@@ -529,11 +529,11 @@ static void
 SineLoop_readframes_ii(SineLoop *self) {
     MYFLT inc, fr, feed, pos, fpart;
     int i, ipart;
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     feed = _clip(PyFloat_AS_DOUBLE(self->feedback)) * 512;
     inc = fr * 512 / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->pointerPos = Sine_clip(self->pointerPos);
         pos = Sine_clip(self->pointerPos + self->lastValue * feed);
@@ -548,10 +548,10 @@ static void
 SineLoop_readframes_ai(SineLoop *self) {
     MYFLT inc, feed, pos, fpart, fac;
     int i, ipart;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     feed = _clip(PyFloat_AS_DOUBLE(self->feedback)) * 512;
-    
+
     fac = 512 / self->sr;
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] * fac;
@@ -568,11 +568,11 @@ static void
 SineLoop_readframes_ia(SineLoop *self) {
     MYFLT inc, fr, feed, pos, fpart;
     int i, ipart;
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *fd = Stream_getData((Stream *)self->feedback_stream);
     inc = fr * 512 / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         feed = _clip(fd[i]) * 512;
         self->pointerPos = Sine_clip(self->pointerPos);
@@ -588,10 +588,10 @@ static void
 SineLoop_readframes_aa(SineLoop *self) {
     MYFLT inc, feed, pos, fpart, fac;
     int i, ipart;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT *fd = Stream_getData((Stream *)self->feedback_stream);
-    
+
     fac = 512 / self->sr;
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] * fac;
@@ -621,48 +621,48 @@ SineLoop_setProcMode(SineLoop *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = SineLoop_readframes_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = SineLoop_readframes_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = SineLoop_readframes_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = SineLoop_readframes_aa;
             break;
-    } 
-    
+    }
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = SineLoop_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = SineLoop_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = SineLoop_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = SineLoop_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = SineLoop_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = SineLoop_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = SineLoop_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = SineLoop_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = SineLoop_postprocessing_revareva;
             break;
     }
@@ -671,7 +671,7 @@ SineLoop_setProcMode(SineLoop *self)
 static void
 SineLoop_compute_next_data_frame(SineLoop *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -679,21 +679,21 @@ static int
 SineLoop_traverse(SineLoop *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->feedback);    
-    Py_VISIT(self->feedback_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->feedback);
+    Py_VISIT(self->feedback_stream);
     return 0;
 }
 
-static int 
+static int
 SineLoop_clear(SineLoop *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->feedback);    
-    Py_CLEAR(self->feedback_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->feedback);
+    Py_CLEAR(self->feedback_stream);
     return 0;
 }
 
@@ -712,7 +712,7 @@ SineLoop_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *freqtmp=NULL, *feedbacktmp=NULL, *multmp=NULL, *addtmp=NULL;
     SineLoop *self;
     self = (SineLoop *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(1000);
     self->feedback = PyFloat_FromDouble(0.0);
 	self->modebuffer[0] = 0;
@@ -720,45 +720,45 @@ SineLoop_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
     self->pointerPos = self->lastValue = 0.;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, SineLoop_compute_next_data_frame);
     self->mode_func_ptr = SineLoop_setProcMode;
 
     static char *kwlist[] = {"freq", "feedback", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOOO", kwlist, &freqtmp, &feedbacktmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (feedbacktmp) {
         PyObject_CallMethod((PyObject *)self, "setFeedback", "O", feedbacktmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * SineLoop_getServer(SineLoop* self) { GET_SERVER };
 static PyObject * SineLoop_getStream(SineLoop* self) { GET_STREAM };
-static PyObject * SineLoop_setMul(SineLoop *self, PyObject *arg) { SET_MUL };	
-static PyObject * SineLoop_setAdd(SineLoop *self, PyObject *arg) { SET_ADD };	
-static PyObject * SineLoop_setSub(SineLoop *self, PyObject *arg) { SET_SUB };	
-static PyObject * SineLoop_setDiv(SineLoop *self, PyObject *arg) { SET_DIV };	
+static PyObject * SineLoop_setMul(SineLoop *self, PyObject *arg) { SET_MUL };
+static PyObject * SineLoop_setAdd(SineLoop *self, PyObject *arg) { SET_ADD };
+static PyObject * SineLoop_setSub(SineLoop *self, PyObject *arg) { SET_SUB };
+static PyObject * SineLoop_setDiv(SineLoop *self, PyObject *arg) { SET_DIV };
 
 static PyObject * SineLoop_play(SineLoop *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * SineLoop_out(SineLoop *self, PyObject *args, PyObject *kwds) { OUT };
@@ -777,14 +777,14 @@ static PyObject *
 SineLoop_setFreq(SineLoop *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -800,25 +800,25 @@ SineLoop_setFreq(SineLoop *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 SineLoop_setFeedback(SineLoop *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->feedback);
@@ -834,12 +834,12 @@ SineLoop_setFeedback(SineLoop *self, PyObject *arg)
         self->feedback_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef SineLoop_members[] = {
 	{"server", T_OBJECT_EX, offsetof(SineLoop, server), 0, "Pyo server."},
@@ -1009,11 +1009,11 @@ Osc_readframes_ai(Osc *self) {
     int i, ipart;
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     ph = PyFloat_AS_DOUBLE(self->phase);
     ph *= size;
-    
+
     sizeOnSr = size / self->sr;
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] * sizeOnSr;
@@ -1035,11 +1035,11 @@ Osc_readframes_ia(Osc *self) {
     int i, ipart;
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *ph = Stream_getData((Stream *)self->phase_stream);
     inc = fr * size / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         pha = ph[i] * size;
         self->pointerPos += inc;
@@ -1060,7 +1060,7 @@ Osc_readframes_aa(Osc *self) {
     int i, ipart;
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT *ph = Stream_getData((Stream *)self->phase_stream);
 
@@ -1095,56 +1095,56 @@ Osc_setProcMode(Osc *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = Osc_readframes_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Osc_readframes_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Osc_readframes_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Osc_readframes_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Osc_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Osc_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Osc_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Osc_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Osc_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Osc_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Osc_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Osc_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Osc_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 Osc_compute_next_data_frame(Osc *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1153,22 +1153,22 @@ Osc_traverse(Osc *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->table);
-    Py_VISIT(self->phase);    
-    Py_VISIT(self->phase_stream);    
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
+    Py_VISIT(self->phase);
+    Py_VISIT(self->phase_stream);
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
     return 0;
 }
 
-static int 
+static int
 Osc_clear(Osc *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->table);
-    Py_CLEAR(self->phase);    
-    Py_CLEAR(self->phase_stream);    
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
+    Py_CLEAR(self->phase);
+    Py_CLEAR(self->phase_stream);
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
     return 0;
 }
 
@@ -1212,7 +1212,7 @@ Osc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     }
     Py_XDECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tabletmp, "getTableStream", "");
-    
+
     if (phasetmp) {
         PyObject_CallMethod((PyObject *)self, "setPhase", "O", phasetmp);
     }
@@ -1220,7 +1220,7 @@ Osc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
@@ -1228,7 +1228,7 @@ Osc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-            
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
@@ -1240,10 +1240,10 @@ Osc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Osc_getServer(Osc* self) { GET_SERVER };
 static PyObject * Osc_getStream(Osc* self) { GET_STREAM };
-static PyObject * Osc_setMul(Osc *self, PyObject *arg) { SET_MUL };	
-static PyObject * Osc_setAdd(Osc *self, PyObject *arg) { SET_ADD };	
-static PyObject * Osc_setSub(Osc *self, PyObject *arg) { SET_SUB };	
-static PyObject * Osc_setDiv(Osc *self, PyObject *arg) { SET_DIV };	
+static PyObject * Osc_setMul(Osc *self, PyObject *arg) { SET_MUL };
+static PyObject * Osc_setAdd(Osc *self, PyObject *arg) { SET_ADD };
+static PyObject * Osc_setSub(Osc *self, PyObject *arg) { SET_SUB };
+static PyObject * Osc_setDiv(Osc *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Osc_play(Osc *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Osc_out(Osc *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1269,7 +1269,7 @@ static PyObject *
 Osc_setTable(Osc *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
@@ -1278,23 +1278,23 @@ Osc_setTable(Osc *self, PyObject *arg)
 	tmp = arg;
 	Py_DECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Osc_setFreq(Osc *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -1310,25 +1310,25 @@ Osc_setFreq(Osc *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Osc_setPhase(Osc *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->phase);
@@ -1344,12 +1344,12 @@ Osc_setPhase(Osc *self, PyObject *arg)
         self->phase_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Osc_setInterp(Osc *self, PyObject *arg)
@@ -1358,21 +1358,21 @@ Osc_setInterp(Osc *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     int isNumber = PyNumber_Check(arg);
-    
+
 	if (isNumber == 1) {
 		self->interp = PyInt_AsLong(PyNumber_Int(arg));
-    }  
-    
+    }
+
     SET_INTERP_POINTER
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
-static PyObject * 
-Osc_reset(Osc *self) 
+static PyObject *
+Osc_reset(Osc *self)
 {
     self->pointerPos = 0.0;
     Py_INCREF(Py_None);
@@ -1514,11 +1514,11 @@ OscLoop_readframes_ii(OscLoop *self) {
     int i, ipart;
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     feed = _clip(PyFloat_AS_DOUBLE(self->feedback)) * size;
     inc = fr * size / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->pointerPos += inc;
         self->pointerPos = Osc_clip(self->pointerPos, size);
@@ -1539,10 +1539,10 @@ OscLoop_readframes_ai(OscLoop *self) {
     int i, ipart;
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     feed = _clip(PyFloat_AS_DOUBLE(self->feedback)) * size;
-    
+
     sizeOnSr = size / self->sr;
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] * sizeOnSr;
@@ -1565,11 +1565,11 @@ OscLoop_readframes_ia(OscLoop *self) {
     int i, ipart;
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *fd = Stream_getData((Stream *)self->feedback_stream);
     inc = fr * size / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         feed = _clip(fd[i]) * size;
         self->pointerPos += inc;
@@ -1591,10 +1591,10 @@ OscLoop_readframes_aa(OscLoop *self) {
     int i, ipart;
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT *fd = Stream_getData((Stream *)self->feedback_stream);
-    
+
     sizeOnSr = size / self->sr;
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] * sizeOnSr;
@@ -1628,56 +1628,56 @@ OscLoop_setProcMode(OscLoop *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = OscLoop_readframes_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = OscLoop_readframes_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = OscLoop_readframes_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = OscLoop_readframes_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = OscLoop_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = OscLoop_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = OscLoop_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = OscLoop_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = OscLoop_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = OscLoop_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = OscLoop_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = OscLoop_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = OscLoop_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 OscLoop_compute_next_data_frame(OscLoop *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1686,22 +1686,22 @@ OscLoop_traverse(OscLoop *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->table);
-    Py_VISIT(self->feedback);    
-    Py_VISIT(self->feedback_stream);    
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
+    Py_VISIT(self->feedback);
+    Py_VISIT(self->feedback_stream);
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
     return 0;
 }
 
-static int 
+static int
 OscLoop_clear(OscLoop *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->table);
-    Py_CLEAR(self->feedback);    
-    Py_CLEAR(self->feedback_stream);    
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
+    Py_CLEAR(self->feedback);
+    Py_CLEAR(self->feedback_stream);
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
     return 0;
 }
 
@@ -1720,7 +1720,7 @@ OscLoop_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *tabletmp, *freqtmp=NULL, *feedbacktmp=NULL, *multmp=NULL, *addtmp=NULL;
     OscLoop *self;
     self = (OscLoop *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(1000);
     self->feedback = PyFloat_FromDouble(0);
 	self->modebuffer[0] = 0;
@@ -1728,52 +1728,52 @@ OscLoop_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
     self->pointerPos = self->lastValue = 0.;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, OscLoop_compute_next_data_frame);
     self->mode_func_ptr = OscLoop_setProcMode;
 
     static char *kwlist[] = {"table", "freq", "feedback", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOO", kwlist, &tabletmp, &freqtmp, &feedbacktmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if ( PyObject_HasAttrString((PyObject *)tabletmp, "getTableStream") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"table\" argument of OscLoop must be a PyoTableObject.\n");
         Py_RETURN_NONE;
     }
     Py_XDECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tabletmp, "getTableStream", "");
-    
+
     if (feedbacktmp) {
         PyObject_CallMethod((PyObject *)self, "setFeedback", "O", feedbacktmp);
     }
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * OscLoop_getServer(OscLoop* self) { GET_SERVER };
 static PyObject * OscLoop_getStream(OscLoop* self) { GET_STREAM };
-static PyObject * OscLoop_setMul(OscLoop *self, PyObject *arg) { SET_MUL };	
-static PyObject * OscLoop_setAdd(OscLoop *self, PyObject *arg) { SET_ADD };	
-static PyObject * OscLoop_setSub(OscLoop *self, PyObject *arg) { SET_SUB };	
-static PyObject * OscLoop_setDiv(OscLoop *self, PyObject *arg) { SET_DIV };	
+static PyObject * OscLoop_setMul(OscLoop *self, PyObject *arg) { SET_MUL };
+static PyObject * OscLoop_setAdd(OscLoop *self, PyObject *arg) { SET_ADD };
+static PyObject * OscLoop_setSub(OscLoop *self, PyObject *arg) { SET_SUB };
+static PyObject * OscLoop_setDiv(OscLoop *self, PyObject *arg) { SET_DIV };
 
 static PyObject * OscLoop_play(OscLoop *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * OscLoop_out(OscLoop *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1799,32 +1799,32 @@ static PyObject *
 OscLoop_setTable(OscLoop *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 OscLoop_setFreq(OscLoop *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -1840,25 +1840,25 @@ OscLoop_setFreq(OscLoop *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 OscLoop_setFeedback(OscLoop *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->feedback);
@@ -1874,12 +1874,12 @@ OscLoop_setFeedback(OscLoop *self, PyObject *arg)
         self->feedback_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef OscLoop_members[] = {
     {"server", T_OBJECT_EX, offsetof(OscLoop, server), 0, "Pyo server."},
@@ -2015,12 +2015,12 @@ OscTrig_readframes_ii(OscTrig *self) {
     int i, ipart;
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     ph = PyFloat_AS_DOUBLE(self->phase);
     MYFLT *tr = Stream_getData((Stream *)self->trig_stream);
     inc = fr * size / self->sr;
-    
+
     ph *= size;
     for (i=0; i<self->bufsize; i++) {
         if (tr[i] == 1)
@@ -2045,12 +2045,12 @@ OscTrig_readframes_ai(OscTrig *self) {
     int i, ipart;
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     ph = PyFloat_AS_DOUBLE(self->phase);
     MYFLT *tr = Stream_getData((Stream *)self->trig_stream);
     ph *= size;
-    
+
     sizeOnSr = size / self->sr;
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] * sizeOnSr;
@@ -2076,12 +2076,12 @@ OscTrig_readframes_ia(OscTrig *self) {
     int i, ipart;
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *ph = Stream_getData((Stream *)self->phase_stream);
     MYFLT *tr = Stream_getData((Stream *)self->trig_stream);
     inc = fr * size / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         pha = ph[i] * size;
         if (tr[i] == 1)
@@ -2106,11 +2106,11 @@ OscTrig_readframes_aa(OscTrig *self) {
     int i, ipart;
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT *ph = Stream_getData((Stream *)self->phase_stream);
     MYFLT *tr = Stream_getData((Stream *)self->trig_stream);
-    
+
     sizeOnSr = size / self->sr;
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] * sizeOnSr;
@@ -2146,56 +2146,56 @@ OscTrig_setProcMode(OscTrig *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = OscTrig_readframes_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = OscTrig_readframes_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = OscTrig_readframes_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = OscTrig_readframes_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = OscTrig_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = OscTrig_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = OscTrig_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = OscTrig_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = OscTrig_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = OscTrig_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = OscTrig_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = OscTrig_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = OscTrig_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 OscTrig_compute_next_data_frame(OscTrig *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2204,26 +2204,26 @@ OscTrig_traverse(OscTrig *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->table);
-    Py_VISIT(self->phase);    
-    Py_VISIT(self->phase_stream);    
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->trig);    
-    Py_VISIT(self->trig_stream);    
+    Py_VISIT(self->phase);
+    Py_VISIT(self->phase_stream);
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->trig);
+    Py_VISIT(self->trig_stream);
     return 0;
 }
 
-static int 
+static int
 OscTrig_clear(OscTrig *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->table);
-    Py_CLEAR(self->phase);    
-    Py_CLEAR(self->phase_stream);    
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->trig);    
-    Py_CLEAR(self->trig_stream);    
+    Py_CLEAR(self->phase);
+    Py_CLEAR(self->phase_stream);
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->trig);
+    Py_CLEAR(self->trig_stream);
     return 0;
 }
 
@@ -2242,7 +2242,7 @@ OscTrig_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *tabletmp, *trigtmp, *freqtmp=NULL, *phasetmp=NULL, *multmp=NULL, *addtmp=NULL;
     OscTrig *self;
     self = (OscTrig *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(1000);
     self->phase = PyFloat_FromDouble(0);
 	self->modebuffer[0] = 0;
@@ -2251,16 +2251,16 @@ OscTrig_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[3] = 0;
     self->pointerPos = 0.;
     self->interp = 2;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, OscTrig_compute_next_data_frame);
     self->mode_func_ptr = OscTrig_setProcMode;
-    
+
     static char *kwlist[] = {"table", "trig", "freq", "phase", "interp", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OOiOO", kwlist, &tabletmp, &trigtmp, &freqtmp, &phasetmp, &self->interp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if ( PyObject_HasAttrString((PyObject *)tabletmp, "getTableStream") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"table\" argument of OscTrig must be a PyoTableObject.\n");
         Py_RETURN_NONE;
@@ -2271,38 +2271,38 @@ OscTrig_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (trigtmp) {
         PyObject_CallMethod((PyObject *)self, "setTrig", "O", trigtmp);
     }
-    
+
     if (phasetmp) {
         PyObject_CallMethod((PyObject *)self, "setPhase", "O", phasetmp);
     }
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     SET_INTERP_POINTER
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * OscTrig_getServer(OscTrig* self) { GET_SERVER };
 static PyObject * OscTrig_getStream(OscTrig* self) { GET_STREAM };
-static PyObject * OscTrig_setMul(OscTrig *self, PyObject *arg) { SET_MUL };	
-static PyObject * OscTrig_setAdd(OscTrig *self, PyObject *arg) { SET_ADD };	
-static PyObject * OscTrig_setSub(OscTrig *self, PyObject *arg) { SET_SUB };	
-static PyObject * OscTrig_setDiv(OscTrig *self, PyObject *arg) { SET_DIV };	
+static PyObject * OscTrig_setMul(OscTrig *self, PyObject *arg) { SET_MUL };
+static PyObject * OscTrig_setAdd(OscTrig *self, PyObject *arg) { SET_ADD };
+static PyObject * OscTrig_setSub(OscTrig *self, PyObject *arg) { SET_SUB };
+static PyObject * OscTrig_setDiv(OscTrig *self, PyObject *arg) { SET_DIV };
 
 static PyObject * OscTrig_play(OscTrig *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * OscTrig_out(OscTrig *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2328,32 +2328,32 @@ static PyObject *
 OscTrig_setTable(OscTrig *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 OscTrig_setTrig(OscTrig *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_XDECREF(self->trig);
@@ -2371,20 +2371,20 @@ OscTrig_setTrig(OscTrig *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 OscTrig_setFreq(OscTrig *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -2400,25 +2400,25 @@ OscTrig_setFreq(OscTrig *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 OscTrig_setPhase(OscTrig *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->phase);
@@ -2434,12 +2434,12 @@ OscTrig_setPhase(OscTrig *self, PyObject *arg)
         self->phase_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 OscTrig_setInterp(OscTrig *self, PyObject *arg)
@@ -2448,21 +2448,21 @@ OscTrig_setInterp(OscTrig *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     int isNumber = PyNumber_Check(arg);
-    
+
 	if (isNumber == 1) {
 		self->interp = PyInt_AsLong(PyNumber_Int(arg));
-    }  
-    
+    }
+
     SET_INTERP_POINTER
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
-static PyObject * 
-OscTrig_reset(OscTrig *self) 
+static PyObject *
+OscTrig_reset(OscTrig *self)
 {
     self->pointerPos = 0.0;
     Py_INCREF(Py_None);
@@ -2603,17 +2603,17 @@ Phasor_readframes_ii(Phasor *self) {
     MYFLT fr, ph;
     double inc, pos;
     int i;
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     ph = _clip(PyFloat_AS_DOUBLE(self->phase));
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         pos = self->pointerPos + ph;
         if (pos > 1)
             pos -= 1.0;
         self->data[i] = pos;
-        
+
         self->pointerPos += inc;
         if (self->pointerPos < 0)
             self->pointerPos += 1.0;
@@ -2627,17 +2627,17 @@ Phasor_readframes_ai(Phasor *self) {
     MYFLT ph, oneOnSr;
     double inc, pos;
     int i;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     ph = _clip(PyFloat_AS_DOUBLE(self->phase));
-    
+
     oneOnSr = 1.0 / self->sr;
     for (i=0; i<self->bufsize; i++) {
         pos = self->pointerPos + ph;
         if (pos > 1)
             pos -= 1.0;
         self->data[i] = pos;
-        
+
         inc = fr[i] * oneOnSr;
         self->pointerPos += inc;
         if (self->pointerPos < 0)
@@ -2652,12 +2652,12 @@ Phasor_readframes_ia(Phasor *self) {
     MYFLT fr, pha;
     double inc, pos;
     int i;
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *ph = Stream_getData((Stream *)self->phase_stream);
-    
+
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         pha = _clip(ph[i]);
 
@@ -2665,7 +2665,7 @@ Phasor_readframes_ia(Phasor *self) {
         if (pos > 1)
             pos -= 1.0;
         self->data[i] = pos;
-        
+
         self->pointerPos += inc;
         if (self->pointerPos < 0)
             self->pointerPos += 1.0;
@@ -2679,7 +2679,7 @@ Phasor_readframes_aa(Phasor *self) {
     MYFLT pha, oneOnSr;
     double inc, pos;
     int i;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT *ph = Stream_getData((Stream *)self->phase_stream);
 
@@ -2687,12 +2687,12 @@ Phasor_readframes_aa(Phasor *self) {
 
     for (i=0; i<self->bufsize; i++) {
         pha = _clip(ph[i]);
-        
+
         pos = self->pointerPos + pha;
         if (pos > 1)
             pos -= 1.0;
         self->data[i] = pos;
-        
+
         inc = fr[i] * oneOnSr;
         self->pointerPos += inc;
         if (self->pointerPos < 0)
@@ -2718,56 +2718,56 @@ Phasor_setProcMode(Phasor *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = Phasor_readframes_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Phasor_readframes_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Phasor_readframes_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Phasor_readframes_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Phasor_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Phasor_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Phasor_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Phasor_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Phasor_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Phasor_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Phasor_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Phasor_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Phasor_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 Phasor_compute_next_data_frame(Phasor *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2775,21 +2775,21 @@ static int
 Phasor_traverse(Phasor *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->phase);    
-    Py_VISIT(self->phase_stream);    
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
+    Py_VISIT(self->phase);
+    Py_VISIT(self->phase_stream);
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
     return 0;
 }
 
-static int 
+static int
 Phasor_clear(Phasor *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->phase);    
-    Py_CLEAR(self->phase_stream);    
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
+    Py_CLEAR(self->phase);
+    Py_CLEAR(self->phase_stream);
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
     return 0;
 }
 
@@ -2808,7 +2808,7 @@ Phasor_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *freqtmp=NULL, *phasetmp=NULL, *multmp=NULL, *addtmp=NULL;
     Phasor *self;
     self = (Phasor *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(100);
     self->phase = PyFloat_FromDouble(0);
 	self->modebuffer[0] = 0;
@@ -2816,16 +2816,16 @@ Phasor_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
     self->pointerPos = 0.;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Phasor_compute_next_data_frame);
     self->mode_func_ptr = Phasor_setProcMode;
 
     static char *kwlist[] = {"freq", "phase", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOOO", kwlist, &freqtmp, &phasetmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
@@ -2833,28 +2833,28 @@ Phasor_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (phasetmp) {
         PyObject_CallMethod((PyObject *)self, "setPhase", "O", phasetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Phasor_getServer(Phasor* self) { GET_SERVER };
 static PyObject * Phasor_getStream(Phasor* self) { GET_STREAM };
-static PyObject * Phasor_setMul(Phasor *self, PyObject *arg) { SET_MUL };	
-static PyObject * Phasor_setAdd(Phasor *self, PyObject *arg) { SET_ADD };	
-static PyObject * Phasor_setSub(Phasor *self, PyObject *arg) { SET_SUB };	
-static PyObject * Phasor_setDiv(Phasor *self, PyObject *arg) { SET_DIV };	
+static PyObject * Phasor_setMul(Phasor *self, PyObject *arg) { SET_MUL };
+static PyObject * Phasor_setAdd(Phasor *self, PyObject *arg) { SET_ADD };
+static PyObject * Phasor_setSub(Phasor *self, PyObject *arg) { SET_SUB };
+static PyObject * Phasor_setDiv(Phasor *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Phasor_play(Phasor *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Phasor_out(Phasor *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2873,14 +2873,14 @@ static PyObject *
 Phasor_setFreq(Phasor *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -2896,25 +2896,25 @@ Phasor_setFreq(Phasor *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Phasor_setPhase(Phasor *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->phase);
@@ -2930,15 +2930,15 @@ Phasor_setPhase(Phasor *self, PyObject *arg)
         self->phase_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
-static PyObject * 
-Phasor_reset(Phasor *self) 
+static PyObject *
+Phasor_reset(Phasor *self)
 {
     self->pointerPos = 0.0;
     Py_INCREF(Py_None);
@@ -3073,11 +3073,11 @@ Pointer_readframes_a(Pointer *self) {
     int i, ipart;
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *pha = Stream_getData((Stream *)self->index_stream);
 
     for (i=0; i<self->bufsize; i++) {
-        ph = Osc_clip(pha[i] * size, size);       
+        ph = Osc_clip(pha[i] * size, size);
         ipart = (int)ph;
         fpart = ph - ipart;
         self->data[i] = tablelist[ipart] + (tablelist[ipart+1] - tablelist[ipart]) * fpart;
@@ -3103,40 +3103,40 @@ Pointer_setProcMode(Pointer *self)
     self->proc_func_ptr = Pointer_readframes_a;
 
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Pointer_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Pointer_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Pointer_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Pointer_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Pointer_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Pointer_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Pointer_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Pointer_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Pointer_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 Pointer_compute_next_data_frame(Pointer *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3145,18 +3145,18 @@ Pointer_traverse(Pointer *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->table);
-    Py_VISIT(self->index);    
-    Py_VISIT(self->index_stream);    
+    Py_VISIT(self->index);
+    Py_VISIT(self->index_stream);
     return 0;
 }
 
-static int 
+static int
 Pointer_clear(Pointer *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->table);
-    Py_CLEAR(self->index);    
-    Py_CLEAR(self->index_stream);    
+    Py_CLEAR(self->index);
+    Py_CLEAR(self->index_stream);
     return 0;
 }
 
@@ -3175,49 +3175,49 @@ Pointer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *tabletmp, *indextmp, *multmp=NULL, *addtmp=NULL;
     Pointer *self;
     self = (Pointer *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Pointer_compute_next_data_frame);
     self->mode_func_ptr = Pointer_setProcMode;
 
     static char *kwlist[] = {"table", "index", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist, &tabletmp, &indextmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if ( PyObject_HasAttrString((PyObject *)tabletmp, "getTableStream") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"table\" argument of Pointer must be a PyoTableObject.\n");
         Py_RETURN_NONE;
     }
     Py_XDECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tabletmp, "getTableStream", "");
-    
+
     if (indextmp) {
         PyObject_CallMethod((PyObject *)self, "setIndex", "O", indextmp);
     }
 
     PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-  
+
     return (PyObject *)self;
 }
 
 static PyObject * Pointer_getServer(Pointer* self) { GET_SERVER };
 static PyObject * Pointer_getStream(Pointer* self) { GET_STREAM };
-static PyObject * Pointer_setMul(Pointer *self, PyObject *arg) { SET_MUL };	
-static PyObject * Pointer_setAdd(Pointer *self, PyObject *arg) { SET_ADD };	
-static PyObject * Pointer_setSub(Pointer *self, PyObject *arg) { SET_SUB };	
-static PyObject * Pointer_setDiv(Pointer *self, PyObject *arg) { SET_DIV };	
+static PyObject * Pointer_setMul(Pointer *self, PyObject *arg) { SET_MUL };
+static PyObject * Pointer_setAdd(Pointer *self, PyObject *arg) { SET_ADD };
+static PyObject * Pointer_setSub(Pointer *self, PyObject *arg) { SET_SUB };
+static PyObject * Pointer_setDiv(Pointer *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Pointer_play(Pointer *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Pointer_out(Pointer *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3243,36 +3243,36 @@ static PyObject *
 Pointer_setTable(Pointer *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Pointer_setIndex(Pointer *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	if (PyObject_HasAttrString((PyObject *)tmp, "server") == 0) {
         PyErr_SetString(PyExc_TypeError, "\"index\" argument of Pointer must be a PyoObject.\n");
         Py_RETURN_NONE;
 	}
-	
+
 	Py_INCREF(tmp);
 	Py_XDECREF(self->index);
 
@@ -3281,10 +3281,10 @@ Pointer_setIndex(Pointer *self, PyObject *arg)
     Py_INCREF(streamtmp);
     Py_XDECREF(self->index_stream);
     self->index_stream = (Stream *)streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Pointer_members[] = {
 {"server", T_OBJECT_EX, offsetof(Pointer, server), 0, "Pyo server."},
@@ -3422,12 +3422,12 @@ Pointer2_readframes_a(Pointer2 *self) {
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
     double tableSr = TableStream_getSamplingRate(self->table);
-    
+
     MYFLT *pha = Stream_getData((Stream *)self->index_stream);
 
     if (!self->autosmooth) {
         for (i=0; i<self->bufsize; i++) {
-            ph = Osc_clip(pha[i] * size, size);       
+            ph = Osc_clip(pha[i] * size, size);
             ipart = (int)ph;
             fpart = ph - ipart;
             self->y1 = self->y2 = self->data[i] = (*self->interp_func_ptr)(tablelist, ipart, fpart, size);
@@ -3473,40 +3473,40 @@ Pointer2_setProcMode(Pointer2 *self)
     self->proc_func_ptr = Pointer2_readframes_a;
 
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Pointer2_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Pointer2_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Pointer2_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Pointer2_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Pointer2_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Pointer2_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Pointer2_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Pointer2_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Pointer2_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 Pointer2_compute_next_data_frame(Pointer2 *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3515,18 +3515,18 @@ Pointer2_traverse(Pointer2 *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->table);
-    Py_VISIT(self->index);    
-    Py_VISIT(self->index_stream);    
+    Py_VISIT(self->index);
+    Py_VISIT(self->index_stream);
     return 0;
 }
 
-static int 
+static int
 Pointer2_clear(Pointer2 *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->table);
-    Py_CLEAR(self->index);    
-    Py_CLEAR(self->index_stream);    
+    Py_CLEAR(self->index);
+    Py_CLEAR(self->index_stream);
     return 0;
 }
 
@@ -3545,54 +3545,54 @@ Pointer2_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *tabletmp, *indextmp, *multmp=NULL, *addtmp=NULL;
     Pointer2 *self;
     self = (Pointer2 *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
     self->interp = 4;
     self->autosmooth = 1;
     self->y1 = self->y2 = self->c = self->lastPh = 0.0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Pointer2_compute_next_data_frame);
     self->mode_func_ptr = Pointer2_setProcMode;
 
     static char *kwlist[] = {"table", "index", "interp", "autosmooth", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|iiOO", kwlist, &tabletmp, &indextmp, &self->interp, &self->autosmooth, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if ( PyObject_HasAttrString((PyObject *)tabletmp, "getTableStream") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"table\" argument of Pointer2 must be a PyoTableObject.\n");
         Py_RETURN_NONE;
     }
     Py_XDECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tabletmp, "getTableStream", "");
-    
+
     if (indextmp) {
         PyObject_CallMethod((PyObject *)self, "setIndex", "O", indextmp);
     }
 
     PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-  
+
     SET_INTERP_POINTER
-  
+
     return (PyObject *)self;
 }
 
 static PyObject * Pointer2_getServer(Pointer2* self) { GET_SERVER };
 static PyObject * Pointer2_getStream(Pointer2* self) { GET_STREAM };
-static PyObject * Pointer2_setMul(Pointer2 *self, PyObject *arg) { SET_MUL };	
-static PyObject * Pointer2_setAdd(Pointer2 *self, PyObject *arg) { SET_ADD };	
-static PyObject * Pointer2_setSub(Pointer2 *self, PyObject *arg) { SET_SUB };	
-static PyObject * Pointer2_setDiv(Pointer2 *self, PyObject *arg) { SET_DIV };	
+static PyObject * Pointer2_setMul(Pointer2 *self, PyObject *arg) { SET_MUL };
+static PyObject * Pointer2_setAdd(Pointer2 *self, PyObject *arg) { SET_ADD };
+static PyObject * Pointer2_setSub(Pointer2 *self, PyObject *arg) { SET_SUB };
+static PyObject * Pointer2_setDiv(Pointer2 *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Pointer2_play(Pointer2 *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Pointer2_out(Pointer2 *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3618,36 +3618,36 @@ static PyObject *
 Pointer2_setTable(Pointer2 *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Pointer2_setIndex(Pointer2 *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	if (PyObject_HasAttrString((PyObject *)tmp, "server") == 0) {
         PyErr_SetString(PyExc_TypeError, "\"index\" argument of Pointer2 must be a PyoObject.\n");
         Py_RETURN_NONE;
 	}
-	
+
 	Py_INCREF(tmp);
 	Py_XDECREF(self->index);
 
@@ -3656,10 +3656,10 @@ Pointer2_setIndex(Pointer2 *self, PyObject *arg)
     Py_INCREF(streamtmp);
     Py_XDECREF(self->index_stream);
     self->index_stream = (Stream *)streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Pointer2_setInterp(Pointer2 *self, PyObject *arg)
@@ -3668,15 +3668,15 @@ Pointer2_setInterp(Pointer2 *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     int isNumber = PyNumber_Check(arg);
-    
+
 	if (isNumber == 1) {
 		self->interp = PyInt_AsLong(PyNumber_Int(arg));
-    }  
-    
+    }
+
     SET_INTERP_POINTER
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -3688,12 +3688,12 @@ Pointer2_setAutoSmooth(Pointer2 *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     int isNumber = PyNumber_Check(arg);
-    
+
 	if (isNumber == 1) {
 		self->autosmooth = PyInt_AsLong(PyNumber_Int(arg));
-    }  
+    }
 
     Py_INCREF(Py_None);
     return Py_None;
@@ -3827,16 +3827,16 @@ TableIndex_readframes_a(TableIndex *self) {
     int i, ind;
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *phase = Stream_getData((Stream *)self->index_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         ind = (int)phase[i];
         if (ind < 0)
             ind = 0;
         else if (ind >= size)
             ind = size - 1;
-        
+
         self->data[i] = tablelist[ind];
     }
 }
@@ -3856,44 +3856,44 @@ TableIndex_setProcMode(TableIndex *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = TableIndex_readframes_a;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TableIndex_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TableIndex_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TableIndex_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TableIndex_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TableIndex_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TableIndex_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TableIndex_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TableIndex_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TableIndex_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 TableIndex_compute_next_data_frame(TableIndex *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3902,18 +3902,18 @@ TableIndex_traverse(TableIndex *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->table);
-    Py_VISIT(self->index);    
-    Py_VISIT(self->index_stream);    
+    Py_VISIT(self->index);
+    Py_VISIT(self->index_stream);
     return 0;
 }
 
-static int 
+static int
 TableIndex_clear(TableIndex *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->table);
-    Py_CLEAR(self->index);    
-    Py_CLEAR(self->index_stream);    
+    Py_CLEAR(self->index);
+    Py_CLEAR(self->index_stream);
     return 0;
 }
 
@@ -3932,49 +3932,49 @@ TableIndex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *tabletmp, *indextmp, *multmp=NULL, *addtmp=NULL;
     TableIndex *self;
     self = (TableIndex *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TableIndex_compute_next_data_frame);
     self->mode_func_ptr = TableIndex_setProcMode;
 
     static char *kwlist[] = {"table", "index", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist, &tabletmp, &indextmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if ( PyObject_HasAttrString((PyObject *)tabletmp, "getTableStream") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"table\" argument of TableIndex must be a PyoTableObject.\n");
         Py_RETURN_NONE;
     }
     Py_XDECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tabletmp, "getTableStream", "");
-    
+
     if (indextmp) {
         PyObject_CallMethod((PyObject *)self, "setIndex", "O", indextmp);
     }
-    
+
     PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * TableIndex_getServer(TableIndex* self) { GET_SERVER };
 static PyObject * TableIndex_getStream(TableIndex* self) { GET_STREAM };
-static PyObject * TableIndex_setMul(TableIndex *self, PyObject *arg) { SET_MUL };	
-static PyObject * TableIndex_setAdd(TableIndex *self, PyObject *arg) { SET_ADD };	
-static PyObject * TableIndex_setSub(TableIndex *self, PyObject *arg) { SET_SUB };	
-static PyObject * TableIndex_setDiv(TableIndex *self, PyObject *arg) { SET_DIV };	
+static PyObject * TableIndex_setMul(TableIndex *self, PyObject *arg) { SET_MUL };
+static PyObject * TableIndex_setAdd(TableIndex *self, PyObject *arg) { SET_ADD };
+static PyObject * TableIndex_setSub(TableIndex *self, PyObject *arg) { SET_SUB };
+static PyObject * TableIndex_setDiv(TableIndex *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TableIndex_play(TableIndex *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TableIndex_out(TableIndex *self, PyObject *args, PyObject *kwds) { OUT };
@@ -4000,48 +4000,48 @@ static PyObject *
 TableIndex_setTable(TableIndex *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TableIndex_setIndex(TableIndex *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	if (PyObject_HasAttrString((PyObject *)tmp, "server") == 0) {
         PyErr_SetString(PyExc_TypeError, "\"index\" argument of TableIndex must be a PyoObject.\n");
         Py_RETURN_NONE;
 	}
-	
+
 	Py_INCREF(tmp);
 	Py_XDECREF(self->index);
-    
+
     self->index = tmp;
     streamtmp = PyObject_CallMethod((PyObject *)self->index, "_getStream", NULL);
     Py_INCREF(streamtmp);
     Py_XDECREF(self->index_stream);
     self->index_stream = (Stream *)streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef TableIndex_members[] = {
     {"server", T_OBJECT_EX, offsetof(TableIndex, server), 0, "Pyo server."},
@@ -4180,14 +4180,14 @@ Lookup_readframes_a(Lookup *self) {
     int i, ipart;
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *pha = Stream_getData((Stream *)self->index_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
-        ph = (Lookup_clip(pha[i]) * 0.5 + 0.5) * size;   
+        ph = (Lookup_clip(pha[i]) * 0.495 + 0.5) * size;
         ipart = (int)ph;
         fpart = ph - ipart;
-        self->data[i] = tablelist[ipart] * (1.0 - fpart) + tablelist[ipart+1] * fpart;
+        self->data[i] = tablelist[ipart] + (tablelist[ipart+1] - tablelist[ipart]) * fpart;
     }
 }
 
@@ -4206,44 +4206,44 @@ Lookup_setProcMode(Lookup *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = Lookup_readframes_a;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Lookup_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Lookup_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Lookup_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Lookup_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Lookup_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Lookup_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Lookup_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Lookup_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Lookup_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 Lookup_compute_next_data_frame(Lookup *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -4252,18 +4252,18 @@ Lookup_traverse(Lookup *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->table);
-    Py_VISIT(self->index);    
-    Py_VISIT(self->index_stream);    
+    Py_VISIT(self->index);
+    Py_VISIT(self->index_stream);
     return 0;
 }
 
-static int 
+static int
 Lookup_clear(Lookup *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->table);
-    Py_CLEAR(self->index);    
-    Py_CLEAR(self->index_stream);    
+    Py_CLEAR(self->index);
+    Py_CLEAR(self->index_stream);
     return 0;
 }
 
@@ -4282,49 +4282,49 @@ Lookup_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *tabletmp, *indextmp, *multmp=NULL, *addtmp=NULL;
     Lookup *self;
     self = (Lookup *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Lookup_compute_next_data_frame);
     self->mode_func_ptr = Lookup_setProcMode;
 
     static char *kwlist[] = {"table", "index", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist, &tabletmp, &indextmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if ( PyObject_HasAttrString((PyObject *)tabletmp, "getTableStream") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"table\" argument of Lookup must be a PyoTableObject.\n");
         Py_RETURN_NONE;
     }
     Py_XDECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tabletmp, "getTableStream", "");
-    
+
     if (indextmp) {
         PyObject_CallMethod((PyObject *)self, "setIndex", "O", indextmp);
     }
-    
+
     PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-     
+
     return (PyObject *)self;
 }
 
 static PyObject * Lookup_getServer(Lookup* self) { GET_SERVER };
 static PyObject * Lookup_getStream(Lookup* self) { GET_STREAM };
-static PyObject * Lookup_setMul(Lookup *self, PyObject *arg) { SET_MUL };	
-static PyObject * Lookup_setAdd(Lookup *self, PyObject *arg) { SET_ADD };	
-static PyObject * Lookup_setSub(Lookup *self, PyObject *arg) { SET_SUB };	
-static PyObject * Lookup_setDiv(Lookup *self, PyObject *arg) { SET_DIV };	
+static PyObject * Lookup_setMul(Lookup *self, PyObject *arg) { SET_MUL };
+static PyObject * Lookup_setAdd(Lookup *self, PyObject *arg) { SET_ADD };
+static PyObject * Lookup_setSub(Lookup *self, PyObject *arg) { SET_SUB };
+static PyObject * Lookup_setDiv(Lookup *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Lookup_play(Lookup *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Lookup_out(Lookup *self, PyObject *args, PyObject *kwds) { OUT };
@@ -4350,30 +4350,30 @@ static PyObject *
 Lookup_setTable(Lookup *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Lookup_setIndex(Lookup *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	if (PyObject_HasAttrString((PyObject *)tmp, "server") == 0) {
         PyErr_SetString(PyExc_TypeError, "\"index\" argument of Lookup must be a PyoObject.\n");
@@ -4382,16 +4382,16 @@ Lookup_setIndex(Lookup *self, PyObject *arg)
 
 	Py_INCREF(tmp);
 	Py_XDECREF(self->index);
-    
+
     self->index = tmp;
     streamtmp = PyObject_CallMethod((PyObject *)self->index, "_getStream", NULL);
     Py_INCREF(streamtmp);
     Py_XDECREF(self->index_stream);
     self->index_stream = (Stream *)streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Lookup_members[] = {
 {"server", T_OBJECT_EX, offsetof(Lookup, server), 0, "Pyo server."},
@@ -4531,13 +4531,13 @@ Pulsar_readframes_iii(Pulsar *self) {
     MYFLT *envlist = TableStream_getData(self->env);
     int size = TableStream_getSize(self->table);
     int envsize = TableStream_getSize(self->env);
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     ph = PyFloat_AS_DOUBLE(self->phase);
     frac = _clip(PyFloat_AS_DOUBLE(self->frac));
     invfrac = 1.0 / frac;
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->pointerPos += inc;
         if (self->pointerPos < 0)
@@ -4553,15 +4553,15 @@ Pulsar_readframes_iii(Pulsar *self) {
             ipart = (int)t_pos;
             fpart = t_pos - ipart;
             tmp = (*self->interp_func_ptr)(tablelist, ipart, fpart, size);
-            
+
             e_pos = scl_pos * envsize;
             ipart = (int)e_pos;
             fpart = e_pos - ipart;
             self->data[i] = tmp * (envlist[ipart] * (1.0 - fpart) + envlist[ipart+1] * fpart);
-        }    
+        }
         else {
             self->data[i] = 0.0;
-        }    
+        }
     }
 }
 
@@ -4574,12 +4574,12 @@ Pulsar_readframes_aii(Pulsar *self) {
     MYFLT *envlist = TableStream_getData(self->env);
     int size = TableStream_getSize(self->table);
     int envsize = TableStream_getSize(self->env);
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     ph = PyFloat_AS_DOUBLE(self->phase);
     frac = _clip(PyFloat_AS_DOUBLE(self->frac));
     invfrac = 1.0 / frac;
-    
+
     oneOnSr = 1.0 / self->sr;
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] * oneOnSr;
@@ -4597,15 +4597,15 @@ Pulsar_readframes_aii(Pulsar *self) {
             ipart = (int)t_pos;
             fpart = t_pos - ipart;
             tmp = (*self->interp_func_ptr)(tablelist, ipart, fpart, size);
-            
+
             e_pos = scl_pos * envsize;
             ipart = (int)e_pos;
             fpart = e_pos - ipart;
             self->data[i] = tmp * (envlist[ipart] * (1.0 - fpart) + envlist[ipart+1] * fpart);
-        }    
+        }
         else {
             self->data[i] = 0.0;
-        }    
+        }
     }
 }
 
@@ -4618,13 +4618,13 @@ Pulsar_readframes_iai(Pulsar *self) {
     MYFLT *envlist = TableStream_getData(self->env);
     int size = TableStream_getSize(self->table);
     int envsize = TableStream_getSize(self->env);
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *ph = Stream_getData((Stream *)self->phase_stream);
     frac = _clip(PyFloat_AS_DOUBLE(self->frac));
     invfrac = 1.0 / frac;
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->pointerPos += inc;
         if (self->pointerPos < 0)
@@ -4640,15 +4640,15 @@ Pulsar_readframes_iai(Pulsar *self) {
             ipart = (int)t_pos;
             fpart = t_pos - ipart;
             tmp = (*self->interp_func_ptr)(tablelist, ipart, fpart, size);
-            
+
             e_pos = scl_pos * envsize;
             ipart = (int)e_pos;
             fpart = e_pos - ipart;
             self->data[i] = tmp * (envlist[ipart] * (1.0 - fpart) + envlist[ipart+1] * fpart);
-        }    
+        }
         else {
             self->data[i] = 0.0;
-        }    
+        }
     }
 }
 
@@ -4661,12 +4661,12 @@ Pulsar_readframes_aai(Pulsar *self) {
     MYFLT *envlist = TableStream_getData(self->env);
     int size = TableStream_getSize(self->table);
     int envsize = TableStream_getSize(self->env);
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT *ph = Stream_getData((Stream *)self->phase_stream);
     frac = _clip(PyFloat_AS_DOUBLE(self->frac));
     invfrac = 1.0 / frac;
-    
+
     oneOnSr = 1.0 / self->sr;
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] * oneOnSr;
@@ -4684,15 +4684,15 @@ Pulsar_readframes_aai(Pulsar *self) {
             ipart = (int)t_pos;
             fpart = t_pos - ipart;
             tmp = (*self->interp_func_ptr)(tablelist, ipart, fpart, size);
-            
+
             e_pos = scl_pos * envsize;
             ipart = (int)e_pos;
             fpart = e_pos - ipart;
             self->data[i] = tmp * (envlist[ipart] * (1.0 - fpart) + envlist[ipart+1] * fpart);
-        }    
+        }
         else {
             self->data[i] = 0.0;
-        }    
+        }
     }
 }
 
@@ -4705,12 +4705,12 @@ Pulsar_readframes_iia(Pulsar *self) {
     MYFLT *envlist = TableStream_getData(self->env);
     int size = TableStream_getSize(self->table);
     int envsize = TableStream_getSize(self->env);
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     ph = PyFloat_AS_DOUBLE(self->phase);
     MYFLT *frac = Stream_getData((Stream *)self->frac_stream);
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         curfrac = frac[i];
         self->pointerPos += inc;
@@ -4727,15 +4727,15 @@ Pulsar_readframes_iia(Pulsar *self) {
             ipart = (int)t_pos;
             fpart = t_pos - ipart;
             tmp = (*self->interp_func_ptr)(tablelist, ipart, fpart, size);
-            
+
             e_pos = scl_pos * envsize;
             ipart = (int)e_pos;
             fpart = e_pos - ipart;
             self->data[i] = tmp * (envlist[ipart] * (1.0 - fpart) + envlist[ipart+1] * fpart);
-        }    
+        }
         else {
             self->data[i] = 0.0;
-        }    
+        }
     }
 }
 
@@ -4748,11 +4748,11 @@ Pulsar_readframes_aia(Pulsar *self) {
     MYFLT *envlist = TableStream_getData(self->env);
     int size = TableStream_getSize(self->table);
     int envsize = TableStream_getSize(self->env);
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     ph = PyFloat_AS_DOUBLE(self->phase);
     MYFLT *frac = Stream_getData((Stream *)self->frac_stream);
-    
+
     oneOnSr = 1.0 / self->sr;
     for (i=0; i<self->bufsize; i++) {
         curfrac = frac[i];
@@ -4771,15 +4771,15 @@ Pulsar_readframes_aia(Pulsar *self) {
             ipart = (int)t_pos;
             fpart = t_pos - ipart;
             tmp = (*self->interp_func_ptr)(tablelist, ipart, fpart, size);
-            
+
             e_pos = scl_pos * envsize;
             ipart = (int)e_pos;
             fpart = e_pos - ipart;
             self->data[i] = tmp * (envlist[ipart] * (1.0 - fpart) + envlist[ipart+1] * fpart);
-        }    
+        }
         else {
             self->data[i] = 0.0;
-        }    
+        }
     }
 }
 
@@ -4792,12 +4792,12 @@ Pulsar_readframes_iaa(Pulsar *self) {
     MYFLT *envlist = TableStream_getData(self->env);
     int size = TableStream_getSize(self->table);
     int envsize = TableStream_getSize(self->env);
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *ph = Stream_getData((Stream *)self->phase_stream);
     MYFLT *frac = Stream_getData((Stream *)self->frac_stream);
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         curfrac = frac[i];
         self->pointerPos += inc;
@@ -4814,15 +4814,15 @@ Pulsar_readframes_iaa(Pulsar *self) {
             ipart = (int)t_pos;
             fpart = t_pos - ipart;
             tmp = (*self->interp_func_ptr)(tablelist, ipart, fpart, size);
-            
+
             e_pos = scl_pos * envsize;
             ipart = (int)e_pos;
             fpart = e_pos - ipart;
             self->data[i] = tmp * (envlist[ipart] * (1.0 - fpart) + envlist[ipart+1] * fpart);
-        }    
+        }
         else {
             self->data[i] = 0.0;
-        }    
+        }
     }
 }
 
@@ -4835,11 +4835,11 @@ Pulsar_readframes_aaa(Pulsar *self) {
     MYFLT *envlist = TableStream_getData(self->env);
     int size = TableStream_getSize(self->table);
     int envsize = TableStream_getSize(self->env);
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT *ph = Stream_getData((Stream *)self->phase_stream);
     MYFLT *frac = Stream_getData((Stream *)self->frac_stream);
-    
+
     oneOnSr = 1.0 / self->sr;
     for (i=0; i<self->bufsize; i++) {
         curfrac = frac[i];
@@ -4858,15 +4858,15 @@ Pulsar_readframes_aaa(Pulsar *self) {
             ipart = (int)t_pos;
             fpart = t_pos - ipart;
             tmp = (*self->interp_func_ptr)(tablelist, ipart, fpart, size);
-            
+
             e_pos = scl_pos * envsize;
             ipart = (int)e_pos;
             fpart = e_pos - ipart;
             self->data[i] = tmp * (envlist[ipart] * (1.0 - fpart) + envlist[ipart+1] * fpart);
-        }    
+        }
         else {
             self->data[i] = 0.0;
-        }    
+        }
     }
 }
 
@@ -4886,68 +4886,68 @@ Pulsar_setProcMode(Pulsar *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10 + self->modebuffer[4] * 100;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = Pulsar_readframes_iii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Pulsar_readframes_aii;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Pulsar_readframes_iai;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Pulsar_readframes_aai;
             break;
-        case 100:        
+        case 100:
             self->proc_func_ptr = Pulsar_readframes_iia;
             break;
-        case 101:    
+        case 101:
             self->proc_func_ptr = Pulsar_readframes_aia;
             break;
-        case 110:        
+        case 110:
             self->proc_func_ptr = Pulsar_readframes_iaa;
             break;
-        case 111:    
+        case 111:
             self->proc_func_ptr = Pulsar_readframes_aaa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Pulsar_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Pulsar_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Pulsar_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Pulsar_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Pulsar_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Pulsar_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Pulsar_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Pulsar_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Pulsar_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 Pulsar_compute_next_data_frame(Pulsar *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -4957,26 +4957,26 @@ Pulsar_traverse(Pulsar *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->table);
     Py_VISIT(self->env);
-    Py_VISIT(self->phase);    
-    Py_VISIT(self->phase_stream);    
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->frac);    
+    Py_VISIT(self->phase);
+    Py_VISIT(self->phase_stream);
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->frac);
     Py_VISIT(self->frac_stream);
     return 0;
 }
 
-static int 
+static int
 Pulsar_clear(Pulsar *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->table);
     Py_CLEAR(self->env);
-    Py_CLEAR(self->phase);    
-    Py_CLEAR(self->phase_stream);    
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->frac);    
+    Py_CLEAR(self->phase);
+    Py_CLEAR(self->phase_stream);
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->frac);
     Py_CLEAR(self->frac_stream);
     return 0;
 }
@@ -4996,7 +4996,7 @@ Pulsar_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *tabletmp, *envtmp, *freqtmp=NULL, *phasetmp=NULL, *fractmp=NULL, *multmp=NULL, *addtmp=NULL;
     Pulsar *self;
     self = (Pulsar *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(100);
     self->phase = PyFloat_FromDouble(0);
     self->frac = PyFloat_FromDouble(0.5);
@@ -5007,16 +5007,16 @@ Pulsar_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[3] = 0;
 	self->modebuffer[4] = 0;
     self->pointerPos = 0.;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Pulsar_compute_next_data_frame);
     self->mode_func_ptr = Pulsar_setProcMode;
 
     static char *kwlist[] = {"table", "env", "freq", "frac", "phase", "interp", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OOOiOO", kwlist, &tabletmp, &envtmp, &freqtmp, &fractmp, &phasetmp, &self->interp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if ( PyObject_HasAttrString((PyObject *)tabletmp, "getTableStream") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"table\" argument of Pulsar must be a PyoTableObject.\n");
         Py_RETURN_NONE;
@@ -5034,7 +5034,7 @@ Pulsar_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (phasetmp) {
         PyObject_CallMethod((PyObject *)self, "setPhase", "O", phasetmp);
     }
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
@@ -5042,30 +5042,30 @@ Pulsar_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (fractmp) {
         PyObject_CallMethod((PyObject *)self, "setFrac", "O", fractmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     SET_INTERP_POINTER
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Pulsar_getServer(Pulsar* self) { GET_SERVER };
 static PyObject * Pulsar_getStream(Pulsar* self) { GET_STREAM };
-static PyObject * Pulsar_setMul(Pulsar *self, PyObject *arg) { SET_MUL };	
-static PyObject * Pulsar_setAdd(Pulsar *self, PyObject *arg) { SET_ADD };	
-static PyObject * Pulsar_setSub(Pulsar *self, PyObject *arg) { SET_SUB };	
-static PyObject * Pulsar_setDiv(Pulsar *self, PyObject *arg) { SET_DIV };	
+static PyObject * Pulsar_setMul(Pulsar *self, PyObject *arg) { SET_MUL };
+static PyObject * Pulsar_setAdd(Pulsar *self, PyObject *arg) { SET_ADD };
+static PyObject * Pulsar_setSub(Pulsar *self, PyObject *arg) { SET_SUB };
+static PyObject * Pulsar_setDiv(Pulsar *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Pulsar_play(Pulsar *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Pulsar_out(Pulsar *self, PyObject *args, PyObject *kwds) { OUT };
@@ -5098,50 +5098,50 @@ static PyObject *
 Pulsar_setTable(Pulsar *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Pulsar_setEnv(Pulsar *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->env);
     self->env = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Pulsar_setFreq(Pulsar *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -5157,25 +5157,25 @@ Pulsar_setFreq(Pulsar *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Pulsar_setPhase(Pulsar *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->phase);
@@ -5191,25 +5191,25 @@ Pulsar_setPhase(Pulsar *self, PyObject *arg)
         self->phase_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Pulsar_setFrac(Pulsar *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->frac);
@@ -5225,12 +5225,12 @@ Pulsar_setFrac(Pulsar *self, PyObject *arg)
         self->frac_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Pulsar_setInterp(Pulsar *self, PyObject *arg)
@@ -5239,15 +5239,15 @@ Pulsar_setInterp(Pulsar *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     int isNumber = PyNumber_Check(arg);
-    
+
 	if (isNumber == 1) {
 		self->interp = PyInt_AsLong(PyNumber_Int(arg));
-    }  
-    
+    }
+
     SET_INTERP_POINTER
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -5383,7 +5383,7 @@ typedef struct {
     double pointerPos;
     MYFLT *trigsBuffer;
     TriggerStream *trig_stream;
-    int init;    
+    int init;
     int interp; /* 0 = default to 2, 1 = nointerp, 2 = linear, 3 = cos, 4 = cubic */
     MYFLT (*interp_func_ptr)(MYFLT *, int, MYFLT, int);
 } TableRead;
@@ -5394,10 +5394,10 @@ TableRead_readframes_i(TableRead *self) {
     int i, ipart;
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     inc = fr * size / self->sr;
-    
+
     if (self->go == 0)
         PyObject_CallMethod((PyObject *)self, "stop", NULL);
 
@@ -5409,7 +5409,7 @@ TableRead_readframes_i(TableRead *self) {
             else
                 self->init = 0;
             self->pointerPos = size + self->pointerPos;
-        }    
+        }
         else if (self->pointerPos >= size) {
             self->trigsBuffer[i] = 1.0;
             if (self->loop == 1)
@@ -5424,7 +5424,7 @@ TableRead_readframes_i(TableRead *self) {
         }
         else
             self->data[i] = 0.0;
-        
+
         self->pointerPos += inc;
     }
 }
@@ -5435,9 +5435,9 @@ TableRead_readframes_a(TableRead *self) {
     int i, ipart;
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     sizeOnSr = size / self->sr;
 
     if (self->go == 0)
@@ -5451,7 +5451,7 @@ TableRead_readframes_a(TableRead *self) {
             else
                 self->init = 0;
             self->pointerPos = size + self->pointerPos;
-        }    
+        }
         else if (self->pointerPos >= size) {
             self->trigsBuffer[i] = 1.0;
             if (self->loop == 1)
@@ -5463,10 +5463,10 @@ TableRead_readframes_a(TableRead *self) {
             ipart = (int)self->pointerPos;
             fpart = self->pointerPos - ipart;
             self->data[i] = (*self->interp_func_ptr)(tablelist, ipart, fpart, size);
-        }    
+        }
         else
             self->data[i] = 0.0;
-        
+
         inc = fr[i] * sizeOnSr;
         self->pointerPos += inc;
     }
@@ -5488,50 +5488,50 @@ TableRead_setProcMode(TableRead *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = TableRead_readframes_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = TableRead_readframes_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TableRead_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TableRead_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TableRead_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TableRead_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TableRead_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TableRead_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TableRead_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TableRead_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TableRead_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 TableRead_compute_next_data_frame(TableRead *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -5540,20 +5540,20 @@ TableRead_traverse(TableRead *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->table);
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->trig_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->trig_stream);
     return 0;
 }
 
-static int 
+static int
 TableRead_clear(TableRead *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->table);
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->trig_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->trig_stream);
     return 0;
 }
 
@@ -5574,7 +5574,7 @@ TableRead_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *tabletmp, *freqtmp=NULL, *multmp=NULL, *addtmp=NULL;
     TableRead *self;
     self = (TableRead *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(1);
     self->loop = 0;
     self->init = 1;
@@ -5583,16 +5583,16 @@ TableRead_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[2] = 0;
     self->pointerPos = 0.;
     self->interp = 2;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TableRead_compute_next_data_frame);
     self->mode_func_ptr = TableRead_setProcMode;
 
     static char *kwlist[] = {"table", "freq", "loop", "interp", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OiiOO", kwlist, &tabletmp, &freqtmp, &self->loop, &self->interp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if ( PyObject_HasAttrString((PyObject *)tabletmp, "getTableStream") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"table\" argument of TableRead must be a PyoTableObject.\n");
         Py_RETURN_NONE;
@@ -5603,65 +5603,65 @@ TableRead_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     self->trigsBuffer = (MYFLT *)realloc(self->trigsBuffer, self->bufsize * sizeof(MYFLT));
-    
+
     tablelist = TableStream_getData(self->table);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
         self->data[i] = tablelist[0];
-    }    
+    }
 
     MAKE_NEW_TRIGGER_STREAM(self->trig_stream, &TriggerStreamType, NULL);
     TriggerStream_setData(self->trig_stream, self->trigsBuffer);
-    
+
     (*self->mode_func_ptr)(self);
 
     SET_INTERP_POINTER
 
     self->init = 1;
-     
+
     return (PyObject *)self;
 }
 
 static PyObject * TableRead_getServer(TableRead* self) { GET_SERVER };
 static PyObject * TableRead_getStream(TableRead* self) { GET_STREAM };
 static PyObject * TableRead_getTriggerStream(TableRead* self) { GET_TRIGGER_STREAM };
-static PyObject * TableRead_setMul(TableRead *self, PyObject *arg) { SET_MUL };	
-static PyObject * TableRead_setAdd(TableRead *self, PyObject *arg) { SET_ADD };	
-static PyObject * TableRead_setSub(TableRead *self, PyObject *arg) { SET_SUB };	
-static PyObject * TableRead_setDiv(TableRead *self, PyObject *arg) { SET_DIV };	
+static PyObject * TableRead_setMul(TableRead *self, PyObject *arg) { SET_MUL };
+static PyObject * TableRead_setAdd(TableRead *self, PyObject *arg) { SET_ADD };
+static PyObject * TableRead_setSub(TableRead *self, PyObject *arg) { SET_SUB };
+static PyObject * TableRead_setDiv(TableRead *self, PyObject *arg) { SET_DIV };
 
-static PyObject * TableRead_play(TableRead *self, PyObject *args, PyObject *kwds) 
-{ 
+static PyObject * TableRead_play(TableRead *self, PyObject *args, PyObject *kwds)
+{
     self->pointerPos = 0.0;
     self->init = 1;
     self->go = 1;
-    PLAY 
+    PLAY
 };
 
-static PyObject * TableRead_out(TableRead *self, PyObject *args, PyObject *kwds) 
-{ 
+static PyObject * TableRead_out(TableRead *self, PyObject *args, PyObject *kwds)
+{
     self->pointerPos = 0.0;
     self->init = 1;
     self->go = 1;
-    OUT 
+    OUT
 };
-static PyObject * TableRead_stop(TableRead *self) 
-{ 
+static PyObject * TableRead_stop(TableRead *self)
+{
     self->go = 0;
-    STOP 
+    STOP
 };
 
 static PyObject * TableRead_multiply(TableRead *self, PyObject *arg) { MULTIPLY };
@@ -5684,32 +5684,32 @@ static PyObject *
 TableRead_setTable(TableRead *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TableRead_setFreq(TableRead *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -5725,12 +5725,12 @@ TableRead_setFreq(TableRead *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TableRead_setLoop(TableRead *self, PyObject *arg)
@@ -5739,9 +5739,9 @@ TableRead_setLoop(TableRead *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->loop = PyInt_AsLong(arg);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -5753,21 +5753,21 @@ TableRead_setInterp(TableRead *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     int isNumber = PyNumber_Check(arg);
-    
+
 	if (isNumber == 1) {
 		self->interp = PyInt_AsLong(PyNumber_Int(arg));
-    }  
-    
+    }
+
     SET_INTERP_POINTER
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
-static PyObject * 
-TableRead_reset(TableRead *self) 
+static PyObject *
+TableRead_reset(TableRead *self)
 {
     self->pointerPos = 0.0;
     Py_INCREF(Py_None);
@@ -5910,22 +5910,22 @@ static void
 Fm_readframes_iii(Fm *self) {
     MYFLT mod_freq, mod_amp, mod_delta, mod_val, car_freq, car_delta, fpart;
     int i, ipart;
-    
+
     MYFLT car = PyFloat_AS_DOUBLE(self->car);
     MYFLT rat = PyFloat_AS_DOUBLE(self->ratio);
     MYFLT ind = PyFloat_AS_DOUBLE(self->index);
-    
+
     mod_freq = car * rat;
     mod_amp = mod_freq * ind;
     mod_delta = mod_freq * self->scaleFactor;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->pointerPos_mod = Sine_clip(self->pointerPos_mod);
         ipart = (int)self->pointerPos_mod;
         fpart = self->pointerPos_mod - ipart;
         mod_val = mod_amp * (SINE_ARRAY[ipart] * (1.0 - fpart) + SINE_ARRAY[ipart+1] * fpart);
         self->pointerPos_mod += mod_delta;
-        
+
         car_freq = car + mod_val;
         car_delta = car_freq * self->scaleFactor;
         self->pointerPos_car = Sine_clip(self->pointerPos_car);
@@ -5940,7 +5940,7 @@ static void
 Fm_readframes_aii(Fm *self) {
     MYFLT mod_freq, mod_amp, mod_delta, mod_val, car_freq, car_delta, fpart;
     int i, ipart;
-    
+
     MYFLT *car = Stream_getData((Stream *)self->car_stream);
     MYFLT rat = PyFloat_AS_DOUBLE(self->ratio);
     MYFLT ind = PyFloat_AS_DOUBLE(self->index);
@@ -5954,7 +5954,7 @@ Fm_readframes_aii(Fm *self) {
         fpart = self->pointerPos_mod - ipart;
         mod_val = mod_amp * (SINE_ARRAY[ipart] * (1.0 - fpart) + SINE_ARRAY[ipart+1] * fpart);
         self->pointerPos_mod += mod_delta;
-        
+
         car_freq = car[i] + mod_val;
         car_delta = car_freq * self->scaleFactor;
         self->pointerPos_car = Sine_clip(self->pointerPos_car);
@@ -5969,7 +5969,7 @@ static void
 Fm_readframes_iai(Fm *self) {
     MYFLT mod_freq, mod_amp, mod_delta, mod_val, car_freq, car_delta, fpart;
     int i, ipart;
-    
+
     MYFLT car = PyFloat_AS_DOUBLE(self->car);
     MYFLT *rat = Stream_getData((Stream *)self->ratio_stream);
     MYFLT ind = PyFloat_AS_DOUBLE(self->index);
@@ -5983,7 +5983,7 @@ Fm_readframes_iai(Fm *self) {
         fpart = self->pointerPos_mod - ipart;
         mod_val = mod_amp * (SINE_ARRAY[ipart] * (1.0 - fpart) + SINE_ARRAY[ipart+1] * fpart);
         self->pointerPos_mod += mod_delta;
-        
+
         car_freq = car + mod_val;
         car_delta = car_freq * self->scaleFactor;
         self->pointerPos_car = Sine_clip(self->pointerPos_car);
@@ -5998,7 +5998,7 @@ static void
 Fm_readframes_aai(Fm *self) {
     MYFLT mod_freq, mod_amp, mod_delta, mod_val, car_freq, car_delta, fpart;
     int i, ipart;
-    
+
     MYFLT *car = Stream_getData((Stream *)self->car_stream);
     MYFLT *rat = Stream_getData((Stream *)self->ratio_stream);
     MYFLT ind = PyFloat_AS_DOUBLE(self->index);
@@ -6012,7 +6012,7 @@ Fm_readframes_aai(Fm *self) {
         fpart = self->pointerPos_mod - ipart;
         mod_val = mod_amp * (SINE_ARRAY[ipart] * (1.0 - fpart) + SINE_ARRAY[ipart+1] * fpart);
         self->pointerPos_mod += mod_delta;
-        
+
         car_freq = car[i] + mod_val;
         car_delta = car_freq * self->scaleFactor;
         self->pointerPos_car = Sine_clip(self->pointerPos_car);
@@ -6026,14 +6026,14 @@ static void
 Fm_readframes_iia(Fm *self) {
     MYFLT mod_freq, mod_amp, mod_delta, mod_val, car_freq, car_delta, fpart;
     int i, ipart;
-    
+
     MYFLT car = PyFloat_AS_DOUBLE(self->car);
     MYFLT rat = PyFloat_AS_DOUBLE(self->ratio);
     MYFLT *ind = Stream_getData((Stream *)self->index_stream);
-    
+
     mod_freq = car * rat;
     mod_delta = mod_freq * self->scaleFactor;
-    
+
     for (i=0; i<self->bufsize; i++) {
         mod_amp = mod_freq * ind[i];
         self->pointerPos_mod = Sine_clip(self->pointerPos_mod);
@@ -6041,7 +6041,7 @@ Fm_readframes_iia(Fm *self) {
         fpart = self->pointerPos_mod - ipart;
         mod_val = mod_amp * (SINE_ARRAY[ipart] * (1.0 - fpart) + SINE_ARRAY[ipart+1] * fpart);
         self->pointerPos_mod += mod_delta;
-        
+
         car_freq = car + mod_val;
         car_delta = car_freq * self->scaleFactor;
         self->pointerPos_car = Sine_clip(self->pointerPos_car);
@@ -6056,11 +6056,11 @@ static void
 Fm_readframes_aia(Fm *self) {
     MYFLT mod_freq, mod_amp, mod_delta, mod_val, car_freq, car_delta, fpart;
     int i, ipart;
-    
+
     MYFLT *car = Stream_getData((Stream *)self->car_stream);
     MYFLT rat = PyFloat_AS_DOUBLE(self->ratio);
     MYFLT *ind = Stream_getData((Stream *)self->index_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         mod_freq = car[i] * rat;
         mod_amp = mod_freq * ind[i];
@@ -6070,7 +6070,7 @@ Fm_readframes_aia(Fm *self) {
         fpart = self->pointerPos_mod - ipart;
         mod_val = mod_amp * (SINE_ARRAY[ipart] * (1.0 - fpart) + SINE_ARRAY[ipart+1] * fpart);
         self->pointerPos_mod += mod_delta;
-        
+
         car_freq = car[i] + mod_val;
         car_delta = car_freq * self->scaleFactor;
         self->pointerPos_car = Sine_clip(self->pointerPos_car);
@@ -6085,11 +6085,11 @@ static void
 Fm_readframes_iaa(Fm *self) {
     MYFLT mod_freq, mod_amp, mod_delta, mod_val, car_freq, car_delta, fpart;
     int i, ipart;
-    
+
     MYFLT car = PyFloat_AS_DOUBLE(self->car);
     MYFLT *rat = Stream_getData((Stream *)self->ratio_stream);
     MYFLT *ind = Stream_getData((Stream *)self->index_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         mod_freq = car * rat[i];
         mod_amp = mod_freq * ind[i];
@@ -6099,7 +6099,7 @@ Fm_readframes_iaa(Fm *self) {
         fpart = self->pointerPos_mod - ipart;
         mod_val = mod_amp * (SINE_ARRAY[ipart] * (1.0 - fpart) + SINE_ARRAY[ipart+1] * fpart);
         self->pointerPos_mod += mod_delta;
-        
+
         car_freq = car + mod_val;
         car_delta = car_freq * self->scaleFactor;
         self->pointerPos_car = Sine_clip(self->pointerPos_car);
@@ -6114,11 +6114,11 @@ static void
 Fm_readframes_aaa(Fm *self) {
     MYFLT mod_freq, mod_amp, mod_delta, mod_val, car_freq, car_delta, fpart;
     int i, ipart;
-    
+
     MYFLT *car = Stream_getData((Stream *)self->car_stream);
     MYFLT *rat = Stream_getData((Stream *)self->ratio_stream);
     MYFLT *ind = Stream_getData((Stream *)self->index_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         mod_freq = car[i] * rat[i];
         mod_amp = mod_freq * ind[i];
@@ -6128,7 +6128,7 @@ Fm_readframes_aaa(Fm *self) {
         fpart = self->pointerPos_mod - ipart;
         mod_val = mod_amp * (SINE_ARRAY[ipart] * (1.0 - fpart) + SINE_ARRAY[ipart+1] * fpart);
         self->pointerPos_mod += mod_delta;
-        
+
         car_freq = car[i] + mod_val;
         car_delta = car_freq * self->scaleFactor;
         self->pointerPos_car = Sine_clip(self->pointerPos_car);
@@ -6155,60 +6155,60 @@ Fm_setProcMode(Fm *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10 + self->modebuffer[4] * 100;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = Fm_readframes_iii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Fm_readframes_aii;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = Fm_readframes_iai;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Fm_readframes_aai;
             break;
-        case 100:        
+        case 100:
             self->proc_func_ptr = Fm_readframes_iia;
             break;
-        case 101:    
+        case 101:
             self->proc_func_ptr = Fm_readframes_aia;
             break;
-        case 110:    
+        case 110:
             self->proc_func_ptr = Fm_readframes_iaa;
             break;
-        case 111:    
+        case 111:
             self->proc_func_ptr = Fm_readframes_aaa;
             break;
-    } 
-    
+    }
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Fm_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Fm_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Fm_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Fm_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Fm_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Fm_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Fm_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Fm_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Fm_postprocessing_revareva;
             break;
     }
@@ -6217,7 +6217,7 @@ Fm_setProcMode(Fm *self)
 static void
 Fm_compute_next_data_frame(Fm *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -6225,25 +6225,25 @@ static int
 Fm_traverse(Fm *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->car);    
-    Py_VISIT(self->car_stream);    
-    Py_VISIT(self->ratio);    
-    Py_VISIT(self->ratio_stream);    
-    Py_VISIT(self->index);    
-    Py_VISIT(self->index_stream);    
+    Py_VISIT(self->car);
+    Py_VISIT(self->car_stream);
+    Py_VISIT(self->ratio);
+    Py_VISIT(self->ratio_stream);
+    Py_VISIT(self->index);
+    Py_VISIT(self->index_stream);
     return 0;
 }
 
-static int 
+static int
 Fm_clear(Fm *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->car);    
-    Py_CLEAR(self->car_stream);    
-    Py_CLEAR(self->ratio);    
-    Py_CLEAR(self->ratio_stream);    
-    Py_CLEAR(self->index);    
-    Py_CLEAR(self->index_stream);    
+    Py_CLEAR(self->car);
+    Py_CLEAR(self->car_stream);
+    Py_CLEAR(self->ratio);
+    Py_CLEAR(self->ratio_stream);
+    Py_CLEAR(self->index);
+    Py_CLEAR(self->index_stream);
     return 0;
 }
 
@@ -6262,7 +6262,7 @@ Fm_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *cartmp=NULL, *ratiotmp=NULL, *indextmp=NULL, *multmp=NULL, *addtmp=NULL;
     Fm *self;
     self = (Fm *)type->tp_alloc(type, 0);
-    
+
     self->car = PyFloat_FromDouble(100);
     self->ratio = PyFloat_FromDouble(0.5);
     self->index = PyFloat_FromDouble(5);
@@ -6272,7 +6272,7 @@ Fm_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[3] = 0;
 	self->modebuffer[4] = 0;
     self->pointerPos_car = self->pointerPos_mod = 0.;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Fm_compute_next_data_frame);
     self->mode_func_ptr = Fm_setProcMode;
@@ -6280,14 +6280,14 @@ Fm_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->scaleFactor = 512.0 / self->sr;
 
     static char *kwlist[] = {"carrier", "ratio", "index", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOOOO", kwlist, &cartmp, &ratiotmp, &indextmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (cartmp) {
         PyObject_CallMethod((PyObject *)self, "setCarrier", "O", cartmp);
     }
-    
+
     if (ratiotmp) {
         PyObject_CallMethod((PyObject *)self, "setRatio", "O", ratiotmp);
     }
@@ -6295,17 +6295,17 @@ Fm_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (indextmp) {
         PyObject_CallMethod((PyObject *)self, "setIndex", "O", indextmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -6313,10 +6313,10 @@ Fm_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Fm_getServer(Fm* self) { GET_SERVER };
 static PyObject * Fm_getStream(Fm* self) { GET_STREAM };
-static PyObject * Fm_setMul(Fm *self, PyObject *arg) { SET_MUL };	
-static PyObject * Fm_setAdd(Fm *self, PyObject *arg) { SET_ADD };	
-static PyObject * Fm_setSub(Fm *self, PyObject *arg) { SET_SUB };	
-static PyObject * Fm_setDiv(Fm *self, PyObject *arg) { SET_DIV };	
+static PyObject * Fm_setMul(Fm *self, PyObject *arg) { SET_MUL };
+static PyObject * Fm_setAdd(Fm *self, PyObject *arg) { SET_ADD };
+static PyObject * Fm_setSub(Fm *self, PyObject *arg) { SET_SUB };
+static PyObject * Fm_setDiv(Fm *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Fm_play(Fm *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Fm_out(Fm *self, PyObject *args, PyObject *kwds) { OUT };
@@ -6335,14 +6335,14 @@ static PyObject *
 Fm_setCarrier(Fm *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->car);
@@ -6358,25 +6358,25 @@ Fm_setCarrier(Fm *self, PyObject *arg)
         self->car_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Fm_setRatio(Fm *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->ratio);
@@ -6392,25 +6392,25 @@ Fm_setRatio(Fm *self, PyObject *arg)
         self->ratio_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Fm_setIndex(Fm *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->index);
@@ -6426,12 +6426,12 @@ Fm_setIndex(Fm *self, PyObject *arg)
         self->index_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Fm_members[] = {
 {"server", T_OBJECT_EX, offsetof(Fm, server), 0, "Pyo server."},
@@ -6572,7 +6572,7 @@ CrossFm_readframes(CrossFm *self) {
     MYFLT rat[self->bufsize];
     MYFLT ind1[self->bufsize];
     MYFLT ind2[self->bufsize];
-    
+
     if (self->modebuffer[2] == 0) {
         MYFLT tmpcar = PyFloat_AS_DOUBLE(self->car);
         for (i=0; i<self->bufsize; i++) {
@@ -6585,7 +6585,7 @@ CrossFm_readframes(CrossFm *self) {
             car[i] = tmpcar[i];
         }
     }
-    
+
     if (self->modebuffer[3] == 0) {
         MYFLT tmprat = PyFloat_AS_DOUBLE(self->ratio);
         for (i=0; i<self->bufsize; i++) {
@@ -6598,26 +6598,26 @@ CrossFm_readframes(CrossFm *self) {
             rat[i] = tmprat[i];
         }
     }
-    
+
     if (self->modebuffer[4] == 0) {
         MYFLT tmpind1 = PyFloat_AS_DOUBLE(self->ind1);
         for (i=0; i<self->bufsize; i++) {
             ind1[i] = tmpind1;
         }
-    }   
+    }
     else {
         MYFLT *tmpind1 = Stream_getData((Stream *)self->ind1_stream);
         for (i=0; i<self->bufsize; i++) {
             ind1[i] = tmpind1[i];
         }
     }
-    
+
     if (self->modebuffer[5] == 0) {
         MYFLT tmpind2 = PyFloat_AS_DOUBLE(self->ind2);
         for (i=0; i<self->bufsize; i++) {
             ind2[i] = tmpind2;
         }
-    }   
+    }
     else {
         MYFLT *tmpind2 = Stream_getData((Stream *)self->ind2_stream);
         for (i=0; i<self->bufsize; i++) {
@@ -6635,7 +6635,7 @@ CrossFm_readframes(CrossFm *self) {
         fpart = self->pointerPos_mod - ipart;
         mod_val = SINE_ARRAY[ipart] * (1.0 - fpart) + SINE_ARRAY[ipart+1] * fpart;
         self->pointerPos_mod += mod_delta;
-        
+
         car_freq = car[i] + (mod_val * mod_amp);
         car_delta = car_freq * self->scaleFactor;
         self->pointerPos_car = Sine_clip(self->pointerPos_car);
@@ -6664,33 +6664,33 @@ CrossFm_setProcMode(CrossFm *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
     self->proc_func_ptr = CrossFm_readframes;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = CrossFm_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = CrossFm_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = CrossFm_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = CrossFm_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = CrossFm_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = CrossFm_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = CrossFm_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = CrossFm_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = CrossFm_postprocessing_revareva;
             break;
     }
@@ -6699,7 +6699,7 @@ CrossFm_setProcMode(CrossFm *self)
 static void
 CrossFm_compute_next_data_frame(CrossFm *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -6707,29 +6707,29 @@ static int
 CrossFm_traverse(CrossFm *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->car);    
-    Py_VISIT(self->car_stream);    
-    Py_VISIT(self->ratio);    
-    Py_VISIT(self->ratio_stream);    
-    Py_VISIT(self->ind1);    
-    Py_VISIT(self->ind1_stream);    
-    Py_VISIT(self->ind2);    
-    Py_VISIT(self->ind2_stream);    
+    Py_VISIT(self->car);
+    Py_VISIT(self->car_stream);
+    Py_VISIT(self->ratio);
+    Py_VISIT(self->ratio_stream);
+    Py_VISIT(self->ind1);
+    Py_VISIT(self->ind1_stream);
+    Py_VISIT(self->ind2);
+    Py_VISIT(self->ind2_stream);
     return 0;
 }
 
-static int 
+static int
 CrossFm_clear(CrossFm *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->car);    
-    Py_CLEAR(self->car_stream);    
-    Py_CLEAR(self->ratio);    
-    Py_CLEAR(self->ratio_stream);    
-    Py_CLEAR(self->ind1);    
-    Py_CLEAR(self->ind1_stream);    
-    Py_CLEAR(self->ind2);    
-    Py_CLEAR(self->ind2_stream);    
+    Py_CLEAR(self->car);
+    Py_CLEAR(self->car_stream);
+    Py_CLEAR(self->ratio);
+    Py_CLEAR(self->ratio_stream);
+    Py_CLEAR(self->ind1);
+    Py_CLEAR(self->ind1_stream);
+    Py_CLEAR(self->ind2);
+    Py_CLEAR(self->ind2_stream);
     return 0;
 }
 
@@ -6748,7 +6748,7 @@ CrossFm_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *cartmp=NULL, *ratiotmp=NULL, *ind1tmp=NULL, *ind2tmp=NULL, *multmp=NULL, *addtmp=NULL;
     CrossFm *self;
     self = (CrossFm *)type->tp_alloc(type, 0);
-    
+
     self->car = PyFloat_FromDouble(100);
     self->ratio = PyFloat_FromDouble(0.5);
     self->ind1 = PyFloat_FromDouble(2);
@@ -6761,26 +6761,26 @@ CrossFm_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[5] = 0;
     self->pointerPos_car = self->pointerPos_mod = 0.;
     self->car_val = 0.;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, CrossFm_compute_next_data_frame);
     self->mode_func_ptr = CrossFm_setProcMode;
-    
+
     self->scaleFactor = 512.0 / self->sr;
 
     static char *kwlist[] = {"carrier", "ratio", "ind1", "ind2", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOOOOO", kwlist, &cartmp, &ratiotmp, &ind1tmp, &ind2tmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (cartmp) {
         PyObject_CallMethod((PyObject *)self, "setCarrier", "O", cartmp);
     }
-    
+
     if (ratiotmp) {
         PyObject_CallMethod((PyObject *)self, "setRatio", "O", ratiotmp);
     }
-    
+
     if (ind1tmp) {
         PyObject_CallMethod((PyObject *)self, "setInd1", "O", ind1tmp);
     }
@@ -6788,28 +6788,28 @@ CrossFm_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (ind2tmp) {
         PyObject_CallMethod((PyObject *)self, "setInd2", "O", ind2tmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * CrossFm_getServer(CrossFm* self) { GET_SERVER };
 static PyObject * CrossFm_getStream(CrossFm* self) { GET_STREAM };
-static PyObject * CrossFm_setMul(CrossFm *self, PyObject *arg) { SET_MUL };	
-static PyObject * CrossFm_setAdd(CrossFm *self, PyObject *arg) { SET_ADD };	
-static PyObject * CrossFm_setSub(CrossFm *self, PyObject *arg) { SET_SUB };	
-static PyObject * CrossFm_setDiv(CrossFm *self, PyObject *arg) { SET_DIV };	
+static PyObject * CrossFm_setMul(CrossFm *self, PyObject *arg) { SET_MUL };
+static PyObject * CrossFm_setAdd(CrossFm *self, PyObject *arg) { SET_ADD };
+static PyObject * CrossFm_setSub(CrossFm *self, PyObject *arg) { SET_SUB };
+static PyObject * CrossFm_setDiv(CrossFm *self, PyObject *arg) { SET_DIV };
 
 static PyObject * CrossFm_play(CrossFm *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * CrossFm_out(CrossFm *self, PyObject *args, PyObject *kwds) { OUT };
@@ -6828,14 +6828,14 @@ static PyObject *
 CrossFm_setCarrier(CrossFm *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->car);
@@ -6851,25 +6851,25 @@ CrossFm_setCarrier(CrossFm *self, PyObject *arg)
         self->car_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 CrossFm_setRatio(CrossFm *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->ratio);
@@ -6885,25 +6885,25 @@ CrossFm_setRatio(CrossFm *self, PyObject *arg)
         self->ratio_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 CrossFm_setInd1(CrossFm *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->ind1);
@@ -6919,25 +6919,25 @@ CrossFm_setInd1(CrossFm *self, PyObject *arg)
         self->ind1_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 CrossFm_setInd2(CrossFm *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->ind2);
@@ -6953,12 +6953,12 @@ CrossFm_setInd2(CrossFm *self, PyObject *arg)
         self->ind2_stream = (Stream *)streamtmp;
 		self->modebuffer[5] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef CrossFm_members[] = {
     {"server", T_OBJECT_EX, offsetof(CrossFm, server), 0, "Pyo server."},
@@ -7084,14 +7084,14 @@ typedef struct {
     Stream *harms_stream;
     int modebuffer[4];
     MYFLT phase;
-    
+
 } Blit;
 
 static void
 Blit_readframes_ii(Blit *self) {
     MYFLT p, m, rate, val;
     int i, nHarms;
-    
+
     MYFLT freq = PyFloat_AS_DOUBLE(self->freq);
     MYFLT hrms = PyFloat_AS_DOUBLE(self->harms);
 
@@ -7119,13 +7119,13 @@ static void
 Blit_readframes_ai(Blit *self) {
     MYFLT p, m, rate, val;
     int i, nHarms;
-    
+
     MYFLT *freq = Stream_getData((Stream *)self->freq_stream);
     MYFLT hrms = PyFloat_AS_DOUBLE(self->harms);
 
     nHarms = (int)hrms;
     m = 2.0 * nHarms + 1.0;
-    
+
     for (i=0; i<self->bufsize; i++) {
         p = self->sr / freq[i];
         rate = PI / p;
@@ -7138,7 +7138,7 @@ Blit_readframes_ai(Blit *self) {
         self->phase += rate;
         if (self->phase >= PI)
             self->phase -= PI;
-        
+
         self->data[i] = val;
     }
 }
@@ -7147,13 +7147,13 @@ static void
 Blit_readframes_ia(Blit *self) {
     MYFLT p, m, rate, val;
     int i, nHarms;
-    
+
     MYFLT freq = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *hrms = Stream_getData((Stream *)self->harms_stream);
 
     p = self->sr / freq;
     rate = PI / p;
-    
+
     for (i=0; i<self->bufsize; i++) {
         nHarms = (int)hrms[i];
         m = 2.0 * nHarms + 1.0;
@@ -7166,7 +7166,7 @@ Blit_readframes_ia(Blit *self) {
         self->phase += rate;
         if (self->phase >= PI)
             self->phase -= PI;
-        
+
         self->data[i] = val;
     }
 }
@@ -7175,10 +7175,10 @@ static void
 Blit_readframes_aa(Blit *self) {
     MYFLT p, m, rate, val;
     int i, nHarms;
-    
+
     MYFLT *freq = Stream_getData((Stream *)self->freq_stream);
     MYFLT *hrms = Stream_getData((Stream *)self->harms_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         nHarms = (int)hrms[i];
         m = 2.0 * nHarms + 1.0;
@@ -7193,7 +7193,7 @@ Blit_readframes_aa(Blit *self) {
         self->phase += rate;
         if (self->phase >= PI)
             self->phase -= PI;
-        
+
         self->data[i] = val;
     }
 }
@@ -7214,48 +7214,48 @@ Blit_setProcMode(Blit *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = Blit_readframes_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Blit_readframes_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = Blit_readframes_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Blit_readframes_aa;
             break;
-    } 
-    
+    }
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Blit_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Blit_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Blit_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Blit_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Blit_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Blit_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Blit_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Blit_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Blit_postprocessing_revareva;
             break;
     }
@@ -7264,7 +7264,7 @@ Blit_setProcMode(Blit *self)
 static void
 Blit_compute_next_data_frame(Blit *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -7272,21 +7272,21 @@ static int
 Blit_traverse(Blit *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->harms);    
-    Py_VISIT(self->harms_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->harms);
+    Py_VISIT(self->harms_stream);
     return 0;
 }
 
-static int 
+static int
 Blit_clear(Blit *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->harms);    
-    Py_CLEAR(self->harms_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->harms);
+    Py_CLEAR(self->harms_stream);
     return 0;
 }
 
@@ -7305,7 +7305,7 @@ Blit_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *freqtmp=NULL, *harmstmp=NULL, *multmp=NULL, *addtmp=NULL;
     Blit *self;
     self = (Blit *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(100);
     self->harms = PyFloat_FromDouble(40);
 	self->modebuffer[0] = 0;
@@ -7313,20 +7313,20 @@ Blit_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
     self->phase = 0.0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Blit_compute_next_data_frame);
     self->mode_func_ptr = Blit_setProcMode;
 
     static char *kwlist[] = {"freq", "harms", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOOO", kwlist, &freqtmp, &harmstmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (harmstmp) {
         PyObject_CallMethod((PyObject *)self, "setHarms", "O", harmstmp);
     }
@@ -7334,13 +7334,13 @@ Blit_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -7348,10 +7348,10 @@ Blit_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Blit_getServer(Blit* self) { GET_SERVER };
 static PyObject * Blit_getStream(Blit* self) { GET_STREAM };
-static PyObject * Blit_setMul(Blit *self, PyObject *arg) { SET_MUL };	
-static PyObject * Blit_setAdd(Blit *self, PyObject *arg) { SET_ADD };	
-static PyObject * Blit_setSub(Blit *self, PyObject *arg) { SET_SUB };	
-static PyObject * Blit_setDiv(Blit *self, PyObject *arg) { SET_DIV };	
+static PyObject * Blit_setMul(Blit *self, PyObject *arg) { SET_MUL };
+static PyObject * Blit_setAdd(Blit *self, PyObject *arg) { SET_ADD };
+static PyObject * Blit_setSub(Blit *self, PyObject *arg) { SET_SUB };
+static PyObject * Blit_setDiv(Blit *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Blit_play(Blit *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Blit_out(Blit *self, PyObject *args, PyObject *kwds) { OUT };
@@ -7370,14 +7370,14 @@ static PyObject *
 Blit_setFreq(Blit *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -7393,25 +7393,25 @@ Blit_setFreq(Blit *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Blit_setHarms(Blit *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->harms);
@@ -7427,12 +7427,12 @@ Blit_setHarms(Blit *self, PyObject *arg)
         self->harms_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Blit_members[] = {
     {"server", T_OBJECT_EX, offsetof(Blit, server), 0, "Pyo server."},
@@ -7567,7 +7567,7 @@ static void
 Rossler_readframes_ii(Rossler *self) {
     MYFLT delta, pit, chao;
     int i;
-    
+
     pit = PyFloat_AS_DOUBLE(self->pitch);
     chao = PyFloat_AS_DOUBLE(self->chaos);
     if (pit < 0.0)
@@ -7584,16 +7584,16 @@ Rossler_readframes_ii(Rossler *self) {
         chao = 10.0;
     else
         chao = chao * 7.0 + 3.0;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->vDX = -self->vY - self->vZ;
         self->vDY = self->vX + self->pA * self->vY;
         self->vDZ = self->pB + self->vZ * (self->vX - chao);
-        
+
         self->vX += self->vDX * delta;
         self->vY += self->vDY * delta;
         self->vZ += self->vDZ * delta;
-        
+
         self->data[i] = self->vX * ROSSLER_SCALE;
         self->altBuffer[i] = self->vY * ROSSLER_ALT_SCALE;
     }
@@ -7603,7 +7603,7 @@ static void
 Rossler_readframes_ai(Rossler *self) {
     MYFLT delta, pit, chao;
     int i;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->pitch_stream);
     chao = PyFloat_AS_DOUBLE(self->chaos);
     if (chao < 0.0)
@@ -7612,7 +7612,7 @@ Rossler_readframes_ai(Rossler *self) {
         chao = 10.0;
     else
         chao = chao * 7.0 + 3.0;
-    
+
     for (i=0; i<self->bufsize; i++) {
         pit = fr[i];
         if (pit < 0.0)
@@ -7625,11 +7625,11 @@ Rossler_readframes_ai(Rossler *self) {
         self->vDX = -self->vY - self->vZ;
         self->vDY = self->vX + self->pA * self->vY;
         self->vDZ = self->pB + self->vZ * (self->vX - chao);
-        
+
         self->vX += self->vDX * delta;
         self->vY += self->vDY * delta;
         self->vZ += self->vDZ * delta;
-        
+
         self->data[i] = self->vX * ROSSLER_SCALE;
         self->altBuffer[i] = self->vY * ROSSLER_ALT_SCALE;
     }
@@ -7639,7 +7639,7 @@ static void
 Rossler_readframes_ia(Rossler *self) {
     MYFLT delta, pit, chao;
     int i;
-    
+
     pit = PyFloat_AS_DOUBLE(self->pitch);
     MYFLT *ch = Stream_getData((Stream *)self->chaos_stream);
 
@@ -7650,7 +7650,7 @@ Rossler_readframes_ia(Rossler *self) {
     else
         pit = pit * 999.0 + 1.0;
     delta = self->scalePitch * pit;
-    
+
     for (i=0; i<self->bufsize; i++) {
         chao = ch[i];
         if (chao < 0.0)
@@ -7658,15 +7658,15 @@ Rossler_readframes_ia(Rossler *self) {
         else if (chao > 1.0)
             chao = 10.0;
         else
-            chao = chao * 7.0 + 3.0;        
+            chao = chao * 7.0 + 3.0;
         self->vDX = -self->vY - self->vZ;
         self->vDY = self->vX + self->pA * self->vY;
         self->vDZ = self->pB + self->vZ * (self->vX - chao);
-        
+
         self->vX += self->vDX * delta;
         self->vY += self->vDY * delta;
         self->vZ += self->vDZ * delta;
-        
+
         self->data[i] = self->vX * ROSSLER_SCALE;
         self->altBuffer[i] = self->vY * ROSSLER_ALT_SCALE;
     }
@@ -7676,7 +7676,7 @@ static void
 Rossler_readframes_aa(Rossler *self) {
     MYFLT delta, pit, chao;
     int i;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->pitch_stream);
     MYFLT *ch = Stream_getData((Stream *)self->chaos_stream);
 
@@ -7689,22 +7689,22 @@ Rossler_readframes_aa(Rossler *self) {
         else
             pit = pit * 999.0 + 1.0;
         delta = self->scalePitch * pit;
-        
+
         chao = ch[i];
         if (chao < 0.0)
             chao = 3.0;
         else if (chao > 1.0)
             chao = 10.0;
         else
-            chao = chao * 7.0 + 3.0;        
+            chao = chao * 7.0 + 3.0;
         self->vDX = -self->vY - self->vZ;
         self->vDY = self->vX + self->pA * self->vY;
         self->vDZ = self->pB + self->vZ * (self->vX - chao);
-        
+
         self->vX += self->vDX * delta;
         self->vY += self->vDY * delta;
         self->vZ += self->vDZ * delta;
-        
+
         self->data[i] = self->vX * ROSSLER_SCALE;
         self->altBuffer[i] = self->vY * ROSSLER_ALT_SCALE;
     }
@@ -7726,48 +7726,48 @@ Rossler_setProcMode(Rossler *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = Rossler_readframes_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Rossler_readframes_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Rossler_readframes_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Rossler_readframes_aa;
             break;
-    } 
-    
+    }
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Rossler_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Rossler_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Rossler_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Rossler_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Rossler_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Rossler_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Rossler_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Rossler_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Rossler_postprocessing_revareva;
             break;
     }
@@ -7776,7 +7776,7 @@ Rossler_setProcMode(Rossler *self)
 static void
 Rossler_compute_next_data_frame(Rossler *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -7784,21 +7784,21 @@ static int
 Rossler_traverse(Rossler *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->pitch);    
-    Py_VISIT(self->pitch_stream);    
-    Py_VISIT(self->chaos);    
-    Py_VISIT(self->chaos_stream);    
+    Py_VISIT(self->pitch);
+    Py_VISIT(self->pitch_stream);
+    Py_VISIT(self->chaos);
+    Py_VISIT(self->chaos_stream);
     return 0;
 }
 
-static int 
+static int
 Rossler_clear(Rossler *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->pitch);    
-    Py_CLEAR(self->pitch_stream);    
-    Py_CLEAR(self->chaos);    
-    Py_CLEAR(self->chaos_stream);    
+    Py_CLEAR(self->pitch);
+    Py_CLEAR(self->pitch_stream);
+    Py_CLEAR(self->chaos);
+    Py_CLEAR(self->chaos_stream);
     return 0;
 }
 
@@ -7818,9 +7818,9 @@ Rossler_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *pitchtmp=NULL, *chaostmp=NULL, *multmp=NULL, *addtmp=NULL;
     Rossler *self;
     self = (Rossler *)type->tp_alloc(type, 0);
-    
-    self->pitch = PyFloat_FromDouble(0.25);    
-    self->chaos = PyFloat_FromDouble(0.5);    
+
+    self->pitch = PyFloat_FromDouble(0.25);
+    self->chaos = PyFloat_FromDouble(0.5);
     self->pA = 0.15;
     self->pB = 0.20;
     self->vDX = self->vDY = self->vDZ = 0.0;
@@ -7829,18 +7829,18 @@ Rossler_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Rossler_compute_next_data_frame);
     self->mode_func_ptr = Rossler_setProcMode;
-    
+
     self->scalePitch = 2.91 / self->sr;
 
     static char *kwlist[] = {"pitch", "chaos", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOOO", kwlist, &pitchtmp, &chaostmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (pitchtmp) {
         PyObject_CallMethod((PyObject *)self, "setPitch", "O", pitchtmp);
     }
@@ -7848,23 +7848,23 @@ Rossler_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (chaostmp) {
         PyObject_CallMethod((PyObject *)self, "setChaos", "O", chaostmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     self->altBuffer = (MYFLT *)realloc(self->altBuffer, self->bufsize * sizeof(MYFLT));
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->altBuffer[i] = 0.0;
-    }    
-    
+    }
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -7872,10 +7872,10 @@ Rossler_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Rossler_getServer(Rossler* self) { GET_SERVER };
 static PyObject * Rossler_getStream(Rossler* self) { GET_STREAM };
-static PyObject * Rossler_setMul(Rossler *self, PyObject *arg) { SET_MUL };	
-static PyObject * Rossler_setAdd(Rossler *self, PyObject *arg) { SET_ADD };	
-static PyObject * Rossler_setSub(Rossler *self, PyObject *arg) { SET_SUB };	
-static PyObject * Rossler_setDiv(Rossler *self, PyObject *arg) { SET_DIV };	
+static PyObject * Rossler_setMul(Rossler *self, PyObject *arg) { SET_MUL };
+static PyObject * Rossler_setAdd(Rossler *self, PyObject *arg) { SET_ADD };
+static PyObject * Rossler_setSub(Rossler *self, PyObject *arg) { SET_SUB };
+static PyObject * Rossler_setDiv(Rossler *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Rossler_play(Rossler *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Rossler_out(Rossler *self, PyObject *args, PyObject *kwds) { OUT };
@@ -7894,14 +7894,14 @@ static PyObject *
 Rossler_setPitch(Rossler *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->pitch);
@@ -7917,25 +7917,25 @@ Rossler_setPitch(Rossler *self, PyObject *arg)
         self->pitch_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Rossler_setChaos(Rossler *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->chaos);
@@ -7951,18 +7951,18 @@ Rossler_setChaos(Rossler *self, PyObject *arg)
         self->chaos_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 MYFLT *
 Rossler_getAltBuffer(Rossler *self)
 {
     return (MYFLT *)self->altBuffer;
-}    
+}
 
 static PyMemberDef Rossler_members[] = {
     {"server", T_OBJECT_EX, offsetof(Rossler, server), 0, "Pyo server."},
@@ -8093,36 +8093,36 @@ static void
 RosslerAlt_setProcMode(RosslerAlt *self) {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = RosslerAlt_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = RosslerAlt_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = RosslerAlt_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = RosslerAlt_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = RosslerAlt_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = RosslerAlt_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = RosslerAlt_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = RosslerAlt_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = RosslerAlt_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
@@ -8133,7 +8133,7 @@ RosslerAlt_compute_next_data_frame(RosslerAlt *self)
     tmp = Rossler_getAltBuffer((Rossler *)self->mainRossler);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -8145,11 +8145,11 @@ RosslerAlt_traverse(RosslerAlt *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 RosslerAlt_clear(RosslerAlt *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainRossler);    
+    Py_CLEAR(self->mainRossler);
     return 0;
 }
 
@@ -8168,19 +8168,19 @@ RosslerAlt_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL, *multmp=NULL, *addtmp=NULL;
     RosslerAlt *self;
     self = (RosslerAlt *)type->tp_alloc(type, 0);
-    
+
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, RosslerAlt_compute_next_data_frame);
     self->mode_func_ptr = RosslerAlt_setProcMode;
 
     static char *kwlist[] = {"mainRossler", "mul", "alt", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &maintmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainRossler);
     Py_INCREF(maintmp);
     self->mainRossler = (Rossler *)maintmp;
@@ -8188,24 +8188,24 @@ RosslerAlt_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * RosslerAlt_getServer(RosslerAlt* self) { GET_SERVER };
 static PyObject * RosslerAlt_getStream(RosslerAlt* self) { GET_STREAM };
-static PyObject * RosslerAlt_setMul(RosslerAlt *self, PyObject *arg) { SET_MUL };	
-static PyObject * RosslerAlt_setAdd(RosslerAlt *self, PyObject *arg) { SET_ADD };	
-static PyObject * RosslerAlt_setSub(RosslerAlt *self, PyObject *arg) { SET_SUB };	
-static PyObject * RosslerAlt_setDiv(RosslerAlt *self, PyObject *arg) { SET_DIV };	
+static PyObject * RosslerAlt_setMul(RosslerAlt *self, PyObject *arg) { SET_MUL };
+static PyObject * RosslerAlt_setAdd(RosslerAlt *self, PyObject *arg) { SET_ADD };
+static PyObject * RosslerAlt_setSub(RosslerAlt *self, PyObject *arg) { SET_SUB };
+static PyObject * RosslerAlt_setDiv(RosslerAlt *self, PyObject *arg) { SET_DIV };
 
 static PyObject * RosslerAlt_play(RosslerAlt *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * RosslerAlt_out(RosslerAlt *self, PyObject *args, PyObject *kwds) { OUT };
@@ -8237,7 +8237,7 @@ static PyMethodDef RosslerAlt_methods[] = {
     {"setMul", (PyCFunction)RosslerAlt_setMul, METH_O, "Sets oscillator mul factor."},
     {"setAdd", (PyCFunction)RosslerAlt_setAdd, METH_O, "Sets oscillator add factor."},
     {"setSub", (PyCFunction)RosslerAlt_setSub, METH_O, "Sets inverse add factor."},
-    {"setDiv", (PyCFunction)RosslerAlt_setDiv, METH_O, "Sets inverse mul factor."},        
+    {"setDiv", (PyCFunction)RosslerAlt_setDiv, METH_O, "Sets inverse mul factor."},
     {NULL}  /* Sentinel */
 };
 static PyNumberMethods RosslerAlt_as_number = {
@@ -8348,7 +8348,7 @@ static void
 Lorenz_readframes_ii(Lorenz *self) {
     MYFLT delta, pit, chao;
     int i;
-    
+
     pit = PyFloat_AS_DOUBLE(self->pitch);
     chao = PyFloat_AS_DOUBLE(self->chaos);
     if (pit < 0.0)
@@ -8358,23 +8358,23 @@ Lorenz_readframes_ii(Lorenz *self) {
     else
         pit = pit * 749.0 + 1.0;
     delta = self->oneOnSr * pit;
-    
+
     if (chao < 0.0)
         chao = 0.5;
     else if (chao > 1.0)
         chao = 3.0;
     else
         chao = chao * 2.5 + 0.5;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->vDX = self->pA * (self->vY - self->vX);
         self->vDY = self->vX * (self->pB - self->vZ) - self->vY;
         self->vDZ = self->vX * self->vY - chao * self->vZ;
-        
+
         self->vX += self->vDX * delta;
         self->vY += self->vDY * delta;
         self->vZ += self->vDZ * delta;
-        
+
         self->data[i] = self->vX * LORENZ_SCALE;
         self->altBuffer[i] = self->vY * LORENZ_ALT_SCALE;
     }
@@ -8384,7 +8384,7 @@ static void
 Lorenz_readframes_ai(Lorenz *self) {
     MYFLT delta, pit, chao;
     int i;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->pitch_stream);
     chao = PyFloat_AS_DOUBLE(self->chaos);
     if (chao < 0.0)
@@ -8393,7 +8393,7 @@ Lorenz_readframes_ai(Lorenz *self) {
         chao = 3.0;
     else
         chao = chao * 2.5 + 0.5;
-    
+
     for (i=0; i<self->bufsize; i++) {
         pit = fr[i];
         if (pit < 0.0)
@@ -8406,11 +8406,11 @@ Lorenz_readframes_ai(Lorenz *self) {
         self->vDX = self->pA * (self->vY - self->vX);
         self->vDY = self->vX * (self->pB - self->vZ) - self->vY;
         self->vDZ = self->vX * self->vY - chao * self->vZ;
-        
+
         self->vX += self->vDX * delta;
         self->vY += self->vDY * delta;
         self->vZ += self->vDZ * delta;
-        
+
         self->data[i] = self->vX * LORENZ_SCALE;
         self->altBuffer[i] = self->vY * LORENZ_ALT_SCALE;
     }
@@ -8420,10 +8420,10 @@ static void
 Lorenz_readframes_ia(Lorenz *self) {
     MYFLT delta, pit, chao;
     int i;
-    
+
     pit = PyFloat_AS_DOUBLE(self->pitch);
     MYFLT *ch = Stream_getData((Stream *)self->chaos_stream);
-    
+
     if (pit < 0.0)
         pit = 1.0;
     else if (pit > 1.0)
@@ -8431,7 +8431,7 @@ Lorenz_readframes_ia(Lorenz *self) {
     else
         pit = pit * 749.0 + 1.0;
     delta = self->oneOnSr * pit;
-    
+
     for (i=0; i<self->bufsize; i++) {
         chao = ch[i];
         if (chao < 0.0)
@@ -8439,15 +8439,15 @@ Lorenz_readframes_ia(Lorenz *self) {
         else if (chao > 1.0)
             chao = 3.0;
         else
-            chao = chao * 2.5 + 0.5;        
+            chao = chao * 2.5 + 0.5;
         self->vDX = self->pA * (self->vY - self->vX);
         self->vDY = self->vX * (self->pB - self->vZ) - self->vY;
         self->vDZ = self->vX * self->vY - chao * self->vZ;
-        
+
         self->vX += self->vDX * delta;
         self->vY += self->vDY * delta;
         self->vZ += self->vDZ * delta;
-        
+
         self->data[i] = self->vX * LORENZ_SCALE;
         self->altBuffer[i] = self->vY * LORENZ_ALT_SCALE;
     }
@@ -8457,10 +8457,10 @@ static void
 Lorenz_readframes_aa(Lorenz *self) {
     MYFLT delta, pit, chao;
     int i;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->pitch_stream);
     MYFLT *ch = Stream_getData((Stream *)self->chaos_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         pit = fr[i];
         if (pit < 0.0)
@@ -8470,22 +8470,22 @@ Lorenz_readframes_aa(Lorenz *self) {
         else
             pit = pit * 749.0 + 1.0;
         delta = self->oneOnSr * pit;
-        
+
         chao = ch[i];
         if (chao < 0.0)
             chao = 0.5;
         else if (chao > 1.0)
             chao = 3.0;
         else
-            chao = chao * 2.5 + 0.5;        
+            chao = chao * 2.5 + 0.5;
         self->vDX = self->pA * (self->vY - self->vX);
         self->vDY = self->vX * (self->pB - self->vZ) - self->vY;
         self->vDZ = self->vX * self->vY - chao * self->vZ;
-        
+
         self->vX += self->vDX * delta;
         self->vY += self->vDY * delta;
         self->vZ += self->vDZ * delta;
-        
+
         self->data[i] = self->vX * LORENZ_SCALE;
         self->altBuffer[i] = self->vY * LORENZ_ALT_SCALE;
     }
@@ -8507,48 +8507,48 @@ Lorenz_setProcMode(Lorenz *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = Lorenz_readframes_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Lorenz_readframes_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Lorenz_readframes_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Lorenz_readframes_aa;
             break;
-    } 
-    
+    }
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Lorenz_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Lorenz_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Lorenz_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Lorenz_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Lorenz_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Lorenz_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Lorenz_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Lorenz_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Lorenz_postprocessing_revareva;
             break;
     }
@@ -8557,7 +8557,7 @@ Lorenz_setProcMode(Lorenz *self)
 static void
 Lorenz_compute_next_data_frame(Lorenz *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -8565,21 +8565,21 @@ static int
 Lorenz_traverse(Lorenz *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->pitch);    
-    Py_VISIT(self->pitch_stream);    
-    Py_VISIT(self->chaos);    
-    Py_VISIT(self->chaos_stream);    
+    Py_VISIT(self->pitch);
+    Py_VISIT(self->pitch_stream);
+    Py_VISIT(self->chaos);
+    Py_VISIT(self->chaos_stream);
     return 0;
 }
 
-static int 
+static int
 Lorenz_clear(Lorenz *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->pitch);    
-    Py_CLEAR(self->pitch_stream);    
-    Py_CLEAR(self->chaos);    
-    Py_CLEAR(self->chaos_stream);    
+    Py_CLEAR(self->pitch);
+    Py_CLEAR(self->pitch_stream);
+    Py_CLEAR(self->chaos);
+    Py_CLEAR(self->chaos_stream);
     return 0;
 }
 
@@ -8599,9 +8599,9 @@ Lorenz_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *pitchtmp=NULL, *chaostmp=NULL, *multmp=NULL, *addtmp=NULL;
     Lorenz *self;
     self = (Lorenz *)type->tp_alloc(type, 0);
-    
-    self->pitch = PyFloat_FromDouble(0.25);    
-    self->chaos = PyFloat_FromDouble(0.5);    
+
+    self->pitch = PyFloat_FromDouble(0.25);
+    self->chaos = PyFloat_FromDouble(0.5);
     self->pA = 10.0;
     self->pB = 28.0;
     self->vDX = self->vDY = self->vDZ = 0.0;
@@ -8610,53 +8610,53 @@ Lorenz_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Lorenz_compute_next_data_frame);
     self->mode_func_ptr = Lorenz_setProcMode;
-    
+
     self->oneOnSr = 1.0 / self->sr;
- 
+
     static char *kwlist[] = {"pitch", "chaos", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOOO", kwlist, &pitchtmp, &chaostmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (pitchtmp) {
         PyObject_CallMethod((PyObject *)self, "setPitch", "O", pitchtmp);
     }
-    
+
     if (chaostmp) {
         PyObject_CallMethod((PyObject *)self, "setChaos", "O", chaostmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->altBuffer = (MYFLT *)realloc(self->altBuffer, self->bufsize * sizeof(MYFLT));
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->altBuffer[i] = 0.0;
-    }    
-    
+    }
+
     (*self->mode_func_ptr)(self);
-   
+
     return (PyObject *)self;
 }
 
 static PyObject * Lorenz_getServer(Lorenz* self) { GET_SERVER };
 static PyObject * Lorenz_getStream(Lorenz* self) { GET_STREAM };
-static PyObject * Lorenz_setMul(Lorenz *self, PyObject *arg) { SET_MUL };	
-static PyObject * Lorenz_setAdd(Lorenz *self, PyObject *arg) { SET_ADD };	
-static PyObject * Lorenz_setSub(Lorenz *self, PyObject *arg) { SET_SUB };	
-static PyObject * Lorenz_setDiv(Lorenz *self, PyObject *arg) { SET_DIV };	
+static PyObject * Lorenz_setMul(Lorenz *self, PyObject *arg) { SET_MUL };
+static PyObject * Lorenz_setAdd(Lorenz *self, PyObject *arg) { SET_ADD };
+static PyObject * Lorenz_setSub(Lorenz *self, PyObject *arg) { SET_SUB };
+static PyObject * Lorenz_setDiv(Lorenz *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Lorenz_play(Lorenz *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Lorenz_out(Lorenz *self, PyObject *args, PyObject *kwds) { OUT };
@@ -8675,14 +8675,14 @@ static PyObject *
 Lorenz_setPitch(Lorenz *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->pitch);
@@ -8698,25 +8698,25 @@ Lorenz_setPitch(Lorenz *self, PyObject *arg)
         self->pitch_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Lorenz_setChaos(Lorenz *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->chaos);
@@ -8732,18 +8732,18 @@ Lorenz_setChaos(Lorenz *self, PyObject *arg)
         self->chaos_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 MYFLT *
 Lorenz_getAltBuffer(Lorenz *self)
 {
     return (MYFLT *)self->altBuffer;
-}    
+}
 
 static PyMemberDef Lorenz_members[] = {
     {"server", T_OBJECT_EX, offsetof(Lorenz, server), 0, "Pyo server."},
@@ -8874,36 +8874,36 @@ static void
 LorenzAlt_setProcMode(LorenzAlt *self) {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = LorenzAlt_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = LorenzAlt_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = LorenzAlt_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = LorenzAlt_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = LorenzAlt_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = LorenzAlt_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = LorenzAlt_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = LorenzAlt_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = LorenzAlt_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
@@ -8914,7 +8914,7 @@ LorenzAlt_compute_next_data_frame(LorenzAlt *self)
     tmp = Lorenz_getAltBuffer((Lorenz *)self->mainLorenz);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -8926,11 +8926,11 @@ LorenzAlt_traverse(LorenzAlt *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 LorenzAlt_clear(LorenzAlt *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainLorenz);    
+    Py_CLEAR(self->mainLorenz);
     return 0;
 }
 
@@ -8949,44 +8949,44 @@ LorenzAlt_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL, *multmp=NULL, *addtmp=NULL;
     LorenzAlt *self;
     self = (LorenzAlt *)type->tp_alloc(type, 0);
-    
+
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, LorenzAlt_compute_next_data_frame);
     self->mode_func_ptr = LorenzAlt_setProcMode;
 
     static char *kwlist[] = {"mainLorenz", "mul", "alt", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &maintmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainLorenz);
     Py_INCREF(maintmp);
     self->mainLorenz = (Lorenz *)maintmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * LorenzAlt_getServer(LorenzAlt* self) { GET_SERVER };
 static PyObject * LorenzAlt_getStream(LorenzAlt* self) { GET_STREAM };
-static PyObject * LorenzAlt_setMul(LorenzAlt *self, PyObject *arg) { SET_MUL };	
-static PyObject * LorenzAlt_setAdd(LorenzAlt *self, PyObject *arg) { SET_ADD };	
-static PyObject * LorenzAlt_setSub(LorenzAlt *self, PyObject *arg) { SET_SUB };	
-static PyObject * LorenzAlt_setDiv(LorenzAlt *self, PyObject *arg) { SET_DIV };	
+static PyObject * LorenzAlt_setMul(LorenzAlt *self, PyObject *arg) { SET_MUL };
+static PyObject * LorenzAlt_setAdd(LorenzAlt *self, PyObject *arg) { SET_ADD };
+static PyObject * LorenzAlt_setSub(LorenzAlt *self, PyObject *arg) { SET_SUB };
+static PyObject * LorenzAlt_setDiv(LorenzAlt *self, PyObject *arg) { SET_DIV };
 
 static PyObject * LorenzAlt_play(LorenzAlt *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * LorenzAlt_out(LorenzAlt *self, PyObject *args, PyObject *kwds) { OUT };
@@ -9018,7 +9018,7 @@ static PyMethodDef LorenzAlt_methods[] = {
     {"setMul", (PyCFunction)LorenzAlt_setMul, METH_O, "Sets oscillator mul factor."},
     {"setAdd", (PyCFunction)LorenzAlt_setAdd, METH_O, "Sets oscillator add factor."},
     {"setSub", (PyCFunction)LorenzAlt_setSub, METH_O, "Sets inverse add factor."},
-    {"setDiv", (PyCFunction)LorenzAlt_setDiv, METH_O, "Sets inverse mul factor."},        
+    {"setDiv", (PyCFunction)LorenzAlt_setDiv, METH_O, "Sets inverse mul factor."},
     {NULL}  /* Sentinel */
 };
 static PyNumberMethods LorenzAlt_as_number = {
@@ -9128,11 +9128,11 @@ static void
 SumOsc_readframes_iii(SumOsc *self) {
     MYFLT mod_freq, mod_delta, freq_delta, x, y, ind2, theta_minus_beta, sin1, sin2, cos1;
     int i, ipart;
-    
+
     MYFLT freq = PyFloat_AS_DOUBLE(self->freq);
     MYFLT rat = PyFloat_AS_DOUBLE(self->ratio);
     MYFLT ind = PyFloat_AS_DOUBLE(self->index);
-    
+
     freq_delta = freq * self->scaleFactor;
     mod_freq = freq * rat;
     mod_delta = mod_freq * self->scaleFactor;
@@ -9155,7 +9155,7 @@ SumOsc_readframes_iii(SumOsc *self) {
         self->beta += mod_delta;
         self->theta = Sine_clip(self->theta);
         self->beta = Sine_clip(self->beta);
-        
+
         /* DC filtering */
         y = x - self->xn1 + 0.995 * self->yn1;
         self->xn1 = x; self->yn1 = y;
@@ -9168,7 +9168,7 @@ static void
 SumOsc_readframes_aii(SumOsc *self) {
     MYFLT freq, mod_freq, mod_delta, freq_delta, x, y, ind2, theta_minus_beta, sin1, sin2, cos1;
     int i, ipart;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT rat = PyFloat_AS_DOUBLE(self->ratio);
     MYFLT ind = PyFloat_AS_DOUBLE(self->index);
@@ -9196,7 +9196,7 @@ SumOsc_readframes_aii(SumOsc *self) {
         self->beta += mod_delta;
         self->theta = Sine_clip(self->theta);
         self->beta = Sine_clip(self->beta);
-        
+
         y = x - self->xn1 + 0.995 * self->yn1;
         self->xn1 = x; self->yn1 = y;
 
@@ -9208,7 +9208,7 @@ static void
 SumOsc_readframes_iai(SumOsc *self) {
     MYFLT ratio, mod_freq, mod_delta, freq_delta, x, y, ind2, theta_minus_beta, sin1, sin2, cos1;
     int i, ipart;
-    
+
     MYFLT freq = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *rat = Stream_getData((Stream *)self->ratio_stream);
     MYFLT ind = PyFloat_AS_DOUBLE(self->index);
@@ -9236,7 +9236,7 @@ SumOsc_readframes_iai(SumOsc *self) {
         self->beta += mod_delta;
         self->theta = Sine_clip(self->theta);
         self->beta = Sine_clip(self->beta);
-        
+
         y = x - self->xn1 + 0.995 * self->yn1;
         self->xn1 = x; self->yn1 = y;
 
@@ -9248,7 +9248,7 @@ static void
 SumOsc_readframes_aai(SumOsc *self) {
     MYFLT freq, ratio, mod_freq, mod_delta, freq_delta, x, y, ind2, theta_minus_beta, sin1, sin2, cos1;
     int i, ipart;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT *rat = Stream_getData((Stream *)self->ratio_stream);
     MYFLT ind = PyFloat_AS_DOUBLE(self->index);
@@ -9277,7 +9277,7 @@ SumOsc_readframes_aai(SumOsc *self) {
         self->beta += mod_delta;
         self->theta = Sine_clip(self->theta);
         self->beta = Sine_clip(self->beta);
-        
+
         y = x - self->xn1 + 0.995 * self->yn1;
         self->xn1 = x; self->yn1 = y;
 
@@ -9289,7 +9289,7 @@ static void
 SumOsc_readframes_iia(SumOsc *self) {
     MYFLT ind, mod_freq, mod_delta, freq_delta, x, y, ind2, theta_minus_beta, sin1, sin2, cos1;
     int i, ipart;
-    
+
     MYFLT freq = PyFloat_AS_DOUBLE(self->freq);
     MYFLT rat = PyFloat_AS_DOUBLE(self->ratio);
     MYFLT *index = Stream_getData((Stream *)self->index_stream);
@@ -9317,19 +9317,19 @@ SumOsc_readframes_iia(SumOsc *self) {
         self->beta += mod_delta;
         self->theta = Sine_clip(self->theta);
         self->beta = Sine_clip(self->beta);
-        
+
         y = x - self->xn1 + 0.995 * self->yn1;
         self->xn1 = x; self->yn1 = y;
 
         self->data[i] = y * (1 - ind2);
-    }    
+    }
 }
 
 static void
 SumOsc_readframes_aia(SumOsc *self) {
     MYFLT freq, ind, mod_freq, mod_delta, freq_delta, x, y, ind2, theta_minus_beta, sin1, sin2, cos1;
     int i, ipart;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT rat = PyFloat_AS_DOUBLE(self->ratio);
     MYFLT *index = Stream_getData((Stream *)self->index_stream);
@@ -9357,19 +9357,19 @@ SumOsc_readframes_aia(SumOsc *self) {
         self->beta += mod_delta;
         self->theta = Sine_clip(self->theta);
         self->beta = Sine_clip(self->beta);
-        
+
         y = x - self->xn1 + 0.995 * self->yn1;
         self->xn1 = x; self->yn1 = y;
 
         self->data[i] = y * (1 - ind2);
-    }    
+    }
 }
 
 static void
 SumOsc_readframes_iaa(SumOsc *self) {
     MYFLT ratio, ind, mod_freq, mod_delta, freq_delta, x, y, ind2, theta_minus_beta, sin1, sin2, cos1;
     int i, ipart;
-    
+
     MYFLT freq = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *rat = Stream_getData((Stream *)self->ratio_stream);
     MYFLT *index = Stream_getData((Stream *)self->index_stream);
@@ -9398,19 +9398,19 @@ SumOsc_readframes_iaa(SumOsc *self) {
         self->beta += mod_delta;
         self->theta = Sine_clip(self->theta);
         self->beta = Sine_clip(self->beta);
-        
+
         y = x - self->xn1 + 0.995 * self->yn1;
         self->xn1 = x; self->yn1 = y;
 
         self->data[i] = y * (1 - ind2);
-    } 
+    }
 }
 
 static void
 SumOsc_readframes_aaa(SumOsc *self) {
     MYFLT freq, ratio, ind, mod_freq, mod_delta, freq_delta, x, y, ind2, theta_minus_beta, sin1, sin2, cos1;
     int i, ipart;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT *rat = Stream_getData((Stream *)self->ratio_stream);
     MYFLT *index = Stream_getData((Stream *)self->index_stream);
@@ -9439,12 +9439,12 @@ SumOsc_readframes_aaa(SumOsc *self) {
         self->beta += mod_delta;
         self->theta = Sine_clip(self->theta);
         self->beta = Sine_clip(self->beta);
-        
+
         y = x - self->xn1 + 0.995 * self->yn1;
         self->xn1 = x; self->yn1 = y;
 
         self->data[i] = y * (1 - ind2);
-    } 
+    }
 }
 
 static void SumOsc_postprocessing_ii(SumOsc *self) { POST_PROCESSING_II };
@@ -9463,60 +9463,60 @@ SumOsc_setProcMode(SumOsc *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10 + self->modebuffer[4] * 100;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = SumOsc_readframes_iii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = SumOsc_readframes_aii;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = SumOsc_readframes_iai;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = SumOsc_readframes_aai;
             break;
-        case 100:        
+        case 100:
             self->proc_func_ptr = SumOsc_readframes_iia;
             break;
-        case 101:    
+        case 101:
             self->proc_func_ptr = SumOsc_readframes_aia;
             break;
-        case 110:    
+        case 110:
             self->proc_func_ptr = SumOsc_readframes_iaa;
             break;
-        case 111:    
+        case 111:
             self->proc_func_ptr = SumOsc_readframes_aaa;
             break;
-    } 
-    
+    }
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = SumOsc_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = SumOsc_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = SumOsc_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = SumOsc_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = SumOsc_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = SumOsc_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = SumOsc_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = SumOsc_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = SumOsc_postprocessing_revareva;
             break;
     }
@@ -9525,7 +9525,7 @@ SumOsc_setProcMode(SumOsc *self)
 static void
 SumOsc_compute_next_data_frame(SumOsc *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -9533,25 +9533,25 @@ static int
 SumOsc_traverse(SumOsc *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->ratio);    
-    Py_VISIT(self->ratio_stream);    
-    Py_VISIT(self->index);    
-    Py_VISIT(self->index_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->ratio);
+    Py_VISIT(self->ratio_stream);
+    Py_VISIT(self->index);
+    Py_VISIT(self->index_stream);
     return 0;
 }
 
-static int 
+static int
 SumOsc_clear(SumOsc *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->ratio);    
-    Py_CLEAR(self->ratio_stream);    
-    Py_CLEAR(self->index);    
-    Py_CLEAR(self->index_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->ratio);
+    Py_CLEAR(self->ratio_stream);
+    Py_CLEAR(self->index);
+    Py_CLEAR(self->index_stream);
     return 0;
 }
 
@@ -9570,7 +9570,7 @@ SumOsc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *freqtmp=NULL, *ratiotmp=NULL, *indextmp=NULL, *multmp=NULL, *addtmp=NULL;
     SumOsc *self;
     self = (SumOsc *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(100);
     self->ratio = PyFloat_FromDouble(0.5);
     self->index = PyFloat_FromDouble(0.5);
@@ -9581,7 +9581,7 @@ SumOsc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[4] = 0;
     self->theta = self->beta = 0.;
     self->xn1 = self->yn1 = 0.0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, SumOsc_compute_next_data_frame);
     self->mode_func_ptr = SumOsc_setProcMode;
@@ -9589,14 +9589,14 @@ SumOsc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->scaleFactor = 512.0 / self->sr;
 
     static char *kwlist[] = {"freq", "ratio", "index", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOOOO", kwlist, &freqtmp, &ratiotmp, &indextmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (ratiotmp) {
         PyObject_CallMethod((PyObject *)self, "setRatio", "O", ratiotmp);
     }
@@ -9604,17 +9604,17 @@ SumOsc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (indextmp) {
         PyObject_CallMethod((PyObject *)self, "setIndex", "O", indextmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -9622,10 +9622,10 @@ SumOsc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * SumOsc_getServer(SumOsc* self) { GET_SERVER };
 static PyObject * SumOsc_getStream(SumOsc* self) { GET_STREAM };
-static PyObject * SumOsc_setMul(SumOsc *self, PyObject *arg) { SET_MUL };	
-static PyObject * SumOsc_setAdd(SumOsc *self, PyObject *arg) { SET_ADD };	
-static PyObject * SumOsc_setSub(SumOsc *self, PyObject *arg) { SET_SUB };	
-static PyObject * SumOsc_setDiv(SumOsc *self, PyObject *arg) { SET_DIV };	
+static PyObject * SumOsc_setMul(SumOsc *self, PyObject *arg) { SET_MUL };
+static PyObject * SumOsc_setAdd(SumOsc *self, PyObject *arg) { SET_ADD };
+static PyObject * SumOsc_setSub(SumOsc *self, PyObject *arg) { SET_SUB };
+static PyObject * SumOsc_setDiv(SumOsc *self, PyObject *arg) { SET_DIV };
 
 static PyObject * SumOsc_play(SumOsc *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * SumOsc_out(SumOsc *self, PyObject *args, PyObject *kwds) { OUT };
@@ -9644,14 +9644,14 @@ static PyObject *
 SumOsc_setFreq(SumOsc *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -9667,25 +9667,25 @@ SumOsc_setFreq(SumOsc *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 SumOsc_setRatio(SumOsc *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->ratio);
@@ -9701,25 +9701,25 @@ SumOsc_setRatio(SumOsc *self, PyObject *arg)
         self->ratio_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 SumOsc_setIndex(SumOsc *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->index);
@@ -9735,12 +9735,12 @@ SumOsc_setIndex(SumOsc *self, PyObject *arg)
         self->index_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef SumOsc_members[] = {
 {"server", T_OBJECT_EX, offsetof(SumOsc, server), 0, "Pyo server."},
@@ -9918,12 +9918,12 @@ SuperSaw_readframes_iii(SuperSaw *self) {
     if (fr <= 1.0)
         fr = 1.0;
     else if (fr >= self->nyquist)
-        fr = self->nyquist; 
+        fr = self->nyquist;
 
     det_ind = (int)(det * 126);
     bal_ind = (int)(bal * 126);
-    
-    if (fr != self->lastFilterFreq) {       
+
+    if (fr != self->lastFilterFreq) {
         self->lastFilterFreq = fr;
         self->w0 = TWOPI * fr / self->sr;
         self->c = MYCOS(self->w0);
@@ -9977,8 +9977,8 @@ SuperSaw_readframes_aii(SuperSaw *self) {
         if (fr <= 1.0)
             fr = 1.0;
         else if (fr >= self->nyquist)
-            fr = self->nyquist; 
-        if (fr != self->lastFilterFreq) {       
+            fr = self->nyquist;
+        if (fr != self->lastFilterFreq) {
             self->lastFilterFreq = fr;
             self->w0 = TWOPI * fr / self->sr;
             self->c = MYCOS(self->w0);
@@ -10020,11 +10020,11 @@ SuperSaw_readframes_iai(SuperSaw *self) {
     if (fr <= 1.0)
         fr = 1.0;
     else if (fr >= self->nyquist)
-        fr = self->nyquist; 
+        fr = self->nyquist;
 
     bal_ind = (int)(bal * 126);
-    
-    if (fr != self->lastFilterFreq) {       
+
+    if (fr != self->lastFilterFreq) {
         self->lastFilterFreq = fr;
         self->w0 = TWOPI * fr / self->sr;
         self->c = MYCOS(self->w0);
@@ -10073,8 +10073,8 @@ SuperSaw_readframes_aai(SuperSaw *self) {
         if (fr <= 1.0)
             fr = 1.0;
         else if (fr >= self->nyquist)
-            fr = self->nyquist; 
-        if (fr != self->lastFilterFreq) {       
+            fr = self->nyquist;
+        if (fr != self->lastFilterFreq) {
             self->lastFilterFreq = fr;
             self->w0 = TWOPI * fr / self->sr;
             self->c = MYCOS(self->w0);
@@ -10118,11 +10118,11 @@ SuperSaw_readframes_iia(SuperSaw *self) {
     if (fr <= 1.0)
         fr = 1.0;
     else if (fr >= self->nyquist)
-        fr = self->nyquist; 
+        fr = self->nyquist;
 
     det_ind = (int)(det * 126);
-    
-    if (fr != self->lastFilterFreq) {       
+
+    if (fr != self->lastFilterFreq) {
         self->lastFilterFreq = fr;
         self->w0 = TWOPI * fr / self->sr;
         self->c = MYCOS(self->w0);
@@ -10175,8 +10175,8 @@ SuperSaw_readframes_aia(SuperSaw *self) {
         if (fr <= 1.0)
             fr = 1.0;
         else if (fr >= self->nyquist)
-            fr = self->nyquist; 
-        if (fr != self->lastFilterFreq) {       
+            fr = self->nyquist;
+        if (fr != self->lastFilterFreq) {
             self->lastFilterFreq = fr;
             self->w0 = TWOPI * fr / self->sr;
             self->c = MYCOS(self->w0);
@@ -10219,9 +10219,9 @@ SuperSaw_readframes_iaa(SuperSaw *self) {
     if (fr <= 1.0)
         fr = 1.0;
     else if (fr >= self->nyquist)
-        fr = self->nyquist; 
-    
-    if (fr != self->lastFilterFreq) {       
+        fr = self->nyquist;
+
+    if (fr != self->lastFilterFreq) {
         self->lastFilterFreq = fr;
         self->w0 = TWOPI * fr / self->sr;
         self->c = MYCOS(self->w0);
@@ -10269,8 +10269,8 @@ SuperSaw_readframes_aaa(SuperSaw *self) {
         if (fr <= 1.0)
             fr = 1.0;
         else if (fr >= self->nyquist)
-            fr = self->nyquist; 
-        if (fr != self->lastFilterFreq) {       
+            fr = self->nyquist;
+        if (fr != self->lastFilterFreq) {
             self->lastFilterFreq = fr;
             self->w0 = TWOPI * fr / self->sr;
             self->c = MYCOS(self->w0);
@@ -10318,68 +10318,68 @@ SuperSaw_setProcMode(SuperSaw *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10 + self->modebuffer[4] * 100;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = SuperSaw_readframes_iii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = SuperSaw_readframes_aii;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = SuperSaw_readframes_iai;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = SuperSaw_readframes_aai;
             break;
-        case 100:    
+        case 100:
             self->proc_func_ptr = SuperSaw_readframes_iia;
             break;
-        case 101:    
+        case 101:
             self->proc_func_ptr = SuperSaw_readframes_aia;
             break;
-        case 110:    
+        case 110:
             self->proc_func_ptr = SuperSaw_readframes_iaa;
             break;
-        case 111:    
+        case 111:
             self->proc_func_ptr = SuperSaw_readframes_aaa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = SuperSaw_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = SuperSaw_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = SuperSaw_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = SuperSaw_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = SuperSaw_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = SuperSaw_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = SuperSaw_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = SuperSaw_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = SuperSaw_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 SuperSaw_compute_next_data_frame(SuperSaw *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -10387,25 +10387,25 @@ static int
 SuperSaw_traverse(SuperSaw *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
-    Py_VISIT(self->detune);    
-    Py_VISIT(self->detune_stream);    
-    Py_VISIT(self->bal);    
-    Py_VISIT(self->bal_stream);    
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
+    Py_VISIT(self->detune);
+    Py_VISIT(self->detune_stream);
+    Py_VISIT(self->bal);
+    Py_VISIT(self->bal_stream);
     return 0;
 }
 
-static int 
+static int
 SuperSaw_clear(SuperSaw *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
-    Py_CLEAR(self->detune);    
-    Py_CLEAR(self->detune_stream);    
-    Py_CLEAR(self->bal);    
-    Py_CLEAR(self->bal_stream);    
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
+    Py_CLEAR(self->detune);
+    Py_CLEAR(self->detune_stream);
+    Py_CLEAR(self->bal);
+    Py_CLEAR(self->bal_stream);
     return 0;
 }
 
@@ -10424,7 +10424,7 @@ SuperSaw_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *freqtmp=NULL, *detunetmp=NULL, *baltmp=NULL, *multmp=NULL, *addtmp=NULL;
     SuperSaw *self;
     self = (SuperSaw *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(100);
     self->detune = PyFloat_FromDouble(0.5);
     self->bal = PyFloat_FromDouble(0.7);
@@ -10442,7 +10442,7 @@ SuperSaw_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->pointerPos[6] = 0.75;
     self->lastFilterFreq = -1.0;
     self->x1 = self->x2 = self->y1 = self->y2 = 0.0;
-    
+
     INIT_OBJECT_COMMON
 
     self->nyquist = (MYFLT)self->sr * 0.49;
@@ -10451,10 +10451,10 @@ SuperSaw_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = SuperSaw_setProcMode;
 
     static char *kwlist[] = {"freq", "detune", "bal", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOOOO", kwlist, &freqtmp, &detunetmp, &baltmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
@@ -10466,28 +10466,28 @@ SuperSaw_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (baltmp) {
         PyObject_CallMethod((PyObject *)self, "setBal", "O", baltmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * SuperSaw_getServer(SuperSaw* self) { GET_SERVER };
 static PyObject * SuperSaw_getStream(SuperSaw* self) { GET_STREAM };
-static PyObject * SuperSaw_setMul(SuperSaw *self, PyObject *arg) { SET_MUL };	
-static PyObject * SuperSaw_setAdd(SuperSaw *self, PyObject *arg) { SET_ADD };	
-static PyObject * SuperSaw_setSub(SuperSaw *self, PyObject *arg) { SET_SUB };	
-static PyObject * SuperSaw_setDiv(SuperSaw *self, PyObject *arg) { SET_DIV };	
+static PyObject * SuperSaw_setMul(SuperSaw *self, PyObject *arg) { SET_MUL };
+static PyObject * SuperSaw_setAdd(SuperSaw *self, PyObject *arg) { SET_ADD };
+static PyObject * SuperSaw_setSub(SuperSaw *self, PyObject *arg) { SET_SUB };
+static PyObject * SuperSaw_setDiv(SuperSaw *self, PyObject *arg) { SET_DIV };
 
 static PyObject * SuperSaw_play(SuperSaw *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * SuperSaw_out(SuperSaw *self, PyObject *args, PyObject *kwds) { OUT };
@@ -10506,14 +10506,14 @@ static PyObject *
 SuperSaw_setFreq(SuperSaw *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -10529,25 +10529,25 @@ SuperSaw_setFreq(SuperSaw *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 SuperSaw_setDetune(SuperSaw *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->detune);
@@ -10563,25 +10563,25 @@ SuperSaw_setDetune(SuperSaw *self, PyObject *arg)
         self->detune_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 SuperSaw_setBal(SuperSaw *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->bal);
@@ -10597,12 +10597,12 @@ SuperSaw_setBal(SuperSaw *self, PyObject *arg)
         self->bal_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef SuperSaw_members[] = {
 {"server", T_OBJECT_EX, offsetof(SuperSaw, server), 0, "Pyo server."},
@@ -10732,12 +10732,12 @@ static void
 RCOsc_readframes_ii(RCOsc *self) {
     MYFLT fr, sh, inc, down_phase, up_phase;
     int i;
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     sh = _clip(PyFloat_AS_DOUBLE(self->sharp));
     sh = sh * sh * 99.0 + 1.0;
     inc = fr * 2 / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (self->pointerPos < 1) {
             down_phase = 1.0 - self->pointerPos;
@@ -10760,11 +10760,11 @@ static void
 RCOsc_readframes_ai(RCOsc *self) {
     MYFLT sh, down_phase, up_phase, twoOverSr;
     int i;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     sh = _clip(PyFloat_AS_DOUBLE(self->sharp));
     sh = sh * sh * 99.0 + 1.0;
-    
+
     twoOverSr = 2.0 / self->sr;
     for (i=0; i<self->bufsize; i++) {
         if (self->pointerPos < 1) {
@@ -10788,14 +10788,14 @@ static void
 RCOsc_readframes_ia(RCOsc *self) {
     MYFLT fr, sh, inc, down_phase, up_phase;
     int i;
-    
+
     fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT *sharp = Stream_getData((Stream *)self->sharp_stream);
     inc = fr * 2 / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         sh = _clip(sharp[i]);
-        sh = sh * sh * 99.0 + 1.0;        
+        sh = sh * sh * 99.0 + 1.0;
         if (self->pointerPos < 1) {
             down_phase = 1.0 - self->pointerPos;
             up_phase = 1.0;
@@ -10817,14 +10817,14 @@ static void
 RCOsc_readframes_aa(RCOsc *self) {
     MYFLT sh, down_phase, up_phase, twoOverSr;
     int i;
-    
+
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT *sharp = Stream_getData((Stream *)self->sharp_stream);
-    
+
     twoOverSr = 2.0 / self->sr;
     for (i=0; i<self->bufsize; i++) {
         sh = _clip(sharp[i]);
-        sh = sh * sh * 99.0 + 1.0;        
+        sh = sh * sh * 99.0 + 1.0;
         if (self->pointerPos < 1) {
             down_phase = 1.0 - self->pointerPos;
             up_phase = 1.0;
@@ -10858,56 +10858,56 @@ RCOsc_setProcMode(RCOsc *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = RCOsc_readframes_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = RCOsc_readframes_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = RCOsc_readframes_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = RCOsc_readframes_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = RCOsc_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = RCOsc_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = RCOsc_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = RCOsc_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = RCOsc_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = RCOsc_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = RCOsc_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = RCOsc_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = RCOsc_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 RCOsc_compute_next_data_frame(RCOsc *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -10915,21 +10915,21 @@ static int
 RCOsc_traverse(RCOsc *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->sharp);    
-    Py_VISIT(self->sharp_stream);    
-    Py_VISIT(self->freq);    
-    Py_VISIT(self->freq_stream);    
+    Py_VISIT(self->sharp);
+    Py_VISIT(self->sharp_stream);
+    Py_VISIT(self->freq);
+    Py_VISIT(self->freq_stream);
     return 0;
 }
 
-static int 
+static int
 RCOsc_clear(RCOsc *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->sharp);    
-    Py_CLEAR(self->sharp_stream);    
-    Py_CLEAR(self->freq);    
-    Py_CLEAR(self->freq_stream);    
+    Py_CLEAR(self->sharp);
+    Py_CLEAR(self->sharp_stream);
+    Py_CLEAR(self->freq);
+    Py_CLEAR(self->freq_stream);
     return 0;
 }
 
@@ -10948,7 +10948,7 @@ RCOsc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *freqtmp=NULL, *sharptmp=NULL, *multmp=NULL, *addtmp=NULL;
     RCOsc *self;
     self = (RCOsc *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(100);
     self->sharp = PyFloat_FromDouble(0.25);
 	self->modebuffer[0] = 0;
@@ -10956,16 +10956,16 @@ RCOsc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
     self->pointerPos = 0.;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, RCOsc_compute_next_data_frame);
     self->mode_func_ptr = RCOsc_setProcMode;
 
     static char *kwlist[] = {"freq", "sharp", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOOO", kwlist, &freqtmp, &sharptmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
@@ -10973,28 +10973,28 @@ RCOsc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (sharptmp) {
         PyObject_CallMethod((PyObject *)self, "setSharp", "O", sharptmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * RCOsc_getServer(RCOsc* self) { GET_SERVER };
 static PyObject * RCOsc_getStream(RCOsc* self) { GET_STREAM };
-static PyObject * RCOsc_setMul(RCOsc *self, PyObject *arg) { SET_MUL };	
-static PyObject * RCOsc_setAdd(RCOsc *self, PyObject *arg) { SET_ADD };	
-static PyObject * RCOsc_setSub(RCOsc *self, PyObject *arg) { SET_SUB };	
-static PyObject * RCOsc_setDiv(RCOsc *self, PyObject *arg) { SET_DIV };	
+static PyObject * RCOsc_setMul(RCOsc *self, PyObject *arg) { SET_MUL };
+static PyObject * RCOsc_setAdd(RCOsc *self, PyObject *arg) { SET_ADD };
+static PyObject * RCOsc_setSub(RCOsc *self, PyObject *arg) { SET_SUB };
+static PyObject * RCOsc_setDiv(RCOsc *self, PyObject *arg) { SET_DIV };
 
 static PyObject * RCOsc_play(RCOsc *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * RCOsc_out(RCOsc *self, PyObject *args, PyObject *kwds) { OUT };
@@ -11013,14 +11013,14 @@ static PyObject *
 RCOsc_setFreq(RCOsc *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -11036,25 +11036,25 @@ RCOsc_setFreq(RCOsc *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 RCOsc_setSharp(RCOsc *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->sharp);
@@ -11070,15 +11070,15 @@ RCOsc_setSharp(RCOsc *self, PyObject *arg)
         self->sharp_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
-static PyObject * 
-RCOsc_reset(RCOsc *self) 
+static PyObject *
+RCOsc_reset(RCOsc *self)
 {
     self->pointerPos = 0.0;
     Py_INCREF(Py_None);
@@ -11216,7 +11216,7 @@ TableScale_readframes_ii(TableScale *self) {
 
     mul = PyFloat_AS_DOUBLE(self->mul);
     add = PyFloat_AS_DOUBLE(self->add);
-    
+
     num = size < osize ? size : osize;
     for (i=0; i<num; i++) {
         outlist[i] = tablelist[i] * mul + add;
@@ -11234,7 +11234,7 @@ TableScale_readframes_ai(TableScale *self) {
 
     MYFLT *mul = Stream_getData((Stream *)self->mul_stream);
     add = PyFloat_AS_DOUBLE(self->add);
-    
+
     num = size < osize ? size : osize;
     for (i=0; i<num; i++) {
         outlist[i] = tablelist[i] * mul[i] + add;
@@ -11252,7 +11252,7 @@ TableScale_readframes_ia(TableScale *self) {
 
     mul = PyFloat_AS_DOUBLE(self->mul);
     MYFLT *add = Stream_getData((Stream *)self->add_stream);
-    
+
     num = size < osize ? size : osize;
     for (i=0; i<num; i++) {
         outlist[i] = tablelist[i] * mul + add[i];
@@ -11269,7 +11269,7 @@ TableScale_readframes_aa(TableScale *self) {
 
     MYFLT *mul = Stream_getData((Stream *)self->mul_stream);
     MYFLT *add = Stream_getData((Stream *)self->add_stream);
-    
+
     num = size < osize ? size : osize;
     for (i=0; i<num; i++) {
         outlist[i] = tablelist[i] * mul[i] + add[i];
@@ -11283,25 +11283,25 @@ TableScale_setProcMode(TableScale *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = TableScale_readframes_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = TableScale_readframes_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = TableScale_readframes_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = TableScale_readframes_aa;
             break;
-    } 
+    }
 }
 
 static void
 TableScale_compute_next_data_frame(TableScale *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -11313,7 +11313,7 @@ TableScale_traverse(TableScale *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 TableScale_clear(TableScale *self)
 {
     pyo_CLEAR
@@ -11337,26 +11337,26 @@ TableScale_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *tabletmp, *outtabletmp, *multmp=NULL, *addtmp=NULL;
     TableScale *self;
     self = (TableScale *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TableScale_compute_next_data_frame);
     self->mode_func_ptr = TableScale_setProcMode;
 
     static char *kwlist[] = {"table", "outtable", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist, &tabletmp, &outtabletmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if ( PyObject_HasAttrString((PyObject *)tabletmp, "getTableStream") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"table\" argument of TableScale must be a PyoTableObject.\n");
         Py_RETURN_NONE;
     }
     Py_XDECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tabletmp, "getTableStream", "");
-    
+
     if ( PyObject_HasAttrString((PyObject *)outtabletmp, "getTableStream") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"outtable\" argument of TableScale must be a PyoTableObject.\n");
         Py_RETURN_NONE;
@@ -11371,20 +11371,20 @@ TableScale_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * TableScale_getServer(TableScale* self) { GET_SERVER };
 static PyObject * TableScale_getStream(TableScale* self) { GET_STREAM };
-static PyObject * TableScale_setMul(TableScale *self, PyObject *arg) { SET_MUL };	
-static PyObject * TableScale_setAdd(TableScale *self, PyObject *arg) { SET_ADD };	
-static PyObject * TableScale_setSub(TableScale *self, PyObject *arg) { SET_SUB };	
-static PyObject * TableScale_setDiv(TableScale *self, PyObject *arg) { SET_DIV };	
+static PyObject * TableScale_setMul(TableScale *self, PyObject *arg) { SET_MUL };
+static PyObject * TableScale_setAdd(TableScale *self, PyObject *arg) { SET_ADD };
+static PyObject * TableScale_setSub(TableScale *self, PyObject *arg) { SET_SUB };
+static PyObject * TableScale_setDiv(TableScale *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TableScale_play(TableScale *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TableScale_out(TableScale *self, PyObject *args, PyObject *kwds) { OUT };
@@ -11410,19 +11410,19 @@ static PyObject *
 TableScale_setTable(TableScale *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TableScale_getOuttable(TableScale* self)
@@ -11435,19 +11435,19 @@ static PyObject *
 TableScale_setOuttable(TableScale *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->outtable);
     self->outtable = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef TableScale_members[] = {
 {"server", T_OBJECT_EX, offsetof(TableScale, server), 0, "Pyo server."},
diff --git a/src/objects/oscmodule.c b/src/objects/oscmodule.c
index 65cd201..569029c 100644
--- a/src/objects/oscmodule.c
+++ b/src/objects/oscmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -71,7 +71,7 @@ OscReceiver_traverse(OscReceiver *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 OscReceiver_clear(OscReceiver *self)
 {
     pyo_CLEAR
@@ -96,45 +96,45 @@ OscReceiver_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *pathtmp;
     OscReceiver *self;
     self = (OscReceiver *)type->tp_alloc(type, 0);
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, OscReceiver_compute_next_data_frame);
 
     static char *kwlist[] = {"port", "address", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "iO", kwlist, &self->port, &pathtmp))
         Py_RETURN_NONE;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->dict = PyDict_New();
-    
+
     if (PyString_Check(pathtmp) || PyList_Check(pathtmp)) {
-        Py_INCREF(pathtmp);    
+        Py_INCREF(pathtmp);
         Py_XDECREF(self->address_path);
         self->address_path = pathtmp;
     }
     else {
         PyErr_SetString(PyExc_TypeError, "The address attributes must be a string or a list of strings.");
         Py_RETURN_NONE;
-    }    
-    
+    }
+
     if (PyString_Check(self->address_path)) {
         PyDict_SetItem(self->dict, self->address_path, PyFloat_FromDouble(0.));
-    }    
+    }
     else if (PyList_Check(self->address_path)) {
         int lsize = PyList_Size(self->address_path);
         for (i=0; i<lsize; i++) {
             PyDict_SetItem(self->dict, PyList_GET_ITEM(self->address_path, i), PyFloat_FromDouble(0.));
-        }    
+        }
     }
-    
+
     char buf[20];
     sprintf(buf, "%i", self->port);
     self->osc_server = lo_server_new(buf, error);
-    
+
     lo_server_add_method(self->osc_server, NULL, TYPE_F, OscReceiver_handler, self);
-    
+
     return (PyObject *)self;
 }
 
@@ -144,13 +144,13 @@ OscReceiver_addAddress(OscReceiver *self, PyObject *arg)
     int i;
     if (PyString_Check(arg)) {
         PyDict_SetItem(self->dict, arg, PyFloat_FromDouble(0.));
-    }    
+    }
     else if (PyList_Check(arg)) {
         Py_ssize_t lsize = PyList_Size(arg);
         for (i=0; i<lsize; i++) {
             PyDict_SetItem(self->dict, PyList_GET_ITEM(arg, i), PyFloat_FromDouble(0.));
-        }    
-    } 
+        }
+    }
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -161,13 +161,13 @@ OscReceiver_delAddress(OscReceiver *self, PyObject *arg)
     int i;
     if (PyString_Check(arg)) {
         PyDict_DelItem(self->dict, arg);
-    }    
+    }
     else if (PyList_Check(arg)) {
         Py_ssize_t lsize = PyList_Size(arg);
         for (i=0; i<lsize; i++) {
             PyDict_DelItem(self->dict, PyList_GET_ITEM(arg, i));
-        }    
-    } 
+        }
+    }
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -176,16 +176,16 @@ static PyObject *
 OscReceiver_setValue(OscReceiver *self, PyObject *args, PyObject *kwds)
 {
     PyObject *address, *value;
-    
+
     static char *kwlist[] = {"address", "value", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist, &address, &value))
         Py_RETURN_NONE;
 
     PyDict_SetItem(self->dict, address, value);
     Py_RETURN_NONE;
 }
-  
+
 static PyObject * OscReceiver_getServer(OscReceiver* self) { GET_SERVER };
 static PyObject * OscReceiver_getStream(OscReceiver* self) { GET_STREAM };
 
@@ -272,33 +272,33 @@ OscReceive_setProcMode(OscReceive *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = OscReceive_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = OscReceive_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = OscReceive_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = OscReceive_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = OscReceive_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = OscReceive_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = OscReceive_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = OscReceive_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = OscReceive_postprocessing_revareva;
             break;
     }
@@ -309,17 +309,17 @@ OscReceive_compute_next_data_frame(OscReceive *self)
 {
     int i;
     MYFLT val = OscReceiver_getValue((OscReceiver *)self->input, self->address_path);
-    
+
     if (self->interpolation == 1) {
-        
+
         for (i=0; i<self->bufsize; i++) {
             self->data[i] = self->value = self->value + (val - self->value) * self->factor;
-        }  
+        }
     }
     else {
         for (i=0; i<self->bufsize; i++) {
             self->data[i] = self->value = val;
-        }  
+        }
     }
 
     (*self->muladd_func_ptr)(self);
@@ -334,7 +334,7 @@ OscReceive_traverse(OscReceive *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 OscReceive_clear(OscReceive *self)
 {
     pyo_CLEAR
@@ -383,22 +383,22 @@ OscReceive_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     if (! PyString_Check(pathtmp)) {
         PyErr_SetString(PyExc_TypeError, "The address attributes must be a string.");
         Py_RETURN_NONE;
-    }    
-        
-    Py_INCREF(pathtmp);    
+    }
+
+    Py_INCREF(pathtmp);
     Py_XDECREF(self->address_path);
     self->address_path = pathtmp;
-        
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -411,19 +411,19 @@ OscReceive_setInterpolation(OscReceive *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->interpolation = PyInt_AsLong(arg);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
 
 static PyObject * OscReceive_getServer(OscReceive* self) { GET_SERVER };
 static PyObject * OscReceive_getStream(OscReceive* self) { GET_STREAM };
-static PyObject * OscReceive_setMul(OscReceive *self, PyObject *arg) { SET_MUL };	
-static PyObject * OscReceive_setAdd(OscReceive *self, PyObject *arg) { SET_ADD };	
-static PyObject * OscReceive_setSub(OscReceive *self, PyObject *arg) { SET_SUB };	
-static PyObject * OscReceive_setDiv(OscReceive *self, PyObject *arg) { SET_DIV };	
+static PyObject * OscReceive_setMul(OscReceive *self, PyObject *arg) { SET_MUL };
+static PyObject * OscReceive_setAdd(OscReceive *self, PyObject *arg) { SET_ADD };
+static PyObject * OscReceive_setSub(OscReceive *self, PyObject *arg) { SET_SUB };
+static PyObject * OscReceive_setDiv(OscReceive *self, PyObject *arg) { SET_DIV };
 
 static PyObject * OscReceive_play(OscReceive *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * OscReceive_stop(OscReceive *self) { STOP };
@@ -563,9 +563,9 @@ OscSend_compute_next_data_frame(OscSend *self)
         self->count = 0;
         MYFLT *in = Stream_getData((Stream *)self->input_stream);
         float value = (float)in[0];
-    
+
         char *path  = PyString_AsString(self->address_path);
-    
+
         if (lo_send(self->address, path, "f", value) == -1) {
             printf("OSC error %d: %s\n", lo_address_errno(self->address), lo_address_errstr(self->address));
         }
@@ -582,7 +582,7 @@ OscSend_traverse(OscSend *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 OscSend_clear(OscSend *self)
 {
     pyo_CLEAR
@@ -607,36 +607,36 @@ OscSend_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *pathtmp;
     OscSend *self;
     self = (OscSend *)type->tp_alloc(type, 0);
-    
+
     self->host = NULL;
     self->count = 0;
     self->bufrate = 1;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, OscSend_compute_next_data_frame);
 
     static char *kwlist[] = {"input", "port", "address", "host", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OiO|s", kwlist, &inputtmp, &self->port, &pathtmp, &self->host))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     if (! PyString_Check(pathtmp)) {
         PyErr_SetString(PyExc_TypeError, "The address attributes must be a string.");
         Py_RETURN_NONE;
-    }    
-    
-    Py_INCREF(pathtmp);    
+    }
+
+    Py_INCREF(pathtmp);
     Py_XDECREF(self->address_path);
     self->address_path = pathtmp;
-    
+
     char buf[20];
     sprintf(buf, "%i", self->port);
     self->address = lo_address_new(self->host, buf);
-    
+
     return (PyObject *)self;
 }
 
@@ -647,11 +647,11 @@ OscSend_setBufferRate(OscSend *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->bufrate = PyInt_AsLong(arg);
     if (self->bufrate < 1)
         self->bufrate = 1;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -735,11 +735,11 @@ typedef struct {
 
 static void
 OscDataSend_compute_next_data_frame(OscDataSend *self)
-{    
+{
     int i;
     lo_message *msg;
     char *path  = PyString_AsString(self->address_path);
-        
+
     if (self->something_to_send == 1) {
         msg = lo_message_new();
 
@@ -770,7 +770,7 @@ OscDataSend_compute_next_data_frame(OscDataSend *self)
         self->something_to_send = 0;
         lo_message_free(msg);
     }
-    
+
 }
 
 static int
@@ -782,7 +782,7 @@ OscDataSend_traverse(OscDataSend *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 OscDataSend_clear(OscDataSend *self)
 {
     pyo_CLEAR
@@ -806,34 +806,34 @@ OscDataSend_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *pathtmp;
     OscDataSend *self;
     self = (OscDataSend *)type->tp_alloc(type, 0);
-    
+
     self->host = NULL;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, OscDataSend_compute_next_data_frame);
 
     static char *kwlist[] = {"types", "port", "address", "host", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "siO|s", kwlist, &self->types, &self->port, &pathtmp, &self->host))
         Py_RETURN_NONE;
 
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     if (! PyString_Check(pathtmp)) {
         PyErr_SetString(PyExc_TypeError, "The address attributes must be a string.");
         Py_RETURN_NONE;
-    }    
-    
+    }
+
     self->num_items = strlen(self->types);
-    
-    Py_INCREF(pathtmp);    
+
+    Py_INCREF(pathtmp);
     Py_XDECREF(self->address_path);
     self->address_path = pathtmp;
-    
+
     char buf[20];
     sprintf(buf, "%i", self->port);
     self->address = lo_address_new(self->host, buf);
-    
+
     return (PyObject *)self;
 }
 
@@ -845,14 +845,14 @@ static PyObject * OscDataSend_stop(OscDataSend *self) { STOP };
 
 static PyObject *
 OscDataSend_send(OscDataSend *self, PyObject *arg)
-{	
+{
     PyObject *tmp;
-    
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     if (PyList_Check(arg)) {
         tmp = arg;
         Py_XDECREF(self->value);
@@ -865,7 +865,7 @@ OscDataSend_send(OscDataSend *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef OscDataSend_members[] = {
     {"server", T_OBJECT_EX, offsetof(OscDataSend, server), 0, "Pyo server."},
@@ -940,7 +940,7 @@ int OscDataReceive_handler(const char *path, const char *types, lo_arg **argv, i
     PyObject *tup, *result=NULL;
     tup = PyTuple_New(argc+1);
     int i, ok = 0;
-    
+
     Py_ssize_t lsize = PyList_Size(self->address_path);
     for (i=0; i<lsize; i++) {
         if (lo_pattern_match(path, PyString_AsString(PyList_GetItem(self->address_path, i)))) {
@@ -948,7 +948,7 @@ int OscDataReceive_handler(const char *path, const char *types, lo_arg **argv, i
             break;
         }
     }
-    
+
     if (ok) {
         PyTuple_SetItem(tup, 0, PyString_FromString(path));
         for (i=0; i<argc; i++) {
@@ -972,7 +972,7 @@ int OscDataReceive_handler(const char *path, const char *types, lo_arg **argv, i
                     break;
             }
         }
-        result = PyObject_Call(self->callable, tup, NULL);     
+        result = PyObject_Call(self->callable, tup, NULL);
         if (result == NULL)
             PyErr_Print();
     }
@@ -996,7 +996,7 @@ OscDataReceive_traverse(OscDataReceive *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 OscDataReceive_clear(OscDataReceive *self)
 {
     pyo_CLEAR
@@ -1021,36 +1021,36 @@ OscDataReceive_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *pathtmp, *calltmp;
     OscDataReceive *self;
     self = (OscDataReceive *)type->tp_alloc(type, 0);
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, OscDataReceive_compute_next_data_frame);
 
     static char *kwlist[] = {"port", "address", "callable", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "iOO", kwlist, &self->port, &pathtmp, &calltmp))
         Py_RETURN_NONE;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     Py_XDECREF(self->callable);
     self->callable = calltmp;
-    
+
     if (PyString_Check(pathtmp) || PyList_Check(pathtmp)) {
-        Py_INCREF(pathtmp);    
+        Py_INCREF(pathtmp);
         Py_XDECREF(self->address_path);
         self->address_path = pathtmp;
     }
     else {
         PyErr_SetString(PyExc_TypeError, "The address attributes must be a string or a list of strings.");
         Py_RETURN_NONE;
-    }    
+    }
 
     char buf[20];
     sprintf(buf, "%i", self->port);
     self->osc_server = lo_server_new(buf, error);
-    
+
     lo_server_add_method(self->osc_server, NULL, NULL, OscDataReceive_handler, self);
-    
+
     return (PyObject *)self;
 }
 
@@ -1173,7 +1173,7 @@ int OscListReceiver_handler(const char *path, const char *types, lo_arg **argv,
     return 0;
 }
 
-PyObject * 
+PyObject *
 OscListReceiver_getValue(OscListReceiver *self, PyObject *path)
 {
     PyObject *tmp;
@@ -1196,7 +1196,7 @@ OscListReceiver_traverse(OscListReceiver *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 OscListReceiver_clear(OscListReceiver *self)
 {
     pyo_CLEAR
@@ -1221,30 +1221,30 @@ OscListReceiver_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *pathtmp, *flist;
     OscListReceiver *self;
     self = (OscListReceiver *)type->tp_alloc(type, 0);
-    
+
     self->num = 8;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, OscListReceiver_compute_next_data_frame);
 
     static char *kwlist[] = {"port", "address", "num", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "iO|i", kwlist, &self->port, &pathtmp, &self->num))
         Py_RETURN_NONE;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->dict = PyDict_New();
-    
+
     if (PyString_Check(pathtmp) || PyList_Check(pathtmp)) {
-        Py_INCREF(pathtmp);    
+        Py_INCREF(pathtmp);
         Py_XDECREF(self->address_path);
         self->address_path = pathtmp;
     }
     else {
         PyErr_SetString(PyExc_TypeError, "The address attributes must be a string or a list of strings.");
         Py_RETURN_NONE;
-    }    
+    }
 
     if (PyString_Check(self->address_path)) {
         flist = PyList_New(self->num);
@@ -1252,7 +1252,7 @@ OscListReceiver_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
             PyList_SET_ITEM(flist, j, PyFloat_FromDouble(0.));
         }
         PyDict_SetItem(self->dict, self->address_path, flist);
-    }    
+    }
     else if (PyList_Check(self->address_path)) {
         int lsize = PyList_Size(self->address_path);
         for (i=0; i<lsize; i++) {
@@ -1261,15 +1261,15 @@ OscListReceiver_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
                 PyList_SET_ITEM(flist, j, PyFloat_FromDouble(0.));
             }
             PyDict_SetItem(self->dict, PyList_GET_ITEM(self->address_path, i), flist);
-        }    
+        }
     }
-    
+
     char buf[20];
     sprintf(buf, "%i", self->port);
     self->osc_server = lo_server_new(buf, error);
-    
+
     lo_server_add_method(self->osc_server, NULL, NULL, OscListReceiver_handler, self);
-    
+
     return (PyObject *)self;
 }
 
@@ -1285,7 +1285,7 @@ OscListReceiver_addAddress(OscListReceiver *self, PyObject *arg)
             PyList_SET_ITEM(flist, j, PyFloat_FromDouble(0.));
         }
         PyDict_SetItem(self->dict, arg, flist);
-    }    
+    }
     else if (PyList_Check(arg)) {
         Py_ssize_t lsize = PyList_Size(arg);
         for (i=0; i<lsize; i++) {
@@ -1294,8 +1294,8 @@ OscListReceiver_addAddress(OscListReceiver *self, PyObject *arg)
                 PyList_SET_ITEM(flist, j, PyFloat_FromDouble(0.));
             }
             PyDict_SetItem(self->dict, PyList_GET_ITEM(arg, i), flist);
-        }    
-    } 
+        }
+    }
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -1306,13 +1306,13 @@ OscListReceiver_delAddress(OscListReceiver *self, PyObject *arg)
     int i;
     if (PyString_Check(arg)) {
         PyDict_DelItem(self->dict, arg);
-    }    
+    }
     else if (PyList_Check(arg)) {
         Py_ssize_t lsize = PyList_Size(arg);
         for (i=0; i<lsize; i++) {
             PyDict_DelItem(self->dict, PyList_GET_ITEM(arg, i));
-        }    
-    } 
+        }
+    }
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -1323,10 +1323,10 @@ OscListReceiver_setValue(OscListReceiver *self, PyObject *args, PyObject *kwds)
     PyObject *address, *value;
 
     static char *kwlist[] = {"address", "value", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist, &address, &value))
         Py_RETURN_NONE;
-    
+
     PyDict_SetItem(self->dict, address, value);
     Py_RETURN_NONE;
 }
@@ -1418,33 +1418,33 @@ OscListReceive_setProcMode(OscListReceive *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = OscListReceive_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = OscListReceive_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = OscListReceive_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = OscListReceive_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = OscListReceive_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = OscListReceive_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = OscListReceive_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = OscListReceive_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = OscListReceive_postprocessing_revareva;
             break;
     }
@@ -1458,17 +1458,17 @@ OscListReceive_compute_next_data_frame(OscListReceive *self)
     MYFLT val = PyFloat_AsDouble(PyList_GET_ITEM(flist, self->order));
 
     if (self->interpolation == 1) {
-        
+
         for (i=0; i<self->bufsize; i++) {
             self->data[i] = self->value = self->value + (val - self->value) * self->factor;
-        }  
+        }
     }
     else {
         for (i=0; i<self->bufsize; i++) {
             self->data[i] = self->value = val;
-        }  
+        }
     }
-    
+
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1481,7 +1481,7 @@ OscListReceive_traverse(OscListReceive *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 OscListReceive_clear(OscListReceive *self)
 {
     pyo_CLEAR
@@ -1505,50 +1505,50 @@ OscListReceive_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp=NULL, *pathtmp=NULL, *multmp=NULL, *addtmp=NULL;;
     OscListReceive *self;
     self = (OscListReceive *)type->tp_alloc(type, 0);
-    
+
     self->order = 0;
     self->value = 0.;
     self->interpolation = 1;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
-    
+
     self->factor = 1. / (0.01 * self->sr);
-    
+
     Stream_setFunctionPtr(self->stream, OscListReceive_compute_next_data_frame);
     self->mode_func_ptr = OscListReceive_setProcMode;
 
     static char *kwlist[] = {"input", "address", "order", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OOi|OO", kwlist, &inputtmp, &pathtmp, &self->order, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->input);
     Py_INCREF(inputtmp);
     self->input = inputtmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     if (! PyString_Check(pathtmp)) {
         PyErr_SetString(PyExc_TypeError, "The address attributes must be a string.");
         Py_RETURN_NONE;
-    }    
-    
-    Py_INCREF(pathtmp);    
+    }
+
+    Py_INCREF(pathtmp);
     Py_XDECREF(self->address_path);
     self->address_path = pathtmp;
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
@@ -1559,19 +1559,19 @@ OscListReceive_setInterpolation(OscListReceive *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->interpolation = PyInt_AsLong(arg);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
 
 static PyObject * OscListReceive_getServer(OscListReceive* self) { GET_SERVER };
 static PyObject * OscListReceive_getStream(OscListReceive* self) { GET_STREAM };
-static PyObject * OscListReceive_setMul(OscListReceive *self, PyObject *arg) { SET_MUL };	
-static PyObject * OscListReceive_setAdd(OscListReceive *self, PyObject *arg) { SET_ADD };	
-static PyObject * OscListReceive_setSub(OscListReceive *self, PyObject *arg) { SET_SUB };	
-static PyObject * OscListReceive_setDiv(OscListReceive *self, PyObject *arg) { SET_DIV };	
+static PyObject * OscListReceive_setMul(OscListReceive *self, PyObject *arg) { SET_MUL };
+static PyObject * OscListReceive_setAdd(OscListReceive *self, PyObject *arg) { SET_ADD };
+static PyObject * OscListReceive_setSub(OscListReceive *self, PyObject *arg) { SET_SUB };
+static PyObject * OscListReceive_setDiv(OscListReceive *self, PyObject *arg) { SET_DIV };
 
 static PyObject * OscListReceive_play(OscListReceive *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * OscListReceive_stop(OscListReceive *self) { STOP };
@@ -1688,4 +1688,4 @@ PyTypeObject OscListReceiveType = {
     0,      /* tp_init */
     0,                         /* tp_alloc */
     OscListReceive_new,                 /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/panmodule.c b/src/objects/panmodule.c
index 7cdc876..4b5d858 100644
--- a/src/objects/panmodule.c
+++ b/src/objects/panmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -53,10 +53,10 @@ static void
 Panner_splitter_thru(Panner *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->buffer_streams[i] = in[i];
-    }    
+    }
 }
 
 static void
@@ -64,17 +64,17 @@ Panner_splitter_st_i(Panner *self) {
     MYFLT val, inval;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     MYFLT pan = PyFloat_AS_DOUBLE(self->pan);
     pan = P_clip(pan);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
         val = inval * MYSQRT(1.0 - pan);
         self->buffer_streams[i] = val;
         val = inval * MYSQRT(pan);
         self->buffer_streams[i+self->bufsize] = val;
-    }    
+    }
 }
 
 static void
@@ -82,9 +82,9 @@ Panner_splitter_st_a(Panner *self) {
     MYFLT val, inval, panval;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     MYFLT *pan = Stream_getData((Stream *)self->pan_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
         panval = P_clip(pan[i]);
@@ -92,7 +92,7 @@ Panner_splitter_st_a(Panner *self) {
         self->buffer_streams[i] = val;
         val = inval * MYSQRT(panval);
         self->buffer_streams[i+self->bufsize] = val;
-    }    
+    }
 }
 
 static void
@@ -103,10 +103,10 @@ Panner_splitter_ii(Panner *self) {
 
     MYFLT pan = PyFloat_AS_DOUBLE(self->pan);
     MYFLT spd = PyFloat_AS_DOUBLE(self->spread);
-    
+
     pan = P_clip(pan);
     spd = P_clip(spd);
-    
+
     sprd = 20.0 - (MYSQRT(spd) * 20.0) + 0.1;
 
     for (i=0; i<self->bufsize; i++) {
@@ -116,7 +116,7 @@ Panner_splitter_ii(Panner *self) {
             val = inval * MYPOW(MYCOS((pan - phase) * TWOPI) * 0.5 + 0.5, sprd);
             self->buffer_streams[i+j*self->bufsize] = val;
         }
-    }    
+    }
 }
 
 static void
@@ -124,14 +124,14 @@ Panner_splitter_ai(Panner *self) {
     MYFLT val, inval, phase, sprd;
     int j, i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     MYFLT *pan = Stream_getData((Stream *)self->pan_stream);
     MYFLT spd = PyFloat_AS_DOUBLE(self->spread);
 
     spd = P_clip(spd);
-    
+
     sprd = 20.0 - (MYSQRT(spd) * 20.0) + 0.1;
-    
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
         for (j=0; j<self->chnls; j++) {
@@ -139,7 +139,7 @@ Panner_splitter_ai(Panner *self) {
             val = inval * MYPOW(MYCOS((P_clip(pan[i]) - phase) * TWOPI) * 0.5 + 0.5, sprd);
             self->buffer_streams[i+j*self->bufsize] = val;
         }
-    }    
+    }
 }
 
 static void
@@ -147,12 +147,12 @@ Panner_splitter_ia(Panner *self) {
     MYFLT val, inval, phase, spdval, sprd;
     int j, i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     MYFLT pan = PyFloat_AS_DOUBLE(self->pan);
     MYFLT *spd = Stream_getData((Stream *)self->spread_stream);
 
     pan = P_clip(pan);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
         spdval = P_clip(spd[i]);
@@ -162,7 +162,7 @@ Panner_splitter_ia(Panner *self) {
             val = inval * MYPOW(MYCOS((pan - phase) * TWOPI) * 0.5 + 0.5, sprd);
             self->buffer_streams[i+j*self->bufsize] = val;
         }
-    }    
+    }
 }
 
 static void
@@ -170,11 +170,11 @@ Panner_splitter_aa(Panner *self) {
     MYFLT val, inval, phase, spdval, sprd;
     int j, i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     MYFLT *pan = Stream_getData((Stream *)self->pan_stream);
     MYFLT *spd = Stream_getData((Stream *)self->spread_stream);
-    
-    
+
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
         spdval = P_clip(spd[i]);
@@ -184,56 +184,56 @@ Panner_splitter_aa(Panner *self) {
             val = inval * MYPOW(MYCOS((P_clip(pan[i]) - phase) * TWOPI) * 0.5 + 0.5, sprd);
             self->buffer_streams[i+j*self->bufsize] = val;
         }
-    }    
+    }
 }
 
 MYFLT *
 Panner_getSamplesBuffer(Panner *self)
 {
     return (MYFLT *)self->buffer_streams;
-}    
+}
 
 static void
 Panner_setProcMode(Panner *self)
-{        
+{
     int procmode;
     procmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
     if (self->chnls > 2) {
         switch (procmode) {
-            case 0:        
+            case 0:
                 self->proc_func_ptr = Panner_splitter_ii;
                 break;
-            case 1:    
+            case 1:
                 self->proc_func_ptr = Panner_splitter_ai;
                 break;
-            case 10:    
+            case 10:
                 self->proc_func_ptr = Panner_splitter_ia;
                 break;
-            case 11:    
+            case 11:
                 self->proc_func_ptr = Panner_splitter_aa;
                 break;
-        }         
-    } 
+        }
+    }
     else if (self->chnls == 2) {
         switch (self->modebuffer[0]) {
-            case 0:        
+            case 0:
                 self->proc_func_ptr = Panner_splitter_st_i;
                 break;
-            case 1:    
+            case 1:
                 self->proc_func_ptr = Panner_splitter_st_a;
                 break;
-        }         
-    }         
+        }
+    }
     else if (self->chnls == 1) {
         self->proc_func_ptr = Panner_splitter_thru;
-    }         
+    }
 }
 
 static void
 Panner_compute_next_data_frame(Panner *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -249,7 +249,7 @@ Panner_traverse(Panner *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Panner_clear(Panner *self)
 {
     pyo_CLEAR
@@ -278,7 +278,7 @@ Panner_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *pantmp=NULL, *spreadtmp=NULL;
     Panner *self;
     self = (Panner *)type->tp_alloc(type, 0);
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Panner_compute_next_data_frame);
     self->mode_func_ptr = Panner_setProcMode;
@@ -326,14 +326,14 @@ static PyObject *
 Panner_setPan(Panner *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->pan);
@@ -349,25 +349,25 @@ Panner_setPan(Panner *self, PyObject *arg)
         self->pan_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Panner_setSpread(Panner *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->spread);
@@ -383,12 +383,12 @@ Panner_setSpread(Panner *self, PyObject *arg)
         self->spread_stream = (Stream *)streamtmp;
 		self->modebuffer[1] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Panner_members[] = {
 {"server", T_OBJECT_EX, offsetof(Panner, server), 0, "Pyo server."},
@@ -476,33 +476,33 @@ Pan_setProcMode(Pan *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Pan_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Pan_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Pan_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Pan_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Pan_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Pan_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Pan_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Pan_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Pan_postprocessing_revareva;
             break;
     }
@@ -517,7 +517,7 @@ Pan_compute_next_data_frame(Pan *self)
     tmp = Panner_getSamplesBuffer((Panner *)self->mainSplitter);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -529,11 +529,11 @@ Pan_traverse(Pan *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Pan_clear(Pan *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainSplitter);    
+    Py_CLEAR(self->mainSplitter);
     return 0;
 }
 
@@ -552,44 +552,44 @@ Pan_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL, *multmp=NULL, *addtmp=NULL;
     Pan *self;
     self = (Pan *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Pan_compute_next_data_frame);
     self->mode_func_ptr = Pan_setProcMode;
 
     static char *kwlist[] = {"mainSplitter", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "Oi|OO", kwlist, &maintmp, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainSplitter);
     Py_INCREF(maintmp);
     self->mainSplitter = (Panner *)maintmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Pan_getServer(Pan* self) { GET_SERVER };
 static PyObject * Pan_getStream(Pan* self) { GET_STREAM };
-static PyObject * Pan_setMul(Pan *self, PyObject *arg) { SET_MUL };	
-static PyObject * Pan_setAdd(Pan *self, PyObject *arg) { SET_ADD };	
-static PyObject * Pan_setSub(Pan *self, PyObject *arg) { SET_SUB };	
-static PyObject * Pan_setDiv(Pan *self, PyObject *arg) { SET_DIV };	
+static PyObject * Pan_setMul(Pan *self, PyObject *arg) { SET_MUL };
+static PyObject * Pan_setAdd(Pan *self, PyObject *arg) { SET_ADD };
+static PyObject * Pan_setSub(Pan *self, PyObject *arg) { SET_SUB };
+static PyObject * Pan_setDiv(Pan *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Pan_play(Pan *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Pan_out(Pan *self, PyObject *args, PyObject *kwds) { OUT };
@@ -729,10 +729,10 @@ static void
 SPanner_splitter_thru(SPanner *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->buffer_streams[i] = in[i];
-    }    
+    }
 }
 
 static void
@@ -740,17 +740,17 @@ SPanner_splitter_st_i(SPanner *self) {
     MYFLT val, inval;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     MYFLT pan = PyFloat_AS_DOUBLE(self->pan);
     pan = P_clip(pan);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
         val = inval * MYSQRT(1.0 - pan);
         self->buffer_streams[i] = val;
         val = inval * MYSQRT(pan);
         self->buffer_streams[i+self->bufsize] = val;
-    }    
+    }
 }
 
 static void
@@ -758,9 +758,9 @@ SPanner_splitter_st_a(SPanner *self) {
     MYFLT val, inval, panval;
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     MYFLT *pan = Stream_getData((Stream *)self->pan_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
         panval = P_clip(pan[i]);
@@ -768,7 +768,7 @@ SPanner_splitter_st_a(SPanner *self) {
         self->buffer_streams[i] = val;
         val = inval * MYSQRT(panval);
         self->buffer_streams[i+self->bufsize] = val;
-    }    
+    }
 }
 
 static void
@@ -783,7 +783,7 @@ SPanner_splitter_i(SPanner *self) {
         self->buffer_streams[i+self->k1] = 0.0;
         self->buffer_streams[i+self->k2] = 0.0;
     }
-    
+
     min = 0;
     self->k1 = 0;
     self->k2 = self->bufsize;
@@ -799,7 +799,7 @@ SPanner_splitter_i(SPanner *self) {
                 self->k2 = j * self->bufsize;
             break;
         }
-    }    
+    }
 
     pan = P_clip((pan - min) * self->chnls);
     pan1 = MYSQRT(1.0 - pan);
@@ -810,7 +810,7 @@ SPanner_splitter_i(SPanner *self) {
         self->buffer_streams[i+self->k1] = val;
         val = inval * pan2;
         self->buffer_streams[i+self->k2] = val;
-    }    
+    }
 }
 
 static void
@@ -820,19 +820,19 @@ SPanner_splitter_a(SPanner *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *apan = Stream_getData((Stream *)self->pan_stream);
     MYFLT fchnls = (MYFLT)self->chnls;
-    
+
     len = self->chnls * self->bufsize;
     for (i=0; i<len; i++) {
         self->buffer_streams[i] = 0.0;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         pan = apan[i];
         inval = in[i];
         min = 0;
         self->k1 = 0;
         self->k2 = self->bufsize;
-        
+
         for (j=self->chnls; j>0; j--) {
             j1 = j - 1;
             min = j1 / fchnls;
@@ -840,61 +840,61 @@ SPanner_splitter_a(SPanner *self) {
                 self->k1 = j1 * self->bufsize;
                 if (j == self->chnls)
                     self->k2 = 0;
-                else                    
+                else
                     self->k2 = j * self->bufsize;
                 break;
             }
-        }    
-        
+        }
+
         pan = P_clip((pan - min) * self->chnls);
         val = inval * MYSQRT(1.0 - pan);
         self->buffer_streams[i+self->k1] = val;
         val = inval * MYSQRT(pan);
         self->buffer_streams[i+self->k2] = val;
-    }    
+    }
 }
 
 MYFLT *
 SPanner_getSamplesBuffer(SPanner *self)
 {
     return (MYFLT *)self->buffer_streams;
-}    
+}
 
 static void
 SPanner_setProcMode(SPanner *self)
-{        
+{
     int procmode;
     procmode = self->modebuffer[0];
-    
+
     if (self->chnls > 2) {
         switch (procmode) {
-            case 0:        
+            case 0:
                 self->proc_func_ptr = SPanner_splitter_i;
                 break;
-            case 1:    
+            case 1:
                 self->proc_func_ptr = SPanner_splitter_a;
                 break;
-        }         
-    } 
+        }
+    }
     else if (self->chnls == 2) {
         switch (self->modebuffer[0]) {
-            case 0:        
+            case 0:
                 self->proc_func_ptr = SPanner_splitter_st_i;
                 break;
-            case 1:    
+            case 1:
                 self->proc_func_ptr = SPanner_splitter_st_a;
                 break;
-        }         
-    }         
+        }
+    }
     else if (self->chnls == 1) {
             self->proc_func_ptr = SPanner_splitter_thru;
-    }         
+    }
 }
 
 static void
 SPanner_compute_next_data_frame(SPanner *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -908,7 +908,7 @@ SPanner_traverse(SPanner *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 SPanner_clear(SPanner *self)
 {
     pyo_CLEAR
@@ -935,11 +935,11 @@ SPanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *pantmp=NULL;
     SPanner *self;
     self = (SPanner *)type->tp_alloc(type, 0);
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, SPanner_compute_next_data_frame);
     self->mode_func_ptr = SPanner_setProcMode;
-    
+
     self->pan = PyFloat_FromDouble(0.5);
     self->chnls = 2;
     self->k1 = 0;
@@ -947,12 +947,12 @@ SPanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->modebuffer[0] = 0;
 
     static char *kwlist[] = {"input", "outs", "pan", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iO", kwlist, &inputtmp, &self->chnls, &pantmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (pantmp) {
         PyObject_CallMethod((PyObject *)self, "setPan", "O", pantmp);
     }
@@ -961,16 +961,16 @@ SPanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     if (self->chnls < 1)
         self->chnls = 1;
-    
+
     self->buffer_streams = (MYFLT *)realloc(self->buffer_streams, self->chnls * self->bufsize * sizeof(MYFLT));
-    
+
     (*self->mode_func_ptr)(self);
 
     int len = self->chnls*self->bufsize;
     for (i=0; i<len; i++) {
         self->buffer_streams[i] = 0.0;
     }
-    
+
     return (PyObject *)self;
 }
 
@@ -984,14 +984,14 @@ static PyObject *
 SPanner_setPan(SPanner *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->pan);
@@ -1007,12 +1007,12 @@ SPanner_setPan(SPanner *self, PyObject *arg)
         self->pan_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef SPanner_members[] = {
 {"server", T_OBJECT_EX, offsetof(SPanner, server), 0, "Pyo server."},
@@ -1098,33 +1098,33 @@ SPan_setProcMode(SPan *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = SPan_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = SPan_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = SPan_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = SPan_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = SPan_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = SPan_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = SPan_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = SPan_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = SPan_postprocessing_revareva;
             break;
     }
@@ -1139,7 +1139,7 @@ SPan_compute_next_data_frame(SPan *self)
     tmp = SPanner_getSamplesBuffer((SPanner *)self->mainSplitter);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1151,11 +1151,11 @@ SPan_traverse(SPan *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 SPan_clear(SPan *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainSplitter);    
+    Py_CLEAR(self->mainSplitter);
     return 0;
 }
 
@@ -1174,44 +1174,44 @@ SPan_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL, *multmp=NULL, *addtmp=NULL;
     SPan *self;
     self = (SPan *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, SPan_compute_next_data_frame);
     self->mode_func_ptr = SPan_setProcMode;
 
     static char *kwlist[] = {"mainSplitter", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "Oi|OO", kwlist, &maintmp, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainSplitter);
     Py_INCREF(maintmp);
     self->mainSplitter = (SPanner *)maintmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * SPan_getServer(SPan* self) { GET_SERVER };
 static PyObject * SPan_getStream(SPan* self) { GET_STREAM };
-static PyObject * SPan_setMul(SPan *self, PyObject *arg) { SET_MUL };	
-static PyObject * SPan_setAdd(SPan *self, PyObject *arg) { SET_ADD };	
-static PyObject * SPan_setSub(SPan *self, PyObject *arg) { SET_SUB };	
-static PyObject * SPan_setDiv(SPan *self, PyObject *arg) { SET_DIV };	
+static PyObject * SPan_setMul(SPan *self, PyObject *arg) { SET_MUL };
+static PyObject * SPan_setAdd(SPan *self, PyObject *arg) { SET_ADD };
+static PyObject * SPan_setSub(SPan *self, PyObject *arg) { SET_SUB };
+static PyObject * SPan_setDiv(SPan *self, PyObject *arg) { SET_DIV };
 
 static PyObject * SPan_play(SPan *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * SPan_out(SPan *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1354,7 +1354,7 @@ Switcher_clip_voice(Switcher *self, MYFLT v) {
         return 0.0;
     else if (v > chnls)
         return chnls;
-    else 
+    else
         return v;
 }
 
@@ -1364,7 +1364,7 @@ Switcher_splitter_i(Switcher *self) {
     int j1, j, i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT voice = Switcher_clip_voice(self, PyFloat_AS_DOUBLE(self->voice));
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->buffer_streams[i+self->k1] = 0.0;
         self->buffer_streams[i+self->k2] = 0.0;
@@ -1375,7 +1375,7 @@ Switcher_splitter_i(Switcher *self) {
     if (j1 >= (self->chnls-1)) {
         j1--; j--;
     }
-    
+
     self->k1 = j1 * self->bufsize;
     self->k2 = j * self->bufsize;
 
@@ -1389,7 +1389,7 @@ Switcher_splitter_i(Switcher *self) {
         self->buffer_streams[i+self->k1] = val;
         val = inval * voice2;
         self->buffer_streams[i+self->k2] = val;
-    }    
+    }
 }
 
 static void
@@ -1398,12 +1398,12 @@ Switcher_splitter_a(Switcher *self) {
     int i, j, j1, len;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *avoice = Stream_getData((Stream *)self->voice_stream);
-    
+
     len = self->chnls * self->bufsize;
     for (i=0; i<len; i++) {
         self->buffer_streams[i] = 0.0;
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         voice = Switcher_clip_voice(self, avoice[i]);
         inval = in[i];
@@ -1413,31 +1413,31 @@ Switcher_splitter_a(Switcher *self) {
         if (j1 >= (self->chnls-1)) {
             j1--; j--;
         }
-        
+
         self->k1 = j1 * self->bufsize;
         self->k2 = j * self->bufsize;
-        
+
         voice = P_clip(voice - j1);
-        
+
         self->buffer_streams[i+self->k1] = inval * MYSQRT(1.0 - voice);
         self->buffer_streams[i+self->k2] = inval * MYSQRT(voice);
-    }    
+    }
 }
 
 MYFLT *
 Switcher_getSamplesBuffer(Switcher *self)
 {
     return (MYFLT *)self->buffer_streams;
-}    
+}
 
 static void
 Switcher_setProcMode(Switcher *self)
-{   
+{
     switch (self->modebuffer[0]) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = Switcher_splitter_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Switcher_splitter_a;
             break;
     }
@@ -1446,7 +1446,7 @@ Switcher_setProcMode(Switcher *self)
 static void
 Switcher_compute_next_data_frame(Switcher *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -1460,7 +1460,7 @@ Switcher_traverse(Switcher *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Switcher_clear(Switcher *self)
 {
     pyo_CLEAR
@@ -1487,11 +1487,11 @@ Switcher_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *voicetmp=NULL;
     Switcher *self;
     self = (Switcher *)type->tp_alloc(type, 0);
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Switcher_compute_next_data_frame);
     self->mode_func_ptr = Switcher_setProcMode;
-    
+
     self->voice = PyFloat_FromDouble(0.0);
     self->chnls = 2;
     self->k1 = 0;
@@ -1499,27 +1499,27 @@ Switcher_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->modebuffer[0] = 0;
 
     static char *kwlist[] = {"input", "outs", "voice", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iO", kwlist, &inputtmp, &self->chnls, &voicetmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (voicetmp) {
         PyObject_CallMethod((PyObject *)self, "setVoice", "O", voicetmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->buffer_streams = (MYFLT *)realloc(self->buffer_streams, self->chnls * self->bufsize * sizeof(MYFLT));
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     int len = self->chnls*self->bufsize;
     for (i=0; i<len; i++) {
         self->buffer_streams[i] = 0.0;
     }
-    
+
     return (PyObject *)self;
 }
 
@@ -1533,14 +1533,14 @@ static PyObject *
 Switcher_setVoice(Switcher *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->voice);
@@ -1556,12 +1556,12 @@ Switcher_setVoice(Switcher *self, PyObject *arg)
         self->voice_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Switcher_members[] = {
     {"server", T_OBJECT_EX, offsetof(Switcher, server), 0, "Pyo server."},
@@ -1647,33 +1647,33 @@ Switch_setProcMode(Switch *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Switch_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Switch_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Switch_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Switch_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Switch_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Switch_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Switch_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Switch_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Switch_postprocessing_revareva;
             break;
     }
@@ -1688,7 +1688,7 @@ Switch_compute_next_data_frame(Switch *self)
     tmp = Switcher_getSamplesBuffer((Switcher *)self->mainSplitter);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1700,11 +1700,11 @@ Switch_traverse(Switch *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Switch_clear(Switch *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainSplitter);    
+    Py_CLEAR(self->mainSplitter);
     return 0;
 }
 
@@ -1723,44 +1723,44 @@ Switch_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL, *multmp=NULL, *addtmp=NULL;
     Switch *self;
     self = (Switch *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Switch_compute_next_data_frame);
     self->mode_func_ptr = Switch_setProcMode;
 
     static char *kwlist[] = {"mainSplitter", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "Oi|OO", kwlist, &maintmp, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainSplitter);
     Py_INCREF(maintmp);
     self->mainSplitter = (Switcher *)maintmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Switch_getServer(Switch* self) { GET_SERVER };
 static PyObject * Switch_getStream(Switch* self) { GET_STREAM };
-static PyObject * Switch_setMul(Switch *self, PyObject *arg) { SET_MUL };	
-static PyObject * Switch_setAdd(Switch *self, PyObject *arg) { SET_ADD };	
-static PyObject * Switch_setSub(Switch *self, PyObject *arg) { SET_SUB };	
-static PyObject * Switch_setDiv(Switch *self, PyObject *arg) { SET_DIV };	
+static PyObject * Switch_setMul(Switch *self, PyObject *arg) { SET_MUL };
+static PyObject * Switch_setAdd(Switch *self, PyObject *arg) { SET_ADD };
+static PyObject * Switch_setSub(Switch *self, PyObject *arg) { SET_SUB };
+static PyObject * Switch_setDiv(Switch *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Switch_play(Switch *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Switch_out(Switch *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1890,7 +1890,7 @@ typedef struct {
     Stream **trigger_streams;
     int maxVoices;
     int *voices;
-    int modebuffer[2]; // need at least 2 slots for mul & add 
+    int modebuffer[2]; // need at least 2 slots for mul & add
 } VoiceManager;
 
 static void
@@ -1902,7 +1902,7 @@ VoiceManager_generate(VoiceManager *self) {
     for (i=0; i<self->bufsize; i++)
         self->data[i] = -1.0;
 
-    if (self->maxVoices > 0) {    
+    if (self->maxVoices > 0) {
         for (i=0; i<self->bufsize; i++) {
             for (j=0; j<self->maxVoices; j++) {
                 if (Stream_getData(self->trigger_streams[j])[i] == 1.0)
@@ -1936,44 +1936,44 @@ VoiceManager_setProcMode(VoiceManager *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = VoiceManager_generate;
-	
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = VoiceManager_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = VoiceManager_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = VoiceManager_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = VoiceManager_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = VoiceManager_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = VoiceManager_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = VoiceManager_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = VoiceManager_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = VoiceManager_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 VoiceManager_compute_next_data_frame(VoiceManager *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1987,7 +1987,7 @@ VoiceManager_traverse(VoiceManager *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 VoiceManager_clear(VoiceManager *self)
 {
     pyo_CLEAR
@@ -2016,10 +2016,10 @@ VoiceManager_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self = (VoiceManager *)type->tp_alloc(type, 0);
 
     self->voices = NULL;
-    self->maxVoices = 0; 
+    self->maxVoices = 0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
- 
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, VoiceManager_compute_next_data_frame);
     self->mode_func_ptr = VoiceManager_setProcMode;
@@ -2028,21 +2028,21 @@ VoiceManager_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOO", kwlist, &inputtmp, &triggerstmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-   
+
     INIT_INPUT_STREAM
-    
+
     if (triggerstmp && triggerstmp != Py_None) {
         PyObject_CallMethod((PyObject *)self, "setTriggers", "O", triggerstmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
@@ -2052,10 +2052,10 @@ VoiceManager_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * VoiceManager_getServer(VoiceManager* self) { GET_SERVER };
 static PyObject * VoiceManager_getStream(VoiceManager* self) { GET_STREAM };
-static PyObject * VoiceManager_setMul(VoiceManager *self, PyObject *arg) { SET_MUL };	
-static PyObject * VoiceManager_setAdd(VoiceManager *self, PyObject *arg) { SET_ADD };	
-static PyObject * VoiceManager_setSub(VoiceManager *self, PyObject *arg) { SET_SUB };	
-static PyObject * VoiceManager_setDiv(VoiceManager *self, PyObject *arg) { SET_DIV };	
+static PyObject * VoiceManager_setMul(VoiceManager *self, PyObject *arg) { SET_MUL };
+static PyObject * VoiceManager_setAdd(VoiceManager *self, PyObject *arg) { SET_ADD };
+static PyObject * VoiceManager_setSub(VoiceManager *self, PyObject *arg) { SET_SUB };
+static PyObject * VoiceManager_setDiv(VoiceManager *self, PyObject *arg) { SET_DIV };
 
 static PyObject * VoiceManager_play(VoiceManager *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * VoiceManager_stop(VoiceManager *self) { STOP };
@@ -2073,13 +2073,13 @@ static PyObject *
 VoiceManager_setTriggers(VoiceManager *self, PyObject *arg)
 {
     int i;
-	
+
 	if (! PyList_Check(arg)) {
         PyErr_SetString(PyExc_TypeError, "The triggers attribute must be a list.");
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->maxVoices = PyList_Size(arg);
     self->trigger_streams = (Stream **)realloc(self->trigger_streams, self->maxVoices * sizeof(Stream *));
     self->voices = (int *)realloc(self->voices, self->maxVoices * sizeof(int));
@@ -2089,7 +2089,7 @@ VoiceManager_setTriggers(VoiceManager *self, PyObject *arg)
     }
 
     Py_RETURN_NONE;
-}	
+}
 
 static PyMemberDef VoiceManager_members[] = {
 {"server", T_OBJECT_EX, offsetof(VoiceManager, server), 0, "Pyo server."},
@@ -2226,7 +2226,7 @@ Mixer_generate(Mixer *self) {
     for (i=0; i<(self->num_outs * self->bufsize); i++) {
         self->buffer_streams[i] = 0.0;
     }
-    
+
     keys = PyDict_Keys(self->inputs);
     num = PyList_Size(keys);
 
@@ -2248,7 +2248,7 @@ Mixer_generate(Mixer *self) {
                 tmpCount = 0;
                 tmpStepVal = (amp - currentAmp) / self->timeStep;
                 PyList_SetItem(list_of_last_gains, k, PyFloat_FromDouble(amp));
-            }    
+            }
             for (i=0; i<self->bufsize; i++) {
                 if (tmpCount == (self->timeStep - 1)) {
                     currentAmp = amp;
@@ -2257,7 +2257,7 @@ Mixer_generate(Mixer *self) {
                 else if (tmpCount < self->timeStep) {
                     currentAmp += tmpStepVal;
                     tmpCount++;
-                }    
+                }
                 self->buffer_streams[self->bufsize * k + i] += st[i] * currentAmp;
             }
             PyList_SetItem(list_of_current_gains, k, PyFloat_FromDouble(currentAmp));
@@ -2272,7 +2272,7 @@ MYFLT *
 Mixer_getSamplesBuffer(Mixer *self)
 {
     return (MYFLT *)self->buffer_streams;
-}    
+}
 
 static void
 Mixer_setProcMode(Mixer *self)
@@ -2283,7 +2283,7 @@ Mixer_setProcMode(Mixer *self)
 static void
 Mixer_compute_next_data_frame(Mixer *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -2299,7 +2299,7 @@ Mixer_traverse(Mixer *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Mixer_clear(Mixer *self)
 {
     pyo_CLEAR
@@ -2328,7 +2328,7 @@ Mixer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *timetmp=NULL;
     Mixer *self;
     self = (Mixer *)type->tp_alloc(type, 0);
-    
+
     self->inputs = PyDict_New();
     self->gains = PyDict_New();
     self->lastGains = PyDict_New();
@@ -2338,26 +2338,26 @@ Mixer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->num_outs = 2;
     self->time = 0.025;
     self->timeStep = (long)(self->time * self->sr);
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Mixer_compute_next_data_frame);
     self->mode_func_ptr = Mixer_setProcMode;
 
     static char *kwlist[] = {"outs", "time", NULL};
-        
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|iO", kwlist, &self->num_outs, &timetmp))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     if (timetmp) {
         PyObject_CallMethod((PyObject *)self, "setTime", "O", timetmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->buffer_streams = (MYFLT *)realloc(self->buffer_streams, self->num_outs * self->bufsize * sizeof(MYFLT));
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
@@ -2372,20 +2372,20 @@ Mixer_setTime(Mixer *self, PyObject *arg)
 {
     int i, j, num;
 	PyObject *tmp, *keys, *key, *list_of_time_counts;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	if (isNumber == 1) {
 		self->time = PyFloat_AS_DOUBLE(PyNumber_Float(tmp));
         self->timeStep = (long)(self->time * self->sr);
-        
+
         keys = PyDict_Keys(self->inputs);
         num = PyList_Size(keys);
         if (num != 0) {
@@ -2394,14 +2394,14 @@ Mixer_setTime(Mixer *self, PyObject *arg)
                 list_of_time_counts = PyDict_GetItem(self->timeCounts, key);
                 for (i=0; i<self->num_outs; i++) {
                     PyList_SET_ITEM(list_of_time_counts, i, PyLong_FromLong(self->timeStep-1));
-                }    
+                }
             }
-        }    
+        }
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Mixer_addInput(Mixer *self, PyObject *args, PyObject *kwds)
@@ -2416,12 +2416,12 @@ Mixer_addInput(Mixer *self, PyObject *args, PyObject *kwds)
     PyObject *voice;
 
     static char *kwlist[] = {"voice", "input", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist, &voice, &tmp)) {
         Py_INCREF(Py_None);
         return Py_None;
     }
-    
+
     PyDict_SetItem(self->inputs, voice, tmp);
     initGains = PyList_New(self->num_outs);
     initLastGains = PyList_New(self->num_outs);
@@ -2440,16 +2440,16 @@ Mixer_addInput(Mixer *self, PyObject *args, PyObject *kwds)
     PyDict_SetItem(self->currentGains, voice, initCurrentGains);
     PyDict_SetItem(self->stepVals, voice, initStepVals);
     PyDict_SetItem(self->timeCounts, voice, initTimeCounts);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Mixer_delInput(Mixer *self, PyObject *arg)
 {
     int ret;
-    
+
     PyObject *key = arg;
     ret = PyDict_DelItem(self->inputs, key);
     if (ret == 0) {
@@ -2458,14 +2458,14 @@ Mixer_delInput(Mixer *self, PyObject *arg)
         PyDict_DelItem(self->currentGains, key);
         PyDict_DelItem(self->stepVals, key);
         PyDict_DelItem(self->timeCounts, key);
-    }    
+    }
     else {
         Py_INCREF(Py_None);
         return Py_None;
     }
 
 	Py_INCREF(Py_None);
-	return Py_None;        
+	return Py_None;
 }
 
 static PyObject *
@@ -2474,18 +2474,18 @@ Mixer_setAmp(Mixer *self, PyObject *args, PyObject *kwds)
     int tmpout;
     PyObject *tmpin, *amp;
     static char *kwlist[] = {"vin", "vout", "amp", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OiO", kwlist, &tmpin, &tmpout, &amp)) {
         Py_INCREF(Py_None);
         return Py_None;
     }
-    
+
     if (! PyNumber_Check(amp)) {
         printf("Amplitude must be a number!n");
         Py_INCREF(Py_None);
-        return Py_None;        
+        return Py_None;
     }
-    
+
     Py_INCREF(amp);
     PyList_SET_ITEM(PyDict_GetItem(self->gains, tmpin), tmpout, PyNumber_Float(amp));
 
@@ -2580,33 +2580,33 @@ MixerVoice_setProcMode(MixerVoice *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = MixerVoice_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = MixerVoice_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = MixerVoice_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = MixerVoice_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = MixerVoice_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = MixerVoice_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = MixerVoice_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = MixerVoice_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = MixerVoice_postprocessing_revareva;
             break;
     }
@@ -2621,7 +2621,7 @@ MixerVoice_compute_next_data_frame(MixerVoice *self)
     tmp = Mixer_getSamplesBuffer((Mixer *)self->mainMixer);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2633,11 +2633,11 @@ MixerVoice_traverse(MixerVoice *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 MixerVoice_clear(MixerVoice *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainMixer);    
+    Py_CLEAR(self->mainMixer);
     return 0;
 }
 
@@ -2656,42 +2656,42 @@ MixerVoice_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL, *multmp=NULL, *addtmp=NULL;
     MixerVoice *self;
     self = (MixerVoice *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, MixerVoice_compute_next_data_frame);
     self->mode_func_ptr = MixerVoice_setProcMode;
 
     static char *kwlist[] = {"mainMixer", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "Oi|OO", kwlist, &maintmp, &self->chnl, &multmp, &addtmp))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     Py_XDECREF(self->mainMixer);
     Py_INCREF(maintmp);
     self->mainMixer = (Mixer *)maintmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * MixerVoice_getServer(MixerVoice* self) { GET_SERVER };
 static PyObject * MixerVoice_getStream(MixerVoice* self) { GET_STREAM };
-static PyObject * MixerVoice_setMul(MixerVoice *self, PyObject *arg) { SET_MUL };	
-static PyObject * MixerVoice_setAdd(MixerVoice *self, PyObject *arg) { SET_ADD };	
-static PyObject * MixerVoice_setSub(MixerVoice *self, PyObject *arg) { SET_SUB };	
-static PyObject * MixerVoice_setDiv(MixerVoice *self, PyObject *arg) { SET_DIV };	
+static PyObject * MixerVoice_setMul(MixerVoice *self, PyObject *arg) { SET_MUL };
+static PyObject * MixerVoice_setAdd(MixerVoice *self, PyObject *arg) { SET_ADD };
+static PyObject * MixerVoice_setSub(MixerVoice *self, PyObject *arg) { SET_SUB };
+static PyObject * MixerVoice_setDiv(MixerVoice *self, PyObject *arg) { SET_DIV };
 
 static PyObject * MixerVoice_play(MixerVoice *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * MixerVoice_out(MixerVoice *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2820,7 +2820,7 @@ typedef struct {
     PyObject *voice;
     Stream *voice_stream;
     int chSize;
-    int modebuffer[3]; // need at least 2 slots for mul & add 
+    int modebuffer[3]; // need at least 2 slots for mul & add
 } Selector;
 
 static MYFLT
@@ -2830,7 +2830,7 @@ Selector_clip_voice(Selector *self, MYFLT v) {
         return 0.0;
     else if (v > chSize)
         return chSize;
-    else 
+    else
         return v;
 }
 
@@ -2852,7 +2852,7 @@ Selector_generate_i(Selector *self) {
     voice = P_clip(voice - j1);
     voice1 = MYSQRT(1.0 - voice);
     voice2 = MYSQRT(voice);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = st1[i] * voice1 + st2[i] * voice2;
     }
@@ -2865,14 +2865,14 @@ Selector_generate_a(Selector *self) {
     MYFLT *st1, *st2;
     MYFLT *vc = Stream_getData((Stream *)self->voice_stream);
 
-    old_j1 = 0; 
+    old_j1 = 0;
     old_j = 1;
     st1 = Stream_getData((Stream *)PyObject_CallMethod((PyObject *)PyList_GET_ITEM(self->inputs, old_j1), "_getStream", NULL));
     st2 = Stream_getData((Stream *)PyObject_CallMethod((PyObject *)PyList_GET_ITEM(self->inputs, old_j), "_getStream", NULL));
-    
+
     for (i=0; i<self->bufsize; i++) {
         voice = Selector_clip_voice(self, vc[i]);
-        
+
         j1 = (int)voice;
         j = j1 + 1;
         if (j1 >= (self->chSize-1)) {
@@ -2881,11 +2881,11 @@ Selector_generate_a(Selector *self) {
         if (j1 != old_j1) {
             st1 = Stream_getData((Stream *)PyObject_CallMethod((PyObject *)PyList_GET_ITEM(self->inputs, j1), "_getStream", NULL));
             old_j1 = j1;
-        }    
+        }
         if (j != old_j) {
             st2 = Stream_getData((Stream *)PyObject_CallMethod((PyObject *)PyList_GET_ITEM(self->inputs, j), "_getStream", NULL));
             old_j = j;
-        }    
+        }
 
         voice = P_clip(voice - j1);
 
@@ -2909,50 +2909,50 @@ Selector_setProcMode(Selector *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Selector_generate_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Selector_generate_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Selector_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Selector_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Selector_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Selector_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Selector_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Selector_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Selector_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Selector_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Selector_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 Selector_compute_next_data_frame(Selector *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2966,7 +2966,7 @@ Selector_traverse(Selector *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Selector_clear(Selector *self)
 {
     pyo_CLEAR
@@ -2991,39 +2991,39 @@ Selector_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputstmp=NULL, *voicetmp=NULL, *multmp=NULL, *addtmp=NULL;
     Selector *self;
     self = (Selector *)type->tp_alloc(type, 0);
-    
+
     self->voice = PyFloat_FromDouble(0.);
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Selector_compute_next_data_frame);
     self->mode_func_ptr = Selector_setProcMode;
 
     static char *kwlist[] = {"inputs", "voice", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOO", kwlist, &inputstmp, &voicetmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (inputstmp) {
         PyObject_CallMethod((PyObject *)self, "setInputs", "O", inputstmp);
     }
-    
+
     if (voicetmp) {
         PyObject_CallMethod((PyObject *)self, "setVoice", "O", voicetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -3031,10 +3031,10 @@ Selector_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Selector_getServer(Selector* self) { GET_SERVER };
 static PyObject * Selector_getStream(Selector* self) { GET_STREAM };
-static PyObject * Selector_setMul(Selector *self, PyObject *arg) { SET_MUL };	
-static PyObject * Selector_setAdd(Selector *self, PyObject *arg) { SET_ADD };	
-static PyObject * Selector_setSub(Selector *self, PyObject *arg) { SET_SUB };	
-static PyObject * Selector_setDiv(Selector *self, PyObject *arg) { SET_DIV };	
+static PyObject * Selector_setMul(Selector *self, PyObject *arg) { SET_MUL };
+static PyObject * Selector_setAdd(Selector *self, PyObject *arg) { SET_ADD };
+static PyObject * Selector_setSub(Selector *self, PyObject *arg) { SET_SUB };
+static PyObject * Selector_setDiv(Selector *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Selector_play(Selector *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Selector_out(Selector *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3053,13 +3053,13 @@ static PyObject *
 Selector_setInputs(Selector *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (! PyList_Check(arg)) {
         PyErr_SetString(PyExc_TypeError, "The inputs attribute must be a list.");
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     tmp = arg;
     self->chSize = PyList_Size(tmp);
     Py_INCREF(tmp);
@@ -3068,20 +3068,20 @@ Selector_setInputs(Selector *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Selector_setVoice(Selector *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->voice);
@@ -3097,12 +3097,12 @@ Selector_setVoice(Selector *self, PyObject *arg)
         self->voice_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Selector_members[] = {
 {"server", T_OBJECT_EX, offsetof(Selector, server), 0, "Pyo server."},
@@ -3213,4 +3213,3 @@ Selector_members,                                 /* tp_members */
 Selector_new,                                     /* tp_new */
 };
 
-
diff --git a/src/objects/patternmodule.c b/src/objects/patternmodule.c
index 9733bdd..49bcfae 100644
--- a/src/objects/patternmodule.c
+++ b/src/objects/patternmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -41,7 +41,7 @@ Pattern_generate_i(Pattern *self) {
     MYFLT tm;
     int i, flag;
     PyObject *result;
-    
+
     flag = 0;
     tm = PyFloat_AS_DOUBLE(self->time);
 
@@ -49,7 +49,7 @@ Pattern_generate_i(Pattern *self) {
         if (self->currentTime >= tm) {
             flag = 1;
             self->currentTime = 0.;
-        }    
+        }
 
         self->currentTime += self->sampleToSec;
     }
@@ -65,16 +65,16 @@ static void
 Pattern_generate_a(Pattern *self) {
     int i, flag;
     PyObject *result;
-    
+
     MYFLT *tm = Stream_getData((Stream *)self->time_stream);
-    
+
     flag = 0;
     for (i=0; i<self->bufsize; i++) {
         if (self->currentTime >= tm[i]) {
             flag = 1;
             self->currentTime = 0.;
-        }    
-        
+        }
+
         self->currentTime += self->sampleToSec;
     }
     if (flag == 1 || self->init == 1) {
@@ -82,7 +82,7 @@ Pattern_generate_a(Pattern *self) {
         result = PyObject_Call((PyObject *)self->callable, PyTuple_New(0), NULL);
         if (result == NULL)
             PyErr_Print();
-    }    
+    }
 }
 
 
@@ -91,10 +91,10 @@ Pattern_setProcMode(Pattern *self)
 {
     int procmode = self->modebuffer[0];
     switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = Pattern_generate_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Pattern_generate_a;
             break;
     }
@@ -103,7 +103,7 @@ Pattern_setProcMode(Pattern *self)
 static void
 Pattern_compute_next_data_frame(Pattern *self)
 {
-    (*self->proc_func_ptr)(self);     
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -111,17 +111,17 @@ Pattern_traverse(Pattern *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->callable);
-    Py_VISIT(self->time);    
-    Py_VISIT(self->time_stream);    
+    Py_VISIT(self->time);
+    Py_VISIT(self->time_stream);
     return 0;
 }
 
-static int 
+static int
 Pattern_clear(Pattern *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->callable);
-    Py_CLEAR(self->time);    
+    Py_CLEAR(self->time);
     Py_CLEAR(self->time_stream);
     return 0;
 }
@@ -141,7 +141,7 @@ Pattern_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *timetmp=NULL, *calltmp=NULL;
     Pattern *self;
     self = (Pattern *)type->tp_alloc(type, 0);
-    
+
     self->time = PyFloat_FromDouble(1.);
 	self->modebuffer[0] = 0;
     self->init = 1;
@@ -151,38 +151,38 @@ Pattern_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = Pattern_setProcMode;
 
     Stream_setStreamActive(self->stream, 0);
-    
+
     self->sampleToSec = 1. / self->sr;
     self->currentTime = 0.;
 
     static char *kwlist[] = {"callable", "time", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|O", kwlist, &calltmp, &timetmp))
         Py_RETURN_NONE;
-   
+
     if (calltmp) {
         PyObject_CallMethod((PyObject *)self, "setFunction", "O", calltmp);
     }
-    
+
     if (timetmp) {
         PyObject_CallMethod((PyObject *)self, "setTime", "O", timetmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Pattern_getServer(Pattern* self) { GET_SERVER };
 static PyObject * Pattern_getStream(Pattern* self) { GET_STREAM };
 
-static PyObject * 
-Pattern_play(Pattern *self, PyObject *args, PyObject *kwds) 
-{ 
+static PyObject *
+Pattern_play(Pattern *self, PyObject *args, PyObject *kwds)
+{
     self->init = 1;
-    PLAY 
+    PLAY
 };
 
 static PyObject * Pattern_stop(Pattern *self) { STOP };
@@ -191,34 +191,34 @@ static PyObject *
 Pattern_setFunction(Pattern *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (! PyCallable_Check(arg)) {
         PyErr_SetString(PyExc_TypeError, "The callable attribute must be a valid Python function.");
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     tmp = arg;
     Py_XDECREF(self->callable);
     Py_INCREF(tmp);
     self->callable = tmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Pattern_setTime(Pattern *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->time);
@@ -234,12 +234,12 @@ Pattern_setTime(Pattern *self, PyObject *arg)
         self->time_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Pattern_members[] = {
 {"server", T_OBJECT_EX, offsetof(Pattern, server), 0, "Pyo server."},
@@ -315,16 +315,16 @@ typedef struct {
 static void
 Score_selector(Score *self) {
     int i, inval;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inval = (int)in[i];
         if (inval != self->last_value) {
             sprintf(self->curfname, "%s%i()\n", self->fname, inval);
             PyRun_SimpleString(self->curfname);
             self->last_value = inval;
-        }    
+        }
     }
 }
 
@@ -337,23 +337,23 @@ Score_setProcMode(Score *self)
 static void
 Score_compute_next_data_frame(Score *self)
 {
-    (*self->proc_func_ptr)(self);    
+    (*self->proc_func_ptr)(self);
 }
 
 static int
 Score_traverse(Score *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->input);    
-    Py_VISIT(self->input_stream);    
+    Py_VISIT(self->input);
+    Py_VISIT(self->input_stream);
     return 0;
 }
 
-static int 
+static int
 Score_clear(Score *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->input);    
+    Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
     return 0;
 }
@@ -373,24 +373,24 @@ Score_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp;
     Score *self;
     self = (Score *)type->tp_alloc(type, 0);
-    
+
     self->last_value = -99;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Score_compute_next_data_frame);
     self->mode_func_ptr = Score_setProcMode;
 
     static char *kwlist[] = {"input", "fname", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|s", kwlist, &inputtmp, &self->fname))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-        
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
@@ -481,7 +481,7 @@ CallAfter_generate(CallAfter *self) {
                 tuple = PyTuple_New(1);
                 PyTuple_SET_ITEM(tuple, 0, self->arg);
             }
-            result = PyObject_Call(self->callable, tuple, NULL);                
+            result = PyObject_Call(self->callable, tuple, NULL);
             if (result == NULL)
                 PyErr_Print();
             PyObject_CallMethod((PyObject *)self, "stop", NULL);
@@ -493,14 +493,14 @@ CallAfter_generate(CallAfter *self) {
 
 static void
 CallAfter_setProcMode(CallAfter *self)
-{        
+{
     self->proc_func_ptr = CallAfter_generate;
 }
 
 static void
 CallAfter_compute_next_data_frame(CallAfter *self)
 {
-    (*self->proc_func_ptr)(self);     
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -512,7 +512,7 @@ CallAfter_traverse(CallAfter *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 CallAfter_clear(CallAfter *self)
 {
     pyo_CLEAR
@@ -536,10 +536,10 @@ CallAfter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *calltmp=NULL, *argtmp=NULL;
     CallAfter *self;
     self = (CallAfter *)type->tp_alloc(type, 0);
-    
+
     self->time = 1.;
     self->arg = Py_None;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, CallAfter_compute_next_data_frame);
     self->mode_func_ptr = CallAfter_setProcMode;
@@ -548,10 +548,10 @@ CallAfter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->currentTime = 0.;
 
     static char *kwlist[] = {"callable", "time", "arg", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_FO, kwlist, &calltmp, &self->time, &argtmp))
         Py_RETURN_NONE;
-    
+
     if (! PyCallable_Check(calltmp))
         Py_RETURN_NONE;
 
@@ -560,15 +560,15 @@ CallAfter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         Py_INCREF(argtmp);
         self->arg = argtmp;
     }
-    
+
     Py_INCREF(calltmp);
     Py_XDECREF(self->callable);
     self->callable = calltmp;
 
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
@@ -632,4 +632,4 @@ CallAfter_members,             /* tp_members */
 0,      /* tp_init */
 0,                         /* tp_alloc */
 CallAfter_new,                 /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/phasevocmodule.c b/src/objects/phasevocmodule.c
index 5ed4bb0..e90a232 100644
--- a/src/objects/phasevocmodule.c
+++ b/src/objects/phasevocmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -30,7 +30,7 @@
 #include "fft.h"
 #include "wind.h"
 
-static int 
+static int
 isPowerOfTwo(int x) {
     return (x != 0) && ((x & (x - 1)) == 0);
 }
@@ -52,9 +52,9 @@ typedef struct {
     MYFLT scale;
     MYFLT *input_buffer;
     MYFLT *inframe;
-    MYFLT *outframe; 
-    MYFLT *real; 
-    MYFLT *imag; 
+    MYFLT *outframe;
+    MYFLT *real;
+    MYFLT *imag;
     MYFLT *lastPhase;
     MYFLT **twiddle;
     MYFLT *window;
@@ -77,20 +77,20 @@ PVAnal_realloc_memories(PVAnal *self) {
     n8 = self->size >> 3;
     self->input_buffer = (MYFLT *)realloc(self->input_buffer, self->size * sizeof(MYFLT));
     self->inframe = (MYFLT *)realloc(self->inframe, self->size * sizeof(MYFLT));
-    self->outframe = (MYFLT *)realloc(self->outframe, self->size * sizeof(MYFLT));    
+    self->outframe = (MYFLT *)realloc(self->outframe, self->size * sizeof(MYFLT));
     for (i=0; i<self->size; i++)
         self->input_buffer[i] = self->inframe[i] = self->outframe[i] = 0.0;
-    self->lastPhase = (MYFLT *)realloc(self->lastPhase, self->hsize * sizeof(MYFLT)); 
-    self->real = (MYFLT *)realloc(self->real, self->hsize * sizeof(MYFLT)); 
-    self->imag = (MYFLT *)realloc(self->imag, self->hsize * sizeof(MYFLT)); 
-    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *)); 
+    self->lastPhase = (MYFLT *)realloc(self->lastPhase, self->hsize * sizeof(MYFLT));
+    self->real = (MYFLT *)realloc(self->real, self->hsize * sizeof(MYFLT));
+    self->imag = (MYFLT *)realloc(self->imag, self->hsize * sizeof(MYFLT));
+    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *));
     self->freq = (MYFLT **)realloc(self->freq, self->olaps * sizeof(MYFLT *));
     for (i=0; i<self->olaps; i++) {
         self->magn[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         self->freq[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn[i][j] = self->freq[i][j] = 0.0;
-    } 
+    }
     for (i=0; i<self->hsize; i++)
         self->lastPhase[i] = self->real[i] = self->imag[i] = 0.0;
     self->twiddle = (MYFLT **)realloc(self->twiddle, 4 * sizeof(MYFLT *));
@@ -113,7 +113,7 @@ PVAnal_process(PVAnal *self) {
     int i, k, mod;
     MYFLT real, imag, mag, phase, tmp;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->input_buffer[self->incount] = in[i];
         self->count[i] = self->incount;
@@ -156,14 +156,14 @@ PVAnal_process(PVAnal *self) {
 
 static void
 PVAnal_setProcMode(PVAnal *self)
-{        
-    self->proc_func_ptr = PVAnal_process;  
+{
+    self->proc_func_ptr = PVAnal_process;
 }
 
 static void
 PVAnal_compute_next_data_frame(PVAnal *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -176,7 +176,7 @@ PVAnal_traverse(PVAnal *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 PVAnal_clear(PVAnal *self)
 {
     pyo_CLEAR
@@ -193,9 +193,9 @@ PVAnal_dealloc(PVAnal* self)
     pyo_DEALLOC
     free(self->input_buffer);
     free(self->inframe);
-    free(self->outframe); 
-    free(self->real); 
-    free(self->imag); 
+    free(self->outframe);
+    free(self->real);
+    free(self->imag);
     free(self->lastPhase);
     for(i=0; i<4; i++) {
         free(self->twiddle[i]);
@@ -229,12 +229,12 @@ PVAnal_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = PVAnal_setProcMode;
 
     static char *kwlist[] = {"input", "size", "olaps", "wintype", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iii", kwlist, &inputtmp, &self->size, &self->olaps, &self->wintype))
         Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     MAKE_NEW_PV_STREAM(self->pv_stream, &PVStreamType, NULL);
@@ -265,7 +265,7 @@ static PyObject * PVAnal_stop(PVAnal *self) { STOP };
 
 static PyObject *
 PVAnal_setSize(PVAnal *self, PyObject *arg)
-{    
+{
     int k;
     if (PyLong_Check(arg) || PyInt_Check(arg)) {
         self->size = PyInt_AsLong(arg);
@@ -277,15 +277,15 @@ PVAnal_setSize(PVAnal *self, PyObject *arg)
             printf("FFT size must be a power-of-2, using the next power-of-2 greater than size : %d\n", self->size);
         }
         PVAnal_realloc_memories(self);
-    }    
-    
+    }
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject *
 PVAnal_setOverlaps(PVAnal *self, PyObject *arg)
-{    
+{
     int k;
     if (PyLong_Check(arg) || PyInt_Check(arg)) {
         self->olaps = PyInt_AsLong(arg);
@@ -297,20 +297,20 @@ PVAnal_setOverlaps(PVAnal *self, PyObject *arg)
             printf("FFT overlaps must be a power-of-2, using the next power-of-2 greater than olaps : %d\n", self->olaps);
         }
         PVAnal_realloc_memories(self);
-    }    
-    
+    }
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject *
 PVAnal_setWinType(PVAnal *self, PyObject *arg)
-{    
+{
     if (PyLong_Check(arg) || PyInt_Check(arg)) {
         self->wintype = PyInt_AsLong(arg);
         gen_window(self->window, self->size, self->wintype);
-    }    
-    
+    }
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -398,9 +398,9 @@ typedef struct {
     MYFLT *output_buffer;
     MYFLT *outputAccum;
     MYFLT *inframe;
-    MYFLT *outframe; 
-    MYFLT *real; 
-    MYFLT *imag; 
+    MYFLT *outframe;
+    MYFLT *real;
+    MYFLT *imag;
     MYFLT *sumPhase;
     MYFLT **twiddle;
     MYFLT *window;
@@ -421,15 +421,15 @@ PVSynth_realloc_memories(PVSynth *self) {
     n8 = self->size >> 3;
     self->output_buffer = (MYFLT *)realloc(self->output_buffer, self->size * sizeof(MYFLT));
     self->inframe = (MYFLT *)realloc(self->inframe, self->size * sizeof(MYFLT));
-    self->outframe = (MYFLT *)realloc(self->outframe, self->size * sizeof(MYFLT));    
+    self->outframe = (MYFLT *)realloc(self->outframe, self->size * sizeof(MYFLT));
     for (i=0; i<self->size; i++)
         self->output_buffer[i] = self->inframe[i] = self->outframe[i] = 0.0;
-    self->sumPhase = (MYFLT *)realloc(self->sumPhase, self->hsize * sizeof(MYFLT)); 
-    self->real = (MYFLT *)realloc(self->real, self->hsize * sizeof(MYFLT)); 
-    self->imag = (MYFLT *)realloc(self->imag, self->hsize * sizeof(MYFLT)); 
+    self->sumPhase = (MYFLT *)realloc(self->sumPhase, self->hsize * sizeof(MYFLT));
+    self->real = (MYFLT *)realloc(self->real, self->hsize * sizeof(MYFLT));
+    self->imag = (MYFLT *)realloc(self->imag, self->hsize * sizeof(MYFLT));
     for (i=0; i<self->hsize; i++)
         self->sumPhase[i] = self->real[i] = self->imag[i] = 0.0;
-    self->outputAccum = (MYFLT *)realloc(self->outputAccum, (self->size+self->hopsize) * sizeof(MYFLT)); 
+    self->outputAccum = (MYFLT *)realloc(self->outputAccum, (self->size+self->hopsize) * sizeof(MYFLT));
     for (i=0; i<(self->size+self->hopsize); i++)
         self->outputAccum[i] = 0.0;
     self->twiddle = (MYFLT **)realloc(self->twiddle, 4 * sizeof(MYFLT *));
@@ -461,14 +461,14 @@ PVSynth_process(PVSynth *self) {
         if (count[i] >= (self->size-1)) {
             for (k=0; k<self->hsize; k++) {
                 mag = magn[self->overcount][k];
-                tmp = freq[self->overcount][k];                
+                tmp = freq[self->overcount][k];
                 tmp = (tmp - k * self->scale) * self->factor;
                 self->sumPhase[k] += tmp;
                 phase = self->sumPhase[k];
                 self->real[k] = mag * MYCOS(phase);
                 self->imag[k] = mag * MYSIN(phase);
             }
-            
+
             self->inframe[0] = self->real[0];
             self->inframe[self->hsize] = 0.0;
             for (k=1; k<self->hsize; k++) {
@@ -509,34 +509,34 @@ PVSynth_setProcMode(PVSynth *self)
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
-    self->proc_func_ptr = PVSynth_process;  
+    self->proc_func_ptr = PVSynth_process;
 
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = PVSynth_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = PVSynth_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = PVSynth_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = PVSynth_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = PVSynth_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = PVSynth_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = PVSynth_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = PVSynth_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = PVSynth_postprocessing_revareva;
             break;
     }
@@ -545,7 +545,7 @@ PVSynth_setProcMode(PVSynth *self)
 static void
 PVSynth_compute_next_data_frame(PVSynth *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -559,7 +559,7 @@ PVSynth_traverse(PVSynth *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 PVSynth_clear(PVSynth *self)
 {
     pyo_CLEAR
@@ -577,9 +577,9 @@ PVSynth_dealloc(PVSynth* self)
     free(self->output_buffer);
     free(self->outputAccum);
     free(self->inframe);
-    free(self->outframe); 
-    free(self->real); 
-    free(self->imag); 
+    free(self->outframe);
+    free(self->real);
+    free(self->imag);
     free(self->sumPhase);
     for(i=0; i<4; i++) {
         free(self->twiddle[i]);
@@ -607,7 +607,7 @@ PVSynth_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = PVSynth_setProcMode;
 
     static char *kwlist[] = {"input", "wintype", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iOO", kwlist, &inputtmp, &self->wintype, &multmp, &addtmp))
         Py_RETURN_NONE;
 
@@ -625,11 +625,11 @@ PVSynth_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     self->size = PVStream_getFFTsize(self->input_stream);
     self->olaps = PVStream_getOlaps(self->input_stream);
- 
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
@@ -661,19 +661,19 @@ PVSynth_setInput(PVSynth *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input_stream);
     self->input_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVSynth_setWinType(PVSynth *self, PyObject *arg)
-{    
+{
     if (PyLong_Check(arg) || PyInt_Check(arg)) {
         self->wintype = PyInt_AsLong(arg);
         gen_window(self->window, self->size, self->wintype);
-    }    
-    
+    }
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -681,10 +681,10 @@ PVSynth_setWinType(PVSynth *self, PyObject *arg)
 static PyObject * PVSynth_getServer(PVSynth* self) { GET_SERVER };
 static PyObject * PVSynth_getStream(PVSynth* self) { GET_STREAM };
 //static PyObject * PVSynth_getPVStream(PVSynth* self) { GET_PV_STREAM };
-static PyObject * PVSynth_setMul(PVSynth *self, PyObject *arg) { SET_MUL };	
-static PyObject * PVSynth_setAdd(PVSynth *self, PyObject *arg) { SET_ADD };	
-static PyObject * PVSynth_setSub(PVSynth *self, PyObject *arg) { SET_SUB };	
-static PyObject * PVSynth_setDiv(PVSynth *self, PyObject *arg) { SET_DIV };	
+static PyObject * PVSynth_setMul(PVSynth *self, PyObject *arg) { SET_MUL };
+static PyObject * PVSynth_setAdd(PVSynth *self, PyObject *arg) { SET_ADD };
+static PyObject * PVSynth_setSub(PVSynth *self, PyObject *arg) { SET_SUB };
+static PyObject * PVSynth_setDiv(PVSynth *self, PyObject *arg) { SET_DIV };
 
 static PyObject * PVSynth_play(PVSynth *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * PVSynth_out(PVSynth *self, PyObject *args, PyObject *kwds) { OUT };
@@ -974,41 +974,41 @@ PVAddSynth_setProcMode(PVAddSynth *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = PVAddSynth_process_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = PVAddSynth_process_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = PVAddSynth_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = PVAddSynth_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = PVAddSynth_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = PVAddSynth_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = PVAddSynth_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = PVAddSynth_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = PVAddSynth_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = PVAddSynth_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = PVAddSynth_postprocessing_revareva;
             break;
     }
@@ -1017,7 +1017,7 @@ PVAddSynth_setProcMode(PVAddSynth *self)
 static void
 PVAddSynth_compute_next_data_frame(PVAddSynth *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1032,7 +1032,7 @@ PVAddSynth_traverse(PVAddSynth *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 PVAddSynth_clear(PVAddSynth *self)
 {
     pyo_CLEAR
@@ -1078,7 +1078,7 @@ PVAddSynth_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = PVAddSynth_setProcMode;
 
     static char *kwlist[] = {"input", "pitch", "num", "first", "inc", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OiiiOO", kwlist, &inputtmp, &pitchtmp, &self->num, &self->first, &self->inc, &multmp, &addtmp))
         Py_RETURN_NONE;
 
@@ -1100,11 +1100,11 @@ PVAddSynth_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (pitchtmp) {
         PyObject_CallMethod((PyObject *)self, "setPitch", "O", pitchtmp);
     }
- 
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
@@ -1115,7 +1115,7 @@ PVAddSynth_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     for (i=0; i<8192; i++)
         self->table[i] = (MYFLT)(MYSIN(TWOPI * i / 8192.0));
     self->table[8192] = 0.0;
-    
+
     PVAddSynth_realloc_memories(self);
 
     (*self->mode_func_ptr)(self);
@@ -1141,23 +1141,23 @@ PVAddSynth_setInput(PVAddSynth *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input_stream);
     self->input_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVAddSynth_setPitch(PVAddSynth *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->pitch);
@@ -1173,16 +1173,16 @@ PVAddSynth_setPitch(PVAddSynth *self, PyObject *arg)
         self->pitch_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
 
 static PyObject *
 PVAddSynth_setNum(PVAddSynth *self, PyObject *arg)
-{    
+{
     if (PyLong_Check(arg) || PyInt_Check(arg)) {
         self->num = PyInt_AsLong(arg);
         if (self->num < 1)
@@ -1190,15 +1190,15 @@ PVAddSynth_setNum(PVAddSynth *self, PyObject *arg)
         else if (self->num > self->hsize)
             self->num = self->hsize;
         self->update = 1;
-    }    
-    
+    }
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject *
 PVAddSynth_setFirst(PVAddSynth *self, PyObject *arg)
-{    
+{
     if (PyLong_Check(arg) || PyInt_Check(arg)) {
         self->first = PyInt_AsLong(arg);
         if (self->first < 0)
@@ -1206,15 +1206,15 @@ PVAddSynth_setFirst(PVAddSynth *self, PyObject *arg)
         else if (self->first > self->hsize)
             self->first = self->hsize;
         self->update = 1;
-    }    
-    
+    }
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject *
 PVAddSynth_setInc(PVAddSynth *self, PyObject *arg)
-{    
+{
     if (PyLong_Check(arg) || PyInt_Check(arg)) {
         self->inc = PyInt_AsLong(arg);
         if (self->inc < 1)
@@ -1222,18 +1222,18 @@ PVAddSynth_setInc(PVAddSynth *self, PyObject *arg)
         else if (self->inc > self->hsize)
             self->inc = self->hsize;
         self->update = 1;
-    }    
-    
+    }
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject * PVAddSynth_getServer(PVAddSynth* self) { GET_SERVER };
 static PyObject * PVAddSynth_getStream(PVAddSynth* self) { GET_STREAM };
-static PyObject * PVAddSynth_setMul(PVAddSynth *self, PyObject *arg) { SET_MUL };	
-static PyObject * PVAddSynth_setAdd(PVAddSynth *self, PyObject *arg) { SET_ADD };	
-static PyObject * PVAddSynth_setSub(PVAddSynth *self, PyObject *arg) { SET_SUB };	
-static PyObject * PVAddSynth_setDiv(PVAddSynth *self, PyObject *arg) { SET_DIV };	
+static PyObject * PVAddSynth_setMul(PVAddSynth *self, PyObject *arg) { SET_MUL };
+static PyObject * PVAddSynth_setAdd(PVAddSynth *self, PyObject *arg) { SET_ADD };
+static PyObject * PVAddSynth_setSub(PVAddSynth *self, PyObject *arg) { SET_SUB };
+static PyObject * PVAddSynth_setDiv(PVAddSynth *self, PyObject *arg) { SET_DIV };
 
 static PyObject * PVAddSynth_play(PVAddSynth *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * PVAddSynth_out(PVAddSynth *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1388,14 +1388,14 @@ PVTranspose_realloc_memories(PVTranspose *self) {
     self->hopsize = self->size / self->olaps;
     inputLatency = self->size - self->hopsize;
     self->overcount = 0;
-    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *)); 
+    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *));
     self->freq = (MYFLT **)realloc(self->freq, self->olaps * sizeof(MYFLT *));
     for (i=0; i<self->olaps; i++) {
         self->magn[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         self->freq[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn[i][j] = self->freq[i][j] = 0.0;
-    } 
+    }
     for (i=0; i<self->bufsize; i++)
         self->count[i] = inputLatency;
     PVStream_setFFTsize(self->pv_stream, self->size);
@@ -1484,24 +1484,24 @@ PVTranspose_process_a(PVTranspose *self) {
 
 static void
 PVTranspose_setProcMode(PVTranspose *self)
-{        
+{
     int procmode;
     procmode = self->modebuffer[0];
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = PVTranspose_process_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = PVTranspose_process_a;
             break;
-    } 
+    }
 }
 
 static void
 PVTranspose_compute_next_data_frame(PVTranspose *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -1511,20 +1511,20 @@ PVTranspose_traverse(PVTranspose *self, visitproc visit, void *arg)
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
     Py_VISIT(self->pv_stream);
-    Py_VISIT(self->transpo);    
-    Py_VISIT(self->transpo_stream);    
+    Py_VISIT(self->transpo);
+    Py_VISIT(self->transpo_stream);
     return 0;
 }
 
-static int 
+static int
 PVTranspose_clear(PVTranspose *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
     Py_CLEAR(self->pv_stream);
-    Py_CLEAR(self->transpo);    
-    Py_CLEAR(self->transpo_stream);    
+    Py_CLEAR(self->transpo);
+    Py_CLEAR(self->transpo_stream);
     return 0;
 }
 
@@ -1560,7 +1560,7 @@ PVTranspose_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = PVTranspose_setProcMode;
 
     static char *kwlist[] = {"input", "transpo", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|O", kwlist, &inputtmp, &transpotmp))
         Py_RETURN_NONE;
 
@@ -1582,7 +1582,7 @@ PVTranspose_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (transpotmp) {
         PyObject_CallMethod((PyObject *)self, "setTranspo", "O", transpotmp);
     }
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     MAKE_NEW_PV_STREAM(self->pv_stream, &PVStreamType, NULL);
@@ -1621,23 +1621,23 @@ PVTranspose_setInput(PVTranspose *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input_stream);
     self->input_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVTranspose_setTranspo(PVTranspose *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->transpo);
@@ -1653,9 +1653,9 @@ PVTranspose_setTranspo(PVTranspose *self, PyObject *arg)
         self->transpo_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -1754,8 +1754,8 @@ PVVerb_realloc_memories(PVVerb *self) {
     self->hopsize = self->size / self->olaps;
     inputLatency = self->size - self->hopsize;
     self->overcount = 0;
-    self->l_magn = (MYFLT *)realloc(self->l_magn, self->hsize * sizeof(MYFLT)); 
-    self->l_freq = (MYFLT *)realloc(self->l_freq, self->hsize * sizeof(MYFLT)); 
+    self->l_magn = (MYFLT *)realloc(self->l_magn, self->hsize * sizeof(MYFLT));
+    self->l_freq = (MYFLT *)realloc(self->l_freq, self->hsize * sizeof(MYFLT));
     for (i=0; i<self->hsize; i++)
         self->l_magn[i] = self->l_freq[i] = 0.0;
     self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *));
@@ -1765,7 +1765,7 @@ PVVerb_realloc_memories(PVVerb *self) {
         self->freq[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn[i][j] = self->freq[i][j] = 0.0;
-    } 
+    }
     for (i=0; i<self->bufsize; i++)
         self->count[i] = inputLatency;
     PVStream_setFFTsize(self->pv_stream, self->size);
@@ -1989,30 +1989,30 @@ PVVerb_process_aa(PVVerb *self) {
 
 static void
 PVVerb_setProcMode(PVVerb *self)
-{        
+{
     int procmode;
     procmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = PVVerb_process_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = PVVerb_process_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = PVVerb_process_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = PVVerb_process_aa;
             break;
-    } 
+    }
 }
 
 static void
 PVVerb_compute_next_data_frame(PVVerb *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -2022,24 +2022,24 @@ PVVerb_traverse(PVVerb *self, visitproc visit, void *arg)
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
     Py_VISIT(self->pv_stream);
-    Py_VISIT(self->revtime);    
-    Py_VISIT(self->revtime_stream);    
-    Py_VISIT(self->damp);    
-    Py_VISIT(self->damp_stream);    
+    Py_VISIT(self->revtime);
+    Py_VISIT(self->revtime_stream);
+    Py_VISIT(self->damp);
+    Py_VISIT(self->damp_stream);
     return 0;
 }
 
-static int 
+static int
 PVVerb_clear(PVVerb *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
     Py_CLEAR(self->pv_stream);
-    Py_CLEAR(self->revtime);    
-    Py_CLEAR(self->revtime_stream);    
-    Py_CLEAR(self->damp);    
-    Py_CLEAR(self->damp_stream);    
+    Py_CLEAR(self->revtime);
+    Py_CLEAR(self->revtime_stream);
+    Py_CLEAR(self->damp);
+    Py_CLEAR(self->damp_stream);
     return 0;
 }
 
@@ -2078,7 +2078,7 @@ PVVerb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = PVVerb_setProcMode;
 
     static char *kwlist[] = {"input", "revtime", "damp", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &revtimetmp, &damptmp))
         Py_RETURN_NONE;
 
@@ -2104,7 +2104,7 @@ PVVerb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (damptmp) {
         PyObject_CallMethod((PyObject *)self, "setDamp", "O", damptmp);
     }
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     MAKE_NEW_PV_STREAM(self->pv_stream, &PVStreamType, NULL);
@@ -2143,23 +2143,23 @@ PVVerb_setInput(PVVerb *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input_stream);
     self->input_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVVerb_setRevtime(PVVerb *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->revtime);
@@ -2175,9 +2175,9 @@ PVVerb_setRevtime(PVVerb *self, PyObject *arg)
         self->revtime_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -2186,14 +2186,14 @@ static PyObject *
 PVVerb_setDamp(PVVerb *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->damp);
@@ -2209,9 +2209,9 @@ PVVerb_setDamp(PVVerb *self, PyObject *arg)
         self->damp_stream = (Stream *)streamtmp;
 		self->modebuffer[1] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -2317,7 +2317,7 @@ PVGate_realloc_memories(PVGate *self) {
         self->freq[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn[i][j] = self->freq[i][j] = 0.0;
-    } 
+    }
     for (i=0; i<self->bufsize; i++)
         self->count[i] = inputLatency;
     PVStream_setFFTsize(self->pv_stream, self->size);
@@ -2481,30 +2481,30 @@ PVGate_process_aa(PVGate *self) {
 
 static void
 PVGate_setProcMode(PVGate *self)
-{        
+{
     int procmode;
     procmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = PVGate_process_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = PVGate_process_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = PVGate_process_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = PVGate_process_aa;
             break;
-    } 
+    }
 }
 
 static void
 PVGate_compute_next_data_frame(PVGate *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -2514,24 +2514,24 @@ PVGate_traverse(PVGate *self, visitproc visit, void *arg)
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
     Py_VISIT(self->pv_stream);
-    Py_VISIT(self->thresh);    
-    Py_VISIT(self->thresh_stream);    
-    Py_VISIT(self->damp);    
-    Py_VISIT(self->damp_stream);    
+    Py_VISIT(self->thresh);
+    Py_VISIT(self->thresh_stream);
+    Py_VISIT(self->damp);
+    Py_VISIT(self->damp_stream);
     return 0;
 }
 
-static int 
+static int
 PVGate_clear(PVGate *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
     Py_CLEAR(self->pv_stream);
-    Py_CLEAR(self->thresh);    
-    Py_CLEAR(self->thresh_stream);    
-    Py_CLEAR(self->damp);    
-    Py_CLEAR(self->damp_stream);    
+    Py_CLEAR(self->thresh);
+    Py_CLEAR(self->thresh_stream);
+    Py_CLEAR(self->damp);
+    Py_CLEAR(self->damp_stream);
     return 0;
 }
 
@@ -2568,7 +2568,7 @@ PVGate_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = PVGate_setProcMode;
 
     static char *kwlist[] = {"input", "thresh", "damp", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &threshtmp, &damptmp))
         Py_RETURN_NONE;
 
@@ -2594,7 +2594,7 @@ PVGate_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (damptmp) {
         PyObject_CallMethod((PyObject *)self, "setDamp", "O", damptmp);
     }
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     MAKE_NEW_PV_STREAM(self->pv_stream, &PVStreamType, NULL);
@@ -2633,23 +2633,23 @@ PVGate_setInput(PVGate *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input_stream);
     self->input_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVGate_setThresh(PVGate *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->thresh);
@@ -2665,9 +2665,9 @@ PVGate_setThresh(PVGate *self, PyObject *arg)
         self->thresh_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -2676,14 +2676,14 @@ static PyObject *
 PVGate_setDamp(PVGate *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->damp);
@@ -2699,9 +2699,9 @@ PVGate_setDamp(PVGate *self, PyObject *arg)
         self->damp_stream = (Stream *)streamtmp;
 		self->modebuffer[1] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -2800,14 +2800,14 @@ PVCross_realloc_memories(PVCross *self) {
     self->hopsize = self->size / self->olaps;
     inputLatency = self->size - self->hopsize;
     self->overcount = 0;
-    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *)); 
+    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *));
     self->freq = (MYFLT **)realloc(self->freq, self->olaps * sizeof(MYFLT *));
     for (i=0; i<self->olaps; i++) {
         self->magn[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         self->freq[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn[i][j] = self->freq[i][j] = 0.0;
-    } 
+    }
     for (i=0; i<self->bufsize; i++)
         self->count[i] = inputLatency;
     PVStream_setFFTsize(self->pv_stream, self->size);
@@ -2884,24 +2884,24 @@ PVCross_process_a(PVCross *self) {
 
 static void
 PVCross_setProcMode(PVCross *self)
-{        
+{
     int procmode;
     procmode = self->modebuffer[0];
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = PVCross_process_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = PVCross_process_a;
             break;
-    } 
+    }
 }
 
 static void
 PVCross_compute_next_data_frame(PVCross *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -2913,12 +2913,12 @@ PVCross_traverse(PVCross *self, visitproc visit, void *arg)
     Py_VISIT(self->input2);
     Py_VISIT(self->input2_stream);
     Py_VISIT(self->pv_stream);
-    Py_VISIT(self->fade);    
-    Py_VISIT(self->fade_stream);    
+    Py_VISIT(self->fade);
+    Py_VISIT(self->fade_stream);
     return 0;
 }
 
-static int 
+static int
 PVCross_clear(PVCross *self)
 {
     pyo_CLEAR
@@ -2927,8 +2927,8 @@ PVCross_clear(PVCross *self)
     Py_CLEAR(self->input2);
     Py_CLEAR(self->input2_stream);
     Py_CLEAR(self->pv_stream);
-    Py_CLEAR(self->fade);    
-    Py_CLEAR(self->fade_stream);    
+    Py_CLEAR(self->fade);
+    Py_CLEAR(self->fade_stream);
     return 0;
 }
 
@@ -2964,7 +2964,7 @@ PVCross_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = PVCross_setProcMode;
 
     static char *kwlist[] = {"input", "input2", "fade", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|O", kwlist, &inputtmp, &input2tmp, &fadetmp))
         Py_RETURN_NONE;
 
@@ -2998,7 +2998,7 @@ PVCross_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (fadetmp) {
         PyObject_CallMethod((PyObject *)self, "setFade", "O", fadetmp);
     }
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     MAKE_NEW_PV_STREAM(self->pv_stream, &PVStreamType, NULL);
@@ -3037,10 +3037,10 @@ PVCross_setInput(PVCross *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input_stream);
     self->input_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVCross_setInput2(PVCross *self, PyObject *arg)
@@ -3060,23 +3060,23 @@ PVCross_setInput2(PVCross *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input2_stream);
     self->input2_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVCross_setFade(PVCross *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->fade);
@@ -3092,9 +3092,9 @@ PVCross_setFade(PVCross *self, PyObject *arg)
         self->fade_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -3190,14 +3190,14 @@ PVMult_realloc_memories(PVMult *self) {
     self->hopsize = self->size / self->olaps;
     inputLatency = self->size - self->hopsize;
     self->overcount = 0;
-    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *)); 
+    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *));
     self->freq = (MYFLT **)realloc(self->freq, self->olaps * sizeof(MYFLT *));
     for (i=0; i<self->olaps; i++) {
         self->magn[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         self->freq[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn[i][j] = self->freq[i][j] = 0.0;
-    } 
+    }
     for (i=0; i<self->bufsize; i++)
         self->count[i] = inputLatency;
     PVStream_setFFTsize(self->pv_stream, self->size);
@@ -3246,7 +3246,7 @@ PVMult_setProcMode(PVMult *self)
 static void
 PVMult_compute_next_data_frame(PVMult *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -3261,7 +3261,7 @@ PVMult_traverse(PVMult *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 PVMult_clear(PVMult *self)
 {
     pyo_CLEAR
@@ -3304,7 +3304,7 @@ PVMult_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = PVMult_setProcMode;
 
     static char *kwlist[] = {"input", "input2", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist, &inputtmp, &input2tmp))
         Py_RETURN_NONE;
 
@@ -3334,7 +3334,7 @@ PVMult_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     self->size = PVStream_getFFTsize(self->input_stream);
     self->olaps = PVStream_getOlaps(self->input_stream);
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     MAKE_NEW_PV_STREAM(self->pv_stream, &PVStreamType, NULL);
@@ -3373,10 +3373,10 @@ PVMult_setInput(PVMult *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input_stream);
     self->input_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVMult_setInput2(PVMult *self, PyObject *arg)
@@ -3396,10 +3396,10 @@ PVMult_setInput2(PVMult *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input2_stream);
     self->input2_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef PVMult_members[] = {
 {"server", T_OBJECT_EX, offsetof(PVMult, server), 0, "Pyo server."},
@@ -3493,14 +3493,14 @@ PVMorph_realloc_memories(PVMorph *self) {
     self->hopsize = self->size / self->olaps;
     inputLatency = self->size - self->hopsize;
     self->overcount = 0;
-    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *)); 
+    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *));
     self->freq = (MYFLT **)realloc(self->freq, self->olaps * sizeof(MYFLT *));
     for (i=0; i<self->olaps; i++) {
         self->magn[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         self->freq[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn[i][j] = self->freq[i][j] = 0.0;
-    } 
+    }
     for (i=0; i<self->bufsize; i++)
         self->count[i] = inputLatency;
     PVStream_setFFTsize(self->pv_stream, self->size);
@@ -3587,24 +3587,24 @@ PVMorph_process_a(PVMorph *self) {
 
 static void
 PVMorph_setProcMode(PVMorph *self)
-{        
+{
     int procmode;
     procmode = self->modebuffer[0];
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = PVMorph_process_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = PVMorph_process_a;
             break;
-    } 
+    }
 }
 
 static void
 PVMorph_compute_next_data_frame(PVMorph *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -3616,12 +3616,12 @@ PVMorph_traverse(PVMorph *self, visitproc visit, void *arg)
     Py_VISIT(self->input2);
     Py_VISIT(self->input2_stream);
     Py_VISIT(self->pv_stream);
-    Py_VISIT(self->fade);    
-    Py_VISIT(self->fade_stream);    
+    Py_VISIT(self->fade);
+    Py_VISIT(self->fade_stream);
     return 0;
 }
 
-static int 
+static int
 PVMorph_clear(PVMorph *self)
 {
     pyo_CLEAR
@@ -3630,8 +3630,8 @@ PVMorph_clear(PVMorph *self)
     Py_CLEAR(self->input2);
     Py_CLEAR(self->input2_stream);
     Py_CLEAR(self->pv_stream);
-    Py_CLEAR(self->fade);    
-    Py_CLEAR(self->fade_stream);    
+    Py_CLEAR(self->fade);
+    Py_CLEAR(self->fade_stream);
     return 0;
 }
 
@@ -3667,7 +3667,7 @@ PVMorph_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = PVMorph_setProcMode;
 
     static char *kwlist[] = {"input", "input2", "fade", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|O", kwlist, &inputtmp, &input2tmp, &fadetmp))
         Py_RETURN_NONE;
 
@@ -3701,7 +3701,7 @@ PVMorph_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (fadetmp) {
         PyObject_CallMethod((PyObject *)self, "setFade", "O", fadetmp);
     }
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     MAKE_NEW_PV_STREAM(self->pv_stream, &PVStreamType, NULL);
@@ -3740,10 +3740,10 @@ PVMorph_setInput(PVMorph *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input_stream);
     self->input_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVMorph_setInput2(PVMorph *self, PyObject *arg)
@@ -3763,23 +3763,23 @@ PVMorph_setInput2(PVMorph *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input2_stream);
     self->input2_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVMorph_setFade(PVMorph *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->fade);
@@ -3795,9 +3795,9 @@ PVMorph_setFade(PVMorph *self, PyObject *arg)
         self->fade_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -3896,14 +3896,14 @@ PVFilter_realloc_memories(PVFilter *self) {
     self->hopsize = self->size / self->olaps;
     inputLatency = self->size - self->hopsize;
     self->overcount = 0;
-    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *)); 
+    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *));
     self->freq = (MYFLT **)realloc(self->freq, self->olaps * sizeof(MYFLT *));
     for (i=0; i<self->olaps; i++) {
         self->magn[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         self->freq[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn[i][j] = self->freq[i][j] = 0.0;
-    } 
+    }
     for (i=0; i<self->bufsize; i++)
         self->count[i] = inputLatency;
     PVStream_setFFTsize(self->pv_stream, self->size);
@@ -3989,7 +3989,7 @@ PVFilter_process_a(PVFilter *self) {
     }
 
     factor = (MYFLT)tsize / self->hsize;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->count[i] = count[i];
         if (count[i] >= (self->size-1)) {
@@ -4028,24 +4028,24 @@ PVFilter_process_a(PVFilter *self) {
 
 static void
 PVFilter_setProcMode(PVFilter *self)
-{        
+{
     int procmode;
     procmode = self->modebuffer[0];
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = PVFilter_process_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = PVFilter_process_a;
             break;
-    } 
+    }
 }
 
 static void
 PVFilter_compute_next_data_frame(PVFilter *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -4055,21 +4055,21 @@ PVFilter_traverse(PVFilter *self, visitproc visit, void *arg)
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
     Py_VISIT(self->pv_stream);
-    Py_VISIT(self->gain);    
-    Py_VISIT(self->gain_stream);    
+    Py_VISIT(self->gain);
+    Py_VISIT(self->gain_stream);
     Py_VISIT(self->table);
     return 0;
 }
 
-static int 
+static int
 PVFilter_clear(PVFilter *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
     Py_CLEAR(self->pv_stream);
-    Py_CLEAR(self->gain);    
-    Py_CLEAR(self->gain_stream);    
+    Py_CLEAR(self->gain);
+    Py_CLEAR(self->gain_stream);
     Py_CLEAR(self->table);
     return 0;
 }
@@ -4101,14 +4101,14 @@ PVFilter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->gain = PyFloat_FromDouble(1);
     self->size = 1024;
     self->olaps = 4;
-    self->mode = 0; /* 0 : index outside table range clipped to 0 
+    self->mode = 0; /* 0 : index outside table range clipped to 0
                        1 : index between 0 and hsize are scaled over table length */
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, PVFilter_compute_next_data_frame);
     self->mode_func_ptr = PVFilter_setProcMode;
 
     static char *kwlist[] = {"input", "table", "gain", "mode", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|Oi", kwlist, &inputtmp, &tabletmp, &gaintmp, &self->mode))
         Py_RETURN_NONE;
 
@@ -4133,7 +4133,7 @@ PVFilter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (gaintmp) {
         PyObject_CallMethod((PyObject *)self, "setGain", "O", gaintmp);
     }
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     MAKE_NEW_PV_STREAM(self->pv_stream, &PVStreamType, NULL);
@@ -4172,23 +4172,23 @@ PVFilter_setInput(PVFilter *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input_stream);
     self->input_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVFilter_setGain(PVFilter *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->gain);
@@ -4204,9 +4204,9 @@ PVFilter_setGain(PVFilter *self, PyObject *arg)
         self->gain_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -4222,7 +4222,7 @@ static PyObject *
 PVFilter_setTable(PVFilter *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
@@ -4231,10 +4231,10 @@ PVFilter_setTable(PVFilter *self, PyObject *arg)
 	tmp = arg;
 	Py_DECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVFilter_setMode(PVFilter *self, PyObject *arg)
@@ -4248,10 +4248,10 @@ PVFilter_setMode(PVFilter *self, PyObject *arg)
         else
             self->mode = 1;
     }
-   
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef PVFilter_members[] = {
 {"server", T_OBJECT_EX, offsetof(PVFilter, server), 0, "Pyo server."},
@@ -4354,22 +4354,22 @@ PVDelay_realloc_memories(PVDelay *self) {
     self->numFrames = (int)(self->maxdelay * self->sr / self->hopsize + 0.5);
     self->overcount = 0;
     self->framecount = 0;
-    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *)); 
+    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *));
     self->freq = (MYFLT **)realloc(self->freq, self->olaps * sizeof(MYFLT *));
     for (i=0; i<self->olaps; i++) {
         self->magn[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         self->freq[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn[i][j] = self->freq[i][j] = 0.0;
-    } 
-    self->magn_buf = (MYFLT **)realloc(self->magn_buf, self->numFrames * sizeof(MYFLT *)); 
+    }
+    self->magn_buf = (MYFLT **)realloc(self->magn_buf, self->numFrames * sizeof(MYFLT *));
     self->freq_buf = (MYFLT **)realloc(self->freq_buf, self->numFrames * sizeof(MYFLT *));
     for (i=0; i<self->numFrames; i++) {
         self->magn_buf[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         self->freq_buf[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn_buf[i][j] = self->freq_buf[i][j] = 0.0;
-    } 
+    }
     for (i=0; i<self->bufsize; i++)
         self->count[i] = inputLatency;
     PVStream_setFFTsize(self->pv_stream, self->size);
@@ -4514,7 +4514,7 @@ PVDelay_process_scaled(PVDelay *self) {
 
 static void
 PVDelay_setProcMode(PVDelay *self)
-{        
+{
     if (self->mode == 0)
         self->proc_func_ptr = PVDelay_process_zero;
     else
@@ -4524,7 +4524,7 @@ PVDelay_setProcMode(PVDelay *self)
 static void
 PVDelay_compute_next_data_frame(PVDelay *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -4539,7 +4539,7 @@ PVDelay_traverse(PVDelay *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 PVDelay_clear(PVDelay *self)
 {
     pyo_CLEAR
@@ -4590,7 +4590,7 @@ PVDelay_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = PVDelay_setProcMode;
 
     static char *kwlist[] = {"input", "deltable", "feedtable", "maxdelay", "mode", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_OOO_FI, kwlist, &inputtmp, &deltabletmp, &feedtabletmp, &self->maxdelay, &self->mode))
         Py_RETURN_NONE;
 
@@ -4614,7 +4614,7 @@ PVDelay_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     Py_XDECREF(self->feedtable);
     self->feedtable = PyObject_CallMethod((PyObject *)feedtabletmp, "getTableStream", "");
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     MAKE_NEW_PV_STREAM(self->pv_stream, &PVStreamType, NULL);
@@ -4654,10 +4654,10 @@ PVDelay_setInput(PVDelay *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input_stream);
     self->input_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVDelay_getDeltable(PVDelay* self)
@@ -4670,7 +4670,7 @@ static PyObject *
 PVDelay_setDeltable(PVDelay *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
@@ -4679,10 +4679,10 @@ PVDelay_setDeltable(PVDelay *self, PyObject *arg)
 	tmp = arg;
 	Py_DECREF(self->deltable);
     self->deltable = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVDelay_getFeedtable(PVDelay* self)
@@ -4695,7 +4695,7 @@ static PyObject *
 PVDelay_setFeedtable(PVDelay *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
@@ -4704,10 +4704,10 @@ PVDelay_setFeedtable(PVDelay *self, PyObject *arg)
 	tmp = arg;
 	Py_DECREF(self->feedtable);
     self->feedtable = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVDelay_setMode(PVDelay *self, PyObject *arg)
@@ -4723,10 +4723,10 @@ PVDelay_setMode(PVDelay *self, PyObject *arg)
     }
 
     (*self->mode_func_ptr)(self);
-   
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef PVDelay_members[] = {
 {"server", T_OBJECT_EX, offsetof(PVDelay, server), 0, "Pyo server."},
@@ -4832,22 +4832,22 @@ PVBuffer_realloc_memories(PVBuffer *self) {
     self->numFrames = (int)(self->length * self->sr / self->hopsize + 0.5);
     self->overcount = 0;
     self->framecount = 0;
-    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *)); 
+    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *));
     self->freq = (MYFLT **)realloc(self->freq, self->olaps * sizeof(MYFLT *));
     for (i=0; i<self->olaps; i++) {
         self->magn[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         self->freq[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn[i][j] = self->freq[i][j] = 0.0;
-    } 
-    self->magn_buf = (MYFLT **)realloc(self->magn_buf, self->numFrames * sizeof(MYFLT *)); 
+    }
+    self->magn_buf = (MYFLT **)realloc(self->magn_buf, self->numFrames * sizeof(MYFLT *));
     self->freq_buf = (MYFLT **)realloc(self->freq_buf, self->numFrames * sizeof(MYFLT *));
     for (i=0; i<self->numFrames; i++) {
         self->magn_buf[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         self->freq_buf[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn_buf[i][j] = self->freq_buf[i][j] = 0.0;
-    } 
+    }
     for (i=0; i<self->bufsize; i++)
         self->count[i] = inputLatency;
     PVStream_setFFTsize(self->pv_stream, self->size);
@@ -4964,15 +4964,15 @@ PVBuffer_process_a(PVBuffer *self) {
 
 static void
 PVBuffer_setProcMode(PVBuffer *self)
-{        
+{
     int procmode;
     procmode = self->modebuffer[0];
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = PVBuffer_process_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = PVBuffer_process_a;
             break;
     } }
@@ -4980,7 +4980,7 @@ PVBuffer_setProcMode(PVBuffer *self)
 static void
 PVBuffer_compute_next_data_frame(PVBuffer *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -4997,7 +4997,7 @@ PVBuffer_traverse(PVBuffer *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 PVBuffer_clear(PVBuffer *self)
 {
     pyo_CLEAR
@@ -5041,7 +5041,7 @@ PVBuffer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PVBuffer *self;
     self = (PVBuffer *)type->tp_alloc(type, 0);
 
-    self->pitch = PyFloat_FromDouble(1);    
+    self->pitch = PyFloat_FromDouble(1);
     self->size = 1024;
     self->olaps = 4;
     self->length = 1.0;
@@ -5050,7 +5050,7 @@ PVBuffer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = PVBuffer_setProcMode;
 
     static char *kwlist[] = {"input", "index", "pitch", "length", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_OO_OF, kwlist, &inputtmp, &indextmp, &pitchtmp, &self->length))
         Py_RETURN_NONE;
 
@@ -5076,7 +5076,7 @@ PVBuffer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (pitchtmp) {
         PyObject_CallMethod((PyObject *)self, "setPitch", "O", pitchtmp);
     }
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     MAKE_NEW_PV_STREAM(self->pv_stream, &PVStreamType, NULL);
@@ -5094,9 +5094,9 @@ static PyObject * PVBuffer_getServer(PVBuffer* self) { GET_SERVER };
 static PyObject * PVBuffer_getStream(PVBuffer* self) { GET_STREAM };
 static PyObject * PVBuffer_getPVStream(PVBuffer* self) { GET_PV_STREAM };
 
-static PyObject * PVBuffer_play(PVBuffer *self, PyObject *args, PyObject *kwds) { 
+static PyObject * PVBuffer_play(PVBuffer *self, PyObject *args, PyObject *kwds) {
     self->framecount = 0;
-    PLAY 
+    PLAY
 };
 
 static PyObject * PVBuffer_stop(PVBuffer *self) { STOP };
@@ -5119,27 +5119,27 @@ PVBuffer_setInput(PVBuffer *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input_stream);
     self->input_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVBuffer_setIndex(PVBuffer *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	if (PyObject_HasAttrString((PyObject *)tmp, "server") == 0) {
         PyErr_SetString(PyExc_TypeError, "\"index\" argument of PVBuffer must be a PyoObject.\n");
         Py_RETURN_NONE;
 	}
-	
+
 	Py_INCREF(tmp);
 	Py_XDECREF(self->index);
 
@@ -5148,23 +5148,23 @@ PVBuffer_setIndex(PVBuffer *self, PyObject *arg)
     Py_INCREF(streamtmp);
     Py_XDECREF(self->index_stream);
     self->index_stream = (Stream *)streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVBuffer_setPitch(PVBuffer *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->pitch);
@@ -5180,12 +5180,12 @@ PVBuffer_setPitch(PVBuffer *self, PyObject *arg)
         self->pitch_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef PVBuffer_members[] = {
 {"server", T_OBJECT_EX, offsetof(PVBuffer, server), 0, "Pyo server."},
@@ -5279,14 +5279,14 @@ PVShift_realloc_memories(PVShift *self) {
     self->hopsize = self->size / self->olaps;
     inputLatency = self->size - self->hopsize;
     self->overcount = 0;
-    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *)); 
+    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *));
     self->freq = (MYFLT **)realloc(self->freq, self->olaps * sizeof(MYFLT *));
     for (i=0; i<self->olaps; i++) {
         self->magn[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         self->freq[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn[i][j] = self->freq[i][j] = 0.0;
-    } 
+    }
     for (i=0; i<self->bufsize; i++)
         self->count[i] = inputLatency;
     PVStream_setFFTsize(self->pv_stream, self->size);
@@ -5379,24 +5379,24 @@ PVShift_process_a(PVShift *self) {
 
 static void
 PVShift_setProcMode(PVShift *self)
-{        
+{
     int procmode;
     procmode = self->modebuffer[0];
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = PVShift_process_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = PVShift_process_a;
             break;
-    } 
+    }
 }
 
 static void
 PVShift_compute_next_data_frame(PVShift *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -5406,20 +5406,20 @@ PVShift_traverse(PVShift *self, visitproc visit, void *arg)
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
     Py_VISIT(self->pv_stream);
-    Py_VISIT(self->shift);    
-    Py_VISIT(self->shift_stream);    
+    Py_VISIT(self->shift);
+    Py_VISIT(self->shift_stream);
     return 0;
 }
 
-static int 
+static int
 PVShift_clear(PVShift *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
     Py_CLEAR(self->pv_stream);
-    Py_CLEAR(self->shift);    
-    Py_CLEAR(self->shift_stream);    
+    Py_CLEAR(self->shift);
+    Py_CLEAR(self->shift_stream);
     return 0;
 }
 
@@ -5455,7 +5455,7 @@ PVShift_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = PVShift_setProcMode;
 
     static char *kwlist[] = {"input", "shift", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|O", kwlist, &inputtmp, &shifttmp))
         Py_RETURN_NONE;
 
@@ -5477,7 +5477,7 @@ PVShift_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (shifttmp) {
         PyObject_CallMethod((PyObject *)self, "setShift", "O", shifttmp);
     }
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     MAKE_NEW_PV_STREAM(self->pv_stream, &PVStreamType, NULL);
@@ -5516,23 +5516,23 @@ PVShift_setInput(PVShift *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input_stream);
     self->input_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVShift_setShift(PVShift *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->shift);
@@ -5548,9 +5548,9 @@ PVShift_setShift(PVShift *self, PyObject *arg)
         self->shift_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -5651,7 +5651,7 @@ PVAmpMod_realloc_memories(PVAmpMod *self) {
     inputLatency = self->size - self->hopsize;
     self->overcount = 0;
     self->factor = 8192.0 / (self->sr / self->hopsize);
-    self->pointers = (MYFLT *)realloc(self->pointers, self->hsize * sizeof(MYFLT)); 
+    self->pointers = (MYFLT *)realloc(self->pointers, self->hsize * sizeof(MYFLT));
     for (i=0; i<self->hsize; i++)
         self->pointers[i] = 0.0;
     self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *));
@@ -5661,7 +5661,7 @@ PVAmpMod_realloc_memories(PVAmpMod *self) {
         self->freq[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn[i][j] = self->freq[i][j] = 0.0;
-    } 
+    }
     for (i=0; i<self->bufsize; i++)
         self->count[i] = inputLatency;
     PVStream_setFFTsize(self->pv_stream, self->size);
@@ -5683,7 +5683,7 @@ PVAmpMod_process_ii(PVAmpMod *self) {
     bfreq = PyFloat_AS_DOUBLE(self->basefreq);
     spread = PyFloat_AS_DOUBLE(self->spread);
     spread *= 0.001;
-    spread += 1.0; 
+    spread += 1.0;
 
     if (self->size != size || self->olaps != olaps) {
         self->size = size;
@@ -5724,7 +5724,7 @@ PVAmpMod_process_ai(PVAmpMod *self) {
     MYFLT *bf = Stream_getData((Stream *)self->basefreq_stream);
     spread = PyFloat_AS_DOUBLE(self->spread);
     spread *= 0.001;
-    spread += 1.0; 
+    spread += 1.0;
 
     if (self->size != size || self->olaps != olaps) {
         self->size = size;
@@ -5777,7 +5777,7 @@ PVAmpMod_process_ia(PVAmpMod *self) {
         if (count[i] >= (self->size-1)) {
             spread = sp[i];
             spread *= 0.001;
-            spread += 1.0; 
+            spread += 1.0;
             for (k=0; k<self->hsize; k++) {
                 pos = self->pointers[k];
                 self->magn[self->overcount][k] = magn[self->overcount][k] * self->table[(int)pos];
@@ -5820,7 +5820,7 @@ PVAmpMod_process_aa(PVAmpMod *self) {
             bfreq = bf[i];
             spread = sp[i];
             spread *= 0.001;
-            spread += 1.0; 
+            spread += 1.0;
             for (k=0; k<self->hsize; k++) {
                 pos = self->pointers[k];
                 self->magn[self->overcount][k] = magn[self->overcount][k] * self->table[(int)pos];
@@ -5841,30 +5841,30 @@ PVAmpMod_process_aa(PVAmpMod *self) {
 
 static void
 PVAmpMod_setProcMode(PVAmpMod *self)
-{        
+{
     int procmode;
     procmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = PVAmpMod_process_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = PVAmpMod_process_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = PVAmpMod_process_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = PVAmpMod_process_aa;
             break;
-    } 
+    }
 }
 
 static void
 PVAmpMod_compute_next_data_frame(PVAmpMod *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -5874,24 +5874,24 @@ PVAmpMod_traverse(PVAmpMod *self, visitproc visit, void *arg)
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
     Py_VISIT(self->pv_stream);
-    Py_VISIT(self->basefreq);    
-    Py_VISIT(self->basefreq_stream);    
-    Py_VISIT(self->spread);    
-    Py_VISIT(self->spread_stream);    
+    Py_VISIT(self->basefreq);
+    Py_VISIT(self->basefreq_stream);
+    Py_VISIT(self->spread);
+    Py_VISIT(self->spread_stream);
     return 0;
 }
 
-static int 
+static int
 PVAmpMod_clear(PVAmpMod *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
     Py_CLEAR(self->pv_stream);
-    Py_CLEAR(self->basefreq);    
-    Py_CLEAR(self->basefreq_stream);    
-    Py_CLEAR(self->spread);    
-    Py_CLEAR(self->spread_stream);    
+    Py_CLEAR(self->basefreq);
+    Py_CLEAR(self->basefreq_stream);
+    Py_CLEAR(self->spread);
+    Py_CLEAR(self->spread_stream);
     return 0;
 }
 
@@ -5930,7 +5930,7 @@ PVAmpMod_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = PVAmpMod_setProcMode;
 
     static char *kwlist[] = {"input", "basefreq", "spread", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &basefreqtmp, &spreadtmp))
         Py_RETURN_NONE;
 
@@ -5956,7 +5956,7 @@ PVAmpMod_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (spreadtmp) {
         PyObject_CallMethod((PyObject *)self, "setSpread", "O", spreadtmp);
     }
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     MAKE_NEW_PV_STREAM(self->pv_stream, &PVStreamType, NULL);
@@ -6000,23 +6000,23 @@ PVAmpMod_setInput(PVAmpMod *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input_stream);
     self->input_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVAmpMod_setBasefreq(PVAmpMod *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->basefreq);
@@ -6032,9 +6032,9 @@ PVAmpMod_setBasefreq(PVAmpMod *self, PyObject *arg)
         self->basefreq_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -6043,14 +6043,14 @@ static PyObject *
 PVAmpMod_setSpread(PVAmpMod *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->spread);
@@ -6066,9 +6066,9 @@ PVAmpMod_setSpread(PVAmpMod *self, PyObject *arg)
         self->spread_stream = (Stream *)streamtmp;
 		self->modebuffer[1] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -6183,7 +6183,7 @@ PVFreqMod_realloc_memories(PVFreqMod *self) {
     inputLatency = self->size - self->hopsize;
     self->overcount = 0;
     self->factor = 8192.0 / (self->sr / self->hopsize);
-    self->pointers = (MYFLT *)realloc(self->pointers, self->hsize * sizeof(MYFLT)); 
+    self->pointers = (MYFLT *)realloc(self->pointers, self->hsize * sizeof(MYFLT));
     for (i=0; i<self->hsize; i++)
         self->pointers[i] = 0.0;
     self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *));
@@ -6193,7 +6193,7 @@ PVFreqMod_realloc_memories(PVFreqMod *self) {
         self->freq[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn[i][j] = self->freq[i][j] = 0.0;
-    } 
+    }
     for (i=0; i<self->bufsize; i++)
         self->count[i] = inputLatency;
     PVStream_setFFTsize(self->pv_stream, self->size);
@@ -6215,7 +6215,7 @@ PVFreqMod_process_ii(PVFreqMod *self) {
     bfreq = PyFloat_AS_DOUBLE(self->basefreq);
     spread = PyFloat_AS_DOUBLE(self->spread);
     spread *= 0.001;
-    spread += 1.0; 
+    spread += 1.0;
 
     if (self->modebuffer[2] == 0)
         depth = PyFloat_AS_DOUBLE(self->depth);
@@ -6273,7 +6273,7 @@ PVFreqMod_process_ai(PVFreqMod *self) {
     MYFLT *bf = Stream_getData((Stream *)self->basefreq_stream);
     spread = PyFloat_AS_DOUBLE(self->spread);
     spread *= 0.001;
-    spread += 1.0; 
+    spread += 1.0;
 
     if (self->modebuffer[2] == 0)
         depth = PyFloat_AS_DOUBLE(self->depth);
@@ -6352,7 +6352,7 @@ PVFreqMod_process_ia(PVFreqMod *self) {
         if (count[i] >= (self->size-1)) {
             spread = sp[i];
             spread *= 0.001;
-            spread += 1.0; 
+            spread += 1.0;
             freqPerBin = self->sr / self->size;
             for (k=0; k<self->hsize; k++) {
                 self->magn[self->overcount][k] = self->freq[self->overcount][k] = 0.0;
@@ -6412,7 +6412,7 @@ PVFreqMod_process_aa(PVFreqMod *self) {
             bfreq = bf[i];
             spread = sp[i];
             spread *= 0.001;
-            spread += 1.0; 
+            spread += 1.0;
             freqPerBin = self->sr / self->size;
             for (k=0; k<self->hsize; k++) {
                 self->magn[self->overcount][k] = self->freq[self->overcount][k] = 0.0;
@@ -6441,30 +6441,30 @@ PVFreqMod_process_aa(PVFreqMod *self) {
 
 static void
 PVFreqMod_setProcMode(PVFreqMod *self)
-{        
+{
     int procmode;
     procmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = PVFreqMod_process_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = PVFreqMod_process_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = PVFreqMod_process_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = PVFreqMod_process_aa;
             break;
-    } 
+    }
 }
 
 static void
 PVFreqMod_compute_next_data_frame(PVFreqMod *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -6474,28 +6474,28 @@ PVFreqMod_traverse(PVFreqMod *self, visitproc visit, void *arg)
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
     Py_VISIT(self->pv_stream);
-    Py_VISIT(self->basefreq);    
-    Py_VISIT(self->basefreq_stream);    
-    Py_VISIT(self->spread);    
-    Py_VISIT(self->spread_stream);    
-    Py_VISIT(self->depth);    
-    Py_VISIT(self->depth_stream);    
+    Py_VISIT(self->basefreq);
+    Py_VISIT(self->basefreq_stream);
+    Py_VISIT(self->spread);
+    Py_VISIT(self->spread_stream);
+    Py_VISIT(self->depth);
+    Py_VISIT(self->depth_stream);
     return 0;
 }
 
-static int 
+static int
 PVFreqMod_clear(PVFreqMod *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
     Py_CLEAR(self->pv_stream);
-    Py_CLEAR(self->basefreq);    
-    Py_CLEAR(self->basefreq_stream);    
-    Py_CLEAR(self->spread);    
-    Py_CLEAR(self->spread_stream);    
-    Py_CLEAR(self->depth);    
-    Py_CLEAR(self->depth_stream);    
+    Py_CLEAR(self->basefreq);
+    Py_CLEAR(self->basefreq_stream);
+    Py_CLEAR(self->spread);
+    Py_CLEAR(self->spread_stream);
+    Py_CLEAR(self->depth);
+    Py_CLEAR(self->depth_stream);
     return 0;
 }
 
@@ -6535,7 +6535,7 @@ PVFreqMod_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = PVFreqMod_setProcMode;
 
     static char *kwlist[] = {"input", "basefreq", "spread", "depth", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOO", kwlist, &inputtmp, &basefreqtmp, &spreadtmp, &depthtmp))
         Py_RETURN_NONE;
 
@@ -6565,7 +6565,7 @@ PVFreqMod_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (depthtmp) {
         PyObject_CallMethod((PyObject *)self, "setDepth", "O", depthtmp);
     }
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     MAKE_NEW_PV_STREAM(self->pv_stream, &PVStreamType, NULL);
@@ -6609,23 +6609,23 @@ PVFreqMod_setInput(PVFreqMod *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input_stream);
     self->input_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVFreqMod_setBasefreq(PVFreqMod *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->basefreq);
@@ -6641,9 +6641,9 @@ PVFreqMod_setBasefreq(PVFreqMod *self, PyObject *arg)
         self->basefreq_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -6652,14 +6652,14 @@ static PyObject *
 PVFreqMod_setSpread(PVFreqMod *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->spread);
@@ -6675,9 +6675,9 @@ PVFreqMod_setSpread(PVFreqMod *self, PyObject *arg)
         self->spread_stream = (Stream *)streamtmp;
 		self->modebuffer[1] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -6686,14 +6686,14 @@ static PyObject *
 PVFreqMod_setDepth(PVFreqMod *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->depth);
@@ -6709,9 +6709,9 @@ PVFreqMod_setDepth(PVFreqMod *self, PyObject *arg)
         self->depth_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -6843,22 +6843,22 @@ PVBufLoops_realloc_memories(PVBufLoops *self) {
         self->speeds[i] = 1.0;
         self->pointers[i] = 0.0;
     }
-    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *)); 
+    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *));
     self->freq = (MYFLT **)realloc(self->freq, self->olaps * sizeof(MYFLT *));
     for (i=0; i<self->olaps; i++) {
         self->magn[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         self->freq[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn[i][j] = self->freq[i][j] = 0.0;
-    } 
-    self->magn_buf = (MYFLT **)realloc(self->magn_buf, self->numFrames * sizeof(MYFLT *)); 
+    }
+    self->magn_buf = (MYFLT **)realloc(self->magn_buf, self->numFrames * sizeof(MYFLT *));
     self->freq_buf = (MYFLT **)realloc(self->freq_buf, self->numFrames * sizeof(MYFLT *));
     for (i=0; i<self->numFrames; i++) {
         self->magn_buf[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         self->freq_buf[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn_buf[i][j] = self->freq_buf[i][j] = 0.0;
-    } 
+    }
     for (i=0; i<self->bufsize; i++)
         self->count[i] = inputLatency;
     PVStream_setFFTsize(self->pv_stream, self->size);
@@ -6888,12 +6888,12 @@ PVBufLoops_setSpeeds(PVBufLoops *self, MYFLT low, MYFLT high) {
             for (i=0; i<self->hsize; i++)
                 self->speeds[i] = low + tmp * (1.0 - MYPOW(1.0-(float)i/self->hsize, 3.0));
             break;
-        case 3: /* random uniform */ 
+        case 3: /* random uniform */
             tmp = high - low;
             for (i=0; i<self->hsize; i++)
-                self->speeds[i] = RANDOM_UNIFORM * tmp + low; 
+                self->speeds[i] = RANDOM_UNIFORM * tmp + low;
             break;
-        case 4: /* random exponential min */ 
+        case 4: /* random exponential min */
             for (i=0; i<self->hsize; i++) {
                 tmp = -MYLOG(RANDOM_UNIFORM) * 0.05;
                 tmp = tmp < 0 ? 0.0 : tmp;
@@ -6901,15 +6901,15 @@ PVBufLoops_setSpeeds(PVBufLoops *self, MYFLT low, MYFLT high) {
                 self->speeds[i] = tmp * (high - low) + low;
             }
             break;
-        case 5: /* random exponential max */ 
+        case 5: /* random exponential max */
             for (i=0; i<self->hsize; i++) {
                 tmp = 1.0 - (-MYLOG(RANDOM_UNIFORM) * 0.05);
                 tmp = tmp < 0 ? 0.0 : tmp;
                 tmp = tmp > 1.0 ? 1.0 : tmp;
-                self->speeds[i] = tmp * (high - low) + low; 
+                self->speeds[i] = tmp * (high - low) + low;
             }
             break;
-        case 6: /* random bi-exponential */ 
+        case 6: /* random bi-exponential */
             for (i=0; i<self->hsize; i++) {
                 tmp = RANDOM_UNIFORM * 2.0;
                 if (tmp > 1.0)
@@ -6918,7 +6918,7 @@ PVBufLoops_setSpeeds(PVBufLoops *self, MYFLT low, MYFLT high) {
                     tmp = 0.5 * (MYLOG(tmp) * 0.05) + 0.5;
                 tmp = tmp < 0 ? 0.0 : tmp;
                 tmp = tmp > 1.0 ? 1.0 : tmp;
-                self->speeds[i] = tmp * (high - low) + low; 
+                self->speeds[i] = tmp * (high - low) + low;
             }
             break;
         default: /* linear */
@@ -6996,14 +6996,14 @@ PVBufLoops_process(PVBufLoops *self) {
 
 static void
 PVBufLoops_setProcMode(PVBufLoops *self)
-{        
+{
     self->proc_func_ptr = PVBufLoops_process;
 }
 
 static void
 PVBufLoops_compute_next_data_frame(PVBufLoops *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -7020,7 +7020,7 @@ PVBufLoops_traverse(PVBufLoops *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 PVBufLoops_clear(PVBufLoops *self)
 {
     pyo_CLEAR
@@ -7070,7 +7070,7 @@ PVBufLoops_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->high = PyFloat_FromDouble(1.0);
     self->last_low = self->last_high = -1.0;
     self->mode = 0;
-    self->last_mode = -1;    
+    self->last_mode = -1;
     self->size = 1024;
     self->olaps = 4;
     self->length = 1.0;
@@ -7079,7 +7079,7 @@ PVBufLoops_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = PVBufLoops_setProcMode;
 
     static char *kwlist[] = {"input", "low", "high", "mode", "length", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_OOIF, kwlist, &inputtmp, &lowtmp, &hightmp, &self->mode, &self->length))
         Py_RETURN_NONE;
 
@@ -7105,7 +7105,7 @@ PVBufLoops_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (hightmp) {
         PyObject_CallMethod((PyObject *)self, "setHigh", "O", hightmp);
     }
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     MAKE_NEW_PV_STREAM(self->pv_stream, &PVStreamType, NULL);
@@ -7123,12 +7123,12 @@ static PyObject * PVBufLoops_getServer(PVBufLoops* self) { GET_SERVER };
 static PyObject * PVBufLoops_getStream(PVBufLoops* self) { GET_STREAM };
 static PyObject * PVBufLoops_getPVStream(PVBufLoops* self) { GET_PV_STREAM };
 
-static PyObject * PVBufLoops_play(PVBufLoops *self, PyObject *args, PyObject *kwds) { 
+static PyObject * PVBufLoops_play(PVBufLoops *self, PyObject *args, PyObject *kwds) {
     int k;
     for (k=0; k<self->hsize; k++)
         self->pointers[k] = 0.0;
     self->framecount = 0;
-    PLAY 
+    PLAY
 };
 
 static PyObject * PVBufLoops_stop(PVBufLoops *self) { STOP };
@@ -7151,23 +7151,23 @@ PVBufLoops_setInput(PVBufLoops *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input_stream);
     self->input_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVBufLoops_setLow(PVBufLoops *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->low);
@@ -7186,20 +7186,20 @@ PVBufLoops_setLow(PVBufLoops *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVBufLoops_setHigh(PVBufLoops *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->high);
@@ -7218,7 +7218,7 @@ PVBufLoops_setHigh(PVBufLoops *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVBufLoops_setMode(PVBufLoops *self, PyObject *arg)
@@ -7228,9 +7228,9 @@ PVBufLoops_setMode(PVBufLoops *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isInt = PyInt_Check(arg);
-	
+
 	if (isInt == 1) {
 		tmp = PyInt_AsLong(arg);
         if (tmp >= 0 && tmp < 7)
@@ -7239,7 +7239,7 @@ PVBufLoops_setMode(PVBufLoops *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVBufLoops_reset(PVBufLoops *self) {
@@ -7356,22 +7356,22 @@ PVBufTabLoops_realloc_memories(PVBufTabLoops *self) {
     for (i=0; i<self->hsize; i++) {
         self->pointers[i] = 0.0;
     }
-    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *)); 
+    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *));
     self->freq = (MYFLT **)realloc(self->freq, self->olaps * sizeof(MYFLT *));
     for (i=0; i<self->olaps; i++) {
         self->magn[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         self->freq[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn[i][j] = self->freq[i][j] = 0.0;
-    } 
-    self->magn_buf = (MYFLT **)realloc(self->magn_buf, self->numFrames * sizeof(MYFLT *)); 
+    }
+    self->magn_buf = (MYFLT **)realloc(self->magn_buf, self->numFrames * sizeof(MYFLT *));
     self->freq_buf = (MYFLT **)realloc(self->freq_buf, self->numFrames * sizeof(MYFLT *));
     for (i=0; i<self->numFrames; i++) {
         self->magn_buf[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         self->freq_buf[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn_buf[i][j] = self->freq_buf[i][j] = 0.0;
-    } 
+    }
     for (i=0; i<self->bufsize; i++)
         self->count[i] = inputLatency;
     PVStream_setFFTsize(self->pv_stream, self->size);
@@ -7437,14 +7437,14 @@ PVBufTabLoops_process(PVBufTabLoops *self) {
 
 static void
 PVBufTabLoops_setProcMode(PVBufTabLoops *self)
-{        
+{
     self->proc_func_ptr = PVBufTabLoops_process;
 }
 
 static void
 PVBufTabLoops_compute_next_data_frame(PVBufTabLoops *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -7458,7 +7458,7 @@ PVBufTabLoops_traverse(PVBufTabLoops *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 PVBufTabLoops_clear(PVBufTabLoops *self)
 {
     pyo_CLEAR
@@ -7508,7 +7508,7 @@ PVBufTabLoops_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = PVBufTabLoops_setProcMode;
 
     static char *kwlist[] = {"input", "speed", "length", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_OO_F, kwlist, &inputtmp, &speedtmp, &self->length))
         Py_RETURN_NONE;
 
@@ -7529,7 +7529,7 @@ PVBufTabLoops_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     Py_XDECREF(self->speed);
     self->speed = PyObject_CallMethod((PyObject *)speedtmp, "getTableStream", "");
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     MAKE_NEW_PV_STREAM(self->pv_stream, &PVStreamType, NULL);
@@ -7547,12 +7547,12 @@ static PyObject * PVBufTabLoops_getServer(PVBufTabLoops* self) { GET_SERVER };
 static PyObject * PVBufTabLoops_getStream(PVBufTabLoops* self) { GET_STREAM };
 static PyObject * PVBufTabLoops_getPVStream(PVBufTabLoops* self) { GET_PV_STREAM };
 
-static PyObject * PVBufTabLoops_play(PVBufTabLoops *self, PyObject *args, PyObject *kwds) { 
+static PyObject * PVBufTabLoops_play(PVBufTabLoops *self, PyObject *args, PyObject *kwds) {
     int k;
     for (k=0; k<self->hsize; k++)
         self->pointers[k] = 0.0;
     self->framecount = 0;
-    PLAY 
+    PLAY
 };
 
 static PyObject * PVBufTabLoops_stop(PVBufTabLoops *self) { STOP };
@@ -7575,28 +7575,28 @@ PVBufTabLoops_setInput(PVBufTabLoops *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input_stream);
     self->input_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVBufTabLoops_setSpeed(PVBufTabLoops *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->speed);
     self->speed = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVBufTabLoops_reset(PVBufTabLoops *self) {
@@ -7697,14 +7697,14 @@ PVMix_realloc_memories(PVMix *self) {
     self->hopsize = self->size / self->olaps;
     inputLatency = self->size - self->hopsize;
     self->overcount = 0;
-    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *)); 
+    self->magn = (MYFLT **)realloc(self->magn, self->olaps * sizeof(MYFLT *));
     self->freq = (MYFLT **)realloc(self->freq, self->olaps * sizeof(MYFLT *));
     for (i=0; i<self->olaps; i++) {
         self->magn[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         self->freq[i] = (MYFLT *)malloc(self->hsize * sizeof(MYFLT));
         for (j=0; j<self->hsize; j++)
             self->magn[i][j] = self->freq[i][j] = 0.0;
-    } 
+    }
     for (i=0; i<self->bufsize; i++)
         self->count[i] = inputLatency;
     PVStream_setFFTsize(self->pv_stream, self->size);
@@ -7760,7 +7760,7 @@ PVMix_setProcMode(PVMix *self)
 static void
 PVMix_compute_next_data_frame(PVMix *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -7775,7 +7775,7 @@ PVMix_traverse(PVMix *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 PVMix_clear(PVMix *self)
 {
     pyo_CLEAR
@@ -7818,7 +7818,7 @@ PVMix_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = PVMix_setProcMode;
 
     static char *kwlist[] = {"input", "input2", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist, &inputtmp, &input2tmp))
         Py_RETURN_NONE;
 
@@ -7848,7 +7848,7 @@ PVMix_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     self->size = PVStream_getFFTsize(self->input_stream);
     self->olaps = PVStream_getOlaps(self->input_stream);
- 
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     MAKE_NEW_PV_STREAM(self->pv_stream, &PVStreamType, NULL);
@@ -7887,10 +7887,10 @@ PVMix_setInput(PVMix *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input_stream);
     self->input_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 PVMix_setInput2(PVMix *self, PyObject *arg)
@@ -7910,10 +7910,10 @@ PVMix_setInput2(PVMix *self, PyObject *arg)
     Py_INCREF(input_streamtmp);
     Py_XDECREF(self->input2_stream);
     self->input2_stream = (PVStream *)input_streamtmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef PVMix_members[] = {
 {"server", T_OBJECT_EX, offsetof(PVMix, server), 0, "Pyo server."},
@@ -7975,4 +7975,4 @@ PVMix_members,                                 /* tp_members */
 0,                          /* tp_init */
 0,                                              /* tp_alloc */
 PVMix_new,                                     /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/randommodule.c b/src/objects/randommodule.c
index b1e4e85..5fccbab 100644
--- a/src/objects/randommodule.c
+++ b/src/objects/randommodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -38,7 +38,7 @@ typedef struct {
     MYFLT oldValue;
     MYFLT diff;
     MYFLT time;
-    int modebuffer[5]; // need at least 2 slots for mul & add 
+    int modebuffer[5]; // need at least 2 slots for mul & add
 } Randi;
 
 static void
@@ -50,7 +50,7 @@ Randi_generate_iii(Randi *self) {
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT range = ma - mi;
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->time += inc;
         if (self->time < 0.0)
@@ -73,7 +73,7 @@ Randi_generate_aii(Randi *self) {
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         range = ma - mi[i];
         self->time += inc;
@@ -97,7 +97,7 @@ Randi_generate_iai(Randi *self) {
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         range = ma[i] - mi;
         self->time += inc;
@@ -121,7 +121,7 @@ Randi_generate_aai(Randi *self) {
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         range = ma[i] - mi[i];
         self->time += inc;
@@ -145,7 +145,7 @@ Randi_generate_iia(Randi *self) {
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT range = ma - mi;
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         self->time += inc;
@@ -168,7 +168,7 @@ Randi_generate_aia(Randi *self) {
     MYFLT *mi = Stream_getData((Stream *)self->min_stream);
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         range = ma - mi[i];
@@ -192,7 +192,7 @@ Randi_generate_iaa(Randi *self) {
     MYFLT mi = PyFloat_AS_DOUBLE(self->min);
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         range = ma[i] - mi;
@@ -216,7 +216,7 @@ Randi_generate_aaa(Randi *self) {
     MYFLT *mi = Stream_getData((Stream *)self->min_stream);
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         range = ma[i] - mi[i];
@@ -249,68 +249,68 @@ Randi_setProcMode(Randi *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10 + self->modebuffer[4] * 100;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Randi_generate_iii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Randi_generate_aii;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = Randi_generate_iai;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Randi_generate_aai;
             break;
-        case 100:    
+        case 100:
             self->proc_func_ptr = Randi_generate_iia;
             break;
-        case 101:    
+        case 101:
             self->proc_func_ptr = Randi_generate_aia;
             break;
-        case 110:    
+        case 110:
             self->proc_func_ptr = Randi_generate_iaa;
             break;
-        case 111:    
+        case 111:
             self->proc_func_ptr = Randi_generate_aaa;
-            break;            
-    } 
+            break;
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Randi_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Randi_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Randi_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Randi_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Randi_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Randi_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Randi_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Randi_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Randi_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 Randi_compute_next_data_frame(Randi *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -320,23 +320,23 @@ Randi_traverse(Randi *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->freq);
     Py_VISIT(self->freq_stream);
-    Py_VISIT(self->min);    
-    Py_VISIT(self->min_stream);    
-    Py_VISIT(self->max);    
-    Py_VISIT(self->max_stream);    
+    Py_VISIT(self->min);
+    Py_VISIT(self->min_stream);
+    Py_VISIT(self->max);
+    Py_VISIT(self->max_stream);
     return 0;
 }
 
-static int 
+static int
 Randi_clear(Randi *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->freq);
     Py_CLEAR(self->freq_stream);
-    Py_CLEAR(self->min);    
-    Py_CLEAR(self->min_stream);    
-    Py_CLEAR(self->max);    
-    Py_CLEAR(self->max_stream);    
+    Py_CLEAR(self->min);
+    Py_CLEAR(self->min_stream);
+    Py_CLEAR(self->max);
+    Py_CLEAR(self->max_stream);
     return 0;
 }
 
@@ -356,7 +356,7 @@ Randi_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *mintmp=NULL, *maxtmp=NULL, *freqtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Randi *self;
     self = (Randi *)type->tp_alloc(type, 0);
-    
+
     self->min = PyFloat_FromDouble(0.);
     self->max = PyFloat_FromDouble(1.);
     self->freq = PyFloat_FromDouble(1.);
@@ -367,20 +367,20 @@ Randi_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
 	self->modebuffer[4] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Randi_compute_next_data_frame);
     self->mode_func_ptr = Randi_setProcMode;
 
     static char *kwlist[] = {"min", "max", "freq", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOOOO", kwlist, &mintmp, &maxtmp, &freqtmp, &multmp, &addtmp))
-        Py_RETURN_NONE; 
+        Py_RETURN_NONE;
 
     if (mintmp) {
         PyObject_CallMethod((PyObject *)self, "setMin", "O", mintmp);
     }
-    
+
     if (maxtmp) {
         PyObject_CallMethod((PyObject *)self, "setMax", "O", maxtmp);
     }
@@ -388,15 +388,15 @@ Randi_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     Server_generateSeed((Server *)self->server, RANDI_ID);
@@ -409,7 +409,7 @@ Randi_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         ma = PyFloat_AS_DOUBLE(self->max);
     else
         ma = Stream_getData((Stream *)self->max_stream)[0];
-    
+
     self->value = self->oldValue = (mi + ma) * 0.5;
 
     (*self->mode_func_ptr)(self);
@@ -419,10 +419,10 @@ Randi_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Randi_getServer(Randi* self) { GET_SERVER };
 static PyObject * Randi_getStream(Randi* self) { GET_STREAM };
-static PyObject * Randi_setMul(Randi *self, PyObject *arg) { SET_MUL };	
-static PyObject * Randi_setAdd(Randi *self, PyObject *arg) { SET_ADD };	
-static PyObject * Randi_setSub(Randi *self, PyObject *arg) { SET_SUB };	
-static PyObject * Randi_setDiv(Randi *self, PyObject *arg) { SET_DIV };	
+static PyObject * Randi_setMul(Randi *self, PyObject *arg) { SET_MUL };
+static PyObject * Randi_setAdd(Randi *self, PyObject *arg) { SET_ADD };
+static PyObject * Randi_setSub(Randi *self, PyObject *arg) { SET_SUB };
+static PyObject * Randi_setDiv(Randi *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Randi_play(Randi *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Randi_out(Randi *self, PyObject *args, PyObject *kwds) { OUT };
@@ -441,14 +441,14 @@ static PyObject *
 Randi_setMin(Randi *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->min);
@@ -464,25 +464,25 @@ Randi_setMin(Randi *self, PyObject *arg)
         self->min_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Randi_setMax(Randi *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->max);
@@ -498,25 +498,25 @@ Randi_setMax(Randi *self, PyObject *arg)
         self->max_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Randi_setFreq(Randi *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -532,12 +532,12 @@ Randi_setFreq(Randi *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Randi_members[] = {
 {"server", T_OBJECT_EX, offsetof(Randi, server), 0, "Pyo server."},
@@ -663,7 +663,7 @@ typedef struct {
     Stream *freq_stream;
     MYFLT value;
     MYFLT time;
-    int modebuffer[5]; // need at least 2 slots for mul & add 
+    int modebuffer[5]; // need at least 2 slots for mul & add
 } Randh;
 
 static void
@@ -675,7 +675,7 @@ Randh_generate_iii(Randh *self) {
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT range = ma - mi;
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->time += inc;
         if (self->time < 0.0)
@@ -696,7 +696,7 @@ Randh_generate_aii(Randh *self) {
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         range = ma - mi[i];
         self->time += inc;
@@ -718,7 +718,7 @@ Randh_generate_iai(Randh *self) {
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         range = ma[i] - mi;
         self->time += inc;
@@ -740,7 +740,7 @@ Randh_generate_aai(Randh *self) {
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         range = ma[i] - mi[i];
         self->time += inc;
@@ -762,7 +762,7 @@ Randh_generate_iia(Randh *self) {
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
     MYFLT range = ma - mi;
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         self->time += inc;
@@ -783,7 +783,7 @@ Randh_generate_aia(Randh *self) {
     MYFLT *mi = Stream_getData((Stream *)self->min_stream);
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         range = ma - mi[i];
@@ -805,7 +805,7 @@ Randh_generate_iaa(Randh *self) {
     MYFLT mi = PyFloat_AS_DOUBLE(self->min);
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         range = ma[i] - mi;
@@ -827,7 +827,7 @@ Randh_generate_aaa(Randh *self) {
     MYFLT *mi = Stream_getData((Stream *)self->min_stream);
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         range = ma[i] - mi[i];
@@ -858,68 +858,68 @@ Randh_setProcMode(Randh *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10 + self->modebuffer[4] * 100;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Randh_generate_iii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Randh_generate_aii;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = Randh_generate_iai;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Randh_generate_aai;
             break;
-        case 100:    
+        case 100:
             self->proc_func_ptr = Randh_generate_iia;
             break;
-        case 101:    
+        case 101:
             self->proc_func_ptr = Randh_generate_aia;
             break;
-        case 110:    
+        case 110:
             self->proc_func_ptr = Randh_generate_iaa;
             break;
-        case 111:    
+        case 111:
             self->proc_func_ptr = Randh_generate_aaa;
-            break;            
-    } 
+            break;
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Randh_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Randh_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Randh_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Randh_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Randh_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Randh_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Randh_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Randh_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Randh_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 Randh_compute_next_data_frame(Randh *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -929,23 +929,23 @@ Randh_traverse(Randh *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->freq);
     Py_VISIT(self->freq_stream);
-    Py_VISIT(self->min);    
-    Py_VISIT(self->min_stream);    
-    Py_VISIT(self->max);    
-    Py_VISIT(self->max_stream);    
+    Py_VISIT(self->min);
+    Py_VISIT(self->min_stream);
+    Py_VISIT(self->max);
+    Py_VISIT(self->max_stream);
     return 0;
 }
 
-static int 
+static int
 Randh_clear(Randh *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->freq);
     Py_CLEAR(self->freq_stream);
-    Py_CLEAR(self->min);    
-    Py_CLEAR(self->min_stream);    
-    Py_CLEAR(self->max);    
-    Py_CLEAR(self->max_stream);    
+    Py_CLEAR(self->min);
+    Py_CLEAR(self->min_stream);
+    Py_CLEAR(self->max);
+    Py_CLEAR(self->max_stream);
     return 0;
 }
 
@@ -965,7 +965,7 @@ Randh_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *mintmp=NULL, *maxtmp=NULL, *freqtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Randh *self;
     self = (Randh *)type->tp_alloc(type, 0);
-    
+
     self->min = PyFloat_FromDouble(0.);
     self->max = PyFloat_FromDouble(1.);
     self->freq = PyFloat_FromDouble(1.);
@@ -976,38 +976,38 @@ Randh_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
 	self->modebuffer[4] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Randh_compute_next_data_frame);
     self->mode_func_ptr = Randh_setProcMode;
 
     static char *kwlist[] = {"min", "max", "freq", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOOOO", kwlist, &mintmp, &maxtmp, &freqtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (mintmp) {
         PyObject_CallMethod((PyObject *)self, "setMin", "O", mintmp);
     }
-    
+
     if (maxtmp) {
         PyObject_CallMethod((PyObject *)self, "setMax", "O", maxtmp);
     }
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     Server_generateSeed((Server *)self->server, RANDH_ID);
 
     if (self->modebuffer[2] == 0)
@@ -1018,9 +1018,9 @@ Randh_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         ma = PyFloat_AS_DOUBLE(self->max);
     else
         ma = Stream_getData((Stream *)self->max_stream)[0];
-    
+
     self->value = (mi + ma) * 0.5;
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -1028,10 +1028,10 @@ Randh_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Randh_getServer(Randh* self) { GET_SERVER };
 static PyObject * Randh_getStream(Randh* self) { GET_STREAM };
-static PyObject * Randh_setMul(Randh *self, PyObject *arg) { SET_MUL };	
-static PyObject * Randh_setAdd(Randh *self, PyObject *arg) { SET_ADD };	
-static PyObject * Randh_setSub(Randh *self, PyObject *arg) { SET_SUB };	
-static PyObject * Randh_setDiv(Randh *self, PyObject *arg) { SET_DIV };	
+static PyObject * Randh_setMul(Randh *self, PyObject *arg) { SET_MUL };
+static PyObject * Randh_setAdd(Randh *self, PyObject *arg) { SET_ADD };
+static PyObject * Randh_setSub(Randh *self, PyObject *arg) { SET_SUB };
+static PyObject * Randh_setDiv(Randh *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Randh_play(Randh *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Randh_out(Randh *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1050,14 +1050,14 @@ static PyObject *
 Randh_setMin(Randh *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->min);
@@ -1073,25 +1073,25 @@ Randh_setMin(Randh *self, PyObject *arg)
         self->min_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Randh_setMax(Randh *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->max);
@@ -1107,25 +1107,25 @@ Randh_setMax(Randh *self, PyObject *arg)
         self->max_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Randh_setFreq(Randh *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -1141,12 +1141,12 @@ Randh_setFreq(Randh *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Randh_members[] = {
 {"server", T_OBJECT_EX, offsetof(Randh, server), 0, "Pyo server."},
@@ -1270,7 +1270,7 @@ typedef struct {
     MYFLT *choice;
     MYFLT value;
     MYFLT time;
-    int modebuffer[3]; // need at least 2 slots for mul & add 
+    int modebuffer[3]; // need at least 2 slots for mul & add
 } Choice;
 
 static void
@@ -1279,7 +1279,7 @@ Choice_generate_i(Choice *self) {
     MYFLT inc;
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->time += inc;
         if (self->time < 0.0)
@@ -1297,7 +1297,7 @@ Choice_generate_a(Choice *self) {
     int i;
     MYFLT inc;
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         self->time += inc;
@@ -1327,50 +1327,50 @@ Choice_setProcMode(Choice *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Choice_generate_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Choice_generate_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Choice_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Choice_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Choice_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Choice_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Choice_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Choice_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Choice_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Choice_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Choice_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 Choice_compute_next_data_frame(Choice *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1383,7 +1383,7 @@ Choice_traverse(Choice *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Choice_clear(Choice *self)
 {
     pyo_CLEAR
@@ -1408,23 +1408,23 @@ Choice_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *choicetmp=NULL, *freqtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Choice *self;
     self = (Choice *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(1.);
     self->value = 0.0;
     self->time = 1.0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Choice_compute_next_data_frame);
     self->mode_func_ptr = Choice_setProcMode;
 
     static char *kwlist[] = {"choice", "freq", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOO", kwlist, &choicetmp, &freqtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (choicetmp) {
         PyObject_CallMethod((PyObject *)self, "setChoice", "O", choicetmp);
     }
@@ -1432,17 +1432,17 @@ Choice_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     Server_generateSeed((Server *)self->server, CHOICE_ID);
 
     (*self->mode_func_ptr)(self);
@@ -1452,10 +1452,10 @@ Choice_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Choice_getServer(Choice* self) { GET_SERVER };
 static PyObject * Choice_getStream(Choice* self) { GET_STREAM };
-static PyObject * Choice_setMul(Choice *self, PyObject *arg) { SET_MUL };	
-static PyObject * Choice_setAdd(Choice *self, PyObject *arg) { SET_ADD };	
-static PyObject * Choice_setSub(Choice *self, PyObject *arg) { SET_SUB };	
-static PyObject * Choice_setDiv(Choice *self, PyObject *arg) { SET_DIV };	
+static PyObject * Choice_setMul(Choice *self, PyObject *arg) { SET_MUL };
+static PyObject * Choice_setAdd(Choice *self, PyObject *arg) { SET_ADD };
+static PyObject * Choice_setSub(Choice *self, PyObject *arg) { SET_SUB };
+static PyObject * Choice_setDiv(Choice *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Choice_play(Choice *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Choice_out(Choice *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1475,38 +1475,38 @@ Choice_setChoice(Choice *self, PyObject *arg)
 {
     int i;
 	PyObject *tmp;
-	
+
 	if (! PyList_Check(arg)) {
         PyErr_SetString(PyExc_TypeError, "The choice attribute must be a list.");
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     tmp = arg;
     self->chSize = PyList_Size(tmp);
     self->choice = (MYFLT *)realloc(self->choice, self->chSize * sizeof(MYFLT));
     for (i=0; i<self->chSize; i++) {
         self->choice[i] = PyFloat_AS_DOUBLE(PyNumber_Float(PyList_GET_ITEM(tmp, i)));
     }
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Choice_setFreq(Choice *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -1522,12 +1522,12 @@ Choice_setFreq(Choice *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Choice_members[] = {
 {"server", T_OBJECT_EX, offsetof(Choice, server), 0, "Pyo server."},
@@ -1648,7 +1648,7 @@ typedef struct {
     Stream *freq_stream;
     MYFLT value;
     MYFLT time;
-    int modebuffer[4]; // need at least 2 slots for mul & add 
+    int modebuffer[4]; // need at least 2 slots for mul & add
 } RandInt;
 
 static void
@@ -1658,7 +1658,7 @@ RandInt_generate_ii(RandInt *self) {
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->time += inc;
         if (self->time < 0.0)
@@ -1678,7 +1678,7 @@ RandInt_generate_ai(RandInt *self) {
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->time += inc;
         if (self->time < 0.0)
@@ -1697,7 +1697,7 @@ RandInt_generate_ia(RandInt *self) {
     MYFLT inc;
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         self->time += inc;
@@ -1717,7 +1717,7 @@ RandInt_generate_aa(RandInt *self) {
     MYFLT inc;
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         self->time += inc;
@@ -1747,56 +1747,56 @@ RandInt_setProcMode(RandInt *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = RandInt_generate_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = RandInt_generate_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = RandInt_generate_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = RandInt_generate_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = RandInt_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = RandInt_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = RandInt_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = RandInt_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = RandInt_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = RandInt_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = RandInt_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = RandInt_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = RandInt_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 RandInt_compute_next_data_frame(RandInt *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1806,19 +1806,19 @@ RandInt_traverse(RandInt *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->freq);
     Py_VISIT(self->freq_stream);
-    Py_VISIT(self->max);    
-    Py_VISIT(self->max_stream);    
+    Py_VISIT(self->max);
+    Py_VISIT(self->max_stream);
     return 0;
 }
 
-static int 
+static int
 RandInt_clear(RandInt *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->freq);
     Py_CLEAR(self->freq_stream);
-    Py_CLEAR(self->max);    
-    Py_CLEAR(self->max_stream);    
+    Py_CLEAR(self->max);
+    Py_CLEAR(self->max_stream);
     return 0;
 }
 
@@ -1837,7 +1837,7 @@ RandInt_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maxtmp=NULL, *freqtmp=NULL, *multmp=NULL, *addtmp=NULL;
     RandInt *self;
     self = (RandInt *)type->tp_alloc(type, 0);
-    
+
     self->max = PyFloat_FromDouble(100.);
     self->freq = PyFloat_FromDouble(1.);
     self->value = 0.0;
@@ -1846,32 +1846,32 @@ RandInt_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, RandInt_compute_next_data_frame);
     self->mode_func_ptr = RandInt_setProcMode;
 
     static char *kwlist[] = {"max", "freq", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOOO", kwlist, &maxtmp, &freqtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
 
     if (maxtmp) {
         PyObject_CallMethod((PyObject *)self, "setMax", "O", maxtmp);
     }
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     Server_generateSeed((Server *)self->server, RANDINT_ID);
@@ -1883,10 +1883,10 @@ RandInt_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * RandInt_getServer(RandInt* self) { GET_SERVER };
 static PyObject * RandInt_getStream(RandInt* self) { GET_STREAM };
-static PyObject * RandInt_setMul(RandInt *self, PyObject *arg) { SET_MUL };	
-static PyObject * RandInt_setAdd(RandInt *self, PyObject *arg) { SET_ADD };	
-static PyObject * RandInt_setSub(RandInt *self, PyObject *arg) { SET_SUB };	
-static PyObject * RandInt_setDiv(RandInt *self, PyObject *arg) { SET_DIV };	
+static PyObject * RandInt_setMul(RandInt *self, PyObject *arg) { SET_MUL };
+static PyObject * RandInt_setAdd(RandInt *self, PyObject *arg) { SET_ADD };
+static PyObject * RandInt_setSub(RandInt *self, PyObject *arg) { SET_SUB };
+static PyObject * RandInt_setDiv(RandInt *self, PyObject *arg) { SET_DIV };
 
 static PyObject * RandInt_play(RandInt *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * RandInt_out(RandInt *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1905,14 +1905,14 @@ static PyObject *
 RandInt_setMax(RandInt *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->max);
@@ -1928,25 +1928,25 @@ RandInt_setMax(RandInt *self, PyObject *arg)
         self->max_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 RandInt_setFreq(RandInt *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -1962,12 +1962,12 @@ RandInt_setFreq(RandInt *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef RandInt_members[] = {
 {"server", T_OBJECT_EX, offsetof(RandInt, server), 0, "Pyo server."},
@@ -2090,7 +2090,7 @@ typedef struct {
     MYFLT value;
     MYFLT time;
     MYFLT inc;
-    int modebuffer[4]; // need at least 2 slots for mul & add 
+    int modebuffer[4]; // need at least 2 slots for mul & add
 } RandDur;
 
 static void
@@ -2099,7 +2099,7 @@ RandDur_generate_ii(RandDur *self) {
     MYFLT range;
     MYFLT mi = PyFloat_AS_DOUBLE(self->min);
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->time += self->inc;
         if (self->time < 0.0)
@@ -2124,7 +2124,7 @@ RandDur_generate_ai(RandDur *self) {
     MYFLT range, mi;
     MYFLT *min = Stream_getData((Stream *)self->min_stream);
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->time += self->inc;
         if (self->time < 0.0)
@@ -2150,7 +2150,7 @@ RandDur_generate_ia(RandDur *self) {
     MYFLT range;
     MYFLT mi = PyFloat_AS_DOUBLE(self->min);
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->time += self->inc;
         if (self->time < 0.0)
@@ -2175,7 +2175,7 @@ RandDur_generate_aa(RandDur *self) {
     MYFLT range, mi;
     MYFLT *min = Stream_getData((Stream *)self->min_stream);
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->time += self->inc;
         if (self->time < 0.0)
@@ -2211,56 +2211,56 @@ RandDur_setProcMode(RandDur *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = RandDur_generate_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = RandDur_generate_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = RandDur_generate_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = RandDur_generate_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = RandDur_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = RandDur_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = RandDur_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = RandDur_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = RandDur_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = RandDur_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = RandDur_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = RandDur_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = RandDur_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 RandDur_compute_next_data_frame(RandDur *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2268,21 +2268,21 @@ static int
 RandDur_traverse(RandDur *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->min);    
-    Py_VISIT(self->min_stream);    
-    Py_VISIT(self->max);    
-    Py_VISIT(self->max_stream);    
+    Py_VISIT(self->min);
+    Py_VISIT(self->min_stream);
+    Py_VISIT(self->max);
+    Py_VISIT(self->max_stream);
     return 0;
 }
 
-static int 
+static int
 RandDur_clear(RandDur *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->min);    
-    Py_CLEAR(self->min_stream);    
-    Py_CLEAR(self->max);    
-    Py_CLEAR(self->max_stream);    
+    Py_CLEAR(self->min);
+    Py_CLEAR(self->min_stream);
+    Py_CLEAR(self->max);
+    Py_CLEAR(self->max_stream);
     return 0;
 }
 
@@ -2302,7 +2302,7 @@ RandDur_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *mintmp=NULL, *maxtmp=NULL, *multmp=NULL, *addtmp=NULL;
     RandDur *self;
     self = (RandDur *)type->tp_alloc(type, 0);
-    
+
     self->min = PyFloat_FromDouble(0.01);
     self->max = PyFloat_FromDouble(1.);
     self->value = self->inc = 0.0;
@@ -2311,34 +2311,34 @@ RandDur_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, RandDur_compute_next_data_frame);
     self->mode_func_ptr = RandDur_setProcMode;
 
     static char *kwlist[] = {"min", "max", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOOO", kwlist, &mintmp, &maxtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (mintmp) {
         PyObject_CallMethod((PyObject *)self, "setMin", "O", mintmp);
     }
-    
+
     if (maxtmp) {
         PyObject_CallMethod((PyObject *)self, "setMax", "O", maxtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     Server_generateSeed((Server *)self->server, RANDDUR_ID);
 
     if (self->modebuffer[2] == 0)
@@ -2349,7 +2349,7 @@ RandDur_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         ma = PyFloat_AS_DOUBLE(self->max);
     else
         ma = Stream_getData((Stream *)self->max_stream)[0];
-    
+
     self->value = (mi + ma) * 0.5;
     if (self->value == 0.0)
         self->inc = 0.0;
@@ -2363,10 +2363,10 @@ RandDur_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * RandDur_getServer(RandDur* self) { GET_SERVER };
 static PyObject * RandDur_getStream(RandDur* self) { GET_STREAM };
-static PyObject * RandDur_setMul(RandDur *self, PyObject *arg) { SET_MUL };	
-static PyObject * RandDur_setAdd(RandDur *self, PyObject *arg) { SET_ADD };	
-static PyObject * RandDur_setSub(RandDur *self, PyObject *arg) { SET_SUB };	
-static PyObject * RandDur_setDiv(RandDur *self, PyObject *arg) { SET_DIV };	
+static PyObject * RandDur_setMul(RandDur *self, PyObject *arg) { SET_MUL };
+static PyObject * RandDur_setAdd(RandDur *self, PyObject *arg) { SET_ADD };
+static PyObject * RandDur_setSub(RandDur *self, PyObject *arg) { SET_SUB };
+static PyObject * RandDur_setDiv(RandDur *self, PyObject *arg) { SET_DIV };
 
 static PyObject * RandDur_play(RandDur *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * RandDur_out(RandDur *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2385,14 +2385,14 @@ static PyObject *
 RandDur_setMin(RandDur *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->min);
@@ -2408,25 +2408,25 @@ RandDur_setMin(RandDur *self, PyObject *arg)
         self->min_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 RandDur_setMax(RandDur *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->max);
@@ -2442,12 +2442,12 @@ RandDur_setMax(RandDur *self, PyObject *arg)
         self->max_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef RandDur_members[] = {
     {"server", T_OBJECT_EX, offsetof(RandDur, server), 0, "Pyo server."},
@@ -2586,18 +2586,18 @@ typedef struct {
     int loopCountRec;
     int loopLen;
     int loopStop;
-    int modebuffer[5]; // need at least 2 slots for mul & add 
+    int modebuffer[5]; // need at least 2 slots for mul & add
 } Xnoise;
 
 // no parameter
 static MYFLT
 Xnoise_uniform(Xnoise *self) {
-    return RANDOM_UNIFORM;    
+    return RANDOM_UNIFORM;
 }
 
 static MYFLT
 Xnoise_linear_min(Xnoise *self) {
-    MYFLT a = RANDOM_UNIFORM;    
+    MYFLT a = RANDOM_UNIFORM;
     MYFLT b = RANDOM_UNIFORM;
     if (a < b) return a;
     else return b;
@@ -2605,7 +2605,7 @@ Xnoise_linear_min(Xnoise *self) {
 
 static MYFLT
 Xnoise_linear_max(Xnoise *self) {
-    MYFLT a = RANDOM_UNIFORM;    
+    MYFLT a = RANDOM_UNIFORM;
     MYFLT b = RANDOM_UNIFORM;
     if (a > b) return a;
     else return b;
@@ -2613,7 +2613,7 @@ Xnoise_linear_max(Xnoise *self) {
 
 static MYFLT
 Xnoise_triangle(Xnoise *self) {
-    MYFLT a = RANDOM_UNIFORM;    
+    MYFLT a = RANDOM_UNIFORM;
     MYFLT b = RANDOM_UNIFORM;
     return ((a + b) * 0.5);
 }
@@ -2622,7 +2622,7 @@ Xnoise_triangle(Xnoise *self) {
 static MYFLT
 Xnoise_expon_min(Xnoise *self) {
     if (self->xx1 <= 0.0) self->xx1 = 0.00001;
-    MYFLT val = -MYLOG(RANDOM_UNIFORM) / self->xx1;    
+    MYFLT val = -MYLOG(RANDOM_UNIFORM) / self->xx1;
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -2631,7 +2631,7 @@ Xnoise_expon_min(Xnoise *self) {
 static MYFLT
 Xnoise_expon_max(Xnoise *self) {
     if (self->xx1 <= 0.0) self->xx1 = 0.00001;
-    MYFLT val = 1.0 - (-MYLOG(RANDOM_UNIFORM) / self->xx1);    
+    MYFLT val = 1.0 - (-MYLOG(RANDOM_UNIFORM) / self->xx1);
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -2643,7 +2643,7 @@ Xnoise_biexpon(Xnoise *self) {
     MYFLT polar, val;
     if (self->xx1 <= 0.0) self->xx1 = 0.00001;
     MYFLT sum = RANDOM_UNIFORM * 2.0;
-    
+
     if (sum > 1.0) {
         polar = -1;
         sum = 2.0 - sum;
@@ -2665,14 +2665,14 @@ Xnoise_cauchy(Xnoise *self) {
         rnd = RANDOM_UNIFORM;
     }
     while (rnd == 0.5);
-    
+
     if (rand() < (RAND_MAX / 2))
         dir = -1;
     else
         dir = 1;
-    
+
     val = 0.5 * (MYTAN(rnd) * self->xx1 * dir) + 0.5;
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -2683,10 +2683,10 @@ static MYFLT
 Xnoise_weibull(Xnoise *self) {
     MYFLT rnd, val;
     if (self->xx2 <= 0.0) self->xx2 = 0.00001;
-    
+
     rnd = 1.0 / (1.0 - RANDOM_UNIFORM);
     val = self->xx1 * MYPOW(MYLOG(rnd), (1.0 / self->xx2));
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -2696,10 +2696,10 @@ Xnoise_weibull(Xnoise *self) {
 static MYFLT
 Xnoise_gaussian(Xnoise *self) {
     MYFLT rnd, val;
-    
+
     rnd = (RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM);
     val = (self->xx2 * (rnd - 3.0) * 0.33 + self->xx1);
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -2728,7 +2728,7 @@ Xnoise_poisson(Xnoise *self) {
         }
     }
     val = self->poisson_buffer[rand() % self->poisson_tab] / 12.0 * self->xx2;
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -2738,22 +2738,22 @@ Xnoise_poisson(Xnoise *self) {
 static MYFLT
 Xnoise_walker(Xnoise *self) {
     int modulo, dir;
-    
+
     if (self->xx2 < 0.002) self->xx2 = 0.002;
-    
+
     modulo = (int)(self->xx2 * 1000.0);
     dir = rand() % 2;
-    
+
     if (dir == 0)
         self->walkerValue = self->walkerValue + (((rand() % modulo) - (modulo / 2)) * 0.001);
     else
         self->walkerValue = self->walkerValue - (((rand() % modulo) - (modulo / 2)) * 0.001);
-        
+
     if (self->walkerValue > self->xx1)
         self->walkerValue = self->xx1;
     if (self->walkerValue < 0.0)
         self->walkerValue = 0.0;
-    
+
     return self->walkerValue;
 }
 
@@ -2763,26 +2763,26 @@ Xnoise_loopseg(Xnoise *self) {
     int modulo, dir;
 
     if (self->loopChoice == 0) {
-        
+
         self->loopCountPlay = self->loopTime = 0;
 
         if (self->xx2 < 0.002) self->xx2 = 0.002;
 
         modulo = (int)(self->xx2 * 1000.0);
         dir = rand() % 2;
-    
+
         if (dir == 0)
             self->walkerValue = self->walkerValue + (((rand() % modulo) - (modulo / 2)) * 0.001);
         else
             self->walkerValue = self->walkerValue - (((rand() % modulo) - (modulo / 2)) * 0.001);
-    
+
         if (self->walkerValue > self->xx1)
             self->walkerValue = self->xx1;
         if (self->walkerValue < 0.0)
             self->walkerValue = 0.0;
-        
+
         self->loop_buffer[self->loopCountRec++] = self->walkerValue;
-        
+
         if (self->loopCountRec < self->loopLen)
             self->loopChoice = 0;
         else {
@@ -2792,22 +2792,22 @@ Xnoise_loopseg(Xnoise *self) {
     }
     else {
         self->loopCountRec = 0;
-        
+
         self->walkerValue = self->loop_buffer[self->loopCountPlay++];
-        
+
         if (self->loopCountPlay < self->loopLen)
             self->loopChoice = 1;
         else {
             self->loopCountPlay = 0;
             self->loopTime++;
         }
-        
+
         if (self->loopTime == self->loopStop) {
             self->loopChoice = 0;
             self->loopLen = (rand() % 10) + 3;
         }
     }
-    
+
     return self->walkerValue;
 }
 
@@ -2840,7 +2840,7 @@ Xnoise_generate_aii(Xnoise *self) {
     self->xx2 = PyFloat_AS_DOUBLE(self->x2);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->time += inc;
         if (self->time < 0.0)
@@ -2862,7 +2862,7 @@ Xnoise_generate_iai(Xnoise *self) {
     MYFLT *x2 = Stream_getData((Stream *)self->x2_stream);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->time += inc;
         if (self->time < 0.0)
@@ -2884,7 +2884,7 @@ Xnoise_generate_aai(Xnoise *self) {
     MYFLT *x2 = Stream_getData((Stream *)self->x2_stream);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->time += inc;
         if (self->time < 0.0)
@@ -2906,7 +2906,7 @@ Xnoise_generate_iia(Xnoise *self) {
     self->xx1 = PyFloat_AS_DOUBLE(self->x1);
     self->xx2 = PyFloat_AS_DOUBLE(self->x2);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         self->time += inc;
@@ -2927,7 +2927,7 @@ Xnoise_generate_aia(Xnoise *self) {
     MYFLT *x1 = Stream_getData((Stream *)self->x1_stream);
     self->xx2 = PyFloat_AS_DOUBLE(self->x2);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         self->time += inc;
@@ -2949,7 +2949,7 @@ Xnoise_generate_iaa(Xnoise *self) {
     self->xx1 = PyFloat_AS_DOUBLE(self->x1);
     MYFLT *x2 = Stream_getData((Stream *)self->x2_stream);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         self->time += inc;
@@ -2971,7 +2971,7 @@ Xnoise_generate_aaa(Xnoise *self) {
     MYFLT *x1 = Stream_getData((Stream *)self->x1_stream);
     MYFLT *x2 = Stream_getData((Stream *)self->x2_stream);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         self->time += inc;
@@ -3001,7 +3001,7 @@ static void
 Xnoise_setRandomType(Xnoise *self)
 {
 
-    switch (self->type) {            
+    switch (self->type) {
         case 0:
             self->type_func_ptr = Xnoise_uniform;
             break;
@@ -3041,7 +3041,7 @@ Xnoise_setRandomType(Xnoise *self)
         case 12:
             self->type_func_ptr = Xnoise_loopseg;
             break;
-    }        
+    }
 }
 
 static void
@@ -3050,68 +3050,68 @@ Xnoise_setProcMode(Xnoise *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10 + self->modebuffer[4] * 100;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Xnoise_generate_iii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Xnoise_generate_aii;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = Xnoise_generate_iai;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Xnoise_generate_aai;
             break;
-        case 100:    
+        case 100:
             self->proc_func_ptr = Xnoise_generate_iia;
             break;
-        case 101:    
+        case 101:
             self->proc_func_ptr = Xnoise_generate_aia;
             break;
-        case 110:    
+        case 110:
             self->proc_func_ptr = Xnoise_generate_iaa;
             break;
-        case 111:    
+        case 111:
             self->proc_func_ptr = Xnoise_generate_aaa;
-            break;            
-    } 
+            break;
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Xnoise_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Xnoise_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Xnoise_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Xnoise_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Xnoise_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Xnoise_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Xnoise_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Xnoise_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Xnoise_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 Xnoise_compute_next_data_frame(Xnoise *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3121,23 +3121,23 @@ Xnoise_traverse(Xnoise *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->freq);
     Py_VISIT(self->freq_stream);
-    Py_VISIT(self->x1);    
-    Py_VISIT(self->x1_stream);    
-    Py_VISIT(self->x2);    
-    Py_VISIT(self->x2_stream);    
+    Py_VISIT(self->x1);
+    Py_VISIT(self->x1_stream);
+    Py_VISIT(self->x2);
+    Py_VISIT(self->x2_stream);
     return 0;
 }
 
-static int 
+static int
 Xnoise_clear(Xnoise *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->freq);
     Py_CLEAR(self->freq_stream);
-    Py_CLEAR(self->x1);    
-    Py_CLEAR(self->x1_stream);    
-    Py_CLEAR(self->x2);    
-    Py_CLEAR(self->x2_stream);    
+    Py_CLEAR(self->x1);
+    Py_CLEAR(self->x1_stream);
+    Py_CLEAR(self->x2);
+    Py_CLEAR(self->x2_stream);
     return 0;
 }
 
@@ -3156,7 +3156,7 @@ Xnoise_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *freqtmp=NULL, *x1tmp=NULL, *x2tmp=NULL, *multmp=NULL, *addtmp=NULL;
     Xnoise *self;
     self = (Xnoise *)type->tp_alloc(type, 0);
-    
+
     self->x1 = PyFloat_FromDouble(0.5);
     self->x2 = PyFloat_FromDouble(0.5);
     self->freq = PyFloat_FromDouble(1.);
@@ -3168,9 +3168,9 @@ Xnoise_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
 	self->modebuffer[4] = 0;
-    
+
     INIT_OBJECT_COMMON
-    
+
     Server_generateSeed((Server *)self->server, XNOISE_ID);
 
     self->poisson_tab = 0;
@@ -3181,41 +3181,41 @@ Xnoise_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     for (i=0; i<15; i++) {
         self->loop_buffer[i] = 0.0;
     }
-    self->loopChoice = self->loopCountPlay = self->loopTime = self->loopCountRec = self->loopStop = 0;    
+    self->loopChoice = self->loopCountPlay = self->loopTime = self->loopCountRec = self->loopStop = 0;
     self->loopLen = (rand() % 10) + 3;
-    
+
     Stream_setFunctionPtr(self->stream, Xnoise_compute_next_data_frame);
     self->mode_func_ptr = Xnoise_setProcMode;
 
     static char *kwlist[] = {"type", "freq", "x1", "x2", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|iOOOOO", kwlist, &self->type, &freqtmp, &x1tmp, &x2tmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (x1tmp) {
         PyObject_CallMethod((PyObject *)self, "setX1", "O", x1tmp);
     }
-    
+
     if (x2tmp) {
         PyObject_CallMethod((PyObject *)self, "setX2", "O", x2tmp);
     }
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     Xnoise_setRandomType(self);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -3223,10 +3223,10 @@ Xnoise_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Xnoise_getServer(Xnoise* self) { GET_SERVER };
 static PyObject * Xnoise_getStream(Xnoise* self) { GET_STREAM };
-static PyObject * Xnoise_setMul(Xnoise *self, PyObject *arg) { SET_MUL };	
-static PyObject * Xnoise_setAdd(Xnoise *self, PyObject *arg) { SET_ADD };	
-static PyObject * Xnoise_setSub(Xnoise *self, PyObject *arg) { SET_SUB };	
-static PyObject * Xnoise_setDiv(Xnoise *self, PyObject *arg) { SET_DIV };	
+static PyObject * Xnoise_setMul(Xnoise *self, PyObject *arg) { SET_MUL };
+static PyObject * Xnoise_setAdd(Xnoise *self, PyObject *arg) { SET_ADD };
+static PyObject * Xnoise_setSub(Xnoise *self, PyObject *arg) { SET_SUB };
+static PyObject * Xnoise_setDiv(Xnoise *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Xnoise_play(Xnoise *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Xnoise_out(Xnoise *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3243,14 +3243,14 @@ static PyObject * Xnoise_inplace_div(Xnoise *self, PyObject *arg) { INPLACE_DIV
 
 static PyObject *
 Xnoise_setType(Xnoise *self, PyObject *arg)
-{	
+{
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyInt_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->type = PyInt_AsLong(arg);
         Xnoise_setRandomType(self);
@@ -3258,20 +3258,20 @@ Xnoise_setType(Xnoise *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Xnoise_setX1(Xnoise *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->x1);
@@ -3287,25 +3287,25 @@ Xnoise_setX1(Xnoise *self, PyObject *arg)
         self->x1_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Xnoise_setX2(Xnoise *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->x2);
@@ -3321,25 +3321,25 @@ Xnoise_setX2(Xnoise *self, PyObject *arg)
         self->x2_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Xnoise_setFreq(Xnoise *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -3355,12 +3355,12 @@ Xnoise_setFreq(Xnoise *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Xnoise_members[] = {
     {"server", T_OBJECT_EX, offsetof(Xnoise, server), 0, "Pyo server."},
@@ -3506,7 +3506,7 @@ typedef struct {
     int loopCountRec;
     int loopLen;
     int loopStop;
-    int modebuffer[5]; // need at least 2 slots for mul & add 
+    int modebuffer[5]; // need at least 2 slots for mul & add
 } XnoiseMidi;
 
 static MYFLT
@@ -3515,12 +3515,12 @@ XnoiseMidi_convert(XnoiseMidi *self) {
     MYFLT val;
 
     midival = (int)((self->value * (self->range_max-self->range_min)) + self->range_min);
-    
+
     if (midival < 0)
         midival = 0;
     else if (midival > 127)
         midival = 127;
-    
+
     if (self->scale == 0)
         val = (MYFLT)midival;
     else if (self->scale == 1)
@@ -3529,19 +3529,19 @@ XnoiseMidi_convert(XnoiseMidi *self) {
         val = MYPOW(1.0594630943593, midival - self->centralkey);
     else
         val = midival;
-    
+
     return val;
 }
 
 // no parameter
 static MYFLT
 XnoiseMidi_uniform(XnoiseMidi *self) {
-    return RANDOM_UNIFORM;    
+    return RANDOM_UNIFORM;
 }
 
 static MYFLT
 XnoiseMidi_linear_min(XnoiseMidi *self) {
-    MYFLT a = RANDOM_UNIFORM;    
+    MYFLT a = RANDOM_UNIFORM;
     MYFLT b = RANDOM_UNIFORM;
     if (a < b) return a;
     else return b;
@@ -3549,7 +3549,7 @@ XnoiseMidi_linear_min(XnoiseMidi *self) {
 
 static MYFLT
 XnoiseMidi_linear_max(XnoiseMidi *self) {
-    MYFLT a = RANDOM_UNIFORM;    
+    MYFLT a = RANDOM_UNIFORM;
     MYFLT b = RANDOM_UNIFORM;
     if (a > b) return a;
     else return b;
@@ -3557,7 +3557,7 @@ XnoiseMidi_linear_max(XnoiseMidi *self) {
 
 static MYFLT
 XnoiseMidi_triangle(XnoiseMidi *self) {
-    MYFLT a = RANDOM_UNIFORM;    
+    MYFLT a = RANDOM_UNIFORM;
     MYFLT b = RANDOM_UNIFORM;
     return ((a + b) * 0.5);
 }
@@ -3566,7 +3566,7 @@ XnoiseMidi_triangle(XnoiseMidi *self) {
 static MYFLT
 XnoiseMidi_expon_min(XnoiseMidi *self) {
     if (self->xx1 <= 0.0) self->xx1 = 0.00001;
-    MYFLT val = -MYLOG(RANDOM_UNIFORM) / self->xx1;    
+    MYFLT val = -MYLOG(RANDOM_UNIFORM) / self->xx1;
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -3575,7 +3575,7 @@ XnoiseMidi_expon_min(XnoiseMidi *self) {
 static MYFLT
 XnoiseMidi_expon_max(XnoiseMidi *self) {
     if (self->xx1 <= 0.0) self->xx1 = 0.00001;
-    MYFLT val = 1.0 - (-MYLOG(RANDOM_UNIFORM) / self->xx1);    
+    MYFLT val = 1.0 - (-MYLOG(RANDOM_UNIFORM) / self->xx1);
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -3587,16 +3587,16 @@ XnoiseMidi_biexpon(XnoiseMidi *self) {
     MYFLT polar, val;
     if (self->xx1 <= 0.0) self->xx1 = 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->xx1) + 0.5;
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -3609,14 +3609,14 @@ XnoiseMidi_cauchy(XnoiseMidi *self) {
         rnd = RANDOM_UNIFORM;
     }
     while (rnd == 0.5);
-    
+
     if (rand() < (RAND_MAX / 2))
         dir = -1;
     else
         dir = 1;
-    
+
     val = 0.5 * (MYTAN(rnd) * self->xx1 * dir) + 0.5;
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -3627,10 +3627,10 @@ static MYFLT
 XnoiseMidi_weibull(XnoiseMidi *self) {
     MYFLT rnd, val;
     if (self->xx2 <= 0.0) self->xx2 = 0.00001;
-    
+
     rnd = 1.0 / (1.0 - RANDOM_UNIFORM);
     val = self->xx1 * MYPOW(MYLOG(rnd), (1.0 / self->xx2));
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -3640,10 +3640,10 @@ XnoiseMidi_weibull(XnoiseMidi *self) {
 static MYFLT
 XnoiseMidi_gaussian(XnoiseMidi *self) {
     MYFLT rnd, val;
-    
+
     rnd = (RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM);
     val = (self->xx2 * (rnd - 3.0) * 0.33 + self->xx1);
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -3657,7 +3657,7 @@ XnoiseMidi_poisson(XnoiseMidi *self) {
     MYFLT val;
     if (self->xx1 < 0.1) self->xx1 = 0.1;
     if (self->xx2 < 0.1) self->xx2 = 0.1;
-    
+
     if (self->xx1 != self->lastPoissonX1) {
         self->lastPoissonX1 = self->xx1;
         self->poisson_tab = 0;
@@ -3672,7 +3672,7 @@ XnoiseMidi_poisson(XnoiseMidi *self) {
         }
     }
     val = self->poisson_buffer[rand() % self->poisson_tab] / 12.0 * self->xx2;
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -3682,22 +3682,22 @@ XnoiseMidi_poisson(XnoiseMidi *self) {
 static MYFLT
 XnoiseMidi_walker(XnoiseMidi *self) {
     int modulo, dir;
-    
+
     if (self->xx2 < 0.002) self->xx2 = 0.002;
-    
+
     modulo = (int)(self->xx2 * 1000.0);
     dir = rand() % 2;
-    
+
     if (dir == 0)
         self->walkerValue = self->walkerValue + (((rand() % modulo) - (modulo / 2)) * 0.001);
     else
         self->walkerValue = self->walkerValue - (((rand() % modulo) - (modulo / 2)) * 0.001);
-    
+
     if (self->walkerValue > self->xx1)
         self->walkerValue = self->xx1;
     if (self->walkerValue < 0.0)
         self->walkerValue = 0.0;
-    
+
     return self->walkerValue;
 }
 
@@ -3705,28 +3705,28 @@ XnoiseMidi_walker(XnoiseMidi *self) {
 static MYFLT
 XnoiseMidi_loopseg(XnoiseMidi *self) {
     int modulo, dir;
-    
+
     if (self->loopChoice == 0) {
-        
+
         self->loopCountPlay = self->loopTime = 0;
-        
+
         if (self->xx2 < 0.002) self->xx2 = 0.002;
-        
+
         modulo = (int)(self->xx2 * 1000.0);
         dir = rand() % 2;
-        
+
         if (dir == 0)
             self->walkerValue = self->walkerValue + (((rand() % modulo) - (modulo / 2)) * 0.001);
         else
             self->walkerValue = self->walkerValue - (((rand() % modulo) - (modulo / 2)) * 0.001);
-        
+
         if (self->walkerValue > self->xx1)
             self->walkerValue = self->xx1;
         if (self->walkerValue < 0.0)
             self->walkerValue = 0.0;
-        
+
         self->loop_buffer[self->loopCountRec++] = self->walkerValue;
-        
+
         if (self->loopCountRec < self->loopLen)
             self->loopChoice = 0;
         else {
@@ -3736,22 +3736,22 @@ XnoiseMidi_loopseg(XnoiseMidi *self) {
     }
     else {
         self->loopCountRec = 0;
-        
+
         self->walkerValue = self->loop_buffer[self->loopCountPlay++];
-        
+
         if (self->loopCountPlay < self->loopLen)
             self->loopChoice = 1;
         else {
             self->loopCountPlay = 0;
             self->loopTime++;
         }
-        
+
         if (self->loopTime == self->loopStop) {
             self->loopChoice = 0;
             self->loopLen = (rand() % 10) + 3;
         }
     }
-    
+
     return self->walkerValue;
 }
 
@@ -3763,7 +3763,7 @@ XnoiseMidi_generate_iii(XnoiseMidi *self) {
     self->xx2 = PyFloat_AS_DOUBLE(self->x2);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->time += inc;
         if (self->time < 0.0)
@@ -3785,7 +3785,7 @@ XnoiseMidi_generate_aii(XnoiseMidi *self) {
     self->xx2 = PyFloat_AS_DOUBLE(self->x2);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->time += inc;
         if (self->time < 0.0)
@@ -3808,7 +3808,7 @@ XnoiseMidi_generate_iai(XnoiseMidi *self) {
     MYFLT *x2 = Stream_getData((Stream *)self->x2_stream);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->time += inc;
         if (self->time < 0.0)
@@ -3831,7 +3831,7 @@ XnoiseMidi_generate_aai(XnoiseMidi *self) {
     MYFLT *x2 = Stream_getData((Stream *)self->x2_stream);
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->time += inc;
         if (self->time < 0.0)
@@ -3854,7 +3854,7 @@ XnoiseMidi_generate_iia(XnoiseMidi *self) {
     self->xx1 = PyFloat_AS_DOUBLE(self->x1);
     self->xx2 = PyFloat_AS_DOUBLE(self->x2);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         self->time += inc;
@@ -3876,7 +3876,7 @@ XnoiseMidi_generate_aia(XnoiseMidi *self) {
     MYFLT *x1 = Stream_getData((Stream *)self->x1_stream);
     self->xx2 = PyFloat_AS_DOUBLE(self->x2);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         self->time += inc;
@@ -3899,7 +3899,7 @@ XnoiseMidi_generate_iaa(XnoiseMidi *self) {
     self->xx1 = PyFloat_AS_DOUBLE(self->x1);
     MYFLT *x2 = Stream_getData((Stream *)self->x2_stream);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         self->time += inc;
@@ -3922,7 +3922,7 @@ XnoiseMidi_generate_aaa(XnoiseMidi *self) {
     MYFLT *x1 = Stream_getData((Stream *)self->x1_stream);
     MYFLT *x2 = Stream_getData((Stream *)self->x2_stream);
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inc = fr[i] / self->sr;
         self->time += inc;
@@ -3952,8 +3952,8 @@ static void XnoiseMidi_postprocessing_revareva(XnoiseMidi *self) { POST_PROCESSI
 static void
 XnoiseMidi_setRandomType(XnoiseMidi *self)
 {
-    
-    switch (self->type) {            
+
+    switch (self->type) {
         case 0:
             self->type_func_ptr = XnoiseMidi_uniform;
             break;
@@ -3993,7 +3993,7 @@ XnoiseMidi_setRandomType(XnoiseMidi *self)
         case 12:
             self->type_func_ptr = XnoiseMidi_loopseg;
             break;
-    }        
+    }
 }
 
 static void
@@ -4002,68 +4002,68 @@ XnoiseMidi_setProcMode(XnoiseMidi *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10 + self->modebuffer[4] * 100;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = XnoiseMidi_generate_iii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = XnoiseMidi_generate_aii;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = XnoiseMidi_generate_iai;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = XnoiseMidi_generate_aai;
             break;
-        case 100:    
+        case 100:
             self->proc_func_ptr = XnoiseMidi_generate_iia;
             break;
-        case 101:    
+        case 101:
             self->proc_func_ptr = XnoiseMidi_generate_aia;
             break;
-        case 110:    
+        case 110:
             self->proc_func_ptr = XnoiseMidi_generate_iaa;
             break;
-        case 111:    
+        case 111:
             self->proc_func_ptr = XnoiseMidi_generate_aaa;
-            break;            
-    } 
+            break;
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = XnoiseMidi_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = XnoiseMidi_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = XnoiseMidi_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = XnoiseMidi_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = XnoiseMidi_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = XnoiseMidi_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = XnoiseMidi_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = XnoiseMidi_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = XnoiseMidi_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 XnoiseMidi_compute_next_data_frame(XnoiseMidi *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -4073,23 +4073,23 @@ XnoiseMidi_traverse(XnoiseMidi *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->freq);
     Py_VISIT(self->freq_stream);
-    Py_VISIT(self->x1);    
-    Py_VISIT(self->x1_stream);    
-    Py_VISIT(self->x2);    
-    Py_VISIT(self->x2_stream);    
+    Py_VISIT(self->x1);
+    Py_VISIT(self->x1_stream);
+    Py_VISIT(self->x2);
+    Py_VISIT(self->x2_stream);
     return 0;
 }
 
-static int 
+static int
 XnoiseMidi_clear(XnoiseMidi *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->freq);
     Py_CLEAR(self->freq_stream);
-    Py_CLEAR(self->x1);    
-    Py_CLEAR(self->x1_stream);    
-    Py_CLEAR(self->x2);    
-    Py_CLEAR(self->x2_stream);    
+    Py_CLEAR(self->x1);
+    Py_CLEAR(self->x1_stream);
+    Py_CLEAR(self->x2);
+    Py_CLEAR(self->x2_stream);
     return 0;
 }
 
@@ -4108,7 +4108,7 @@ XnoiseMidi_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *freqtmp=NULL, *x1tmp=NULL, *x2tmp=NULL, *rangetmp=NULL, *multmp=NULL, *addtmp=NULL;
     XnoiseMidi *self;
     self = (XnoiseMidi *)type->tp_alloc(type, 0);
-        
+
     self->x1 = PyFloat_FromDouble(0.5);
     self->x2 = PyFloat_FromDouble(0.5);
     self->freq = PyFloat_FromDouble(1.);
@@ -4124,7 +4124,7 @@ XnoiseMidi_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
 	self->modebuffer[4] = 0;
-    
+
     INIT_OBJECT_COMMON
 
     Server_generateSeed((Server *)self->server, XNOISEMIDI_ID);
@@ -4137,25 +4137,25 @@ XnoiseMidi_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     for (i=0; i<15; i++) {
         self->loop_buffer[i] = 0.0;
     }
-    self->loopChoice = self->loopCountPlay = self->loopTime = self->loopCountRec = self->loopStop = 0;    
+    self->loopChoice = self->loopCountPlay = self->loopTime = self->loopCountRec = self->loopStop = 0;
     self->loopLen = (rand() % 10) + 3;
-    
+
     Stream_setFunctionPtr(self->stream, XnoiseMidi_compute_next_data_frame);
     self->mode_func_ptr = XnoiseMidi_setProcMode;
 
     static char *kwlist[] = {"type", "freq", "x1", "x2", "scale", "range", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|iOOOiOOO", kwlist, &self->type, &freqtmp, &x1tmp, &x2tmp, &self->scale, &rangetmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (x1tmp) {
         PyObject_CallMethod((PyObject *)self, "setX1", "O", x1tmp);
     }
-    
+
     if (x2tmp) {
         PyObject_CallMethod((PyObject *)self, "setX2", "O", x2tmp);
     }
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
@@ -4163,19 +4163,19 @@ XnoiseMidi_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (rangetmp) {
         PyObject_CallMethod((PyObject *)self, "setRange", "O", rangetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     XnoiseMidi_setRandomType(self);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -4183,10 +4183,10 @@ XnoiseMidi_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * XnoiseMidi_getServer(XnoiseMidi* self) { GET_SERVER };
 static PyObject * XnoiseMidi_getStream(XnoiseMidi* self) { GET_STREAM };
-static PyObject * XnoiseMidi_setMul(XnoiseMidi *self, PyObject *arg) { SET_MUL };	
-static PyObject * XnoiseMidi_setAdd(XnoiseMidi *self, PyObject *arg) { SET_ADD };	
-static PyObject * XnoiseMidi_setSub(XnoiseMidi *self, PyObject *arg) { SET_SUB };	
-static PyObject * XnoiseMidi_setDiv(XnoiseMidi *self, PyObject *arg) { SET_DIV };	
+static PyObject * XnoiseMidi_setMul(XnoiseMidi *self, PyObject *arg) { SET_MUL };
+static PyObject * XnoiseMidi_setAdd(XnoiseMidi *self, PyObject *arg) { SET_ADD };
+static PyObject * XnoiseMidi_setSub(XnoiseMidi *self, PyObject *arg) { SET_SUB };
+static PyObject * XnoiseMidi_setDiv(XnoiseMidi *self, PyObject *arg) { SET_DIV };
 
 static PyObject * XnoiseMidi_play(XnoiseMidi *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * XnoiseMidi_out(XnoiseMidi *self, PyObject *args, PyObject *kwds) { OUT };
@@ -4203,34 +4203,34 @@ static PyObject * XnoiseMidi_inplace_div(XnoiseMidi *self, PyObject *arg) { INPL
 
 static PyObject *
 XnoiseMidi_setType(XnoiseMidi *self, PyObject *arg)
-{	
+{
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyInt_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->type = PyInt_AsLong(arg);
         XnoiseMidi_setRandomType(self);
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 XnoiseMidi_setScale(XnoiseMidi *self, PyObject *arg)
-{	
+{
     int tmp;
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyInt_Check(arg);
-	
+
 	if (isNumber == 1) {
 		tmp = PyInt_AsLong(arg);
         if (tmp >= 0 && tmp <= 2)
@@ -4241,11 +4241,11 @@ XnoiseMidi_setScale(XnoiseMidi *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 XnoiseMidi_setRange(XnoiseMidi *self, PyObject *args)
-{	
+{
 	if (args == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
@@ -4261,20 +4261,20 @@ XnoiseMidi_setRange(XnoiseMidi *self, PyObject *args)
 
     Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 XnoiseMidi_setX1(XnoiseMidi *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->x1);
@@ -4290,25 +4290,25 @@ XnoiseMidi_setX1(XnoiseMidi *self, PyObject *arg)
         self->x1_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 XnoiseMidi_setX2(XnoiseMidi *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->x2);
@@ -4324,25 +4324,25 @@ XnoiseMidi_setX2(XnoiseMidi *self, PyObject *arg)
         self->x2_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 XnoiseMidi_setFreq(XnoiseMidi *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -4358,12 +4358,12 @@ XnoiseMidi_setFreq(XnoiseMidi *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef XnoiseMidi_members[] = {
     {"server", T_OBJECT_EX, offsetof(XnoiseMidi, server), 0, "Pyo server."},
@@ -4510,18 +4510,18 @@ typedef struct {
     int loopCountRec;
     int loopLen;
     int loopStop;
-    int modebuffer[6]; // need at least 2 slots for mul & add 
+    int modebuffer[6]; // need at least 2 slots for mul & add
 } XnoiseDur;
 
 // no parameter
 static MYFLT
 XnoiseDur_uniform(XnoiseDur *self) {
-    return RANDOM_UNIFORM;    
+    return RANDOM_UNIFORM;
 }
 
 static MYFLT
 XnoiseDur_linear_min(XnoiseDur *self) {
-    MYFLT a = RANDOM_UNIFORM;    
+    MYFLT a = RANDOM_UNIFORM;
     MYFLT b = RANDOM_UNIFORM;
     if (a < b) return a;
     else return b;
@@ -4529,7 +4529,7 @@ XnoiseDur_linear_min(XnoiseDur *self) {
 
 static MYFLT
 XnoiseDur_linear_max(XnoiseDur *self) {
-    MYFLT a = RANDOM_UNIFORM;    
+    MYFLT a = RANDOM_UNIFORM;
     MYFLT b = RANDOM_UNIFORM;
     if (a > b) return a;
     else return b;
@@ -4537,7 +4537,7 @@ XnoiseDur_linear_max(XnoiseDur *self) {
 
 static MYFLT
 XnoiseDur_triangle(XnoiseDur *self) {
-    MYFLT a = RANDOM_UNIFORM;    
+    MYFLT a = RANDOM_UNIFORM;
     MYFLT b = RANDOM_UNIFORM;
     return ((a + b) * 0.5);
 }
@@ -4546,7 +4546,7 @@ XnoiseDur_triangle(XnoiseDur *self) {
 static MYFLT
 XnoiseDur_expon_min(XnoiseDur *self) {
     if (self->xx1 <= 0.0) self->xx1 = 0.00001;
-    MYFLT val = -MYLOG(RANDOM_UNIFORM) / self->xx1;    
+    MYFLT val = -MYLOG(RANDOM_UNIFORM) / self->xx1;
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -4555,7 +4555,7 @@ XnoiseDur_expon_min(XnoiseDur *self) {
 static MYFLT
 XnoiseDur_expon_max(XnoiseDur *self) {
     if (self->xx1 <= 0.0) self->xx1 = 0.00001;
-    MYFLT val = 1.0 - (-MYLOG(RANDOM_UNIFORM) / self->xx1);    
+    MYFLT val = 1.0 - (-MYLOG(RANDOM_UNIFORM) / self->xx1);
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -4567,16 +4567,16 @@ XnoiseDur_biexpon(XnoiseDur *self) {
     MYFLT polar, val;
     if (self->xx1 <= 0.0) self->xx1 = 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->xx1) + 0.5;
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -4589,14 +4589,14 @@ XnoiseDur_cauchy(XnoiseDur *self) {
         rnd = RANDOM_UNIFORM;
     }
     while (rnd == 0.5);
-    
+
     if (rand() < (RAND_MAX / 2))
         dir = -1;
     else
         dir = 1;
-    
+
     val = 0.5 * (MYTAN(rnd) * self->xx1 * dir) + 0.5;
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -4607,10 +4607,10 @@ static MYFLT
 XnoiseDur_weibull(XnoiseDur *self) {
     MYFLT rnd, val;
     if (self->xx2 <= 0.0) self->xx2 = 0.00001;
-    
+
     rnd = 1.0 / (1.0 - RANDOM_UNIFORM);
     val = self->xx1 * MYPOW(MYLOG(rnd), (1.0 / self->xx2));
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -4620,10 +4620,10 @@ XnoiseDur_weibull(XnoiseDur *self) {
 static MYFLT
 XnoiseDur_gaussian(XnoiseDur *self) {
     MYFLT rnd, val;
-    
+
     rnd = (RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM);
     val = (self->xx2 * (rnd - 3.0) * 0.33 + self->xx1);
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -4637,7 +4637,7 @@ XnoiseDur_poisson(XnoiseDur *self) {
     MYFLT val;
     if (self->xx1 < 0.1) self->xx1 = 0.1;
     if (self->xx2 < 0.1) self->xx2 = 0.1;
-    
+
     if (self->xx1 != self->lastPoissonX1) {
         self->lastPoissonX1 = self->xx1;
         self->poisson_tab = 0;
@@ -4652,7 +4652,7 @@ XnoiseDur_poisson(XnoiseDur *self) {
         }
     }
     val = self->poisson_buffer[rand() % self->poisson_tab] / 12.0 * self->xx2;
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -4662,22 +4662,22 @@ XnoiseDur_poisson(XnoiseDur *self) {
 static MYFLT
 XnoiseDur_walker(XnoiseDur *self) {
     int modulo, dir;
-    
+
     if (self->xx2 < 0.002) self->xx2 = 0.002;
-    
+
     modulo = (int)(self->xx2 * 1000.0);
     dir = rand() % 2;
-    
+
     if (dir == 0)
         self->walkerValue = self->walkerValue + (((rand() % modulo) - (modulo / 2)) * 0.001);
     else
         self->walkerValue = self->walkerValue - (((rand() % modulo) - (modulo / 2)) * 0.001);
-    
+
     if (self->walkerValue > self->xx1)
         self->walkerValue = self->xx1;
     if (self->walkerValue < 0.0)
         self->walkerValue = 0.0;
-    
+
     return self->walkerValue;
 }
 
@@ -4685,28 +4685,28 @@ XnoiseDur_walker(XnoiseDur *self) {
 static MYFLT
 XnoiseDur_loopseg(XnoiseDur *self) {
     int modulo, dir;
-    
+
     if (self->loopChoice == 0) {
-        
+
         self->loopCountPlay = self->loopTime = 0;
-        
+
         if (self->xx2 < 0.002) self->xx2 = 0.002;
-        
+
         modulo = (int)(self->xx2 * 1000.0);
         dir = rand() % 2;
-        
+
         if (dir == 0)
             self->walkerValue = self->walkerValue + (((rand() % modulo) - (modulo / 2)) * 0.001);
         else
             self->walkerValue = self->walkerValue - (((rand() % modulo) - (modulo / 2)) * 0.001);
-        
+
         if (self->walkerValue > self->xx1)
             self->walkerValue = self->xx1;
         if (self->walkerValue < 0.0)
             self->walkerValue = 0.0;
-        
+
         self->loop_buffer[self->loopCountRec++] = self->walkerValue;
-        
+
         if (self->loopCountRec < self->loopLen)
             self->loopChoice = 0;
         else {
@@ -4716,22 +4716,22 @@ XnoiseDur_loopseg(XnoiseDur *self) {
     }
     else {
         self->loopCountRec = 0;
-        
+
         self->walkerValue = self->loop_buffer[self->loopCountPlay++];
-        
+
         if (self->loopCountPlay < self->loopLen)
             self->loopChoice = 1;
         else {
             self->loopCountPlay = 0;
             self->loopTime++;
         }
-        
+
         if (self->loopTime == self->loopStop) {
             self->loopChoice = 0;
             self->loopLen = (rand() % 10) + 3;
         }
     }
-    
+
     return self->walkerValue;
 }
 
@@ -4739,7 +4739,7 @@ static void
 XnoiseDur_generate(XnoiseDur *self) {
     int i;
     MYFLT min, max;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->time += self->inc;
         if (self->time < 0.0)
@@ -4787,8 +4787,8 @@ static void XnoiseDur_postprocessing_revareva(XnoiseDur *self) { POST_PROCESSING
 static void
 XnoiseDur_setRandomType(XnoiseDur *self)
 {
-    
-    switch (self->type) {            
+
+    switch (self->type) {
         case 0:
             self->type_func_ptr = XnoiseDur_uniform;
             break;
@@ -4828,7 +4828,7 @@ XnoiseDur_setRandomType(XnoiseDur *self)
         case 12:
             self->type_func_ptr = XnoiseDur_loopseg;
             break;
-    }        
+    }
 }
 
 static void
@@ -4836,44 +4836,44 @@ XnoiseDur_setProcMode(XnoiseDur *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = XnoiseDur_generate;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = XnoiseDur_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = XnoiseDur_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = XnoiseDur_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = XnoiseDur_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = XnoiseDur_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = XnoiseDur_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = XnoiseDur_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = XnoiseDur_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = XnoiseDur_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 XnoiseDur_compute_next_data_frame(XnoiseDur *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -4885,14 +4885,14 @@ XnoiseDur_traverse(XnoiseDur *self, visitproc visit, void *arg)
     Py_VISIT(self->min_stream);
     Py_VISIT(self->max);
     Py_VISIT(self->max_stream);
-    Py_VISIT(self->x1);    
-    Py_VISIT(self->x1_stream);    
-    Py_VISIT(self->x2);    
-    Py_VISIT(self->x2_stream);    
+    Py_VISIT(self->x1);
+    Py_VISIT(self->x1_stream);
+    Py_VISIT(self->x2);
+    Py_VISIT(self->x2_stream);
     return 0;
 }
 
-static int 
+static int
 XnoiseDur_clear(XnoiseDur *self)
 {
     pyo_CLEAR
@@ -4900,10 +4900,10 @@ XnoiseDur_clear(XnoiseDur *self)
     Py_CLEAR(self->min_stream);
     Py_CLEAR(self->max);
     Py_CLEAR(self->max_stream);
-    Py_CLEAR(self->x1);    
-    Py_CLEAR(self->x1_stream);    
-    Py_CLEAR(self->x2);    
-    Py_CLEAR(self->x2_stream);    
+    Py_CLEAR(self->x1);
+    Py_CLEAR(self->x1_stream);
+    Py_CLEAR(self->x2);
+    Py_CLEAR(self->x2_stream);
     return 0;
 }
 
@@ -4923,7 +4923,7 @@ XnoiseDur_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *mintmp=NULL, *maxtmp=NULL, *x1tmp=NULL, *x2tmp=NULL, *multmp=NULL, *addtmp=NULL;
     XnoiseDur *self;
     self = (XnoiseDur *)type->tp_alloc(type, 0);
-    
+
     self->x1 = PyFloat_FromDouble(0.5);
     self->x2 = PyFloat_FromDouble(0.5);
     self->min = PyFloat_FromDouble(0.0);
@@ -4936,11 +4936,11 @@ XnoiseDur_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[3] = 0;
 	self->modebuffer[4] = 0;
 	self->modebuffer[5] = 0;
-    
+
     INIT_OBJECT_COMMON
-    
+
     Server_generateSeed((Server *)self->server, XNOISEDUR_ID);
-    
+
     self->poisson_tab = 0;
     self->lastPoissonX1 = -99.0;
     for (i=0; i<2000; i++) {
@@ -4949,41 +4949,41 @@ XnoiseDur_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     for (i=0; i<15; i++) {
         self->loop_buffer[i] = 0.0;
     }
-    self->loopChoice = self->loopCountPlay = self->loopTime = self->loopCountRec = self->loopStop = 0;    
+    self->loopChoice = self->loopCountPlay = self->loopTime = self->loopCountRec = self->loopStop = 0;
     self->loopLen = (rand() % 10) + 3;
-    
+
     Stream_setFunctionPtr(self->stream, XnoiseDur_compute_next_data_frame);
     self->mode_func_ptr = XnoiseDur_setProcMode;
 
     static char *kwlist[] = {"type", "min", "max", "x1", "x2", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|iOOOOOO", kwlist, &self->type, &mintmp, &maxtmp, &x1tmp, &x2tmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (x1tmp) {
         PyObject_CallMethod((PyObject *)self, "setX1", "O", x1tmp);
     }
-    
+
     if (x2tmp) {
         PyObject_CallMethod((PyObject *)self, "setX2", "O", x2tmp);
     }
-    
+
     if (mintmp) {
         PyObject_CallMethod((PyObject *)self, "setMin", "O", mintmp);
     }
-    
+
     if (maxtmp) {
         PyObject_CallMethod((PyObject *)self, "setMax", "O", maxtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     if (self->modebuffer[2] == 0)
@@ -4994,15 +4994,15 @@ XnoiseDur_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         ma = PyFloat_AS_DOUBLE(self->max);
     else
         ma = Stream_getData((Stream *)self->max_stream)[0];
-    
+
     self->value = (mi + ma) * 0.5;
     if (self->value == 0.0)
         self->inc = 0.0;
     else
         self->inc = (1.0 / self->value) / self->sr;
-    
+
     XnoiseDur_setRandomType(self);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -5010,10 +5010,10 @@ XnoiseDur_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * XnoiseDur_getServer(XnoiseDur* self) { GET_SERVER };
 static PyObject * XnoiseDur_getStream(XnoiseDur* self) { GET_STREAM };
-static PyObject * XnoiseDur_setMul(XnoiseDur *self, PyObject *arg) { SET_MUL };	
-static PyObject * XnoiseDur_setAdd(XnoiseDur *self, PyObject *arg) { SET_ADD };	
-static PyObject * XnoiseDur_setSub(XnoiseDur *self, PyObject *arg) { SET_SUB };	
-static PyObject * XnoiseDur_setDiv(XnoiseDur *self, PyObject *arg) { SET_DIV };	
+static PyObject * XnoiseDur_setMul(XnoiseDur *self, PyObject *arg) { SET_MUL };
+static PyObject * XnoiseDur_setAdd(XnoiseDur *self, PyObject *arg) { SET_ADD };
+static PyObject * XnoiseDur_setSub(XnoiseDur *self, PyObject *arg) { SET_SUB };
+static PyObject * XnoiseDur_setDiv(XnoiseDur *self, PyObject *arg) { SET_DIV };
 
 static PyObject * XnoiseDur_play(XnoiseDur *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * XnoiseDur_out(XnoiseDur *self, PyObject *args, PyObject *kwds) { OUT };
@@ -5030,35 +5030,35 @@ static PyObject * XnoiseDur_inplace_div(XnoiseDur *self, PyObject *arg) { INPLAC
 
 static PyObject *
 XnoiseDur_setType(XnoiseDur *self, PyObject *arg)
-{	
+{
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyInt_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->type = PyInt_AsLong(arg);
         XnoiseDur_setRandomType(self);
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 XnoiseDur_setX1(XnoiseDur *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->x1);
@@ -5074,25 +5074,25 @@ XnoiseDur_setX1(XnoiseDur *self, PyObject *arg)
         self->x1_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 XnoiseDur_setX2(XnoiseDur *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->x2);
@@ -5108,25 +5108,25 @@ XnoiseDur_setX2(XnoiseDur *self, PyObject *arg)
         self->x2_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 XnoiseDur_setMin(XnoiseDur *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->min);
@@ -5142,25 +5142,25 @@ XnoiseDur_setMin(XnoiseDur *self, PyObject *arg)
         self->min_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 XnoiseDur_setMax(XnoiseDur *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->max);
@@ -5176,12 +5176,12 @@ XnoiseDur_setMax(XnoiseDur *self, PyObject *arg)
         self->max_stream = (Stream *)streamtmp;
 		self->modebuffer[5] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef XnoiseDur_members[] = {
     {"server", T_OBJECT_EX, offsetof(XnoiseDur, server), 0, "Pyo server."},
@@ -5312,7 +5312,7 @@ typedef struct {
     MYFLT time;
     MYFLT *trigsBuffer;
     TriggerStream *trig_stream;
-    int modebuffer[3]; // need at least 2 slots for mul & add 
+    int modebuffer[3]; // need at least 2 slots for mul & add
 } Urn;
 
 static void
@@ -5331,13 +5331,13 @@ Urn_choose(Urn *self) {
     int x = 0;
     int value = 0;
     int i, pick;
- 
+
     pick = rand() % self->length;
     while (pick == self->lastvalue)
         pick = rand() % self->length;
 
     for (i=0; i<self->length; i++) {
-        if (i != pick) 
+        if (i != pick)
             self->list[x++] = self->list[i];
         else
             value = self->list[i];
@@ -5354,7 +5354,7 @@ Urn_generate_i(Urn *self) {
     int i;
     MYFLT fr = PyFloat_AS_DOUBLE(self->freq);
     MYFLT inc = fr / self->sr;
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
         self->time += inc;
@@ -5377,7 +5377,7 @@ Urn_generate_a(Urn *self) {
     int i;
     MYFLT inc;
     MYFLT *fr = Stream_getData((Stream *)self->freq_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
         inc = fr[i] / self->sr;
@@ -5412,50 +5412,50 @@ Urn_setProcMode(Urn *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Urn_generate_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Urn_generate_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Urn_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Urn_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Urn_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Urn_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Urn_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Urn_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Urn_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Urn_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Urn_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 Urn_compute_next_data_frame(Urn *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -5465,17 +5465,17 @@ Urn_traverse(Urn *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->freq);
     Py_VISIT(self->freq_stream);
-    Py_VISIT(self->trig_stream);    
+    Py_VISIT(self->trig_stream);
     return 0;
 }
 
-static int 
+static int
 Urn_clear(Urn *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->freq);
     Py_CLEAR(self->freq_stream);
-    Py_CLEAR(self->trig_stream);    
+    Py_CLEAR(self->trig_stream);
     return 0;
 }
 
@@ -5496,7 +5496,7 @@ Urn_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *freqtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Urn *self;
     self = (Urn *)type->tp_alloc(type, 0);
-    
+
     self->freq = PyFloat_FromDouble(1.);
     self->max = 100;
     self->length = 0;
@@ -5506,36 +5506,36 @@ Urn_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Urn_compute_next_data_frame);
     self->mode_func_ptr = Urn_setProcMode;
 
     static char *kwlist[] = {"max", "freq", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|iOOO", kwlist, &self->max, &freqtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     if (freqtmp) {
         PyObject_CallMethod((PyObject *)self, "setFreq", "O", freqtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     self->trigsBuffer = (MYFLT *)realloc(self->trigsBuffer, self->bufsize * sizeof(MYFLT));
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
-    }    
-    
+    }
+
     MAKE_NEW_TRIGGER_STREAM(self->trig_stream, &TriggerStreamType, NULL);
     TriggerStream_setData(self->trig_stream, self->trigsBuffer);
 
@@ -5551,10 +5551,10 @@ Urn_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 static PyObject * Urn_getServer(Urn* self) { GET_SERVER };
 static PyObject * Urn_getStream(Urn* self) { GET_STREAM };
 static PyObject * Urn_getTriggerStream(Urn* self) { GET_TRIGGER_STREAM };
-static PyObject * Urn_setMul(Urn *self, PyObject *arg) { SET_MUL };	
-static PyObject * Urn_setAdd(Urn *self, PyObject *arg) { SET_ADD };	
-static PyObject * Urn_setSub(Urn *self, PyObject *arg) { SET_SUB };	
-static PyObject * Urn_setDiv(Urn *self, PyObject *arg) { SET_DIV };	
+static PyObject * Urn_setMul(Urn *self, PyObject *arg) { SET_MUL };
+static PyObject * Urn_setAdd(Urn *self, PyObject *arg) { SET_ADD };
+static PyObject * Urn_setSub(Urn *self, PyObject *arg) { SET_SUB };
+static PyObject * Urn_setDiv(Urn *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Urn_play(Urn *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Urn_out(Urn *self, PyObject *args, PyObject *kwds) { OUT };
@@ -5571,7 +5571,7 @@ static PyObject * Urn_inplace_div(Urn *self, PyObject *arg) { INPLACE_DIV };
 
 static PyObject *
 Urn_setMax(Urn *self, PyObject *arg)
-{	
+{
 	if (PyNumber_Check(arg) == 1)
 		self->max = PyInt_AsLong(arg);
 
@@ -5579,20 +5579,20 @@ Urn_setMax(Urn *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Urn_setFreq(Urn *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->freq);
@@ -5608,12 +5608,12 @@ Urn_setFreq(Urn *self, PyObject *arg)
         self->freq_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Urn_members[] = {
 {"server", T_OBJECT_EX, offsetof(Urn, server), 0, "Pyo server."},
@@ -5723,4 +5723,4 @@ Urn_members,                                 /* tp_members */
 0,                          /* tp_init */
 0,                                              /* tp_alloc */
 Urn_new,                                     /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/recordmodule.c b/src/objects/recordmodule.c
index 1ce6d30..b612fe4 100644
--- a/src/objects/recordmodule.c
+++ b/src/objects/recordmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -50,16 +50,16 @@ Record_process(Record *self) {
     MYFLT *in;
 
     totlen = self->chnls*self->bufsize*self->buffering;
-    
+
     if (self->count == self->buffering) {
         self->count = 0;
         for (i=0; i<totlen; i++) {
             self->buffer[i] = 0.0;
         }
-    }    
+    }
 
     offset = self->bufsize * self->chnls * self->count;
-    
+
     for (j=0; j<self->listlen; j++) {
         chnl = j % self->chnls;
         in = Stream_getData((Stream *)PyList_GET_ITEM(self->input_stream_list, j));
@@ -68,21 +68,21 @@ Record_process(Record *self) {
         }
     }
     self->count++;
-    
+
     if (self->count == self->buffering)
         SF_WRITE(self->recfile, self->buffer, totlen);
 }
 
 static void
 Record_setProcMode(Record *self)
-{       
-    self->proc_func_ptr = Record_process;   
+{
+    self->proc_func_ptr = Record_process;
 }
 
 static void
 Record_compute_next_data_frame(Record *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -94,7 +94,7 @@ Record_traverse(Record *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Record_clear(Record *self)
 {
     pyo_CLEAR
@@ -123,20 +123,20 @@ Record_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *input_listtmp;
     Record *self;
     self = (Record *)type->tp_alloc(type, 0);
-    
+
     self->chnls = 2;
     self->buffering = 4;
     self->count = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Record_compute_next_data_frame);
     self->mode_func_ptr = Record_setProcMode;
 
     static char *kwlist[] = {"input", "filename", "chnls", "fileformat", "sampletype", "buffering", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "Os|iiii", kwlist, &input_listtmp, &self->recpath, &self->chnls, &fileformat, &sampletype, &self->buffering))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->input_list);
     self->input_list = input_listtmp;
     self->listlen = PyList_Size(self->input_list);
@@ -148,7 +148,7 @@ Record_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     /* Prepare sfinfo */
     self->recinfo.samplerate = (int)self->sr;
     self->recinfo.channels = self->chnls;
-    
+
     switch (fileformat) {
         case 0:
             self->recinfo.format = SF_FORMAT_WAV;
@@ -200,21 +200,21 @@ Record_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
                 break;
         }
     }
-    
+
     /* Open the output file. */
-    if (! (self->recfile = sf_open(self->recpath, SFM_WRITE, &self->recinfo))) {   
+    if (! (self->recfile = sf_open(self->recpath, SFM_WRITE, &self->recinfo))) {
         printf ("Not able to open output file %s.\n", self->recpath);
         Py_RETURN_NONE;
-    }	
+    }
 
     buflen = self->bufsize * self->chnls * self->buffering;
     self->buffer = (MYFLT *)realloc(self->buffer, buflen * sizeof(MYFLT));
     for (i=0; i<buflen; i++) {
         self->buffer[i] = 0.;
-    }    
-    
+    }
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -224,8 +224,8 @@ static PyObject * Record_getServer(Record* self) { GET_SERVER };
 static PyObject * Record_getStream(Record* self) { GET_STREAM };
 
 static PyObject * Record_play(Record *self, PyObject *args, PyObject *kwds) { PLAY };
-static PyObject * Record_stop(Record *self) 
-{ 
+static PyObject * Record_stop(Record *self)
+{
     sf_close(self->recfile);
     STOP
 };
@@ -307,9 +307,9 @@ typedef struct {
 static void
 ControlRec_process(ControlRec *self) {
     int i;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->dur > 0.0) {
         for (i=0; i<self->bufsize; i++) {
             if ((self->time % self->modulo) == 0 && self->count < self->size) {
@@ -319,7 +319,7 @@ ControlRec_process(ControlRec *self) {
             self->time++;
             if (self->count >= self->size)
                 PyObject_CallMethod((PyObject *)self, "stop", NULL);
-        }        
+        }
     }
     else {
         for (i=0; i<self->bufsize; i++) {
@@ -333,14 +333,14 @@ ControlRec_process(ControlRec *self) {
 
 static void
 ControlRec_setProcMode(ControlRec *self)
-{       
-    self->proc_func_ptr = ControlRec_process;   
+{
+    self->proc_func_ptr = ControlRec_process;
 }
 
 static void
 ControlRec_compute_next_data_frame(ControlRec *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -353,7 +353,7 @@ ControlRec_traverse(ControlRec *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 ControlRec_clear(ControlRec *self)
 {
     pyo_CLEAR
@@ -381,33 +381,33 @@ ControlRec_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp;
     ControlRec *self;
     self = (ControlRec *)type->tp_alloc(type, 0);
-    
+
     self->dur = 0.0;
     self->rate = 1000;
     self->tmp_list = PyList_New(0);
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, ControlRec_compute_next_data_frame);
     self->mode_func_ptr = ControlRec_setProcMode;
 
     static char *kwlist[] = {"input", "rate", "dur", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_IF, kwlist, &inputtmp, &self->rate, &self->dur))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     if (self->dur > 0.0) {
         self->size = (long)(self->dur * self->rate + 1);
         self->buffer = (MYFLT *)realloc(self->buffer, self->size * sizeof(MYFLT));
         for (j=0; j<self->size; j++) {
             self->buffer[j] = 0.0;
-        }        
-    }    
+        }
+    }
     self->modulo = (int)(self->sr / self->rate);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -416,9 +416,9 @@ ControlRec_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 static PyObject * ControlRec_getServer(ControlRec* self) { GET_SERVER };
 static PyObject * ControlRec_getStream(ControlRec* self) { GET_STREAM };
 
-static PyObject * ControlRec_play(ControlRec *self, PyObject *args, PyObject *kwds) { 
+static PyObject * ControlRec_play(ControlRec *self, PyObject *args, PyObject *kwds) {
     self->count = self->time = 0;
-    PLAY 
+    PLAY
 };
 
 static PyObject * ControlRec_stop(ControlRec *self) { STOP };
@@ -428,7 +428,7 @@ ControlRec_getData(ControlRec *self) {
     int i;
     PyObject *data, *point;
     MYFLT time, timescl = 1.0 / self->rate;
-        
+
     if (self->dur > 0.0) {
         data = PyList_New(self->size);
         for (i=0; i<self->size; i++) {
@@ -437,7 +437,7 @@ ControlRec_getData(ControlRec *self) {
             PyTuple_SET_ITEM(point, 0, PyFloat_FromDouble(time));
             PyTuple_SET_ITEM(point, 1, PyFloat_FromDouble(self->buffer[i]));
             PyList_SetItem(data, i, point);
-        }        
+        }
     }
     else {
         Py_ssize_t size = PyList_Size(self->tmp_list);
@@ -448,7 +448,7 @@ ControlRec_getData(ControlRec *self) {
             PyTuple_SET_ITEM(point, 0, PyFloat_FromDouble(time));
             PyTuple_SET_ITEM(point, 1, PyList_GET_ITEM(self->tmp_list, i));
             PyList_SetItem(data, i, point);
-        }        
+        }
     }
 	return data;
 }
@@ -536,16 +536,16 @@ ControlRead_readframes_i(ControlRead *self) {
     MYFLT fpart;
     long i, mod;
     MYFLT invmodulo = 1.0 / self->modulo;
-    
+
     if (self->go == 0)
         PyObject_CallMethod((PyObject *)self, "stop", NULL);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
         if (self->go == 1) {
             mod = self->time % self->modulo;
             fpart = mod * invmodulo;
-            self->data[i] = (*self->interp_func_ptr)(self->values, (int)self->count, fpart, (int)self->size);            
+            self->data[i] = (*self->interp_func_ptr)(self->values, (int)self->count, fpart, (int)self->size);
         }
         else {
             mod = -1;
@@ -581,44 +581,44 @@ ControlRead_setProcMode(ControlRead *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = ControlRead_readframes_i;
 
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = ControlRead_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = ControlRead_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = ControlRead_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = ControlRead_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = ControlRead_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = ControlRead_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = ControlRead_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = ControlRead_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = ControlRead_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 ControlRead_compute_next_data_frame(ControlRead *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -626,15 +626,15 @@ static int
 ControlRead_traverse(ControlRead *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->trig_stream);    
+    Py_VISIT(self->trig_stream);
     return 0;
 }
 
-static int 
+static int
 ControlRead_clear(ControlRead *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->trig_stream);    
+    Py_CLEAR(self->trig_stream);
     return 0;
 }
 
@@ -655,74 +655,74 @@ ControlRead_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *valuestmp, *multmp=NULL, *addtmp=NULL;
     ControlRead *self;
     self = (ControlRead *)type->tp_alloc(type, 0);
-    
+
     self->loop = 0;
     self->rate = 1000;
     self->interp = 2;
     self->go = 1;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, ControlRead_compute_next_data_frame);
     self->mode_func_ptr = ControlRead_setProcMode;
 
     static char *kwlist[] = {"values", "rate", "loop", "interp", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iiiOO", kwlist, &valuestmp, &self->rate, &self->loop, &self->interp, &multmp, &addtmp))
         Py_RETURN_NONE;
 
     if (valuestmp) {
         PyObject_CallMethod((PyObject *)self, "setValues", "O", valuestmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-        
+
     self->trigsBuffer = (MYFLT *)realloc(self->trigsBuffer, self->bufsize * sizeof(MYFLT));
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
-    }    
+    }
 
     MAKE_NEW_TRIGGER_STREAM(self->trig_stream, &TriggerStreamType, NULL);
     TriggerStream_setData(self->trig_stream, self->trigsBuffer);
-    
+
     self->modulo = (int)(self->sr / self->rate);
 
     (*self->mode_func_ptr)(self);
-    
+
     SET_INTERP_POINTER
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * ControlRead_getServer(ControlRead* self) { GET_SERVER };
 static PyObject * ControlRead_getStream(ControlRead* self) { GET_STREAM };
 static PyObject * ControlRead_getTriggerStream(ControlRead* self) { GET_TRIGGER_STREAM };
-static PyObject * ControlRead_setMul(ControlRead *self, PyObject *arg) { SET_MUL };	
-static PyObject * ControlRead_setAdd(ControlRead *self, PyObject *arg) { SET_ADD };	
-static PyObject * ControlRead_setSub(ControlRead *self, PyObject *arg) { SET_SUB };	
-static PyObject * ControlRead_setDiv(ControlRead *self, PyObject *arg) { SET_DIV };	
+static PyObject * ControlRead_setMul(ControlRead *self, PyObject *arg) { SET_MUL };
+static PyObject * ControlRead_setAdd(ControlRead *self, PyObject *arg) { SET_ADD };
+static PyObject * ControlRead_setSub(ControlRead *self, PyObject *arg) { SET_SUB };
+static PyObject * ControlRead_setDiv(ControlRead *self, PyObject *arg) { SET_DIV };
 
-static PyObject * ControlRead_play(ControlRead *self, PyObject *args, PyObject *kwds) 
-{ 
+static PyObject * ControlRead_play(ControlRead *self, PyObject *args, PyObject *kwds)
+{
     self->count = self->time = 0;
     self->go = 1;
-    PLAY 
+    PLAY
 };
 
-static PyObject * ControlRead_stop(ControlRead *self) 
-{ 
+static PyObject * ControlRead_stop(ControlRead *self)
+{
     self->go = 0;
-    STOP 
+    STOP
 };
 
 static PyObject * ControlRead_multiply(ControlRead *self, PyObject *arg) { MULTIPLY };
@@ -738,21 +738,21 @@ static PyObject *
 ControlRead_setValues(ControlRead *self, PyObject *arg)
 {
     Py_ssize_t i;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->size = PyList_Size(arg);
     self->values = (MYFLT *)realloc(self->values, self->size * sizeof(MYFLT));
     for (i=0; i<self->size; i++) {
         self->values[i] = PyFloat_AS_DOUBLE(PyList_GET_ITEM(arg, i));
     }
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 ControlRead_setRate(ControlRead *self, PyObject *arg)
@@ -761,10 +761,10 @@ ControlRead_setRate(ControlRead *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->rate = PyInt_AsLong(arg);
     self->modulo = (int)(self->sr / self->rate);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -776,9 +776,9 @@ ControlRead_setLoop(ControlRead *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->loop = PyInt_AsLong(arg);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -790,15 +790,15 @@ ControlRead_setInterp(ControlRead *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     int isNumber = PyNumber_Check(arg);
-    
+
 	if (isNumber == 1) {
 		self->interp = PyInt_AsLong(PyNumber_Int(arg));
-    }  
-    
+    }
+
     SET_INTERP_POINTER
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -934,10 +934,10 @@ static void
 NoteinRec_process(NoteinRec *self) {
     int i;
     MYFLT pit, vel;
-    
+
     MYFLT *inp = Stream_getData((Stream *)self->inputp_stream);
     MYFLT *inv = Stream_getData((Stream *)self->inputv_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         pit = inp[i];
         vel = inv[i];
@@ -954,14 +954,14 @@ NoteinRec_process(NoteinRec *self) {
 
 static void
 NoteinRec_setProcMode(NoteinRec *self)
-{       
-    self->proc_func_ptr = NoteinRec_process;   
+{
+    self->proc_func_ptr = NoteinRec_process;
 }
 
 static void
 NoteinRec_compute_next_data_frame(NoteinRec *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -978,7 +978,7 @@ NoteinRec_traverse(NoteinRec *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 NoteinRec_clear(NoteinRec *self)
 {
     pyo_CLEAR
@@ -1007,21 +1007,21 @@ NoteinRec_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputptmp, *inputp_streamtmp, *inputvtmp, *inputv_streamtmp;
     NoteinRec *self;
     self = (NoteinRec *)type->tp_alloc(type, 0);
-    
+
     self->tmp_list_p = PyList_New(0);
     self->tmp_list_v = PyList_New(0);
     self->tmp_list_t = PyList_New(0);
     self->last_pitch = self->last_vel = 0.0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, NoteinRec_compute_next_data_frame);
     self->mode_func_ptr = NoteinRec_setProcMode;
 
     static char *kwlist[] = {"inputp", "inputv", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist, &inputptmp, &inputvtmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->inputp);
     self->inputp = inputptmp;
     inputp_streamtmp = PyObject_CallMethod((PyObject *)self->inputp, "_getStream", NULL);
@@ -1035,20 +1035,20 @@ NoteinRec_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     Py_INCREF(inputv_streamtmp);
     Py_XDECREF(self->inputv_stream);
     self->inputv_stream = (Stream *)inputv_streamtmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * NoteinRec_getServer(NoteinRec* self) { GET_SERVER };
 static PyObject * NoteinRec_getStream(NoteinRec* self) { GET_STREAM };
 
-static PyObject * NoteinRec_play(NoteinRec *self, PyObject *args, PyObject *kwds) { 
+static PyObject * NoteinRec_play(NoteinRec *self, PyObject *args, PyObject *kwds) {
     self->time = 0;
-    PLAY 
+    PLAY
 };
 
 static PyObject * NoteinRec_stop(NoteinRec *self) { STOP };
@@ -1057,10 +1057,10 @@ static PyObject *
 NoteinRec_getData(NoteinRec *self) {
     int i;
     PyObject *data, *point;
-    
+
     Py_ssize_t size = PyList_Size(self->tmp_list_p);
     data = PyList_New(size);
-    
+
     for (i=0; i<size; i++) {
         point = PyTuple_New(3);
         PyTuple_SET_ITEM(point, 0, PyList_GET_ITEM(self->tmp_list_t, i));
@@ -1151,17 +1151,17 @@ typedef struct {
 static void
 NoteinRead_readframes_i(NoteinRead *self) {
     long i;
-    
+
     if (self->go == 0)
         PyObject_CallMethod((PyObject *)self, "stop", NULL);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
         if (self->go == 1) {
             if (self->time >= self->timestamps[self->count]) {
                 self->value = self->values[self->count];
                 self->data[i] = self->value;
-                self->count++;            
+                self->count++;
             }
             else
                 self->data[i] = self->value;
@@ -1195,44 +1195,44 @@ NoteinRead_setProcMode(NoteinRead *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = NoteinRead_readframes_i;
 
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = NoteinRead_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = NoteinRead_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = NoteinRead_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = NoteinRead_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = NoteinRead_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = NoteinRead_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = NoteinRead_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = NoteinRead_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = NoteinRead_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 NoteinRead_compute_next_data_frame(NoteinRead *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1240,15 +1240,15 @@ static int
 NoteinRead_traverse(NoteinRead *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->trig_stream);    
+    Py_VISIT(self->trig_stream);
     return 0;
 }
 
-static int 
+static int
 NoteinRead_clear(NoteinRead *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->trig_stream);    
+    Py_CLEAR(self->trig_stream);
     return 0;
 }
 
@@ -1270,26 +1270,26 @@ NoteinRead_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *valuestmp, *timestampstmp, *multmp=NULL, *addtmp=NULL;
     NoteinRead *self;
     self = (NoteinRead *)type->tp_alloc(type, 0);
-    
+
     self->value = 0.0;
     self->loop = 0;
     self->go = 1;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, NoteinRead_compute_next_data_frame);
     self->mode_func_ptr = NoteinRead_setProcMode;
 
     static char *kwlist[] = {"values", "timestamps", "loop", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|iOO", kwlist, &valuestmp, &timestampstmp, &self->loop, &multmp, &addtmp))
         Py_RETURN_NONE;
 
     if (valuestmp) {
         PyObject_CallMethod((PyObject *)self, "setValues", "O", valuestmp);
     }
-    
+
     if (timestampstmp) {
         PyObject_CallMethod((PyObject *)self, "setTimestamps", "O", timestampstmp);
     }
@@ -1297,46 +1297,46 @@ NoteinRead_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
      if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-        
+
     self->trigsBuffer = (MYFLT *)realloc(self->trigsBuffer, self->bufsize * sizeof(MYFLT));
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
-    }    
+    }
 
     MAKE_NEW_TRIGGER_STREAM(self->trig_stream, &TriggerStreamType, NULL);
     TriggerStream_setData(self->trig_stream, self->trigsBuffer);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * NoteinRead_getServer(NoteinRead* self) { GET_SERVER };
 static PyObject * NoteinRead_getStream(NoteinRead* self) { GET_STREAM };
 static PyObject * NoteinRead_getTriggerStream(NoteinRead* self) { GET_TRIGGER_STREAM };
-static PyObject * NoteinRead_setMul(NoteinRead *self, PyObject *arg) { SET_MUL };	
-static PyObject * NoteinRead_setAdd(NoteinRead *self, PyObject *arg) { SET_ADD };	
-static PyObject * NoteinRead_setSub(NoteinRead *self, PyObject *arg) { SET_SUB };	
-static PyObject * NoteinRead_setDiv(NoteinRead *self, PyObject *arg) { SET_DIV };	
+static PyObject * NoteinRead_setMul(NoteinRead *self, PyObject *arg) { SET_MUL };
+static PyObject * NoteinRead_setAdd(NoteinRead *self, PyObject *arg) { SET_ADD };
+static PyObject * NoteinRead_setSub(NoteinRead *self, PyObject *arg) { SET_SUB };
+static PyObject * NoteinRead_setDiv(NoteinRead *self, PyObject *arg) { SET_DIV };
 
-static PyObject * NoteinRead_play(NoteinRead *self, PyObject *args, PyObject *kwds) 
-{ 
+static PyObject * NoteinRead_play(NoteinRead *self, PyObject *args, PyObject *kwds)
+{
     self->count = self->time = 0;
     self->go = 1;
-    PLAY 
+    PLAY
 };
 
-static PyObject * NoteinRead_stop(NoteinRead *self) 
-{ 
+static PyObject * NoteinRead_stop(NoteinRead *self)
+{
     self->go = 0;
-    STOP 
+    STOP
 };
 
 static PyObject * NoteinRead_multiply(NoteinRead *self, PyObject *arg) { MULTIPLY };
@@ -1352,42 +1352,42 @@ static PyObject *
 NoteinRead_setValues(NoteinRead *self, PyObject *arg)
 {
     Py_ssize_t i;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->size = PyList_Size(arg);
     self->values = (MYFLT *)realloc(self->values, self->size * sizeof(MYFLT));
     for (i=0; i<self->size; i++) {
         self->values[i] = PyFloat_AS_DOUBLE(PyList_GET_ITEM(arg, i));
     }
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 NoteinRead_setTimestamps(NoteinRead *self, PyObject *arg)
 {
     Py_ssize_t i;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->size = PyList_Size(arg);
     self->timestamps = (long *)realloc(self->timestamps, self->size * sizeof(long));
     for (i=0; i<self->size; i++) {
         self->timestamps[i] = (long)(PyFloat_AS_DOUBLE(PyList_GET_ITEM(arg, i)) * self->sr);
     }
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
-    
+
 static PyObject *
 NoteinRead_setLoop(NoteinRead *self, PyObject *arg)
 {
@@ -1395,9 +1395,9 @@ NoteinRead_setLoop(NoteinRead *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->loop = PyInt_AsLong(arg);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1509,4 +1509,4 @@ PyTypeObject NoteinReadType = {
     0,      /* tp_init */
     0,                         /* tp_alloc */
     NoteinRead_new,                 /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/selectmodule.c b/src/objects/selectmodule.c
index 64906fb..aa423d2 100644
--- a/src/objects/selectmodule.c
+++ b/src/objects/selectmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -31,7 +31,7 @@ typedef struct {
     Stream *input_stream;
     long value;
     MYFLT last_value;
-    int modebuffer[2]; // need at least 2 slots for mul & add 
+    int modebuffer[2]; // need at least 2 slots for mul & add
 } Select;
 
 static void
@@ -40,14 +40,14 @@ Select_selector(Select *self) {
     int i;
 
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
         if (inval == self->value && inval != self->last_value)
             val = 1;
         else
             val = 0;
-        
+
         self->last_value = inval;
         self->data[i] = val;
     }
@@ -67,47 +67,47 @@ static void
 Select_setProcMode(Select *self)
 {
     int muladdmode;
-    
+
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
     self->proc_func_ptr = Select_selector;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Select_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Select_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Select_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Select_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Select_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Select_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Select_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Select_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Select_postprocessing_revareva;
             break;
-    }  
-    
+    }
+
 }
 
 static void
 Select_compute_next_data_frame(Select *self)
 {
-    (*self->proc_func_ptr)(self);    
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -115,16 +115,16 @@ static int
 Select_traverse(Select *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->input);    
-    Py_VISIT(self->input_stream);    
+    Py_VISIT(self->input);
+    Py_VISIT(self->input_stream);
     return 0;
 }
 
-static int 
+static int
 Select_clear(Select *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->input);    
+    Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
     return 0;
 }
@@ -144,7 +144,7 @@ Select_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     Select *self;
     self = (Select *)type->tp_alloc(type, 0);
-    
+
     self->value = 0;
     self->last_value = -99.0;
 	self->modebuffer[0] = 0;
@@ -155,7 +155,7 @@ Select_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = Select_setProcMode;
 
     static char *kwlist[] = {"input", "value", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iOO", kwlist, &inputtmp, &self->value, &multmp, &addtmp))
         Py_RETURN_NONE;
 
@@ -164,24 +164,24 @@ Select_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Select_getServer(Select* self) { GET_SERVER };
 static PyObject * Select_getStream(Select* self) { GET_STREAM };
-static PyObject * Select_setMul(Select *self, PyObject *arg) { SET_MUL };	
-static PyObject * Select_setAdd(Select *self, PyObject *arg) { SET_ADD };	
-static PyObject * Select_setSub(Select *self, PyObject *arg) { SET_SUB };	
-static PyObject * Select_setDiv(Select *self, PyObject *arg) { SET_DIV };	
+static PyObject * Select_setMul(Select *self, PyObject *arg) { SET_MUL };
+static PyObject * Select_setAdd(Select *self, PyObject *arg) { SET_ADD };
+static PyObject * Select_setSub(Select *self, PyObject *arg) { SET_SUB };
+static PyObject * Select_setDiv(Select *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Select_play(Select *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Select_stop(Select *self) { STOP };
@@ -202,14 +202,14 @@ Select_setValue(Select *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
-	if (PyLong_Check(arg) || PyInt_Check(arg)) {	
+
+	if (PyLong_Check(arg) || PyInt_Check(arg)) {
 		self->value = PyLong_AsLong(arg);
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Select_members[] = {
 {"server", T_OBJECT_EX, offsetof(Select, server), 0, "Pyo server."},
@@ -321,7 +321,7 @@ typedef struct {
     PyObject *input;
     Stream *input_stream;
     MYFLT last_value;
-    int modebuffer[2]; // need at least 2 slots for mul & add 
+    int modebuffer[2]; // need at least 2 slots for mul & add
 } Change;
 
 static void
@@ -330,7 +330,7 @@ Change_selector(Change *self) {
     int i;
 
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
         if (inval < (self->last_value - 0.00001) || inval > (self->last_value + 0.00001)) {
@@ -363,40 +363,40 @@ Change_setProcMode(Change *self)
     self->proc_func_ptr = Change_selector;
 
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Change_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Change_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Change_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Change_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Change_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Change_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Change_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Change_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Change_postprocessing_revareva;
             break;
-    }      
+    }
 }
 
 static void
 Change_compute_next_data_frame(Change *self)
 {
-    (*self->proc_func_ptr)(self);    
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -404,16 +404,16 @@ static int
 Change_traverse(Change *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->input);    
-    Py_VISIT(self->input_stream);    
+    Py_VISIT(self->input);
+    Py_VISIT(self->input_stream);
     return 0;
 }
 
-static int 
+static int
 Change_clear(Change *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->input);    
+    Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
     return 0;
 }
@@ -443,7 +443,7 @@ Change_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = Change_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OOO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
 
@@ -452,24 +452,24 @@ Change_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
-     
+
     return (PyObject *)self;
 }
 
 static PyObject * Change_getServer(Change* self) { GET_SERVER };
 static PyObject * Change_getStream(Change* self) { GET_STREAM };
-static PyObject * Change_setMul(Change *self, PyObject *arg) { SET_MUL };	
-static PyObject * Change_setAdd(Change *self, PyObject *arg) { SET_ADD };	
-static PyObject * Change_setSub(Change *self, PyObject *arg) { SET_SUB };	
-static PyObject * Change_setDiv(Change *self, PyObject *arg) { SET_DIV };	
+static PyObject * Change_setMul(Change *self, PyObject *arg) { SET_MUL };
+static PyObject * Change_setAdd(Change *self, PyObject *arg) { SET_ADD };
+static PyObject * Change_setSub(Change *self, PyObject *arg) { SET_SUB };
+static PyObject * Change_setDiv(Change *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Change_play(Change *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Change_stop(Change *self) { STOP };
@@ -585,4 +585,4 @@ Change_members,             /* tp_members */
 0,      /* tp_init */
 0,                         /* tp_alloc */
 Change_new,                 /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/sfplayermodule.c b/src/objects/sfplayermodule.c
index 4e6c5ef..0a9c2e7 100644
--- a/src/objects/sfplayermodule.c
+++ b/src/objects/sfplayermodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -58,9 +58,9 @@ MYFLT max_arr(MYFLT *a,int n)
     MYFLT m;
     m=*a;
     for (i=1; i<n; i++) {
-        if (m < *(a+i)) 
+        if (m < *(a+i))
             m = *(a+i);
-    }    
+    }
     return m;
 }
 
@@ -70,9 +70,9 @@ MYFLT min_arr(MYFLT *a,int n)
     MYFLT m;
     m=*a;
     for (i=1; i<n; i++) {
-        if (m > *(a+i)) 
+        if (m > *(a+i))
             m = *(a+i);
-    }    
+    }
     return m;
 }
 
@@ -87,12 +87,12 @@ SfPlayer_readframes_i(SfPlayer *self) {
     else
         sp = Stream_getData((Stream *)self->speed_stream)[0];
     delta = MYFABS(sp) * self->srScale;
-    
+
     buflen = (int)(self->bufsize * delta + 0.5) + 64;
     totlen = self->sndChnls*buflen;
     MYFLT buffer[totlen];
     MYFLT buffer2[self->sndChnls][buflen];
-    
+
     if (sp > 0) { /* forward reading */
         if (self->pointerPos >= self->sndSize) {
             self->pointerPos -= self->sndSize - self->startPos;
@@ -100,19 +100,19 @@ SfPlayer_readframes_i(SfPlayer *self) {
                 PyObject_CallMethod((PyObject *)self, "stop", NULL);
                 for (i=0; i<(self->bufsize * self->sndChnls); i++) {
                     self->samplesBuffer[i] = 0.0;
-                }    
+                }
                 for (i=0; i<self->bufsize; i++) {
                     self->trigsBuffer[i] = 0.0;
                 }
                 return;
             }
-        }        
+        }
         index = (int)self->pointerPos;
         sf_seek(self->sf, index, SEEK_SET); /* sets position pointer in the file */
 
         /* fill a buffer with enough samples to satisfy speed reading */
         /* if not enough samples left in the file */
-        if ((index+buflen) > self->sndSize) {   
+        if ((index+buflen) > self->sndSize) {
             shortbuflen = self->sndSize - index;
             pad = (buflen-shortbuflen)*self->sndChnls;
             SF_READ(self->sf, buffer, shortbuflen*self->sndChnls);
@@ -128,16 +128,16 @@ SfPlayer_readframes_i(SfPlayer *self) {
                 for (i=0; i<(pad); i++) {
                     buffer[i+shortbuflen*self->sndChnls] = buftemp[i];
                 }
-            }    
+            }
         }
         else /* without zero padding */
             SF_READ(self->sf, buffer, totlen);
-    
+
         /* de-interleave samples */
         for (i=0; i<totlen; i++) {
             buffer2[i%self->sndChnls][(int)(i/self->sndChnls)] = buffer[i];
         }
-    
+
         /* fill samplesBuffer with samples */
         for (i=0; i<self->bufsize; i++) {
             self->trigsBuffer[i] = 0.0;
@@ -146,7 +146,7 @@ SfPlayer_readframes_i(SfPlayer *self) {
             frac = bufpos - bufindex;
             for (j=0; j<self->sndChnls; j++) {
                 self->samplesBuffer[i+(j*self->bufsize)] = (*self->interp_func_ptr)(buffer2[j], bufindex, frac, buflen);
-            }    
+            }
             self->pointerPos += delta;
         }
         if (self->pointerPos >= self->sndSize)
@@ -165,16 +165,16 @@ SfPlayer_readframes_i(SfPlayer *self) {
                 PyObject_CallMethod((PyObject *)self, "stop", NULL);
                 for (i=0; i<(self->bufsize * self->sndChnls); i++) {
                     self->samplesBuffer[i] = 0.0;
-                }    
+                }
                 for (i=0; i<self->bufsize; i++) {
                     self->trigsBuffer[i] = 0.0;
                 }
                 return;
             }
         }
-        
+
         index = (int)self->pointerPos + 1;
-        
+
         /* fill a buffer with enough samples to satisfy speed reading */
         /* if not enough samples to read in the file */
         if ((index-buflen) < 0) {
@@ -195,35 +195,35 @@ SfPlayer_readframes_i(SfPlayer *self) {
                     buffer[i] = buftemp[i];
                 }
             }
-            
+
             MYFLT buftemp2[shortbuflen*self->sndChnls];
             sf_seek(self->sf, 0, SEEK_SET); /* sets position pointer in the file */
             SF_READ(self->sf, buftemp2, shortbuflen*self->sndChnls);
             for (i=0; i<(shortbuflen*self->sndChnls); i++) {
                 buffer[i+padlen] = buftemp2[i];
-            }    
+            }
         }
         else /* without zero padding */
             sf_seek(self->sf, index-buflen, SEEK_SET); /* sets position pointer in the file */
             SF_READ(self->sf, buffer, totlen);
-        
+
         /* de-interleave samples */
         for (i=0; i<totlen; i++) {
             buffer2[i%self->sndChnls][(int)(i/self->sndChnls)] = buffer[i];
         }
-        
+
         /* reverse arrays */
         MYFLT swap;
         for (i=0; i<self->sndChnls; i++) {
             int a;
-            int b = buflen; 
+            int b = buflen;
             for (a=0; a<--b; a++) { //increment a and decrement b until they meet eachother
                 swap = buffer2[i][a];       //put what's in a into swap space
                 buffer2[i][a] = buffer2[i][b];    //put what's in b into a
                 buffer2[i][b] = swap;       //put what's in the swap (a) into b
             }
         }
-        
+
         /* fill stream buffer with samples */
         for (i=0; i<self->bufsize; i++) {
             self->trigsBuffer[i] = 0.0;
@@ -247,7 +247,7 @@ SfPlayer_readframes_i(SfPlayer *self) {
             self->samplesBuffer[i] = 0.0;
         }
     }
-}    
+}
 
 static void
 SfPlayer_setProcMode(SfPlayer *self)
@@ -258,26 +258,26 @@ SfPlayer_setProcMode(SfPlayer *self)
 static void
 SfPlayer_compute_next_data_frame(SfPlayer *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
 SfPlayer_traverse(SfPlayer *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->speed);    
-    Py_VISIT(self->speed_stream);    
-    Py_VISIT(self->trig_stream);    
+    Py_VISIT(self->speed);
+    Py_VISIT(self->speed_stream);
+    Py_VISIT(self->trig_stream);
     return 0;
 }
 
-static int 
+static int
 SfPlayer_clear(SfPlayer *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->speed);    
-    Py_CLEAR(self->speed_stream);    
-    Py_CLEAR(self->trig_stream);    
+    Py_CLEAR(self->speed);
+    Py_CLEAR(self->speed_stream);
+    Py_CLEAR(self->trig_stream);
     return 0;
 }
 
@@ -301,7 +301,7 @@ SfPlayer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *speedtmp=NULL;
     SfPlayer *self;
     self = (SfPlayer *)type->tp_alloc(type, 0);
-    
+
     self->speed = PyFloat_FromDouble(1);
     self->loop = 0;
     self->interp = 2;
@@ -313,20 +313,20 @@ SfPlayer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = SfPlayer_setProcMode;
 
     static char *kwlist[] = {"path", "speed", "loop", "offset", "interp", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_S__OIFI, kwlist, &self->path, &speedtmp, &self->loop, &offset, &self->interp))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     if (speedtmp) {
         PyObject_CallMethod((PyObject *)self, "setSpeed", "O", speedtmp);
     }
 
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     SET_INTERP_POINTER
-    
+
     /* Open the sound file. */
     self->info.format = 0;
     self->sf = sf_open(self->path, SFM_READ, &self->info);
@@ -344,17 +344,17 @@ SfPlayer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
-    }    
+    }
 
     MAKE_NEW_TRIGGER_STREAM(self->trig_stream, &TriggerStreamType, NULL);
     TriggerStream_setData(self->trig_stream, self->trigsBuffer);
-    
+
     self->startPos = offset * self->sr * self->srScale;
     if (self->startPos < 0.0 || self->startPos >= self->sndSize)
         self->startPos = 0.0;
-    
+
     self->pointerPos = self->startPos;
-    
+
     return (PyObject *)self;
 }
 
@@ -363,7 +363,7 @@ static PyObject * SfPlayer_getStream(SfPlayer* self) { GET_STREAM };
 static PyObject * SfPlayer_getTriggerStream(SfPlayer* self) { GET_TRIGGER_STREAM };
 
 static PyObject * SfPlayer_play(SfPlayer *self, PyObject *args, PyObject *kwds)
-{ 
+{
     self->init = 1;
     self->pointerPos = self->startPos;
     PLAY
@@ -382,14 +382,14 @@ static PyObject *
 SfPlayer_setSpeed(SfPlayer *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->speed);
@@ -405,12 +405,12 @@ SfPlayer_setSpeed(SfPlayer *self, PyObject *arg)
         self->speed_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 SfPlayer_setSound(SfPlayer *self, PyObject *arg)
@@ -420,7 +420,7 @@ SfPlayer_setSound(SfPlayer *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->path = PyString_AsString(arg);
 
     sf_close(self->sf);
@@ -436,12 +436,12 @@ SfPlayer_setSound(SfPlayer *self, PyObject *arg)
     self->sndSr = self->info.samplerate;
     //self->sndChnls = self->info.channels;
     self->srScale = self->sndSr / self->sr;
-    
+
     //self->samplesBuffer = (MYFLT *)realloc(self->samplesBuffer, self->bufsize * self->sndChnls * sizeof(MYFLT));
-    
+
     self->startPos = 0.0;
     self->pointerPos = self->startPos;
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -453,9 +453,9 @@ SfPlayer_setLoop(SfPlayer *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->loop = PyInt_AsLong(arg);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -467,14 +467,14 @@ SfPlayer_setOffset(SfPlayer *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     int isNumber = PyNumber_Check(arg);
 
 	if (isNumber == 1) {
 		self->startPos = PyFloat_AsDouble(PyNumber_Float(arg)) * self->sr * self->srScale;
         if (self->startPos < 0.0 || self->startPos >= self->sndSize)
             self->startPos = 0.0;
-    }  
+    }
 
     Py_INCREF(Py_None);
     return Py_None;
@@ -487,15 +487,15 @@ SfPlayer_setInterp(SfPlayer *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     int isNumber = PyNumber_Check(arg);
-    
+
 	if (isNumber == 1) {
 		self->interp = PyInt_AsLong(PyNumber_Int(arg));
-    }  
+    }
 
     SET_INTERP_POINTER
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -504,7 +504,7 @@ MYFLT *
 SfPlayer_getSamplesBuffer(SfPlayer *self)
 {
     return (MYFLT *)self->samplesBuffer;
-}    
+}
 
 static PyMemberDef SfPlayer_members[] = {
 {"server", T_OBJECT_EX, offsetof(SfPlayer, server), 0, "Pyo server."},
@@ -578,7 +578,7 @@ typedef struct {
     pyo_audio_HEAD
     SfPlayer *mainPlayer;
     int modebuffer[2];
-    int chnl; 
+    int chnl;
 } SfPlay;
 
 static void SfPlay_postprocessing_ii(SfPlay *self) { POST_PROCESSING_II };
@@ -596,33 +596,33 @@ SfPlay_setProcMode(SfPlay *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = SfPlay_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = SfPlay_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = SfPlay_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = SfPlay_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = SfPlay_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = SfPlay_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = SfPlay_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = SfPlay_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = SfPlay_postprocessing_revareva;
             break;
     }
@@ -637,7 +637,7 @@ SfPlay_compute_next_data_frame(SfPlay *self)
     tmp = SfPlayer_getSamplesBuffer((SfPlayer *)self->mainPlayer);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -649,11 +649,11 @@ SfPlay_traverse(SfPlay *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 SfPlay_clear(SfPlay *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainPlayer);    
+    Py_CLEAR(self->mainPlayer);
     return 0;
 }
 
@@ -672,45 +672,45 @@ SfPlay_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL, *multmp=NULL, *addtmp=NULL;
     SfPlay *self;
     self = (SfPlay *)type->tp_alloc(type, 0);
-    
+
     self->chnl = 0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, SfPlay_compute_next_data_frame);
     self->mode_func_ptr = SfPlay_setProcMode;
 
     static char *kwlist[] = {"mainPlayer", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iOO", kwlist, &maintmp, &self->chnl, &multmp, &addtmp))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     Py_XDECREF(self->mainPlayer);
     Py_INCREF(maintmp);
     self->mainPlayer = (SfPlayer *)maintmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * SfPlay_getServer(SfPlay* self) { GET_SERVER };
 static PyObject * SfPlay_getStream(SfPlay* self) { GET_STREAM };
-static PyObject * SfPlay_setMul(SfPlay *self, PyObject *arg) { SET_MUL };	
-static PyObject * SfPlay_setAdd(SfPlay *self, PyObject *arg) { SET_ADD };	
-static PyObject * SfPlay_setSub(SfPlay *self, PyObject *arg) { SET_SUB };	
-static PyObject * SfPlay_setDiv(SfPlay *self, PyObject *arg) { SET_DIV };	
+static PyObject * SfPlay_setMul(SfPlay *self, PyObject *arg) { SET_MUL };
+static PyObject * SfPlay_setAdd(SfPlay *self, PyObject *arg) { SET_ADD };
+static PyObject * SfPlay_setSub(SfPlay *self, PyObject *arg) { SET_SUB };
+static PyObject * SfPlay_setDiv(SfPlay *self, PyObject *arg) { SET_DIV };
 
 static PyObject * SfPlay_play(SfPlay *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * SfPlay_out(SfPlay *self, PyObject *args, PyObject *kwds) { OUT };
@@ -874,7 +874,7 @@ SfMarkerShuffler_readframes_i(SfMarkerShuffler *self) {
         sp = Stream_getData((Stream *)self->speed_stream)[0];
 
     delta = MYFABS(sp) * self->srScale;
-    
+
     buflen = (int)(self->bufsize * delta + 0.5) + 64;
     totlen = self->sndChnls*buflen;
     MYFLT buffer[totlen];
@@ -894,7 +894,7 @@ SfMarkerShuffler_readframes_i(SfMarkerShuffler *self) {
         }
         index = (int)self->pointerPos;
         sf_seek(self->sf, index, SEEK_SET); /* sets position pointer in the file */
-        
+
         /* fill a buffer with enough samples to satisfy speed reading */
         /* if not enough samples to read in the file */
         if ((index+buflen) > self->endPos) {
@@ -913,12 +913,12 @@ SfMarkerShuffler_readframes_i(SfMarkerShuffler *self) {
         }
         else /* without wraparound */
             SF_READ(self->sf, buffer, totlen);
-        
+
         /* de-interleave samples */
         for (i=0; i<totlen; i++) {
             buffer2[i%self->sndChnls][(int)(i/self->sndChnls)] = buffer[i];
         }
-        
+
         /* fill data with samples */
         for (i=0; i<self->bufsize; i++) {
             bufpos = self->pointerPos - index;
@@ -926,7 +926,7 @@ SfMarkerShuffler_readframes_i(SfMarkerShuffler *self) {
             frac = bufpos - bufindex;
             for (j=0; j<self->sndChnls; j++) {
                 self->samplesBuffer[i+(j*self->bufsize)] = (*self->interp_func_ptr)(buffer2[j], bufindex, frac, buflen);
-            }    
+            }
             self->pointerPos += delta;
         }
         if (self->pointerPos >= self->endPos) {
@@ -940,9 +940,9 @@ SfMarkerShuffler_readframes_i(SfMarkerShuffler *self) {
             self->lastDir = self->startPos = -1;
             SfMarkerShuffler_chooseNewMark((SfMarkerShuffler *)self, 0);
             self->pointerPos = self->startPos;
-        }    
+        }
         index = (int)self->pointerPos + 1;
-        
+
         /* fill a buffer with enough samples to satisfy speed reading */
         /* if not enough samples to read in the file */
         if ((index-buflen) < self->endPos) {
@@ -957,13 +957,13 @@ SfMarkerShuffler_readframes_i(SfMarkerShuffler *self) {
             for (i=0; i<padlen; i++) {
                 buffer[i] = buftemp[i];
             }
-            
+
             MYFLT buftemp2[shortbuflen*self->sndChnls];
             sf_seek(self->sf, self->endPos, SEEK_SET); /* sets position pointer in the file */
             SF_READ(self->sf, buftemp2, shortbuflen*self->sndChnls);
             for (i=0; i<(shortbuflen*self->sndChnls); i++) {
                 buffer[i+padlen] = buftemp2[i];
-            }    
+            }
         }
         else { /* without wraparound */
             sf_seek(self->sf, index-buflen, SEEK_SET); /* sets position pointer in the file */
@@ -973,19 +973,19 @@ SfMarkerShuffler_readframes_i(SfMarkerShuffler *self) {
         for (i=0; i<totlen; i++) {
             buffer2[i%self->sndChnls][(int)(i/self->sndChnls)] = buffer[i];
         }
-        
+
         /* reverse arrays */
         MYFLT swap;
         for (i=0; i<self->sndChnls; i++) {
             int a;
-            int b = buflen; 
+            int b = buflen;
             for (a=0; a<--b; a++) { //increment a and decrement b until they meet eachother
                 swap = buffer2[i][a];       //put what's in a into swap space
                 buffer2[i][a] = buffer2[i][b];    //put what's in b into a
                 buffer2[i][b] = swap;       //put what's in the swap (a) into b
             }
         }
-        
+
         /* fill stream buffer with samples */
         for (i=0; i<self->bufsize; i++) {
             bufpos = index - self->pointerPos;
@@ -1008,7 +1008,7 @@ SfMarkerShuffler_readframes_i(SfMarkerShuffler *self) {
             self->samplesBuffer[i] = 0.0;
         }
     }
-}    
+}
 
 static void
 SfMarkerShuffler_setProcMode(SfMarkerShuffler *self)
@@ -1019,11 +1019,11 @@ SfMarkerShuffler_setProcMode(SfMarkerShuffler *self)
 static void
 SfMarkerShuffler_compute_next_data_frame(SfMarkerShuffler *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static void
-SfMarkerShuffler_chooseNewMark(SfMarkerShuffler *self, int dir) 
+SfMarkerShuffler_chooseNewMark(SfMarkerShuffler *self, int dir)
 {
     int mark;
     if (dir == 1) {
@@ -1036,7 +1036,7 @@ SfMarkerShuffler_chooseNewMark(SfMarkerShuffler *self, int dir)
             self->startPos = self->nextStartPos;
             self->endPos = self->nextEndPos;
         }
-        
+
         mark = (int)(self->markers_size * (rand()/((MYFLT)(RAND_MAX)+1)));
         self->nextStartPos = self->markers[mark] * self->srScale;
         self->nextEndPos = self->markers[mark+1] * self->srScale;
@@ -1051,7 +1051,7 @@ SfMarkerShuffler_chooseNewMark(SfMarkerShuffler *self, int dir)
             self->startPos = self->nextStartPos;
             self->endPos = self->nextEndPos;
         }
-        
+
         mark = self->markers_size - (int)(self->markers_size * (rand()/((MYFLT)(RAND_MAX)+1)));
         self->nextStartPos = self->markers[mark] * self->srScale;
         self->nextEndPos = self->markers[mark-1] * self->srScale;
@@ -1067,7 +1067,7 @@ SfMarkerShuffler_setMarkers(SfMarkerShuffler *self, PyObject *markerstmp)
     self->markers[0] = 0.;
     for (i=0; i<len; i++) {
         self->markers[i+1] = PyFloat_AsDouble(PyList_GetItem(markerstmp, i));
-    }  
+    }
     self->markers[len+1] = self->sndSize;
     self->markers_size = (int)len+1;
 }
@@ -1076,17 +1076,17 @@ static int
 SfMarkerShuffler_traverse(SfMarkerShuffler *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->speed);    
-    Py_VISIT(self->speed_stream);    
+    Py_VISIT(self->speed);
+    Py_VISIT(self->speed_stream);
     return 0;
 }
 
-static int 
+static int
 SfMarkerShuffler_clear(SfMarkerShuffler *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->speed);    
-    Py_CLEAR(self->speed_stream);    
+    Py_CLEAR(self->speed);
+    Py_CLEAR(self->speed_stream);
     return 0;
 }
 
@@ -1109,7 +1109,7 @@ SfMarkerShuffler_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *speedtmp=NULL, *markerstmp=NULL;
     SfMarkerShuffler *self;
     self = (SfMarkerShuffler *)type->tp_alloc(type, 0);
-    
+
     self->speed = PyFloat_FromDouble(1);
     self->interp = 2;
     self->startPos = -1;
@@ -1121,18 +1121,18 @@ SfMarkerShuffler_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = SfMarkerShuffler_setProcMode;
 
     static char *kwlist[] = {"path", "markers", "speed", "interp", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "sO|Oi", kwlist, &self->path, &markerstmp, &speedtmp, &self->interp))
         Py_RETURN_NONE;
 
     if (speedtmp) {
         PyObject_CallMethod((PyObject *)self, "setSpeed", "O", speedtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     if (self->interp == 0)
         self->interp = 2;
     if (self->interp == 1)
@@ -1143,7 +1143,7 @@ SfMarkerShuffler_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         self->interp_func_ptr = cosine;
     else if (self->interp == 4)
         self->interp_func_ptr = cubic;
-    
+
     /* Open the sound file. */
     self->info.format = 0;
     self->sf = sf_open(self->path, SFM_READ, &self->info);
@@ -1163,7 +1163,7 @@ SfMarkerShuffler_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->samplesBuffer = (MYFLT *)realloc(self->samplesBuffer, self->bufsize * self->sndChnls * sizeof(MYFLT));
 
     Server_generateSeed((Server *)self->server, SFMARKERSHUFFLER_ID);
-    
+
     return (PyObject *)self;
 }
 
@@ -1178,14 +1178,14 @@ static PyObject *
 SfMarkerShuffler_setSpeed(SfMarkerShuffler *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->speed);
@@ -1201,12 +1201,12 @@ SfMarkerShuffler_setSpeed(SfMarkerShuffler *self, PyObject *arg)
         self->speed_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 SfMarkerShuffler_setInterp(SfMarkerShuffler *self, PyObject *arg)
@@ -1215,13 +1215,13 @@ SfMarkerShuffler_setInterp(SfMarkerShuffler *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     int isNumber = PyNumber_Check(arg);
-    
+
 	if (isNumber == 1) {
 		self->interp = PyInt_AsLong(PyNumber_Int(arg));
-    }  
-    
+    }
+
     if (self->interp == 0)
         self->interp = 2;
     if (self->interp == 1)
@@ -1232,7 +1232,7 @@ SfMarkerShuffler_setInterp(SfMarkerShuffler *self, PyObject *arg)
         self->interp_func_ptr = cosine;
     else if (self->interp == 4)
         self->interp_func_ptr = cubic;
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1241,7 +1241,7 @@ MYFLT *
 SfMarkerShuffler_getSamplesBuffer(SfMarkerShuffler *self)
 {
     return (MYFLT *)self->samplesBuffer;
-}    
+}
 
 static PyMemberDef SfMarkerShuffler_members[] = {
 {"server", T_OBJECT_EX, offsetof(SfMarkerShuffler, server), 0, "Pyo server."},
@@ -1310,7 +1310,7 @@ typedef struct {
     pyo_audio_HEAD
     SfMarkerShuffler *mainPlayer;
     int modebuffer[2];
-    int chnl; 
+    int chnl;
 } SfMarkerShuffle;
 
 static void SfMarkerShuffle_postprocessing_ii(SfMarkerShuffle *self) { POST_PROCESSING_II };
@@ -1330,31 +1330,31 @@ SfMarkerShuffle_setProcMode(SfMarkerShuffle *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = SfMarkerShuffle_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = SfMarkerShuffle_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = SfMarkerShuffle_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = SfMarkerShuffle_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = SfMarkerShuffle_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = SfMarkerShuffle_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = SfMarkerShuffle_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = SfMarkerShuffle_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = SfMarkerShuffle_postprocessing_revareva;
             break;
     }
@@ -1369,7 +1369,7 @@ SfMarkerShuffle_compute_next_data_frame(SfMarkerShuffle *self)
     tmp = SfMarkerShuffler_getSamplesBuffer((SfMarkerShuffler *)self->mainPlayer);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1381,11 +1381,11 @@ SfMarkerShuffle_traverse(SfMarkerShuffle *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 SfMarkerShuffle_clear(SfMarkerShuffle *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainPlayer);    
+    Py_CLEAR(self->mainPlayer);
     return 0;
 }
 
@@ -1404,45 +1404,45 @@ SfMarkerShuffle_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL, *multmp=NULL, *addtmp=NULL;
     SfMarkerShuffle *self;
     self = (SfMarkerShuffle *)type->tp_alloc(type, 0);
-    
+
     self->chnl = 0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, SfMarkerShuffle_compute_next_data_frame);
     self->mode_func_ptr = SfMarkerShuffle_setProcMode;
 
     static char *kwlist[] = {"mainPlayer", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iOO", kwlist, &maintmp, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
 
     Py_XDECREF(self->mainPlayer);
     Py_INCREF(maintmp);
     self->mainPlayer = (SfMarkerShuffler *)maintmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * SfMarkerShuffle_getServer(SfMarkerShuffle* self) { GET_SERVER };
 static PyObject * SfMarkerShuffle_getStream(SfMarkerShuffle* self) { GET_STREAM };
-static PyObject * SfMarkerShuffle_setMul(SfMarkerShuffle *self, PyObject *arg) { SET_MUL };	
-static PyObject * SfMarkerShuffle_setAdd(SfMarkerShuffle *self, PyObject *arg) { SET_ADD };	
-static PyObject * SfMarkerShuffle_setSub(SfMarkerShuffle *self, PyObject *arg) { SET_SUB };	
-static PyObject * SfMarkerShuffle_setDiv(SfMarkerShuffle *self, PyObject *arg) { SET_DIV };	
+static PyObject * SfMarkerShuffle_setMul(SfMarkerShuffle *self, PyObject *arg) { SET_MUL };
+static PyObject * SfMarkerShuffle_setAdd(SfMarkerShuffle *self, PyObject *arg) { SET_ADD };
+static PyObject * SfMarkerShuffle_setSub(SfMarkerShuffle *self, PyObject *arg) { SET_SUB };
+static PyObject * SfMarkerShuffle_setDiv(SfMarkerShuffle *self, PyObject *arg) { SET_DIV };
 
 static PyObject * SfMarkerShuffle_play(SfMarkerShuffle *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * SfMarkerShuffle_out(SfMarkerShuffle *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1602,19 +1602,19 @@ SfMarkerLooper_readframes_i(SfMarkerLooper *self) {
     MYFLT sp, frac, bufpos, delta, tmp;
     int i, j, totlen, buflen, shortbuflen, bufindex;
     sf_count_t index;
-   
-    if (self->modebuffer[0] == 0) 
+
+    if (self->modebuffer[0] == 0)
         sp = PyFloat_AS_DOUBLE(self->speed);
     else
         sp = Stream_getData((Stream *)self->speed_stream)[0];
 
     delta = MYFABS(sp) * self->srScale;
-    
+
     buflen = (int)(self->bufsize * delta + 0.5) + 64;
     totlen = self->sndChnls*buflen;
     MYFLT buffer[totlen];
     MYFLT buffer2[self->sndChnls][buflen];
-    
+
     if (sp > 0) { /* reading forward */
         if (self->startPos == -1 || self->lastDir == 0) {
             self->lastDir = 1;
@@ -1629,13 +1629,13 @@ SfMarkerLooper_readframes_i(SfMarkerLooper *self) {
         }
         index = (int)self->pointerPos;
         sf_seek(self->sf, index, SEEK_SET); /* sets position pointer in the file */
-        
+
         /* fill a buffer with enough samples to satisfy speed reading */
         /* if not enough samples to read in the file */
         if ((index+buflen) > self->endPos) {
             shortbuflen = self->endPos - index;
             SF_READ(self->sf, buffer, shortbuflen*self->sndChnls);
-            
+
             /* wrap around and read new samples if loop */
             int pad = buflen - shortbuflen;
             int padlen = pad*self->sndChnls;
@@ -1648,12 +1648,12 @@ SfMarkerLooper_readframes_i(SfMarkerLooper *self) {
         }
         else /* without zero padding */
             SF_READ(self->sf, buffer, totlen);
-        
+
         /* de-interleave samples */
         for (i=0; i<totlen; i++) {
             buffer2[i%self->sndChnls][(int)(i/self->sndChnls)] = buffer[i];
         }
-        
+
         /* fill data with samples */
         for (i=0; i<self->bufsize; i++) {
             bufpos = self->pointerPos - index;
@@ -1661,7 +1661,7 @@ SfMarkerLooper_readframes_i(SfMarkerLooper *self) {
             frac = bufpos - bufindex;
             for (j=0; j<self->sndChnls; j++) {
                 self->samplesBuffer[i+(j*self->bufsize)] = (*self->interp_func_ptr)(buffer2[j], bufindex, frac, buflen);
-            }    
+            }
             self->pointerPos += delta;
         }
         if (self->pointerPos >= self->endPos) {
@@ -1675,16 +1675,16 @@ SfMarkerLooper_readframes_i(SfMarkerLooper *self) {
             self->lastDir = self->startPos = -1;
             SfMarkerLooper_chooseNewMark((SfMarkerLooper *)self, 0);
             self->pointerPos = self->startPos;
-        }    
+        }
         index = (int)self->pointerPos + 1;
-        
+
         /* fill a buffer with enough samples to satisfy speed reading */
         /* if not enough samples to read in the file */
         if ((index-buflen) < self->endPos) {
             shortbuflen = index - self->endPos;
             int pad = buflen - shortbuflen;
             int padlen = pad*self->sndChnls;
-            
+
             /* wrap around and read new samples if loop */
             MYFLT buftemp[padlen];
             sf_seek(self->sf, (int)self->nextStartPos-pad, SEEK_SET);
@@ -1692,13 +1692,13 @@ SfMarkerLooper_readframes_i(SfMarkerLooper *self) {
             for (i=0; i<padlen; i++) {
                 buffer[i] = buftemp[i];
             }
-            
+
             MYFLT buftemp2[shortbuflen*self->sndChnls];
             sf_seek(self->sf, self->endPos, SEEK_SET); /* sets position pointer in the file */
             SF_READ(self->sf, buftemp2, shortbuflen*self->sndChnls);
             for (i=0; i<(shortbuflen*self->sndChnls); i++) {
                 buffer[i+padlen] = buftemp2[i];
-            }    
+            }
         }
         else { /* without zero padding */
             sf_seek(self->sf, index-buflen, SEEK_SET); /* sets position pointer in the file */
@@ -1708,19 +1708,19 @@ SfMarkerLooper_readframes_i(SfMarkerLooper *self) {
         for (i=0; i<totlen; i++) {
             buffer2[i%self->sndChnls][(int)(i/self->sndChnls)] = buffer[i];
         }
-        
+
         /* reverse arrays */
         MYFLT swap;
         for (i=0; i<self->sndChnls; i++) {
             int a;
-            int b = buflen; 
+            int b = buflen;
             for (a=0; a<--b; a++) { //increment a and decrement b until they meet eachother
                 swap = buffer2[i][a];       //put what's in a into swap space
                 buffer2[i][a] = buffer2[i][b];    //put what's in b into a
                 buffer2[i][b] = swap;       //put what's in the swap (a) into b
             }
         }
-        
+
         /* fill stream buffer with samples */
         for (i=0; i<self->bufsize; i++) {
             bufpos = index - self->pointerPos;
@@ -1743,7 +1743,7 @@ SfMarkerLooper_readframes_i(SfMarkerLooper *self) {
             self->samplesBuffer[i] = 0.0;
         }
     }
-}    
+}
 
 static void
 SfMarkerLooper_setProcMode(SfMarkerLooper *self)
@@ -1754,14 +1754,14 @@ SfMarkerLooper_setProcMode(SfMarkerLooper *self)
 static void
 SfMarkerLooper_compute_next_data_frame(SfMarkerLooper *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static void
-SfMarkerLooper_chooseNewMark(SfMarkerLooper *self, int dir) 
+SfMarkerLooper_chooseNewMark(SfMarkerLooper *self, int dir)
 {
     int mark;
-    
+
     if (self->modebuffer[1] == 0)
         mark = (int)(PyFloat_AS_DOUBLE(self->mark));
     else
@@ -1770,7 +1770,7 @@ SfMarkerLooper_chooseNewMark(SfMarkerLooper *self, int dir)
     if (mark < 0 || mark >= self->markers_size) {
         mark = self->markers_size / 2;
     }
-    
+
     self->old_mark = mark;
 
     if (dir == 1) {
@@ -1809,7 +1809,7 @@ SfMarkerLooper_setMarkers(SfMarkerLooper *self, PyObject *markerstmp)
     self->markers[0] = 0.;
     for (i=0; i<len; i++) {
         self->markers[i+1] = PyFloat_AsDouble(PyList_GetItem(markerstmp, i));
-    }  
+    }
     self->markers[len+1] = self->sndSize;
     self->markers_size = (int)len+1;
 }
@@ -1818,21 +1818,21 @@ static int
 SfMarkerLooper_traverse(SfMarkerLooper *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->speed);    
-    Py_VISIT(self->speed_stream);    
-    Py_VISIT(self->mark);    
-    Py_VISIT(self->mark_stream);    
+    Py_VISIT(self->speed);
+    Py_VISIT(self->speed_stream);
+    Py_VISIT(self->mark);
+    Py_VISIT(self->mark_stream);
      return 0;
 }
 
-static int 
+static int
 SfMarkerLooper_clear(SfMarkerLooper *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->speed);    
-    Py_CLEAR(self->speed_stream);    
-    Py_CLEAR(self->mark);    
-    Py_CLEAR(self->mark_stream);    
+    Py_CLEAR(self->speed);
+    Py_CLEAR(self->speed_stream);
+    Py_CLEAR(self->mark);
+    Py_CLEAR(self->mark_stream);
     return 0;
 }
 
@@ -1855,7 +1855,7 @@ SfMarkerLooper_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *speedtmp=NULL, *marktmp=NULL, *markerstmp=NULL;
     SfMarkerLooper *self;
     self = (SfMarkerLooper *)type->tp_alloc(type, 0);
-    
+
     self->speed = PyFloat_FromDouble(1);
     self->mark = PyFloat_FromDouble(0);
     self->interp = 2;
@@ -1863,18 +1863,18 @@ SfMarkerLooper_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->endPos = -1;
     self->old_mark = -1;
     self->lastDir = 1;
-    self->modebuffer[0] = 0;	
+    self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, SfMarkerLooper_compute_next_data_frame);
     self->mode_func_ptr = SfMarkerLooper_setProcMode;
 
     static char *kwlist[] = {"path", "markers", "speed", "mark", "interp", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "sO|OOi", kwlist, &self->path, &markerstmp, &speedtmp, &marktmp, &self->interp))
         Py_RETURN_NONE;
-    
+
     if (speedtmp) {
         PyObject_CallMethod((PyObject *)self, "setSpeed", "O", speedtmp);
     }
@@ -1882,11 +1882,11 @@ SfMarkerLooper_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (marktmp) {
         PyObject_CallMethod((PyObject *)self, "setMark", "O", marktmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     if (self->interp == 0)
         self->interp = 2;
     if (self->interp == 1)
@@ -1897,7 +1897,7 @@ SfMarkerLooper_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         self->interp_func_ptr = cosine;
     else if (self->interp == 4)
         self->interp_func_ptr = cubic;
-    
+
     /* Open the sound file. */
     self->info.format = 0;
     self->sf = sf_open(self->path, SFM_READ, &self->info);
@@ -1910,14 +1910,14 @@ SfMarkerLooper_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->sndSr = self->info.samplerate;
     self->sndChnls = self->info.channels;
     self->srScale = self->sndSr / self->sr;
-    
+
     Py_INCREF(markerstmp);
     SfMarkerLooper_setMarkers((SfMarkerLooper *)self, markerstmp);
-    
+
     self->samplesBuffer = (MYFLT *)realloc(self->samplesBuffer, self->bufsize * self->sndChnls * sizeof(MYFLT));
-    
+
     Server_generateSeed((Server *)self->server, SFMARKERLOOPER_ID);
-    
+
     return (PyObject *)self;
 }
 
@@ -1932,14 +1932,14 @@ static PyObject *
 SfMarkerLooper_setSpeed(SfMarkerLooper *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->speed);
@@ -1955,23 +1955,23 @@ SfMarkerLooper_setSpeed(SfMarkerLooper *self, PyObject *arg)
         self->speed_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 SfMarkerLooper_setMark(SfMarkerLooper *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->mark);
@@ -1990,7 +1990,7 @@ SfMarkerLooper_setMark(SfMarkerLooper *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 SfMarkerLooper_setInterp(SfMarkerLooper *self, PyObject *arg)
@@ -1999,13 +1999,13 @@ SfMarkerLooper_setInterp(SfMarkerLooper *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     int isNumber = PyNumber_Check(arg);
-    
+
 	if (isNumber == 1) {
 		self->interp = PyInt_AsLong(PyNumber_Int(arg));
-    }  
-    
+    }
+
     if (self->interp == 0)
         self->interp = 2;
     if (self->interp == 1)
@@ -2016,7 +2016,7 @@ SfMarkerLooper_setInterp(SfMarkerLooper *self, PyObject *arg)
         self->interp_func_ptr = cosine;
     else if (self->interp == 4)
         self->interp_func_ptr = cubic;
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2025,7 +2025,7 @@ MYFLT *
 SfMarkerLooper_getSamplesBuffer(SfMarkerLooper *self)
 {
     return (MYFLT *)self->samplesBuffer;
-}    
+}
 
 static PyMemberDef SfMarkerLooper_members[] = {
     {"server", T_OBJECT_EX, offsetof(SfMarkerLooper, server), 0, "Pyo server."},
@@ -2096,7 +2096,7 @@ typedef struct {
     pyo_audio_HEAD
     SfMarkerLooper *mainPlayer;
     int modebuffer[2];
-    int chnl; 
+    int chnl;
 } SfMarkerLoop;
 
 static void SfMarkerLoop_postprocessing_ii(SfMarkerLoop *self) { POST_PROCESSING_II };
@@ -2114,33 +2114,33 @@ SfMarkerLoop_setProcMode(SfMarkerLoop *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = SfMarkerLoop_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = SfMarkerLoop_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = SfMarkerLoop_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = SfMarkerLoop_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = SfMarkerLoop_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = SfMarkerLoop_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = SfMarkerLoop_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = SfMarkerLoop_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = SfMarkerLoop_postprocessing_revareva;
             break;
     }
@@ -2155,7 +2155,7 @@ SfMarkerLoop_compute_next_data_frame(SfMarkerLoop *self)
     tmp = SfMarkerLooper_getSamplesBuffer((SfMarkerLooper *)self->mainPlayer);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2167,11 +2167,11 @@ SfMarkerLoop_traverse(SfMarkerLoop *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 SfMarkerLoop_clear(SfMarkerLoop *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainPlayer);    
+    Py_CLEAR(self->mainPlayer);
     return 0;
 }
 
@@ -2190,45 +2190,45 @@ SfMarkerLoop_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL, *multmp=NULL, *addtmp=NULL;
     SfMarkerLoop *self;
     self = (SfMarkerLoop *)type->tp_alloc(type, 0);
-    
+
     self->chnl = 0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, SfMarkerLoop_compute_next_data_frame);
     self->mode_func_ptr = SfMarkerLoop_setProcMode;
 
     static char *kwlist[] = {"mainPlayer", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iOO", kwlist, &maintmp, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainPlayer);
     Py_INCREF(maintmp);
     self->mainPlayer = (SfMarkerLooper *)maintmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * SfMarkerLoop_getServer(SfMarkerLoop* self) { GET_SERVER };
 static PyObject * SfMarkerLoop_getStream(SfMarkerLoop* self) { GET_STREAM };
-static PyObject * SfMarkerLoop_setMul(SfMarkerLoop *self, PyObject *arg) { SET_MUL };	
-static PyObject * SfMarkerLoop_setAdd(SfMarkerLoop *self, PyObject *arg) { SET_ADD };	
-static PyObject * SfMarkerLoop_setSub(SfMarkerLoop *self, PyObject *arg) { SET_SUB };	
-static PyObject * SfMarkerLoop_setDiv(SfMarkerLoop *self, PyObject *arg) { SET_DIV };	
+static PyObject * SfMarkerLoop_setMul(SfMarkerLoop *self, PyObject *arg) { SET_MUL };
+static PyObject * SfMarkerLoop_setAdd(SfMarkerLoop *self, PyObject *arg) { SET_ADD };
+static PyObject * SfMarkerLoop_setSub(SfMarkerLoop *self, PyObject *arg) { SET_SUB };
+static PyObject * SfMarkerLoop_setDiv(SfMarkerLoop *self, PyObject *arg) { SET_DIV };
 
 static PyObject * SfMarkerLoop_play(SfMarkerLoop *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * SfMarkerLoop_out(SfMarkerLoop *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2346,4 +2346,4 @@ PyTypeObject SfMarkerLoopType = {
     0,      /* tp_init */
     0,                         /* tp_alloc */
     SfMarkerLoop_new,                 /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/sigmodule.c b/src/objects/sigmodule.c
index 7cd4cf0..dcc0aa0 100644
--- a/src/objects/sigmodule.c
+++ b/src/objects/sigmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -47,33 +47,33 @@ Sig_setProcMode(Sig *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Sig_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Sig_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Sig_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Sig_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Sig_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Sig_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Sig_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Sig_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Sig_postprocessing_revareva;
             break;
     }
@@ -94,7 +94,7 @@ Sig_compute_next_data_frame(Sig *self)
         for (i=0; i<self->bufsize; i++) {
             self->data[i] = vals[i];
         }
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -102,17 +102,17 @@ static int
 Sig_traverse(Sig *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->value);    
-    Py_VISIT(self->value_stream);    
+    Py_VISIT(self->value);
+    Py_VISIT(self->value_stream);
     return 0;
 }
 
-static int 
+static int
 Sig_clear(Sig *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->value);    
-    Py_CLEAR(self->value_stream);    
+    Py_CLEAR(self->value);
+    Py_CLEAR(self->value_stream);
     return 0;
 }
 
@@ -131,7 +131,7 @@ Sig_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *valuetmp=NULL, *multmp=NULL, *addtmp=NULL;
     Sig *self;
     self = (Sig *)type->tp_alloc(type, 0);
-    
+
     self->value = PyFloat_FromDouble(0.0);
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
@@ -142,28 +142,28 @@ Sig_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = Sig_setProcMode;
 
     static char *kwlist[] = {"value", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &valuetmp, &multmp, &addtmp))
-        Py_RETURN_NONE; 
+        Py_RETURN_NONE;
 
     if (valuetmp) {
         PyObject_CallMethod((PyObject *)self, "setValue", "O", valuetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
-    
+
     Sig_compute_next_data_frame((Sig *)self);
-    
+
     return (PyObject *)self;
 }
 
@@ -171,14 +171,14 @@ static PyObject *
 Sig_setValue(Sig *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
     Py_DECREF(self->value);
@@ -194,17 +194,17 @@ Sig_setValue(Sig *self, PyObject *arg)
         self->value_stream = (Stream *)streamtmp;
         self->modebuffer[2] = 1;
     }
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject * Sig_getServer(Sig* self) { GET_SERVER };
 static PyObject * Sig_getStream(Sig* self) { GET_STREAM };
-static PyObject * Sig_setMul(Sig *self, PyObject *arg) { SET_MUL };	
-static PyObject * Sig_setAdd(Sig *self, PyObject *arg) { SET_ADD };	
-static PyObject * Sig_setSub(Sig *self, PyObject *arg) { SET_SUB };	
-static PyObject * Sig_setDiv(Sig *self, PyObject *arg) { SET_DIV };	
+static PyObject * Sig_setMul(Sig *self, PyObject *arg) { SET_MUL };
+static PyObject * Sig_setAdd(Sig *self, PyObject *arg) { SET_ADD };
+static PyObject * Sig_setSub(Sig *self, PyObject *arg) { SET_SUB };
+static PyObject * Sig_setDiv(Sig *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Sig_play(Sig *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Sig_out(Sig *self, PyObject *args, PyObject *kwds) { OUT };
@@ -358,7 +358,7 @@ SigTo_generates_i(SigTo *self) {
             for (i=0; i<self->bufsize; i++)
                 self->data[i] = self->currentValue = self->lastValue = value;
         }
-        else {        
+        else {
             for (i=0; i<self->bufsize; i++) {
                 if (self->timeCount == (self->timeStep - 1)) {
                     self->currentValue = value;
@@ -367,13 +367,13 @@ SigTo_generates_i(SigTo *self) {
                 else if (self->timeCount < self->timeStep) {
                     self->currentValue += self->stepVal;
                     self->timeCount++;
-                }    
+                }
                 self->data[i] = self->currentValue;
             }
         }
     }
     else {
-        MYFLT *vals = Stream_getData((Stream *)self->value_stream);        
+        MYFLT *vals = Stream_getData((Stream *)self->value_stream);
         if (self->timeStep <= 0) {
             for (i=0; i<self->bufsize; i++) {
                 value = vals[i];
@@ -388,8 +388,8 @@ SigTo_generates_i(SigTo *self) {
                     self->timeStep = (long)(self->time * self->sr);
                     self->stepVal = (value - self->currentValue) / self->timeStep;
                     self->lastValue = value;
-                }    
-            
+                }
+
                 if (self->timeCount == (self->timeStep - 1)) {
                     self->currentValue = value;
                     self->timeCount++;
@@ -397,7 +397,7 @@ SigTo_generates_i(SigTo *self) {
                 else if (self->timeCount < self->timeStep) {
                     self->currentValue += self->stepVal;
                     self->timeCount++;
-                }    
+                }
                 self->data[i] = self->currentValue;
             }
         }
@@ -421,33 +421,33 @@ SigTo_setProcMode(SigTo *self)
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
     self->proc_func_ptr = SigTo_generates_i;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = SigTo_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = SigTo_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = SigTo_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = SigTo_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = SigTo_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = SigTo_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = SigTo_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = SigTo_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = SigTo_postprocessing_revareva;
             break;
     }
@@ -456,7 +456,7 @@ SigTo_setProcMode(SigTo *self)
 static void
 SigTo_compute_next_data_frame(SigTo *self)
 {
-    (*self->proc_func_ptr)(self);  
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -464,17 +464,17 @@ static int
 SigTo_traverse(SigTo *self, visitproc visit, void *arg)
 {
     pyo_VISIT
-    Py_VISIT(self->value);    
-    Py_VISIT(self->value_stream);    
+    Py_VISIT(self->value);
+    Py_VISIT(self->value_stream);
     return 0;
 }
 
-static int 
+static int
 SigTo_clear(SigTo *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->value);    
-    Py_CLEAR(self->value_stream);    
+    Py_CLEAR(self->value);
+    Py_CLEAR(self->value_stream);
     return 0;
 }
 
@@ -502,16 +502,16 @@ SigTo_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, SigTo_compute_next_data_frame);
     self->mode_func_ptr = SigTo_setProcMode;
 
     static char *kwlist[] = {"value", "time", "init", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_OFOO, kwlist, &valuetmp, &timetmp, &inittmp, &multmp, &addtmp))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     if (valuetmp) {
         PyObject_CallMethod((PyObject *)self, "setValue", "O", valuetmp);
     }
@@ -519,26 +519,26 @@ SigTo_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (timetmp) {
         PyObject_CallMethod((PyObject *)self, "setTime", "O", timetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->lastValue = self->currentValue = inittmp;
     self->timeStep = (long)(self->time * self->sr);
-    
+
     (*self->mode_func_ptr)(self);
 
     for(i=0; i<self->bufsize; i++) {
         self->data[i] = self->currentValue;
     }
-    
+
     return (PyObject *)self;
 }
 
@@ -546,14 +546,14 @@ static PyObject *
 SigTo_setValue(SigTo *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
     Py_DECREF(self->value);
@@ -569,39 +569,39 @@ SigTo_setValue(SigTo *self, PyObject *arg)
         self->value_stream = (Stream *)streamtmp;
         self->modebuffer[2] = 1;
     }
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 SigTo_setTime(SigTo *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	if (isNumber == 1) {
 		self->time = PyFloat_AS_DOUBLE(PyNumber_Float(tmp));
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject * SigTo_getServer(SigTo* self) { GET_SERVER };
 static PyObject * SigTo_getStream(SigTo* self) { GET_STREAM };
-static PyObject * SigTo_setMul(SigTo *self, PyObject *arg) { SET_MUL };	
-static PyObject * SigTo_setAdd(SigTo *self, PyObject *arg) { SET_ADD };	
-static PyObject * SigTo_setSub(SigTo *self, PyObject *arg) { SET_SUB };	
-static PyObject * SigTo_setDiv(SigTo *self, PyObject *arg) { SET_DIV };	
+static PyObject * SigTo_setMul(SigTo *self, PyObject *arg) { SET_MUL };
+static PyObject * SigTo_setAdd(SigTo *self, PyObject *arg) { SET_ADD };
+static PyObject * SigTo_setSub(SigTo *self, PyObject *arg) { SET_SUB };
+static PyObject * SigTo_setDiv(SigTo *self, PyObject *arg) { SET_DIV };
 
 static PyObject * SigTo_play(SigTo *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * SigTo_stop(SigTo *self) { STOP };
@@ -751,9 +751,9 @@ VarPort_generates_i(VarPort *self) {
         self->timeCount = 0;
         self->stepVal = (self->value - self->currentValue) / (self->timeStep+1);
         self->lastValue = self->value;
-    }    
-   
-    if (self->flag == 1) { 
+    }
+
+    if (self->flag == 1) {
         for (i=0; i<self->bufsize; i++) {
             if (self->timeCount >= self->timeStep)
                 self->currentValue = self->value;
@@ -770,7 +770,7 @@ VarPort_generates_i(VarPort *self) {
             self->data[i] = self->currentValue;
         }
     }
-    
+
     if (self->timeCount >= self->timeout && self->flag == 1) {
         self->flag = 0;
         if (self->callable != Py_None) {
@@ -787,7 +787,7 @@ VarPort_generates_i(VarPort *self) {
                 PyErr_Print();
                 return;
             }
-        }   
+        }
     }
 }
 
@@ -806,35 +806,35 @@ VarPort_setProcMode(VarPort *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = VarPort_generates_i;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = VarPort_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = VarPort_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = VarPort_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = VarPort_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = VarPort_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = VarPort_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = VarPort_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = VarPort_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = VarPort_postprocessing_revareva;
             break;
     }
@@ -843,7 +843,7 @@ VarPort_setProcMode(VarPort *self)
 static void
 VarPort_compute_next_data_frame(VarPort *self)
 {
-    (*self->proc_func_ptr)(self);  
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -856,7 +856,7 @@ VarPort_traverse(VarPort *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 VarPort_clear(VarPort *self)
 {
     pyo_CLEAR
@@ -881,8 +881,8 @@ VarPort_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *valuetmp=NULL, *timetmp=NULL, *calltmp=NULL, *argtmp=NULL, *multmp=NULL, *addtmp=NULL;
     VarPort *self;
     self = (VarPort *)type->tp_alloc(type, 0);
-   
-    self->flag = 1; 
+
+    self->flag = 1;
     self->time = 0.025;
     self->timeStep = (long)(self->time * self->sr);
     self->timeout = (long)((self->time + 0.1) * self->sr);
@@ -899,22 +899,22 @@ VarPort_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = VarPort_setProcMode;
 
     static char *kwlist[] = {"value", "time", "init", "callable", "arg", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_OFOOOO, kwlist, &valuetmp, &timetmp, &inittmp, &calltmp, &argtmp, &multmp, &addtmp))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     if (valuetmp) {
         PyObject_CallMethod((PyObject *)self, "setValue", "O", valuetmp);
     }
-    
+
     if (timetmp) {
         PyObject_CallMethod((PyObject *)self, "setTime", "O", timetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
@@ -930,17 +930,17 @@ VarPort_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         Py_INCREF(argtmp);
         self->arg = argtmp;
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->lastValue = self->currentValue = inittmp;
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     for(i=0; i<self->bufsize; i++) {
         self->data[i] = self->currentValue;
     }
-    
+
     return (PyObject *)self;
 }
 
@@ -948,37 +948,37 @@ static PyObject *
 VarPort_setValue(VarPort *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	if (isNumber == 1)
 		self->value = PyFloat_AsDouble(PyNumber_Float(tmp));
     else
         self->value = self->lastValue;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 VarPort_setTime(VarPort *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	if (isNumber == 1) {
@@ -986,37 +986,37 @@ VarPort_setTime(VarPort *self, PyObject *arg)
         self->timeStep = (long)(self->time * self->sr);
         self->timeout = (long)((self->time + 0.1) * self->sr);
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 VarPort_setFunction(VarPort *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (! PyCallable_Check(arg)) {
         PyErr_SetString(PyExc_TypeError, "The function attribute must be callable.");
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     tmp = arg;
     Py_XDECREF(self->callable);
     Py_INCREF(tmp);
     self->callable = tmp;
-  
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject * VarPort_getServer(VarPort* self) { GET_SERVER };
 static PyObject * VarPort_getStream(VarPort* self) { GET_STREAM };
-static PyObject * VarPort_setMul(VarPort *self, PyObject *arg) { SET_MUL };	
-static PyObject * VarPort_setAdd(VarPort *self, PyObject *arg) { SET_ADD };	
-static PyObject * VarPort_setSub(VarPort *self, PyObject *arg) { SET_SUB };	
-static PyObject * VarPort_setDiv(VarPort *self, PyObject *arg) { SET_DIV };	
+static PyObject * VarPort_setMul(VarPort *self, PyObject *arg) { SET_MUL };
+static PyObject * VarPort_setAdd(VarPort *self, PyObject *arg) { SET_ADD };
+static PyObject * VarPort_setSub(VarPort *self, PyObject *arg) { SET_SUB };
+static PyObject * VarPort_setDiv(VarPort *self, PyObject *arg) { SET_DIV };
 
 static PyObject * VarPort_play(VarPort *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * VarPort_stop(VarPort *self) { STOP };
@@ -1136,4 +1136,3 @@ PyTypeObject VarPortType = {
     0,                         /* tp_alloc */
     VarPort_new,                 /* tp_new */
 };
-
diff --git a/src/objects/tablemodule.c b/src/objects/tablemodule.c
index 3852057..d4169c2 100644
--- a/src/objects/tablemodule.c
+++ b/src/objects/tablemodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -53,13 +53,13 @@ MYFLT *
 TableStream_getData(TableStream *self)
 {
     return (MYFLT *)self->data;
-}    
+}
 
 void
 TableStream_setData(TableStream *self, MYFLT *data)
 {
     self->data = data;
-}    
+}
 
 int
 TableStream_getSize(TableStream *self)
@@ -71,7 +71,7 @@ void
 TableStream_setSize(TableStream *self, int size)
 {
     self->size = size;
-}    
+}
 
 double
 TableStream_getSamplingRate(TableStream *self)
@@ -83,7 +83,7 @@ void
 TableStream_setSamplingRate(TableStream *self, double sr)
 {
     self->samplingRate = sr;
-}    
+}
 
 PyTypeObject TableStreamType = {
 PyObject_HEAD_INIT(NULL)
@@ -139,15 +139,15 @@ static void
 HarmTable_generate(HarmTable *self) {
     int i, j, ampsize;
     MYFLT factor, amplitude, val;
-    
+
     ampsize = PyList_Size(self->amplist);
     MYFLT array[ampsize];
     for(j=0; j<ampsize; j++) {
         array[j] =  PyFloat_AS_DOUBLE(PyNumber_Float(PyList_GET_ITEM(self->amplist, j)));
-    }    
-    
+    }
+
     factor = 1. / (self->size * 0.5) * PI;
-    
+
     for(i=0; i<self->size; i++) {
         val = 0;
         for(j=0; j<ampsize; j++) {
@@ -160,7 +160,7 @@ HarmTable_generate(HarmTable *self) {
     }
 
     val = self->data[0];
-    self->data[self->size] = val;  
+    self->data[self->size] = val;
 }
 
 static int
@@ -171,7 +171,7 @@ HarmTable_traverse(HarmTable *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 HarmTable_clear(HarmTable *self)
 {
     pyo_table_CLEAR
@@ -193,9 +193,9 @@ HarmTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *amplist=NULL;
     HarmTable *self;
     self = (HarmTable *)type->tp_alloc(type, 0);
-    
+
     self->server = PyServer_get_server();
-    
+
     self->amplist = PyList_New(0);
     PyList_Append(self->amplist, PyFloat_FromDouble(1.));
     self->size = 8192;
@@ -203,10 +203,10 @@ HarmTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     MAKE_NEW_TABLESTREAM(self->tablestream, &TableStreamType, NULL);
 
     static char *kwlist[] = {"list", "size", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|Oi", kwlist, &amplist, &self->size))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     if (amplist) {
         Py_INCREF(amplist);
         Py_DECREF(self->amplist);
@@ -244,6 +244,9 @@ static PyObject * HarmTable_getTable(HarmTable *self) { GET_TABLE };
 static PyObject * HarmTable_getViewTable(HarmTable *self, PyObject *args, PyObject *kwds) { GET_VIEW_TABLE };
 static PyObject * HarmTable_put(HarmTable *self, PyObject *args, PyObject *kwds) { TABLE_PUT };
 static PyObject * HarmTable_get(HarmTable *self, PyObject *args, PyObject *kwds) { TABLE_GET };
+static PyObject * HarmTable_add(HarmTable *self, PyObject *arg) { TABLE_ADD };
+static PyObject * HarmTable_sub(HarmTable *self, PyObject *arg) { TABLE_SUB };
+static PyObject * HarmTable_mul(HarmTable *self, PyObject *arg) { TABLE_MUL };
 
 static PyObject *
 HarmTable_setSize(HarmTable *self, PyObject *value)
@@ -252,19 +255,19 @@ HarmTable_setSize(HarmTable *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the size attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyInt_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The size attribute value must be an integer.");
         return PyInt_FromLong(-1);
     }
-    
-    self->size = PyInt_AsLong(value); 
+
+    self->size = PyInt_AsLong(value);
 
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
-    
+
     HarmTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -282,18 +285,18 @@ HarmTable_replace(HarmTable *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the list attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyList_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The amplitude list attribute value must be a list.");
         return PyInt_FromLong(-1);
     }
-    
+
     Py_INCREF(value);
     Py_DECREF(self->amplist);
-    self->amplist = value; 
-    
+    self->amplist = value;
+
     HarmTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -329,6 +332,9 @@ static PyMethodDef HarmTable_methods[] = {
 {"put", (PyCFunction)HarmTable_put, METH_VARARGS|METH_KEYWORDS, "Puts a value at specified position in the table."},
 {"get", (PyCFunction)HarmTable_get, METH_VARARGS|METH_KEYWORDS, "Gets the value at specified position in the table."},
 {"replace", (PyCFunction)HarmTable_replace, METH_O, "Sets the harmonics amplitude list and generates a new waveform table."},
+{"add", (PyCFunction)HarmTable_add, METH_O, "Performs table addition."},
+{"sub", (PyCFunction)HarmTable_sub, METH_O, "Performs table substraction."},
+{"mul", (PyCFunction)HarmTable_mul, METH_O, "Performs table multiplication."},
 {NULL}  /* Sentinel */
 };
 
@@ -386,18 +392,18 @@ static void
 ChebyTable_generate(ChebyTable *self) {
     int i, j, ampsize, halfsize;
     MYFLT amplitude, val, ihalfsize, index, x;
-    
+
     ampsize = PyList_Size(self->amplist);
     if (ampsize > 12)
         ampsize = 12;
     MYFLT array[ampsize];
     for(j=0; j<ampsize; j++) {
         array[j] =  PyFloat_AS_DOUBLE(PyNumber_Float(PyList_GET_ITEM(self->amplist, j)));
-    }    
-    
+    }
+
     halfsize = self->size / 2;
     ihalfsize = 1.0 / halfsize;
-    
+
     x = 0.0;
     for(i=0; i<self->size; i++) {
         val = 0;
@@ -446,9 +452,9 @@ ChebyTable_generate(ChebyTable *self) {
         }
         self->data[i] = val;
     }
-    
+
     val = self->data[self->size-1];
-    self->data[self->size] = val;  
+    self->data[self->size] = val;
 }
 
 static int
@@ -459,7 +465,7 @@ ChebyTable_traverse(ChebyTable *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 ChebyTable_clear(ChebyTable *self)
 {
     pyo_table_CLEAR
@@ -481,26 +487,26 @@ ChebyTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *amplist=NULL;
     ChebyTable *self;
     self = (ChebyTable *)type->tp_alloc(type, 0);
-    
+
     self->server = PyServer_get_server();
-    
+
     self->amplist = PyList_New(0);
     PyList_Append(self->amplist, PyFloat_FromDouble(1.));
     self->size = 8192;
-    
+
     MAKE_NEW_TABLESTREAM(self->tablestream, &TableStreamType, NULL);
 
     static char *kwlist[] = {"list", "size", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|Oi", kwlist, &amplist, &self->size))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     if (amplist) {
         Py_INCREF(amplist);
         Py_DECREF(self->amplist);
         self->amplist = amplist;
     }
-    
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
     TableStream_setData(self->tablestream, self->data);
@@ -508,7 +514,7 @@ ChebyTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     double sr = PyFloat_AsDouble(PyObject_CallMethod(self->server, "getSamplingRate", NULL));
     TableStream_setSamplingRate(self->tablestream, sr);
-    
+
     return (PyObject *)self;
 }
 
@@ -532,6 +538,9 @@ static PyObject * ChebyTable_getTable(ChebyTable *self) { GET_TABLE };
 static PyObject * ChebyTable_getViewTable(ChebyTable *self, PyObject *args, PyObject *kwds) { GET_VIEW_TABLE };
 static PyObject * ChebyTable_put(ChebyTable *self, PyObject *args, PyObject *kwds) { TABLE_PUT };
 static PyObject * ChebyTable_get(ChebyTable *self, PyObject *args, PyObject *kwds) { TABLE_GET };
+static PyObject * ChebyTable_add(ChebyTable *self, PyObject *arg) { TABLE_ADD };
+static PyObject * ChebyTable_sub(ChebyTable *self, PyObject *arg) { TABLE_SUB };
+static PyObject * ChebyTable_mul(ChebyTable *self, PyObject *arg) { TABLE_MUL };
 
 static PyObject *
 ChebyTable_setSize(ChebyTable *self, PyObject *value)
@@ -540,19 +549,19 @@ ChebyTable_setSize(ChebyTable *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the size attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyInt_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The size attribute value must be an integer.");
         return PyInt_FromLong(-1);
     }
-    
-    self->size = PyInt_AsLong(value); 
-    
+
+    self->size = PyInt_AsLong(value);
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
-    
+
     ChebyTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -570,18 +579,18 @@ ChebyTable_replace(ChebyTable *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the list attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyList_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The amplitude list attribute value must be a list.");
         return PyInt_FromLong(-1);
     }
-    
+
     Py_INCREF(value);
     Py_DECREF(self->amplist);
-    self->amplist = value; 
-    
+    self->amplist = value;
+
     ChebyTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -597,7 +606,7 @@ ChebyTable_getNormTable(ChebyTable *self, PyObject *value)
     long sym = PyInt_AS_LONG(value);
     MYFLT samps[halfsize];
     PyObject *samples = PyList_New(halfsize);
-    
+
     if (sym == 0) {
         for (i=0; i<self->size; i++) {
             if (self->data[i] > maxval)
@@ -641,18 +650,18 @@ ChebyTable_getNormTable(ChebyTable *self, PyObject *value)
         if (val > maxval)
             maxval = val;
     }
-    
+
     for (i=0; i<halfsize; i++) {
         val = samps[i];
         if (val == -1.0)
             samps[i] = maxval;
     }
-    
+
     last = samps[0];
     for (i=1; i<halfsize; i++) {
         last = samps[i] = samps[i] + (last - samps[i]) * 0.95;
     }
-    
+
     for (i=0; i<halfsize; i++) {
         PyList_SET_ITEM(samples, i, PyFloat_FromDouble(samps[i]));
     }
@@ -691,6 +700,9 @@ static PyMethodDef ChebyTable_methods[] = {
 {"get", (PyCFunction)ChebyTable_get, METH_VARARGS|METH_KEYWORDS, "Gets the value at specified position in the table."},
 {"replace", (PyCFunction)ChebyTable_replace, METH_O, "Sets the harmonics amplitude list and generates a new waveform table."},
 {"getNormTable", (PyCFunction)ChebyTable_getNormTable, METH_O, "Computes and returns the normalization function for the current polynomial"},
+{"add", (PyCFunction)ChebyTable_add, METH_O, "Performs table addition."},
+{"sub", (PyCFunction)ChebyTable_sub, METH_O, "Performs table substraction."},
+{"mul", (PyCFunction)ChebyTable_mul, METH_O, "Performs table multiplication."},
 {NULL}  /* Sentinel */
 };
 
@@ -747,15 +759,15 @@ static void
 HannTable_generate(HannTable *self) {
     int i, halfSize;
     MYFLT val;
-    
+
     halfSize = self->size / 2 - 1;
-    
+
     for(i=0; i<self->size; i++) {
         val = 0.5 + (MYCOS(TWOPI * (i - halfSize) / self->size) * 0.5);
         self->data[i] = val;
     }
     val = self->data[0];
-    self->data[self->size] = val;  
+    self->data[self->size] = val;
 }
 
 static int
@@ -765,7 +777,7 @@ HannTable_traverse(HannTable *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 HannTable_clear(HannTable *self)
 {
     pyo_table_CLEAR
@@ -785,18 +797,18 @@ HannTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     HannTable *self;
     self = (HannTable *)type->tp_alloc(type, 0);
-    
+
     self->server = PyServer_get_server();
-    
+
     self->size = 8192;
-    
+
     MAKE_NEW_TABLESTREAM(self->tablestream, &TableStreamType, NULL);
- 
+
     static char *kwlist[] = {"size", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|i", kwlist, &self->size))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
 	TableStream_setData(self->tablestream, self->data);
@@ -804,7 +816,7 @@ HannTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     double sr = PyFloat_AsDouble(PyObject_CallMethod(self->server, "getSamplingRate", NULL));
     TableStream_setSamplingRate(self->tablestream, sr);
-   
+
     return (PyObject *)self;
 }
 
@@ -828,6 +840,9 @@ static PyObject * HannTable_getTable(HannTable *self) { GET_TABLE };
 static PyObject * HannTable_getViewTable(HannTable *self, PyObject *args, PyObject *kwds) { GET_VIEW_TABLE };
 static PyObject * HannTable_put(HannTable *self, PyObject *args, PyObject *kwds) { TABLE_PUT };
 static PyObject * HannTable_get(HannTable *self, PyObject *args, PyObject *kwds) { TABLE_GET };
+static PyObject * HannTable_add(HannTable *self, PyObject *arg) { TABLE_ADD };
+static PyObject * HannTable_sub(HannTable *self, PyObject *arg) { TABLE_SUB };
+static PyObject * HannTable_mul(HannTable *self, PyObject *arg) { TABLE_MUL };
 
 static PyObject *
 HannTable_setSize(HannTable *self, PyObject *value)
@@ -836,19 +851,19 @@ HannTable_setSize(HannTable *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the size attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyInt_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The size attribute value must be an integer.");
         return PyInt_FromLong(-1);
     }
-    
-    self->size = PyInt_AsLong(value); 
-    
+
+    self->size = PyInt_AsLong(value);
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
-    
+
     HannTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -888,6 +903,9 @@ static PyMethodDef HannTable_methods[] = {
 {"getSize", (PyCFunction)HannTable_getSize, METH_NOARGS, "Return the size of the table in samples"},
 {"put", (PyCFunction)HannTable_put, METH_VARARGS|METH_KEYWORDS, "Puts a value at specified position in the table."},
 {"get", (PyCFunction)HannTable_get, METH_VARARGS|METH_KEYWORDS, "Gets the value at specified position in the table."},
+{"add", (PyCFunction)HannTable_add, METH_O, "Performs table addition."},
+{"sub", (PyCFunction)HannTable_sub, METH_O, "Performs table substraction."},
+{"mul", (PyCFunction)HannTable_mul, METH_O, "Performs table multiplication."},
 {NULL}  /* Sentinel */
 };
 
@@ -946,11 +964,11 @@ static void
 SincTable_generate(SincTable *self) {
     int i, half, halfMinusOne;
     MYFLT scl, val;
-    
+
     half = self->size / 2;
-    
+
     if (self->windowed) {
-        halfMinusOne = half - 1;    
+        halfMinusOne = half - 1;
         for(i=0; i<self->size; i++) {
             scl = (MYFLT)(i - half) / half * self->freq;
             if (scl == 0.0)
@@ -969,9 +987,9 @@ SincTable_generate(SincTable *self) {
             else
                 val = (MYSIN(scl) / scl);
             self->data[i] = val;
-        }        
+        }
     }
-    self->data[self->size] = self->data[0];  
+    self->data[self->size] = self->data[0];
 }
 
 static int
@@ -981,7 +999,7 @@ SincTable_traverse(SincTable *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 SincTable_clear(SincTable *self)
 {
     pyo_table_CLEAR
@@ -1001,28 +1019,28 @@ SincTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     SincTable *self;
     self = (SincTable *)type->tp_alloc(type, 0);
-    
+
     self->server = PyServer_get_server();
-    
+
     self->size = 8192;
     self->freq = TWOPI;
     self->windowed = 0;
-    
+
     MAKE_NEW_TABLESTREAM(self->tablestream, &TableStreamType, NULL);
 
     static char *kwlist[] = {"freq", "windowed", "size", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE__FII, kwlist, &self->freq, &self->windowed, &self->size))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
 	TableStream_setData(self->tablestream, self->data);
     SincTable_generate(self);
-    
+
     double sr = PyFloat_AsDouble(PyObject_CallMethod(self->server, "getSamplingRate", NULL));
     TableStream_setSamplingRate(self->tablestream, sr);
-    
+
     return (PyObject *)self;
 }
 
@@ -1046,20 +1064,23 @@ static PyObject * SincTable_getTable(SincTable *self) { GET_TABLE };
 static PyObject * SincTable_getViewTable(SincTable *self, PyObject *args, PyObject *kwds) { GET_VIEW_TABLE };
 static PyObject * SincTable_put(SincTable *self, PyObject *args, PyObject *kwds) { TABLE_PUT };
 static PyObject * SincTable_get(SincTable *self, PyObject *args, PyObject *kwds) { TABLE_GET };
+static PyObject * SincTable_add(SincTable *self, PyObject *arg) { TABLE_ADD };
+static PyObject * SincTable_sub(SincTable *self, PyObject *arg) { TABLE_SUB };
+static PyObject * SincTable_mul(SincTable *self, PyObject *arg) { TABLE_MUL };
 
 static PyObject *
 SincTable_setFreq(SincTable *self, PyObject *value)
 {
-    
+
     if (! PyNumber_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The freq attribute value must be a number.");
         return PyInt_FromLong(-1);
     }
-    
-    self->freq = PyFloat_AsDouble(PyNumber_Float(value)); 
-    
+
+    self->freq = PyFloat_AsDouble(PyNumber_Float(value));
+
     SincTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1067,16 +1088,16 @@ SincTable_setFreq(SincTable *self, PyObject *value)
 static PyObject *
 SincTable_setWindowed(SincTable *self, PyObject *value)
 {
-    
+
     if (! PyInt_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The windowed attribute value must be a boolean.");
         return PyInt_FromLong(-1);
     }
-    
-    self->windowed = PyInt_AsLong(value); 
-    
+
+    self->windowed = PyInt_AsLong(value);
+
     SincTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1088,19 +1109,19 @@ SincTable_setSize(SincTable *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the size attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyInt_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The size attribute value must be an integer.");
         return PyInt_FromLong(-1);
     }
-    
-    self->size = PyInt_AsLong(value); 
-    
+
+    self->size = PyInt_AsLong(value);
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
-    
+
     SincTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1142,6 +1163,9 @@ static PyMethodDef SincTable_methods[] = {
     {"setWindowed", (PyCFunction)SincTable_setWindowed, METH_O, "If True, an hanning window is applied on the function."},
     {"put", (PyCFunction)SincTable_put, METH_VARARGS|METH_KEYWORDS, "Puts a value at specified position in the table."},
     {"get", (PyCFunction)SincTable_get, METH_VARARGS|METH_KEYWORDS, "Gets the value at specified position in the table."},
+    {"add", (PyCFunction)SincTable_add, METH_O, "Performs table addition."},
+    {"sub", (PyCFunction)SincTable_sub, METH_O, "Performs table substraction."},
+    {"mul", (PyCFunction)SincTable_mul, METH_O, "Performs table multiplication."},
     {NULL}  /* Sentinel */
 };
 
@@ -1208,7 +1232,7 @@ WinTable_traverse(WinTable *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 WinTable_clear(WinTable *self)
 {
     pyo_table_CLEAR
@@ -1228,19 +1252,19 @@ WinTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     WinTable *self;
     self = (WinTable *)type->tp_alloc(type, 0);
-    
+
     self->server = PyServer_get_server();
-    
+
     self->size = 8192;
     self->type = 2;
-    
+
     MAKE_NEW_TABLESTREAM(self->tablestream, &TableStreamType, NULL);
 
     static char *kwlist[] = {"type", "size", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|ii", kwlist, &self->type, &self->size))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
 	TableStream_setData(self->tablestream, self->data);
@@ -1248,7 +1272,7 @@ WinTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     double sr = PyFloat_AsDouble(PyObject_CallMethod(self->server, "getSamplingRate", NULL));
     TableStream_setSamplingRate(self->tablestream, sr);
-    
+
     return (PyObject *)self;
 }
 
@@ -1272,6 +1296,9 @@ static PyObject * WinTable_getTable(WinTable *self) { GET_TABLE };
 static PyObject * WinTable_getViewTable(WinTable *self, PyObject *args, PyObject *kwds) { GET_VIEW_TABLE };
 static PyObject * WinTable_put(WinTable *self, PyObject *args, PyObject *kwds) { TABLE_PUT };
 static PyObject * WinTable_get(WinTable *self, PyObject *args, PyObject *kwds) { TABLE_GET };
+static PyObject * WinTable_add(WinTable *self, PyObject *arg) { TABLE_ADD };
+static PyObject * WinTable_sub(WinTable *self, PyObject *arg) { TABLE_SUB };
+static PyObject * WinTable_mul(WinTable *self, PyObject *arg) { TABLE_MUL };
 
 static PyObject *
 WinTable_setSize(WinTable *self, PyObject *value)
@@ -1280,19 +1307,19 @@ WinTable_setSize(WinTable *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the size attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyInt_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The size attribute value must be an integer.");
         return PyInt_FromLong(-1);
     }
-    
-    self->size = PyInt_AsLong(value); 
-    
+
+    self->size = PyInt_AsLong(value);
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
-    
+
     WinTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1310,16 +1337,16 @@ WinTable_setType(WinTable *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the type attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyInt_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The type attribute value must be an integer.");
         return PyInt_FromLong(-1);
     }
-    
+
     self->type = PyInt_AsLong(value);
-    
+
     WinTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1354,6 +1381,9 @@ static PyMethodDef WinTable_methods[] = {
 {"setType", (PyCFunction)WinTable_setType, METH_O, "Sets the type of the table."},
 {"put", (PyCFunction)WinTable_put, METH_VARARGS|METH_KEYWORDS, "Puts a value at specified position in the table."},
 {"get", (PyCFunction)WinTable_get, METH_VARARGS|METH_KEYWORDS, "Gets the value at specified position in the table."},
+{"add", (PyCFunction)WinTable_add, METH_O, "Performs table addition."},
+{"sub", (PyCFunction)WinTable_sub, METH_O, "Performs table substraction."},
+{"mul", (PyCFunction)WinTable_mul, METH_O, "Performs table multiplication."},
 {NULL}  /* Sentinel */
 };
 
@@ -1410,7 +1440,7 @@ static void
 ParaTable_generate(ParaTable *self) {
     int i, sizeMinusOne;
     MYFLT rdur, rdur2, level, slope, curve;
-    
+
     sizeMinusOne = self->size - 1;
     rdur = 1.0 / sizeMinusOne;
     rdur2 = rdur * rdur;
@@ -1424,8 +1454,8 @@ ParaTable_generate(ParaTable *self) {
         slope += curve;
     }
 
-    self->data[sizeMinusOne] = self->data[0];  
-    self->data[self->size] = self->data[0];  
+    self->data[sizeMinusOne] = self->data[0];
+    self->data[self->size] = self->data[0];
 }
 
 static int
@@ -1435,7 +1465,7 @@ ParaTable_traverse(ParaTable *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 ParaTable_clear(ParaTable *self)
 {
     pyo_table_CLEAR
@@ -1455,18 +1485,18 @@ ParaTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     ParaTable *self;
     self = (ParaTable *)type->tp_alloc(type, 0);
-    
+
     self->server = PyServer_get_server();
-    
+
     self->size = 8192;
-    
+
     MAKE_NEW_TABLESTREAM(self->tablestream, &TableStreamType, NULL);
- 
+
     static char *kwlist[] = {"size", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|i", kwlist, &self->size))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
 	TableStream_setData(self->tablestream, self->data);
@@ -1474,7 +1504,7 @@ ParaTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     double sr = PyFloat_AsDouble(PyObject_CallMethod(self->server, "getSamplingRate", NULL));
     TableStream_setSamplingRate(self->tablestream, sr);
-   
+
     return (PyObject *)self;
 }
 
@@ -1498,6 +1528,9 @@ static PyObject * ParaTable_getTable(ParaTable *self) { GET_TABLE };
 static PyObject * ParaTable_getViewTable(ParaTable *self, PyObject *args, PyObject *kwds) { GET_VIEW_TABLE };
 static PyObject * ParaTable_put(ParaTable *self, PyObject *args, PyObject *kwds) { TABLE_PUT };
 static PyObject * ParaTable_get(ParaTable *self, PyObject *args, PyObject *kwds) { TABLE_GET };
+static PyObject * ParaTable_add(ParaTable *self, PyObject *arg) { TABLE_ADD };
+static PyObject * ParaTable_sub(ParaTable *self, PyObject *arg) { TABLE_SUB };
+static PyObject * ParaTable_mul(ParaTable *self, PyObject *arg) { TABLE_MUL };
 
 static PyObject *
 ParaTable_setSize(ParaTable *self, PyObject *value)
@@ -1506,19 +1539,19 @@ ParaTable_setSize(ParaTable *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the size attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyInt_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The size attribute value must be an integer.");
         return PyInt_FromLong(-1);
     }
-    
-    self->size = PyInt_AsLong(value); 
-    
+
+    self->size = PyInt_AsLong(value);
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
-    
+
     ParaTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1558,6 +1591,9 @@ static PyMethodDef ParaTable_methods[] = {
     {"getSize", (PyCFunction)ParaTable_getSize, METH_NOARGS, "Return the size of the table in samples"},
     {"put", (PyCFunction)ParaTable_put, METH_VARARGS|METH_KEYWORDS, "Puts a value at specified position in the table."},
     {"get", (PyCFunction)ParaTable_get, METH_VARARGS|METH_KEYWORDS, "Gets the value at specified position in the table."},
+    {"add", (PyCFunction)ParaTable_add, METH_O, "Performs table addition."},
+    {"sub", (PyCFunction)ParaTable_sub, METH_O, "Performs table substraction."},
+    {"mul", (PyCFunction)ParaTable_mul, METH_O, "Performs table multiplication."},
     {NULL}  /* Sentinel */
 };
 
@@ -1618,12 +1654,12 @@ LinTable_generate(LinTable *self) {
     PyObject *tup, *tup2;
     int x1, y1;
     MYFLT x2, y2, diff;
-    
+
     y1 = 0;
     y2 = 0.0;
 
     listsize = PyList_Size(self->pointslist);
-    
+
     for(i=0; i<(listsize-1); i++) {
         tup = PyList_GET_ITEM(self->pointslist, i);
         x1 = PyInt_AsLong(PyNumber_Long(PyTuple_GET_ITEM(tup, 0)));
@@ -1649,7 +1685,7 @@ LinTable_generate(LinTable *self) {
     else {
         self->data[self->size-1] = y2;
         self->data[self->size] = y2;
-    }    
+    }
 }
 
 static int
@@ -1660,7 +1696,7 @@ LinTable_traverse(LinTable *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 LinTable_clear(LinTable *self)
 {
     pyo_table_CLEAR
@@ -1682,19 +1718,19 @@ LinTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *pointslist=NULL;
     LinTable *self;
     self = (LinTable *)type->tp_alloc(type, 0);
-    
+
     self->server = PyServer_get_server();
-    
+
     self->pointslist = PyList_New(0);
     self->size = 8192;
-    
+
     MAKE_NEW_TABLESTREAM(self->tablestream, &TableStreamType, NULL);
 
     static char *kwlist[] = {"list", "size", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|Oi", kwlist, &pointslist, &self->size))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     if (pointslist) {
         Py_INCREF(pointslist);
         Py_DECREF(self->pointslist);
@@ -1704,7 +1740,7 @@ LinTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         PyList_Append(self->pointslist, PyTuple_Pack(2, PyInt_FromLong(0), PyFloat_FromDouble(0.)));
         PyList_Append(self->pointslist, PyTuple_Pack(2, PyInt_FromLong(self->size), PyFloat_FromDouble(1.)));
     }
-    
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
     TableStream_setData(self->tablestream, self->data);
@@ -1712,7 +1748,7 @@ LinTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     double sr = PyFloat_AsDouble(PyObject_CallMethod(self->server, "getSamplingRate", NULL));
     TableStream_setSamplingRate(self->tablestream, sr);
-    
+
     return (PyObject *)self;
 }
 
@@ -1736,6 +1772,9 @@ static PyObject * LinTable_getTable(LinTable *self) { GET_TABLE };
 static PyObject * LinTable_getViewTable(LinTable *self, PyObject *args, PyObject *kwds) { GET_VIEW_TABLE };
 static PyObject * LinTable_put(LinTable *self, PyObject *args, PyObject *kwds) { TABLE_PUT };
 static PyObject * LinTable_get(LinTable *self, PyObject *args, PyObject *kwds) { TABLE_GET };
+static PyObject * LinTable_add(LinTable *self, PyObject *arg) { TABLE_ADD };
+static PyObject * LinTable_sub(LinTable *self, PyObject *arg) { TABLE_SUB };
+static PyObject * LinTable_mul(LinTable *self, PyObject *arg) { TABLE_MUL };
 
 static PyObject *
 LinTable_setSize(LinTable *self, PyObject *value)
@@ -1749,37 +1788,37 @@ LinTable_setSize(LinTable *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the size attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyInt_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The size attribute value must be an integer.");
         return PyInt_FromLong(-1);
     }
 
     old_size = self->size;
-    self->size = PyInt_AsLong(value); 
-    
+    self->size = PyInt_AsLong(value);
+
     factor = (MYFLT)(self->size) / old_size;
-    
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
 
     Py_ssize_t listsize = PyList_Size(self->pointslist);
 
     PyObject *listtemp = PyList_New(0);
-    
+
     for(i=0; i<(listsize); i++) {
         tup = PyList_GET_ITEM(self->pointslist, i);
         x1 = PyInt_AsLong(PyNumber_Long(PyTuple_GET_ITEM(tup, 0)));
         x2 = PyNumber_Float(PyTuple_GET_ITEM(tup, 1));
         PyList_Append(listtemp, PyTuple_Pack(2, PyInt_FromLong((int)(x1*factor)), x2));
     }
-    
+
     Py_INCREF(listtemp);
     Py_DECREF(self->pointslist);
     self->pointslist = listtemp;
-    
+
     LinTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1804,18 +1843,18 @@ LinTable_replace(LinTable *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the list attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyList_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The amplitude list attribute value must be a list of tuples.");
         return PyInt_FromLong(-1);
     }
-    
+
     Py_INCREF(value);
     Py_DECREF(self->pointslist);
-    self->pointslist = value; 
-    
+    self->pointslist = value;
+
     LinTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1852,6 +1891,9 @@ static PyMethodDef LinTable_methods[] = {
 {"get", (PyCFunction)LinTable_get, METH_VARARGS|METH_KEYWORDS, "Gets the value at specified position in the table."},
 {"getPoints", (PyCFunction)LinTable_getPoints, METH_NOARGS, "Return the list of points."},
 {"replace", (PyCFunction)LinTable_replace, METH_O, "Sets the harmonics amplitude list and generates a new waveform table."},
+{"add", (PyCFunction)LinTable_add, METH_O, "Performs table addition."},
+{"sub", (PyCFunction)LinTable_sub, METH_O, "Performs table substraction."},
+{"mul", (PyCFunction)LinTable_mul, METH_O, "Performs table multiplication."},
 {NULL}  /* Sentinel */
 };
 
@@ -1912,12 +1954,12 @@ LogTable_generate(LogTable *self) {
     PyObject *tup, *tup2;
     int x1, y1;
     MYFLT x2, y2, diff, range, logrange, logmin, ratio, low, high;
-    
+
     y1 = 0;
     y2 = 0.0;
-    
+
     listsize = PyList_Size(self->pointslist);
-    
+
     for(i=0; i<(listsize-1); i++) {
         tup = PyList_GET_ITEM(self->pointslist, i);
         x1 = PyInt_AsLong(PyNumber_Long(PyTuple_GET_ITEM(tup, 0)));
@@ -1954,7 +1996,7 @@ LogTable_generate(LogTable *self) {
             for(j=0; j<steps; j++) {
                 ratio = ((x2 + diff * j) - low) / range;
                 self->data[x1+j] = MYPOW(10, ratio * logrange + logmin);
-            }            
+            }
         }
     }
     if (y1 < (self->size-1)) {
@@ -1967,7 +2009,7 @@ LogTable_generate(LogTable *self) {
     else {
         self->data[self->size-1] = y2;
         self->data[self->size] = y2;
-    }    
+    }
 }
 
 static int
@@ -1978,7 +2020,7 @@ LogTable_traverse(LogTable *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 LogTable_clear(LogTable *self)
 {
     pyo_table_CLEAR
@@ -2000,19 +2042,19 @@ LogTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *pointslist=NULL;
     LogTable *self;
     self = (LogTable *)type->tp_alloc(type, 0);
-    
+
     self->server = PyServer_get_server();
-    
+
     self->pointslist = PyList_New(0);
     self->size = 8192;
-    
+
     MAKE_NEW_TABLESTREAM(self->tablestream, &TableStreamType, NULL);
-    
+
     static char *kwlist[] = {"list", "size", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|Oi", kwlist, &pointslist, &self->size))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     if (pointslist) {
         Py_INCREF(pointslist);
         Py_DECREF(self->pointslist);
@@ -2022,15 +2064,15 @@ LogTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         PyList_Append(self->pointslist, PyTuple_Pack(2, PyInt_FromLong(0), PyFloat_FromDouble(0.)));
         PyList_Append(self->pointslist, PyTuple_Pack(2, PyInt_FromLong(self->size), PyFloat_FromDouble(1.)));
     }
-    
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
     TableStream_setData(self->tablestream, self->data);
     LogTable_generate(self);
-    
+
     double sr = PyFloat_AsDouble(PyObject_CallMethod(self->server, "getSamplingRate", NULL));
     TableStream_setSamplingRate(self->tablestream, sr);
-    
+
     return (PyObject *)self;
 }
 
@@ -2054,6 +2096,9 @@ static PyObject * LogTable_getTable(LogTable *self) { GET_TABLE };
 static PyObject * LogTable_getViewTable(LogTable *self, PyObject *args, PyObject *kwds) { GET_VIEW_TABLE };
 static PyObject * LogTable_put(LogTable *self, PyObject *args, PyObject *kwds) { TABLE_PUT };
 static PyObject * LogTable_get(LogTable *self, PyObject *args, PyObject *kwds) { TABLE_GET };
+static PyObject * LogTable_add(LogTable *self, PyObject *arg) { TABLE_ADD };
+static PyObject * LogTable_sub(LogTable *self, PyObject *arg) { TABLE_SUB };
+static PyObject * LogTable_mul(LogTable *self, PyObject *arg) { TABLE_MUL };
 
 static PyObject *
 LogTable_setSize(LogTable *self, PyObject *value)
@@ -2062,42 +2107,42 @@ LogTable_setSize(LogTable *self, PyObject *value)
     PyObject *tup, *x2;
     int old_size, x1;
     MYFLT factor;
-    
+
     if (value == NULL) {
         PyErr_SetString(PyExc_TypeError, "Cannot delete the size attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyInt_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The size attribute value must be an integer.");
         return PyInt_FromLong(-1);
     }
-    
+
     old_size = self->size;
-    self->size = PyInt_AsLong(value); 
-    
+    self->size = PyInt_AsLong(value);
+
     factor = (MYFLT)(self->size) / old_size;
-    
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
-    
+
     Py_ssize_t listsize = PyList_Size(self->pointslist);
-    
+
     PyObject *listtemp = PyList_New(0);
-    
+
     for(i=0; i<(listsize); i++) {
         tup = PyList_GET_ITEM(self->pointslist, i);
         x1 = PyInt_AsLong(PyNumber_Long(PyTuple_GET_ITEM(tup, 0)));
         x2 = PyNumber_Float(PyTuple_GET_ITEM(tup, 1));
         PyList_Append(listtemp, PyTuple_Pack(2, PyInt_FromLong((int)(x1*factor)), x2));
     }
-    
+
     Py_INCREF(listtemp);
     Py_DECREF(self->pointslist);
     self->pointslist = listtemp;
-    
+
     LogTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2122,18 +2167,18 @@ LogTable_replace(LogTable *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the list attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyList_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The amplitude list attribute value must be a list of tuples.");
         return PyInt_FromLong(-1);
     }
-    
+
     Py_INCREF(value);
     Py_DECREF(self->pointslist);
-    self->pointslist = value; 
-    
+    self->pointslist = value;
+
     LogTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2170,6 +2215,9 @@ static PyMethodDef LogTable_methods[] = {
     {"get", (PyCFunction)LogTable_get, METH_VARARGS|METH_KEYWORDS, "Gets the value at specified position in the table."},
     {"getPoints", (PyCFunction)LogTable_getPoints, METH_NOARGS, "Return the list of points."},
     {"replace", (PyCFunction)LogTable_replace, METH_O, "Sets the harmonics amplitude list and generates a new waveform table."},
+    {"add", (PyCFunction)LogTable_add, METH_O, "Performs table addition."},
+    {"sub", (PyCFunction)LogTable_sub, METH_O, "Performs table substraction."},
+    {"mul", (PyCFunction)LogTable_mul, METH_O, "Performs table multiplication."},
     {NULL}  /* Sentinel */
 };
 
@@ -2230,20 +2278,20 @@ CosTable_generate(CosTable *self) {
     PyObject *tup, *tup2;
     int x1, y1;
     MYFLT x2, y2, mu, mu2;
-        
+
     y1 = 0;
     y2 = 0.0;
-    
+
     listsize = PyList_Size(self->pointslist);
-    
+
     for(i=0; i<(listsize-1); i++) {
         tup = PyList_GET_ITEM(self->pointslist, i);
         x1 = PyInt_AsLong(PyNumber_Long(PyTuple_GET_ITEM(tup, 0)));
-        x2 = PyFloat_AsDouble(PyNumber_Float(PyTuple_GET_ITEM(tup, 1)));        
+        x2 = PyFloat_AsDouble(PyNumber_Float(PyTuple_GET_ITEM(tup, 1)));
         tup2 = PyList_GET_ITEM(self->pointslist, i+1);
         y1 = PyInt_AsLong(PyNumber_Long(PyTuple_GET_ITEM(tup2, 0)));
         y2 = PyFloat_AsDouble(PyNumber_Float(PyTuple_GET_ITEM(tup2, 1)));
-        
+
         steps = y1 - x1;
         if (steps <= 0)
             continue;
@@ -2263,7 +2311,7 @@ CosTable_generate(CosTable *self) {
     else {
         self->data[self->size-1] = y2;
         self->data[self->size] = y2;
-    }    
+    }
 }
 
 static int
@@ -2274,7 +2322,7 @@ CosTable_traverse(CosTable *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 CosTable_clear(CosTable *self)
 {
     pyo_table_CLEAR
@@ -2296,19 +2344,19 @@ CosTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *pointslist=NULL;
     CosTable *self;
     self = (CosTable *)type->tp_alloc(type, 0);
-    
+
     self->server = PyServer_get_server();
-    
+
     self->pointslist = PyList_New(0);
     self->size = 8192;
-    
+
     MAKE_NEW_TABLESTREAM(self->tablestream, &TableStreamType, NULL);
 
     static char *kwlist[] = {"list", "size", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|Oi", kwlist, &pointslist, &self->size))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     if (pointslist) {
         Py_INCREF(pointslist);
         Py_DECREF(self->pointslist);
@@ -2318,7 +2366,7 @@ CosTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         PyList_Append(self->pointslist, PyTuple_Pack(2, PyInt_FromLong(0), PyFloat_FromDouble(0.)));
         PyList_Append(self->pointslist, PyTuple_Pack(2, PyInt_FromLong(self->size), PyFloat_FromDouble(1.)));
     }
-    
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
     TableStream_setData(self->tablestream, self->data);
@@ -2326,7 +2374,7 @@ CosTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     double sr = PyFloat_AsDouble(PyObject_CallMethod(self->server, "getSamplingRate", NULL));
     TableStream_setSamplingRate(self->tablestream, sr);
-    
+
     return (PyObject *)self;
 }
 
@@ -2350,6 +2398,9 @@ static PyObject * CosTable_getTable(CosTable *self) { GET_TABLE };
 static PyObject * CosTable_getViewTable(CosTable *self, PyObject *args, PyObject *kwds) { GET_VIEW_TABLE };
 static PyObject * CosTable_put(CosTable *self, PyObject *args, PyObject *kwds) { TABLE_PUT };
 static PyObject * CosTable_get(CosTable *self, PyObject *args, PyObject *kwds) { TABLE_GET };
+static PyObject * CosTable_add(CosTable *self, PyObject *arg) { TABLE_ADD };
+static PyObject * CosTable_sub(CosTable *self, PyObject *arg) { TABLE_SUB };
+static PyObject * CosTable_mul(CosTable *self, PyObject *arg) { TABLE_MUL };
 
 static PyObject *
 CosTable_setSize(CosTable *self, PyObject *value)
@@ -2358,42 +2409,42 @@ CosTable_setSize(CosTable *self, PyObject *value)
     PyObject *tup, *x2;
     int old_size, x1;
     MYFLT factor;
-    
+
     if (value == NULL) {
         PyErr_SetString(PyExc_TypeError, "Cannot delete the size attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyInt_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The size attribute value must be an integer.");
         return PyInt_FromLong(-1);
     }
-    
+
     old_size = self->size;
-    self->size = PyInt_AsLong(value); 
-    
+    self->size = PyInt_AsLong(value);
+
     factor = (MYFLT)(self->size) / old_size;
-    
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
-    
+
     Py_ssize_t listsize = PyList_Size(self->pointslist);
-    
+
     PyObject *listtemp = PyList_New(0);
-    
+
     for(i=0; i<(listsize); i++) {
         tup = PyList_GET_ITEM(self->pointslist, i);
         x1 = PyInt_AsLong(PyNumber_Long(PyTuple_GET_ITEM(tup, 0)));
         x2 = PyNumber_Float(PyTuple_GET_ITEM(tup, 1));
         PyList_Append(listtemp, PyTuple_Pack(2, PyInt_FromLong((int)(x1*factor)), x2));
     }
-    
+
     Py_INCREF(listtemp);
     Py_DECREF(self->pointslist);
     self->pointslist = listtemp;
-    
+
     CosTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2418,18 +2469,18 @@ CosTable_replace(CosTable *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the list attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyList_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The amplitude list attribute value must be a list of tuples.");
         return PyInt_FromLong(-1);
     }
-    
+
     Py_INCREF(value);
     Py_DECREF(self->pointslist);
-    self->pointslist = value; 
-    
+    self->pointslist = value;
+
     CosTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2466,6 +2517,9 @@ static PyMethodDef CosTable_methods[] = {
 {"get", (PyCFunction)CosTable_get, METH_VARARGS|METH_KEYWORDS, "Gets the value at specified position in the table."},
 {"getPoints", (PyCFunction)CosTable_getPoints, METH_NOARGS, "Return the list of points."},
 {"replace", (PyCFunction)CosTable_replace, METH_O, "Sets the harmonics amplitude list and generates a new waveform table."},
+{"add", (PyCFunction)CosTable_add, METH_O, "Performs table addition."},
+{"sub", (PyCFunction)CosTable_sub, METH_O, "Performs table substraction."},
+{"mul", (PyCFunction)CosTable_mul, METH_O, "Performs table multiplication."},
 {NULL}  /* Sentinel */
 };
 
@@ -2526,12 +2580,12 @@ CosLogTable_generate(CosLogTable *self) {
     PyObject *tup, *tup2;
     int x1, y1;
     MYFLT x2, y2, range, logrange, logmin, ratio, low, high, mu;
-    
+
     y1 = 0;
     y2 = 0.0;
-    
+
     listsize = PyList_Size(self->pointslist);
-    
+
     for(i=0; i<(listsize-1); i++) {
         tup = PyList_GET_ITEM(self->pointslist, i);
         x1 = PyInt_AsLong(PyNumber_Long(PyTuple_GET_ITEM(tup, 0)));
@@ -2551,7 +2605,7 @@ CosLogTable_generate(CosLogTable *self) {
             low = x2;
             high = y2;
         }
-        
+
         steps = y1 - x1;
         range = high - low;
         logrange = MYLOG10(high) - MYLOG10(low);
@@ -2570,7 +2624,7 @@ CosLogTable_generate(CosLogTable *self) {
                 mu = x2 *(1.0-mu) + y2*mu;
                 ratio = (mu - low) / range;
                 self->data[x1+j] = MYPOW(10, ratio * logrange + logmin);
-            }            
+            }
         }
     }
     if (y1 < (self->size-1)) {
@@ -2583,7 +2637,7 @@ CosLogTable_generate(CosLogTable *self) {
     else {
         self->data[self->size-1] = y2;
         self->data[self->size] = y2;
-    }    
+    }
 }
 
 static int
@@ -2594,7 +2648,7 @@ CosLogTable_traverse(CosLogTable *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 CosLogTable_clear(CosLogTable *self)
 {
     pyo_table_CLEAR
@@ -2616,19 +2670,19 @@ CosLogTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *pointslist=NULL;
     CosLogTable *self;
     self = (CosLogTable *)type->tp_alloc(type, 0);
-    
+
     self->server = PyServer_get_server();
-    
+
     self->pointslist = PyList_New(0);
     self->size = 8192;
-    
+
     MAKE_NEW_TABLESTREAM(self->tablestream, &TableStreamType, NULL);
-    
+
     static char *kwlist[] = {"list", "size", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "|Oi", kwlist, &pointslist, &self->size))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     if (pointslist) {
         Py_INCREF(pointslist);
         Py_DECREF(self->pointslist);
@@ -2638,15 +2692,15 @@ CosLogTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         PyList_Append(self->pointslist, PyTuple_Pack(2, PyInt_FromLong(0), PyFloat_FromDouble(0.)));
         PyList_Append(self->pointslist, PyTuple_Pack(2, PyInt_FromLong(self->size), PyFloat_FromDouble(1.)));
     }
-    
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
     TableStream_setData(self->tablestream, self->data);
     CosLogTable_generate(self);
-    
+
     double sr = PyFloat_AsDouble(PyObject_CallMethod(self->server, "getSamplingRate", NULL));
     TableStream_setSamplingRate(self->tablestream, sr);
-    
+
     return (PyObject *)self;
 }
 
@@ -2670,6 +2724,9 @@ static PyObject * CosLogTable_getTable(CosLogTable *self) { GET_TABLE };
 static PyObject * CosLogTable_getViewTable(CosLogTable *self, PyObject *args, PyObject *kwds) { GET_VIEW_TABLE };
 static PyObject * CosLogTable_put(CosLogTable *self, PyObject *args, PyObject *kwds) { TABLE_PUT };
 static PyObject * CosLogTable_get(CosLogTable *self, PyObject *args, PyObject *kwds) { TABLE_GET };
+static PyObject * CosLogTable_add(CosLogTable *self, PyObject *arg) { TABLE_ADD };
+static PyObject * CosLogTable_sub(CosLogTable *self, PyObject *arg) { TABLE_SUB };
+static PyObject * CosLogTable_mul(CosLogTable *self, PyObject *arg) { TABLE_MUL };
 
 static PyObject *
 CosLogTable_setSize(CosLogTable *self, PyObject *value)
@@ -2678,42 +2735,42 @@ CosLogTable_setSize(CosLogTable *self, PyObject *value)
     PyObject *tup, *x2;
     int old_size, x1;
     MYFLT factor;
-    
+
     if (value == NULL) {
         PyErr_SetString(PyExc_TypeError, "Cannot delete the size attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyInt_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The size attribute value must be an integer.");
         return PyInt_FromLong(-1);
     }
-    
+
     old_size = self->size;
-    self->size = PyInt_AsLong(value); 
-    
+    self->size = PyInt_AsLong(value);
+
     factor = (MYFLT)(self->size) / old_size;
-    
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
-    
+
     Py_ssize_t listsize = PyList_Size(self->pointslist);
-    
+
     PyObject *listtemp = PyList_New(0);
-    
+
     for(i=0; i<(listsize); i++) {
         tup = PyList_GET_ITEM(self->pointslist, i);
         x1 = PyInt_AsLong(PyNumber_Long(PyTuple_GET_ITEM(tup, 0)));
         x2 = PyNumber_Float(PyTuple_GET_ITEM(tup, 1));
         PyList_Append(listtemp, PyTuple_Pack(2, PyInt_FromLong((int)(x1*factor)), x2));
     }
-    
+
     Py_INCREF(listtemp);
     Py_DECREF(self->pointslist);
     self->pointslist = listtemp;
-    
+
     CosLogTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2738,18 +2795,18 @@ CosLogTable_replace(CosLogTable *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the list attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyList_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The amplitude list attribute value must be a list of tuples.");
         return PyInt_FromLong(-1);
     }
-    
+
     Py_INCREF(value);
     Py_DECREF(self->pointslist);
-    self->pointslist = value; 
-    
+    self->pointslist = value;
+
     CosLogTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2786,6 +2843,9 @@ static PyMethodDef CosLogTable_methods[] = {
     {"get", (PyCFunction)CosLogTable_get, METH_VARARGS|METH_KEYWORDS, "Gets the value at specified position in the table."},
     {"getPoints", (PyCFunction)CosLogTable_getPoints, METH_NOARGS, "Return the list of points."},
     {"replace", (PyCFunction)CosLogTable_replace, METH_O, "Sets the harmonics amplitude list and generates a new waveform table."},
+    {"add", (PyCFunction)CosLogTable_add, METH_O, "Performs table addition."},
+    {"sub", (PyCFunction)CosLogTable_sub, METH_O, "Performs table substraction."},
+    {"mul", (PyCFunction)CosLogTable_mul, METH_O, "Performs table multiplication."},
     {NULL}  /* Sentinel */
 };
 
@@ -2847,24 +2907,24 @@ CurveTable_generate(CurveTable *self) {
     Py_ssize_t listsize;
     PyObject *tup;
     int x1, x2;
-    MYFLT y0, y1, y2, y3; 
+    MYFLT y0, y1, y2, y3;
     MYFLT m0, m1, mu, mu2, mu3;
     MYFLT a0, a1, a2, a3;
 
     for (i=0; i<self->size; i++) {
         self->data[i] = 0.0;
     }
-    
+
     listsize = PyList_Size(self->pointslist);
     int times[listsize+2];
     MYFLT values[listsize+2];
-    
+
     for (i=0; i<listsize; i++) {
         tup = PyList_GET_ITEM(self->pointslist, i);
         times[i+1] = PyInt_AsLong(PyNumber_Long(PyTuple_GET_ITEM(tup, 0)));
-        values[i+1] = PyFloat_AsDouble(PyNumber_Float(PyTuple_GET_ITEM(tup, 1)));        
+        values[i+1] = PyFloat_AsDouble(PyNumber_Float(PyTuple_GET_ITEM(tup, 1)));
     }
-    
+
     // sets imaginary points
     times[0] = times[1] - times[2];
     if (values[1] < values[2])
@@ -2878,12 +2938,12 @@ CurveTable_generate(CurveTable *self) {
         values[endP] = values[endP-1] + values[endP-2];
     else
         values[endP] = values[endP-1] - values[endP-2];
-    
+
     for(i=1; i<listsize; i++) {
         x1 = times[i];
-        x2 = times[i+1];   
+        x2 = times[i+1];
         y0 = values[i-1]; y1 = values[i]; y2 = values[i+1]; y3 = values[i+2];
-        
+
         steps = x2 - x1;
         if (steps <= 0)
             continue;
@@ -2899,11 +2959,11 @@ CurveTable_generate(CurveTable *self) {
             a1 = mu3 - 2.0*mu2 + mu;
             a2 = mu3 - mu2;
             a3 = -2.0*mu3 + 3.0*mu2;
-            
+
             self->data[x1+j] = (a0*y1 + a1*m0 + a2*m1 + a3*y2);
         }
     }
-    
+
     self->data[self->size] = self->data[self->size-1];
 }
 
@@ -2915,7 +2975,7 @@ CurveTable_traverse(CurveTable *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 CurveTable_clear(CurveTable *self)
 {
     pyo_table_CLEAR
@@ -2935,23 +2995,23 @@ static PyObject *
 CurveTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     PyObject *pointslist=NULL;
-    CurveTable *self;    
+    CurveTable *self;
     self = (CurveTable *)type->tp_alloc(type, 0);
-    
+
     self->server = PyServer_get_server();
-    
+
     self->pointslist = PyList_New(0);
     self->size = 8192;
     self->tension = 0.0;
     self->bias = 0.0;
-    
+
     MAKE_NEW_TABLESTREAM(self->tablestream, &TableStreamType, NULL);
 
     static char *kwlist[] = {"list", "tension", "bias", "size", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE__OFFI, kwlist, &pointslist, &self->tension, &self->bias, &self->size))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     if (pointslist) {
         Py_INCREF(pointslist);
         Py_DECREF(self->pointslist);
@@ -2961,7 +3021,7 @@ CurveTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         PyList_Append(self->pointslist, PyTuple_Pack(2, PyInt_FromLong(0), PyFloat_FromDouble(0.)));
         PyList_Append(self->pointslist, PyTuple_Pack(2, PyInt_FromLong(self->size), PyFloat_FromDouble(1.)));
     }
-    
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
     TableStream_setData(self->tablestream, self->data);
@@ -2969,7 +3029,7 @@ CurveTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     double sr = PyFloat_AsDouble(PyObject_CallMethod(self->server, "getSamplingRate", NULL));
     TableStream_setSamplingRate(self->tablestream, sr);
-    
+
     return (PyObject *)self;
 }
 
@@ -2993,45 +3053,48 @@ static PyObject * CurveTable_getTable(CurveTable *self) { GET_TABLE };
 static PyObject * CurveTable_getViewTable(CurveTable *self, PyObject *args, PyObject *kwds) { GET_VIEW_TABLE };
 static PyObject * CurveTable_put(CurveTable *self, PyObject *args, PyObject *kwds) { TABLE_PUT };
 static PyObject * CurveTable_get(CurveTable *self, PyObject *args, PyObject *kwds) { TABLE_GET };
+static PyObject * CurveTable_add(CurveTable *self, PyObject *arg) { TABLE_ADD };
+static PyObject * CurveTable_sub(CurveTable *self, PyObject *arg) { TABLE_SUB };
+static PyObject * CurveTable_mul(CurveTable *self, PyObject *arg) { TABLE_MUL };
 
 static PyObject *
 CurveTable_setTension(CurveTable *self, PyObject *value)
-{    
+{
     if (value == NULL) {
         PyErr_SetString(PyExc_TypeError, "Cannot delete the tension attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyNumber_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The tension attribute value must be a float.");
         return PyInt_FromLong(-1);
     }
-    
-    self->tension = PyFloat_AsDouble(PyNumber_Float(value)); 
+
+    self->tension = PyFloat_AsDouble(PyNumber_Float(value));
 
     CurveTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject *
 CurveTable_setBias(CurveTable *self, PyObject *value)
-{    
+{
     if (value == NULL) {
         PyErr_SetString(PyExc_TypeError, "Cannot delete the bias attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyNumber_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The bias attribute value must be a float.");
         return PyInt_FromLong(-1);
     }
-    
-    self->bias = PyFloat_AsDouble(PyNumber_Float(value)); 
-    
+
+    self->bias = PyFloat_AsDouble(PyNumber_Float(value));
+
     CurveTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -3043,42 +3106,42 @@ CurveTable_setSize(CurveTable *self, PyObject *value)
     PyObject *tup, *x2;
     int old_size, x1;
     MYFLT factor;
-    
+
     if (value == NULL) {
         PyErr_SetString(PyExc_TypeError, "Cannot delete the size attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyInt_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The size attribute value must be an integer.");
         return PyInt_FromLong(-1);
     }
-    
+
     old_size = self->size;
-    self->size = PyInt_AsLong(value); 
-    
+    self->size = PyInt_AsLong(value);
+
     factor = (MYFLT)(self->size) / old_size;
-    
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
-    
+
     Py_ssize_t listsize = PyList_Size(self->pointslist);
-    
+
     PyObject *listtemp = PyList_New(0);
-    
+
     for(i=0; i<(listsize); i++) {
         tup = PyList_GET_ITEM(self->pointslist, i);
         x1 = PyInt_AsLong(PyNumber_Long(PyTuple_GET_ITEM(tup, 0)));
         x2 = PyNumber_Float(PyTuple_GET_ITEM(tup, 1));
         PyList_Append(listtemp, PyTuple_Pack(2, PyInt_FromLong((int)(x1*factor)), x2));
     }
-    
+
     Py_INCREF(listtemp);
     Py_DECREF(self->pointslist);
     self->pointslist = listtemp;
-    
+
     CurveTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -3103,18 +3166,18 @@ CurveTable_replace(CurveTable *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the list attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyList_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The amplitude list attribute value must be a list of tuples.");
         return PyInt_FromLong(-1);
     }
-    
+
     Py_INCREF(value);
     Py_DECREF(self->pointslist);
-    self->pointslist = value; 
-    
+    self->pointslist = value;
+
     CurveTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -3153,6 +3216,9 @@ static PyMethodDef CurveTable_methods[] = {
 {"fadein", (PyCFunction)CurveTable_fadein, METH_VARARGS|METH_KEYWORDS, "Apply a gradual increase in the level of the table's samples."},
 {"fadeout", (PyCFunction)CurveTable_fadeout, METH_VARARGS|METH_KEYWORDS, "Apply a gradual decrease in the level of the table's samples."},
 {"pow", (PyCFunction)CurveTable_pow, METH_VARARGS|METH_KEYWORDS, "Apply a power function on each sample in the table."},
+{"add", (PyCFunction)CurveTable_add, METH_O, "Performs table addition."},
+{"sub", (PyCFunction)CurveTable_sub, METH_O, "Performs table substraction."},
+{"mul", (PyCFunction)CurveTable_mul, METH_O, "Performs table multiplication."},
 {NULL}  /* Sentinel */
 };
 
@@ -3214,29 +3280,29 @@ ExpTable_generate(ExpTable *self) {
     Py_ssize_t listsize;
     PyObject *tup;
     int x1, x2;
-    MYFLT y1, y2, range, inc, pointer, scl; 
-    
+    MYFLT y1, y2, range, inc, pointer, scl;
+
     for (i=0; i<self->size; i++) {
         self->data[i] = 0.0;
     }
-    
+
     listsize = PyList_Size(self->pointslist);
     int times[listsize];
     MYFLT values[listsize];
-    
+
     for (i=0; i<listsize; i++) {
         tup = PyList_GET_ITEM(self->pointslist, i);
         times[i] = PyInt_AsLong(PyNumber_Long(PyTuple_GET_ITEM(tup, 0)));
-        values[i] = PyFloat_AsDouble(PyNumber_Float(PyTuple_GET_ITEM(tup, 1)));        
+        values[i] = PyFloat_AsDouble(PyNumber_Float(PyTuple_GET_ITEM(tup, 1)));
     }
 
     y1 = y2 = 0.0;
     for(i=0; i<(listsize-1); i++) {
         x1 = times[i];
-        x2 = times[i+1];   
-        y1 = values[i]; 
+        x2 = times[i+1];
+        y1 = values[i];
         y2 = values[i+1];
-        
+
         range = y2 - y1;
         steps = x2 - x1;
         if (steps <= 0)
@@ -3258,16 +3324,16 @@ ExpTable_generate(ExpTable *self) {
                     pointer += inc;
                 }
             }
-        }    
+        }
         else {
             for(j=0; j<steps; j++) {
                 scl = MYPOW(pointer, self->exp);
                 self->data[x1+j] = scl * range + y1;
                 pointer += inc;
             }
-        }    
+        }
     }
-    
+
     self->data[self->size] = y2;
 }
 
@@ -3279,7 +3345,7 @@ ExpTable_traverse(ExpTable *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 ExpTable_clear(ExpTable *self)
 {
     pyo_table_CLEAR
@@ -3299,23 +3365,23 @@ static PyObject *
 ExpTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     PyObject *pointslist=NULL;
-    ExpTable *self;    
+    ExpTable *self;
     self = (ExpTable *)type->tp_alloc(type, 0);
-    
+
     self->server = PyServer_get_server();
-    
+
     self->pointslist = PyList_New(0);
     self->size = 8192;
     self->exp = 10.0;
     self->inverse = 1;
-    
+
     MAKE_NEW_TABLESTREAM(self->tablestream, &TableStreamType, NULL);
 
     static char *kwlist[] = {"list", "exp", "inverse", "size", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE__OFII, kwlist, &pointslist, &self->exp, &self->inverse, &self->size))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     if (pointslist) {
         Py_INCREF(pointslist);
         Py_DECREF(self->pointslist);
@@ -3325,7 +3391,7 @@ ExpTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         PyList_Append(self->pointslist, PyTuple_Pack(2, PyInt_FromLong(0), PyFloat_FromDouble(0.)));
         PyList_Append(self->pointslist, PyTuple_Pack(2, PyInt_FromLong(self->size), PyFloat_FromDouble(1.)));
     }
-    
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
     TableStream_setData(self->tablestream, self->data);
@@ -3333,7 +3399,7 @@ ExpTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     double sr = PyFloat_AsDouble(PyObject_CallMethod(self->server, "getSamplingRate", NULL));
     TableStream_setSamplingRate(self->tablestream, sr);
-    
+
     return (PyObject *)self;
 }
 
@@ -3357,45 +3423,48 @@ static PyObject * ExpTable_getTable(ExpTable *self) { GET_TABLE };
 static PyObject * ExpTable_getViewTable(ExpTable *self, PyObject *args, PyObject *kwds) { GET_VIEW_TABLE };
 static PyObject * ExpTable_put(ExpTable *self, PyObject *args, PyObject *kwds) { TABLE_PUT };
 static PyObject * ExpTable_get(ExpTable *self, PyObject *args, PyObject *kwds) { TABLE_GET };
+static PyObject * ExpTable_add(ExpTable *self, PyObject *arg) { TABLE_ADD };
+static PyObject * ExpTable_sub(ExpTable *self, PyObject *arg) { TABLE_SUB };
+static PyObject * ExpTable_mul(ExpTable *self, PyObject *arg) { TABLE_MUL };
 
 static PyObject *
 ExpTable_setExp(ExpTable *self, PyObject *value)
-{    
+{
     if (value == NULL) {
         PyErr_SetString(PyExc_TypeError, "Cannot delete the exp attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyNumber_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The exp attribute value must be a float.");
         return PyInt_FromLong(-1);
     }
-    
-    self->exp = PyFloat_AsDouble(PyNumber_Float(value)); 
-    
+
+    self->exp = PyFloat_AsDouble(PyNumber_Float(value));
+
     ExpTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject *
 ExpTable_setInverse(ExpTable *self, PyObject *value)
-{    
+{
     if (value == NULL) {
         PyErr_SetString(PyExc_TypeError, "Cannot delete the inverse attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyInt_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The inverse attribute value must be a boolean (True or False or 0 or 1).");
         return PyInt_FromLong(-1);
     }
-    
-    self->inverse = PyInt_AsLong(value); 
-    
+
+    self->inverse = PyInt_AsLong(value);
+
     ExpTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -3407,42 +3476,42 @@ ExpTable_setSize(ExpTable *self, PyObject *value)
     PyObject *tup, *x2;
     int old_size, x1;
     MYFLT factor;
-    
+
     if (value == NULL) {
         PyErr_SetString(PyExc_TypeError, "Cannot delete the size attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyInt_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The size attribute value must be an integer.");
         return PyInt_FromLong(-1);
     }
-    
+
     old_size = self->size;
-    self->size = PyInt_AsLong(value); 
-    
+    self->size = PyInt_AsLong(value);
+
     factor = (MYFLT)(self->size) / old_size;
-    
+
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
     TableStream_setSize(self->tablestream, self->size);
-    
+
     Py_ssize_t listsize = PyList_Size(self->pointslist);
-    
+
     PyObject *listtemp = PyList_New(0);
-    
+
     for(i=0; i<(listsize); i++) {
         tup = PyList_GET_ITEM(self->pointslist, i);
         x1 = PyInt_AsLong(PyNumber_Long(PyTuple_GET_ITEM(tup, 0)));
         x2 = PyNumber_Float(PyTuple_GET_ITEM(tup, 1));
         PyList_Append(listtemp, PyTuple_Pack(2, PyInt_FromLong((int)(x1*factor)), x2));
     }
-    
+
     Py_INCREF(listtemp);
     Py_DECREF(self->pointslist);
     self->pointslist = listtemp;
-    
+
     ExpTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -3467,18 +3536,18 @@ ExpTable_replace(ExpTable *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the list attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyList_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The amplitude list attribute value must be a list of tuples.");
         return PyInt_FromLong(-1);
     }
-    
+
     Py_INCREF(value);
     Py_DECREF(self->pointslist);
-    self->pointslist = value; 
-    
+    self->pointslist = value;
+
     ExpTable_generate(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -3516,6 +3585,9 @@ static PyMethodDef ExpTable_methods[] = {
 {"fadein", (PyCFunction)ExpTable_fadein, METH_VARARGS|METH_KEYWORDS, "Apply a gradual increase in the level of the table's samples."},
 {"fadeout", (PyCFunction)ExpTable_fadeout, METH_VARARGS|METH_KEYWORDS, "Apply a gradual decrease in the level of the table's samples."},
 {"pow", (PyCFunction)ExpTable_pow, METH_VARARGS|METH_KEYWORDS, "Apply a power function on each sample in the table."},
+{"add", (PyCFunction)ExpTable_add, METH_O, "Performs table addition."},
+{"sub", (PyCFunction)ExpTable_sub, METH_O, "Performs table substraction."},
+{"mul", (PyCFunction)ExpTable_mul, METH_O, "Performs table multiplication."},
 {NULL}  /* Sentinel */
 };
 
@@ -3583,7 +3655,7 @@ SndTable_loadSound(SndTable *self) {
     unsigned int i, num, num_items, num_chnls, snd_size, start, stop;
     unsigned int num_count = 0;
     MYFLT *tmp;
-        
+
     info.format = 0;
     sf = sf_open(self->path, SFM_READ, &info);
     if (sf == NULL)
@@ -3604,10 +3676,10 @@ SndTable_loadSound(SndTable *self) {
         start = 0;
     else
         start = (unsigned int)(self->start * self->sndSr);
-    
+
     self->size = stop - start;
     num_items = self->size * num_chnls;
-    
+
     /* Allocate space for the data to be read, then read it. */
     self->data = (MYFLT *)realloc(self->data, (self->size + 1) * sizeof(MYFLT));
 
@@ -3621,7 +3693,7 @@ SndTable_loadSound(SndTable *self) {
             for (i=0; i<num; i++) {
                 if ((i % num_chnls) == self->chnl) {
                     self->data[(int)(num_count++)] = tmp[i];
-                }  
+                }
             }
         } while (num == num_items);
         sf_close(sf);
@@ -3635,11 +3707,11 @@ SndTable_loadSound(SndTable *self) {
         for (i=0; i<num_items; i++) {
             if ((i % num_chnls) == self->chnl) {
                 self->data[(int)(i/num_chnls)] = tmp[i];
-            }    
+            }
         }
     }
 
-    self->data[self->size] = self->data[0];  
+    self->data[self->size] = self->data[0];
 
     self->start = 0.0;
     self->stop = -1.0;
@@ -3656,7 +3728,7 @@ SndTable_appendSound(SndTable *self) {
     unsigned int i, num_items, num_chnls, snd_size, start, stop, to_load_size, cross_in_samps, cross_point, index, real_index;
     MYFLT *tmp, *tmp_data;
     MYFLT cross_amp;
-    
+
     info.format = 0;
     sf = sf_open(self->path, SFM_READ, &info);
     if (sf == NULL)
@@ -3667,17 +3739,17 @@ SndTable_appendSound(SndTable *self) {
     snd_size = info.frames;
     self->sndSr = info.samplerate;
     num_chnls = info.channels;
-    
+
     if (self->stop <= 0 || self->stop <= self->start || (self->stop*self->sndSr) > snd_size)
         stop = snd_size;
     else
         stop = (unsigned int)(self->stop * self->sndSr);
-    
+
     if (self->start < 0 || (self->start*self->sndSr) > snd_size)
         start = 0;
     else
         start = (unsigned int)(self->start * self->sndSr);
-    
+
     to_load_size = stop - start;
     num_items = to_load_size * num_chnls;
     cross_in_samps = (unsigned int)(self->crossfade * self->sr);
@@ -3685,11 +3757,11 @@ SndTable_appendSound(SndTable *self) {
         cross_in_samps = to_load_size - 1;
     if (cross_in_samps >= self->size)
         cross_in_samps = self->size - 1;
-    
+
     /* Allocate space for the data to be read, then read it. */
     tmp = (MYFLT *)malloc(num_items * sizeof(MYFLT));
     tmp_data = (MYFLT *)malloc(self->size * sizeof(MYFLT));
-    
+
     sf_seek(sf, start, SEEK_SET);
     SF_READ(sf, tmp, num_items);
     sf_close(sf);
@@ -3703,7 +3775,7 @@ SndTable_appendSound(SndTable *self) {
     cross_point = self->size - cross_in_samps;
     self->size = self->size + to_load_size - cross_in_samps;
     self->data = (MYFLT *)realloc(self->data, (self->size + 1) * sizeof(MYFLT));
-    
+
     if (cross_in_samps != 0) {
         for (i=0; i<cross_point; i++) {
             self->data[i] = tmp_data[i];
@@ -3716,7 +3788,7 @@ SndTable_appendSound(SndTable *self) {
                 index = (int)(i/num_chnls);
                 real_index = cross_point + index;
                 self->data[real_index] = tmp[i];
-            }    
+            }
         }
     }
     else {
@@ -3730,12 +3802,12 @@ SndTable_appendSound(SndTable *self) {
                 }
                 else
                     self->data[real_index] = tmp[i];
-            }    
-        }        
+            }
+        }
     }
-    
-    self->data[self->size] = self->data[0];  
-    
+
+    self->data[self->size] = self->data[0];
+
     self->start = 0.0;
     self->stop = -1.0;
     free(tmp);
@@ -3749,11 +3821,11 @@ static void
 SndTable_prependSound(SndTable *self) {
     SNDFILE *sf;
     SF_INFO info;
-    unsigned int i, num_items, num_chnls, snd_size, start, stop, to_load_size, cross_in_samps, cross_point; 
+    unsigned int i, num_items, num_chnls, snd_size, start, stop, to_load_size, cross_in_samps, cross_point;
     unsigned int index = 0;
     MYFLT *tmp, *tmp_data;
     MYFLT cross_amp;
-    
+
     info.format = 0;
     sf = sf_open(self->path, SFM_READ, &info);
     if (sf == NULL)
@@ -3764,17 +3836,17 @@ SndTable_prependSound(SndTable *self) {
     snd_size = info.frames;
     self->sndSr = info.samplerate;
     num_chnls = info.channels;
-    
+
     if (self->stop <= 0 || self->stop <= self->start || (self->stop*self->sndSr) > snd_size)
         stop = snd_size;
     else
         stop = (unsigned int)(self->stop * self->sndSr);
-    
+
     if (self->start < 0 || (self->start*self->sndSr) > snd_size)
         start = 0;
     else
         start = (unsigned int)(self->start * self->sndSr);
-    
+
     to_load_size = stop - start;
     num_items = to_load_size * num_chnls;
     cross_in_samps = (unsigned int)(self->crossfade * self->sr);
@@ -3782,31 +3854,31 @@ SndTable_prependSound(SndTable *self) {
         cross_in_samps = to_load_size - 1;
     if (cross_in_samps >= self->size)
         cross_in_samps = self->size - 1;
-    
+
     /* Allocate space for the data to be read, then read it. */
     tmp = (MYFLT *)malloc(num_items * sizeof(MYFLT));
     tmp_data = (MYFLT *)malloc(self->size * sizeof(MYFLT));
-    
+
     sf_seek(sf, start, SEEK_SET);
     SF_READ(sf, tmp, num_items);
     sf_close(sf);
-    
+
     for (i=0; i<self->size; i++) {
         tmp_data[i] = self->data[i];
     }
-    
+
     cross_point = to_load_size - cross_in_samps;
     self->size = self->size + to_load_size - cross_in_samps;
     self->data = (MYFLT *)realloc(self->data, (self->size + 1) * sizeof(MYFLT));
-    
+
     if (self->crossfade == 0.0) {
         for (i=0; i<num_items; i++) {
             if ((i % num_chnls) == self->chnl) {
                 index = (int)(i/num_chnls);
                 self->data[index] = tmp[i];
-            }    
+            }
         }
-        
+
     }
     else {
         for (i=0; i<num_items; i++) {
@@ -3818,16 +3890,16 @@ SndTable_prependSound(SndTable *self) {
                 }
                 else
                     self->data[index] = tmp[i];
-            }    
-        }        
+            }
+        }
     }
-    
+
     for (i=(index+1); i<self->size; i++) {
         self->data[i] = tmp_data[i - cross_point];
     }
-        
-    self->data[self->size] = self->data[0];  
-    
+
+    self->data[self->size] = self->data[0];
+
     self->start = 0.0;
     self->stop = -1.0;
     free(tmp);
@@ -3842,12 +3914,12 @@ SndTable_insertSound(SndTable *self) {
     SNDFILE *sf;
     SF_INFO info;
     unsigned int i, num_items, num_chnls, snd_size, start, stop, to_load_size;
-    unsigned int cross_in_samps, cross_point, insert_point, index; 
-    unsigned int read_point = 0; 
+    unsigned int cross_in_samps, cross_point, insert_point, index;
+    unsigned int read_point = 0;
     unsigned int real_index = 0;
     MYFLT *tmp, *tmp_data;
     MYFLT cross_amp;
-    
+
     info.format = 0;
     sf = sf_open(self->path, SFM_READ, &info);
     if (sf == NULL)
@@ -3858,24 +3930,24 @@ SndTable_insertSound(SndTable *self) {
     snd_size = info.frames;
     self->sndSr = info.samplerate;
     num_chnls = info.channels;
-    
+
     if (self->stop <= 0 || self->stop <= self->start || (self->stop*self->sndSr) > snd_size)
         stop = snd_size;
     else
         stop = (unsigned int)(self->stop * self->sndSr);
-    
+
     if (self->start < 0 || (self->start*self->sndSr) > snd_size)
         start = 0;
     else
         start = (unsigned int)(self->start * self->sndSr);
-    
+
     to_load_size = stop - start;
     num_items = to_load_size * num_chnls;
-    
+
     insert_point = (unsigned int)(self->insertPos * self->sr);
     if (insert_point >= self->size)
         insert_point = self->size - 1;
-    
+
     cross_in_samps = (unsigned int)(self->crossfade * self->sr);
     if (cross_in_samps >= (to_load_size/2))
         cross_in_samps = (to_load_size/2) - 5;
@@ -3887,32 +3959,32 @@ SndTable_insertSound(SndTable *self) {
     /* Allocate space for the data to be read, then read it. */
     tmp = (MYFLT *)malloc(num_items * sizeof(MYFLT));
     tmp_data = (MYFLT *)malloc(self->size * sizeof(MYFLT));
-    
+
     sf_seek(sf, start, SEEK_SET);
     SF_READ(sf, tmp, num_items);
     sf_close(sf);
-    
+
     for (i=0; i<self->size; i++) {
         tmp_data[i] = self->data[i];
     }
-    
+
     self->size = self->size + to_load_size - (cross_in_samps * 2);
     self->data = (MYFLT *)realloc(self->data, (self->size + 1) * sizeof(MYFLT));
-    
+
     cross_point = insert_point - cross_in_samps;
-    
+
     for (i=0; i<cross_point; i++) {
         self->data[i] = tmp_data[i];
     }
-    
+
     if (self->crossfade == 0.0) {
         for (i=0; i<num_items; i++) {
             if ((i % num_chnls) == self->chnl) {
                 index = (int)(i/num_chnls);
                 self->data[index+cross_point] = tmp[i];
-            }    
+            }
         }
-        
+
     }
     else {
         for (i=0; i<num_items; i++) {
@@ -3930,18 +4002,18 @@ SndTable_insertSound(SndTable *self) {
                 }
                 else
                     self->data[real_index] = tmp[i];
-            }    
-        }        
+            }
+        }
     }
-    
+
     read_point++;
     for (i=(real_index+1); i<self->size; i++) {
         self->data[i] = tmp_data[read_point];
         read_point++;
     }
-    
-    self->data[self->size] = self->data[0];  
-    
+
+    self->data[self->size] = self->data[0];
+
     self->start = 0.0;
     self->stop = -1.0;
     free(tmp);
@@ -3958,7 +4030,7 @@ SndTable_traverse(SndTable *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 SndTable_clear(SndTable *self)
 {
     pyo_table_CLEAR
@@ -3978,9 +4050,9 @@ SndTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     int i;
     SndTable *self;
-    
+
     self = (SndTable *)type->tp_alloc(type, 0);
-    
+
     self->server = PyServer_get_server();
     self->sr = (MYFLT)PyFloat_AsDouble(PyObject_CallMethod(self->server, "getSamplingRate", NULL));
 
@@ -3992,10 +4064,10 @@ SndTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     MAKE_NEW_TABLESTREAM(self->tablestream, &TableStreamType, NULL);
 
     static char *kwlist[] = {"path", "chnl", "start", "stop", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_S_IFF, kwlist, &self->path, &self->chnl, &self->start, &self->stop))
-        return PyInt_FromLong(-1); 
-    
+        return PyInt_FromLong(-1);
+
     if (strcmp(self->path, "") == 0) {
         self->size = (int)self->sr;
         self->data = (MYFLT *)realloc(self->data, (self->size + 1) * sizeof(MYFLT));
@@ -4013,7 +4085,7 @@ SndTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     else {
         SndTable_loadSound(self);
     }
-    
+
     return (PyObject *)self;
 }
 
@@ -4036,9 +4108,12 @@ static PyObject * SndTable_setTable(SndTable *self, PyObject *arg) { SET_TABLE }
 static PyObject * SndTable_getTable(SndTable *self) { GET_TABLE };
 static PyObject * SndTable_put(SndTable *self, PyObject *args, PyObject *kwds) { TABLE_PUT };
 static PyObject * SndTable_get(SndTable *self, PyObject *args, PyObject *kwds) { TABLE_GET };
+static PyObject * SndTable_add(SndTable *self, PyObject *arg) { TABLE_ADD };
+static PyObject * SndTable_sub(SndTable *self, PyObject *arg) { TABLE_SUB };
+static PyObject * SndTable_mul(SndTable *self, PyObject *arg) { TABLE_MUL };
 
-static PyObject * 
-SndTable_getViewTable(SndTable *self, PyObject *args, PyObject *kwds) { 
+static PyObject *
+SndTable_getViewTable(SndTable *self, PyObject *args, PyObject *kwds) {
     int i, j, y, w, h, h2, step, size;
     int count = 0;
     int yOffset = 0;
@@ -4049,10 +4124,10 @@ SndTable_getViewTable(SndTable *self, PyObject *args, PyObject *kwds) {
     PyObject *sizetmp = NULL;
 
     static char *kwlist[] = {"size", "begin", "end", "yOffset", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE__OFFI, kwlist, &sizetmp, &begin, &end, &yOffset))
-        return PyInt_FromLong(-1); 
-    
+        return PyInt_FromLong(-1);
+
     if (end <= 0.0)
         end = self->size;
     else {
@@ -4091,7 +4166,7 @@ SndTable_getViewTable(SndTable *self, PyObject *args, PyObject *kwds) {
     h2 = h/2;
     step = (int)(size / (MYFLT)(w));
     fstep = (MYFLT)(w) / (size-1);
-    
+
     if (step == 0) {
         samples = PyList_New(size);
         for (i=0; i<size; i++) {
@@ -4139,8 +4214,8 @@ SndTable_getViewTable(SndTable *self, PyObject *args, PyObject *kwds) {
     return samples;
 };
 
-static PyObject * 
-SndTable_getEnvelope(SndTable *self, PyObject *arg) { 
+static PyObject *
+SndTable_getEnvelope(SndTable *self, PyObject *arg) {
     int i, j, step, points;
     long count;
     MYFLT absin, last;
@@ -4150,9 +4225,9 @@ SndTable_getEnvelope(SndTable *self, PyObject *arg) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isInt = PyInt_Check(arg);
-    
+
     if (isInt) {
         count = 0;
         points = PyInt_AsLong(arg);
@@ -4178,68 +4253,68 @@ SndTable_getEnvelope(SndTable *self, PyObject *arg) {
 
 static PyObject *
 SndTable_setSound(SndTable *self, PyObject *args, PyObject *kwds)
-{    
+{
     static char *kwlist[] = {"path", "chnl", "start", "stop", NULL};
-    
+
     MYFLT stoptmp = -1.0;
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_S_IFF, kwlist, &self->path, &self->chnl, &self->start, &stoptmp)) {
         Py_INCREF(Py_None);
         return Py_None;
-    }    
-    
+    }
+
     self->stop = stoptmp;
     SndTable_loadSound(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject *
 SndTable_append(SndTable *self, PyObject *args, PyObject *kwds)
-{    
+{
     static char *kwlist[] = {"path", "crossfade", "chnl", "start", "stop", NULL};
-    
+
     MYFLT stoptmp = -1.0;
     MYFLT crosstmp = 0.0;
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_S_FIFF, kwlist, &self->path, &crosstmp, &self->chnl, &self->start, &stoptmp)) {
         Py_INCREF(Py_None);
         return Py_None;
-    }    
-    
+    }
+
     self->stop = stoptmp;
     if (crosstmp < 0.0)
         self->crossfade = 0.0;
     else
         self->crossfade = crosstmp;
-    
+
     SndTable_appendSound(self);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyObject *
 SndTable_insert(SndTable *self, PyObject *args, PyObject *kwds)
-{    
+{
     static char *kwlist[] = {"path", "pos", "crossfade", "chnl", "start", "stop", NULL};
-    
+
     MYFLT stoptmp = -1.0;
     MYFLT crosstmp = 0.0;
     MYFLT postmp = 0.0;
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_S_FFIFF, kwlist, &self->path, &postmp, &crosstmp, &self->chnl, &self->start, &stoptmp)) {
         Py_INCREF(Py_None);
         return Py_None;
-    }    
-    
+    }
+
     self->stop = stoptmp;
     if (crosstmp < 0.0)
         self->crossfade = 0.0;
     else
         self->crossfade = crosstmp;
-    
+
     if (postmp <= 0.0)
         SndTable_prependSound(self);
     else if (postmp >= ((self->size-1) / self->sndSr))
@@ -4248,7 +4323,7 @@ SndTable_insert(SndTable *self, PyObject *args, PyObject *kwds)
         self->insertPos = postmp;
         SndTable_insertSound(self);
     }
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -4258,7 +4333,7 @@ SndTable_setSize(SndTable *self, PyObject *value)
 {
     Py_ssize_t i;
 
-    self->size = PyInt_AsLong(value); 
+    self->size = PyInt_AsLong(value);
 
     self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
 
@@ -4270,7 +4345,7 @@ SndTable_setSize(SndTable *self, PyObject *value)
     self->stop = -1.0;
     TableStream_setSize(self->tablestream, self->size);
     TableStream_setData(self->tablestream, self->data);
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -4322,6 +4397,9 @@ static PyMethodDef SndTable_methods[] = {
 {"setSize", (PyCFunction)SndTable_setSize, METH_O, "Sets the size of the table in samples"},
 {"getSize", (PyCFunction)SndTable_getSize, METH_NOARGS, "Return the size of the table in samples."},
 {"getRate", (PyCFunction)SndTable_getRate, METH_NOARGS, "Return the frequency (in cps) that reads the sound without pitch transposition."},
+{"add", (PyCFunction)SndTable_add, METH_O, "Performs table addition."},
+{"sub", (PyCFunction)SndTable_sub, METH_O, "Performs table substraction."},
+{"mul", (PyCFunction)SndTable_mul, METH_O, "Performs table multiplication."},
 {NULL}  /* Sentinel */
 };
 
@@ -4366,7 +4444,7 @@ SndTable_members,             /* tp_members */
 0,                         /* tp_alloc */
 SndTable_new,                 /* tp_new */
 0,               /* tp_free */
-0,               /* tp_is_gc */    
+0,               /* tp_is_gc */
 0,               /* tp_bases */
 0,               /* tp_mro */
 0,               /* tp_cache */
@@ -4422,7 +4500,7 @@ NewTable_traverse(NewTable *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 NewTable_clear(NewTable *self)
 {
     pyo_table_CLEAR
@@ -4444,18 +4522,18 @@ NewTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inittmp=NULL;
     NewTable *self;
     self = (NewTable *)type->tp_alloc(type, 0);
-    
+
     self->server = PyServer_get_server();
-    
+
     self->pointer = 0;
     self->feedback = 0.0;
-    
+
     MAKE_NEW_TABLESTREAM(self->tablestream, &TableStreamType, NULL);
 
     static char *kwlist[] = {"length", "init", "feedback", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_F_OF, kwlist, &self->length, &inittmp, &self->feedback))
-        Py_RETURN_NONE; 
+        Py_RETURN_NONE;
 
     self->sr = (MYFLT)PyFloat_AsDouble(PyObject_CallMethod(self->server, "getSamplingRate", NULL));
     self->size = (int)(self->length * self->sr + 0.5);
@@ -4464,16 +4542,16 @@ NewTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     for (i=0; i<(self->size+1); i++) {
         self->data[i] = 0.;
     }
-    
+
     TableStream_setSize(self->tablestream, self->size);
 
     if (inittmp && inittmp != Py_None) {
         PyObject_CallMethod((PyObject *)self, "setTable", "O", inittmp);
     }
-    
+
     TableStream_setData(self->tablestream, self->data);
     TableStream_setSamplingRate(self->tablestream, self->sr);
-    
+
     return (PyObject *)self;
 }
 
@@ -4496,9 +4574,12 @@ static PyObject * NewTable_setTable(NewTable *self, PyObject *arg) { SET_TABLE }
 static PyObject * NewTable_getTable(NewTable *self) { GET_TABLE };
 static PyObject * NewTable_put(NewTable *self, PyObject *args, PyObject *kwds) { TABLE_PUT };
 static PyObject * NewTable_get(NewTable *self, PyObject *args, PyObject *kwds) { TABLE_GET };
+static PyObject * NewTable_add(NewTable *self, PyObject *arg) { TABLE_ADD };
+static PyObject * NewTable_sub(NewTable *self, PyObject *arg) { TABLE_SUB };
+static PyObject * NewTable_mul(NewTable *self, PyObject *arg) { TABLE_MUL };
 
-static PyObject * 
-NewTable_getViewTable(NewTable *self, PyObject *args, PyObject *kwds) { 
+static PyObject *
+NewTable_getViewTable(NewTable *self, PyObject *args, PyObject *kwds) {
     int i, j, y, w, h, h2, step, size;
     int count = 0;
     int yOffset = 0;
@@ -4509,10 +4590,10 @@ NewTable_getViewTable(NewTable *self, PyObject *args, PyObject *kwds) {
     PyObject *sizetmp = NULL;
 
     static char *kwlist[] = {"size", "begin", "end", "yOffset", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE__OFFI, kwlist, &sizetmp, &begin, &end, &yOffset))
-        return PyInt_FromLong(-1); 
-    
+        return PyInt_FromLong(-1);
+
     if (end <= 0.0)
         end = self->size;
     else {
@@ -4551,7 +4632,7 @@ NewTable_getViewTable(NewTable *self, PyObject *args, PyObject *kwds) {
     h2 = h/2;
     step = (int)(size / (MYFLT)(w));
     fstep = (MYFLT)(w) / (size-1);
-    
+
     if (step == 0) {
         samples = PyList_New(size);
         for (i=0; i<size; i++) {
@@ -4631,8 +4712,8 @@ NewTable_setFeedback(NewTable *self, PyObject *value)
             feed = 1.0;
         self->feedback = feed;
     }
-        
-    Py_RETURN_NONE;    
+
+    Py_RETURN_NONE;
 }
 
 static PyMemberDef NewTable_members[] = {
@@ -4666,6 +4747,9 @@ static PyMethodDef NewTable_methods[] = {
 {"getSize", (PyCFunction)NewTable_getSize, METH_NOARGS, "Return the size of the table in samples."},
 {"getLength", (PyCFunction)NewTable_getLength, METH_NOARGS, "Return the length of the table in seconds."},
 {"getRate", (PyCFunction)NewTable_getRate, METH_NOARGS, "Return the frequency (in cps) that reads the sound without pitch transposition."},
+{"add", (PyCFunction)NewTable_add, METH_O, "Performs table addition."},
+{"sub", (PyCFunction)NewTable_sub, METH_O, "Performs table substraction."},
+{"mul", (PyCFunction)NewTable_mul, METH_O, "Performs table multiplication."},
 {NULL}  /* Sentinel */
 };
 
@@ -4732,7 +4816,7 @@ DataTable_traverse(DataTable *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 DataTable_clear(DataTable *self)
 {
     pyo_table_CLEAR
@@ -4754,35 +4838,35 @@ DataTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inittmp=NULL;
     DataTable *self;
     self = (DataTable *)type->tp_alloc(type, 0);
-    
+
     self->server = PyServer_get_server();
-    
+
     self->pointer = 0;
-    
+
     MAKE_NEW_TABLESTREAM(self->tablestream, &TableStreamType, NULL);
 
     static char *kwlist[] = {"size", "init", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "i|O", kwlist, &self->size, &inittmp))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     self->data = (MYFLT *)realloc(self->data, (self->size + 1) * sizeof(MYFLT));
-    
+
     for (i=0; i<(self->size+1); i++) {
         self->data[i] = 0.;
     }
-    
+
     TableStream_setSize(self->tablestream, self->size);
-    
+
     if (inittmp) {
         PyObject_CallMethod((PyObject *)self, "setTable", "O", inittmp);
     }
-    
+
     TableStream_setData(self->tablestream, self->data);
 
     double sr = PyFloat_AsDouble(PyObject_CallMethod(self->server, "getSamplingRate", NULL));
     TableStream_setSamplingRate(self->tablestream, sr);
-    
+
     return (PyObject *)self;
 }
 
@@ -4806,6 +4890,9 @@ static PyObject * DataTable_getTable(DataTable *self) { GET_TABLE };
 static PyObject * DataTable_getViewTable(DataTable *self, PyObject *args, PyObject *kwds) { GET_VIEW_TABLE };
 static PyObject * DataTable_put(DataTable *self, PyObject *args, PyObject *kwds) { TABLE_PUT };
 static PyObject * DataTable_get(DataTable *self, PyObject *args, PyObject *kwds) { TABLE_GET };
+static PyObject * DataTable_add(DataTable *self, PyObject *arg) { TABLE_ADD };
+static PyObject * DataTable_sub(DataTable *self, PyObject *arg) { TABLE_SUB };
+static PyObject * DataTable_mul(DataTable *self, PyObject *arg) { TABLE_MUL };
 
 static PyObject *
 DataTable_getSize(DataTable *self)
@@ -4849,6 +4936,9 @@ static PyMethodDef DataTable_methods[] = {
     {"get", (PyCFunction)DataTable_get, METH_VARARGS|METH_KEYWORDS, "Gets the value at specified position in the table."},
     {"getSize", (PyCFunction)DataTable_getSize, METH_NOARGS, "Return the size of the table in samples."},
     {"getRate", (PyCFunction)DataTable_getRate, METH_NOARGS, "Return the frequency (in cps) that reads the sound without pitch transposition."},
+    {"add", (PyCFunction)DataTable_add, METH_O, "Performs table addition."},
+    {"sub", (PyCFunction)DataTable_sub, METH_O, "Performs table substraction."},
+    {"mul", (PyCFunction)DataTable_mul, METH_O, "Performs table multiplication."},
     {NULL}  /* Sentinel */
 };
 
@@ -4894,65 +4984,298 @@ PyTypeObject DataTableType = {
     DataTable_new,                 /* tp_new */
 };
 
-/******************************/
-/* TableRec object definition */
-/******************************/
+/***********************/
+/* AtanTable structure */
+/***********************/
 typedef struct {
-    pyo_audio_HEAD
-    PyObject *input;
-    Stream *input_stream;
-    NewTable *table;
-    int pointer;
-    int active;
-    MYFLT fadetime;
-    MYFLT fadeInSample;
-    MYFLT *trigsBuffer;
-    TriggerStream *trig_stream;
-    MYFLT *time_buffer_streams;
-    MYFLT *buffer;
-} TableRec;
+    pyo_table_HEAD
+    MYFLT slope;
+} AtanTable;
 
 static void
-TableRec_compute_next_data_frame(TableRec *self)
+AtanTable_generate(AtanTable *self) {
+    int i, hsize;
+    MYFLT drv, invhsize, val, t, fac = 0;
+
+    hsize = self->size / 2;
+    invhsize = 1.0 / hsize;
+
+    drv = 1 - self->slope;
+    drv = drv * drv * drv * PI;
+    for(i=0; i<=hsize; i++) {
+        t = i * invhsize - 1;
+        val = MYATAN2(t, drv);
+        if (i == 0)
+            fac = 1.0 / -val;
+        val = val * fac;
+        self->data[i] = val;
+        self->data[self->size - i] = -val;
+    }
+}
+
+static int
+AtanTable_traverse(AtanTable *self, visitproc visit, void *arg)
 {
-    int i, num, upBound;
-    MYFLT val;
-    int size = PyInt_AsLong(NewTable_getSize((NewTable *)self->table));
+    pyo_table_VISIT
+    return 0;
+}
 
-    for (i=0; i<self->bufsize; i++) {
-        self->trigsBuffer[i] = 0.0;
-    }
+static int
+AtanTable_clear(AtanTable *self)
+{
+    pyo_table_CLEAR
+    return 0;
+}
 
-    if (!self->active) {
-        for (i=0; i<self->bufsize; i++) {
-            self->time_buffer_streams[i] = self->pointer;
-        }
-    }
+static void
+AtanTable_dealloc(AtanTable* self)
+{
+    free(self->data);
+    AtanTable_clear(self);
+    self->ob_type->tp_free((PyObject*)self);
+}
 
-    if ((size - self->pointer) >= self->bufsize)
-        num = self->bufsize;
-    else {
-        num = size - self->pointer;
-        if (self->active == 1) {
-            if (num <= 0)
-                self->trigsBuffer[0] = 1.0;
-            else
-                self->trigsBuffer[num-1] = 1.0;
-            self->active = 0;
-        }    
-    }
+static PyObject *
+AtanTable_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+    AtanTable *self;
+    self = (AtanTable *)type->tp_alloc(type, 0);
 
-    if (self->pointer < size) {   
-        upBound = (int)(size - self->fadeInSample);
-        
-        //MYFLT buffer[num];
-        //memset(&buffer, 0, sizeof(buffer));
-        for (i=0; i<self->bufsize; i++) {
-            self->buffer[i] = 0.0;
-        }
-        MYFLT *in = Stream_getData((Stream *)self->input_stream);
-        
-        for (i=0; i<num; i++) {
+    self->server = PyServer_get_server();
+
+    self->size = 8192;
+    self->slope = 0.5;
+
+    MAKE_NEW_TABLESTREAM(self->tablestream, &TableStreamType, NULL);
+
+    static char *kwlist[] = {"slope", "size", NULL};
+
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_F_I, kwlist, &self->slope, &self->size))
+        Py_RETURN_NONE;
+
+    self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
+    TableStream_setSize(self->tablestream, self->size);
+	TableStream_setData(self->tablestream, self->data);
+    AtanTable_generate(self);
+
+    double sr = PyFloat_AsDouble(PyObject_CallMethod(self->server, "getSamplingRate", NULL));
+    TableStream_setSamplingRate(self->tablestream, sr);
+
+    return (PyObject *)self;
+}
+
+static PyObject * AtanTable_getServer(AtanTable* self) { GET_SERVER };
+static PyObject * AtanTable_getTableStream(AtanTable* self) { GET_TABLE_STREAM };
+static PyObject * AtanTable_setData(AtanTable *self, PyObject *arg) { SET_TABLE_DATA };
+static PyObject * AtanTable_normalize(AtanTable *self) { NORMALIZE };
+static PyObject * AtanTable_reset(AtanTable *self) { TABLE_RESET };
+static PyObject * AtanTable_removeDC(AtanTable *self) { REMOVE_DC };
+static PyObject * AtanTable_reverse(AtanTable *self) { REVERSE };
+static PyObject * AtanTable_invert(AtanTable *self) { INVERT };
+static PyObject * AtanTable_rectify(AtanTable *self) { RECTIFY };
+static PyObject * AtanTable_bipolarGain(AtanTable *self, PyObject *args, PyObject *kwds) { TABLE_BIPOLAR_GAIN };
+static PyObject * AtanTable_lowpass(AtanTable *self, PyObject *args, PyObject *kwds) { TABLE_LOWPASS };
+static PyObject * AtanTable_fadein(AtanTable *self, PyObject *args, PyObject *kwds) { TABLE_FADEIN };
+static PyObject * AtanTable_fadeout(AtanTable *self, PyObject *args, PyObject *kwds) { TABLE_FADEOUT };
+static PyObject * AtanTable_pow(AtanTable *self, PyObject *args, PyObject *kwds) { TABLE_POWER };
+static PyObject * AtanTable_copy(AtanTable *self, PyObject *arg) { COPY };
+static PyObject * AtanTable_setTable(AtanTable *self, PyObject *arg) { SET_TABLE };
+static PyObject * AtanTable_getTable(AtanTable *self) { GET_TABLE };
+static PyObject * AtanTable_getViewTable(AtanTable *self, PyObject *args, PyObject *kwds) { GET_VIEW_TABLE };
+static PyObject * AtanTable_put(AtanTable *self, PyObject *args, PyObject *kwds) { TABLE_PUT };
+static PyObject * AtanTable_get(AtanTable *self, PyObject *args, PyObject *kwds) { TABLE_GET };
+static PyObject * AtanTable_add(AtanTable *self, PyObject *arg) { TABLE_ADD };
+static PyObject * AtanTable_sub(AtanTable *self, PyObject *arg) { TABLE_SUB };
+static PyObject * AtanTable_mul(AtanTable *self, PyObject *arg) { TABLE_MUL };
+
+static PyObject *
+AtanTable_setSlope(AtanTable *self, PyObject *value)
+{
+
+    if (! PyNumber_Check(value)) {
+        PyErr_SetString(PyExc_TypeError, "The slope attribute value must be a number.");
+        return PyInt_FromLong(-1);
+    }
+
+    self->slope = PyFloat_AsDouble(PyNumber_Float(value));
+    if (self->slope < 0.0)
+        self->slope = 0.0;
+    else if (self->slope > 1.0)
+        self->slope = 1.0;
+
+    AtanTable_generate(self);
+
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+
+static PyObject *
+AtanTable_setSize(AtanTable *self, PyObject *value)
+{
+    if (value == NULL) {
+        PyErr_SetString(PyExc_TypeError, "Cannot delete the size attribute.");
+        return PyInt_FromLong(-1);
+    }
+
+    if (! PyInt_Check(value)) {
+        PyErr_SetString(PyExc_TypeError, "The size attribute value must be an integer.");
+        return PyInt_FromLong(-1);
+    }
+
+    self->size = PyInt_AsLong(value);
+
+    self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT));
+    TableStream_setSize(self->tablestream, self->size);
+
+    AtanTable_generate(self);
+
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+
+static PyObject *
+AtanTable_getSize(AtanTable *self)
+{
+    return PyInt_FromLong(self->size);
+};
+
+static PyMemberDef AtanTable_members[] = {
+    {"server", T_OBJECT_EX, offsetof(AtanTable, server), 0, "Pyo server."},
+    {"tablestream", T_OBJECT_EX, offsetof(AtanTable, tablestream), 0, "Table stream object."},
+    {NULL}  /* Sentinel */
+};
+
+static PyMethodDef AtanTable_methods[] = {
+    {"getServer", (PyCFunction)AtanTable_getServer, METH_NOARGS, "Returns server object."},
+    {"copy", (PyCFunction)AtanTable_copy, METH_O, "Copy data from table given in argument."},
+    {"setTable", (PyCFunction)AtanTable_setTable, METH_O, "Sets the table content from a list of floats (must be the same size as the object size)."},
+    {"getTable", (PyCFunction)AtanTable_getTable, METH_NOARGS, "Returns a list of table samples."},
+    {"getViewTable", (PyCFunction)AtanTable_getViewTable, METH_VARARGS|METH_KEYWORDS, "Returns a list of pixel coordinates for drawing the table."},
+    {"getTableStream", (PyCFunction)AtanTable_getTableStream, METH_NOARGS, "Returns table stream object created by this table."},
+    {"setData", (PyCFunction)AtanTable_setData, METH_O, "Sets the table from samples in a text file."},
+    {"normalize", (PyCFunction)AtanTable_normalize, METH_NOARGS, "Normalize table samples between -1 and 1"},
+    {"reset", (PyCFunction)AtanTable_reset, METH_NOARGS, "Resets table samples to 0.0"},
+    {"removeDC", (PyCFunction)AtanTable_removeDC, METH_NOARGS, "Filter out DC offset from the table's data."},
+    {"reverse", (PyCFunction)AtanTable_reverse, METH_NOARGS, "Reverse the table's data."},
+    {"invert", (PyCFunction)AtanTable_invert, METH_NOARGS, "Reverse the table's data in amplitude."},
+    {"rectify", (PyCFunction)AtanTable_rectify, METH_NOARGS, "Positive rectification of the table's data."},
+    {"bipolarGain", (PyCFunction)AtanTable_bipolarGain, METH_VARARGS|METH_KEYWORDS, "Apply different amp values to positive and negative samples."},
+    {"lowpass", (PyCFunction)AtanTable_lowpass, METH_VARARGS|METH_KEYWORDS, "Apply a one-pole lowpass filter on table's samples."},
+    {"fadein", (PyCFunction)AtanTable_fadein, METH_VARARGS|METH_KEYWORDS, "Apply a gradual increase in the level of the table's samples."},
+    {"fadeout", (PyCFunction)AtanTable_fadeout, METH_VARARGS|METH_KEYWORDS, "Apply a gradual decrease in the level of the table's samples."},
+    {"pow", (PyCFunction)AtanTable_pow, METH_VARARGS|METH_KEYWORDS, "Apply a power function on each sample in the table."},
+    {"setSize", (PyCFunction)AtanTable_setSize, METH_O, "Sets the size of the table in samples"},
+    {"getSize", (PyCFunction)AtanTable_getSize, METH_NOARGS, "Return the size of the table in samples"},
+    {"setSlope", (PyCFunction)AtanTable_setSlope, METH_O, "Sets the slope of the atan function."},
+    {"put", (PyCFunction)AtanTable_put, METH_VARARGS|METH_KEYWORDS, "Puts a value at specified position in the table."},
+    {"get", (PyCFunction)AtanTable_get, METH_VARARGS|METH_KEYWORDS, "Gets the value at specified position in the table."},
+    {"add", (PyCFunction)AtanTable_add, METH_O, "Performs table addition."},
+    {"sub", (PyCFunction)AtanTable_sub, METH_O, "Performs table substraction."},
+    {"mul", (PyCFunction)AtanTable_mul, METH_O, "Performs table multiplication."},
+    {NULL}  /* Sentinel */
+};
+
+PyTypeObject AtanTableType = {
+    PyObject_HEAD_INIT(NULL)
+    0,                         /*ob_size*/
+    "_pyo.AtanTable_base",         /*tp_name*/
+    sizeof(AtanTable),         /*tp_basicsize*/
+    0,                         /*tp_itemsize*/
+    (destructor)AtanTable_dealloc, /*tp_dealloc*/
+    0,                         /*tp_print*/
+    0,                         /*tp_getattr*/
+    0,                         /*tp_setattr*/
+    0,                         /*tp_compare*/
+    0,                         /*tp_repr*/
+    0,                         /*tp_as_number*/
+    0,                         /*tp_as_sequence*/
+    0,                         /*tp_as_mapping*/
+    0,                         /*tp_hash */
+    0,                         /*tp_call*/
+    0,                         /*tp_str*/
+    0,                         /*tp_getattro*/
+    0,                         /*tp_setattro*/
+    0,                         /*tp_as_buffer*/
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+    "AtanTable objects. Generates a table filled with a sinc function.",  /* tp_doc */
+    (traverseproc)AtanTable_traverse,   /* tp_traverse */
+    (inquiry)AtanTable_clear,           /* tp_clear */
+    0,		               /* tp_richcompare */
+    0,		               /* tp_weaklistoffset */
+    0,		               /* tp_iter */
+    0,		               /* tp_iternext */
+    AtanTable_methods,             /* tp_methods */
+    AtanTable_members,             /* tp_members */
+    0,                      /* tp_getset */
+    0,                         /* tp_base */
+    0,                         /* tp_dict */
+    0,                         /* tp_descr_get */
+    0,                         /* tp_descr_set */
+    0,                         /* tp_dictoffset */
+    0,      /* tp_init */
+    0,                         /* tp_alloc */
+    AtanTable_new,                 /* tp_new */
+};
+
+/******************************/
+/* TableRec object definition */
+/******************************/
+typedef struct {
+    pyo_audio_HEAD
+    PyObject *input;
+    Stream *input_stream;
+    NewTable *table;
+    int pointer;
+    int active;
+    MYFLT fadetime;
+    MYFLT fadeInSample;
+    MYFLT *trigsBuffer;
+    TriggerStream *trig_stream;
+    MYFLT *time_buffer_streams;
+    MYFLT *buffer;
+} TableRec;
+
+static void
+TableRec_compute_next_data_frame(TableRec *self)
+{
+    int i, num, upBound;
+    MYFLT val;
+    int size = PyInt_AsLong(NewTable_getSize((NewTable *)self->table));
+
+    for (i=0; i<self->bufsize; i++) {
+        self->trigsBuffer[i] = 0.0;
+    }
+
+    if (!self->active) {
+        for (i=0; i<self->bufsize; i++) {
+            self->time_buffer_streams[i] = self->pointer;
+        }
+    }
+
+    if ((size - self->pointer) >= self->bufsize)
+        num = self->bufsize;
+    else {
+        num = size - self->pointer;
+        if (self->active == 1) {
+            if (num <= 0)
+                self->trigsBuffer[0] = 1.0;
+            else
+                self->trigsBuffer[num-1] = 1.0;
+            self->active = 0;
+        }
+    }
+
+    if (self->pointer < size) {
+        upBound = (int)(size - self->fadeInSample);
+
+        //MYFLT buffer[num];
+        //memset(&buffer, 0, sizeof(buffer));
+        for (i=0; i<self->bufsize; i++) {
+            self->buffer[i] = 0.0;
+        }
+        MYFLT *in = Stream_getData((Stream *)self->input_stream);
+
+        for (i=0; i<num; i++) {
             if (self->pointer < self->fadeInSample)
                 val = self->pointer / self->fadeInSample;
             else if (self->pointer >= upBound)
@@ -4963,13 +5286,13 @@ TableRec_compute_next_data_frame(TableRec *self)
             self->time_buffer_streams[i] = self->pointer++;
         }
         NewTable_recordChunk((NewTable *)self->table, self->buffer, num);
-        
+
         if (num < self->bufsize) {
             for (i=num; i<self->bufsize; i++) {
                 self->time_buffer_streams[i] = self->pointer;
             }
         }
-    }    
+    }
 }
 
 static MYFLT *
@@ -4984,18 +5307,18 @@ TableRec_traverse(TableRec *self, visitproc visit, void *arg)
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
     Py_VISIT(self->table);
-    Py_VISIT(self->trig_stream);    
+    Py_VISIT(self->trig_stream);
     return 0;
 }
 
-static int 
+static int
 TableRec_clear(TableRec *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
     Py_CLEAR(self->table);
-    Py_CLEAR(self->trig_stream);    
+    Py_CLEAR(self->trig_stream);
     return 0;
 }
 
@@ -5017,23 +5340,23 @@ TableRec_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *tabletmp;
     TableRec *self;
     self = (TableRec *)type->tp_alloc(type, 0);
-    
+
     self->pointer = 0;
     self->active = 1;
     self->fadetime = 0.;
-    
+
     INIT_OBJECT_COMMON
 
     Stream_setFunctionPtr(self->stream, TableRec_compute_next_data_frame);
     Stream_setStreamActive(self->stream, 0);
 
     static char *kwlist[] = {"input", "table", "fadetime", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_OO_F, kwlist, &inputtmp, &tabletmp, &self->fadetime))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     INIT_INPUT_STREAM
-    
+
     if ( PyObject_HasAttrString((PyObject *)tabletmp, "getTableStream") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"table\" argument of TableRec must be a PyoTableObject.\n");
         Py_RETURN_NONE;
@@ -5041,7 +5364,7 @@ TableRec_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     Py_XDECREF(self->table);
     Py_INCREF(tabletmp);
     self->table = (NewTable *)tabletmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     self->buffer = (MYFLT *)realloc(self->buffer, self->bufsize * sizeof(MYFLT));
@@ -5050,11 +5373,11 @@ TableRec_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
     for (i=0; i<self->bufsize; i++) {
         self->buffer[i] = self->trigsBuffer[i] = self->time_buffer_streams[i] = 0.0;
-    }    
+    }
 
     MAKE_NEW_TRIGGER_STREAM(self->trig_stream, &TriggerStreamType, NULL);
     TriggerStream_setData(self->trig_stream, self->trigsBuffer);
-    
+
     int size = PyInt_AsLong(NewTable_getSize((NewTable *)self->table));
     if ((self->fadetime * self->sr) >= (size * 0.5))
         self->fadetime = size * 0.499 / self->sr;
@@ -5070,11 +5393,11 @@ static PyObject * TableRec_getServer(TableRec* self) { GET_SERVER };
 static PyObject * TableRec_getStream(TableRec* self) { GET_STREAM };
 static PyObject * TableRec_getTriggerStream(TableRec* self) { GET_TRIGGER_STREAM };
 
-static PyObject * TableRec_play(TableRec *self, PyObject *args, PyObject *kwds) 
-{ 
+static PyObject * TableRec_play(TableRec *self, PyObject *args, PyObject *kwds)
+{
     self->pointer = 0;
     self->active = 1;
-    PLAY 
+    PLAY
 };
 
 static PyObject * TableRec_stop(TableRec *self) { STOP };
@@ -5083,17 +5406,17 @@ static PyObject *
 TableRec_setTable(TableRec *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
     Py_INCREF(tmp);
 	Py_DECREF(self->table);
     self->table = (NewTable *)tmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -5179,36 +5502,36 @@ static void
 TableRecTimeStream_setProcMode(TableRecTimeStream *self) {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TableRecTimeStream_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TableRecTimeStream_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TableRecTimeStream_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TableRecTimeStream_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TableRecTimeStream_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TableRecTimeStream_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TableRecTimeStream_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TableRecTimeStream_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TableRecTimeStream_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
@@ -5219,7 +5542,7 @@ TableRecTimeStream_compute_next_data_frame(TableRecTimeStream *self)
     tmp = TableRec_getTimeBuffer((TableRec *)self->mainPlayer);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -5231,11 +5554,11 @@ TableRecTimeStream_traverse(TableRecTimeStream *self, visitproc visit, void *arg
     return 0;
 }
 
-static int 
+static int
 TableRecTimeStream_clear(TableRecTimeStream *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainPlayer);    
+    Py_CLEAR(self->mainPlayer);
     return 0;
 }
 
@@ -5254,36 +5577,36 @@ TableRecTimeStream_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL;
     TableRecTimeStream *self;
     self = (TableRecTimeStream *)type->tp_alloc(type, 0);
-    
+
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TableRecTimeStream_compute_next_data_frame);
     self->mode_func_ptr = TableRecTimeStream_setProcMode;
 
     static char *kwlist[] = {"mainPlayer", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O", kwlist, &maintmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainPlayer);
     Py_INCREF(maintmp);
     self->mainPlayer = (TableRec *)maintmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * TableRecTimeStream_getServer(TableRecTimeStream* self) { GET_SERVER };
 static PyObject * TableRecTimeStream_getStream(TableRecTimeStream* self) { GET_STREAM };
-static PyObject * TableRecTimeStream_setMul(TableRecTimeStream *self, PyObject *arg) { SET_MUL };	
-static PyObject * TableRecTimeStream_setAdd(TableRecTimeStream *self, PyObject *arg) { SET_ADD };	
-static PyObject * TableRecTimeStream_setSub(TableRecTimeStream *self, PyObject *arg) { SET_SUB };	
-static PyObject * TableRecTimeStream_setDiv(TableRecTimeStream *self, PyObject *arg) { SET_DIV };	
+static PyObject * TableRecTimeStream_setMul(TableRecTimeStream *self, PyObject *arg) { SET_MUL };
+static PyObject * TableRecTimeStream_setAdd(TableRecTimeStream *self, PyObject *arg) { SET_ADD };
+static PyObject * TableRecTimeStream_setSub(TableRecTimeStream *self, PyObject *arg) { SET_SUB };
+static PyObject * TableRecTimeStream_setDiv(TableRecTimeStream *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TableRecTimeStream_play(TableRecTimeStream *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TableRecTimeStream_out(TableRecTimeStream *self, PyObject *args, PyObject *kwds) { OUT };
@@ -5315,7 +5638,7 @@ static PyMethodDef TableRecTimeStream_methods[] = {
     {"setMul", (PyCFunction)TableRecTimeStream_setMul, METH_O, "Sets oscillator mul factor."},
     {"setAdd", (PyCFunction)TableRecTimeStream_setAdd, METH_O, "Sets oscillator add factor."},
     {"setSub", (PyCFunction)TableRecTimeStream_setSub, METH_O, "Sets inverse add factor."},
-    {"setDiv", (PyCFunction)TableRecTimeStream_setDiv, METH_O, "Sets inverse mul factor."},    
+    {"setDiv", (PyCFunction)TableRecTimeStream_setDiv, METH_O, "Sets inverse mul factor."},
     {NULL}  /* Sentinel */
 };
 
@@ -5443,32 +5766,32 @@ TableMorph_compute_next_data_frame(TableMorph *self)
 {
     int i, x, y;
     MYFLT input, interp, interp1, interp2;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     int size = PyInt_AsLong(NewTable_getSize((NewTable *)self->table));
     int len = PyList_Size(self->sources);
-    
+
     if (size != self->last_size)
         TableMorph_alloc_memories(self);
 
     input = TableMorph_clip(in[0]);
 
     interp = input * (len - 1);
-    x = (int)(interp);   
+    x = (int)(interp);
     y = x + 1;
-            
+
     MYFLT *tab1 = TableStream_getData((TableStream *)PyObject_CallMethod((PyObject *)PyList_GET_ITEM(self->sources, x), "getTableStream", ""));
     MYFLT *tab2 = TableStream_getData((TableStream *)PyObject_CallMethod((PyObject *)PyList_GET_ITEM(self->sources, y), "getTableStream", ""));
-        
+
     interp = MYFMOD(interp, 1.0);
     interp1 = 1. - interp;
     interp2 = interp;
-    
+
     //MYFLT buffer[size];
     for (i=0; i<size; i++) {
         self->buffer[i] = tab1[i] * interp1 + tab2[i] * interp2;
-    }    
-    
+    }
+
     NewTable_recordChunk((NewTable *)self->table, self->buffer, size);
 }
 
@@ -5483,7 +5806,7 @@ TableMorph_traverse(TableMorph *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 TableMorph_clear(TableMorph *self)
 {
     pyo_CLEAR
@@ -5510,18 +5833,18 @@ TableMorph_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *tabletmp, *sourcestmp;
     TableMorph *self;
     self = (TableMorph *)type->tp_alloc(type, 0);
-    
+
     INIT_OBJECT_COMMON
-    
+
     Stream_setFunctionPtr(self->stream, TableMorph_compute_next_data_frame);
 
     static char *kwlist[] = {"input", "table", "sources", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OOO", kwlist, &inputtmp, &tabletmp, &sourcestmp))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     INIT_INPUT_STREAM
-    
+
     if ( PyObject_HasAttrString((PyObject *)tabletmp, "getTableStream") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"table\" argument of TableMorph must be a PyoTableObject.\n");
         Py_RETURN_NONE;
@@ -5529,15 +5852,15 @@ TableMorph_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     Py_XDECREF(self->table);
     Py_INCREF(tabletmp);
     self->table = (PyObject *)tabletmp;
-    
+
     Py_XDECREF(self->sources);
     Py_INCREF(sourcestmp);
     self->sources = (PyObject *)sourcestmp;
-    
+
     TableMorph_alloc_memories(self);
 
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     return (PyObject *)self;
 }
 
@@ -5551,38 +5874,38 @@ static PyObject *
 TableMorph_setTable(TableMorph *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
     Py_INCREF(tmp);
 	Py_DECREF(self->table);
     self->table = (PyObject *)tmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
 
 static PyObject *
 TableMorph_setSources(TableMorph *self, PyObject *arg)
-{	
+{
     if (arg == NULL) {
         PyErr_SetString(PyExc_TypeError, "Cannot delete the list attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyList_Check(arg)) {
         PyErr_SetString(PyExc_TypeError, "The amplitude list attribute value must be a list.");
         return PyInt_FromLong(-1);
     }
-    
+
     Py_INCREF(arg);
     Py_DECREF(self->sources);
     self->sources = arg;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -5692,15 +6015,15 @@ TrigTableRec_compute_next_data_frame(TrigTableRec *self)
                 else
                     self->trigsBuffer[num-1] = 1.0;
                 self->active = 0;
-            }    
+            }
         }
-    
-        if (self->pointer < size) {   
+
+        if (self->pointer < size) {
             upBound = size - self->fadeInSample;
-        
+
             MYFLT buffer[num];
             memset(&buffer, 0, sizeof(buffer));
-        
+
             for (i=0; i<num; i++) {
                 if (self->pointer < self->fadeInSample)
                     val = self->pointer / self->fadeInSample;
@@ -5712,7 +6035,7 @@ TrigTableRec_compute_next_data_frame(TrigTableRec *self)
                 self->time_buffer_streams[i] = self->pointer++;
             }
             NewTable_recordChunk((NewTable *)self->table, buffer, num);
-        
+
             if (num < self->bufsize) {
                 for (i=num; i<self->bufsize; i++) {
                     self->time_buffer_streams[i] = self->pointer;
@@ -5736,14 +6059,14 @@ TrigTableRec_compute_next_data_frame(TrigTableRec *self)
                         else
                             self->trigsBuffer[num-1] = 1.0;
                         self->active = 0;
-                    }    
+                    }
                 }
-                
+
                 upBound = size - self->fadeInSample;
-                    
+
                 MYFLT buffer[num];
                 memset(&buffer, 0, sizeof(buffer));
-                
+
                 for (i=0; i<num; i++) {
                     if (self->pointer < self->fadeInSample) {
                         val = self->pointer / self->fadeInSample;
@@ -5782,11 +6105,11 @@ TrigTableRec_traverse(TrigTableRec *self, visitproc visit, void *arg)
     Py_VISIT(self->trigger);
     Py_VISIT(self->trigger_stream);
     Py_VISIT(self->table);
-    Py_VISIT(self->trig_stream);    
+    Py_VISIT(self->trig_stream);
     return 0;
 }
 
-static int 
+static int
 TrigTableRec_clear(TrigTableRec *self)
 {
     pyo_CLEAR
@@ -5795,7 +6118,7 @@ TrigTableRec_clear(TrigTableRec *self)
     Py_CLEAR(self->trigger);
     Py_CLEAR(self->trigger_stream);
     Py_CLEAR(self->table);
-    Py_CLEAR(self->trig_stream);    
+    Py_CLEAR(self->trig_stream);
     return 0;
 }
 
@@ -5816,20 +6139,20 @@ TrigTableRec_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *trigtmp, *trig_streamtmp, *tabletmp;
     TrigTableRec *self;
     self = (TrigTableRec *)type->tp_alloc(type, 0);
-    
+
     self->pointer = 0;
     self->active = 0;
     self->fadetime = 0.;
-    
+
     INIT_OBJECT_COMMON
-    
+
     Stream_setFunctionPtr(self->stream, TrigTableRec_compute_next_data_frame);
 
     static char *kwlist[] = {"input", "trig", "table", "fadetime", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_OOO_F, kwlist, &inputtmp, &trigtmp, &tabletmp, &self->fadetime))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     INIT_INPUT_STREAM
 
     Py_XDECREF(self->trigger);
@@ -5839,7 +6162,7 @@ TrigTableRec_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     Py_INCREF(trig_streamtmp);
     Py_XDECREF(self->trigger_stream);
     self->trigger_stream = (Stream *)trig_streamtmp;
-    
+
     if ( PyObject_HasAttrString((PyObject *)tabletmp, "getTableStream") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"table\" argument of TrigTableRec must be a PyoTableObject.\n");
         Py_RETURN_NONE;
@@ -5847,19 +6170,19 @@ TrigTableRec_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     Py_XDECREF(self->table);
     Py_INCREF(tabletmp);
     self->table = (NewTable *)tabletmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->trigsBuffer = (MYFLT *)realloc(self->trigsBuffer, self->bufsize * sizeof(MYFLT));
     self->time_buffer_streams = (MYFLT *)realloc(self->time_buffer_streams, self->bufsize * sizeof(MYFLT));
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = self->time_buffer_streams[i] = 0.0;
-    }    
+    }
 
     MAKE_NEW_TRIGGER_STREAM(self->trig_stream, &TriggerStreamType, NULL);
     TriggerStream_setData(self->trig_stream, self->trigsBuffer);
-    
+
     int size = PyInt_AsLong(NewTable_getSize((NewTable *)self->table));
     if ((self->fadetime * self->sr) >= (size * 0.5))
         self->fadetime = size * 0.499 / self->sr;
@@ -5867,7 +6190,7 @@ TrigTableRec_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         self->fadeInSample = 0.0;
     else
         self->fadeInSample = MYROUND(self->fadetime * self->sr + 0.5);
-     
+
     return (PyObject *)self;
 }
 
@@ -5882,20 +6205,20 @@ static PyObject *
 TrigTableRec_setTable(TrigTableRec *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
     Py_INCREF(tmp);
 	Py_DECREF(self->table);
     self->table = (NewTable *)tmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef TrigTableRec_members[] = {
     {"server", T_OBJECT_EX, offsetof(TrigTableRec, server), 0, "Pyo server."},
@@ -5979,36 +6302,36 @@ static void
 TrigTableRecTimeStream_setProcMode(TrigTableRecTimeStream *self) {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TrigTableRecTimeStream_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TrigTableRecTimeStream_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TrigTableRecTimeStream_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TrigTableRecTimeStream_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TrigTableRecTimeStream_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TrigTableRecTimeStream_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TrigTableRecTimeStream_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TrigTableRecTimeStream_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TrigTableRecTimeStream_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
@@ -6019,7 +6342,7 @@ TrigTableRecTimeStream_compute_next_data_frame(TrigTableRecTimeStream *self)
     tmp = TrigTableRec_getTimeBuffer((TrigTableRec *)self->mainPlayer);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -6031,11 +6354,11 @@ TrigTableRecTimeStream_traverse(TrigTableRecTimeStream *self, visitproc visit, v
     return 0;
 }
 
-static int 
+static int
 TrigTableRecTimeStream_clear(TrigTableRecTimeStream *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainPlayer);    
+    Py_CLEAR(self->mainPlayer);
     return 0;
 }
 
@@ -6054,36 +6377,36 @@ TrigTableRecTimeStream_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL;
     TrigTableRecTimeStream *self;
     self = (TrigTableRecTimeStream *)type->tp_alloc(type, 0);
-    
+
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TrigTableRecTimeStream_compute_next_data_frame);
     self->mode_func_ptr = TrigTableRecTimeStream_setProcMode;
 
     static char *kwlist[] = {"mainPlayer", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O", kwlist, &maintmp))
         Py_RETURN_NONE;
-    
+
     Py_XDECREF(self->mainPlayer);
     Py_INCREF(maintmp);
     self->mainPlayer = (TrigTableRec *)maintmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * TrigTableRecTimeStream_getServer(TrigTableRecTimeStream* self) { GET_SERVER };
 static PyObject * TrigTableRecTimeStream_getStream(TrigTableRecTimeStream* self) { GET_STREAM };
-static PyObject * TrigTableRecTimeStream_setMul(TrigTableRecTimeStream *self, PyObject *arg) { SET_MUL };	
-static PyObject * TrigTableRecTimeStream_setAdd(TrigTableRecTimeStream *self, PyObject *arg) { SET_ADD };	
-static PyObject * TrigTableRecTimeStream_setSub(TrigTableRecTimeStream *self, PyObject *arg) { SET_SUB };	
-static PyObject * TrigTableRecTimeStream_setDiv(TrigTableRecTimeStream *self, PyObject *arg) { SET_DIV };	
+static PyObject * TrigTableRecTimeStream_setMul(TrigTableRecTimeStream *self, PyObject *arg) { SET_MUL };
+static PyObject * TrigTableRecTimeStream_setAdd(TrigTableRecTimeStream *self, PyObject *arg) { SET_ADD };
+static PyObject * TrigTableRecTimeStream_setSub(TrigTableRecTimeStream *self, PyObject *arg) { SET_SUB };
+static PyObject * TrigTableRecTimeStream_setDiv(TrigTableRecTimeStream *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TrigTableRecTimeStream_play(TrigTableRecTimeStream *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TrigTableRecTimeStream_out(TrigTableRecTimeStream *self, PyObject *args, PyObject *kwds) { OUT };
@@ -6115,7 +6438,7 @@ static PyMethodDef TrigTableRecTimeStream_methods[] = {
     {"setMul", (PyCFunction)TrigTableRecTimeStream_setMul, METH_O, "Sets oscillator mul factor."},
     {"setAdd", (PyCFunction)TrigTableRecTimeStream_setAdd, METH_O, "Sets oscillator add factor."},
     {"setSub", (PyCFunction)TrigTableRecTimeStream_setSub, METH_O, "Sets inverse add factor."},
-    {"setDiv", (PyCFunction)TrigTableRecTimeStream_setDiv, METH_O, "Sets inverse mul factor."},    
+    {"setDiv", (PyCFunction)TrigTableRecTimeStream_setDiv, METH_O, "Sets inverse mul factor."},
     {NULL}  /* Sentinel */
 };
 
@@ -6251,18 +6574,18 @@ TablePut_traverse(TablePut *self, visitproc visit, void *arg)
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
     Py_VISIT(self->table);
-    Py_VISIT(self->trig_stream);    
+    Py_VISIT(self->trig_stream);
     return 0;
 }
 
-static int 
+static int
 TablePut_clear(TablePut *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
     Py_CLEAR(self->table);
-    Py_CLEAR(self->trig_stream);    
+    Py_CLEAR(self->trig_stream);
     return 0;
 }
 
@@ -6282,23 +6605,23 @@ TablePut_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *tabletmp;
     TablePut *self;
     self = (TablePut *)type->tp_alloc(type, 0);
-    
+
     self->pointer = 0;
     self->active = 1;
     self->last_value = 0.0;
-    
+
     INIT_OBJECT_COMMON
 
     Stream_setFunctionPtr(self->stream, TablePut_compute_next_data_frame);
     Stream_setStreamActive(self->stream, 0);
 
     static char *kwlist[] = {"input", "table", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist, &inputtmp, &tabletmp))
-        Py_RETURN_NONE; 
-    
+        Py_RETURN_NONE;
+
     INIT_INPUT_STREAM
-    
+
     if ( PyObject_HasAttrString((PyObject *)tabletmp, "getTableStream") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"table\" argument of TablePut must be a PyoTableObject.\n");
         Py_RETURN_NONE;
@@ -6306,14 +6629,14 @@ TablePut_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     Py_XDECREF(self->table);
     Py_INCREF(tabletmp);
     self->table = (DataTable *)tabletmp;
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     self->trigsBuffer = (MYFLT *)realloc(self->trigsBuffer, self->bufsize * sizeof(MYFLT));
 
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
-    }    
+    }
 
     MAKE_NEW_TRIGGER_STREAM(self->trig_stream, &TriggerStreamType, NULL);
     TriggerStream_setData(self->trig_stream, self->trigsBuffer);
@@ -6325,11 +6648,11 @@ static PyObject * TablePut_getServer(TablePut* self) { GET_SERVER };
 static PyObject * TablePut_getStream(TablePut* self) { GET_STREAM };
 static PyObject * TablePut_getTriggerStream(TablePut* self) { GET_TRIGGER_STREAM };
 
-static PyObject * TablePut_play(TablePut *self, PyObject *args, PyObject *kwds) 
-{ 
+static PyObject * TablePut_play(TablePut *self, PyObject *args, PyObject *kwds)
+{
     self->pointer = 0;
     self->active = 1;
-    PLAY 
+    PLAY
 };
 
 static PyObject * TablePut_stop(TablePut *self) { STOP };
@@ -6338,17 +6661,17 @@ static PyObject *
 TablePut_setTable(TablePut *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
     Py_INCREF(tmp);
 	Py_DECREF(self->table);
     self->table = (DataTable *)tmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -6413,3 +6736,222 @@ TablePut_members,             /* tp_members */
 0,                         /* tp_alloc */
 TablePut_new,                 /* tp_new */
 };
+
+/******************************/
+/* TableWrite object definition */
+/******************************/
+typedef struct {
+    pyo_audio_HEAD
+    PyObject *input;
+    Stream *input_stream;
+    PyObject *pos;
+    Stream *pos_stream;
+    NewTable *table;
+} TableWrite;
+
+static void
+TableWrite_compute_next_data_frame(TableWrite *self)
+{
+    int i, ipos;
+    PyObject *table;
+
+    table = PyObject_CallMethod((PyObject *)self->table, "getTableStream", "");
+    MYFLT *tablelist = TableStream_getData((TableStream *)table);
+    int size = TableStream_getSize((TableStream *)table);
+
+    MYFLT *in = Stream_getData((Stream *)self->input_stream);
+    MYFLT *pos = Stream_getData((Stream *)self->pos_stream);
+
+    for (i=0; i<self->bufsize; i++) {
+        ipos = (int)(pos[i] * size);
+        if (ipos < 0)
+            ipos = 0;
+        else if (ipos >= size)
+            ipos = size - 1;
+        tablelist[ipos] = in[i];
+    }
+}
+
+static int
+TableWrite_traverse(TableWrite *self, visitproc visit, void *arg)
+{
+    pyo_VISIT
+    Py_VISIT(self->input);
+    Py_VISIT(self->input_stream);
+    Py_VISIT(self->table);
+    Py_VISIT(self->pos);
+    Py_VISIT(self->pos_stream);
+    return 0;
+}
+
+static int
+TableWrite_clear(TableWrite *self)
+{
+    pyo_CLEAR
+    Py_CLEAR(self->input);
+    Py_CLEAR(self->input_stream);
+    Py_CLEAR(self->table);
+    Py_CLEAR(self->pos);
+    Py_CLEAR(self->pos_stream);
+    return 0;
+}
+
+static void
+TableWrite_dealloc(TableWrite* self)
+{
+    pyo_DEALLOC
+    TableWrite_clear(self);
+    self->ob_type->tp_free((PyObject*)self);
+}
+
+static PyObject *
+TableWrite_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+    int i;
+    PyObject *inputtmp, *input_streamtmp, *postmp, *tabletmp;
+    TableWrite *self;
+    self = (TableWrite *)type->tp_alloc(type, 0);
+
+    INIT_OBJECT_COMMON
+
+    Stream_setFunctionPtr(self->stream, TableWrite_compute_next_data_frame);
+    Stream_setStreamActive(self->stream, 1);
+
+    static char *kwlist[] = {"input", "pos", "table", NULL};
+
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "OOO", kwlist, &inputtmp, &postmp, &tabletmp))
+        Py_RETURN_NONE;
+
+    INIT_INPUT_STREAM
+
+    if (postmp) {
+        PyObject_CallMethod((PyObject *)self, "setPos", "O", postmp);
+    }
+
+    if ( PyObject_HasAttrString((PyObject *)tabletmp, "getTableStream") == 0 ) {
+        PyErr_SetString(PyExc_TypeError, "\"table\" argument of TableWrite must be a PyoTableObject.\n");
+        Py_RETURN_NONE;
+    }
+    Py_XDECREF(self->table);
+    Py_INCREF(tabletmp);
+    self->table = (NewTable *)tabletmp;
+
+    PyObject_CallMethod(self->server, "addStream", "O", self->stream);
+
+    return (PyObject *)self;
+}
+
+static PyObject * TableWrite_getServer(TableWrite* self) { GET_SERVER };
+static PyObject * TableWrite_getStream(TableWrite* self) { GET_STREAM };
+
+static PyObject * TableWrite_play(TableWrite *self, PyObject *args, PyObject *kwds) { PLAY };
+static PyObject * TableWrite_stop(TableWrite *self) { STOP };
+
+static PyObject *
+TableWrite_setPos(TableWrite *self, PyObject *arg)
+{
+	PyObject *tmp, *streamtmp;
+
+	if (arg == NULL) {
+		Py_INCREF(Py_None);
+		return Py_None;
+	}
+
+	tmp = arg;
+	if (PyObject_HasAttrString((PyObject *)tmp, "server") == 0) {
+        PyErr_SetString(PyExc_TypeError, "\"pos\" argument of TableWrite must be a PyoObject.\n");
+        Py_RETURN_NONE;
+	}
+
+	Py_INCREF(tmp);
+	Py_XDECREF(self->pos);
+
+    self->pos = tmp;
+    streamtmp = PyObject_CallMethod((PyObject *)self->pos, "_getStream", NULL);
+    Py_INCREF(streamtmp);
+    Py_XDECREF(self->pos_stream);
+    self->pos_stream = (Stream *)streamtmp;
+
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+static PyObject *
+TableWrite_setTable(TableWrite *self, PyObject *arg)
+{
+	PyObject *tmp;
+
+	if (arg == NULL) {
+		Py_INCREF(Py_None);
+		return Py_None;
+	}
+
+	tmp = arg;
+    Py_INCREF(tmp);
+	Py_DECREF(self->table);
+    self->table = (NewTable *)tmp;
+
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+static PyMemberDef TableWrite_members[] = {
+{"server", T_OBJECT_EX, offsetof(TableWrite, server), 0, "Pyo server."},
+{"stream", T_OBJECT_EX, offsetof(TableWrite, stream), 0, "Stream object."},
+{"input", T_OBJECT_EX, offsetof(TableWrite, input), 0, "Input sound object."},
+{"table", T_OBJECT_EX, offsetof(TableWrite, table), 0, "Table to record in."},
+{"pos", T_OBJECT_EX, offsetof(TableWrite, pos), 0, "Position in the Table to record in."},
+{NULL}  /* Sentinel */
+};
+
+static PyMethodDef TableWrite_methods[] = {
+{"getServer", (PyCFunction)TableWrite_getServer, METH_NOARGS, "Returns server object."},
+{"_getStream", (PyCFunction)TableWrite_getStream, METH_NOARGS, "Returns stream object."},
+{"setTable", (PyCFunction)TableWrite_setTable, METH_O, "Sets a new table."},
+{"setPos", (PyCFunction)TableWrite_setPos, METH_O, "Sets position in the sound table."},
+{"play", (PyCFunction)TableWrite_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
+{"stop", (PyCFunction)TableWrite_stop, METH_NOARGS, "Stops computing."},
+{NULL}  /* Sentinel */
+};
+
+PyTypeObject TableWriteType = {
+PyObject_HEAD_INIT(NULL)
+0,                         /*ob_size*/
+"_pyo.TableWrite_base",         /*tp_name*/
+sizeof(TableWrite),         /*tp_basicsize*/
+0,                         /*tp_itemsize*/
+(destructor)TableWrite_dealloc, /*tp_dealloc*/
+0,                         /*tp_print*/
+0,                         /*tp_getattr*/
+0,                         /*tp_setattr*/
+0,                         /*tp_compare*/
+0,                         /*tp_repr*/
+0,             /*tp_as_number*/
+0,                         /*tp_as_sequence*/
+0,                         /*tp_as_mapping*/
+0,                         /*tp_hash */
+0,                         /*tp_call*/
+0,                         /*tp_str*/
+0,                         /*tp_getattro*/
+0,                         /*tp_setattro*/
+0,                         /*tp_as_buffer*/
+Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
+"TableWrite objects. Record audio input in a table object.",           /* tp_doc */
+(traverseproc)TableWrite_traverse,   /* tp_traverse */
+(inquiry)TableWrite_clear,           /* tp_clear */
+0,		               /* tp_richcompare */
+0,		               /* tp_weaklistoffset */
+0,		               /* tp_iter */
+0,		               /* tp_iternext */
+TableWrite_methods,             /* tp_methods */
+TableWrite_members,             /* tp_members */
+0,                      /* tp_getset */
+0,                         /* tp_base */
+0,                         /* tp_dict */
+0,                         /* tp_descr_get */
+0,                         /* tp_descr_set */
+0,                         /* tp_dictoffset */
+0,      /* tp_init */
+0,                         /* tp_alloc */
+TableWrite_new,                 /* tp_new */
+};
diff --git a/src/objects/trigmodule.c b/src/objects/trigmodule.c
index be86e0c..50c0a16 100644
--- a/src/objects/trigmodule.c
+++ b/src/objects/trigmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -34,7 +34,7 @@ typedef struct {
     PyObject *max;
     Stream *max_stream;
     MYFLT value;
-    int modebuffer[3]; // need at least 2 slots for mul & add 
+    int modebuffer[3]; // need at least 2 slots for mul & add
 } TrigRandInt;
 
 static void
@@ -42,11 +42,11 @@ TrigRandInt_generate_i(TrigRandInt *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1)
             self->value = (MYFLT)((int)(rand()/((MYFLT)(RAND_MAX)+1)*ma));
-        
+
         self->data[i] = self->value;
     }
 }
@@ -56,11 +56,11 @@ TrigRandInt_generate_a(TrigRandInt *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1)
             self->value = (MYFLT)((int)(rand()/((MYFLT)(RAND_MAX)+1)*ma[i]));
-        
+
         self->data[i] = self->value;
     }
 }
@@ -81,50 +81,50 @@ TrigRandInt_setProcMode(TrigRandInt *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = TrigRandInt_generate_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = TrigRandInt_generate_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TrigRandInt_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TrigRandInt_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TrigRandInt_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TrigRandInt_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TrigRandInt_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TrigRandInt_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TrigRandInt_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TrigRandInt_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TrigRandInt_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 TrigRandInt_compute_next_data_frame(TrigRandInt *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -134,19 +134,19 @@ TrigRandInt_traverse(TrigRandInt *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->max);    
-    Py_VISIT(self->max_stream);    
+    Py_VISIT(self->max);
+    Py_VISIT(self->max_stream);
     return 0;
 }
 
-static int 
+static int
 TrigRandInt_clear(TrigRandInt *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->max);    
-    Py_CLEAR(self->max_stream);    
+    Py_CLEAR(self->max);
+    Py_CLEAR(self->max_stream);
     return 0;
 }
 
@@ -166,38 +166,38 @@ TrigRandInt_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *maxtmp=NULL, *multmp=NULL, *addtmp=NULL;
     TrigRandInt *self;
     self = (TrigRandInt *)type->tp_alloc(type, 0);
-    
+
     self->max = PyFloat_FromDouble(100.);
     self->value = 0.;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TrigRandInt_compute_next_data_frame);
     self->mode_func_ptr = TrigRandInt_setProcMode;
 
     static char *kwlist[] = {"input", "max", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOO", kwlist, &inputtmp, &maxtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     if (maxtmp) {
         PyObject_CallMethod((PyObject *)self, "setMax", "O", maxtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     Server_generateSeed((Server *)self->server, TRIGRANDINT_ID);
 
     if (self->modebuffer[2] == 0)
@@ -213,10 +213,10 @@ TrigRandInt_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * TrigRandInt_getServer(TrigRandInt* self) { GET_SERVER };
 static PyObject * TrigRandInt_getStream(TrigRandInt* self) { GET_STREAM };
-static PyObject * TrigRandInt_setMul(TrigRandInt *self, PyObject *arg) { SET_MUL };	
-static PyObject * TrigRandInt_setAdd(TrigRandInt *self, PyObject *arg) { SET_ADD };	
-static PyObject * TrigRandInt_setSub(TrigRandInt *self, PyObject *arg) { SET_SUB };	
-static PyObject * TrigRandInt_setDiv(TrigRandInt *self, PyObject *arg) { SET_DIV };	
+static PyObject * TrigRandInt_setMul(TrigRandInt *self, PyObject *arg) { SET_MUL };
+static PyObject * TrigRandInt_setAdd(TrigRandInt *self, PyObject *arg) { SET_ADD };
+static PyObject * TrigRandInt_setSub(TrigRandInt *self, PyObject *arg) { SET_SUB };
+static PyObject * TrigRandInt_setDiv(TrigRandInt *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TrigRandInt_play(TrigRandInt *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TrigRandInt_out(TrigRandInt *self, PyObject *args, PyObject *kwds) { OUT };
@@ -235,14 +235,14 @@ static PyObject *
 TrigRandInt_setMax(TrigRandInt *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->max);
@@ -258,12 +258,12 @@ TrigRandInt_setMax(TrigRandInt *self, PyObject *arg)
         self->max_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef TrigRandInt_members[] = {
     {"server", T_OBJECT_EX, offsetof(TrigRandInt, server), 0, "Pyo server."},
@@ -387,7 +387,7 @@ typedef struct {
     int timeStep;
     MYFLT stepVal;
     int timeCount;
-    int modebuffer[4]; // need at least 2 slots for mul & add 
+    int modebuffer[4]; // need at least 2 slots for mul & add
 } TrigRand;
 
 static void
@@ -397,7 +397,7 @@ TrigRand_generate_ii(TrigRand *self) {
     MYFLT mi = PyFloat_AS_DOUBLE(self->min);
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
     MYFLT range = ma - mi;
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1) {
             self->timeCount = 0;
@@ -407,7 +407,7 @@ TrigRand_generate_ii(TrigRand *self) {
             else
                 self->stepVal = (self->value - self->currentValue) / self->timeStep;
         }
-        
+
         if (self->timeCount == (self->timeStep - 1)) {
             self->currentValue = self->value;
             self->timeCount++;
@@ -416,7 +416,7 @@ TrigRand_generate_ii(TrigRand *self) {
             self->currentValue += self->stepVal;
             self->timeCount++;
         }
-        
+
         self->data[i] = self->currentValue;
     }
 }
@@ -427,7 +427,7 @@ TrigRand_generate_ai(TrigRand *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *mi = Stream_getData((Stream *)self->min_stream);
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
-    
+
     for (i=0; i<self->bufsize; i++) {
         MYFLT range = ma - mi[i];
         if (in[i] == 1) {
@@ -447,8 +447,8 @@ TrigRand_generate_ai(TrigRand *self) {
             self->currentValue += self->stepVal;
             self->timeCount++;
         }
-        
-        self->data[i] = self->currentValue;        
+
+        self->data[i] = self->currentValue;
     }
 }
 
@@ -458,7 +458,7 @@ TrigRand_generate_ia(TrigRand *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT mi = PyFloat_AS_DOUBLE(self->min);
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         MYFLT range = ma[i] - mi;
         if (in[i] == 1) {
@@ -469,7 +469,7 @@ TrigRand_generate_ia(TrigRand *self) {
             else
                 self->stepVal = (self->value - self->currentValue) / self->timeStep;
         }
-        
+
         if (self->timeCount == (self->timeStep - 1)) {
             self->currentValue = self->value;
             self->timeCount++;
@@ -478,7 +478,7 @@ TrigRand_generate_ia(TrigRand *self) {
             self->currentValue += self->stepVal;
             self->timeCount++;
         }
-        
+
         self->data[i] = self->currentValue;
     }
 }
@@ -489,7 +489,7 @@ TrigRand_generate_aa(TrigRand *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *mi = Stream_getData((Stream *)self->min_stream);
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         MYFLT range = ma[i] - mi[i];
         if (in[i] == 1) {
@@ -500,7 +500,7 @@ TrigRand_generate_aa(TrigRand *self) {
             else
                 self->stepVal = (self->value - self->currentValue) / self->timeStep;
         }
-        
+
         if (self->timeCount == (self->timeStep - 1)) {
             self->currentValue = self->value;
             self->timeCount++;
@@ -509,7 +509,7 @@ TrigRand_generate_aa(TrigRand *self) {
             self->currentValue += self->stepVal;
             self->timeCount++;
         }
-        
+
         self->data[i] = self->currentValue;
     }
 }
@@ -530,56 +530,56 @@ TrigRand_setProcMode(TrigRand *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = TrigRand_generate_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = TrigRand_generate_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = TrigRand_generate_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = TrigRand_generate_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TrigRand_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TrigRand_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TrigRand_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TrigRand_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TrigRand_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TrigRand_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TrigRand_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TrigRand_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TrigRand_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 TrigRand_compute_next_data_frame(TrigRand *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -589,23 +589,23 @@ TrigRand_traverse(TrigRand *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->min);    
-    Py_VISIT(self->min_stream);    
-    Py_VISIT(self->max);    
-    Py_VISIT(self->max_stream);    
+    Py_VISIT(self->min);
+    Py_VISIT(self->min_stream);
+    Py_VISIT(self->max);
+    Py_VISIT(self->max_stream);
     return 0;
 }
 
-static int 
+static int
 TrigRand_clear(TrigRand *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->min);    
-    Py_CLEAR(self->min_stream);    
-    Py_CLEAR(self->max);    
-    Py_CLEAR(self->max_stream);    
+    Py_CLEAR(self->min);
+    Py_CLEAR(self->min_stream);
+    Py_CLEAR(self->max);
+    Py_CLEAR(self->max_stream);
     return 0;
 }
 
@@ -625,7 +625,7 @@ TrigRand_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *mintmp=NULL, *maxtmp=NULL, *multmp=NULL, *addtmp=NULL;
     TrigRand *self;
     self = (TrigRand *)type->tp_alloc(type, 0);
-    
+
     self->min = PyFloat_FromDouble(0.);
     self->max = PyFloat_FromDouble(1.);
     self->value = self->currentValue = 0.;
@@ -636,34 +636,34 @@ TrigRand_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TrigRand_compute_next_data_frame);
     self->mode_func_ptr = TrigRand_setProcMode;
 
     static char *kwlist[] = {"input", "min", "max", "port", "init", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_OOFFOO, kwlist, &inputtmp, &mintmp, &maxtmp, &self->time, &inittmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (mintmp) {
         PyObject_CallMethod((PyObject *)self, "setMin", "O", mintmp);
     }
-    
+
     if (maxtmp) {
         PyObject_CallMethod((PyObject *)self, "setMax", "O", maxtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     Server_generateSeed((Server *)self->server, TRIGRAND_ID);
@@ -678,10 +678,10 @@ TrigRand_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * TrigRand_getServer(TrigRand* self) { GET_SERVER };
 static PyObject * TrigRand_getStream(TrigRand* self) { GET_STREAM };
-static PyObject * TrigRand_setMul(TrigRand *self, PyObject *arg) { SET_MUL };	
-static PyObject * TrigRand_setAdd(TrigRand *self, PyObject *arg) { SET_ADD };	
-static PyObject * TrigRand_setSub(TrigRand *self, PyObject *arg) { SET_SUB };	
-static PyObject * TrigRand_setDiv(TrigRand *self, PyObject *arg) { SET_DIV };	
+static PyObject * TrigRand_setMul(TrigRand *self, PyObject *arg) { SET_MUL };
+static PyObject * TrigRand_setAdd(TrigRand *self, PyObject *arg) { SET_ADD };
+static PyObject * TrigRand_setSub(TrigRand *self, PyObject *arg) { SET_SUB };
+static PyObject * TrigRand_setDiv(TrigRand *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TrigRand_play(TrigRand *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TrigRand_out(TrigRand *self, PyObject *args, PyObject *kwds) { OUT };
@@ -700,14 +700,14 @@ static PyObject *
 TrigRand_setMin(TrigRand *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->min);
@@ -723,25 +723,25 @@ TrigRand_setMin(TrigRand *self, PyObject *arg)
         self->min_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TrigRand_setMax(TrigRand *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->max);
@@ -757,35 +757,35 @@ TrigRand_setMax(TrigRand *self, PyObject *arg)
         self->max_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TrigRand_setPort(TrigRand *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	if (isNumber == 1) {
 		self->time = PyFloat_AS_DOUBLE(PyNumber_Float(tmp));
         self->timeStep = (int)(self->time * self->sr);
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef TrigRand_members[] = {
 {"server", T_OBJECT_EX, offsetof(TrigRand, server), 0, "Pyo server."},
@@ -913,14 +913,14 @@ typedef struct {
     int timeStep;
     MYFLT stepVal;
     int timeCount;
-    int modebuffer[2]; // need at least 2 slots for mul & add 
+    int modebuffer[2]; // need at least 2 slots for mul & add
 } TrigChoice;
 
 static void
 TrigChoice_generate(TrigChoice *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1) {
             self->timeCount = 0;
@@ -930,7 +930,7 @@ TrigChoice_generate(TrigChoice *self) {
             else
                 self->stepVal = (self->value - self->currentValue) / self->timeStep;
         }
-        
+
         if (self->timeCount == (self->timeStep - 1)) {
             self->currentValue = self->value;
             self->timeCount++;
@@ -939,7 +939,7 @@ TrigChoice_generate(TrigChoice *self) {
             self->currentValue += self->stepVal;
             self->timeCount++;
         }
-        
+
         self->data[i] = self->currentValue;
     }
 }
@@ -959,44 +959,44 @@ TrigChoice_setProcMode(TrigChoice *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = TrigChoice_generate;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TrigChoice_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TrigChoice_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TrigChoice_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TrigChoice_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TrigChoice_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TrigChoice_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TrigChoice_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TrigChoice_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TrigChoice_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 TrigChoice_compute_next_data_frame(TrigChoice *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1009,7 +1009,7 @@ TrigChoice_traverse(TrigChoice *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 TrigChoice_clear(TrigChoice *self)
 {
     pyo_CLEAR
@@ -1035,25 +1035,25 @@ TrigChoice_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *choicetmp=NULL, *multmp=NULL, *addtmp=NULL;
     TrigChoice *self;
     self = (TrigChoice *)type->tp_alloc(type, 0);
-    
+
     self->value = self->currentValue = 0.;
     self->time = 0.0;
     self->timeCount = 0;
     self->stepVal = 0.0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TrigChoice_compute_next_data_frame);
     self->mode_func_ptr = TrigChoice_setProcMode;
 
     static char *kwlist[] = {"input", "choice", "port", "init", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_OO_FFOO, kwlist, &inputtmp, &choicetmp, &self->time, &inittmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (choicetmp) {
         PyObject_CallMethod((PyObject *)self, "setChoice", "O", choicetmp);
     }
@@ -1061,18 +1061,18 @@ TrigChoice_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     Server_generateSeed((Server *)self->server, TRIGCHOICE_ID);
 
     self->value = self->currentValue = inittmp;
     self->timeStep = (int)(self->time * self->sr);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -1080,10 +1080,10 @@ TrigChoice_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * TrigChoice_getServer(TrigChoice* self) { GET_SERVER };
 static PyObject * TrigChoice_getStream(TrigChoice* self) { GET_STREAM };
-static PyObject * TrigChoice_setMul(TrigChoice *self, PyObject *arg) { SET_MUL };	
-static PyObject * TrigChoice_setAdd(TrigChoice *self, PyObject *arg) { SET_ADD };	
-static PyObject * TrigChoice_setSub(TrigChoice *self, PyObject *arg) { SET_SUB };	
-static PyObject * TrigChoice_setDiv(TrigChoice *self, PyObject *arg) { SET_DIV };	
+static PyObject * TrigChoice_setMul(TrigChoice *self, PyObject *arg) { SET_MUL };
+static PyObject * TrigChoice_setAdd(TrigChoice *self, PyObject *arg) { SET_ADD };
+static PyObject * TrigChoice_setSub(TrigChoice *self, PyObject *arg) { SET_SUB };
+static PyObject * TrigChoice_setDiv(TrigChoice *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TrigChoice_play(TrigChoice *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TrigChoice_out(TrigChoice *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1103,7 +1103,7 @@ TrigChoice_setChoice(TrigChoice *self, PyObject *arg)
 {
     int i;
 	PyObject *tmp;
-	
+
 	if (! PyList_Check(arg)) {
         PyErr_SetString(PyExc_TypeError, "The choice attribute must be a list.");
 		Py_INCREF(Py_None);
@@ -1116,35 +1116,35 @@ TrigChoice_setChoice(TrigChoice *self, PyObject *arg)
     for (i=0; i<self->chSize; i++) {
         self->choice[i] = PyFloat_AS_DOUBLE(PyNumber_Float(PyList_GET_ITEM(tmp, i)));
     }
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TrigChoice_setPort(TrigChoice *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	if (isNumber == 1) {
 		self->time = PyFloat_AS_DOUBLE(PyNumber_Float(tmp));
         self->timeStep = (int)(self->time * self->sr);
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef TrigChoice_members[] = {
 {"server", T_OBJECT_EX, offsetof(TrigChoice, server), 0, "Pyo server."},
@@ -1270,7 +1270,7 @@ TrigFunc_generate(TrigFunc *self) {
     int i;
     PyObject *tuple, *result;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1) {
             if (self->arg == Py_None) {
@@ -1283,20 +1283,20 @@ TrigFunc_generate(TrigFunc *self) {
             else {
                 tuple = PyTuple_New(1);
                 PyTuple_SET_ITEM(tuple, 0, self->arg);
-                result = PyObject_Call(self->func, tuple, NULL);                
+                result = PyObject_Call(self->func, tuple, NULL);
                 if (result == NULL) {
                     PyErr_Print();
                     return;
                 }
             }
-        }    
+        }
     }
 }
 
 static void
 TrigFunc_compute_next_data_frame(TrigFunc *self)
 {
-    TrigFunc_generate(self); 
+    TrigFunc_generate(self);
 }
 
 static int
@@ -1310,7 +1310,7 @@ TrigFunc_traverse(TrigFunc *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 TrigFunc_clear(TrigFunc *self)
 {
     pyo_CLEAR
@@ -1343,12 +1343,12 @@ TrigFunc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     Stream_setFunctionPtr(self->stream, TrigFunc_compute_next_data_frame);
 
     static char *kwlist[] = {"input", "function", "arg", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|O", kwlist, &inputtmp, &functmp, &argtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (functmp) {
         PyObject_CallMethod((PyObject *)self, "setFunction", "O", functmp);
     }
@@ -1356,7 +1356,7 @@ TrigFunc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (argtmp) {
         PyObject_CallMethod((PyObject *)self, "setArg", "O", argtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     return (PyObject *)self;
@@ -1372,21 +1372,21 @@ static PyObject *
 TrigFunc_setFunction(TrigFunc *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (! PyCallable_Check(arg)) {
         PyErr_SetString(PyExc_TypeError, "The function attribute must be callable.");
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     tmp = arg;
     Py_XDECREF(self->func);
     Py_INCREF(tmp);
     self->func = tmp;
-  
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TrigFunc_setArg(TrigFunc *self, PyObject *arg)
@@ -1397,10 +1397,10 @@ TrigFunc_setArg(TrigFunc *self, PyObject *arg)
     Py_XDECREF(self->arg);
     Py_INCREF(tmp);
     self->arg = tmp;
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef TrigFunc_members[] = {
 {"server", T_OBJECT_EX, offsetof(TrigFunc, server), 0, "Pyo server."},
@@ -1489,7 +1489,7 @@ TrigEnv_readframes_i(TrigEnv *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
         if (in[i] == 1) {
@@ -1514,11 +1514,11 @@ TrigEnv_readframes_i(TrigEnv *self) {
         }
         else
             self->data[i] = 0.;
-        
+
         if (self->pointerPos > size && self->active == 1) {
             self->trigsBuffer[i] = 1.0;
             self->active = 0;
-        }    
+        }
     }
 }
 
@@ -1530,7 +1530,7 @@ TrigEnv_readframes_a(TrigEnv *self) {
     MYFLT *dur_st = Stream_getData((Stream *)self->dur_stream);
     MYFLT *tablelist = TableStream_getData(self->table);
     int size = TableStream_getSize(self->table);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
         if (in[i] == 1) {
@@ -1555,7 +1555,7 @@ TrigEnv_readframes_a(TrigEnv *self) {
         }
         else
             self->data[i] = 0.;
-        
+
         if (self->pointerPos > size && self->active == 1) {
             self->trigsBuffer[i] = 1.0;
             self->active = 0;
@@ -1579,50 +1579,50 @@ TrigEnv_setProcMode(TrigEnv *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = TrigEnv_readframes_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = TrigEnv_readframes_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TrigEnv_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TrigEnv_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TrigEnv_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TrigEnv_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TrigEnv_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TrigEnv_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TrigEnv_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TrigEnv_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TrigEnv_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 TrigEnv_compute_next_data_frame(TrigEnv *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1633,22 +1633,22 @@ TrigEnv_traverse(TrigEnv *self, visitproc visit, void *arg)
     Py_VISIT(self->table);
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->dur);    
-    Py_VISIT(self->dur_stream);    
-    Py_VISIT(self->trig_stream);    
+    Py_VISIT(self->dur);
+    Py_VISIT(self->dur_stream);
+    Py_VISIT(self->trig_stream);
     return 0;
 }
 
-static int 
+static int
 TrigEnv_clear(TrigEnv *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->table);
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->dur);    
-    Py_CLEAR(self->dur_stream);    
-    Py_CLEAR(self->trig_stream);    
+    Py_CLEAR(self->dur);
+    Py_CLEAR(self->dur_stream);
+    Py_CLEAR(self->trig_stream);
     return 0;
 }
 
@@ -1668,15 +1668,15 @@ TrigEnv_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *tabletmp, *durtmp=NULL, *multmp=NULL, *addtmp=NULL;
     TrigEnv *self;
     self = (TrigEnv *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     self->pointerPos = 0.;
     self->active = 0;
     self->interp = 2;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TrigEnv_compute_next_data_frame);
     self->mode_func_ptr = TrigEnv_setProcMode;
@@ -1685,44 +1685,44 @@ TrigEnv_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->current_dur = self->sr;
 
     static char *kwlist[] = {"input", "table", "dur", "interp", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OiOO", kwlist, &inputtmp, &tabletmp, &durtmp, &self->interp, &multmp, &addtmp))
         Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
-    
+
     if ( PyObject_HasAttrString((PyObject *)tabletmp, "getTableStream") == 0 ) {
         PyErr_SetString(PyExc_TypeError, "\"table\" argument of TrigEnv must be a PyoTableObject.\n");
         Py_RETURN_NONE;
     }
     Py_XDECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tabletmp, "getTableStream", "");
-    
+
     if (durtmp) {
         PyObject_CallMethod((PyObject *)self, "setDur", "O", durtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     self->trigsBuffer = (MYFLT *)realloc(self->trigsBuffer, self->bufsize * sizeof(MYFLT));
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
-    }    
-    
+    }
+
     MAKE_NEW_TRIGGER_STREAM(self->trig_stream, &TriggerStreamType, NULL);
     TriggerStream_setData(self->trig_stream, self->trigsBuffer);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     SET_INTERP_POINTER
 
     return (PyObject *)self;
@@ -1731,10 +1731,10 @@ TrigEnv_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 static PyObject * TrigEnv_getServer(TrigEnv* self) { GET_SERVER };
 static PyObject * TrigEnv_getStream(TrigEnv* self) { GET_STREAM };
 static PyObject * TrigEnv_getTriggerStream(TrigEnv* self) { GET_TRIGGER_STREAM };
-static PyObject * TrigEnv_setMul(TrigEnv *self, PyObject *arg) { SET_MUL };	
-static PyObject * TrigEnv_setAdd(TrigEnv *self, PyObject *arg) { SET_ADD };	
-static PyObject * TrigEnv_setSub(TrigEnv *self, PyObject *arg) { SET_SUB };	
-static PyObject * TrigEnv_setDiv(TrigEnv *self, PyObject *arg) { SET_DIV };	
+static PyObject * TrigEnv_setMul(TrigEnv *self, PyObject *arg) { SET_MUL };
+static PyObject * TrigEnv_setAdd(TrigEnv *self, PyObject *arg) { SET_ADD };
+static PyObject * TrigEnv_setSub(TrigEnv *self, PyObject *arg) { SET_SUB };
+static PyObject * TrigEnv_setDiv(TrigEnv *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TrigEnv_play(TrigEnv *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TrigEnv_out(TrigEnv *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1760,32 +1760,32 @@ static PyObject *
 TrigEnv_setTable(TrigEnv *self, PyObject *arg)
 {
 	PyObject *tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	tmp = arg;
 	Py_DECREF(self->table);
     self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TrigEnv_setDur(TrigEnv *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->dur);
@@ -1801,12 +1801,12 @@ TrigEnv_setDur(TrigEnv *self, PyObject *arg)
         self->dur_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TrigEnv_setInterp(TrigEnv *self, PyObject *arg)
@@ -1815,15 +1815,15 @@ TrigEnv_setInterp(TrigEnv *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     int isNumber = PyNumber_Check(arg);
-    
+
 	if (isNumber == 1) {
 		self->interp = PyInt_AsLong(PyNumber_Int(arg));
-    }  
-    
+    }
+
     SET_INTERP_POINTER
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -1968,7 +1968,7 @@ static void
 TrigLinseg_convert_pointslist(TrigLinseg *self) {
     int i;
     PyObject *tup;
-    
+
     self->listsize = PyList_Size(self->pointslist);
     self->targets = (MYFLT *)realloc(self->targets, self->listsize * sizeof(MYFLT));
     self->times = (MYFLT *)realloc(self->times, self->listsize * sizeof(MYFLT));
@@ -1979,12 +1979,12 @@ TrigLinseg_convert_pointslist(TrigLinseg *self) {
     }
 }
 
-static void 
+static void
 TrigLinseg_reinit(TrigLinseg *self) {
     if (self->newlist == 1) {
         TrigLinseg_convert_pointslist((TrigLinseg *)self);
         self->newlist = 0;
-    }    
+    }
     self->currentTime = 0.0;
     self->currentValue = self->targets[0];
     self->which = 0;
@@ -1995,7 +1995,7 @@ static void
 TrigLinseg_generate(TrigLinseg *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
         if (in[i] == 1)
@@ -2008,7 +2008,7 @@ TrigLinseg_generate(TrigLinseg *self) {
                     self->trigsBuffer[i] = 1.0;
                     self->flag = 0;
                     self->currentValue = self->targets[self->which-1];
-                }    
+                }
                 else
                     if ((self->times[self->which] - self->times[self->which-1]) <= 0)
                         self->increment = self->targets[self->which] - self->currentValue;
@@ -2016,9 +2016,9 @@ TrigLinseg_generate(TrigLinseg *self) {
                         self->increment = (self->targets[self->which] - self->targets[self->which-1]) / ((self->times[self->which] - self->times[self->which-1]) / self->sampleToSec);
             }
             if (self->currentTime <= self->times[self->listsize-1])
-                self->currentValue += self->increment;            
+                self->currentValue += self->increment;
             self->data[i] = (MYFLT)self->currentValue;
-            self->currentTime += self->sampleToSec;    
+            self->currentTime += self->sampleToSec;
         }
         else
             self->data[i] = (MYFLT)self->currentValue;
@@ -2040,44 +2040,44 @@ TrigLinseg_setProcMode(TrigLinseg *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = TrigLinseg_generate;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TrigLinseg_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TrigLinseg_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TrigLinseg_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TrigLinseg_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TrigLinseg_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TrigLinseg_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TrigLinseg_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TrigLinseg_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TrigLinseg_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 TrigLinseg_compute_next_data_frame(TrigLinseg *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2086,20 +2086,20 @@ TrigLinseg_traverse(TrigLinseg *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->pointslist);
-    Py_VISIT(self->trig_stream);    
-    Py_VISIT(self->input);    
-    Py_VISIT(self->input_stream);    
+    Py_VISIT(self->trig_stream);
+    Py_VISIT(self->input);
+    Py_VISIT(self->input_stream);
     return 0;
 }
 
-static int 
+static int
 TrigLinseg_clear(TrigLinseg *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->pointslist);
-    Py_CLEAR(self->trig_stream);    
-    Py_CLEAR(self->input);    
-    Py_CLEAR(self->input_stream);    
+    Py_CLEAR(self->trig_stream);
+    Py_CLEAR(self->input);
+    Py_CLEAR(self->input_stream);
     return 0;
 }
 
@@ -2121,11 +2121,11 @@ TrigLinseg_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *pointslist=NULL, *multmp=NULL, *addtmp=NULL;
     TrigLinseg *self;
     self = (TrigLinseg *)type->tp_alloc(type, 0);
-    
+
     self->newlist = 1;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TrigLinseg_compute_next_data_frame);
     self->mode_func_ptr = TrigLinseg_setProcMode;
@@ -2133,7 +2133,7 @@ TrigLinseg_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->sampleToSec = 1. / self->sr;
 
     static char *kwlist[] = {"input", "list", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist, &inputtmp, &pointslist, &multmp, &addtmp))
         Py_RETURN_NONE;
 
@@ -2143,38 +2143,38 @@ TrigLinseg_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     Py_XDECREF(self->pointslist);
     self->pointslist = pointslist;
     TrigLinseg_convert_pointslist((TrigLinseg *)self);
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     self->trigsBuffer = (MYFLT *)realloc(self->trigsBuffer, self->bufsize * sizeof(MYFLT));
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
-    }    
-    
+    }
+
     MAKE_NEW_TRIGGER_STREAM(self->trig_stream, &TriggerStreamType, NULL);
     TriggerStream_setData(self->trig_stream, self->trigsBuffer);
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * TrigLinseg_getServer(TrigLinseg* self) { GET_SERVER };
 static PyObject * TrigLinseg_getStream(TrigLinseg* self) { GET_STREAM };
 static PyObject * TrigLinseg_getTriggerStream(TrigLinseg* self) { GET_TRIGGER_STREAM };
-static PyObject * TrigLinseg_setMul(TrigLinseg *self, PyObject *arg) { SET_MUL };	
-static PyObject * TrigLinseg_setAdd(TrigLinseg *self, PyObject *arg) { SET_ADD };	
-static PyObject * TrigLinseg_setSub(TrigLinseg *self, PyObject *arg) { SET_SUB };	
-static PyObject * TrigLinseg_setDiv(TrigLinseg *self, PyObject *arg) { SET_DIV };	
+static PyObject * TrigLinseg_setMul(TrigLinseg *self, PyObject *arg) { SET_MUL };
+static PyObject * TrigLinseg_setAdd(TrigLinseg *self, PyObject *arg) { SET_ADD };
+static PyObject * TrigLinseg_setSub(TrigLinseg *self, PyObject *arg) { SET_SUB };
+static PyObject * TrigLinseg_setDiv(TrigLinseg *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TrigLinseg_play(TrigLinseg *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TrigLinseg_stop(TrigLinseg *self) { STOP };
@@ -2195,18 +2195,18 @@ TrigLinseg_setList(TrigLinseg *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the list attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyList_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The points list attribute value must be a list of tuples.");
         return PyInt_FromLong(-1);
     }
-    
+
     Py_INCREF(value);
     Py_DECREF(self->pointslist);
-    self->pointslist = value; 
-    
+    self->pointslist = value;
+
     self->newlist = 1;
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2344,7 +2344,7 @@ typedef struct {
     double exp;
     double exp_tmp;
     int inverse;
-    int inverse_tmp;    
+    int inverse_tmp;
     MYFLT *trigsBuffer;
     TriggerStream *trig_stream;
 } TrigExpseg;
@@ -2353,7 +2353,7 @@ static void
 TrigExpseg_convert_pointslist(TrigExpseg *self) {
     int i;
     PyObject *tup;
-    
+
     self->listsize = PyList_Size(self->pointslist);
     self->targets = (MYFLT *)realloc(self->targets, self->listsize * sizeof(MYFLT));
     self->times = (MYFLT *)realloc(self->times, self->listsize * sizeof(MYFLT));
@@ -2364,12 +2364,12 @@ TrigExpseg_convert_pointslist(TrigExpseg *self) {
     }
 }
 
-static void 
+static void
 TrigExpseg_reinit(TrigExpseg *self) {
     if (self->newlist == 1) {
         TrigExpseg_convert_pointslist((TrigExpseg *)self);
         self->newlist = 0;
-    }    
+    }
     self->currentTime = 0.0;
     self->currentValue = self->targets[0];
     self->which = 0;
@@ -2383,12 +2383,12 @@ TrigExpseg_generate(TrigExpseg *self) {
     int i;
     MYFLT scl;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
         if (in[i] == 1)
             TrigExpseg_reinit((TrigExpseg *)self);
-        
+
         if (self->flag == 1) {
             if (self->currentTime >= self->times[self->which]) {
                 self->which++;
@@ -2396,7 +2396,7 @@ TrigExpseg_generate(TrigExpseg *self) {
                     self->trigsBuffer[i] = 1.0;
                     self->flag = 0;
                     self->currentValue = self->targets[self->which-1];
-                }    
+                }
                 else {
                     self->range = self->targets[self->which] - self->targets[self->which-1];
                     self->steps = (self->times[self->which] - self->times[self->which-1]) * self->sr;
@@ -2404,9 +2404,9 @@ TrigExpseg_generate(TrigExpseg *self) {
                         self->inc = 1.0;
                     else
                         self->inc = 1.0 / self->steps;
-                    self->pointer = 0.0;                    
+                    self->pointer = 0.0;
                 }
-            }    
+            }
             if (self->currentTime <= self->times[self->listsize-1]) {
                 if (self->pointer >= 1.0)
                     self->pointer = 1.0;
@@ -2414,12 +2414,12 @@ TrigExpseg_generate(TrigExpseg *self) {
                     scl = 1.0 - MYPOW(1.0 - self->pointer, self->exp);
                 else
                     scl = MYPOW(self->pointer, self->exp);
-                
+
                 self->currentValue = scl * self->range + self->targets[self->which-1];
                 self->pointer += self->inc;
-            } 
+            }
             self->data[i] = (MYFLT)self->currentValue;
-            self->currentTime += self->sampleToSec;    
+            self->currentTime += self->sampleToSec;
         }
         else
             self->data[i] = (MYFLT)self->currentValue;
@@ -2441,44 +2441,44 @@ TrigExpseg_setProcMode(TrigExpseg *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = TrigExpseg_generate;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TrigExpseg_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TrigExpseg_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TrigExpseg_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TrigExpseg_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TrigExpseg_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TrigExpseg_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TrigExpseg_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TrigExpseg_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TrigExpseg_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 TrigExpseg_compute_next_data_frame(TrigExpseg *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2487,20 +2487,20 @@ TrigExpseg_traverse(TrigExpseg *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->pointslist);
-    Py_VISIT(self->trig_stream);    
-    Py_VISIT(self->input);    
-    Py_VISIT(self->input_stream);    
+    Py_VISIT(self->trig_stream);
+    Py_VISIT(self->input);
+    Py_VISIT(self->input_stream);
     return 0;
 }
 
-static int 
+static int
 TrigExpseg_clear(TrigExpseg *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->pointslist);
-    Py_CLEAR(self->trig_stream);    
-    Py_CLEAR(self->input);    
-    Py_CLEAR(self->input_stream);    
+    Py_CLEAR(self->trig_stream);
+    Py_CLEAR(self->input);
+    Py_CLEAR(self->input_stream);
     return 0;
 }
 
@@ -2522,62 +2522,62 @@ TrigExpseg_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *pointslist=NULL, *multmp=NULL, *addtmp=NULL;
     TrigExpseg *self;
     self = (TrigExpseg *)type->tp_alloc(type, 0);
-    
+
     self->newlist = 1;
     self->exp = self->exp_tmp = 10;
     self->inverse = self->inverse_tmp = 1;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TrigExpseg_compute_next_data_frame);
     self->mode_func_ptr = TrigExpseg_setProcMode;
-    
+
     self->sampleToSec = 1. / self->sr;
 
     static char *kwlist[] = {"input", "list", "exp", "inverse", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|diOO", kwlist, &inputtmp, &pointslist, &self->exp_tmp, &self->inverse_tmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     Py_INCREF(pointslist);
     Py_XDECREF(self->pointslist);
     self->pointslist = pointslist;
     TrigExpseg_convert_pointslist((TrigExpseg *)self);
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     self->trigsBuffer = (MYFLT *)realloc(self->trigsBuffer, self->bufsize * sizeof(MYFLT));
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->trigsBuffer[i] = 0.0;
-    }    
+    }
 
     MAKE_NEW_TRIGGER_STREAM(self->trig_stream, &TriggerStreamType, NULL);
     TriggerStream_setData(self->trig_stream, self->trigsBuffer);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * TrigExpseg_getServer(TrigExpseg* self) { GET_SERVER };
 static PyObject * TrigExpseg_getStream(TrigExpseg* self) { GET_STREAM };
 static PyObject * TrigExpseg_getTriggerStream(TrigExpseg* self) { GET_TRIGGER_STREAM };
-static PyObject * TrigExpseg_setMul(TrigExpseg *self, PyObject *arg) { SET_MUL };	
-static PyObject * TrigExpseg_setAdd(TrigExpseg *self, PyObject *arg) { SET_ADD };	
-static PyObject * TrigExpseg_setSub(TrigExpseg *self, PyObject *arg) { SET_SUB };	
-static PyObject * TrigExpseg_setDiv(TrigExpseg *self, PyObject *arg) { SET_DIV };	
+static PyObject * TrigExpseg_setMul(TrigExpseg *self, PyObject *arg) { SET_MUL };
+static PyObject * TrigExpseg_setAdd(TrigExpseg *self, PyObject *arg) { SET_ADD };
+static PyObject * TrigExpseg_setSub(TrigExpseg *self, PyObject *arg) { SET_SUB };
+static PyObject * TrigExpseg_setDiv(TrigExpseg *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TrigExpseg_play(TrigExpseg *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TrigExpseg_stop(TrigExpseg *self) { STOP };
@@ -2598,18 +2598,18 @@ TrigExpseg_setList(TrigExpseg *self, PyObject *value)
         PyErr_SetString(PyExc_TypeError, "Cannot delete the list attribute.");
         return PyInt_FromLong(-1);
     }
-    
+
     if (! PyList_Check(value)) {
         PyErr_SetString(PyExc_TypeError, "The points list attribute value must be a list of tuples.");
         return PyInt_FromLong(-1);
     }
-    
+
     Py_INCREF(value);
     Py_DECREF(self->pointslist);
-    self->pointslist = value; 
-    
+    self->pointslist = value;
+
     self->newlist = 1;
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2621,9 +2621,9 @@ TrigExpseg_setExp(TrigExpseg *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->exp_tmp = PyFloat_AsDouble(PyNumber_Float(arg));
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2635,9 +2635,9 @@ TrigExpseg_setInverse(TrigExpseg *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     self->inverse_tmp = PyInt_AsLong(PyNumber_Int(arg));
-    
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -2779,18 +2779,18 @@ typedef struct {
     int loopCountRec;
     int loopLen;
     int loopStop;
-    int modebuffer[4]; // need at least 2 slots for mul & add 
+    int modebuffer[4]; // need at least 2 slots for mul & add
 } TrigXnoise;
 
 // no parameter
 static MYFLT
 TrigXnoise_uniform(TrigXnoise *self) {
-    return RANDOM_UNIFORM;    
+    return RANDOM_UNIFORM;
 }
 
 static MYFLT
 TrigXnoise_linear_min(TrigXnoise *self) {
-    MYFLT a = RANDOM_UNIFORM;    
+    MYFLT a = RANDOM_UNIFORM;
     MYFLT b = RANDOM_UNIFORM;
     if (a < b) return a;
     else return b;
@@ -2798,7 +2798,7 @@ TrigXnoise_linear_min(TrigXnoise *self) {
 
 static MYFLT
 TrigXnoise_linear_max(TrigXnoise *self) {
-    MYFLT a = RANDOM_UNIFORM;    
+    MYFLT a = RANDOM_UNIFORM;
     MYFLT b = RANDOM_UNIFORM;
     if (a > b) return a;
     else return b;
@@ -2806,7 +2806,7 @@ TrigXnoise_linear_max(TrigXnoise *self) {
 
 static MYFLT
 TrigXnoise_triangle(TrigXnoise *self) {
-    MYFLT a = RANDOM_UNIFORM;    
+    MYFLT a = RANDOM_UNIFORM;
     MYFLT b = RANDOM_UNIFORM;
     return ((a + b) * 0.5);
 }
@@ -2815,7 +2815,7 @@ TrigXnoise_triangle(TrigXnoise *self) {
 static MYFLT
 TrigXnoise_expon_min(TrigXnoise *self) {
     if (self->xx1 <= 0.0) self->xx1 = 0.00001;
-    MYFLT val = -MYLOG(RANDOM_UNIFORM) / self->xx1;    
+    MYFLT val = -MYLOG(RANDOM_UNIFORM) / self->xx1;
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -2824,7 +2824,7 @@ TrigXnoise_expon_min(TrigXnoise *self) {
 static MYFLT
 TrigXnoise_expon_max(TrigXnoise *self) {
     if (self->xx1 <= 0.0) self->xx1 = 0.00001;
-    MYFLT val = 1.0 - (-MYLOG(RANDOM_UNIFORM) / self->xx1);    
+    MYFLT val = 1.0 - (-MYLOG(RANDOM_UNIFORM) / self->xx1);
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -2836,16 +2836,16 @@ TrigXnoise_biexpon(TrigXnoise *self) {
     MYFLT polar, val;
     if (self->xx1 <= 0.0) self->xx1 = 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->xx1) + 0.5;
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -2858,14 +2858,14 @@ TrigXnoise_cauchy(TrigXnoise *self) {
         rnd = RANDOM_UNIFORM;
     }
     while (rnd == 0.5);
-    
+
     if (rand() < (RAND_MAX / 2))
         dir = -1;
     else
         dir = 1;
-    
+
     val = 0.5 * (MYTAN(rnd) * self->xx1 * dir) + 0.5;
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -2876,10 +2876,10 @@ static MYFLT
 TrigXnoise_weibull(TrigXnoise *self) {
     MYFLT rnd, val;
     if (self->xx2 <= 0.0) self->xx2 = 0.00001;
-    
+
     rnd = 1.0 / (1.0 - RANDOM_UNIFORM);
     val = self->xx1 * MYPOW(MYLOG(rnd), (1.0 / self->xx2));
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -2889,10 +2889,10 @@ TrigXnoise_weibull(TrigXnoise *self) {
 static MYFLT
 TrigXnoise_gaussian(TrigXnoise *self) {
     MYFLT rnd, val;
-    
+
     rnd = (RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM);
     val = (self->xx2 * (rnd - 3.0) * 0.33 + self->xx1);
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -2906,7 +2906,7 @@ TrigXnoise_poisson(TrigXnoise *self) {
     MYFLT val;
     if (self->xx1 < 0.1) self->xx1 = 0.1;
     if (self->xx2 < 0.1) self->xx2 = 0.1;
-    
+
     if (self->xx1 != self->lastPoissonX1) {
         self->lastPoissonX1 = self->xx1;
         self->poisson_tab = 0;
@@ -2921,7 +2921,7 @@ TrigXnoise_poisson(TrigXnoise *self) {
         }
     }
     val = self->poisson_buffer[rand() % self->poisson_tab] / 12.0 * self->xx2;
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -2931,22 +2931,22 @@ TrigXnoise_poisson(TrigXnoise *self) {
 static MYFLT
 TrigXnoise_walker(TrigXnoise *self) {
     int modulo, dir;
-    
+
     if (self->xx2 < 0.002) self->xx2 = 0.002;
-    
+
     modulo = (int)(self->xx2 * 1000.0);
     dir = rand() % 2;
-    
+
     if (dir == 0)
         self->walkerValue = self->walkerValue + (((rand() % modulo) - (modulo / 2)) * 0.001);
     else
         self->walkerValue = self->walkerValue - (((rand() % modulo) - (modulo / 2)) * 0.001);
-    
+
     if (self->walkerValue > self->xx1)
         self->walkerValue = self->xx1;
     if (self->walkerValue < 0.0)
         self->walkerValue = 0.0;
-    
+
     return self->walkerValue;
 }
 
@@ -2954,28 +2954,28 @@ TrigXnoise_walker(TrigXnoise *self) {
 static MYFLT
 TrigXnoise_loopseg(TrigXnoise *self) {
     int modulo, dir;
-    
+
     if (self->loopChoice == 0) {
-        
+
         self->loopCountPlay = self->loopTime = 0;
-        
+
         if (self->xx2 < 0.002) self->xx2 = 0.002;
-        
+
         modulo = (int)(self->xx2 * 1000.0);
         dir = rand() % 2;
-        
+
         if (dir == 0)
             self->walkerValue = self->walkerValue + (((rand() % modulo) - (modulo / 2)) * 0.001);
         else
             self->walkerValue = self->walkerValue - (((rand() % modulo) - (modulo / 2)) * 0.001);
-        
+
         if (self->walkerValue > self->xx1)
             self->walkerValue = self->xx1;
         if (self->walkerValue < 0.0)
             self->walkerValue = 0.0;
-        
+
         self->loop_buffer[self->loopCountRec++] = self->walkerValue;
-        
+
         if (self->loopCountRec < self->loopLen)
             self->loopChoice = 0;
         else {
@@ -2985,22 +2985,22 @@ TrigXnoise_loopseg(TrigXnoise *self) {
     }
     else {
         self->loopCountRec = 0;
-        
+
         self->walkerValue = self->loop_buffer[self->loopCountPlay++];
-        
+
         if (self->loopCountPlay < self->loopLen)
             self->loopChoice = 1;
         else {
             self->loopCountPlay = 0;
             self->loopTime++;
         }
-        
+
         if (self->loopTime == self->loopStop) {
             self->loopChoice = 0;
             self->loopLen = (rand() % 10) + 3;
         }
     }
-    
+
     return self->walkerValue;
 }
 
@@ -3010,7 +3010,7 @@ TrigXnoise_generate_ii(TrigXnoise *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     self->xx1 = PyFloat_AS_DOUBLE(self->x1);
     self->xx2 = PyFloat_AS_DOUBLE(self->x2);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1)
             self->value = (*self->type_func_ptr)(self);
@@ -3024,7 +3024,7 @@ TrigXnoise_generate_ai(TrigXnoise *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *x1 = Stream_getData((Stream *)self->x1_stream);
     self->xx2 = PyFloat_AS_DOUBLE(self->x2);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1) {
             self->xx1 = x1[i];
@@ -3040,7 +3040,7 @@ TrigXnoise_generate_ia(TrigXnoise *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     self->xx1 = PyFloat_AS_DOUBLE(self->x1);
     MYFLT *x2 = Stream_getData((Stream *)self->x2_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1) {
             self->xx2 = x2[i];
@@ -3056,7 +3056,7 @@ TrigXnoise_generate_aa(TrigXnoise *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *x1 = Stream_getData((Stream *)self->x1_stream);
     MYFLT *x2 = Stream_getData((Stream *)self->x2_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1) {
             self->xx1 = x1[i];
@@ -3080,8 +3080,8 @@ static void TrigXnoise_postprocessing_revareva(TrigXnoise *self) { POST_PROCESSI
 static void
 TrigXnoise_setRandomType(TrigXnoise *self)
 {
-    
-    switch (self->type) {            
+
+    switch (self->type) {
         case 0:
             self->type_func_ptr = TrigXnoise_uniform;
             break;
@@ -3121,7 +3121,7 @@ TrigXnoise_setRandomType(TrigXnoise *self)
         case 12:
             self->type_func_ptr = TrigXnoise_loopseg;
             break;
-    }        
+    }
 }
 
 static void
@@ -3130,56 +3130,56 @@ TrigXnoise_setProcMode(TrigXnoise *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = TrigXnoise_generate_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = TrigXnoise_generate_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = TrigXnoise_generate_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = TrigXnoise_generate_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TrigXnoise_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TrigXnoise_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TrigXnoise_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TrigXnoise_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TrigXnoise_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TrigXnoise_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TrigXnoise_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TrigXnoise_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TrigXnoise_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 TrigXnoise_compute_next_data_frame(TrigXnoise *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3189,23 +3189,23 @@ TrigXnoise_traverse(TrigXnoise *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->x1);    
-    Py_VISIT(self->x1_stream);    
-    Py_VISIT(self->x2);    
-    Py_VISIT(self->x2_stream);    
+    Py_VISIT(self->x1);
+    Py_VISIT(self->x1_stream);
+    Py_VISIT(self->x2);
+    Py_VISIT(self->x2_stream);
     return 0;
 }
 
-static int 
+static int
 TrigXnoise_clear(TrigXnoise *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->x1);    
-    Py_CLEAR(self->x1_stream);    
-    Py_CLEAR(self->x2);    
-    Py_CLEAR(self->x2_stream);    
+    Py_CLEAR(self->x1);
+    Py_CLEAR(self->x1_stream);
+    Py_CLEAR(self->x2);
+    Py_CLEAR(self->x2_stream);
     return 0;
 }
 
@@ -3224,7 +3224,7 @@ TrigXnoise_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *x1tmp=NULL, *x2tmp=NULL, *multmp=NULL, *addtmp=NULL;
     TrigXnoise *self;
     self = (TrigXnoise *)type->tp_alloc(type, 0);
-        
+
     self->x1 = PyFloat_FromDouble(0.5);
     self->x2 = PyFloat_FromDouble(0.5);
     self->xx1 = self->xx2 = self->walkerValue = 0.5;
@@ -3235,7 +3235,7 @@ TrigXnoise_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[3] = 0;
 
     INIT_OBJECT_COMMON
-    
+
     Server_generateSeed((Server *)self->server, TRIGXNOISE_ID);
 
     self->poisson_tab = 0;
@@ -3246,23 +3246,23 @@ TrigXnoise_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     for (i=0; i<15; i++) {
         self->loop_buffer[i] = 0.0;
     }
-    self->loopChoice = self->loopCountPlay = self->loopTime = self->loopCountRec = self->loopStop = 0;    
+    self->loopChoice = self->loopCountPlay = self->loopTime = self->loopCountRec = self->loopStop = 0;
     self->loopLen = (rand() % 10) + 3;
-    
+
     Stream_setFunctionPtr(self->stream, TrigXnoise_compute_next_data_frame);
     self->mode_func_ptr = TrigXnoise_setProcMode;
 
     static char *kwlist[] = {"input", "type", "x1", "x2", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iOOOO", kwlist, &inputtmp, &self->type, &x1tmp, &x2tmp, &multmp, &addtmp))
         Py_RETURN_NONE;
 
     INIT_INPUT_STREAM
-    
+
     if (x1tmp) {
         PyObject_CallMethod((PyObject *)self, "setX1", "O", x1tmp);
     }
-    
+
     if (x2tmp) {
         PyObject_CallMethod((PyObject *)self, "setX2", "O", x2tmp);
     }
@@ -3270,15 +3270,15 @@ TrigXnoise_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     TrigXnoise_setRandomType(self);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -3286,10 +3286,10 @@ TrigXnoise_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * TrigXnoise_getServer(TrigXnoise* self) { GET_SERVER };
 static PyObject * TrigXnoise_getStream(TrigXnoise* self) { GET_STREAM };
-static PyObject * TrigXnoise_setMul(TrigXnoise *self, PyObject *arg) { SET_MUL };	
-static PyObject * TrigXnoise_setAdd(TrigXnoise *self, PyObject *arg) { SET_ADD };	
-static PyObject * TrigXnoise_setSub(TrigXnoise *self, PyObject *arg) { SET_SUB };	
-static PyObject * TrigXnoise_setDiv(TrigXnoise *self, PyObject *arg) { SET_DIV };	
+static PyObject * TrigXnoise_setMul(TrigXnoise *self, PyObject *arg) { SET_MUL };
+static PyObject * TrigXnoise_setAdd(TrigXnoise *self, PyObject *arg) { SET_ADD };
+static PyObject * TrigXnoise_setSub(TrigXnoise *self, PyObject *arg) { SET_SUB };
+static PyObject * TrigXnoise_setDiv(TrigXnoise *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TrigXnoise_play(TrigXnoise *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TrigXnoise_out(TrigXnoise *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3306,35 +3306,35 @@ static PyObject * TrigXnoise_inplace_div(TrigXnoise *self, PyObject *arg) { INPL
 
 static PyObject *
 TrigXnoise_setType(TrigXnoise *self, PyObject *arg)
-{	
+{
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyInt_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->type = PyInt_AsLong(arg);
         TrigXnoise_setRandomType(self);
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TrigXnoise_setX1(TrigXnoise *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->x1);
@@ -3350,25 +3350,25 @@ TrigXnoise_setX1(TrigXnoise *self, PyObject *arg)
         self->x1_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TrigXnoise_setX2(TrigXnoise *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->x2);
@@ -3384,12 +3384,12 @@ TrigXnoise_setX2(TrigXnoise *self, PyObject *arg)
         self->x2_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef TrigXnoise_members[] = {
     {"server", T_OBJECT_EX, offsetof(TrigXnoise, server), 0, "Pyo server."},
@@ -3533,21 +3533,21 @@ typedef struct {
     int loopCountRec;
     int loopLen;
     int loopStop;
-    int modebuffer[4]; // need at least 2 slots for mul & add 
+    int modebuffer[4]; // need at least 2 slots for mul & add
 } TrigXnoiseMidi;
 
 static MYFLT
 TrigXnoiseMidi_convert(TrigXnoiseMidi *self) {
     int midival;
     MYFLT val;
-    
+
     midival = (int)((self->value * (self->range_max-self->range_min)) + self->range_min);
-    
+
     if (midival < 0)
         midival = 0;
     else if (midival > 127)
         midival = 127;
-    
+
     if (self->scale == 0)
         val = (MYFLT)midival;
     else if (self->scale == 1)
@@ -3564,12 +3564,12 @@ TrigXnoiseMidi_convert(TrigXnoiseMidi *self) {
 // no parameter
 static MYFLT
 TrigXnoiseMidi_uniform(TrigXnoiseMidi *self) {
-    return RANDOM_UNIFORM;    
+    return RANDOM_UNIFORM;
 }
 
 static MYFLT
 TrigXnoiseMidi_linear_min(TrigXnoiseMidi *self) {
-    MYFLT a = RANDOM_UNIFORM;    
+    MYFLT a = RANDOM_UNIFORM;
     MYFLT b = RANDOM_UNIFORM;
     if (a < b) return a;
     else return b;
@@ -3577,7 +3577,7 @@ TrigXnoiseMidi_linear_min(TrigXnoiseMidi *self) {
 
 static MYFLT
 TrigXnoiseMidi_linear_max(TrigXnoiseMidi *self) {
-    MYFLT a = RANDOM_UNIFORM;    
+    MYFLT a = RANDOM_UNIFORM;
     MYFLT b = RANDOM_UNIFORM;
     if (a > b) return a;
     else return b;
@@ -3585,7 +3585,7 @@ TrigXnoiseMidi_linear_max(TrigXnoiseMidi *self) {
 
 static MYFLT
 TrigXnoiseMidi_triangle(TrigXnoiseMidi *self) {
-    MYFLT a = RANDOM_UNIFORM;    
+    MYFLT a = RANDOM_UNIFORM;
     MYFLT b = RANDOM_UNIFORM;
     return ((a + b) * 0.5);
 }
@@ -3594,7 +3594,7 @@ TrigXnoiseMidi_triangle(TrigXnoiseMidi *self) {
 static MYFLT
 TrigXnoiseMidi_expon_min(TrigXnoiseMidi *self) {
     if (self->xx1 <= 0.0) self->xx1 = 0.00001;
-    MYFLT val = -MYLOG10(RANDOM_UNIFORM) / self->xx1;    
+    MYFLT val = -MYLOG10(RANDOM_UNIFORM) / self->xx1;
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -3603,7 +3603,7 @@ TrigXnoiseMidi_expon_min(TrigXnoiseMidi *self) {
 static MYFLT
 TrigXnoiseMidi_expon_max(TrigXnoiseMidi *self) {
     if (self->xx1 <= 0.0) self->xx1 = 0.00001;
-    MYFLT val = 1.0 - (-MYLOG10(RANDOM_UNIFORM) / self->xx1);    
+    MYFLT val = 1.0 - (-MYLOG10(RANDOM_UNIFORM) / self->xx1);
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -3615,16 +3615,16 @@ TrigXnoiseMidi_biexpon(TrigXnoiseMidi *self) {
     MYFLT polar, val;
     if (self->xx1 <= 0.0) self->xx1 = 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 * MYLOG10(sum) / self->xx1) + 0.5;
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -3637,14 +3637,14 @@ TrigXnoiseMidi_cauchy(TrigXnoiseMidi *self) {
         rnd = RANDOM_UNIFORM;
     }
     while (rnd == 0.5);
-    
+
     if (rand() < (RAND_MAX / 2))
         dir = -1;
     else
         dir = 1;
-    
+
     val = 0.5 * (MYTAN(rnd) * self->xx1 * dir) + 0.5;
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -3655,10 +3655,10 @@ static MYFLT
 TrigXnoiseMidi_weibull(TrigXnoiseMidi *self) {
     MYFLT rnd, val;
     if (self->xx2 <= 0.0) self->xx2 = 0.00001;
-    
+
     rnd = 1.0 / (1.0 - RANDOM_UNIFORM);
     val = self->xx1 * MYPOW(MYLOG(rnd), (1.0 / self->xx2));
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -3668,10 +3668,10 @@ TrigXnoiseMidi_weibull(TrigXnoiseMidi *self) {
 static MYFLT
 TrigXnoiseMidi_gaussian(TrigXnoiseMidi *self) {
     MYFLT rnd, val;
-    
+
     rnd = (RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM);
     val = (self->xx2 * (rnd - 3.0) * 0.33 + self->xx1);
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -3685,7 +3685,7 @@ TrigXnoiseMidi_poisson(TrigXnoiseMidi *self) {
     MYFLT val;
     if (self->xx1 < 0.1) self->xx1 = 0.1;
     if (self->xx2 < 0.1) self->xx2 = 0.1;
-    
+
     if (self->xx1 != self->lastPoissonX1) {
         self->lastPoissonX1 = self->xx1;
         self->poisson_tab = 0;
@@ -3700,7 +3700,7 @@ TrigXnoiseMidi_poisson(TrigXnoiseMidi *self) {
         }
     }
     val = self->poisson_buffer[rand() % self->poisson_tab] / 12.0 * self->xx2;
-    
+
     if (val < 0.0) return 0.0;
     else if (val > 1.0) return 1.0;
     else return val;
@@ -3710,22 +3710,22 @@ TrigXnoiseMidi_poisson(TrigXnoiseMidi *self) {
 static MYFLT
 TrigXnoiseMidi_walker(TrigXnoiseMidi *self) {
     int modulo, dir;
-    
+
     if (self->xx2 < 0.002) self->xx2 = 0.002;
-    
+
     modulo = (int)(self->xx2 * 1000.0);
     dir = rand() % 2;
-    
+
     if (dir == 0)
         self->walkerValue = self->walkerValue + (((rand() % modulo) - (modulo / 2)) * 0.001);
     else
         self->walkerValue = self->walkerValue - (((rand() % modulo) - (modulo / 2)) * 0.001);
-    
+
     if (self->walkerValue > self->xx1)
         self->walkerValue = self->xx1;
     if (self->walkerValue < 0.0)
         self->walkerValue = 0.0;
-    
+
     return self->walkerValue;
 }
 
@@ -3733,28 +3733,28 @@ TrigXnoiseMidi_walker(TrigXnoiseMidi *self) {
 static MYFLT
 TrigXnoiseMidi_loopseg(TrigXnoiseMidi *self) {
     int modulo, dir;
-    
+
     if (self->loopChoice == 0) {
-        
+
         self->loopCountPlay = self->loopTime = 0;
-        
+
         if (self->xx2 < 0.002) self->xx2 = 0.002;
-        
+
         modulo = (int)(self->xx2 * 1000.0);
         dir = rand() % 2;
-        
+
         if (dir == 0)
             self->walkerValue = self->walkerValue + (((rand() % modulo) - (modulo / 2)) * 0.001);
         else
             self->walkerValue = self->walkerValue - (((rand() % modulo) - (modulo / 2)) * 0.001);
-        
+
         if (self->walkerValue > self->xx1)
             self->walkerValue = self->xx1;
         if (self->walkerValue < 0.0)
             self->walkerValue = 0.0;
-        
+
         self->loop_buffer[self->loopCountRec++] = self->walkerValue;
-        
+
         if (self->loopCountRec < self->loopLen)
             self->loopChoice = 0;
         else {
@@ -3764,22 +3764,22 @@ TrigXnoiseMidi_loopseg(TrigXnoiseMidi *self) {
     }
     else {
         self->loopCountRec = 0;
-        
+
         self->walkerValue = self->loop_buffer[self->loopCountPlay++];
-        
+
         if (self->loopCountPlay < self->loopLen)
             self->loopChoice = 1;
         else {
             self->loopCountPlay = 0;
             self->loopTime++;
         }
-        
+
         if (self->loopTime == self->loopStop) {
             self->loopChoice = 0;
             self->loopLen = (rand() % 10) + 3;
         }
     }
-    
+
     return self->walkerValue;
 }
 
@@ -3789,12 +3789,12 @@ TrigXnoiseMidi_generate_ii(TrigXnoiseMidi *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     self->xx1 = PyFloat_AS_DOUBLE(self->x1);
     self->xx2 = PyFloat_AS_DOUBLE(self->x2);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1) {
             self->value = (*self->type_func_ptr)(self);
             self->value = TrigXnoiseMidi_convert(self);
-        }    
+        }
         self->data[i] = self->value;
     }
 }
@@ -3805,7 +3805,7 @@ TrigXnoiseMidi_generate_ai(TrigXnoiseMidi *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *x1 = Stream_getData((Stream *)self->x1_stream);
     self->xx2 = PyFloat_AS_DOUBLE(self->x2);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1) {
             self->xx1 = x1[i];
@@ -3822,7 +3822,7 @@ TrigXnoiseMidi_generate_ia(TrigXnoiseMidi *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     self->xx1 = PyFloat_AS_DOUBLE(self->x1);
     MYFLT *x2 = Stream_getData((Stream *)self->x2_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1) {
             self->xx2 = x2[i];
@@ -3839,7 +3839,7 @@ TrigXnoiseMidi_generate_aa(TrigXnoiseMidi *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *x1 = Stream_getData((Stream *)self->x1_stream);
     MYFLT *x2 = Stream_getData((Stream *)self->x2_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1) {
             self->xx1 = x1[i];
@@ -3864,8 +3864,8 @@ static void TrigXnoiseMidi_postprocessing_revareva(TrigXnoiseMidi *self) { POST_
 static void
 TrigXnoiseMidi_setRandomType(TrigXnoiseMidi *self)
 {
-    
-    switch (self->type) {            
+
+    switch (self->type) {
         case 0:
             self->type_func_ptr = TrigXnoiseMidi_uniform;
             break;
@@ -3905,7 +3905,7 @@ TrigXnoiseMidi_setRandomType(TrigXnoiseMidi *self)
         case 12:
             self->type_func_ptr = TrigXnoiseMidi_loopseg;
             break;
-    }        
+    }
 }
 
 static void
@@ -3914,56 +3914,56 @@ TrigXnoiseMidi_setProcMode(TrigXnoiseMidi *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = TrigXnoiseMidi_generate_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = TrigXnoiseMidi_generate_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = TrigXnoiseMidi_generate_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = TrigXnoiseMidi_generate_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TrigXnoiseMidi_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TrigXnoiseMidi_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TrigXnoiseMidi_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TrigXnoiseMidi_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TrigXnoiseMidi_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TrigXnoiseMidi_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TrigXnoiseMidi_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TrigXnoiseMidi_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TrigXnoiseMidi_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 TrigXnoiseMidi_compute_next_data_frame(TrigXnoiseMidi *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3973,23 +3973,23 @@ TrigXnoiseMidi_traverse(TrigXnoiseMidi *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->x1);    
-    Py_VISIT(self->x1_stream);    
-    Py_VISIT(self->x2);    
-    Py_VISIT(self->x2_stream);    
+    Py_VISIT(self->x1);
+    Py_VISIT(self->x1_stream);
+    Py_VISIT(self->x2);
+    Py_VISIT(self->x2_stream);
     return 0;
 }
 
-static int 
+static int
 TrigXnoiseMidi_clear(TrigXnoiseMidi *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->x1);    
-    Py_CLEAR(self->x1_stream);    
-    Py_CLEAR(self->x2);    
-    Py_CLEAR(self->x2_stream);    
+    Py_CLEAR(self->x1);
+    Py_CLEAR(self->x1_stream);
+    Py_CLEAR(self->x2);
+    Py_CLEAR(self->x2_stream);
     return 0;
 }
 
@@ -4008,7 +4008,7 @@ TrigXnoiseMidi_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *x1tmp=NULL, *x2tmp=NULL, *rangetmp=NULL, *multmp=NULL, *addtmp=NULL;
     TrigXnoiseMidi *self;
     self = (TrigXnoiseMidi *)type->tp_alloc(type, 0);
-        
+
     self->x1 = PyFloat_FromDouble(0.5);
     self->x2 = PyFloat_FromDouble(0.5);
     self->xx1 = self->xx2 = self->walkerValue = 0.5;
@@ -4021,9 +4021,9 @@ TrigXnoiseMidi_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-        
+
     INIT_OBJECT_COMMON
-    
+
     Server_generateSeed((Server *)self->server, TRIGXNOISEMIDI_ID);
 
     self->poisson_tab = 0;
@@ -4034,23 +4034,23 @@ TrigXnoiseMidi_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     for (i=0; i<15; i++) {
         self->loop_buffer[i] = 0.0;
     }
-    self->loopChoice = self->loopCountPlay = self->loopTime = self->loopCountRec = self->loopStop = 0;    
+    self->loopChoice = self->loopCountPlay = self->loopTime = self->loopCountRec = self->loopStop = 0;
     self->loopLen = (rand() % 10) + 3;
-    
+
     Stream_setFunctionPtr(self->stream, TrigXnoiseMidi_compute_next_data_frame);
     self->mode_func_ptr = TrigXnoiseMidi_setProcMode;
 
     static char *kwlist[] = {"input", "type", "x1", "x2", "scale", "range", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iOOiOOO", kwlist, &inputtmp, &self->type, &x1tmp, &x2tmp, &self->scale, &rangetmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (x1tmp) {
         PyObject_CallMethod((PyObject *)self, "setX1", "O", x1tmp);
     }
-    
+
     if (x2tmp) {
         PyObject_CallMethod((PyObject *)self, "setX2", "O", x2tmp);
     }
@@ -4058,19 +4058,19 @@ TrigXnoiseMidi_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (rangetmp) {
         PyObject_CallMethod((PyObject *)self, "setRange", "O", rangetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     TrigXnoiseMidi_setRandomType(self);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -4078,10 +4078,10 @@ TrigXnoiseMidi_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * TrigXnoiseMidi_getServer(TrigXnoiseMidi* self) { GET_SERVER };
 static PyObject * TrigXnoiseMidi_getStream(TrigXnoiseMidi* self) { GET_STREAM };
-static PyObject * TrigXnoiseMidi_setMul(TrigXnoiseMidi *self, PyObject *arg) { SET_MUL };	
-static PyObject * TrigXnoiseMidi_setAdd(TrigXnoiseMidi *self, PyObject *arg) { SET_ADD };	
-static PyObject * TrigXnoiseMidi_setSub(TrigXnoiseMidi *self, PyObject *arg) { SET_SUB };	
-static PyObject * TrigXnoiseMidi_setDiv(TrigXnoiseMidi *self, PyObject *arg) { SET_DIV };	
+static PyObject * TrigXnoiseMidi_setMul(TrigXnoiseMidi *self, PyObject *arg) { SET_MUL };
+static PyObject * TrigXnoiseMidi_setAdd(TrigXnoiseMidi *self, PyObject *arg) { SET_ADD };
+static PyObject * TrigXnoiseMidi_setSub(TrigXnoiseMidi *self, PyObject *arg) { SET_SUB };
+static PyObject * TrigXnoiseMidi_setDiv(TrigXnoiseMidi *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TrigXnoiseMidi_play(TrigXnoiseMidi *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TrigXnoiseMidi_out(TrigXnoiseMidi *self, PyObject *args, PyObject *kwds) { OUT };
@@ -4098,34 +4098,34 @@ static PyObject * TrigXnoiseMidi_inplace_div(TrigXnoiseMidi *self, PyObject *arg
 
 static PyObject *
 TrigXnoiseMidi_setType(TrigXnoiseMidi *self, PyObject *arg)
-{	
+{
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyInt_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->type = PyInt_AsLong(arg);
         TrigXnoiseMidi_setRandomType(self);
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TrigXnoiseMidi_setScale(TrigXnoiseMidi *self, PyObject *arg)
-{	
+{
     int tmp;
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyInt_Check(arg);
-	
+
 	if (isNumber == 1) {
 		tmp = PyInt_AsLong(arg);
         if (tmp >= 0 && tmp <= 2)
@@ -4133,43 +4133,43 @@ TrigXnoiseMidi_setScale(TrigXnoiseMidi *self, PyObject *arg)
         else
             printf("scale attribute must be an integer {0, 1, 2}\n");
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TrigXnoiseMidi_setRange(TrigXnoiseMidi *self, PyObject *args)
-{	
+{
 	if (args == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isTuple = PyTuple_Check(args);
-    
+
 	if (isTuple == 1) {
         self->range_min = PyInt_AsLong(PyTuple_GET_ITEM(args, 0));
         self->range_max = PyInt_AsLong(PyTuple_GET_ITEM(args, 1));
         self->centralkey = (int)((self->range_max + self->range_min) / 2);
 	}
-    
+
     Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TrigXnoiseMidi_setX1(TrigXnoiseMidi *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->x1);
@@ -4185,25 +4185,25 @@ TrigXnoiseMidi_setX1(TrigXnoiseMidi *self, PyObject *arg)
         self->x1_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 TrigXnoiseMidi_setX2(TrigXnoiseMidi *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->x2);
@@ -4219,12 +4219,12 @@ TrigXnoiseMidi_setX2(TrigXnoiseMidi *self, PyObject *arg)
         self->x2_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef TrigXnoiseMidi_members[] = {
     {"server", T_OBJECT_EX, offsetof(TrigXnoiseMidi, server), 0, "Pyo server."},
@@ -4352,14 +4352,14 @@ typedef struct {
     int dir;
     int direction;
     MYFLT value;
-    int modebuffer[2]; // need at least 2 slots for mul & add 
+    int modebuffer[2]; // need at least 2 slots for mul & add
 } Counter;
 
 static void
 Counter_generates(Counter *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1) {
             self->value = (MYFLT)self->tmp;
@@ -4367,22 +4367,22 @@ Counter_generates(Counter *self) {
                 self->tmp++;
                 if (self->tmp >= self->max)
                     self->tmp = self->min;
-            }    
+            }
             else if (self->dir == 1) {
                 self->tmp--;
                 if (self->tmp < self->min)
                     self->tmp = self->max - 1;
-            }    
+            }
             else if (self->dir == 2) {
                 self->tmp = self->tmp + self->direction;
                 if (self->tmp >= self->max) {
                     self->direction = -1;
                     self->tmp = self->max - 2;
-                }    
+                }
                 if (self->tmp <= self->min) {
                     self->direction = 1;
                     self->tmp = self->min;
-                }    
+                }
             }
         }
         self->data[i] = self->value;
@@ -4404,44 +4404,44 @@ Counter_setProcMode(Counter *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = Counter_generates;
 
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Counter_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Counter_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Counter_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Counter_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Counter_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Counter_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Counter_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Counter_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Counter_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 Counter_compute_next_data_frame(Counter *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -4454,7 +4454,7 @@ Counter_traverse(Counter *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Counter_clear(Counter *self)
 {
     pyo_CLEAR
@@ -4478,40 +4478,40 @@ Counter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     Counter *self;
     self = (Counter *)type->tp_alloc(type, 0);
-    
+
     self->min = 0;
     self->max = 100;
     self->dir = 0;
     self->direction = 1;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Counter_compute_next_data_frame);
     self->mode_func_ptr = Counter_setProcMode;
 
     static char *kwlist[] = {"input", "min", "max", "dir", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|lliOO", kwlist, &inputtmp, &self->min, &self->max, &self->dir, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     if (self->dir == 0 || self->dir == 2)
         self->tmp = self->min;
     else
         self->tmp = self->max - 1;
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -4519,10 +4519,10 @@ Counter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Counter_getServer(Counter* self) { GET_SERVER };
 static PyObject * Counter_getStream(Counter* self) { GET_STREAM };
-static PyObject * Counter_setMul(Counter *self, PyObject *arg) { SET_MUL };	
-static PyObject * Counter_setAdd(Counter *self, PyObject *arg) { SET_ADD };	
-static PyObject * Counter_setSub(Counter *self, PyObject *arg) { SET_SUB };	
-static PyObject * Counter_setDiv(Counter *self, PyObject *arg) { SET_DIV };	
+static PyObject * Counter_setMul(Counter *self, PyObject *arg) { SET_MUL };
+static PyObject * Counter_setAdd(Counter *self, PyObject *arg) { SET_ADD };
+static PyObject * Counter_setSub(Counter *self, PyObject *arg) { SET_SUB };
+static PyObject * Counter_setDiv(Counter *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Counter_play(Counter *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Counter_stop(Counter *self) { STOP };
@@ -4538,57 +4538,57 @@ static PyObject * Counter_inplace_div(Counter *self, PyObject *arg) { INPLACE_DI
 
 static PyObject *
 Counter_setMin(Counter *self, PyObject *arg)
-{	
+{
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
-	if (PyLong_Check(arg) || PyInt_Check(arg)) {	
+
+	if (PyLong_Check(arg) || PyInt_Check(arg)) {
 		self->min = PyLong_AsLong(arg);
 	}
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Counter_setMax(Counter *self, PyObject *arg)
-{	
+{
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
-	if (PyLong_Check(arg) || PyInt_Check(arg)) {	
+
+	if (PyLong_Check(arg) || PyInt_Check(arg)) {
 		self->max = PyLong_AsLong(arg);
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Counter_setDir(Counter *self, PyObject *arg)
-{	
+{
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
-	if (PyInt_Check(arg)) {	
+
+	if (PyInt_Check(arg)) {
 		self->dir = PyInt_AsLong(arg);
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Counter_reset(Counter *self, PyObject *arg)
 {
     int val;
-    
+
     if (arg == Py_None) {
         if (self->dir == 0 || self->dir == 2)
             val = self->min;
@@ -4596,12 +4596,12 @@ Counter_reset(Counter *self, PyObject *arg)
             val = self->max - 1;
         self->tmp = val;
     }
-    
+
     else if (PyInt_Check(arg)) {
         val = PyInt_AsLong(arg);
         self->tmp = val;
     }
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -4745,7 +4745,7 @@ Thresh_generates_i(Thresh *self) {
                 }
                 else if (in[i] <= thresh && self->ready == 0)
                     self->ready = 1;
-            } 
+            }
             break;
         case 1:
             for (i=0; i<self->bufsize; i++) {
@@ -4756,7 +4756,7 @@ Thresh_generates_i(Thresh *self) {
                 }
                 else if (in[i] >= thresh && self->ready == 0)
                     self->ready = 1;
-            } 
+            }
             break;
         case 2:
             for (i=0; i<self->bufsize; i++) {
@@ -4768,8 +4768,8 @@ Thresh_generates_i(Thresh *self) {
                 else if (in[i] <= thresh && self->ready == 0) {
                     self->data[i] = 1.0;
                     self->ready = 1;
-                }    
-            } 
+                }
+            }
             break;
     }
 }
@@ -4779,7 +4779,7 @@ Thresh_generates_a(Thresh *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *thresh = Stream_getData((Stream *)self->threshold_stream);
-    
+
     switch (self->dir) {
         case 0:
             for (i=0; i<self->bufsize; i++) {
@@ -4790,7 +4790,7 @@ Thresh_generates_a(Thresh *self) {
                 }
                 else if (in[i] <= thresh[i] && self->ready == 0)
                     self->ready = 1;
-            } 
+            }
             break;
         case 1:
             for (i=0; i<self->bufsize; i++) {
@@ -4801,7 +4801,7 @@ Thresh_generates_a(Thresh *self) {
                 }
                 else if (in[i] >= thresh[i] && self->ready == 0)
                     self->ready = 1;
-            } 
+            }
             break;
         case 2:
             for (i=0; i<self->bufsize; i++) {
@@ -4813,7 +4813,7 @@ Thresh_generates_a(Thresh *self) {
                 else if (in[i] <= thresh[i] && self->ready == 0)
                     self->data[i] = 1.0;
                 self->ready = 1;
-            } 
+            }
             break;
     }
 }
@@ -4830,53 +4830,53 @@ static void Thresh_postprocessing_revareva(Thresh *self) { POST_PROCESSING_REVAR
 
 static void
 Thresh_setProcMode(Thresh *self)
-{    
+{
     int procmode = self->modebuffer[2];
     int muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
 
     switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = Thresh_generates_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Thresh_generates_a;
             break;
     }
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Thresh_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Thresh_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Thresh_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Thresh_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Thresh_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Thresh_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Thresh_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Thresh_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Thresh_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 Thresh_compute_next_data_frame(Thresh *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -4891,7 +4891,7 @@ Thresh_traverse(Thresh *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Thresh_clear(Thresh *self)
 {
     pyo_CLEAR
@@ -4917,36 +4917,36 @@ Thresh_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *thresholdtmp, *multmp=NULL, *addtmp=NULL;
     Thresh *self;
     self = (Thresh *)type->tp_alloc(type, 0);
-    
+
     self->threshold = PyFloat_FromDouble(0.);
     self->dir = 0;
     self->ready = 0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
     self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Thresh_compute_next_data_frame);
     self->mode_func_ptr = Thresh_setProcMode;
 
     static char *kwlist[] = {"input", "threshold", "dir", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OiOO", kwlist, &inputtmp, &thresholdtmp, &self->dir, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (thresholdtmp) {
         PyObject_CallMethod((PyObject *)self, "setThreshold", "O", thresholdtmp);
     }
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
@@ -4956,10 +4956,10 @@ Thresh_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Thresh_getServer(Thresh* self) { GET_SERVER };
 static PyObject * Thresh_getStream(Thresh* self) { GET_STREAM };
-static PyObject * Thresh_setMul(Thresh *self, PyObject *arg) { SET_MUL };	
-static PyObject * Thresh_setAdd(Thresh *self, PyObject *arg) { SET_ADD };	
-static PyObject * Thresh_setSub(Thresh *self, PyObject *arg) { SET_SUB };	
-static PyObject * Thresh_setDiv(Thresh *self, PyObject *arg) { SET_DIV };	
+static PyObject * Thresh_setMul(Thresh *self, PyObject *arg) { SET_MUL };
+static PyObject * Thresh_setAdd(Thresh *self, PyObject *arg) { SET_ADD };
+static PyObject * Thresh_setSub(Thresh *self, PyObject *arg) { SET_SUB };
+static PyObject * Thresh_setDiv(Thresh *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Thresh_play(Thresh *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Thresh_stop(Thresh *self) { STOP };
@@ -4977,14 +4977,14 @@ static PyObject *
 Thresh_setThreshold(Thresh *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->threshold);
@@ -5000,28 +5000,28 @@ Thresh_setThreshold(Thresh *self, PyObject *arg)
         self->threshold_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Thresh_setDir(Thresh *self, PyObject *arg)
-{	
+{
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
-	if (PyInt_Check(arg)) {	
+
+	if (PyInt_Check(arg)) {
 		self->dir = PyInt_AsLong(arg);
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Thresh_members[] = {
 {"server", T_OBJECT_EX, offsetof(Thresh, server), 0, "Pyo server."},
@@ -5155,7 +5155,7 @@ Percent_generates_i(Percent *self) {
             guess = (rand()/((MYFLT)(RAND_MAX)+1)) * 100.0;
             if (guess <= perc)
                 self->data[i] = 1.0;
-        }    
+        }
     }
 }
 
@@ -5165,14 +5165,14 @@ Percent_generates_a(Percent *self) {
     MYFLT guess;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *perc = Stream_getData((Stream *)self->percent_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = 0.0;
         if (in[i] == 1.0) {
             guess = (rand()/((MYFLT)(RAND_MAX)+1)) * 100.0;
             if (guess <= perc[i])
                 self->data[i] = 1.0;
-        }    
+        }
     }
 }
 
@@ -5188,54 +5188,54 @@ static void Percent_postprocessing_revareva(Percent *self) { POST_PROCESSING_REV
 
 static void
 Percent_setProcMode(Percent *self)
-{    
+{
     int muladdmode, procmode
     ;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
     switch (procmode) {
-        case 0:        
+        case 0:
             self->proc_func_ptr = Percent_generates_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Percent_generates_a;
             break;
     }
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Percent_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Percent_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Percent_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Percent_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Percent_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Percent_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Percent_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Percent_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Percent_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 Percent_compute_next_data_frame(Percent *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -5250,7 +5250,7 @@ Percent_traverse(Percent *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Percent_clear(Percent *self)
 {
     pyo_CLEAR
@@ -5276,36 +5276,36 @@ Percent_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *percenttmp, *multmp=NULL, *addtmp=NULL;
     Percent *self;
     self = (Percent *)type->tp_alloc(type, 0);
-    
+
     self->percent = PyFloat_FromDouble(50.);
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
     self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Percent_compute_next_data_frame);
     self->mode_func_ptr = Percent_setProcMode;
 
     static char *kwlist[] = {"input", "percent", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOO", kwlist, &inputtmp, &percenttmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (percenttmp) {
         PyObject_CallMethod((PyObject *)self, "setPercent", "O", percenttmp);
     }
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     Server_generateSeed((Server *)self->server, PERCENT_ID);
 
     (*self->mode_func_ptr)(self);
@@ -5315,10 +5315,10 @@ Percent_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Percent_getServer(Percent* self) { GET_SERVER };
 static PyObject * Percent_getStream(Percent* self) { GET_STREAM };
-static PyObject * Percent_setMul(Percent *self, PyObject *arg) { SET_MUL };	
-static PyObject * Percent_setAdd(Percent *self, PyObject *arg) { SET_ADD };	
-static PyObject * Percent_setSub(Percent *self, PyObject *arg) { SET_SUB };	
-static PyObject * Percent_setDiv(Percent *self, PyObject *arg) { SET_DIV };	
+static PyObject * Percent_setMul(Percent *self, PyObject *arg) { SET_MUL };
+static PyObject * Percent_setAdd(Percent *self, PyObject *arg) { SET_ADD };
+static PyObject * Percent_setSub(Percent *self, PyObject *arg) { SET_SUB };
+static PyObject * Percent_setDiv(Percent *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Percent_play(Percent *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Percent_stop(Percent *self) { STOP };
@@ -5336,14 +5336,14 @@ static PyObject *
 Percent_setPercent(Percent *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->percent);
@@ -5359,12 +5359,12 @@ Percent_setPercent(Percent *self, PyObject *arg)
         self->percent_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Percent_members[] = {
     {"server", T_OBJECT_EX, offsetof(Percent, server), 0, "Pyo server."},
@@ -5493,7 +5493,7 @@ Timer_generates(Timer *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *in2 = Stream_getData((Stream *)self->input2_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (self->started == 1) {
             self->count++;
@@ -5502,14 +5502,14 @@ Timer_generates(Timer *self) {
                 self->started = 0;
             }
         }
-        
+
         if (in2[i] == 1 && self->started == 0) {
             self->count = 0;
             self->started = 1;
         }
-        
+
         self->data[i] = self->lasttime;
-    } 
+    }
 }
 
 static void Timer_postprocessing_ii(Timer *self) { POST_PROCESSING_II };
@@ -5524,46 +5524,46 @@ static void Timer_postprocessing_revareva(Timer *self) { POST_PROCESSING_REVAREV
 
 static void
 Timer_setProcMode(Timer *self)
-{    
+{
     int muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = Timer_generates;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Timer_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Timer_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Timer_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Timer_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Timer_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Timer_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Timer_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Timer_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Timer_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 Timer_compute_next_data_frame(Timer *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -5578,7 +5578,7 @@ Timer_traverse(Timer *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Timer_clear(Timer *self)
 {
     pyo_CLEAR
@@ -5604,41 +5604,41 @@ Timer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *input2tmp, *input2_streamtmp, *multmp=NULL, *addtmp=NULL;
     Timer *self;
     self = (Timer *)type->tp_alloc(type, 0);
-    
+
     self->count = 0;
     self->started = 0;
     self->lasttime = 0.0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Timer_compute_next_data_frame);
     self->mode_func_ptr = Timer_setProcMode;
 
     static char *kwlist[] = {"input", "input2", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist, &inputtmp, &input2tmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     Py_XDECREF(self->input2);
     self->input2 = input2tmp;
     input2_streamtmp = PyObject_CallMethod((PyObject *)self->input2, "_getStream", NULL);
     Py_INCREF(input2_streamtmp);
     Py_XDECREF(self->input2_stream);
     self->input2_stream = (Stream *)input2_streamtmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -5646,10 +5646,10 @@ Timer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Timer_getServer(Timer* self) { GET_SERVER };
 static PyObject * Timer_getStream(Timer* self) { GET_STREAM };
-static PyObject * Timer_setMul(Timer *self, PyObject *arg) { SET_MUL };	
-static PyObject * Timer_setAdd(Timer *self, PyObject *arg) { SET_ADD };	
-static PyObject * Timer_setSub(Timer *self, PyObject *arg) { SET_SUB };	
-static PyObject * Timer_setDiv(Timer *self, PyObject *arg) { SET_DIV };	
+static PyObject * Timer_setMul(Timer *self, PyObject *arg) { SET_MUL };
+static PyObject * Timer_setAdd(Timer *self, PyObject *arg) { SET_ADD };
+static PyObject * Timer_setSub(Timer *self, PyObject *arg) { SET_SUB };
+static PyObject * Timer_setDiv(Timer *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Timer_play(Timer *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Timer_stop(Timer *self) { STOP };
@@ -5780,14 +5780,14 @@ typedef struct {
     int chCount;
     MYFLT *choice;
     MYFLT value;
-    int modebuffer[2]; // need at least 2 slots for mul & add 
+    int modebuffer[2]; // need at least 2 slots for mul & add
 } Iter;
 
 static void
 Iter_generate(Iter *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1) {
             if (self->chCount >= self->chSize)
@@ -5814,44 +5814,44 @@ Iter_setProcMode(Iter *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = Iter_generate;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Iter_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Iter_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Iter_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Iter_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Iter_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Iter_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Iter_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Iter_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Iter_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 Iter_compute_next_data_frame(Iter *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -5864,7 +5864,7 @@ Iter_traverse(Iter *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Iter_clear(Iter *self)
 {
     pyo_CLEAR
@@ -5890,39 +5890,39 @@ Iter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *choicetmp=NULL, *multmp=NULL, *addtmp=NULL;
     Iter *self;
     self = (Iter *)type->tp_alloc(type, 0);
-    
+
     self->value = 0.;
     self->chCount = 0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Iter_compute_next_data_frame);
     self->mode_func_ptr = Iter_setProcMode;
 
     static char *kwlist[] = {"input", "choice", "init", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_OO_FOO, kwlist, &inputtmp, &choicetmp, &inittmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (choicetmp) {
         PyObject_CallMethod((PyObject *)self, "setChoice", "O", choicetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     self->value = inittmp;
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -5930,10 +5930,10 @@ Iter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Iter_getServer(Iter* self) { GET_SERVER };
 static PyObject * Iter_getStream(Iter* self) { GET_STREAM };
-static PyObject * Iter_setMul(Iter *self, PyObject *arg) { SET_MUL };	
-static PyObject * Iter_setAdd(Iter *self, PyObject *arg) { SET_ADD };	
-static PyObject * Iter_setSub(Iter *self, PyObject *arg) { SET_SUB };	
-static PyObject * Iter_setDiv(Iter *self, PyObject *arg) { SET_DIV };	
+static PyObject * Iter_setMul(Iter *self, PyObject *arg) { SET_MUL };
+static PyObject * Iter_setAdd(Iter *self, PyObject *arg) { SET_ADD };
+static PyObject * Iter_setSub(Iter *self, PyObject *arg) { SET_SUB };
+static PyObject * Iter_setDiv(Iter *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Iter_play(Iter *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Iter_out(Iter *self, PyObject *args, PyObject *kwds) { OUT };
@@ -5953,27 +5953,27 @@ Iter_setChoice(Iter *self, PyObject *arg)
 {
     int i;
 	PyObject *tmp;
-	
+
 	if (! PyList_Check(arg)) {
         PyErr_SetString(PyExc_TypeError, "The choice attribute must be a list.");
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     tmp = arg;
     self->chSize = PyList_Size(tmp);
     self->choice = (MYFLT *)realloc(self->choice, self->chSize * sizeof(MYFLT));
     for (i=0; i<self->chSize; i++) {
         self->choice[i] = PyFloat_AS_DOUBLE(PyNumber_Float(PyList_GET_ITEM(tmp, i)));
     }
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
-static PyObject * 
+static PyObject *
 Iter_reset(Iter *self, PyObject *arg)
 {
     int tmp;
@@ -6114,8 +6114,8 @@ static void
 Count_generates(Count *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
-    for (i=0; i<self->bufsize; i++) {        
+
+    for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1) {
             self->count = self->min;
             self->started = 1;
@@ -6128,7 +6128,7 @@ Count_generates(Count *self) {
         else {
             self->data[i] = self->min;
         }
-    } 
+    }
 }
 
 static void Count_postprocessing_ii(Count *self) { POST_PROCESSING_II };
@@ -6143,46 +6143,46 @@ static void Count_postprocessing_revareva(Count *self) { POST_PROCESSING_REVAREV
 
 static void
 Count_setProcMode(Count *self)
-{    
+{
     int muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = Count_generates;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Count_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Count_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Count_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Count_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Count_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Count_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Count_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Count_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Count_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 Count_compute_next_data_frame(Count *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -6195,7 +6195,7 @@ Count_traverse(Count *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Count_clear(Count *self)
 {
     pyo_CLEAR
@@ -6219,35 +6219,35 @@ Count_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     Count *self;
     self = (Count *)type->tp_alloc(type, 0);
-    
+
     self->started = 0;
     self->count = 0;
     self->min = 0;
     self->max = 0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Count_compute_next_data_frame);
     self->mode_func_ptr = Count_setProcMode;
 
     static char *kwlist[] = {"input", "min", "max", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|kkOO", kwlist, &inputtmp, &self->min, &self->max, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -6255,10 +6255,10 @@ Count_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Count_getServer(Count* self) { GET_SERVER };
 static PyObject * Count_getStream(Count* self) { GET_STREAM };
-static PyObject * Count_setMul(Count *self, PyObject *arg) { SET_MUL };	
-static PyObject * Count_setAdd(Count *self, PyObject *arg) { SET_ADD };	
-static PyObject * Count_setSub(Count *self, PyObject *arg) { SET_SUB };	
-static PyObject * Count_setDiv(Count *self, PyObject *arg) { SET_DIV };	
+static PyObject * Count_setMul(Count *self, PyObject *arg) { SET_MUL };
+static PyObject * Count_setAdd(Count *self, PyObject *arg) { SET_ADD };
+static PyObject * Count_setSub(Count *self, PyObject *arg) { SET_SUB };
+static PyObject * Count_setDiv(Count *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Count_play(Count *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Count_stop(Count *self) { STOP };
@@ -6274,25 +6274,25 @@ static PyObject * Count_inplace_div(Count *self, PyObject *arg) { INPLACE_DIV };
 
 static PyObject *
 Count_setMin(Count *self, PyObject *arg)
-{	    
-	if (PyLong_Check(arg) || PyInt_Check(arg))	
+{
+	if (PyLong_Check(arg) || PyInt_Check(arg))
 		self->min = PyLong_AsLong(arg);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Count_setMax(Count *self, PyObject *arg)
-{	  
+{
     if (arg == Py_None)
         self->max = 0;
-	else if (PyLong_Check(arg) || PyInt_Check(arg))	
+	else if (PyLong_Check(arg) || PyInt_Check(arg))
 		self->max = PyLong_AsLong(arg);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Count_members[] = {
     {"server", T_OBJECT_EX, offsetof(Count, server), 0, "Pyo server."},
@@ -6419,17 +6419,17 @@ NextTrig_generates(NextTrig *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *in2 = Stream_getData((Stream *)self->input2_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = 0.0;
         if (self->gate == 1 && in[i] == 1.0) {
                 self->data[i] = 1.0;
                 self->gate = 0;
         }
-        
+
         if (in2[i] == 1 && self->gate == 0)
             self->gate = 1;
-    } 
+    }
 }
 
 static void NextTrig_postprocessing_ii(NextTrig *self) { POST_PROCESSING_II };
@@ -6444,46 +6444,46 @@ static void NextTrig_postprocessing_revareva(NextTrig *self) { POST_PROCESSING_R
 
 static void
 NextTrig_setProcMode(NextTrig *self)
-{    
+{
     int muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = NextTrig_generates;
-    
+
     switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = NextTrig_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = NextTrig_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = NextTrig_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = NextTrig_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = NextTrig_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = NextTrig_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = NextTrig_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = NextTrig_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = NextTrig_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 NextTrig_compute_next_data_frame(NextTrig *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -6498,7 +6498,7 @@ NextTrig_traverse(NextTrig *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 NextTrig_clear(NextTrig *self)
 {
     pyo_CLEAR
@@ -6524,39 +6524,39 @@ NextTrig_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *input2tmp, *input2_streamtmp, *multmp=NULL, *addtmp=NULL;
     NextTrig *self;
     self = (NextTrig *)type->tp_alloc(type, 0);
-    
+
     self->gate = 0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, NextTrig_compute_next_data_frame);
     self->mode_func_ptr = NextTrig_setProcMode;
 
     static char *kwlist[] = {"input", "input2", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist, &inputtmp, &input2tmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     Py_XDECREF(self->input2);
     self->input2 = input2tmp;
     input2_streamtmp = PyObject_CallMethod((PyObject *)self->input2, "_getStream", NULL);
     Py_INCREF(input2_streamtmp);
     Py_XDECREF(self->input2_stream);
     self->input2_stream = (Stream *)input2_streamtmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -6564,10 +6564,10 @@ NextTrig_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * NextTrig_getServer(NextTrig* self) { GET_SERVER };
 static PyObject * NextTrig_getStream(NextTrig* self) { GET_STREAM };
-static PyObject * NextTrig_setMul(NextTrig *self, PyObject *arg) { SET_MUL };	
-static PyObject * NextTrig_setAdd(NextTrig *self, PyObject *arg) { SET_ADD };	
-static PyObject * NextTrig_setSub(NextTrig *self, PyObject *arg) { SET_SUB };	
-static PyObject * NextTrig_setDiv(NextTrig *self, PyObject *arg) { SET_DIV };	
+static PyObject * NextTrig_setMul(NextTrig *self, PyObject *arg) { SET_MUL };
+static PyObject * NextTrig_setAdd(NextTrig *self, PyObject *arg) { SET_ADD };
+static PyObject * NextTrig_setSub(NextTrig *self, PyObject *arg) { SET_SUB };
+static PyObject * NextTrig_setDiv(NextTrig *self, PyObject *arg) { SET_DIV };
 
 static PyObject * NextTrig_play(NextTrig *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * NextTrig_stop(NextTrig *self) { STOP };
@@ -6694,7 +6694,7 @@ typedef struct {
     PyObject *value;
     Stream *value_stream;
     MYFLT current_value;
-    int modebuffer[3]; // need at least 2 slots for mul & add 
+    int modebuffer[3]; // need at least 2 slots for mul & add
 } TrigVal;
 
 static void
@@ -6702,11 +6702,11 @@ TrigVal_generate_i(TrigVal *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT val = PyFloat_AS_DOUBLE(self->value);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1)
             self->current_value = val;
-        
+
         self->data[i] = self->current_value;
     }
 }
@@ -6716,11 +6716,11 @@ TrigVal_generate_a(TrigVal *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *val = Stream_getData((Stream *)self->value_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] == 1)
             self->current_value = val[i];
-        
+
         self->data[i] = self->current_value;
     }
 }
@@ -6741,50 +6741,50 @@ TrigVal_setProcMode(TrigVal *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = TrigVal_generate_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = TrigVal_generate_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TrigVal_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TrigVal_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TrigVal_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TrigVal_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TrigVal_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TrigVal_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TrigVal_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TrigVal_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TrigVal_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 TrigVal_compute_next_data_frame(TrigVal *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -6794,19 +6794,19 @@ TrigVal_traverse(TrigVal *self, visitproc visit, void *arg)
     pyo_VISIT
     Py_VISIT(self->input);
     Py_VISIT(self->input_stream);
-    Py_VISIT(self->value);    
-    Py_VISIT(self->value_stream);    
+    Py_VISIT(self->value);
+    Py_VISIT(self->value_stream);
     return 0;
 }
 
-static int 
+static int
 TrigVal_clear(TrigVal *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->value);    
-    Py_CLEAR(self->value_stream);    
+    Py_CLEAR(self->value);
+    Py_CLEAR(self->value_stream);
     return 0;
 }
 
@@ -6825,49 +6825,49 @@ TrigVal_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *valuetmp=NULL, *multmp=NULL, *addtmp=NULL;
     TrigVal *self;
     self = (TrigVal *)type->tp_alloc(type, 0);
-    
+
     self->value = PyFloat_FromDouble(0.);
     self->current_value = 0.;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TrigVal_compute_next_data_frame);
     self->mode_func_ptr = TrigVal_setProcMode;
-    
+
     static char *kwlist[] = {"input", "value", "init", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_OFOO, kwlist, &inputtmp, &valuetmp, &self->current_value, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (valuetmp) {
         PyObject_CallMethod((PyObject *)self, "setValue", "O", valuetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * TrigVal_getServer(TrigVal* self) { GET_SERVER };
 static PyObject * TrigVal_getStream(TrigVal* self) { GET_STREAM };
-static PyObject * TrigVal_setMul(TrigVal *self, PyObject *arg) { SET_MUL };	
-static PyObject * TrigVal_setAdd(TrigVal *self, PyObject *arg) { SET_ADD };	
-static PyObject * TrigVal_setSub(TrigVal *self, PyObject *arg) { SET_SUB };	
-static PyObject * TrigVal_setDiv(TrigVal *self, PyObject *arg) { SET_DIV };	
+static PyObject * TrigVal_setMul(TrigVal *self, PyObject *arg) { SET_MUL };
+static PyObject * TrigVal_setAdd(TrigVal *self, PyObject *arg) { SET_ADD };
+static PyObject * TrigVal_setSub(TrigVal *self, PyObject *arg) { SET_SUB };
+static PyObject * TrigVal_setDiv(TrigVal *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TrigVal_play(TrigVal *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TrigVal_out(TrigVal *self, PyObject *args, PyObject *kwds) { OUT };
@@ -6886,14 +6886,14 @@ static PyObject *
 TrigVal_setValue(TrigVal *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->value);
@@ -6909,12 +6909,12 @@ TrigVal_setValue(TrigVal *self, PyObject *arg)
         self->value_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef TrigVal_members[] = {
     {"server", T_OBJECT_EX, offsetof(TrigVal, server), 0, "Pyo server."},
@@ -7022,4 +7022,4 @@ PyTypeObject TrigValType = {
     0,                          /* tp_init */
     0,                                              /* tp_alloc */
     TrigVal_new,                                     /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/utilsmodule.c b/src/objects/utilsmodule.c
index e4e5653..3e97eb8 100644
--- a/src/objects/utilsmodule.c
+++ b/src/objects/utilsmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -45,7 +45,7 @@ static void
 Print_process_time(Print *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (self->currentTime >= self->time) {
             self->currentTime = 0.0;
@@ -73,15 +73,15 @@ Print_process_change(Print *self) {
                 printf("%s : %f\n", self->message, inval);
             self->lastValue = inval;
         }
-    }    
+    }
 }
 
 static void
 Print_setProcMode(Print *self)
-{    
+{
     if (self->method < 0 || self->method > 1)
         self->method = 0;
-        
+
     switch (self->method) {
         case 0:
             self->proc_func_ptr = Print_process_time;
@@ -89,13 +89,13 @@ Print_setProcMode(Print *self)
         case 1:
             self->proc_func_ptr = Print_process_change;
             break;
-    }        
+    }
 }
 
 static void
 Print_compute_next_data_frame(Print *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
 }
 
 static int
@@ -107,7 +107,7 @@ Print_traverse(Print *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Print_clear(Print *self)
 {
     pyo_CLEAR
@@ -135,7 +135,7 @@ Print_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->method = 0;
     self->time = 0.25;
     self->lastValue = -99999.0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Print_compute_next_data_frame);
     self->mode_func_ptr = Print_setProcMode;
@@ -144,16 +144,16 @@ Print_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->currentTime = 0.;
 
     static char *kwlist[] = {"input", "method", "interval", "message", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_IFS, kwlist, &inputtmp, &self->method, &self->time, &self->message))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
@@ -170,14 +170,14 @@ Print_setMethod(Print *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->method = PyInt_AsLong(arg);
         (*self->mode_func_ptr)(self);
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -189,13 +189,13 @@ Print_setInterval(Print *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->time = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -207,13 +207,13 @@ Print_setMessage(Print *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isString = PyString_Check(arg);
-	
+
 	if (isString == 1) {
 		self->message = PyString_AsString(arg);
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -291,14 +291,14 @@ typedef struct {
     MYFLT *choice;
     MYFLT value;
     MYFLT last_input;
-    int modebuffer[2]; // need at least 2 slots for mul & add 
+    int modebuffer[2]; // need at least 2 slots for mul & add
 } Snap;
 
 static MYFLT
 Snap_convert(Snap *self) {
     int midival;
     MYFLT val;
-    
+
     midival = self->value;
 
     if (self->scale == 1)
@@ -307,7 +307,7 @@ Snap_convert(Snap *self) {
         val = MYPOW(1.0594630943593, midival - 60);
     else
         val = midival;
-    
+
     return val;
 }
 
@@ -316,7 +316,7 @@ Snap_generate(Snap *self) {
     int i, j, pos;
     MYFLT intmp, diff, difftmp;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         if (in[i] < (self->last_input-0.001) || in[i] > (self->last_input + 0.001)) {
             int oct = 0;
@@ -332,12 +332,12 @@ Snap_generate(Snap *self) {
                 if (difftmp < diff) {
                     diff = difftmp;
                     pos = j;
-                }    
+                }
             }
             self->value = self->choice[pos] + (self->highbound * oct);
-            self->value = Snap_convert(self);  
+            self->value = Snap_convert(self);
         }
-     
+
         self->data[i] = self->value;
     }
 }
@@ -357,44 +357,44 @@ Snap_setProcMode(Snap *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = Snap_generate;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Snap_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Snap_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Snap_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Snap_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Snap_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Snap_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Snap_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Snap_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Snap_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 Snap_compute_next_data_frame(Snap *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -407,7 +407,7 @@ Snap_traverse(Snap *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Snap_clear(Snap *self)
 {
     pyo_CLEAR
@@ -432,36 +432,36 @@ Snap_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *choicetmp=NULL, *multmp=NULL, *addtmp=NULL;
     Snap *self;
     self = (Snap *)type->tp_alloc(type, 0);
-    
+
     self->value = self->last_input = 0.;
     self->scale = 0;
     self->highbound = 12;
     self->modebuffer[0] = 0;
     self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Snap_compute_next_data_frame);
     self->mode_func_ptr = Snap_setProcMode;
 
     static char *kwlist[] = {"input", "choice", "scale", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|iOO", kwlist, &inputtmp, &choicetmp, &self->scale, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (choicetmp) {
         PyObject_CallMethod((PyObject *)self, "setChoice", "O", choicetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     (*self->mode_func_ptr)(self);
@@ -471,10 +471,10 @@ Snap_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Snap_getServer(Snap* self) { GET_SERVER };
 static PyObject * Snap_getStream(Snap* self) { GET_STREAM };
-static PyObject * Snap_setMul(Snap *self, PyObject *arg) { SET_MUL };	
-static PyObject * Snap_setAdd(Snap *self, PyObject *arg) { SET_ADD };	
-static PyObject * Snap_setSub(Snap *self, PyObject *arg) { SET_SUB };	
-static PyObject * Snap_setDiv(Snap *self, PyObject *arg) { SET_DIV };	
+static PyObject * Snap_setMul(Snap *self, PyObject *arg) { SET_MUL };
+static PyObject * Snap_setAdd(Snap *self, PyObject *arg) { SET_ADD };
+static PyObject * Snap_setSub(Snap *self, PyObject *arg) { SET_SUB };
+static PyObject * Snap_setDiv(Snap *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Snap_play(Snap *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Snap_out(Snap *self, PyObject *args, PyObject *kwds) { OUT };
@@ -495,47 +495,47 @@ Snap_setChoice(Snap *self, PyObject *arg)
     int i, oct;
     MYFLT max;
 	PyObject *tmp;
-	
+
 	if (! PyList_Check(arg)) {
         PyErr_SetString(PyExc_TypeError, "The choice attribute must be a list.");
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
     tmp = arg;
     self->chSize = PyList_Size(tmp);
     self->choice = (MYFLT *)realloc(self->choice, self->chSize * sizeof(MYFLT));
-    
+
     for (i=0; i<self->chSize; i++) {
         self->choice[i] = PyFloat_AS_DOUBLE(PyNumber_Float(PyList_GET_ITEM(tmp, i)));
     }
-    
+
     max = self->choice[self->chSize-1];
-    
+
     oct = 12;
     while (max >= oct) {
         oct += 12;
     }
-    
+
     self->highbound = oct;
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Snap_setScale(Snap *self, PyObject *arg)
-{	
+{
     int tmp;
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyInt_Check(arg);
-	
+
 	if (isNumber == 1) {
 		tmp = PyInt_AsLong(arg);
         if (tmp >= 0 && tmp <= 2)
@@ -543,10 +543,10 @@ Snap_setScale(Snap *self, PyObject *arg)
         else
             printf("scale attribute must be an integer {0, 1, 2}\n");
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Snap_members[] = {
     {"server", T_OBJECT_EX, offsetof(Snap, server), 0, "Pyo server."},
@@ -667,7 +667,7 @@ typedef struct {
     Stream *input2_stream;
     PyObject *interp;
     Stream *interp_stream;
-    int modebuffer[3]; // need at least 2 slots for mul & add 
+    int modebuffer[3]; // need at least 2 slots for mul & add
 } Interp;
 
 static void
@@ -682,8 +682,8 @@ Interp_filters_i(Interp *self) {
         inter = 0.0;
     else if (inter > 1.0)
         inter = 1.0;
-    
-    amp2 = 1.0 - inter; 
+
+    amp2 = 1.0 - inter;
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = in[i] * amp2 + in2[i] * inter;
     }
@@ -696,15 +696,15 @@ Interp_filters_a(Interp *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *in2 = Stream_getData((Stream *)self->input2_stream);
     MYFLT *inter = Stream_getData((Stream *)self->interp_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         amp1 = inter[i];
         if (amp1 < 0.0)
             amp1 = 0.0;
         else if (amp1 > 1.0)
             amp1 = 1.0;
-        
-        amp2 = 1.0 - amp1; 
+
+        amp2 = 1.0 - amp1;
         self->data[i] = in[i] * amp2 + in2[i] * amp1;
     }
 }
@@ -725,50 +725,50 @@ Interp_setProcMode(Interp *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Interp_filters_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Interp_filters_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Interp_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Interp_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Interp_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Interp_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Interp_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Interp_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Interp_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Interp_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Interp_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Interp_compute_next_data_frame(Interp *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -780,12 +780,12 @@ Interp_traverse(Interp *self, visitproc visit, void *arg)
     Py_VISIT(self->input_stream);
     Py_VISIT(self->input2);
     Py_VISIT(self->input2_stream);
-    Py_VISIT(self->interp);    
-    Py_VISIT(self->interp_stream);    
+    Py_VISIT(self->interp);
+    Py_VISIT(self->interp_stream);
     return 0;
 }
 
-static int 
+static int
 Interp_clear(Interp *self)
 {
     pyo_CLEAR
@@ -793,8 +793,8 @@ Interp_clear(Interp *self)
     Py_CLEAR(self->input_stream);
     Py_CLEAR(self->input2);
     Py_CLEAR(self->input2_stream);
-    Py_CLEAR(self->interp);    
-    Py_CLEAR(self->interp_stream);    
+    Py_CLEAR(self->interp);
+    Py_CLEAR(self->interp_stream);
     return 0;
 }
 
@@ -813,21 +813,21 @@ Interp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *input2tmp, *input2_streamtmp, *interptmp=NULL, *multmp=NULL, *addtmp=NULL;
     Interp *self;
     self = (Interp *)type->tp_alloc(type, 0);
-    
+
     self->interp = PyFloat_FromDouble(.5);
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Interp_compute_next_data_frame);
     self->mode_func_ptr = Interp_setProcMode;
 
     static char *kwlist[] = {"input", "input2", "interp", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OOO", kwlist, &inputtmp, &input2tmp, &interptmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     Py_XDECREF(self->input2);
@@ -836,21 +836,21 @@ Interp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     Py_INCREF(input2_streamtmp);
     Py_XDECREF(self->input2_stream);
     self->input2_stream = (Stream *)input2_streamtmp;
-    
+
     if (interptmp) {
         PyObject_CallMethod((PyObject *)self, "setInterp", "O", interptmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -858,10 +858,10 @@ Interp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Interp_getServer(Interp* self) { GET_SERVER };
 static PyObject * Interp_getStream(Interp* self) { GET_STREAM };
-static PyObject * Interp_setMul(Interp *self, PyObject *arg) { SET_MUL };	
-static PyObject * Interp_setAdd(Interp *self, PyObject *arg) { SET_ADD };	
-static PyObject * Interp_setSub(Interp *self, PyObject *arg) { SET_SUB };	
-static PyObject * Interp_setDiv(Interp *self, PyObject *arg) { SET_DIV };	
+static PyObject * Interp_setMul(Interp *self, PyObject *arg) { SET_MUL };
+static PyObject * Interp_setAdd(Interp *self, PyObject *arg) { SET_ADD };
+static PyObject * Interp_setSub(Interp *self, PyObject *arg) { SET_SUB };
+static PyObject * Interp_setDiv(Interp *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Interp_play(Interp *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Interp_out(Interp *self, PyObject *args, PyObject *kwds) { OUT };
@@ -880,14 +880,14 @@ static PyObject *
 Interp_setInterp(Interp *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->interp);
@@ -903,9 +903,9 @@ Interp_setInterp(Interp *self, PyObject *arg)
         self->interp_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -1032,7 +1032,7 @@ typedef struct {
     Stream *value_stream;
     MYFLT currentValue;
     int flag;
-    int modebuffer[3]; // need at least 2 slots for mul & add 
+    int modebuffer[3]; // need at least 2 slots for mul & add
 } SampHold;
 
 static void
@@ -1049,7 +1049,7 @@ SampHold_filters_i(SampHold *self) {
             if (self->flag == 1) {
                 self->currentValue = in[i];
                 self->flag = 0;
-            }    
+            }
         }
         else
             self->flag = 1;
@@ -1064,7 +1064,7 @@ SampHold_filters_a(SampHold *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *ctrlsig = Stream_getData((Stream *)self->controlsig_stream);
     MYFLT *valsig = Stream_getData((Stream *)self->value_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         ctrl = ctrlsig[i];
         val = valsig[i];
@@ -1072,7 +1072,7 @@ SampHold_filters_a(SampHold *self) {
             if (self->flag == 1) {
                 self->currentValue = in[i];
                 self->flag = 0;
-            }    
+            }
         }
         else
             self->flag = 1;
@@ -1096,50 +1096,50 @@ SampHold_setProcMode(SampHold *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = SampHold_filters_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = SampHold_filters_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = SampHold_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = SampHold_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = SampHold_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = SampHold_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = SampHold_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = SampHold_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = SampHold_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = SampHold_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = SampHold_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 SampHold_compute_next_data_frame(SampHold *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1151,12 +1151,12 @@ SampHold_traverse(SampHold *self, visitproc visit, void *arg)
     Py_VISIT(self->input_stream);
     Py_VISIT(self->controlsig);
     Py_VISIT(self->controlsig_stream);
-    Py_VISIT(self->value);    
-    Py_VISIT(self->value_stream);    
+    Py_VISIT(self->value);
+    Py_VISIT(self->value_stream);
     return 0;
 }
 
-static int 
+static int
 SampHold_clear(SampHold *self)
 {
     pyo_CLEAR
@@ -1164,8 +1164,8 @@ SampHold_clear(SampHold *self)
     Py_CLEAR(self->input_stream);
     Py_CLEAR(self->controlsig);
     Py_CLEAR(self->controlsig_stream);
-    Py_CLEAR(self->value);    
-    Py_CLEAR(self->value_stream);    
+    Py_CLEAR(self->value);
+    Py_CLEAR(self->value_stream);
     return 0;
 }
 
@@ -1184,46 +1184,46 @@ SampHold_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *controlsigtmp, *controlsig_streamtmp, *valuetmp=NULL, *multmp=NULL, *addtmp=NULL;
     SampHold *self;
     self = (SampHold *)type->tp_alloc(type, 0);
-    
+
     self->value = PyFloat_FromDouble(0.0);
     self->currentValue = 0.0;
     self->flag = 1;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, SampHold_compute_next_data_frame);
     self->mode_func_ptr = SampHold_setProcMode;
 
     static char *kwlist[] = {"input", "controlsig", "value", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OOO", kwlist, &inputtmp, &controlsigtmp, &valuetmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     Py_XDECREF(self->controlsig);
     self->controlsig = controlsigtmp;
     controlsig_streamtmp = PyObject_CallMethod((PyObject *)self->controlsig, "_getStream", NULL);
     Py_INCREF(controlsig_streamtmp);
     Py_XDECREF(self->controlsig_stream);
     self->controlsig_stream = (Stream *)controlsig_streamtmp;
-    
+
     if (valuetmp) {
         PyObject_CallMethod((PyObject *)self, "setValue", "O", valuetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -1231,10 +1231,10 @@ SampHold_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * SampHold_getServer(SampHold* self) { GET_SERVER };
 static PyObject * SampHold_getStream(SampHold* self) { GET_STREAM };
-static PyObject * SampHold_setMul(SampHold *self, PyObject *arg) { SET_MUL };	
-static PyObject * SampHold_setAdd(SampHold *self, PyObject *arg) { SET_ADD };	
-static PyObject * SampHold_setSub(SampHold *self, PyObject *arg) { SET_SUB };	
-static PyObject * SampHold_setDiv(SampHold *self, PyObject *arg) { SET_DIV };	
+static PyObject * SampHold_setMul(SampHold *self, PyObject *arg) { SET_MUL };
+static PyObject * SampHold_setAdd(SampHold *self, PyObject *arg) { SET_ADD };
+static PyObject * SampHold_setSub(SampHold *self, PyObject *arg) { SET_SUB };
+static PyObject * SampHold_setDiv(SampHold *self, PyObject *arg) { SET_DIV };
 
 static PyObject * SampHold_play(SampHold *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * SampHold_out(SampHold *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1253,14 +1253,14 @@ static PyObject *
 SampHold_setValue(SampHold *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->value);
@@ -1276,9 +1276,9 @@ SampHold_setValue(SampHold *self, PyObject *arg)
         self->value_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -1405,7 +1405,7 @@ typedef struct {
     Stream *value_stream;
     MYFLT currentValue;
     int flag;
-    int modebuffer[3]; // need at least 2 slots for mul & add 
+    int modebuffer[3]; // need at least 2 slots for mul & add
 } TrackHold;
 
 static void
@@ -1422,7 +1422,7 @@ TrackHold_filters_i(TrackHold *self) {
             if (self->flag == 1) {
                 self->currentValue = in[i];
                 self->flag = 0;
-            }    
+            }
         }
         else {
             self->currentValue = in[i];
@@ -1439,7 +1439,7 @@ TrackHold_filters_a(TrackHold *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *ctrlsig = Stream_getData((Stream *)self->controlsig_stream);
     MYFLT *valsig = Stream_getData((Stream *)self->value_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         ctrl = ctrlsig[i];
         val = valsig[i];
@@ -1447,7 +1447,7 @@ TrackHold_filters_a(TrackHold *self) {
             if (self->flag == 1) {
                 self->currentValue = in[i];
                 self->flag = 0;
-            }    
+            }
         }
         else {
             self->currentValue = in[i];
@@ -1473,50 +1473,50 @@ TrackHold_setProcMode(TrackHold *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = TrackHold_filters_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = TrackHold_filters_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TrackHold_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TrackHold_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TrackHold_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TrackHold_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TrackHold_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TrackHold_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TrackHold_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TrackHold_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TrackHold_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 TrackHold_compute_next_data_frame(TrackHold *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1528,12 +1528,12 @@ TrackHold_traverse(TrackHold *self, visitproc visit, void *arg)
     Py_VISIT(self->input_stream);
     Py_VISIT(self->controlsig);
     Py_VISIT(self->controlsig_stream);
-    Py_VISIT(self->value);    
-    Py_VISIT(self->value_stream);    
+    Py_VISIT(self->value);
+    Py_VISIT(self->value_stream);
     return 0;
 }
 
-static int 
+static int
 TrackHold_clear(TrackHold *self)
 {
     pyo_CLEAR
@@ -1541,8 +1541,8 @@ TrackHold_clear(TrackHold *self)
     Py_CLEAR(self->input_stream);
     Py_CLEAR(self->controlsig);
     Py_CLEAR(self->controlsig_stream);
-    Py_CLEAR(self->value);    
-    Py_CLEAR(self->value_stream);    
+    Py_CLEAR(self->value);
+    Py_CLEAR(self->value_stream);
     return 0;
 }
 
@@ -1561,46 +1561,46 @@ TrackHold_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *controlsigtmp, *controlsig_streamtmp, *valuetmp=NULL, *multmp=NULL, *addtmp=NULL;
     TrackHold *self;
     self = (TrackHold *)type->tp_alloc(type, 0);
-    
+
     self->value = PyFloat_FromDouble(0.0);
     self->currentValue = 0.0;
     self->flag = 1;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TrackHold_compute_next_data_frame);
     self->mode_func_ptr = TrackHold_setProcMode;
 
     static char *kwlist[] = {"input", "controlsig", "value", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OOO", kwlist, &inputtmp, &controlsigtmp, &valuetmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     Py_XDECREF(self->controlsig);
     self->controlsig = controlsigtmp;
     controlsig_streamtmp = PyObject_CallMethod((PyObject *)self->controlsig, "_getStream", NULL);
     Py_INCREF(controlsig_streamtmp);
     Py_XDECREF(self->controlsig_stream);
     self->controlsig_stream = (Stream *)controlsig_streamtmp;
-    
+
     if (valuetmp) {
         PyObject_CallMethod((PyObject *)self, "setValue", "O", valuetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -1608,10 +1608,10 @@ TrackHold_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * TrackHold_getServer(TrackHold* self) { GET_SERVER };
 static PyObject * TrackHold_getStream(TrackHold* self) { GET_STREAM };
-static PyObject * TrackHold_setMul(TrackHold *self, PyObject *arg) { SET_MUL };	
-static PyObject * TrackHold_setAdd(TrackHold *self, PyObject *arg) { SET_ADD };	
-static PyObject * TrackHold_setSub(TrackHold *self, PyObject *arg) { SET_SUB };	
-static PyObject * TrackHold_setDiv(TrackHold *self, PyObject *arg) { SET_DIV };	
+static PyObject * TrackHold_setMul(TrackHold *self, PyObject *arg) { SET_MUL };
+static PyObject * TrackHold_setAdd(TrackHold *self, PyObject *arg) { SET_ADD };
+static PyObject * TrackHold_setSub(TrackHold *self, PyObject *arg) { SET_SUB };
+static PyObject * TrackHold_setDiv(TrackHold *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TrackHold_play(TrackHold *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TrackHold_out(TrackHold *self, PyObject *args, PyObject *kwds) { OUT };
@@ -1630,14 +1630,14 @@ static PyObject *
 TrackHold_setValue(TrackHold *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->value);
@@ -1653,9 +1653,9 @@ TrackHold_setValue(TrackHold *self, PyObject *arg)
         self->value_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -1779,7 +1779,7 @@ typedef struct {
     PyObject *comp;
     Stream *comp_stream;
     MYFLT (*compare_func_ptr)(MYFLT, MYFLT); // true = 1.0, false = 0.0
-    int modebuffer[3]; // need at least 2 slots for mul & add 
+    int modebuffer[3]; // need at least 2 slots for mul & add
 } Compare;
 
 static MYFLT
@@ -1823,7 +1823,7 @@ Compare_process_i(Compare *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT comp = PyFloat_AS_DOUBLE(self->comp);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = (*self->compare_func_ptr)(in[i], comp);
     }
@@ -1834,7 +1834,7 @@ Compare_process_a(Compare *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *comp = Stream_getData((Stream *)self->comp_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = (*self->compare_func_ptr)(in[i], comp[i]);
     }
@@ -1856,50 +1856,50 @@ Compare_setProcMode(Compare *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2];
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Compare_process_i;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Compare_process_a;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Compare_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Compare_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Compare_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Compare_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Compare_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Compare_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Compare_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Compare_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Compare_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Compare_compute_next_data_frame(Compare *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1914,7 +1914,7 @@ Compare_traverse(Compare *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Compare_clear(Compare *self)
 {
     pyo_CLEAR
@@ -1940,42 +1940,42 @@ Compare_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *comptmp, *modetmp=NULL, *multmp=NULL, *addtmp=NULL;
     Compare *self;
     self = (Compare *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     self->compare_func_ptr = Compare_lt;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Compare_compute_next_data_frame);
     self->mode_func_ptr = Compare_setProcMode;
 
     static char *kwlist[] = {"input", "comp", "mode", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OOO", kwlist, &inputtmp, &comptmp, &modetmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (comptmp) {
         PyObject_CallMethod((PyObject *)self, "setComp", "O", comptmp);
     }
-    
+
     if (modetmp) {
         PyObject_CallMethod((PyObject *)self, "setMode", "O", modetmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -1983,10 +1983,10 @@ Compare_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Compare_getServer(Compare* self) { GET_SERVER };
 static PyObject * Compare_getStream(Compare* self) { GET_STREAM };
-static PyObject * Compare_setMul(Compare *self, PyObject *arg) { SET_MUL };	
-static PyObject * Compare_setAdd(Compare *self, PyObject *arg) { SET_ADD };	
-static PyObject * Compare_setSub(Compare *self, PyObject *arg) { SET_SUB };	
-static PyObject * Compare_setDiv(Compare *self, PyObject *arg) { SET_DIV };	
+static PyObject * Compare_setMul(Compare *self, PyObject *arg) { SET_MUL };
+static PyObject * Compare_setAdd(Compare *self, PyObject *arg) { SET_ADD };
+static PyObject * Compare_setSub(Compare *self, PyObject *arg) { SET_SUB };
+static PyObject * Compare_setDiv(Compare *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Compare_play(Compare *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Compare_stop(Compare *self) { STOP };
@@ -2004,13 +2004,13 @@ static PyObject *
 Compare_setComp(Compare *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-    
+
 	if (arg == NULL) {
 		Py_RETURN_NONE;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_XDECREF(self->comp);
@@ -2026,27 +2026,27 @@ Compare_setComp(Compare *self, PyObject *arg)
         self->comp_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
 
 static PyObject *
 Compare_setMode(Compare *self, PyObject *arg)
-{	
+{
 	if (arg == NULL) {
 		Py_RETURN_NONE;
 	}
-    
+
 	if (! PyInt_Check(arg)) {
         printf("mode should be a comparison operator as a string\n");
 		Py_RETURN_NONE;
     }
 
     int tmp = PyInt_AsLong(arg);
-    
+
     if (tmp == 0)
         self->compare_func_ptr = Compare_lt;
     else if (tmp == 1)
@@ -2059,7 +2059,7 @@ Compare_setMode(Compare *self, PyObject *arg)
         self->compare_func_ptr = Compare_eq;
     else if (tmp == 5)
         self->compare_func_ptr = Compare_neq;
-    
+
     Py_RETURN_NONE;
 }
 
@@ -2193,7 +2193,7 @@ Between_transform_ii(Between *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT mi = PyFloat_AS_DOUBLE(self->min);
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = in[i];
         if(val >= mi && val < ma)
@@ -2210,7 +2210,7 @@ Between_transform_ai(Between *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *mi = Stream_getData((Stream *)self->min_stream);
     MYFLT ma = PyFloat_AS_DOUBLE(self->max);
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = in[i];
         if(val >= mi[i] && val < ma)
@@ -2227,7 +2227,7 @@ Between_transform_ia(Between *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT mi = PyFloat_AS_DOUBLE(self->min);
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = in[i];
         if(val >= mi && val < ma[i])
@@ -2244,7 +2244,7 @@ Between_transform_aa(Between *self) {
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *mi = Stream_getData((Stream *)self->min_stream);
     MYFLT *ma = Stream_getData((Stream *)self->max_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = in[i];
         if(val >= mi[i] && val < ma[i])
@@ -2270,56 +2270,56 @@ Between_setProcMode(Between *self)
     int procmode, muladdmode;
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = Between_transform_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = Between_transform_ai;
             break;
-        case 10:        
+        case 10:
             self->proc_func_ptr = Between_transform_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = Between_transform_aa;
             break;
-    } 
+    }
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Between_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Between_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Between_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Between_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Between_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Between_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Between_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Between_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Between_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Between_compute_next_data_frame(Between *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2328,24 +2328,24 @@ Between_traverse(Between *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->input);
-    Py_VISIT(self->input_stream);    
-    Py_VISIT(self->min);    
-    Py_VISIT(self->min_stream);    
-    Py_VISIT(self->max);    
-    Py_VISIT(self->max_stream);    
+    Py_VISIT(self->input_stream);
+    Py_VISIT(self->min);
+    Py_VISIT(self->min_stream);
+    Py_VISIT(self->max);
+    Py_VISIT(self->max_stream);
     return 0;
 }
 
-static int 
+static int
 Between_clear(Between *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
     Py_CLEAR(self->input_stream);
-    Py_CLEAR(self->min);    
-    Py_CLEAR(self->min_stream);    
-    Py_CLEAR(self->max);    
-    Py_CLEAR(self->max_stream);    
+    Py_CLEAR(self->min);
+    Py_CLEAR(self->min_stream);
+    Py_CLEAR(self->max);
+    Py_CLEAR(self->max_stream);
     return 0;
 }
 
@@ -2364,54 +2364,54 @@ Between_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *mintmp=NULL, *maxtmp=NULL, *multmp=NULL, *addtmp=NULL;
     Between *self;
     self = (Between *)type->tp_alloc(type, 0);
-    
+
     self->min = PyFloat_FromDouble(0.0);
     self->max = PyFloat_FromDouble(1.0);
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Between_compute_next_data_frame);
     self->mode_func_ptr = Between_setProcMode;
 
     static char *kwlist[] = {"input", "min", "max", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOO", kwlist, &inputtmp, &mintmp, &maxtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (mintmp) {
         PyObject_CallMethod((PyObject *)self, "setMin", "O", mintmp);
     }
-    
+
     if (maxtmp) {
         PyObject_CallMethod((PyObject *)self, "setMax", "O", maxtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
-    
+
     return (PyObject *)self;
 }
 
 static PyObject * Between_getServer(Between* self) { GET_SERVER };
 static PyObject * Between_getStream(Between* self) { GET_STREAM };
-static PyObject * Between_setMul(Between *self, PyObject *arg) { SET_MUL };	
-static PyObject * Between_setAdd(Between *self, PyObject *arg) { SET_ADD };	
-static PyObject * Between_setSub(Between *self, PyObject *arg) { SET_SUB };	
-static PyObject * Between_setDiv(Between *self, PyObject *arg) { SET_DIV };	
+static PyObject * Between_setMul(Between *self, PyObject *arg) { SET_MUL };
+static PyObject * Between_setAdd(Between *self, PyObject *arg) { SET_ADD };
+static PyObject * Between_setSub(Between *self, PyObject *arg) { SET_SUB };
+static PyObject * Between_setDiv(Between *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Between_play(Between *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Between_out(Between *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2430,14 +2430,14 @@ static PyObject *
 Between_setMin(Between *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->min);
@@ -2453,25 +2453,25 @@ Between_setMin(Between *self, PyObject *arg)
         self->min_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Between_setMax(Between *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->max);
@@ -2487,12 +2487,12 @@ Between_setMax(Between *self, PyObject *arg)
         self->max_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Between_members[] = {
     {"server", T_OBJECT_EX, offsetof(Between, server), 0, "Pyo server."},
@@ -2618,14 +2618,14 @@ typedef struct {
     pyo_audio_HEAD
     PyObject *input;
     Stream *input_stream;
-    int modebuffer[2]; // need at least 2 slots for mul & add 
+    int modebuffer[2]; // need at least 2 slots for mul & add
 } Denorm;
 
 static void
 Denorm_filters(Denorm *self) {
     int i;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = in[i] + DENORM_RAND;
     }
@@ -2646,44 +2646,44 @@ Denorm_setProcMode(Denorm *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = Denorm_filters;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Denorm_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Denorm_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Denorm_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Denorm_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Denorm_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Denorm_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Denorm_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Denorm_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Denorm_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 Denorm_compute_next_data_frame(Denorm *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2696,7 +2696,7 @@ Denorm_traverse(Denorm *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Denorm_clear(Denorm *self)
 {
     pyo_CLEAR
@@ -2720,31 +2720,31 @@ Denorm_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     Denorm *self;
     self = (Denorm *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Denorm_compute_next_data_frame);
     self->mode_func_ptr = Denorm_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     Server_generateSeed((Server *)self->server, DENORM_ID);
 
     (*self->mode_func_ptr)(self);
@@ -2754,10 +2754,10 @@ Denorm_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Denorm_getServer(Denorm* self) { GET_SERVER };
 static PyObject * Denorm_getStream(Denorm* self) { GET_STREAM };
-static PyObject * Denorm_setMul(Denorm *self, PyObject *arg) { SET_MUL };	
-static PyObject * Denorm_setAdd(Denorm *self, PyObject *arg) { SET_ADD };	
-static PyObject * Denorm_setSub(Denorm *self, PyObject *arg) { SET_SUB };	
-static PyObject * Denorm_setDiv(Denorm *self, PyObject *arg) { SET_DIV };	
+static PyObject * Denorm_setMul(Denorm *self, PyObject *arg) { SET_MUL };
+static PyObject * Denorm_setAdd(Denorm *self, PyObject *arg) { SET_ADD };
+static PyObject * Denorm_setSub(Denorm *self, PyObject *arg) { SET_SUB };
+static PyObject * Denorm_setDiv(Denorm *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Denorm_play(Denorm *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Denorm_out(Denorm *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2895,7 +2895,7 @@ DBToA_process(DBToA *self) {
     int i;
     MYFLT db;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         db = in[i];
         if (db <= -120.0) {
@@ -2926,44 +2926,44 @@ DBToA_setProcMode(DBToA *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = DBToA_process;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = DBToA_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = DBToA_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = DBToA_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = DBToA_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = DBToA_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = DBToA_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = DBToA_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = DBToA_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = DBToA_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 DBToA_compute_next_data_frame(DBToA *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -2976,7 +2976,7 @@ DBToA_traverse(DBToA *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 DBToA_clear(DBToA *self)
 {
     pyo_CLEAR
@@ -3000,33 +3000,33 @@ DBToA_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     DBToA *self;
     self = (DBToA *)type->tp_alloc(type, 0);
-    
+
     self->lastdb = -120.0;
     self->currentamp = MYPOW(10.0, self->lastdb * 0.05);
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, DBToA_compute_next_data_frame);
     self->mode_func_ptr = DBToA_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -3034,10 +3034,10 @@ DBToA_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * DBToA_getServer(DBToA* self) { GET_SERVER };
 static PyObject * DBToA_getStream(DBToA* self) { GET_STREAM };
-static PyObject * DBToA_setMul(DBToA *self, PyObject *arg) { SET_MUL };	
-static PyObject * DBToA_setAdd(DBToA *self, PyObject *arg) { SET_ADD };	
-static PyObject * DBToA_setSub(DBToA *self, PyObject *arg) { SET_SUB };	
-static PyObject * DBToA_setDiv(DBToA *self, PyObject *arg) { SET_DIV };	
+static PyObject * DBToA_setMul(DBToA *self, PyObject *arg) { SET_MUL };
+static PyObject * DBToA_setAdd(DBToA *self, PyObject *arg) { SET_ADD };
+static PyObject * DBToA_setSub(DBToA *self, PyObject *arg) { SET_SUB };
+static PyObject * DBToA_setDiv(DBToA *self, PyObject *arg) { SET_DIV };
 
 static PyObject * DBToA_play(DBToA *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * DBToA_out(DBToA *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3175,7 +3175,7 @@ AToDB_process(AToDB *self) {
     int i;
     MYFLT amp;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         amp = in[i];
         if (amp <= 0.000001) {
@@ -3206,44 +3206,44 @@ AToDB_setProcMode(AToDB *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = AToDB_process;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = AToDB_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = AToDB_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = AToDB_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = AToDB_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = AToDB_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = AToDB_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = AToDB_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = AToDB_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = AToDB_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 AToDB_compute_next_data_frame(AToDB *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3256,7 +3256,7 @@ AToDB_traverse(AToDB *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 AToDB_clear(AToDB *self)
 {
     pyo_CLEAR
@@ -3280,33 +3280,33 @@ AToDB_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     AToDB *self;
     self = (AToDB *)type->tp_alloc(type, 0);
-    
+
     self->lastamp = 0.000001;
     self->currentdb = 20.0 * MYLOG10(self->lastamp);
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, AToDB_compute_next_data_frame);
     self->mode_func_ptr = AToDB_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -3314,10 +3314,10 @@ AToDB_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * AToDB_getServer(AToDB* self) { GET_SERVER };
 static PyObject * AToDB_getStream(AToDB* self) { GET_STREAM };
-static PyObject * AToDB_setMul(AToDB *self, PyObject *arg) { SET_MUL };	
-static PyObject * AToDB_setAdd(AToDB *self, PyObject *arg) { SET_ADD };	
-static PyObject * AToDB_setSub(AToDB *self, PyObject *arg) { SET_SUB };	
-static PyObject * AToDB_setDiv(AToDB *self, PyObject *arg) { SET_DIV };	
+static PyObject * AToDB_setMul(AToDB *self, PyObject *arg) { SET_MUL };
+static PyObject * AToDB_setAdd(AToDB *self, PyObject *arg) { SET_ADD };
+static PyObject * AToDB_setSub(AToDB *self, PyObject *arg) { SET_SUB };
+static PyObject * AToDB_setDiv(AToDB *self, PyObject *arg) { SET_DIV };
 
 static PyObject * AToDB_play(AToDB *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * AToDB_out(AToDB *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3455,7 +3455,7 @@ typedef struct {
     Stream *outmax_stream;
     PyObject *exp;
     Stream *exp_stream;
-    int modebuffer[7]; // need at least 2 slots for mul & add 
+    int modebuffer[7]; // need at least 2 slots for mul & add
 } Scale;
 
 static MYFLT
@@ -3474,7 +3474,7 @@ Scale_generate(Scale *self) {
     MYFLT tmp, inrange, outrange, normin;
     MYFLT inmin, inmax, outmin, outmax, exp;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (self->modebuffer[2] == 0)
         inmin = PyFloat_AS_DOUBLE(self->inmin);
     else
@@ -3483,7 +3483,7 @@ Scale_generate(Scale *self) {
         inmax = PyFloat_AS_DOUBLE(self->inmax);
     else
         inmax = Stream_getData((Stream *)self->inmax_stream)[0];
-    
+
     if (inmin < inmax) {
         inrev = 0;
     }
@@ -3503,7 +3503,7 @@ Scale_generate(Scale *self) {
         outmax = PyFloat_AS_DOUBLE(self->outmax);
     else
         outmax = Stream_getData((Stream *)self->outmax_stream)[0];
-    
+
     if (outmin < outmax) {
         outrev = 0;
     }
@@ -3514,7 +3514,7 @@ Scale_generate(Scale *self) {
         outrev = 1;
     }
     outrange = outmax - outmin;
-    
+
     if (self->modebuffer[6] == 0)
         exp = PyFloat_AS_DOUBLE(self->exp);
     else
@@ -3534,7 +3534,7 @@ Scale_generate(Scale *self) {
             for (i=0; i<self->bufsize; i++) {
                 normin = (_scale_clip(in[i], inmin, inmax) - inmin) / inrange;
                 self->data[i] = normin * outrange + outmin;
-            }            
+            }
         }
         else if (inrev == 1 && outrev == 0) {
             for (i=0; i<self->bufsize; i++) {
@@ -3561,7 +3561,7 @@ Scale_generate(Scale *self) {
             for (i=0; i<self->bufsize; i++) {
                 normin = MYPOW((_scale_clip(in[i], inmin, inmax) - inmin) / inrange, exp);
                 self->data[i] = normin * outrange + outmin;
-            }            
+            }
         }
         else if (inrev == 1 && outrev == 0) {
             for (i=0; i<self->bufsize; i++) {
@@ -3599,44 +3599,44 @@ Scale_setProcMode(Scale *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = Scale_generate;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = Scale_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = Scale_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = Scale_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = Scale_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = Scale_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = Scale_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = Scale_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = Scale_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = Scale_postprocessing_revareva;
             break;
-    }  
+    }
 }
 
 static void
 Scale_compute_next_data_frame(Scale *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -3659,7 +3659,7 @@ Scale_traverse(Scale *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 Scale_clear(Scale *self)
 {
     pyo_CLEAR
@@ -3693,7 +3693,7 @@ Scale_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *inmintmp=NULL, *inmaxtmp=NULL, *outmintmp=NULL, *outmaxtmp=NULL, *exptmp=NULL, *multmp=NULL, *addtmp=NULL;
     Scale *self;
     self = (Scale *)type->tp_alloc(type, 0);
-    
+
     self->inmin = PyFloat_FromDouble(0.0);
     self->inmax = PyFloat_FromDouble(1.0);
     self->outmin = PyFloat_FromDouble(0.0);
@@ -3706,18 +3706,18 @@ Scale_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->modebuffer[4] = 0;
     self->modebuffer[5] = 0;
     self->modebuffer[6] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, Scale_compute_next_data_frame);
     self->mode_func_ptr = Scale_setProcMode;
 
     static char *kwlist[] = {"input", "inmin", "inmax", "outmin", "outmax", "exp", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOOOOO", kwlist, &inputtmp, &inmintmp, &inmaxtmp, &outmintmp, &outmaxtmp, &exptmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (inmintmp) {
         PyObject_CallMethod((PyObject *)self, "setInMin", "O", inmintmp);
     }
@@ -3737,17 +3737,17 @@ Scale_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (exptmp) {
         PyObject_CallMethod((PyObject *)self, "setExp", "O", exptmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -3755,10 +3755,10 @@ Scale_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * Scale_getServer(Scale* self) { GET_SERVER };
 static PyObject * Scale_getStream(Scale* self) { GET_STREAM };
-static PyObject * Scale_setMul(Scale *self, PyObject *arg) { SET_MUL };	
-static PyObject * Scale_setAdd(Scale *self, PyObject *arg) { SET_ADD };	
-static PyObject * Scale_setSub(Scale *self, PyObject *arg) { SET_SUB };	
-static PyObject * Scale_setDiv(Scale *self, PyObject *arg) { SET_DIV };	
+static PyObject * Scale_setMul(Scale *self, PyObject *arg) { SET_MUL };
+static PyObject * Scale_setAdd(Scale *self, PyObject *arg) { SET_ADD };
+static PyObject * Scale_setSub(Scale *self, PyObject *arg) { SET_SUB };
+static PyObject * Scale_setDiv(Scale *self, PyObject *arg) { SET_DIV };
 
 static PyObject * Scale_play(Scale *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * Scale_out(Scale *self, PyObject *args, PyObject *kwds) { OUT };
@@ -3777,14 +3777,14 @@ static PyObject *
 Scale_setInMin(Scale *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->inmin);
@@ -3800,25 +3800,25 @@ Scale_setInMin(Scale *self, PyObject *arg)
         self->inmin_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Scale_setInMax(Scale *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->inmax);
@@ -3834,25 +3834,25 @@ Scale_setInMax(Scale *self, PyObject *arg)
         self->inmax_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Scale_setOutMin(Scale *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->outmin);
@@ -3868,25 +3868,25 @@ Scale_setOutMin(Scale *self, PyObject *arg)
         self->outmin_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Scale_setOutMax(Scale *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->outmax);
@@ -3902,25 +3902,25 @@ Scale_setOutMax(Scale *self, PyObject *arg)
         self->outmax_stream = (Stream *)streamtmp;
 		self->modebuffer[5] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 Scale_setExp(Scale *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->exp);
@@ -3936,12 +3936,12 @@ Scale_setExp(Scale *self, PyObject *arg)
         self->exp_stream = (Stream *)streamtmp;
 		self->modebuffer[6] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef Scale_members[] = {
     {"server", T_OBJECT_EX, offsetof(Scale, server), 0, "Pyo server."},
@@ -4071,7 +4071,7 @@ CentsToTranspo_process(CentsToTranspo *self) {
     int i;
     MYFLT cents;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         cents = in[i];
         if (cents != self->lastcents) {
@@ -4098,44 +4098,44 @@ CentsToTranspo_setProcMode(CentsToTranspo *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = CentsToTranspo_process;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = CentsToTranspo_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = CentsToTranspo_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = CentsToTranspo_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = CentsToTranspo_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = CentsToTranspo_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = CentsToTranspo_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = CentsToTranspo_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = CentsToTranspo_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = CentsToTranspo_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 CentsToTranspo_compute_next_data_frame(CentsToTranspo *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -4148,7 +4148,7 @@ CentsToTranspo_traverse(CentsToTranspo *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 CentsToTranspo_clear(CentsToTranspo *self)
 {
     pyo_CLEAR
@@ -4172,33 +4172,33 @@ CentsToTranspo_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     CentsToTranspo *self;
     self = (CentsToTranspo *)type->tp_alloc(type, 0);
-    
+
     self->lastcents = 0.0;
     self->curtranspo = 1.0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, CentsToTranspo_compute_next_data_frame);
     self->mode_func_ptr = CentsToTranspo_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -4206,10 +4206,10 @@ CentsToTranspo_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * CentsToTranspo_getServer(CentsToTranspo* self) { GET_SERVER };
 static PyObject * CentsToTranspo_getStream(CentsToTranspo* self) { GET_STREAM };
-static PyObject * CentsToTranspo_setMul(CentsToTranspo *self, PyObject *arg) { SET_MUL };	
-static PyObject * CentsToTranspo_setAdd(CentsToTranspo *self, PyObject *arg) { SET_ADD };	
-static PyObject * CentsToTranspo_setSub(CentsToTranspo *self, PyObject *arg) { SET_SUB };	
-static PyObject * CentsToTranspo_setDiv(CentsToTranspo *self, PyObject *arg) { SET_DIV };	
+static PyObject * CentsToTranspo_setMul(CentsToTranspo *self, PyObject *arg) { SET_MUL };
+static PyObject * CentsToTranspo_setAdd(CentsToTranspo *self, PyObject *arg) { SET_ADD };
+static PyObject * CentsToTranspo_setSub(CentsToTranspo *self, PyObject *arg) { SET_SUB };
+static PyObject * CentsToTranspo_setDiv(CentsToTranspo *self, PyObject *arg) { SET_DIV };
 
 static PyObject * CentsToTranspo_play(CentsToTranspo *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * CentsToTranspo_out(CentsToTranspo *self, PyObject *args, PyObject *kwds) { OUT };
@@ -4347,7 +4347,7 @@ TranspoToCents_process(TranspoToCents *self) {
     int i;
     MYFLT transpo;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         transpo = in[i];
         if (transpo != self->lasttranspo) {
@@ -4374,44 +4374,44 @@ TranspoToCents_setProcMode(TranspoToCents *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = TranspoToCents_process;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = TranspoToCents_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = TranspoToCents_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = TranspoToCents_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = TranspoToCents_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = TranspoToCents_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = TranspoToCents_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = TranspoToCents_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = TranspoToCents_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = TranspoToCents_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 TranspoToCents_compute_next_data_frame(TranspoToCents *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -4424,7 +4424,7 @@ TranspoToCents_traverse(TranspoToCents *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 TranspoToCents_clear(TranspoToCents *self)
 {
     pyo_CLEAR
@@ -4448,33 +4448,33 @@ TranspoToCents_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     TranspoToCents *self;
     self = (TranspoToCents *)type->tp_alloc(type, 0);
-    
+
     self->lasttranspo = 1.0;
     self->curcents = 0.0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, TranspoToCents_compute_next_data_frame);
     self->mode_func_ptr = TranspoToCents_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -4482,10 +4482,10 @@ TranspoToCents_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * TranspoToCents_getServer(TranspoToCents* self) { GET_SERVER };
 static PyObject * TranspoToCents_getStream(TranspoToCents* self) { GET_STREAM };
-static PyObject * TranspoToCents_setMul(TranspoToCents *self, PyObject *arg) { SET_MUL };	
-static PyObject * TranspoToCents_setAdd(TranspoToCents *self, PyObject *arg) { SET_ADD };	
-static PyObject * TranspoToCents_setSub(TranspoToCents *self, PyObject *arg) { SET_SUB };	
-static PyObject * TranspoToCents_setDiv(TranspoToCents *self, PyObject *arg) { SET_DIV };	
+static PyObject * TranspoToCents_setMul(TranspoToCents *self, PyObject *arg) { SET_MUL };
+static PyObject * TranspoToCents_setAdd(TranspoToCents *self, PyObject *arg) { SET_ADD };
+static PyObject * TranspoToCents_setSub(TranspoToCents *self, PyObject *arg) { SET_SUB };
+static PyObject * TranspoToCents_setDiv(TranspoToCents *self, PyObject *arg) { SET_DIV };
 
 static PyObject * TranspoToCents_play(TranspoToCents *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * TranspoToCents_out(TranspoToCents *self, PyObject *args, PyObject *kwds) { OUT };
@@ -4623,7 +4623,7 @@ MToF_process(MToF *self) {
     int i;
     MYFLT midi;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         midi = in[i];
         if (midi != self->lastmidi) {
@@ -4650,44 +4650,44 @@ MToF_setProcMode(MToF *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = MToF_process;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = MToF_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = MToF_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = MToF_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = MToF_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = MToF_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = MToF_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = MToF_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = MToF_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = MToF_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 MToF_compute_next_data_frame(MToF *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -4700,7 +4700,7 @@ MToF_traverse(MToF *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 MToF_clear(MToF *self)
 {
     pyo_CLEAR
@@ -4724,33 +4724,33 @@ MToF_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     MToF *self;
     self = (MToF *)type->tp_alloc(type, 0);
-    
+
     self->lastmidi = 0;
     self->curfreq = 8.1757989156437;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, MToF_compute_next_data_frame);
     self->mode_func_ptr = MToF_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -4758,10 +4758,10 @@ MToF_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * MToF_getServer(MToF* self) { GET_SERVER };
 static PyObject * MToF_getStream(MToF* self) { GET_STREAM };
-static PyObject * MToF_setMul(MToF *self, PyObject *arg) { SET_MUL };	
-static PyObject * MToF_setAdd(MToF *self, PyObject *arg) { SET_ADD };	
-static PyObject * MToF_setSub(MToF *self, PyObject *arg) { SET_SUB };	
-static PyObject * MToF_setDiv(MToF *self, PyObject *arg) { SET_DIV };	
+static PyObject * MToF_setMul(MToF *self, PyObject *arg) { SET_MUL };
+static PyObject * MToF_setAdd(MToF *self, PyObject *arg) { SET_ADD };
+static PyObject * MToF_setSub(MToF *self, PyObject *arg) { SET_SUB };
+static PyObject * MToF_setDiv(MToF *self, PyObject *arg) { SET_DIV };
 
 static PyObject * MToF_play(MToF *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * MToF_out(MToF *self, PyObject *args, PyObject *kwds) { OUT };
@@ -4899,7 +4899,7 @@ FToM_process(FToM *self) {
     int i;
     MYFLT freq;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         freq = in[i];
         if (freq != self->lastfreq) {
@@ -4928,44 +4928,44 @@ FToM_setProcMode(FToM *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = FToM_process;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = FToM_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = FToM_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = FToM_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = FToM_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = FToM_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = FToM_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = FToM_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = FToM_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = FToM_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 FToM_compute_next_data_frame(FToM *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -4978,7 +4978,7 @@ FToM_traverse(FToM *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 FToM_clear(FToM *self)
 {
     pyo_CLEAR
@@ -5002,33 +5002,33 @@ FToM_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     FToM *self;
     self = (FToM *)type->tp_alloc(type, 0);
-    
+
     self->lastfreq = 8.1758;
     self->curmidi = 0.0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, FToM_compute_next_data_frame);
     self->mode_func_ptr = FToM_setProcMode;
 
     static char *kwlist[] = {"input", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, &inputtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -5036,10 +5036,10 @@ FToM_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * FToM_getServer(FToM* self) { GET_SERVER };
 static PyObject * FToM_getStream(FToM* self) { GET_STREAM };
-static PyObject * FToM_setMul(FToM *self, PyObject *arg) { SET_MUL };	
-static PyObject * FToM_setAdd(FToM *self, PyObject *arg) { SET_ADD };	
-static PyObject * FToM_setSub(FToM *self, PyObject *arg) { SET_SUB };	
-static PyObject * FToM_setDiv(FToM *self, PyObject *arg) { SET_DIV };	
+static PyObject * FToM_setMul(FToM *self, PyObject *arg) { SET_MUL };
+static PyObject * FToM_setAdd(FToM *self, PyObject *arg) { SET_ADD };
+static PyObject * FToM_setSub(FToM *self, PyObject *arg) { SET_SUB };
+static PyObject * FToM_setDiv(FToM *self, PyObject *arg) { SET_DIV };
 
 static PyObject * FToM_play(FToM *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * FToM_out(FToM *self, PyObject *args, PyObject *kwds) { OUT };
@@ -5178,7 +5178,7 @@ MToT_process(MToT *self) {
     int i;
     MYFLT midi;
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         midi = in[i];
         if (midi != self->lastmidi) {
@@ -5205,44 +5205,44 @@ MToT_setProcMode(MToT *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
     self->proc_func_ptr = MToT_process;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = MToT_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = MToT_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = MToT_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = MToT_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = MToT_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = MToT_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = MToT_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = MToT_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = MToT_postprocessing_revareva;
             break;
-    }   
+    }
 }
 
 static void
 MToT_compute_next_data_frame(MToT *self)
 {
-    (*self->proc_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -5255,7 +5255,7 @@ MToT_traverse(MToT *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 MToT_clear(MToT *self)
 {
     pyo_CLEAR
@@ -5279,34 +5279,34 @@ MToT_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
     MToT *self;
     self = (MToT *)type->tp_alloc(type, 0);
-    
+
     self->centralkey = 60.0;
     self->lastmidi = 0;
     self->curfreq = 8.1757989156437;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, MToT_compute_next_data_frame);
     self->mode_func_ptr = MToT_setProcMode;
 
     static char *kwlist[] = {"input", "centralkey", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_FOO, kwlist, &inputtmp, &self->centralkey, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -5319,23 +5319,23 @@ MToT_setCentralKey(MToT *self, PyObject *arg)
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-	
+
 	if (isNumber == 1) {
 		self->centralkey = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
 	}
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
 
 static PyObject * MToT_getServer(MToT* self) { GET_SERVER };
 static PyObject * MToT_getStream(MToT* self) { GET_STREAM };
-static PyObject * MToT_setMul(MToT *self, PyObject *arg) { SET_MUL };	
-static PyObject * MToT_setAdd(MToT *self, PyObject *arg) { SET_ADD };	
-static PyObject * MToT_setSub(MToT *self, PyObject *arg) { SET_SUB };	
-static PyObject * MToT_setDiv(MToT *self, PyObject *arg) { SET_DIV };	
+static PyObject * MToT_setMul(MToT *self, PyObject *arg) { SET_MUL };
+static PyObject * MToT_setAdd(MToT *self, PyObject *arg) { SET_ADD };
+static PyObject * MToT_setSub(MToT *self, PyObject *arg) { SET_SUB };
+static PyObject * MToT_setDiv(MToT *self, PyObject *arg) { SET_DIV };
 
 static PyObject * MToT_play(MToT *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * MToT_out(MToT *self, PyObject *args, PyObject *kwds) { OUT };
@@ -5455,4 +5455,4 @@ PyTypeObject MToTType = {
     0,                          /* tp_init */
     0,                                              /* tp_alloc */
     MToT_new,                                     /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/src/objects/wgverbmodule.c b/src/objects/wgverbmodule.c
index 1fa6d06..b1b304d 100644
--- a/src/objects/wgverbmodule.c
+++ b/src/objects/wgverbmodule.c
@@ -1,21 +1,21 @@
-/*************************************************************************
- * Copyright 2010 Olivier Belanger                                        *                  
- *                                                                        * 
+/**************************************************************************
+ * Copyright 2009-2015 Olivier Belanger                                   *
+ *                                                                        *
  * This file is part of pyo, a python module to help digital signal       *
- * processing script creation.                                            *  
- *                                                                        * 
+ * processing script creation.                                            *
+ *                                                                        *
  * pyo is free software: you can redistribute it and/or modify            *
- * it under the terms of the GNU General Public License as published by   *
- * the Free Software Foundation, either version 3 of the License, or      *
- * (at your option) any later version.                                    * 
+ * it under the terms of the GNU Lesser General Public License as         *
+ * published by the Free Software Foundation, either version 3 of the     *
+ * License, or (at your option) any later version.                        *
  *                                                                        *
  * pyo is distributed in the hope that it will be useful,                 *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of         *    
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- * GNU General Public License for more details.                           *
+ * GNU Lesser General Public License for more details.                    *
  *                                                                        *
- * You should have received a copy of the GNU General Public License      *
- * along with pyo.  If not, see <http://www.gnu.org/licenses/>.           *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with pyo.  If not, see <http://www.gnu.org/licenses/>.   *
  *************************************************************************/
 
 #include <Python.h>
@@ -78,11 +78,11 @@ static void
 WGVerb_process_ii(WGVerb *self) {
     MYFLT val, x, x1, xind, frac, junction, inval, filt;
     int i, j, ind;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT feed = PyFloat_AS_DOUBLE(self->feedback);
     MYFLT freq = PyFloat_AS_DOUBLE(self->cutoff);
-        
+
     if (feed < 0)
         feed = 0;
     else if (feed > 1)
@@ -93,7 +93,7 @@ WGVerb_process_ii(WGVerb *self) {
         self->damp = 2.0 - MYCOS(TWOPI * freq / self->sr);
         self->damp = (self->damp - MYSQRT(self->damp * self->damp - 1.0));
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
         junction = self->total_signal * .25;
@@ -109,7 +109,7 @@ WGVerb_process_ii(WGVerb *self) {
                 self->rnd_diff[j] = self->rnd_value[j] - self->rnd_oldValue[j];
             }
             self->rnd[j] = self->rnd_oldValue[j] + self->rnd_diff[j] * self->rnd_time[j];
-            
+
             xind = self->in_count[j] - (self->delays[j] + self->rnd[j]);
             if (xind < 0)
                 xind += self->size[j];
@@ -121,7 +121,7 @@ WGVerb_process_ii(WGVerb *self) {
             val *= feed;
             filt = (self->lastSamples[j] - val) * self->damp + val;
             self->total_signal += filt;
-        
+
             self->buffer[j][self->in_count[j]] = inval + junction - self->lastSamples[j];
             self->lastSamples[j] = filt;
             if(self->in_count[j] == 0)
@@ -129,7 +129,7 @@ WGVerb_process_ii(WGVerb *self) {
             self->in_count[j]++;
             if (self->in_count[j] >= self->size[j])
                 self->in_count[j] = 0;
-        } 
+        }
         self->data[i] = self->total_signal * 0.25;
     }
 }
@@ -138,24 +138,24 @@ static void
 WGVerb_process_ai(WGVerb *self) {
     MYFLT val, x, x1, xind, frac, junction, inval, filt, feed;
     int i, j, ind;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *feedback = Stream_getData((Stream *)self->feedback_stream);
     MYFLT freq = PyFloat_AS_DOUBLE(self->cutoff);
-        
+
     if (freq != self->lastFreq) {
         self->lastFreq = freq;
         self->damp = 2.0 - MYCOS(TWOPI * freq / self->sr);
         self->damp = (self->damp - MYSQRT(self->damp * self->damp - 1.0));
     }
-    
+
     for (i=0; i<self->bufsize; i++) {
         inval = in[i];
         feed = feedback[i];
         if (feed < 0)
             feed = 0;
         else if (feed > 1)
-            feed = 1;        
+            feed = 1;
         junction = self->total_signal * .25;
         self->total_signal = 0.0;
         for (j=0; j<8; j++) {
@@ -169,7 +169,7 @@ WGVerb_process_ai(WGVerb *self) {
                 self->rnd_diff[j] = self->rnd_value[j] - self->rnd_oldValue[j];
             }
             self->rnd[j] = self->rnd_oldValue[j] + self->rnd_diff[j] * self->rnd_time[j];
-            
+
             xind = self->in_count[j] - (self->delays[j] + self->rnd[j]);
             if (xind < 0)
                 xind += self->size[j];
@@ -181,7 +181,7 @@ WGVerb_process_ai(WGVerb *self) {
             val *= feed;
             filt = (self->lastSamples[j] - val) * self->damp + val;
             self->total_signal += filt;
-            
+
             self->buffer[j][self->in_count[j]] = inval + junction - self->lastSamples[j];
             self->lastSamples[j] = filt;
             if(self->in_count[j] == 0)
@@ -189,20 +189,20 @@ WGVerb_process_ai(WGVerb *self) {
             self->in_count[j]++;
             if (self->in_count[j] >= self->size[j])
                 self->in_count[j] = 0;
-        } 
+        }
         self->data[i] = self->total_signal * 0.25;
-    }    
+    }
 }
 
 static void
 WGVerb_process_ia(WGVerb *self) {
     MYFLT val, x, x1, xind, frac, junction, inval, filt, freq;
     int i, j, ind;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT feed = PyFloat_AS_DOUBLE(self->feedback);
     MYFLT *cutoff = Stream_getData((Stream *)self->cutoff_stream);
-    
+
     if (feed < 0)
         feed = 0;
     else if (feed > 1)
@@ -215,7 +215,7 @@ WGVerb_process_ia(WGVerb *self) {
             self->lastFreq = freq;
             self->damp = 2.0 - MYCOS(TWOPI * freq / self->sr);
             self->damp = (self->damp - MYSQRT(self->damp * self->damp - 1.0));
-        }        
+        }
         junction = self->total_signal * .25;
         self->total_signal = 0.0;
         for (j=0; j<8; j++) {
@@ -229,7 +229,7 @@ WGVerb_process_ia(WGVerb *self) {
                 self->rnd_diff[j] = self->rnd_value[j] - self->rnd_oldValue[j];
             }
             self->rnd[j] = self->rnd_oldValue[j] + self->rnd_diff[j] * self->rnd_time[j];
-            
+
             xind = self->in_count[j] - (self->delays[j] + self->rnd[j]);
             if (xind < 0)
                 xind += self->size[j];
@@ -241,7 +241,7 @@ WGVerb_process_ia(WGVerb *self) {
             val *= feed;
             filt = (self->lastSamples[j] - val) * self->damp + val;
             self->total_signal += filt;
-            
+
             self->buffer[j][self->in_count[j]] = inval + junction - self->lastSamples[j];
             self->lastSamples[j] = filt;
             if(self->in_count[j] == 0)
@@ -249,16 +249,16 @@ WGVerb_process_ia(WGVerb *self) {
             self->in_count[j]++;
             if (self->in_count[j] >= self->size[j])
                 self->in_count[j] = 0;
-        } 
+        }
         self->data[i] = self->total_signal * 0.25;
-    }    
+    }
 }
 
 static void
 WGVerb_process_aa(WGVerb *self) {
     MYFLT val, x, x1, xind, frac, junction, inval, filt, feed, freq;
     int i, j, ind;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *feedback = Stream_getData((Stream *)self->feedback_stream);
     MYFLT *cutoff = Stream_getData((Stream *)self->cutoff_stream);
@@ -270,12 +270,12 @@ WGVerb_process_aa(WGVerb *self) {
         if (feed < 0)
             feed = 0;
         else if (feed > 1)
-            feed = 1;        
+            feed = 1;
         if (freq != self->lastFreq) {
             self->lastFreq = freq;
             self->damp = 2.0 - MYCOS(TWOPI * freq / self->sr);
             self->damp = (self->damp - MYSQRT(self->damp * self->damp - 1.0));
-        }        
+        }
         junction = self->total_signal * .25;
         self->total_signal = 0.0;
         for (j=0; j<8; j++) {
@@ -289,7 +289,7 @@ WGVerb_process_aa(WGVerb *self) {
                 self->rnd_diff[j] = self->rnd_value[j] - self->rnd_oldValue[j];
             }
             self->rnd[j] = self->rnd_oldValue[j] + self->rnd_diff[j] * self->rnd_time[j];
-            
+
             xind = self->in_count[j] - (self->delays[j] + self->rnd[j]);
             if (xind < 0)
                 xind += self->size[j];
@@ -301,7 +301,7 @@ WGVerb_process_aa(WGVerb *self) {
             val *= feed;
             filt = (self->lastSamples[j] - val) * self->damp + val;
             self->total_signal += filt;
-            
+
             self->buffer[j][self->in_count[j]] = inval + junction - self->lastSamples[j];
             self->lastSamples[j] = filt;
             if(self->in_count[j] == 0)
@@ -309,24 +309,24 @@ WGVerb_process_aa(WGVerb *self) {
             self->in_count[j]++;
             if (self->in_count[j] >= self->size[j])
                 self->in_count[j] = 0;
-        } 
+        }
         self->data[i] = self->total_signal * 0.25;
-    } 
+    }
 }
 
 static void
 WGVerb_mix_i(WGVerb *self) {
     int i;
     MYFLT val;
-    
+
     MYFLT mix = PyFloat_AS_DOUBLE(self->mix);
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     if (mix < 0.0)
         mix = 0.0;
     else if (mix > 1.0)
         mix = 1.0;
-    
+
     for (i=0; i<self->bufsize; i++) {
         val = in[i] * (1.0 - mix) + self->data[i] * mix;
         self->data[i] = val;
@@ -337,17 +337,17 @@ static void
 WGVerb_mix_a(WGVerb *self) {
     int i;
     MYFLT mix, val;
-    
+
     MYFLT *mi = Stream_getData((Stream *)self->mix_stream);
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         mix = mi[i];
         if (mix < 0.0)
             mix = 0.0;
         else if (mix > 1.0)
             mix = 1.0;
-        
+
         val = in[i] * (1.0 - mix) + self->data[i] * mix;
         self->data[i] = val;
     }
@@ -370,66 +370,66 @@ WGVerb_setProcMode(WGVerb *self)
     procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
     mixmode = self->modebuffer[4];
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = WGVerb_process_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = WGVerb_process_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = WGVerb_process_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = WGVerb_process_aa;
             break;
-    } 
+    }
     switch (mixmode) {
-        case 0:    
+        case 0:
             self->mix_func_ptr = WGVerb_mix_i;
             break;
-        case 1:    
+        case 1:
             self->mix_func_ptr = WGVerb_mix_a;
             break;
-    }        
-            
+    }
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = WGVerb_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = WGVerb_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = WGVerb_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = WGVerb_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = WGVerb_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = WGVerb_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = WGVerb_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = WGVerb_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = WGVerb_postprocessing_revareva;
             break;
-    } 
+    }
 }
 
 static void
 WGVerb_compute_next_data_frame(WGVerb *self)
 {
-    (*self->proc_func_ptr)(self); 
-    (*self->mix_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
+    (*self->mix_func_ptr)(self);
     (*self->muladd_func_ptr)(self);
 }
 
@@ -438,28 +438,28 @@ WGVerb_traverse(WGVerb *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->input);
-    Py_VISIT(self->input_stream);    
-    Py_VISIT(self->feedback);    
-    Py_VISIT(self->feedback_stream);    
-    Py_VISIT(self->cutoff);    
-    Py_VISIT(self->cutoff_stream);    
-    Py_VISIT(self->mix);    
-    Py_VISIT(self->mix_stream);    
+    Py_VISIT(self->input_stream);
+    Py_VISIT(self->feedback);
+    Py_VISIT(self->feedback_stream);
+    Py_VISIT(self->cutoff);
+    Py_VISIT(self->cutoff_stream);
+    Py_VISIT(self->mix);
+    Py_VISIT(self->mix_stream);
     return 0;
 }
 
-static int 
+static int
 WGVerb_clear(WGVerb *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
-    Py_CLEAR(self->input_stream);    
-    Py_CLEAR(self->feedback);    
-    Py_CLEAR(self->feedback_stream);    
-    Py_CLEAR(self->cutoff);    
-    Py_CLEAR(self->cutoff_stream);    
-    Py_CLEAR(self->mix);    
-    Py_CLEAR(self->mix_stream);    
+    Py_CLEAR(self->input_stream);
+    Py_CLEAR(self->feedback);
+    Py_CLEAR(self->feedback_stream);
+    Py_CLEAR(self->cutoff);
+    Py_CLEAR(self->cutoff_stream);
+    Py_CLEAR(self->mix);
+    Py_CLEAR(self->mix_stream);
     return 0;
 }
 
@@ -470,7 +470,7 @@ WGVerb_dealloc(WGVerb* self)
     pyo_DEALLOC
     for (i=0; i<8; i++) {
         free(self->buffer[i]);
-    }    
+    }
     WGVerb_clear(self);
     self->ob_type->tp_free((PyObject*)self);
 }
@@ -482,23 +482,23 @@ WGVerb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *feedbacktmp=NULL, *cutofftmp=NULL, *mixtmp=NULL, *multmp=NULL, *addtmp=NULL;
     WGVerb *self;
     self = (WGVerb *)type->tp_alloc(type, 0);
-    
+
     self->feedback = PyFloat_FromDouble(0.5);
     self->cutoff = PyFloat_FromDouble(5000.0);
     self->mix = PyFloat_FromDouble(0.5);
     self->lastFreq = self->damp = 0.0;
-    
+
     self->total_signal = 0.0;
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
 	self->modebuffer[3] = 0;
 	self->modebuffer[4] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, WGVerb_compute_next_data_frame);
     self->mode_func_ptr = WGVerb_setProcMode;
-    
+
     for (i=0; i<8; i++) {
         self->in_count[i] = 0;
         self->lastSamples[i] = 0.0;
@@ -511,12 +511,12 @@ WGVerb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     }
 
     static char *kwlist[] = {"input", "feedback", "cutoff", "mix", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOOO", kwlist, &inputtmp, &feedbacktmp, &cutofftmp, &mixtmp, &multmp, &addtmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
-       
+
     if (feedbacktmp) {
         PyObject_CallMethod((PyObject *)self, "setFeedback", "O", feedbacktmp);
     }
@@ -528,15 +528,15 @@ WGVerb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (mixtmp) {
         PyObject_CallMethod((PyObject *)self, "setMix", "O", mixtmp);
     }
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
 
     for (i=0; i<8; i++) {
@@ -544,9 +544,9 @@ WGVerb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         self->buffer[i] = (MYFLT *)realloc(self->buffer[i], (self->size[i]+1) * sizeof(MYFLT));
         for (j=0; j<(self->size[i]+1); j++) {
             self->buffer[i][j] = 0.;
-        }    
-    }    
-    
+        }
+    }
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -554,10 +554,10 @@ WGVerb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * WGVerb_getServer(WGVerb* self) { GET_SERVER };
 static PyObject * WGVerb_getStream(WGVerb* self) { GET_STREAM };
-static PyObject * WGVerb_setMul(WGVerb *self, PyObject *arg) { SET_MUL };	
-static PyObject * WGVerb_setAdd(WGVerb *self, PyObject *arg) { SET_ADD };	
-static PyObject * WGVerb_setSub(WGVerb *self, PyObject *arg) { SET_SUB };	
-static PyObject * WGVerb_setDiv(WGVerb *self, PyObject *arg) { SET_DIV };	
+static PyObject * WGVerb_setMul(WGVerb *self, PyObject *arg) { SET_MUL };
+static PyObject * WGVerb_setAdd(WGVerb *self, PyObject *arg) { SET_ADD };
+static PyObject * WGVerb_setSub(WGVerb *self, PyObject *arg) { SET_SUB };
+static PyObject * WGVerb_setDiv(WGVerb *self, PyObject *arg) { SET_DIV };
 
 static PyObject * WGVerb_play(WGVerb *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * WGVerb_out(WGVerb *self, PyObject *args, PyObject *kwds) { OUT };
@@ -576,14 +576,14 @@ static PyObject *
 WGVerb_setFeedback(WGVerb *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->feedback);
@@ -599,25 +599,25 @@ WGVerb_setFeedback(WGVerb *self, PyObject *arg)
         self->feedback_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 WGVerb_setCutoff(WGVerb *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->cutoff);
@@ -633,25 +633,25 @@ WGVerb_setCutoff(WGVerb *self, PyObject *arg)
         self->cutoff_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 WGVerb_setMix(WGVerb *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->mix);
@@ -667,12 +667,12 @@ WGVerb_setMix(WGVerb *self, PyObject *arg)
         self->mix_stream = (Stream *)streamtmp;
 		self->modebuffer[4] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef WGVerb_members[] = {
 {"server", T_OBJECT_EX, offsetof(WGVerb, server), 0, "Pyo server."},
@@ -841,7 +841,7 @@ STReverb_process_ii(STReverb *self) {
     MYFLT ref_amp_l[NUM_REFS];
     MYFLT ref_amp_r[NUM_REFS];
     MYFLT ref_buf[2];
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT inpos = PyFloat_AS_DOUBLE(self->inpos);
     if (self->modebuffer[1] == 0)
@@ -849,12 +849,12 @@ STReverb_process_ii(STReverb *self) {
     else
         feed = Stream_getData((Stream *)self->revtime_stream)[0];
     MYFLT freq = PyFloat_AS_DOUBLE(self->cutoff);
-        
+
     if (inpos < 0.0)
         inpos = 0.0;
     else if (inpos > 1.0)
         inpos = 1.0;
-       
+
     if (feed < 0.01)
         feed = 0.01;
     feed = MYPOW(100.0, -self->avg_time/feed);
@@ -929,7 +929,7 @@ STReverb_process_ii(STReverb *self) {
                     self->rnd_diff[k][j] = self->rnd_value[k][j] - self->rnd_oldValue[k][j];
                 }
                 self->rnd[k][j] = self->rnd_oldValue[k][j] + self->rnd_diff[k][j] * self->rnd_time[k][j];
-                
+
                 xind = self->in_count[k][j] - (self->delays[k][j] + self->rnd[k][j]);
                 if (xind < 0)
                     xind += self->size[k][j];
@@ -941,7 +941,7 @@ STReverb_process_ii(STReverb *self) {
                 val *= feed;
                 filt = val + (self->lastSamples[k][j] - val) * self->damp[k];
                 self->total_signal[k] += filt;
-            
+
                 self->buffer[k][j][self->in_count[k][j]] = inval + junction - self->lastSamples[k][j];
                 self->lastSamples[k][j] = filt;
                 if(self->in_count[k][j] == 0)
@@ -949,7 +949,7 @@ STReverb_process_ii(STReverb *self) {
                 self->in_count[k][j]++;
                 if (self->in_count[k][j] >= self->size[k][j])
                     self->in_count[k][j] = 0;
-            } 
+            }
             self->buffer_streams[i+k*self->bufsize] = self->total_signal[k] * 0.25;
         }
     }
@@ -962,7 +962,7 @@ STReverb_process_ai(STReverb *self) {
     MYFLT ref_amp_r[NUM_REFS];
     MYFLT ref_buf[2];
     int i, j, k, k2, ind, half;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *pos = Stream_getData((Stream *)self->inpos_stream);
     if (self->modebuffer[1] == 0)
@@ -1050,7 +1050,7 @@ STReverb_process_ai(STReverb *self) {
                     self->rnd_diff[k][j] = self->rnd_value[k][j] - self->rnd_oldValue[k][j];
                 }
                 self->rnd[k][j] = self->rnd_oldValue[k][j] + self->rnd_diff[k][j] * self->rnd_time[k][j];
-                
+
                 xind = self->in_count[k][j] - (self->delays[k][j] + self->rnd[k][j]);
                 if (xind < 0)
                     xind += self->size[k][j];
@@ -1062,7 +1062,7 @@ STReverb_process_ai(STReverb *self) {
                 val *= feed;
                 filt = val + (self->lastSamples[k][j] - val) * self->damp[k];
                 self->total_signal[k] += filt;
-            
+
                 self->buffer[k][j][self->in_count[k][j]] = inval + junction - self->lastSamples[k][j];
                 self->lastSamples[k][j] = filt;
                 if(self->in_count[k][j] == 0)
@@ -1070,7 +1070,7 @@ STReverb_process_ai(STReverb *self) {
                 self->in_count[k][j]++;
                 if (self->in_count[k][j] >= self->size[k][j])
                     self->in_count[k][j] = 0;
-            } 
+            }
             self->buffer_streams[i+k*self->bufsize] = self->total_signal[k] * 0.25;
         }
     }
@@ -1083,7 +1083,7 @@ STReverb_process_ia(STReverb *self) {
     MYFLT ref_amp_r[NUM_REFS];
     MYFLT ref_buf[2];
     int i, j, k, k2, ind, half;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT inpos = PyFloat_AS_DOUBLE(self->inpos);
     if (self->modebuffer[1] == 0)
@@ -1091,12 +1091,12 @@ STReverb_process_ia(STReverb *self) {
     else
         feed = Stream_getData((Stream *)self->revtime_stream)[0];
     MYFLT *fr = Stream_getData((Stream *)self->cutoff_stream);
-        
+
     if (inpos < 0.0)
         inpos = 0.0;
     else if (inpos > 1.0)
         inpos = 1.0;
-       
+
     if (feed < 0.01)
         feed = 0.01;
     feed = MYPOW(100.0, -self->avg_time/feed);
@@ -1172,7 +1172,7 @@ STReverb_process_ia(STReverb *self) {
                     self->rnd_diff[k][j] = self->rnd_value[k][j] - self->rnd_oldValue[k][j];
                 }
                 self->rnd[k][j] = self->rnd_oldValue[k][j] + self->rnd_diff[k][j] * self->rnd_time[k][j];
-                
+
                 xind = self->in_count[k][j] - (self->delays[k][j] + self->rnd[k][j]);
                 if (xind < 0)
                     xind += self->size[k][j];
@@ -1184,7 +1184,7 @@ STReverb_process_ia(STReverb *self) {
                 val *= feed;
                 filt = val + (self->lastSamples[k][j] - val) * self->damp[k];
                 self->total_signal[k] += filt;
-            
+
                 self->buffer[k][j][self->in_count[k][j]] = inval + junction - self->lastSamples[k][j];
                 self->lastSamples[k][j] = filt;
                 if(self->in_count[k][j] == 0)
@@ -1192,7 +1192,7 @@ STReverb_process_ia(STReverb *self) {
                 self->in_count[k][j]++;
                 if (self->in_count[k][j] >= self->size[k][j])
                     self->in_count[k][j] = 0;
-            } 
+            }
             self->buffer_streams[i+k*self->bufsize] = self->total_signal[k] * 0.25;
         }
     }
@@ -1205,7 +1205,7 @@ STReverb_process_aa(STReverb *self) {
     MYFLT ref_amp_r[NUM_REFS];
     MYFLT ref_buf[2];
     int i, j, k, k2, ind, half;
-    
+
     MYFLT *in = Stream_getData((Stream *)self->input_stream);
     MYFLT *pos = Stream_getData((Stream *)self->inpos_stream);
     if (self->modebuffer[1] == 0)
@@ -1294,7 +1294,7 @@ STReverb_process_aa(STReverb *self) {
                     self->rnd_diff[k][j] = self->rnd_value[k][j] - self->rnd_oldValue[k][j];
                 }
                 self->rnd[k][j] = self->rnd_oldValue[k][j] + self->rnd_diff[k][j] * self->rnd_time[k][j];
-                
+
                 xind = self->in_count[k][j] - (self->delays[k][j] + self->rnd[k][j]);
                 if (xind < 0)
                     xind += self->size[k][j];
@@ -1306,7 +1306,7 @@ STReverb_process_aa(STReverb *self) {
                 val *= feed;
                 filt = val + (self->lastSamples[k][j] - val) * self->damp[k];
                 self->total_signal[k] += filt;
-            
+
                 self->buffer[k][j][self->in_count[k][j]] = inval + junction - self->lastSamples[k][j];
                 self->lastSamples[k][j] = filt;
                 if(self->in_count[k][j] == 0)
@@ -1314,7 +1314,7 @@ STReverb_process_aa(STReverb *self) {
                 self->in_count[k][j]++;
                 if (self->in_count[k][j] >= self->size[k][j])
                     self->in_count[k][j] = 0;
-            } 
+            }
             self->buffer_streams[i+k*self->bufsize] = self->total_signal[k] * 0.25;
         }
     }
@@ -1324,14 +1324,14 @@ static void
 STReverb_mix_i(STReverb *self) {
     int i, k;
     MYFLT val;
-    
+
     MYFLT mix = PyFloat_AS_DOUBLE(self->mix);
-    
+
     if (mix < 0.0)
         mix = 0.0;
     else if (mix > 1.0)
         mix = 1.0;
-    
+
     for (i=0; i<self->bufsize; i++) {
         for (k=0; k<2; k++) {
             val = self->input_buffer[k][i] + (self->buffer_streams[i+k*self->bufsize] - self->input_buffer[k][i]) * mix;
@@ -1344,16 +1344,16 @@ static void
 STReverb_mix_a(STReverb *self) {
     int i, k;
     MYFLT mix, val;
-    
+
     MYFLT *mi = Stream_getData((Stream *)self->mix_stream);
-    
+
     for (i=0; i<self->bufsize; i++) {
         mix = mi[i];
         if (mix < 0.0)
             mix = 0.0;
         else if (mix > 1.0)
             mix = 1.0;
-        
+
         for (k=0; k<2; k++) {
             val = self->input_buffer[k][i] + (self->buffer_streams[i+k*self->bufsize] - self->input_buffer[k][i]) * mix;
             self->buffer_streams[i+k*self->bufsize] = val;
@@ -1367,26 +1367,26 @@ STReverb_setProcMode(STReverb *self)
     int procmode, mixmode;
     procmode = self->modebuffer[0] + self->modebuffer[2] * 10;
     mixmode = self->modebuffer[3];
-    
+
 	switch (procmode) {
-        case 0:    
+        case 0:
             self->proc_func_ptr = STReverb_process_ii;
             break;
-        case 1:    
+        case 1:
             self->proc_func_ptr = STReverb_process_ai;
             break;
-        case 10:    
+        case 10:
             self->proc_func_ptr = STReverb_process_ia;
             break;
-        case 11:    
+        case 11:
             self->proc_func_ptr = STReverb_process_aa;
             break;
-    } 
+    }
     switch (mixmode) {
-        case 0:    
+        case 0:
             self->mix_func_ptr = STReverb_mix_i;
             break;
-        case 1:    
+        case 1:
             self->mix_func_ptr = STReverb_mix_a;
             break;
     }
@@ -1396,13 +1396,13 @@ MYFLT *
 STReverb_getSamplesBuffer(STReverb *self)
 {
     return (MYFLT *)self->buffer_streams;
-}    
+}
 
 static void
 STReverb_compute_next_data_frame(STReverb *self)
 {
-    (*self->proc_func_ptr)(self); 
-    (*self->mix_func_ptr)(self); 
+    (*self->proc_func_ptr)(self);
+    (*self->mix_func_ptr)(self);
 }
 
 static int
@@ -1410,32 +1410,32 @@ STReverb_traverse(STReverb *self, visitproc visit, void *arg)
 {
     pyo_VISIT
     Py_VISIT(self->input);
-    Py_VISIT(self->input_stream);    
-    Py_VISIT(self->inpos);    
-    Py_VISIT(self->inpos_stream);    
-    Py_VISIT(self->revtime);    
-    Py_VISIT(self->revtime_stream);    
-    Py_VISIT(self->cutoff);    
-    Py_VISIT(self->cutoff_stream);    
-    Py_VISIT(self->mix);    
-    Py_VISIT(self->mix_stream);    
+    Py_VISIT(self->input_stream);
+    Py_VISIT(self->inpos);
+    Py_VISIT(self->inpos_stream);
+    Py_VISIT(self->revtime);
+    Py_VISIT(self->revtime_stream);
+    Py_VISIT(self->cutoff);
+    Py_VISIT(self->cutoff_stream);
+    Py_VISIT(self->mix);
+    Py_VISIT(self->mix_stream);
     return 0;
 }
 
-static int 
+static int
 STReverb_clear(STReverb *self)
 {
     pyo_CLEAR
     Py_CLEAR(self->input);
-    Py_CLEAR(self->input_stream);    
-    Py_CLEAR(self->inpos);    
-    Py_CLEAR(self->inpos_stream);    
-    Py_CLEAR(self->revtime);    
-    Py_CLEAR(self->revtime_stream);    
-    Py_CLEAR(self->cutoff);    
-    Py_CLEAR(self->cutoff_stream);    
-    Py_CLEAR(self->mix);    
-    Py_CLEAR(self->mix_stream);    
+    Py_CLEAR(self->input_stream);
+    Py_CLEAR(self->inpos);
+    Py_CLEAR(self->inpos_stream);
+    Py_CLEAR(self->revtime);
+    Py_CLEAR(self->revtime_stream);
+    Py_CLEAR(self->cutoff);
+    Py_CLEAR(self->cutoff_stream);
+    Py_CLEAR(self->mix);
+    Py_CLEAR(self->mix_stream);
     return 0;
 }
 
@@ -1468,7 +1468,7 @@ STReverb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *inputtmp, *input_streamtmp, *inpostmp=NULL, *revtimetmp=NULL, *cutofftmp=NULL, *mixtmp=NULL;
     STReverb *self;
     self = (STReverb *)type->tp_alloc(type, 0);
-    
+
     self->inpos = PyFloat_FromDouble(0.5);
     self->revtime = PyFloat_FromDouble(0.5);
     self->cutoff = PyFloat_FromDouble(5000.0);
@@ -1478,9 +1478,9 @@ STReverb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
 	self->modebuffer[2] = 0;
-    
+
     INIT_OBJECT_COMMON
-    
+
     self->nyquist = self->sr * 0.49;
     self->srfac = self->sr / 44100.0;
 
@@ -1488,16 +1488,16 @@ STReverb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->mode_func_ptr = STReverb_setProcMode;
 
     static char *kwlist[] = {"input", "inpos", "revtime", "cutoff", "mix", "roomSize", "firstRefGain", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_OOOOFF, kwlist, &inputtmp, &inpostmp, &revtimetmp, &cutofftmp, &mixtmp, &roomSize, &firstRefTmp))
         Py_RETURN_NONE;
-    
+
     INIT_INPUT_STREAM
 
     if (inpostmp) {
         PyObject_CallMethod((PyObject *)self, "setInpos", "O", inpostmp);
     }
-       
+
     if (revtimetmp) {
         PyObject_CallMethod((PyObject *)self, "setRevtime", "O", revtimetmp);
     }
@@ -1537,7 +1537,7 @@ STReverb_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
             for (j=0; j<(maxsize+1); j++) {
                 self->buffer[k][i][j] = 0.;
             }
-        }    
+        }
     }
     self->avg_time /= 16.0;
 
@@ -1578,14 +1578,14 @@ static PyObject *
 STReverb_setInpos(STReverb *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->inpos);
@@ -1601,25 +1601,25 @@ STReverb_setInpos(STReverb *self, PyObject *arg)
         self->inpos_stream = (Stream *)streamtmp;
 		self->modebuffer[0] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 STReverb_setRevtime(STReverb *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->revtime);
@@ -1635,25 +1635,25 @@ STReverb_setRevtime(STReverb *self, PyObject *arg)
         self->revtime_stream = (Stream *)streamtmp;
 		self->modebuffer[1] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 STReverb_setCutoff(STReverb *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->cutoff);
@@ -1669,25 +1669,25 @@ STReverb_setCutoff(STReverb *self, PyObject *arg)
         self->cutoff_stream = (Stream *)streamtmp;
 		self->modebuffer[2] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 STReverb_setMix(STReverb *self, PyObject *arg)
 {
 	PyObject *tmp, *streamtmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	tmp = arg;
 	Py_INCREF(tmp);
 	Py_DECREF(self->mix);
@@ -1703,12 +1703,12 @@ STReverb_setMix(STReverb *self, PyObject *arg)
         self->mix_stream = (Stream *)streamtmp;
 		self->modebuffer[3] = 1;
 	}
-    
+
     (*self->mode_func_ptr)(self);
-    
+
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyObject *
 STReverb_setRoomSize(STReverb *self, PyObject *arg)
@@ -1716,14 +1716,14 @@ STReverb_setRoomSize(STReverb *self, PyObject *arg)
     int i, j, k, din;
     long maxsize;
 	MYFLT roomSize;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	if (isNumber == 1) {
         roomSize = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
         if (roomSize < 0.25)
@@ -1746,7 +1746,7 @@ STReverb_setRoomSize(STReverb *self, PyObject *arg)
                 for (j=0; j<(maxsize+1); j++) {
                     self->buffer[k][i][j] = 0.;
                 }
-            }    
+            }
         }
         self->avg_time /= 16.0;
 
@@ -1768,14 +1768,14 @@ static PyObject *
 STReverb_setFirstRefGain(STReverb *self, PyObject *arg)
 {
 	MYFLT tmp;
-	
+
 	if (arg == NULL) {
 		Py_INCREF(Py_None);
 		return Py_None;
 	}
-    
+
 	int isNumber = PyNumber_Check(arg);
-    
+
 	if (isNumber == 1) {
         tmp = PyFloat_AS_DOUBLE(PyNumber_Float(arg));
         self->firstRefGain = MYPOW(10.0, tmp * 0.05);
@@ -1783,7 +1783,7 @@ STReverb_setFirstRefGain(STReverb *self, PyObject *arg)
 
 	Py_INCREF(Py_None);
 	return Py_None;
-}	
+}
 
 static PyMemberDef STReverb_members[] = {
 {"server", T_OBJECT_EX, offsetof(STReverb, server), 0, "Pyo server."},
@@ -1877,33 +1877,33 @@ STRev_setProcMode(STRev *self)
 {
     int muladdmode;
     muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
-    
+
 	switch (muladdmode) {
-        case 0:        
+        case 0:
             self->muladd_func_ptr = STRev_postprocessing_ii;
             break;
-        case 1:    
+        case 1:
             self->muladd_func_ptr = STRev_postprocessing_ai;
             break;
-        case 2:    
+        case 2:
             self->muladd_func_ptr = STRev_postprocessing_revai;
             break;
-        case 10:        
+        case 10:
             self->muladd_func_ptr = STRev_postprocessing_ia;
             break;
-        case 11:    
+        case 11:
             self->muladd_func_ptr = STRev_postprocessing_aa;
             break;
-        case 12:    
+        case 12:
             self->muladd_func_ptr = STRev_postprocessing_revaa;
             break;
-        case 20:        
+        case 20:
             self->muladd_func_ptr = STRev_postprocessing_ireva;
             break;
-        case 21:    
+        case 21:
             self->muladd_func_ptr = STRev_postprocessing_areva;
             break;
-        case 22:    
+        case 22:
             self->muladd_func_ptr = STRev_postprocessing_revareva;
             break;
     }
@@ -1918,7 +1918,7 @@ STRev_compute_next_data_frame(STRev *self)
     tmp = STReverb_getSamplesBuffer((STReverb *)self->mainSplitter);
     for (i=0; i<self->bufsize; i++) {
         self->data[i] = tmp[i + offset];
-    }    
+    }
     (*self->muladd_func_ptr)(self);
 }
 
@@ -1930,11 +1930,11 @@ STRev_traverse(STRev *self, visitproc visit, void *arg)
     return 0;
 }
 
-static int 
+static int
 STRev_clear(STRev *self)
 {
     pyo_CLEAR
-    Py_CLEAR(self->mainSplitter);    
+    Py_CLEAR(self->mainSplitter);
     return 0;
 }
 
@@ -1953,33 +1953,33 @@ STRev_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     PyObject *maintmp=NULL, *multmp=NULL, *addtmp=NULL;
     STRev *self;
     self = (STRev *)type->tp_alloc(type, 0);
-    
+
 	self->modebuffer[0] = 0;
 	self->modebuffer[1] = 0;
-    
+
     INIT_OBJECT_COMMON
     Stream_setFunctionPtr(self->stream, STRev_compute_next_data_frame);
     self->mode_func_ptr = STRev_setProcMode;
 
     static char *kwlist[] = {"mainSplitter", "chnl", "mul", "add", NULL};
-    
+
     if (! PyArg_ParseTupleAndKeywords(args, kwds, "Oi|OO", kwlist, &maintmp, &self->chnl, &multmp, &addtmp))
         Py_RETURN_NONE;
 
     Py_XDECREF(self->mainSplitter);
     Py_INCREF(maintmp);
     self->mainSplitter = (STReverb *)maintmp;
-    
+
     if (multmp) {
         PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
     }
-    
+
     if (addtmp) {
         PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
     }
-    
+
     PyObject_CallMethod(self->server, "addStream", "O", self->stream);
-    
+
     (*self->mode_func_ptr)(self);
 
     return (PyObject *)self;
@@ -1987,10 +1987,10 @@ STRev_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
 static PyObject * STRev_getServer(STRev* self) { GET_SERVER };
 static PyObject * STRev_getStream(STRev* self) { GET_STREAM };
-static PyObject * STRev_setMul(STRev *self, PyObject *arg) { SET_MUL };	
-static PyObject * STRev_setAdd(STRev *self, PyObject *arg) { SET_ADD };	
-static PyObject * STRev_setSub(STRev *self, PyObject *arg) { SET_SUB };	
-static PyObject * STRev_setDiv(STRev *self, PyObject *arg) { SET_DIV };	
+static PyObject * STRev_setMul(STRev *self, PyObject *arg) { SET_MUL };
+static PyObject * STRev_setAdd(STRev *self, PyObject *arg) { SET_ADD };
+static PyObject * STRev_setSub(STRev *self, PyObject *arg) { SET_SUB };
+static PyObject * STRev_setDiv(STRev *self, PyObject *arg) { SET_DIV };
 
 static PyObject * STRev_play(STRev *self, PyObject *args, PyObject *kwds) { PLAY };
 static PyObject * STRev_out(STRev *self, PyObject *args, PyObject *kwds) { OUT };
@@ -2108,4 +2108,4 @@ STRev_members,             /* tp_members */
 0,      /* tp_init */
 0,                         /* tp_alloc */
 STRev_new,                 /* tp_new */
-};
+};
\ No newline at end of file
diff --git a/utils/E-Pyo.py b/utils/E-Pyo.py
index dfb2ae7..de136b3 100755
--- a/utils/E-Pyo.py
+++ b/utils/E-Pyo.py
@@ -615,6 +615,34 @@ folder_add_icon_png = PyEmbeddedImage(
     "P36+7719TjKZnJPvXwAAAP//AwDmNHbvm7mEowAAAABJRU5ErkJggg==")
 catalog['folder_add_icon.png'] = folder_add_icon_png
 
+refresh_tree_icon_png = PyEmbeddedImage(
+    "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAA"
+    "CXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wIHETgo92WyxQAABKJJREFUSMfdlVtsVFUY"
+    "hb9zmTNnZtoOLRel3ATkASiYQMI1YkTxQVMaxMQbCGJCAiY8KAY0aIQYb5CoJEo0RlEgaUwD"
+    "clOUWwABBZFIgVKQi3RaZnqdmXbOOXPO2Wf7gFTRQcFH19NO9v7X+ve/VvLDP+C56qP/dM3U"
+    "dfX8GxRuAh/Xtox3jGhFxqNnxlXcDtu9KOpPH/hk3qR2gNtX15FcNJzZH+1n3fwpACzdepI3"
+    "KysKEy7bcwGAlYcb7n73XL72pTqRmfeT8KoO+fKefV4wZqdnD9/htg6qblv1zsSrTQ5+eccf"
+    "9VtrhxX8weI9F1k1dTAvbj0e0vv0W5qP9VhxNguXuyBpSbI5sC0QdgCuABmgOdaRUGvrDOe9"
+    "iibK3jImfDpvX7mae3tj5R2bCo5o+f7LPbqKSjekstaDZxqa6xoz+UxrVkbcrDZM2mYUoYMS"
+    "BTUGgQAEqmefCucS89yS0hfkbUWPxPymys4VE7cB6NeI+wwZw1MffmEmUsnX6r6srj935MBb"
+    "ttQbLMu2AmGEVE/cpvSf9ozoMWqBVDXQwlDcDzSTgNBIO9J/F64fI2HjZdqUgiPqXzE5nk6c"
+    "G9CVbq4DRKFQGKPnTveGzfxM6uE4KlBUDpEykBIUAYog3Fhbla+ZvgVA/XN14uTBTFe6+eQN"
+    "yAGke2LtZr1p3yxFc9JENJApIAU9NCg1oWcUQlp34yr/Ad7hVdvMY2umKyUh6F0MPRUozkJf"
+    "A8ojEOue/B8e3Az6DRlJ44VT9L5nTrh93KxXZWkcYhEwQxDSIepDvARKQ9f/4KHH59yUQOOF"
+    "U5RULYt33FVVE8SLpyphUMij+A6K70C+k7iaJQjcgiarQPgBwAYMIPS7GT7QXoSWGzreuZhs"
+    "N2WvgZNkJKqg6QI9JAgZgpAhZMgQpWUxmbnYWh8c/Cx9ncAr247NzI8bU7MrKchmBOm0oLMj"
+    "T77NQqa7UFsbftXPfTPJ/XZl062MtduDEyk3+LEZMi0BVspDpFxosSDroLZdOqEdWT3XPb+9"
+    "6VYD0S1Q36XK9mawExqyKYCOALpAcXzM0xsWWue3H/8vieuOacLWpNXgI68EkDHAVsGXSFTs"
+    "0YtqYlWfDwKIzFhfkCg+4dnu84BR9/1dwGsLIOVChwOWA0KA9EFYyEDcbkf6fxWdsX6UvWnW"
+    "VcKqDwDoe+8iADLfv8/AKQuifcfNDjfU7v67AHYg6XAgZ6PkLfByELigKBDkCQJvhKWXHQo/"
+    "XL0EILN5IQBX9q4GwJy8+Mlkp7eqvbHOLLhwzPnfVTrGgC1qrvOwmdz/ut1nYrUUfowgfzWs"
+    "0gPhgCJRpe+o0tmJyDfj5gYGrjVN5tqv6Gc3VXotZ44VNFn6gaH57bVm8uijua8XNpgPvHe/"
+    "WzJ0XRCIO8EHLQRGFIwwgaabAVSiBODbaIkfdoZ+2fR8vuVM7V+90a4dSkY8KGTnlTXW1qeT"
+    "AP75HQkjHN2oGGaRDPJjCRxQFTAMMIuguAxN11v1hsNLOL52uZequ3TDndzrsXW0Vs8GoOfw"
+    "qbTV7bnuUUnvQeX5itlPiOLysUTiUUXTknrq573O7jd2SEjzv8ZvVwomHyvQ89AAAAAASUVO"
+    "RK5CYII=")
+catalog['refresh_tree_icon.png'] = refresh_tree_icon_png
+
 file_delete_icon_png = PyEmbeddedImage(
     "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAABEZJREFU"
     "eJyMVG1MW1UYfm57b1vogNLSdbotdJNkyAp+TOrYogZd4uJ+6GaYyg81auLHj7lEEpdFjfqH"
@@ -745,7 +773,7 @@ KEY_COMMANDS = {
 }
 
 ############## Allowed Extensions ##############
-ALLOWED_EXT = PREFERENCES.get("allowed_ext", ["py", "c5", "txt", "", "c", "h", "cpp", "hpp", "sh", "rst", "iss", "sg"])
+ALLOWED_EXT = PREFERENCES.get("allowed_ext", ["py", "c5", "txt", "", "c", "h", "cpp", "hpp", "sh", "rst", "iss", "sg", "md", "jsfx-inc"])
 
 ############## Pyo keywords ##############
 tree = OBJECTS_TREE
@@ -1913,6 +1941,7 @@ class MainFrame(wx.Frame):
         self.server_pipe = None
         self.back_server_started = False
 
+        self.master_document = None
         self.processID = 0
         self.processes = {}
         self.filters = {}
@@ -2049,22 +2078,25 @@ class MainFrame(wx.Frame):
         self.Bind(wx.EVT_MENU, self.showFind, id=wx.ID_FIND)
         self.menuBar.Append(menu2, 'Code')
 
-        menu3 = wx.Menu()
-        menu3.Append(300, "Run\tCtrl+R")
+        self.menu3 = wx.Menu()
+        self.menu3.Append(299, "Set Current Document as Master")
+        self.Bind(wx.EVT_MENU, self.setMasterDocument, id=299)
+        self.menu3.AppendSeparator()
+        self.menu3.Append(300, "Run\tCtrl+R")
         self.Bind(wx.EVT_MENU, self.runner, id=300)
-        menu3.Append(301, "Run Selection\tShift+Ctrl+R")
+        self.menu3.Append(301, "Run Selection\tShift+Ctrl+R")
         self.Bind(wx.EVT_MENU, self.runSelection, id=301)
-        menu3.Append(302, "Run Line/Selection as Pyo\tCtrl+E")
+        self.menu3.Append(302, "Run Line/Selection as Pyo\tCtrl+E")
         self.Bind(wx.EVT_MENU, self.runSelectionAsPyo, id=302)
-        menu3.Append(303, "Execute Line/Selection as Python\tShift+Ctrl+E")
+        self.menu3.Append(303, "Execute Line/Selection as Python\tShift+Ctrl+E")
         self.Bind(wx.EVT_MENU, self.execSelection, id=303)
-        menu3.AppendSeparator()
-        self.backServerItem = menu3.Append(304, "Start Pyo Background Server")
+        self.menu3.AppendSeparator()
+        self.backServerItem = self.menu3.Append(304, "Start Pyo Background Server")
         self.Bind(wx.EVT_MENU, self.startStopBackgroundServer, id=304)
-        self.sendToServerItem = menu3.Append(305, "Send Line/Selection to Pyo Background Server\tCtrl+T")
+        self.sendToServerItem = self.menu3.Append(305, "Send Line/Selection to Pyo Background Server\tCtrl+T")
         self.sendToServerItem.Enable(False)
         self.Bind(wx.EVT_MENU, self.sendSelectionToBackgroundServer, id=305)
-        self.menuBar.Append(menu3, 'Process')
+        self.menuBar.Append(self.menu3, 'Process')
 
         menu4 = wx.Menu()
         menu4.Append(wx.ID_ZOOM_IN, "Zoom in\tCtrl+=")
@@ -2242,6 +2274,14 @@ class MainFrame(wx.Frame):
         if rect.x > self.field1X+160:
             self.cc.SetPosition((rect.x, rect.y+yoff2))
 
+    def setMasterDocument(self, evt):
+        if self.master_document == None:
+            self.master_document = self.panel.editor.path
+            self.menu3.SetLabel(299, "Revert Master Document to None")
+        else:
+            self.master_document = None
+            self.menu3.SetLabel(299, "Set Current Document as Master")                
+
     def StatusOnSize(self, evt):
         self.Reposition()
 
@@ -2909,7 +2949,10 @@ class MainFrame(wx.Frame):
 
     ### Run actions ###
     def getCurrentWorkingDirectory(self):
-        path = ensureNFD(self.panel.editor.path)
+        if self.master_document != None:
+            path = ensureNFD(self.master_document)
+        else:
+            path = ensureNFD(self.panel.editor.path)
         cwd = os.path.expanduser("~")
         if os.path.isfile(path):
             try:
@@ -2950,7 +2993,11 @@ class MainFrame(wx.Frame):
         th.start()
 
     def runner(self, event):
-        text = self.panel.editor.GetTextUTF8()
+        if self.master_document != None:
+            with open(self.master_document, "r") as f:
+                text = f.read()
+        else:
+            text = self.panel.editor.GetTextUTF8()
         if text != "":
             text = self.addCwdToSysPath(text)
             with open(TEMP_FILE, "w") as f:
@@ -4727,6 +4774,7 @@ class PastingListEditorFrame(wx.Frame):
  
 TOOL_ADD_FILE_ID = 10
 TOOL_ADD_FOLDER_ID = 11
+TOOL_REFRESH_TREE_ID = 12
 class ProjectTree(wx.Panel):
     """Project panel"""
     def __init__(self, parent, mainPanel, size):
@@ -4742,6 +4790,7 @@ class ProjectTree(wx.Panel):
         file_add_bmp = catalog['file_add_icon.png'].GetBitmap()
         folder_add_bmp = catalog['folder_add_icon.png'].GetBitmap()
         close_panel_bmp = catalog['close_panel_icon.png'].GetBitmap()
+        refresh_tree_bmp = catalog['refresh_tree_icon.png'].GetBitmap()
 
         self.sizer = wx.BoxSizer(wx.VERTICAL)
 
@@ -4751,6 +4800,7 @@ class ProjectTree(wx.Panel):
         self.toolbar.AddLabelTool(TOOL_ADD_FILE_ID, "Add File", file_add_bmp, shortHelp="Add File")
         self.toolbar.EnableTool(TOOL_ADD_FILE_ID, False)
         self.toolbar.AddLabelTool(TOOL_ADD_FOLDER_ID, "Add Folder", folder_add_bmp, shortHelp="Add Folder")
+        self.toolbar.AddLabelTool(TOOL_REFRESH_TREE_ID, "Refresh Tree", refresh_tree_bmp, shortHelp="Refresh Tree")
         self.toolbar.Realize()
         toolbarbox.Add(self.toolbar, 1, wx.ALIGN_LEFT | wx.EXPAND, 0)
 
@@ -4762,6 +4812,7 @@ class ProjectTree(wx.Panel):
 
         wx.EVT_TOOL(self, TOOL_ADD_FILE_ID, self.onAdd)
         wx.EVT_TOOL(self, TOOL_ADD_FOLDER_ID, self.onAdd)
+        wx.EVT_TOOL(self, TOOL_REFRESH_TREE_ID, self.onRefresh)
         wx.EVT_TOOL(self, 15, self.onCloseProjectPanel)
 
         self.sizer.Add(toolbarbox, 0, wx.EXPAND)
@@ -4797,6 +4848,36 @@ class ProjectTree(wx.Panel):
         self.tree.Bind(wx.EVT_LEFT_DOWN, self.OnLeftClick)
         self.tree.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDClick)
 
+    def _tree_analyze(self, item, expanded_list):
+        if self.tree.ItemHasChildren(item):
+            it, cookie = self.tree.GetFirstChild(item)
+            while it.IsOk():
+                if self.tree.ItemHasChildren(it) and self.tree.IsExpanded(it):
+                    parent = self.tree.GetItemText(self.tree.GetItemParent(it))
+                    expanded_list.append((parent, self.tree.GetItemText(it)))
+                    self._tree_analyze(it, expanded_list)
+                it, cookie = self.tree.GetNextChild(item, cookie)
+
+    def _tree_restore(self, item, expanded_list):
+        if self.tree.ItemHasChildren(item):
+            it, cookie = self.tree.GetFirstChild(item)
+            while it.IsOk():
+                if self.tree.ItemHasChildren(it):
+                    parent = self.tree.GetItemText(self.tree.GetItemParent(it))
+                    if (parent, self.tree.GetItemText(it)) in expanded_list:
+                        self.tree.Expand(it)
+                    self._tree_restore(it, expanded_list)
+                it, cookie = self.tree.GetNextChild(item, cookie)
+
+    def onRefresh(self, evt):
+        expanded = []
+        self._tree_analyze(self.root, expanded)
+        self.tree.DeleteAllItems()
+        self.root = self.tree.AddRoot("EPyo_Project_tree", self.fldridx, self.fldropenidx, None)
+        for folder, path in self.projectDict.items():
+            self.loadFolder(path)
+        self._tree_restore(self.root, expanded)
+
     def loadFolder(self, dirPath):
         folderName = os.path.split(dirPath)[1]
         self.projectDict[folderName] = dirPath
@@ -4967,11 +5048,6 @@ class ProjectTree(wx.Panel):
                 filename = os.path.join(parent, filename)
             dirPath = os.path.split(self.projectDict[parent])[0]
             path = os.path.join(dirPath, filename)
-            #for root, dirs, files in os.walk(dirPath):
-            #    if files:
-            #        for file in files:
-            #            if file == self.tree.GetItemText(item):
-            #                path = os.path.join(root, file)
             self.mainPanel.addPage(path)
 
     def select(self, item):
diff --git a/utils/info.plist b/utils/info.plist
index 0abb41b..8b9e960 100644
--- a/utils/info.plist
+++ b/utils/info.plist
@@ -32,17 +32,17 @@
 	<key>CFBundleIdentifier</key>
 	<string>org.pythonmac.unspecified.E-Pyo</string>
 	<key>CFBundleInfoDictionaryVersion</key>
-	<string>0.7.4</string>
+	<string>0.7.5</string>
 	<key>CFBundleName</key>
 	<string>E-Pyo</string>
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>0.7.4</string>
+	<string>0.7.5</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>0.7.4</string>
+	<string>0.7.5</string>
 	<key>LSHasLocalizedDisplayName</key>
 	<false/>
 	<key>NSAppleScriptEnabled</key>

-- 
python-pyo packaging



More information about the pkg-multimedia-commits mailing list