Commit 52dca0f9 authored by Miller Puckette's avatar Miller Puckette
Browse files

set up git repository

parents
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
<HEAD>
<TITLE>Pd Documentation 1</TITLE>
<meta http-equiv="Content-Type" content="text/html">
<link rel="stylesheet" type="text/css" href="pdmanual.css" media="screen">
</HEAD>
<BODY>
<H2>Pd Documentation chapter 1: introduction</H2>
<P>
<A href="index.htm#s1"> back to table of contents </A>
<BR><BR>
</P>
<P>
This is the HTML documentation for the Pd computer program.
Pd is free and can be downloaded from the internet;
go to
<A href="http://www.crca.ucsd.edu/~msp/software.html">
http://www.crca.ucsd.edu/~msp/software.html</A>
to get it.
<H3> <A name=s1> 1.1. guide to the documentation </A> </H3>
<P> Pd's documentation consists of:
<UL>
<LI> this HTML manual
<LI> "reference" patches, one for each kind of object in Pd
<LI> "example" patches showing how to do things
<LI> sample C code
</UL>
<P>
This manual has five sections:
<OL>
<LI> this overview
<LI> <A href="x2.htm">
a theory of operations, explaining how Pd works </A>
<LI> <A href="x3.htm">
instructions on installing Pd and getting it to run </A>
<LI> <A href="x4.htm"> how to write C extensions to Pd </A>
<LI> <A href="x5.htm"> release notes and known bugs </A>
</OL>
<P> In order to consult the reference and example patches, you'll first have
to get Pd started as explained in this manual.
<P>
For a list of all the objects you can use in Pd, see the text file,
"0.INTRO.txt" in the directory, "../5.reference". To get help on any
Pd object you can right click on it; or you can browse the help patches
by choosing "Pure Documentation..." in the Pd help menu and looking in
5.reference.
<P>
The example patches are also available from the "Pure Documentation..." item
in Pd's
"help" menu. The example patches appear in subdirectories named
"2.control.examples", "3.audio.examples" and "4.fft.examples." Some additional
patches in "7.stuff" might also be helpful.
<P>
To get started writing your own C extensions, refer to chapter 4 of this manual.
<H3> <A name=s2> 1.2. other resources </A> </H3>
<P> There is a new Pd community web site,
<a href="http://www.pure-data.info/"> pure-data.info</a>, which aims to be the
central resource for Pd, from documentation and
downloads; to forums, member pages, a patch exchange.
<P> There is a growing number of Pd-related projects hosted at
<A HREF="http://pure-data.sf.net">SourceForge</A>. This is open to all Pd
developers, and all are encouraged to join; send an email to the pd-dev list
(see below).
<P>
Most of the interesting resources related to Pd show up on the Pd mailing list,
maintained by Iohannes Zmoelnig. To subscribe or browse the archives
visit:
<A href="http://iem.kug.ac.at/mailinglists/pd-list/">
http://iem.kug.ac.at/mailinglists/pd-list/</A>.
. This is the
best source of recent information regarding installation problems and bugs. It
is perfectly reasonable to post "newbie" questions on this list; alternatively
you can contact msp@ucsd.edu for help.
<P> Many extensions to Pd are announced on the mailing list. In particular,
for people interested in graphics, there is a A 3D graphics rendering package,
named GEM, based on OpenGL, written by Mark Danks, adapted to Linux by
Guenter Geiger, and now maintained by Iohannes Zmoelnig. GEM runs on
Windows and Linux and probably will run with some coaxing on IRIX. You can get
it from: <A href="http://iem.kug.ac.at/GEM">http://iem.kug.ac.at/GEM</A> .
<P> At least three video processing packages are available for Pd. The oldest
is Framestein, by Juha Vehvilainen. This runs on Windows only: <A
href="http://framestein.org"> http://framestein.org </A>.
<P> The newer <A> href="http://zwizwa.fartit.com/pd/pdp/overview.html"> PDP
<A> library, by Tom Schouten, and its extension <A
href="http://ydegoyon.free.fr/pidip.html"> PiDiP </A> by Yves Degoyon, run well
in linux and has been ported to Windows and MacOS. Video is extremely fast in
PDP, but is currently limited to 240x320 resolution.
<P> Mathieu Bouchard has written <A href=http://artengine.ca/gridflow/>
Gridflow </A>, which runs on linux and MacOSX. The mathematical operators are
more powerful than in PDP, and the design makes smarter use of cache behavior
in modern CPUs.
All this and much more is described in detail at the
<A href="http://puredata.info/community/projects/convention04/">
first Pd Convention </A>.
<P>
Here are some more Pd links (in the order I found them): <BR>
<a href="http://www.crca.ucsd.edu/~msp"> Miller Puckette's home page</a><br>
<a href="http://gige.epy.co.at/"> Guenter Geiger's home page</a><br>
<a href="http://www.danks.org/mark"> Mark Dank's home page</a><br>
<a href="http://wonk.epy.co.at">Pd page on Wonk (Klaus)</a><br>
<a href="http://iem.kug.ac.at/~zmoelnig/index.html">
Johannes M Zmoelnig</a><br>
<a href="http://iem.kug.ac.at/~math/pd/"> Norbert Math's Pd page</a> <br>
<a href="http://iem.kug.ac.at/pdwiki/">
Nicolas Lhommet's WikiWikiWeb page for Pd</a><br>
<a href="http://iem.kug.ac.at/pdb/"> Norbert's searchable list of all known
Pd objects</a><br>
<a href="http://suita.chopin.edu.pl/~czaja/miXed/externs/xeq.html">
Krzysztof Czaja's MIDI file support </a><br>
<a href="http://www.davesabine.com/media/puredata.asp?action=pddp">
David Sabine's Pd Documentation Project:
new, highly detailed help windows</a><br>
<a href="http://www-ccrma.stanford.edu/planetccrma/software/soundapps.html#pd">
Fernando Pablo Lopez's augmented Pd RPMs from Planet CCRMA</a><br>
<a href="http://suita.chopin.edu.pl/~czaja/miXed/externs/cyclone.html">
Cyclone - Krzysztof Czaja's Max compatibility library</a><br>
On-line book project:
<A HREF="http://www.crca.ucsd.edu/~msp/techniques.htm"
<I> Theory and Techniques of Electronic Music </I> <br>
</BODY>
</HTML>
This diff is collapsed.
This diff is collapsed.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
<HEAD>
<TITLE>Pd Documentation 4</TITLE>
<meta http-equiv="Content-Type" content="text/html">
<link rel="stylesheet" type="text/css" href="pdmanual.css" media="screen">
</HEAD>
<BODY>
<H2>Pd Documentation chapter 4: writing Pd objects in C</H2>
<P>
<A href="index.htm#s4"> back to table of contents </A>
<BR><BR>
</P>
<P>You can write your own objects that you and others can use in their Pd
applications. You can write them in C or (if you're smart and brave) in C++ or
FORTRAN.
<P> HOW EXTERNS ARE LOADED
<P> Whenever you type the name of an object
(into an "object" text box) that Pd doesn't yet know about, Pd looks for a
relocatable object file, named, for instance, "profile.pd_irix5". Pd looks
first in the directory containing the patch, then in directories in its
"path." Pd will then add whatever object is defined there to its "class list,"
which is the set of all Pd classes you can use. If all this works, Pd then
attempts again to create the object you asked for, this time perhaps
successfully. There is no difference between an object defined this way and an
object built into Pd.
<P> Once you load a new object into Pd, it's there for the duration of your Pd
session. If you load another Pd document which supplies a different version of
some Pd object, the object won't be updated. IF you're working on a new object
and decide to change it, you have to exit and re-enter Pd to get the change to
take.
<P> In the "externs" subdirectory of the documentation you
can find simple examples of "externs" with their source code and test patches;
there are many other on the web (see <a href="x1.htm#s2">section 1.2 </A>).
<P> Iohannes Zmoelnig has written an excellent guide to writing externs at
<A href="http://iem.kug.ac.at/pd/externals-HOWTO/">
http://iem.kug.ac.at/pd/externals-HOWTO/</A> .
<P> A paper by Theo Stojanov on the subject is at:
<A href="http://www.music.mcgill.ca/~theo/html/audio/pd_externs.pdf">
http://www.music.mcgill.ca/~theo/html/audio/pd_externs.pdf </A> .
<P> NT HINT: In NT, Pd is compiled using Visual C 6.0. If you have VC 5.x
your externs won't compile against Pd; you'll get an error about "disk full
or bad DLL." Simply recompile Pd under 5.x and the problem goes away. Externs
compiled under 5.x and 6.x are binary compatible; it's just the compilation
that's sensitive.
</BODY>
</HTML>
This diff is collapsed.
This series of patches serves as a tutorial for Pd's "control" structure, as
opposed to its audio functions (covered in the next series.) These tutorials
are inspired by Chris Dobrian's Max tutorial patches.
It's probably best to look at the first section here before going on to the
audio portion, but afterward there's no reason not to browse back and forth
between the two, and even the third series on "fft" based techniques.
The relationship between "control" and "audio" is described in Pd's HTML
documentation, which is more like a reference manual than an introduction.
Also, you probably will need to look there to get Pd up and running stably so
that you can enjoy the patches here.
The patches are roughly divided as shown:
1. objects and connections
2. subpatches, tables, and organization
3. specific techniques.
#N canvas 9 21 600 496 12;
#X msg 204 32 hello world;
#X obj 204 105 print;
#X floatatom 321 32 0 0 0;
#X text 215 48 message;
#X text 319 49 atom;
#X text 201 123 object;
#X text 53 150 There are four types of text objects in Pd: message \, atom \, object \, and comment.;
#X text 54 187 Messages respond to mouse clicks by sending their contents to one or more destinations. The usual destination is the "outlet" at the lower left corner of the box.;
#X text 55 239 Click the message box and watch the terminal window Pd was started in. You should see the "hello world" message appear.;
#X text 55 278 Atoms respond to "Dragging" up and down with the mouse \, by changing their contents and sending the result out their outlets. You can also type at an atom after clicking on it \; hit "enter" to output the number or click anywhere else to cancel.;
#X text 52 359 Objects \, like "print" above \, may have all sorts of functions depending on what's typed into them. The "print" object simply prints out every message it receives.;
#X text 53 415 To get help on an object \, right-click it. You should see a "help window" for the object.;
#X text 354 470 updated for release 0.33;
#X connect 0 0 1 0;
#X connect 2 0 1 0;
#N canvas 1 0 581 630 12;
#X msg 195 36 hello world;
#X obj 195 72 print;
#X floatatom 304 36 0 0 0;
#X text 194 15 message;
#X text 304 14 atom;
#X text 255 73 object;
#X text 34 102 When you first open a Pd document like this one \, your cursor will be an arrow. Select "edit mode" in the Edit menu and the cursor will change to the image of a hand. The patch is now in edit mode. You can move any object by dragging it.;
#X text 33 185 Select "Edit mode" again in the Edit menu and you're back to the arrow cursor which acts on objects without moving them.;
#X text 32 373 You can create new objects by duplicating existing ones using the "duplicate" menu item. You can also "cut" and "paste" them. If you duplicate several connected objects the connections will be replicated too.;
#X text 33 237 In Edit mode \, if you click on a message \, object \, or comment \, you can then retype the text. For objects this will create a new object and delete the old one. Pd will try to reconnect the newly created object in the same way as the old one.;
#X text 34 442 Edit mode also lets you make and break connections between objects. Put the "hand" cursor over a line connecting two objects: it turns into an X. Clicking will delete the connection. Hold the cursor over an outlet and it becomes a circle (a patch point). Drag to any box and release \; you will be connected to the nearest inlet.;
#X text 32 320 When you're done changing the contents of the box \, click outside the box to deselect it. This tells Pd to incorporate the new text.;
#X text 328 604 updated for Pd version 0.33;
#X text 35 544 The "put" menu creates new text items of any of the four types. You can also put a "symbol" box \, analogous to a number box but for showing and entering text strings.;
#X connect 0 0 1 0;
#X connect 2 0 1 0;
#N canvas 185 28 660 552 12;
#X floatatom 76 400 0 0 0 0 - - -;
#X floatatom 189 401 0 0 0 0 - - -;
#X floatatom 76 307 0 0 0 0 - - -;
#X floatatom 553 161 0 0 0 0 - - -;
#X floatatom 599 162 0 0 0 0 - - -;
#X obj 553 135 +;
#X floatatom 553 105 0 0 0 0 - - -;
#X obj 599 136 +;
#X floatatom 26 109 0 0 0 0 - - -;
#X floatatom 26 17 0 0 0 0 - - -;
#X floatatom 48 41 0 0 0 0 - - -;
#X obj 26 85 +;
#X text 3 64 hot;
#X text 53 66 cold;
#X text 232 105 Here's the downside: drag this--->;
#X text 551 180 good;
#X text 600 181 bad;
#X obj 76 376 *;
#X obj 189 377 -;
#X text 15 400 square;
#X text 229 402 first difference;
#X obj 76 330 trigger float float;
#X text 412 526 updated for Pd version 0.33;
#X text 19 433 Trigger takes any number of "bang" and "float" arguments
(among others) and copies its input to its outlets \, in the requested
forms \, in right-to-left order. Hook it to two inputs without crossing
the wires and you get the expected result. Cross the wires and you
get a memory effect.;
#X text 9 136 In Pd you must sometimes think about what order an object
is going to get its messages in. If an outlet is connected to more
than one inlet it's undefined which inlet will get the cookie first.
I've rigged this example so that the left-hand side box gets its inputs
in the good \, right-to-left order \, so that the hot inlet gets hit
when all the data are good. The "bad adder" happens to receive its
inputs in the wrong order and is perpetually doing its addition before
all the data are in. There's an object that exists solely to allow
you to control message order explicitly:;
#X text 114 16 In Pd \, most objects carry out their functions when
they get messages in their leftmost inlets \, and their other inlets
are for storing values that can modify the next action. Here \, the
"+" object does its thing only when the left-hand input changes.;
#X connect 2 0 21 0;
#X connect 5 0 3 0;
#X connect 6 0 7 0;
#X connect 6 0 7 1;
#X connect 6 0 5 1;
#X connect 6 0 5 0;
#X connect 7 0 4 0;
#X connect 9 0 11 0;
#X connect 10 0 11 1;
#X connect 11 0 8 0;
#X connect 17 0 0 0;
#X connect 18 0 1 0;
#X connect 21 0 17 0;
#X connect 21 0 18 1;
#X connect 21 1 17 1;
#X connect 21 1 18 0;
#N canvas 0 0 591 442 12;
#X floatatom 225 110 0 0 0;
#X floatatom 184 109 0 0 0;
#X msg 184 56 5 6;
#X floatatom 132 108 0 0 0;
#X floatatom 64 105 0 0 0;
#X text 30 21 Most Pd messages are just numbers or short lists of numbers:;
#X msg 64 55 5;
#X obj 64 80 + 9;
#X obj 132 83 +;
#X obj 184 84 unpack;
#X msg 288 55 5;
#X obj 288 107 print;
#X obj 288 81 pack 34 78;
#X msg 132 55 5 6;
#X floatatom 195 328 0 0 0;
#X obj 195 303 +;
#X msg 195 254 1.2 3.4;
#X msg 205 277 5 6;
#X text 36 206 Unlike Max \, in Pd all numbers are floating point. Numbers whose values happen to be integers are displayed without decimal points.;
#X text 31 363 For more on messages \, get help on any message box by right-clicking.;
#X text 329 409 updated for Pd release 0.33;
#X text 34 149 If you send a list to an object with more than one inlet \, the items in the list are spread out over the inlets \, as seen in the 5+6 example above.;
#X connect 2 0 9 0;
#X connect 6 0 7 0;
#X connect 7 0 4 0;
#X connect 8 0 3 0;
#X connect 9 0 1 0;
#X connect 9 1 0 0;
#X connect 10 0 12 0;
#X connect 12 0 11 0;
#X connect 13 0 8 0;
#X connect 15 0 14 0;
#X connect 16 0 15 0;
#X connect 17 0 15 0;
#N canvas 0 0 685 496 12;
#X floatatom 107 424 0 0 0;
#X msg 53 344 bang;
#X obj 107 399 + 1;
#X obj 376 262 + 1;
#X floatatom 152 197 0 0 0;
#X floatatom 108 245 0 0 0;
#X msg 108 196 bang;
#X floatatom 169 107 0 0 0;
#X msg 112 58 bang;
#X obj 169 82 + 1;
#X text 31 21 Here's a simple counter. Click repeatedly on the "bang
message to see it:;
#X text 422 263 to its cold inlet.;
#X text 25 284 The incremented value is stored for the next "bang"
to spit out.;
#X text 28 322 Here's a timed counter. Hit the "bang" to start it...
;
#X obj 53 373 metro 500;
#X msg 99 344 stop;
#X obj 112 83 float;
#X text 28 132 The "float" box is a storage element holding one floating-point
number. The cold inlet (i.e. \, the one on the right) stores numbers.
Sending the message "bang" to the hot inlet gets the number back out:
;
#X obj 108 221 float;
#X obj 53 399 float;
#X text 25 263 Float's outlet above is connected via;
#X text 384 462 updated for Pd version 0.34;
#X text 142 373 <-- new object: metronome. The "500" means every 500
milliseconds--i.e. \, twice a second.;
#X connect 1 0 14 0;
#X connect 2 0 0 0;
#X connect 2 0 19 1;
#X connect 4 0 18 1;
#X connect 6 0 18 0;
#X connect 8 0 16 0;
#X connect 9 0 7 0;
#X connect 9 0 16 1;
#X connect 14 0 19 0;
#X connect 15 0 14 0;
#X connect 15 0 14 0;
#X connect 16 0 9 0;
#X connect 18 0 5 0;
#X connect 19 0 2 0;
#N canvas 8 0 659 487 12;
#X floatatom 147 177 0 0 0;
#X obj 147 151 + 1;
#X msg 147 47 bang;
#X obj 147 99 metro 500;
#X msg 56 105 stop;
#X obj 147 125 float;
#X obj 147 73 trigger bang bang;
#X msg 261 105 0;
#X obj 56 79 select 10;
#X text 305 102 first set value to zero;
#X text 304 73 initialization is in two steps;
#X text 305 121 (before starting the metronome);
#X text 9 128 conditionally;
#X text 9 145 stop the;
#X text 10 159 metronome;
#X text 184 46 <--- click here to start;
#X floatatom 85 289 0 0 0;
#X obj 85 315 >= 0;
#X obj 85 341 select 0 1;
#X obj 85 393 float;
#X floatatom 139 420 0 0 0;
#X msg 119 367 bang;
#X obj 139 394 + 1;
#X msg 85 367 -1;
#X text 131 313 <-- are we nonnegative? (1 if true \, 0 if false);
#X text 180 340 <-- selectively bang the first or second outlet;
#X text 167 363 <-- as a result either clear or increment the counter
;
#X text 32 11 Here's a counter that counts from 1 to 10:;
#X text 392 452 updated for Pd version 0.34;
#X text 33 200 We're using one new object \, "select \, " which outputs
a bang when it gets a matching value (10). This is useful for doing
conditional computations \, such as this one which counts while its
input is 0 or positive but clears when negative:;
#X connect 1 0 0 0;
#X connect 1 0 5 1;
#X connect 1 0 8 0;
#X connect 2 0 6 0;
#X connect 3 0 5 0;
#X connect 4 0 3 0;
#X connect 5 0 1 0;
#X connect 6 0 3 0;
#X connect 6 1 7 0;
#X connect 7 0 5 1;
#X connect 8 0 4 0;
#X connect 16 0 17 0;
#X connect 17 0 18 0;
#X connect 18 0 23 0;
#X connect 18 1 21 0;
#X connect 19 0 22 0;
#X connect 21 0 19 0;
#X connect 22 0 19 1;
#X connect 22 0 20 0;
#X connect 23 0 19 0;
#N canvas 0 0 724 474 12;
#X text 34 13 Besides the metronome \, there are three objects for
dealing with time:;
#X obj 64 117 print;
#X msg 64 59 bang;
#X msg 110 61 stop;
#X obj 64 89 delay 2000;
#X text 161 44 The delay objects sechedules an event for a future time
expressed in milliseconds. Unlike in Max \, time values need not be
integers. If a delay has been scheduled and you "bang" it again \,
it is rescheduled (the previously scheduled output is cancelled.);
#X msg 76 190 bang;
#X obj 76 237 timer;
#X text 160 117 The right inlet can be used to set the time value without
scheduling any output.;
#X text 35 156 The timer \, shown below \, measures the time elapsed
between its left and right inlets:;
#X obj 106 212 delay 123.45;
#X floatatom 76 262 0 0 0;
#X text 29 287 Note that all time calculations are idealized \; they
do not show the effects of computation time or OS latency. This way
you can write deterministic algorithms dealing with time passage.;
#X obj 74 385 pipe 2000;
#X floatatom 74 358 0 0 0;
#X floatatom 74 411 0 0 0;
#X text 165 359 The pipe object allocates memory dynamically in order
to schedule any number of delayed events. The events may hold any collection
of data (as usual \, for more details you can consult the help window.)
;
#X text 442 440 updated for Pd version 0.34;
#X connect 2 0 4 0;
#X connect 3 0 4 0;
#X connect 4 0 1 0;
#X connect 6 0 7 0;
#X connect 6 0 10 0;
#X connect 7 0 11 0;
#X connect 10 0 7 1;
#X connect 13 0 15 0;
#X connect 14 0 13 0;
#N canvas 144 162 632 551 12;
#X msg 64 51 1;
#X obj 89 150 + 1;
#X obj 209 187 print x1;
#X obj 64 209 print x3;
#X obj 114 122 print x2;
#X obj 209 100 + 1;
#X obj 209 129 + 1;
#X obj 209 158 + 1;
#X obj 64 80 t f f f f;
#X obj 89 179 print x2;
#X text 34 13 In Pd \, message passing is depth first \, so that in
this patch:;
#X text 104 51 <-- click here;
#X text 17 243 ... you get "x1" first \, notwidthstanding the fact
that "x2" and "x3" appear to be closer to the source. This means that
you shouldn't do this:;
#X msg 76 304 1;
#X text 116 304 <-- maybe you shouldn't click here;
#X obj 115 334 + 1;
#X obj 76 333 f;
#X floatatom 76 365 0 0 0;
#X text 377 520 updated for Pd version 0.34;
#X text 35 393 ... because the "depth" is infinite. The counters you've
seen always have the message chain terminated somewhere in a cold inlet:
;
#X msg 75 453 1;
#X obj 114 483 + 1;
#X obj 75 482 f;
#X floatatom 75 514 0 0 0;
#X text 115 453 <-- better;
#X connect 0 0 8 0;
#X connect 1 0 9 0;
#X connect 5 0 6 0;
#X connect 6 0 7 0;
#X connect 7 0 2 0;
#X connect 8 0 3 0;
#X connect 8 1 1 0;
#X connect 8 2 4 0;
#X connect 8 3 5 0;
#X connect 13 0 16 0;
#X connect 15 0 16 0;
#X connect 16 0 17 0;
#X connect 16 0 15 0;
#X connect 20 0 22 0;
#X connect 21 0 22 1;
#X connect 22 0 23 0;
#X connect 22 0 21 0;
#N canvas 136 31 738 479 12;
#X floatatom 88 199 0 0 0;
#X obj 88 172 receive crackers;
#X floatatom 248 204 0 0 0;
#X obj 248 177 receive pickles;
#X obj 88 145 send crackers;
#X obj 250 139 send pickles;
#X obj 389 138 send pickles;
#X floatatom 392 203 0 0 0;
#X obj 392 176 receive pickles;
#X msg 51 306 \; pickles 99 \; crackers 56;
#X floatatom 88 118 0 0 0;
#X floatatom 250 112 0 0 0;
#X floatatom 389 111 0 0 0;
#X obj 371 404 r crackers;
#X obj 371 377 s crackers;
#X text 39 392 send and receive can be abbreviated:;
#X text 48 245 You can use the semicolon feature of message boxes to
address receives \, too. This is useful if you want to do a whole list
of things:;
#X text 166 305 The transaction takes place in zero time---i.e. \,
if you tried to use "timer" to measure the time delay between the two
\, you would get zero.;
#X text 459 447 updated for Pd version 0.34;
#X text 51 6 The send and receive objects allow you to make non-local
connections. These work globally--you can use them to make two different
patches intercommunicate if you wish. Any message a "send" gets appears
at the output of every receive of the same name. There can be any number
of sends and receives sharing the same name:;
#X connect 1 0 0 0;
#X connect 3 0 2 0;
#X connect 8 0 7 0;
#X connect 10 0 4 0;
#X connect 11 0 5 0;
#X connect 12 0 6 0;
#N canvas 91 95 675 539 12;
#X obj 211 341 print;
#X msg 52 89 3 \, 4 \, 5;
#X msg 44 62 3 4 5;
#X msg 57 313 3 \$1 5;
#X floatatom 57 286 4 0 0;
#X msg 211 315 \$2 \$1 5;
#X msg 211 290 45 67;
#X msg 289 290 45 67;
#X floatatom 28 425 4 0 0;
#X floatatom 76 425 4 0 0;
#X floatatom 332 179 4 0 0;
#X floatatom 186 182 4 0 0;
#X obj 186 155 receive number9;
#X obj 332 155 receive 9bis;
#X obj 44 178 print;
#X text 27 5 In addition to using semicolons to separate messages \,
you can use commas \, which continue a stream of messages to the same
destination. Thus:;
#X msg 65 116 3 \; number9 5 \; 9bis 45;
#X text 126 89 <-- three separate messages;
#X text 109 58 <-- one message: the list \, "3 4 5".;