aboutsummaryrefslogtreecommitdiff
path: root/pd/doc/7.stuff/data-structures
diff options
context:
space:
mode:
authorGuenter Geiger <ggeiger@users.sourceforge.net>2002-07-29 17:06:19 +0000
committerGuenter Geiger <ggeiger@users.sourceforge.net>2002-07-29 17:06:19 +0000
commit57045df5fe3ec557e57dc7434ac1a07b5521bffc (patch)
tree7174058b41b73c808107c7090d9a4e93ee202341 /pd/doc/7.stuff/data-structures
parentda38b3424229e59f956252c3d89895e43e84e278 (diff)
This commit was generated by cvs2svn to compensate for changes in r58,
which included commits to RCS files with non-trunk default branches. svn path=/trunk/; revision=59
Diffstat (limited to 'pd/doc/7.stuff/data-structures')
-rw-r--r--pd/doc/7.stuff/data-structures/0.intro.txt113
-rw-r--r--pd/doc/7.stuff/data-structures/1.scalars.pd60
-rw-r--r--pd/doc/7.stuff/data-structures/2.getting.data.pd73
-rw-r--r--pd/doc/7.stuff/data-structures/3.setting.data.pd105
-rw-r--r--pd/doc/7.stuff/data-structures/4.append.pd36
-rw-r--r--pd/doc/7.stuff/data-structures/5.array.pd112
-rw-r--r--pd/doc/7.stuff/data-structures/6.file.pd68
-rw-r--r--pd/doc/7.stuff/data-structures/7.sequencer.pd192
-rw-r--r--pd/doc/7.stuff/data-structures/data-array.pd64
-rw-r--r--pd/doc/7.stuff/data-structures/data-start.pd40
-rw-r--r--pd/doc/7.stuff/data-structures/file.txt39
-rw-r--r--pd/doc/7.stuff/data-structures/score.txt94
-rw-r--r--pd/doc/7.stuff/data-structures/voice.pd127
-rw-r--r--pd/doc/7.stuff/data-structures/z.txt64
14 files changed, 1187 insertions, 0 deletions
diff --git a/pd/doc/7.stuff/data-structures/0.intro.txt b/pd/doc/7.stuff/data-structures/0.intro.txt
new file mode 100644
index 00000000..a1df9a88
--- /dev/null
+++ b/pd/doc/7.stuff/data-structures/0.intro.txt
@@ -0,0 +1,113 @@
+Pd release 0.23 and onward include objects for managing lists of data. The
+objects allow you to describe data structures and how they are viewed
+("template objects") and to traverse lists ("traversal objects.")
+
+The rest of this file gives a highly condensed summary of what's there; the
+patches, starting with "1.scalars.pd", act as a tutorial.
+
+1. TEMPLATE OBJECTS.
+
+templates describe data structures. You can add an item to a data structure
+using "field" or ask for a shape to be drawn using a "display command."
+
+1.1. "template" -- data structure.
+
+usage, "template <field1> <field2> ..."
+
+where the fields are either "float <name>", "symbol <name>", "list <name>"
+(don't try that yet); or "array <name> <template-for-elements>.
+
+1.2. DISPLAY COMMANDS.
+
+
+These are objects which ask Pd to draw a shape corresponding to some fields
+of the datum.
+
+1.2.1. POLYGONS and CURVES.
+
+polygons: polygon <outline-color> <line-width> <x, y> ...
+filled polygons: fpolygon <fill-color> <outline-color> <line-width> <x, y> ...
+curves: curve <outline-color> <line-width> <x, y> ...
+filled curves: fcurve <fill-color> <outline-color> <line-width> <x, y> ...
+
+Each argument can either be a number or a symbol. If a symbol, it's the
+name of a field (which must be a "float) which specifies the vaiue.
+So for instance in the "1.scalar.pd" example, in the template "template1",
+the object "fpolygon 244 q 5 0 0 20 z 40 0" draws a filled polygon whose
+interior color is 244 (red 2, green 4, blue 4) but whose outline color
+depends on the value of the field "q". Its coordinates describe a triangle
+whose altitude is given by "z."
+
+1.2.2 PLOT.
+
+The "plot" objects plots an array field as shown in 5_array.pd.
+
+2. TRAVERSAL.
+
+In this release of Pd, you can only traverse lists all of whose elements
+belong to the same template; this restriction will be relaxed in a future
+release. You "traverse" a list either to build it, to get its elements,
+or to change their values.
+
+2.1. POINTER.
+
+The "pointer" object can be used to refer to an element of a list. Its
+methods are:
+
+2.1.1. traverse <symbol>.
+
+Point to the "head" of a list. The symbol should match the name of a Pd
+window holding the list. The pointer is output, but you can't set or get the
+fields of the "head" pointer; you can only get the "next" element or "append"
+to the list.
+
+2.1.2. next. Goes to the next element of the list. Either the pointer
+is output on the left side, or else a "bang" at right tells you that no
+more objects are forthcoming.
+
+2.1.3. bang.
+outputs the current pointer.
+
+2.2. APPEND. Adds an element of the specified template to the list. You
+specify what fields you want to supply and the last inlet takes a pointer to
+the element you want to "append" after.
+
+2.3. GET.
+
+ get <template> <field...>
+
+send it a pointer to an object belonging to the <template> and it outputs
+the (floating-point) fields.
+
+2.4. SET.
+
+ set <template> <field...>
+
+send it a pointer (at the rightmost inlet) and values for the specified
+fields, and their values are changed accordingly.
+
+2.5. GETSIZE.
+
+ getsize <template> <array-field>
+
+outputs the size of the named field, which must be an array, when it receives
+a pointer to the owner as input.
+
+2.6. SETSIZE.
+
+ setsize <template> <array-field>
+
+Send it a pointer to the owner (right inlet) and then the desired size
+(left inlet) and the array is resized. If a template contains an array,
+each scalar belonging to the template can have its own size for the array.
+
+2.7. ELEMENT.
+
+ element <template> <array-field>
+
+Pass it an index and a pointer and it outputs a pointer to an element of the
+array.
+
+
+
+
diff --git a/pd/doc/7.stuff/data-structures/1.scalars.pd b/pd/doc/7.stuff/data-structures/1.scalars.pd
new file mode 100644
index 00000000..c2c465bf
--- /dev/null
+++ b/pd/doc/7.stuff/data-structures/1.scalars.pd
@@ -0,0 +1,60 @@
+#N canvas 363 11 579 461 12;
+#N canvas 13 22 297 180 data 1;
+#X restore 60 347 pd data;
+#N canvas 10 274 550 324 template1 1;
+#X obj 60 46 filledpolygon 244 q 5 0 0 20 z 40 0;
+#X obj 60 21 template float x float y float z float q;
+#X text 3 67 This subpatch acts as a template which describes the data
+structure. The "template" specifies four floating point values named
+x \, y \, z \, and q. The "filledpolygon" is a drawing instruction.
+Templates should have only one template object but may have any number
+of drawing instructions.;
+#X text 4 164 The filledpolygon's arguments are interior color \, border
+color \, border width \, and then the points of the polygon. Arguments
+which are symbols ("q" and "z" in this case) mean to take the values
+from the data structure. Other values are constant. The position of
+the object is automatically controlled by fields named "x" and "y".
+;
+#X restore 60 371 pd template1;
+#N canvas 0 0 440 292 stuff 0;
+#X obj 235 185 pointer;
+#X obj 28 187 append template1 x y z q;
+#X msg 235 127 \; pd-data clear;
+#X msg 235 163 traverse pd-data \, bang;
+#X obj 125 128 t b b b;
+#X msg 125 87 bang;
+#X obj 125 56 loadbang;
+#X text 159 87 click here to re-initialize;
+#X text 25 243 This subpatch sets up the "data" window with two objects.
+How this works will get explained later.;
+#X msg 28 164 50 100 30 9 \, 150 100 -20 900;
+#X connect 0 0 1 4;
+#X connect 3 0 0 0;
+#X connect 4 0 9 0;
+#X connect 4 1 3 0;
+#X connect 4 2 2 0;
+#X connect 5 0 4 0;
+#X connect 6 0 5 0;
+#X connect 9 0 1 0;
+#X restore 59 397 pd stuff;
+#X text 37 72 The positions \, border color \, and altitude of each
+triangle are numeric values which can control \, or be controlled by
+\, other elements of the patch.;
+#X text 37 124 When the data window is locked (not in edit mode) you
+can drag the apex of either triangle up or down to change the altitude
+(you should see the cursor change with dragging is meaningful.) In
+edit (unlocked) mode \, you can move teh entire triangles around \,
+or cut \, copy \, and paste them.;
+#X text 47 325 subpatches:;
+#X text 37 281 Data is not persistent. If you save a Pd patch and reopen
+it \, the "data" isn't preserved.;
+#X text 37 5 This patch shows a simple data window with two objects
+in it. The objects' data structures and appearances are defined by
+the "template1" subpatch. This kind of object is called a "scalar."
+;
+#X text 37 207 Scalars are described by "templates" \, which are subwindows.
+The subwindows are found by their name \, in this case "template1."
+The template describes what form the data take and how it is shown.
+It's possible to mix data of many different templates in the same collection.
+;
+#X text 294 398 updated for Pd version 0.35.;
diff --git a/pd/doc/7.stuff/data-structures/2.getting.data.pd b/pd/doc/7.stuff/data-structures/2.getting.data.pd
new file mode 100644
index 00000000..bebd7371
--- /dev/null
+++ b/pd/doc/7.stuff/data-structures/2.getting.data.pd
@@ -0,0 +1,73 @@
+#N canvas 363 11 630 603 12;
+#X text 311 559 updated for Pd version 0.32.;
+#N canvas 42 312 598 266 stuff 0;
+#X obj 353 159 pointer;
+#X obj 117 103 t b b b;
+#X msg 117 62 bang;
+#X obj 117 31 loadbang;
+#X text 151 62 click here to re-initialize;
+#X text 126 206 Explained later...;
+#X msg 20 139 50 250 30 9 \, 200 200 -20 900 \, 100 200 -50 30;
+#X obj 20 162 append template2 x y z q;
+#X msg 353 101 \; pd-data2 clear;
+#X msg 353 137 traverse pd-data2 \, bang;
+#X connect 0 0 7 4;
+#X connect 1 0 6 0;
+#X connect 1 1 9 0;
+#X connect 1 2 8 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 6 0 7 0;
+#X connect 9 0 0 0;
+#X restore 506 310 pd stuff;
+#X text 506 242 subpatches:;
+#X obj 15 303 pointer;
+#X msg 27 271 next;
+#X text 75 301 <- object that outputs pointers to scalars;
+#N canvas 13 22 345 271 data2 1;
+#X restore 506 265 pd data2;
+#N canvas 15 278 427 138 template2 0;
+#X obj 60 46 filledpolygon 244 q 5 0 0 20 z 40 0;
+#X obj 60 21 template float x float y float z float q;
+#X text 13 79 The template for the two scalars \, as in the last patch
+;
+#X restore 506 288 pd template2;
+#X obj 15 355 get template2 x y z q;
+#X floatatom 15 384 5 0 0;
+#X floatatom 76 384 5 0 0;
+#X floatatom 137 384 5 0 0;
+#X floatatom 199 385 5 0 0;
+#X msg 15 246 traverse pd-data2;
+#X obj 59 330 print;
+#X text 100 330 <- this gets a bang when we reach the end;
+#X text 211 353 <- this takes incoming pointers;
+#X text 214 367 and outputs the values of x \, y \, z \, and q.;
+#X text 172 245 <- go to head of list (click first);
+#X text 68 273 <- output next item (click 4 times);
+#X text 14 5 The simplest thing you can do with a collection of scalars
+(a list) is to traverse it \, getting the numbers back out. This is
+done using two objects \, "pointer" which does the traversal \, and
+"get" which \, given a pointer to a scalar \, extracts numeric quantities
+from it.;
+#X text 14 85 You can send the "pointer" object a "traverse" message
+to point it to the head of the list. The argument "pd-data2" indicates
+the Pd window named "data2." The head of the list means \, not the
+first scalar in the list \, but the position before the first scalar
+\, which is a valid pointer in Pd but has no data or template.;
+#X text 14 180 The "next" message tells the "pointer" object to go
+to the next scalar in the list and output it. If there are no more
+\, "pointer" outputs a bang at right.;
+#X text 19 424 The "get" object takes a pointer \, checks that its
+template agrees with what "get" is expecting \, i.e. \, "template2"
+\, and if so outputs the values of x \, y \, z \, and q in the usual
+reverse order.;
+#X text 18 492 The pointer sent from "pointer" to "get" is an elementary
+Pd type on a level with "float" and "symbol".;
+#X connect 3 0 8 0;
+#X connect 3 1 14 0;
+#X connect 4 0 3 0;
+#X connect 8 0 9 0;
+#X connect 8 1 10 0;
+#X connect 8 2 11 0;
+#X connect 8 3 12 0;
+#X connect 13 0 3 0;
diff --git a/pd/doc/7.stuff/data-structures/3.setting.data.pd b/pd/doc/7.stuff/data-structures/3.setting.data.pd
new file mode 100644
index 00000000..d951a0a8
--- /dev/null
+++ b/pd/doc/7.stuff/data-structures/3.setting.data.pd
@@ -0,0 +1,105 @@
+#N canvas 401 39 490 472 12;
+#X floatatom 60 371 0 0 0;
+#X floatatom 60 323 0 0 0;
+#X floatatom 60 275 0 0 0;
+#X floatatom 60 227 0 0 0;
+#X floatatom 324 322 0 0 0;
+#X floatatom 283 322 0 0 0;
+#X floatatom 240 322 0 0 0;
+#X obj 197 274 pointer;
+#X msg 205 249 next;
+#X floatatom 197 322 0 0 0;
+#N canvas 19 29 363 341 data3 1;
+#X restore 269 425 pd data3;
+#N canvas 100 436 466 223 template3 0;
+#X obj 25 68 filledpolygon q 0 1 0 0 w 0 w h 0 h;
+#X obj 26 163 drawnumber q 0 0 0;
+#X obj 24 19 template float x float y float w float h float q;
+#X text 22 39 five numeric ("float") fields;
+#X text 25 88 drawing a rectangle \, interior color q \, border black and one unit thick \, through the points (0 \, 0) \, (w \, 0) \, (w \, h) \, and (0 \, h). Note that the three points containing variables become hot spots for mouse dragging.;
+#X text 26 184 Draw the value of q as an Araboc numeral \, at (0 \, 0) \, in black.;
+#X restore 269 446 pd template3;
+#N canvas 313 223 587 367 stuff 0;
+#X obj 352 180 pointer;
+#X obj 352 204 t b b p;
+#X obj 222 333 append template3 x y w h q;
+#X obj 288 9 loadbang;
+#X obj 288 62 t b b b;
+#X msg 331 138 traverse pd-data3;
+#X msg 477 136 \; pd-data3 clear;
+#X msg 240 110 0;
+#X obj 187 136 f;
+#X obj 220 136 + 1;
+#X obj 189 112 until;
+#X obj 201 159 sel 20;
+#X obj 251 159 t b;
+#X msg 290 32 bang;
+#X obj 25 237 random 300;
+#X obj 100 237 random 300;
+#X obj 323 236 random 1000;
+#X obj 177 237 random 80;
+#X obj 252 237 random 80;
+#X obj 101 263 - 30;
+#X obj 354 11 inlet;
+#X connect 0 0 1 0;
+#X connect 1 0 14 0;
+#X connect 1 1 15 0;
+#X connect 1 1 16 0;
+#X connect 1 1 17 0;
+#X connect 1 1 18 0;
+#X connect 1 2 2 5;
+#X connect 3 0 13 0;
+#X connect 4 0 10 0;
+#X connect 4 1 5 0;
+#X connect 4 1 7 0;
+#X connect 4 2 6 0;
+#X connect 5 0 0 0;
+#X connect 7 0 8 1;
+#X connect 8 0 11 0;
+#X connect 8 0 9 0;
+#X connect 9 0 8 1;
+#X connect 10 0 8 0;
+#X connect 11 0 10 1;
+#X connect 11 1 12 0;
+#X connect 12 0 0 0;
+#X connect 13 0 4 0;
+#X connect 14 0 2 0;
+#X connect 15 0 19 0;
+#X connect 16 0 2 4;
+#X connect 17 0 2 2;
+#X connect 18 0 2 3;
+#X connect 19 0 2 1;
+#X connect 20 0 13 0;
+#X restore 269 404 pd stuff;
+#X msg 269 379 remake;
+#X obj 197 298 get template3 x y w h q;
+#X floatatom 356 322 0 0 0;
+#X obj 60 251 set template3 x;
+#X obj 60 299 set template3 y;
+#X obj 60 347 set template3 w;
+#X obj 60 394 set template3 h;
+#X floatatom 60 418 0 0 0;
+#X obj 60 441 set template3 q;
+#X msg 197 226 traverse pd-data3;
+#X text 46 5 The "set" object allows you to change numeric values. In this example \, the template specifies five fields describing the (x \, y) location \, width \, height \, and color. A new feature is that the color is also getting printed out under the rectangles. This is done using the "drawnumber" object in the template.;
+#X text 323 378 <- click to randomize;
+#X text 46 87 Getting parameter values is as inthe previous patch \; however \, as you traverse the list with "next" messages the new pointers are also sent to the five "set" objects. These have as arguments the template name and the name of the field they will set. You can drag on the five number boxes (after selecting an object with "traverse" and "next" messages) to change its location \, shape \, and color.;
+#X connect 0 0 19 0;
+#X connect 1 0 18 0;
+#X connect 2 0 17 0;
+#X connect 3 0 16 0;
+#X connect 7 0 14 0;
+#X connect 7 0 16 1;
+#X connect 7 0 17 1;
+#X connect 7 0 18 1;
+#X connect 7 0 19 1;
+#X connect 7 0 21 1;
+#X connect 8 0 7 0;
+#X connect 13 0 12 0;
+#X connect 14 0 9 0;
+#X connect 14 1 6 0;
+#X connect 14 2 5 0;
+#X connect 14 3 4 0;
+#X connect 14 4 15 0;
+#X connect 20 0 21 0;
+#X connect 22 0 7 0;
diff --git a/pd/doc/7.stuff/data-structures/4.append.pd b/pd/doc/7.stuff/data-structures/4.append.pd
new file mode 100644
index 00000000..2c1991d9
--- /dev/null
+++ b/pd/doc/7.stuff/data-structures/4.append.pd
@@ -0,0 +1,36 @@
+#N canvas 308 71 688 415 12;
+#X obj 421 332 pointer;
+#X obj 108 277 t b b b;
+#X msg 120 241 bang;
+#X text 161 240 click here to re-initialize;
+#X msg 11 313 50 250 30 9 \, 200 200 -20 900 \, 100 200 -50 30;
+#X text 56 27 The objects below put three items in the data window.
+First the window is cleared. Then a "pointer" object is instructed
+to point to the beginning of the data window ("traverse pd-data") \,
+and to output its value ("bang") to the "append" object. This object
+is then given numeric values to create three items.;
+#X obj 11 336 append template4 x y z q;
+#X msg 421 269 \; pd-data4 clear;
+#N canvas 0 0 318 188 data4 1;
+#X restore 430 219 pd data4;
+#N canvas 15 278 427 138 template4 0;
+#X obj 60 46 filledpolygon 244 q 5 0 0 20 z 40 0;
+#X obj 60 21 template float x float y float z float q;
+#X text 13 79 The template for the two scalars \, as in the last patch
+;
+#X restore 428 243 pd template4;
+#X msg 421 309 traverse pd-data4 \, bang;
+#X text 57 165 The outlet of "append" is a pointer to the newly created
+scalar. You can pass that on to other append objects if you want to
+build heterogenous lists.;
+#X text 363 375 Updated for Pd version 0.32;
+#X text 57 121 The "append" object is given the argument "template4"
+to specify what kind of data structure to append. The other arguments
+are the names of variables we'll set.;
+#X connect 0 0 6 4;
+#X connect 1 0 4 0;
+#X connect 1 1 10 0;
+#X connect 1 2 7 0;
+#X connect 2 0 1 0;
+#X connect 4 0 6 0;
+#X connect 10 0 0 0;
diff --git a/pd/doc/7.stuff/data-structures/5.array.pd b/pd/doc/7.stuff/data-structures/5.array.pd
new file mode 100644
index 00000000..9c1996a7
--- /dev/null
+++ b/pd/doc/7.stuff/data-structures/5.array.pd
@@ -0,0 +1,112 @@
+#N canvas 67 294 709 456 12;
+#X obj 235 323 pointer;
+#X floatatom 232 183 0 0 0;
+#X msg 235 300 bang;
+#X floatatom 15 200 0 0 0;
+#X floatatom 17 350 0 0 0;
+#X floatatom 235 369 0 0 0;
+#X floatatom 451 276 0 0 0;
+#X obj 451 229 pointer;
+#X obj 318 163 pointer;
+#X msg 449 194 bang;
+#N canvas 0 0 384 196 data5 1;
+#X restore 508 314 pd data5;
+#N canvas 5 272 431 226 template5 0;
+#X obj 8 91 filledpolygon 244 q 3 0 0 20 z 40 0;
+#X obj 6 8 template float x float y float z float q array bazoo template5-element
+;
+#X obj 8 113 plot bazoo 700 3 30 10 4;
+#X text 6 44 this declares an array named "bazoo" whose elements are
+described by "template5-element." Array declarations take three arguments
+while "float" declarations take only two.;
+#X text 6 136 Here we ask to plot the array \, color 700 \, line width
+3 \, starting location (30 \, 10) relative to the scalar \, points
+spaced 4 apart.;
+#X text 7 186 You can also do (x \, y) plots and/or make the line thickness
+variable---see the help window for "plot".;
+#X restore 508 337 pd template5;
+#N canvas 65 248 442 101 template5-element 0;
+#X obj 35 11 template float y;
+#X text 12 36 This says that array elements will have a single floating-point
+number named "y". The variable name "y" is automatically assumed to
+control screen height \; if you don't have at least that variable you
+can't plot the array..;
+#X restore 508 360 pd template5-element;
+#N canvas 515 84 589 429 stuff 0;
+#X obj 354 163 pointer;
+#X obj 136 102 t b b b;
+#X msg 136 61 bang;
+#X text 170 61 click here to re-initialize;
+#X obj 134 163 append template5 x y z q;
+#X msg 354 100 \; pd-data5 clear;
+#X msg 354 140 traverse pd-data5 \, bang;
+#X msg 283 280 50;
+#X obj 284 307 setsize template5 bazoo;
+#X obj 137 23 loadbang;
+#X msg 134 140 50 150 30 9;
+#X obj 134 191 t b b p;
+#X floatatom 68 327 0 0 0;
+#X floatatom 14 332 0 0 0;
+#X obj 14 376 set template5-element y;
+#X obj 68 350 element template5 bazoo;
+#X obj 20 303 unpack;
+#X msg 12 258 3 5 \, 7 9 \, -30 10 \, 43 45;
+#X connect 0 0 4 4;
+#X connect 1 0 10 0;
+#X connect 1 1 6 0;
+#X connect 1 2 5 0;
+#X connect 2 0 1 0;
+#X connect 4 0 11 0;
+#X connect 6 0 0 0;
+#X connect 7 0 8 0;
+#X connect 9 0 2 0;
+#X connect 10 0 4 0;
+#X connect 11 0 17 0;
+#X connect 11 1 7 0;
+#X connect 11 2 8 1;
+#X connect 11 2 15 1;
+#X connect 12 0 15 0;
+#X connect 13 0 14 0;
+#X connect 15 0 14 1;
+#X connect 16 0 13 0;
+#X connect 16 1 12 0;
+#X connect 17 0 16 0;
+#X restore 508 383 pd stuff;
+#X msg 318 140 traverse pd-data5 \, next;
+#X obj 451 252 getsize template5 bazoo;
+#X obj 232 229 setsize template5 bazoo;
+#X obj 17 373 set template5-element y;
+#X obj 235 346 get template5-element y;
+#X obj 15 223 element template5 bazoo;
+#X text 38 15 Scalars may contain arrays \, and moreover the elements
+of an array can be of any scalar type (and can have sub-arrays recursively.)
+The type of the element of an array is fixed in the template. In this
+case \, "template5" contains the definition of the top-level scalar
+and "template5-element" is the template of each array element (see
+the template subpatch.);
+#X text 328 121 click to get pointer;
+#X text 449 173 get size;
+#X text 221 158 set size;
+#X text 16 133 select an individual;
+#X text 16 153 element \, which is a;
+#X text 14 169 scalar with template;
+#X text 104 189 template5;
+#X text 12 413 work as before \, but on;
+#X text 12 433 array elements...;
+#X text 433 424 Updated for Pd version 0.35;
+#X text 17 395 normal "set" amd "get";
+#X connect 0 0 18 0;
+#X connect 1 0 16 0;
+#X connect 2 0 0 0;
+#X connect 3 0 19 0;
+#X connect 4 0 17 0;
+#X connect 7 0 15 0;
+#X connect 8 0 16 1;
+#X connect 8 0 19 1;
+#X connect 8 0 7 0;
+#X connect 9 0 7 0;
+#X connect 14 0 8 0;
+#X connect 15 0 6 0;
+#X connect 18 0 5 0;
+#X connect 19 0 0 0;
+#X connect 19 0 17 1;
diff --git a/pd/doc/7.stuff/data-structures/6.file.pd b/pd/doc/7.stuff/data-structures/6.file.pd
new file mode 100644
index 00000000..1196d1a1
--- /dev/null
+++ b/pd/doc/7.stuff/data-structures/6.file.pd
@@ -0,0 +1,68 @@
+#N canvas 405 27 291 318 12;
+#N canvas 0 0 377 383 data 1;
+#X restore 40 153 pd data;
+#N canvas 50 470 523 157 template-toplevel 0;
+#X obj 120 112 plot bazoo 700 3 10 20 20;
+#X obj 120 48 template float x float y float z float q array bazoo template-element;
+#X obj 120 86 drawpolygon q 4 0 0 20 z z -5 10 20;
+#X restore 40 174 pd template-toplevel;
+#N canvas 199 231 600 239 template-element 0;
+#X obj 59 48 template float x float y float w;
+#X obj 80 89 drawpolygon 10 2 5 0 0 -5 -5 0 0 5 5 0;
+#X restore 40 197 pd template-element;
+#X msg 45 16 \; pd-data clear;
+#N canvas 125 240 709 410 traversal 0;
+#X floatatom 212 353 0 0 0;
+#X obj 212 376 set template-toplevel q;
+#X floatatom 212 307 0 0 0;
+#X floatatom 210 255 0 0 0;
+#X floatatom 96 62 0 0 0;
+#X floatatom 97 114 0 0 0;
+#X floatatom 23 144 0 0 0;
+#X floatatom 210 209 0 0 0;
+#X floatatom 617 194 0 0 0;
+#X floatatom 550 192 0 0 0;
+#X floatatom 486 191 0 0 0;
+#X obj 419 116 pointer;
+#X obj 419 168 get template-toplevel x y z q;
+#X msg 450 90 next;
+#X floatatom 419 191 0 0 0;
+#X obj 23 169 set template-element y;
+#X obj 97 137 element template-toplevel bazoo;
+#X obj 96 85 setsize template-toplevel bazoo;
+#X obj 210 232 set template-toplevel x;
+#X obj 210 278 set template-toplevel y;
+#X obj 212 330 set template-toplevel z;
+#X floatatom 22 200 0 0 0;
+#X obj 22 225 set template-element x;
+#X msg 419 67 traverse pd-data \, next;
+#X floatatom 26 258 0 0 0;
+#X obj 26 283 set template-element w;
+#X connect 0 0 1 0;
+#X connect 2 0 20 0;
+#X connect 3 0 19 0;
+#X connect 4 0 17 0;
+#X connect 5 0 16 0;
+#X connect 6 0 15 0;
+#X connect 7 0 18 0;
+#X connect 11 0 12 0;
+#X connect 11 0 17 1;
+#X connect 11 0 18 1;
+#X connect 11 0 19 1;
+#X connect 11 0 20 1;
+#X connect 11 0 1 1;
+#X connect 11 0 16 1;
+#X connect 12 0 14 0;
+#X connect 12 1 10 0;
+#X connect 12 2 9 0;
+#X connect 12 3 8 0;
+#X connect 13 0 11 0;
+#X connect 16 0 15 1;
+#X connect 16 0 22 1;
+#X connect 16 0 25 1;
+#X connect 21 0 22 0;
+#X connect 23 0 11 0;
+#X connect 24 0 25 0;
+#X restore 41 218 pd traversal;
+#X msg 43 55 \; pd-data write xx.txt;
+#X msg 41 102 \; pd-data read file.txt;
diff --git a/pd/doc/7.stuff/data-structures/7.sequencer.pd b/pd/doc/7.stuff/data-structures/7.sequencer.pd
new file mode 100644
index 00000000..6b815191
--- /dev/null
+++ b/pd/doc/7.stuff/data-structures/7.sequencer.pd
@@ -0,0 +1,192 @@
+#N struct template-toplevel float x float y float voiceno array pitch
+template-pitch array amp template-amp;
+#N struct template-pitch float x float y float w;
+#N struct template-amp float x float y float w;
+#N canvas 467 44 543 446 12;
+#N canvas 565 104 524 166 template-toplevel 0;
+#X obj 25 86 plot pitch voiceno 3 10 0;
+#X obj 25 113 plot amp 0 3 10 0;
+#X obj 27 60 filledpolygon 9 9 0 0 -10 0 10 5 10 5 -10;
+#X obj 25 21 struct template-toplevel float x float y float voiceno
+array pitch template-pitch array amp template-amp;
+#X restore 64 197 pd template-toplevel;
+#N canvas 0 0 419 102 template-amp 0;
+#X obj 15 41 struct template-amp float x float y float w;
+#X restore 64 219 pd template-amp;
+#N canvas 42 221 452 87 template-pitch 0;
+#X obj 21 29 struct template-pitch float x float y float w;
+#X restore 66 242 pd template-pitch;
+#N canvas 282 38 522 569 synthesis 0;
+#X msg 125 220 next;
+#X msg 108 172 traverse pd-data \, next;
+#X obj 108 250 pointer template-toplevel;
+#X obj 108 273 t p p;
+#X obj 108 296 get template-toplevel voiceno;
+#X obj 108 325 pack 0 p;
+#X obj 108 4 inlet;
+#X obj 108 33 route start stop;
+#X msg 161 54 \; reset bang;
+#X obj 298 30 r reset;
+#X obj 152 112 s reset;
+#X obj 125 194 r next-evt;
+#X obj 108 354 route 0 9 90 900 99 909 990;
+#X obj 55 372 voice;
+#X obj 55 536 outlet~;
+#X obj 55 395 voice;
+#X obj 55 418 voice;
+#X obj 55 441 voice;
+#X msg 298 58 \; reset-stop stop \; time-of-last-evt 0 \; pd-data sort
+;
+#X obj 55 465 voice;
+#X obj 55 488 voice;
+#X obj 55 511 voice;
+#X obj 372 351 s delay-multiplier;
+#X obj 375 276 t b f;
+#X msg 372 303 1000;
+#X obj 389 327 /;
+#X obj 375 250 r tempo;
+#X obj 108 90 t b b b;
+#X msg 130 136 \; pd-data sort;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 1 5 1;
+#X connect 4 0 5 0;
+#X connect 5 0 12 0;
+#X connect 6 0 7 0;
+#X connect 7 0 27 0;
+#X connect 7 1 8 0;
+#X connect 9 0 18 0;
+#X connect 11 0 0 0;
+#X connect 12 0 13 1;
+#X connect 12 1 15 1;
+#X connect 12 2 16 1;
+#X connect 12 3 17 1;
+#X connect 12 4 19 1;
+#X connect 12 5 20 1;
+#X connect 12 6 21 1;
+#X connect 13 0 15 0;
+#X connect 15 0 16 0;
+#X connect 16 0 17 0;
+#X connect 17 0 19 0;
+#X connect 19 0 20 0;
+#X connect 20 0 21 0;
+#X connect 21 0 14 0;
+#X connect 23 0 24 0;
+#X connect 23 1 25 1;
+#X connect 24 0 25 0;
+#X connect 25 0 22 0;
+#X connect 26 0 23 0;
+#X connect 27 0 1 0;
+#X connect 27 1 28 0;
+#X connect 27 2 10 0;
+#X restore 64 323 pd synthesis;
+#X floatatom 278 276 0 0 0;
+#X floatatom 92 358 0 0 0;
+#N canvas 159 26 495 270 output 0;
+#X obj 345 163 t b;
+#X obj 345 112 f;
+#X obj 345 61 inlet;
+#X text 351 30 mute;
+#X obj 345 189 f;
+#X msg 434 182 0;
+#X msg 345 87 bang;
+#X obj 345 138 moses 1;
+#X obj 434 156 t b f;
+#X obj 405 119 moses 1;
+#X obj 85 151 dbtorms;
+#X obj 405 94 r master-lvl;
+#X obj 85 43 r master-lvl;
+#X obj 345 214 s master-lvl;
+#X obj 22 185 inlet~;
+#X obj 203 42 inlet;
+#X text 203 18 level;
+#X obj 203 102 s master-lvl;
+#X msg 98 67 set \$1;
+#X obj 98 91 outlet;
+#X msg 218 65 \; pd dsp 1;
+#X obj 85 198 line~;
+#X obj 22 216 *~;
+#X obj 22 246 dac~;
+#X obj 85 175 pack 0 50;
+#X text 20 162 audio;
+#X text 95 112 show level;
+#X connect 0 0 4 0;
+#X connect 1 0 7 0;
+#X connect 2 0 6 0;
+#X connect 4 0 13 0;
+#X connect 5 0 13 0;
+#X connect 6 0 1 0;
+#X connect 7 0 0 0;
+#X connect 7 1 8 0;
+#X connect 8 0 5 0;
+#X connect 9 1 4 1;
+#X connect 10 0 24 0;
+#X connect 11 0 1 1;
+#X connect 11 0 9 0;
+#X connect 12 0 10 0;
+#X connect 12 0 18 0;
+#X connect 14 0 22 0;
+#X connect 15 0 17 0;
+#X connect 15 0 20 0;
+#X connect 18 0 19 0;
+#X connect 21 0 22 1;
+#X connect 22 0 23 0;
+#X connect 22 0 23 1;
+#X connect 24 0 21 0;
+#X restore 64 380 pd output;
+#X msg 122 358 MUTE;
+#X msg 64 296 start;
+#X msg 111 296 stop;
+#N canvas 22 39 392 386 data 0;
+#X scalar template-toplevel 2 246 900 \; 0 0 50 \; 10 0 50 \; \; 0
+0 0 \; 10 0 10 \; 11 0 0 \; \;;
+#X scalar template-toplevel 13 220 990 \; 0 0 50 \; 10 0 50 \; \; 0
+0 10 \; 10 0 10 \; 11 0 0 \; \;;
+#X scalar template-toplevel 34 73 90 \; 0 250 50 \; 100 50 0 \; 100
+50 50 \; 230 200 0 \; 230 50 10 \; 240 300 1 \; 240 100 50 \; 250 250
+1 \; 250 150 50 \; 260 250 1 \; 285 250 1 \; \; 0 0 2 \; 100 0 5 \;
+200 0 6 \; 225 0 2 \; 230 0 5 \; 260 0 10 \; 261 0 5 \; 265 0 0 \;
+266 0 6 \; 270 0 0 \; 271 0 8 \; 275 0 0 \; 276 0 10 \; 280 0 0 \;
+281 0 12 \; 285 0 0 \; \;;
+#X scalar template-toplevel 67 282 900 \; 0 20 1 \; 60 20 1 \; \; 0
+0 0 \; 30 0 14 \; 60 0 0 \; \;;
+#X scalar template-toplevel 141 322 900 \; 0 0 50 \; 70 -70 50 \; \;
+0 0 0 \; 10 0 10 \; 20 0 0 \; 30 0 0 \; 40 0 10 \; 50 0 0 \; 60 0 10
+\; 70 0 0 \; \;;
+#X scalar template-toplevel 326 192 909 \; 0 0 50 \; 50 0 50 \; \;
+0 0 15 \; 10 0 10 \; 50 0 0 \; \;;
+#X restore 64 176 pd data;
+#N canvas 82 467 332 145 stuff 0;
+#X msg 1 101 \; pd-data write xx.txt;
+#X msg -3 39 \; pd-data read score.txt;
+#X obj 208 7 loadbang;
+#X msg 208 34 \; tempo 60;
+#X msg 198 101 \; pd-data sort;
+#X connect 2 0 3 0;
+#X restore 65 264 pd stuff;
+#X obj 278 229 r tempo;
+#X msg 278 252 set \$1;
+#X obj 278 300 s tempo;
+#X text 13 4 This patch shows an example of how to use data collections
+as musical sequences (with apologies to Yuasa and Stockhausen). Here
+the black traces show dynamics and the colored ones show pitch. The
+fatness of the pitch traces give bandwidth. Any of the three can change
+over the life of the event.;
+#X text 160 357 <--- volume in dB;
+#X text 13 96 To hear the result \, turn the volume up to 70 or so
+(higher if it's not loud enough the first time) and hit "start". You
+can set the tempo lower if that helps you follow the "score" the first
+couple of times.;
+#X text 311 276 <--- tempo;
+#X text 256 416 Updated for Pd version 0.32;
+#X connect 3 0 6 0;
+#X connect 4 0 14 0;
+#X connect 5 0 6 1;
+#X connect 6 0 5 0;
+#X connect 7 0 6 2;
+#X connect 8 0 3 0;
+#X connect 9 0 3 0;
+#X connect 12 0 13 0;
+#X connect 13 0 4 0;
diff --git a/pd/doc/7.stuff/data-structures/data-array.pd b/pd/doc/7.stuff/data-structures/data-array.pd
new file mode 100644
index 00000000..25cb1ec8
--- /dev/null
+++ b/pd/doc/7.stuff/data-structures/data-array.pd
@@ -0,0 +1,64 @@
+#N canvas 230 71 587 465 12;
+#X floatatom 179 207 0 0 0;
+#X obj 53 199 f;
+#X obj 89 194 + 1;
+#X obj 53 232 sel;
+#X msg 69 165 1;
+#X msg 285 213 0;
+#X obj 418 342 *;
+#X obj 418 392 del;
+#X obj 414 292 t f f;
+#X obj 418 322 -;
+#X msg 469 304 0;
+#X obj 449 346 r delay-multiplier;
+#X obj 432 369 r reset-stop;
+#X obj 238 110 inlet;
+#X obj 179 184 getsize \$1 \$2;
+#X obj 285 233 element \$1 \$2;
+#X obj 187 234 element \$1 \$2;
+#X obj 208 408 outlet;
+#X obj 349 408 outlet;
+#X obj 187 254 get \$3 y w x;
+#X obj 285 253 get \$3 y w;
+#X obj 265 408 outlet;
+#X obj 342 302 t f b;
+#X obj 372 326 0;
+#X obj 238 130 t b b p b;
+#X text 229 93 pointer in;
+#X text 20 12 This is an abstraction used in the sequencer example. Here we take a pointer and sequence an array belonging to it \, either the amplitude or the frequency \, depending on the value of argument 2 The template of the scalar is given by argument 1 and that of the array elements by argument 3;
+#X text 90 431 Outlets: new y value \, new w value \, time to ramp to new values.;
+#X connect 1 0 2 0;
+#X connect 1 0 3 0;
+#X connect 2 0 1 1;
+#X connect 3 1 16 0;
+#X connect 4 0 1 1;
+#X connect 5 0 15 0;
+#X connect 6 0 7 0;
+#X connect 6 0 18 0;
+#X connect 7 0 1 0;
+#X connect 8 0 9 1;
+#X connect 8 1 9 0;
+#X connect 9 0 6 0;
+#X connect 10 0 9 1;
+#X connect 11 0 6 1;
+#X connect 12 0 7 0;
+#X connect 13 0 24 0;
+#X connect 14 0 0 0;
+#X connect 14 0 3 1;
+#X connect 15 0 20 0;
+#X connect 16 0 19 0;
+#X connect 19 0 17 0;
+#X connect 19 1 21 0;
+#X connect 19 2 8 0;
+#X connect 20 0 17 0;
+#X connect 20 1 22 0;
+#X connect 22 0 21 0;
+#X connect 22 1 23 0;
+#X connect 23 0 18 0;
+#X connect 24 0 1 0;
+#X connect 24 1 5 0;
+#X connect 24 2 15 1;
+#X connect 24 2 14 0;
+#X connect 24 2 16 1;
+#X connect 24 3 4 0;
+#X connect 24 3 10 0;
diff --git a/pd/doc/7.stuff/data-structures/data-start.pd b/pd/doc/7.stuff/data-structures/data-start.pd
new file mode 100644
index 00000000..b0522fbf
--- /dev/null
+++ b/pd/doc/7.stuff/data-structures/data-start.pd
@@ -0,0 +1,40 @@
+#N canvas 404 0 597 385 12;
+#X obj 248 142 inlet;
+#X obj 295 250 *;
+#X obj 165 262 del;
+#X obj 130 141 r reset-stop;
+#X obj 195 339 outlet;
+#X obj 375 172 outlet;
+#X obj 310 145 get \$1 x y;
+#X obj 195 312 pointer;
+#X text 46 101 outlets: pointer (delayed) \, y-value.;
+#X obj 248 167 t b p;
+#X obj 165 288 t b b;
+#X obj 335 224 r time-of-last-evt;
+#X obj 295 223 -;
+#X obj 310 167 t f f;
+#X obj 97 339 s next-evt;
+#X obj 335 201 s time-of-last-evt;
+#X obj 329 251 r delay-multiplier;
+#X text 49 10 This is an abstraction used by the sequencer example.
+;
+#X text 46 45 Here we carry out the actual sequencing. Argument is
+template of the scalar. Note the sends and receives which must agree
+with the rest of the patch.;
+#X connect 0 0 9 0;
+#X connect 1 0 2 1;
+#X connect 2 0 10 0;
+#X connect 3 0 2 0;
+#X connect 6 0 13 0;
+#X connect 6 1 5 0;
+#X connect 7 0 4 0;
+#X connect 9 0 2 0;
+#X connect 9 1 7 1;
+#X connect 9 1 6 0;
+#X connect 10 0 14 0;
+#X connect 10 1 7 0;
+#X connect 11 0 12 1;
+#X connect 12 0 1 0;
+#X connect 13 0 15 0;
+#X connect 13 1 12 0;
+#X connect 16 0 1 1;
diff --git a/pd/doc/7.stuff/data-structures/file.txt b/pd/doc/7.stuff/data-structures/file.txt
new file mode 100644
index 00000000..62b6a167
--- /dev/null
+++ b/pd/doc/7.stuff/data-structures/file.txt
@@ -0,0 +1,39 @@
+data;
+template template-toplevel;
+float x;
+float y;
+float z;
+float q;
+array bazoo template-element;
+;
+template template-element;
+float x;
+float y;
+float w;
+;
+;
+template-toplevel 76 177 -66 85;
+0 0 0;
+30 0 0;
+0 111 8;
+-47 22 0;
+0 0 0;
+0 70 0;
+0 70 70;
+70 70 0;
+0 70 0;
+;
+template-toplevel 196 109 77 802;
+-20 77 0;
+0 0 4;
+67 59 0;
+0 76 12;
+-45 -68 0;
+;
+template-toplevel 150 250 20 80;
+0 0 0;
+40 0 4;
+60 50 0;
+100 30 3;
+200 0 0;
+;
diff --git a/pd/doc/7.stuff/data-structures/score.txt b/pd/doc/7.stuff/data-structures/score.txt
new file mode 100644
index 00000000..84ef0376
--- /dev/null
+++ b/pd/doc/7.stuff/data-structures/score.txt
@@ -0,0 +1,94 @@
+data;
+template template-toplevel;
+float x;
+float y;
+float voiceno;
+array pitch template-pitch;
+array amp template-amp;
+;
+template template-pitch;
+float x;
+float y;
+float w;
+;
+template template-amp;
+float x;
+float y;
+float w;
+;
+;
+template-toplevel 2 246 900;
+0 0 50;
+10 0 50;
+;
+0 0 0;
+10 0 10;
+11 0 0;
+;
+template-toplevel 13 220 990;
+0 0 50;
+10 0 50;
+;
+0 0 10;
+10 0 10;
+11 0 0;
+;
+template-toplevel 34 73 90;
+0 250 50;
+100 50 0;
+100 50 50;
+230 200 0;
+230 50 10;
+240 300 1;
+240 100 50;
+250 250 1;
+250 150 50;
+260 250 1;
+285 250 1;
+;
+0 0 2;
+100 0 5;
+200 0 6;
+225 0 2;
+230 0 5;
+260 0 10;
+261 0 5;
+265 0 0;
+266 0 6;
+270 0 0;
+271 0 8;
+275 0 0;
+276 0 10;
+280 0 0;
+281 0 12;
+285 0 0;
+;
+template-toplevel 67 282 900;
+0 20 1;
+60 20 1;
+;
+0 0 0;
+30 0 14;
+60 0 0;
+;
+template-toplevel 141 322 900;
+0 0 50;
+70 -70 50;
+;
+0 0 0;
+10 0 10;
+20 0 0;
+30 0 0;
+40 0 10;
+50 0 0;
+60 0 10;
+70 0 0;
+;
+template-toplevel 326 192 909;
+0 0 50;
+50 0 50;
+;
+0 0 15;
+10 0 10;
+50 0 0;
+;
diff --git a/pd/doc/7.stuff/data-structures/voice.pd b/pd/doc/7.stuff/data-structures/voice.pd
new file mode 100644
index 00000000..2d124db7
--- /dev/null
+++ b/pd/doc/7.stuff/data-structures/voice.pd
@@ -0,0 +1,127 @@
+#N canvas 0 34 918 591 12;
+#X obj 180 96 inlet;
+#X obj 169 288 pack;
+#X obj 169 395 line~;
+#X obj 169 238 sqrt;
+#X obj 169 262 sqrt;
+#X obj 169 480 *~;
+#X obj 169 419 *~;
+#X obj 169 443 *~;
+#X obj 92 478 inlet~;
+#X obj 92 526 outlet~;
+#X obj 92 502 +~;
+#X obj 436 411 line~;
+#X obj 436 435 *~;
+#X obj 436 459 *~;
+#X obj 436 283 mtof;
+#X obj 394 187 +;
+#X obj 436 307 sqrt;
+#X obj 436 331 sqrt;
+#X obj 436 387 pack;
+#X obj 169 214 / 6;
+#X obj 189 343 r reset;
+#X msg 189 367 0 20;
+#X obj 180 120 data-start template-toplevel;
+#X obj 6 150 data-array template-toplevel amp template-amp;
+#X obj 433 148 data-array template-toplevel pitch template-pitch;
+#X obj 308 437 noise~;
+#X obj 477 259 +;
+#X obj 477 282 mtof;
+#X obj 477 306 sqrt;
+#X obj 477 330 sqrt;
+#X obj 477 411 line~;
+#X obj 477 435 *~;
+#X obj 477 459 *~;
+#X obj 477 387 pack;
+#X obj 394 411 line~;
+#X obj 394 435 *~;
+#X obj 394 459 *~;
+#X obj 394 387 pack;
+#X obj 394 284 mtof;
+#X obj 394 308 sqrt;
+#X obj 394 332 sqrt;
+#X obj 394 262 -;
+#X obj 240 520 vcf~ 10;
+#X obj 315 520 vcf~ 10;
+#X obj 390 516 vcf~ 10;
+#X text 13 7 This is an abstraction used in the sequencer example.
+Here we take care of the audio synthesis \, according to timed controls
+from the the "data-start" and "data-array" subpatches.;
+#X text 505 458 calculate time-varying center frequencies;
+#X text 470 512 ... for three VCFs acting on a noise source.;
+#X text 92 394 Amplitude;
+#X text 93 410 envelope;
+#X text 117 508 summing bus;
+#X text 346 62 Pitch is in eighth-tones (because 4 pixels per half
+tone looks reasonable on the screen.) Hence the * 0.25 objects below.
+;
+#X obj 394 209 * 0.25;
+#X obj 493 233 * 0.25;
+#X obj 394 230 + 24;
+#X connect 0 0 22 0;
+#X connect 1 0 2 0;
+#X connect 2 0 6 0;
+#X connect 2 0 6 1;
+#X connect 3 0 4 0;
+#X connect 4 0 1 0;
+#X connect 5 0 10 1;
+#X connect 6 0 7 0;
+#X connect 6 0 7 1;
+#X connect 7 0 5 0;
+#X connect 8 0 10 0;
+#X connect 10 0 9 0;
+#X connect 11 0 12 0;
+#X connect 11 0 12 1;
+#X connect 12 0 13 0;
+#X connect 12 0 13 1;
+#X connect 13 0 43 1;
+#X connect 14 0 16 0;
+#X connect 15 0 52 0;
+#X connect 16 0 17 0;
+#X connect 17 0 18 0;
+#X connect 18 0 11 0;
+#X connect 19 0 3 0;
+#X connect 20 0 21 0;
+#X connect 21 0 2 0;
+#X connect 22 0 23 0;
+#X connect 22 0 24 0;
+#X connect 22 1 15 1;
+#X connect 23 1 19 0;
+#X connect 23 2 1 1;
+#X connect 24 0 15 0;
+#X connect 24 1 53 0;
+#X connect 24 2 18 1;
+#X connect 24 2 37 1;
+#X connect 24 2 33 1;
+#X connect 25 0 42 0;
+#X connect 25 0 43 0;
+#X connect 25 0 44 0;
+#X connect 26 0 27 0;
+#X connect 27 0 28 0;
+#X connect 28 0 29 0;
+#X connect 29 0 33 0;
+#X connect 30 0 31 0;
+#X connect 30 0 31 1;
+#X connect 31 0 32 0;
+#X connect 31 0 32 1;
+#X connect 32 0 44 1;
+#X connect 33 0 30 0;
+#X connect 34 0 35 0;
+#X connect 34 0 35 1;
+#X connect 35 0 36 0;
+#X connect 35 0 36 1;
+#X connect 36 0 42 1;
+#X connect 37 0 34 0;
+#X connect 38 0 39 0;
+#X connect 39 0 40 0;
+#X connect 40 0 37 0;
+#X connect 41 0 38 0;
+#X connect 42 0 5 1;
+#X connect 43 0 5 1;
+#X connect 44 0 5 1;
+#X connect 52 0 54 0;
+#X connect 53 0 26 1;
+#X connect 53 0 41 1;
+#X connect 54 0 41 0;
+#X connect 54 0 26 0;
+#X connect 54 0 14 0;
diff --git a/pd/doc/7.stuff/data-structures/z.txt b/pd/doc/7.stuff/data-structures/z.txt
new file mode 100644
index 00000000..6cdd0a4a
--- /dev/null
+++ b/pd/doc/7.stuff/data-structures/z.txt
@@ -0,0 +1,64 @@
+data;
+template template5;
+float x;
+float y;
+float z;
+float q;
+array bazoo template5-element;
+;
+template template5-element;
+float y;
+;
+;
+template5 50 150 30 9;
+0;
+0;
+0;
+0;
+0;
+3;
+0;
+0;
+0;
+7;
+-30;
+0;
+0;
+0;
+0;
+0;
+-4;
+-18;
+-26;
+-36;
+-46;
+-62;
+-74;
+-78;
+-70;
+-62;
+-52;
+-40;
+-30;
+-20;
+-4;
+1;
+7;
+11;
+13;
+0;
+0;
+0;
+0;
+0;
+0;
+0;
+0;
+0;
+0;
+43;
+0;
+0;
+0;
+0;
+;