[SCM] python-pyo/master: Importing 0.7.4

tiago at users.alioth.debian.org tiago at users.alioth.debian.org
Fri Jan 30 04:34:08 UTC 2015


Imported Upstream version 0.7.4
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
X-Git-Refname: refs/heads/master
X-Git-Reftype: branch
X-Git-Oldrev: 06e4ad74cb0ca8f97ef318cce4c4812af234b953
X-Git-Newrev: 6fe6ac20da1981f8773e79bc566884b940cc1f02

The following commit has been merged in the master branch:
commit eca7d6a01fa9cff1d21cf640238ec7d2e1b15bae
Merge: 06e4ad74cb0ca8f97ef318cce4c4812af234b953 6d35ddffd63e8b1287e09c3f32e1c3636ac4cef3
Author: Tiago Bortoletto Vaz <tiago at debian.org>
Date:   Thu Jan 29 22:48:39 2015 -0500

    Importing 0.7.4

diff --combined ChangeLog
index 7679d2c,1e01dd5..169decf
--- a/ChangeLog
+++ b/ChangeLog
@@@ -1,3 -1,175 +1,178 @@@
++<<<<<<< HEAD
++=======
+ 2015-01-29 belangeo <belangeo at gmail.com>
+ 
+     * Release tag: 0.7.4
+     - rev 1284
+ 
+ 2015-01-29 belangeo <belangeo at gmail.com>
+ 
+     * Added new function: floatmap, 0-1 range mapper. Fixed bug in DataTable initialization 
+     and added an automatic refresh of the DataTable grapher window.
+     - rev 1282
+ 
+ 2015-01-26 belangeo <belangeo at gmail.com>
+ 
+     * Added new objet: Particle, a full control granular synthesis generator.
+     - rev 1281
+ 
+ 2015-01-24 belangeo <belangeo at gmail.com>
+ 
+     * Added setSync method to Granule object. Allow to toggle between synchronous 
+     and asynchronous granulation. Added noteon and noteoff trigger streams to Notein 
+     object.
+ 
+     - rev 1280
+ 
+ 2014-12-15 belangeo <belangeo at gmail.com>
+ 
+     * Added reset method to CtlScan and CtlScan2 objects.
+     - rev 1279
+ 
+ 2014-12-03 belangeo <belangeo at gmail.com>
+ 
+     * Added new objet: PeakAmp, a peak amplitude follower.
+     - rev 1277
+ 
+ 2014-11-27 belangeo <belangeo at gmail.com>
+ 
+     * Added reset method to Beat and Euclide objects.
+     - rev 1275
+ 
+ -------------------------------------------------------------------------------------
+ 
+ 2014-10-17 belangeo <belangeo at gmail.com>
+ 
+     * Release tag: 0.7.3.
+     - rev 1273
+ 
+ 2014-11-15 belangeo <belangeo at gmail.com>
+ 
+     * Added new objet: Scope, an audio waveform display.
+     - rev 1270
+ 
+ 2014-11-12 belangeo <belangeo at gmail.com>
+ 
+     * E-Pyo: Fix marker's line numbering.
+     - rev 1267
+ 
+ 2014-11-08 belangeo <belangeo at gmail.com>
+ 
+     * E-Pyo: Added Save As Template... menu item.
+     - rev 1263
+ 
+ 2014-11-02 belangeo <belangeo at gmail.com>
+ 
+     * Fixed bug in Fader decreasing ramp.
+     - rev 1262
+ 
+ 2014-10-28 belangeo <belangeo at gmail.com>
+ 
+     * Added midi output methods to the Server object. noteout, afterout, ctlout, programout, pressout and bendout.
+     - rev 1261
+ 
+ 2014-10-28 belangeo <belangeo at gmail.com>
+ 
+     * Server.setMidiOutputDevice(idx) with `idx` greater than the higher portmidi devices index opens all available output devices.
+     - rev 1260
+ 
+ 2014-10-24 belangeo <belangeo at gmail.com>
+ 
+     * Added new object: FToM, converts an audio stream containning frequencies in hertz to a midi note audio stream.
+     - rev 1259
+ 
+ 2014-10-23 belangeo <belangeo at gmail.com>
+ 
+     * Added new function: hzToMidi, converts a frequency in hertz to a midi note value.
+     - rev 1258
+ 
+ -------------------------------------------------------------------------------------
+ 
+ 2014-10-17 belangeo <belangeo at gmail.com>
+ 
+     * Release tag: 0.7.2.
+     - rev 1256
+ 
+ 2014-10-16 belangeo <belangeo at gmail.com>
+ 
+     * Server.setMidiInputDevice(idx) with `idx` greater than the higher portmidi input index opens all available devices.
+     - rev 1254
+ 
+ 2014-10-16 belangeo <belangeo at gmail.com>
+ 
+     * OSX installer: Also install pyo in anaconda site-packages directory if exist.
+     - rev 1253
+ 
+ 2014-10-16 belangeo <belangeo at gmail.com>
+ 
+     * Added new object : TrigBurst, generates a time/amplitude expandable trigger pattern.
+     - rev 1252
+ 
+ 2014-10-14 belangeo <belangeo at gmail.com>
+ 
+     * Added new object : Euclide, Euclidean rhythm generator.
+     - rev 1251
+ 
+ 2014-10-13 belangeo <belangeo at gmail.com>
+ 
+     * Windows installers now check for the current python installation directory before installing files.
+     - rev 1244 - 1250
+ 
+ 2014-10-10 belangeo <belangeo at gmail.com>
+ 
+     * E-Pyo: Fixed inconsistencies in Find/Replace behaviours.
+     - rev 1241
+ 
+ 2014-10-10 belangeo <belangeo at gmail.com>
+ 
+     * Added new object : SmoothDelay, a delay line that does not produce clicks or pitch shifting when the delay time is changing.
+     - rev 1239
+ 
+ 2014-10-08 belangeo <belangeo at gmail.com>
+ 
+     * Added new object : AttackDetector, audio signal onset detection.
+     - rev 1238
+ 
+ 2014-10-07 belangeo <belangeo at gmail.com>
+ 
+     * Added new object : Centroid, Computes the spectral centroid of an input signal.
+     - rev 1237
+ 
+ -------------------------------------------------------------------------------------
+ 
+ 2014-08-29 belangeo <belangeo at gmail.com>
+ 
+     * Release tag: 0.7.1.
+     - rev 1236
+ 
+ 2014-09-12 belangeo <belangeo at gmail.com>
+ 
+     * E-Pyo: Added RadioPyo to the template choices.  
+     - rev 1234
+ 
+ 2014-09-09 belangeo <belangeo at gmail.com>
+ 
+     * Fixed Compare when used with None or a string. Print a warning and set 'comp' attribute to 0. 
+     - rev 1229
+ 
+ 2014-09-05 belangeo <belangeo at gmail.com>
+ 
+     * Fixed live interpreter of the server window when using arrow keys navigation.
+     - rev 1228
+ 
+ 2014-09-04 belangeo <belangeo at gmail.com>
+ 
+     * E-Pyo: Check if WxPython 3.0 is installed, otherwise uses 2.8.
+     - rev 1227
+ 
+ 2014-09-02 belangeo <belangeo at gmail.com>
+ 
+     * Added anti-aliasing to PyoTableObject's grapher widget. Fixed Ctrl+W on the grapher.
+     - rev 1225, 1226
+ 
+ -------------------------------------------------------------------------------------
+ 
++>>>>>>> upstream/0.7.4
  2014-08-29 belangeo <belangeo at gmail.com>
  
      * Release tag: 0.7.0.
diff --combined doc-sphinx/source/api/alphabetical.rst
index fe0a450,a67b7d7..0eb3d4a
--- a/doc-sphinx/source/api/alphabetical.rst
+++ b/doc-sphinx/source/api/alphabetical.rst
@@@ -12,6 -12,7 +12,7 @@@ Alphabetical class referenc
  - :py:class:`Allpass` :     Delay line based allpass filter.
  - :py:class:`Atan2` :     Computes the principal value of the arc tangent of b/a.
  - :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.
  - :py:class:`Balance` :     Adjust rms power of an audio signal according to the rms power of another.
  - :py:class:`BandSplit` :     Splits an input signal into multiple frequency bands.
@@@ -30,6 -31,7 +31,7 @@@
  - :py:class:`CallAfter` :     Calls a Python function after a given time.
  - :py:class:`CarToPol` :     Performs the cartesian to polar conversion.
  - :py:class:`Ceil` :     Rounds to smallest integral value greater than or equal to the input signal.
+ - :py:class:`Centroid` :     Computes the spectral centroid of an input signal.
  - :py:class:`CentsToTranspo` :     Returns the transposition factor equivalent of a given cents value.
  - :py:class:`Change` :     Sends trigger that informs when input value has changed.
  - :py:class:`ChebyTable` :     Chebyshev polynomials of the first kind.
@@@ -64,10 -66,12 +66,12 @@@
  - :py:class:`Disto` :     Arc tangent distortion.
  - :py:class:`Dummy` :     Dummy object used to perform arithmetics on PyoObject.
  - :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:`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.
  - :py:class:`Fader` :     Fadein - fadeout envelope generator.
  - :py:class:`Floor` :     Rounds to largest integral value not greater than audio signal.
  - :py:class:`Follower2` :     Envelope follower with different attack and release times.
@@@ -155,7 -159,9 +159,12 @@@
  - :py:class:`Pan` :     Cosinus panner with control on the spread factor.
  - :py:class:`ParaTable` :     Generates parabola window function. 
  - :py:class:`PartialTable` :     Inharmonic waveform generator.
++<<<<<<< HEAD
++=======
+ - :py:class:`Particle` :     A full control granular synthesis generator.
++>>>>>>> upstream/0.7.4
  - :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:`Phasor` :     A simple phase incrementor.
@@@ -191,6 -197,7 +200,7 @@@
  - :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.
  - :py:class:`Score` :     Calls functions by incrementation of a preformatted name.
  - :py:class:`Select` :     Sends trigger on matching integer values.
  - :py:class:`Selector` :     Audio selector.
@@@ -204,6 -211,7 +214,7 @@@
  - :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.
  - :py:class:`Snap` :     Snap input values on a user's defined midi scale.
  - :py:class:`SndTable` :     Transfers data from a soundfile into a function table.
  - :py:class:`Spectrum` :     Spectrum analyzer and display.
@@@ -226,6 -234,7 +237,7 @@@
  - :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:`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.
  - :py:class:`TrigEnv` :     Envelope reader generator.
  - :py:class:`TrigExpseg` :     Exponential segments trigger.
diff --combined doc-sphinx/source/api/classes/effects.rst
index 4a3ce41,25a3201..6724810
--- a/doc-sphinx/source/api/classes/effects.rst
+++ b/doc-sphinx/source/api/classes/effects.rst
@@@ -84,3 -84,9 +84,12 @@@ as distortions, delays, chorus and reve
  .. autoclass:: STRev
     :members:
  
++<<<<<<< HEAD
++=======
+ *SmoothDelay*
+ ---------------
+ 
+ .. autoclass:: SmoothDelay
+    :members:
+ 
++>>>>>>> upstream/0.7.4
diff --combined doc-sphinx/source/conf.py
index 6e6cb21,c2779e5..f34cb70
--- a/doc-sphinx/source/conf.py
+++ b/doc-sphinx/source/conf.py
@@@ -12,6 -12,7 +12,7 @@@
  # serve to show the default.
  
  import sys, os
+ from pyo import PYO_VERSION
  
  # If extensions (or modules to document with autodoc) are in another directory,
  # add these directories to sys.path here. If the directory is relative to the
@@@ -42,16 -43,16 +43,22 @@@ master_doc = 'index
  
  # General information about the project.
  project = u'Pyo'
- copyright = u'2013, Olivier Bélanger'
+ copyright = u'2014, Olivier Bélanger'
  
  # The version info for the project you're documenting, acts as replacement for
  # |version| and |release|, also used in various other places throughout the
  # built documents.
  #
  # The short X.Y version.
++<<<<<<< HEAD
 +version = '0.7.0'
 +# The full version, including alpha/beta/rc tags.
 +release = '0.7.0'
++=======
+ version = PYO_VERSION
+ # The full version, including alpha/beta/rc tags.
+ release = PYO_VERSION
++>>>>>>> upstream/0.7.4
  
  # The language for content autogenerated by Sphinx. Refer to documentation
  # for a list of supported languages.
diff --combined doc-sphinx/source/index.rst
index 81aa39c,d2de0de..ade0d94
--- a/doc-sphinx/source/index.rst
+++ b/doc-sphinx/source/index.rst
@@@ -3,7 -3,7 +3,11 @@@
     You can adapt this file completely to your liking, but it should at least
     contain the root `toctree` directive.
  
++<<<<<<< HEAD
 +Welcome to the Pyo 0.7.0 documentation
++=======
+ Welcome to the Pyo 0.7.4 documentation
++>>>>>>> upstream/0.7.4
  ===================================================
  
  .. toctree::
diff --combined include/pyomodule.h
index 3af5f9a,a8b9c71..a480cae
--- a/include/pyomodule.h
+++ b/include/pyomodule.h
@@@ -21,7 -21,7 +21,11 @@@
  #include "Python.h"
  #include <math.h>
  
++<<<<<<< HEAD
 +#define PYO_VERSION "0.7.0"
++=======
+ #define PYO_VERSION "0.7.4"
++>>>>>>> upstream/0.7.4
  
  #ifndef __MYFLT_DEF
  #define __MYFLT_DEF
@@@ -38,6 -38,8 +42,8 @@@
  #define TYPE__FII "|fii"
  #define TYPE_F_II "f|ii"
  #define TYPE__FFF "|fff"
+ #define TYPE_F_FFF "f|fff"
+ #define TYPE_O_FIFFI "O|fiffi"
  #define TYPE_O_F "O|f"
  #define TYPE_O_FO "O|fO"
  #define TYPE__OF "|Of"
@@@ -120,6 -122,8 +126,8 @@@
  #define TYPE__FII "|dii"
  #define TYPE_F_II "d|ii"
  #define TYPE__FFF "|ddd"
+ #define TYPE_F_FFF "d|ddd"
+ #define TYPE_O_FIFFI "O|diddi"
  #define TYPE_O_F "O|d"
  #define TYPE_O_FO "O|dO"
  #define TYPE__OF "|Od"
@@@ -305,6 -309,7 +313,7 @@@ extern PyTypeObject CtlScanType
  extern PyTypeObject CtlScan2Type;
  extern PyTypeObject MidiNoteType;
  extern PyTypeObject NoteinType;
+ extern PyTypeObject NoteinTrigType;
  extern PyTypeObject BendinType;
  extern PyTypeObject TouchinType;
  extern PyTypeObject PrograminType;
@@@ -398,6 -403,7 +407,7 @@@ extern PyTypeObject ScaleType
  extern PyTypeObject CentsToTranspoType;
  extern PyTypeObject TranspoToCentsType;
  extern PyTypeObject MToFType;
+ extern PyTypeObject FToMType;
  extern PyTypeObject MToTType;
  extern PyTypeObject M_SinType;
  extern PyTypeObject M_CosType;
@@@ -464,6 -470,19 +474,22 @@@ extern PyTypeObject ComplexResType
  extern PyTypeObject STReverbType;
  extern PyTypeObject STRevType;
  extern PyTypeObject Pointer2Type;
++<<<<<<< HEAD
++=======
+ extern PyTypeObject CentroidType;
+ extern PyTypeObject AttackDetectorType;
+ extern PyTypeObject SmoothDelayType;
+ extern PyTypeObject TrigBursterType;
+ extern PyTypeObject TrigBurstType;
+ extern PyTypeObject TrigBurstTapStreamType;
+ extern PyTypeObject TrigBurstAmpStreamType;
+ extern PyTypeObject TrigBurstDurStreamType;
+ extern PyTypeObject TrigBurstEndStreamType;
+ extern PyTypeObject ScopeType;
+ extern PyTypeObject PeakAmpType;
+ extern PyTypeObject MainParticleType;
+ extern PyTypeObject ParticleType;
++>>>>>>> upstream/0.7.4
  
  /* Constants */
  #define E M_E
@@@ -501,6 -520,8 +527,11 @@@
  #define FREEVERB_ID 24
  #define XNOISEDUR_ID 25
  #define URN_ID 26
++<<<<<<< HEAD
++=======
+ #define GRANULE_ID 27
+ #define MAINPARTICLE_ID 28
++>>>>>>> upstream/0.7.4
  /* Do not forget to modify Server_generateSeed function */
  
  /* object headers */
@@@ -644,13 -665,14 +675,14 @@@
          PyErr_SetString(PyExc_TypeError, "The data must be a list of floats."); \
          return PyInt_FromLong(-1); \
      } \
-     self->size = PyList_Size(arg)-1; \
+     self->size = PyList_Size(arg); \
      self->data = (MYFLT *)realloc(self->data, (self->size+1) * sizeof(MYFLT)); \
      TableStream_setSize(self->tablestream, self->size+1); \
   \
