1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
|
# py/pyext - python script objects for PD and MaxMSP
#
# Copyright (c) 2002-2007 Thomas Grill (gr@grrrr.org)
# For information on usage and redistribution, and for a DISCLAIMER OF ALL
# WARRANTIES, see the file, "license.txt," in this distribution.
#
"""This is an example script for the py/pyext object's basic functionality.
pyext Usage:
- Import pyext
- Inherit your class from pyext._class
- Specfiy the number of inlets and outlets:
Use the class members (variables) _inlets and _outlets
If not given they default to 1
You can also use class methods with the same names to return the respective number
- Constructors/Destructors
You can specify an __init__ constructor and/or an __del__ destructor.
The constructor will be called with the object's arguments
e.g. if your PD or MaxMSP object looks like
[pyext script class arg1 arg2 arg3]
then the __init__(self,*args) function will be called with a tuple argument
args = (arg1,arg2,arg3)
With this syntax, you will have to give at least one argument.
By defining the constructor as __init__(self,*args) you can also initialize
the class without arguments.
- Methods called by pyext
The general format is 'tag_inlet(self,arg)' resp. 'tag_inlet(self,*args)':
tag is the PD or MaxMSP message header.. either bang, float, list etc.
inlet is the inlet (starting from 1) from which messages are received.
args is a tuple which corresponds to the content of the message. args can be omitted.
The inlet index can be omitted. The method name then has the format 'tag_(self,inlet,args)'.
Here, the inlet index is a additional parameter to the method
You can also set up methods which react on any message. These have the special forms
_anything_inlet(self,*args)
or
_anything_(self,inlet,*args)
Please see below for examples.
Any return values are ignored - use _outlet (see below).
Generally, you should avoid method_, method_xx forms for your non-pyext class methods.
Identifiers (variables and functions) with leading underscores are reserved for pyext.
- Send messages to outlets:
Use the inherited _outlet method.
You can either use the form
self._outlet(outlet,arg1,arg2,arg3,arg4) ... where all args are atoms (no sequence types!)
or
self._outlet(outlet,arg) ... where arg is a sequence containing only atoms
Do not use _outlet inside __init__, since the outlets have not been created at that time.
- Use pyext functions and methods:
See the __doc__ strings of the pyext module and the pyext._class base class.
"""
try:
import pyext
except:
print "ERROR: This script must be loaded by the PD/Max pyext external"
#################################################################
class ex1(pyext._class):
"""Example of a simple class which receives messages and prints to the console"""
# number of inlets and outlets
_inlets=3
_outlets=0
# methods for first inlet
def bang_1(self):
print "Bang into first inlet"
def int_1(self,f):
print "Integer",f,"into first inlet"
def float_1(self,f):
print "Float",f,"into first inlet"
def list_1(self,*s):
print "List",s,"into first inlet"
# methods for second inlet
def hey_2(self):
print "Tag 'hey' into second inlet"
def ho_2(self):
print "Tag 'ho' into second inlet"
def lets_2(self):
print "Tag 'lets' into second inlet"
def go_2(self):
print "Tag 'go' into second inlet"
def _anything_2(self,*args):
print "Some other message into second inlet:",args
# methods for third inlet
def onearg_3(self,a):
print "Tag 'onearg' into third inlet:",a
def twoargs_3(self,*a):
if len(a) == 2:
print "Tag 'twoargs' into third inlet:",a[0],a[1]
else:
print "Tag 'twoargs': wrong number of arguments"
def threeargs_3(self,*a):
if len(a) == 3:
print "Tag 'threeargs' into third inlet",a[0],a[1],a[2]
else:
print "Tag 'threeargs': wrong number of arguments"
def varargs_3(self,*args):
# with *args there can be arguments or not
print "Tag 'varargs' into third inlet",args
#################################################################
class ex2(pyext._class):
"""Example of a simple class which receives messages and writes to outlets"""
# number of inlets and outlets
_inlets=3
_outlets=2
# methods for all inlets
def hello_(self,n):
print "Tag 'hello' into inlet",n
def _anything_(self,n,*args):
print "Message into inlet",n,":",args
# methods for first inlet
def float_1(self,f):
self._outlet(2,f)
# methods for second inlet
def float_2(self,f):
self._outlet(1,f)
#################################################################
# helper function - determine whether argument is a numeric type
def isNumber(value):
import types
if type(value) in (types.FloatType, types.IntType, types.LongType):
return 1
else:
return 0
class ex3(pyext._class):
"""Example of a simple class doing a typical number addition
It uses a constructor and a class member as temporary storage.
"""
# number of inlets and outlets
_inlets=2
_outlets=1
# temporary storage
tmp=0
# constructor
def __init__(self,*args):
if len(args) == 1:
if isNumber(args[0]):
self.tmp = args[0]
else:
print "ex3: __init__ has superfluous arguments"
# methods
def float_1(self,f):
self._outlet(1,self.tmp+f)
def float_2(self,f):
self.tmp = f
# handlers for MaxMSP int type
def int_1(self,f):
self.float_1(f)
def int_2(self,f):
self.float_2(f)
|