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

tiago at users.alioth.debian.org tiago at users.alioth.debian.org
Tue Jul 28 21:43:19 UTC 2015


The following commit has been merged in the master branch:
commit a9ea54317bc30bcf207bd15b9740044e0a979106
Author: Tiago Bortoletto Vaz <tiago at debian.org>
Date:   Tue Jul 28 17:42:17 2015 -0400

    Imported Upstream version 0.7.6

diff --git a/ChangeLog b/ChangeLog
index 0a20360..73619a4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,63 @@
 -------------------------------------------------------------------------------------
+
+2015-07-27 belangeo <belangeo at gmail.com>
+
+    * Final revision for version 0.7.6.
+    - rev 1335
+
+2015-07-24 belangeo <belangeo at gmail.com>
+
+    * Release tag: 0.7.6.
+    - rev 1333
+
+2015-07-24 belangeo <belangeo at gmail.com>
+
+    * Added missing types to OscDataSend and OscDataReceive (char, blob, True, 
+    False, None and MIDI packet).
+    - rev 1332
+
+2015-07-21 belangeo <belangeo at gmail.com>
+
+    * Fixed Centroid output with silence as input.
+    - rev 1330
+
+2015-07-21 belangeo <belangeo at gmail.com>
+
+    * Added new objet: RawMidi, a raw Midi handler.
+    - rev 1329
+
+2015-07-21 belangeo <belangeo at gmail.com>
+
+    * Added pyoArgsAssert call in each object's methods.
+    - rev 1320, 1325, 1327, 1328
+
+2015-07-20 belangeo <belangeo at gmail.com>
+
+    * Fixed the "segmentation fault" that occur sometimes when deleting an object.
+    - rev 1326
+    
+2015-05-31 belangeo <belangeo at gmail.com>
+
+    * E-Pyo: Fixed project tree.
+    - rev 1315
+
+2015-05-29 belangeo <belangeo at gmail.com>
+
+    * E-Pyo: stderr now prints to the output panel.
+    - rev 1314
+ 
+2015-05-25 belangeo <belangeo at gmail.com>
+
+    * E-Pyo: Added code block selection (#--> and #<-- are delimiters). 
+    The background server now prints to the output panel.
+    - rev 1313
+
+2015-04-29 belangeo <belangeo at gmail.com>
+
+    * Fixed CPU usage of PeakAmp.
+    - rev 1312
+
+-------------------------------------------------------------------------------------
 2015-03-05 belangeo <belangeo at gmail.com>
 
     * Fixed crash when portaudio stream is stopped on OSX (created when fixed
diff --git a/doc-sphinx/source/api/alphabetical.rst b/doc-sphinx/source/api/alphabetical.rst
index b61616d..ad48bdc 100644
--- a/doc-sphinx/source/api/alphabetical.rst
+++ b/doc-sphinx/source/api/alphabetical.rst
@@ -180,6 +180,7 @@ Alphabetical class reference
 - :py:class:`RandInt` :     Periodic pseudo-random integer generator.
 - :py:class:`Randh` :     Periodic pseudo-random generator.
 - :py:class:`Randi` :     Periodic pseudo-random generator with interpolation.
+- :py:class:`RawMidi` :     Raw Midi handler.
 - :py:class:`Record` :     Writes input sound in an audio file on the disk.
 - :py:class:`Reson` :     A second-order resonant bandpass filter.
 - :py:class:`Resonx` :     A multi-stages second-order resonant bandpass filter.
@@ -254,7 +255,7 @@ Alphabetical class reference
 - :py:class:`Vectral` :     Performs magnitude smoothing between successive frames.
 - :py:class:`Vocoder` :     Applies the spectral envelope of a first sound to the spectrum of a second sound.
 - :py:class:`VoiceManager` :     Polyphony voice manager.
-- :py:class:`WGVerb` :     8 delay line mono FDN reverb.
+- :py:class:`WGVerb` :     8 delay lines mono FDN reverb.
 - :py:class:`Waveguide` :     Basic waveguide model.
 - :py:class:`WinTable` :     Generates different kind of windowing functions.
 - :py:class:`Wrap` :     Wraps-around the signal that exceeds the `min` and `max` thresholds.
diff --git a/doc-sphinx/source/api/classes/midi.rst b/doc-sphinx/source/api/classes/midi.rst
index bb7dc1d..094c588 100644
--- a/doc-sphinx/source/api/classes/midi.rst
+++ b/doc-sphinx/source/api/classes/midi.rst
@@ -64,3 +64,8 @@ used as controls and can't be sent to the output soundcard.
 .. autoclass:: Touchin
    :members:
 
+*RawMidi*
+-----------------------------------
+
+.. autoclass:: RawMidi
+   :members:
diff --git a/doc-sphinx/source/index.rst b/doc-sphinx/source/index.rst
index 548d84b..c2c953b 100644
--- a/doc-sphinx/source/index.rst
+++ b/doc-sphinx/source/index.rst
@@ -3,7 +3,7 @@
    You can adapt this file completely to your liking, but it should at least
    contain the root `toctree` directive.
 
-Welcome to the Pyo 0.7.5 documentation
+Welcome to the Pyo 0.7.6 documentation
 ===================================================
 
 .. toctree::
diff --git a/embedded/puredata/m_pd.h b/embedded/puredata/m_pd.h
deleted file mode 100755
index 71bd28e..0000000
--- a/embedded/puredata/m_pd.h
+++ /dev/null
@@ -1,665 +0,0 @@
-/* Copyright (c) 1997-1999 Miller Puckette.
-* For information on usage and redistribution, and for a DISCLAIMER OF ALL
-* WARRANTIES, see the file, "LICENSE.txt," in this distribution.  */
-
-#ifndef __m_pd_h_
-
-#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus)
-extern "C" {
-#endif
-
-#define PD_MAJOR_VERSION 0
-#define PD_MINOR_VERSION 41
-#define PD_BUGFIX_VERSION 4
-#define PD_TEST_VERSION "extended"
-
-/* old name for "MSW" flag -- we have to take it for the sake of many old
-"nmakefiles" for externs, which will define NT and not MSW */
-#if defined(NT) && !defined(MSW)
-#define MSW
-#endif
-
-/* These pragmas are only used for MSVC, not MinGW or Cygwin <hans at at.or.at> */
-#ifdef _MSC_VER
-/* #pragma warning( disable : 4091 ) */
-#pragma warning( disable : 4305 )  /* uncast const double to float */
-#pragma warning( disable : 4244 )  /* uncast float/int conversion etc. */
-#pragma warning( disable : 4101 )  /* unused automatic variables */
-#endif /* _MSC_VER */
-
-    /* the external storage class is "extern" in UNIX; in MSW it's ugly. */
-#ifdef MSW
-#ifdef PD_INTERNAL
-#define EXTERN __declspec(dllexport) extern
-#else
-#define EXTERN __declspec(dllimport) extern
-#endif /* PD_INTERNAL */
-#else
-#define EXTERN extern
-#endif /* MSW */
-
-    /* and depending on the compiler, hidden data structures are
-    declared differently: */
-#if defined( __GNUC__) || defined( __BORLANDC__ ) || defined( __MWERKS__ )
-#define EXTERN_STRUCT struct
-#else
-#define EXTERN_STRUCT extern struct
-#endif
-
-
-#if !defined(_SIZE_T) && !defined(_SIZE_T_)
-#include <stddef.h>     /* just for size_t -- how lame! */
-#endif
-
-#define MAXPDSTRING 1000        /* must be >= FILENAME_MAX */
-#define MAXPDARG 5              /* max number of args we can typecheck today */
-
-/* signed and unsigned integer types the size of a pointer:  */
-/* GG: long is the size of a pointer */
-typedef long t_int;
-
-typedef float t_float;  /* a floating-point number at most the same size */
-typedef float t_floatarg;  /* floating-point type for function calls */
-
-typedef struct _symbol
-{
-    char *s_name;
-    struct _class **s_thing;
-    struct _symbol *s_next;
-} t_symbol;
-
-EXTERN_STRUCT _array;
-#define t_array struct _array       /* g_canvas.h */
-
-/* pointers to glist and array elements go through a "stub" which sticks
-around after the glist or array is freed.  The stub itself is deleted when
-both the glist/array is gone and the refcount is zero, ensuring that no
-gpointers are pointing here. */
-
-#define GP_NONE 0       /* the stub points nowhere (has been cut off) */
-#define GP_GLIST 1      /* the stub points to a glist element */
-#define GP_ARRAY 2      /* ... or array */
-
-typedef struct _gstub
-{
-    union
-    {
-        struct _glist *gs_glist;    /* glist we're in */
-        struct _array *gs_array;    /* array we're in */
-    } gs_un;
-    int gs_which;                   /* GP_GLIST/GP_ARRAY */
-    int gs_refcount;                /* number of gpointers pointing here */
-} t_gstub;
-
-typedef struct _gpointer           /* pointer to a gobj in a glist */
-{
-    union
-    {   
-        struct _scalar *gp_scalar;  /* scalar we're in (if glist) */
-        union word *gp_w;           /* raw data (if array) */
-    } gp_un;
-    int gp_valid;                   /* number which must match gpointee */
-    t_gstub *gp_stub;               /* stub which points to glist/array */
-} t_gpointer;
-
-#define PD_BLOBS 1 /* MP20070211 Use this to test for blob capability */
-/* MP20061223 blob type: */
-typedef struct _blob /* pointer to a blob */
-{
-   unsigned long s_length; /* length of blob in bytes */
-   unsigned char *s_data; /* pointer to 1st byte of blob */
-} t_blob;
-/* ...MP20061223 blob type */
-
-
-typedef union word
-{
-    t_float w_float;
-    t_symbol *w_symbol;
-    t_gpointer *w_gpointer;
-    t_array *w_array;
-    struct _glist *w_list;
-    int w_index;
-    t_blob *w_blob; /* MP20061223 blob type */
-} t_word;
-
-typedef enum
-{
-    A_NULL,
-    A_FLOAT,
-    A_SYMBOL,
-    A_POINTER,
-    A_SEMI,
-    A_COMMA,
-    A_DEFFLOAT,
-    A_DEFSYM,
-    A_DOLLAR, 
-    A_DOLLSYM,
-    A_GIMME,
-    A_CANT,
-    A_BLOB /* MP20061223 blob type */
-}  t_atomtype;
-
-#define A_DEFSYMBOL A_DEFSYM    /* better name for this */
-
-typedef struct _atom
-{
-    t_atomtype a_type;
-    union word a_w;
-} t_atom;
-
-EXTERN_STRUCT _class;
-#define t_class struct _class
-
-EXTERN_STRUCT _outlet;
-#define t_outlet struct _outlet
-
-EXTERN_STRUCT _inlet;
-#define t_inlet struct _inlet
-
-EXTERN_STRUCT _binbuf;
-#define t_binbuf struct _binbuf
-
-EXTERN_STRUCT _clock;
-#define t_clock struct _clock
-
-EXTERN_STRUCT _outconnect;
-#define t_outconnect struct _outconnect
-
-EXTERN_STRUCT _glist;
-#define t_glist struct _glist
-#define t_canvas struct _glist  /* LATER lose this */
-
-typedef t_class *t_pd;      /* pure datum: nothing but a class pointer */
-
-typedef struct _gobj        /* a graphical object */
-{
-    t_pd g_pd;              /* pure datum header (class) */
-    struct _gobj *g_next;   /* next in list */
-} t_gobj;
-
-typedef struct _scalar      /* a graphical object holding data */
-{
-    t_gobj sc_gobj;         /* header for graphical object */
-    t_symbol *sc_template;  /* template name (LATER replace with pointer) */
-    t_word sc_vec[1];       /* indeterminate-length array of words */
-} t_scalar;
-
-typedef struct _text        /* patchable object - graphical, with text */
-{
-    t_gobj te_g;                /* header for graphical object */
-    t_binbuf *te_binbuf;        /* holder for the text */
-    t_outlet *te_outlet;        /* linked list of outlets */
-    t_inlet *te_inlet;          /* linked list of inlets */
-    short te_xpix;              /* x&y location (within the toplevel) */
-    short te_ypix;
-    short te_width;             /* requested width in chars, 0 if auto */
-    unsigned int te_type:2;     /* from defs below */
-} t_text;
-
-#define T_TEXT 0        /* just a textual comment */
-#define T_OBJECT 1      /* a MAX style patchable object */
-#define T_MESSAGE 2     /* a MAX stype message */
-#define T_ATOM 3        /* a cell to display a number or symbol */
-
-#define te_pd te_g.g_pd
-
-   /* t_object is synonym for t_text (LATER unify them) */
-
-typedef struct _text t_object;
-
-#define ob_outlet te_outlet
-#define ob_inlet te_inlet
-#define ob_binbuf te_binbuf
-#define ob_pd te_g.g_pd
-#define ob_g te_g
-
-typedef void (*t_method)(void);
-typedef void *(*t_newmethod)( void);
-typedef void (*t_gotfn)(void *x, ...);
-
-/* ---------------- pre-defined objects and symbols --------------*/
-EXTERN t_pd pd_objectmaker;     /* factory for creating "object" boxes */
-EXTERN t_pd pd_canvasmaker;     /* factory for creating canvases */
-EXTERN t_symbol s_pointer;
-EXTERN t_symbol s_float;
-EXTERN t_symbol s_symbol;
-EXTERN t_symbol s_blob;
-EXTERN t_symbol s_bang;
-EXTERN t_symbol s_list;
-EXTERN t_symbol s_anything;
-EXTERN t_symbol s_signal;
-EXTERN t_symbol s__N;
-EXTERN t_symbol s__X;
-EXTERN t_symbol s_x;
-EXTERN t_symbol s_y;
-EXTERN t_symbol s_;
-
-/* --------- prototypes from the central message system ----------- */
-EXTERN void pd_typedmess(t_pd *x, t_symbol *s, int argc, t_atom *argv);
-EXTERN void pd_forwardmess(t_pd *x, int argc, t_atom *argv);
-EXTERN t_symbol *gensym(const char *s);
-EXTERN t_gotfn getfn(t_pd *x, t_symbol *s);
-EXTERN t_gotfn zgetfn(t_pd *x, t_symbol *s);
-EXTERN void nullfn(void);
-EXTERN void pd_vmess(t_pd *x, t_symbol *s, char *fmt, ...);
-#define mess0(x, s) ((*getfn((x), (s)))((x)))
-#define mess1(x, s, a) ((*getfn((x), (s)))((x), (a)))
-#define mess2(x, s, a,b) ((*getfn((x), (s)))((x), (a),(b)))
-#define mess3(x, s, a,b,c) ((*getfn((x), (s)))((x), (a),(b),(c)))
-#define mess4(x, s, a,b,c,d) ((*getfn((x), (s)))((x), (a),(b),(c),(d)))
-#define mess5(x, s, a,b,c,d,e) ((*getfn((x), (s)))((x), (a),(b),(c),(d),(e)))
-EXTERN void obj_list(t_object *x, t_symbol *s, int argc, t_atom *argv);
-EXTERN t_pd *pd_newest(void);
-
-/* --------------- memory management -------------------- */
-EXTERN void *getbytes(size_t nbytes);
-EXTERN void *getzbytes(size_t nbytes);
-EXTERN void *copybytes(void *src, size_t nbytes);
-EXTERN void freebytes(void *x, size_t nbytes);
-EXTERN void *resizebytes(void *x, size_t oldsize, size_t newsize);
-
-/* -------------------- atoms ----------------------------- */
-
-#define SETSEMI(atom) ((atom)->a_type = A_SEMI, (atom)->a_w.w_index = 0)
-#define SETCOMMA(atom) ((atom)->a_type = A_COMMA, (atom)->a_w.w_index = 0)
-#define SETPOINTER(atom, gp) ((atom)->a_type = A_POINTER, \
-    (atom)->a_w.w_gpointer = (gp))
-#define SETFLOAT(atom, f) ((atom)->a_type = A_FLOAT, (atom)->a_w.w_float = (f))
-#define SETSYMBOL(atom, s) ((atom)->a_type = A_SYMBOL, \
-    (atom)->a_w.w_symbol = (s))
-#define SETBLOB(atom, st) ((atom)->a_type = A_BLOB, (atom)->a_w.w_blob = (st)) /* MP 20061226 blob type */
-#define SETDOLLAR(atom, n) ((atom)->a_type = A_DOLLAR, \
-    (atom)->a_w.w_index = (n))
-#define SETDOLLSYM(atom, s) ((atom)->a_type = A_DOLLSYM, \
-    (atom)->a_w.w_symbol= (s))
-
-EXTERN t_float atom_getfloat(t_atom *a);
-EXTERN t_int atom_getint(t_atom *a);
-EXTERN t_symbol *atom_getsymbol(t_atom *a);
-EXTERN t_blob *atom_getblob(t_atom *a);/* MP 20070108 blob type */
-EXTERN t_symbol *atom_gensym(t_atom *a);
-EXTERN t_float atom_getfloatarg(int which, int argc, t_atom *argv);
-EXTERN t_int atom_getintarg(int which, int argc, t_atom *argv);
-EXTERN t_symbol *atom_getsymbolarg(int which, int argc, t_atom *argv);
-
-EXTERN void atom_string(t_atom *a, char *buf, unsigned int bufsize);
-
-/* ------------------  binbufs --------------- */
-
-EXTERN t_binbuf *binbuf_new(void);
-EXTERN void binbuf_free(t_binbuf *x);
-EXTERN t_binbuf *binbuf_duplicate(t_binbuf *y);
-
-EXTERN void binbuf_text(t_binbuf *x, char *text, size_t size);
-EXTERN void binbuf_gettext(t_binbuf *x, char **bufp, int *lengthp);
-EXTERN void binbuf_clear(t_binbuf *x);
-EXTERN void binbuf_add(t_binbuf *x, int argc, t_atom *argv);
-EXTERN void binbuf_addv(t_binbuf *x, char *fmt, ...);
-EXTERN void binbuf_addbinbuf(t_binbuf *x, t_binbuf *y);
-EXTERN void binbuf_addsemi(t_binbuf *x);
-EXTERN void binbuf_restore(t_binbuf *x, int argc, t_atom *argv);
-EXTERN void binbuf_print(t_binbuf *x);
-EXTERN int binbuf_getnatom(t_binbuf *x);
-EXTERN t_atom *binbuf_getvec(t_binbuf *x);
-EXTERN void binbuf_eval(t_binbuf *x, t_pd *target, int argc, t_atom *argv);
-EXTERN int binbuf_read(t_binbuf *b, char *filename, char *dirname,
-    int crflag);
-EXTERN int binbuf_read_via_canvas(t_binbuf *b, char *filename, t_canvas *canvas,
-    int crflag);
-EXTERN int binbuf_read_via_path(t_binbuf *b, char *filename, char *dirname,
-    int crflag);
-EXTERN int binbuf_write(t_binbuf *x, char *filename, char *dir,
-    int crflag);
-EXTERN void binbuf_evalfile(t_symbol *name, t_symbol *dir);
-EXTERN t_symbol *binbuf_realizedollsym(t_symbol *s, int ac, t_atom *av,
-    int tonew);
-
-/* ------------------  clocks --------------- */
-
-EXTERN t_clock *clock_new(void *owner, t_method fn);
-EXTERN void clock_set(t_clock *x, double systime);
-EXTERN void clock_delay(t_clock *x, double delaytime);
-EXTERN void clock_unset(t_clock *x);
-EXTERN double clock_getlogicaltime(void);
-EXTERN double clock_getsystime(void); /* OBSOLETE; use clock_getlogicaltime() */
-EXTERN double clock_gettimesince(double prevsystime);
-EXTERN double clock_getsystimeafter(double delaytime);
-EXTERN void clock_free(t_clock *x);
-
-/* ----------------- pure data ---------------- */
-EXTERN t_pd *pd_new(t_class *cls);
-EXTERN void pd_free(t_pd *x);
-EXTERN void pd_bind(t_pd *x, t_symbol *s);
-EXTERN void pd_unbind(t_pd *x, t_symbol *s);
-EXTERN t_pd *pd_findbyclass(t_symbol *s, t_class *c);
-EXTERN void pd_pushsym(t_pd *x);
-EXTERN void pd_popsym(t_pd *x);
-EXTERN t_symbol *pd_getfilename(void);
-EXTERN t_symbol *pd_getdirname(void);
-EXTERN void pd_bang(t_pd *x);
-EXTERN void pd_pointer(t_pd *x, t_gpointer *gp);
-EXTERN void pd_float(t_pd *x, t_float f);
-EXTERN void pd_symbol(t_pd *x, t_symbol *s);
-EXTERN void pd_blob(t_pd *x, t_blob *st); /* MP 20061226 blob type */
-EXTERN void pd_list(t_pd *x, t_symbol *s, int argc, t_atom *argv);
-EXTERN void pd_anything(t_pd *x, t_symbol *s, int argc, t_atom *argv);
-#define pd_class(x) (*(x))
-
-/* ----------------- pointers ---------------- */
-EXTERN void gpointer_init(t_gpointer *gp);
-EXTERN void gpointer_copy(const t_gpointer *gpfrom, t_gpointer *gpto);
-EXTERN void gpointer_unset(t_gpointer *gp);
-EXTERN int gpointer_check(const t_gpointer *gp, int headok);
-
-/* ----------------- patchable "objects" -------------- */
-EXTERN t_inlet *inlet_new(t_object *owner, t_pd *dest, t_symbol *s1,
-    t_symbol *s2);
-EXTERN t_inlet *pointerinlet_new(t_object *owner, t_gpointer *gp);
-EXTERN t_inlet *floatinlet_new(t_object *owner, t_float *fp);
-EXTERN t_inlet *symbolinlet_new(t_object *owner, t_symbol **sp);
-EXTERN t_inlet *signalinlet_new(t_object *owner, t_float f);
-EXTERN void inlet_free(t_inlet *x);
-
-EXTERN t_outlet *outlet_new(t_object *owner, t_symbol *s);
-EXTERN void outlet_bang(t_outlet *x);
-EXTERN void outlet_pointer(t_outlet *x, t_gpointer *gp);
-EXTERN void outlet_float(t_outlet *x, t_float f);
-EXTERN void outlet_symbol(t_outlet *x, t_symbol *s);
-EXTERN void outlet_blob(t_outlet *x, t_blob *st); /* MP 20061226 blob type */
-EXTERN void outlet_list(t_outlet *x, t_symbol *s, int argc, t_atom *argv);
-EXTERN void outlet_anything(t_outlet *x, t_symbol *s, int argc, t_atom *argv);
-EXTERN t_symbol *outlet_getsymbol(t_outlet *x);
-EXTERN void outlet_free(t_outlet *x);
-EXTERN t_object *pd_checkobject(t_pd *x);
-
-
-/* -------------------- canvases -------------- */
-
-EXTERN void glob_setfilename(void *dummy, t_symbol *name, t_symbol *dir);
-
-EXTERN void canvas_setargs(int argc, t_atom *argv);
-EXTERN void canvas_getargs(int *argcp, t_atom **argvp);
-EXTERN t_symbol *canvas_getcurrentdir(void);
-EXTERN t_glist *canvas_getcurrent(void);
-EXTERN void canvas_makefilename(t_glist *c, char *file,
-    char *result,int resultsize);
-EXTERN t_symbol *canvas_getdir(t_glist *x);
-EXTERN char sys_font[]; /* default typeface set in s_main.c */
-EXTERN char sys_fontweight[]; /* default font weight set in s_main.c */
-EXTERN int sys_fontwidth(int fontsize);
-EXTERN int sys_fontheight(int fontsize);
-EXTERN void canvas_dataproperties(t_glist *x, t_scalar *sc, t_binbuf *b);
-EXTERN int canvas_open(t_canvas *x, const char *name, const char *ext,
-    char *dirresult, char **nameresult, unsigned int size, int bin);
-
-/* ---------------- widget behaviors ---------------------- */
-
-EXTERN_STRUCT _widgetbehavior;
-#define t_widgetbehavior struct _widgetbehavior
-
-EXTERN_STRUCT _parentwidgetbehavior;
-#define t_parentwidgetbehavior struct _parentwidgetbehavior
-EXTERN t_parentwidgetbehavior *pd_getparentwidget(t_pd *x);
-
-/* -------------------- classes -------------- */
-
-#define CLASS_DEFAULT 0         /* flags for new classes below */
-#define CLASS_PD 1
-#define CLASS_GOBJ 2
-#define CLASS_PATCHABLE 3
-#define CLASS_NOINLET 8
-
-#define CLASS_TYPEMASK 3
-
-
-EXTERN t_class *class_new(t_symbol *name, t_newmethod newmethod,
-    t_method freemethod, size_t size, int flags, t_atomtype arg1, ...);
-EXTERN void class_addcreator(t_newmethod newmethod, t_symbol *s, 
-    t_atomtype type1, ...);
-EXTERN void class_addmethod(t_class *c, t_method fn, t_symbol *sel,
-    t_atomtype arg1, ...);
-EXTERN void class_addbang(t_class *c, t_method fn);
-EXTERN void class_addpointer(t_class *c, t_method fn);
-EXTERN void class_doaddfloat(t_class *c, t_method fn);
-EXTERN void class_addsymbol(t_class *c, t_method fn);
-EXTERN void class_addblob(t_class *c, t_method fn);/* MP 20061226 blob type */
-EXTERN void class_addlist(t_class *c, t_method fn);
-EXTERN void class_addanything(t_class *c, t_method fn);
-EXTERN void class_sethelpsymbol(t_class *c, t_symbol *s);
-EXTERN void class_setwidget(t_class *c, t_widgetbehavior *w);
-EXTERN void class_setparentwidget(t_class *c, t_parentwidgetbehavior *w);
-EXTERN t_parentwidgetbehavior *class_parentwidget(t_class *c);
-EXTERN char *class_getname(t_class *c);
-EXTERN char *class_gethelpname(t_class *c);
-EXTERN void class_setdrawcommand(t_class *c);
-EXTERN int class_isdrawcommand(t_class *c);
-EXTERN void class_domainsignalin(t_class *c, int onset);
-EXTERN void class_set_extern_dir(t_symbol *s);
-#define CLASS_MAINSIGNALIN(c, type, field) \
-    class_domainsignalin(c, (char *)(&((type *)0)->field) - (char *)0)
-
-         /* prototype for functions to save Pd's to a binbuf */
-typedef void (*t_savefn)(t_gobj *x, t_binbuf *b);
-EXTERN void class_setsavefn(t_class *c, t_savefn f);
-EXTERN t_savefn class_getsavefn(t_class *c);
-        /* prototype for functions to open properties dialogs */
-typedef void (*t_propertiesfn)(t_gobj *x, struct _glist *glist);
-EXTERN void class_setpropertiesfn(t_class *c, t_propertiesfn f);
-EXTERN t_propertiesfn class_getpropertiesfn(t_class *c);
-
-#ifndef PD_CLASS_DEF
-#define class_addbang(x, y) class_addbang((x), (t_method)(y))
-#define class_addpointer(x, y) class_addpointer((x), (t_method)(y))
-#define class_addfloat(x, y) class_doaddfloat((x), (t_method)(y))
-#define class_addsymbol(x, y) class_addsymbol((x), (t_method)(y))
-#define class_addblob(x, y) class_addblob((x), (t_method)(y)) /* MP20061226 blob type */
-#define class_addlist(x, y) class_addlist((x), (t_method)(y))
-#define class_addanything(x, y) class_addanything((x), (t_method)(y))
-#endif
-
-/* ------------   printing --------------------------------- */
-EXTERN void post(const char *fmt, ...);
-EXTERN void startpost(const char *fmt, ...);
-EXTERN void poststring(const char *s);
-EXTERN void postfloat(float f);
-EXTERN void postatom(int argc, t_atom *argv);
-EXTERN void endpost(void);
-EXTERN void error(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
-EXTERN void verbose(int level, const char *fmt, ...) __attribute__ ((format (printf, 2, 3)));
-EXTERN void bug(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
-EXTERN void pd_error(void *object, const char *fmt, ...) __attribute__ ((format (printf, 2, 3)));
-EXTERN void sys_logerror(const char *object, const char *s);
-EXTERN void sys_unixerror(const char *object);
-EXTERN void sys_ouch(void);
-
-
-/* ------------  system interface routines ------------------- */
-EXTERN int sys_isreadablefile(const char *name);
-EXTERN int sys_isabsolutepath(const char *dir);
-EXTERN void sys_bashfilename(const char *from, char *to);
-EXTERN void sys_unbashfilename(const char *from, char *to);
-EXTERN int open_via_path(const char *name, const char *ext, const char *dir,
-    char *dirresult, char **nameresult, unsigned int size, int bin);
-EXTERN int sched_geteventno(void);
-EXTERN double sys_getrealtime(void);
-EXTERN int (*sys_idlehook)(void);   /* hook to add idle time computation */
-
-
-/* ------------  threading ------------------- */ 
-EXTERN void sys_lock(void);
-EXTERN void sys_unlock(void);
-EXTERN int sys_trylock(void);
-
-
-/* --------------- signals ----------------------------------- */
-
-typedef float t_sample;
-#define MAXLOGSIG 32
-#define MAXSIGSIZE (1 << MAXLOGSIG)
-
-typedef struct _signal
-{
-    int s_n;            /* number of points in the array */
-    t_sample *s_vec;    /* the array */
-    t_float s_sr;         /* sample rate */
-    int s_refcount;     /* number of times used */
-    int s_isborrowed;   /* whether we're going to borrow our array */
-    struct _signal *s_borrowedfrom;     /* signal to borrow it from */
-    struct _signal *s_nextfree;         /* next in freelist */
-    struct _signal *s_nextused;         /* next in used list */
-    int s_vecsize;      /* allocated size of array in points */
-} t_signal;
-
-typedef t_int *(*t_perfroutine)(t_int *args);
-
-EXTERN t_int *plus_perform(t_int *args);
-EXTERN t_int *zero_perform(t_int *args);
-EXTERN t_int *copy_perform(t_int *args);
-
-EXTERN void dsp_add_plus(t_sample *in1, t_sample *in2, t_sample *out, int n);
-EXTERN void dsp_add_copy(t_sample *in, t_sample *out, int n);
-EXTERN void dsp_add_scalarcopy(t_float *in, t_sample *out, int n);
-EXTERN void dsp_add_zero(t_sample *out, int n);
-
-EXTERN int sys_getblksize(void);
-EXTERN t_float sys_getsr(void);
-EXTERN int sys_get_inchannels(void);
-EXTERN int sys_get_outchannels(void);
-
-EXTERN void dsp_add(t_perfroutine f, int n, ...);
-EXTERN void dsp_addv(t_perfroutine f, int n, t_int *vec);
-EXTERN void pd_fft(t_float *buf, int npoints, int inverse);
-EXTERN int ilog2(int n);
-
-EXTERN void mayer_fht(t_sample *fz, int n);
-EXTERN void mayer_fft(int n, t_sample *real, t_sample *imag);
-EXTERN void mayer_ifft(int n, t_sample *real, t_sample *imag);
-EXTERN void mayer_realfft(int n, t_sample *real);
-EXTERN void mayer_realifft(int n, t_sample *real);
-
-EXTERN float *cos_table;
-#define LOGCOSTABSIZE 9
-#define COSTABSIZE (1<<LOGCOSTABSIZE)
-
-EXTERN int canvas_suspend_dsp(void);
-EXTERN void canvas_resume_dsp(int oldstate);
-EXTERN void canvas_update_dsp(void);
-EXTERN int canvas_dspstate;
-
-/*   up/downsampling */
-typedef struct _resample
-{
-  int method;       /* up/downsampling method ID */
-
-  t_int downsample; /* downsampling factor */
-  t_int upsample;   /* upsampling factor */
-
-  t_sample *s_vec;   /* here we hold the resampled data */
-  int      s_n;
-
-  t_sample *coeffs;  /* coefficients for filtering... */
-  int      coefsize;
-
-  t_sample *buffer;  /* buffer for filtering */
-  int      bufsize;
-} t_resample;
-
-EXTERN void resample_init(t_resample *x);
-EXTERN void resample_free(t_resample *x);
-
-EXTERN void resample_dsp(t_resample *x, t_sample *in, int insize, t_sample *out, int outsize, int method);
-EXTERN void resamplefrom_dsp(t_resample *x, t_sample *in, int insize, int outsize, int method);
-EXTERN void resampleto_dsp(t_resample *x, t_sample *out, int insize, int outsize, int method);
-
-/* ----------------------- utility functions for signals -------------- */
-EXTERN t_float mtof(t_float);
-EXTERN t_float ftom(t_float);
-EXTERN t_float rmstodb(t_float);
-EXTERN t_float powtodb(t_float);
-EXTERN t_float dbtorms(t_float);
-EXTERN t_float dbtopow(t_float);
-
-EXTERN t_float q8_sqrt(t_float);
-EXTERN t_float q8_rsqrt(t_float);
-#ifndef N32     
-EXTERN t_float qsqrt(t_float);  /* old names kept for extern compatibility */
-EXTERN t_float qrsqrt(t_float);
-#endif
-/* --------------------- data --------------------------------- */
-
-    /* graphical arrays */
-EXTERN_STRUCT _garray;
-#define t_garray struct _garray
-
-EXTERN t_class *garray_class;
-EXTERN int garray_getfloatarray(t_garray *x, int *size, t_float **vec);
-EXTERN int garray_getfloatwords(t_garray *x, int *size, t_word **vec);
-EXTERN t_float garray_get(t_garray *x, t_symbol *s, t_int indx);
-EXTERN void garray_redraw(t_garray *x);
-EXTERN int garray_npoints(t_garray *x);
-EXTERN char *garray_vec(t_garray *x);
-EXTERN void garray_resize(t_garray *x, t_floatarg f);
-EXTERN void garray_usedindsp(t_garray *x);
-EXTERN void garray_setsaveit(t_garray *x, int saveit);
-EXTERN t_class *scalar_class;
-
-EXTERN t_float *value_get(t_symbol *s);
-EXTERN void value_release(t_symbol *s);
-EXTERN int value_getfloat(t_symbol *s, t_float *f);
-EXTERN int value_setfloat(t_symbol *s, t_float f);
-
-/* ------- GUI interface - functions to send strings to TK --------- */
-typedef void (*t_guicallbackfn)(t_gobj *client, t_glist *glist);
-
-EXTERN void sys_vgui(char *fmt, ...);
-EXTERN void sys_gui(char *s);
-EXTERN void sys_pretendguibytes(int n);
-EXTERN void sys_queuegui(void *client, t_glist *glist, t_guicallbackfn f);
-EXTERN void sys_unqueuegui(void *client);
-    /* dialog window creation and destruction */
-EXTERN void gfxstub_new(t_pd *owner, void *key, const char *cmd);
-EXTERN void gfxstub_deleteforkey(void *key);
-
-extern t_class *glob_pdobject;  /* object to send "pd" messages */
-
-/*-------------  Max 0.26 compatibility --------------------*/
-
-/* the following reflects the new way classes are laid out, with the class
-   pointing to the messlist and not vice versa. Externs shouldn't feel it. */
-typedef t_class *t_externclass;
-
-EXTERN void c_extern(t_externclass *cls, t_newmethod newroutine,
-    t_method freeroutine, t_symbol *name, size_t size, int tiny, \
-    t_atomtype arg1, ...);
-EXTERN void c_addmess(t_method fn, t_symbol *sel, t_atomtype arg1, ...);
-
-#define t_getbytes getbytes
-#define t_freebytes freebytes
-#define t_resizebytes resizebytes
-#define typedmess pd_typedmess
-#define vmess pd_vmess
-
-/* A definition to help gui objects straddle 0.34-0.35 changes.  If this is
-defined, there is a "te_xpix" field in objects, not a "te_xpos" as before: */
-
-#define PD_USE_TE_XPIX
-
-#if defined(__i386__) || defined(__x86_64__)
-/* a test for NANs and denormals.  Should only be necessary on i386. */
-#define PD_BADFLOAT(f) ((((*(unsigned int*)&(f))&0x7f800000)==0) || \
-    (((*(unsigned int*)&(f))&0x7f800000)==0x7f800000))
-/* more stringent test: anything not between 1e-19 and 1e19 in absolute val */
-#define PD_BIGORSMALL(f) ((((*(unsigned int*)&(f))&0x60000000)==0) || \
-    (((*(unsigned int*)&(f))&0x60000000)==0x60000000))
-#else
-#define PD_BADFLOAT(f) 0
-#define PD_BIGORSMALL(f) 0
-#endif
-
-#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus)
-}
-#endif
-
-#define __m_pd_h_
-#endif /* __m_pd_h_ */
diff --git a/embedded/puredata/pyo~-help.pd b/embedded/puredata/pyo~-help.pd
index e8c9c8a..d1f07d9 100644
--- a/embedded/puredata/pyo~-help.pd
+++ b/embedded/puredata/pyo~-help.pd
@@ -1,14 +1,14 @@
-#N canvas 296 140 952 365 10;
+#N canvas 295 147 1007 365 10;
 #X obj 28 108 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
 -1;
-#X obj 144 108 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+#X obj 144 108 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
 1;
 #X obj 13 234 *~;
 #X obj 51 234 *~;
 #X obj 13 256 dac~;
 #X obj 72 213 hsl 128 15 0 1 0 1 empty empty master_gain -2 -8 0 10
 -262144 -1 -1 6200 1;
-#X obj 274 223 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1
+#X obj 274 223 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
 1;
 #X msg 274 243 \; pd dsp \$1;
 #X obj 13 59 r msg_to_pyo;
@@ -18,34 +18,34 @@
 to 2).;
 #N canvas 1 75 824 583 resonators_example 0;
 #X obj 35 103 hsl 128 15 0.01 30 1 0 empty empty resonance -2 -8 0
-10 -262144 -1 -1 11200 0;
-#X floatatom 32 120 5 0 0 0 - - -;
+10 -262144 -1 -1 0 0;
+#X floatatom 32 120 5 0 0 0 - - -, f 5;
 #X obj 21 530 s msg_to_pyo;
 #X obj 98 387 hsl 128 15 0 1 0 0 empty empty delay_time -2 -8 0 10
--262144 -1 -1 1300 0;
-#X floatatom 95 403 5 0 0 0 - - -;
+-262144 -1 -1 0 0;
+#X floatatom 95 403 5 0 0 0 - - -, f 5;
 #X msg 95 418 value deltime \$1;
 #X obj 111 454 hsl 128 15 0 1 0 0 empty empty delay_feedback -2 -8
-0 10 -262144 -1 -1 10800 0;
-#X floatatom 108 470 5 0 0 0 - - -;
+0 10 -262144 -1 -1 0 0;
+#X floatatom 108 470 5 0 0 0 - - -, f 5;
 #X msg 108 485 value delfeed \$1;
 #X msg 32 136 value reson \$1;
 #X obj 52 177 vsl 15 80 50 500 0 0 empty empty empty 0 -9 0 10 -262144
--1 -1 4700 0;
+-1 -1 0 0;
 #X obj 71 177 vsl 15 80 50 500 0 0 empty empty empty 0 -9 0 10 -262144
--1 -1 3200 0;
+-1 -1 0 0;
 #X obj 91 177 vsl 15 80 50 500 0 0 empty empty empty 0 -9 0 10 -262144
--1 -1 5800 0;
+-1 -1 0 0;
 #X obj 110 177 vsl 15 80 50 500 0 0 empty empty empty 0 -9 0 10 -262144
--1 -1 7100 0;
+-1 -1 0 0;
 #X obj 130 177 vsl 15 80 50 500 0 0 empty empty empty 0 -9 0 10 -262144
--1 -1 5500 0;
+-1 -1 0 0;
 #X obj 149 177 vsl 15 80 50 500 0 0 empty empty empty 0 -9 0 10 -262144
--1 -1 7100 0;
+-1 -1 0 0;
 #X obj 169 177 vsl 15 80 50 500 0 0 empty empty empty 0 -9 0 10 -262144
--1 -1 4400 0;
+-1 -1 0 0;
 #X obj 189 177 vsl 15 80 50 500 0 0 empty empty empty 0 -9 0 10 -262144
--1 -1 1800 0;
+-1 -1 0 0;
 #X msg 52 306 value freqs \$1 \$2 \$3 \$4 \$5 \$6 \$7 \$8;
 #X obj 52 264 bondo 8 ____________;
 #X obj 52 285 pack f f f f f f f f;
@@ -100,8 +100,8 @@ input;
 -1 -1 4233 1;
 #X obj 127 144 hsl 128 15 0 36 0 0 empty empty empty -2 -8 0 10 -262144
 -1 -1 4233 1;
-#X floatatom 75 125 5 0 0 0 - - -;
-#X floatatom 124 160 5 0 0 0 - - -;
+#X floatatom 75 125 5 0 0 0 - - -, f 5;
+#X floatatom 124 160 5 0 0 0 - - -, f 5;
 #X obj 124 209 +;
 #X obj 124 179 t b f;
 #X obj 75 144 t f f;
@@ -142,15 +142,15 @@ input;
 ;
 #X obj 67 172 hsl 128 15 0 0.25 0 0 empty empty brightness -2 -8 0
 10 -262144 -1 -1 0 0;
-#X floatatom 64 188 5 0 0 0 - - -;
+#X floatatom 64 188 5 0 0 0 - - -, f 5;
 #X msg 64 203 value feed \$1;
 #X obj 158 75 hsl 128 15 50 500 0 0 empty empty metro_speed -2 -8 0
 10 -262144 -1 -1 0 1;
-#X floatatom 155 93 5 0 0 0 - - -;
-#X floatatom 222 186 5 0 0 0 - - -;
+#X floatatom 155 93 5 0 0 0 - - -, f 5;
+#X floatatom 222 186 5 0 0 0 - - -, f 5;
 #X msg 222 216 set amp.fadeout \$1;
 #X msg 281 184 set amp.dur \$1;
-#X floatatom 281 165 5 0 0 0 - - -;
+#X floatatom 281 165 5 0 0 0 - - -, f 5;
 #X obj 222 132 * 0.001;
 #X obj 221 111 - 20;
 #X obj 222 165 - 0.005;
@@ -218,7 +218,7 @@ input;
 #N canvas 1 75 532 224 conv_reverb_example 0;
 #X obj 24 110 hsl 128 15 0 1 0 0 empty empty balance -2 -8 0 10 -262144
 -1 -1 0 0;
-#X floatatom 21 127 5 0 0 0 - - -;
+#X floatatom 21 127 5 0 0 0 - - -, f 5;
 #X msg 21 143 value bal \$1;
 #X obj -3 170 s msg_to_pyo;
 #X msg -3 74 read examples/cvlverb.py;
diff --git a/embedded/puredata/pyo~.c b/embedded/puredata/pyo~.c
index 1e675b1..972f66e 100644
--- a/embedded/puredata/pyo~.c
+++ b/embedded/puredata/pyo~.c
@@ -1,5 +1,5 @@
 #include <stdlib.h>
-#include "m_pd.h"
+#include <pd/m_pd.h>
 #include "Python.h"
 #include "m_pyo.h"
 
diff --git a/examples/algorithmic/01_music_box.py b/examples/algorithmic/01_music_box.py
index 56f86a8..3548f95 100644
--- a/examples/algorithmic/01_music_box.py
+++ b/examples/algorithmic/01_music_box.py
@@ -4,18 +4,23 @@
 Music box. 5 voices randomly choosing frequencies over a common scale.
 
 """
+
 from pyo import *
 
 s = Server(duplex=0).boot()
 
+#--> set list of frequencies
 low_freqs = [midiToHz(m+7) for m in [36,43.01,48,55.01,60]]
 mid_freqs = [midiToHz(m+7) for m in [60,62,63.93,65,67.01,69,71,72]]
 high_freqs = [midiToHz(m+7) for m in [72,74,75.93,77,79.01]]
 freqs = [low_freqs,low_freqs,mid_freqs,mid_freqs,high_freqs]
+#<--
 
+#-->
 chx = Choice(choice=freqs, freq=[1,2,3,3,4])
 port = Port(chx, risetime=.001, falltime=.001)
 sines = SineLoop(port, feedback=[.06,.057,.033,.035,.016], mul=[.15,.15,.1,.1,.06])
 pan = SPan(sines, pan=[0, 1, .2, .8, .5]).out()
+#<--
 
 s.gui(locals())
\ No newline at end of file
diff --git a/examples/effects/01_flanger.py b/examples/effects/01_flanger.py
index 4d52111..9be597d 100644
--- a/examples/effects/01_flanger.py
+++ b/examples/effects/01_flanger.py
@@ -8,9 +8,13 @@ from pyo import *
 
 s = Server(sr=44100, nchnls=2, buffersize=512, duplex=0).boot()
 
+#-->
 src = BrownNoise(.1).mix(2).out()
+#<--
 
+#-->
 lf = Sine(freq=.2, mul=.0045, add=.005)
 flg = Delay(src, delay=lf, feedback=.25).out()
+#<--
 
 s.gui(locals())
\ No newline at end of file
diff --git a/examples/effects/02_chorus.py b/examples/effects/02_chorus.py
index 57262ef..90fff48 100644
--- a/examples/effects/02_chorus.py
+++ b/examples/effects/02_chorus.py
@@ -8,9 +8,12 @@ from pyo import *
 
 s = Server(sr=44100, nchnls=2, buffersize=512, duplex=0).boot()
 
+#--> Start a sound
 sf = SfPlayer('../snds/baseballmajeur_m.aif', speed=1, loop=True, mul=.3)
 sf2 = sf.mix(2).out()
+#<--
 
+#--> Sets values for 8 delay lines
 # delay line frequencies
 freqs = [.254, .465, .657, .879, 1.23, 1.342, 1.654, 1.879]
 # delay line center delays
@@ -19,8 +22,11 @@ cdelay = [.0087, .0102, .0111, .01254, .0134, .01501, .01707, .0178]
 adelay = [.001, .0012, .0013, .0014, .0015, .0016, .002, .0023]
 # modulation depth
 depth = Sig(1)
+#<--
 
+#--> Add the delay lines to the source sound
 lfos = Sine(freqs, mul=adelay*depth, add=cdelay)
 delays = Delay(sf, lfos, feedback=.5, mul=.5).out()
+#<--
 
 s.gui(locals())
diff --git a/include/pyomodule.h b/include/pyomodule.h
index e6f8ee1..32a3f3c 100644
--- a/include/pyomodule.h
+++ b/include/pyomodule.h
@@ -21,7 +21,7 @@
 #include "Python.h"
 #include <math.h>
 
-#define PYO_VERSION "0.7.5"
+#define PYO_VERSION "0.7.6"
 
 #ifndef __MYFLT_DEF
 #define __MYFLT_DEF
@@ -485,6 +485,7 @@ extern PyTypeObject PeakAmpType;
 extern PyTypeObject MainParticleType;
 extern PyTypeObject ParticleType;
 extern PyTypeObject AtanTableType;
+extern PyTypeObject RawMidiType;
 
 /* Constants */
 #define E M_E
@@ -561,51 +562,57 @@ extern PyTypeObject AtanTableType;
 
 /* VISIT & CLEAR */
 #define pyo_VISIT \
-    if (PyServer_get_server() != NULL) \
+    if (self->server != NULL) \
         Py_VISIT(self->server); \
-    Py_VISIT(self->stream); \
+    if (self->stream != NULL) \
+        Py_VISIT(self->stream); \
     Py_VISIT(self->mul); \
     Py_VISIT(self->mul_stream); \
     Py_VISIT(self->add); \
     Py_VISIT(self->add_stream);
 
 #define pyo_table_VISIT \
-    if (PyServer_get_server() != NULL) \
+    if (self->server != NULL) \
         Py_VISIT(self->server); \
-    Py_VISIT(self->tablestream); \
+    if (self->tablestream != NULL) \
+        Py_VISIT(self->tablestream); \
 
 #define pyo_matrix_VISIT \
-    if (PyServer_get_server() != NULL) \
+    if (self->server != NULL) \
         Py_VISIT(self->server); \
-    Py_VISIT(self->matrixstream); \
+    if (self->matrixstream != NULL) \
+        Py_VISIT(self->matrixstream); \
 
 #define pyo_CLEAR \
-    if (PyServer_get_server() != NULL) { \
+    if (self->server != NULL) { \
         Py_INCREF(self->server); \
         Py_CLEAR(self->server); \
     } \
-    Py_CLEAR(self->stream); \
+    if (self->stream != NULL) \
+        Py_CLEAR(self->stream); \
     Py_CLEAR(self->mul); \
     Py_CLEAR(self->mul_stream); \
     Py_CLEAR(self->add); \
     Py_CLEAR(self->add_stream); \
 
 #define pyo_table_CLEAR \
-    if (PyServer_get_server() != NULL) { \
+    if (self->server != NULL) { \
         Py_INCREF(self->server); \
         Py_CLEAR(self->server); \
     } \
-    Py_CLEAR(self->tablestream); \
+    if (self->tablestream != NULL) \
+        Py_CLEAR(self->tablestream); \
 
 #define pyo_matrix_CLEAR \
-    if (PyServer_get_server() != NULL) { \
+    if (self->server != NULL) { \
         Py_INCREF(self->server); \
         Py_CLEAR(self->server); \
     } \
-    Py_CLEAR(self->matrixstream); \
+    if (self->matrixstream != NULL) \
+        Py_CLEAR(self->matrixstream); \
 
 #define pyo_DEALLOC \
-    if (PyServer_get_server() != NULL) \
+    if (self->server != NULL && self->stream != NULL) \
         Server_removeStream((Server *)self->server, Stream_getStreamId(self->stream)); \
     free(self->data); \
 
diff --git a/installers/osx/release_x86_64.sh b/installers/osx/release_x86_64.sh
index 2779969..2275a10 100644
--- a/installers/osx/release_x86_64.sh
+++ b/installers/osx/release_x86_64.sh
@@ -7,9 +7,9 @@
 # 3. cd utils and build E-Pyo
 # 4. cd installer/osx and build the realease, only x86_64 version
 
-export PACKAGE_NAME=pyo_0.7.5_x86_64.pkg
-export DMG_DIR="pyo 0.7.5 Universal"
-export DMG_NAME="pyo_0.7.5_OSX-universal.dmg"
+export PACKAGE_NAME=pyo_0.7.6_x86_64.pkg
+export DMG_DIR="pyo 0.7.6 Universal"
+export DMG_NAME="pyo_0.7.6_OSX-universal.dmg"
 export INSTALLER_DIR=`pwd`/installer
 export PYO_MODULE_DIR=$INSTALLER_DIR/PyoModule/Package_Contents/tmp
 export SUPPORT_LIBS_DIR=$INSTALLER_DIR/SupportLibs/Package_Contents/usr/local/lib
diff --git a/installers/win/win_installer_py26.iss b/installers/win/win_installer_py26.iss
index 8f0acd5..54c1ced 100644
--- a/installers/win/win_installer_py26.iss
+++ b/installers/win/win_installer_py26.iss
@@ -3,7 +3,7 @@
 
 #define appName "pyo"
 #define pyVer "2.6"
-#define appVer "0.7.5"
+#define appVer "0.7.6"
 
 [Setup]
 ; NOTE: The value of AppId uniquely identifies this application.
@@ -21,15 +21,15 @@ 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
+InfoBeforeFile=C:\Users\olivier\svn\pyo\installers\win\\README-win32-py26.txt
+LicenseFile=C:\Users\olivier\svn\pyo\COPYING.txt
 OutputBaseFilename={#appName}_{#appVer}_py{#pyVer}_setup
 Compression=lzma
 SolidCompression=yes
 ChangesAssociations=yes
 ChangesEnvironment=yes
 DirExistsWarning=no
-SetupIconFile=C:\Users\olipet\svn\pyo\utils\E-PyoIcon.ico
+SetupIconFile=C:\Users\olivier\svn\pyo\utils\E-PyoIcon.ico
 
 [Languages]
 Name: "english"; MessagesFile: "compiler:Default.isl"
@@ -51,13 +51,13 @@ Source: "C:\Python26\Lib\site-packages\msvcr90.dll"; DestDir: "{app}\Lib\site-pa
 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
-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
+Source: "C:\Users\olivier\svn\pyo\examples\*"; DestDir: "{userdesktop}\pyo_examples\"; Flags: ignoreversion recursesubdirs createallsubdirs
+Source: "C:\Users\olivier\svn\pyo\installers\win\README-win32-py26.txt"; DestDir: "{userdesktop}"; Flags: ignoreversion
 ; NOTE: Don't use "Flags: ignoreversion" on any shared system files
 
 ; E-Pyo stuff
-Source: "C:\Users\olipet\svn\pyo\utils\E-Pyo_py26\E-Pyo.exe"; DestDir: "{pf}\E-Pyo"; Flags: ignoreversion
-Source: "C:\Users\olipet\svn\pyo\utils\E-Pyo_py26\Resources\*"; DestDir: "{pf}\E-Pyo\Resources"; Flags: ignoreversion recursesubdirs createallsubdirs
+Source: "C:\Users\olivier\svn\pyo\utils\E-Pyo_py26\E-Pyo.exe"; DestDir: "{pf}\E-Pyo"; Flags: ignoreversion
+Source: "C:\Users\olivier\svn\pyo\utils\E-Pyo_py26\Resources\*"; DestDir: "{pf}\E-Pyo\Resources"; Flags: ignoreversion recursesubdirs createallsubdirs
 
 [Tasks]
 Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"
diff --git a/installers/win/win_installer_py27.iss b/installers/win/win_installer_py27.iss
index af16bc9..e90ddda 100644
--- a/installers/win/win_installer_py27.iss
+++ b/installers/win/win_installer_py27.iss
@@ -3,7 +3,7 @@
 
 #define appName "pyo"
 #define pyVer "2.7"
-#define appVer "0.7.5"
+#define appVer "0.7.6"
 
 [Setup]
 ; NOTE: The value of AppId uniquely identifies this application.
@@ -21,15 +21,15 @@ DisableDirPage=no
 AlwaysShowDirOnReadyPage=yes
 DefaultGroupName={#appName}
 AllowNoIcons=yes
-InfoBeforeFile=C:\Users\olipet\svn\pyo\installers\win\\README-win32-py27.txt
-LicenseFile=C:\Users\olipet\svn\pyo\COPYING.txt
+InfoBeforeFile=C:\Users\olivier\svn\pyo\installers\win\\README-win32-py27.txt
+LicenseFile=C:\Users\olivier\svn\pyo\COPYING.txt
 OutputBaseFilename={#appName}_{#appVer}_py{#pyVer}_setup
 Compression=lzma
 SolidCompression=yes
 ChangesAssociations=yes
 ChangesEnvironment=yes
 DirExistsWarning=no
-SetupIconFile=C:\Users\olipet\svn\pyo\utils\E-PyoIcon.ico
+SetupIconFile=C:\Users\olivier\svn\pyo\utils\E-PyoIcon.ico
 
 [Languages]
 Name: "english"; MessagesFile: "compiler:Default.isl"
@@ -50,12 +50,12 @@ Source: "C:\Python27\Lib\site-packages\msvcr90.dll"; DestDir: "{app}\Lib\site-pa
 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
+Source: "C:\Users\olivier\svn\pyo\examples\*"; DestDir: "{userdesktop}\pyo_examples\"; Flags: ignoreversion recursesubdirs createallsubdirs
 ; NOTE: Don't use "Flags: ignoreversion" on any shared system files
 
 ; E-Pyo stuff
-Source: "C:\Users\olipet\svn\pyo\utils\E-Pyo_py27\E-Pyo.exe"; DestDir: "{pf}\E-Pyo"; Flags: ignoreversion
-Source: "C:\Users\olipet\svn\pyo\utils\E-Pyo_py27\Resources\*"; DestDir: "{pf}\E-Pyo\Resources"; Flags: ignoreversion recursesubdirs createallsubdirs
+Source: "C:\Users\olivier\svn\pyo\utils\E-Pyo_py27\E-Pyo.exe"; DestDir: "{pf}\E-Pyo"; Flags: ignoreversion
+Source: "C:\Users\olivier\svn\pyo\utils\E-Pyo_py27\Resources\*"; DestDir: "{pf}\E-Pyo\Resources"; Flags: ignoreversion recursesubdirs createallsubdirs
 
 [Tasks]
 Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"
diff --git a/pyo.py b/pyo.py
index 02ae816..8c2eb72 100644
--- a/pyo.py
+++ b/pyo.py
@@ -97,7 +97,7 @@ OBJECTS_TREE = {'functions': sorted(['pa_count_devices', 'pa_get_default_input',
                                                         'BrownNoise', 'Rossler', 'Lorenz', 'LFO', 'SumOsc', 'SuperSaw', 'RCOsc']),
                                   'internals': sorted(['Dummy', 'InputFader', 'Mix', 'VarPort']),
                                   'midi': sorted(['Midictl', 'CtlScan', 'CtlScan2', 'Notein', 'MidiAdsr', 'MidiDelAdsr', 'Bendin',
-                                                  'Touchin', 'Programin']),
+                                                  'Touchin', 'Programin', 'RawMidi']),
                                   'opensndctrl': sorted(['OscReceive', 'OscSend', 'OscDataSend', 'OscDataReceive', 'OscListReceive']),
                                   'pan': sorted(['Pan', 'SPan', 'Switch', 'Selector', 'Mixer', 'VoiceManager']),
                                   'pattern': sorted(['Pattern', 'Score', 'CallAfter']),
diff --git a/pyolib/_core.py b/pyolib/_core.py
index 64f875d..5549858 100644
--- a/pyolib/_core.py
+++ b/pyolib/_core.py
@@ -18,7 +18,7 @@ GNU Lesser General Public License for more details.
 You should have received a copy of the GNU Lesser General Public
 License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
-from types import ListType, TupleType, SliceType, FloatType, StringType, UnicodeType, NoneType
+from types import BooleanType, ListType, TupleType, SliceType, LongType, IntType, FloatType, StringType, UnicodeType, NoneType
 import random, os, sys, inspect, tempfile
 from subprocess import call
 from weakref import proxy
@@ -64,6 +64,147 @@ FUNCTIONS_INIT_LINES = {"pa_count_host_apis": "pa_count_host_apis()", "pa_list_h
                         "wrap": "wrap(arg, i)", "floatmap": "floatmap(x, min=0, max=1, exp=1)"
                         }
 
+class PyoError(Exception):
+    """Base class for all pyo exceptions."""
+
+class PyoServerStateException(PyoError):
+    """Error raised when an operation requires the server to be booted."""
+
+class PyoArgumentTypeError(PyoError):
+    """Error raised when if an object got an invalid argument."""
+
+def isAudioObject(obj):
+    return isinstance(obj, PyoObject) or hasattr(obj, "stream")
+
+def isTableObject(obj):
+    return isinstance(obj, PyoTableObject) or hasattr(obj, "tablestream")
+
+def isMatrixObject(obj):
+    return isinstance(obj, PyoMatrixObject) or hasattr(obj, "matrixstream")
+
+def isPVObject(obj):
+    return isinstance(obj, PyoPVObject) or hasattr(obj, "pv_stream")
+    
+def pyoArgsAssert(obj, format, *args):
+    """
+    Raise an Exception if an object got an invalid argument.
+    
+    :Args:
+        
+        obj : Pyo object on which method is called.
+            Usually "self" in the function call.
+        format :
+            String of length equal to the number of arguments. Each character
+            indicating the expected argument type.
+            
+            - O : float or PyoObject
+            - o : PyoObject
+            - T : float or PyoTableObject
+            - t : PyoTableObject
+            - m : PyoMatrixObject
+            - p : PyoPVObject
+            - n : any number (int or float)
+            - N : any number (no list-expansion)
+            - f : float
+            - F : float (no list-expansion)
+            - i : integer
+            - I : integer (no list-expansion)
+            - s : string or unicode
+            - S : string or unicode (no list-expansion)
+            - b : boolean
+            - B : boolean (no list-expansion)
+            - l : list
+            - L : list or None
+            - u : tuple
+            - x : sequence (list or tuple)
+            - c : callable
+            - C : callable (no list-expansion)
+            - z : anything
+        *args : any
+            Arguments passed to the object's method.
+            
+    """
+    expected = ""
+    for i in range(len(args)):
+        f = format[i]
+        argtype = type(args[i])
+        if f == "O":
+            if not isAudioObject(args[i]) and \
+                    argtype not in [ListType, IntType, LongType, FloatType]:
+                expected = "float or PyoObject"
+        elif f == "o":
+            if not isAudioObject(args[i]) and argtype not in [ListType]:
+                expected = "PyoObject"
+        elif f == "T":
+            if not isTableObject(args[i]) and argtype not in [FloatType, ListType]:
+                expected = "float or PyoTableObject"
+        elif f == "t":
+            if not isTableObject(args[i]) and argtype not in [ListType]:
+                expected = "PyoTableObject"
+        elif f == "m":
+            if not isMatrixObject(args[i]) and argtype not in [ListType]:
+                expected = "PyoMatrixObject"
+        elif f == "p":
+            if not isPVObject(args[i]) and argtype not in [ListType]:
+                expected = "PyoPVObject"
+        elif f == "n":
+            if argtype not in [ListType, IntType, LongType, FloatType]:
+                expected = "any number"
+        elif f == "N":
+            if argtype not in [IntType, LongType, FloatType]:
+                expected = "any number - list not allowed"
+        elif f == "f":
+            if argtype not in [ListType, FloatType]:
+                expected = "float"
+        elif f == "F":
+            if argtype not in [FloatType]:
+                expected = "float - list not allowed"
+        elif f == "i":
+            if argtype not in [ListType, IntType, LongType]:
+                expected = "integer"
+        elif f == "I":
+            if argtype not in [IntType, LongType]:
+                expected = "integer - list not allowed"
+        elif f == "s":
+            if argtype not in [ListType, StringType, UnicodeType]:
+                expected = "string"
+        elif f == "S":
+            if argtype not in [StringType, UnicodeType]:
+                expected = "string - list not allowed"
+        elif f == "b":
+            if argtype not in [BooleanType, ListType, IntType, LongType]:
+                expected = "boolean"
+        elif f == "B":
+            if argtype not in [BooleanType, IntType, LongType]:
+                expected = "boolean - list not allowed"
+        elif f == "l":
+            if argtype not in [ListType]:
+                expected = "list"
+        elif f == "L":
+            if argtype not in [ListType, NoneType]:
+                expected = "list or None"
+        elif f == "u":
+            if argtype not in [TupleType]:
+                expected = "tuple"
+        elif f == "x":
+            if argtype not in [ListType, TupleType]:
+                expected = "list or tuple"
+        elif f == "c":
+            if not callable(args[i]) and argtype not in [ListType, TupleType, NoneType]:
+                expected = "callable"
+        elif f == "C":
+            if not callable(args[i]) and argtype not in [NoneType]:
+                expected = "callable - list not allowed"
+        elif f == "z":
+            pass
+                
+        if expected:
+            break
+
+    if expected:
+        name = obj.__class__.__name__
+        raise PyoArgumentTypeError('bad argument at position %d to "%s" (%s expected, got %s)' % (i, name, expected, argtype))
+
 def convertStringToSysEncoding(str):
     """
     Convert a string to the current platform file system encoding.
@@ -253,12 +394,6 @@ class WeakMethod(object):
         else:
             return self.method(*args, **kwargs)
 
-class PyoError(Exception):
-    """Base class for all pyo exceptions."""
-
-class PyoServerStateException(PyoError):
-    """Error raised when an operation requires the server to be booted."""
-
 ######################################################################
 ### PyoObjectBase -> abstract class for pyo objects
 ######################################################################
@@ -606,6 +741,7 @@ class PyoObject(PyoObjectBase):
                 of the first stream.
 
         """
+        pyoArgsAssert(self, "B", all)
         if all:
             return [obj._getStream().isPlaying() for obj in self._base_objs]
         else:
@@ -625,6 +761,7 @@ class PyoObject(PyoObjectBase):
                 of the first stream.
 
         """
+        pyoArgsAssert(self, "B", all)
         if all:
             return [obj._getStream().isOutputting() for obj in self._base_objs]
         else:
@@ -651,6 +788,7 @@ class PyoObject(PyoObjectBase):
                 will be returned as a float.
 
         """
+        pyoArgsAssert(self, "B", all)
         if not all:
             return self._base_objs[0]._getStream().getValue()
         else:
@@ -673,9 +811,15 @@ class PyoObject(PyoObjectBase):
                 Delay, in seconds, before the object's activation. Defaults to 0.
 
         """
+        pyoArgsAssert(self, "nn", dur, delay)
         dur, delay, lmax = convertArgsToLists(dur, delay)
         if hasattr(self, "_trig_objs"):
-            self._trig_objs.play(dur, delay)
+            if type(self._trig_objs) == ListType:
+                for i in range(lmax):
+                    for obj in self._trig_objs:
+                        obj.play(wrap(dur,i), wrap(delay,i))
+            else:
+                self._trig_objs.play(dur, delay)
         if hasattr(self, "_base_players"):
             [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._base_players)]
         [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._base_objs)]
@@ -712,9 +856,15 @@ class PyoObject(PyoObjectBase):
         assigned to successive streams.
 
         """
+        pyoArgsAssert(self, "iInn", chnl, inc, dur, delay)
         dur, delay, lmax = convertArgsToLists(dur, delay)
         if hasattr(self, "_trig_objs"):
-            self._trig_objs.play(dur, delay)
+            if type(self._trig_objs) == ListType:
+                for i in range(lmax):
+                    for obj in self._trig_objs:
+                        obj.play(wrap(dur,i), wrap(delay,i))
+            else:
+                self._trig_objs.play(dur, delay)
         if hasattr(self, "_base_players"):
             [obj.play(wrap(dur,i), wrap(delay,i)) for i, obj in enumerate(self._base_players)]
         if type(chnl) == ListType:
@@ -735,7 +885,10 @@ class PyoObject(PyoObjectBase):
 
         """
         if hasattr(self, "_trig_objs"):
-            self._trig_objs.stop()
+            if type(self._trig_objs) == ListType:
+                [obj.stop() for obj in self._trig_objs]
+            else:
+                self._trig_objs.stop()
         if hasattr(self, "_base_players"):
             [obj.stop() for obj in self._base_players]
         [obj.stop() for obj in self._base_objs]
@@ -778,6 +931,7 @@ class PyoObject(PyoObjectBase):
                 Maximum value of the output signal.
 
         """
+        pyoArgsAssert(self, "nn", min, max)
         min, max, lmax = convertArgsToLists(min, max)
         if lmax > 1:
             mul = [(wrap(max,i) - wrap(min,i)) * 0.5 for i in range(lmax)]
@@ -799,6 +953,7 @@ class PyoObject(PyoObjectBase):
                 New `mul` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._mul = x
         x, lmax = convertArgsToLists(x)
         [obj.setMul(wrap(x,i/self._op_duplicate)) for i, obj in enumerate(self._base_objs)]
@@ -813,6 +968,7 @@ class PyoObject(PyoObjectBase):
                 New `add` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._add = x
         x, lmax = convertArgsToLists(x)
         [obj.setAdd(wrap(x,i/self._op_duplicate)) for i, obj in enumerate(self._base_objs)]
@@ -827,6 +983,7 @@ class PyoObject(PyoObjectBase):
                 New inversed `add` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._add = x
         x, lmax = convertArgsToLists(x)
         [obj.setSub(wrap(x,i/self._op_duplicate)) for i, obj in enumerate(self._base_objs)]
@@ -841,6 +998,7 @@ class PyoObject(PyoObjectBase):
                 New inversed `mul` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._mul = x
         x, lmax = convertArgsToLists(x)
         [obj.setDiv(wrap(x,i/self._op_duplicate)) for i, obj in enumerate(self._base_objs)]
@@ -863,6 +1021,7 @@ class PyoObject(PyoObjectBase):
                 Time, in seconds, to reach the new value.
 
         """
+        pyoArgsAssert(self, "Snn", attr, value, port)
         self._target_dict[attr] = value
         init = getattr(self, attr)
         if self._signal_dict.has_key(attr):
@@ -987,6 +1146,7 @@ class PyoTableObject(PyoObjectBase):
                     6. A-Law encoded
 
         """
+        pyoArgsAssert(self, "SII", path, format, sampletype)
         ext = path.rsplit('.')
         if len(ext) >= 2:
             ext = ext[-1].lower()
@@ -1012,6 +1172,7 @@ class PyoTableObject(PyoObjectBase):
                 per line.
 
         """
+        pyoArgsAssert(self, "SB", path, oneline)
         f = open(path, "w")
         if oneline:
             f.write(str([obj.getTable() for obj in self._base_objs]))
@@ -1047,6 +1208,7 @@ class PyoTableObject(PyoObjectBase):
         length of the lists.
 
         """
+        pyoArgsAssert(self, "S", path)
         f = open(path, "r")
         f_list = eval(f.read())
         f_len = len(f_list)
@@ -1066,6 +1228,7 @@ class PyoTableObject(PyoObjectBase):
                 New table size in samples.
 
         """
+        pyoArgsAssert(self, "I", size)
         self._size = size
         [obj.setSize(size) for obj in self._base_objs]
         self.refreshView()
@@ -1082,6 +1245,7 @@ class PyoTableObject(PyoObjectBase):
                 first size as an int. Defaults to False.
 
         """
+        pyoArgsAssert(self, "B", all)
         if all:
             return [obj.getSize() for obj in self._base_objs]
         else:
@@ -1106,6 +1270,7 @@ class PyoTableObject(PyoObjectBase):
                 Position, in samples, where to record value. Defaults to 0.
 
         """
+        pyoArgsAssert(self, "NI", value, pos)
         [obj.put(value, pos) for obj in self._base_objs]
         self.refreshView()
 
@@ -1123,6 +1288,7 @@ class PyoTableObject(PyoObjectBase):
                 Position, in samples, where to read the value. Defaults to 0.
 
         """
+        pyoArgsAssert(self, "I", pos)
         values = [obj.get(pos) for obj in self._base_objs]
         if len(values) == 1: return values[0]
         else: return values
@@ -1141,6 +1307,7 @@ class PyoTableObject(PyoObjectBase):
                 subtable (or the only one) is returned.
 
         """
+        pyoArgsAssert(self, "B", all)
         if all:
             return [obj.getTable() for obj in self._base_objs]
         else:
@@ -1210,6 +1377,7 @@ class PyoTableObject(PyoObjectBase):
                 Exponent factor. Defaults to 10.
 
         """
+        pyoArgsAssert(self, "N", exp)
         [obj.pow(exp) for obj in self._base_objs]
         self.refreshView()
         return self
@@ -1226,6 +1394,7 @@ class PyoTableObject(PyoObjectBase):
                 Gain factor for negative samples. Defaults to 1.
 
         """
+        pyoArgsAssert(self, "NN", gpos, gneg)
         [obj.bipolarGain(gpos, gneg) for obj in self._base_objs]
         self.refreshView()
         return self
@@ -1240,6 +1409,7 @@ class PyoTableObject(PyoObjectBase):
                 Filter's cutoff, in Hertz. Defaults to 1000.
 
         """
+        pyoArgsAssert(self, "N", freq)
         [obj.lowpass(freq) for obj in self._base_objs]
         self.refreshView()
         return self
@@ -1254,6 +1424,7 @@ class PyoTableObject(PyoObjectBase):
                 Fade in duration, in seconds. Defaults to 0.1.
 
         """
+        pyoArgsAssert(self, "N", dur)
         [obj.fadein(dur) for obj in self._base_objs]
         self.refreshView()
         return self
@@ -1268,6 +1439,7 @@ class PyoTableObject(PyoObjectBase):
                 Fade out duration, in seconds. Defaults to 0.1.
 
         """
+        pyoArgsAssert(self, "N", dur)
         [obj.fadeout(dur) for obj in self._base_objs]
         self.refreshView()
         return self
@@ -1285,6 +1457,7 @@ class PyoTableObject(PyoObjectBase):
                 value(s) to add.
 
         """
+        pyoArgsAssert(self, "T", x)
         if type(x) == ListType:
             if type(x[0]) == ListType:
                 [obj.add(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1309,6 +1482,7 @@ class PyoTableObject(PyoObjectBase):
                 value(s) to substract.
 
         """
+        pyoArgsAssert(self, "T", x)
         if type(x) == ListType:
             if type(x[0]) == ListType:
                 [obj.sub(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1333,6 +1507,7 @@ class PyoTableObject(PyoObjectBase):
                 value(s) to multiply.
 
         """
+        pyoArgsAssert(self, "T", x)
         if type(x) == ListType:
             if type(x[0]) == ListType:
                 [obj.mul(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1381,6 +1556,7 @@ class PyoTableObject(PyoObjectBase):
         the server GUI before showing the controller window.
 
         """
+        pyoArgsAssert(self, "SB", title, wxnoserver)
         samples = self._base_objs[0].getViewTable((500,200))
         createViewTableWindow(samples, title, wxnoserver, self.__class__.__name__, self)
 
@@ -1444,6 +1620,7 @@ class PyoMatrixObject(PyoObjectBase):
                 Full path of the generated file.
 
         """
+        pyoArgsAssert(self, "S", path)
         f = open(path, "w")
         f.write(str([obj.getData() for obj in self._base_objs]))
         f.close()
@@ -1469,6 +1646,7 @@ class PyoMatrixObject(PyoObjectBase):
                 Full path of the file to read.
 
         """
+        pyoArgsAssert(self, "S", path)
         f = open(path, "r")
         f_list = eval(f.read())
         f_len = len(f_list)
@@ -1511,6 +1689,7 @@ class PyoMatrixObject(PyoObjectBase):
                 Amount of boost applied on each value. Defaults to 0.01.
 
         """
+        pyoArgsAssert(self, "NNN", min, max, boost)
         [obj.boost(min, max, boost) for obj in self._base_objs]
 
     def put(self, value, x=0, y=0):
@@ -1531,6 +1710,7 @@ class PyoMatrixObject(PyoObjectBase):
                 Y position where to record value. Defaults to 0.
 
         """
+        pyoArgsAssert(self, "NII", value, x, y)
         [obj.put(value, x, y) for obj in self._base_objs]
 
     def get(self, x, y):
@@ -1549,6 +1729,7 @@ class PyoMatrixObject(PyoObjectBase):
                 Y position where to get value. Defaults to 0.
 
         """
+        pyoArgsAssert(self, "II", x, y)
         values = [obj.get(x, y) for obj in self._base_objs]
         if len(values) == 1: return values[0]
         else: return values
@@ -1569,6 +1750,7 @@ class PyoMatrixObject(PyoObjectBase):
         the server GUI before showing the controller window.
 
         """
+        pyoArgsAssert(self, "SB", title, wxnoserver)
         samples = self._base_objs[0].getViewData()
         createViewMatrixWindow(samples, self.getSize(), title, wxnoserver, self)
 
@@ -1619,6 +1801,7 @@ class PyoPVObject(PyoObjectBase):
                 of the first stream.
 
         """
+        pyoArgsAssert(self, "B", all)
         if all:
             return [obj._getStream().isPlaying() for obj in self._base_objs]
         else:
@@ -1641,6 +1824,7 @@ class PyoPVObject(PyoObjectBase):
                 Delay, in seconds, before the object's activation. Defaults to 0.
 
         """
+        pyoArgsAssert(self, "nn", dur, delay)
         dur, delay, lmax = convertArgsToLists(dur, delay)
         if hasattr(self, "_trig_objs"):
             self._trig_objs.play(dur, delay)
@@ -1682,6 +1866,7 @@ class PyoPVObject(PyoObjectBase):
                 Time, in seconds, to reach the new value.
 
         """
+        pyoArgsAssert(self, "Snn", attr, value, port)
         self._target_dict[attr] = value
         init = getattr(self, attr)
         if self._signal_dict.has_key(attr):
@@ -1771,6 +1956,7 @@ class Mix(PyoObject):
 
     """
     def __init__(self, input, voices=1, mul=1, add=0):
+        pyoArgsAssert(self, "oIOO", input, voices, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         mul, add, lmax = convertArgsToLists(mul, add)
@@ -1874,6 +2060,7 @@ class InputFader(PyoObject):
 
     """
     def __init__(self, input):
+        pyoArgsAssert(self, "o", input)
         PyoObject.__init__(self)
         self._input = input
         input, lmax = convertArgsToLists(input)
@@ -1891,6 +2078,7 @@ class InputFader(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput(wrap(x,i), fadetime) for i, obj in enumerate(self._base_objs)]
@@ -1926,6 +2114,7 @@ class Sig(PyoObject):
 
     """
     def __init__(self, value, mul=1, add=0):
+        pyoArgsAssert(self, "OOO", value, mul, add)
         PyoObject.__init__(self, mul, add)
         self._value = value
         value, mul ,add, lmax = convertArgsToLists(value, mul, add)
@@ -1941,6 +2130,7 @@ class Sig(PyoObject):
                 Numerical value to convert.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._value = x
         x, lmax = convertArgsToLists(x)
         [obj.setValue(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1996,6 +2186,7 @@ class VarPort(PyoObject):
 
     """
     def __init__(self, value, time=0.025, init=0.0, function=None, arg=None, mul=1, add=0):
+        pyoArgsAssert(self, "nnnczOO", value, time, init, function, arg, mul, add)
         PyoObject.__init__(self, mul, add)
         self._value = value
         self._time = time
@@ -2013,6 +2204,7 @@ class VarPort(PyoObject):
                 Numerical value to convert.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._value = x
         x, lmax = convertArgsToLists(x)
         [obj.setValue(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2027,6 +2219,7 @@ class VarPort(PyoObject):
                 New ramp time.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._time = x
         x, lmax = convertArgsToLists(x)
         [obj.setTime(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2041,6 +2234,7 @@ class VarPort(PyoObject):
                 new `function` attribute.
 
         """
+        pyoArgsAssert(self, "c", x)
         self._function = getWeakMethodRef(x)
         x, lmax = convertArgsToLists(x)
         [obj.setFunction(WeakMethod(wrap(x,i))) for i, obj in enumerate(self._base_objs)]
@@ -2088,6 +2282,7 @@ class Pow(PyoObject):
 
     """
     def __init__(self, base=10, exponent=1, mul=1, add=0):
+        pyoArgsAssert(self, "OOOO", base, exponent, mul, add)
         PyoObject.__init__(self, mul, add)
         self._base = base
         self._exponent = exponent
@@ -2104,6 +2299,7 @@ class Pow(PyoObject):
                 new `base` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._base = x
         x, lmax = convertArgsToLists(x)
         [obj.setBase(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2118,6 +2314,7 @@ class Pow(PyoObject):
                 new `exponent` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._exponent = x
         x, lmax = convertArgsToLists(x)
         [obj.setExponent(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2172,6 +2369,7 @@ class Wrap(PyoObject):
 
     """
     def __init__(self, input, min=0.0, max=1.0, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOO", input, min, max, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._min = min
@@ -2192,6 +2390,7 @@ class Wrap(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2205,6 +2404,7 @@ class Wrap(PyoObject):
                 New `min` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._min = x
         x, lmax = convertArgsToLists(x)
         [obj.setMin(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2219,6 +2419,7 @@ class Wrap(PyoObject):
                 New `max` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._max = x
         x, lmax = convertArgsToLists(x)
         [obj.setMax(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2280,13 +2481,10 @@ class Compare(PyoObject):
 
     """
     def __init__(self, input, comp, mode="<", mul=1, add=0):
+        pyoArgsAssert(self, "oOsOO", input, comp, mode, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
-        if type(comp) in [StringType, UnicodeType, NoneType]:
-            print 'TypeError: "comp" argument of %s must be a float or a PyoObject. Set to 0.\n' % self.__class__.__name__
-            comp = self._comp = 0
-        else:
-            self._comp = comp
+        self._comp = comp
         self._mode = mode
         self._in_fader = InputFader(input)
         self.comp_dict = {"<": 0, "<=": 1, ">": 2, ">=": 3, "==": 4, "!=": 5}
@@ -2308,6 +2506,7 @@ class Compare(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2321,9 +2520,7 @@ class Compare(PyoObject):
                 New comparison signal.
 
         """
-        if type(x) in [StringType, UnicodeType, NoneType]:
-            print >> sys.stderr, 'TypeError: "comp" argument of %s must be a float or a PyoObject.\n' % self.__class__.__name__
-            return
+        pyoArgsAssert(self, "O", x)
         self._comp = x
         x, lmax = convertArgsToLists(x)
         [obj.setComp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2340,6 +2537,7 @@ class Compare(PyoObject):
                 New `mode` attribute.
 
         """
+        pyoArgsAssert(self, "s", x)
         self._mode = x
         x, lmax = convertArgsToLists(x)
         [obj.setMode(self.comp_dict[wrap(x,i)]) for i, obj in enumerate(self._base_objs)]
diff --git a/pyolib/_wxwidgets.py b/pyolib/_wxwidgets.py
index aeec4fe..137eb23 100644
--- a/pyolib/_wxwidgets.py
+++ b/pyolib/_wxwidgets.py
@@ -1576,7 +1576,7 @@ class ScopeDisplay(wx.Frame):
         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.lenSlider = ControlSlider(self.panel, 10, 1000, length * 1000, log=True, 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)
@@ -1584,9 +1584,9 @@ class ScopeDisplay(wx.Frame):
         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.dispBox.Add(self.box, 1, wx.EXPAND|wx.BOTTOM, 5)
         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.Add(self.gainSlider, 0, wx.EXPAND|wx.BOTTOM, 5)
         self.dispBox.AddSpacer(5)
         self.mainBox.Add(self.dispBox, 1, wx.EXPAND)
         self.panel.SetSizer(self.mainBox)
@@ -1641,7 +1641,6 @@ class ScopePanel(wx.Panel):
 
     def setGain(self, gain):
         self.gain = gain
-        print self.gain
 
     def setLength(self, length):
         self.length = length
diff --git a/pyolib/analysis.py b/pyolib/analysis.py
index a71fc86..81f1db6 100644
--- a/pyolib/analysis.py
+++ b/pyolib/analysis.py
@@ -60,6 +60,7 @@ class Follower(PyoObject):
 
     """
     def __init__(self, input, freq=20, mul=1, add=0):
+        pyoArgsAssert(self, "oOOO", input, freq, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -79,6 +80,7 @@ class Follower(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -92,6 +94,7 @@ class Follower(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -147,6 +150,7 @@ class Follower2(PyoObject):
 
     """
     def __init__(self, input, risetime=0.01, falltime=0.1, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOO", input, risetime, falltime, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._risetime = risetime
@@ -167,6 +171,7 @@ class Follower2(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -180,6 +185,7 @@ class Follower2(PyoObject):
                 New `risetime` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._risetime = x
         x, lmax = convertArgsToLists(x)
         [obj.setRisetime(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -194,6 +200,7 @@ class Follower2(PyoObject):
                 New `falltime` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._falltime = x
         x, lmax = convertArgsToLists(x)
         [obj.setFalltime(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -256,6 +263,7 @@ class ZCross(PyoObject):
 
     """
     def __init__(self, input, thresh=0., mul=1, add=0):
+        pyoArgsAssert(self, "onOO", input, thresh, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._thresh = thresh
@@ -275,6 +283,7 @@ class ZCross(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -288,6 +297,7 @@ class ZCross(PyoObject):
                 New amplitude difference threshold.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._thresh = x
         x, lmax = convertArgsToLists(x)
         [obj.setThresh(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -363,6 +373,7 @@ class Yin(PyoObject):
 
     """
     def __init__(self, input, tolerance=0.2, minfreq=40, maxfreq=1000, cutoff=1000, winsize=1024, mul=1, add=0):
+        pyoArgsAssert(self, "onnnniOO", input, tolerance, minfreq, maxfreq, cutoff, winsize, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._tolerance = tolerance
@@ -385,6 +396,7 @@ class Yin(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -398,6 +410,7 @@ class Yin(PyoObject):
                 New parameter for minima selection, between 0 and 1.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._tolerance = x
         x, lmax = convertArgsToLists(x)
         [obj.setTolerance(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -412,6 +425,7 @@ class Yin(PyoObject):
                 New minimum frequency detected.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._minfreq = x
         x, lmax = convertArgsToLists(x)
         [obj.setMinfreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -426,6 +440,7 @@ class Yin(PyoObject):
                 New maximum frequency detected.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._maxfreq = x
         x, lmax = convertArgsToLists(x)
         [obj.setMaxfreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -440,6 +455,7 @@ class Yin(PyoObject):
                 New input lowpass filter cutoff frequency.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._cutoff = x
         x, lmax = convertArgsToLists(x)
         [obj.setCutoff(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -526,6 +542,7 @@ class Centroid(PyoObject):
 
     """
     def __init__(self, input, size=1024, mul=1, add=0):
+        pyoArgsAssert(self, "oiOO", input, size, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._size = size
@@ -545,6 +562,7 @@ class Centroid(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -566,7 +584,7 @@ class AttackDetector(PyoObject):
     """
     Audio signal onset detection.
 
-    AttackDetector anaylises an audio signal in input an output a trigger each
+    AttackDetector analyses an audio signal in input and output a trigger each
     time an onset is detected. An onset is a sharp amplitude rising while the
     signal had previously fall below a minimum threshold. Parameters must be
     carefully tuned depending on the nature of the analysed signal and the level
@@ -605,6 +623,7 @@ class AttackDetector(PyoObject):
 
     """
     def __init__(self, input, deltime=0.005, cutoff=10, maxthresh=3, minthresh=-30, reltime=0.1, mul=1, add=0):
+        pyoArgsAssert(self, "onnnnnOO", input, deltime, cutoff, maxthresh, minthresh, reltime, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._deltime = deltime
@@ -628,6 +647,7 @@ class AttackDetector(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -641,6 +661,7 @@ class AttackDetector(PyoObject):
                 New delay between rms analysis.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._deltime = x
         x, lmax = convertArgsToLists(x)
         [obj.setDeltime(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -655,6 +676,7 @@ class AttackDetector(PyoObject):
                 New cutoff for the follower lowpass filter.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._cutoff = x
         x, lmax = convertArgsToLists(x)
         [obj.setCutoff(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -669,6 +691,7 @@ class AttackDetector(PyoObject):
                 New attack threshold in dB.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._maxthresh = x
         x, lmax = convertArgsToLists(x)
         [obj.setMaxthresh(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -683,6 +706,7 @@ class AttackDetector(PyoObject):
                 New minimum threshold in dB.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._minthresh = x
         x, lmax = convertArgsToLists(x)
         [obj.setMinthresh(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -697,6 +721,7 @@ class AttackDetector(PyoObject):
                 Time, in seconds, to wait before reporting a new attack.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._reltime = x
         x, lmax = convertArgsToLists(x)
         [obj.setReltime(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -803,6 +828,7 @@ class Spectrum(PyoObject):
 
     """
     def __init__(self, input, size=1024, wintype=2, function=None):
+        pyoArgsAssert(self, "oiiC", input, size, wintype, function)
         PyoObject.__init__(self)
         self.points = None
         self.viewFrame = None
@@ -836,6 +862,7 @@ class Spectrum(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -849,6 +876,7 @@ class Spectrum(PyoObject):
                 new `size` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._size = x
         x, lmax = convertArgsToLists(x)
         [obj.setSize(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -863,6 +891,7 @@ class Spectrum(PyoObject):
                 new `wintype` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._wintype = x
         x, lmax = convertArgsToLists(x)
         [obj.setWinType(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -879,6 +908,7 @@ class Spectrum(PyoObject):
                 and will receive the data as a list of lists (one list per channel).
 
         """
+        pyoArgsAssert(self, "C", function)
         self._function = getWeakMethodRef(function)
 
     def poll(self, active):
@@ -892,6 +922,7 @@ class Spectrum(PyoObject):
                 defaults to True.
 
         """
+        pyoArgsAssert(self, "B", active)
         if active:
             self._timer.play()
         else:
@@ -908,6 +939,7 @@ class Spectrum(PyoObject):
                 retrieve the current analysis frame. defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "N", time)
         self._timer.time = time
 
     def setLowbound(self, x):
@@ -922,6 +954,7 @@ class Spectrum(PyoObject):
                 new `lowbound` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._lowbound = x
         x, lmax = convertArgsToLists(x)
         tmp = [obj.setLowbound(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -939,6 +972,7 @@ class Spectrum(PyoObject):
                 new `highbound` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._highbound = x
         x, lmax = convertArgsToLists(x)
         tmp = [obj.setHighbound(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -971,6 +1005,7 @@ class Spectrum(PyoObject):
                 new `width` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._width = x
         x, lmax = convertArgsToLists(x)
         [obj.setWidth(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -987,6 +1022,7 @@ class Spectrum(PyoObject):
                 new `height` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._height = x
         x, lmax = convertArgsToLists(x)
         [obj.setHeight(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1002,6 +1038,7 @@ class Spectrum(PyoObject):
                 it back to linear. Defaults to False.
 
         """
+        pyoArgsAssert(self, "b", x)
         self._fscaling = x
         x, lmax = convertArgsToLists(x)
         [obj.setFscaling(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1019,6 +1056,7 @@ class Spectrum(PyoObject):
                 False turns it back to linear. Defaults to True.
 
         """
+        pyoArgsAssert(self, "b", x)
         self._mscaling = x
         x, lmax = convertArgsToLists(x)
         [obj.setMscaling(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1053,6 +1091,7 @@ class Spectrum(PyoObject):
                 new `gain` attribute, as linear values.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._gain = x
         x, lmax = convertArgsToLists(x)
         [obj.setGain(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1073,6 +1112,7 @@ class Spectrum(PyoObject):
         the server GUI before showing the controller window.
 
         """
+        pyoArgsAssert(self, "SB", title, wxnoserver)
         createSpectrumWindow(self, title, wxnoserver)
 
     def _setViewFrame(self, frame):
@@ -1196,6 +1236,7 @@ class Scope(PyoObject):
 
     """
     def __init__(self, input, length=0.05, gain=0.67):
+        pyoArgsAssert(self, "oNN", input, length, gain)
         PyoObject.__init__(self)
         self.points = None
         self.viewFrame = None
@@ -1222,6 +1263,7 @@ class Scope(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1235,6 +1277,7 @@ class Scope(PyoObject):
                 new `length` attribute.
 
         """
+        pyoArgsAssert(self, "N", x)
         self._length = x
         self._timer.time = x
         [obj.setLength(x) for obj in self._base_objs]
@@ -1249,6 +1292,7 @@ class Scope(PyoObject):
                 new `gain` attribute, as linear values.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._gain = x
         x, lmax = convertArgsToLists(x)
         [obj.setGain(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1264,6 +1308,7 @@ class Scope(PyoObject):
                 defaults to True.
 
         """
+        pyoArgsAssert(self, "B", active)
         if active:
             self._timer.play()
         else:
@@ -1283,6 +1328,7 @@ class Scope(PyoObject):
                 width is 500.
 
         """
+        pyoArgsAssert(self, "I", x)
         self._width = x
         [obj.setWidth(x) for obj in self._base_objs]
 
@@ -1300,6 +1346,7 @@ class Scope(PyoObject):
                 height is 400.
 
         """
+        pyoArgsAssert(self, "I", x)
         self._height = x
         [obj.setHeight(x) for obj in self._base_objs]
 
@@ -1319,6 +1366,7 @@ class Scope(PyoObject):
         the server GUI before showing the controller window.
 
         """
+        pyoArgsAssert(self, "SB", title, wxnoserver)
         createScopeWindow(self, title, wxnoserver)
 
     def _setViewFrame(self, frame):
@@ -1393,6 +1441,7 @@ class PeakAmp(PyoObject):
 
     """
     def __init__(self, input, function=None, mul=1, add=0):
+        pyoArgsAssert(self, "oCOO", input, function, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         if callable(function):
@@ -1404,7 +1453,7 @@ class PeakAmp(PyoObject):
         self._base_objs = [PeakAmp_base(wrap(in_fader,i), wrap(mul,i), wrap(add,i)) for i in range(lmax)]
         sr = self.getSamplingRate()
         bs = self.getBufferSize()
-        self._timer = Pattern(self._buildList, bs/sr).play()
+        self._timer = Pattern(self._buildList, 0.06).play()
 
     def setInput(self, x, fadetime=0.05):
         """
@@ -1418,6 +1467,7 @@ class PeakAmp(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1431,9 +1481,23 @@ class PeakAmp(PyoObject):
                 New function to call with amplitude values in arguments.
 
         """
+        pyoArgsAssert(self, "C", x)
         if callable(x):
             self._function = getWeakMethodRef(x)
 
+    def polltime(self, x):
+        """
+        Sets the delay, in seconds, between each call of the function.
+
+        :Args:
+
+            x : float
+                New polling time in seconds.
+
+        """
+        pyoArgsAssert(self, "N", x)
+        self._timer.time = x
+
     def out(self, chnl=0, inc=1, dur=0, delay=0):
         return self.play(dur, delay)
 
diff --git a/pyolib/arithmetic.py b/pyolib/arithmetic.py
index 3c12942..f1a476b 100644
--- a/pyolib/arithmetic.py
+++ b/pyolib/arithmetic.py
@@ -47,6 +47,7 @@ class Sin(PyoObject):
     """
 
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -65,6 +66,7 @@ class Sin(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -96,6 +98,7 @@ class Cos(PyoObject):
 
     """
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -114,6 +117,7 @@ class Cos(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -152,6 +156,7 @@ class Tan(PyoObject):
 
     """
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -170,6 +175,7 @@ class Tan(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -203,6 +209,7 @@ class Abs(PyoObject):
     """
 
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -221,6 +228,7 @@ class Abs(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -259,6 +267,7 @@ class Sqrt(PyoObject):
     """
 
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -277,6 +286,7 @@ class Sqrt(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -311,6 +321,7 @@ class Log(PyoObject):
     """
 
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -329,6 +340,7 @@ class Log(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -363,6 +375,7 @@ class Log2(PyoObject):
     """
 
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -381,6 +394,7 @@ class Log2(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -415,6 +429,7 @@ class Log10(PyoObject):
     """
 
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -433,6 +448,7 @@ class Log10(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -470,6 +486,7 @@ class Atan2(PyoObject):
 
     """
     def __init__(self, b=1, a=1, mul=1, add=0):
+        pyoArgsAssert(self, "OOOO", b, a, mul, add)
         PyoObject.__init__(self, mul, add)
         self._b = b
         self._a = a
@@ -486,6 +503,7 @@ class Atan2(PyoObject):
                 new `b` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._b = x
         x, lmax = convertArgsToLists(x)
         [obj.setB(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -500,6 +518,7 @@ class Atan2(PyoObject):
                 new `a` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._a = x
         x, lmax = convertArgsToLists(x)
         [obj.setA(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -542,6 +561,7 @@ class Floor(PyoObject):
     """
 
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -560,6 +580,7 @@ class Floor(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -594,6 +615,7 @@ class Ceil(PyoObject):
     """
 
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -612,6 +634,7 @@ class Ceil(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -646,6 +669,7 @@ class Round(PyoObject):
     """
 
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -664,6 +688,7 @@ class Round(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -696,6 +721,7 @@ class Tanh(PyoObject):
     """
 
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -714,6 +740,7 @@ class Tanh(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
diff --git a/pyolib/controls.py b/pyolib/controls.py
index 2e99f20..7385c01 100644
--- a/pyolib/controls.py
+++ b/pyolib/controls.py
@@ -77,6 +77,7 @@ class Fader(PyoObject):
 
     """
     def __init__(self, fadein=0.01, fadeout=0.1, dur=0, mul=1, add=0):
+        pyoArgsAssert(self, "nnnOO", fadein, fadeout, dur, mul, add)
         PyoObject.__init__(self, mul, add)
         self._fadein = fadein
         self._fadeout = fadeout
@@ -97,6 +98,7 @@ class Fader(PyoObject):
                 new `fadein` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._fadein = x
         x, lmax = convertArgsToLists(x)
         [obj.setFadein(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -111,6 +113,7 @@ class Fader(PyoObject):
                 new `fadeout` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._fadeout = x
         x, lmax = convertArgsToLists(x)
         [obj.setFadeout(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -125,6 +128,7 @@ class Fader(PyoObject):
                 new `dur` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._dur = x
         x, lmax = convertArgsToLists(x)
         [obj.setDur(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -203,6 +207,7 @@ class Adsr(PyoObject):
 
     """
     def __init__(self, attack=0.01, decay=0.05, sustain=0.707, release=0.1, dur=0, mul=1, add=0):
+        pyoArgsAssert(self, "nnnnnOO", attack, decay, sustain, release, dur, mul, add)
         PyoObject.__init__(self, mul, add)
         self._attack = attack
         self._decay = decay
@@ -225,6 +230,7 @@ class Adsr(PyoObject):
                 new `attack` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._attack = x
         x, lmax = convertArgsToLists(x)
         [obj.setAttack(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -239,6 +245,7 @@ class Adsr(PyoObject):
                 new `decay` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._decay = x
         x, lmax = convertArgsToLists(x)
         [obj.setDecay(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -253,6 +260,7 @@ class Adsr(PyoObject):
                 new `sustain` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._sustain = x
         x, lmax = convertArgsToLists(x)
         [obj.setSustain(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -267,6 +275,7 @@ class Adsr(PyoObject):
                 new `sustain` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._release = x
         x, lmax = convertArgsToLists(x)
         [obj.setRelease(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -281,6 +290,7 @@ class Adsr(PyoObject):
                 new `dur` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._dur = x
         x, lmax = convertArgsToLists(x)
         [obj.setDur(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -363,13 +373,8 @@ class Linseg(PyoObject):
 
     """
     def __init__(self, list, loop=False, initToFirstVal=False, mul=1, add=0):
+        pyoArgsAssert(self, "lbbOO", list, loop, initToFirstVal, mul, add)
         PyoObject.__init__(self, mul, add)
-        if type(list) != ListType:
-            print >> sys.stderr, 'TypeError: "list" argument of %s must be a list of tuples.\n' % self.__class__.__name__
-            exit()
-        if type(list[0]) != TupleType:
-            print >> sys.stderr, 'TypeError: "list" argument of %s must be a list of tuples.\n' % self.__class__.__name__
-            exit()
         self._list = list
         self._loop = loop
         initToFirstVal, loop, mul, add, lmax = convertArgsToLists(initToFirstVal, loop, mul, add)
@@ -393,6 +398,7 @@ class Linseg(PyoObject):
                 new `list` attribute.
 
         """
+        pyoArgsAssert(self, "l", x)
         self._list = x
         if type(x[0]) != ListType:
             [obj.setList(x) for i, obj in enumerate(self._base_objs)]
@@ -424,6 +430,7 @@ class Linseg(PyoObject):
                 new `loop` attribute.
 
         """
+        pyoArgsAssert(self, "b", x)
         self._loop = x
         x, lmax = convertArgsToLists(x)
         [obj.setLoop(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -525,13 +532,8 @@ class Expseg(PyoObject):
 
     """
     def __init__(self, list, loop=False, exp=10, inverse=True, initToFirstVal=False, mul=1, add=0):
+        pyoArgsAssert(self, "lbnbbOO", list, loop, exp, inverse, initToFirstVal, mul, add)
         PyoObject.__init__(self, mul, add)
-        if type(list) != ListType:
-            print >> sys.stderr, 'TypeError: "list" argument of %s must be a list of tuples.\n' % self.__class__.__name__
-            exit()
-        if type(list[0]) != TupleType:
-            print >> sys.stderr, 'TypeError: "list" argument of %s must be a list of tuples.\n' % self.__class__.__name__
-            exit()
         self._list = list
         self._loop = loop
         self._exp = exp
@@ -557,6 +559,7 @@ class Expseg(PyoObject):
                 new `list` attribute.
 
         """
+        pyoArgsAssert(self, "l", x)
         self._list = x
         if type(x[0]) != ListType:
             [obj.setList(x) for i, obj in enumerate(self._base_objs)]
@@ -573,6 +576,7 @@ class Expseg(PyoObject):
                 new `loop` attribute.
 
         """
+        pyoArgsAssert(self, "b", x)
         self._loop = x
         x, lmax = convertArgsToLists(x)
         [obj.setLoop(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -587,6 +591,7 @@ class Expseg(PyoObject):
                 new `exp` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._exp = x
         x, lmax = convertArgsToLists(x)
         [obj.setExp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -601,6 +606,7 @@ class Expseg(PyoObject):
                 new `inverse` attribute.
 
         """
+        pyoArgsAssert(self, "b", x)
         self._inverse = x
         x, lmax = convertArgsToLists(x)
         [obj.setInverse(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -727,6 +733,7 @@ class SigTo(PyoObject):
 
     """
     def __init__(self, value, time=0.025, init=0.0, mul=1, add=0):
+        pyoArgsAssert(self, "OnnOO", value, time, init, mul, add)
         PyoObject.__init__(self, mul, add)
         self._value = value
         self._time = time
@@ -743,6 +750,7 @@ class SigTo(PyoObject):
                 Numerical value to convert.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._value = x
         x, lmax = convertArgsToLists(x)
         [obj.setValue(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -757,6 +765,7 @@ class SigTo(PyoObject):
                 New ramp time.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._time = x
         x, lmax = convertArgsToLists(x)
         [obj.setTime(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
diff --git a/pyolib/dynamics.py b/pyolib/dynamics.py
index dbe2ca2..5867977 100644
--- a/pyolib/dynamics.py
+++ b/pyolib/dynamics.py
@@ -49,6 +49,7 @@ class Clip(PyoObject):
 
     """
     def __init__(self, input, min=-1.0, max=1.0, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOO", input, min, max, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._min = min
@@ -69,6 +70,7 @@ class Clip(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -82,6 +84,7 @@ class Clip(PyoObject):
                 New `min` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._min = x
         x, lmax = convertArgsToLists(x)
         [obj.setMin(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -96,6 +99,7 @@ class Clip(PyoObject):
                 New `max` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._max = x
         x, lmax = convertArgsToLists(x)
         [obj.setMax(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -159,6 +163,7 @@ class Mirror(PyoObject):
 
     """
     def __init__(self, input, min=0.0, max=1.0, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOO", input, min, max, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._min = min
@@ -179,6 +184,7 @@ class Mirror(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -192,6 +198,7 @@ class Mirror(PyoObject):
                 New `min` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._min = x
         x, lmax = convertArgsToLists(x)
         [obj.setMin(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -206,6 +213,7 @@ class Mirror(PyoObject):
                 New `max` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._max = x
         x, lmax = convertArgsToLists(x)
         [obj.setMax(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -267,6 +275,7 @@ class Degrade(PyoObject):
 
     """
     def __init__(self, input, bitdepth=16, srscale=1.0, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOO", input, bitdepth, srscale, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._bitdepth = bitdepth
@@ -287,6 +296,7 @@ class Degrade(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -300,6 +310,7 @@ class Degrade(PyoObject):
                 New `bitdepth` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._bitdepth = x
         x, lmax = convertArgsToLists(x)
         [obj.setBitdepth(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -314,6 +325,7 @@ class Degrade(PyoObject):
                 New `srscale` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._srscale = x
         x, lmax = convertArgsToLists(x)
         [obj.setSrscale(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -395,6 +407,7 @@ class Compress(PyoObject):
 
     """
     def __init__(self, input, thresh=-20, ratio=2, risetime=0.01, falltime=0.1, lookahead=5.0, knee=0, outputAmp=False, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOOnnbOO", input, thresh, ratio, risetime, falltime, lookahead, knee, outputAmp, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._thresh = thresh
@@ -419,6 +432,7 @@ class Compress(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -432,6 +446,7 @@ class Compress(PyoObject):
                 New `thresh` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._thresh = x
         x, lmax = convertArgsToLists(x)
         [obj.setThresh(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -446,6 +461,7 @@ class Compress(PyoObject):
                 New `ratio` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._ratio = x
         x, lmax = convertArgsToLists(x)
         [obj.setRatio(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -460,6 +476,7 @@ class Compress(PyoObject):
                 New `risetime` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._risetime = x
         x, lmax = convertArgsToLists(x)
         [obj.setRiseTime(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -474,6 +491,7 @@ class Compress(PyoObject):
                 New `falltime` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._falltime = x
         x, lmax = convertArgsToLists(x)
         [obj.setFallTime(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -488,6 +506,7 @@ class Compress(PyoObject):
                 New `lookahead` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._lookahead = x
         x, lmax = convertArgsToLists(x)
         [obj.setLookAhead(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -502,6 +521,7 @@ class Compress(PyoObject):
                 New `knee` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._knee = x
         x, lmax = convertArgsToLists(x)
         [obj.setKnee(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -607,6 +627,7 @@ class Gate(PyoObject):
 
     """
     def __init__(self, input, thresh=-70, risetime=0.01, falltime=0.05, lookahead=5.0, outputAmp=False, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOnbOO", input, thresh, risetime, falltime, lookahead, outputAmp, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._thresh = thresh
@@ -629,6 +650,7 @@ class Gate(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -642,6 +664,7 @@ class Gate(PyoObject):
                 New `thresh` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._thresh = x
         x, lmax = convertArgsToLists(x)
         [obj.setThresh(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -656,6 +679,7 @@ class Gate(PyoObject):
                 New `risetime` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._risetime = x
         x, lmax = convertArgsToLists(x)
         [obj.setRiseTime(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -670,6 +694,7 @@ class Gate(PyoObject):
                 New `falltime` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._falltime = x
         x, lmax = convertArgsToLists(x)
         [obj.setFallTime(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -684,6 +709,7 @@ class Gate(PyoObject):
                 New `lookahead` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._lookahead = x
         x, lmax = convertArgsToLists(x)
         [obj.setLookAhead(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -756,6 +782,7 @@ class Balance(PyoObject):
 
     """
     def __init__(self, input, input2, freq=10, mul=1, add=0):
+        pyoArgsAssert(self, "ooOOO", input, input2, freq, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._input2 = input2
@@ -779,6 +806,7 @@ class Balance(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -796,6 +824,7 @@ class Balance(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input2 = x
         self._in_fader2.setInput(x, fadetime)
 
@@ -811,6 +840,7 @@ class Balance(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -863,6 +893,7 @@ class Min(PyoObject):
 
     """
     def __init__(self, input, comp=0.5, mul=1, add=0):
+        pyoArgsAssert(self, "oOOO", input, comp, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._comp = comp
@@ -882,6 +913,7 @@ class Min(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -895,6 +927,7 @@ class Min(PyoObject):
                 New `comp` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._comp = x
         x, lmax = convertArgsToLists(x)
         [obj.setComp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -940,6 +973,7 @@ class Max(PyoObject):
 
     """
     def __init__(self, input, comp=0.5, mul=1, add=0):
+        pyoArgsAssert(self, "oOOO", input, comp, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._comp = comp
@@ -959,6 +993,7 @@ class Max(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -972,6 +1007,7 @@ class Max(PyoObject):
                 New `comp` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._comp = x
         x, lmax = convertArgsToLists(x)
         [obj.setComp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -992,4 +1028,4 @@ class Max(PyoObject):
         """float or PyoObject. Comparison value."""
         return self._comp
     @comp.setter
-    def comp(self, x): self.setComp(x)
\ No newline at end of file
+    def comp(self, x): self.setComp(x)
diff --git a/pyolib/effects.py b/pyolib/effects.py
index aa6ca12..0e4e915 100644
--- a/pyolib/effects.py
+++ b/pyolib/effects.py
@@ -55,6 +55,7 @@ class Disto(PyoObject):
 
     """
     def __init__(self, input, drive=.75, slope=.5, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOO", input, drive, slope, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._drive = drive
@@ -75,6 +76,7 @@ class Disto(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -88,6 +90,7 @@ class Disto(PyoObject):
                 New `drive` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._drive = x
         x, lmax = convertArgsToLists(x)
         [obj.setDrive(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -102,6 +105,7 @@ class Disto(PyoObject):
                 New `slope` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._slope = x
         x, lmax = convertArgsToLists(x)
         [obj.setSlope(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -170,6 +174,7 @@ class Delay(PyoObject):
 
     """
     def __init__(self, input, delay=0.25, feedback=0, maxdelay=1, mul=1, add=0):
+        pyoArgsAssert(self, "oOOnOO", input, delay, feedback, maxdelay, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._delay = delay
@@ -191,6 +196,7 @@ class Delay(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -204,6 +210,7 @@ class Delay(PyoObject):
                 New `delay` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._delay = x
         x, lmax = convertArgsToLists(x)
         [obj.setDelay(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -218,6 +225,7 @@ class Delay(PyoObject):
                 New `feedback` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._feedback = x
         x, lmax = convertArgsToLists(x)
         [obj.setFeedback(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -285,6 +293,7 @@ class SDelay(PyoObject):
 
     """
     def __init__(self, input, delay=0.25, maxdelay=1, mul=1, add=0):
+        pyoArgsAssert(self, "oOnOO", input, delay, maxdelay, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._delay = delay
@@ -305,6 +314,7 @@ class SDelay(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -318,6 +328,7 @@ class SDelay(PyoObject):
                 New `delay` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._delay = x
         x, lmax = convertArgsToLists(x)
         [obj.setDelay(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -379,6 +390,7 @@ class Waveguide(PyoObject):
 
     """
     def __init__(self, input, freq=100, dur=10, minfreq=20, mul=1, add=0):
+        pyoArgsAssert(self, "oOOnOO", input, freq, dur, minfreq, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -399,6 +411,7 @@ class Waveguide(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -412,6 +425,7 @@ class Waveguide(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -426,6 +440,7 @@ class Waveguide(PyoObject):
                 New `dur` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._dur = x
         x, lmax = convertArgsToLists(x)
         [obj.setDur(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -493,6 +508,7 @@ class AllpassWG(PyoObject):
 
     """
     def __init__(self, input, freq=100, feed=0.95, detune=0.5, minfreq=20, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOnOO", input, freq, feed, detune, minfreq, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -514,6 +530,7 @@ class AllpassWG(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -527,6 +544,7 @@ class AllpassWG(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -541,6 +559,7 @@ class AllpassWG(PyoObject):
                 New `feed` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._feed = x
         x, lmax = convertArgsToLists(x)
         [obj.setFeed(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -555,6 +574,7 @@ class AllpassWG(PyoObject):
                 New `detune` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._detune = x
         x, lmax = convertArgsToLists(x)
         [obj.setDetune(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -627,6 +647,7 @@ class Freeverb(PyoObject):
 
     """
     def __init__(self, input, size=.5, damp=.5, bal=.5, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOOO", input, size, damp, bal, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._size = size
@@ -648,6 +669,7 @@ class Freeverb(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -661,6 +683,7 @@ class Freeverb(PyoObject):
                 New `size` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._size = x
         x, lmax = convertArgsToLists(x)
         [obj.setSize(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -675,6 +698,7 @@ class Freeverb(PyoObject):
                 New `damp` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._damp = x
         x, lmax = convertArgsToLists(x)
         [obj.setDamp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -689,6 +713,7 @@ class Freeverb(PyoObject):
                 New `bal` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._bal = x
         x, lmax = convertArgsToLists(x)
         [obj.setMix(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -772,6 +797,7 @@ class Convolve(PyoObject):
 
     """
     def __init__(self, input, table, size, mul=1, add=0):
+        pyoArgsAssert(self, "otiOO", input, table, size, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._table = table
@@ -792,6 +818,7 @@ class Convolve(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -805,6 +832,7 @@ class Convolve(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -825,9 +853,9 @@ class Convolve(PyoObject):
 
 class WGVerb(PyoObject):
     """
-    8 delay line mono FDN reverb.
+    8 delay lines mono FDN reverb.
 
-    8 delay line FDN reverb, with feedback matrix based upon physical
+    8 delay lines FDN reverb, with feedback matrix based upon physical
     modeling scattering junction of 8 lossless waveguides of equal
     characteristic impedance.
 
@@ -857,6 +885,7 @@ class WGVerb(PyoObject):
 
     """
     def __init__(self, input, feedback=0.5, cutoff=5000, bal=0.5, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOOO", input, feedback, cutoff, bal, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._feedback = feedback
@@ -878,6 +907,7 @@ class WGVerb(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -891,6 +921,7 @@ class WGVerb(PyoObject):
                 New `feedback` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._feedback = x
         x, lmax = convertArgsToLists(x)
         [obj.setFeedback(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -905,6 +936,7 @@ class WGVerb(PyoObject):
                 New `cutoff` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._cutoff = x
         x, lmax = convertArgsToLists(x)
         [obj.setCutoff(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -919,6 +951,7 @@ class WGVerb(PyoObject):
                 New `bal` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._bal = x
         x, lmax = convertArgsToLists(x)
         [obj.setMix(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -987,6 +1020,7 @@ class Chorus(PyoObject):
 
     """
     def __init__(self, input, depth=1, feedback=0.25, bal=0.5, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOOO", input, depth, feedback, bal, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._depth = depth
@@ -1008,6 +1042,7 @@ class Chorus(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1021,6 +1056,7 @@ class Chorus(PyoObject):
                 New `depth` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._depth = x
         x, lmax = convertArgsToLists(x)
         [obj.setDepth(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1035,6 +1071,7 @@ class Chorus(PyoObject):
                 New `feedback` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._feedback = x
         x, lmax = convertArgsToLists(x)
         [obj.setFeedback(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1049,6 +1086,7 @@ class Chorus(PyoObject):
                 New `bal` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._bal = x
         x, lmax = convertArgsToLists(x)
         [obj.setMix(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1114,6 +1152,7 @@ class Harmonizer(PyoObject):
 
     """
     def __init__(self, input, transpo=-7.0, feedback=0, winsize=0.1, mul=1, add=0):
+        pyoArgsAssert(self, "oOOnOO", input, transpo, feedback, winsize, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._transpo = transpo
@@ -1135,6 +1174,7 @@ class Harmonizer(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1148,6 +1188,7 @@ class Harmonizer(PyoObject):
                 New `transpo` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._transpo = x
         x, lmax = convertArgsToLists(x)
         [obj.setTranspo(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1162,6 +1203,7 @@ class Harmonizer(PyoObject):
                 New `feedback` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._feedback = x
         x, lmax = convertArgsToLists(x)
         [obj.setFeedback(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1176,6 +1218,7 @@ class Harmonizer(PyoObject):
                 New `winsize` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._winsize = x
         x, lmax = convertArgsToLists(x)
         [obj.setWinsize(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1238,6 +1281,7 @@ class Delay1(PyoObject):
 
     """
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -1256,6 +1300,7 @@ class Delay1(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1312,6 +1357,7 @@ class STRev(PyoObject):
 
     """
     def __init__(self, input, inpos=0.5, revtime=1, cutoff=5000, bal=.5, roomSize=1, firstRefGain=-3, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOOnnOO", input, inpos, revtime, cutoff, bal, roomSize, firstRefGain, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._inpos = inpos
@@ -1337,6 +1383,7 @@ class STRev(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1350,6 +1397,7 @@ class STRev(PyoObject):
                 New `inpos` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._inpos = x
         x, lmax = convertArgsToLists(x)
         [obj.setInpos(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -1364,6 +1412,7 @@ class STRev(PyoObject):
                 New `revtime` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._revtime = x
         x, lmax = convertArgsToLists(x)
         [obj.setRevtime(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -1378,6 +1427,7 @@ class STRev(PyoObject):
                 New `cutoff` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._cutoff = x
         x, lmax = convertArgsToLists(x)
         [obj.setCutoff(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -1392,6 +1442,7 @@ class STRev(PyoObject):
                 New `bal` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._bal = x
         x, lmax = convertArgsToLists(x)
         [obj.setMix(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -1406,6 +1457,7 @@ class STRev(PyoObject):
                 Room size scaler, between 0.25 and 4.0.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._roomSize = x
         x, lmax = convertArgsToLists(x)
         [obj.setRoomSize(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -1420,6 +1472,7 @@ class STRev(PyoObject):
                 Gain, in dB, of the first reflexions.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._firstRefGain = x
         x, lmax = convertArgsToLists(x)
         [obj.setFirstRefGain(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -1527,6 +1580,7 @@ class SmoothDelay(PyoObject):
 
     """
     def __init__(self, input, delay=0.25, feedback=0, crossfade=0.05, maxdelay=1, mul=1, add=0):
+        pyoArgsAssert(self, "oOOnnOO", input, delay, feedback, crossfade, maxdelay, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._delay = delay
@@ -1549,6 +1603,7 @@ class SmoothDelay(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1562,6 +1617,7 @@ class SmoothDelay(PyoObject):
                 New `delay` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._delay = x
         x, lmax = convertArgsToLists(x)
         [obj.setDelay(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1576,6 +1632,7 @@ class SmoothDelay(PyoObject):
                 New `feedback` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._feedback = x
         x, lmax = convertArgsToLists(x)
         [obj.setFeedback(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1590,6 +1647,7 @@ class SmoothDelay(PyoObject):
                 New `crossfade` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._crossfade = x
         x, lmax = convertArgsToLists(x)
         [obj.setCrossfade(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1665,6 +1723,7 @@ class FreqShift(PyoObject):
 
     """
     def __init__(self, input, shift=100, mul=1, add=0):
+        pyoArgsAssert(self, "oOOO", input, shift, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._shift = shift
@@ -1719,6 +1778,7 @@ class FreqShift(PyoObject):
             Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1732,6 +1792,7 @@ class FreqShift(PyoObject):
             New `shift` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._shift = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._sin_objs)]
diff --git a/pyolib/filters.py b/pyolib/filters.py
index ebb5a89..507be15 100644
--- a/pyolib/filters.py
+++ b/pyolib/filters.py
@@ -69,6 +69,7 @@ class Biquad(PyoObject):
 
     """
     def __init__(self, input, freq=1000, q=1, type=0, mul=1, add=0):
+        pyoArgsAssert(self, "oOOiOO", input, freq, q, type, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -90,6 +91,7 @@ class Biquad(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -103,6 +105,7 @@ class Biquad(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -117,6 +120,7 @@ class Biquad(PyoObject):
                 New `q` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._q = x
         x, lmax = convertArgsToLists(x)
         [obj.setQ(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -136,6 +140,7 @@ class Biquad(PyoObject):
                     4. allpass
 
         """
+        pyoArgsAssert(self, "i", x)
         self._type = x
         x, lmax = convertArgsToLists(x)
         [obj.setType(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -212,6 +217,7 @@ class Biquadx(PyoObject):
 
     """
     def __init__(self, input, freq=1000, q=1, type=0, stages=4, mul=1, add=0):
+        pyoArgsAssert(self, "oOOiiOO", input, freq, q, type, stages, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -234,6 +240,7 @@ class Biquadx(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -247,6 +254,7 @@ class Biquadx(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -261,6 +269,7 @@ class Biquadx(PyoObject):
                 New `q` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._q = x
         x, lmax = convertArgsToLists(x)
         [obj.setQ(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -280,6 +289,7 @@ class Biquadx(PyoObject):
                 4. allpass
 
         """
+        pyoArgsAssert(self, "i", x)
         self._type = x
         x, lmax = convertArgsToLists(x)
         [obj.setType(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -294,6 +304,7 @@ class Biquadx(PyoObject):
                 New `stages` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._stages = x
         x, lmax = convertArgsToLists(x)
         [obj.setStages(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -383,6 +394,7 @@ class Biquada(PyoObject):
 
     """
     def __init__(self, input, b0=0.005066, b1=0.010132, b2=0.005066, a0=1.070997, a1=-1.979735, a2=0.929003, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOOOOOO", input, b0, b1, b2, a0, a1, a2, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._b0 = Sig(b0)
@@ -407,6 +419,7 @@ class Biquada(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -420,6 +433,7 @@ class Biquada(PyoObject):
                 New `b0` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._b0.value = x
 
     def setB1(self, x):
@@ -432,6 +446,7 @@ class Biquada(PyoObject):
                 New `b1` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._b1.value = x
 
     def setB2(self, x):
@@ -444,6 +459,7 @@ class Biquada(PyoObject):
                 New `b2` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._b2.value = x
 
     def setA0(self, x):
@@ -456,6 +472,7 @@ class Biquada(PyoObject):
                 New `a0` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._a0.value = x
 
     def setA1(self, x):
@@ -468,6 +485,7 @@ class Biquada(PyoObject):
                 New `a1` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._a1.value = x
 
     def setA2(self, x):
@@ -480,6 +498,7 @@ class Biquada(PyoObject):
                 New `a2` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._a2.value = x
 
     def setCoeffs(self, *args, **kwds):
@@ -601,6 +620,7 @@ class EQ(PyoObject):
 
     """
     def __init__(self, input, freq=1000, q=1, boost=-3.0, type=0, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOiOO", input, freq, q, boost, type, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -623,6 +643,7 @@ class EQ(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -636,6 +657,7 @@ class EQ(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -650,6 +672,7 @@ class EQ(PyoObject):
                 New `q` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._q = x
         x, lmax = convertArgsToLists(x)
         [obj.setQ(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -664,6 +687,7 @@ class EQ(PyoObject):
                 New `boost` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._boost = x
         x, lmax = convertArgsToLists(x)
         [obj.setBoost(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -681,6 +705,7 @@ class EQ(PyoObject):
                 2. highshelf
 
         """
+        pyoArgsAssert(self, "i", x)
         self._type = x
         x, lmax = convertArgsToLists(x)
         [obj.setType(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -748,6 +773,7 @@ class Tone(PyoObject):
 
     """
     def __init__(self, input, freq=1000, mul=1, add=0):
+        pyoArgsAssert(self, "oOOO", input, freq, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -767,6 +793,7 @@ class Tone(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -780,6 +807,7 @@ class Tone(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -823,6 +851,7 @@ class Atone(PyoObject):
 
     """
     def __init__(self, input, freq=1000, mul=1, add=0):
+        pyoArgsAssert(self, "oOOO", input, freq, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -842,6 +871,7 @@ class Atone(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -855,6 +885,7 @@ class Atone(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -910,6 +941,7 @@ class Port(PyoObject):
 
     """
     def __init__(self, input, risetime=0.05, falltime=0.05, init=0, mul=1, add=0):
+        pyoArgsAssert(self, "oOOnOO", input, risetime, falltime, init, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._risetime = risetime
@@ -930,6 +962,7 @@ class Port(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -943,6 +976,7 @@ class Port(PyoObject):
                 New `risetime` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._risetime = x
         x, lmax = convertArgsToLists(x)
         [obj.setRiseTime(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -957,6 +991,7 @@ class Port(PyoObject):
                 New `falltime` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._falltime = x
         x, lmax = convertArgsToLists(x)
         [obj.setFallTime(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1006,6 +1041,7 @@ class DCBlock(PyoObject):
 
     """
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -1024,6 +1060,7 @@ class DCBlock(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1070,6 +1107,7 @@ class BandSplit(PyoObject):
 
     """
     def __init__(self, input, num=6, min=20, max=20000, q=1, mul=1, add=0):
+        pyoArgsAssert(self, "oINNOOO", input, num, min, max, q, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._num = num
@@ -1098,6 +1136,7 @@ class BandSplit(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1111,6 +1150,7 @@ class BandSplit(PyoObject):
                 new `q` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._q = x
         x, lmax = convertArgsToLists(x)
         [obj.setQ(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -1169,6 +1209,7 @@ class FourBand(PyoObject):
 
     """
     def __init__(self, input, freq1=150, freq2=500, freq3=2000, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOOO", input, freq1, freq2, freq3, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq1 = freq1
@@ -1196,6 +1237,7 @@ class FourBand(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1209,6 +1251,7 @@ class FourBand(PyoObject):
                 new `freq1` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq1 = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq1(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -1223,6 +1266,7 @@ class FourBand(PyoObject):
                 new `freq2` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq2 = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq2(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -1237,6 +1281,7 @@ class FourBand(PyoObject):
                 new `freq3` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq3 = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq3(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -1321,6 +1366,7 @@ class Hilbert(PyoObject):
 
     """
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._real_dummy = []
         self._imag_dummy = []
@@ -1381,6 +1427,7 @@ class Hilbert(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1429,6 +1476,7 @@ class Allpass(PyoObject):
 
     """
     def __init__(self, input, delay=0.01, feedback=0, maxdelay=1, mul=1, add=0):
+        pyoArgsAssert(self, "oOOnOO", input, delay, feedback, maxdelay, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._delay = delay
@@ -1450,6 +1498,7 @@ class Allpass(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1463,6 +1512,7 @@ class Allpass(PyoObject):
                 New `delay` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._delay = x
         x, lmax = convertArgsToLists(x)
         [obj.setDelay(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1477,6 +1527,7 @@ class Allpass(PyoObject):
                 New `feedback` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._feedback = x
         x, lmax = convertArgsToLists(x)
         [obj.setFeedback(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1540,6 +1591,7 @@ class Allpass2(PyoObject):
 
     """
     def __init__(self, input, freq=1000, bw=100, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOO", input, freq, bw, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -1560,6 +1612,7 @@ class Allpass2(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1573,6 +1626,7 @@ class Allpass2(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1587,6 +1641,7 @@ class Allpass2(PyoObject):
                 New `bw` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._bw = x
         x, lmax = convertArgsToLists(x)
         [obj.setBw(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1654,6 +1709,7 @@ class Phaser(PyoObject):
 
     """
     def __init__(self, input, freq=1000, spread=1.1, q=10, feedback=0, num=8, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOOiOO", input, freq, spread, q, feedback, num, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -1677,6 +1733,7 @@ class Phaser(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1690,6 +1747,7 @@ class Phaser(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1704,6 +1762,7 @@ class Phaser(PyoObject):
                 New `spread` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._spread = x
         x, lmax = convertArgsToLists(x)
         [obj.setSpread(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1718,6 +1777,7 @@ class Phaser(PyoObject):
                 New `q` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._q = x
         x, lmax = convertArgsToLists(x)
         [obj.setQ(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1732,6 +1792,7 @@ class Phaser(PyoObject):
                 New `feedback` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._feedback = x
         x, lmax = convertArgsToLists(x)
         [obj.setFeedback(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1833,6 +1894,7 @@ class Vocoder(PyoObject):
 
     """
     def __init__(self, input, input2, freq=60, spread=1.25, q=20, slope=0.5, stages=24, mul=1, add=0):
+        pyoArgsAssert(self, "ooOOOOiOO", input, input2, freq, spread, q, slope, stages, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._input2 = input2
@@ -1858,6 +1920,7 @@ class Vocoder(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1873,6 +1936,7 @@ class Vocoder(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input2 = x
         self._in_fader2.setInput(x, fadetime)
 
@@ -1886,6 +1950,7 @@ class Vocoder(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1900,6 +1965,7 @@ class Vocoder(PyoObject):
                 New `spread` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._spread = x
         x, lmax = convertArgsToLists(x)
         [obj.setSpread(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1914,6 +1980,7 @@ class Vocoder(PyoObject):
                 New `q` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._q = x
         x, lmax = convertArgsToLists(x)
         [obj.setQ(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1928,6 +1995,7 @@ class Vocoder(PyoObject):
                 New `slope` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._slope = x
         x, lmax = convertArgsToLists(x)
         [obj.setSlope(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1942,6 +2010,7 @@ class Vocoder(PyoObject):
                 New `stages` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._stages = x
         x, lmax = convertArgsToLists(x)
         [obj.setStages(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2055,6 +2124,7 @@ class IRWinSinc(PyoObject):
 
     """
     def __init__(self, input, freq=1000, bw=500, type=0, order=256, mul=1, add=0):
+        pyoArgsAssert(self, "oOOiiOO", input, freq, bw, type, order, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -2080,6 +2150,7 @@ class IRWinSinc(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2093,6 +2164,7 @@ class IRWinSinc(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2107,6 +2179,7 @@ class IRWinSinc(PyoObject):
                 New `bw` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._bw = x
         x, lmax = convertArgsToLists(x)
         [obj.setBandwidth(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2125,6 +2198,7 @@ class IRWinSinc(PyoObject):
                 3. bandpass
 
         """
+        pyoArgsAssert(self, "i", x)
         self._type = x
         x, lmax = convertArgsToLists(x)
         [obj.setType(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2201,6 +2275,7 @@ class IRAverage(PyoObject):
 
     """
     def __init__(self, input, order=256, mul=1, add=0):
+        pyoArgsAssert(self, "oiOO", input, order, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         if (order % 2) != 0:
@@ -2223,6 +2298,7 @@ class IRAverage(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2283,6 +2359,7 @@ class IRPulse(PyoObject):
 
     """
     def __init__(self, input, freq=500, bw=2500, type=0, order=256, mul=1, add=0):
+        pyoArgsAssert(self, "oOOiiOO", input, freq, bw, type, order, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -2308,6 +2385,7 @@ class IRPulse(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2321,6 +2399,7 @@ class IRPulse(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2335,6 +2414,7 @@ class IRPulse(PyoObject):
                 New `bw` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._bw = x
         x, lmax = convertArgsToLists(x)
         [obj.setBandwidth(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2353,6 +2433,7 @@ class IRPulse(PyoObject):
                     3. Pulse (odd harmonics) & comb & lowpass
 
         """
+        pyoArgsAssert(self, "i", x)
         self._type = x
         x, lmax = convertArgsToLists(x)
         [obj.setType(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2437,6 +2518,7 @@ class IRFM(PyoObject):
 
     """
     def __init__(self, input, carrier=1000, ratio=0.5, index=3, order=256, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOiOO", input, carrier, ratio, index, order, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._carrier = carrier
@@ -2462,6 +2544,7 @@ class IRFM(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2475,6 +2558,7 @@ class IRFM(PyoObject):
                 New `carrier` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._carrier = x
         x, lmax = convertArgsToLists(x)
         [obj.setCarrier(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2489,6 +2573,7 @@ class IRFM(PyoObject):
                 New `ratio` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._ratio = x
         x, lmax = convertArgsToLists(x)
         [obj.setRatio(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2503,6 +2588,7 @@ class IRFM(PyoObject):
                 New `index` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._index = x
         x, lmax = convertArgsToLists(x)
         [obj.setIndex(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2577,6 +2663,7 @@ class SVF(PyoObject):
 
     """
     def __init__(self, input, freq=1000, q=1, type=0, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOOO", input, freq, q, type, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -2598,6 +2685,7 @@ class SVF(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2612,6 +2700,7 @@ class SVF(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2626,6 +2715,7 @@ class SVF(PyoObject):
                 New `q` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._q = x
         x, lmax = convertArgsToLists(x)
         [obj.setQ(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2643,6 +2733,7 @@ class SVF(PyoObject):
                 New `type` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._type = x
         x, lmax = convertArgsToLists(x)
         [obj.setType(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2709,6 +2800,7 @@ class Average(PyoObject):
 
     """
     def __init__(self, input, size=10, mul=1, add=0):
+        pyoArgsAssert(self, "oiOO", input, size, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._size = size
@@ -2728,6 +2820,7 @@ class Average(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2741,6 +2834,7 @@ class Average(PyoObject):
                 New `size` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._size = x
         x, lmax = convertArgsToLists(x)
         [obj.setSize(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2794,6 +2888,7 @@ class Reson(PyoObject):
 
     """
     def __init__(self, input, freq=1000, q=1, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOO", input, freq, q, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -2814,6 +2909,7 @@ class Reson(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2827,6 +2923,7 @@ class Reson(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2841,6 +2938,7 @@ class Reson(PyoObject):
                 New `q` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._q = x
         x, lmax = convertArgsToLists(x)
         [obj.setQ(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2905,6 +3003,7 @@ class Resonx(PyoObject):
 
     """
     def __init__(self, input, freq=1000, q=1, stages=4, mul=1, add=0):
+        pyoArgsAssert(self, "oOOiOO", input, freq, q, stages, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -2926,6 +3025,7 @@ class Resonx(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2939,6 +3039,7 @@ class Resonx(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2953,6 +3054,7 @@ class Resonx(PyoObject):
                 New `q` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._q = x
         x, lmax = convertArgsToLists(x)
         [obj.setQ(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2967,6 +3069,7 @@ class Resonx(PyoObject):
                 New `stages` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._stages = x
         x, lmax = convertArgsToLists(x)
         [obj.setStages(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -3028,6 +3131,7 @@ class ButLP(PyoObject):
 
     """
     def __init__(self, input, freq=1000, mul=1, add=0):
+        pyoArgsAssert(self, "oOOO", input, freq, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -3047,6 +3151,7 @@ class ButLP(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -3060,6 +3165,7 @@ class ButLP(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -3107,6 +3213,7 @@ class ButHP(PyoObject):
 
     """
     def __init__(self, input, freq=1000, mul=1, add=0):
+        pyoArgsAssert(self, "oOOO", input, freq, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -3126,6 +3233,7 @@ class ButHP(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -3139,6 +3247,7 @@ class ButHP(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -3189,6 +3298,7 @@ class ButBP(PyoObject):
 
     """
     def __init__(self, input, freq=1000, q=1, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOO", input, freq, q, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -3209,6 +3319,7 @@ class ButBP(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -3222,6 +3333,7 @@ class ButBP(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -3236,6 +3348,7 @@ class ButBP(PyoObject):
                 New `q` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._q = x
         x, lmax = convertArgsToLists(x)
         [obj.setQ(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -3294,6 +3407,7 @@ class ButBR(PyoObject):
 
     """
     def __init__(self, input, freq=1000, q=1, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOO", input, freq, q, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -3314,6 +3428,7 @@ class ButBR(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -3327,6 +3442,7 @@ class ButBR(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -3341,6 +3457,7 @@ class ButBR(PyoObject):
                 New `q` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._q = x
         x, lmax = convertArgsToLists(x)
         [obj.setQ(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -3400,6 +3517,7 @@ class ComplexRes(PyoObject):
 
     """
     def __init__(self, input, freq=1000, decay=.25, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOO", input, freq, decay, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._freq = freq
@@ -3420,6 +3538,7 @@ class ComplexRes(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -3433,6 +3552,7 @@ class ComplexRes(PyoObject):
                 New `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -3447,6 +3567,7 @@ class ComplexRes(PyoObject):
                 New `decay` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._decay = x
         x, lmax = convertArgsToLists(x)
         [obj.setDecay(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
diff --git a/pyolib/fourier.py b/pyolib/fourier.py
index 30026cd..b30b25f 100644
--- a/pyolib/fourier.py
+++ b/pyolib/fourier.py
@@ -98,6 +98,7 @@ class FFT(PyoObject):
 
     """
     def __init__(self, input, size=1024, overlaps=4, wintype=2):
+        pyoArgsAssert(self, "oiIi", input, size, overlaps, wintype)
         PyoObject.__init__(self)
         self._real_dummy = []
         self._imag_dummy = []
@@ -173,6 +174,7 @@ class FFT(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -204,6 +206,7 @@ class FFT(PyoObject):
                 new `size` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._size = x
         x, lmax = convertArgsToLists(x)
         poly = len(self._base_players) / self._overlaps
@@ -222,6 +225,7 @@ class FFT(PyoObject):
                 new `wintype` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._wintype = x
         x, lmax = convertArgsToLists(x)
         [obj.setWinType(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -313,6 +317,7 @@ class IFFT(PyoObject):
 
     """
     def __init__(self, inreal, inimag, size=1024, overlaps=4, wintype=2, mul=1, add=0):
+        pyoArgsAssert(self, "ooiIiOO", inreal, inimag, size, overlaps, wintype, mul, add)
         PyoObject.__init__(self, mul, add)
         self._inreal = inreal
         self._inimag = inimag
@@ -343,6 +348,7 @@ class IFFT(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._inreal = x
         self._in_fader.setInput(x, fadetime)
 
@@ -358,6 +364,7 @@ class IFFT(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._inimag = x
         self._in_fader2.setInput(x, fadetime)
 
@@ -371,6 +378,7 @@ class IFFT(PyoObject):
                 new `size` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._size = x
         x, lmax = convertArgsToLists(x)
         ratio = len(self._base_objs) / self._overlaps
@@ -388,6 +396,7 @@ class IFFT(PyoObject):
                 new `wintype` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._wintype = x
         x, lmax = convertArgsToLists(x)
         [obj.setWinType(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -473,6 +482,7 @@ class CarToPol(PyoObject):
 
     """
     def __init__(self, inreal, inimag, mul=1, add=0):
+        pyoArgsAssert(self, "ooOO", inreal, inimag, mul, add)
         PyoObject.__init__(self, mul, add)
         self._mag_dummy = []
         self._ang_dummy = []
@@ -535,6 +545,7 @@ class CarToPol(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._inreal = x
         self._in_fader.setInput(x, fadetime)
 
@@ -550,6 +561,7 @@ class CarToPol(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._inimag = x
         self._in_fader2.setInput(x, fadetime)
 
@@ -616,6 +628,7 @@ class PolToCar(PyoObject):
 
     """
     def __init__(self, inmag, inang, mul=1, add=0):
+        pyoArgsAssert(self, "ooOO", inmag, inang, mul, add)
         PyoObject.__init__(self, mul, add)
         self._real_dummy = []
         self._imag_dummy = []
@@ -678,6 +691,7 @@ class PolToCar(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._inmag = x
         self._in_fader.setInput(x, fadetime)
 
@@ -693,6 +707,7 @@ class PolToCar(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._inang = x
         self._in_fader2.setInput(x, fadetime)
 
@@ -764,6 +779,7 @@ class FrameDelta(PyoObject):
 
     """
     def __init__(self, input, framesize=1024, overlaps=4, mul=1, add=0):
+        pyoArgsAssert(self, "oiiOO", input, framesize, overlaps, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._framesize = framesize
@@ -799,6 +815,7 @@ class FrameDelta(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -812,6 +829,7 @@ class FrameDelta(PyoObject):
                 new `framesize` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._framesize = x
         x, lmax = convertArgsToLists(x)
         [obj.setFrameSize(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -884,6 +902,7 @@ class FrameAccum(PyoObject):
 
     """
     def __init__(self, input, framesize=1024, overlaps=4, mul=1, add=0):
+        pyoArgsAssert(self, "oiiOO", input, framesize, overlaps, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._framesize = framesize
@@ -919,6 +938,7 @@ class FrameAccum(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -932,6 +952,7 @@ class FrameAccum(PyoObject):
                 new `framesize` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._framesize = x
         x, lmax = convertArgsToLists(x)
         [obj.setFrameSize(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -999,6 +1020,7 @@ class Vectral(PyoObject):
 
     """
     def __init__(self, input, framesize=1024, overlaps=4, up=1.0, down=0.7, damp=0.9, mul=1, add=0):
+        pyoArgsAssert(self, "oiiOOOOO", input, framesize, overlaps, up, down, damp, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._framesize = framesize
@@ -1037,6 +1059,7 @@ class Vectral(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1050,6 +1073,7 @@ class Vectral(PyoObject):
                 new `framesize` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._framesize = x
         x, lmax = convertArgsToLists(x)
         [obj.setFrameSize(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -1064,6 +1088,7 @@ class Vectral(PyoObject):
                 new `up` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._up = x
         x, lmax = convertArgsToLists(x)
         [obj.setUp(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -1078,6 +1103,7 @@ class Vectral(PyoObject):
                 new `down` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._down = x
         x, lmax = convertArgsToLists(x)
         [obj.setDown(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -1092,6 +1118,7 @@ class Vectral(PyoObject):
                 new `damp` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._damp = x
         x, lmax = convertArgsToLists(x)
         [obj.setDamp(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -1174,6 +1201,7 @@ class CvlVerb(PyoObject):
 
     """
     def __init__(self, input, impulse=SNDS_PATH+"/IRMediumHallStereo.wav", bal=0.25, size=1024, mul=1, add=0):
+        pyoArgsAssert(self, "osOiOO", input, impulse, bal, size, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._impulse = impulse
@@ -1200,6 +1228,7 @@ class CvlVerb(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1213,6 +1242,7 @@ class CvlVerb(PyoObject):
                 new `bal` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._bal = x
         x, lmax = convertArgsToLists(x)
         [obj.setBal(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
diff --git a/pyolib/generators.py b/pyolib/generators.py
index bb15550..db2fa97 100644
--- a/pyolib/generators.py
+++ b/pyolib/generators.py
@@ -55,6 +55,7 @@ class Sine(PyoObject):
 
     """
     def __init__(self, freq=1000, phase=0, mul=1, add=0):
+        pyoArgsAssert(self, "OOOO", freq, phase, mul, add)
         PyoObject.__init__(self, mul, add)
         self._freq = freq
         self._phase = phase
@@ -71,6 +72,7 @@ class Sine(PyoObject):
                 new `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -85,6 +87,7 @@ class Sine(PyoObject):
                 new `phase` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._phase = x
         x, lmax = convertArgsToLists(x)
         [obj.setPhase(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -143,6 +146,7 @@ class SineLoop(PyoObject):
 
     """
     def __init__(self, freq=1000, feedback=0, mul=1, add=0):
+        pyoArgsAssert(self, "OOOO", freq, feedback, mul, add)
         PyoObject.__init__(self, mul, add)
         self._freq = freq
         self._feedback = feedback
@@ -159,6 +163,7 @@ class SineLoop(PyoObject):
                 new `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -173,6 +178,7 @@ class SineLoop(PyoObject):
                 new `feedback` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._feedback = x
         x, lmax = convertArgsToLists(x)
         [obj.setFeedback(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -222,6 +228,7 @@ class Phasor(PyoObject):
 
     """
     def __init__(self, freq=100, phase=0, mul=1, add=0):
+        pyoArgsAssert(self, "OOOO", freq, phase, mul, add)
         PyoObject.__init__(self, mul, add)
         self._freq = freq
         self._phase = phase
@@ -238,6 +245,7 @@ class Phasor(PyoObject):
                 new `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -252,6 +260,7 @@ class Phasor(PyoObject):
                 new `phase` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._phase = x
         x, lmax = convertArgsToLists(x)
         [obj.setPhase(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -304,6 +313,7 @@ class Input(PyoObject):
 
     """
     def __init__(self, chnl=0, mul=1, add=0):
+        pyoArgsAssert(self, "iOO", chnl, mul, add)
         PyoObject.__init__(self, mul, add)
         self._chnl = chnl
         chnl, mul, add, lmax = convertArgsToLists(chnl, mul, add)
@@ -325,6 +335,7 @@ class Noise(PyoObject):
 
     """
     def __init__(self, mul=1, add=0):
+        pyoArgsAssert(self, "OO", mul, add)
         PyoObject.__init__(self, mul, add)
         self._type = 0
         mul, add, lmax = convertArgsToLists(mul, add)
@@ -341,6 +352,7 @@ class Noise(PyoObject):
                 1 uses a simple linear congruential generator, cheaper than rand().
 
         """
+        pyoArgsAssert(self, "i", x)
         self._type = x
         x, lmax = convertArgsToLists(x)
         [obj.setType(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -374,6 +386,7 @@ class PinkNoise(PyoObject):
 
     """
     def __init__(self, mul=1, add=0):
+        pyoArgsAssert(self, "OO", mul, add)
         PyoObject.__init__(self, mul, add)
         mul, add, lmax = convertArgsToLists(mul, add)
         self._base_objs = [PinkNoise_base(wrap(mul,i), wrap(add,i)) for i in range(lmax)]
@@ -397,6 +410,7 @@ class BrownNoise(PyoObject):
 
     """
     def __init__(self, mul=1, add=0):
+        pyoArgsAssert(self, "OO", mul, add)
         PyoObject.__init__(self, mul, add)
         mul, add, lmax = convertArgsToLists(mul, add)
         self._base_objs = [BrownNoise_base(wrap(mul,i), wrap(add,i)) for i in range(lmax)]
@@ -433,6 +447,7 @@ class FM(PyoObject):
 
     """
     def __init__(self, carrier=100, ratio=0.5, index=5, mul=1, add=0):
+        pyoArgsAssert(self, "OOOOO", carrier, ratio, index, mul, add)
         PyoObject.__init__(self, mul, add)
         self._carrier = carrier
         self._ratio = ratio
@@ -450,6 +465,7 @@ class FM(PyoObject):
                 new `carrier` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._carrier = x
         x, lmax = convertArgsToLists(x)
         [obj.setCarrier(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -464,6 +480,7 @@ class FM(PyoObject):
                 new `ratio` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._ratio = x
         x, lmax = convertArgsToLists(x)
         [obj.setRatio(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -478,6 +495,7 @@ class FM(PyoObject):
                 new `index` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._index = x
         x, lmax = convertArgsToLists(x)
         [obj.setIndex(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -546,6 +564,7 @@ class CrossFM(PyoObject):
 
     """
     def __init__(self, carrier=100, ratio=0.5, ind1=2, ind2=2, mul=1, add=0):
+        pyoArgsAssert(self, "OOOOOO", carrier, ratio, ind1, ind2, mul, add)
         PyoObject.__init__(self, mul, add)
         self._carrier = carrier
         self._ratio = ratio
@@ -564,6 +583,7 @@ class CrossFM(PyoObject):
                 new `carrier` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._carrier = x
         x, lmax = convertArgsToLists(x)
         [obj.setCarrier(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -578,6 +598,7 @@ class CrossFM(PyoObject):
                 new `ratio` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._ratio = x
         x, lmax = convertArgsToLists(x)
         [obj.setRatio(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -592,6 +613,7 @@ class CrossFM(PyoObject):
                 new `ind1` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._ind1 = x
         x, lmax = convertArgsToLists(x)
         [obj.setInd1(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -606,6 +628,7 @@ class CrossFM(PyoObject):
                 new `ind2` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._ind2 = x
         x, lmax = convertArgsToLists(x)
         [obj.setInd2(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -670,6 +693,7 @@ class Blit(PyoObject):
 
     """
     def __init__(self, freq=100, harms=40, mul=1, add=0):
+        pyoArgsAssert(self, "OOOO", freq, harms, mul, add)
         PyoObject.__init__(self, mul, add)
         self._freq = freq
         self._harms = harms
@@ -686,6 +710,7 @@ class Blit(PyoObject):
                 new `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -700,6 +725,7 @@ class Blit(PyoObject):
                 new `harms` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._harms = x
         x, lmax = convertArgsToLists(x)
         [obj.setHarms(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -763,6 +789,7 @@ class Rossler(PyoObject):
 
     """
     def __init__(self, pitch=0.25, chaos=0.5, stereo=False, mul=1, add=0):
+        pyoArgsAssert(self, "OObOO", pitch, chaos, stereo, mul, add)
         PyoObject.__init__(self, mul, add)
         self._pitch = pitch
         self._chaos = chaos
@@ -785,6 +812,7 @@ class Rossler(PyoObject):
                 new `pitch` attribute. {0. -> 1.}
 
         """
+        pyoArgsAssert(self, "O", x)
         self._pitch = x
         x, lmax = convertArgsToLists(x)
         if self._stereo:
@@ -802,6 +830,7 @@ class Rossler(PyoObject):
                 new `chaos` attribute. {0. -> 1.}
 
         """
+        pyoArgsAssert(self, "O", x)
         self._chaos = x
         x, lmax = convertArgsToLists(x)
         if self._stereo:
@@ -867,6 +896,7 @@ class Lorenz(PyoObject):
 
     """
     def __init__(self, pitch=0.25, chaos=0.5, stereo=False, mul=1, add=0):
+        pyoArgsAssert(self, "OObOO", pitch, chaos, stereo, mul, add)
         PyoObject.__init__(self, mul, add)
         self._pitch = pitch
         self._chaos = chaos
@@ -889,6 +919,7 @@ class Lorenz(PyoObject):
                 new `pitch` attribute. {0. -> 1.}
 
         """
+        pyoArgsAssert(self, "O", x)
         self._pitch = x
         x, lmax = convertArgsToLists(x)
         if self._stereo:
@@ -906,6 +937,7 @@ class Lorenz(PyoObject):
                 new `chaos` attribute. {0. -> 1.}
 
         """
+        pyoArgsAssert(self, "O", x)
         self._chaos = x
         x, lmax = convertArgsToLists(x)
         if self._stereo:
@@ -965,6 +997,7 @@ class LFO(PyoObject):
 
     """
     def __init__(self, freq=100, sharp=0.5, type=0, mul=1, add=0):
+        pyoArgsAssert(self, "OOiOO", freq, sharp, type, mul, add)
         PyoObject.__init__(self, mul, add)
         self._freq = freq
         self._sharp = sharp
@@ -982,6 +1015,7 @@ class LFO(PyoObject):
                 New `freq` attribute, in cycles per seconds.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -996,6 +1030,7 @@ class LFO(PyoObject):
                 New `sharp` attribute, in the range 0 -> 1.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._sharp = x
         x, lmax = convertArgsToLists(x)
         [obj.setSharp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1019,6 +1054,7 @@ class LFO(PyoObject):
 
 
         """
+        pyoArgsAssert(self, "i", x)
         self._type = x
         x, lmax = convertArgsToLists(x)
         [obj.setType(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1102,6 +1138,7 @@ class SumOsc(PyoObject):
 
     """
     def __init__(self, freq=100, ratio=0.5, index=0.5, mul=1, add=0):
+        pyoArgsAssert(self, "OOOOO", freq, ratio, index, mul, add)
         PyoObject.__init__(self, mul, add)
         self._freq = freq
         self._ratio = ratio
@@ -1119,6 +1156,7 @@ class SumOsc(PyoObject):
                 new `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1133,6 +1171,7 @@ class SumOsc(PyoObject):
                 new `ratio` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._ratio = x
         x, lmax = convertArgsToLists(x)
         [obj.setRatio(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1147,6 +1186,7 @@ class SumOsc(PyoObject):
                 new `index` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._index = x
         x, lmax = convertArgsToLists(x)
         [obj.setIndex(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1215,6 +1255,7 @@ class SuperSaw(PyoObject):
 
     """
     def __init__(self, freq=100, detune=0.5, bal=0.7, mul=1, add=0):
+        pyoArgsAssert(self, "OOOOO", freq, detune, bal, mul, add)
         PyoObject.__init__(self, mul, add)
         self._freq = freq
         self._detune = detune
@@ -1232,6 +1273,7 @@ class SuperSaw(PyoObject):
                 new `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1246,6 +1288,7 @@ class SuperSaw(PyoObject):
                 new `detune` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._detune = x
         x, lmax = convertArgsToLists(x)
         [obj.setDetune(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1260,6 +1303,7 @@ class SuperSaw(PyoObject):
                 new `bal` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._bal = x
         x, lmax = convertArgsToLists(x)
         [obj.setBal(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1320,6 +1364,7 @@ class RCOsc(PyoObject):
 
     """
     def __init__(self, freq=100, sharp=0.25, mul=1, add=0):
+        pyoArgsAssert(self, "OOOO", freq, sharp, mul, add)
         PyoObject.__init__(self, mul, add)
         self._freq = freq
         self._sharp = sharp
@@ -1336,6 +1381,7 @@ class RCOsc(PyoObject):
                 new `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1350,6 +1396,7 @@ class RCOsc(PyoObject):
                 new `sharp` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._sharp = x
         x, lmax = convertArgsToLists(x)
         [obj.setSharp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
diff --git a/pyolib/matrix.py b/pyolib/matrix.py
index 0605dbd..3ddee00 100644
--- a/pyolib/matrix.py
+++ b/pyolib/matrix.py
@@ -60,6 +60,7 @@ class NewMatrix(PyoMatrixObject):
 
     """
     def __init__(self, width, height, init=None):
+        pyoArgsAssert(self, "IIL", width, height, init)
         PyoMatrixObject.__init__(self)
         self._size = (width, height)
         if init == None:
@@ -77,6 +78,7 @@ class NewMatrix(PyoMatrixObject):
                 New matrix. Must be of the same size as the actual matrix.
 
         """
+        pyoArgsAssert(self, "l", x)
         [obj.setMatrix(x) for obj in self._base_objs]
         self.refreshView()
 
@@ -102,5 +104,6 @@ class NewMatrix(PyoMatrixObject):
                 the range 0 -> 1. Defaults to 0.0625.
 
         """
+        pyoArgsAssert(self, "NN", freq, phase)
         [obj.genSineTerrain(freq, phase) for obj in self._base_objs]
         self.refreshView()
\ No newline at end of file
diff --git a/pyolib/matrixprocess.py b/pyolib/matrixprocess.py
index 9f7ded9..9b721a0 100644
--- a/pyolib/matrixprocess.py
+++ b/pyolib/matrixprocess.py
@@ -87,6 +87,7 @@ class MatrixRec(PyoObject):
 
     """
     def __init__(self, input, matrix, fadetime=0, delay=0):
+        pyoArgsAssert(self, "omni", input, matrix, fadetime, delay)
         PyoObject.__init__(self)
         self._input = input
         self._matrix = matrix
@@ -116,6 +117,7 @@ class MatrixRec(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -129,6 +131,7 @@ class MatrixRec(PyoObject):
                 new `matrix` attribute.
 
         """
+        pyoArgsAssert(self, "m", x)
         self._matrix = x
         x, lmax = convertArgsToLists(x)
         [obj.setMatrix(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -194,6 +197,7 @@ class MatrixRecLoop(PyoObject):
 
     """
     def __init__(self, input, matrix):
+        pyoArgsAssert(self, "om", input, matrix)
         PyoObject.__init__(self)
         self._input = input
         self._matrix = matrix
@@ -223,6 +227,7 @@ class MatrixRecLoop(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -236,6 +241,7 @@ class MatrixRecLoop(PyoObject):
                 new `matrix` attribute.
 
         """
+        pyoArgsAssert(self, "m", x)
         self._matrix = x
         x, lmax = convertArgsToLists(x)
         [obj.setMatrix(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -285,6 +291,7 @@ class MatrixPointer(PyoObject):
 
     """
     def __init__(self, matrix, x, y, mul=1, add=0):
+        pyoArgsAssert(self, "mooOO", matrix, x, y, mul, add)
         PyoObject.__init__(self, mul, add)
         self._matrix = matrix
         self._x = x
@@ -302,6 +309,7 @@ class MatrixPointer(PyoObject):
                 new `matrix` attribute.
 
         """
+        pyoArgsAssert(self, "m", x)
         self._matrix = x
         x, lmax = convertArgsToLists(x)
         [obj.setMatrix(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -316,6 +324,7 @@ class MatrixPointer(PyoObject):
                 new `x` attribute.
 
         """
+        pyoArgsAssert(self, "o", x)
         self._x = x
         x, lmax = convertArgsToLists(x)
         [obj.setX(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -330,6 +339,7 @@ class MatrixPointer(PyoObject):
                 new `y` attribute.
 
         """
+        pyoArgsAssert(self, "o", x)
         self._y = x
         x, lmax = convertArgsToLists(x)
         [obj.setY(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -401,6 +411,7 @@ class MatrixMorph(PyoObject):
 
     """
     def __init__(self, input, matrix, sources):
+        pyoArgsAssert(self, "oml", input, matrix, sources)
         PyoObject.__init__(self)
         self._input = input
         self._matrix = matrix
@@ -431,6 +442,7 @@ class MatrixMorph(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -444,6 +456,7 @@ class MatrixMorph(PyoObject):
                 new `matrix` attribute.
 
         """
+        pyoArgsAssert(self, "m", x)
         self._matrix = x
         x, lmax = convertArgsToLists(x)
         [obj.setMatrix(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -458,6 +471,7 @@ class MatrixMorph(PyoObject):
                 new `sources` attribute.
 
         """
+        pyoArgsAssert(self, "l", x)
         self._sources = x
         self._base_sources = [source[0] for source in x]
         [obj.setSources(self._base_sources) for i, obj in enumerate(self._base_objs)]
diff --git a/pyolib/midi.py b/pyolib/midi.py
index dbed36d..588fc88 100644
--- a/pyolib/midi.py
+++ b/pyolib/midi.py
@@ -71,6 +71,7 @@ class Midictl(PyoObject):
 
     """
     def __init__(self, ctlnumber, minscale=0, maxscale=1, init=0, channel=0, mul=1, add=0):
+        pyoArgsAssert(self, "innniOO", ctlnumber, minscale, maxscale, init, channel, mul, add)
         PyoObject.__init__(self, mul, add)
         self._ctlnumber = ctlnumber
         self._minscale = minscale
@@ -92,6 +93,7 @@ class Midictl(PyoObject):
                 new `ctlnumber` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._ctlnumber = x
         x, lmax = convertArgsToLists(x)
         [obj.setCtlNumber(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -102,10 +104,11 @@ class Midictl(PyoObject):
 
         :Args:
 
-            x : int
+            x : float
                 new `minscale` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._minscale = x
         x, lmax = convertArgsToLists(x)
         [obj.setMinScale(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -116,10 +119,11 @@ class Midictl(PyoObject):
 
         :Args:
 
-            x : int
+            x : float
                 new `maxscale` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._maxscale = x
         x, lmax = convertArgsToLists(x)
         [obj.setMaxScale(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -134,6 +138,7 @@ class Midictl(PyoObject):
                 new `channel` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._channel = x
         x, lmax = convertArgsToLists(x)
         [obj.setChannel(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -148,6 +153,7 @@ class Midictl(PyoObject):
                 new current value.
 
         """
+        pyoArgsAssert(self, "n", x)
         x, lmax = convertArgsToLists(x)
         [obj.setValue(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
@@ -161,6 +167,7 @@ class Midictl(PyoObject):
                 True activates the interpolation, False deactivates it.
 
         """
+        pyoArgsAssert(self, "b", x)
         x, lmax = convertArgsToLists(x)
         [obj.setInterpolation(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
@@ -234,10 +241,8 @@ class CtlScan(PyoObject):
 
     """
     def __init__(self, function, toprint=True):
+        pyoArgsAssert(self, "CB", function, toprint)
         PyoObject.__init__(self)
-        if not callable(function):
-            print >> sys.stderr, 'TypeError: "function" argument of %s must be callable.\n' % self.__class__.__name__
-            exit()
         self._function = WeakMethod(function)
         self._toprint = toprint
         self._base_objs = [CtlScan_base(self._function, self._toprint)]
@@ -274,6 +279,7 @@ class CtlScan(PyoObject):
                 new `function` attribute.
 
         """
+        pyoArgsAssert(self, "C", x)
         self._function = WeakMethod(x)
         [obj.setFunction(self._function) for i, obj in enumerate(self._base_objs)]
 
@@ -287,6 +293,7 @@ class CtlScan(PyoObject):
                 new `toprint` attribute.
 
         """
+        pyoArgsAssert(self, "b", x)
         self._toprint = x
         x, lmax = convertArgsToLists(x)
         [obj.setToprint(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -345,10 +352,8 @@ class CtlScan2(PyoObject):
 
     """
     def __init__(self, function, toprint=True):
+        pyoArgsAssert(self, "CB", function, toprint)
         PyoObject.__init__(self)
-        if not callable(function):
-            print >> sys.stderr, 'TypeError: "function" argument of %s must be callable.\n' % self.__class__.__name__
-            exit()
         self._function = WeakMethod(function)
         self._toprint = toprint
         self._base_objs = [CtlScan2_base(self._function, self._toprint)]
@@ -385,6 +390,7 @@ class CtlScan2(PyoObject):
                 new `function` attribute.
 
         """
+        pyoArgsAssert(self, "C", x)
         self._function = WeakMethod(x)
         [obj.setFunction(self._function) for i, obj in enumerate(self._base_objs)]
 
@@ -398,6 +404,7 @@ class CtlScan2(PyoObject):
                 new `toprint` attribute.
 
         """
+        pyoArgsAssert(self, "b", x)
         self._toprint = x
         x, lmax = convertArgsToLists(x)
         [obj.setToprint(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -478,6 +485,7 @@ class Notein(PyoObject):
 
     """
     def __init__(self, poly=10, scale=0, first=0, last=127, channel=0, mul=1, add=0):
+        pyoArgsAssert(self, "IIIIIOO", poly, scale, first, last, channel, mul, add)
         PyoObject.__init__(self, mul, add)
         self._pitch_dummy = []
         self._velocity_dummy = []
@@ -522,6 +530,7 @@ class Notein(PyoObject):
                 new `channel` attribute.
 
         """
+        pyoArgsAssert(self, "I", x)
         self._channel = x
         self._base_handler.setChannel(x)
 
@@ -538,6 +547,7 @@ class Notein(PyoObject):
                 new centralkey value.
 
         """
+        pyoArgsAssert(self, "I", x)
         self._base_handler.setCentralKey(x)
 
     def setStealing(self, x):
@@ -554,6 +564,7 @@ class Notein(PyoObject):
                 True for stealing mode, False for non-stealing.
 
         """
+        pyoArgsAssert(self, "B", x)
         self._base_handler.setStealing(x)
 
     def get(self, identifier="pitch", all=False):
@@ -642,6 +653,7 @@ class Bendin(PyoObject):
 
     """
     def __init__(self, brange=2, scale=0, channel=0, mul=1, add=0):
+        pyoArgsAssert(self, "niiOO", brange, scale, channel, mul, add)
         PyoObject.__init__(self, mul, add)
         self._brange = brange
         self._scale = scale
@@ -658,10 +670,11 @@ class Bendin(PyoObject):
 
         :Args:
 
-            x : int
+            x : float
                 new `brange` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._brange = x
         x, lmax = convertArgsToLists(x)
         [obj.setBrange(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -676,6 +689,7 @@ class Bendin(PyoObject):
                 new `scale` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._scale = x
         x, lmax = convertArgsToLists(x)
         [obj.setScale(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -690,6 +704,7 @@ class Bendin(PyoObject):
                 new `channel` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._channel = x
         x, lmax = convertArgsToLists(x)
         [obj.setChannel(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -751,6 +766,7 @@ class Touchin(PyoObject):
 
     """
     def __init__(self, minscale=0, maxscale=1, init=0, channel=0, mul=1, add=0):
+        pyoArgsAssert(self, "nnniOO", minscale, maxscale, init, channel, mul, add)
         PyoObject.__init__(self, mul, add)
         self._minscale = minscale
         self._maxscale = maxscale
@@ -767,10 +783,11 @@ class Touchin(PyoObject):
 
         :Args:
 
-            x : int
+            x : float
                 new `minscale` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._minscale = x
         x, lmax = convertArgsToLists(x)
         [obj.setMinScale(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -781,10 +798,11 @@ class Touchin(PyoObject):
 
         :Args:
 
-            x : int
+            x : float
                 new `maxscale` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._maxscale = x
         x, lmax = convertArgsToLists(x)
         [obj.setMaxScale(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -799,6 +817,7 @@ class Touchin(PyoObject):
                 new `channel` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._channel = x
         x, lmax = convertArgsToLists(x)
         [obj.setChannel(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -856,6 +875,7 @@ class Programin(PyoObject):
 
     """
     def __init__(self, channel=0, mul=1, add=0):
+        pyoArgsAssert(self, "iOO", channel, mul, add)
         PyoObject.__init__(self, mul, add)
         self._channel = channel
         channel, mul, add, lmax = convertArgsToLists(channel, mul, add)
@@ -874,6 +894,7 @@ class Programin(PyoObject):
                 new `channel` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._channel = x
         x, lmax = convertArgsToLists(x)
         [obj.setChannel(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -928,6 +949,7 @@ class MidiAdsr(PyoObject):
 
     """
     def __init__(self, input, attack=0.01, decay=0.05, sustain=0.7, release=0.1, mul=1, add=0):
+        pyoArgsAssert(self, "onnnnOO", input, attack, decay, sustain, release, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._attack = attack
@@ -953,6 +975,7 @@ class MidiAdsr(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -966,6 +989,7 @@ class MidiAdsr(PyoObject):
                 new `attack` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._attack = x
         x, lmax = convertArgsToLists(x)
         [obj.setAttack(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -980,6 +1004,7 @@ class MidiAdsr(PyoObject):
                 new `decay` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._decay = x
         x, lmax = convertArgsToLists(x)
         [obj.setDecay(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -994,6 +1019,7 @@ class MidiAdsr(PyoObject):
                 new `sustain` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._sustain = x
         x, lmax = convertArgsToLists(x)
         [obj.setSustain(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1008,6 +1034,7 @@ class MidiAdsr(PyoObject):
                 new `sustain` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._release = x
         x, lmax = convertArgsToLists(x)
         [obj.setRelease(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1086,6 +1113,7 @@ class MidiDelAdsr(PyoObject):
 
     """
     def __init__(self, input, delay=0, attack=0.01, decay=0.05, sustain=0.7, release=0.1, mul=1, add=0):
+        pyoArgsAssert(self, "onnnnnOO", input, delay, attack, decay, sustain, release, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._delay = delay
@@ -1112,6 +1140,7 @@ class MidiDelAdsr(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1125,6 +1154,7 @@ class MidiDelAdsr(PyoObject):
                 new `delay` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._delay = x
         x, lmax = convertArgsToLists(x)
         [obj.setDelay(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1139,6 +1169,7 @@ class MidiDelAdsr(PyoObject):
                 new `attack` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._attack = x
         x, lmax = convertArgsToLists(x)
         [obj.setAttack(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1153,6 +1184,7 @@ class MidiDelAdsr(PyoObject):
                 new `decay` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._decay = x
         x, lmax = convertArgsToLists(x)
         [obj.setDecay(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1167,6 +1199,7 @@ class MidiDelAdsr(PyoObject):
                 new `sustain` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._sustain = x
         x, lmax = convertArgsToLists(x)
         [obj.setSustain(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1181,6 +1214,7 @@ class MidiDelAdsr(PyoObject):
                 new `sustain` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._release = x
         x, lmax = convertArgsToLists(x)
         [obj.setRelease(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1218,4 +1252,80 @@ class MidiDelAdsr(PyoObject):
         """float. Duration of the release phase in seconds."""
         return self._release
     @release.setter
-    def release(self, x): self.setRelease(x)
\ No newline at end of file
+    def release(self, x): self.setRelease(x)
+
+class RawMidi(PyoObject):
+    """
+    Raw Midi handler.
+
+    This object calls a python function for each raw midi data 
+    (status, data1, data2) event for further processing in Python.
+
+    :Parent: :py:class:`PyoObject`
+
+    :Args:
+
+        function : Python function (can't be a list)
+            Function to be called. The function must be declared
+            with three arguments, one for the status byte and two
+            for the data bytes. Ex.:
+
+            def event(status, data1, data2):
+                print status, data1, data2
+
+    .. note::
+
+        The out() method is bypassed. RawMidi's signal can not be sent
+        to audio outs.
+
+    >>> s = Server()
+    >>> s.setMidiInputDevice(99) # opens all devices
+    >>> s.boot()
+    >>> s.start()
+    >>> def event(status, data1, data2):
+    ...     print status, data1, data2
+    >>> a = RawMidi(event)
+
+    """
+    def __init__(self, function):
+        pyoArgsAssert(self, "C", function)
+        PyoObject.__init__(self)
+        self._function = WeakMethod(function)
+        self._base_objs = [RawMidi_base(self._function)]
+
+    def out(self, chnl=0, inc=1, dur=0, delay=0):
+        return self.play(dur, delay)
+
+    def setMul(self, x):
+        pass
+
+    def setAdd(self, x):
+        pass
+
+    def setSub(self, x):
+        pass
+
+    def setDiv(self, x):
+        pass
+
+    def setFunction(self, x):
+        """
+        Replace the `function` attribute.
+
+        :Args:
+
+            x : Python function
+                new `function` attribute.
+
+        """
+        pyoArgsAssert(self, "C", x)
+        self._function = WeakMethod(x)
+        [obj.setFunction(self._function) for i, obj in enumerate(self._base_objs)]
+
+    @property
+    def function(self):
+        """Python function. Function to be called."""
+        return self._function
+    @function.setter
+    def function(self, x):
+        self.setFunction(x)
diff --git a/pyolib/opensndctrl.py b/pyolib/opensndctrl.py
index c92a9a5..163cd94 100644
--- a/pyolib/opensndctrl.py
+++ b/pyolib/opensndctrl.py
@@ -31,10 +31,9 @@ GNU Lesser General Public License for more details.
 You should have received a copy of the GNU Lesser General Public
 License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
-import sys
 from _core import *
 from _maps import *
-from types import IntType, ListType
+from types import ListType
 
 ######################################################################
 ### Open Sound Control
@@ -77,6 +76,7 @@ class OscSend(PyoObject):
 
     """
     def __init__(self, input, port, address, host="127.0.0.1"):
+        pyoArgsAssert(self, "oiss", input, port, address, host)
         PyoObject.__init__(self)
         self._input = input
         self._in_fader = InputFader(input)
@@ -95,6 +95,7 @@ class OscSend(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -118,6 +119,7 @@ class OscSend(PyoObject):
                 Should be greater or equal to 1.
 
         """
+        pyoArgsAssert(self, "I", x)
         [obj.setBufferRate(x) for obj in self._base_objs]
 
     @property
@@ -169,10 +171,8 @@ class OscReceive(PyoObject):
     """
 
     def __init__(self, port, address, mul=1, add=0):
+        pyoArgsAssert(self, "IsOO", port, address, mul, add)
         PyoObject.__init__(self, mul, add)
-        if type(port) != IntType:
-            print >> sys.stderr, 'TypeError: "port" argument of %s must be an integer.\n' % self.__class__.__name__
-            exit()
         address, mul, add, lmax = convertArgsToLists(address, mul, add)
         self._address = address
         self._mainReceiver = OscReceiver_base(port, address)
@@ -207,6 +207,7 @@ class OscReceive(PyoObject):
                 Addition factor. Defaults to 0.
 
         """
+        pyoArgsAssert(self, "sOO", path, mul, add)
         path, lmax = convertArgsToLists(path)
         mul, add, lmax2 = convertArgsToLists(mul, add)
         for i, p in enumerate(path):
@@ -225,6 +226,7 @@ class OscReceive(PyoObject):
                 Path(s) to remove.
 
         """
+        pyoArgsAssert(self, "s", path)
         path, lmax = convertArgsToLists(path)
         self._mainReceiver.delAddress(path)
         indexes = [self._address.index(p) for p in path]
@@ -242,6 +244,7 @@ class OscReceive(PyoObject):
                 True activates the interpolation, False deactivates it.
 
         """
+        pyoArgsAssert(self, "B", x)
         [obj.setInterpolation(x) for obj in self._base_objs]
 
     def setValue(self, path, value):
@@ -256,6 +259,7 @@ class OscReceive(PyoObject):
                 Value to attribute to the given address.
 
         """
+        pyoArgsAssert(self, "sn", path, value)
         path, value, lmax = convertArgsToLists(path, value)
         for i in range(lmax):
             p = wrap(path,i)
@@ -309,11 +313,17 @@ class OscDataSend(PyoObject):
         types : str
             String specifying the types sequence of the message to be sent.
             Possible values are:
-                - integer : "i"
-                - long integer : "h"
-                - float : "f"
-                - double : "d"
-                - string : "s"
+                - "i" : integer
+                - "h" : long integer
+                - "f" : float
+                - "d" : double
+                - "s" ; string
+                - "b" : blob (list of chars)
+                - "m" : MIDI packet (list of 4 bytes: [midi port, status, data1, data2])
+                - "c" : char
+                - "T" : True
+                - "F" : False
+                - "N" : None (nil)
 
             The string "ssfi" indicates that the value to send will be a list
             containing two strings followed by a float and an integer.
@@ -335,16 +345,26 @@ class OscDataSend(PyoObject):
 
     >>> s = Server().boot()
     >>> s.start()
-    >>> a = OscDataSend("fissif", 9900, "/data/test")
     >>> def pp(address, *args):
     ...     print address
     ...     print args
-    >>> b = OscDataReceive(9900, "/data/test", pp)
+    >>> r = OscDataReceive(9900, "/data/test", pp)
+    >>> # Send various types
+    >>> a = OscDataSend("fissif", 9900, "/data/test")
     >>> msg = [3.14159, 1, "Hello", "world!", 2, 6.18]
     >>> a.send(msg)
+    >>> # Send a blob
+    >>> b = OscDataSend("b", 9900, "/data/test")
+    >>> msg = [[chr(i) for i in range(10)]]
+    >>> b.send(msg)
+    >>> # Send a MIDI noteon on port 0
+    >>> c = OscDataSend("m", 9900, "/data/test")
+    >>> msg = [[0, 144, 60, 100]]
+    >>> c.send(msg)
 
     """
     def __init__(self, types, port, address, host="127.0.0.1"):
+        pyoArgsAssert(self, "siss", types, port, address, host)
         PyoObject.__init__(self)
         types, port, address, host, lmax = convertArgsToLists(types, port, address, host)
         self._base_objs = [OscDataSend_base(wrap(types,i), wrap(port,i), wrap(address,i), wrap(host,i)) for i in range(lmax)]
@@ -396,6 +416,7 @@ class OscDataSend(PyoObject):
                 is the localhost.
 
         """
+        pyoArgsAssert(self, "siss", types, port, address, host)
         types, port, address, host, lmax = convertArgsToLists(types, port, address, host)
         objs = [OscDataSend_base(wrap(types,i), wrap(port,i), wrap(address,i), wrap(host,i)) for i in range(lmax)]
         self._base_objs.extend(objs)
@@ -412,6 +433,7 @@ class OscDataSend(PyoObject):
                 Path(s) to remove.
 
         """
+        pyoArgsAssert(self, "s", path)
         path, lmax = convertArgsToLists(path)
         for p in path:
             self._base_objs.remove(self._addresses[p])
@@ -433,8 +455,10 @@ class OscDataSend(PyoObject):
 
         """
         if address == None:
+            pyoArgsAssert(self, "l", msg)
             [obj.send(msg) for obj in self._base_objs]
         else:
+            pyoArgsAssert(self, "lS", msg, address)
             self._addresses[address].send(msg)
 
 class OscDataReceive(PyoObject):
@@ -477,25 +501,29 @@ class OscDataReceive(PyoObject):
 
     >>> s = Server().boot()
     >>> s.start()
-    >>> a = OscDataSend("fissif", 9900, "/data/test")
     >>> def pp(address, *args):
     ...     print address
     ...     print args
-    >>> b = OscDataReceive(9900, "/data/test", pp)
+    >>> r = OscDataReceive(9900, "/data/test", pp)
+    >>> # Send various types
+    >>> a = OscDataSend("fissif", 9900, "/data/test")
     >>> msg = [3.14159, 1, "Hello", "world!", 2, 6.18]
     >>> a.send(msg)
+    >>> # Send a blob
+    >>> b = OscDataSend("b", 9900, "/data/test")
+    >>> msg = [[chr(i) for i in range(10)]]
+    >>> b.send(msg)
+    >>> # Send a MIDI noteon on port 0
+    >>> c = OscDataSend("m", 9900, "/data/test")
+    >>> msg = [[0, 144, 60, 100]]
+    >>> c.send(msg)
 
     """
 
     def __init__(self, port, address, function):
+        pyoArgsAssert(self, "IsC", port, address, function)
         PyoObject.__init__(self)
-        if type(port) != IntType:
-            print >> sys.stderr, 'TypeError: "port" argument of %s must be an integer.\n' % self.__class__.__name__
-            exit()
         self._port = port
-        if not callable(function):
-            print >> sys.stderr, 'TypeError: "function" argument of %s must be callable.\n' % self.__class__.__name__
-            exit()
         self._function = WeakMethod(function)
         self._address, lmax = convertArgsToLists(address)
         # self._address is linked with list at C level
@@ -527,6 +555,7 @@ class OscDataReceive(PyoObject):
                 New path(s) to receive from.
 
         """
+        pyoArgsAssert(self, "s", path)
         path, lmax = convertArgsToLists(path)
         for p in path:
             if p not in self._address:
@@ -542,6 +571,7 @@ class OscDataReceive(PyoObject):
                 Path(s) to remove.
 
         """
+        pyoArgsAssert(self, "s", path)
         path, lmax = convertArgsToLists(path)
         for p in path:
             index = self._address.index(p)
@@ -592,13 +622,8 @@ class OscListReceive(PyoObject):
     """
 
     def __init__(self, port, address, num=8, mul=1, add=0):
+        pyoArgsAssert(self, "IsIOO", port, address, num, mul, add)
         PyoObject.__init__(self, mul, add)
-        if type(port) != IntType:
-            print >> sys.stderr, 'TypeError: "port" argument of %s must be an integer.\n' % self.__class__.__name__
-            exit()
-        if type(num) != IntType:
-            print >> sys.stderr, 'TypeError: "num" argument of %s must be an integer.\n' % self.__class__.__name__
-            exit()
         self._num = num
         self._op_duplicate = self._num
         address, mul, add, lmax = convertArgsToLists(address, mul, add)
@@ -637,6 +662,7 @@ class OscListReceive(PyoObject):
                 Addition factor. Defaults to 0.
 
         """
+        pyoArgsAssert(self, "sOO", path, mul, add)
         path, lmax = convertArgsToLists(path)
         mul, add, lmax2 = convertArgsToLists(mul, add)
         for i, p in enumerate(path):
@@ -655,6 +681,7 @@ class OscListReceive(PyoObject):
                 Path(s) to remove.
 
         """
+        pyoArgsAssert(self, "s", path)
         path, lmax = convertArgsToLists(path)
         self._mainReceiver.delAddress(path)
         indexes = [self._address.index(p) for p in path]
@@ -674,6 +701,7 @@ class OscListReceive(PyoObject):
                 True activates the interpolation, False deactivates it.
 
         """
+        pyoArgsAssert(self, "B", x)
         [obj.setInterpolation(x) for obj in self._base_objs]
 
     def setValue(self, path, value):
@@ -688,6 +716,7 @@ class OscListReceive(PyoObject):
                 List of values to attribute to the given address.
 
         """
+        pyoArgsAssert(self, "sl", path, value)
         path, lmax = convertArgsToLists(path)
         for i in range(lmax):
             p = wrap(path,i)
diff --git a/pyolib/pan.py b/pyolib/pan.py
index 5175edf..9bf4900 100644
--- a/pyolib/pan.py
+++ b/pyolib/pan.py
@@ -26,7 +26,7 @@ License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 import sys, random
 from _core import *
 from _maps import *
-from types import SliceType, IntType
+from types import SliceType
 
 class Pan(PyoObject):
     """
@@ -56,6 +56,7 @@ class Pan(PyoObject):
 
     """
     def __init__(self, input, outs=2, pan=0.5, spread=0.5, mul=1, add=0):
+        pyoArgsAssert(self, "oIOOOO", input, outs, pan, spread, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._pan = pan
@@ -81,6 +82,7 @@ class Pan(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -94,6 +96,7 @@ class Pan(PyoObject):
                 new `pan` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._pan = x
         x, lmax = convertArgsToLists(x)
         [obj.setPan(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -108,6 +111,7 @@ class Pan(PyoObject):
                 new `spread` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._spread = x
         x, lmax = convertArgsToLists(x)
         [obj.setSpread(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -164,6 +168,7 @@ class SPan(PyoObject):
 
     """
     def __init__(self, input, outs=2, pan=0.5, mul=1, add=0):
+        pyoArgsAssert(self, "oIOOO", input, outs, pan, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._outs = outs
@@ -188,6 +193,7 @@ class SPan(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -201,6 +207,7 @@ class SPan(PyoObject):
                 new `pan` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._pan = x
         x, lmax = convertArgsToLists(x)
         [obj.setPan(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -257,6 +264,7 @@ class Switch(PyoObject):
 
     """
     def __init__(self, input, outs=2, voice=0., mul=1, add=0):
+        pyoArgsAssert(self, "oIOOO", input, outs, voice, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._outs = outs
@@ -281,6 +289,7 @@ class Switch(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -294,6 +303,7 @@ class Switch(PyoObject):
                 new `voice` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._voice = x
         x, lmax = convertArgsToLists(x)
         [obj.setVoice(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -343,6 +353,7 @@ class Selector(PyoObject):
 
     """
     def __init__(self, inputs, voice=0., mul=1, add=0):
+        pyoArgsAssert(self, "lOOO", inputs, voice, mul, add)
         PyoObject.__init__(self, mul, add)
         self._inputs = inputs
         self._voice = voice
@@ -374,6 +385,7 @@ class Selector(PyoObject):
                 new `inputs` attribute.
 
         """
+        pyoArgsAssert(self, "l", x)
         self._inputs = x
         for i in range(self._lmax):
             for j in range(self._length):
@@ -395,6 +407,7 @@ class Selector(PyoObject):
                 new `voice` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._voice = x
         x, lmax = convertArgsToLists(x)
         for i, obj in enumerate(self._base_objs):
@@ -460,6 +473,7 @@ class VoiceManager(PyoObject):
 
     """
     def __init__(self, input, triggers=None, mul=1, add=0):
+        #pyoArgsAssert(self, "ooOO", input, triggers, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._triggers = triggers
@@ -491,6 +505,7 @@ class VoiceManager(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -504,6 +519,7 @@ class VoiceManager(PyoObject):
                 New `triggers` attribute.
 
         """
+        #pyoArgsAssert(self, "o", x)
         self._triggers = x
         if x != None:
             if type(x) == ListType:
@@ -577,13 +593,8 @@ class Mixer(PyoObject):
 
     """
     def __init__(self, outs=2, chnls=1, time=0.025, mul=1, add=0):
+        pyoArgsAssert(self, "IInOO", outs, chnls, time, mul, add)
         PyoObject.__init__(self, mul, add)
-        if type(outs) != IntType:
-            print >> sys.stderr, 'TypeError: "outs" argument of %s must be an integer.\n' % self.__class__.__name__
-            exit()
-        if type(chnls) != IntType:
-            print >> sys.stderr, 'TypeError: "chnls" argument of %s must be an integer.\n' % self.__class__.__name__
-            exit()
         self._outs = outs
         self._chnls = chnls
         self._time = time
@@ -610,6 +621,7 @@ class Mixer(PyoObject):
                 New portamento duration.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._time = x
         x, lmax = convertArgsToLists(x)
         [obj.setTime(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -629,6 +641,7 @@ class Mixer(PyoObject):
                 Audio object to add to the mixer.
 
         """
+        pyoArgsAssert(self, "o", input)
         if voice == None:
             voice = random.randint(0, 32767)
             while self._inputs.has_key(voice):
diff --git a/pyolib/pattern.py b/pyolib/pattern.py
index 26549d3..8147c41 100644
--- a/pyolib/pattern.py
+++ b/pyolib/pattern.py
@@ -23,10 +23,8 @@ GNU Lesser General Public License for more details.
 You should have received a copy of the GNU Lesser General Public
 License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
-import sys
 from _core import *
 from _maps import *
-from types import ListType, TupleType
 
 class Pattern(PyoObject):
     """
@@ -62,15 +60,8 @@ class Pattern(PyoObject):
 
     """
     def __init__(self, function, time=1):
+        pyoArgsAssert(self, "cO", function, time)
         PyoObject.__init__(self)
-        if type(function) == ListType or type(function) == TupleType:
-            if not callable(function[0]):
-                print >> sys.stderr, 'TypeError: "function" argument of %s must be callable.\n' % self.__class__.__name__
-                exit()
-        else:
-            if not callable(function):
-                print >> sys.stderr, 'TypeError: "function" argument of %s must be callable.\n' % self.__class__.__name__
-                exit()
         self._function = getWeakMethodRef(function)
         self._time = time
         function, time, lmax = convertArgsToLists(function, time)
@@ -86,6 +77,7 @@ class Pattern(PyoObject):
                 new `function` attribute.
 
         """
+        pyoArgsAssert(self, "c", x)
         self._function = getWeakMethodRef(x)
         x, lmax = convertArgsToLists(x)
         [obj.setFunction(WeakMethod(wrap(x,i))) for i, obj in enumerate(self._base_objs)]
@@ -100,6 +92,7 @@ class Pattern(PyoObject):
                 New `time` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._time = x
         x, lmax = convertArgsToLists(x)
         [obj.setTime(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -185,6 +178,7 @@ class Score(PyoObject):
 
     """
     def __init__(self, input, fname="event_"):
+        pyoArgsAssert(self, "os", input, fname)
         PyoObject.__init__(self)
         self._input = input
         self._fname = fname
@@ -213,6 +207,7 @@ class Score(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -258,15 +253,8 @@ class CallAfter(PyoObject):
 
     """
     def __init__(self, function, time=1, arg=None):
+        pyoArgsAssert(self, "cn", function, time)
         PyoObject.__init__(self)
-        if type(function) == ListType or type(function) == TupleType:
-            if not callable(function[0]):
-                print >> sys.stderr, 'TypeError: "function" argument of %s must be callable.\n' % self.__class__.__name__
-                exit()
-        else:
-            if not callable(function):
-                print >> sys.stderr, 'TypeError: "function" argument of %s must be callable.\n' % self.__class__.__name__
-                exit()
         self._function = getWeakMethodRef(function)
         function, time, arg, lmax = convertArgsToLists(function, time, arg)
         self._base_objs = [CallAfter_base(WeakMethod(wrap(function,i)), wrap(time,i), wrap(arg,i)) for i in range(lmax)]
diff --git a/pyolib/phasevoc.py b/pyolib/phasevoc.py
index 4afd67d..ae988d2 100644
--- a/pyolib/phasevoc.py
+++ b/pyolib/phasevoc.py
@@ -82,6 +82,7 @@ class PVAnal(PyoPVObject):
 
     """
     def __init__(self, input, size=1024, overlaps=4, wintype=2):
+        pyoArgsAssert(self, "oiii", input, size, overlaps, wintype)
         PyoPVObject.__init__(self)
         self._input = input
         self._size = size
@@ -103,6 +104,7 @@ class PVAnal(PyoPVObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -116,6 +118,7 @@ class PVAnal(PyoPVObject):
                 new `size` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._size = x
         x, lmax = convertArgsToLists(x)
         [obj.setSize(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -130,6 +133,7 @@ class PVAnal(PyoPVObject):
                 new `overlaps` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._overlaps = x
         x, lmax = convertArgsToLists(x)
         [obj.setOverlaps(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -212,6 +216,7 @@ class PVSynth(PyoObject):
 
     """
     def __init__(self, input, wintype=2, mul=1, add=0):
+        pyoArgsAssert(self, "piOO", input, wintype, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._wintype = wintype
@@ -228,6 +233,7 @@ class PVSynth(PyoObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -242,6 +248,7 @@ class PVSynth(PyoObject):
                 new `wintype` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._wintype = x
         x, lmax = convertArgsToLists(x)
         [obj.setWinType(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -300,6 +307,7 @@ class PVAddSynth(PyoObject):
 
     """
     def __init__(self, input, pitch=1, num=100, first=0, inc=1, mul=1, add=0):
+        pyoArgsAssert(self, "pOiiiOO", input, pitch, num, first, inc, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._pitch = pitch
@@ -319,6 +327,7 @@ class PVAddSynth(PyoObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -333,6 +342,7 @@ class PVAddSynth(PyoObject):
                 new `pitch` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._pitch = x
         x, lmax = convertArgsToLists(x)
         [obj.setPitch(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -347,6 +357,7 @@ class PVAddSynth(PyoObject):
                 new `num` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._num = x
         x, lmax = convertArgsToLists(x)
         [obj.setNum(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -361,6 +372,7 @@ class PVAddSynth(PyoObject):
                 new `first` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._first = x
         x, lmax = convertArgsToLists(x)
         [obj.setFirst(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -375,6 +387,7 @@ class PVAddSynth(PyoObject):
                 new `inc` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._inc = x
         x, lmax = convertArgsToLists(x)
         [obj.setInc(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -442,6 +455,7 @@ class PVTranspose(PyoPVObject):
 
     """
     def __init__(self, input, transpo=1):
+        pyoArgsAssert(self, "pO", input, transpo)
         PyoPVObject.__init__(self)
         self._input = input
         self._transpo = transpo
@@ -458,6 +472,7 @@ class PVTranspose(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -472,6 +487,7 @@ class PVTranspose(PyoPVObject):
                 new `transpo` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._transpo = x
         x, lmax = convertArgsToLists(x)
         [obj.setTranspo(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -523,6 +539,7 @@ class PVVerb(PyoPVObject):
 
     """
     def __init__(self, input, revtime=0.75, damp=0.75):
+        pyoArgsAssert(self, "pOO", input, revtime, damp)
         PyoPVObject.__init__(self)
         self._input = input
         self._revtime = revtime
@@ -540,6 +557,7 @@ class PVVerb(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -554,6 +572,7 @@ class PVVerb(PyoPVObject):
                 new `revtime` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._revtime = x
         x, lmax = convertArgsToLists(x)
         [obj.setRevtime(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -568,6 +587,7 @@ class PVVerb(PyoPVObject):
                 new `damp` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._damp = x
         x, lmax = convertArgsToLists(x)
         [obj.setDamp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -623,6 +643,7 @@ class PVGate(PyoPVObject):
 
     """
     def __init__(self, input, thresh=-20, damp=0.):
+        pyoArgsAssert(self, "pOO", input, thresh, damp)
         PyoPVObject.__init__(self)
         self._input = input
         self._thresh = thresh
@@ -640,6 +661,7 @@ class PVGate(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -654,6 +676,7 @@ class PVGate(PyoPVObject):
                 new `thresh` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._thresh = x
         x, lmax = convertArgsToLists(x)
         [obj.setThresh(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -668,6 +691,7 @@ class PVGate(PyoPVObject):
                 new `damp` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._damp = x
         x, lmax = convertArgsToLists(x)
         [obj.setDamp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -746,6 +770,7 @@ class PVCross(PyoPVObject):
 
     """
     def __init__(self, input, input2, fade=1):
+        pyoArgsAssert(self, "ppO", input, input2, fade)
         PyoPVObject.__init__(self)
         self._input = input
         self._input2 = input2
@@ -763,6 +788,7 @@ class PVCross(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -777,6 +803,7 @@ class PVCross(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input2 = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput2(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -787,10 +814,11 @@ class PVCross(PyoPVObject):
 
         :Args:
 
-            x : int
+            x : float or PyoObject
                 new `fade` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._fade = x
         x, lmax = convertArgsToLists(x)
         [obj.setFade(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -861,6 +889,7 @@ class PVMult(PyoPVObject):
 
     """
     def __init__(self, input, input2):
+        pyoArgsAssert(self, "pp", input, input2)
         PyoPVObject.__init__(self)
         self._input = input
         self._input2 = input2
@@ -877,6 +906,7 @@ class PVMult(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -891,6 +921,7 @@ class PVMult(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input2 = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput2(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -957,6 +988,7 @@ class PVMorph(PyoPVObject):
 
     """
     def __init__(self, input, input2, fade=0.5):
+        pyoArgsAssert(self, "ppO", input, input2, fade)
         PyoPVObject.__init__(self)
         self._input = input
         self._input2 = input2
@@ -974,6 +1006,7 @@ class PVMorph(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -988,6 +1021,7 @@ class PVMorph(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input2 = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput2(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -998,10 +1032,11 @@ class PVMorph(PyoPVObject):
 
         :Args:
 
-            x : int
+            x : float or PyoObject
                 new `fade` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._fade = x
         x, lmax = convertArgsToLists(x)
         [obj.setFade(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1068,6 +1103,7 @@ class PVFilter(PyoPVObject):
 
     """
     def __init__(self, input, table, gain=1, mode=0):
+        pyoArgsAssert(self, "ptOi", input, table, gain, mode)
         PyoPVObject.__init__(self)
         self._input = input
         self._table = table
@@ -1086,6 +1122,7 @@ class PVFilter(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1100,6 +1137,7 @@ class PVFilter(PyoPVObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1114,6 +1152,7 @@ class PVFilter(PyoPVObject):
                 new `gain` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._gain = x
         x, lmax = convertArgsToLists(x)
         [obj.setGain(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1128,6 +1167,7 @@ class PVFilter(PyoPVObject):
                 new `mode` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._mode = x
         x, lmax = convertArgsToLists(x)
         [obj.setMode(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1215,6 +1255,7 @@ class PVDelay(PyoPVObject):
 
     """
     def __init__(self, input, deltable, feedtable, maxdelay=1.0, mode=0):
+        pyoArgsAssert(self, "pttni", input, deltable, feedtable, maxdelay, mode)
         PyoPVObject.__init__(self)
         self._input = input
         self._deltable = deltable
@@ -1234,6 +1275,7 @@ class PVDelay(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1248,6 +1290,7 @@ class PVDelay(PyoPVObject):
                 new `deltable` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._deltable = x
         x, lmax = convertArgsToLists(x)
         [obj.setDeltable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1262,6 +1305,7 @@ class PVDelay(PyoPVObject):
                 new `feedtable` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._feedtable = x
         x, lmax = convertArgsToLists(x)
         [obj.setFeedtable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1276,6 +1320,7 @@ class PVDelay(PyoPVObject):
                 new `mode` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._mode = x
         x, lmax = convertArgsToLists(x)
         [obj.setMode(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1347,6 +1392,7 @@ class PVBuffer(PyoPVObject):
 
     """
     def __init__(self, input, index, pitch=1.0, length=1.0):
+        pyoArgsAssert(self, "poOn", input, index, pitch, length)
         PyoPVObject.__init__(self)
         self._input = input
         self._index = index
@@ -1365,6 +1411,7 @@ class PVBuffer(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1379,6 +1426,7 @@ class PVBuffer(PyoPVObject):
                 new `index` attribute.
 
         """
+        pyoArgsAssert(self, "o", x)
         self._index = x
         x, lmax = convertArgsToLists(x)
         [obj.setIndex(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1393,6 +1441,7 @@ class PVBuffer(PyoPVObject):
                 new `pitch` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._pitch = x
         x, lmax = convertArgsToLists(x)
         [obj.setPitch(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1447,6 +1496,7 @@ class PVShift(PyoPVObject):
 
     """
     def __init__(self, input, shift=0):
+        pyoArgsAssert(self, "pO", input, shift)
         PyoPVObject.__init__(self)
         self._input = input
         self._shift = shift
@@ -1463,6 +1513,7 @@ class PVShift(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1473,10 +1524,11 @@ class PVShift(PyoPVObject):
 
         :Args:
 
-            x : int
+            x : float or PyoObject
                 new `shift` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._shift = x
         x, lmax = convertArgsToLists(x)
         [obj.setShift(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1537,6 +1589,7 @@ class PVAmpMod(PyoPVObject):
 
     """
     def __init__(self, input, basefreq=1, spread=0):
+        pyoArgsAssert(self, "pOO", input, basefreq, spread)
         PyoPVObject.__init__(self)
         self._input = input
         self._basefreq = basefreq
@@ -1554,6 +1607,7 @@ class PVAmpMod(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1564,10 +1618,11 @@ class PVAmpMod(PyoPVObject):
 
         :Args:
 
-            x : int
+            x : float or PyoObject
                 new `basefreq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._basefreq = x
         x, lmax = convertArgsToLists(x)
         [obj.setBasefreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1578,10 +1633,11 @@ class PVAmpMod(PyoPVObject):
 
         :Args:
 
-            x : int
+            x : float or PyoObject
                 new `spread` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._spread = x
         x, lmax = convertArgsToLists(x)
         [obj.setSpread(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1660,6 +1716,7 @@ class PVFreqMod(PyoPVObject):
 
     """
     def __init__(self, input, basefreq=1, spread=0, depth=0.1):
+        pyoArgsAssert(self, "pOOO", input, basefreq, spread, depth)
         PyoPVObject.__init__(self)
         self._input = input
         self._basefreq = basefreq
@@ -1678,6 +1735,7 @@ class PVFreqMod(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1688,10 +1746,11 @@ class PVFreqMod(PyoPVObject):
 
         :Args:
 
-            x : int
+            x : float or PyoObject
                 new `basefreq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._basefreq = x
         x, lmax = convertArgsToLists(x)
         [obj.setBasefreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1702,10 +1761,11 @@ class PVFreqMod(PyoPVObject):
 
         :Args:
 
-            x : int
+            x : float or PyoObject
                 new `spread` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._spread = x
         x, lmax = convertArgsToLists(x)
         [obj.setSpread(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1716,10 +1776,11 @@ class PVFreqMod(PyoPVObject):
 
         :Args:
 
-            x : int
+            x : float or PyoObject
                 new `depth` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._depth = x
         x, lmax = convertArgsToLists(x)
         [obj.setDepth(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1813,6 +1874,7 @@ class PVBufLoops(PyoPVObject):
 
     """
     def __init__(self, input, low=1.0, high=1.0, mode=0, length=1.0):
+        pyoArgsAssert(self, "pOOin", input, low, high, mode, length)
         PyoPVObject.__init__(self)
         self._input = input
         self._low = low
@@ -1832,6 +1894,7 @@ class PVBufLoops(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1846,6 +1909,7 @@ class PVBufLoops(PyoPVObject):
                 new `low` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._low = x
         x, lmax = convertArgsToLists(x)
         [obj.setLow(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1860,6 +1924,7 @@ class PVBufLoops(PyoPVObject):
                 new `high` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._high = x
         x, lmax = convertArgsToLists(x)
         [obj.setHigh(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1874,6 +1939,7 @@ class PVBufLoops(PyoPVObject):
                 new `mode` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._mode = x
         x, lmax = convertArgsToLists(x)
         [obj.setMode(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1955,6 +2021,7 @@ class PVBufTabLoops(PyoPVObject):
 
     """
     def __init__(self, input, speed, length=1.0):
+        pyoArgsAssert(self, "ptn", input, speed, length)
         PyoPVObject.__init__(self)
         self._input = input
         self._speed = speed
@@ -1972,6 +2039,7 @@ class PVBufTabLoops(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1986,6 +2054,7 @@ class PVBufTabLoops(PyoPVObject):
                 new `speed` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._speed = x
         x, lmax = convertArgsToLists(x)
         [obj.setSpeed(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2050,6 +2119,7 @@ class PVMix(PyoPVObject):
 
     """
     def __init__(self, input, input2):
+        pyoArgsAssert(self, "pp", input, input2)
         PyoPVObject.__init__(self)
         self._input = input
         self._input2 = input2
@@ -2066,6 +2136,7 @@ class PVMix(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2080,6 +2151,7 @@ class PVMix(PyoPVObject):
                 New signal to process.
 
         """
+        pyoArgsAssert(self, "p", x)
         self._input2 = x
         x, lmax = convertArgsToLists(x)
         [obj.setInput2(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
diff --git a/pyolib/players.py b/pyolib/players.py
index 9812b89..3b5da47 100644
--- a/pyolib/players.py
+++ b/pyolib/players.py
@@ -83,6 +83,7 @@ class SfPlayer(PyoObject):
 
     """
     def __init__(self, path, speed=1, loop=False, offset=0, interp=2, mul=1, add=0):
+        pyoArgsAssert(self, "sObniOO", path, speed, loop, offset, interp, mul, add)
         PyoObject.__init__(self, mul, add)
         self._path = path
         self._speed = speed
@@ -114,6 +115,7 @@ class SfPlayer(PyoObject):
                 Full path of the new sound.
 
         """
+        pyoArgsAssert(self, "s", path)
         if type(self._path) == ListType:
             curNchnls = sndinfo(self._path[0])[3]
         else:
@@ -159,6 +161,7 @@ class SfPlayer(PyoObject):
                 new `speed` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._speed = x
         x, lmax = convertArgsToLists(x)
         [obj.setSpeed(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -173,6 +176,7 @@ class SfPlayer(PyoObject):
                 new `loop` attribute.
 
         """
+        pyoArgsAssert(self, "b", x)
         self._loop = x
         x, lmax = convertArgsToLists(x)
         for i, obj in enumerate(self._base_players):
@@ -189,6 +193,7 @@ class SfPlayer(PyoObject):
                 new `offset` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._offset = x
         x, lmax = convertArgsToLists(x)
         [obj.setOffset(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -203,6 +208,7 @@ class SfPlayer(PyoObject):
                 new `interp` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._interp = x
         x, lmax = convertArgsToLists(x)
         [obj.setInterp(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -300,6 +306,7 @@ class SfMarkerShuffler(PyoObject):
 
     """
     def __init__(self, path, speed=1, interp=2, mul=1, add=0):
+        pyoArgsAssert(self, "sOiOO", path, speed, interp, mul, add)
         PyoObject.__init__(self, mul, add)
         self._speed = speed
         self._interp = interp
@@ -330,6 +337,7 @@ class SfMarkerShuffler(PyoObject):
                 new `speed` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._speed = x
         x, lmax = convertArgsToLists(x)
         [obj.setSpeed(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -344,6 +352,7 @@ class SfMarkerShuffler(PyoObject):
                 new `interp` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._interp = x
         x, lmax = convertArgsToLists(x)
         [obj.setInterp(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -423,6 +432,7 @@ class SfMarkerLooper(PyoObject):
 
     """
     def __init__(self, path, speed=1, mark=0, interp=2, mul=1, add=0):
+        pyoArgsAssert(self, "sOOiOO", path, speed, mark, interp, mul, add)
         PyoObject.__init__(self, mul, add)
         self._speed = speed
         self._mark = mark
@@ -454,6 +464,7 @@ class SfMarkerLooper(PyoObject):
                 new `speed` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._speed = x
         x, lmax = convertArgsToLists(x)
         [obj.setSpeed(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -468,6 +479,7 @@ class SfMarkerLooper(PyoObject):
                 new `mark` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._mark = x
         x, lmax = convertArgsToLists(x)
         [obj.setMark(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -482,6 +494,7 @@ class SfMarkerLooper(PyoObject):
                 new `interp` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._interp = x
         x, lmax = convertArgsToLists(x)
         [obj.setInterp(wrap(x,i)) for i, obj in enumerate(self._base_players)]
diff --git a/pyolib/randoms.py b/pyolib/randoms.py
index 0b79845..f3e3f68 100644
--- a/pyolib/randoms.py
+++ b/pyolib/randoms.py
@@ -21,7 +21,6 @@ GNU Lesser General Public License for more details.
 You should have received a copy of the GNU Lesser General Public
 License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
-import sys
 from _core import *
 from _maps import *
 from types import StringType, ListType
@@ -53,6 +52,7 @@ class Randi(PyoObject):
 
     """
     def __init__(self, min=0., max=1., freq=1., mul=1, add=0):
+        pyoArgsAssert(self, "OOOOO", min, max, freq, mul, add)
         PyoObject.__init__(self, mul, add)
         self._min = min
         self._max = max
@@ -70,6 +70,7 @@ class Randi(PyoObject):
                 new `min` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._min = x
         x, lmax = convertArgsToLists(x)
         [obj.setMin(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -84,6 +85,7 @@ class Randi(PyoObject):
                 new `max` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._max = x
         x, lmax = convertArgsToLists(x)
         [obj.setMax(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -98,7 +100,8 @@ class Randi(PyoObject):
                 new `freq` attribute.
 
         """
-        self._port = x
+        pyoArgsAssert(self, "O", x)
+        self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
@@ -158,6 +161,7 @@ class Randh(PyoObject):
 
     """
     def __init__(self, min=0., max=1., freq=1., mul=1, add=0):
+        pyoArgsAssert(self, "OOOOO", min, max, freq, mul, add)
         PyoObject.__init__(self, mul, add)
         self._min = min
         self._max = max
@@ -175,6 +179,7 @@ class Randh(PyoObject):
                 new `min` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._min = x
         x, lmax = convertArgsToLists(x)
         [obj.setMin(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -189,6 +194,7 @@ class Randh(PyoObject):
                 new `max` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._max = x
         x, lmax = convertArgsToLists(x)
         [obj.setMax(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -203,7 +209,8 @@ class Randh(PyoObject):
                 new `freq` attribute.
 
         """
-        self._port = x
+        pyoArgsAssert(self, "O", x)
+        self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
@@ -261,10 +268,8 @@ class Choice(PyoObject):
 
     """
     def __init__(self, choice, freq=1., mul=1, add=0):
+        pyoArgsAssert(self, "lOOO", choice, freq, mul, add)
         PyoObject.__init__(self, mul, add)
-        if type(choice) != ListType:
-            print >> sys.stderr, 'TypeError: "choice" argument of %s must be a list.\n' % self.__class__.__name__
-            exit()
         self._choice = choice
         self._freq = freq
         freq, mul, add, lmax = convertArgsToLists(freq, mul, add)
@@ -285,6 +290,7 @@ class Choice(PyoObject):
                 new `choice` attribute.
 
         """
+        pyoArgsAssert(self, "l", x)
         self._choice = x
         if type(x[0]) != ListType:
             [obj.setChoice(self._choice) for i, obj in enumerate(self._base_objs)]
@@ -301,6 +307,7 @@ class Choice(PyoObject):
                 new `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -349,6 +356,7 @@ class RandInt(PyoObject):
 
     """
     def __init__(self, max=100, freq=1., mul=1, add=0):
+        pyoArgsAssert(self, "OOOO", max, freq, mul, add)
         PyoObject.__init__(self, mul, add)
         self._max = max
         self._freq = freq
@@ -365,6 +373,7 @@ class RandInt(PyoObject):
                 new `max` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._max = x
         x, lmax = convertArgsToLists(x)
         [obj.setMax(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -379,6 +388,7 @@ class RandInt(PyoObject):
                 new `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -432,6 +442,7 @@ class RandDur(PyoObject):
 
     """
     def __init__(self, min=0., max=1., mul=1, add=0):
+        pyoArgsAssert(self, "OOOO", min, max, mul, add)
         PyoObject.__init__(self, mul, add)
         self._min = min
         self._max = max
@@ -448,6 +459,7 @@ class RandDur(PyoObject):
                 new `min` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._min = x
         x, lmax = convertArgsToLists(x)
         [obj.setMin(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -462,6 +474,7 @@ class RandDur(PyoObject):
                 new `max` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._max = x
         x, lmax = convertArgsToLists(x)
         [obj.setMax(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -577,6 +590,7 @@ class Xnoise(PyoObject):
 
     """
     def __init__(self, dist=0, freq=1., x1=0.5, x2=0.5, mul=1, add=0):
+        pyoArgsAssert(self, "OOOOO", freq, x1, x2, mul, add)
         PyoObject.__init__(self, mul, add)
         self._dist = dist
         self._freq = freq
@@ -593,7 +607,7 @@ class Xnoise(PyoObject):
 
         :Args:
 
-            x : int
+            x : string or int
                 new `dist` attribute.
 
         """
@@ -613,6 +627,7 @@ class Xnoise(PyoObject):
                 new `x1` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._x1 = x
         x, lmax = convertArgsToLists(x)
         [obj.setX1(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -627,6 +642,7 @@ class Xnoise(PyoObject):
                 new `x2` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._x2 = x
         x, lmax = convertArgsToLists(x)
         [obj.setX2(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -641,7 +657,8 @@ class Xnoise(PyoObject):
                 new `freq` attribute.
 
         """
-        self._port = x
+        pyoArgsAssert(self, "O", x)
+        self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
@@ -784,6 +801,7 @@ class XnoiseMidi(PyoObject):
 
     """
     def __init__(self, dist=0, freq=1., x1=0.5, x2=0.5, scale=0, mrange=(0,127), mul=1, add=0):
+        pyoArgsAssert(self, "OOOixOO", freq, x1, x2, scale, mrange, mul, add)
         PyoObject.__init__(self, mul, add)
         self._dist = dist
         self._freq = freq
@@ -827,6 +845,7 @@ class XnoiseMidi(PyoObject):
                 new `scale` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._scale = x
         x, lmax = convertArgsToLists(x)
         [obj.setScale(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -843,6 +862,7 @@ class XnoiseMidi(PyoObject):
                 maximum output midi range.
 
         """
+        pyoArgsAssert(self, "ii", mini, maxi)
         self._mrange = (mini, maxi)
         mini, maxi, lmax = convertArgsToLists(mini, maxi)
         [obj.setRange(wrap(mini,i), wrap(maxi,i)) for i, obj in enumerate(self._base_objs)]
@@ -857,6 +877,7 @@ class XnoiseMidi(PyoObject):
                 new `x1` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._x1 = x
         x, lmax = convertArgsToLists(x)
         [obj.setX1(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -871,7 +892,8 @@ class XnoiseMidi(PyoObject):
                 new `x2` attribute.
 
         """
-        self._x2= x
+        pyoArgsAssert(self, "O", x)
+        self._x2 = x
         x, lmax = convertArgsToLists(x)
         [obj.setX2(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
@@ -885,7 +907,8 @@ class XnoiseMidi(PyoObject):
                 new `freq` attribute.
 
         """
-        self._port = x
+        pyoArgsAssert(self, "O", x)
+        self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
@@ -1031,6 +1054,7 @@ class XnoiseDur(PyoObject):
 
     """
     def __init__(self, dist=0, min=0., max=1., x1=0.5, x2=0.5, mul=1, add=0):
+        pyoArgsAssert(self, "OOOOOO", min, max, x1, x2, mul, add)
         PyoObject.__init__(self, mul, add)
         self._dist = dist
         self._min = min
@@ -1048,7 +1072,7 @@ class XnoiseDur(PyoObject):
 
         :Args:
 
-            x : int
+            x : string or int
                 new `dist` attribute.
 
         """
@@ -1068,6 +1092,7 @@ class XnoiseDur(PyoObject):
                 new `min` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._min = x
         x, lmax = convertArgsToLists(x)
         [obj.setMin(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1082,6 +1107,7 @@ class XnoiseDur(PyoObject):
                 new `max` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._max = x
         x, lmax = convertArgsToLists(x)
         [obj.setMax(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1096,6 +1122,7 @@ class XnoiseDur(PyoObject):
                 new `x1` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._x1 = x
         x, lmax = convertArgsToLists(x)
         [obj.setX1(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1110,7 +1137,8 @@ class XnoiseDur(PyoObject):
                 new `x2` attribute.
 
         """
-        self._x2= x
+        pyoArgsAssert(self, "O", x)
+        self._x2 = x
         x, lmax = convertArgsToLists(x)
         [obj.setX2(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
@@ -1194,6 +1222,7 @@ class Urn(PyoObject):
 
     """
     def __init__(self, max=100, freq=1., mul=1, add=0):
+        pyoArgsAssert(self, "iOOO", max, freq, mul, add)
         PyoObject.__init__(self, mul, add)
         self._max = max
         self._freq = freq
@@ -1214,6 +1243,7 @@ class Urn(PyoObject):
                 new `max` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._max = x
         x, lmax = convertArgsToLists(x)
         [obj.setMax(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1228,6 +1258,7 @@ class Urn(PyoObject):
                 new `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
diff --git a/pyolib/tableprocess.py b/pyolib/tableprocess.py
index e36094b..88ba328 100644
--- a/pyolib/tableprocess.py
+++ b/pyolib/tableprocess.py
@@ -62,6 +62,7 @@ class Osc(PyoObject):
 
     """
     def __init__(self, table, freq=1000, phase=0, interp=2, mul=1, add=0):
+        pyoArgsAssert(self, "tOOiOO", table, freq, phase, interp, mul, add)
         PyoObject.__init__(self, mul, add)
         self._table = table
         self._freq = freq
@@ -80,6 +81,7 @@ class Osc(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -94,6 +96,7 @@ class Osc(PyoObject):
                 new `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -108,6 +111,7 @@ class Osc(PyoObject):
                 new `phase` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._phase = x
         x, lmax = convertArgsToLists(x)
         [obj.setPhase(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -122,6 +126,7 @@ class Osc(PyoObject):
                 new `interp` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._interp = x
         x, lmax = convertArgsToLists(x)
         [obj.setInterp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -201,6 +206,7 @@ class OscLoop(PyoObject):
 
     """
     def __init__(self, table, freq=1000, feedback=0, mul=1, add=0):
+        pyoArgsAssert(self, "tOOOO", table, freq, feedback, mul, add)
         PyoObject.__init__(self, mul, add)
         self._table = table
         self._freq = freq
@@ -218,6 +224,7 @@ class OscLoop(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -232,6 +239,7 @@ class OscLoop(PyoObject):
                 new `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -246,6 +254,7 @@ class OscLoop(PyoObject):
                 new `feedback` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._feedback = x
         x, lmax = convertArgsToLists(x)
         [obj.setFeedback(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -315,6 +324,7 @@ class OscTrig(PyoObject):
 
     """
     def __init__(self, table, trig, freq=1000, phase=0, interp=2, mul=1, add=0):
+        pyoArgsAssert(self, "toOOiOO", table, trig, freq, phase, interp, mul, add)
         PyoObject.__init__(self, mul, add)
         self._table = table
         self._trig = trig
@@ -334,6 +344,7 @@ class OscTrig(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -348,6 +359,7 @@ class OscTrig(PyoObject):
                 new `trig` attribute.
 
         """
+        pyoArgsAssert(self, "o", x)
         self._trig = x
         x, lmax = convertArgsToLists(x)
         [obj.setTrig(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -362,6 +374,7 @@ class OscTrig(PyoObject):
                 new `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -376,6 +389,7 @@ class OscTrig(PyoObject):
                 new `phase` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._phase = x
         x, lmax = convertArgsToLists(x)
         [obj.setPhase(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -390,6 +404,7 @@ class OscTrig(PyoObject):
                 new `interp` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._interp = x
         x, lmax = convertArgsToLists(x)
         [obj.setInterp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -520,6 +535,7 @@ class OscBank(PyoObject):
 
     """
     def __init__(self, table, freq=100, spread=1, slope=.9, frndf=1, frnda=0, arndf=1, arnda=0, num=24, fjit=False, mul=1, add=0):
+        pyoArgsAssert(self, "tOOOOOOOibOO", table, freq, spread, slope, frndf, frnda, arndf, arnda, num, fjit, mul, add)
         PyoObject.__init__(self, mul, add)
         self._table = table
         self._freq = freq
@@ -544,6 +560,7 @@ class OscBank(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -558,6 +575,7 @@ class OscBank(PyoObject):
                 new `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -572,6 +590,7 @@ class OscBank(PyoObject):
                 new `spread` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._spread = x
         x, lmax = convertArgsToLists(x)
         [obj.setSpread(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -586,6 +605,7 @@ class OscBank(PyoObject):
                 new `slope` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._slope = x
         x, lmax = convertArgsToLists(x)
         [obj.setSlope(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -600,6 +620,7 @@ class OscBank(PyoObject):
                 new `frndf` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._frndf = x
         x, lmax = convertArgsToLists(x)
         [obj.setFrndf(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -614,6 +635,7 @@ class OscBank(PyoObject):
                 new `frnda` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._frnda = x
         x, lmax = convertArgsToLists(x)
         [obj.setFrnda(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -628,6 +650,7 @@ class OscBank(PyoObject):
                 new `arndf` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._arndf = x
         x, lmax = convertArgsToLists(x)
         [obj.setArndf(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -642,6 +665,7 @@ class OscBank(PyoObject):
                 new `arnda` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._arnda = x
         x, lmax = convertArgsToLists(x)
         [obj.setArnda(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -656,6 +680,7 @@ class OscBank(PyoObject):
                 new `fjit` attribute.
 
         """
+        pyoArgsAssert(self, "b", x)
         self._fjit = x
         x, lmax = convertArgsToLists(x)
         [obj.setFjit(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -782,6 +807,7 @@ class TableRead(PyoObject):
 
     """
     def __init__(self, table, freq=1, loop=0, interp=2, mul=1, add=0):
+        pyoArgsAssert(self, "tObiOO", table, freq, loop, interp, mul, add)
         PyoObject.__init__(self, mul, add)
         self._table = table
         self._freq = freq
@@ -801,6 +827,7 @@ class TableRead(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -815,6 +842,7 @@ class TableRead(PyoObject):
                 new `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -829,6 +857,7 @@ class TableRead(PyoObject):
                 new `loop` attribute.
 
         """
+        pyoArgsAssert(self, "b", x)
         self._loop = x
         x, lmax = convertArgsToLists(x)
         [obj.setLoop(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -843,6 +872,7 @@ class TableRead(PyoObject):
                 new `interp` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._interp = x
         x, lmax = convertArgsToLists(x)
         [obj.setInterp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -937,6 +967,7 @@ class Pulsar(PyoObject):
 
     """
     def __init__(self, table, env, freq=100, frac=0.5, phase=0, interp=2, mul=1, add=0):
+        pyoArgsAssert(self, "ttOOOiOO", table, env, freq, frac, phase, interp, mul, add)
         PyoObject.__init__(self, mul, add)
         self._table = table
         self._env = env
@@ -957,6 +988,7 @@ class Pulsar(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -971,6 +1003,7 @@ class Pulsar(PyoObject):
                 new `env` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._env = x
         x, lmax = convertArgsToLists(x)
         [obj.setEnv(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -985,6 +1018,7 @@ class Pulsar(PyoObject):
                 new `freq` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._freq = x
         x, lmax = convertArgsToLists(x)
         [obj.setFreq(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -999,6 +1033,7 @@ class Pulsar(PyoObject):
                 new `frac` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._frac = x
         x, lmax = convertArgsToLists(x)
         [obj.setFrac(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1013,6 +1048,7 @@ class Pulsar(PyoObject):
                 new `phase` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._phase = x
         x, lmax = convertArgsToLists(x)
         [obj.setPhase(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1031,6 +1067,7 @@ class Pulsar(PyoObject):
                     4. cubic
 
         """
+        pyoArgsAssert(self, "i", x)
         self._interp = x
         x, lmax = convertArgsToLists(x)
         [obj.setInterp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1107,6 +1144,7 @@ class Pointer(PyoObject):
 
     """
     def __init__(self, table, index, mul=1, add=0):
+        pyoArgsAssert(self, "toOO", table, index, mul, add)
         PyoObject.__init__(self, mul, add)
         self._table = table
         self._index = index
@@ -1123,6 +1161,7 @@ class Pointer(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1137,6 +1176,7 @@ class Pointer(PyoObject):
                 new `index` attribute.
 
         """
+        pyoArgsAssert(self, "o", x)
         self._index = x
         x, lmax = convertArgsToLists(x)
         [obj.setIndex(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1193,6 +1233,7 @@ class Pointer2(PyoObject):
 
     """
     def __init__(self, table, index, interp=4, autosmooth=True, mul=1, add=0):
+        pyoArgsAssert(self, "toibOO", table, index, interp, autosmooth, mul, add)
         PyoObject.__init__(self, mul, add)
         self._table = table
         self._index = index
@@ -1211,6 +1252,7 @@ class Pointer2(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1225,6 +1267,7 @@ class Pointer2(PyoObject):
                 new `index` attribute.
 
         """
+        pyoArgsAssert(self, "o", x)
         self._index = x
         x, lmax = convertArgsToLists(x)
         [obj.setIndex(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1243,6 +1286,7 @@ class Pointer2(PyoObject):
                     4. cubic interpolation (default)
 
         """
+        pyoArgsAssert(self, "i", x)
         self._interp = x
         x, lmax = convertArgsToLists(x)
         [obj.setInterp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1261,6 +1305,7 @@ class Pointer2(PyoObject):
                 new `autosmooth` attribute.
 
         """
+        pyoArgsAssert(self, "b", x)
         self._autosmooth = x
         x, lmax = convertArgsToLists(x)
         [obj.setAutoSmooth(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1322,6 +1367,7 @@ class TableIndex(PyoObject):
 
     """
     def __init__(self, table, index, mul=1, add=0):
+        pyoArgsAssert(self, "toOO", table, index, mul, add)
         PyoObject.__init__(self, mul, add)
         self._table = table
         self._index = index
@@ -1338,6 +1384,7 @@ class TableIndex(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1352,6 +1399,7 @@ class TableIndex(PyoObject):
                 new `index` attribute.
 
         """
+        pyoArgsAssert(self, "o", x)
         self._index = x
         x, lmax = convertArgsToLists(x)
         [obj.setIndex(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1402,6 +1450,7 @@ class Lookup(PyoObject):
 
     """
     def __init__(self, table, index, mul=1, add=0):
+        pyoArgsAssert(self, "toOO", table, index, mul, add)
         PyoObject.__init__(self, mul, add)
         self._table = table
         self._index = index
@@ -1418,6 +1467,7 @@ class Lookup(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1432,6 +1482,7 @@ class Lookup(PyoObject):
                 new `index` attribute.
 
         """
+        pyoArgsAssert(self, "o", x)
         self._index = x
         x, lmax = convertArgsToLists(x)
         [obj.setIndex(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1514,6 +1565,7 @@ class TableRec(PyoObject):
 
     """
     def __init__(self, input, table, fadetime=0):
+        pyoArgsAssert(self, "otn", input, table, fadetime)
         PyoObject.__init__(self)
         self._time_dummy = []
         self._input = input
@@ -1551,6 +1603,7 @@ class TableRec(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1564,6 +1617,7 @@ class TableRec(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1627,6 +1681,7 @@ class TableWrite(PyoObject):
 
     """
     def __init__(self, input, pos, table):
+        pyoArgsAssert(self, "oot", input, pos, table)
         PyoObject.__init__(self)
         self._input = input
         self._pos = pos
@@ -1656,6 +1711,7 @@ class TableWrite(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1669,6 +1725,7 @@ class TableWrite(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1683,6 +1740,7 @@ class TableWrite(PyoObject):
                 new `pos` attribute.
 
         """
+        pyoArgsAssert(self, "o", x)
         self._pos = x
         x, lmax = convertArgsToLists(x)
         [obj.setPos(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1746,6 +1804,7 @@ class TableMorph(PyoObject):
 
     """
     def __init__(self, input, table, sources):
+        pyoArgsAssert(self, "otl", input, table, sources)
         PyoObject.__init__(self)
         self._input = input
         self._table = table
@@ -1776,6 +1835,7 @@ class TableMorph(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1789,6 +1849,7 @@ class TableMorph(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1803,6 +1864,7 @@ class TableMorph(PyoObject):
                 new `sources` attribute.
 
         """
+        pyoArgsAssert(self, "l", x)
         self._sources = x
         self._base_sources = [source[0] for source in x]
         [obj.setSources(self._base_sources) for i, obj in enumerate(self._base_objs)]
@@ -1870,6 +1932,7 @@ class Granulator(PyoObject):
 
     """
     def __init__(self, table, env, pitch=1, pos=0, dur=.1, grains=8, basedur=.1, mul=1, add=0):
+        pyoArgsAssert(self, "ttOOOinOO", table, env, pitch, pos, dur, grains, basedur, mul, add)
         PyoObject.__init__(self, mul, add)
         self._table = table
         self._env = env
@@ -1893,6 +1956,7 @@ class Granulator(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1907,6 +1971,7 @@ class Granulator(PyoObject):
                 new `env` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._env = x
         x, lmax = convertArgsToLists(x)
         [obj.setEnv(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1921,6 +1986,7 @@ class Granulator(PyoObject):
                 new `pitch` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._pitch = x
         x, lmax = convertArgsToLists(x)
         [obj.setPitch(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1935,6 +2001,7 @@ class Granulator(PyoObject):
                 new `pos` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._pos = x
         x, lmax = convertArgsToLists(x)
         [obj.setPos(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1949,6 +2016,7 @@ class Granulator(PyoObject):
                 new `dur` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._dur = x
         x, lmax = convertArgsToLists(x)
         [obj.setDur(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1963,6 +2031,7 @@ class Granulator(PyoObject):
                 new `grains` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._grains = x
         x, lmax = convertArgsToLists(x)
         [obj.setGrains(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1977,6 +2046,7 @@ class Granulator(PyoObject):
                 new `basedur` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._basedur = x
         x, lmax = convertArgsToLists(x)
         [obj.setBaseDur(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2088,6 +2158,7 @@ class TrigTableRec(PyoObject):
 
     """
     def __init__(self, input, trig, table, fadetime=0):
+        pyoArgsAssert(self, "ootn", input, trig, table, fadetime)
         PyoObject.__init__(self)
         self._time_dummy = []
         self._input = input
@@ -2127,6 +2198,7 @@ class TrigTableRec(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2142,6 +2214,7 @@ class TrigTableRec(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._trig = x
         self._in_fader2.setInput(x, fadetime)
 
@@ -2155,6 +2228,7 @@ class TrigTableRec(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2245,6 +2319,7 @@ class Looper(PyoObject):
 
     """
     def __init__(self, table, pitch=1, start=0, dur=1., xfade=20, mode=1, xfadeshape=0, startfromloop=False, interp=2, autosmooth=False, mul=1, add=0):
+        pyoArgsAssert(self, "tOOOOiibibOO", table, pitch, start, dur, xfade, mode, xfadeshape, startfromloop, interp, autosmooth, mul, add)
         PyoObject.__init__(self, mul, add)
         self._table = table
         self._pitch = pitch
@@ -2271,6 +2346,7 @@ class Looper(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2285,6 +2361,7 @@ class Looper(PyoObject):
                 new `pitch` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._pitch = x
         x, lmax = convertArgsToLists(x)
         [obj.setPitch(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2299,6 +2376,7 @@ class Looper(PyoObject):
                 new `start` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._start = x
         x, lmax = convertArgsToLists(x)
         [obj.setStart(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2313,6 +2391,7 @@ class Looper(PyoObject):
                 new `dur` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._dur = x
         x, lmax = convertArgsToLists(x)
         [obj.setDur(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2327,6 +2406,7 @@ class Looper(PyoObject):
                 new `xfade` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._xfade = x
         x, lmax = convertArgsToLists(x)
         [obj.setXfade(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2341,6 +2421,7 @@ class Looper(PyoObject):
                 new `xfadeshape` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._xfadeshape = x
         x, lmax = convertArgsToLists(x)
         [obj.setXfadeShape(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2355,6 +2436,7 @@ class Looper(PyoObject):
                 new `startfromloop` attribute.
 
         """
+        pyoArgsAssert(self, "b", x)
         self._startfromloop = x
         x, lmax = convertArgsToLists(x)
         [obj.setStartFromLoop(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2369,6 +2451,7 @@ class Looper(PyoObject):
                 new `mode` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._mode = x
         x, lmax = convertArgsToLists(x)
         [obj.setMode(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2383,6 +2466,7 @@ class Looper(PyoObject):
                 new `interp` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._interp = x
         x, lmax = convertArgsToLists(x)
         [obj.setInterp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2397,6 +2481,7 @@ class Looper(PyoObject):
                 new `autosmooth` attribute.
 
         """
+        pyoArgsAssert(self, "b", x)
         self._autosmooth = x
         x, lmax = convertArgsToLists(x)
         [obj.setAutoSmooth(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2539,6 +2624,7 @@ class TablePut(PyoObject):
 
     """
     def __init__(self, input, table):
+        pyoArgsAssert(self, "ot", input, table)
         PyoObject.__init__(self)
         self._input = input
         self._table = table
@@ -2568,6 +2654,7 @@ class TablePut(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2581,6 +2668,7 @@ class TablePut(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2641,6 +2729,7 @@ class Granule(PyoObject):
 
     """
     def __init__(self, table, env, dens=50, pitch=1, pos=0, dur=.1, mul=1, add=0):
+        pyoArgsAssert(self, "ttOOOOOO", table, env, dens, pitch, pos, dur, mul, add)
         PyoObject.__init__(self, mul, add)
         self._table = table
         self._env = env
@@ -2663,6 +2752,7 @@ class Granule(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2677,6 +2767,7 @@ class Granule(PyoObject):
                 new `env` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._env = x
         x, lmax = convertArgsToLists(x)
         [obj.setEnv(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2691,6 +2782,7 @@ class Granule(PyoObject):
                 new `dens` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._dens = x
         x, lmax = convertArgsToLists(x)
         [obj.setDens(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2705,6 +2797,7 @@ class Granule(PyoObject):
                 new `pitch` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._pitch = x
         x, lmax = convertArgsToLists(x)
         [obj.setPitch(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2719,6 +2812,7 @@ class Granule(PyoObject):
                 new `pos` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._pos = x
         x, lmax = convertArgsToLists(x)
         [obj.setPos(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2733,6 +2827,7 @@ class Granule(PyoObject):
                 new `dur` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._dur = x
         x, lmax = convertArgsToLists(x)
         [obj.setDur(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2748,6 +2843,7 @@ class Granule(PyoObject):
                 while False means asynchronous.
 
         """
+        pyoArgsAssert(self, "b", x)
         self._sync = x
         x, lmax = convertArgsToLists(x)
         [obj.setSync(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2832,6 +2928,7 @@ class TableScale(PyoObject):
 
     """
     def __init__(self, table, outtable, mul=1, add=0):
+        pyoArgsAssert(self, "ttOO", table, outtable, mul, add)
         PyoObject.__init__(self, mul, add)
         self._table = table
         self._outtable = outtable
@@ -2848,6 +2945,7 @@ class TableScale(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2862,6 +2960,7 @@ class TableScale(PyoObject):
                 new `outtable` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._outtable = x
         x, lmax = convertArgsToLists(x)
         [obj.setOuttable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2945,6 +3044,7 @@ class Particle(PyoObject):
 
     """
     def __init__(self, table, env, dens=50, pitch=1, pos=0, dur=.1, dev=0.01, pan=0.5, chnls=1, mul=1, add=0):
+        pyoArgsAssert(self, "ttOOOOOOIOO", table, env, dens, pitch, pos, dur, dev, pan, chnls, mul, add)
         PyoObject.__init__(self, mul, add)
         self._table = table
         self._env = env
@@ -2972,6 +3072,7 @@ class Particle(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -2986,6 +3087,7 @@ class Particle(PyoObject):
                 new `env` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._env = x
         x, lmax = convertArgsToLists(x)
         [obj.setEnv(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -3000,6 +3102,7 @@ class Particle(PyoObject):
                 new `dens` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._dens = x
         x, lmax = convertArgsToLists(x)
         [obj.setDens(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -3014,6 +3117,7 @@ class Particle(PyoObject):
                 new `pitch` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._pitch = x
         x, lmax = convertArgsToLists(x)
         [obj.setPitch(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -3028,6 +3132,7 @@ class Particle(PyoObject):
                 new `pos` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._pos = x
         x, lmax = convertArgsToLists(x)
         [obj.setPos(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -3042,6 +3147,7 @@ class Particle(PyoObject):
                 new `dur` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._dur = x
         x, lmax = convertArgsToLists(x)
         [obj.setDur(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -3056,6 +3162,7 @@ class Particle(PyoObject):
                 new `dev` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._dev = x
         x, lmax = convertArgsToLists(x)
         [obj.setDev(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -3070,6 +3177,7 @@ class Particle(PyoObject):
                 new `pan` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._pan = x
         x, lmax = convertArgsToLists(x)
         [obj.setPan(wrap(x,i)) for i, obj in enumerate(self._base_players)]
diff --git a/pyolib/tables.py b/pyolib/tables.py
index 6bdffb0..aeed3c1 100644
--- a/pyolib/tables.py
+++ b/pyolib/tables.py
@@ -52,6 +52,7 @@ class HarmTable(PyoTableObject):
 
     """
     def __init__(self, list=[1., 0.], size=8192):
+        pyoArgsAssert(self, "lI", list, size)
         PyoTableObject.__init__(self, size)
         self._list = copy.deepcopy(list)
         self._base_objs = [HarmTable_base(self._list, size)]
@@ -68,6 +69,7 @@ class HarmTable(PyoTableObject):
                 numbers 1,2,3, etc.
 
         """
+        pyoArgsAssert(self, "l", list)
         self._list = list
         [obj.replace(list) for obj in self._base_objs]
         self.refreshView()
@@ -102,6 +104,7 @@ class SawTable(PyoTableObject):
 
     """
     def __init__(self, order=10, size=8192):
+        pyoArgsAssert(self, "II", order, size)
         PyoTableObject.__init__(self, size)
         self._order = order
         list = [1./i for i in range(1,(order+1))]
@@ -117,6 +120,7 @@ class SawTable(PyoTableObject):
                 New number of harmonics
 
         """
+        pyoArgsAssert(self, "I", x)
         self._order = x
         list = [1./i for i in range(1,(self._order+1))]
         [obj.replace(list) for obj in self._base_objs]
@@ -152,6 +156,7 @@ class SquareTable(PyoTableObject):
 
     """
     def __init__(self, order=10, size=8192):
+        pyoArgsAssert(self, "II", order, size)
         PyoTableObject.__init__(self, size)
         self._order = order
         list = []
@@ -172,6 +177,7 @@ class SquareTable(PyoTableObject):
                 New number of harmonics
 
         """
+        pyoArgsAssert(self, "I", x)
         self._order = x
         list = []
         for i in range(1,(self._order*2)):
@@ -217,6 +223,7 @@ class ChebyTable(PyoTableObject):
 
     """
     def __init__(self, list=[1., 0.], size=8192):
+        pyoArgsAssert(self, "lI", list, size)
         PyoTableObject.__init__(self, size)
         self._list = copy.deepcopy(list)
         self._base_objs = [ChebyTable_base(self._list, size)]
@@ -234,6 +241,7 @@ class ChebyTable(PyoTableObject):
                 numbers 1,2,3, ..., 12. Up to 12 partials can be specified.
 
         """
+        pyoArgsAssert(self, "l", list)
         self._list = list
         [obj.replace(list) for obj in self._base_objs]
         self.refreshView()
@@ -277,6 +285,7 @@ class HannTable(PyoTableObject):
 
     """
     def __init__(self, size=8192):
+        pyoArgsAssert(self, "I", size)
         PyoTableObject.__init__(self, size)
         self._base_objs = [HannTable_base(size)]
 
@@ -303,6 +312,7 @@ class SincTable(PyoTableObject):
 
     """
     def __init__(self, freq=pi*2, windowed=False, size=8192):
+        pyoArgsAssert(self, "NBI", freq, windowed, size)
         PyoTableObject.__init__(self, size)
         self._freq = freq
         self._windowed = windowed
@@ -318,6 +328,7 @@ class SincTable(PyoTableObject):
                 New frequency in radians.
 
         """
+        pyoArgsAssert(self, "N", x)
         self._freq = x
         [obj.setFreq(x) for obj in self._base_objs]
         self.refreshView()
@@ -332,6 +343,7 @@ class SincTable(PyoTableObject):
                 New windowed flag.
 
         """
+        pyoArgsAssert(self, "B", x)
         self._windowed = x
         [obj.setWindowed(x) for obj in self._base_objs]
         self.refreshView()
@@ -380,6 +392,7 @@ class WinTable(PyoTableObject):
 
     """
     def __init__(self, type=2, size=8192):
+        pyoArgsAssert(self, "II", type, size)
         PyoTableObject.__init__(self, size)
         self._type = type
         self._base_objs = [WinTable_base(type, size)]
@@ -394,6 +407,7 @@ class WinTable(PyoTableObject):
                 Windowing function.
 
         """
+        pyoArgsAssert(self, "I", type)
         self._type = type
         [obj.setType(type) for obj in self._base_objs]
         self.refreshView()
@@ -428,6 +442,7 @@ class ParaTable(PyoTableObject):
 
     """
     def __init__(self, size=8192):
+        pyoArgsAssert(self, "I", size)
         PyoTableObject.__init__(self, size)
         self._base_objs = [ParaTable_base(size)]
 
@@ -461,6 +476,7 @@ class LinTable(PyoTableObject):
 
     """
     def __init__(self, list=[(0, 0.), (8191, 1.)], size=8192):
+        pyoArgsAssert(self, "lI", list, size)
         PyoTableObject.__init__(self, size)
         if size < list[-1][0]:
             print "LinTable warning : size smaller than last point position."
@@ -480,6 +496,7 @@ class LinTable(PyoTableObject):
                 in the table. Location must be integer.
 
         """
+        pyoArgsAssert(self, "l", list)
         self._list = list
         [obj.replace(list) for obj in self._base_objs]
         self.refreshView()
@@ -502,6 +519,7 @@ class LinTable(PyoTableObject):
                 Defaults to 0.02.
 
         """
+        pyoArgsAssert(self, "SN", filename, tolerance)
         _path, _name = os.path.split(filename)
         # files = sorted([f for f in os.listdir(_path) if _name+"_" in f])
         # if _name not in files: files.append(_name)
@@ -591,6 +609,7 @@ class LogTable(PyoTableObject):
 
     """
     def __init__(self, list=[(0, 0.), (8191, 1.)], size=8192):
+        pyoArgsAssert(self, "lI", list, size)
         PyoTableObject.__init__(self, size)
         if size < list[-1][0]:
             print "LogTable warning : size smaller than last point position."
@@ -610,6 +629,7 @@ class LogTable(PyoTableObject):
                 in the table. Location must be integer.
 
         """
+        pyoArgsAssert(self, "l", list)
         self._list = list
         [obj.replace(list) for obj in self._base_objs]
         self.refreshView()
@@ -632,6 +652,7 @@ class LogTable(PyoTableObject):
                 Defaults to 0.02.
 
         """
+        pyoArgsAssert(self, "SN", filename, tolerance)
         _path, _name = os.path.split(filename)
         # files = sorted([f for f in os.listdir(_path) if _name+"_" in f])
         # if _name not in files: files.append(_name)
@@ -721,6 +742,7 @@ class CosLogTable(PyoTableObject):
 
     """
     def __init__(self, list=[(0, 0.), (8191, 1.)], size=8192):
+        pyoArgsAssert(self, "lI", list, size)
         PyoTableObject.__init__(self, size)
         if size < list[-1][0]:
             print "CosLogTable warning : size smaller than last point position."
@@ -740,6 +762,7 @@ class CosLogTable(PyoTableObject):
                 in the table. Location must be integer.
 
         """
+        pyoArgsAssert(self, "l", list)
         self._list = list
         [obj.replace(list) for obj in self._base_objs]
         self.refreshView()
@@ -762,6 +785,7 @@ class CosLogTable(PyoTableObject):
                 Defaults to 0.02.
 
         """
+        pyoArgsAssert(self, "SN", filename, tolerance)
         _path, _name = os.path.split(filename)
         # files = sorted([f for f in os.listdir(_path) if _name+"_" in f])
         # if _name not in files: files.append(_name)
@@ -850,6 +874,7 @@ class CosTable(PyoTableObject):
 
     """
     def __init__(self, list=[(0, 0.), (8191, 1.)], size=8192):
+        pyoArgsAssert(self, "lI", list, size)
         PyoTableObject.__init__(self, size)
         if size < list[-1][0]:
             print "CosTable warning : size smaller than last point position."
@@ -869,6 +894,7 @@ class CosTable(PyoTableObject):
                 in the table. Location must be integer.
 
         """
+        pyoArgsAssert(self, "l", list)
         self._list = list
         [obj.replace(list) for obj in self._base_objs]
         self.refreshView()
@@ -891,6 +917,7 @@ class CosTable(PyoTableObject):
                 Defaults to 0.02.
 
         """
+        pyoArgsAssert(self, "SN", filename, tolerance)
         _path, _name = os.path.split(filename)
         # files = sorted([f for f in os.listdir(_path) if _name+"_" in f])
         # if _name not in files: files.append(_name)
@@ -995,6 +1022,7 @@ class CurveTable(PyoTableObject):
 
     """
     def __init__(self, list=[(0, 0.), (8191, 1.)], tension=0, bias=0, size=8192):
+        pyoArgsAssert(self, "lNNI", list, tension, bias, size)
         PyoTableObject.__init__(self, size)
         if size < list[-1][0]:
             print "CurveTable warning : size smaller than last point position."
@@ -1017,6 +1045,7 @@ class CurveTable(PyoTableObject):
                 New `tension` attribute.
 
         """
+        pyoArgsAssert(self, "N", x)
         self._tension = x
         [obj.setTension(x) for obj in self._base_objs]
         self.refreshView()
@@ -1034,6 +1063,7 @@ class CurveTable(PyoTableObject):
                 New `bias` attribute.
 
         """
+        pyoArgsAssert(self, "N", x)
         self._bias = x
         [obj.setBias(x) for obj in self._base_objs]
         self.refreshView()
@@ -1049,6 +1079,7 @@ class CurveTable(PyoTableObject):
                 in the table. Location must be integer.
 
         """
+        pyoArgsAssert(self, "l", list)
         self._list = list
         [obj.replace(list) for obj in self._base_objs]
         self.refreshView()
@@ -1071,6 +1102,7 @@ class CurveTable(PyoTableObject):
                 Defaults to 0.02.
 
         """
+        pyoArgsAssert(self, "SN", filename, tolerance)
         _path, _name = os.path.split(filename)
         # files = sorted([f for f in os.listdir(_path) if _name+"_" in f])
         # if _name not in files: files.append(_name)
@@ -1178,6 +1210,7 @@ class ExpTable(PyoTableObject):
 
     """
     def __init__(self, list=[(0, 0.), (8192, 1.)], exp=10, inverse=True, size=8192):
+        pyoArgsAssert(self, "lNBI", list, exp, inverse, size)
         PyoTableObject.__init__(self, size)
         if size < list[-1][0]:
             print "ExpTable warning : size smaller than last point position."
@@ -1198,6 +1231,7 @@ class ExpTable(PyoTableObject):
                 New `exp` attribute.
 
         """
+        pyoArgsAssert(self, "N", x)
         self._exp = x
         [obj.setExp(x) for obj in self._base_objs]
         self.refreshView()
@@ -1212,6 +1246,7 @@ class ExpTable(PyoTableObject):
                 New `inverse` attribute.
 
         """
+        pyoArgsAssert(self, "B", x)
         self._inverse = x
         [obj.setInverse(x) for obj in self._base_objs]
         self.refreshView()
@@ -1227,6 +1262,7 @@ class ExpTable(PyoTableObject):
                 in the table. Location must be integer.
 
         """
+        pyoArgsAssert(self, "l", list)
         self._list = list
         [obj.replace(list) for obj in self._base_objs]
         self.refreshView()
@@ -1249,6 +1285,7 @@ class ExpTable(PyoTableObject):
                 Defaults to 0.02.
 
         """
+        pyoArgsAssert(self, "SN", filename, tolerance)
         _path, _name = os.path.split(filename)
         # files = sorted([f for f in os.listdir(_path) if _name+"_" in f])
         # if _name not in files: files.append(_name)
@@ -1736,6 +1773,7 @@ class NewTable(PyoTableObject):
 
     """
     def __init__(self, length, chnls=1, init=None, feedback=0.0):
+        pyoArgsAssert(self, "NILN", length, chnls, init, feedback)
         PyoTableObject.__init__(self)
         self._length = length
         self._chnls = chnls
@@ -1762,6 +1800,7 @@ class NewTable(PyoTableObject):
                 the list will be loaded in all tablestreams.
 
         """
+        pyoArgsAssert(self, "l", x)
         if type(x[0]) != ListType:
             x = [x]
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1777,6 +1816,7 @@ class NewTable(PyoTableObject):
                 New `feedback` value.
 
         """
+        pyoArgsAssert(self, "N", x)
         self._feedback = x
         [obj.setFeedback(x) for i, obj in enumerate(self._base_objs)]
 
@@ -1925,6 +1965,7 @@ class DataTable(PyoTableObject):
 
     """
     def __init__(self, size, chnls=1, init=None):
+        pyoArgsAssert(self, "IIL", size, chnls, init)
         PyoTableObject.__init__(self, size)
         self._chnls = chnls
         self._init = init
@@ -1948,6 +1989,7 @@ class DataTable(PyoTableObject):
                 the list will be loaded in all tablestreams.
 
         """
+        pyoArgsAssert(self, "l", x)
         if type(x[0]) != ListType:
             x = [x]
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2033,6 +2075,7 @@ class AtanTable(PyoTableObject):
 
     """
     def __init__(self, slope=0.5, size=8192):
+        pyoArgsAssert(self, "NI", slope, size)
         PyoTableObject.__init__(self, size)
         self._slope = slope
         self._base_objs = [AtanTable_base(slope, size)]
@@ -2047,6 +2090,7 @@ class AtanTable(PyoTableObject):
                 New slope between 0 and 1.
 
         """
+        pyoArgsAssert(self, "N", x)
         self._slope = x
         [obj.setSlope(x) for obj in self._base_objs]
         self.refreshView()
@@ -2106,6 +2150,7 @@ class PartialTable(PyoTableObject):
 
     """
     def __init__(self, list=[(1,1), (1.33,0.5),(1.67,0.3)], size=65536):
+        pyoArgsAssert(self, "lI", list, size)
         PyoTableObject.__init__(self, size)
         self._list = list
         self._par_table = HarmTable(self._create_list(), size)
@@ -2139,6 +2184,7 @@ class PartialTable(PyoTableObject):
                 and its strength.
 
         """
+        pyoArgsAssert(self, "l", list)
         self._list = list
         [obj.replace(self._create_list()) for obj in self._base_objs]
         self.normalize()
diff --git a/pyolib/triggers.py b/pyolib/triggers.py
index 0125b62..2e74fa9 100644
--- a/pyolib/triggers.py
+++ b/pyolib/triggers.py
@@ -27,7 +27,6 @@ GNU Lesser General Public License for more details.
 You should have received a copy of the GNU Lesser General Public
 License along with pyo.  If not, see <http://www.gnu.org/licenses/>.
 """
-import sys
 from _core import *
 from _maps import *
 from _widgets import createGraphWindow
@@ -114,6 +113,7 @@ class Metro(PyoObject):
 
     """
     def __init__(self, time=1, poly=1):
+        pyoArgsAssert(self, "OI", time, poly)
         PyoObject.__init__(self)
         self._time = time
         self._poly = poly
@@ -130,6 +130,7 @@ class Metro(PyoObject):
                 New `time` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._time = x
         x, lmax = convertArgsToLists(x)
         [obj.setTime(wrap(x,i)*self._poly) for i, obj in enumerate(self._base_objs)]
@@ -199,10 +200,8 @@ class Seq(PyoObject):
 
     """
     def __init__(self, time=1, seq=[1], poly=1):
+        pyoArgsAssert(self, "OlI", time, seq, poly)
         PyoObject.__init__(self)
-        if type(seq) != ListType:
-            print >> sys.stderr, 'TypeError: "seq" argument of %s must be a list.\n' % self.__class__.__name__
-            exit()
         self._time = time
         self._seq = seq
         self._poly = poly
@@ -225,6 +224,7 @@ class Seq(PyoObject):
                 New `time` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._time = x
         x, lmax = convertArgsToLists(x)
         [obj.setTime(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -239,6 +239,7 @@ class Seq(PyoObject):
                 New `seq` attribute.
 
         """
+        pyoArgsAssert(self, "l", x)
         self._seq = x
         if type(x[0]) != ListType:
             [obj.setSeq(x) for i, obj in enumerate(self._base_players)]
@@ -317,6 +318,7 @@ class Cloud(PyoObject):
 
     """
     def __init__(self, density=10, poly=1):
+        pyoArgsAssert(self, "OI", density, poly)
         PyoObject.__init__(self)
         self._density = density
         self._poly = poly
@@ -334,6 +336,7 @@ class Cloud(PyoObject):
                 New `density` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._density = x
         x, lmax = convertArgsToLists(x)
         [obj.setDensity(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -431,6 +434,7 @@ class Beat(PyoObject):
 
     """
     def __init__(self, time=.125, taps=16, w1=80, w2=50, w3=30, poly=1):
+        pyoArgsAssert(self, "OinnnI", time, taps, w1, w2, w3, poly)
         PyoObject.__init__(self)
         self._tap_dummy = []
         self._amp_dummy = []
@@ -528,6 +532,7 @@ class Beat(PyoObject):
                 Memory number. 0 <= x < 32.
 
         """
+        pyoArgsAssert(self, "I", x)
         [obj.store(x) for i, obj in enumerate(self._base_players)]
 
     def recall(self, x):
@@ -540,6 +545,7 @@ class Beat(PyoObject):
                 Memory number. 0 <= x < 32.
 
         """
+        pyoArgsAssert(self, "I", x)
         [obj.recall(x) for i, obj in enumerate(self._base_players)]
 
     def getPresets(self):
@@ -562,6 +568,7 @@ class Beat(PyoObject):
                 List of presets.
 
         """
+        pyoArgsAssert(self, "l", x)
         if len(self._base_players) == 1:
             return self._base_players[0].setPresets(x)
         else:
@@ -577,6 +584,7 @@ class Beat(PyoObject):
                 New `time` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._time = x
         x, lmax = convertArgsToLists(x)
         [obj.setTime(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -591,6 +599,7 @@ class Beat(PyoObject):
                 New `taps` attribute.
 
         """
+        pyoArgsAssert(self, "I", x)
         self._taps = x
         x, lmax = convertArgsToLists(x)
         [obj.setTaps(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -605,6 +614,7 @@ class Beat(PyoObject):
                 New `w1` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self.setWeights(w1=x)
 
     def setW2(self, x):
@@ -617,6 +627,7 @@ class Beat(PyoObject):
                 New `w2` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self.setWeights(w2=x)
 
     def setW3(self, x):
@@ -629,6 +640,7 @@ class Beat(PyoObject):
                 New `w3` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self.setWeights(w3=x)
 
     def setWeights(self, w1=None, w2=None, w3=None):
@@ -758,6 +770,7 @@ class TrigRandInt(PyoObject):
 
     """
     def __init__(self, input, max=100., mul=1, add=0):
+        pyoArgsAssert(self, "oOOO", input, max, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._max = max
@@ -777,6 +790,7 @@ class TrigRandInt(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -790,6 +804,7 @@ class TrigRandInt(PyoObject):
                 new `max` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._max = x
         x, lmax = convertArgsToLists(x)
         [obj.setMax(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -851,6 +866,7 @@ class TrigRand(PyoObject):
 
     """
     def __init__(self, input, min=0., max=1., port=0., init=0., mul=1, add=0):
+        pyoArgsAssert(self, "oOOnnOO", input, min, max, port, init, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._min = min
@@ -872,6 +888,7 @@ class TrigRand(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -885,6 +902,7 @@ class TrigRand(PyoObject):
                 new `min` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._min = x
         x, lmax = convertArgsToLists(x)
         [obj.setMin(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -899,6 +917,7 @@ class TrigRand(PyoObject):
                 new `max` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._max = x
         x, lmax = convertArgsToLists(x)
         [obj.setMax(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -913,6 +932,7 @@ class TrigRand(PyoObject):
                 new `port` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._port = x
         x, lmax = convertArgsToLists(x)
         [obj.setPort(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -984,10 +1004,8 @@ class TrigChoice(PyoObject):
 
     """
     def __init__(self, input, choice, port=0., init=0., mul=1, add=0):
+        pyoArgsAssert(self, "olnnOO", input, choice, port, init, mul, add)
         PyoObject.__init__(self, mul, add)
-        if type(choice) != ListType:
-            print >> sys.stderr, 'TypeError: "choice" argument of %s must be a list.\n' % self.__class__.__name__
-            exit()
         self._input = input
         self._choice = choice
         self._port = port
@@ -1012,6 +1030,7 @@ class TrigChoice(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1025,6 +1044,7 @@ class TrigChoice(PyoObject):
                 new `choice` attribute.
 
         """
+        pyoArgsAssert(self, "l", x)
         self._choice = x
         if type(x[0]) != ListType:
             [obj.setChoice(self._choice) for i, obj in enumerate(self._base_objs)]
@@ -1041,6 +1061,7 @@ class TrigChoice(PyoObject):
                 new `port` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._port = x
         x, lmax = convertArgsToLists(x)
         [obj.setPort(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1110,15 +1131,8 @@ class TrigFunc(PyoObject):
 
     """
     def __init__(self, input, function, arg=None):
+        pyoArgsAssert(self, "oc", input, function)
         PyoObject.__init__(self)
-        if type(function) == ListType or type(function) == TupleType:
-            if not callable(function[0]):
-                print >> sys.stderr, 'TypeError: "function" argument of %s must be callable.\n' % self.__class__.__name__
-                exit()
-        else:
-            if not callable(function):
-                print >> sys.stderr, 'TypeError: "function" argument of %s must be callable.\n' % self.__class__.__name__
-                exit()
         self._input = input
         self._function = getWeakMethodRef(function)
         self._arg = arg
@@ -1147,6 +1161,7 @@ class TrigFunc(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1160,6 +1175,7 @@ class TrigFunc(PyoObject):
                 new `function` attribute.
 
         """
+        pyoArgsAssert(self, "c", x)
         self._function = getWeakMethodRef(x)
         x, lmax = convertArgsToLists(x)
         [obj.setFunction(WeakMethod(wrap(x,i))) for i, obj in enumerate(self._base_objs)]
@@ -1240,6 +1256,7 @@ class TrigEnv(PyoObject):
 
     """
     def __init__(self, input, table, dur=1, interp=2, mul=1, add=0):
+        pyoArgsAssert(self, "otOiOO", input, table, dur, interp, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._table = table
@@ -1262,6 +1279,7 @@ class TrigEnv(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1275,6 +1293,7 @@ class TrigEnv(PyoObject):
                 new `table` attribute.
 
         """
+        pyoArgsAssert(self, "t", x)
         self._table = x
         x, lmax = convertArgsToLists(x)
         [obj.setTable(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1289,6 +1308,7 @@ class TrigEnv(PyoObject):
                 new `dur` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._dur = x
         x, lmax = convertArgsToLists(x)
         [obj.setDur(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1303,6 +1323,7 @@ class TrigEnv(PyoObject):
                 new `interp` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._interp = x
         x, lmax = convertArgsToLists(x)
         [obj.setInterp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1376,13 +1397,8 @@ class TrigLinseg(PyoObject):
 
     """
     def __init__(self, input, list, mul=1, add=0):
+        pyoArgsAssert(self, "olOO", input, list, mul, add)
         PyoObject.__init__(self, mul, add)
-        if type(list) != ListType:
-            print >> sys.stderr, 'TypeError: "list" argument of %s must be a list of tuples.\n' % self.__class__.__name__
-            exit()
-        if type(list[0]) != TupleType:
-            print >> sys.stderr, 'TypeError: "list" argument of %s must be a list of tuples.\n' % self.__class__.__name__
-            exit()
         self._input = input
         self._list = list
         self._in_fader = InputFader(input)
@@ -1405,6 +1421,7 @@ class TrigLinseg(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1418,6 +1435,7 @@ class TrigLinseg(PyoObject):
                 new `list` attribute.
 
         """
+        pyoArgsAssert(self, "l", x)
         self._list = x
         [obj.setList(x) for i, obj in enumerate(self._base_objs)]
 
@@ -1541,13 +1559,8 @@ class TrigExpseg(PyoObject):
 
     """
     def __init__(self, input, list, exp=10, inverse=True, mul=1, add=0):
+        pyoArgsAssert(self, "olnbOO", input, list, exp, inverse, mul, add)
         PyoObject.__init__(self, mul, add)
-        if type(list) != ListType:
-            print >> sys.stderr, 'TypeError: "list" argument of %s must be a list of tuples.\n' % self.__class__.__name__
-            exit()
-        if type(list[0]) != TupleType:
-            print >> sys.stderr, 'TypeError: "list" argument of %s must be a list of tuples.\n' % self.__class__.__name__
-            exit()
         self._input = input
         self._list = list
         self._exp = exp
@@ -1572,6 +1585,7 @@ class TrigExpseg(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1585,6 +1599,7 @@ class TrigExpseg(PyoObject):
                 new `list` attribute.
 
         """
+        pyoArgsAssert(self, "l", x)
         self._list = x
         [obj.setList(x) for i, obj in enumerate(self._base_objs)]
 
@@ -1598,6 +1613,7 @@ class TrigExpseg(PyoObject):
                 new `exp` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._exp = x
         x, lmax = convertArgsToLists(x)
         [obj.setExp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1612,6 +1628,7 @@ class TrigExpseg(PyoObject):
                 new `inverse` attribute.
 
         """
+        pyoArgsAssert(self, "b", x)
         self._inverse = x
         x, lmax = convertArgsToLists(x)
         [obj.setInverse(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1801,6 +1818,7 @@ class TrigXnoise(PyoObject):
 
     """
     def __init__(self, input, dist=0, x1=0.5, x2=0.5, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOO", input, x1, x2, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._dist = dist
@@ -1824,6 +1842,7 @@ class TrigXnoise(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1853,6 +1872,7 @@ class TrigXnoise(PyoObject):
                 new `x1` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._x1 = x
         x, lmax = convertArgsToLists(x)
         [obj.setX1(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1867,7 +1887,8 @@ class TrigXnoise(PyoObject):
                 new `x2` attribute.
 
         """
-        self._x2= x
+        pyoArgsAssert(self, "O", x)
+        self._x2 = x
         x, lmax = convertArgsToLists(x)
         [obj.setX2(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
@@ -2004,6 +2025,7 @@ class TrigXnoiseMidi(PyoObject):
 
     """
     def __init__(self, input, dist=0, x1=0.5, x2=0.5, scale=0, mrange=(0,127), mul=1, add=0):
+        pyoArgsAssert(self, "oOOixOO", input, x1, x2, scale, mrange, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._dist = dist
@@ -2029,6 +2051,7 @@ class TrigXnoiseMidi(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2063,6 +2086,7 @@ class TrigXnoiseMidi(PyoObject):
                 new `scale` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._scale = x
         x, lmax = convertArgsToLists(x)
         [obj.setScale(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2079,6 +2103,7 @@ class TrigXnoiseMidi(PyoObject):
                 maximum output midi range.
 
         """
+        pyoArgsAssert(self, "ii", mini, maxi)
         self._mrange = (mini, maxi)
         mini, maxi, lmax = convertArgsToLists(mini, maxi)
         [obj.setRange(wrap(mini,i), wrap(maxi,i)) for i, obj in enumerate(self._base_objs)]
@@ -2093,6 +2118,7 @@ class TrigXnoiseMidi(PyoObject):
                 new `x1` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._x1 = x
         x, lmax = convertArgsToLists(x)
         [obj.setX1(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2107,7 +2133,8 @@ class TrigXnoiseMidi(PyoObject):
                 new `x2` attribute.
 
         """
-        self._x2= x
+        pyoArgsAssert(self, "O", x)
+        self._x2 = x
         x, lmax = convertArgsToLists(x)
         [obj.setX2(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
 
@@ -2190,6 +2217,7 @@ class Counter(PyoObject):
 
     """
     def __init__(self, input, min=0, max=100, dir=0, mul=1, add=0):
+        pyoArgsAssert(self, "oiiiOO", input, min, max, dir, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._min = min
@@ -2214,6 +2242,7 @@ class Counter(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2227,6 +2256,7 @@ class Counter(PyoObject):
                 new `min` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._min = x
         x, lmax = convertArgsToLists(x)
         [obj.setMin(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2241,6 +2271,7 @@ class Counter(PyoObject):
                 new `max` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._max = x
         x, lmax = convertArgsToLists(x)
         [obj.setMax(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2255,6 +2286,7 @@ class Counter(PyoObject):
                 new `dir` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._dir = x
         x, lmax = convertArgsToLists(x)
         [obj.setDir(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2270,6 +2302,7 @@ class Counter(PyoObject):
                 Value where to reset the count. Defaults to None.
 
         """
+        pyoArgsAssert(self, "i", x)
         value, lmax = convertArgsToLists(value)
         [obj.reset(wrap(value,i)) for i, obj in enumerate(self._base_objs)]
 
@@ -2348,6 +2381,7 @@ class Select(PyoObject):
 
     """
     def __init__(self, input, value=0, mul=1, add=0):
+        pyoArgsAssert(self, "oiOO", input, value, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._value = value
@@ -2370,6 +2404,7 @@ class Select(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2383,6 +2418,7 @@ class Select(PyoObject):
                 new `value` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._value = x
         x, lmax = convertArgsToLists(x)
         [obj.setValue(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2432,6 +2468,7 @@ class Change(PyoObject):
 
     """
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -2453,6 +2490,7 @@ class Change(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2508,6 +2546,7 @@ class Thresh(PyoObject):
 
     """
     def __init__(self, input, threshold=0., dir=0, mul=1, add=0):
+        pyoArgsAssert(self, "oOiOO", input, threshold, dir, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._threshold = threshold
@@ -2531,6 +2570,7 @@ class Thresh(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2544,6 +2584,7 @@ class Thresh(PyoObject):
                 new `threshold` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._threshold = x
         x, lmax = convertArgsToLists(x)
         [obj.setThreshold(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2558,6 +2599,7 @@ class Thresh(PyoObject):
                 new `dir` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._dir = x
         x, lmax = convertArgsToLists(x)
         [obj.setDir(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2618,6 +2660,7 @@ class Percent(PyoObject):
 
     """
     def __init__(self, input, percent=50., mul=1, add=0):
+        pyoArgsAssert(self, "oOOO", input, percent, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._percent = percent
@@ -2640,6 +2683,7 @@ class Percent(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2653,6 +2697,7 @@ class Percent(PyoObject):
                 new `percent` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._percent = x
         x, lmax = convertArgsToLists(x)
         [obj.setPercent(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2711,6 +2756,7 @@ class Timer(PyoObject):
 
     """
     def __init__(self, input, input2, mul=1, add=0):
+        pyoArgsAssert(self, "ooOO", input, input2, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._input2 = input2
@@ -2731,6 +2777,7 @@ class Timer(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2746,6 +2793,7 @@ class Timer(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input2 = x
         self._in_fader2.setInput(x, fadetime)
 
@@ -2794,10 +2842,8 @@ class Iter(PyoObject):
 
     """
     def __init__(self, input, choice, init=0., mul=1, add=0):
+        pyoArgsAssert(self, "olnOO", input, choice, init, mul, add)
         PyoObject.__init__(self, mul, add)
-        if type(choice) != ListType:
-            print >> sys.stderr, 'TypeError: "choice" argument of %s must be a list.\n' % self.__class__.__name__
-            exit()
         self._input = input
         self._choice = choice
         self._in_fader = InputFader(input)
@@ -2821,6 +2867,7 @@ class Iter(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2834,6 +2881,7 @@ class Iter(PyoObject):
                 new `choice` attribute.
 
         """
+        pyoArgsAssert(self, "l", x)
         self._choice = x
         if type(x[0]) != ListType:
             [obj.setChoice(self._choice) for i, obj in enumerate(self._base_objs)]
@@ -2850,6 +2898,7 @@ class Iter(PyoObject):
                 Value where to reset the count. Defaults to 0.
 
         """
+        pyoArgsAssert(self, "I", x)
         [obj.reset(x) for obj in self._base_objs]
 
     @property
@@ -2896,6 +2945,7 @@ class Count(PyoObject):
 
     """
     def __init__(self, input, min=0, max=0, mul=1, add=0):
+        pyoArgsAssert(self, "oiiOO", input, min, max, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._min = min
@@ -2916,6 +2966,7 @@ class Count(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -2929,6 +2980,7 @@ class Count(PyoObject):
                 new `min` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._min = x
         x, lmax = convertArgsToLists(x)
         [obj.setMin(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -2943,6 +2995,7 @@ class Count(PyoObject):
                 new `max` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._max = x
         x, lmax = convertArgsToLists(x)
         [obj.setMax(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -3007,6 +3060,7 @@ class NextTrig(PyoObject):
 
     """
     def __init__(self, input, input2, mul=1, add=0):
+        pyoArgsAssert(self, "ooOO", input, input2, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._input2 = input2
@@ -3027,6 +3081,7 @@ class NextTrig(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -3042,6 +3097,7 @@ class NextTrig(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input2 = x
         self._in_fader2.setInput(x, fadetime)
 
@@ -3094,6 +3150,7 @@ class TrigVal(PyoObject):
 
     """
     def __init__(self, input, value=0., init=0., mul=1, add=0):
+        pyoArgsAssert(self, "oOnOO", input, value, init, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._value = value
@@ -3113,6 +3170,7 @@ class TrigVal(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -3126,6 +3184,7 @@ class TrigVal(PyoObject):
                 new `value` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._value = x
         x, lmax = convertArgsToLists(x)
         [obj.setValue(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -3209,6 +3268,7 @@ class Euclide(PyoObject):
 
     """
     def __init__(self, time=.125, taps=16, onsets=10, poly=1):
+        pyoArgsAssert(self, "OiiI", time, taps, onsets, poly)
         PyoObject.__init__(self)
         self._tap_dummy = []
         self._amp_dummy = []
@@ -3305,6 +3365,7 @@ class Euclide(PyoObject):
                 New `time` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._time = x
         x, lmax = convertArgsToLists(x)
         [obj.setTime(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -3319,6 +3380,7 @@ class Euclide(PyoObject):
                 New `taps` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._taps = x
         x, onsets, lmax = convertArgsToLists(x, self._onsets)
         for i in range(len(self._base_players)):
@@ -3336,6 +3398,7 @@ class Euclide(PyoObject):
                 New `onsets` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._onsets = x
         x, taps, lmax = convertArgsToLists(x, self._taps)
         for i in range(len(self._base_players)):
@@ -3466,6 +3529,7 @@ class TrigBurst(PyoObject):
 
     """
     def __init__(self, input, time=.25, count=10, expand=1.0, ampfade=1.0, poly=1):
+        pyoArgsAssert(self, "oOinnI", input, time, count, expand, ampfade, poly)
         PyoObject.__init__(self)
         self._tap_dummy = []
         self._amp_dummy = []
@@ -3545,6 +3609,7 @@ class TrigBurst(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -3558,6 +3623,7 @@ class TrigBurst(PyoObject):
                 New `time` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._time = x
         x, lmax = convertArgsToLists(x)
         [obj.setTime(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -3572,6 +3638,7 @@ class TrigBurst(PyoObject):
                 New `count` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._count = x
         x, lmax = convertArgsToLists(x)
         [obj.setCount(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -3582,10 +3649,11 @@ class TrigBurst(PyoObject):
 
         :Args:
 
-            x : int
+            x : float
                 New `expand` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._expand = x
         x, lmax = convertArgsToLists(x)
         [obj.setExpand(wrap(x,i)) for i, obj in enumerate(self._base_players)]
@@ -3596,10 +3664,11 @@ class TrigBurst(PyoObject):
 
         :Args:
 
-            x : int
+            x : float
                 New `ampfade` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._ampfade = x
         x, lmax = convertArgsToLists(x)
         [obj.setAmpfade(wrap(x,i)) for i, obj in enumerate(self._base_players)]
diff --git a/pyolib/utils.py b/pyolib/utils.py
index 6683ce7..9cfc841 100644
--- a/pyolib/utils.py
+++ b/pyolib/utils.py
@@ -98,6 +98,7 @@ class Print(PyoObject):
 
     """
     def __init__(self, input, method=0, interval=0.25, message=""):
+        pyoArgsAssert(self, "oins", input, method, interval, message)
         PyoObject.__init__(self)
         self._input = input
         self._method = method
@@ -119,6 +120,7 @@ class Print(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -132,6 +134,7 @@ class Print(PyoObject):
                 New `method` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._method = x
         x, lmax = convertArgsToLists(x)
         [obj.setMethod(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -146,6 +149,7 @@ class Print(PyoObject):
                 New `interval` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._interval = x
         x, lmax = convertArgsToLists(x)
         [obj.setInterval(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -160,6 +164,7 @@ class Print(PyoObject):
                 New `message` attribute.
 
         """
+        pyoArgsAssert(self, "s", x)
         self._message = x
         x, lmax = convertArgsToLists(x)
         [obj.setMessage(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -236,10 +241,8 @@ class Snap(PyoObject):
 
     """
     def __init__(self, input, choice, scale=0, mul=1, add=0):
+        pyoArgsAssert(self, "oliOO", input, choice, scale, mul, add)
         PyoObject.__init__(self, mul, add)
-        if type(choice) != ListType:
-            print >> sys.stderr, 'TypeError: "choice" argument of %s must be a list.\n' % self.__class__.__name__
-            exit()
         self._input = input
         self._choice = choice
         self._scale = scale
@@ -264,6 +267,7 @@ class Snap(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -277,6 +281,7 @@ class Snap(PyoObject):
                 new `choice` attribute.
 
         """
+        pyoArgsAssert(self, "l", x)
         self._choice = x
         [obj.setChoice(x) for i, obj in enumerate(self._base_objs)]
 
@@ -295,6 +300,7 @@ class Snap(PyoObject):
                 new `scale` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._scale = x
         x, lmax = convertArgsToLists(x)
         [obj.setScale(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -346,6 +352,7 @@ class Interp(PyoObject):
 
     """
     def __init__(self, input, input2, interp=0.5, mul=1, add=0):
+        pyoArgsAssert(self, "ooOOO", input, input2, interp, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._input2 = input2
@@ -367,6 +374,7 @@ class Interp(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -382,6 +390,7 @@ class Interp(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input2 = x
         self._in_fader2.setInput(x, fadetime)
 
@@ -395,6 +404,7 @@ class Interp(PyoObject):
                 New `interp` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._interp = x
         x, lmax = convertArgsToLists(x)
         [obj.setInterp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -452,6 +462,7 @@ class SampHold(PyoObject):
 
     """
     def __init__(self, input, controlsig, value=0.0, mul=1, add=0):
+        pyoArgsAssert(self, "ooOOO", input, controlsig, value, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._controlsig = controlsig
@@ -473,6 +484,7 @@ class SampHold(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -488,6 +500,7 @@ class SampHold(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._controlsig = x
         self._in_fader2.setInput(x, fadetime)
 
@@ -501,6 +514,7 @@ class SampHold(PyoObject):
                 New `value` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._value = x
         x, lmax = convertArgsToLists(x)
         [obj.setValue(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -601,6 +615,7 @@ class Record(PyoObject):
 
     """
     def __init__(self, input, filename, chnls=2, fileformat=0, sampletype=0, buffering=4):
+        pyoArgsAssert(self, "oSIIII", input, filename, chnls, fileformat, sampletype, buffering)
         PyoObject.__init__(self)
         self._input = input
         self._in_fader = InputFader(input)
@@ -630,6 +645,7 @@ class Record(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -664,6 +680,7 @@ class Denorm(PyoObject):
 
     """
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -682,6 +699,7 @@ class Denorm(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -759,6 +777,7 @@ class ControlRec(PyoObject):
 
     """
     def __init__(self, input, filename, rate=1000, dur=0.0):
+        pyoArgsAssert(self, "oSIN", input, filename, rate, dur)
         PyoObject.__init__(self)
         self._input = input
         self._filename = filename
@@ -839,6 +858,7 @@ class ControlRead(PyoObject):
 
     """
     def __init__(self, filename, rate=1000, loop=False, interp=2, mul=1, add=0):
+        pyoArgsAssert(self, "SIBIOO", filename, rate, loop, interp, mul, add)
         PyoObject.__init__(self, mul, add)
         self._filename = filename
         self._path, self._name = os.path.split(filename)
@@ -869,6 +889,7 @@ class ControlRead(PyoObject):
                 new `rate` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._rate = x
         x, lmax = convertArgsToLists(x)
         [obj.setRate(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -883,6 +904,7 @@ class ControlRead(PyoObject):
                 new `loop` attribute.
 
         """
+        pyoArgsAssert(self, "b", x)
         self._loop = x
         x, lmax = convertArgsToLists(x)
         [obj.setLoop(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -897,6 +919,7 @@ class ControlRead(PyoObject):
                 new `interp` attribute.
 
         """
+        pyoArgsAssert(self, "i", x)
         self._interp = x
         x, lmax = convertArgsToLists(x)
         [obj.setInterp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -976,6 +999,7 @@ class NoteinRec(PyoObject):
 
     """
     def __init__(self, input, filename):
+        pyoArgsAssert(self, "oS", input, filename)
         PyoObject.__init__(self)
         self._input = input
         self._filename = filename
@@ -1045,6 +1069,7 @@ class NoteinRead(PyoObject):
 
     """
     def __init__(self, filename, loop=False, mul=1, add=0):
+        pyoArgsAssert(self, "SBOO", filename, loop, mul, add)
         PyoObject.__init__(self, mul, add)
         self._pitch_dummy = []
         self._velocity_dummy = []
@@ -1119,6 +1144,7 @@ class NoteinRead(PyoObject):
                 new `loop` attribute.
 
         """
+        pyoArgsAssert(self, "b", x)
         self._loop = x
         x, lmax = convertArgsToLists(x)
         [obj.setLoop(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1155,6 +1181,7 @@ class DBToA(PyoObject):
     """
 
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -1173,6 +1200,7 @@ class DBToA(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1209,6 +1237,7 @@ class AToDB(PyoObject):
     """
 
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -1227,6 +1256,7 @@ class AToDB(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1274,6 +1304,7 @@ class Scale(PyoObject):
 
     """
     def __init__(self, input, inmin=0, inmax=1, outmin=0, outmax=1, exp=1, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOOnOO", input, inmin, inmax, outmin, outmax, exp, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._inmin = inmin
@@ -1297,6 +1328,7 @@ class Scale(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1310,6 +1342,7 @@ class Scale(PyoObject):
                 New `inmin` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._inmin = x
         x, lmax = convertArgsToLists(x)
         [obj.setInMin(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1324,6 +1357,7 @@ class Scale(PyoObject):
                 New `inmax` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._inmax = x
         x, lmax = convertArgsToLists(x)
         [obj.setInMax(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1338,6 +1372,7 @@ class Scale(PyoObject):
                 New `outmin` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._outmin = x
         x, lmax = convertArgsToLists(x)
         [obj.setOutMin(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1352,6 +1387,7 @@ class Scale(PyoObject):
                 New `outmax` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._outmax = x
         x, lmax = convertArgsToLists(x)
         [obj.setOutMax(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1366,6 +1402,7 @@ class Scale(PyoObject):
                 New `exp` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._exp = x
         x, lmax = convertArgsToLists(x)
         [obj.setExp(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1444,6 +1481,7 @@ class CentsToTranspo(PyoObject):
     """
 
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -1462,6 +1500,7 @@ class CentsToTranspo(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1496,6 +1535,7 @@ class TranspoToCents(PyoObject):
     """
 
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -1514,6 +1554,7 @@ class TranspoToCents(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1548,6 +1589,7 @@ class MToF(PyoObject):
     """
 
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -1566,6 +1608,7 @@ class MToF(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1603,6 +1646,7 @@ class FToM(PyoObject):
     """
 
     def __init__(self, input, mul=1, add=0):
+        pyoArgsAssert(self, "oOO", input, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._in_fader = InputFader(input)
@@ -1621,6 +1665,7 @@ class FToM(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1661,6 +1706,7 @@ class MToT(PyoObject):
     """
 
     def __init__(self, input, centralkey=60.0, mul=1, add=0):
+        pyoArgsAssert(self, "onOO", input, centralkey, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._centralkey = centralkey
@@ -1680,6 +1726,7 @@ class MToT(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1693,6 +1740,7 @@ class MToT(PyoObject):
                 New `centralkey` attribute.
 
         """
+        pyoArgsAssert(self, "n", x)
         self._centralkey = x
         x, lmax = convertArgsToLists(x)
         [obj.setCentralKey(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1737,6 +1785,7 @@ class Between(PyoObject):
 
     """
     def __init__(self, input, min=-1.0, max=1.0, mul=1, add=0):
+        pyoArgsAssert(self, "oOOOO", input, min, max, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._min = min
@@ -1757,6 +1806,7 @@ class Between(PyoObject):
                 Crossfade time between old and new input. Defaults to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1770,6 +1820,7 @@ class Between(PyoObject):
                 New `min` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._min = x
         x, lmax = convertArgsToLists(x)
         [obj.setMin(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1784,6 +1835,7 @@ class Between(PyoObject):
                 New `max` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._max = x
         x, lmax = convertArgsToLists(x)
         [obj.setMax(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
@@ -1843,6 +1895,7 @@ class TrackHold(PyoObject):
 
     """
     def __init__(self, input, controlsig, value=0.0, mul=1, add=0):
+        pyoArgsAssert(self, "ooOOO", input, controlsig, value, mul, add)
         PyoObject.__init__(self, mul, add)
         self._input = input
         self._controlsig = controlsig
@@ -1864,6 +1917,7 @@ class TrackHold(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._input = x
         self._in_fader.setInput(x, fadetime)
 
@@ -1879,6 +1933,7 @@ class TrackHold(PyoObject):
                 Crossfade time between old and new input. Default to 0.05.
 
         """
+        pyoArgsAssert(self, "oN", x, fadetime)
         self._controlsig = x
         self._in_fader2.setInput(x, fadetime)
 
@@ -1892,6 +1947,7 @@ class TrackHold(PyoObject):
                 New `value` attribute.
 
         """
+        pyoArgsAssert(self, "O", x)
         self._value = x
         x, lmax = convertArgsToLists(x)
         [obj.setValue(wrap(x,i)) for i, obj in enumerate(self._base_objs)]
diff --git a/scripts/release_doc_src.sh b/scripts/release_doc_src.sh
index 128bf69..0c9caa2 100644
--- a/scripts/release_doc_src.sh
+++ b/scripts/release_doc_src.sh
@@ -6,7 +6,7 @@
 # 3. Execute from pyo folder : ./scripts/release_doc_src.sh
 #
 
-version=0.7.5
+version=0.7.6
 replace=XXX
 
 doc_rep=pyo_XXX-doc
diff --git a/scripts/win/windows-7-build-routine.txt b/scripts/win/windows-7-build-routine.txt
index f2b08c2..84e74ec 100644
--- a/scripts/win/windows-7-build-routine.txt
+++ b/scripts/win/windows-7-build-routine.txt
@@ -1,16 +1,17 @@
 === STEP 1 ===
---- Install Python (2.6 and 2.7)
+--- Install Python 2.6 and 2.7.10 and WxPython 3.0.2.0 for each version
 
-=== STEP 2 ===
+=== STEP 2 (should be git soon) ===
 --- Install Slick SVN 1.8.10
 http://www.sliksvn.com
 
 === STEP 3 ===
---- Install scons 2.3.2 in the Python site-packages:
+--- Install scons 2.3.5 in the Python site-packages:
 http://www.scons.org/download.php
 
 === STEP 4 ===
---- Install MinGW (minimalist) from sourceforge
+--- Install MinGW (minimalist GNU for Windows) from sourceforge
+--- Add ";C:\MinGW\bin;C:\MinGW\mingw32\bin" to the PATH variable
 
 === STEP 5 ===
 --- Install pthreads (just copy files from ftp):
@@ -25,6 +26,9 @@ Do not build from sources.
 === STEP 7 ===
 --- Update liblo tag 0.26 from the tarball at http://liblo.sourceforge.net (not SVN!), 
 copy build/config-msvc.h --> src/config.h,
+
+If there is a conflict about struct timespec, remove the definition in pthread.h.
+
 and build with this SConstruct:
 
 # S C O N S T R U C T   F O R   L I B L O . D L L
@@ -81,7 +85,7 @@ Try the trunk version first, if that doesn't work use the most recent tag.
 --- Copy ASIOSDK to portaudio/src/hostapi/asio
 
 --- Check the pa_win_hostapis.c file and make sure that it is configured to build 
-the DirectSound, WMME, and ASIO drivers:
+the DirectSound, WMME, and ASIO drivers. (nothing to do here)
 
 --- Need to removed "volatile" from function definitions in MinGW/include/winbase.h
 
@@ -120,7 +124,7 @@ commonEnvironment.Append(CPPPATH = [".", "src/common", "src/hostapi", "src/os",
 "C:/portaudio/src/hostapi/asio/ASIOSDK/host",
 "C:/portaudio/src/hostapi/asio/ASIOSDK/host/pc",
 "C:/portaudio/src/hostapi/asio/ASIOSDK/common",
-"C:/Program Files/Microsoft DirectX SDK (April 2007)/Include"])
+"C:/Program Files (x86)/Microsoft DirectX SDK (April 2007)/Include"])
 
 commonEnvironment.Append(LIBS=Split('''
 setupapi
@@ -175,7 +179,7 @@ portAudio = commonEnvironment.SharedLibrary('portaudio', portAudioSources)
 ##########################################################################
 
 === STEP 11 ===
-4 --- Update the PortMidi library http://portmedia.sourceforge.net from SVN and build it with this SConstruct:
+--- Update the PortMidi library http://portmedia.sourceforge.net from SVN and build it with this SConstruct:
 
 '''
 MinGW SConstruct for PortMidi
@@ -259,8 +263,6 @@ Depends(test, portmidi)
 [build]
 compiler = mingw32
 
-*** For Python 2.5, comment line 428 to 434 in Python25/include/pyconfig.py
-
 === STEP 13 ===
 --- Download pyo sources from svn and build it with:
 
diff --git a/setup.py b/setup.py
index 2e5c607..2f2c75f 100644
--- a/setup.py
+++ b/setup.py
@@ -23,7 +23,7 @@ from distutils.core import setup, Extension
 import os, sys, getopt
 import time
 
-pyo_version = "0.7.5"
+pyo_version = "0.7.6"
 build_osx_with_jack_support = False
 compile_externals = False
 
@@ -88,10 +88,10 @@ else:
 
 # Platform-specific build settings for the pyo extension(s).  
 if sys.platform == "win32":
-    include_dirs = ['C:\portaudio\include', 'C:\Program Files\Mega-Nerd\libsndfile\include',
+    include_dirs = ['C:\portaudio\include', 'C:\Program Files (x86)\Mega-Nerd\libsndfile\include',
                     'C:\portmidi\pm_common', 'C:\liblo', 'C:\pthreads\include', 'include',
                     'C:\portmidi\porttime']
-    library_dirs = ['C:\portaudio', 'C:/Program Files/Mega-Nerd/libsndfile/bin', 'C:\portmidi', 'C:\liblo', 'C:\pthreads\lib']
+    library_dirs = ['C:\portaudio', 'C:/Program Files (x86)/Mega-Nerd/libsndfile/bin', 'C:\portmidi', 'C:\liblo', 'C:\pthreads\lib']
     libraries = ['portaudio', 'portmidi', 'porttime', 'libsndfile-1', 'lo', 'pthreadVC2']
 else:
     tsrt = time.strftime('"%d %b %Y %H:%M:%S"', time.localtime())
diff --git a/src/engine/pyomodule.c b/src/engine/pyomodule.c
index a7a2f89..88b37e4 100644
--- a/src/engine/pyomodule.c
+++ b/src/engine/pyomodule.c
@@ -2550,6 +2550,7 @@ init_pyo64(void)
     module_add_object(m, "MainParticle_base", &MainParticleType);
     module_add_object(m, "Particle_base", &ParticleType);
     module_add_object(m, "AtanTable_base", &AtanTableType);
+    module_add_object(m, "RawMidi_base", &RawMidiType);
 
     PyModule_AddStringConstant(m, "PYO_VERSION", PYO_VERSION);
 #ifdef COMPILE_EXTERNALS
diff --git a/src/objects/analysismodule.c b/src/objects/analysismodule.c
index a9cfe9a..1ad618b 100644
--- a/src/objects/analysismodule.c
+++ b/src/objects/analysismodule.c
@@ -1698,7 +1698,10 @@ Centroid_process_i(Centroid *self) {
                 sum1 += tmp * i;
                 sum2 += tmp;
             }
-            tmp = sum1 / sum2;
+            if (sum2 < 0.000000001)
+                tmp = 0.0;
+            else
+                tmp = sum1 / sum2;
             self->centroid += tmp * self->sr / self->size;
             self->centroid *= 0.5;
             for (i=0; i<self->hsize; i++) {
diff --git a/src/objects/midimodule.c b/src/objects/midimodule.c
index 3f20b29..0bf5a3d 100644
--- a/src/objects/midimodule.c
+++ b/src/objects/midimodule.c
@@ -3586,3 +3586,168 @@ PyTypeObject MidiDelAdsrType = {
     0,                         /* tp_alloc */
     MidiDelAdsr_new,                 /* tp_new */
 };
+
+typedef struct {
+    pyo_audio_HEAD
+    PyObject *callable;
+} RawMidi;
+
+static void
+RawMidi_setProcMode(RawMidi *self) {}
+
+static void
+RawMidi_compute_next_data_frame(RawMidi *self)
+{
+    PmEvent *buffer;
+    int i, count, status, data1, data2;
+
+    buffer = Server_getMidiEventBuffer((Server *)self->server);
+    count = Server_getMidiEventCount((Server *)self->server);
+
+    if (count > 0) {
+        PyObject *tup;
+        for (i=count-1; i>=0; i--) {
+            status = Pm_MessageStatus(buffer[i].message);	// Temp note event holders
+            data1 = Pm_MessageData1(buffer[i].message);
+            data2 = Pm_MessageData2(buffer[i].message);
+            tup = PyTuple_New(3);
+            PyTuple_SetItem(tup, 0, PyInt_FromLong(status));
+            PyTuple_SetItem(tup, 1, PyInt_FromLong(data1));
+            PyTuple_SetItem(tup, 2, PyInt_FromLong(data2));
+            PyObject_Call((PyObject *)self->callable, tup, NULL);
+        }
+    }
+}
+
+static int
+RawMidi_traverse(RawMidi *self, visitproc visit, void *arg)
+{
+    pyo_VISIT
+    Py_VISIT(self->callable);
+    return 0;
+}
+
+static int
+RawMidi_clear(RawMidi *self)
+{
+    pyo_CLEAR
+    Py_CLEAR(self->callable);
+    return 0;
+}
+
+static void
+RawMidi_dealloc(RawMidi* self)
+{
+    pyo_DEALLOC
+    RawMidi_clear(self);
+    self->ob_type->tp_free((PyObject*)self);
+}
+
+static PyObject *
+RawMidi_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+    int i;
+    PyObject *calltmp=NULL;
+    RawMidi *self;
+    self = (RawMidi *)type->tp_alloc(type, 0);
+
+    INIT_OBJECT_COMMON
+    Stream_setFunctionPtr(self->stream, RawMidi_compute_next_data_frame);
+    self->mode_func_ptr = RawMidi_setProcMode;
+
+    static char *kwlist[] = {"callable", NULL};
+
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "O", kwlist, &calltmp))
+        Py_RETURN_NONE;
+
+    if (calltmp) {
+        PyObject_CallMethod((PyObject *)self, "setFunction", "O", calltmp);
+    }
+
+    PyObject_CallMethod(self->server, "addStream", "O", self->stream);
+
+    return (PyObject *)self;
+}
+
+static PyObject * RawMidi_getServer(RawMidi* self) { GET_SERVER };
+static PyObject * RawMidi_getStream(RawMidi* self) { GET_STREAM };
+
+static PyObject * RawMidi_play(RawMidi *self, PyObject *args, PyObject *kwds) { PLAY };
+static PyObject * RawMidi_stop(RawMidi *self) { STOP };
+
+static PyObject *
+RawMidi_setFunction(RawMidi *self, PyObject *arg)
+{
+	PyObject *tmp;
+
+	if (! PyCallable_Check(arg)) {
+        PyErr_SetString(PyExc_TypeError, "The callable attribute must be a valid Python function.");
+		Py_INCREF(Py_None);
+		return Py_None;
+	}
+
+    tmp = arg;
+    Py_XDECREF(self->callable);
+    Py_INCREF(tmp);
+    self->callable = tmp;
+
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+static PyMemberDef RawMidi_members[] = {
+    {"server", T_OBJECT_EX, offsetof(RawMidi, server), 0, "Pyo server."},
+    {"stream", T_OBJECT_EX, offsetof(RawMidi, stream), 0, "Stream object."},
+    {NULL}  /* Sentinel */
+};
+
+static PyMethodDef RawMidi_methods[] = {
+    {"getServer", (PyCFunction)RawMidi_getServer, METH_NOARGS, "Returns server object."},
+    {"_getStream", (PyCFunction)RawMidi_getStream, METH_NOARGS, "Returns stream object."},
+    {"play", (PyCFunction)RawMidi_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
+    {"stop", (PyCFunction)RawMidi_stop, METH_NOARGS, "Stops computing."},
+    {"setFunction", (PyCFunction)RawMidi_setFunction, METH_O, "Sets the function to be called."},
+    {NULL}  /* Sentinel */
+};
+
+PyTypeObject RawMidiType = {
+    PyObject_HEAD_INIT(NULL)
+    0,                         /*ob_size*/
+    "_pyo.RawMidi_base",         /*tp_name*/
+    sizeof(RawMidi),         /*tp_basicsize*/
+    0,                         /*tp_itemsize*/
+    (destructor)RawMidi_dealloc, /*tp_dealloc*/
+    0,                         /*tp_print*/
+    0,                         /*tp_getattr*/
+    0,                         /*tp_setattr*/
+    0,                         /*tp_compare*/
+    0,                         /*tp_repr*/
+    0,             /*tp_as_number*/
+    0,                         /*tp_as_sequence*/
+    0,                         /*tp_as_mapping*/
+    0,                         /*tp_hash */
+    0,                         /*tp_call*/
+    0,                         /*tp_str*/
+    0,                         /*tp_getattro*/
+    0,                         /*tp_setattro*/
+    0,                         /*tp_as_buffer*/
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
+    "RawMidi objects. Calls a function with midi data as arguments.",           /* tp_doc */
+    (traverseproc)RawMidi_traverse,   /* tp_traverse */
+    (inquiry)RawMidi_clear,           /* tp_clear */
+    0,		               /* tp_richcompare */
+    0,		               /* tp_weaklistoffset */
+    0,		               /* tp_iter */
+    0,		               /* tp_iternext */
+    RawMidi_methods,             /* tp_methods */
+    RawMidi_members,             /* tp_members */
+    0,                      /* tp_getset */
+    0,                         /* tp_base */
+    0,                         /* tp_dict */
+    0,                         /* tp_descr_get */
+    0,                         /* tp_descr_set */
+    0,                         /* tp_dictoffset */
+    0,      /* tp_init */
+    0,                         /* tp_alloc */
+    RawMidi_new,                 /* tp_new */
+};
diff --git a/src/objects/oscmodule.c b/src/objects/oscmodule.c
index 569029c..e40c8cc 100644
--- a/src/objects/oscmodule.c
+++ b/src/objects/oscmodule.c
@@ -736,7 +736,13 @@ typedef struct {
 static void
 OscDataSend_compute_next_data_frame(OscDataSend *self)
 {
-    int i;
+    int i, j = 0;
+    Py_ssize_t blobsize = 0;
+    PyObject *datalist = NULL;
+    char *blobdata = NULL;
+    uint8_t midi[4];
+    lo_blob *blob = NULL;
+    
     lo_message *msg;
     char *path  = PyString_AsString(self->address_path);
 
@@ -746,19 +752,48 @@ OscDataSend_compute_next_data_frame(OscDataSend *self)
         for (i=0; i<self->num_items; i++) {
             switch (self->types[i]) {
                 case LO_INT32:
-                    lo_message_add_int32(msg, PyInt_AsLong(PyList_GetItem(self->value, i)));
+                    lo_message_add_int32(msg, PyInt_AS_LONG(PyList_GET_ITEM(self->value, i)));
                     break;
                 case LO_INT64:
-                    lo_message_add_int64(msg, (long)PyLong_AsLong(PyList_GetItem(self->value, i)));
+                    lo_message_add_int64(msg, (long)PyLong_AsLong(PyList_GET_ITEM(self->value, i)));
                     break;
                 case LO_FLOAT:
-                    lo_message_add_float(msg, PyFloat_AsDouble(PyList_GetItem(self->value, i)));
+                    lo_message_add_float(msg, PyFloat_AS_DOUBLE(PyList_GET_ITEM(self->value, i)));
                     break;
                 case LO_DOUBLE:
-                    lo_message_add_double(msg, (double)PyFloat_AsDouble(PyList_GetItem(self->value, i)));
+                    lo_message_add_double(msg, (double)PyFloat_AS_DOUBLE(PyList_GET_ITEM(self->value, i)));
                     break;
                 case LO_STRING:
-                    lo_message_add_string(msg, PyString_AsString(PyList_GetItem(self->value, i)));
+                    lo_message_add_string(msg, PyString_AsString(PyList_GET_ITEM(self->value, i)));
+                    break;
+                case LO_CHAR:
+                    lo_message_add_char(msg, (char)PyString_AsString(PyList_GET_ITEM(self->value, i))[0]);
+                    break;
+                case LO_BLOB:
+                    datalist = PyList_GET_ITEM(self->value, i);
+                    blobsize = PyList_Size(datalist);
+                    blobdata = (char *)malloc(blobsize * sizeof(char));
+                    for (j=0; j<blobsize; j++) {
+                        blobdata[j] = (char)PyString_AsString(PyList_GET_ITEM(datalist, j))[0];
+                    }
+                    blob = lo_blob_new(blobsize * sizeof(char), blobdata);
+                    lo_message_add_blob(msg, blob);
+                    break;
+                case LO_MIDI:
+                    datalist = PyList_GET_ITEM(self->value, i);
+                    for (j=0; j<4; j++) {
+                        midi[j] = (uint8_t)PyInt_AS_LONG(PyList_GET_ITEM(datalist, j));
+                    }
+                    lo_message_add_midi(msg, midi);
+                    break;
+                case LO_NIL:
+                    lo_message_add_nil(msg);
+                    break;
+                case LO_TRUE:
+                    lo_message_add_true(msg);
+                    break;
+                case LO_FALSE:
+                    lo_message_add_false(msg);
                     break;
                 default:
                     break;
@@ -769,8 +804,11 @@ OscDataSend_compute_next_data_frame(OscDataSend *self)
         }
         self->something_to_send = 0;
         lo_message_free(msg);
+        if (blob != NULL)
+            lo_blob_free(blob);
+        if (blobdata != NULL)
+            free(blobdata);
     }
-
 }
 
 static int
@@ -861,7 +899,7 @@ OscDataSend_send(OscDataSend *self, PyObject *arg)
         self->something_to_send = 1;
     }
     else
-        printf("argument to send() method must be a tuple of values.\n");
+        printf("argument to send() method must be a list of values.\n");
 
 	Py_INCREF(Py_None);
 	return Py_None;
@@ -938,35 +976,71 @@ int OscDataReceive_handler(const char *path, const char *types, lo_arg **argv, i
 {
     OscDataReceive *self = user_data;
     PyObject *tup, *result=NULL;
+    lo_blob *blob = NULL;
+    char *blobdata = NULL;
+    uint32_t blobsize = 0;
+    PyObject *charlist = NULL; 
     tup = PyTuple_New(argc+1);
-    int i, ok = 0;
+    int i, ok = 0, j = 0;
 
     Py_ssize_t lsize = PyList_Size(self->address_path);
     for (i=0; i<lsize; i++) {
-        if (lo_pattern_match(path, PyString_AsString(PyList_GetItem(self->address_path, i)))) {
+        if (lo_pattern_match(path, PyString_AsString(PyList_GET_ITEM(self->address_path, i)))) {
             ok = 1;
             break;
         }
     }
 
     if (ok) {
-        PyTuple_SetItem(tup, 0, PyString_FromString(path));
+        PyTuple_SET_ITEM(tup, 0, PyString_FromString(path));
         for (i=0; i<argc; i++) {
             switch (types[i]) {
                 case LO_INT32:
-                    PyTuple_SetItem(tup, i+1, PyInt_FromLong(argv[i]->i));
+                    PyTuple_SET_ITEM(tup, i+1, PyInt_FromLong(argv[i]->i));
                     break;
                 case LO_INT64:
-                    PyTuple_SetItem(tup, i+1, PyLong_FromLong(argv[i]->h));
+                    PyTuple_SET_ITEM(tup, i+1, PyLong_FromLong(argv[i]->h));
                     break;
                 case LO_FLOAT:
-                    PyTuple_SetItem(tup, i+1, PyFloat_FromDouble(argv[i]->f));
+                    PyTuple_SET_ITEM(tup, i+1, PyFloat_FromDouble(argv[i]->f));
                     break;
                 case LO_DOUBLE:
-                    PyTuple_SetItem(tup, i+1, PyFloat_FromDouble(argv[i]->d));
+                    PyTuple_SET_ITEM(tup, i+1, PyFloat_FromDouble(argv[i]->d));
                     break;
                 case LO_STRING:
-                    PyTuple_SetItem(tup, i+1, PyString_FromString(&argv[i]->s));
+                    PyTuple_SET_ITEM(tup, i+1, PyString_FromString(&argv[i]->s));
+                    break;
+                case LO_CHAR:
+                    PyTuple_SET_ITEM(tup, i+1, PyString_FromFormat("%c", argv[i]->c));
+                    break;
+                case LO_BLOB:
+                    blob = (lo_blob)argv[i];
+                    blobsize = lo_blob_datasize(blob);
+                    blobdata = lo_blob_dataptr(blob);
+                    charlist = PyList_New(blobsize);
+                    for (j=0; j<blobsize; j++) {
+                        PyList_SET_ITEM(charlist, j, PyString_FromFormat("%c", blobdata[j]));
+                    }
+                    PyTuple_SET_ITEM(tup, i+1, charlist);
+                    break;
+                case LO_MIDI:
+                    charlist = PyList_New(4);
+                    for (j=0; j<4; j++) {
+                        PyList_SET_ITEM(charlist, j, PyInt_FromLong(argv[i]->m[j]));
+                    }
+                    PyTuple_SET_ITEM(tup, i+1, charlist);                    
+                    break;
+                case LO_NIL:
+                    Py_INCREF(Py_None);
+                    PyTuple_SET_ITEM(tup, i+1, Py_None);
+                    break;
+                case LO_TRUE:
+                    Py_INCREF(Py_True);
+                    PyTuple_SET_ITEM(tup, i+1, Py_True);
+                    break;
+                case LO_FALSE:
+                    Py_INCREF(Py_False);
+                    PyTuple_SET_ITEM(tup, i+1, Py_False);
                     break;
                 default:
                     break;
@@ -978,6 +1052,7 @@ int OscDataReceive_handler(const char *path, const char *types, lo_arg **argv, i
     }
     Py_XDECREF(tup);
     Py_XDECREF(result);
+    Py_XDECREF(charlist);
     return 0;
 }
 
diff --git a/utils/E-Pyo.py b/utils/E-Pyo.py
index de136b3..87d556a 100755
--- a/utils/E-Pyo.py
+++ b/utils/E-Pyo.py
@@ -45,10 +45,13 @@ PLATFORM = sys.platform
 DEFAULT_ENCODING = sys.getdefaultencoding()
 ENCODING = sys.getfilesystemencoding()
 ENCODING_LIST = ["utf_8", "latin_1", "mac_roman", "cp1252", "cp1250", "utf_16"]
-ENCODING_DICT = {'cp-1250': 'cp1250', 'cp-1251': 'cp1251', 'cp-1252': 'cp1252', 'latin-1': 'latin_1', 
-                'mac-roman': 'mac_roman', 'utf-8': 'utf_8', 'utf-16': 'utf_16', 'utf-16 (Big Endian)': 'utf_16_be', 
-                'utf-16 (Little Endian)': 'utf_16_le', 'utf-32': 'utf_32', 'utf-32 (Big Endian)': 
-                'utf_32_be', 'utf-32 (Little Endian)': 'utf_32_le'}
+ENCODING_DICT = {'cp-1250': 'cp1250', 'cp-1251': 'cp1251', 'cp-1252': 'cp1252', 
+                 'latin-1': 'latin_1', 'mac-roman': 'mac_roman', 
+                 'utf-8': 'utf_8', 'utf-16': 'utf_16', 
+                 'utf-16 (Big Endian)': 'utf_16_be', 
+                 'utf-16 (Little Endian)': 'utf_16_le', 'utf-32': 'utf_32', 
+                 'utf-32 (Big Endian)': 'utf_32_be', 
+                 'utf-32 (Little Endian)': 'utf_32_le'}
 
 APP_NAME = 'E-Pyo'
 APP_VERSION = PYO_VERSION
@@ -119,6 +122,7 @@ def hex_to_rgb(value):
     lv = len(value)
     return tuple(int(value[i:i+lv/3], 16) for i in range(0, lv, lv/3))
 
+################## Paths ##################
 TEMP_PATH = os.path.join(os.path.expanduser('~'), '.epyo')
 if not os.path.isdir(TEMP_PATH):
     os.mkdir(TEMP_PATH)
@@ -155,7 +159,8 @@ if PLATFORM == "darwin" and '/%s.app' % APP_NAME in os.getcwd():
     
 # Check for which Python to use #
 if PLATFORM == "win32":
-    WHICH_PYTHON = PREFERENCES.get("which_python", "C:\Python%d%d\python.exe" % sys.version_info[:2])
+    WHICH_PYTHON = PREFERENCES.get("which_python", 
+                            "C:\Python%d%d\python.exe" % sys.version_info[:2])
 else:
     WHICH_PYTHON = PREFERENCES.get("which_python", "")
 INSTALLATION_ERROR_MESSAGE = ""
@@ -163,13 +168,16 @@ CALLER_NEED_TO_INVOKE_32_BIT = False
 SET_32_BIT_ARCH = "export VERSIONER_PYTHON_PREFER_32_BIT=yes;"
 if WHICH_PYTHON == "":
     if OSX_APP_BUNDLED:
-        proc = subprocess.Popen(["export PATH=/usr/local/bin:$PATH;which python"], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+        proc = subprocess.Popen(["export PATH=/usr/local/bin:$PATH;which python"], 
+                    shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
         WHICH_PYTHON = proc.communicate()[0][:-1]
     elif PLATFORM == "darwin":
-        proc = subprocess.Popen(["which python"], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+        proc = subprocess.Popen(["which python"], shell=True, 
+                                stdout=subprocess.PIPE, stderr=subprocess.PIPE)
         WHICH_PYTHON = proc.communicate()[0][:-1]
     elif PLATFORM == "linux2":
-        proc = subprocess.Popen(["which python"], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+        proc = subprocess.Popen(["which python"], shell=True, 
+                                stdout=subprocess.PIPE, stderr=subprocess.PIPE)
         WHICH_PYTHON = proc.communicate()[0][:-1]
     else:
         ### No more used on Windows ###
@@ -477,9 +485,11 @@ 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_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):
@@ -535,8 +545,10 @@ WHILE_COMP = """ `i` `>` `0`:
 """
 ASSERT_COMP = ''' `expression` `>` `0`, "`expression should be positive`"
 '''
-BUILTINS_DICT = {"from": FROM_COMP, "try": TRY_COMP, "if": IF_COMP, "def": DEF_COMP, "class": CLASS_COMP, 
-                "for": FOR_COMP, "while": WHILE_COMP, "exec": EXEC_COMP, "raise": RAISE_COMP, "assert": ASSERT_COMP}
+BUILTINS_DICT = {"from": FROM_COMP, "try": TRY_COMP, "if": IF_COMP, 
+                 "def": DEF_COMP, "class": CLASS_COMP, "for": FOR_COMP, 
+                 "while": WHILE_COMP, "exec": EXEC_COMP, "raise": RAISE_COMP, 
+                 "assert": ASSERT_COMP}
 
 ################## Interface Bitmaps ##################
 catalog = {}
@@ -773,7 +785,9 @@ KEY_COMMANDS = {
 }
 
 ############## Allowed Extensions ##############
-ALLOWED_EXT = PREFERENCES.get("allowed_ext", ["py", "c5", "txt", "", "c", "h", "cpp", "hpp", "sh", "rst", "iss", "sg", "md", "jsfx-inc"])
+ALLOWED_EXT = PREFERENCES.get("allowed_ext", 
+                              ["py", "c5", "txt", "", "c", "h", "cpp", "hpp", "zy",
+                               "sh", "rst", "iss", "sg", "md", "jsfx-inc", "lua", "css"])
 
 ############## Pyo keywords ##############
 tree = OBJECTS_TREE
@@ -813,15 +827,23 @@ else:
 
 
 STYLES_GENERALS = ['default', 'background', 'selback', 'caret']
-STYLES_TEXT_COMP = ['comment', 'commentblock', 'number', 'operator', 'string', 'triple', 'keyword', 'pyokeyword', 
-                'class', 'function', 'linenumber']
-STYLES_INTER_COMP = ['marginback', 'foldmarginback', 'markerfg', 'markerbg', 'bracelight', 'bracebad', 'lineedge']
-STYLES_LABELS = {'default': 'Foreground', 'background': 'Background', 'selback': 'Selection', 'caret': 'Caret',
-        'comment': 'Comment', 'commentblock': 'Comment Block', 'number': 'Number', 'string': 'String', 
-        'triple': 'Triple String', 'keyword': 'Python Keyword', 'pyokeyword': 'Pyo Keyword', 'class': 'Class Name', 
-        'function': 'Function Name', 'linenumber': 'Line Number', 'operator': 'Operator', 'foldmarginback': 'Folding Margin Background',
-        'marginback': 'Number Margin Background', 'markerfg': 'Marker Foreground', 'markerbg': 'Marker Background', 
-        'bracelight': 'Brace Match', 'bracebad': 'Brace Mismatch', 'lineedge': 'Line Edge'}
+STYLES_TEXT_COMP = ['comment', 'commentblock', 'number', 'operator', 'string', 
+                    'triple', 'keyword', 'pyokeyword', 'class', 'function', 
+                    'linenumber']
+STYLES_INTER_COMP = ['marginback', 'foldmarginback', 'markerfg', 'markerbg', 
+                     'bracelight', 'bracebad', 'lineedge']
+STYLES_LABELS = {'default': 'Foreground', 'background': 'Background', 
+                 'selback': 'Selection', 'caret': 'Caret', 'comment': 'Comment', 
+                 'commentblock': 'Comment Block', 'number': 'Number', 
+                 'string': 'String', 'triple': 'Triple String', 
+                 'keyword': 'Python Keyword', 'pyokeyword': 'Pyo Keyword', 
+                 'class': 'Class Name', 'function': 'Function Name', 
+                 'linenumber': 'Line Number', 'operator': 'Operator', 
+                 'foldmarginback': 'Folding Margin Background',
+                 'marginback': 'Number Margin Background', 
+                 'markerfg': 'Marker Foreground', 'markerbg': 'Marker Background', 
+                 'bracelight': 'Brace Match', 'bracebad': 'Brace Mismatch', 
+                 'lineedge': 'Line Edge'}
 
 with open(PREF_STYLE) as f:
     text = f.read()
@@ -920,23 +942,23 @@ class RunningThread(threading.Thread):
             prelude = "export -n %s;export PATH=/usr/local/bin:/usr/local/lib:$PATH;" % vars_to_remove
             if CALLER_NEED_TO_INVOKE_32_BIT:
                 self.proc = subprocess.Popen(['%s%s%s -u "%s"' % (prelude, SET_32_BIT_ARCH, WHICH_PYTHON, self.path)], 
-                                shell=True, cwd=self.cwd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+                                shell=True, cwd=self.cwd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
             else:
                 self.proc = subprocess.Popen(['%s%s -u "%s"' % (prelude, WHICH_PYTHON, self.path)], cwd=self.cwd, 
-                                    shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+                                    shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
         elif PLATFORM == "darwin":
             if CALLER_NEED_TO_INVOKE_32_BIT:
                 self.proc = subprocess.Popen(['%s%s -u "%s"' % (SET_32_BIT_ARCH, WHICH_PYTHON, self.path)], 
-                                shell=True, cwd=self.cwd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+                                shell=True, cwd=self.cwd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
             else:
                 self.proc = subprocess.Popen(['%s -u "%s"' % (WHICH_PYTHON, self.path)], cwd=self.cwd, 
-                                shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+                                shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
         elif PLATFORM == "win32":
             self.proc = subprocess.Popen([WHICH_PYTHON, "-u", self.path], cwd=self.cwd, shell=False, 
-                                stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+                                stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
         else:
             self.proc = subprocess.Popen([WHICH_PYTHON, "-u", self.path], cwd=self.cwd, 
-                                stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+                                stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
 
         header = '=== Output log of process "%s", launched: %s ===\n' % (self.filename, time.strftime('"%d %b %Y %H:%M:%S"', time.localtime()))
         data_event = DataEvent({"log": header, "pid": self.pid, "filename": self.filename, "active": True})
@@ -945,12 +967,18 @@ class RunningThread(threading.Thread):
             log = ""
             for line in self.proc.stdout.readline():
                 log = log + line
+            log = log.replace(">>> ", "").replace("... ", "")
             data_event = DataEvent({"log": log, "pid": self.pid, "filename": self.filename, "active": True})
             wx.PostEvent(self.event_receiver, data_event)            
             sys.stdout.flush()
             time.sleep(.025)
         stdout, stderr = self.proc.communicate()
-        output = stdout + stderr
+        output = ""
+        if stdout is not None:
+            output = output + stdout
+        if stderr is not None:
+            output = output + stderr
+        output = output.replace(">>> ", "").replace("... ", "")
         if "StartNotification name = default" in output:
             output = output.replace("StartNotification name = default", "")
         if "epyo_tempfile.py" in output:
@@ -977,12 +1005,102 @@ class RunningThread(threading.Thread):
                 pass
         if self.terminated:
             output = output + "\n=== Process killed. ==="
-        data_event = DataEvent({"log": output, "pid": self.pid, "filename": self.filename, "active": False})
+        data_event = DataEvent({"log": output, "pid": self.pid, 
+                                "filename": self.filename, "active": False})
+        wx.PostEvent(self.event_receiver, data_event)
+
+class BackgroundServerThread(threading.Thread):
+    def __init__(self, cwd, event_receiver):
+        threading.Thread.__init__(self)
+        self.cwd = cwd
+        self.event_receiver = event_receiver
+        self.terminated = False
+        self.pid = None
+
+    def setPID(self, pid):
+        self.pid = pid
+
+    def kill(self):
+        self.terminated = True
+        self.proc.stdin.write("_quit_()\n")
+        if self.proc.poll() == None:
+            self.proc.kill()
+
+    def sendText(self, text):
+        for line in text.splitlines():
+            self.proc.stdin.write(line + "\n")
+        self.proc.stdin.write("\n")
+
+    def run(self):
+        if PLATFORM == "win32":
+            self.proc = subprocess.Popen(
+                    [WHICH_PYTHON, '-i', os.path.join(TEMP_PATH, "background_server.py")], 
+                    shell=True, cwd=self.cwd, stdout=subprocess.PIPE,
+                    stdin=subprocess.PIPE, stderr=subprocess.STDOUT)
+        else:
+            self.proc = subprocess.Popen(
+                    ["%s -i -u %s" % (WHICH_PYTHON, os.path.join(TEMP_PATH, "background_server.py"))], 
+                    cwd=self.cwd, shell=True, stdout=subprocess.PIPE, 
+                    stderr=subprocess.STDOUT, stdin=subprocess.PIPE)
+
+        header = '=== Output log of background server, launched: %s ===\n' % time.strftime('"%d %b %Y %H:%M:%S"', time.localtime())
+        data_event = DataEvent({"log": header, "pid": self.pid, 
+                                "filename": 'background_server.py', 
+                                "active": True})
+        wx.PostEvent(self.event_receiver, data_event)
+        while self.proc.poll() == None and not self.terminated:
+            log = ""
+            for line in self.proc.stdout.readline():
+                log = log + line
+            log = log.replace(">>> ", "").replace("... ", "")
+            data_event = DataEvent({"log": log, "pid": self.pid, 
+                                    "filename": 'background_server.py', 
+                                    "active": True})
+            wx.PostEvent(self.event_receiver, data_event)            
+            sys.stdout.flush()
+            time.sleep(.025)
+        stdout, stderr = self.proc.communicate()
+        output = ""
+        if stdout is not None:
+            output = output + stdout
+        if stderr is not None:
+            output = output + stderr
+        output = output.replace(">>> ", "").replace("... ", "")
+        if "StartNotification name = default" in output:
+            output = output.replace("StartNotification name = default", "")
+        if "background_server.py" in output:
+            try:
+                findpos = output.find("background_server.py")
+                pos = findpos
+                while (output[pos] != '"'):
+                    pos -= 1
+                startpos = pos + 1
+                pos = findpos
+                while (output[pos] != '"'):
+                    pos += 1
+                endpos = pos
+                output = output[:startpos] + self.filename + output[endpos:]
+                pos = startpos + len(self.filename)
+                slinepos = pos + 8
+                pos = slinepos
+                while (output[pos] != ',' and output[pos] != '\n'):
+                    pos += 1
+                elinepos = pos
+                linenum = int(output[slinepos:elinepos].strip())
+                output = output[:slinepos] + str(linenum-3) + output[elinepos:]
+            except:
+                pass
+        if self.terminated:
+            output = output + "\n=== Process killed. ==="
+        data_event = DataEvent({"log": output, "pid": self.pid, 
+                                "filename": 'background_server.py', 
+                                "active": False})
         wx.PostEvent(self.event_receiver, data_event)
 
 class KeyCommandsFrame(wx.Frame):
     def __init__(self, parent):
-        wx.Frame.__init__(self, parent, wx.ID_ANY, title="Editor Key Commands List", size=(650,550))
+        wx.Frame.__init__(self, parent, wx.ID_ANY, 
+                          title="Editor Key Commands List", size=(650,550))
         self.menuBar = wx.MenuBar()
         menu1 = wx.Menu()
         menu1.Append(351, "Close\tCtrl+W")
@@ -1012,7 +1130,8 @@ class KeyCommandsFrame(wx.Frame):
         self.Hide()
 
 class EditorPreview(stc.StyledTextCtrl):
-    def __init__(self, parent, ID, pos=wx.DefaultPosition, size=wx.DefaultSize, style= wx.SUNKEN_BORDER | wx.WANTS_CHARS):
+    def __init__(self, parent, ID, pos=wx.DefaultPosition, size=wx.DefaultSize, 
+                 style= wx.SUNKEN_BORDER | wx.WANTS_CHARS):
         stc.StyledTextCtrl.__init__(self, parent, ID, pos, size, style)
 
         self.SetSTCCursor(2)
@@ -1428,6 +1547,7 @@ class SearchProjectPanel(scrolled.ScrolledPanel):
 class SearchProjectFrame(wx.Frame):
     def __init__(self, parent, root, dict, size=(500,500)):
         wx.Frame.__init__(self, parent, wx.ID_ANY, size=size)
+        self.SetTitle('Search Results in Project "%s"' % os.path.split(root)[1])
         self.menuBar = wx.MenuBar()
         menu1 = wx.Menu()
         menu1.Append(351, "Close\tCtrl+W")
@@ -2051,6 +2171,13 @@ class MainFrame(wx.Frame):
         menu2.Append(121, "Insert File Path...\tShift+Ctrl+P")
         self.Bind(wx.EVT_MENU, self.insertPath, id=121)
         menu2.AppendSeparator()
+        submenublk = wx.Menu()
+        submenublk.Append(400, "Insert Code Block Head\tCtrl+B")
+        submenublk.Append(401, "Insert Code Block Tail\tShift+Ctrl+B")
+        submenublk.Append(402, "Select Code Block\tCtrl+,")
+        self.Bind(wx.EVT_MENU, self.onCodeBlock, id=400, id2=402)
+        menu2.AppendMenu(-1, "Code Blocks", submenublk)
+        menu2.AppendSeparator()
         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))
@@ -2093,7 +2220,7 @@ class MainFrame(wx.Frame):
         self.menu3.AppendSeparator()
         self.backServerItem = self.menu3.Append(304, "Start Pyo Background Server")
         self.Bind(wx.EVT_MENU, self.startStopBackgroundServer, id=304)
-        self.sendToServerItem = self.menu3.Append(305, "Send Line/Selection to Pyo Background Server\tCtrl+T")
+        self.sendToServerItem = self.menu3.Append(305, "Send Line/Selection to Pyo Background Server\tCtrl+.")
         self.sendToServerItem.Enable(False)
         self.Bind(wx.EVT_MENU, self.sendSelectionToBackgroundServer, id=305)
         self.menuBar.Append(self.menu3, 'Process')
@@ -2166,7 +2293,7 @@ class MainFrame(wx.Frame):
         self.menu6 = wx.Menu()
         ID_EXAMPLE = 1000
         for folder in EXAMPLE_FOLDERS:
-            exmenu = wx.Menu(title=folder.lower())
+            exmenu = wx.Menu(folder.lower())
             for ex in sorted([exp for exp in os.listdir(os.path.join(EXAMPLE_PATH, folder.lower())) if exp[0] != "." and not exp.endswith("pyc")]):
                 exmenu.Append(ID_EXAMPLE, ex)
                 ID_EXAMPLE += 1
@@ -2274,6 +2401,14 @@ class MainFrame(wx.Frame):
         if rect.x > self.field1X+160:
             self.cc.SetPosition((rect.x, rect.y+yoff2))
 
+    def onCodeBlock(self, evt):
+        if evt.GetId() == 400:
+            self.panel.editor.insertBlockHead()
+        elif evt.GetId() == 401:
+            self.panel.editor.insertBlockTail()
+        elif evt.GetId() == 402:
+            self.panel.editor.selectCodeBlock()
+
     def setMasterDocument(self, evt):
         if self.master_document == None:
             self.master_document = self.panel.editor.path
@@ -2981,7 +3116,9 @@ class MainFrame(wx.Frame):
     def run(self, path):
         cwd = self.getCurrentWorkingDirectory()
         th = RunningThread(path, cwd, self)
-        if "Untitled-" in self.panel.editor.path:
+        if self.master_document != None:
+            filename = os.path.split(self.master_document)[1]
+        elif "Untitled-" in self.panel.editor.path:
             filename = self.panel.editor.path
         else:
             filename = os.path.split(self.panel.editor.path)[1]
@@ -3043,59 +3180,72 @@ class MainFrame(wx.Frame):
             exec text
         self.panel.editor.addText(s.getvalue())
 
+    def prepareBackgroundServer(self):
+        outDriverIndex = -1
+        preferedDriver = PREFERENCES.get("background_server_out_device", "")
+        if preferedDriver != "":
+            driverList, driverIndexes = pa_get_output_devices()
+            driverList = [ensureNFD(driver) for driver in driverList]
+            if preferedDriver and preferedDriver in driverList:
+                outDriverIndex = driverIndexes[driverList.index(preferedDriver)]
+
+        inDriverIndex = -1
+        preferedDriver = PREFERENCES.get("background_server_in_device", "")
+        if preferedDriver != "":
+            driverList, driverIndexes = pa_get_input_devices()
+            driverList = [ensureNFD(driver) for driver in driverList]
+            if preferedDriver and preferedDriver in driverList:
+                inDriverIndex = driverIndexes[driverList.index(preferedDriver)]
+
+        midiOutDriverIndex = -1
+        preferedDriver = PREFERENCES.get("background_server_midiout_device", "")
+        if preferedDriver != "":
+            driverList, driverIndexes = pm_get_output_devices()
+            driverList = [ensureNFD(driver) for driver in driverList]
+            if preferedDriver and preferedDriver in driverList:
+                midiOutDriverIndex = driverIndexes[driverList.index(preferedDriver)]
+
+        midiInDriverIndex = -1
+        preferedDriver = PREFERENCES.get("background_server_midiin_device", "")
+        if preferedDriver != "":
+            driverList, driverIndexes = pm_get_input_devices()
+            driverList = [ensureNFD(driver) for driver in driverList]
+            if preferedDriver and preferedDriver in driverList:
+                midiInDriverIndex = driverIndexes[driverList.index(preferedDriver)]
+
+        with open(os.path.join(TEMP_PATH, "background_server.py"), "w") as f:
+            f.write("print 'Starting background server...'\nimport time\nfrom pyo import *\n")
+            f.write("s = Server(%s)\n" % BACKGROUND_SERVER_ARGS)
+            if outDriverIndex != -1:
+                f.write("s.setOutputDevice(%d)\n" % outDriverIndex)
+            if inDriverIndex != -1:
+                f.write("s.setInputDevice(%d)\n" % inDriverIndex)
+            if midiOutDriverIndex != -1:
+                f.write("s.setMidiOutputDevice(%d)\n" % midiOutDriverIndex)
+            if midiInDriverIndex != -1:
+                f.write("s.setMidiInputDevice(%d)\n" % midiInDriverIndex)
+            f.write("s.boot()\ns.start()\n\n")
+            f.write("def _quit_():\n    s.stop()\n    time.sleep(0.25)\n    exit()\n")
+
+    def resetBackgroundServerMenu(self):
+        self.back_server_started = False
+        self.backServerItem.SetItemLabel("Start Pyo Background Server")
+        self.sendToServerItem.Enable(False)
+        
     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", "")
-            if preferedDriver != "":
-                driverList, driverIndexes = pa_get_output_devices()
-                driverList = [ensureNFD(driver) for driver in driverList]
-                if preferedDriver and preferedDriver in driverList:
-                    outDriverIndex = driverIndexes[driverList.index(preferedDriver)]
-
-            inDriverIndex = -1
-            preferedDriver = PREFERENCES.get("background_server_in_device", "")
-            if preferedDriver != "":
-                driverList, driverIndexes = pa_get_input_devices()
-                driverList = [ensureNFD(driver) for driver in driverList]
-                if preferedDriver and preferedDriver in driverList:
-                    inDriverIndex = driverIndexes[driverList.index(preferedDriver)]
-
-            midiInDriverIndex = -1
-            preferedDriver = PREFERENCES.get("background_server_midiin_device", "")
-            if preferedDriver != "":
-                driverList, driverIndexes = pm_get_input_devices()
-                driverList = [ensureNFD(driver) for driver in driverList]
-                if preferedDriver and preferedDriver in driverList:
-                    midiInDriverIndex = driverIndexes[driverList.index(preferedDriver)]
-
-            with open(os.path.join(TEMP_PATH, "background_server.py"), "w") as f:
-                f.write("print 'Starting background server...'\nimport time\nfrom pyo import *\n")
-                f.write("s = Server(%s)\n" % BACKGROUND_SERVER_ARGS)
-                if outDriverIndex != -1:
-                    f.write("s.setOutputDevice(%d)\n" % outDriverIndex)
-                if inDriverIndex != -1:
-                    f.write("s.setInputDevice(%d)\n" % inDriverIndex)
-                if midiInDriverIndex != -1:
-                    f.write("s.setMidiInputDevice(%d)\n" % midiInDriverIndex)
-                f.write("s.boot()\ns.start()\n")
-            if PLATFORM == "win32":
-                self.server_pipe = subprocess.Popen([WHICH_PYTHON, '-i', 'background_server.py'], 
-                                        shell=True, cwd=TEMP_PATH, stdin=subprocess.PIPE).stdin
-            else:
-                self.server_pipe = subprocess.Popen(["%s -i %s" % (WHICH_PYTHON, os.path.join(TEMP_PATH, "background_server.py"))], 
-                                        shell=True, stdin=subprocess.PIPE).stdin
+            self.prepareBackgroundServer()
+            cwd = self.getCurrentWorkingDirectory()
+            th = BackgroundServerThread(cwd, self)
+            th.setPID(1000)
+            self.processes[1000] = [th, 'background_server.py']
+            self.panel.outputlog.addProcess(1000, 'background_server.py')
+            th.start()
             self.back_server_started = True
             self.backServerItem.SetItemLabel("Stop Pyo Background Server")
             self.sendToServerItem.Enable(True)
         else:
-            try:
-                self.server_pipe.write("print 'Closing background server...'\ns.stop()\ntime.sleep(0.25)\n")
-                self.server_pipe.close()
-            except IOError:
-                pass
-            self.server_pipe = None
+            self.processes[1000][0].kill()
             self.back_server_started = False
             self.backServerItem.SetItemLabel("Start Pyo Background Server")
             self.sendToServerItem.Enable(False)
@@ -3109,10 +3259,8 @@ class MainFrame(wx.Frame):
             text = self.panel.editor.GetLineUTF8(line)
         else:
             end = self.panel.editor.GetSelectionEnd()
-        if self.server_pipe != None:
-            for line in text.splitlines():
-                self.server_pipe.write(line + "\n")
-            self.server_pipe.write("\n")
+        if self.back_server_started:
+            self.processes[1000][0].sendText(text)
         if end != None:
             self.panel.editor.SetCurrentPos(end)
         self.panel.editor.LineDown()
@@ -3373,8 +3521,8 @@ class EditorPanel(wx.Panel):
         self.SetSizerAndFit(box)
 
 class Editor(stc.StyledTextCtrl):
-    def __init__(self, parent, ID, pos=wx.DefaultPosition, size=wx.DefaultSize, style= wx.NO_BORDER | wx.WANTS_CHARS,
-                 setTitle=None, getTitle=None):
+    def __init__(self, parent, ID, pos=wx.DefaultPosition, size=wx.DefaultSize, 
+                 style= wx.NO_BORDER | wx.WANTS_CHARS, setTitle=None, getTitle=None):
         stc.StyledTextCtrl.__init__(self, parent, ID, pos, size, style)
 
         dt = MyFileDropTarget(self)
@@ -3449,6 +3597,7 @@ class Editor(stc.StyledTextCtrl):
         self.Bind(stc.EVT_STC_UPDATEUI, self.OnUpdateUI)
         self.Bind(stc.EVT_STC_MARGINCLICK, self.OnMarginClick)
         self.Bind(wx.EVT_CLOSE, self.OnClose)
+        self.Bind(wx.EVT_LEFT_DCLICK, self.OnDoubleClick)
 
         self.EmptyUndoBuffer()
         self.SetFocus()
@@ -3632,6 +3781,57 @@ class Editor(stc.StyledTextCtrl):
             self.StyleSetSpec(stc.STC_C_OPERATOR, buildStyle('operator'))
             self.StyleSetSpec(stc.STC_C_IDENTIFIER, buildStyle('default'))
             self.StyleSetSpec(stc.STC_C_PREPROCESSOR, buildStyle('commentblock'))
+        elif ext == "md":
+            self.SetLexer(stc.STC_LEX_MARKDOWN)
+            self.SetStyleBits(self.GetStyleBitsNeeded())
+            self.StyleSetSpec(stc.STC_MARKDOWN_DEFAULT, buildStyle('default'))
+            self.StyleSetSpec(stc.STC_MARKDOWN_LINE_BEGIN, buildStyle('default'))
+            self.StyleSetSpec(stc.STC_MARKDOWN_STRONG1, buildStyle('default') + ",italic,bold")
+            self.StyleSetSpec(stc.STC_MARKDOWN_STRONG2, buildStyle('default') + ",italic,bold")
+            self.StyleSetSpec(stc.STC_MARKDOWN_EM1, buildStyle('default') + ",italic")
+            self.StyleSetSpec(stc.STC_MARKDOWN_EM2, buildStyle('default') + ",italic")
+            self.StyleSetSpec(stc.STC_MARKDOWN_HEADER1, buildStyle('comment') + ", bold")
+            self.StyleSetSpec(stc.STC_MARKDOWN_HEADER2, buildStyle('comment'))
+            self.StyleSetSpec(stc.STC_MARKDOWN_HEADER3, buildStyle('commentblock') + ", bold")
+            self.StyleSetSpec(stc.STC_MARKDOWN_HEADER4, buildStyle('commentblock') + ", bold")
+            self.StyleSetSpec(stc.STC_MARKDOWN_HEADER5, buildStyle('commentblock'))
+            self.StyleSetSpec(stc.STC_MARKDOWN_HEADER6, buildStyle('commentblock'))
+            self.StyleSetSpec(stc.STC_MARKDOWN_PRECHAR, buildStyle('default'))
+            self.StyleSetSpec(stc.STC_MARKDOWN_ULIST_ITEM, buildStyle('string'))
+            self.StyleSetSpec(stc.STC_MARKDOWN_OLIST_ITEM, buildStyle('triple'))
+            self.StyleSetSpec(stc.STC_MARKDOWN_BLOCKQUOTE, buildStyle('string'))
+            self.StyleSetSpec(stc.STC_MARKDOWN_STRIKEOUT, buildStyle('string'))
+            self.StyleSetSpec(stc.STC_MARKDOWN_HRULE, buildStyle('triple'))
+            self.StyleSetSpec(stc.STC_MARKDOWN_LINK, buildStyle('function'))
+            self.StyleSetSpec(stc.STC_MARKDOWN_CODE, buildStyle('default') + ",italic,bold")
+            self.StyleSetSpec(stc.STC_MARKDOWN_CODE2, buildStyle('default') + ",italic,bold")
+            self.StyleSetSpec(stc.STC_MARKDOWN_CODEBK, buildStyle('default') + ",italic,bold")
+        elif ext == "lua":
+            self.SetLexer(stc.STC_LEX_LUA)
+            self.SetStyleBits(self.GetStyleBitsNeeded())
+            self.SetKeyWords(0, "and break do else elseif for if in nil not or \
+                        repeat then until while function local end return true false ")
+            self.StyleSetSpec(stc.STC_LUA_DEFAULT, buildStyle('default'))
+            self.StyleSetSpec(stc.STC_LUA_COMMENT, buildStyle('comment'))
+            self.StyleSetSpec(stc.STC_LUA_COMMENTLINE, buildStyle('comment'))
+            self.StyleSetSpec(stc.STC_LUA_COMMENTDOC, buildStyle('commentblock'))
+            self.StyleSetSpec(stc.STC_LUA_NUMBER, buildStyle('number'))
+            self.StyleSetSpec(stc.STC_LUA_WORD, buildStyle('keyword'))
+            self.StyleSetSpec(stc.STC_LUA_STRING, buildStyle('string'))
+            self.StyleSetSpec(stc.STC_LUA_CHARACTER, buildStyle('string'))
+            self.StyleSetSpec(stc.STC_LUA_LITERALSTRING, buildStyle('triple'))
+            self.StyleSetSpec(stc.STC_LUA_PREPROCESSOR, buildStyle('default') + ",italic")
+            self.StyleSetSpec(stc.STC_LUA_OPERATOR, buildStyle('operator'))
+            self.StyleSetSpec(stc.STC_LUA_IDENTIFIER, buildStyle('default'))
+            self.StyleSetSpec(stc.STC_LUA_STRINGEOL, buildStyle('default') + ",bold")
+            self.StyleSetSpec(stc.STC_LUA_WORD2, buildStyle('pyokeyword'))
+            self.StyleSetSpec(stc.STC_LUA_WORD3, buildStyle('pyokeyword'))
+            self.StyleSetSpec(stc.STC_LUA_WORD4, buildStyle('pyokeyword'))
+            self.StyleSetSpec(stc.STC_LUA_WORD5, buildStyle('pyokeyword'))
+            self.StyleSetSpec(stc.STC_LUA_WORD6, buildStyle('pyokeyword'))
+            self.StyleSetSpec(stc.STC_LUA_WORD7, buildStyle('pyokeyword'))
+            self.StyleSetSpec(stc.STC_LUA_WORD8, buildStyle('pyokeyword'))
+            self.StyleSetSpec(stc.STC_LUA_LABEL, buildStyle('default') + ",italic,bold")
 
         self.SetEdgeColour(STYLES["lineedge"]['colour'])
         self.SetCaretForeground(STYLES['caret']['colour'])
@@ -3644,6 +3844,57 @@ class Editor(stc.StyledTextCtrl):
         # WxPython 3 needs the lexer to be set before folding property
         self.SetProperty("fold", "1")
 
+    def insertBlockHead(self):
+        pos = self.PositionFromLine(self.GetCurrentLine())
+        if self.GetLine(self.GetCurrentLine()).strip() == "":
+            self.InsertText(pos, "#-->")
+        else:
+            self.InsertText(pos, "#-->\n")
+
+    def insertBlockTail(self):
+        pos = self.GetLineEndPosition(self.GetCurrentLine())
+        if self.GetLine(self.GetCurrentLine()).strip() == "":
+            self.InsertText(pos, "#<--")
+        else:
+            self.InsertText(pos, "\n#<--")
+
+    def selectCodeBlock(self):
+        self.OnDoubleClick(None)
+
+    def OnDoubleClick(self, evt):
+        """
+        Double-click used to select chunk of code between #--> and #<--
+        """
+        if "#-->" in self.GetLine(self.GetCurrentLine()):
+            first = self.GetCurrentLine()
+            last = self.GetLineCount()
+            self.LineDown()
+            while (self.GetCurrentLine() < self.GetLineCount()):
+                if "#<--" in self.GetLine(self.GetCurrentLine()):
+                    last = self.GetCurrentLine() - 1
+                    break
+                self.LineDown()
+            self.SetSelection(self.GetLineEndPosition(first)+1, 
+                              self.GetLineEndPosition(last)+1)
+            if evt is not None:
+                evt.StopPropagation()
+        elif "#<--" in self.GetLine(self.GetCurrentLine()):
+            first = 0
+            last = self.GetCurrentLine() - 1
+            self.LineUp()
+            while (self.GetCurrentLine() > 0):
+                if "#-->" in self.GetLine(self.GetCurrentLine()):
+                    first = self.GetCurrentLine()
+                    break
+                self.LineUp()
+            self.SetSelection(self.GetLineEndPosition(first)+1, 
+                              self.GetLineEndPosition(last)+1)
+            if evt is not None:
+                evt.StopPropagation()
+        else:
+            if evt is not None:
+                evt.Skip()
+
     def OnQuickSearch(self, str, next=True):
         if self.GetSelection() != (0,0):
             self.SetSelection(self.GetSelectionEnd()-1, self.GetSelectionEnd())
@@ -4239,10 +4490,6 @@ class Editor(stc.StyledTextCtrl):
         elif evt.GetKeyCode() == ord('L') and ControlDown():
             self.GetParent().GetParent().GetParent().GetParent().GetParent().gotoLine(None)
             propagate = False
-        # Send line/selection to pyo background server
-        elif evt.GetKeyCode() == ord('T') and ControlDown():
-            self.GetParent().GetParent().GetParent().GetParent().GetParent().sendSelectionToBackgroundServer(None)
-            propagate = False
 
         # Process Return key --- automatic indentation
         elif evt.GetKeyCode() == wx.WXK_RETURN:
@@ -4323,7 +4570,7 @@ class Editor(stc.StyledTextCtrl):
         #     for i in range(self.GetLineCount()):
         #         pos = self.GetLineEndPosition(i)
         #         if self.GetCharAt(pos-1) != 172:
-        #             self.InsertTextUTF8(pos, "¬")
+        #             self.InsertTextUTF8(pos, "¬")
         self.moveMarkers()
         self.checkScrollbar()
         self.OnModified()
@@ -4691,7 +4938,7 @@ class OutputLogPanel(wx.Panel):
         self.processPopup.Append("%d :: %s" % (procID, filename))
         self.processPopup.SetStringSelection("%d :: %s" % (procID, filename))
         self.running += 1
-        self.runningLabel.SetLabel("Running: %d" % self.running)
+        self.runningLabel.SetLabel(" Running: %d" % self.running)
         self.editor.setLog("")
 
     def removeProcess(self, procID, filename):
@@ -4699,7 +4946,7 @@ class OutputLogPanel(wx.Panel):
         del self.mainPanel.mainFrame.processes[procID]
         self.processPopup.Delete(self.processPopup.GetItems().index(str))
         self.running -= 1
-        self.runningLabel.SetLabel("Running: %d" % self.running)
+        self.runningLabel.SetLabel(" Running: %d" % self.running)
 
     def killProcess(self, evt):
         str = self.processPopup.GetStringSelection()
@@ -4707,6 +4954,8 @@ class OutputLogPanel(wx.Panel):
             procID = int(str.split("::")[0].strip())
             thread = self.mainPanel.mainFrame.processes[procID][0]
             thread.kill()
+            if procID == 1000:
+                self.mainPanel.mainFrame.resetBackgroundServerMenu()
 
     def appendToLog(self, text):
         self.editor.appendToLog(text)
@@ -4778,12 +5027,13 @@ TOOL_REFRESH_TREE_ID = 12
 class ProjectTree(wx.Panel):
     """Project panel"""
     def __init__(self, parent, mainPanel, size):
-        wx.Panel.__init__(self, parent, -1, size=size, style=wx.WANTS_CHARS | wx.SUNKEN_BORDER | wx.EXPAND)
+        wx.Panel.__init__(self, parent, -1, size=size, 
+                          style=wx.WANTS_CHARS|wx.SUNKEN_BORDER|wx.EXPAND)
         self.SetMinSize((150, -1))
         self.mainPanel = mainPanel
 
         self.projectDict = {}
-        self.selected = None
+        self.selectedItem = None
         self.edititem = self.editfolder = self.itempath = self.scope = None
 
         tsize = (24, 24)
@@ -4797,16 +5047,20 @@ class ProjectTree(wx.Panel):
         toolbarbox = wx.BoxSizer(wx.HORIZONTAL)
         self.toolbar = wx.ToolBar(self, -1, size=(-1,36))
         self.toolbar.SetToolBitmapSize(tsize)
-        self.toolbar.AddLabelTool(TOOL_ADD_FILE_ID, "Add File", file_add_bmp, shortHelp="Add File")
+        self.toolbar.AddLabelTool(TOOL_ADD_FILE_ID, "Add File", 
+                                  file_add_bmp, shortHelp="Add File")
+        self.toolbar.AddLabelTool(TOOL_ADD_FOLDER_ID, "Add Folder", 
+                                  folder_add_bmp, shortHelp="Add Folder")
+        self.toolbar.AddLabelTool(TOOL_REFRESH_TREE_ID, "Refresh Tree", 
+                                  refresh_tree_bmp, shortHelp="Refresh Tree")
         self.toolbar.EnableTool(TOOL_ADD_FILE_ID, False)
-        self.toolbar.AddLabelTool(TOOL_ADD_FOLDER_ID, "Add Folder", folder_add_bmp, shortHelp="Add Folder")
-        self.toolbar.AddLabelTool(TOOL_REFRESH_TREE_ID, "Refresh Tree", refresh_tree_bmp, shortHelp="Refresh Tree")
         self.toolbar.Realize()
         toolbarbox.Add(self.toolbar, 1, wx.ALIGN_LEFT | wx.EXPAND, 0)
 
         tb2 = wx.ToolBar(self, -1, size=(-1,36))
         tb2.SetToolBitmapSize(tsize)
-        tb2.AddLabelTool(15, "Close Panel", close_panel_bmp, shortHelp="Close Panel")
+        tb2.AddLabelTool(15, "Close Panel", close_panel_bmp, 
+                         shortHelp="Close Panel")
         tb2.Realize()
         toolbarbox.Add(tb2, 0, wx.ALIGN_RIGHT, 0)
 
@@ -4817,30 +5071,35 @@ class ProjectTree(wx.Panel):
 
         self.sizer.Add(toolbarbox, 0, wx.EXPAND)
 
-        self.tree = wx.TreeCtrl(self, -1, (0, 26), size, wx.TR_DEFAULT_STYLE|wx.TR_HIDE_ROOT|wx.SUNKEN_BORDER|wx.EXPAND)
+        stls = wx.TR_DEFAULT_STYLE|wx.TR_HIDE_ROOT|wx.SUNKEN_BORDER|wx.EXPAND
+        self.tree = wx.TreeCtrl(self, -1, (0, 26), size, stls)
         self.tree.SetBackgroundColour(STYLES['background']['colour'])
 
         if PLATFORM == 'darwin':
-            self.tree.SetFont(wx.Font(11, wx.ROMAN, wx.NORMAL, wx.NORMAL, face=STYLES['face']))
-        elif PLATFORM == 'win32':
-            self.tree.SetFont(wx.Font(8, wx.ROMAN, wx.NORMAL, wx.NORMAL, face=STYLES['face']))
+            pt = 11
         else:
-            self.tree.SetFont(wx.Font(8, wx.ROMAN, wx.NORMAL, wx.NORMAL, face=STYLES['face']))
+            pt = 8
+        fnt = wx.Font(pt, wx.ROMAN, wx.NORMAL, wx.NORMAL, face=STYLES['face'])
+        self.tree.SetFont(fnt)
 
         self.sizer.Add(self.tree, 1, wx.EXPAND)
         self.SetSizer(self.sizer)
 
         isz = (12,12)
         self.il = wx.ImageList(isz[0], isz[1])
-        self.fldridx     = self.il.Add(wx.ArtProvider_GetBitmap(wx.ART_FOLDER,      wx.ART_OTHER, isz))
-        self.fldropenidx = self.il.Add(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN,   wx.ART_OTHER, isz))
-        self.fileidx     = self.il.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, isz))
+        bmp = wx.ArtProvider_GetBitmap(wx.ART_FOLDER, wx.ART_OTHER, isz)
+        self.fldridx = self.il.Add(bmp)
+        bmp = wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN, wx.ART_OTHER, isz)
+        self.fldropenidx = self.il.Add(bmp)
+        bmp = wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, isz)
+        self.fileidx = self.il.Add(bmp)
 
         self.tree.SetImageList(self.il)
         self.tree.SetSpacing(12)
         self.tree.SetIndent(6)
 
-        self.root = self.tree.AddRoot("EPyo_Project_tree", self.fldridx, self.fldropenidx, None)
+        self.root = self.tree.AddRoot("EPyo_Project_tree", self.fldridx, 
+                                      self.fldropenidx, None)
         self.tree.SetItemTextColour(self.root, STYLES['default']['colour'])
 
         self.tree.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnEndEdit)
@@ -4873,7 +5132,8 @@ class ProjectTree(wx.Panel):
         expanded = []
         self._tree_analyze(self.root, expanded)
         self.tree.DeleteAllItems()
-        self.root = self.tree.AddRoot("EPyo_Project_tree", self.fldridx, self.fldropenidx, None)
+        self.root = self.tree.AddRoot("EPyo_Project_tree", self.fldridx, 
+                                      self.fldropenidx, None)
         for folder, path in self.projectDict.items():
             self.loadFolder(path)
         self._tree_restore(self.root, expanded)
@@ -4881,62 +5141,48 @@ class ProjectTree(wx.Panel):
     def loadFolder(self, dirPath):
         folderName = os.path.split(dirPath)[1]
         self.projectDict[folderName] = dirPath
-        projectDir = {}
         self.mainPanel.mainFrame.showProjectTree(True)
-        for root, dirs, files in os.walk(dirPath):
-            if os.path.split(root)[1][0] != '.' and os.path.split(root)[1] != "build":
-                if root == dirPath:
-                    child = self.tree.AppendItem(self.root, folderName, self.fldridx, self.fldropenidx, None)
-                    self.tree.SetItemTextColour(child, STYLES['default']['colour'])
-                    if dirs:
-                        ddirs = [dir for dir in dirs if dir[0] != '.' and dir != "build"]
-                        for dir in sorted(ddirs):
-                            subfol = self.tree.AppendItem(child, "%s" % dir, self.fldridx, self.fldropenidx, None)
-                            projectDir[dir] = subfol
-                            self.tree.SetItemTextColour(subfol, STYLES['default']['colour'])
-                    if files:
-                        ffiles = [file for file in files if file[0] != '.' and not file.endswith("~") and os.path.splitext(file)[1].strip(".") in ALLOWED_EXT]
-                        for file in sorted(ffiles):
-                            item = self.tree.AppendItem(child, "%s" % file, self.fileidx, self.fileidx, None)
-                            self.tree.SetItemTextColour(item, STYLES['default']['colour'])
-                else:
-                    if os.path.split(root)[1] in projectDir.keys():
-                        parent = projectDir[os.path.split(root)[1]]
-                        if dirs:
-                            ddirs = [dir for dir in dirs if dir[0] != '.' and "build/" not in root]
-                            for dir in sorted(ddirs):
-                                subfol = self.tree.AppendItem(parent, "%s" % dir, self.fldridx, self.fldropenidx, None)
-                                projectDir[dir] = subfol
-                                self.tree.SetItemTextColour(subfol, STYLES['default']['colour'])
-                        if files:
-                            ffiles = [file for file in files if file[0] != '.' and not file.endswith("~") and os.path.splitext(file)[1].strip(".") in ALLOWED_EXT]
-                            for file in sorted(ffiles):
-                                item = self.tree.AppendItem(parent, "%s" % file, self.fileidx, self.fileidx, None)
-                                self.tree.SetItemTextColour(item, STYLES['default']['colour'])
-        self.tree.SortChildren(self.root)
-        self.tree.SortChildren(child)
+        item = self.tree.AppendItem(self.root, folderName, self.fldridx, 
+                                    self.fldropenidx, None)
+        self.tree.SetPyData(item, dirPath)
+        self.tree.SetItemTextColour(item, STYLES['default']['colour'])
+        self.buildRecursiveTree(dirPath, item)
+
+    def buildRecursiveTree(self, dir, item):
+        elems = [f for f in os.listdir(dir) if f[0] != "."]
+        for elem in sorted(elems):
+            child = None
+            path = os.path.join(dir, elem)
+            if os.path.isfile(path):
+                if not path.endswith("~") and \
+                       os.path.splitext(path)[1].strip(".") in ALLOWED_EXT:
+                    child = self.tree.AppendItem(item, elem, self.fileidx, 
+                                                 self.fileidx)
+                    self.tree.SetPyData(child, os.path.join(dir, path))
+            elif os.path.isdir(path):
+                if elem != "build":
+                    child = self.tree.AppendItem(item, elem, self.fldridx, 
+                                                 self.fldropenidx)
+                    self.tree.SetPyData(child, os.path.join(dir, path))
+                    self.buildRecursiveTree(path, child)
+            if child is not None:
+                self.tree.SetItemTextColour(child, STYLES['default']['colour'])
 
     def onAdd(self, evt):
         id = evt.GetId()
         treeItemId = self.tree.GetSelection()
-        if self.selected != None:
-            for dirPath in self.projectDict.keys():
-                for root, dirs, files in os.walk(self.projectDict[dirPath]):
-                    if self.selected == os.path.split(root)[1]:
-                        self.scope = root
-                        break
-                    elif self.selected in dirs:
-                        self.scope = os.path.join(root, self.selected)
-                        break
-                    elif self.selected in files:
-                        self.scope = root
-                        treeItemId = self.tree.GetItemParent(treeItemId)
-                        break
-                if self.scope != None:
-                    break
-        elif self.selected == None and id == TOOL_ADD_FOLDER_ID:
-            dlg = wx.DirDialog(self, "Choose a directory where to save your folder:",
-                              defaultPath=os.path.expanduser("~"), style=wx.DD_DEFAULT_STYLE)
+        if self.selectedItem != None:
+            selPath = self.tree.GetPyData(self.selectedItem)
+            if os.path.isdir(selPath):
+                self.scope = selPath
+            elif os.path.isfile(selPath):
+                treeItemId = self.tree.GetItemParent(treeItemId)
+                self.scope = self.tree.GetPyData(treeItemId)
+        elif self.selectedItem == None and id == TOOL_ADD_FOLDER_ID:
+            dlg = wx.DirDialog(self, 
+                               "Choose directory where to save your folder:",
+                               defaultPath=os.path.expanduser("~"), 
+                               style=wx.DD_DEFAULT_STYLE)
             if dlg.ShowModal() == wx.ID_OK:
                 self.scope = dlg.GetPath()
                 dlg.Destroy()
@@ -4945,11 +5191,14 @@ class ProjectTree(wx.Panel):
                 return
             treeItemId = self.tree.GetRootItem()
         if id == TOOL_ADD_FILE_ID:
-            item = self.tree.AppendItem(treeItemId, "Untitled", self.fileidx, self.fileidx, None)
+            item = self.tree.AppendItem(treeItemId, "Untitled", self.fileidx, 
+                                        self.fileidx, None)
             self.edititem = item
         else:
-            item = self.tree.AppendItem(treeItemId, "Untitled", self.fldridx, self.fldropenidx, None)
+            item = self.tree.AppendItem(treeItemId, "Untitled", self.fldridx, 
+                                        self.fldropenidx, None)
             self.editfolder = item
+        self.tree.SetPyData(item, os.path.join(self.scope, "Untitled"))
         self.tree.SetItemTextColour(item, STYLES['default']['colour'])
         self.tree.EnsureVisible(item)
         if PLATFORM == "darwin":
@@ -4978,14 +5227,8 @@ class ProjectTree(wx.Panel):
     def OnRightDown(self, event):
         pt = event.GetPosition();
         self.edititem, flags = self.tree.HitTest(pt)
-        item = self.edititem
-        if item:
-            itemlist = []
-            while self.tree.GetItemText(item) not in self.projectDict.keys():
-                itemlist.insert(0, self.tree.GetItemText(item))
-                item = self.tree.GetItemParent(item)
-            itemlist.insert(0, self.projectDict[self.tree.GetItemText(item)])
-            self.itempath = os.path.join(*itemlist)
+        if self.edititem:
+            self.itempath = self.tree.GetPyData(self.edititem)
             self.select(self.edititem)
             self.tree.EditLabel(self.edititem)
         else:
@@ -4995,14 +5238,18 @@ class ProjectTree(wx.Panel):
         if self.edititem and self.itempath:
             self.select(self.edititem)
             head, tail = os.path.split(self.itempath)
-            newpath = os.path.join(head, event.GetLabel())
-            os.rename(self.itempath, newpath)
+            newlabel = event.GetLabel()
+            if newlabel != "":
+                newpath = os.path.join(head, event.GetLabel())
+                os.rename(self.itempath, newpath)
+                self.tree.SetPyData(self.edititem, newpath)
         elif self.edititem and self.scope:
             newitem = event.GetLabel()
             if not newitem:
                 newitem = "Untitled"
                 wx.CallAfter(self.tree.SetItemText, self.edititem, newitem)
             newpath = os.path.join(self.scope, newitem)
+            self.tree.SetPyData(self.edititem, newpath)
             f = open(newpath, "w")
             f.close()
             self.mainPanel.addPage(newpath)
@@ -5012,8 +5259,9 @@ class ProjectTree(wx.Panel):
                 newitem = "Untitled"
                 wx.CallAfter(self.tree.SetItemText, self.editfolder, newitem)
             newpath = os.path.join(self.scope, newitem)
+            self.tree.SetPyData(self.editfolder, newpath)
             os.mkdir(newpath)
-            if self.selected == None:
+            if self.selectedItem == None:
                 self.projectDict[newitem] = self.scope
         self.edititem = self.editfolder = self.itempath = self.scope = None
 
@@ -5039,25 +5287,17 @@ class ProjectTree(wx.Panel):
     def openPage(self, item):
         hasChild = self.tree.ItemHasChildren(item)
         if not hasChild:
-            parent = None
-            ritem = item
-            filename = self.tree.GetItemText(ritem)
-            while self.tree.GetItemParent(ritem) != self.tree.GetRootItem():
-                ritem = self.tree.GetItemParent(ritem)
-                parent = self.tree.GetItemText(ritem)
-                filename = os.path.join(parent, filename)
-            dirPath = os.path.split(self.projectDict[parent])[0]
-            path = os.path.join(dirPath, filename)
+            path = self.tree.GetPyData(item)
             self.mainPanel.addPage(path)
 
     def select(self, item):
         self.tree.SelectItem(item)
-        self.selected = self.tree.GetItemText(item)
+        self.selectedItem = item
         self.toolbar.EnableTool(TOOL_ADD_FILE_ID, True)
 
     def unselect(self):
         self.tree.UnselectAll()
-        self.selected = None
+        self.selectedItem = None
         self.toolbar.EnableTool(TOOL_ADD_FILE_ID, False)
 
     def onCloseProjectPanel(self, evt):
@@ -5065,7 +5305,8 @@ class ProjectTree(wx.Panel):
 
 class MarkersListScroll(scrolled.ScrolledPanel):
     def __init__(self, parent, id=-1, pos=(25,25), size=(500,400)):
-        scrolled.ScrolledPanel.__init__(self, parent, wx.ID_ANY, pos=(0,0), size=size, style=wx.SUNKEN_BORDER)
+        scrolled.ScrolledPanel.__init__(self, parent, wx.ID_ANY, pos=(0,0), 
+                                        size=size, style=wx.SUNKEN_BORDER)
         self.parent = parent
         self.SetBackgroundColour(STYLES['background']['colour'])
         self.arrow_bit = catalog['left_arrow.png'].GetBitmap()
@@ -5254,7 +5495,7 @@ class PreferencesDialog(wx.Dialog):
 
         mainSizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND|wx.BOTTOM|wx.LEFT|wx.RIGHT, 5)
 
-        lbl = wx.StaticText(self, label="Background Pyo Server")
+        lbl = wx.StaticText(self, label="=== Background Pyo Server ===")
         lbl.SetFont(font)
         mainSizer.Add(lbl, 0, wx.BOTTOM|wx.LEFT|wx.RIGHT, 10)
 
@@ -5265,59 +5506,76 @@ class PreferencesDialog(wx.Dialog):
         self.server_args = wx.TextCtrl(self, size=(500,-1), value=BACKGROUND_SERVER_ARGS)
         self.server_args.SetFont(entryfont)
         ctrlSizer.Add(self.server_args, 0, wx.ALL|wx.EXPAND, 5)
-        but = wx.Button(self, id=wx.ID_ANY, label="Restore default args")
+        but = wx.Button(self, id=wx.ID_ANY, label=" Restore default args ")
         but.Bind(wx.EVT_BUTTON, self.setServerDefaultArgs)
         ctrlSizer.Add(but, 0, wx.ALL, 5)            
         mainSizer.Add(ctrlSizer, 0, wx.BOTTOM|wx.LEFT|wx.RIGHT, 5)
 
-        popupSizer = wx.FlexGridSizer(2, 3, 5, 10)
-        for label in ["Output Driver", "Input Driver", "Midi Interface"]:
+        popupSizer = wx.FlexGridSizer(2, 4, 5, 10)
+        for label in ["Input Driver", "Output Driver", "Midi Input", "Midi Output"]:
             lbl = wx.StaticText(self, label=label)
             lbl.SetFont(font)
             popupSizer.Add(lbl)
 
-        preferedDriver = PREFERENCES.get("background_server_out_device", "")
-        driverList, driverIndexes = pa_get_output_devices()
-        driverList = [ensureNFD(driver) for driver in driverList]
-        defaultDriver = pa_get_default_output()
-        self.popupOutDriver = wx.Choice(self, choices=driverList)
-        popupSizer.Add(self.popupOutDriver)
-        if preferedDriver and preferedDriver in driverList:
-            driverIndex = driverIndexes[driverList.index(preferedDriver)]
-            self.popupOutDriver.SetStringSelection(preferedDriver)
-        elif defaultDriver:
-            self.popupOutDriver.SetSelection(driverIndexes.index(defaultDriver))
-
+        cX = 160
         preferedDriver = PREFERENCES.get("background_server_in_device", "")
         driverList, driverIndexes = pa_get_input_devices()
         driverList = [ensureNFD(driver) for driver in driverList]
         defaultDriver = pa_get_default_input()
-        self.popupInDriver = wx.Choice(self, choices=driverList)
-        popupSizer.Add(self.popupInDriver)
+        self.popupInDriver = wx.Choice(self, choices=driverList, size=(cX,-1))
+        popupSizer.Add(self.popupInDriver, 1, wx.EXPAND, 5)
         if preferedDriver and preferedDriver in driverList:
             driverIndex = driverIndexes[driverList.index(preferedDriver)]
             self.popupInDriver.SetStringSelection(preferedDriver)
         elif defaultDriver:
             self.popupInDriver.SetSelection(driverIndexes.index(defaultDriver))
 
+        preferedDriver = PREFERENCES.get("background_server_out_device", "")
+        driverList, driverIndexes = pa_get_output_devices()
+        driverList = [ensureNFD(driver) for driver in driverList]
+        defaultDriver = pa_get_default_output()
+        self.popupOutDriver = wx.Choice(self, choices=driverList, size=(cX,-1))
+        popupSizer.Add(self.popupOutDriver, 1, wx.EXPAND, 5)
+        if preferedDriver and preferedDriver in driverList:
+            driverIndex = driverIndexes[driverList.index(preferedDriver)]
+            self.popupOutDriver.SetStringSelection(preferedDriver)
+        elif defaultDriver:
+            self.popupOutDriver.SetSelection(driverIndexes.index(defaultDriver))
+
+        # TODO: Added "all" interfaces option in input and output
         preferedDriver = PREFERENCES.get("background_server_midiin_device", "")
         driverList, driverIndexes = pm_get_input_devices()
         driverList = [ensureNFD(driver) for driver in driverList]
         if driverList != []:
             defaultDriver = pm_get_default_input()
-            self.popupMidiInDriver = wx.Choice(self, choices=driverList)
-            popupSizer.Add(self.popupMidiInDriver)
+            self.popupMidiInDriver = wx.Choice(self, choices=driverList, size=(cX,-1))
             if preferedDriver and preferedDriver in driverList:
                 driverIndex = driverIndexes[driverList.index(preferedDriver)]
                 self.popupMidiInDriver.SetStringSelection(preferedDriver)
-            elif defaultDriver:
+            elif defaultDriver >= 0:
                 self.popupMidiInDriver.SetSelection(driverIndexes.index(defaultDriver))
         else:
             self.popupMidiInDriver = wx.Choice(self, choices=["No Interface"])
-            popupSizer.Add(self.popupMidiInDriver)
             self.popupMidiInDriver.SetSelection(0)
+        popupSizer.Add(self.popupMidiInDriver, 1, wx.EXPAND, 5)
+
+        preferedDriver = PREFERENCES.get("background_server_midiout_device", "")
+        driverList, driverIndexes = pm_get_output_devices()
+        driverList = [ensureNFD(driver) for driver in driverList]
+        if driverList != []:
+            defaultDriver = pm_get_default_output()
+            self.popupMidiOutDriver = wx.Choice(self, choices=driverList, size=(cX,-1))
+            if preferedDriver and preferedDriver in driverList:
+                driverIndex = driverIndexes[driverList.index(preferedDriver)]
+                self.popupMidiOutDriver.SetStringSelection(preferedDriver)
+            elif defaultDriver >= 0:
+                self.popupMidiOutDriver.SetSelection(driverIndexes.index(defaultDriver))
+        else:
+            self.popupMidiOutDriver = wx.Choice(self, choices=["No Interface"])
+            self.popupMidiOutDriver.SetSelection(0)
+        popupSizer.Add(self.popupMidiOutDriver, 1, wx.EXPAND, 5)
 
-        mainSizer.Add(popupSizer, 0, wx.BOTTOM|wx.LEFT|wx.RIGHT, 10)
+        mainSizer.Add(popupSizer, 0, wx.EXPAND|wx.BOTTOM|wx.LEFT|wx.RIGHT, 10)
 
         mainSizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND|wx.BOTTOM|wx.LEFT|wx.RIGHT, 5)
 
@@ -5327,8 +5585,8 @@ class PreferencesDialog(wx.Dialog):
         ctrlSizer = wx.BoxSizer(wx.HORIZONTAL)
         self.entry_ext = wx.TextCtrl(self, size=(500,-1), value=", ".join(ALLOWED_EXT))
         self.entry_ext.SetFont(entryfont)
-        ctrlSizer.Add(self.entry_ext, 0, wx.ALL|wx.EXPAND, 5)
-        mainSizer.Add(ctrlSizer, 0, wx.BOTTOM|wx.LEFT|wx.RIGHT, 5)
+        ctrlSizer.Add(self.entry_ext, 1, wx.ALL|wx.EXPAND, 5)
+        mainSizer.Add(ctrlSizer, 0, wx.EXPAND|wx.BOTTOM|wx.LEFT|wx.RIGHT, 5)
 
         btnSizer = self.CreateButtonSizer(wx.CANCEL|wx.OK)
  
@@ -5409,6 +5667,9 @@ class PreferencesDialog(wx.Dialog):
         midiDevice = self.popupMidiInDriver.GetStringSelection()
         if midiDevice != "No Interface":
             PREFERENCES["background_server_midiin_device"] = midiDevice
+        midiDevice = self.popupMidiOutDriver.GetStringSelection()
+        if midiDevice != "No Interface":
+            PREFERENCES["background_server_midiout_device"] = midiDevice
 
 class STCPrintout(wx.Printout):
     """Specific printing support of the wx.StyledTextCtrl for the wxPython
@@ -5822,7 +6083,8 @@ class STCPrintout(wx.Printout):
         if self.border_around_text:
             dc.SetPen(wx.BLACK_PEN)
             dc.SetBrush(wx.TRANSPARENT_BRUSH)
-            dc.DrawRectangle(self.x1, self.y1, self.x2 - self.x1 + 1, self.y2 - self.y1 + 1)
+            dc.DrawRectangle(self.x1, self.y1, self.x2 - self.x1 + 1, 
+                             self.y2 - self.y1 + 1)
 
 class MyFileDropTarget(wx.FileDropTarget):
     def __init__(self, window):
@@ -5844,12 +6106,14 @@ class EPyoApp(wx.App):
         wx.App.__init__(self, *args, **kwargs)
 
     def OnInit(self):
-        X,Y = wx.SystemSettings.GetMetric(wx.SYS_SCREEN_X), wx.SystemSettings.GetMetric(wx.SYS_SCREEN_Y)
+        X = wx.SystemSettings.GetMetric(wx.SYS_SCREEN_X)
+        Y = wx.SystemSettings.GetMetric(wx.SYS_SCREEN_Y)
         if X < 850: X -= 50
         else: X = 850
         if Y < 750: Y -= 50
         else: Y = 750
-        self.frame = MainFrame(None, -1, title='E-Pyo Editor', pos=(10,25), size=(X, Y))
+        self.frame = MainFrame(None, -1, title='E-Pyo Editor', 
+                               pos=(10,25), size=(X, Y))
         self.frame.Show()
         return True
 
diff --git a/utils/info.plist b/utils/info.plist
index 8b9e960..70c56f7 100644
--- a/utils/info.plist
+++ b/utils/info.plist
@@ -32,17 +32,17 @@
 	<key>CFBundleIdentifier</key>
 	<string>org.pythonmac.unspecified.E-Pyo</string>
 	<key>CFBundleInfoDictionaryVersion</key>
-	<string>0.7.5</string>
+	<string>0.7.6</string>
 	<key>CFBundleName</key>
 	<string>E-Pyo</string>
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>0.7.5</string>
+	<string>0.7.6</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>0.7.5</string>
+	<string>0.7.6</string>
 	<key>LSHasLocalizedDisplayName</key>
 	<false/>
 	<key>NSAppleScriptEnabled</key>

-- 
python-pyo packaging



More information about the pkg-multimedia-commits mailing list