[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