-     for (i=0; i<(self->size+1); i++) { \
+     for (i=0; i<(self->size); i++) { \
          self->data[i] = PyFloat_AS_DOUBLE(PyNumber_Float(PyList_GET_ITEM(arg, i))); \
      } \
+     self->data[self->size] = self->data[0]; \
      TableStream_setData(self->tablestream, self->data); \
   \
      Py_INCREF(Py_None); \
@@@ -732,32 -754,32 +764,61 @@@
      PyObject *samples, *tuple, *sizetmp = NULL; \
   \
      static char *kwlist[] = {"size", NULL}; \
++<<<<<<< HEAD
+  \
+     if (! PyArg_ParseTupleAndKeywords(args, kwds, "O", kwlist, &sizetmp)) \
+         return PyInt_FromLong(-1); \
+  \
+     if (sizetmp) { \
+         if (PyTuple_Check(sizetmp)) { \
+             w = PyInt_AsLong(PyTuple_GET_ITEM(sizetmp, 0)); \
+             h = PyInt_AsLong(PyTuple_GET_ITEM(sizetmp, 1)); \
+         } \
+         else if (PyList_Check(sizetmp)) { \
+             w = PyInt_AsLong(PyList_GET_ITEM(sizetmp, 0)); \
+             h = PyInt_AsLong(PyList_GET_ITEM(sizetmp, 1)); \
+         } \
+         else { \
+             w = 500; \
+             h = 200; \
+         } \
+     } \
+     else { \
+         w = 500; \
+         h = 200; \
+     } \
+     h2 = h/2; \
+     amp = h2 - 2; \
+     step = (float)self->size / (float)(w); \
+  \
++=======
 + \
 +    if (! PyArg_ParseTupleAndKeywords(args, kwds, "O", kwlist, &sizetmp)) \
 +        return PyInt_FromLong(-1); \
 + \
 +    if (sizetmp) { \
 +        if (PyTuple_Check(sizetmp)) { \
 +            w = PyInt_AsLong(PyTuple_GET_ITEM(sizetmp, 0)); \
 +            h = PyInt_AsLong(PyTuple_GET_ITEM(sizetmp, 1)); \
 +        } \
 +        else if (PyList_Check(sizetmp)) { \
 +            w = PyInt_AsLong(PyList_GET_ITEM(sizetmp, 0)); \
 +            h = PyInt_AsLong(PyList_GET_ITEM(sizetmp, 1)); \
 +        } \
 +        else { \
 +            w = 500; \
 +            h = 200; \
 +        } \
 +    } \
 +    else { \
 +        w = 500; \
 +        h = 200; \
 +    } \
 +    h2 = h/2; \
 +    amp = h2 - 2; \
 +    step = (float)self->size / (float)(w); \
 + \
++>>>>>>> upstream/0.7.4
      samples = PyList_New(w); \
      for(i=0; i<w; i++) { \
          y = self->data[(int)(i*step)] * amp + amp + 2; \
diff --combined include/servermodule.h
index 5367741,0fedc69..a9e9374
--- a/include/servermodule.h
+++ b/include/servermodule.h
@@@ -72,8 -72,10 +72,15 @@@ typedef struct 
      int jackautoout; /* jack port auto-connection (on by default) */
      PyObject *jackAutoConnectInputPorts; /* list of regex to match for jack auto-connection */
      PyObject *jackAutoConnectOutputPorts; /* list of regex to match for jack auto-connection */
++<<<<<<< HEAD
 +    PmStream *in;
 +    PmStream *out;
++=======
+     PmStream *midiin[64];
+     PmStream *midiout[64];
+     int midiin_count;
+     int midiout_count;
++>>>>>>> upstream/0.7.4
      PmEvent midiEvents[200];
      int midi_count;
      double samplingRate;
diff --combined installers/osx/PkgResources_x86_64/ReadMe.rtf
index c1b7f9a,7339a3b..f5fbe7b
--- a/installers/osx/PkgResources_x86_64/ReadMe.rtf
+++ b/installers/osx/PkgResources_x86_64/ReadMe.rtf
@@@ -1,82 -1,82 +1,163 @@@
  {\rtf1\ansi\deff3\adeflang1025
++<<<<<<< HEAD
 +{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}{\f4\froman\fprq0\fcharset1 LucidaGrande;}{\f5\froman\fprq0\fcharset1 Liberation Serif{\*\falt Times New Roman};}{\f6\fswiss\fprq0\fcharset1 Liberation Sans{\*\falt Arial};}{\f7\fnil\fprq2\fcharset0 Droid Sans Fallback;}{\f8\fnil\fprq2\fcharset0 Arial;}{\f9\fswiss\fprq0\fcharset1 FreeSans;}{\f10\fnil\fprq0\fcharset1 FreeSans;}}
 +{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
 +{\stylesheet{\s0\snext0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084 Normal;}
 +{\s15\sbasedon0\snext16\ql\nowidctlpar\sb240\sa120\keepn\ltrpar\cf1\kerning1\dbch\af7\langfe2052\dbch\af10\afs28\alang1081\loch\f6\fs28\lang3084 Heading;}
 +{\s16\sbasedon0\snext16\sl288\slmult1\ql\nowidctlpar\sb0\sa140\ltrpar\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084 Text Body;}
 +{\s17\sbasedon16\snext17\sl288\slmult1\ql\nowidctlpar\sb0\sa140\ltrpar\cf1\kerning1\dbch\af8\langfe2052\dbch\af9\afs24\alang1081\loch\f5\fs24\lang3084 List;}
 +{\s18\sbasedon0\snext18\ql\nowidctlpar\sb120\sa120\noline\ltrpar\cf1\i\kerning1\dbch\af8\langfe2052\dbch\af9\afs24\alang1081\ai\loch\f5\fs24\lang3084 Caption;}
 +{\s19\sbasedon0\snext19\ql\nowidctlpar\noline\ltrpar\cf1\kerning1\dbch\af8\langfe2052\dbch\af9\afs24\alang1081\loch\f5\fs24\lang3084 Index;}
 +}{\info{\creatim\yr0\mo0\dy0\hr0\min0}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment LibreOffice}{\vern67240962}}\deftab720
++=======
+ {\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 Liberation Serif{\*\falt Times New Roman};}{\f7\fnil\fprq2\fcharset0 FreeSans;}{\f8\fswiss\fprq0\fcharset128 FreeSans;}}
+ {\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
+ {\stylesheet{\s0\snext0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af6\langfe1081\dbch\af6\afs24\alang1081\loch\f3\fs24\lang3084 Normal;}
+ {\s15\sbasedon0\snext16\ql\nowidctlpar\sb240\sa120\keepn\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs28\loch\f4\fs28\lang3084 Heading;}
+ {\s16\sbasedon0\snext16\sl288\slmult1\ql\nowidctlpar\sb0\sa140\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af6\afs24\loch\f3\fs24\lang3084 Text Body;}
+ {\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
++>>>>>>> upstream/0.7.4
  \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
++<<<<<<< HEAD
 +\pgndec\pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\rtlch \ltrch\loch\fs26\loch\f4
 +Python-}{\rtlch \ltrch\loch\fs26\loch\f4
 +pyo (version 0.7.0)}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch\fs26\loch\f4
 +
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\rtlch \ltrch\loch\fs26\loch\f4
 +System requirements : OS X 10.6 to 10.}{\rtlch \ltrch\loch\fs26\loch\f4
 +9}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch\fs26\loch\f4
 +
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\rtlch \ltrch\loch\fs26\loch\f4
 +This package installs all the required components to run pyo inside your current Python installation. Python 2.6 or 2.7 (32/64 bit) must be already installed on your system.}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch\fs26\loch\f4
 +
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\rtlch \ltrch\loch\fs26\loch\f4
 +This package is divided into two separate installers. If you do not require one of them, please unselect the package in custom installation mode.}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\rtlch \ltrch\loch\fs26\loch\f4
 +
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\b\rtlch \ltrch\loch\fs26\loch\f4
 +1. pyo extension:}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\b0\rtlch \ltrch\loch\fs26\loch\f4
 +The following components will be installed in the site-packages folder of the current Python Framework:}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\b0\rtlch \ltrch\loch\fs26\loch\f4
 +
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\b0\rtlch \ltrch\loch\fs26\loch\f4
 +_pyo.so}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\b0\rtlch \ltrch\loch\fs26\loch\f4
 +_pyo64.so}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\b0\rtlch \ltrch\loch\fs26\loch\f4
 +pyo.py}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\b0\rtlch \ltrch\loch\fs26\loch\f4
 +pyo64.py}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\b0\rtlch \ltrch\loch\fs26\loch\f4
 +pyolib (folder)}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\b0\rtlch \ltrch\loch\fs26\loch\f4
 +
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\b\rtlch \ltrch\loch\fs26\loch\f4
 +2. Support libraries (i386 and x86_64):}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\b0\rtlch \ltrch\loch\fs26\loch\f4
 +This component will install a number of dynamic libraries on which pyo depends. If you already have these, then you can skip this installation.}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\b0\rtlch \ltrch\loch\fs26\loch\f4
 +
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\b\rtlch \ltrch\loch\fs26\loch\f4
 +Warning:}{\b0\rtlch \ltrch\loch\fs26\loch\f4
 + this installation will overwrite any previously installed libraries. These are the libraries that will be installed in your /usr/local/lib directory:}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\b0\rtlch \ltrch\loch\fs26\loch\f4
 +
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\b0\rtlch \ltrch\loch\fs26\loch\f4
 +liblo.7.dylib}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\b0\rtlch \ltrch\loch\fs26\loch\f4
 +libportaudio.2.dylib}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\b0\rtlch \ltrch\loch\fs26\loch\f4
 +libportmidi.dylib}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\b0\rtlch \ltrch\loch\fs26\loch\f4
 +libsndfile.1.dylib}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\b0\rtlch \ltrch\loch\fs26\loch\f4
 +libFLAC.8.dylib}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\b0\rtlch \ltrch\loch\fs26\loch\f4
 +libvorbisenc.2.dylib}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\b0\rtlch \ltrch\loch\fs26\loch\f4
 +libvorbis.0.dylib}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\b0\rtlch \ltrch\loch\fs26\loch\f4
 +libogg.0.dylib}
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\b0\rtlch \ltrch\loch\fs26\loch\f4
 +
 +\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang3084\ql{\b0\rtlch \ltrch\loch\fs26\loch\f4
++=======
+ {\*\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
+ )}
+ \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}
+ \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
+ This package installs all the required components to run pyo inside your current Python installation. Python 2.6 or 2.7 (32/64 bit) must be already installed on your system.}
+ \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
+ This package is divided into two separate installers. If you do not require one of them, please unselect the package in custom installation mode.}
+ \par \pard\plain \s0\ql\nowidctlpar\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\b\kerning1\dbch\af6\langfe1081\rtlch \ltrch\loch\fs26\lang3084\loch\f5
+ 1. pyo extension:}
+ \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
+ The following components will be installed in the site-packages folder of the current Python Framework:}
+ \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\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
+ _pyo.so}
+ \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
+ _pyo64.so}
+ \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
+ pyo.py}
+ \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
+ pyo64.py}
+ \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
+ pyolib (folder)}
+ \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\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b\kerning1\dbch\af6\langfe1081\rtlch \ltrch\loch\fs26\lang3084\loch\f5
+ 2. Support libraries (i386 and x86_64):}
+ \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
+ This component will install a number of dynamic libraries on which pyo depends. If you already have these, then you can skip this installation.}
+ \par \pard\plain \s0\ql\nowidctlpar\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\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720{\cf1\b\kerning1\dbch\af6\langfe1081\rtlch \ltrch\loch\fs26\lang3084\loch\f5
+ Warning:}{\cf1\b0\kerning1\dbch\af6\langfe1081\rtlch \ltrch\loch\fs26\lang3084\loch\f5
+  this installation will overwrite any previously installed libraries. These are the libraries that will be installed in your /usr/local/lib directory:}
+ \par \pard\plain \s0\ql\nowidctlpar\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\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
+ liblo.7.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
+ libportaudio.2.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
+ libportmidi.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
+ libsndfile.1.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
+ libFLAC.8.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
+ libvorbisenc.2.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
+ libvorbis.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
+ 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
++>>>>>>> upstream/0.7.4
  Olivier B\u233\'e9langer, 2014}
  \par }
diff --combined installers/osx/release_x86_64.sh
index 89e90ee,c8bcfad..dce4cb5
--- a/installers/osx/release_x86_64.sh
+++ b/installers/osx/release_x86_64.sh
@@@ -8,9 -8,9 +8,15 @@@
  # 5. install python (and wxpython) 2.7 (64-bit)
  # 6. cd installer/osx and build the realease, only x86_64 version
  
++<<<<<<< HEAD
 +export PACKAGE_NAME=pyo_0.7.0_x86_64.pkg
 +export DMG_DIR="pyo 0.7.0 Universal"
 +export DMG_NAME="pyo_0.7.0_OSX-universal.dmg"
++=======
+ 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"
++>>>>>>> upstream/0.7.4
  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 --combined installers/win/win_installer_py26.iss
index 89e4a8b,f973793..792ba48
--- a/installers/win/win_installer_py26.iss
+++ b/installers/win/win_installer_py26.iss
@@@ -1,48 -1,56 +1,90 @@@
  ; Script generated by the Inno Setup Script Wizard.
  ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
+ 
+ #define appName "pyo"
+ #define pyVer "2.6"
+ #define appVer "0.7.4"
  
  [Setup]
  ; NOTE: The value of AppId uniquely identifies this application.
  ; Do not use the same AppId value in installers for other applications.
  ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
