aboutsummaryrefslogtreecommitdiff
path: root/doc/additional
diff options
context:
space:
mode:
authorGuenter Geiger <ggeiger@users.sourceforge.net>2002-11-13 08:53:08 +0000
committerGuenter Geiger <ggeiger@users.sourceforge.net>2002-11-13 08:53:08 +0000
commit59b6ed633cd63ec112f4367365ac14479a8e4120 (patch)
tree93246a8e380042152689005b2e50a542b03c5bd9 /doc/additional
parent02a5595973b61d2cf789b9074167ed73b928d157 (diff)
This commit was generated by cvs2svn to compensate for changes in r208,
which included commits to RCS files with non-trunk default branches. svn path=/trunk/; revision=209
Diffstat (limited to 'doc/additional')
-rwxr-xr-xdoc/additional/pd-msg/0.intro.txt152
-rwxr-xr-xdoc/additional/pd-msg/1.msg_and_patch/0.all_msg.pd82
-rwxr-xr-xdoc/additional/pd-msg/1.msg_and_patch/1.0.objects.pd28
-rwxr-xr-xdoc/additional/pd-msg/1.msg_and_patch/1.1.add_objects.pd59
-rwxr-xr-xdoc/additional/pd-msg/1.msg_and_patch/1.2.create_patch.pd29
-rwxr-xr-xdoc/additional/pd-msg/1.msg_and_patch/1.3.show_hide.pd9
-rwxr-xr-xdoc/additional/pd-msg/1.msg_and_patch/2.menu.pd36
-rwxr-xr-xdoc/additional/pd-msg/1.msg_and_patch/3.0.events.pd32
-rwxr-xr-xdoc/additional/pd-msg/1.msg_and_patch/3.1.motion.pd35
-rwxr-xr-xdoc/additional/pd-msg/1.msg_and_patch/3.2.cut_paste.pd55
-rwxr-xr-xdoc/additional/pd-msg/1.msg_and_patch/4.fonts.pd24
-rwxr-xr-xdoc/additional/pd-msg/1.msg_and_patch/5.loadbang.pd16
-rwxr-xr-xdoc/additional/pd-msg/2.msg_and_pd/1.pd_basic.pd15
-rwxr-xr-xdoc/additional/pd-msg/2.msg_and_pd/2.open_close.pd9
-rwxr-xr-xdoc/additional/pd-msg/3.pdscript/README16
-rwxr-xr-xdoc/additional/pd-msg/3.pdscript/lisp.pd2
-rwxr-xr-xdoc/additional/pd-msg/3.pdscript/pdsendbin0 -> 5120 bytes
-rwxr-xr-xdoc/additional/pd-msg/3.pdscript/test.sh38
-rwxr-xr-xdoc/additional/pd-msg/3.pdscript/test.txt83
-rwxr-xr-xdoc/additional/pd-msg/4.msg_from_tcl/0.create_dummy_patch18
-rwxr-xr-xdoc/additional/pd-msg/4.msg_from_tcl/1.tcl2pd33
-rwxr-xr-xdoc/additional/pd-msg/4.msg_from_tcl/2.nogui35
-rwxr-xr-xdoc/additional/pd-msg/4.msg_from_tcl/2.nogui.txt12
-rwxr-xr-xdoc/additional/pd-msg/4.msg_from_tcl/recv.pd5
-rwxr-xr-xdoc/additional/pd-msg/4.msg_from_tcl/test.pd9
-rwxr-xr-xdoc/additional/pd-msg/5.examples/1.polyphonie.pd99
-rwxr-xr-xdoc/additional/pd-msg/5.examples/2.create_new_abstract.pd29
-rwxr-xr-xdoc/additional/pd-msg/5.examples/asound.pd52
28 files changed, 1012 insertions, 0 deletions
diff --git a/doc/additional/pd-msg/0.intro.txt b/doc/additional/pd-msg/0.intro.txt
new file mode 100755
index 00000000..55b15591
--- /dev/null
+++ b/doc/additional/pd-msg/0.intro.txt
@@ -0,0 +1,152 @@
+Here some documentation about internal pd messages.
+(pd-msg_05)
+
+1) Thoses msg are sent directly to pd (pd selector) or to a loaded patch (pd-patch.pd selector).
+ all thoses msg has to be finnished by a ";"
+ you can test them using :
+ in the file menu : message
+ pdsend
+ the tclsend2pd in the 4.msg_from_tcl folder.
+
+ Thoses message allows you (examples):
+ To control pd without the gui :
+ Take benefit of the no-gui option
+ open a patch via socket... (tcl, python, sh, c++,...)
+ modify or create new patch
+ Create patch that will create some other
+ Deals with massive polyphonie (100 osc~ or more...)
+ load patchs from an other
+ construct generative patch
+ Create new gui
+ etc...
+
+2) Here an list of those msg (* are documented somewhere in this doc):
+
+ messages to pd:
+ init [gimme]
+ filename [symbol] [symbol]
+ * open [symbol] [symbol]
+ * quit
+ foo [gimme]
+ * dsp [gimme]
+ meters [float]
+ key [gimme]
+ * audiostatus
+ finderror
+ ping
+
+ messages to canvas:
+ * obj [gimme]
+ * msg [gimme]
+ * floatatom [gimme]
+ * symbolatom [gimme]
+ * text [gimme]
+ * graph [gimme]
+ * array
+ * scalar [gimme]
+ bng [gimme]
+ toggle [gimme]
+ vslider [gimme]
+ hslider [gimme]
+ radio [gimme]
+ vumeter [gimme]
+ mycnv [gimme]
+ * connect [float] [float] [float] [float]
+ * restore [gimme]
+ write [symbol] [defsymbol]
+ read [symbol] [defsymbol]
+ mergefile [symbol] [defsymbol]
+ sort
+ * click [float] [float] [float] [float]
+ * mouseup [float] [float] [float]
+ * key [gimme]
+ * motion [float] [float] [float]
+ * print [symbol]
+ * menusave
+ * menusaveas
+ * menuclose [deffloat]
+ * saveto [symbol] [symbol]
+ * cut
+ * copy
+ * paste
+ * duplicate
+ * selectall
+ * tidy
+ * texteditor
+ * editmode [deffloat]
+ protectmode [deffloat]
+ * print [symbol]
+ * pop [deffloat]
+ * loadbang
+ * relocate [symbol] [symbol]
+ * menufont
+ * font [float] [float] [float]
+ * find [gimme]
+ * findagain
+ * findparent
+ * vis [float]
+ properties [float] [float]
+ help [float] [float]
+ arraydialog [symbol] [float] [float] [float]
+ map [float]
+ clear
+ intatom [gimme]
+ atom [gimme]
+
+
+
+3) Here the map of the documentation :
+ 1.msg_and_patch
+ describe msg that can be sent to patch.
+ contains pd files
+
+ 2.msg_and_pd
+ describe msg that can be sent to pd.
+ contains pd files
+
+ 3.pdscript
+ it's sh scrip using pdsend to create patch into pd.
+ pdscript has been done by Guenter Geiger
+ contains it's own readme + files.
+
+ 4.msg_from_tcl/tk
+ decribe how to use tcl/tk to create, open patch, etc...
+
+ 5.Examples
+ Contain an example of how a "obj x y myOsc~" message can be use
+ to deal with massive polyphonie
+
+4) Releases :
+
+ release 0.5 : pd-msg_05.tar.gz
+ add some more msg.
+ Thanks to Krzysztof Czaja
+ all msg are listed for pd0.34
+
+ release 0.4 : pd-msg_04.tar.gz
+ add many message :
+ the events messages
+ the menu messages
+ the cut&paste msg, etc...
+ complete the polyphonie example
+
+ release 0.3 : pd-msg
+ Rearenge patch & examples in diferents directory.
+ add polyphonie examples
+ add tcl scripts...
+
+ release 0.2 : self-generation
+ add messages to open and close patch.
+
+ release 0.1 : self-construction
+ first release
+
+5) To do list :
+
+ some msg are not well explain or not explain at all.
+
+6) Reference :
+ Look @ the end of code of g_canvas.c in the source directory.
+
+
+Damien HENRY \ No newline at end of file
diff --git a/doc/additional/pd-msg/1.msg_and_patch/0.all_msg.pd b/doc/additional/pd-msg/1.msg_and_patch/0.all_msg.pd
new file mode 100755
index 00000000..53427be0
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/0.all_msg.pd
@@ -0,0 +1,82 @@
+#N canvas 708 185 541 701 10;
+#X text 14 2 Here the list of all the messages :;
+#X msg 40 207 array 500 190;
+#X msg 40 233 scalar 500 220;
+#X msg 40 318 restore;
+#X msg 40 292 connect \$1 \$2 \$3 \$4;
+#X text 16 28 objects;
+#X text 17 267 methods for reading files;
+#X text 20 345 events;
+#X msg 40 376 click \$1 \$2 \$3 \$4;
+#X msg 40 426 mouseup \$1 \$2 \$3;
+#X text 375 6 GUI stuff;
+#X msg 375 30 menusave;
+#X msg 375 56 menusaveas;
+#X msg 375 82 menuclose;
+#X msg 375 108 saveto;
+#X msg 375 194 cut;
+#X msg 375 217 copy;
+#X msg 375 266 duplicate;
+#X msg 375 134 tidy;
+#X msg 375 160 texteditor;
+#X msg 375 464 editmode \$1;
+#X msg 375 536 print;
+#X msg 375 622 pop;
+#X msg 375 500 loadbang;
+#X msg 375 572 relocate;
+#X msg 375 307 menufont;
+#X msg 375 331 font 10 100 100;
+#X msg 375 402 findagain;
+#X msg 375 426 findparent;
+#X msg 375 598 vis;
+#X obj 40 631 s pd-0.all_msg.pd;
+#X obj 375 652 s pd-0.all_msg.pd;
+#X msg 40 51 obj 300 10 r test;
+#X msg 40 77 msg 300 40 bang;
+#X msg 40 129 symbolatom 300 100 symbol;
+#X msg 40 155 text 300 130 comment;
+#X msg 40 181 graph;
+#X msg 40 499 key 1 \$1;
+#X text 456 81 Warnnig !!!;
+#X text 426 109 ?????;
+#X text 149 234 ?????;
+#X msg 375 242 paste;
+#X msg 375 379 find test;
+#X text 443 570 ?????;
+#X msg 40 401 motion \$1 \$2 \$3;
+#X msg 40 103 floatatom 300 70;
+#X connect 1 0 30 0;
+#X connect 2 0 30 0;
+#X connect 3 0 30 0;
+#X connect 4 0 30 0;
+#X connect 8 0 30 0;
+#X connect 9 0 30 0;
+#X connect 11 0 31 0;
+#X connect 12 0 31 0;
+#X connect 13 0 31 0;
+#X connect 14 0 31 0;
+#X connect 15 0 31 0;
+#X connect 16 0 31 0;
+#X connect 17 0 31 0;
+#X connect 18 0 31 0;
+#X connect 19 0 31 0;
+#X connect 20 0 31 0;
+#X connect 21 0 31 0;
+#X connect 22 0 31 0;
+#X connect 23 0 31 0;
+#X connect 24 0 31 0;
+#X connect 25 0 31 0;
+#X connect 26 0 31 0;
+#X connect 27 0 31 0;
+#X connect 28 0 31 0;
+#X connect 29 0 31 0;
+#X connect 32 0 30 0;
+#X connect 33 0 30 0;
+#X connect 34 0 30 0;
+#X connect 35 0 30 0;
+#X connect 36 0 30 0;
+#X connect 37 0 30 0;
+#X connect 41 0 31 0;
+#X connect 42 0 31 0;
+#X connect 44 0 30 0;
+#X connect 45 0 30 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/1.0.objects.pd b/doc/additional/pd-msg/1.msg_and_patch/1.0.objects.pd
new file mode 100755
index 00000000..cacf9eef
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/1.0.objects.pd
@@ -0,0 +1,28 @@
+#N canvas 656 148 543 410 10;
+#X msg 39 237 array 500 190;
+#X msg 39 263 scalar 500 220;
+#X msg 39 348 restore;
+#X msg 39 322 connect \$1 \$2 \$3 \$4;
+#X text 15 58 objects;
+#X text 16 297 methods for reading files;
+#X msg 39 81 obj 300 10 r test;
+#X msg 39 107 msg 300 40 bang;
+#X msg 39 133 floatatom 300 70 symbol;
+#X msg 39 159 symbolatom 300 100 symbol;
+#X msg 39 185 text 300 130 comment;
+#X msg 39 211 graph;
+#X text 148 264 ?????;
+#X obj 39 383 s pd-1.0.objects.pd;
+#X text 110 348 ??????;
+#X text 16 7 Here the list of all the messages;
+#X text 17 24 that deals with objects.;
+#X connect 0 0 13 0;
+#X connect 1 0 13 0;
+#X connect 2 0 13 0;
+#X connect 3 0 13 0;
+#X connect 6 0 13 0;
+#X connect 7 0 13 0;
+#X connect 8 0 13 0;
+#X connect 9 0 13 0;
+#X connect 10 0 13 0;
+#X connect 11 0 13 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/1.1.add_objects.pd b/doc/additional/pd-msg/1.msg_and_patch/1.1.add_objects.pd
new file mode 100755
index 00000000..f9ba0822
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/1.1.add_objects.pd
@@ -0,0 +1,59 @@
+#N canvas 67 167 711 648 10;
+#X text 42 13 To add an object into patch just send a message to the
+patch itself :;
+#X msg 42 49 msg 500 10 bang;
+#X text 42 98 The selector should be "msg" \, "floatatom" \, "obj"
+\, "text" \, "array" \, "symbolatom" \, "scalar" and "graph";
+#X text 224 53 <= Click here first;
+#X text 42 279 For connecting objects use the selector "connect". it
+take 4 arguments : the number of the first object \, the number of
+the outlet \, the number of the second object \, and the number of
+the inlet :;
+#X text 207 232 <= and here;
+#X text 236 204 <= Then click here (and have a look to the properties
+of the object created);
+#X text 193 348 <= click here <= and here;
+#X text 42 437 And now the end of this exemple :;
+#X text 42 143 The next 2 numbers are X & Y position in the canvas.
+Then it's a symbol for the name of the obj \, the content of the msg
+\, etc... and some additionals parameters.;
+#X msg 42 205 floatatom 600 10 7 50 5000;
+#X msg 42 230 obj 500 40 metro 500;
+#X msg 42 482 obj 500 70 random 127;
+#X msg 42 532 floatatom 500 100 5;
+#X msg 42 582 text 500 130 That's it !;
+#X text 16 53 1;
+#X text 20 204 2;
+#X text 20 226 3;
+#X text 18 348 4;
+#X text 18 370 5;
+#X text 20 483 6;
+#X text 20 509 7;
+#X text 20 532 8;
+#X text 19 556 9;
+#X text 14 582 10;
+#X text 276 530 !!! W A R N N I N G !!! It's very important to respect
+the order the objects are created. If you don't the "connect" selector
+won't work correctly. If you are not sure \, reload this patch and
+try again.;
+#X msg 43 349 connect 34 0 36 0;
+#X msg 43 374 connect 35 0 36 1;
+#X msg 42 507 connect 36 0 37 0;
+#X msg 42 557 connect 37 0 38 0;
+#X obj 42 74 s pd-1.add_objects.pd;
+#X obj 42 255 s pd-1.add_objects.pd;
+#X obj 43 399 s pd-1.add_objects.pd;
+#X obj 42 612 s pd-1.add_objects.pd;
+#X connect 1 0 30 0;
+#X connect 10 0 31 0;
+#X connect 11 0 31 0;
+#X connect 12 0 33 0;
+#X connect 13 0 33 0;
+#X connect 14 0 33 0;
+#X connect 26 0 32 0;
+#X connect 27 0 32 0;
+#X connect 27 0 32 0;
+#X connect 27 0 32 0;
+#X connect 27 0 32 0;
+#X connect 28 0 33 0;
+#X connect 29 0 33 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/1.2.create_patch.pd b/doc/additional/pd-msg/1.msg_and_patch/1.2.create_patch.pd
new file mode 100755
index 00000000..2e422d5f
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/1.2.create_patch.pd
@@ -0,0 +1,29 @@
+#N canvas 181 410 915 475 10;
+#X msg 38 150 msg 10 10 bang;
+#X msg 38 198 obj 10 40 metro 500;
+#X msg 38 174 floatatom 100 10 7 50 5000;
+#X msg 38 270 obj 10 70 random 127;
+#X msg 38 318 floatatom 10 100 5;
+#X msg 38 366 text 10 130 That's it !;
+#X msg 38 222 connect 0 0 2 0;
+#X msg 38 246 connect 1 0 2 1;
+#X msg 38 294 connect 2 0 3 0;
+#X msg 38 342 connect 3 0 4 0;
+#X text 205 37 click here first;
+#X obj 38 404 s pd-new_patch;
+#X text 33 13 This will create a sub patch in this windows and open
+it :;
+#X msg 33 37 obj 500 200 pd new_patch;
+#X text 40 127 and then click here to fill it :;
+#X obj 33 62 s pd-1.2.create_patch.pd;
+#X connect 0 0 11 0;
+#X connect 1 0 11 0;
+#X connect 2 0 11 0;
+#X connect 3 0 11 0;
+#X connect 4 0 11 0;
+#X connect 5 0 11 0;
+#X connect 6 0 11 0;
+#X connect 7 0 11 0;
+#X connect 8 0 11 0;
+#X connect 9 0 11 0;
+#X connect 13 0 15 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/1.3.show_hide.pd b/doc/additional/pd-msg/1.msg_and_patch/1.3.show_hide.pd
new file mode 100755
index 00000000..b0f866a0
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/1.3.show_hide.pd
@@ -0,0 +1,9 @@
+#N canvas 198 107 383 241 10;
+#N canvas 209 154 262 142 my-subpatch 0;
+#X text 37 40 This is the sub patch;
+#X restore 215 98 pd my-subpatch;
+#X msg 33 62 \; pd-my-subpatch vis 1;
+#X msg 37 127 \; pd-my-subpatch vis 0;
+#X text 43 42 pop-up;
+#X text 40 109 close;
+#X text 13 17 pop-up and close a subpatch :;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/2.menu.pd b/doc/additional/pd-msg/1.msg_and_patch/2.menu.pd
new file mode 100755
index 00000000..7256ffe4
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/2.menu.pd
@@ -0,0 +1,36 @@
+#N canvas 22 196 222 608 10;
+#X text 17 121 GUI stuff;
+#X msg 17 145 menusave;
+#X msg 17 171 menusaveas;
+#X msg 17 197 menuclose;
+#X msg 17 223 saveto;
+#X msg 17 249 tidy;
+#X msg 17 275 texteditor;
+#X msg 17 434 editmode \$1;
+#X msg 35 408 0;
+#X msg 69 408 1;
+#X msg 17 460 print;
+#X msg 17 301 menufont;
+#X msg 17 353 findagain;
+#X msg 17 379 findparent;
+#X text 68 222 ?????;
+#X msg 17 327 find test;
+#X obj 17 496 s pd-2.menu.pd;
+#X text 98 196 Warnning !!!;
+#X text 15 14 Thoes msg will do exactly;
+#X text 17 33 what the corresponding;
+#X text 19 52 menu do.;
+#X connect 1 0 16 0;
+#X connect 2 0 16 0;
+#X connect 3 0 16 0;
+#X connect 4 0 16 0;
+#X connect 5 0 16 0;
+#X connect 6 0 16 0;
+#X connect 7 0 16 0;
+#X connect 8 0 7 0;
+#X connect 9 0 7 0;
+#X connect 10 0 16 0;
+#X connect 11 0 16 0;
+#X connect 12 0 16 0;
+#X connect 13 0 16 0;
+#X connect 15 0 16 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/3.0.events.pd b/doc/additional/pd-msg/1.msg_and_patch/3.0.events.pd
new file mode 100755
index 00000000..f864ad40
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/3.0.events.pd
@@ -0,0 +1,32 @@
+#N canvas 204 161 381 325 10;
+#X msg 36 86 click \$1 \$2 \$3 \$4;
+#X obj 111 182 key;
+#X floatatom 111 208 0 0 0;
+#X floatatom 50 184 0 0 0;
+#X msg 50 158 0;
+#X msg 6 6 bang;
+#X text 56 41 left;
+#X text 124 41 rigth;
+#X text 70 4 Msg-dealing with events :;
+#X text 89 28 click;
+#X text 218 47 \$1 x;
+#X text 219 65 \$2 y;
+#X text 218 117 \$4 mod (0:nomod \; 1 shift \; 2 crtl \; 3 alt \; 4
+right click);
+#X obj 36 290 s pd-3.0.events.pd;
+#X text 218 86 \$3 (unuse ???);
+#X msg 36 129 mouseup \$1 \$2 \$4;
+#X msg 113 60 15 15 0 8;
+#X msg 36 60 15 15 0 1;
+#X text 59 232 \$1 number of the key;
+#X msg 36 209 key 1 \$1;
+#X msg 36 257 motion \$1 \$2 \$4;
+#X connect 0 0 13 0;
+#X connect 1 0 2 0;
+#X connect 3 0 19 0;
+#X connect 4 0 3 0;
+#X connect 15 0 13 0;
+#X connect 16 0 0 0;
+#X connect 17 0 0 0;
+#X connect 19 0 13 0;
+#X connect 20 0 13 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/3.1.motion.pd b/doc/additional/pd-msg/1.msg_and_patch/3.1.motion.pd
new file mode 100755
index 00000000..f281242f
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/3.1.motion.pd
@@ -0,0 +1,35 @@
+#N canvas 184 269 411 486 10;
+#N canvas 654 338 332 294 testing 0;
+#X obj 95 11 loadbang;
+#X msg 95 36 0;
+#X obj 12 37 random 127;
+#X floatatom 66 94 0 0 0;
+#X msg 12 11 bang;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 2 0 3 0;
+#X connect 4 0 2 0;
+#X restore 119 439 pd testing;
+#X obj 20 438 s pd-testing;
+#X obj 89 247 pack f f;
+#X text 8 54 Start here;
+#X floatatom 120 185 0 0 0;
+#X floatatom 89 186 0 0 0;
+#X obj 100 219 t b f;
+#X text 7 363 Stop here;
+#X text 85 154 try this !!!;
+#X text 9 9 This example will show you how to use the motion msg.;
+#X msg 20 101 click 15 15 0 0;
+#X msg 89 271 motion \$1 \$2 0;
+#X msg 20 390 motion 15 15 0 \, editmode 0 \, vis 0;
+#X msg 20 75 vis 1 \, editmode 1 \, click 5 5 0 0 \, mouseup 200 200
+0;
+#X connect 2 0 11 0;
+#X connect 4 0 6 0;
+#X connect 5 0 2 0;
+#X connect 6 0 2 0;
+#X connect 6 1 2 1;
+#X connect 10 0 1 0;
+#X connect 11 0 1 0;
+#X connect 12 0 1 0;
+#X connect 13 0 1 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/3.2.cut_paste.pd b/doc/additional/pd-msg/1.msg_and_patch/3.2.cut_paste.pd
new file mode 100755
index 00000000..48db2a4f
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/3.2.cut_paste.pd
@@ -0,0 +1,55 @@
+#N canvas 175 194 409 473 10;
+#N canvas 591 210 328 290 testing 0;
+#X obj 95 10 loadbang;
+#X msg 95 35 0;
+#X obj 12 37 random 127;
+#X floatatom 66 93 0 0 0;
+#X msg 12 11 bang;
+#X obj 95 10 loadbang;
+#X msg 95 35 0;
+#X obj 12 37 random 127;
+#X floatatom 66 93 0 0 0;
+#X msg 12 11 bang;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 2 0 3 0;
+#X connect 4 0 2 0;
+#X connect 5 0 6 0;
+#X connect 6 0 8 0;
+#X connect 7 0 8 0;
+#X connect 9 0 7 0;
+#X restore 315 439 pd testing;
+#X obj 20 438 s pd-testing;
+#X obj 248 211 pack f f;
+#X text 7 40 Start here;
+#X floatatom 279 149 0 0 0;
+#X floatatom 248 148 0 0 0;
+#X obj 259 183 t b f;
+#X text 7 374 Stop here;
+#X text 17 11 This example will show you how to use the motion msg.
+;
+#X msg 194 322 cut;
+#X msg 194 348 duplicate;
+#X msg 20 60 vis 1 \, editmode 1 \, click 5 5 0 0 \, mouseup 200 200
+0;
+#X msg 20 399 motion 15 15 \, editmode0 \, vis 0;
+#X text 50 81 show and select what's in the patch;
+#X text 151 419 close all;
+#X text 232 324 you can try thoses too.;
+#X text 66 125 and then here to copy and here to move;
+#X msg 31 256 mouseup 200 200 0;
+#X text 49 236 to acheive the pasting;
+#X msg 37 146 copy \, paste \, click 15 15 0 0;
+#X msg 248 235 motion \$1 \$2 0;
+#X connect 2 0 20 0;
+#X connect 4 0 6 0;
+#X connect 5 0 2 0;
+#X connect 6 0 2 0;
+#X connect 6 1 2 1;
+#X connect 9 0 1 0;
+#X connect 10 0 1 0;
+#X connect 11 0 1 0;
+#X connect 12 0 1 0;
+#X connect 17 0 1 0;
+#X connect 19 0 1 0;
+#X connect 20 0 1 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/4.fonts.pd b/doc/additional/pd-msg/1.msg_and_patch/4.fonts.pd
new file mode 100755
index 00000000..c7ee019b
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/4.fonts.pd
@@ -0,0 +1,24 @@
+#N canvas 43 70 405 234 10;
+#X msg 12 26 menufont;
+#X msg 32 64 font 10 100 100;
+#X msg 32 88 font 14 100 100;
+#X msg 30 114 font 24 100 100;
+#X msg 158 86 50;
+#X msg 198 86 200;
+#X msg 158 112 font 10 100 \$1;
+#X msg 274 84 50;
+#X msg 314 84 200;
+#X msg 274 112 font 10 \$1 100;
+#X text 14 3 Here the list of all the messages dealing with fonts :
+;
+#X obj 14 196 s pd-4.fonts.pd;
+#X connect 0 0 11 0;
+#X connect 1 0 11 0;
+#X connect 2 0 11 0;
+#X connect 3 0 11 0;
+#X connect 4 0 6 0;
+#X connect 5 0 6 0;
+#X connect 6 0 11 0;
+#X connect 7 0 9 0;
+#X connect 8 0 9 0;
+#X connect 9 0 11 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/5.loadbang.pd b/doc/additional/pd-msg/1.msg_and_patch/5.loadbang.pd
new file mode 100755
index 00000000..68d79b6a
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/5.loadbang.pd
@@ -0,0 +1,16 @@
+#N canvas 619 324 275 289 10;
+#X msg 39 236 loadbang;
+#X obj 62 122 loadbang;
+#X msg 62 148 1;
+#X floatatom 62 174 0 0 0;
+#X obj 29 93 random 127;
+#X msg 29 68 bang;
+#X text 26 13 The loadbang message;
+#X text 81 68 <= click here first;
+#X text 118 234 <= then click here;
+#X obj 39 262 s pd-5.loadbang.pd;
+#X connect 0 0 9 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 0;
diff --git a/doc/additional/pd-msg/2.msg_and_pd/1.pd_basic.pd b/doc/additional/pd-msg/2.msg_and_pd/1.pd_basic.pd
new file mode 100755
index 00000000..48ec9f24
--- /dev/null
+++ b/doc/additional/pd-msg/2.msg_and_pd/1.pd_basic.pd
@@ -0,0 +1,15 @@
+#N canvas 312 164 378 475 10;
+#X text 20 51 turn DSP calculation off & on;
+#X msg 98 94 \; pd dsp 0 \;;
+#X msg 172 94 \; pd dsp 1 \;;
+#X msg 24 301 \; pd quit \;;
+#X floatatom 26 73 1 0 1;
+#X obj 26 123 s pd;
+#X msg 26 97 dsp \$1;
+#X msg 25 218 \; pd audiostatus \;;
+#X text 22 194 same as "DIO errors";
+#X text 25 12 Here some message we can send to pd.;
+#X text 21 275 Quit pd (WARNNING);
+#X text 21 356 There are many more that i don't know :-(;
+#X connect 4 0 6 0;
+#X connect 6 0 5 0;
diff --git a/doc/additional/pd-msg/2.msg_and_pd/2.open_close.pd b/doc/additional/pd-msg/2.msg_and_pd/2.open_close.pd
new file mode 100755
index 00000000..6b0adabf
--- /dev/null
+++ b/doc/additional/pd-msg/2.msg_and_pd/2.open_close.pd
@@ -0,0 +1,9 @@
+#N canvas 189 280 494 273 10;
+#X text 10 4 open and close an abstraction;
+#X text 23 85 (you have to put a corect name & valid path);
+#X text 25 114 close;
+#X text 26 30 open;
+#X msg 25 50 \; pd open your_abs.pd ./your_path \;;
+#X msg 26 135 \; pd pd-your_abs.pd menuclose \;;
+#X text 23 171 (you have to put a corect name & valid path);
+#X text 64 197 Those last 2 tricks came from Miller \, but i didn't succed to make them work. hope somebody will be more lucky.;
diff --git a/doc/additional/pd-msg/3.pdscript/README b/doc/additional/pd-msg/3.pdscript/README
new file mode 100755
index 00000000..dbfc7054
--- /dev/null
+++ b/doc/additional/pd-msg/3.pdscript/README
@@ -0,0 +1,16 @@
+This is a short example how to "script" a pd patch
+with pd commands.
+
+First start pd
+# pd lisp.pd
+
+Then either start the automated shell script
+# ./test.sh
+
+or pipe the pd commands to pdsend directly:
+
+# pdsend 3005 < test.txt
+
+Read through text.txt for further explanations
+
+Guenter
diff --git a/doc/additional/pd-msg/3.pdscript/lisp.pd b/doc/additional/pd-msg/3.pdscript/lisp.pd
new file mode 100755
index 00000000..34dfa190
--- /dev/null
+++ b/doc/additional/pd-msg/3.pdscript/lisp.pd
@@ -0,0 +1,2 @@
+#N canvas 417 30 252 94 10;
+#X obj 39 27 netreceive 3005 0 old;
diff --git a/doc/additional/pd-msg/3.pdscript/pdsend b/doc/additional/pd-msg/3.pdscript/pdsend
new file mode 100755
index 00000000..cf6339e6
--- /dev/null
+++ b/doc/additional/pd-msg/3.pdscript/pdsend
Binary files differ
diff --git a/doc/additional/pd-msg/3.pdscript/test.sh b/doc/additional/pd-msg/3.pdscript/test.sh
new file mode 100755
index 00000000..107d3ec0
--- /dev/null
+++ b/doc/additional/pd-msg/3.pdscript/test.sh
@@ -0,0 +1,38 @@
+#!/bin/sh
+
+PORT=3005
+
+
+function setfreq()
+{
+./pdsend $PORT <<EOF
+freq $1 $2;
+EOF
+}
+
+#
+# Read in the script
+#
+./pdsend $PORT < test.txt
+
+sleep 3
+setfreq 220 5000
+sleep 5
+setfreq 1000 100
+sleep 1
+setfreq 100 50
+sleep 1
+setfreq 3000 1000
+sleep 1
+setfreq 100 1000
+sleep 1
+setfreq 3000 1000
+sleep 1
+setfreq 100 1000
+sleep 1
+setfreq 3000 1000
+sleep 1
+setfreq 100 1000
+# and so on
+
+
diff --git a/doc/additional/pd-msg/3.pdscript/test.txt b/doc/additional/pd-msg/3.pdscript/test.txt
new file mode 100755
index 00000000..652bfed8
--- /dev/null
+++ b/doc/additional/pd-msg/3.pdscript/test.txt
@@ -0,0 +1,83 @@
+
+// create a new canvas with name "new";
+// important to terminate each command to pd with a ";";
+pd filename new ./;
+#N canvas;
+#X pop 1;
+
+// now we create a osc~ i, *~ and a dac~;
+// the first word is the name of the canvas where the objects;
+// are put (with "pd-" prepended .. hence pd-new);
+// then the "obj" keyword;
+// then comes the position x y, propose to increment y for each;
+// object by 30, then the patch can still be read with the gui ;
+// then comes the object name and eventual parameters;
+// object number 0 and 1 and 2;
+
+pd-new obj 10 0 osc~ 220;
+pd-new obj 10 30 *~ 0.1;
+pd-new obj 10 60 dac~;
+
+// we connect them together;
+// we kept track of the objects we have created and can;
+// access them via numbers;
+// pd-new same as above, message connect, then the four parameters;
+// <number-of object> <outlet number> <number of 2nd object> <inlet number>;
+
+pd-new connect 0 0 1 0;
+pd-new connect 1 0 2 0;
+pd-new connect 1 0 2 1;
+
+// we put a comment;
+// object number 3;
+pd-new text 80 0 This is a comment;
+
+// a Message object;
+// object number 4;
+
+pd-new msg 10 90 440;
+
+// connect it to the osc~;
+
+pd-new connect 4 0 0 0;
+
+// and a number object;
+// nr 5;
+
+pd-new floatatom 10 120;
+
+// connect it;
+
+pd-new connect 5 0 0 0;
+
+// put a communication channel for the frequency (a "receive");
+// nr 6;
+
+pd-new obj 10 150 r freq;
+// a line;
+// nr 7;
+pd-new obj 10 180 line;
+
+// connect receive to the line;
+
+pd-new connect 6 0 7 0;
+
+// line to the osc~;
+
+pd-new connect 7 0 0 0;
+
+// turn on audio;
+
+pd dsp 1;
+
+// and ... control it the first word is the name of the receive above;
+
+freq 500 4000;
+
+// that's it, there will be several things to figure out, but by writing;
+// this patch down in ascii I get the feeling that coding pd in lisp;
+// will be a killer ... defininitely.;
+// we will be able to automate lots of things I had to do by hand here;
+
+
+
diff --git a/doc/additional/pd-msg/4.msg_from_tcl/0.create_dummy_patch b/doc/additional/pd-msg/4.msg_from_tcl/0.create_dummy_patch
new file mode 100755
index 00000000..030d0687
--- /dev/null
+++ b/doc/additional/pd-msg/4.msg_from_tcl/0.create_dummy_patch
@@ -0,0 +1,18 @@
+#!/usr/bin/wish -f
+
+#damien HENRY le 2001 07 14
+
+puts "***********************************************"
+puts "* This will create a patch in pure-data *"
+puts "* be sure that the recv.pd file is loadded *"
+puts "***********************************************"
+
+set to_pd [socket localhost 3006]
+
+puts $to_pd "pd-recv.pd obj 10 10 pd new_patch;"
+puts $to_pd "pd-new_patch msg 10 10 bang;"
+puts $to_pd "pd-new_patch msg 10 30 message;"
+puts $to_pd "pd-new_patch connect 0 0 1 0;"
+
+exit
+
diff --git a/doc/additional/pd-msg/4.msg_from_tcl/1.tcl2pd b/doc/additional/pd-msg/4.msg_from_tcl/1.tcl2pd
new file mode 100755
index 00000000..883cc78e
--- /dev/null
+++ b/doc/additional/pd-msg/4.msg_from_tcl/1.tcl2pd
@@ -0,0 +1,33 @@
+#!/usr/bin/wish -f
+
+#Here a small exemple that show how to send msg to pd from TCL.
+#damien HENRY
+#dh20010806
+
+puts "*********************"
+puts "* pd -nogui example *"
+puts "* (c) Damien HENRY *"
+puts "* This is GPL... *"
+puts "*********************"
+puts ""
+puts "WARNING : you need to run pd -open and load recv.pd first"
+
+#definition of the procedure that send msg to pd
+proc pd_send {string2send} {
+ set to_pd [socket localhost 3006]
+ puts $to_pd $string2send
+ .lmsg configure -text $string2send
+ close $to_pd
+}
+
+#create the gui
+wm title . "a simple tcl/tk gui msg-sender to pd"
+button .bsend -text "send to pd" -width 20 -command {pd_send "$pd_rcv $text2send;"}
+button .bq -text "quit" -width 20 -command {exit}
+entry .msg -textvariable text2send -width 30
+entry .pd_rcv -textvariable pd_rcv -width 10
+label .l1 -text "destination"
+label .l2 -text "msg to send"
+label .lmsg
+
+pack .l1 .pd_rcv .l2 .msg .lmsg .bsend .bq \ No newline at end of file
diff --git a/doc/additional/pd-msg/4.msg_from_tcl/2.nogui b/doc/additional/pd-msg/4.msg_from_tcl/2.nogui
new file mode 100755
index 00000000..7911e4b5
--- /dev/null
+++ b/doc/additional/pd-msg/4.msg_from_tcl/2.nogui
@@ -0,0 +1,35 @@
+#!/usr/bin/wish -f
+
+#Here a small exemple that show a way to use the -nogui option.
+#damien HENRY
+#dh20010730
+
+puts "*********************"
+puts "* pd -nogui example *"
+puts "* (c) Damien HENRY *"
+puts "* This is GPL... *"
+puts "*********************"
+puts ""
+puts "WARNING : you need to run pd -open recv.pd -nogui first"
+
+#definition of the procedure that send msg to pd
+proc pd_send {string2send} {
+ set to_pd [socket localhost 3006]
+ puts $to_pd "$string2send;"
+ .lmsg configure -text "$string2send;"
+ close $to_pd
+}
+
+#create the gui
+wm title . "a simple tcl/tk gui to open pd-patch"
+label .l1 -text "open : patch & path"
+entry .pd_patch -textvariable pd_patch -width 23
+entry .pd_path -textvariable pd_path -width 23
+button .bload -text Load -width 20 -command {pd_send "pd open $pd_patch $pd_path" }
+button .bclose -text close -width 20 -command {pd_send "pd-$pd_patch menuclose" }
+button .bdspon -text "dsp on" -width 20 -command {pd_send "pd dsp 1" }
+button .bdspoff -text "dsp off" -width 20 -command {pd_send "pd dsp 0" }
+label .lmsg
+button .bq -text "quit" -width 20 -command {exit}
+
+pack .l1 .pd_patch .pd_path .bload .bclose .bdspon .bdspoff .lmsg .bq \ No newline at end of file
diff --git a/doc/additional/pd-msg/4.msg_from_tcl/2.nogui.txt b/doc/additional/pd-msg/4.msg_from_tcl/2.nogui.txt
new file mode 100755
index 00000000..6bac6017
--- /dev/null
+++ b/doc/additional/pd-msg/4.msg_from_tcl/2.nogui.txt
@@ -0,0 +1,12 @@
+This small example show an easy way to use pd without the classical gui.
+
+
+0) run pd -open recv.pd -nogui
+1) run 2.nogui (use wish83 if you are under win xx)
+2) chose an abstraction to open, for example test.pd (in this folder)
+3) turn the dsp on
+4) here you can listen to your abstraction !!!
+
+Enjoy !!!
+
+Damien HENRY.
diff --git a/doc/additional/pd-msg/4.msg_from_tcl/recv.pd b/doc/additional/pd-msg/4.msg_from_tcl/recv.pd
new file mode 100755
index 00000000..554ab101
--- /dev/null
+++ b/doc/additional/pd-msg/4.msg_from_tcl/recv.pd
@@ -0,0 +1,5 @@
+#N canvas 357 509 628 150 10;
+#X obj 453 26 netreceive 3006 0 old;
+#X text 32 10 This patch is here to receive the commands sended by tcl scripts;
+#X text 27 66 Execute the tcl files in 4.msg_from_tcl. (use wish83if your under Win xx);
+#X text 25 92 Have a look to the TCL source to understand how does this work.;
diff --git a/doc/additional/pd-msg/4.msg_from_tcl/test.pd b/doc/additional/pd-msg/4.msg_from_tcl/test.pd
new file mode 100755
index 00000000..0cf63b09
--- /dev/null
+++ b/doc/additional/pd-msg/4.msg_from_tcl/test.pd
@@ -0,0 +1,9 @@
+#N canvas 357 509 468 150 10;
+#X text 18 101 Have a look to the TCL source to understand how does this work.;
+#X text 32 10 This patch is here to test the 2.nogui script;
+#X obj 35 32 osc~ 440;
+#X obj 34 82 dac~;
+#X obj 35 56 /~ 50;
+#X connect 2 0 4 0;
+#X connect 4 0 3 0;
+#X connect 4 0 3 1;
diff --git a/doc/additional/pd-msg/5.examples/1.polyphonie.pd b/doc/additional/pd-msg/5.examples/1.polyphonie.pd
new file mode 100755
index 00000000..3f44cf03
--- /dev/null
+++ b/doc/additional/pd-msg/5.examples/1.polyphonie.pd
@@ -0,0 +1,99 @@
+#N canvas 96 191 894 406 10;
+#X obj 486 176 s as_b;
+#X floatatom 542 147 0 0 0;
+#X obj 542 171 s as_f;
+#X floatatom 617 150 0 0 0;
+#X obj 617 174 s as_bw;
+#X msg 486 107 127;
+#X msg 486 130 1;
+#X msg 486 154 10;
+#X obj 93 110 float;
+#X obj 147 110 + 1;
+#X obj 93 155 select 1;
+#X obj 34 128 delay 0;
+#X msg 93 45 bang;
+#X floatatom 486 201 0 0 0;
+#X obj 486 225 s as_sl;
+#X obj 93 68 t b 0;
+#X text 541 128 mean freq.;
+#X text 616 130 freq. bandwith;
+#X text 530 203 time for change (log);
+#X text 488 87 % of osc that will change;
+#X msg 745 80 127 50 13 74;
+#X obj 745 177 unpack f f f f;
+#X msg 745 101 127 0 75 127;
+#X msg 745 60 127 127 6 127;
+#X text 745 38 examples...;
+#X obj 93 134 < 100;
+#X text 85 -4 kill Asound in the upper left corner to removes all the
+osc.;
+#X msg 745 124 127 64 64 127;
+#X text 487 50 the controler :;
+#X obj 807 204 s as_f;
+#X obj 838 225 s as_bw;
+#X text 95 345 this msg do all the job !!!;
+#X text 532 106 <= ACTIVE INLET !!!;
+#X text 95 21 FIRST;
+#X text 303 20 SECOND;
+#X msg 745 147 127 0 0 10;
+#X obj 745 203 s as_b;
+#X obj 776 225 s as_sl;
+#X obj 245 220 float;
+#X obj 299 220 + 1;
+#X obj 245 265 select 1;
+#X obj 186 238 delay 0;
+#X msg 245 155 bang;
+#X obj 245 178 t b 0;
+#X obj 245 244 < 100;
+#X text 135 60 100 asound patch;
+#X text 137 46 this will load;
+#X text 289 171 100 asound patch;
+#X text 289 156 this will remove the;
+#X msg 92 300 \; pd-1.polyphonie.pd obj 10 10 asound \;;
+#X msg 375 464 editmode \$1;
+#X msg 361 284 \; pd-1.polyphonie.pd editmode 1 \; pd-1.polyphonie.pd
+click 12 12 1 1 \; pd-1.polyphonie.pd cut \; pd-1.polyphonie.pd editmode
+0 \;;
+#X msg 306 54 1;
+#X msg 341 55 0;
+#X text 285 37 turn on and off all asound;
+#X text 744 24 FIRD;
+#X text 300 186 if created \, if not...;
+#X obj 306 79 switch~;
+#X connect 1 0 2 0;
+#X connect 3 0 4 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X connect 8 0 9 0;
+#X connect 8 0 25 0;
+#X connect 9 0 8 1;
+#X connect 10 0 49 0;
+#X connect 10 0 11 0;
+#X connect 11 0 8 0;
+#X connect 12 0 15 0;
+#X connect 13 0 14 0;
+#X connect 15 0 8 0;
+#X connect 15 1 8 0;
+#X connect 20 0 21 0;
+#X connect 21 0 36 0;
+#X connect 21 1 37 0;
+#X connect 21 2 29 0;
+#X connect 21 3 30 0;
+#X connect 22 0 21 0;
+#X connect 23 0 21 0;
+#X connect 25 0 10 0;
+#X connect 27 0 21 0;
+#X connect 35 0 21 0;
+#X connect 38 0 39 0;
+#X connect 38 0 44 0;
+#X connect 39 0 38 1;
+#X connect 40 0 41 0;
+#X connect 40 0 51 0;
+#X connect 41 0 38 0;
+#X connect 42 0 43 0;
+#X connect 43 0 38 0;
+#X connect 43 1 38 0;
+#X connect 44 0 40 0;
+#X connect 52 0 57 0;
+#X connect 53 0 57 0;
diff --git a/doc/additional/pd-msg/5.examples/2.create_new_abstract.pd b/doc/additional/pd-msg/5.examples/2.create_new_abstract.pd
new file mode 100755
index 00000000..2c1f844a
--- /dev/null
+++ b/doc/additional/pd-msg/5.examples/2.create_new_abstract.pd
@@ -0,0 +1,29 @@
+#N canvas 228 85 505 524 10;
+#X msg 77 224 msg 10 10 bang;
+#X msg 77 272 obj 10 40 metro 500;
+#X msg 77 248 floatatom 100 10 7 50 5000;
+#X msg 77 344 obj 10 70 random 127;
+#X msg 77 392 floatatom 10 100 5;
+#X msg 78 440 text 10 130 That's it !;
+#X obj 30 475 s pd-new;
+#X msg 77 296 connect 0 0 2 0;
+#X msg 77 319 connect 1 0 2 1;
+#X msg 77 368 connect 2 0 3 0;
+#X msg 77 416 connect 3 0 4 0;
+#X msg 40 79 \; pd filename new ./ \; #N canvas \; #X pop 1 \;;
+#X text 53 59 click here first;
+#X text 28 176 And then we fill it with the way describe in 1.add_objects.pd;
+#X text 26 15 This describe how to create a new abstraction :;
+#X msg 290 457 menuclose;
+#X text 294 483 this will kill it !;
+#X connect 0 0 6 0;
+#X connect 1 0 6 0;
+#X connect 2 0 6 0;
+#X connect 3 0 6 0;
+#X connect 4 0 6 0;
+#X connect 5 0 6 0;
+#X connect 7 0 6 0;
+#X connect 8 0 6 0;
+#X connect 9 0 6 0;
+#X connect 10 0 6 0;
+#X connect 15 0 6 0;
diff --git a/doc/additional/pd-msg/5.examples/asound.pd b/doc/additional/pd-msg/5.examples/asound.pd
new file mode 100755
index 00000000..601726d3
--- /dev/null
+++ b/doc/additional/pd-msg/5.examples/asound.pd
@@ -0,0 +1,52 @@
+#N canvas 220 255 452 479 10;
+#X obj 105 408 osc~;
+#X obj 105 332 mtof;
+#X obj 105 459 dac~;
+#X obj 105 432 /~ 100;
+#X obj 122 91 random 127;
+#X obj 106 30 r as_b;
+#X obj 106 140 select 1;
+#X obj 106 115 >;
+#X obj 106 52 t f b;
+#X obj 106 164 t b b;
+#X obj 105 308 +;
+#X obj 105 256 -;
+#X obj 56 224 *;
+#X obj 173 225 *;
+#X obj 173 199 random 100000;
+#X obj 56 198 random 100000;
+#X obj 105 283 / 100000;
+#X obj 155 262 r as_f;
+#X obj 100 225 r as_bw;
+#X obj 105 382 line~;
+#X obj 105 357 pack f f;
+#X obj 221 282 r as_sl;
+#X obj 221 305 mtof;
+#X text 12 7 This patch is to illustrate how to use contructions msg
+for polyphonie;
+#X connect 0 0 3 0;
+#X connect 1 0 20 0;
+#X connect 3 0 2 0;
+#X connect 3 0 2 1;
+#X connect 4 0 7 1;
+#X connect 5 0 8 0;
+#X connect 6 0 9 0;
+#X connect 7 0 6 0;
+#X connect 8 0 7 0;
+#X connect 8 1 4 0;
+#X connect 9 0 15 0;
+#X connect 9 1 14 0;
+#X connect 10 0 1 0;
+#X connect 11 0 16 0;
+#X connect 12 0 11 0;
+#X connect 13 0 11 1;
+#X connect 14 0 13 0;
+#X connect 15 0 12 0;
+#X connect 16 0 10 0;
+#X connect 17 0 10 1;
+#X connect 18 0 13 1;
+#X connect 18 0 12 1;
+#X connect 19 0 0 0;
+#X connect 20 0 19 0;
+#X connect 21 0 22 0;
+#X connect 22 0 20 1;