SETFLOAT(atom, f)This macro sets the type of
atom
to A_FLOAT
and stores the numerical value f
in this atom.
SETSYMBOL(atom, s)This macro sets the type of
atom
to A_SYMBOL
and stores the symbolic pointer s
in this atom.
SETPOINTER(atom, pt)This macro sets the type of
atom
to A_POINTER
and stores the pointer pt
in this atom.
t_float atom_getfloat(t_atom *a);If the type of the atom
a
is A_FLOAT
,
the numerical value of this atom else ``0.0'' is returned.
t_float atom_getfloatarg(int which, int argc, t_atom *argv)If the type of the atom - that is found at in the atom-list
argv
with the length argc
at the place which
-
is A_FLOAT
, the numerical value of this atom else ``0.0'' is returned.
t_int atom_getint(t_atom *a);If the type of the atom
a
is A_FLOAT
,
its numerical value is returned as integer else ``0'' is returned.
t_symbol atom_getsymbol(t_atom *a);If the type of the atom
a
is A_SYMBOL
,
a pointer to this symbol is returned, else a null-pointer ``0'' is returned.
t_symbol *atom_gensym(t_atom *a);If the type of the atom
a
is A_SYMBOL
,
a pointer to this symbol is returned.
Atoms of a different type, are ``reasonably'' converted into a string. This string is - on demand - inserted into the symbol-table. A pointer to this symbol is returned.
void atom_string(t_atom *a, char *buf, unsigned int bufsize);Converts an atom
a
into a C-string buf
.
The memory to this char-Buffer has to be reserved manually and
its length has to be declared in bufsize
.
t_symbol *gensym(char *s);Checks, whether the C-string
*s
has already been inserted into the symbol-table.
If no entry exists, it is created.
A pointer to the symbol is returned.
t_class *class_new(t_symbol *name, t_newmethod newmethod, t_method freemethod, size_t size, int flags, t_atomtype arg1, ...);Generates a class with the symbolic name
name
.
newmethod
is the constructor that creates an instance of the class and
returns a pointer to this instance.
If memory is reserved dynamically, this memory has to be freed by the
destructor-method freemethod
(without any return argument),
when the object is destroyed.
size
is the static size of the class-dataspace,
that is returned by sizeof(t_mydata)
.
flags
define the presentation of the graphical object.
A (more or less arbitrary) combination of following objects is possible:
flag | description |
CLASS_DEFAULT |
a normal object with one inlet |
CLASS_PD |
object (without graphical presentation) |
CLASS_GOBJ |
pure graphical object (like arrays, graphs,...) |
CLASS_PATCHABLE |
a normal object (with one inlet) |
CLASS_NOINLET |
the default inlet is suppressed |
Flags the description of which is printed in italic are of small importance for writing externals.
The remaining arguments arg1,...
define the
types of object-arguments passed at the creation of a class-object.
A maximum of six typechecked arguments can be passed to an object.
The list of argument-types are terminated by ``0''.
Possible types of arguments are:
A_DEFFLOAT |
a numerical value |
A_DEFSYMBOL |
a symbolical value |
A_GIMME |
a list of atoms of arbitrary length and types |
If more than six arguments are to be passed,
A_GIMME
has to be used and a manual type-check has to be made.
void class_addmethod(t_class *c, t_method fn, t_symbol *sel, t_atomtype arg1, ...);Adds a method
fn
for a selector sel
to a class c
.
The remaining arguments arg1,...
define the
types of the list of atoms that follow the selector.
A maximum of six type-checked arguments can be passed.
If more than six arguments are to be passed,
A_GIMME
has to be used and a manual type-check has to be made.
The list of arguments is terminated by ``0''.
Possible types of arguments are:
A_DEFFLOAT |
a numerical value |
A_DEFSYMBOL |
a symbolical value |
A_POINTER |
a pointer |
A_GIMME |
a list of atoms of arbitrary length and types |
void class_addbang(t_class *c, t_method fn);Adds a method
fn
for ``bang''-messages to the class c
.
The argument of the ``bang''-method is a pointer to the class-dataspace:
void my_bang_method(t_mydata *x);
void class_addfloat(t_class *c, t_method fn);Adds a method
fn
for ``float''-messages to the class c
.
The arguments of the ``float''-method is a pointer to the class-dataspace and a floatingpoint-argument:
void my_float_method(t_mydata *x, t_floatarg f);
void class_addsymbol(t_class *c, t_method fn);Adds a method
fn
for ``symbol''-messages to the class c
.
The arguments of the ``symbol''-method is a pointer to the class-dataspace and a pointer to the passed symbol:
void my_symbol_method(t_mydata *x, t_symbol *s);
void class_addpointer(t_class *c, t_method fn);Adds a method
fn
for ``pointer''-messages to the class c
.
The arguments of the ``pointer''-method is a pointer to the class-dataspace and a pointer to a pointer:
void my_pointer_method(t_mydata *x, t_gpointer *pt);
void class_addlist(t_class *c, t_method fn);Adds a method
fn
for ``list''-messages to the class c
.
The arguments of the ``list''-method are - apart from a pointer to the class-dataspace -
a pointer to the selector-symbol (always &s_list
),
the number of atoms and a pointer to the list of atoms:
void my_list_method(t_mydata *x,
t_symbol *s, int argc, t_atom *argv);
void class_addanything(t_class *c, t_method fn);Adds a method
fn
for an arbitrary message to the class c
.
The arguments of the anything-method are - apart from a pointer to the class-dataspace - a pointer to the selector-symbol, the number of atoms and a pointer to the list of atoms:
void my_any_method(t_mydata *x,
t_symbol *s, int argc, t_atom *argv);
void class_addcreator(t_newmethod newmethod, t_symbol *s, t_atomtype type1, ...);Adds a creator-symbol
s
, alternative to the symbolic classname,
to the constructor newmethod
.
Thus, objects can be created either by their ``real'' classname or
an alias-name (p.e. an abbreviation, like the internal ``float'' resp. ``f'').
The ``0''-terminated list of types corresponds to that of class_new
.
void class_sethelpsymbol(t_class *c, t_symbol *s);
If a pd-object is right-clicked, a help-patch for the corresponding objectclass can be opened. By default this is a patch with the symbolic classname in the directory ``doc/5.reference/''.
The name of the help-patch for the class that is pointed to by c
is changed to the symbol s
.
Therefore, several similar classes can share a single help-patch.
Path-information is relative to the default helppath doc/5.reference/.
t_pd *pd_new(t_class *cls);Generates a new instance of the class
cls
and
returns a pointer to this instance.
t_object
-type is initialized.
This variable has to be passed as the owner
-object to the
various inlet- and outlet-routines.
t_inlet *inlet_new(t_object *owner, t_pd *dest, t_symbol *s1, t_symbol *s2);Generates an additional ``active'' inlet for the object that is pointed at by
owner
.
Generally, dest
points at ``owner.ob_pd
''.
The selector s1
at the new inlet is substituted by the selector s2
.
If a message with selector s1
appears at the new inlet,
the class-method for the selector s2
is called.
This means
class_addmethod
in the setup-routine.
Using an empty symbol (gensym("")
) as selector
makes it impossible to address a right inlet via the leftmost one.
t_inlet *floatinlet_new(t_object *owner, t_float *fp);Generates a new ``passive'' inlet for the object that is pointed at by
owner
.
This inlet enables numerical values to be written directly into the
memory fp
, without calling a dedicated method.
t_inlet *symbolinlet_new(t_object *owner, t_symbol **sp);Generates a new ``passive'' inlet for the object that is pointed at by
owner
.
This inlet enables symbolic values to be written directly into the
memory *sp
, without calling a dedicated method.
t_inlet *pointerinlet_new(t_object *owner, t_gpointer *gp);Generates a new ``passive'' inlet for the object that is pointed at by
owner
.
This inlet enables pointer to be written directly into the
memory gp
, without calling a dedicated method.
t_outlet *outlet_new(t_object *owner, t_symbol *s);Generates a new outlet for the object that is pointed at by
owner
.
The Symbol s
indicates the type of the outlet.
symbol | symbol-addresse | outlet-type |
``bang'' | &s_bang |
message (bang) |
``float'' | &s_float |
message (float) |
``symbol'' | &s_symbol |
message (symbol) |
``pointer'' | &s_gpointer |
message (pointer) |
``list'' | &s_list |
message (list) |
-- | 0 | message |
``signal'' | &s_signal |
signal |
There are no real differences between outlets of the various message-types.
At any rate, it makes code more easily readable,
if the use of outlet is shown at creation-time.
For outlets for any messages a null-pointer is used.
Signal-outlet must be declared with &s_signal
.
Variables if the type t_object
provide pointer to one outlet.
Whenever a new outlet is generated, its address is stored in the
objectvariable (*owner).ob_outlet
.
If more than one message-outlet is needed,
the outlet-pointers that are returned by outlet_new
have to be stored manually in the dataspace
to address the given outlets.
void outlet_bang(t_outlet *x);Outputs a ``bang''-message at the outlet specified by
x
.
void outlet_float(t_outlet *x, t_float f);Outputs a ``float''-message with the numeric value
f
at the outlet specified by x
.
void outlet_symbol(t_outlet *x, t_symbol *s);Outputs a ``symbol''-message with the symbolic value
s
at the outlet specified by x
.
void outlet_pointer(t_outlet *x, t_gpointer *gp);Outputs a ``pointer''-message with the pointer
gp
at the outlet specified by x
.
void outlet_list(t_outlet *x, t_symbol *s, int argc, t_atom *argv);Outputs a ``list''-message at the outlet specified by
x
.
The list contains argc
atoms.
argv
points to the first element of the atom-list.
Independet of the symbol s
, the selector ``list'' will precede
the list.
To make the code more readable,
s
should point to the symbol list
(either via gensym("list")
or via &s_list
)
void outlet_anything(t_outlet *x, t_symbol *s, int argc, t_atom *argv);Outputs a message at the outlet specified by
x
.
The message-selector is specified with s
.
It is followed by argc
atoms.
argv
points to the first element of the atom-list.
Whenever pd's audioengine is started, all objects that provide a ``dsp''-method are identified as instances of signalclasses.
void my_dsp_method(t_mydata *x, t_signal **sp)
In the ``dsp''-method a classmethod for signal-processing
is added to the DSP-tree by the function dsp_add
.
Apart from the dataspace x
of the object,
an array of signals is passed.
The signals in the array are arranged in such a way,
that they can be read in the graphical representation of the object
clockwisely.
In case there are both two in- and out-signals, this means:
pointer | to signal |
sp[0] | left in-signal |
sp[1] | right in-signal |
sp[2] | right out-signal |
sp[3] | left out-signal |
The signalstructure contains apart from other things:
structure-element | description |
s_n |
length of the signalvector |
s_vec |
pointer to the signalvector |
The signalvector is an array of samples of type t_sample
.
t_int *my_perform_routine(t_int *w)
A pointer w
to an array (of integer) is passed to
the perform-routine that is inserted into the DSP-tree by class_add
.
In this array the pointers that are passed via dsp_add
are stored.
These pointers have to be casted back to their original type.
The first pointer is stored at w[1]
!!!
The perform-routine has to return a pointer to integer,
that points directly behind the memory, where the object's pointers are stored.
This means, that the return-argument equals the routine's argument w
plus the number of used pointers
(as defined in the second argument of dsp_add
) plus one.
CLASS_MAINSIGNALIN(<class_name>, <class_data>, <f>);The macro
CLASS_MAINSIGNALIN
declares,
that the class will use signal-inlets.
The first macro-argument is a pointer to the signal-class. The second argument is the type of the class-dataspace. The third argument is a (dummy-)floatingpoint-variable of the dataspace, that is needed to automatically convert ``float''-messages into signals if no signal is present at the signal-inlet.
No ``float''-methods can be used for signal-inlets, that are created this way.
void dsp_add(t_perfroutine f, int n, ...);Adds the perform-routine
f
to the DSP-tree.
The perform-routine is called at each DSP-cycle.
The second argumentn
defines the number of following pointer-arguments
Which pointers to which data are passes is not limited. Generally, pointers to the dataspace of the object and to the signal-vectors are reasonable. The length of the signal-vectors should also be passed to manipulate signals effectively.
float sys_getsr(void);Returns the samplerate of the system.
void *getbytes(size_t nbytes);Reserves
nbytes
bytes and returns a pointer to the allocated memory.
void *copybytes(void *src, size_t nbytes);Copies
nbytes
bytes from *src
into a newly allocated memory.
The address of this memory is returned.
void freebytes(void *x, size_t nbytes);Frees
nbytes
bytes at address *x
.
void post(char *fmt, ...);
Writes a C-string to the standarderror (shell).
void error(char *fmt, ...);
Writes a C-string as an error-message to the standarderror (shell).
The object that has output the error-message is marked and can be identified via the pd-menu Find->Find last error.