++<<<<<<< HEAD
 +AppId={{4F72B6EF-CFA0-434F-A2B4-B130F94F54EB}
 +AppName=Pyo
 +AppVersion=0.7.0
 +AppPublisher=iACT.umontreal.ca
 +AppPublisherURL=http://code.google.com/p/pyo
 +AppSupportURL=http://code.google.com/p/pyo
 +AppUpdatesURL=http://code.google.com/p/pyo
 +DefaultDirName={sd}\Python26
 +DisableDirPage=yes
 +DefaultGroupName=pyo
 +AllowNoIcons=yes
 +InfoBeforeFile=C:\Users\olipet\svn\pyo\installers\win\\README-win32-py26.txt
 +OutputBaseFilename=pyo_0.7.0_py2.6_setup
++=======
+ AppId={{AC79C5C4-BE36-419E-B94A-98C6D0DCF4B9}
+ AppName={#appName}
+ AppVersion={#appVer}
+ AppPublisher=iACT.umontreal.ca
+ AppPublisherURL=http://code.google.com/p/pyo
+ AppSupportURL=http://code.google.com/p/pyo
+ AppUpdatesURL=http://code.google.com/p/pyo
+ DefaultDirName={code:GetDirName}
+ DisableDirPage=no
+ AlwaysShowDirOnReadyPage=yes
+ DefaultGroupName={#appName}
+ AllowNoIcons=yes
+ InfoBeforeFile=C:\Users\olipet\svn\pyo\installers\win\\README-win32-py26.txt
+ LicenseFile=C:\Users\olipet\svn\pyo\COPYING.txt
+ OutputBaseFilename={#appName}_{#appVer}_py{#pyVer}_setup
++>>>>>>> upstream/0.7.4
  Compression=lzma
  SolidCompression=yes
  ChangesAssociations=yes
  ChangesEnvironment=yes
+ DirExistsWarning=no
+ SetupIconFile=C:\Users\olipet\svn\pyo\utils\E-PyoIcon.ico
  
  [Languages]
  Name: "english"; MessagesFile: "compiler:Default.isl"
  
  ; should use PYTHONPATH variable
  [Files]
++<<<<<<< HEAD
 +Source: "C:\Python26\Lib\site-packages\pyo.py"; DestDir: "{sd}\Python26\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python26\Lib\site-packages\pyo64.py"; DestDir: "{sd}\Python26\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python26\Lib\site-packages\pyolib\*"; DestDir: "{sd}\Python26\Lib\site-packages\pyolib"; Flags: ignoreversion recursesubdirs createallsubdirs
 +Source: "C:\Python26\Lib\site-packages\_pyo.pyd"; DestDir: "{sd}\Python26\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python26\Lib\site-packages\_pyo64.pyd"; DestDir: "{sd}\Python26\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python26\Lib\site-packages\libsndfile-1.dll"; DestDir: "{sd}\Python26\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python26\Lib\site-packages\lo.dll"; DestDir: "{sd}\Python26\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python26\Lib\site-packages\portaudio.dll"; DestDir: "{sd}\Python26\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python26\Lib\site-packages\portmidi.dll"; DestDir: "{sd}\Python26\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python26\Lib\site-packages\porttime.dll"; DestDir: "{sd}\Python26\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python26\Lib\site-packages\pthreadVC2.dll"; DestDir: "{sd}\Python26\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python26\Lib\site-packages\msvcr90.dll"; DestDir: "{sd}\Python26\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\MinGW\bin\libgcc_s_dw2-1.dll"; DestDir: "{sd}\Python26\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\MinGW\bin\libstdc++-6.dll"; DestDir: "{sd}\Python26\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python26\Lib\site-packages\pyo-0.7.0-py2.6.egg-info"; DestDir: "{sd}\Python26\Lib\site-packages"; Flags: ignoreversion
++=======
+ Source: "C:\Python26\Lib\site-packages\pyo.py"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python26\Lib\site-packages\pyo64.py"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python26\Lib\site-packages\pyolib\*"; DestDir: "{app}\Lib\site-packages\pyolib"; Flags: ignoreversion recursesubdirs createallsubdirs
+ Source: "C:\Python26\Lib\site-packages\_pyo.pyd"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python26\Lib\site-packages\_pyo64.pyd"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python26\Lib\site-packages\libsndfile-1.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python26\Lib\site-packages\lo.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python26\Lib\site-packages\portaudio.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python26\Lib\site-packages\portmidi.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python26\Lib\site-packages\porttime.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python26\Lib\site-packages\pthreadVC2.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python26\Lib\site-packages\msvcr90.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\MinGW\bin\libgcc_s_dw2-1.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\MinGW\bin\libstdc++-6.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python26\Lib\site-packages\pyo-{#appVer}-py{#pyVer}.egg-info"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
++>>>>>>> upstream/0.7.4
  Source: "C:\Users\olipet\svn\pyo\examples\*"; DestDir: "{userdesktop}\pyo_examples\"; Flags: ignoreversion recursesubdirs createallsubdirs
  Source: "C:\Users\olipet\svn\pyo\installers\win\README-win32-py26.txt"; DestDir: "{userdesktop}"; Flags: ignoreversion
  ; NOTE: Don't use "Flags: ignoreversion" on any shared system files
@@@ -67,9 -75,12 +109,12 @@@ Type: filesandordirs; Name: "{userdocs}
  ;;;;;;;;;;;;;
  
  [Registry]
- Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; ValueName: "Path"; ValueData: "C:\Python26;{olddata}"; Check: NeedsAddPath('C:\Python26')
+ Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; ValueName: "Path"; ValueData: "C:\Python26;{olddata}"; Check: NeedsAddPath('{app}')
  
  [Code]
+ procedure ExitProcess(exitCode:integer);
+   external 'ExitProcess at kernel32.dll stdcall';
+ 
  function NeedsAddPath(Param: string): boolean;
  var
    OrigPath: string;
@@@ -86,6 -97,37 +131,37 @@@ begi
    Result := Pos(';' + Param + ';', ';' + OrigPath + ';') = 0;
  end;
  
- 
+ function GetDirName(Value: string): string;
+ var          
+   InstallPath: string;
+   reg1 : string;
+   reg2 : string;
+   reg3 : string;
+   reg4 : string;
+ begin
+   reg1 := 'SOFTWARE\Python\PythonCore\' + '{#PyVer}' + '\InstallPath';
+   reg2 := 'SOFTWARE\Wow6432Node\Python\PythonCore\' + '{#PyVer}' + '\InstallPath';
+   reg3 := 'Software\Python\PythonCore\' + '{#PyVer}' + '\InstallPath';
+   reg4 := 'Software\Wow6432Node\Python\PythonCore\' + '{#PyVer}' + '\InstallPath';
+   if RegQueryStringValue(HKLM, reg1, '', InstallPath) then
+     BEGIN
+     Result := InstallPath;
+   END else
+   if RegQueryStringValue(HKCU, reg3, '', InstallPath) then
+     BEGIN
+     Result := InstallPath;
+   END else
+   if RegQueryStringValue(HKLM, reg2, '', InstallPath) then
+     BEGIN
+     Result := InstallPath;
+   END else
+   if RegQueryStringValue(HKCU, reg4, '', InstallPath) then
+     BEGIN
+     Result := InstallPath;
+   END else
+     BEGIN
+     Result := 'C:\Python26';
+    END
+ end;
  
  
diff --combined installers/win/win_installer_py27.iss
index d7a0f83,5935569..722cb41
--- a/installers/win/win_installer_py27.iss
+++ b/installers/win/win_installer_py27.iss
@@@ -1,52 -1,56 +1,90 @@@
  ; Script generated by the Inno Setup Script Wizard.
  ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
+ 
+ #define appName "pyo"
+ #define pyVer "2.7"
+ #define appVer "0.7.4"
  
  [Setup]
  ; NOTE: The value of AppId uniquely identifies this application.
  ; Do not use the same AppId value in installers for other applications.
  ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
++<<<<<<< HEAD
 +AppId={{244D309A-C251-481A-AD24-0602D392A634}
 +AppName=Pyo
 +AppVersion=0.7.0
++=======
+ AppId={{59447873-F994-4BC7-8B1D-0DDCA5B6AFFD}
+ AppName={#appName}
+ AppVersion={#appVer}
++>>>>>>> upstream/0.7.4
  AppPublisher=iACT.umontreal.ca
  AppPublisherURL=http://code.google.com/p/pyo
  AppSupportURL=http://code.google.com/p/pyo
  AppUpdatesURL=http://code.google.com/p/pyo
- DefaultDirName={sd}\Python27
- DisableDirPage=yes
- DefaultGroupName=pyo
+ DefaultDirName={code:GetDirName}
+ DisableDirPage=no
+ AlwaysShowDirOnReadyPage=yes
+ DefaultGroupName={#appName}
  AllowNoIcons=yes
++<<<<<<< HEAD
 +InfoBeforeFile=C:\Users\olipet\svn\pyo\installers\win\\README-win32-py27.txt
 +OutputBaseFilename=pyo_0.7.0_py2.7_setup
++=======
+ InfoBeforeFile=C:\Users\olipet\svn\pyo\installers\win\\README-win32-py27.txt
+ LicenseFile=C:\Users\olipet\svn\pyo\COPYING.txt
+ OutputBaseFilename={#appName}_{#appVer}_py{#pyVer}_setup
++>>>>>>> upstream/0.7.4
  Compression=lzma
  SolidCompression=yes
  ChangesAssociations=yes
- ChangesEnvironment=yes
+ ChangesEnvironment=yes
+ DirExistsWarning=no
+ SetupIconFile=C:\Users\olipet\svn\pyo\utils\E-PyoIcon.ico
  
  [Languages]
  Name: "english"; MessagesFile: "compiler:Default.isl"
  
 +; One installer for both python version
 +; functions to set which python directory in Setup section
 +; Check: DirExists(ExpandConstant('{sd}\Python27')) 
  [Files]
++<<<<<<< HEAD
 +Source: "C:\Python27\Lib\site-packages\pyo.py"; DestDir: "{sd}\Python27\Lib\site-packages"; Flags: ignoreversion 
 +Source: "C:\Python27\Lib\site-packages\pyo64.py"; DestDir: "{sd}\Python27\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python27\Lib\site-packages\pyolib\*"; DestDir: "{sd}\Python27\Lib\site-packages\pyolib"; Flags: ignoreversion recursesubdirs createallsubdirs
 +Source: "C:\Python27\Lib\site-packages\_pyo.pyd"; DestDir: "{sd}\Python27\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python27\Lib\site-packages\_pyo64.pyd"; DestDir: "{sd}\Python27\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python27\Lib\site-packages\libsndfile-1.dll"; DestDir: "{sd}\Python27\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python27\Lib\site-packages\lo.dll"; DestDir: "{sd}\Python27\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python27\Lib\site-packages\portaudio.dll"; DestDir: "{sd}\Python27\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python27\Lib\site-packages\portmidi.dll"; DestDir: "{sd}\Python27\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python27\Lib\site-packages\porttime.dll"; DestDir: "{sd}\Python27\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python27\Lib\site-packages\pthreadVC2.dll"; DestDir: "{sd}\Python27\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python27\Lib\site-packages\msvcr90.dll"; DestDir: "{sd}\Python27\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\MinGW\bin\libgcc_s_dw2-1.dll"; DestDir: "{sd}\Python27\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\MinGW\bin\libstdc++-6.dll"; DestDir: "{sd}\Python27\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Python27\Lib\site-packages\pyo-0.7.0-py2.7.egg-info"; DestDir: "{sd}\Python27\Lib\site-packages"; Flags: ignoreversion
 +Source: "C:\Users\olipet\svn\pyo\examples\*"; DestDir: "{userdesktop}\pyo_examples\"; Flags: ignoreversion recursesubdirs createallsubdirs
 +Source: "C:\Users\olipet\svn\pyo\installers\win\README-win32-py27.txt"; DestDir: "{userdesktop}"; Flags: ignoreversion
++=======
+ Source: "C:\Python27\Lib\site-packages\pyo.py"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion 
+ Source: "C:\Python27\Lib\site-packages\pyo64.py"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python27\Lib\site-packages\pyolib\*"; DestDir: "{app}\Lib\site-packages\pyolib"; Flags: ignoreversion recursesubdirs createallsubdirs
+ Source: "C:\Python27\Lib\site-packages\_pyo.pyd"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python27\Lib\site-packages\_pyo64.pyd"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python27\Lib\site-packages\libsndfile-1.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python27\Lib\site-packages\lo.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python27\Lib\site-packages\portaudio.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python27\Lib\site-packages\portmidi.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python27\Lib\site-packages\porttime.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python27\Lib\site-packages\pthreadVC2.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python27\Lib\site-packages\msvcr90.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\MinGW\bin\libgcc_s_dw2-1.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\MinGW\bin\libstdc++-6.dll"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Python27\Lib\site-packages\pyo-{#appVer}-py{#pyVer}.egg-info"; DestDir: "{app}\Lib\site-packages"; Flags: ignoreversion
+ Source: "C:\Users\olipet\svn\pyo\examples\*"; DestDir: "{userdesktop}\pyo_examples\"; Flags: ignoreversion recursesubdirs createallsubdirs
++>>>>>>> upstream/0.7.4
  ; NOTE: Don't use "Flags: ignoreversion" on any shared system files
  
  ; E-Pyo stuff
@@@ -69,9 -73,12 +107,12 @@@ Type: filesandordirs; Name: "{userdocs}
  ;;;;;;;;;;;;;
  
  [Registry]
- Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; ValueName: "Path"; ValueData: "C:\Python27;{olddata}"; Check: NeedsAddPath('C:\Python27')
+ Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; ValueName: "Path"; ValueData: "{app};{olddata}"; Check: NeedsAddPath('{app}')
  
  [Code]
+ procedure ExitProcess(exitCode:integer);
+   external 'ExitProcess at kernel32.dll stdcall';
+ 
  function NeedsAddPath(Param: string): boolean;
  var
    OrigPath: string;
@@@ -87,3 -94,36 +128,36 @@@ begi
    // Pos() returns 0 if not found
    Result := Pos(';' + Param + ';', ';' + OrigPath + ';') = 0;
  end;
+ 
+ function GetDirName(Value: string): string;
+ var          
+   InstallPath: string;
+   reg1 : string;
+   reg2 : string;
+   reg3 : string;
+   reg4 : string;
+ begin
+   reg1 := 'SOFTWARE\Python\PythonCore\' + '{#PyVer}' + '\InstallPath';
+   reg2 := 'SOFTWARE\Wow6432Node\Python\PythonCore\' + '{#PyVer}' + '\InstallPath';
+   reg3 := 'Software\Python\PythonCore\' + '{#PyVer}' + '\InstallPath';
+   reg4 := 'Software\Wow6432Node\Python\PythonCore\' + '{#PyVer}' + '\InstallPath';
+   if RegQueryStringValue(HKLM, reg1, '', InstallPath) then
+     BEGIN
+     Result := InstallPath;
+   END else
+   if RegQueryStringValue(HKCU, reg3, '', InstallPath) then
+     BEGIN
+     Result := InstallPath;
+   END else
+   if RegQueryStringValue(HKLM, reg2, '', InstallPath) then
+     BEGIN
+     Result := InstallPath;
+   END else
+   if RegQueryStringValue(HKCU, reg4, '', InstallPath) then
+     BEGIN
+     Result := InstallPath;
+   END else
+     BEGIN
+     Result := 'C:\Python27';
+    END
+ end;
diff --combined pyo.py
index 0364e96,02421c5..bd9e4f4
--- a/pyo.py
+++ b/pyo.py
@@@ -314,23 -314,23 +314,31 @@@ class PartialTable(PyoTableObject)
  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', 'sampsToSec', 'secToSamps', 'example', 'class_args', 
+                                     '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',
++<<<<<<< HEAD
 +                                    'pa_get_version_text']),
++=======
+                                     'pa_get_version_text', 'floatmap']),
++>>>>>>> upstream/0.7.4
                  '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']),
+                     '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']),
++<<<<<<< HEAD
 +                                  'effects': sorted(['Delay', 'SDelay', 'Disto', 'Freeverb', 'Waveguide', 'Convolve', 'WGVerb', 
++=======
+                                   'effects': sorted(['Delay', 'SDelay', 'Disto', 'Freeverb', 'Waveguide', 'Convolve', 'WGVerb', 'SmoothDelay',
++>>>>>>> upstream/0.7.4
                                                       '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',
@@@ -345,16 -345,16 +353,25 @@@
                                    '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',
++<<<<<<< HEAD
 +                                                        'TableRead', 'TableMorph', 'Looper', 'TableIndex', 'OscBank', 'OscTrig', 'TablePut', 'TableScale']),
++=======
+                                                         'TableRead', 'TableMorph', 'Looper', 'TableIndex', 'OscBank', 'OscTrig', 'TablePut', 'TableScale', 'Particle']),
++>>>>>>> upstream/0.7.4
                                    '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']),
+                                                     'TrigVal', 'Euclide', 'TrigBurst']),
                                    'utils': sorted(['Clean_objects', 'Print', 'Snap', 'Interp', 'SampHold', 'Compare', 'Record', 'Between', 'Denorm',
                                                      'ControlRec', 'ControlRead', 'NoteinRec', 'NoteinRead', 'DBToA', 'AToDB', 'Scale', 'CentsToTranspo',
++<<<<<<< HEAD
 +                                                    'TranspoToCents', 'MToF', 'MToT', 'TrackHold']),
 +                                  'fourier': sorted(['FFT', 'IFFT', 'CarToPol', 'PolToCar', 'FrameDelta', 'FrameAccum', 'Vectral', 'CvlVerb', 'Spectrum'])}},
++=======
+                                                     'TranspoToCents', 'MToF', 'FToM', 'MToT', 'TrackHold']),
+                                   'fourier': sorted(['FFT', 'IFFT', 'CarToPol', 'PolToCar', 'FrameDelta', 'FrameAccum', 'Vectral', 'CvlVerb'])}},
++>>>>>>> upstream/0.7.4
          'Map': {'SLMap': sorted(['SLMapFreq', 'SLMapMul', 'SLMapPhase', 'SLMapQ', 'SLMapDur', 'SLMapPan'])},
          'Server': [], 
          'Stream': [], 
diff --combined pyolib/_widgets.py
index 71d6166,40bded2..0902617
--- a/pyolib/_widgets.py
+++ b/pyolib/_widgets.py
@@@ -15,12 -15,11 +15,12 @@@ but WITHOUT ANY WARRANTY; without even 
  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 Licensehack for OSX display
+ You should have received a copy of the GNU 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
 +import __builtin__
  
  try:
      from PIL import Image, ImageDraw, ImageTk
@@@ -29,18 -28,18 +29,24 @@@ except
      WITH_PIL = False
  
  try:
-     import wxversion
-     if (wxversion.checkInstalled("2.8")):
-         wxversion.ensureMinimal("2.8")
+     try:
+         import wxversion
+         if (wxversion.checkInstalled("2.8")):
+             wxversion.ensureMinimal("2.8")
+     except:
+         pass
      import wx
      from _wxwidgets import *
      PYO_USE_WX = True
  except:
      PYO_USE_WX = False
  
++<<<<<<< HEAD
 +if hasattr(__builtin__, 'EPYO_APP_OPENED'):
 +    PYO_USE_WX = True
 +
++=======
++>>>>>>> upstream/0.7.4
  PYO_USE_TK = False
  if not PYO_USE_WX:
      try:
@@@ -72,6 -71,7 +78,10 @@@ TABLEWINDOWS = [
  SNDTABLEWINDOWS = []
  MATRIXWINDOWS = []
  SPECTRUMWINDOWS = []
++<<<<<<< HEAD
++=======
+ SCOPEWINDOWS = []
++>>>>>>> upstream/0.7.4
  WX_APP = False
  
  def createRootWindow():
@@@ -149,6 -149,7 +159,7 @@@ def wxCreateDelayedGraphWindows()
  def wxCreateDelayedDataGraphWindows():
      for win in DATAGRAPHWINDOWS:
          f = DataTableGrapher(None, win[0], win[1])
+         win[0]._setGraphFrame(f)
          if win[2] == None: title = win[0].__class__.__name__
          else: title = win[2]
          wxDisplayWindow(f, title)
@@@ -187,6 -188,15 +198,15 @@@ def wxCreateDelayedSpectrumWindows()
          if win[0] != None:
              win[0]._setViewFrame(f)
          wxDisplayWindow(f, title)
+ 
+ def wxCreateDelayedScopeWindows():
+     for win in SCOPEWINDOWS:
+         f = ScopeDisplay(None, win[0])
+         if win[1] == None: title = win[0].__class__.__name__
+         else: title = win[1]
+         if win[0] != None:
+             win[0]._setViewFrame(f)
+         wxDisplayWindow(f, title)
      
  def createCtrlWindow(obj, map_list, title, wxnoserver=False):
      if not PYO_USE_WX:
@@@ -226,6 -236,7 +246,7 @@@ def createDataGraphWindow(obj, yrange, 
              f = DataTableGrapher(None, obj, yrange)
              if title == None: title = obj.__class__.__name__
              wxShowWindow(f, title, root)
+             obj._setGraphFrame(f)
          else:
              DATAGRAPHWINDOWS.append([obj, yrange, title])   
          
@@@ -299,6 -310,20 +320,20 @@@ def createSpectrumWindow(object, title
                  object._setViewFrame(f)
          else:
              SPECTRUMWINDOWS.append([object, title])   
+ 
+ def createScopeWindow(object, title, wxnoserver=False):
+     if not PYO_USE_WX:
+         print "WxPython must be installed to use the Scope display."
+     else:
+         if wxnoserver or WX_APP:
+             root = createRootWindow()
+             f = ScopeDisplay(None, object)
+             if title == None: title = object.__class__.__name__
+             wxShowWindow(f, title, root)
+             if object != None:
+                 object._setViewFrame(f)
+         else:
+             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
@@@ -326,6 -351,7 +361,7 @@@
          wx.CallAfter(wxCreateDelayedMatrixWindows)
          wx.CallAfter(wxCreateDelayedCtrlWindows)
          wx.CallAfter(wxCreateDelayedSpectrumWindows)
+         wx.CallAfter(wxCreateDelayedScopeWindows)
          wx.CallAfter(f.Raise)
      return f, win
-         
+         
diff --combined pyolib/_wxwidgets.py
index 21c0849,9fed692..17c220f
--- a/pyolib/_wxwidgets.py
+++ b/pyolib/_wxwidgets.py
@@@ -19,7 -19,6 +19,6 @@@ along with pyo.  If not, see <http://ww
  
  import wx, os, sys, math, time, random
  from types import ListType, FloatType, IntType
- from wx.lib.embeddedimage import PyEmbeddedImage
  
  try:
      from PIL import Image, ImageDraw, ImageTk
@@@ -28,93 -27,6 +27,6 @@@ except
      
  BACKGROUND_COLOUR = "#EBEBEB"
  
- vu_metre = PyEmbeddedImage(
-     "iVBORw0KGgoAAAANSUhEUgAAAMgAAAAFCAIAAACPTDSjAAAAAXNSR0IArs4c6QAAACF0RVh0"
-     "U29mdHdhcmUAR3JhcGhpY0NvbnZlcnRlciAoSW50ZWwpd4f6GQAAAMJJREFUeJxiYBgFo4BG"
-     "wHWbO1bEKc6JS4pXiddxtTNWKTFLMYspVlilpFyk9WsNsUopR6toF+lglVJP0wDKYpUCmiYX"
-     "II9VyqTTFOgSrFI28+0E9YSwSgE9hcfXLNwsZEgBDcQVVkBnAB2DKxi7qg13LHHERIEeMvWF"
-     "ulilYoIUM2JUsUoVp2vGKyjsdbDHRH0G+u4SElilZpkYW4uIYJXaaGNtwMDwHxsaTVijCWs0"
-     "YY0mrNGENZqwRhMWAAAA//8DAHGDnlocOW36AAAAAElFTkSuQmCC")
- 
- vu_metre_dark = PyEmbeddedImage(
-     "iVBORw0KGgoAAAANSUhEUgAAAMgAAAAFCAYAAAAALqP0AAAAAXNSR0IArs4c6QAAAAlwSFlz"
-     "AAALEgAACxIB0t1+/AAADst0RVh0Q29tbWVudABwclZXIGNodW5rbGVuIDMwMiBpZ25vcmVk"
-     "Og1BU0NJSTogeJzt0U1WwjAuwPHpLohUKS5tibG3yM4ude11ei4u4OtdvIE4ky76cOVz+/9l"
-     "LuYjaS68f759yKu8nMys6zTPc8rm9Exq1C6nLicuS7UwcS5ljHGMMopEyyQu0S5FJGUuLi4u"
-     "Li5Xdb2pd/cuu1pj899y+6ixrTV+lufcktvvLl7p1ut+8C7r9efnUut2Kb/PhOshu5vK9I5l"
-     "LtrQtiG0wdmmq3IuT7ffLp1vOt9rLnvfaVjprfSNdo69jvy+P5fPjZbDfunZuSYNSEVYOiA3"
-     "ODlDRUREMTRENTZDMjMwMTBDMEYxRTkwNzg4NTQyOTBENkQ4OUIxQjdDOENFMDM3NUVENzU3"
-     "QTE5MEZFMEVCNURCQzgxMzg5MzAyRkE3MEU1NzNGQkZGNjUxQUU2MjM2OTE3QkM3RkJFN0RD"
-     "OEFCQkM5Q0NDQUNFQjM0Q0Y3M0NBRTZGNDRDNkFENDE4QTcxODI3MTE0QkI1MzA3MTFDNjU4"
-     "QzcxOEMzMjhBNDRDQjI0MUFEMTE1NDUyNDY1MDAwMDAwMDAwMA1ta0JGIGNodW5rbGVuIDcy"
-     "IGlnbm9yZWQ6DUFTQ0lJOiD63sr+Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u"
-     "Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4NSEVYOiBGQURFQ0FGRTAwMDAw"
-     "MDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw"
-     "MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw"
-     "MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDANbWtUUyBjaHVua2xlbiA4ODg2IGlnbm9yZWQ6DUFT"
-     "Q0lJOiB4nO1dWXPbSJLG9ozbLd/unph92C5FbGzsU2twLnwuRVHSWC6HpHy9OHjB1rSPLllW"
-     "t5fB/76ZWVUgUCiAOChSni6rW0WiUC6+zPwqqyouOnnWup51ensuM2ve+8cpJKHfLobj+cvj"
-     "vXBmzl+x5MVRO5zZtjk/PC6EM2/e2++Hs4Y97/XPLyC7dS4uhPRv3j0+vp61uvBrb3fweWZs"
-     "LiNjbLwxusbU+C6fLoz386PTLsi5LjkuIccyfobcLuN3uOP9vNc+LmGVuw1IRVg6IDc4OUNF"
-     "RDVENTk3M0RCNDg5MkM2RjY4Q0RCMkRERkVFOUU5ODdERDgxNzQ1NkM2Q0VDNTM2QjcwMTM3"
-     "QzE0NDU1MUQyNTgwNzg3QTQ3Q0JEMzg3OEMxRDZCNDhGMUU1OTU2Qjc5N0MxRkZCRTk5NTk1"
-     "NTIwNTAyODgwMzgyODUyOUUyRUFCNUI0NUEyNTAwN0JFQ0NGQzJBQUIyQTBCM0E3OUQ2QkE5"
-     "RTc1N0E3QjE3MzM2QkRFRkJDNzI5MjRBMURGMDg4NkUzDW1rQlMgY2h1bmtsZW4gMTkwIGln"
-     "bm9yZWQ6DUFTQ0lJOiB4nF1Oyy6CMC7szd/wLi6DwFHKq2GrLmoub2hswlWTJmaz/27Lw4Nz"
-     "mcnMzmZknS4sLj6iTy5wjS71M11FpjEu91QupdGPLmryVqPj9jLag7S0Lb2AoC6DcOgupnV5"
-     "t/GlLkdwlG9kLi5sYC72ZC+2ZT7Jdi452C7PXZPXzshBLi6y/C7dqZg2zfS38NzZ2Z5HlS7D"
-     "g1R7LjH2SC77UYlsxEgnOopp0YOOnqvexY9w1WEuJ0SZOi6kLl+6Ll+mDUhFWDogNzg5QzVE"
-     "NEVDQjBFODIzMDEwRUNDRERGRjAxMzAwODNDMDUxQ0FBQjYxQUIwNjZBMDQ2RjY4NkNDMjU1"
-     "OTMyNjY2QjNGRjZFQ0JDMzgzNzM5OUM5Q0NDRTY2NjQ5RDFBMkMxQTNFQTI0RjFENzA4RDFF"
-     "RjUzMzVENDVBNjMxMDhGNzU0MDlBNUQxOEYwMjZBRjI1NkEzRTNGNjMyREE4M0I0QjQyREJE"
-     "ODBBMDA3ODM3MEU4MERBNjc1NzlCN0YxQTUwMTQ3NzANbWtCVCBjaHVua2xlbiAxMTQ1IGln"
-     "bm9yZWQ6DUFTQ0lJOiD6zsr+Ln84xS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u"
-     "Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ueJztmolt6zAuLl1ILkkhKSSN"
-     "pJAukkZSiD82+GM8bEjZsWT4mi4udJDisctDIrXfK6WUUkoppZRSSv3X9/f3/uvra0qF34Oy"
-     "LpdM+y7pX1NVn91uN+Xz83P/+vr6c37LdacuVdYtVb5/eXk52GPr9K+t9P/7+/svSnWseg1I"
-     "RVg6IEZBQ0VDQUZFMDA3RjM4QzUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw"
-     "MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw"
-     "MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzg5Q0VE"
-     "OUE4OTZERUIzMDEwMDU1RDQ4MUE0OTIxMjkyNDhEQTQ5MDE0OTI0NjUyDW1rQlQgY2h1bmts"
-     "ZW4gMzM5IGlnbm9yZWQ6DUFTQ0lJOiD6zsr+Ln9ViS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u"
-     "Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ueJzt1uFpg2Au"
-     "hlEucS4ucS4ucS4ucS4usbyBLremIf+KLueBQ5tP++tNbM5TkiRJkiRJkiRJkiRJkiRJkiRJ"
-     "LtFxLue+70/nOcu1d/e/uk/3b13Xcy7Hc5qmx8/sLv0s99S9dS7LsjxexzAuf76HdO+yY5V9"
-     "s2F2rc37PQ1IRVg6IEZBQ0VDQUZFMDA3RjU1ODkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw"
-     "MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw"
-     "MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw"
-     "MDAwNzg5Q0VERDZFMTY5ODM2MDE0ODY1MTA3NzExMTA3NzExMDE3NzExMDA3NzExMTA3DW1r"
-     "QlQgY2h1bmtsZW4gMzc5OSBpZ25vcmVkOg1BU0NJSTog+s7K/i5/n3guLi4uLi4uLi4uLi4u"
-     "Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u"
-     "Lnic7Z2NkS4pLoUuiC5xIC7EiTguLuJELshe6eo+17tnSUDPz/5Yr2pqZ7tpLi4u0IOel5fB"
-     "YDAuLi6DwWAwLi4ug8HgP/z69evl58+ff3ziOveq5+JzpawuZfj3wf9R6fmK/jN8//795dOn"
-     "T3984jr3Mnz58uXfzy6+ffsNSEVYOiBGQUNFQ0FGRTAwN0Y5Rjc4MDAwMDAwMDAwMDAwMDAw"
-     "MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw"
-     "MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw"
-     "MDAwMDAwMDAwMDAwMDc4OUNFRDlEOEQ5MTFDMjkwQzg1MUQ4ODEzNzEyMDBFQzQ4OTM4MTAw"
-     "N0UyNDQxQw1ta0JUIGNodW5rbGVuIDI3NDEgaWdub3JlZDoNQVNDSUk6IPrOyv4uf69+Li4u"
-     "Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u"
-     "Li4uLi4uLi4uLi54nO2djZHbOC5GU0guSSEpJI2kkC6SRlJIbpCbd/PuLkjJWa8u23gzntXq"
-     "h6QuLqIukPr5cy6GYS6GYS6GYS6GYXhJvn///tvvx48u/y67J1WOe5fh2fnw4cNvv69fv/6q"
-     "99q+Z/1XOaouw/uBvM/i9vCW/rm7to7Vbyd/DUhFWDogRkFDRUNBRkUwMDdGQUY3RTAwMDAw"
-     "MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw"
-     "MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw"
-     "MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3ODlDRUQ5RDhEOTFEQjM4MEM0NjUzNDgxQTQ5MjEy"
-     "OTI0OERBNDkwMTQ5MjQ2NTINbWtCVCBjaHVua2xlbiAxMDc3NSBpZ25vcmVkOg1BU0NJSTog"
-     "+s7K/i5/1PAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u"
-     "Li4uLi4uLi4uLi4uLi4uLi4uLi4uLnic7X0ruOwo1vaSSCwuicQikUgkLi6JxCIjkVgkLi6J"
-     "jYyMjI0smX9R+5zunp7p+dT/1Ihac+k+VXvXLrAu77suVObnfTaeLtqzkS3G10Zgh6PDLnBd"
-     "xS5rLt+FfsPzYi7ggS4uLrYuLtCeJMF33ZPZsYTB8c18c/zxQ28NSEVYOiBGQUNFQ0FGRTAw"
-     "N0ZENEYwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw"
-     "MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw"
-     "MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc4OUNFRDdEMkJCOEVDMjhENkY2"
-     "OTI0ODJDMTI4OUM0MjI5MTQ4MjQxNjE5ODlDNIWzHPoAAAAhdEVYdFNvZnR3YXJlAEdyYXBo"
-     "aWNDb252ZXJ0ZXIgKEludGVsKXeH+hkAAADWSURBVHic7JO7CsJAEEVH95UHpFBEhBUTJIpB"
-     "I0GFFDYRBNHSxr/Zn/B/R9c+Ewvt5sLtDswwwwHgcDh06muAVE3Y62TipA+HM80MxgLKoyGZ"
-     "kRWw3GmSsbmEealIJi2Ue3Mk4+dMUukopqj1Z2+KqRqDybBPMv4239xRqt8wflbXP/zOfveu"
-     "n9VVgLcmam1mJew3hmQWmXJFrklmu9K41to94hjbegoCzKQEirmEIVohSOYeRWiVhud0hm1l"
-     "QVgQFoQFYUFYEBaEBWFB/iLICwAA//8DAHqeTXUOgGpTAAAAAElFTkSuQmCC")
- 
  def interpFloat(t, v1, v2):
      "interpolator for a single value; interprets t in [0-1] between v1 and v2"
      return (v2-v1)*t + v1
@@@ -160,8 -72,12 +72,12 @@@ 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, outFunction=None, integer=False, powoftwo=False, backColour=None):
-         wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY, pos=pos, size=size, style=wx.NO_BORDER | wx.WANTS_CHARS | wx.EXPAND)
+     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, 
+                             style=wx.NO_BORDER | wx.WANTS_CHARS | wx.EXPAND)
          self.parent = parent
          if backColour: 
              self.backgroundColour = backColour
@@@ -169,10 -85,16 +85,16 @@@
              self.backgroundColour = BACKGROUND_COLOUR
          self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)  
          self.SetBackgroundColour(self.backgroundColour)
-         self.SetMinSize(self.GetSize())
-         self.knobSize = 40
-         self.knobHalfSize = 20
-         self.sliderHeight = size[1] - 5
+         self.orient = orient
+         # self.SetMinSize(self.GetSize())
+         if self.orient == wx.VERTICAL:
+             self.knobSize = 17
+             self.knobHalfSize = 8
+             self.sliderWidth = size[0] - 29
+         else:
+             self.knobSize = 40
+             self.knobHalfSize = 20
+             self.sliderHeight = size[1] - 5
          self.outFunction = outFunction
          self.integer = integer
          self.log = log
@@@ -202,8 -124,11 +124,11 @@@
          self.Bind(wx.EVT_SIZE, self.OnResize)
          self.Bind(wx.EVT_KEY_DOWN, self.keyDown)
          self.Bind(wx.EVT_KILL_FOCUS, self.LooseFocus)
-         self.createSliderBitmap()
-         self.createKnobBitmap()
+ 
+         if sys.platform == "win32":
+             self.dcref = wx.BufferedPaintDC
+         else:
+             self.dcref = wx.PaintDC
  
      def setMidiCtl(self, x, propagate=True):
          self.propagate = propagate
@@@ -229,39 -154,10 +154,42 @@@
          
      def setSliderHeight(self, height):
          self.sliderHeight = height
-         self.createSliderBitmap()
-         self.createKnobBitmap()
          self.Refresh()
  
++<<<<<<< HEAD
 +    def createSliderBitmap(self):
 +        w, h = self.GetSize()
 +        b = wx.EmptyBitmap(w,h)
 +        dc = wx.MemoryDC(b)
 +        gc = wx.GraphicsContext_Create(dc)
 +        dc.SetPen(wx.Pen(self.backgroundColour, width=1))
 +        dc.SetBrush(wx.Brush(self.backgroundColour))
 +        dc.DrawRectangle(0,0,w,h)
 +        gc.SetBrush(wx.Brush("#999999"))
 +        gc.SetPen(wx.Pen(self.backgroundColour, width=1))
 +        h2 = self.sliderHeight / 4
 +        gc.DrawRoundedRectangle(0,h2,w,self.sliderHeight,2)
 +        dc.SelectObject(wx.NullBitmap)
 +        b.SetMaskColour("#999999")
 +        self.sliderMask = b
 +
 +    def createKnobBitmap(self):
 +        w, h = self.knobSize, self.GetSize()[1]
 +        b = wx.EmptyBitmap(w,h)
 +        dc = wx.MemoryDC(b)
 +        gc = wx.GraphicsContext_Create(dc)
 +        dc.SetPen(wx.Pen(self.backgroundColour, width=1))
 +        dc.SetBrush(wx.Brush(self.backgroundColour))
 +        dc.DrawRectangle(0, 0, w, h)
 +        gc.SetBrush(wx.Brush("#999999"))
 +        gc.DrawRoundedRectangle(0,0,w,h,3)
 +        dc.SelectObject(wx.NullBitmap)
 +        b.SetMaskColour("#999999")
 +        self.knobMask = b
++=======
+     def setSliderWidth(self, width):
+         self.sliderWidth = width
++>>>>>>> upstream/0.7.4
  
      def getInit(self):
          return self.init
@@@ -274,7 -170,11 +202,11 @@@
          return [self.minvalue, self.maxvalue]
  
      def scale(self):
-         inter = tFromValue(self.pos, self.knobHalfSize, self.GetSize()[0]-self.knobHalfSize)
+         if self.orient == wx.VERTICAL:
+             h = self.GetSize()[1]
+             inter = tFromValue(h-self.pos, self.knobHalfSize, self.GetSize()[1]-self.knobHalfSize)
+         else:
+             inter = tFromValue(self.pos, self.knobHalfSize, self.GetSize()[0]-self.knobHalfSize)
          if not self.integer:
              return interpFloat(inter, self.minvalue, self.maxvalue)
          elif self.powoftwo:
@@@ -346,7 -246,10 +278,10 @@@
              return
          if self._enable:
              size = self.GetSize()
-             self.pos = clamp(evt.GetPosition()[0], self.knobHalfSize, size[0]-self.knobHalfSize)
+             if self.orient == wx.VERTICAL:
+                 self.pos = clamp(evt.GetPosition()[1], self.knobHalfSize, size[1]-self.knobHalfSize)
+             else:
+                 self.pos = clamp(evt.GetPosition()[0], self.knobHalfSize, size[0]-self.knobHalfSize)
              self.value = self.scale()
              self.CaptureMouse()
              self.selected = False
@@@ -361,8 -264,12 +296,12 @@@
          if self._enable:
              w, h = self.GetSize()
              pos = event.GetPosition()
-             if wx.Rect(self.pos-self.knobHalfSize, 0, self.knobSize, h).Contains(pos):
-                 self.selected = True
+             if self.orient == wx.VERTICAL:
+                 if wx.Rect(0, self.pos-self.knobHalfSize, w, self.knobSize).Contains(pos):
+                     self.selected = True
+             else:
+                 if wx.Rect(self.pos-self.knobHalfSize, 0, self.knobSize, h).Contains(pos):
+                     self.selected = True
              self.Refresh()
          event.Skip()
              
@@@ -370,13 -277,15 +309,15 @@@
          if self._enable:
              size = self.GetSize()
              if self.HasCapture():
-                 self.pos = clamp(evt.GetPosition()[0], self.knobHalfSize, size[0]-self.knobHalfSize)
+                 if self.orient == wx.VERTICAL:
+                     self.pos = clamp(evt.GetPosition()[1], self.knobHalfSize, size[1]-self.knobHalfSize)
+                 else:
+                     self.pos = clamp(evt.GetPosition()[0], self.knobHalfSize, size[0]-self.knobHalfSize)
                  self.value = self.scale()
                  self.selected = False
                  self.Refresh()
  
      def OnResize(self, evt):
-         self.createSliderBitmap()
          self.clampPos()    
          self.Refresh()
  
@@@ -385,20 -294,23 +326,23 @@@
          if self.powoftwo:
              val = powOfTwoToInt(self.value)
          else:
-             val = self.value    
-         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)
+             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)
-         self.createSliderBitmap()
-         self.createKnobBitmap()
          self.Refresh()
  
      def OnPaint(self, evt):
          w,h = self.GetSize()
-         dc = wx.AutoBufferedPaintDC(self)
+         dc = self.dcref(self)
+         gc = wx.GraphicsContext_Create(dc)
  
          dc.SetBrush(wx.Brush(self.backgroundColour, wx.SOLID))
          dc.Clear()
@@@ -410,10 -322,16 +354,16 @@@
          # Draw inner part
          if self._enable: sliderColour =  "#99A7CC"
          else: sliderColour = "#BBBBBB"
-         h2 = self.sliderHeight / 4
-         rec = wx.Rect(0, h2, w, self.sliderHeight)
-         dc.GradientFillLinear(rec, "#646986", sliderColour, wx.BOTTOM)
-         dc.DrawBitmap(self.sliderMask, 0, 0, True)
+         if self.orient == wx.VERTICAL:
+             w2 = (w - self.sliderWidth) / 2
+             rec = wx.Rect(w2, 0, self.sliderWidth, h)
+             brush = gc.CreateLinearGradientBrush(w2, 0, w2+self.sliderWidth, 0, "#646986", sliderColour)
+         else:
+             h2 = self.sliderHeight / 4
+             rec = wx.Rect(0, h2, w, self.sliderHeight)
+             brush = gc.CreateLinearGradientBrush(0, h2, 0, h2+self.sliderHeight, "#646986", sliderColour)
+         gc.SetBrush(brush)
+         gc.DrawRoundedRectangle(rec[0], rec[1], rec[2], rec[3], 2)
  
          if self.midictl != None:
              if sys.platform in ['win32', 'linux2']:
@@@ -421,21 -339,32 +371,44 @@@
              else:    
                  dc.SetFont(wx.Font(9, wx.ROMAN, wx.NORMAL, wx.NORMAL))
              dc.SetTextForeground('#FFFFFF')
-             dc.DrawLabel(str(self.midictl), wx.Rect(2,0,h,h), wx.ALIGN_CENTER)
-             dc.DrawLabel(str(self.midictl), wx.Rect(w-h,0,h,h), wx.ALIGN_CENTER)
+             if self.orient == wx.VERTICAL:
+                 dc.DrawLabel(str(self.midictl), wx.Rect(w2,2,self.sliderWidth,12), wx.ALIGN_CENTER)
+                 dc.DrawLabel(str(self.midictl), wx.Rect(w2,h-12,self.sliderWidth,12), wx.ALIGN_CENTER)
+             else:
+                 dc.DrawLabel(str(self.midictl), wx.Rect(2,0,h,h), wx.ALIGN_CENTER)
+                 dc.DrawLabel(str(self.midictl), wx.Rect(w-h,0,h,h), wx.ALIGN_CENTER)
  
          # Draw knob
          if self._enable: knobColour = '#888888'
          else: knobColour = "#DDDDDD"
++<<<<<<< HEAD
 +        rec = wx.Rect(self.pos-self.knobHalfSize, 0, self.knobSize-1, h)  
 +        dc.GradientFillLinear(rec, "#424864", knobColour, wx.RIGHT)
 +        dc.DrawBitmap(self.knobMask, rec[0], rec[1], True)
 +        
 +        if self.selected:
 +            rec2 = wx.Rect(self.pos-self.knobHalfSize, 0, self.knobSize, h)  
 +            dc.SetBrush(wx.Brush('#333333', wx.SOLID))
 +            dc.SetPen(wx.Pen('#333333', width=self.borderWidth, style=wx.SOLID))  
 +            dc.DrawRoundedRectangleRect(rec2, 3)
++=======
+         if self.orient == wx.VERTICAL:
+             rec = wx.Rect(0, self.pos-self.knobHalfSize, w, self.knobSize-1)
+             if self.selected:
+                 brush = wx.Brush('#333333', wx.SOLID)
+             else:
+                 brush = gc.CreateLinearGradientBrush(0, 0, w, 0, "#323854", knobColour)
+             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)  
+             if self.selected:
+                 brush = wx.Brush('#333333', wx.SOLID)
+             else:
+                 brush = gc.CreateLinearGradientBrush(self.pos-self.knobHalfSize, 0, self.pos+self.knobHalfSize, 0, "#323854", knobColour)
+             gc.SetBrush(brush)
+             gc.DrawRoundedRectangle(rec[0], rec[1], rec[2], rec[3], 3)
++>>>>>>> upstream/0.7.4
  
          if sys.platform in ['win32', 'linux2']:
              dc.SetFont(wx.Font(7, wx.ROMAN, wx.NORMAL, wx.NORMAL))
@@@ -550,40 -479,95 +523,95 @@@ class MultiSlider(wx.Panel)
              self.Refresh()
          
  class VuMeter(wx.Panel):
-     def __init__(self, parent, size=(200,11), numSliders=2):
+     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])        
          wx.Panel.__init__(self, parent, -1, size=size)
          self.parent = parent
+         self.orient = orient
          self.SetBackgroundColour("#000000")
          self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
          self.old_nchnls = numSliders
          self.numSliders = numSliders
-         self.SetMinSize((200,5*self.numSliders+1))
-         self.SetSize((200, 5*self.numSliders+1))
-         self.bitmap = vu_metre.GetBitmap()
-         self.backBitmap = vu_metre_dark.GetBitmap()
          self.amplitude = [0] * self.numSliders
+         self.createBitmaps()
  
          self.Bind(wx.EVT_PAINT, self.OnPaint)
+         self.Bind(wx.EVT_SIZE, self.OnSize)
          self.Bind(wx.EVT_CLOSE, self.OnClose)   
  
+     def OnSize(self, evt):
+         self.createBitmaps()
+         wx.CallAfter(self.Refresh)
+ 
+     def createBitmaps(self):
+         w, h = self.GetSize()
+         b = wx.EmptyBitmap(w,h)
+         f = wx.EmptyBitmap(w,h)
+         dcb = wx.MemoryDC(b)
+         dcf = wx.MemoryDC(f)
+         dcb.SetPen(wx.Pen("#000000", width=1))
+         dcf.SetPen(wx.Pen("#000000", width=1))
+         if self.orient == wx.HORIZONTAL:
+             height = 6
+             steps = int(w / 10.0 + 0.5)
+         else:
+             width = 6
+             steps = int(h / 10.0 + 0.5)
+         bounds = int(steps / 6.0)
+         for i in range(steps):
+             if i == (steps - 1):
+                 dcb.SetBrush(wx.Brush("#770000"))
+                 dcf.SetBrush(wx.Brush("#FF0000"))
+             elif i >= (steps - bounds):
+                 dcb.SetBrush(wx.Brush("#440000"))
+                 dcf.SetBrush(wx.Brush("#CC0000"))
+             elif i >= (steps - (bounds*2)):
+                 dcb.SetBrush(wx.Brush("#444400"))
+                 dcf.SetBrush(wx.Brush("#CCCC00"))
+             else:
+                 dcb.SetBrush(wx.Brush("#004400"))
+                 dcf.SetBrush(wx.Brush("#00CC00"))
+             if self.orient == wx.HORIZONTAL:
+                 dcb.DrawRectangle(i*10, 0, 11, height)
+                 dcf.DrawRectangle(i*10, 0, 11, height)
+             else:
+                 ii = steps - 1 - i
+                 dcb.DrawRectangle(0, ii*10, width, 11)
+                 dcf.DrawRectangle(0, ii*10, width, 11)
+         if self.orient == wx.HORIZONTAL:
+             dcb.DrawLine(w-1, 0, w-1, height)
+             dcf.DrawLine(w-1, 0, w-1, height)
+         else:
+             dcb.DrawLine(0, 0, width, 0)
+             dcf.DrawLine(0, 0, width, 0)
+         dcb.SelectObject(wx.NullBitmap)
+         dcf.SelectObject(wx.NullBitmap)
+         self.backBitmap = b
+         self.bitmap = f
+ 
      def setNumSliders(self, numSliders):
+         w, h = self.GetSize()
          oldChnls = self.old_nchnls
          self.numSliders = numSliders
          self.amplitude = [0] * self.numSliders
          gap = (self.numSliders - oldChnls) * 5
          parentSize = self.parent.GetSize()
-         if sys.platform == 'linux2':
-             self.SetSize((200, 5*self.numSliders+1))
-             self.SetMinSize((200, 5*self.numSliders+1))
+         if self.orient == wx.HORIZONTAL:
+             self.SetSize((w, self.numSliders * 5 + 1))
+             self.SetMinSize((w, 5*self.numSliders+1))
              self.parent.SetSize((parentSize[0], parentSize[1]+gap))
              self.parent.SetMinSize((parentSize[0], parentSize[1]+gap))
          else:
-             self.SetSize((200, 5*self.numSliders+1))
-             self.SetMinSize((200, 5*self.numSliders+1))
-             self.parent.SetSize((parentSize[0], parentSize[1]+gap))
-             self.parent.SetMinSize((parentSize[0], parentSize[1]+gap))
-         self.Refresh()
-         self.parent.Layout()
+             self.SetSize((self.numSliders * 5 + 1, h))
+             self.SetMinSize((5*self.numSliders+1, h))
+             self.parent.SetSize((parentSize[0]+gap, parentSize[1]))
+             self.parent.SetMinSize((parentSize[0]+gap, parentSize[1]))
+         wx.CallAfter(self.Refresh)
+         wx.CallAfter(self.parent.Layout)
+         wx.CallAfter(self.parent.Refresh)
  
      def setRms(self, *args):
          if args[0] < 0: 
@@@ -600,14 -584,28 +628,39 @@@
          dc.SetBrush(wx.Brush("#000000"))
          dc.Clear()
          dc.DrawRectangle(0,0,w,h)
++<<<<<<< HEAD
 +        for i in range(self.numSliders):
 +            db = math.log10(self.amplitude[i]+0.00001) * 0.2 + 1.
 +            width = int(db*w)
 +            dc.DrawBitmap(self.backBitmap, 0, i*5)
 +            if width > 0:
 +                dc.SetClippingRegion(0, i*5, width, 5)
 +                dc.DrawBitmap(self.bitmap, 0, i*5)
 +                dc.DestroyClippingRegion()
++=======
+         if self.orient == wx.HORIZONTAL:
+             height = 6
+             for i in range(self.numSliders):
+                 y = i * (height - 1)
+                 db = math.log10(self.amplitude[i]+0.00001) * 0.2 + 1.
+                 width = int(db*w)
+                 dc.DrawBitmap(self.backBitmap, 0, y)
+                 if width > 0:
+                     dc.SetClippingRegion(0, y, width, height)
+                     dc.DrawBitmap(self.bitmap, 0, y)
+                     dc.DestroyClippingRegion()
+         else:
+             width = 6
+             for i in range(self.numSliders):
+                 y = i * (width - 1)
+                 db = math.log10(self.amplitude[i]+0.00001) * 0.2 + 1.
+                 height = int(db*h)
+                 dc.DrawBitmap(self.backBitmap, y, 0)
+                 if height > 0:
+                     dc.SetClippingRegion(y, h-height, width, height)
+                     dc.DrawBitmap(self.bitmap, y, 0)
+                     dc.DestroyClippingRegion()
++>>>>>>> upstream/0.7.4
          event.Skip()
          
      def OnClose(self, evt):
@@@ -978,19 -976,20 +1031,36 @@@ class ViewTable(wx.Frame)
      def _destroy(self, evt):
          self.object._setViewFrame(None)
          self.Destroy()
++<<<<<<< HEAD
 +
 +class ViewTablePanel(wx.Panel):
 +    def __init__(self, parent, obj):
 +        wx.Panel.__init__(self, parent)
 +        self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
 +        self.obj = obj
 +        self.samples = []
 +        self.Bind(wx.EVT_PAINT, self.OnPaint)
 +        self.Bind(wx.EVT_SIZE, self.OnSize)
 +        if sys.platform == "win32":
 +            self.dcref = wx.BufferedPaintDC
 +        else:
 +            self.dcref = wx.PaintDC
++=======
+ 
+ class ViewTablePanel(wx.Panel):
+     def __init__(self, parent, obj):
+         wx.Panel.__init__(self, parent)
+         self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
+         self.obj = obj
+         self.samples = []
+         self.Bind(wx.EVT_PAINT, self.OnPaint)
+         self.Bind(wx.EVT_SIZE, self.OnSize)
+         if sys.platform == "win32":
+             self.dcref = wx.BufferedPaintDC
+         else:
+             self.dcref = wx.PaintDC
+ 
++>>>>>>> upstream/0.7.4
          
      def draw(self, samples):
          self.samples = samples
@@@ -1302,9 -1301,8 +1372,8 @@@ class SpectrumDisplay(wx.Frame)
                   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 = wx.Slider(self.panel, -1, 0, -24, 24, style=wx.SL_VERTICAL|wx.SL_INVERSE)
-         self.gainSlider.Bind(wx.EVT_SLIDER, self.setGain)
-         self.dispBox.Add(self.gainSlider, 0, wx.EXPAND|wx.BOTTOM, 15)
+         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.panel.SetSizer(self.mainBox)
@@@ -1338,8 -1336,8 +1407,8 @@@
          size = 1 << (evt.GetInt() + 6)
          self.obj.size = size
  
-     def setGain(self, evt):
-         self.obj.setGain(pow(10.0, evt.GetInt() * 0.05))
+     def setGain(self, gain):
+         self.obj.setGain(pow(10.0, gain * 0.05))
  
      def setZoomH(self, values):
          self.spectrumPanel.setLowFreq(self.obj.setLowbound(values[0]))
@@@ -1547,6 -1545,164 +1616,164 @@@ class SpectrumPanel(wx.Panel)
                  gc.DrawLines(samples)
  
  ######################################################################
+ ## Spectrum Display
+ ######################################################################
+ 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.fileMenu = wx.Menu()
+         closeItem = self.fileMenu.Append(-1, 'Close\tCtrl+W', kind=wx.ITEM_NORMAL)
+         self.Bind(wx.EVT_MENU, self._destroy, closeItem)
+         self.menubar.Append(self.fileMenu, "&File")
+         self.SetMenuBar(self.menubar)
+         self.Bind(wx.EVT_CLOSE, self._destroy)
+         self.obj = obj
+         gain = self.obj.gain
+         length = self.obj.length
+         self.panel = wx.Panel(self)
+         self.panel.SetBackgroundColour(BACKGROUND_COLOUR)
+         self.mainBox = wx.BoxSizer(wx.VERTICAL)
+         self.toolBox = wx.BoxSizer(wx.HORIZONTAL)
+         if sys.platform == "darwin":
+             X_OFF = 24
+         else:
+             X_OFF = 16
+         tw, th = self.GetTextExtent("Start")
+         self.activeTog = wx.ToggleButton(self.panel, -1, label="Start", size=(tw+X_OFF, th+10))
+         self.activeTog.SetValue(1)
+         self.activeTog.Bind(wx.EVT_TOGGLEBUTTON, self.activate)
+         self.toolBox.Add(self.activeTog, 0, wx.TOP|wx.LEFT|wx.RIGHT, 5)
+         self.toolBox.AddSpacer(10)
+         self.toolBox.Add(wx.StaticText(self.panel, -1, label="Window length (ms):"), 0, wx.TOP, 11)
+         self.lenSlider = ControlSlider(self.panel, 10, 60, length * 1000, outFunction=self.setLength)
+         self.toolBox.Add(self.lenSlider, 1, wx.TOP|wx.LEFT|wx.RIGHT, 11)
+         self.toolBox.AddSpacer(40)
+         self.mainBox.Add(self.toolBox, 0, wx.EXPAND)
+         self.dispBox = wx.BoxSizer(wx.HORIZONTAL)
+         self.box = wx.BoxSizer(wx.VERTICAL)
+         self.scopePanel = ScopePanel(self.panel, self.obj)
+         self.box.Add(self.scopePanel, 1, wx.EXPAND|wx.LEFT|wx.RIGHT, 5)
+         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.panel.SetSizer(self.mainBox)
+ 
+     def activate(self, evt):
+         self.obj.poll(evt.GetInt())
+ 
+     def setLength(self, length):
+         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)
+         self.obj.setGain(gain)
+ 
+     def update(self, points):
+         wx.CallAfter(self.scopePanel.setImage, points)
+ 
+     def _destroy(self, evt):
+         self.obj._setViewFrame(None)
+         self.Destroy()
+ 
+ class ScopePanel(wx.Panel):
+     def __init__(self, parent, obj):
+         wx.Panel.__init__(self, parent)
+         self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
+         self.Bind(wx.EVT_PAINT, self.OnPaint)
+         self.Bind(wx.EVT_SIZE, self.OnSize)
+         self.img = [[]]
+         self.obj = obj
+         self.gain = self.obj.gain
+         self.length = self.obj.length
+         self.chnls = len(self.obj)
+         if self.chnls == 1:
+             self.pens = [wx.Pen(wx.Colour(100,0,0), width=2)]
+         else:
+             self.pens = [wx.Pen(wx.Colour(166,4,0), width=2), wx.Pen(wx.Colour(8,11,116), width=2), wx.Pen(wx.Colour(0,204,0), width=2),
+                         wx.Pen(wx.Colour(255,167,0), width=2), wx.Pen(wx.Colour(133,0,75), width=2), wx.Pen(wx.Colour(255,236,0), width=2),
+                         wx.Pen(wx.Colour(1,147,154), width=2), wx.Pen(wx.Colour(162,239,0), width=2)]
+ 
+         if sys.platform == "win32":
+             self.dcref = wx.BufferedPaintDC
+         else:
+             self.dcref = wx.PaintDC
+ 
+     def OnSize(self, evt):
+         size = self.GetSize()
+         self.obj.setWidth(size[0])
+         self.obj.setHeight(size[1])
+ 
+     def setGain(self, gain):
+         self.gain = gain
+         print self.gain
+ 
+     def setLength(self, length):
+         self.length = length
+ 
+     def setImage(self, points):
+         self.img = points
+         self.Refresh()
+ 
+     def OnPaint(self, evt):
+         w,h = self.GetSize()
+         dc = self.dcref(self)
+         gc = wx.GraphicsContext_Create(dc)
+         tw, th = dc.GetTextExtent("0")
+         dc.SetBrush(wx.Brush("#FFFFFF"))
+         dc.Clear()
+         dc.DrawRectangle(0,0,w,h)
+         gc.SetPen(wx.Pen('#000000', width=1, style=wx.SOLID))
+         gc.SetBrush(wx.Brush("#FFFFFF", style=wx.TRANSPARENT))
+         dc.SetTextForeground("#444444")
+         if sys.platform in "darwin":
+             font, ptsize = dc.GetFont(), dc.GetFont().GetPointSize()
+             font.SetPointSize(ptsize - 3)
+             dc.SetFont(font)
+         elif sys.platform == "win32":
+             font = dc.GetFont()
+             font.SetPointSize(8)
+             dc.SetFont(font)
+         
+         dc.SetPen(wx.Pen('#888888', width=1, style=wx.DOT))  
+         # horizontal grid
+         step = h / 6
+         ampstep = 1.0 / 3.0 / self.gain
+         for i in range(1, 6):
+             pos = int(h - i * step)
+             npos = i - 3
+             text = "%.2f" % (ampstep * npos)
+             tw, th = dc.GetTextExtent(text)
+             dc.DrawText(text, w-tw-2, pos-th/2)
+             dc.DrawLine(0, pos, w-tw-10, pos)
+ 
+         # vertical grid
+         tickstep = w / 4
+         timestep = self.length * 0.25
+         for j in range(4):
+             dc.SetPen(wx.Pen('#888888', width=1, style=wx.DOT))  
+             dc.DrawLine(j*tickstep, 0, j*tickstep, h)
+             dc.DrawText("%.3f" % (j*timestep), j*tickstep+2, h-12)
+         # draw waveforms
+         for i, samples in enumerate(self.img):
+             gc.SetPen(self.pens[i])
+             if len(samples):
+                 gc.DrawLines(samples)
+ 
+         # legend
+         last_tw = tw
+         tw, th = dc.GetTextExtent("chan 8")
+         for i in range(self.chnls):
+             dc.SetTextForeground(self.pens[i].GetColour())
+             dc.DrawText("chan %d" % (i+1), w-tw-20-last_tw, i*th+10)
+ 
+ ######################################################################
  ## Grapher window for PyoTableObject control
  ######################################################################
  OFF = 15
@@@ -1582,6 -1738,11 +1809,11 @@@ class Grapher(wx.Panel)
          self.init = [tup for tup in init]
          self.points = init
          self.outFunction = outFunction
+ 
+         if sys.platform == "win32":
+             self.dcref = wx.BufferedPaintDC
+         else:
+             self.dcref = wx.PaintDC
          
          self.SetFocus()
  
@@@ -1680,6 -1841,7 +1912,7 @@@
              self.points = [(pt[0], pt[1]-0.002) for pt in self.points]
              self.sendValues()
              self.Refresh()
+         evt.Skip()
  
      def MouseDown(self, evt):
          self.CaptureMouse()
@@@ -1718,7 -1880,7 +1951,7 @@@
                  if self.mode == 4 and y <= 0:
                      y = 0.000001
                  self.points[self.selected] = (x, y)
-         self.Refresh()
+             self.Refresh()
  
      def getLogPoints(self, pt1, pt2):
          tmp = []
@@@ -1854,7 -2016,10 +2087,10 @@@
      def OnPaint(self, evt):
          w,h = self.GetSize()
          corners = [(OFF,OFF),(w-OFF,OFF),(w-OFF,h-OFF),(OFF,h-OFF)]
-         dc = wx.AutoBufferedPaintDC(self)
+         dc = self.dcref(self)
+         gc = wx.GraphicsContext_Create(dc)
+         gc.SetBrush(wx.Brush("#000000"))
+         gc.SetPen(wx.Pen("#000000"))
          if sys.platform == "darwin":
              font, ptsize = dc.GetFont(), dc.GetFont().GetPointSize()
          else:
@@@ -1908,44 -2073,44 +2144,44 @@@
          if len(tmp) > 1:
              if self.mode == 0:
                  for i in range(len(tmp)-1):
-                     dc.DrawLinePoint(tmp[i], tmp[i+1])
+                     gc.DrawLines([tmp[i], tmp[i+1]])
              elif self.mode == 1:
                  for i in range(len(tmp)-1):
                      tmp2 = self.getCosPoints(tmp[i], tmp[i+1])
                      if i == 0 and len(tmp2) < 2:
-                         dc.DrawLinePoint(tmp[i], tmp[i+1])
+                         gc.DrawLines([tmp[i], tmp[i+1]])
                      if last_p != None:
-                         dc.DrawLinePoint(last_p, tmp[i])
+                         gc.DrawLines([last_p, tmp[i]])
                      for j in range(len(tmp2)-1):
-                         dc.DrawLinePoint(tmp2[j], tmp2[j+1])
+                         gc.DrawLines([tmp2[j], tmp2[j+1]])
                          last_p = tmp2[j+1]
                  if last_p != None:
-                     dc.DrawLinePoint(last_p, tmp[-1])
+                     gc.DrawLines([last_p, tmp[-1]])
              elif self.mode == 2:
                  for i in range(len(tmp)-1):
                      tmp2 = self.getExpPoints(tmp[i], tmp[i+1])
                      if i == 0 and len(tmp2) < 2:
-                         dc.DrawLinePoint(tmp[i], tmp[i+1])
+                         gc.DrawLines([tmp[i], tmp[i+1]])
                      if last_p != None:
-                         dc.DrawLinePoint(last_p, tmp[i])
+                         gc.DrawLines([last_p, tmp[i]])
                      for j in range(len(tmp2)-1):
-                         dc.DrawLinePoint(tmp2[j], tmp2[j+1])
+                         gc.DrawLines([tmp2[j], tmp2[j+1]])
                          last_p = tmp2[j+1]
                  if last_p != None:
-                     dc.DrawLinePoint(last_p, tmp[-1])
+                     gc.DrawLines([last_p, tmp[-1]])
              elif self.mode == 3:
                  curvetmp = self.addImaginaryPoints(tmp)
                  for i in range(1, len(curvetmp)-2):
                      tmp2 = self.getCurvePoints(curvetmp[i-1], curvetmp[i], curvetmp[i+1], curvetmp[i+2])
                      if i == 1 and len(tmp2) < 2:
-                         dc.DrawLinePoint(curvetmp[i], curvetmp[i+1])
+                         gc.DrawLines([curvetmp[i], curvetmp[i+1]])
                      if last_p != None:
-                         dc.DrawLinePoint(last_p, curvetmp[i])
+                         gc.DrawLines([last_p, curvetmp[i]])
                      for j in range(len(tmp2)-1):
-                         dc.DrawLinePoint(tmp2[j], tmp2[j+1])
+                         gc.DrawLines([tmp2[j], tmp2[j+1]])
                          last_p = tmp2[j+1]
                  if last_p != None:
-                     dc.DrawLinePoint(last_p, tmp[-1])
+                     gc.DrawLines([last_p, tmp[-1]])
              elif self.mode == 4:
                  back_tmp = [p for p in tmp]
                  for i in range(len(tmp)):
@@@ -1955,14 -2120,14 +2191,14 @@@
                      for j in range(len(tmp2)):
                          tmp2[j] = (tmp2[j][0], int(round((1.0-tmp2[j][1]) * h)) + OFF + RAD)
                      if i == 0 and len(tmp2) < 2:
-                         dc.DrawLinePoint(back_tmp[i], back_tmp[i+1])
+                         gc.DrawLines([back_tmp[i], back_tmp[i+1]])
                      if last_p != None:
-                         dc.DrawLinePoint(last_p, back_tmp[i])
+                         gc.DrawLines([last_p, back_tmp[i]])
                      for j in range(len(tmp2)-1):
-                         dc.DrawLinePoint(tmp2[j], tmp2[j+1])
+                         gc.DrawLines([tmp2[j], tmp2[j+1]])
                          last_p = tmp2[j+1]
                  if last_p != None:
-                     dc.DrawLinePoint(last_p, back_tmp[-1])
+                     gc.DrawLines([last_p, back_tmp[-1]])
                  tmp = [p for p in back_tmp]
              elif self.mode == 5:
                  back_tmp = [p for p in tmp]
@@@ -1973,23 -2138,25 +2209,25 @@@
                      for j in range(len(tmp2)):
                          tmp2[j] = (tmp2[j][0], int(round((1.0-tmp2[j][1]) * h)) + OFF + RAD)
                      if i == 0 and len(tmp2) < 2:
-                         dc.DrawLinePoint(back_tmp[i], back_tmp[i+1])
+                         gc.DrawLines([back_tmp[i], back_tmp[i+1]])
                      if last_p != None:
-                         dc.DrawLinePoint(last_p, back_tmp[i])
+                         gc.DrawLines([last_p, back_tmp[i]])
                      for j in range(len(tmp2)-1):
-                         dc.DrawLinePoint(tmp2[j], tmp2[j+1])
+                         gc.DrawLines([tmp2[j], tmp2[j+1]])
                          last_p = tmp2[j+1]
                  if last_p != None:
-                     dc.DrawLinePoint(last_p, back_tmp[-1])
+                     gc.DrawLines([last_p, back_tmp[-1]])
                  tmp = [p for p in back_tmp]
  
          # Draw points
          for i,p in enumerate(tmp):
              if i == self.selected:
+                 gc.SetBrush(wx.Brush("#FFFFFF"))
                  dc.SetBrush(wx.Brush("#FFFFFF"))
              else:
+                 gc.SetBrush(wx.Brush("#000000"))
                  dc.SetBrush(wx.Brush("#000000"))
-             dc.DrawCircle(p[0],p[1],RAD)
+             gc.DrawEllipse(p[0]-RAD,p[1]-RAD,RAD2,RAD2)
          
          # Draw position values
          font.SetPointSize(ptsize-3)
@@@ -2084,7 -2251,11 +2322,11 @@@ class DataMultiSlider(wx.Panel)
      def OnResize(self, event):
          self.Layout()
          self.Refresh()
-         
+ 
+     def update(self, points):
+         self.values = points
+         self.Refresh()
+ 
      def OnPaint(self, event):
          w,h = self.GetSize()
          dc = self.dcref(self)
@@@ -2185,6 -2356,9 +2427,9 @@@ class DataTableGrapher(wx.Frame)
      def close(self, evt):
          self.Destroy()
  
+     def update(self, samples):
+         wx.CallAfter(self.multi.update, samples)
+ 
  class ServerGUI(wx.Frame):
      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):
@@@ -2340,9 -2514,12 +2585,12 @@@
          key = evt.GetKeyCode()
          if key == 315:
              self.getPrev()
+             evt.StopPropagation()
          elif key == 317:
-             self.getNext()  
-         evt.Skip()      
+             self.getNext()
+             evt.StopPropagation()
+         else:
+             evt.Skip()      
  
      def setAmp(self, value):
          self.ampf(math.pow(10.0, float(value) * 0.05))
diff --combined pyolib/effects.py
index 068206c,cfde21c..2f81f40
--- a/pyolib/effects.py
+++ b/pyolib/effects.py
@@@ -1480,3 -1480,156 +1480,159 @@@ class STRev(PyoObject)
          return self._firstRefGain
      @firstRefGain.setter
      def firstRefGain(self, x): self.setFirstRefGain(x)
++<<<<<<< HEAD
++=======
+ 
+ class SmoothDelay(PyoObject):
+     """
+     Artifact free sweepable recursive delay.
+ 
+     SmoothDelay implements a delay line that does not produce 
+     clicks or pitch shifting when the delay time is changing.
+ 
+     :Parent: :py:class:`PyoObject`
+ 
+     :Args:
+ 
+         input : PyoObject
+             Input signal to delayed.
+         delay : float or PyoObject, optional
+             Delay time in seconds. Defaults to 0.25.
+         feedback : float or PyoObject, optional
+             Amount of output signal sent back into the delay line.
+             Defaults to 0.
+         crossfade : float, optional
+             Crossfade time, in seconds, between overlaped readers.
+             Defaults to 0.05.
+         maxdelay : float, optional
+             Maximum delay length in seconds. Available only at initialization. 
+             Defaults to 1.
+ 
+     .. note::
+ 
+         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()
+     >>> s.start()
+     >>> sf = SfPlayer(SNDS_PATH+"/transparent.aif", loop=True, mul=0.3).mix(2).out()
+     >>> lf = Sine(freq=0.1, mul=0.24, add=0.25)
+     >>> sd = SmoothDelay(sf, delay=lf, feedback=0.5, crossfade=0.05, mul=0.7).out()
+ 
+     """
+     def __init__(self, input, delay=0.25, feedback=0, crossfade=0.05, maxdelay=1, mul=1, add=0):
+         PyoObject.__init__(self, mul, add)
+         self._input = input
+         self._delay = delay
+         self._feedback = feedback
+         self._crossfade = crossfade
+         self._maxdelay = maxdelay
+         self._in_fader = InputFader(input)
+         in_fader, delay, feedback, crossfade, maxdelay, mul, add, lmax = convertArgsToLists(self._in_fader, delay, feedback, crossfade, maxdelay, mul, add)
+         self._base_objs = [SmoothDelay_base(wrap(in_fader,i), wrap(delay,i), wrap(feedback,i), wrap(crossfade,i), wrap(maxdelay,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
+                 New signal to delayed.
+             fadetime : float, optional
+                 Crossfade time between old and new input. Defaults to 0.05.
+ 
+         """
+         self._input = x
+         self._in_fader.setInput(x, fadetime)
+ 
+     def setDelay(self, x):
+         """
+         Replace the `delay` attribute.
+         
+         :Args:
+ 
+             x : float or PyoObject
+                 New `delay` attribute.
+ 
+         """
+         self._delay = x
+         x, lmax = convertArgsToLists(x)
+         [obj.setDelay(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
+ 
+     def setFeedback(self, x):
+         """
+         Replace the `feedback` attribute.
+         
+         :Args:
+ 
+             x : float or PyoObject
+                 New `feedback` attribute.
+ 
+         """
+         self._feedback = x
+         x, lmax = convertArgsToLists(x)
+         [obj.setFeedback(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
+ 
+     def setCrossfade(self, x):
+         """
+         Replace the `crossfade` attribute.
+         
+         :Args:
+ 
+             x : float
+                 New `crossfade` attribute.
+ 
+         """
+         self._crossfade = x
+         x, lmax = convertArgsToLists(x)
+         [obj.setCrossfade(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
+ 
+     def reset(self):
+         """
+         Reset the memory buffer to zeros.
+         
+         """
+         [obj.reset() for obj in self._base_objs]
+ 
+     def ctrl(self, map_list=None, title=None, wxnoserver=False):
+         self._map_list = [SLMap(0.001, self._maxdelay, 'log', 'delay',  self._delay),
+                           SLMap(0., 1., 'lin', 'feedback', self._feedback),
+                           SLMap(0., self._maxdelay, 'lin', 'crossfade', self._crossfade, dataOnly=True),
+                           SLMapMul(self._mul)]
+         PyoObject.ctrl(self, map_list, title, wxnoserver)
+ 
+     @property
+     def input(self):
+         """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.""" 
+         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.""" 
+         return self._feedback
+     @feedback.setter
+     def feedback(self, x): self.setFeedback(x)
+ 
+     @property
+     def crossfade(self):
+         """float. Crossfade time, in seconds, between overlaps.""" 
+         return self._crossfade
+     @crossfade.setter
+     def crossfade(self, x): self.setCrossfade(x)
++>>>>>>> upstream/0.7.4
diff --combined scripts/release_doc_src.sh
index f24c921,78c8449..56581fe
--- a/scripts/release_doc_src.sh
+++ b/scripts/release_doc_src.sh
@@@ -6,7 -6,7 +6,11 @@@
  # 3. Execute from pyo folder : ./scripts/release_doc_src.sh
  #
  
++<<<<<<< HEAD
 +version=0.7.0
++=======
+ version=0.7.4
++>>>>>>> upstream/0.7.4
  replace=XXX
  
  doc_rep=pyo_XXX-doc
diff --combined setup.py
index 51244c5,d67d090..952ab73
--- a/setup.py
+++ b/setup.py
@@@ -23,7 -23,7 +23,11 @@@ from distutils.core import setup, Exten
  import os, sys, getopt
  import time
  
++<<<<<<< HEAD
 +pyo_version = "0.7.0"
++=======
+ pyo_version = "0.7.4"
++>>>>>>> upstream/0.7.4
  build_osx_with_jack_support = False
  compile_externals = False
  
@@@ -68,11 -68,11 +72,15 @@@ files = ['pyomodule.c', 'servermodule.c
  source_files = [path + f for f in files]
  
  path = 'src/objects/'
++<<<<<<< HEAD
 +files = ['tablemodule.c', 'wgverbmodule.c', 'freeverbmodule.c', 'phasevocmodule.c', 'fftmodule.c', 
++=======
+ files = ['granulatormodule.c', 'tablemodule.c', 'wgverbmodule.c', 'freeverbmodule.c', 'phasevocmodule.c', 'fftmodule.c', 
++>>>>>>> upstream/0.7.4
          'oscilmodule.c', 'randommodule.c', 'oscmodule.c','analysismodule.c', 
          'sfplayermodule.c', 'oscbankmodule.c', 'lfomodule.c', 
           'matrixmodule.c', 'filtremodule.c', 'noisemodule.c', 'distomodule.c',
-         'inputmodule.c', 'fadermodule.c', 'midimodule.c', 'delaymodule.c','recordmodule.c', 'granulatormodule.c', 
+         'inputmodule.c', 'fadermodule.c', 'midimodule.c', 'delaymodule.c','recordmodule.c', 
          'metromodule.c', 'trigmodule.c', 'patternmodule.c', 'bandsplitmodule.c', 'hilbertmodule.c', 'panmodule.c',
          'selectmodule.c', 'compressmodule.c', 'utilsmodule.c',
          'convolvemodule.c', 'arithmeticmodule.c', 'sigmodule.c',
diff --combined src/engine/pyomodule.c
index cb7dde3,24c05c5..1c64f4f
--- a/src/engine/pyomodule.c
+++ b/src/engine/pyomodule.c
@@@ -1767,9 -1767,10 +1767,10 @@@ rescale(PyObject *self, PyObject *args
          type = 0;
      else if (PyList_Check(data))
          type = 1;
-     else
-         Py_RETURN_NONE;
- 
+     else {
+         Py_INCREF(Py_None);
+         return Py_None;
+     }
      if (xlog == 0 && ylog == 0) {
          datascl = xmax - xmin;
          curscl = ymax - ymin;
@@@ -1854,9 -1855,47 +1855,47 @@@
          }        
      }
      else {
-         Py_RETURN_NONE;
+         Py_INCREF(Py_None);
+         return Py_None;
      }
-     Py_RETURN_NONE;
+ 	Py_INCREF(Py_None);
+ 	return Py_None;
+ }
+ 
+ #define floatmap_info \
+ "\nConverts values from a 0-1 range to an output range.\n\n\
+ This function takes data in the range `0` - `1` and returns corresponding values\nin the range `min` - `max`.\n\n\
+ :Argss:\n\n    \
+ x : float\n        Value to convert, in the range 0 to 1.\n    \
+ min : float, optional\n        Minimum value of the output range. Defaults to 0.\n    \
+ max : float, optional\n        Maximum value of the output range. Defaults to 1.\n    \
+ exp : float, optional\n        Power factor (1 (default) is linear, les than 1 is logarithmic, greter than 1 is exponential).\n\n\
+ >>> a = 0.5\n\
+ >>> b = floatmap(a, 0, 1, 4)\n\
+ >>> print b\n\
+ 0.0625\n\n"
+ 
+ static PyObject *
+ floatmap(PyObject *self, PyObject *args, PyObject *kwds)
+ {
+     MYFLT x = 0.0;
+     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);
+ 
+     if (x < 0.0)
+         x = 0.0;
+     else if (x > 1.0)
+         x = 1.0;
+     if (exp != 1.0)
+         x = MYPOW(x, exp);
+ 
+     return Py_BuildValue("d", x * (max - min) + min);
  }
  
  /****** Conversion utilities ******/
@@@ -1882,13 -1921,58 +1921,58 @@@ midiToHz(PyObject *self, PyObject *arg
      double x = 0.0;
      PyObject *newseq = NULL;
      if (PyNumber_Check(arg))
-         return Py_BuildValue("d", 8.1757989156437 * pow(1.0594630943593, PyFloat_AsDouble(PyNumber_Float(arg))));
+         return Py_BuildValue("d", 440.0 * MYPOW(2.0, (PyFloat_AsDouble(PyNumber_Float(arg)) - 69) / 12.0));
+     else if (PyList_Check(arg)) {
+         count = PyList_Size(arg);
+         newseq = PyList_New(count);
+         for (i=0; i<count; i++) {
+             x = PyFloat_AsDouble(PyNumber_Float(PyList_GET_ITEM(arg, i)));
+             PyList_SET_ITEM(newseq, i, PyFloat_FromDouble(440.0 * MYPOW(2.0, (x - 69) / 12.0)));
+         }
+         return newseq;
+     }
+     else if (PyTuple_Check(arg)) {
+         count = PyTuple_Size(arg);
+         newseq = PyTuple_New(count);
+         for (i=0; i<count; i++) {
+             x = PyFloat_AsDouble(PyNumber_Float(PyTuple_GET_ITEM(arg, i)));
+             PyTuple_SET_ITEM(newseq, i, PyFloat_FromDouble(440.0 * MYPOW(2.0, (x - 69) / 12.0)));
+         }
+         return newseq;
+     }
+     else
+         Py_RETURN_NONE;
+ }    
+ 
+ #define hzToMidi_info \
+ "\nConverts a frequency in Hertz to a midi note value.\n\n:Args:\n\n    \
+ x : float\n        Frequency in Hertz. `x` can be a number, a list or a tuple, otherwise the function returns None.\n\n\
+ >>> a = (110.0, 220.0, 440.0, 880.0)\n\
+ >>> b = hzToMidi(a)\n\
+ >>> print b\n\
+ (45.0, 57.0, 69.0, 81.0)\n\
+ >>> a = [110.0, 220.0, 440.0, 880.0]\n\
+ >>> b = hzToMidi(a)\n\
+ >>> print b\n\
+ [45.0, 57.0, 69.0, 81.0]\n\
+ >>> b = hzToMidi(440.0)\n\
+ >>> print b\n\
+ 69.0\n\n"
+ 
+ static PyObject *
+ hzToMidi(PyObject *self, PyObject *arg) {
+     int count = 0;
+     int i = 0;
+     double x = 0.0;
+     PyObject *newseq = NULL;
+     if (PyNumber_Check(arg))
+         return Py_BuildValue("d", 12.0 * MYLOG2(PyFloat_AsDouble(PyNumber_Float(arg)) / 440.0) + 69);
      else if (PyList_Check(arg)) {
          count = PyList_Size(arg);
          newseq = PyList_New(count);
          for (i=0; i<count; i++) {
              x = PyFloat_AsDouble(PyNumber_Float(PyList_GET_ITEM(arg, i)));
-             PyList_SET_ITEM(newseq, i, PyFloat_FromDouble(8.1757989156437 * pow(1.0594630943593, x)));
+             PyList_SET_ITEM(newseq, i, PyFloat_FromDouble(12.0 * MYLOG2(x / 440.0) + 69));
          }
          return newseq;
      }
@@@ -1897,7 -1981,7 +1981,7 @@@
          newseq = PyTuple_New(count);
          for (i=0; i<count; i++) {
              x = PyFloat_AsDouble(PyNumber_Float(PyTuple_GET_ITEM(arg, i)));
-             PyTuple_SET_ITEM(newseq, i, PyFloat_FromDouble(8.1757989156437 * pow(1.0594630943593, x)));
+             PyTuple_SET_ITEM(newseq, i, PyFloat_FromDouble(12.0 * MYLOG2(x / 440.0) + 69));
          }
          return newseq;
      }
@@@ -2127,8 -2211,10 +2211,10 @@@ static PyMethodDef pyo_functions[] = 
  {"reducePoints", (PyCFunction)reducePoints, METH_VARARGS|METH_KEYWORDS, reducePoints_info},
  {"distanceToSegment", (PyCFunction)distanceToSegment, METH_VARARGS|METH_KEYWORDS, distanceToSegment_info},
  {"rescale", (PyCFunction)rescale, METH_VARARGS|METH_KEYWORDS, rescale_info},
+ {"floatmap", (PyCFunction)floatmap, METH_VARARGS|METH_KEYWORDS, floatmap_info},
  {"linToCosCurve", (PyCFunction)linToCosCurve, METH_VARARGS|METH_KEYWORDS, linToCosCurve_info},
  {"midiToHz", (PyCFunction)midiToHz, METH_O, midiToHz_info},
+ {"hzToMidi", (PyCFunction)hzToMidi, METH_O, hzToMidi_info},
  {"midiToTranspo", (PyCFunction)midiToTranspo, METH_O, midiToTranspo_info},
  {"sampsToSec", (PyCFunction)sampsToSec, METH_O, sampsToSec_info},
  {"secToSamps", (PyCFunction)secToSamps, METH_O, secToSamps_info},
@@@ -2299,6 -2385,7 +2385,7 @@@ init_pyo64(void
      module_add_object(m, "CtlScan2_base", &CtlScan2Type);
      module_add_object(m, "MidiNote_base", &MidiNoteType);
      module_add_object(m, "Notein_base", &NoteinType);
+     module_add_object(m, "NoteinTrig_base", &NoteinTrigType);
      module_add_object(m, "Bendin_base", &BendinType);
      module_add_object(m, "Touchin_base", &TouchinType);
      module_add_object(m, "Programin_base", &PrograminType);
@@@ -2386,6 -2473,7 +2473,7 @@@
      module_add_object(m, "CentsToTranspo_base", &CentsToTranspoType);
      module_add_object(m, "TranspoToCents_base", &TranspoToCentsType);
      module_add_object(m, "MToF_base", &MToFType);
+     module_add_object(m, "FToM_base", &FToMType);
      module_add_object(m, "MToT_base", &MToTType);
      module_add_object(m, "FFTMain_base", &FFTMainType);
      module_add_object(m, "FFT_base", &FFTType);
@@@ -2438,6 -2526,19 +2526,22 @@@
      module_add_object(m, "STReverb_base", &STReverbType);
      module_add_object(m, "STRev_base", &STRevType);
      module_add_object(m, "Pointer2_base", &Pointer2Type);
++<<<<<<< HEAD
++=======
+     module_add_object(m, "Centroid_base", &CentroidType);
+     module_add_object(m, "AttackDetector_base", &AttackDetectorType);
+     module_add_object(m, "SmoothDelay_base", &SmoothDelayType);
+     module_add_object(m, "TrigBurster_base", &TrigBursterType);
+     module_add_object(m, "TrigBurst_base", &TrigBurstType);
+     module_add_object(m, "TrigBurstTapStream_base", &TrigBurstTapStreamType);
+     module_add_object(m, "TrigBurstAmpStream_base", &TrigBurstAmpStreamType);
+     module_add_object(m, "TrigBurstDurStream_base", &TrigBurstDurStreamType);
+     module_add_object(m, "TrigBurstEndStream_base", &TrigBurstEndStreamType);
+     module_add_object(m, "Scope_base", &ScopeType);
+     module_add_object(m, "PeakAmp_base", &PeakAmpType);
+     module_add_object(m, "MainParticle_base", &MainParticleType);
+     module_add_object(m, "Particle_base", &ParticleType);
++>>>>>>> upstream/0.7.4
  
      PyModule_AddStringConstant(m, "PYO_VERSION", PYO_VERSION);
  #ifdef COMPILE_EXTERNALS
diff --combined src/objects/fadermodule.c
index 98cf25b,bd6310e..738a0ba
--- a/src/objects/fadermodule.c
+++ b/src/objects/fadermodule.c
@@@ -29,6 -29,7 +29,7 @@@ typedef struct 
      pyo_audio_HEAD
      int modebuffer[2];
      int fademode;
+     int ended;
      MYFLT topValue;
      MYFLT attack;
      MYFLT release;
@@@ -52,12 -53,17 +53,21 @@@ Fader_generate_auto(Fader *self) 
      MYFLT val;
      int i;
  
+     if (self->ended == 1) {
+         Fader_internal_stop((Fader *)self);
+         return;
+     }
+ 
      for (i=0; i<self->bufsize; i++) {
          if (self->currentTime <= self->attack)
              val = self->currentTime / self->attack;
          else if (self->currentTime > self->duration) {
              val = 0.;
++<<<<<<< HEAD
 +            Fader_internal_stop((Fader *)self);
++=======
+             self->ended = 1;
++>>>>>>> upstream/0.7.4
          }
          else if (self->currentTime >= (self->duration - self->release))
              val = (self->duration - self->currentTime) / self->release;
@@@ -73,6 -79,11 +83,11 @@@ static voi
  Fader_generate_wait(Fader *self) {
      MYFLT val;
      int i;
+ 
+     if (self->fademode == 1 && self->currentTime > self->release) {
+         Fader_internal_stop((Fader *)self);
+         return;
+     }
      
      for (i=0; i<self->bufsize; i++) {
          if (self->fademode == 0) {
@@@ -92,8 -103,6 +107,6 @@@
          self->data[i] = val;
          self->currentTime += self->sampleToSec;    
      }
-     if (self->fademode == 1 && self->currentTime > self->release)
-         Fader_internal_stop((Fader *)self);
  }
  
  static void Fader_postprocessing_ii(Fader *self) { POST_PROCESSING_II };
@@@ -189,6 -198,7 +202,7 @@@ Fader_new(PyTypeObject *type, PyObject 
  	self->modebuffer[1] = 0;
      self->topValue = 0.0;
      self->fademode = 0;
+     self->ended = 0;
      self->attack = 0.01;
      self->release = 0.1;
      self->duration = 0.0;
@@@ -232,6 -242,7 +246,7 @@@ static PyObject * Fader_setDiv(Fader *s
  static PyObject * Fader_play(Fader *self, PyObject *args, PyObject *kwds) 
  {
      self->fademode = 0;
+     self->ended = 0;
      self->currentTime = 0.0;
      (*self->mode_func_ptr)(self);
      PLAY
diff --combined utils/E-Pyo.py
index 31f0b5f,dfb2ae7..af435fe
--- a/utils/E-Pyo.py
+++ b/utils/E-Pyo.py
@@@ -17,9 -17,11 +17,17 @@@ import __builtin_
  __builtin__.EPYO_APP_OPENED = True
          
  if sys.platform == "linux2":
++<<<<<<< HEAD
 +	WX_VERSION = '3.0'
 +	import wxversion
 +	wxversion.select(WX_VERSION)
++=======
+     import wxversion
+     if wxversion.checkInstalled("3.0"):
+         wxversion.select("3.0")
+     elif wxversion.checkInstalled("2.8"):
+         wxversion.select("2.8")
++>>>>>>> upstream/0.7.4
  
  import os, string, inspect, keyword, wx, codecs, subprocess, unicodedata
  import contextlib, StringIO, shutil, copy, pprint, random, time, threading
@@@ -31,7 -33,7 +39,11 @@@ import wx.lib.scrolledpanel as scrolle
  import wx.lib.dialogs
  import wx.combo
  import wx.stc  as stc
++<<<<<<< HEAD
 +import FlatNotebook as FNB
++=======
+ import wx.lib.agw.flatnotebook as FNB
++>>>>>>> upstream/0.7.4
  from pyo import *
  from PyoDoc import ManualFrame
  
@@@ -126,6 -128,7 +138,7 @@@ if not os.path.isfile(PREFERENCES_PATH)
      with open(PREFERENCES_PATH, "w") as f:
          f.write("epyo_prefs = {}")
  
+ epyo_prefs = {}
  with open(PREFERENCES_PATH, "r") as f:
      text = f.read()
  exec text in locals()
@@@ -414,9 -417,85 +427,85 @@@ if __name__ == "__main__"
      mainFrame.Show()
      app.MainLoop()
  '''
- TEMPLATE_NAMES = {93: "Header", 94: "Pyo", 95: "WxPython", 96: "Cecilia5", 97: "Zyne", 98: "Audio Interface"}
- TEMPLATE_DICT = {93: HEADER_TEMPLATE, 94: PYO_TEMPLATE, 95: WXPYTHON_TEMPLATE, 96: CECILIA5_TEMPLATE, 
-                 97: ZYNE_TEMPLATE, 98: AUDIO_INTERFACE_TEMPLATE}
+ 
+ RADIOPYO_TEMPLATE = '''#!/usr/bin/env python
+ # encoding: utf-8
+ """
+ Template for a RadioPyo song (version 1.0).
+ 
+ A RadioPyo song is a musical python script using the python-pyo 
+ module to create the audio processing chain. You can connect to
+ the radio here : http://radiopyo.acaia.ca/ 
+ 
+ There is only a few rules:
+     1 - It must be a one-page script.
+     2 - No soundfile, only synthesis.
+     3 - The script must be finite in time, with fade-in and fade-out 
+         to avoid clicks between pieces. Use the DURATION variable.
+ 
+ belangeo - 2014
+ 
+ """
+ from pyo import *
+ 
+ ################### USER-DEFINED VARIABLES ###################
+ ### READY is used to manage the server behaviour depending ###
+ ### of the context. Set this variable to True when the     ###
+ ### music is ready for the radio. TITLE and ARTIST are the ###
+ ### infos shown by the radio player. DURATION set the      ###
+ ### duration of the audio file generated for the streaming.###
+ ##############################################################
+ READY = False           # Set to True when ready for the radio
+ TITLE = "Song Title"    # The title of the music
+ ARTIST = "Artist Name"  # Your artist name
+ DURATION = 300          # The duration of the music in seconds
+ ##################### These are optional #####################
+ GENRE = "Electronic"    # Kind of your music, if there is any
+ DATE = 2014             # Year of creation
+ 
+ ####################### SERVER CREATION ######################
+ if READY:
+     s = Server(duplex=0, audio="offline").boot()
+     s.recordOptions(dur=DURATION, filename="radiopyo.ogg", fileformat=7)
+ else:
+     s = Server(duplex=0).boot()
+ 
+ 
+ ##################### PROCESSING SECTION #####################
+ # global volume (should be used to control the overall sound)
+ fade = Fader(fadein=0.001, fadeout=10, dur=DURATION).play()
+ 
+ 
+ ###
+ ### Insert your algorithms here...
+ ###
+ 
+ 
+ #################### START THE PROCESSING ###################
+ s.start()
+ if not READY:
+     s.gui(locals())
+ '''
+ 
+ TEMPLATE_NAMES = {98: "Header", 97: "Pyo", 96: "WxPython", 95: "Cecilia5", 94: "Zyne", 93: "Audio Interface", 92: "RadioPyo"}
+ TEMPLATE_DICT = {98: HEADER_TEMPLATE, 97: PYO_TEMPLATE, 96: WXPYTHON_TEMPLATE, 95: CECILIA5_TEMPLATE, 
+                 94: ZYNE_TEMPLATE, 93: AUDIO_INTERFACE_TEMPLATE, 92: RADIOPYO_TEMPLATE}
+ 
+ TEMPLATE_PATH = os.path.join(RESOURCES_PATH, "templates")
+ if not os.path.isdir(TEMPLATE_PATH):
+     os.mkdir(TEMPLATE_PATH)
+ 
+ templateid = 91
+ template_files = sorted([f for f in os.listdir(TEMPLATE_PATH) if f.endswith(".py")])   
+ for f in template_files:
+     try:
+         with open(os.path.join(TEMPLATE_PATH, f)) as ftemp:
+             ftext = ftemp.read()
+         TEMPLATE_NAMES[templateid] = f.replace(".py", "")
+         TEMPLATE_DICT[templateid] = ftext
+         templateid -= 1
+     except:
+         pass
  
  ################## BUILTIN KEYWORDS COMPLETION ##################
  FROM_COMP = ''' `module` import `*`
@@@ -652,7 -731,7 +741,7 @@@ KEY_COMMANDS = 
  "23. Alt + Shift + BACK": "Delete the word to the right of the caret",
  "24. Ctrl/Cmd + BACK": "Delete back from the current position to the start of the line",
  "25. Ctrl/Cmd + Shift + BACK": "Delete forwards from the current position to the end of the line",
- "26. TAB": "If selection is empty or all on one line replace the selection with a tab character. If more than one line selected, indent the lines. In the middle of a word, trig the AutoCompletion of pyo keywords. Just after a complete pyo keyword, insert its default arguments. Just after a complete python builtin keyword, insert a default structure snippet. Just after a variable name, representing a pyo object, followed by a dot, trig the AutoCompletion of the object's attributes.",
+ "26. TAB": "If selection is empty or all on one line replace the selection with a tab character. If more than one line selected, indent the lines. In the middle of a word, trig the AutoCompletion of pyo keywords. Just after an open brace following a pyo keyword, insert its default arguments. Just after a complete python builtin keyword, insert a default structure snippet. Just after a variable name, representing a pyo object, followed by a dot, trig the AutoCompletion of the object's attributes.",
  "27. Shift + TAB": "Dedent the selected lines",
  "28. Alt + 'C'": "Line Copy",
  "29. Alt + 'D'": "Line Duplicate",
@@@ -660,11 -739,13 +749,17 @@@
  "31. Alt + 'V'": "Line Paste",
  "32. Alt + CLICK + DRAG": "Rectangular selection",
  "33. Shit + Return": "Show the init line of a pyo object in a tooltip",
++<<<<<<< HEAD
 +"34. Ctrl/Cmd + Return": "Show the __doc__ string of a python object, module or function"
++=======
+ "34. Ctrl/Cmd + Return": "Show the __doc__ string of a python object, module or function",
+ "35. CLICK in the most left margin": "Add a marker to the corresponding line",
+ "36. Shift + CLICK on a marker": "Delete the marker"
++>>>>>>> upstream/0.7.4
  }
  
  ############## Allowed Extensions ##############
- ALLOWED_EXT = PREFERENCES.get("allowed_ext", ["py", "c5", "txt", "", "c", "h", "cpp", "hpp", "sh", "rst", "iss"])
+ ALLOWED_EXT = PREFERENCES.get("allowed_ext", ["py", "c5", "txt", "", "c", "h", "cpp", "hpp", "sh", "rst", "iss", "sg"])
  
  ############## Pyo keywords ##############
  tree = OBJECTS_TREE
@@@ -1848,7 -1929,7 +1943,7 @@@ class MainFrame(wx.Frame)
          menu1.Append(wx.ID_NEW, "New\tCtrl+N")
          self.Bind(wx.EVT_MENU, self.new, id=wx.ID_NEW)
          self.submenu1 = wx.Menu()
-         for key, name in sorted(TEMPLATE_NAMES.items()):
+         for key, name in sorted(TEMPLATE_NAMES.items(), reverse=True):
              self.submenu1.Append(key, "%s Template" % name)
          menu1.AppendMenu(99, "New From Template", self.submenu1)
          self.Bind(wx.EVT_MENU, self.newFromTemplate, id=min(TEMPLATE_NAMES.keys()), id2=max(TEMPLATE_NAMES.keys()))
@@@ -1884,6 -1965,8 +1979,11 @@@
          self.Bind(wx.EVT_MENU, self.save, id=wx.ID_SAVE)
          menu1.Append(wx.ID_SAVEAS, "Save As...\tShift+Ctrl+S")
          self.Bind(wx.EVT_MENU, self.saveas, id=wx.ID_SAVEAS)
++<<<<<<< HEAD
++=======
+         menu1.Append(100, "Save As Template...")
+         self.Bind(wx.EVT_MENU, self.saveasTemplate, id=100)
++>>>>>>> upstream/0.7.4
          # TODO : printing not working well enough
          #menu1.AppendSeparator()
          #menu1.Append(wx.ID_PREVIEW, "Print Preview")
@@@ -1936,16 -2019,20 +2036,20 @@@
          self.Bind(wx.EVT_MENU, self.foldExpandScope, id=105)
          menu2.Append(108, "Un/Comment Selection\tCtrl+J")
          self.Bind(wx.EVT_MENU, self.OnComment, id=108)
-         menu2.Append(114, "Show AutoCompletion\tCtrl+K")
-         self.Bind(wx.EVT_MENU, self.autoComp, id=114)
          menu2.Append(121, "Insert File Path...\tShift+Ctrl+P")
          self.Bind(wx.EVT_MENU, self.insertPath, id=121)
          menu2.AppendSeparator()
-         menu2.Append(170, "Convert Selection to Uppercase\tCtrl+U")
-         menu2.Append(171, "Convert Selection to Lowercase\tShift+Ctrl+U")
+         menu2.Append(114, "Auto Complete container syntax", kind=wx.ITEM_CHECK)
+         self.Bind(wx.EVT_MENU, self.autoCompContainer, id=114)
+         menu2.Check(114, PREFERENCES.get("auto_comp_container", 0))
+         menu2.AppendSeparator()
+         submenu2 = wx.Menu()
+         submenu2.Append(170, "Convert Selection to Uppercase\tCtrl+U")
+         submenu2.Append(171, "Convert Selection to Lowercase\tShift+Ctrl+U")
          self.Bind(wx.EVT_MENU, self.upperLower, id=170, id2=171)
-         menu2.Append(172, "Convert Tabs to Spaces")
+         submenu2.Append(172, "Convert Tabs to Spaces")
          self.Bind(wx.EVT_MENU, self.tabsToSpaces, id=172)
+         menu2.AppendMenu(-1, "Text Converters", submenu2)
          menu2.AppendSeparator()
          menu2.Append(140, "Goto line...\tCtrl+L")
          self.Bind(wx.EVT_MENU, self.gotoLine, id=140)
@@@ -2362,7 -2449,6 +2466,6 @@@
      def addMarker(self, evt):
          line = self.panel.editor.GetCurrentLine()
          self.panel.editor.addMarker(line)
-         self.panel.editor.addMarkerComment(line)
  
      def deleteMarker(self, evt):
          line = self.panel.editor.GetCurrentLine()
@@@ -2408,15 -2494,14 +2511,20 @@@
              self.panel.editor.FoldAll()
          else:
              self.panel.editor.ExpandAll()
++<<<<<<< HEAD
 +
 +    def foldExpandScope(self, evt):
 +        self.panel.editor.foldExpandCurrentScope()
++=======
++>>>>>>> upstream/0.7.4
  
-     def autoComp(self, evt):
-         try:
-             self.panel.editor.showAutoComp()
-         except AttributeError:
-             pass
+     def foldExpandScope(self, evt):
+         self.panel.editor.foldExpandCurrentScope()
+ 
+     def autoCompContainer(self, evt):
+         state = evt.GetInt()
+         PREFERENCES["auto_comp_container"] = state
+         self.panel.editor.showAutoCompContainer(state)
  
      def showFind(self, evt):
          self.panel.editor.OnShowFindReplace()
@@@ -2792,12 -2877,28 +2900,28 @@@
              PREFERENCES["save_file_path"] = os.path.split(path)[0]
          dlg.Destroy()
  
+     def saveasTemplate(self, event):
+         dlg = wx.TextEntryDialog(self, 'Give a name to your template:', 'Save file as template...')
+         if dlg.ShowModal() == wx.ID_OK:
+             fname = dlg.GetValue()
+             if not fname.endswith(".py"):
+                 fname = fname + ".py"
+             try:
+                 text = self.panel.editor.GetTextUTF8()
+             except:
+                 text = self.panel.editor.GetText()
+             with open(os.path.join(TEMPLATE_PATH, fname), "w") as f:
+                 f.write(text)
+         dlg.Destroy()
+ 
      def close(self, event):
          action = self.panel.editor.close()
          if action == 'delete':
+             self.panel.close_from_menu = True
              self.panel.deletePage()
          else:
              pass
+         self.panel.close_from_menu = False
  
      def closeAll(self, event):
          count = self.panel.notebook.GetPageCount()
@@@ -2896,6 -2997,7 +3020,7 @@@
          self.panel.editor.addText(s.getvalue())
  
      def startStopBackgroundServer(self, evt):
+         # TODO: need to add midi output driver
          if not self.back_server_started:
              outDriverIndex = -1
              preferedDriver = PREFERENCES.get("background_server_out_device", "")
@@@ -3082,6 -3184,7 +3207,7 @@@ class MainPanel(wx.Panel)
          wx.Panel.__init__(self, parent, size=size, style=wx.SUNKEN_BORDER)
  
          self.new_inc = 0
+         self.close_from_menu = False
          self.mainFrame = parent
          mainBox = wx.BoxSizer(wx.HORIZONTAL)
  
@@@ -3094,8 -3197,8 +3220,8 @@@
          self.project = ProjectTree(self.left_splitter, self, (-1, -1))
          self.markers = MarkersPanel(self.left_splitter, self, (-1, -1))
  
-         self.notebook = FNB.FlatNotebook(self.right_splitter, size=(-1,-1), 
-                         style=FNB.FNB_FF2|FNB.FNB_X_ON_TAB|FNB.FNB_NO_X_BUTTON|FNB.FNB_DROPDOWN_TABS_LIST|FNB.FNB_HIDE_ON_SINGLE_TAB)
+         self.notebook = FNB.FlatNotebook(self.right_splitter, size=(-1,-1))
+         self.notebook.SetAGWWindowStyleFlag(FNB.FNB_FF2|FNB.FNB_X_ON_TAB|FNB.FNB_NO_X_BUTTON|FNB.FNB_DROPDOWN_TABS_LIST|FNB.FNB_HIDE_ON_SINGLE_TAB)
          self.addNewPage()
          self.outputlog = OutputLogPanel(self.right_splitter, self, size=(-1,150))
  
@@@ -3107,8 -3210,8 +3233,8 @@@
          mainBox.Add(self.splitter, 1, wx.EXPAND)
          self.SetSizer(mainBox)
  
-         self.Bind(FNB.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.onPageChange)
-         self.Bind(FNB.EVT_FLATNOTEBOOK_PAGE_CLOSING, self.onClosingPage)
+         self.notebook.Bind(FNB.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.onPageChange)
+         self.notebook.Bind(FNB.EVT_FLATNOTEBOOK_PAGE_CLOSING, self.onClosingPage)
  
      def addNewPage(self):
          title = "Untitled-%i.py" % self.new_inc
@@@ -3163,7 -3266,10 +3289,10 @@@
              self.editor.setMarkers(copy.deepcopy(markers))
  
      def onClosingPage(self, evt):
-         action = self.editor.closeNoCancel()
+         if not self.close_from_menu:
+             action = self.editor.close()
+             if action == "keep":
+                 evt.Veto()
  
      def deletePage(self):
          select = self.notebook.GetSelection()
@@@ -3205,7 -3311,8 +3334,12 @@@
  
  #######################################################
  ### The idea of EditorPanel is to allow multiple views
++<<<<<<< HEAD
 +### at the same time in a single notebook page.
++=======
+ ### at the same time in a single notebook page. 
+ ### Also: A tree view of classes and functions of the file
++>>>>>>> upstream/0.7.4
  ### Not yet implemented... ( TODO )
  #######################################################
  class EditorPanel(wx.Panel):
@@@ -3243,6 -3350,8 +3377,8 @@@ class Editor(stc.StyledTextCtrl)
          self.markers_dict = {}
          self.current_marker = -1
          self.objs_attr_dict = {}
+         self.auto_comp_container = PREFERENCES.get("auto_comp_container", 0)
+ 
  
          self.alphaStr = string.lowercase + string.uppercase + '0123456789'
  
@@@ -3289,6 -3398,7 +3425,7 @@@
          self.SetMarginSensitive(2, True)
  
          self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
+         self.Bind(wx.EVT_CHAR, self.OnChar)
          self.Bind(stc.EVT_STC_UPDATEUI, self.OnUpdateUI)
          self.Bind(stc.EVT_STC_MARGINCLICK, self.OnMarginClick)
          self.Bind(wx.EVT_CLOSE, self.OnClose)
@@@ -3376,6 -3486,10 +3513,13 @@@
                          fline = fline.replace("/", " ")
                          last = fline.split()[-1]
                          ext = {"python": "py", "bash": "sh", "sh": "sh"}.get(last, "")
++<<<<<<< HEAD
++=======
+                     else:
+                         text = f.read()
+                         if "desc:" in text:
+                             ext = "jsfx"
++>>>>>>> upstream/0.7.4
              except:
                  pass
          if ext in ["py", "pyw", "c5"]:
@@@ -3397,7 -3511,7 +3541,7 @@@
              self.StyleSetSpec(stc.STC_P_OPERATOR, buildStyle('operator'))
              self.StyleSetSpec(stc.STC_P_IDENTIFIER, buildStyle('default'))
              self.StyleSetSpec(stc.STC_P_COMMENTBLOCK, buildStyle('commentblock'))
 -        elif ext in ["c", "cc", "cpp", "cxx", "cs", "h", "hh", "hpp", "hxx"]:
 +        elif ext in ["c", "cc", "cpp", "cxx", "cs", "h", "hh", "hpp", "hxx", "jsfx-inc"]:
              self.SetLexer(stc.STC_LEX_CPP)
              self.SetStyleBits(self.GetStyleBitsNeeded())
              self.SetProperty('fold.comment', '1')
@@@ -3435,6 -3549,42 +3579,42 @@@
              self.StyleSetSpec(stc.STC_SH_IDENTIFIER, buildStyle('default'))
              self.StyleSetSpec(stc.STC_SH_PARAM, buildStyle('default'))
              self.StyleSetSpec(stc.STC_SH_SCALAR, buildStyle('function'))
+         elif ext in ["jsfx", "jsfx-inc"]:
+             self.SetLexer(stc.STC_LEX_CPP)
+             self.SetStyleBits(self.GetStyleBitsNeeded())
+             self.SetProperty('fold.comment', '1')
+             self.SetProperty('fold.preprocessor', '1')
+             self.SetProperty('fold.compact', '1')
+             self.SetProperty('styling.within.preprocessor', '0')
+             self.SetKeyWords(1, "abs acos asin atan atan2 atexit ceil convolve_c cos defer eval exp fclose feof fflush \
+                                  fft fft_ipermute fft_permute fgetc floor fopen fprintf fread freembuf fseek ftell fwrite \
+                                  gfx_aaaaa gfx_arc gfx_blit gfx_blit gfx_blitext gfx_blurto gfx_circle gfx_deltablit \
+                                  gfx_drawchar gfx_drawnumber gfx_drawstr gfx_getchar gfx_getfont gfx_getimgdim gfx_getpixel \
+                                  gfx_gradrect gfx_init gfx_line gfx_lineto gfx_loadimg gfx_measurestr gfx_muladdrect gfx_printf \
+                                  gfx_quit gfx_rect gfx_rectto gfx_roundrect gfx_setfont gfx_setimgdim gfx_setpixel gfx_transformblit \
+                                  gfx_update ifft invsqrt log log10 match matchi max memcpy memset min pow printf rand sign sin sleep \
+                                  sprintf sqr sqrt stack_exch stack_peek stack_pop stack_push str_delsub str_getchar str_insert \
+                                  str_setchar str_setlen strcat strcmp strcpy strcpy_from strcpy_substr stricmp strlen strncat strncmp \
+                                  strncpy strnicmp tan tcp_close tcp_connect tcp_listen tcp_listen_end tcp_recv tcp_send tcp_set_block \
+                                  time time_precise")
+             self.SetKeyWords(0, "loop while function local static instance this global globals _global gfx_r gfx_g gfx_b gfx_a gfx_w \
+                                  gfx_h gfx_x gfx_y gfx_mode gfx_clear gfx_dest gfx_texth mouse_x mouse_y mouse_cap mouse_wheel mouse_hwheel \
+                                  @init @slider @sample @block @serialize @gfx import desc slider1 slider2 slider3 slider4 slider5 \
+                                  slider6 slider7 slider8 slider9 slider10 slider11 slider12 slider13 slider14 slider15 slider16 in_pin \
+                                  out_pin filename ")
+             self.StyleSetSpec(stc.STC_C_DEFAULT, buildStyle('default'))
+             self.StyleSetSpec(stc.STC_C_COMMENT, buildStyle('comment'))
+             self.StyleSetSpec(stc.STC_C_COMMENTDOC, buildStyle('comment'))
+             self.StyleSetSpec(stc.STC_C_COMMENTLINE, buildStyle('comment'))
+             self.StyleSetSpec(stc.STC_C_COMMENTLINEDOC, buildStyle('comment'))
+             self.StyleSetSpec(stc.STC_C_NUMBER, buildStyle('number'))
+             self.StyleSetSpec(stc.STC_C_STRING, buildStyle('string'))
+             self.StyleSetSpec(stc.STC_C_CHARACTER, buildStyle('string'))
+             self.StyleSetSpec(stc.STC_C_WORD, buildStyle('keyword'))
+             self.StyleSetSpec(stc.STC_C_WORD2, buildStyle('pyokeyword'))
+             self.StyleSetSpec(stc.STC_C_OPERATOR, buildStyle('operator'))
+             self.StyleSetSpec(stc.STC_C_IDENTIFIER, buildStyle('default'))
+             self.StyleSetSpec(stc.STC_C_PREPROCESSOR, buildStyle('commentblock'))
  
          self.SetEdgeColour(STYLES["lineedge"]['colour'])
          self.SetCaretForeground(STYLES['caret']['colour'])
@@@ -3487,41 -3637,47 +3667,56 @@@
                  wx.wxEVT_COMMAND_FIND_REPLACE : "REPLACE",
                  wx.wxEVT_COMMAND_FIND_REPLACE_ALL : "REPLACE_ALL" }
  
-         et = evt.GetEventType()
+         evtType = evt.GetEventType()
          findTxt = evt.GetFindString()
+         newTxt = evt.GetReplaceString()
+         findStrLen = len(findTxt)
+         newStrLen = len(newTxt)
+         diffLen = newStrLen - findStrLen
  
          selection = self.GetSelection()
          if selection[0] == selection[1]:
              selection = (0, self.GetLength())
  
-         if map[et] == 'FIND':
+         if map[evtType] == 'FIND':
              startpos = self.FindText(selection[0], selection[1], findTxt, evt.GetFlags())
              endpos = startpos+len(findTxt)
              self.anchor1 = endpos
              self.anchor2 = selection[1]
              self.SetSelection(startpos, endpos)
-         elif map[et] == 'FIND_NEXT':
+         elif map[evtType] == 'FIND_NEXT':
              startpos = self.FindText(self.anchor1, self.anchor2, findTxt, evt.GetFlags())
              endpos = startpos+len(findTxt)
              self.anchor1 = endpos
              self.SetSelection(startpos, endpos)
-         elif map[et] == 'REPLACE':
-             startpos = self.FindText(selection[0], selection[1], findTxt)
-             endpos = startpos+len(findTxt)
+         elif map[evtType] == 'REPLACE':
+             startpos = self.FindText(selection[0], selection[1], findTxt, evt.GetFlags())
              if startpos != -1:
+                 endpos = startpos+len(findTxt)
                  self.SetSelection(startpos, endpos)
-                 self.ReplaceSelection(evt.GetReplaceString())
-         elif map[et] == 'REPLACE_ALL':
-             self.anchor1 = selection[0]
+                 self.ReplaceSelection(newTxt)
+                 self.anchor1 = startpos + newStrLen + 1
+                 self.anchor2 += diffLen
+         elif map[evtType] == 'REPLACE_ALL':
+             self.anchor1 = startpos = selection[0]
              self.anchor2 = selection[1]
-             startpos = selection[0]
              while startpos != -1:
++<<<<<<< HEAD
 +                startpos = self.FindText(self.anchor1, self.anchor2, findTxt)
 +                if startpos != -1:
 +                    endpos = startpos+len(findTxt)
 +                    self.SetSelection(startpos, endpos)
 +                    self.ReplaceSelection(evt.GetReplaceString())
 +                    self.anchor1 = endpos + 1
++=======
+                 startpos = self.FindText(self.anchor1, self.anchor2, findTxt, evt.GetFlags())
+                 if startpos != -1:
+                     endpos = startpos+len(findTxt)
+                     self.SetSelection(startpos, endpos)
+                     self.ReplaceSelection(newTxt)
+                     self.anchor1 = startpos + newStrLen + 1
+                     self.anchor2 += diffLen
++>>>>>>> upstream/0.7.4
          line = self.GetCurrentLine()
          halfNumLinesOnScreen = self.LinesOnScreen() / 2
          self.ScrollToLine(line - halfNumLinesOnScreen)
@@@ -3583,30 -3739,6 +3778,6 @@@
              for line in lines:
                  f.write("%s=%s\n" % (line[0], line[1]))
  
-     def closeNoCancel(self):
-         if self.GetModify():
-             if not self.path: f = "Untitled"
-             else: f = self.path
-             dlg = wx.MessageDialog(None, 'file ' + f + ' has been modified. Do you want to save?', 
-                                    'Warning!', wx.YES | wx.NO)
-             but = dlg.ShowModal()
-             if but == wx.ID_YES:
-                 dlg.Destroy()
-                 if not self.path or "Untitled-" in self.path:
-                     dlg2 = wx.FileDialog(None, message="Save file as ... (the file will be closed even if you pressed Cancel!)", defaultDir=os.getcwd(), 
-                                          defaultFile="", style=wx.SAVE|wx.FD_OVERWRITE_PROMPT)
-                     dlg2.SetFilterIndex(0)
-                     if dlg2.ShowModal() == wx.ID_OK:
-                         path = dlg2.GetPath()
-                         self.SaveFile(path)
-                         dlg2.Destroy()
-                     else:
-                         dlg2.Destroy()
-                 else:
-                     self.SaveFile(self.path)
-             elif but == wx.ID_NO:
-                 dlg.Destroy()
- 
      def close(self):
          if self.GetModify():
              if not self.path: f = "Untitled"
@@@ -3726,6 -3858,9 +3897,9 @@@
          currentword = self.GetTextRangeUTF8(startpos, endpos)
          return currentword
  
+     def showAutoCompContainer(self, state):
+         self.auto_comp_container = state
+         
      def showAutoComp(self):
          propagate = True
          charBefore = " "
@@@ -3743,15 -3878,27 +3917,27 @@@
                  propagate = False
          return propagate
  
-     def insertDefArgs(self, currentword):
+     def insertDefArgs(self, currentword, charat):
          propagate = True
+         braceend = True
+         currentword = ""
+         if charat == ord("("):
+             pos = self.GetCurrentPos()
+             if chr(self.GetCharAt(pos)) == ')':
+                 braceend = False
+             startpos = self.WordStartPosition(pos-2, True)
+             endpos = self.WordEndPosition(pos-2, True)
+             currentword = self.GetTextRangeUTF8(startpos, endpos)
          for word in PYO_WORDLIST:
              if word == currentword:
                  text = class_args(eval(word)).replace(word, "")
                  self.args_buffer = text.replace("(", "").replace(")", "").split(",")
                  self.args_buffer = [arg.strip() for arg in self.args_buffer]
                  self.args_line_number = [self.GetCurrentLine(), self.GetCurrentLine()+1]
-                 self.insertText(self.GetCurrentPos(), text, False)
+                 if braceend:
+                     self.insertText(self.GetCurrentPos(), text[1:], False)
+                 else:
+                     self.insertText(self.GetCurrentPos(), text[1:-1], False)
                  self.selection = self.GetSelectedText()
                  wx.CallAfter(self.navigateArgs)
                  propagate = False
@@@ -3891,7 -4038,7 +4077,7 @@@
      def processTab(self, currentword, autoCompActive, charat, pos):
          propagate = self.showAutoComp()
          if propagate:
-             propagate = self.insertDefArgs(currentword)
+             propagate = self.insertDefArgs(currentword, charat)
              if propagate:
                  propagate = self.checkForBuiltinComp()
                  if propagate:
@@@ -3935,31 -4082,35 +4121,56 @@@
              dlg.ShowModal()
          except:
              pass
++<<<<<<< HEAD
 +
 +    def navigateMarkers(self, down=True):
 +        if self.markers_dict != {}:
 +            llen = len(self.markers_dict)
 +            keys = sorted(self.markers_dict.keys())
 +            if down:
 +                self.current_marker += 1
 +            else:
 +                self.current_marker -= 1
 +            if self.current_marker < 0:
 +                self.current_marker = llen - 1
 +            elif self.current_marker >= llen:
 +                self.current_marker = 0
 +            line = keys[self.current_marker]
 +            self.GotoLine(line)
 +            halfNumLinesOnScreen = self.LinesOnScreen() / 2
 +            self.ScrollToLine(line - halfNumLinesOnScreen)
 +            self.GetParent().GetParent().GetParent().GetParent().markers.setSelected(self.current_marker)
++=======
++>>>>>>> upstream/0.7.4
+ 
+     def OnChar(self, evt):
+         propagate = True
+ 
+         if chr(evt.GetKeyCode()) in ['[', '{', '(', '"', '`'] and self.auto_comp_container:
+             if chr(evt.GetKeyCode()) == '[':
+                 self.AddText('[]')
+             elif chr(evt.GetKeyCode()) == '{':
+                 self.AddText('{}')
+             elif chr(evt.GetKeyCode()) == '(':
+                 self.AddText('()')
+             elif chr(evt.GetKeyCode()) == '"':
+                 self.AddText('""')
+             elif chr(evt.GetKeyCode()) == '`':
+                 self.AddText('``')
+             self.CharLeft()
+             propagate = False
  
+         if propagate:
+             evt.Skip()
+         else:
+             evt.StopPropagation()
+         
      def OnKeyDown(self, evt):
          if PLATFORM == "darwin":
              ControlDown = evt.CmdDown
          else:
              ControlDown = evt.ControlDown
- 
+         
          propagate = True
          # Stop propagation on markers navigation --- Shift+Ctrl+Arrows up/down
          if evt.GetKeyCode() in [wx.WXK_DOWN,wx.WXK_UP] and evt.ShiftDown() and ControlDown():
@@@ -4126,6 -4277,7 +4337,7 @@@
          #         pos = self.GetLineEndPosition(i)
          #         if self.GetCharAt(pos-1) != 172:
          #             self.InsertTextUTF8(pos, "¬")
+         self.moveMarkers()
          self.checkScrollbar()
          self.OnModified()
          evt.Skip()
@@@ -4153,60 -4305,83 +4365,83 @@@
                  self.GotoPos(pos+1)
                  self.DelWordLeft()
  
+     def navigateMarkers(self, down=True):
+         if self.markers_dict != {}:
+             llen = len(self.markers_dict)
+             swap = [(x[1], x[0]) for x in self.markers_dict.items()]
+             handles = [x[1] for x in sorted(swap)]
+             if down:
+                 self.current_marker += 1
+             else:
+                 self.current_marker -= 1
+             if self.current_marker < 0:
+                 self.current_marker = llen - 1
+             elif self.current_marker >= llen:
+                 self.current_marker = 0
+             handle = handles[self.current_marker]
+             line = self.markers_dict[handle][0]
+             self.GotoLine(line)
+             halfNumLinesOnScreen = self.LinesOnScreen() / 2
+             self.ScrollToLine(line - halfNumLinesOnScreen)
+             self.GetParent().GetParent().GetParent().GetParent().markers.setSelected(handle)
+ 
      def setMarkers(self, dic):
+         try:
+             key = dic.keys()[0]
+         except:
+             return
+         if type(dic[key]) != ListType:
+             return
          self.markers_dict = dic
-         for line in self.markers_dict.keys():
+         for handle in self.markers_dict.keys():
+             line = self.markers_dict[handle][0]
              self.MarkerAdd(line, 0)
          self.GetParent().GetParent().GetParent().GetParent().markers.setDict(self.markers_dict)
  
-     def addMarker(self, line):
-         if line not in self.markers_dict.keys():
-             self.MarkerAdd(line, 0)
-             self.markers_dict[line] = ""
+     def moveMarkers(self):
+         dict = {}
+         for handle in self.markers_dict.keys():
+             line = self.MarkerLineFromHandle(handle)
+             comment = self.markers_dict[handle][1]
+             dict[handle] = [line, comment]
+         if dict != self.markers_dict:
+             self.markers_dict = dict
              self.GetParent().GetParent().GetParent().GetParent().markers.setDict(self.markers_dict)
-             return True
+             
+     def addMarker(self, line):
+         if not self.MarkerGet(line):
+             handle = self.MarkerAdd(line, 0)
+             self.markers_dict[handle] = [line, ""]            
+         comment = ""
+         dlg = wx.TextEntryDialog(self, 'Enter a comment for that marker:', 'Marker Comment')
+         if dlg.ShowModal() == wx.ID_OK:
+             comment = dlg.GetValue()
+             dlg.Destroy()
          else:
-             return False
+             dlg.Destroy()
+             return
+         self.markers_dict[handle][1] = comment
+         self.GetParent().GetParent().GetParent().GetParent().markers.setDict(self.markers_dict)
  
      def deleteMarker(self, line):
-         if line in self.markers_dict.keys():
-             del self.markers_dict[line]
-             self.MarkerDelete(line, 0)
-             self.GetParent().GetParent().GetParent().GetParent().markers.setDict(self.markers_dict)
+         for handle in self.markers_dict.keys():
+             if line == self.markers_dict[handle][0]:
+                 del self.markers_dict[handle]
+                 self.MarkerDeleteHandle(handle)
+                 self.GetParent().GetParent().GetParent().GetParent().markers.setDict(self.markers_dict)
  
      def deleteAllMarkers(self):
          self.markers_dict = {}
          self.MarkerDeleteAll(0)
          self.GetParent().GetParent().GetParent().GetParent().markers.setDict(self.markers_dict)
  
-     def addMarkerComment(self, line):
-         if line in self.markers_dict.keys():
-             comment = ""
-             dlg = wx.TextEntryDialog(self, 'Enter a comment for that marker:', 'Marker Comment')
-             if dlg.ShowModal() == wx.ID_OK:
-                 comment = dlg.GetValue()
-                 dlg.Destroy()
-             else:
-                 dlg.Destroy()
-                 return
-             self.markers_dict[line] = comment
-             self.GetParent().GetParent().GetParent().GetParent().markers.setDict(self.markers_dict)
- 
      def OnMarginClick(self, evt):
          if evt.GetMargin() == 0:
-             if PLATFORM == "darwin":
-                 modif = evt.GetAlt
-             else:
-                 modif = evt.GetControl
              lineClicked = self.LineFromPosition(evt.GetPosition())
-             if modif():
+             if evt.GetShift():
                  self.deleteMarker(lineClicked)
-             elif evt.GetShift():
-                 self.addMarkerComment(lineClicked)
              else:
-                 ok = self.addMarker(lineClicked)
-                 if ok:
-                     self.addMarkerComment(lineClicked)
+                 self.addMarker(lineClicked)
          elif evt.GetMargin() == 2:
              if evt.GetShift() and evt.GetControl():
                  self.ToggleFoldAll()
@@@ -4227,19 -4402,19 +4462,35 @@@
                  if lastChild > lineNum:
                      self.HideLines(lineNum+1, lastChild)
              lineNum = lineNum + 1
++<<<<<<< HEAD
 +
 +    def ExpandAll(self):
 +        lineCount = self.GetLineCount()
 +        lineNum = 0
 +        while lineNum < lineCount:
 +            level = self.GetFoldLevel(lineNum)
 +            if level & stc.STC_FOLDLEVELHEADERFLAG and \
 +               (level & stc.STC_FOLDLEVELNUMBERMASK) == stc.STC_FOLDLEVELBASE:
 +                self.SetFoldExpanded(lineNum, True)
 +                lineNum = self.Expand(lineNum, True)
 +                lineNum = lineNum - 1
 +            lineNum = lineNum + 1
 +
++=======
+ 
+     def ExpandAll(self):
+         lineCount = self.GetLineCount()
+         lineNum = 0
+         while lineNum < lineCount:
+             level = self.GetFoldLevel(lineNum)
+             if level & stc.STC_FOLDLEVELHEADERFLAG and \
+                (level & stc.STC_FOLDLEVELNUMBERMASK) == stc.STC_FOLDLEVELBASE:
+                 self.SetFoldExpanded(lineNum, True)
+                 lineNum = self.Expand(lineNum, True)
+                 lineNum = lineNum - 1
+             lineNum = lineNum + 1
+ 
++>>>>>>> upstream/0.7.4
      def ToggleFoldAll(self):
          lineCount = self.GetLineCount()
          expanding = True
@@@ -4838,16 -5013,18 +5089,18 @@@ class MarkersListScroll(scrolled.Scroll
      def setDict(self, dic):
          self.row_dict = dic
          self.box.Clear(True)
-         for i, key in enumerate(sorted(self.row_dict.keys())):
+         swap = [(x[1], x[0]) for x in self.row_dict.items()]
+         handles = [x[1] for x in sorted(swap)]
+         for i in handles:
              label = wx.StaticBitmap(self, wx.ID_ANY)
              label.SetBitmap(self.arrow_bit)
-             self.box.Add(label, 0, wx.LEFT|wx.ALIGN_CENTER_VERTICAL, 2, userData=(i,key))
-             line = wx.StaticText(self, wx.ID_ANY, label=str(key+1))
+             self.box.Add(label, 0, wx.LEFT|wx.ALIGN_CENTER_VERTICAL, 2, userData=(i,self.row_dict[i][0]))
+             line = wx.StaticText(self, wx.ID_ANY, label=str(self.row_dict[i][0]+1))
              line.SetFont(self.font)
-             self.box.Add(line, 0, wx.ALIGN_LEFT|wx.TOP, 3, userData=(i,key))
-             comment = wx.StaticText(self, wx.ID_ANY, label=self.row_dict[key])
+             self.box.Add(line, 0, wx.ALIGN_LEFT|wx.TOP, 3, userData=(i,self.row_dict[i][0]))
+             comment = wx.StaticText(self, wx.ID_ANY, label=self.row_dict[i][1])
              comment.SetFont(self.font)
-             self.box.Add(comment, 1, wx.EXPAND|wx.ALIGN_LEFT|wx.TOP, 3, userData=(i,key))
+             self.box.Add(comment, 1, wx.EXPAND|wx.ALIGN_LEFT|wx.TOP, 3, userData=(i,self.row_dict[i][0]))
              self.box.Layout()
              label.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
              line.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
@@@ -4870,13 -5047,14 +5123,14 @@@
                      halfNumLinesOnScreen = editor.LinesOnScreen() / 2
                      editor.ScrollToLine(line - halfNumLinesOnScreen)
                  else:
-                     line = sorted(self.row_dict.keys())[self.selected]
+                     line = self.row_dict[self.selected][0]
                      self.selected2 = item.GetUserData()[0]
                      line2 = item.GetUserData()[1]
-                     editor.GotoLine(line)
+                     l1, l2 = min(line, line2), max(line, line2)
+                     editor.GotoLine(l1)
                      halfNumLinesOnScreen = editor.LinesOnScreen() / 2
-                     editor.ScrollToLine(line - halfNumLinesOnScreen)
-                     editor.SetSelection(editor.PositionFromLine(line), editor.PositionFromLine(line2+1))
+                     editor.ScrollToLine(l1 - halfNumLinesOnScreen)
+                     editor.SetSelection(editor.PositionFromLine(l1), editor.PositionFromLine(l2+1))
                  break
          self.setColour()
  
diff --combined utils/info.plist
index b9d9054,0abb41b..c22e5d2
--- a/utils/info.plist
+++ b/utils/info.plist
@@@ -32,17 -32,17 +32,29 @@@
  	<key>CFBundleIdentifier</key>
  	<string>org.pythonmac.unspecified.E-Pyo</string>
  	<key>CFBundleInfoDictionaryVersion</key>
++<<<<<<< HEAD
 +	<string>0.7.0</string>
++=======
+ 	<string>0.7.4</string>
++>>>>>>> upstream/0.7.4
  	<key>CFBundleName</key>
  	<string>E-Pyo</string>
  	<key>CFBundlePackageType</key>
  	<string>APPL</string>
  	<key>CFBundleShortVersionString</key>
++<<<<<<< HEAD
 +	<string>0.7.0</string>
 +	<key>CFBundleSignature</key>
 +	<string>????</string>
 +	<key>CFBundleVersion</key>
 +	<string>0.7.0</string>
++=======
+ 	<string>0.7.4</string>
+ 	<key>CFBundleSignature</key>
+ 	<string>????</string>
+ 	<key>CFBundleVersion</key>
+ 	<string>0.7.4</string>
++>>>>>>> upstream/0.7.4
  	<key>LSHasLocalizedDisplayName</key>
  	<false/>
  	<key>NSAppleScriptEnabled</key>

-- 
python-pyo packaging



More information about the pkg-multimedia-commits mailing list