aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/pddp/all_about_acoustic_conversions.pd750
-rw-r--r--doc/pddp/all_about_arrays.pd920
-rw-r--r--doc/pddp/all_about_ascii_art.pd98
-rw-r--r--doc/pddp/all_about_atom_conversion.pd207
-rw-r--r--doc/pddp/all_about_atoms.pd181
-rw-r--r--doc/pddp/all_about_canvas_properties.pd157
-rw-r--r--doc/pddp/all_about_data_types.pd271
-rw-r--r--doc/pddp/all_about_dollarsign_zero.pd57
-rw-r--r--doc/pddp/all_about_expr_and_value.pd50
-rw-r--r--doc/pddp/all_about_expr_functions.pd503
-rw-r--r--doc/pddp/all_about_expr_if.pd64
-rw-r--r--doc/pddp/all_about_expr_multiline.pd44
-rw-r--r--doc/pddp/all_about_externals.pd34
-rw-r--r--doc/pddp/all_about_haptics.pd74
-rw-r--r--doc/pddp/all_about_help_patches.pd255
-rw-r--r--doc/pddp/all_about_hid.pd33
-rw-r--r--doc/pddp/all_about_libraries.pd49
-rw-r--r--doc/pddp/all_about_lists_vs_anythings.pd210
-rw-r--r--doc/pddp/all_about_looping.pd315
-rw-r--r--doc/pddp/all_about_message_conversion.pd119
-rw-r--r--doc/pddp/all_about_messages.pd382
-rw-r--r--doc/pddp/all_about_midi_flags.pd141
-rw-r--r--doc/pddp/all_about_pd_META.pd79
-rw-r--r--doc/pddp/all_about_scope_and_locality.pd121
-rw-r--r--doc/pddp/all_about_send_n_receive.pd192
-rw-r--r--doc/pddp/all_about_submitting_bugs.pd38
-rw-r--r--doc/pddp/all_about_symbol_construction.pd100
-rw-r--r--doc/pddp/all_about_writing_help_patches.pd26
-rw-r--r--doc/pddp/all_about_z_order.pd30
29 files changed, 4011 insertions, 1489 deletions
diff --git a/doc/pddp/all_about_acoustic_conversions.pd b/doc/pddp/all_about_acoustic_conversions.pd
index 4a6b6868..00a59a8a 100644
--- a/doc/pddp/all_about_acoustic_conversions.pd
+++ b/doc/pddp/all_about_acoustic_conversions.pd
@@ -1,20 +1,23 @@
-#N canvas 13 30 762 530 10;
-#X obj 22 62 mtof;
-#X floatatom 22 85 0 0 0 0 - - -;
-#X obj 22 109 ftom;
-#X floatatom 22 130 0 0 0 0 - - -;
-#X text 57 62 -- MIDI note number to frequency converter.;
-#N canvas 37 22 899 659 understanding_mtof 0;
-#X text 20 13 [mtof] will convert MIDI note numbers to Wave Freqeuency.
+#N canvas 0 0 448 570 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header acoustic_conversions
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 180 63 mtof;
+#X floatatom 180 86 0 0 0 0 - - -;
+#X obj 180 110 ftom;
+#X floatatom 180 131 0 0 0 0 - - -;
+#N canvas 13 23 428 336 understanding_mtof 0;
+#X text 19 36 [mtof] will convert MIDI note numbers to Wave Freqeuency.
This object exists in Pd for the sake of convenience and speed of processing.
;
-#X obj 37 165 mtof;
-#X floatatom 37 143 5 0 0 0 - - -;
-#X text 77 142 Select a MIDI note: (Middle C is 60).;
-#X floatatom 37 188 5 0 0 0 - - -;
-#X obj 37 207 osc~;
-#X floatatom 99 203 0 0 0 0 - - -;
-#N canvas 397 146 628 393 output 0;
+#X obj 45 195 mtof;
+#X floatatom 45 173 5 0 0 0 - - -;
+#X text 85 172 Select a MIDI note: (Middle C is 60).;
+#X floatatom 45 218 5 0 0 0 - - -;
+#X obj 45 237 osc~;
+#X floatatom 107 217 0 0 0 0 - - -;
+#N canvas 396 146 628 393 output 0;
#X obj 393 156 t b;
#X obj 393 106 f;
#X obj 393 56 inlet;
@@ -78,82 +81,121 @@ This object exists in Pd for the sake of convenience and speed of processing.
#X connect 30 0 32 0;
#X connect 30 1 29 0;
#X connect 32 0 31 0;
-#X restore 37 232 pd output;
-#X msg 128 204 MUTE;
-#X text 164 203 <-- Turn up your volume here.;
-#X text 15 260 HERE IS THE ALTERNATIVE;
-#X obj 36 321 mtof;
-#X floatatom 36 281 5 0 0 0 - - -;
-#X floatatom 15 345 0 0 0 0 - - -;
-#X floatatom 123 461 0 0 0 0 - - -;
-#X obj 138 312 <= -1500;
-#X obj 138 332 expr 1-$f1;
-#X obj 95 352 spigot;
-#X obj 95 295 t f f;
-#X obj 95 372 min 1499;
-#X obj 95 419 expr (8.17579891564*exp(0.0577622650*$f1));
-#X obj 151 352 s zero;
-#X obj 123 440 r zero;
-#X obj 96 485 bang;
-#X obj 36 482 bang;
-#X obj 36 502 realtime;
-#X floatatom 161 576 0 0 0 0 - - -;
-#X obj 204 499 bang;
-#X obj 161 499 bang;
-#X obj 161 519 realtime;
-#X floatatom 161 540 0 0 0 0 - - -;
-#X obj 365 389 *;
-#X obj 408 342 loadbang;
-#X obj 365 408 exp;
-#X obj 365 428 *;
-#X floatatom 365 448 0 0 0 0 - - -;
-#X obj 397 431 r zero;
-#X text 79 277 Select a MIDI note here.;
-#X obj 477 572 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
--1;
-#X obj 477 12 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
--1;
-#X text 496 123 The examples at the botton left are Pd structures which
+#X restore 45 262 pd output;
+#X msg 116 239 MUTE;
+#X text 133 217 <-- Turn up your volume here.;
+#X text 19 85 MIDI notes usually range between 0 and 127 from an incoming
+MIDI controller. However \, in Pd negative numbers to -1500 and positive
+numbers to 1499 are also supported and decimal places can be used to
+achive microtonal pitches.;
+#X text 19 145 CONVENIENT? YES!;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Understanding [mtof];
+#N canvas 14 48 428 488 Alternatives_to_mtof 0;
+#N canvas 14 48 428 416 mtof_patches 0;
+#X text 25 36 HERE IS THE ALTERNATIVE;
+#X obj 46 97 mtof;
+#X floatatom 46 57 5 0 0 0 - - -;
+#X floatatom 25 121 0 0 0 0 - - -;
+#X floatatom 133 237 0 0 0 0 - - -;
+#X obj 148 88 <= -1500;
+#X obj 148 108 expr 1-$f1;
+#X obj 105 128 spigot;
+#X obj 105 71 t f f;
+#X obj 105 148 min 1499;
+#X obj 105 195 expr (8.17579891564*exp(0.0577622650*$f1));
+#X obj 161 128 s zero;
+#X obj 133 216 r zero;
+#X obj 106 261 bang;
+#X obj 46 258 bang;
+#X obj 46 278 realtime;
+#X floatatom 171 352 0 0 0 0 - - -;
+#X obj 214 275 bang;
+#X obj 171 275 bang;
+#X obj 171 295 realtime;
+#X floatatom 171 316 0 0 0 0 - - -;
+#X obj 375 165 *;
+#X obj 418 118 loadbang;
+#X obj 375 184 exp;
+#X obj 375 204 *;
+#X floatatom 375 224 0 0 0 0 - - -;
+#X obj 407 207 r zero;
+#X text 89 53 Select a MIDI note here.;
+#X text 172 332 Arithmetic is __?__ milliseconds slower than [mtof].
+;
+#X text 169 368 [expr] is __?__ milliseconds slower than [mtof].;
+#X text 22 139 RESULT A;
+#X text 133 252 RESULT B;
+#X text 374 241 RESULT C;
+#X msg 418 139 0.0577623;
+#X msg 418 179 8.1758;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 An alternative to [mtof];
+#X connect 1 0 3 0;
+#X connect 1 0 14 0;
+#X connect 2 0 1 0;
+#X connect 2 0 8 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 1;
+#X connect 6 0 11 0;
+#X connect 7 0 9 0;
+#X connect 8 0 7 0;
+#X connect 8 1 5 0;
+#X connect 9 0 10 0;
+#X connect 9 0 13 0;
+#X connect 9 0 21 0;
+#X connect 10 0 4 0;
+#X connect 12 0 4 0;
+#X connect 13 0 15 1;
+#X connect 14 0 15 0;
+#X connect 14 0 18 0;
+#X connect 15 0 16 0;
+#X connect 17 0 19 1;
+#X connect 18 0 19 0;
+#X connect 19 0 20 0;
+#X connect 21 0 23 0;
+#X connect 22 0 33 0;
+#X connect 22 0 34 0;
+#X connect 23 0 24 0;
+#X connect 24 0 25 0;
+#X connect 24 0 17 0;
+#X connect 26 0 25 0;
+#X connect 33 0 21 1;
+#X connect 34 0 24 1;
+#X restore 22 452 pd mtof_patches;
+#X text 19 121 The examples at the botton left are Pd structures which
emulate the source code of the [mtof] object. In one case \, I have
used the [expr] object to perform the necessary calculation. In the
other case \, I used Pd's Arithmetic objects to perform the calculation.
;
-#X text 498 291 Secondly \, the incoming MIDI note number is translated
+#X text 19 268 Secondly \, the incoming MIDI note number is translated
into a frequency value by the simple equation:;
-#X text 494 330 (8.17579891564 * exp(0.0577622650 * MIDI_note)) = frequency
-;
-#X text 498 355 For curiosity's sake \, I included a timer to show
-how much faster the [mtof] object is compared to the two alternative
-methods.;
-#X text 162 556 Arithmetic is __?__ milliseconds slower than [mtof].
+#X text 19 332 For curiosity's sake \, I included a timer to show how
+much faster the [mtof] object is compared to the two alternative methods.
;
-#X text 159 592 [expr] is __?__ milliseconds slower than [mtof].;
-#X text 12 363 RESULT A;
-#X text 123 476 RESULT B;
-#X text 364 465 RESULT C;
-#X msg 408 363 0.0577623;
-#X msg 408 403 8.1758;
-#X text 504 12 THE ALTERNATIVE EXPLAINED;
-#X text 499 33 The [mtof] object is really just a function defined
-in Pd's source code - which is programmed in "C".;
-#X text 497 67 As such \, it operates very quickly. If a similar function
+#X text 20 37 The [mtof] object is really just a function defined in
+Pd's source code - which is programmed in "C".;
+#X text 20 74 As such \, it operates very quickly. If a similar function
were to be created using Pd's arithmetic objects \, the process would
be quite a bit slower. How much slower?;
-#X text 498 409 As well \, notice that RESULT C (the output from Pd's
+#X text 19 376 As well \, notice that RESULT C (the output from Pd's
basic arithmetic objects) is not as accurate as the other two methods:
[mtof] and/or [expr]. This is because the message boxes and the [*]
object round off the operands because they cannot handle enough decimal
places.;
-#X text 498 200 The first order of business performed by these examples
+#X text 19 190 The first order of business performed by these examples
is the filtering out of all numbers less than -1500 and greater than
1499 (Just like the [mtof] source code). In other words \, "overflows
and underflows are clipped" as Miller Puckette stated in the original
documentation for this object.;
-#X text 22 62 MIDI notes usually range between 0 and 127 from an incoming
-MIDI controller. However \, in Pd negative numbers to -1500 and positive
-numbers to 1499 are also supported and decimal places can be used to
-achive microtonal pitches.;
-#X text 11 125 CONVENIENT? YES!;
+#X text 19 302 (8.17579891564 * exp(0.0577622650 * MIDI_note)) = frequency
+;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Alternatives to [mtof];
+#X restore 22 302 pd Alternatives_to_mtof;
#X connect 1 0 4 0;
#X connect 2 0 1 0;
#X connect 4 0 5 0;
@@ -161,151 +203,125 @@ achive microtonal pitches.;
#X connect 6 0 7 2;
#X connect 7 0 6 0;
#X connect 8 0 7 3;
-#X connect 11 0 13 0;
-#X connect 11 0 24 0;
-#X connect 12 0 11 0;
-#X connect 12 0 18 0;
-#X connect 15 0 16 0;
-#X connect 16 0 17 1;
-#X connect 16 0 21 0;
-#X connect 17 0 19 0;
-#X connect 18 0 17 0;
-#X connect 18 1 15 0;
-#X connect 19 0 20 0;
-#X connect 19 0 23 0;
-#X connect 19 0 31 0;
-#X connect 20 0 14 0;
-#X connect 22 0 14 0;
-#X connect 23 0 25 1;
-#X connect 24 0 25 0;
-#X connect 24 0 28 0;
-#X connect 25 0 26 0;
-#X connect 27 0 29 1;
-#X connect 28 0 29 0;
-#X connect 29 0 30 0;
-#X connect 31 0 33 0;
-#X connect 32 0 49 0;
-#X connect 32 0 50 0;
-#X connect 33 0 34 0;
-#X connect 34 0 35 0;
-#X connect 34 0 27 0;
-#X connect 36 0 35 0;
-#X connect 39 0 38 0;
-#X connect 49 0 31 1;
-#X connect 50 0 34 1;
-#X restore 185 79 pd understanding_mtof;
-#X text 57 109 -- Frequency to MIDI note number converter.;
-#N canvas 118 22 919 630 understanding_ftom 0;
-#X floatatom 38 86 5 0 0 0 - - -;
-#X floatatom 38 131 5 0 0 0 - - -;
-#X text 12 215 HERE IS THE ALTERNATIVE;
-#X floatatom 33 236 5 0 0 0 - - -;
-#X floatatom 12 300 0 0 0 0 - - -;
-#X obj 507 572 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
--1;
-#X obj 507 12 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
--1;
-#X text 9 318 RESULT A;
-#X text 534 12 THE ALTERNATIVE EXPLAINED;
-#X text 527 67 As such \, it operates very quickly. If a similar function
-were to be created using Pd's arithmetic objects \, the process would
-be quite a bit slower. How much slower?;
-#X text 12 68 CONVENIENT? YES!;
-#X text 22 14 [ftom] will convert Wave/Signal Frequency to MIDI note
+#X restore 23 63 pd understanding_mtof;
+#N canvas 15 29 428 344 understanding_ftom 0;
+#X floatatom 21 109 5 0 0 0 - - -;
+#X floatatom 21 154 5 0 0 0 - - -;
+#X text 19 89 CONVENIENT? YES!;
+#X text 19 37 [ftom] will convert Wave/Signal Frequency to MIDI note
numbers. This object exists in Pd for the sake of convenience and speed
of processing.;
-#X text 78 85 Select a Frequency: (i.e. 440 hz is an "A" above middle
+#X text 61 108 Select a Frequency: (i.e. 440 hz is an "A" above middle
C);
-#X obj 38 108 ftom;
-#X obj 38 158 makenote 100 500;
-#X obj 38 181 noteout;
-#X text 76 232 Select a FREQUENCY here.;
-#X obj 33 276 ftom;
-#X text 529 33 The [ftom] object is really just a function defined
-in Pd's source code - which is programmed in "C".;
-#X text 526 123 The examples at the botton left are Pd structures which
+#X obj 21 131 ftom;
+#X obj 21 181 makenote 100 500;
+#X obj 21 204 noteout;
+#X text 37 225 Note that fractional values have no effect. MIDI controllers
+only accept integers. Perhaps a subroutine could be designed to parse
+the decimal places and manipulate the pitch bend controller to achieve
+microtonal control?;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Understanding [ftom];
+#N canvas 14 48 428 488 Alternatives_to_ftom 0;
+#X text 19 71 As such \, it operates very quickly. If a similar function
+were to be created using Pd's arithmetic objects \, the process would
+be quite a bit slower. How much slower?;
+#X text 19 37 The [ftom] object is really just a function defined in
+Pd's source code - which is programmed in "C".;
+#X text 19 117 The examples at the botton left are Pd structures which
emulate the source code of the [ftom] object. In one case \, I have
used the [expr] object to perform the necessary calculation. In the
other case \, I used Pd's Arithmetic objects to perform the calculation.
;
-#X obj 64 256 moses 0;
-#X msg 64 277 -1500;
-#X floatatom 64 408 0 0 0 0 - - -;
-#X floatatom 114 346 0 0 0 0 - - -;
-#X obj 114 313 * 17.3123;
-#X obj 114 273 * 0.122312;
-#X obj 114 293 log;
-#X obj 101 385 expr (17.3123405046*log(.12231220585*$f1));
-#X text 64 423 RESULT B;
-#X text 113 359 RESULT C;
-#X obj 93 449 bang;
-#X obj 33 446 bang;
-#X obj 33 466 realtime;
-#X floatatom 158 540 0 0 0 0 - - -;
-#X obj 201 463 bang;
-#X obj 158 463 bang;
-#X obj 158 483 realtime;
-#X floatatom 158 504 0 0 0 0 - - -;
-#X text 189 520 Arithmetic is __?__ milliseconds slower than [mtof].
-;
-#X text 156 556 [expr] is __?__ milliseconds slower than [mtof].;
-#X text 528 200 Firstly \, the Pd source code "clips" overflows and
+#X text 19 184 Firstly \, the Pd source code "clips" overflows and
underflows. This means simply that frequencies LESS THAN zero cannot
be tranlated into a MIDI note value - so they're ignored completely
and the object responds with "-1500".;
-#X text 528 291 Secondly \, the incoming frequency is translated into
+#X text 19 255 Secondly \, the incoming frequency is translated into
a MIDI note value by the simple equation:;
-#X text 524 330 (17.3123405046 * log(0.12231220585 * Frequency)) =
-MIDI_note;
-#X text 528 355 For curiosity's sake \, I included a timer to show
-how much faster the [ftom] object is compared to the two alternative
-methods.;
-#X text 528 409 As well \, notice that RESULT C (the output from Pd's
+#X text 19 310 For curiosity's sake \, I included a timer to show how
+much faster the [ftom] object is compared to the two alternative methods.
+;
+#X text 19 364 As well \, notice that RESULT C (the output from Pd's
basic arithmetic objects) is not as accurate as the other two methods:
[ftom] and/or [expr]. This is because the message boxes and the [*]
object round off the operands because they cannot handle enough decimal
places.;
-#X text 145 119 Note that fractional values have no effect. MIDI controllers
-only accept integers. Perhaps a subroutine could be designed to parse
-the decimal places and manipulate the pitch bend controller to achieve
-microtonal control?;
-#X connect 0 0 13 0;
-#X connect 1 0 14 0;
-#X connect 3 0 17 0;
-#X connect 3 0 20 0;
-#X connect 4 0 31 0;
-#X connect 6 0 5 0;
-#X connect 13 0 1 0;
-#X connect 14 0 15 0;
-#X connect 14 1 15 1;
-#X connect 17 0 4 0;
-#X connect 20 0 21 0;
-#X connect 20 1 25 0;
-#X connect 20 1 27 0;
+#X text 19 285 (17.3123405046 * log(0.12231220585 * Frequency)) = MIDI_note
+;
+#N canvas 14 48 428 416 ftom_patches 0;
+#X text 19 39 HERE IS THE ALTERNATIVE;
+#X floatatom 40 60 5 0 0 0 - - -;
+#X floatatom 19 124 0 0 0 0 - - -;
+#X text 16 142 RESULT A;
+#X text 83 56 Select a FREQUENCY here.;
+#X obj 40 100 ftom;
+#X obj 71 80 moses 0;
+#X msg 71 101 -1500;
+#X floatatom 71 232 0 0 0 0 - - -;
+#X floatatom 121 170 0 0 0 0 - - -;
+#X obj 121 137 * 17.3123;
+#X obj 121 97 * 0.122312;
+#X obj 121 117 log;
+#X obj 108 209 expr (17.3123405046*log(.12231220585*$f1));
+#X text 71 247 RESULT B;
+#X text 120 183 RESULT C;
+#X obj 100 273 bang;
+#X obj 40 270 bang;
+#X obj 40 290 realtime;
+#X floatatom 165 364 0 0 0 0 - - -;
+#X obj 208 287 bang;
+#X obj 165 287 bang;
+#X obj 165 307 realtime;
+#X floatatom 165 328 0 0 0 0 - - -;
+#X text 196 344 Arithmetic is __?__ milliseconds slower than [mtof].
+;
+#X text 163 380 [expr] is __?__ milliseconds slower than [mtof].;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 An alternative to [ftom];
+#X connect 1 0 5 0;
+#X connect 1 0 6 0;
+#X connect 2 0 17 0;
+#X connect 5 0 2 0;
+#X connect 6 0 7 0;
+#X connect 6 1 11 0;
+#X connect 6 1 13 0;
+#X connect 7 0 8 0;
+#X connect 7 0 9 0;
+#X connect 8 0 16 0;
+#X connect 9 0 20 0;
+#X connect 10 0 9 0;
+#X connect 11 0 12 0;
+#X connect 12 0 10 0;
+#X connect 13 0 8 0;
+#X connect 16 0 18 1;
+#X connect 17 0 18 0;
+#X connect 17 0 21 0;
+#X connect 18 0 19 0;
+#X connect 20 0 22 1;
#X connect 21 0 22 0;
-#X connect 21 0 23 0;
-#X connect 22 0 30 0;
-#X connect 23 0 34 0;
-#X connect 24 0 23 0;
-#X connect 25 0 26 0;
-#X connect 26 0 24 0;
-#X connect 27 0 22 0;
-#X connect 30 0 32 1;
-#X connect 31 0 32 0;
-#X connect 31 0 35 0;
-#X connect 32 0 33 0;
-#X connect 34 0 36 1;
-#X connect 35 0 36 0;
-#X connect 36 0 37 0;
-#X restore 184 125 pd understanding_ftom;
-#X floatatom 22 41 0 0 0 0 - - -;
-#X floatatom 22 211 0 0 0 0 - - -;
-#X floatatom 22 256 0 0 0 0 - - -;
-#X floatatom 22 167 0 0 0 0 - - -;
-#X obj 22 188 dbtorms;
-#X obj 22 235 rmstodb;
-#N canvas 65 78 423 452 understanding_dbtorms 0;
-#N canvas 0 22 452 302 What_is_a_decibel? 0;
+#X connect 22 0 23 0;
+#X restore 22 442 pd ftom_patches;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Alternatives to [ftom];
+#X restore 21 297 pd Alternatives_to_ftom;
+#X connect 0 0 5 0;
+#X connect 1 0 6 0;
+#X connect 5 0 1 0;
+#X connect 6 0 7 0;
+#X connect 6 1 7 1;
+#X restore 23 110 pd understanding_ftom;
+#X floatatom 180 42 0 0 0 0 - - -;
+#X floatatom 180 212 0 0 0 0 - - -;
+#X floatatom 180 257 0 0 0 0 - - -;
+#X floatatom 180 168 0 0 0 0 - - -;
+#X obj 180 189 dbtorms;
+#X obj 180 236 rmstodb;
+#N canvas 14 77 428 407 understanding_dbtorms 0;
+#N canvas 3 118 452 302 What_is_a_decibel? 0;
#X text 24 94 The difficulty in measuring the volume of an instrument
however is caused by 'distance'. For example \, at one metre away from
a door bell \, the amplitude might be 70 Decibels \, while at 50 metres
@@ -320,8 +336,8 @@ of the human ear at 1000 hz. I know that this seems a little vague
\, and perhaps this isn't the best way to explain it - we might as
well be measuring "fortnights" and "bunches" and "Alens"! Anyways...I'm
not an acoustician.;
-#X restore 39 24 pd What_is_a_decibel?;
-#N canvas 0 22 440 242 What_does_RMS_mean? 0;
+#X restore 20 350 pd What_is_a_decibel?;
+#N canvas 5 174 440 242 What_does_RMS_mean? 0;
#X text 24 21 RMS is an acronym meaning "Root Mean Square".;
#X text 23 43 In the analog realm \, RMS is the result of an equation
performed on electrical flow. It is used to measure voltage or current.
@@ -332,48 +348,49 @@ amplitude (decibels) more than we perceive changes in RMS levels.;
as "a measurement of a signal taken by squaring data points along the
curve \, finding the mean \, and then determining the square root of
that mean value.;
-#X restore 39 47 pd What_does_RMS_mean?;
-#X text 19 80 [dbtorms] in Pd performs the following equation to convert
+#X restore 20 373 pd What_does_RMS_mean?;
+#X text 17 158 Example:;
+#X floatatom 20 210 0 0 0 0 - - -;
+#X obj 20 230 moses 0;
+#X msg 20 250 0;
+#X obj 82 269 min 485;
+#X floatatom 20 314 0 0 0 0 - - -;
+#X obj 147 227 dbtorms;
+#X floatatom 147 247 0 0 0 0 - - -;
+#X obj 82 289 expr (exp((2.302585092994*0.05)*($f1-100)));
+#X text 18 116 On a scale of zero to 100 decibels \, the [dbtorms]
+produces exponential values between 0 and 1;
+#X msg 20 181 0;
+#X msg 53 181 100;
+#X obj 57 249 sel 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Understanding [dbtorms];
+#X text 18 92 (exp((2.302585092994 * 0.05) * (db_value - 100)) = RMS
+;
+#X text 18 37 [dbtorms] in Pd performs the following equation to convert
the data: Note that incoming values less than 0 or greater than 485
are considered overflow or underflow and are clipped/ignored.;
-#X text 22 241 Example:;
-#X floatatom 24 293 0 0 0 0 - - -;
-#X obj 24 313 moses 0;
-#X msg 24 333 0;
-#X obj 86 352 min 485;
-#X text 17 149 (exp((2.302585092994 * 0.05) * (db_value - 100)) = RMS
-;
-#X floatatom 24 397 0 0 0 0 - - -;
-#X obj 151 310 dbtorms;
-#X floatatom 151 330 0 0 0 0 - - -;
-#X obj 86 372 expr (exp((2.302585092994*0.05)*($f1-100)));
-#X text 18 178 On a scale of zero to 100 decibels \, the [dbtorms]
-produces exponential values between 0 and 1;
-#X msg 24 264 0;
-#X msg 57 264 100;
-#X obj 61 332 sel 0;
+#X connect 3 0 4 0;
+#X connect 3 0 8 0;
#X connect 4 0 5 0;
-#X connect 4 0 10 0;
-#X connect 5 0 6 0;
-#X connect 5 1 16 0;
-#X connect 6 0 9 0;
-#X connect 7 0 12 0;
-#X connect 10 0 11 0;
-#X connect 12 0 9 0;
-#X connect 14 0 4 0;
-#X connect 15 0 4 0;
-#X connect 16 0 6 0;
-#X connect 16 1 7 0;
-#X restore 165 207 pd understanding_dbtorms;
-#X text 76 189 -- Decibels to RMS converter.;
-#X text 76 236 -- RMS to Decibels converter.;
-#X floatatom 22 337 0 0 0 0 - - -;
-#X floatatom 22 382 0 0 0 0 - - -;
-#X floatatom 22 293 0 0 0 0 - - -;
-#X obj 22 314 dbtopow;
-#X obj 22 361 powtodb;
-#N canvas 349 60 423 452 understanding_rmstodb 0;
-#N canvas 0 22 452 302 What_is_a_decibel? 0;
+#X connect 4 1 14 0;
+#X connect 5 0 7 0;
+#X connect 6 0 10 0;
+#X connect 8 0 9 0;
+#X connect 10 0 7 0;
+#X connect 12 0 3 0;
+#X connect 13 0 3 0;
+#X connect 14 0 5 0;
+#X connect 14 1 6 0;
+#X restore 23 189 pd understanding_dbtorms;
+#X floatatom 180 338 0 0 0 0 - - -;
+#X floatatom 180 383 0 0 0 0 - - -;
+#X floatatom 180 294 0 0 0 0 - - -;
+#X obj 180 315 dbtopow;
+#X obj 180 362 powtodb;
+#N canvas 13 87 428 440 understanding_rmstodb 0;
+#N canvas 4 161 452 302 What_is_a_decibel? 0;
#X text 24 94 The difficulty in measuring the volume of an instrument
however is caused by 'distance'. For example \, at one metre away from
a door bell \, the amplitude might be 70 Decibels \, while at 50 metres
@@ -388,8 +405,8 @@ of the human ear at 1000 hz. I know that this seems a little vague
\, and perhaps this isn't the best way to explain it - we might as
well be measuring "fortnights" and "bunches" and "Alens"! Anyways...I'm
not an acoustician.;
-#X restore 39 24 pd What_is_a_decibel?;
-#N canvas 0 22 440 242 What_does_RMS_mean? 0;
+#X restore 21 383 pd What_is_a_decibel?;
+#N canvas 3 246 440 242 What_does_RMS_mean? 0;
#X text 24 21 RMS is an acronym meaning "Root Mean Square".;
#X text 23 43 In the analog realm \, RMS is the result of an equation
performed on electrical flow. It is used to measure voltage or current.
@@ -400,41 +417,42 @@ amplitude (decibels) more than we perceive changes in RMS levels.;
as "a measurement of a signal taken by squaring data points along the
curve \, finding the mean \, and then determining the square root of
that mean value.;
-#X restore 39 47 pd What_does_RMS_mean?;
-#X text 22 219 Example:;
-#X floatatom 24 259 0 0 0 0 - - -;
-#X floatatom 24 422 0 0 0 0 - - -;
-#X floatatom 151 354 0 0 0 0 - - -;
-#X msg 68 278 0;
-#X text 19 80 [rmstodb] in Pd performs the following equation to convert
-the data: Note that incoming values less than 0 is consider underflow
-and is clipped/ignored.;
-#X text 18 178 On a scale of zero to 1 decibels \, the [rmstodb] produces
+#X restore 21 406 pd What_does_RMS_mean?;
+#X text 18 157 Example:;
+#X floatatom 21 179 0 0 0 0 - - -;
+#X floatatom 21 345 0 0 0 0 - - -;
+#X floatatom 148 279 0 0 0 0 - - -;
+#X msg 65 201 0;
+#X text 18 107 On a scale of zero to 1 decibels \, the [rmstodb] produces
logarithmic values between 0 and 100 \, although higher values can
also be produced.;
-#X obj 151 334 rmstodb;
-#X obj 24 358 max 0;
-#X obj 24 401 max 0;
-#X obj 24 379 expr (100+((20/2.302585092994)*log($f1)));
-#X text 18 136 (100 + ((20/2.302585092994) * log(RMS_value)));
-#X obj 24 278 / 1000;
-#X floatatom 24 310 0 0 0 0 - - -;
-#X msg 101 278 1;
-#X connect 3 0 14 0;
-#X connect 6 0 15 0;
-#X connect 9 0 5 0;
-#X connect 10 0 12 0;
-#X connect 11 0 4 0;
-#X connect 12 0 11 0;
-#X connect 14 0 15 0;
-#X connect 15 0 9 0;
-#X connect 15 0 10 0;
-#X connect 16 0 15 0;
-#X restore 163 253 pd understanding_rmstodb;
-#X text 76 315 -- Decibels to power converter.;
-#X text 76 362 -- power to Decibels converter.;
-#N canvas 460 106 429 458 understanding_dbtopow 0;
-#N canvas 0 22 452 302 What_is_a_decibel? 0;
+#X obj 148 257 rmstodb;
+#X obj 21 279 max 0;
+#X obj 21 323 max 0;
+#X obj 21 301 expr (100+((20/2.302585092994)*log($f1)));
+#X obj 21 201 / 1000;
+#X floatatom 21 233 0 0 0 0 - - -;
+#X msg 98 201 1;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Understanding [rmstodb];
+#X text 18 82 (100 + ((20/2.302585092994) * log(RMS_value)));
+#X text 18 37 [rmstodb] in Pd performs the following equation to convert
+the data: Note that incoming values less than 0 is consider underflow
+and is clipped/ignored.;
+#X connect 3 0 12 0;
+#X connect 6 0 13 0;
+#X connect 8 0 5 0;
+#X connect 9 0 11 0;
+#X connect 10 0 4 0;
+#X connect 11 0 10 0;
+#X connect 12 0 13 0;
+#X connect 13 0 8 0;
+#X connect 13 0 9 0;
+#X connect 14 0 13 0;
+#X restore 23 236 pd understanding_rmstodb;
+#N canvas 7 22 428 333 understanding_dbtopow 0;
+#N canvas 0 46 452 302 What_is_a_decibel? 0;
#X text 24 94 The difficulty in measuring the volume of an instrument
however is caused by 'distance'. For example \, at one metre away from
a door bell \, the amplitude might be 70 Decibels \, while at 50 metres
@@ -449,11 +467,11 @@ of the human ear at 1000 hz. I know that this seems a little vague
\, and perhaps this isn't the best way to explain it - we might as
well be measuring "fortnights" and "bunches" and "Alens"! Anyways...I'm
not an acoustician.;
-#X restore 39 24 pd What_is_a_decibel?;
-#X floatatom 21 205 0 0 0 0 - - -;
-#X floatatom 21 309 0 0 0 0 - - -;
-#X floatatom 148 242 0 0 0 0 - - -;
-#N canvas 0 22 442 244 What_does_power_mean? 0;
+#X restore 22 267 pd What_is_a_decibel?;
+#X floatatom 22 128 0 0 0 0 - - -;
+#X floatatom 22 234 0 0 0 0 - - -;
+#X floatatom 149 167 0 0 0 0 - - -;
+#N canvas 3 96 442 209 What_does_power_mean? 0;
#X text 30 25 What does power mean? I really don't know? I can't determine
from my own research or from Pd's documentation why or how this data
is used. All that I do know \, is that Pd provides these objects for
@@ -462,24 +480,27 @@ a good reason -- I just don't know the reason.;
who DOES know more about these objects and their usage. All that I
can offer is an explanation of the equation used to perform these conversions.
;
-#X restore 39 47 pd What_does_power_mean?;
-#X text 18 80 [dbtopow] in Pd performs the following equation to convert
+#X restore 22 290 pd What_does_power_mean?;
+#X obj 149 145 dbtopow;
+#X obj 22 150 max 0;
+#X obj 22 172 min 870;
+#X text 19 92 exp((2.302585092994 * 0.1) * (db_value - 100)) = Power
+;
+#X obj 22 194 expr exp((2.302585092994*0.1)*($f1-100));
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Understanding [dbtopow];
+#X text 19 37 [dbtopow] in Pd performs the following equation to convert
the data: Note that incoming values less than 0 or greater than 870
are considered overflow or underflow and are clipped/ignored.;
-#X obj 148 222 dbtopow;
-#X obj 21 226 max 0;
-#X obj 21 246 min 870;
-#X text 17 149 exp((2.302585092994 * 0.1) * (db_value - 100)) = Power
-;
-#X obj 21 269 expr exp((2.302585092994*0.1)*($f1-100));
+#X connect 1 0 5 0;
#X connect 1 0 6 0;
-#X connect 1 0 7 0;
-#X connect 6 0 3 0;
-#X connect 7 0 8 0;
-#X connect 8 0 10 0;
-#X connect 10 0 2 0;
-#X restore 164 334 pd understanding_dbtopow;
-#N canvas 348 60 429 458 understanding_powtodb 0;
+#X connect 5 0 3 0;
+#X connect 6 0 7 0;
+#X connect 7 0 9 0;
+#X connect 9 0 2 0;
+#X restore 23 315 pd understanding_dbtopow;
+#N canvas 13 22 428 336 understanding_powtodb 0;
#N canvas 0 22 452 302 What_is_a_decibel? 0;
#X text 24 94 The difficulty in measuring the volume of an instrument
however is caused by 'distance'. For example \, at one metre away from
@@ -495,12 +516,12 @@ of the human ear at 1000 hz. I know that this seems a little vague
\, and perhaps this isn't the best way to explain it - we might as
well be measuring "fortnights" and "bunches" and "Alens"! Anyways...I'm
not an acoustician.;
-#X restore 39 24 pd What_is_a_decibel?;
-#X text 22 241 Example:;
-#X floatatom 22 261 0 0 0 0 - - -;
-#X floatatom 22 363 0 0 0 0 - - -;
-#X floatatom 149 298 0 0 0 0 - - -;
-#N canvas 0 22 442 244 What_does_power_mean? 0;
+#X restore 22 274 pd What_is_a_decibel?;
+#X text 19 110 Example:;
+#X floatatom 22 131 0 0 0 0 - - -;
+#X floatatom 22 237 0 0 0 0 - - -;
+#X floatatom 149 170 0 0 0 0 - - -;
+#N canvas 2 68 442 244 What_does_power_mean? 0;
#X text 30 25 What does power mean? I really don't know? I can't determine
from my own research or from Pd's documentation why or how this data
is used. All that I do know \, is that Pd provides these objects for
@@ -509,58 +530,33 @@ a good reason -- I just don't know the reason.;
who DOES know more about these objects and their usage. All that I
can offer is an explanation of the equation used to perform these conversions.
;
-#X restore 39 47 pd What_does_power_mean?;
-#X text 17 81 [powtodb] in Pd performs the following equation to convert
+#X restore 22 297 pd What_does_power_mean?;
+#X text 18 37 [powtodb] in Pd performs the following equation to convert
the data: Note that incoming values less than 0 are considered underflow
and are clipped/ignored.;
-#X text 17 149 (100 + ((10/2.302585092994) * log(POWER_value))) = Debibels
+#X text 17 84 (100 + ((10/2.302585092994) * log(POWER_value))) = Debibels
;
-#X obj 149 278 powtodb;
-#X obj 22 281 max 0;
-#X obj 22 321 expr (100 + ((10/2.302585092994)*log($f1)));
-#X obj 22 342 max 0;
+#X obj 149 148 powtodb;
+#X obj 22 153 max 0;
+#X obj 22 193 expr (100 + ((10/2.302585092994)*log($f1)));
+#X obj 22 215 max 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Understanding [powtodb];
#X connect 2 0 8 0;
#X connect 2 0 9 0;
#X connect 8 0 4 0;
#X connect 9 0 10 0;
#X connect 10 0 11 0;
#X connect 11 0 3 0;
-#X restore 164 381 pd understanding_powtodb;
-#X text 23 419 RELATED OBJECTS;
-#X obj 24 438 dbtopow~;
-#X obj 78 438 dbtorms~;
-#X obj 133 438 rmstodb~;
-#X obj 188 438 powtodb~;
-#X obj 243 438 mtof~;
-#X obj 280 438 ftom~;
-#X obj 24 463 expr;
-#X obj 56 463 expr~;
-#N canvas 0 22 452 302 other_objects_from_related_libraries 0;
-#X obj 26 39 db2v;
-#X obj 65 38 f2note;
-#X obj 115 39 b2db;
-#X obj 150 40 t3_sig~;
-#X obj 205 40 m2f~;
-#X obj 249 41 tmtof;
-#X text 18 96 These objects are offered in Pd only if you have downloaded
-and properly installed the appropriate library. These objects may or
-may not exist in a single library.;
-#X text 17 145 The best places to find information about Pd's libraries
-is:;
-#X text 14 167 www.puredata.org and click on "Downloads" then "Software"
-;
-#X text 15 183 or;
-#X text 16 197 iem.kug.ac.at/pdb/;
-#X restore 24 498 pd other_objects_from_related_libraries;
-#X obj 100 463 rmstopow~;
-#X obj 164 465 powtorms~;
-#X obj 230 465 sig~;
-#X obj 264 465 snapshot~;
-#X obj 5 2 cnv 15 750 20 empty empty all_about_acoustic_conversions
-20 10 1 18 -233017 -66577 0;
-#X obj 721 3 pddp/pddplink http://puredata.info/dev/pddp -text pddp
-;
-#X text 389 41 Please note: I have no idea why it's necessary for Pd
+#X restore 23 362 pd understanding_powtodb;
+#X text 215 63 - MIDI note number to frequency;
+#X text 215 110 - Frequency to MIDI note number;
+#X text 234 190 - Decibels to RMS;
+#X text 234 237 - RMS to Decibels;
+#X text 234 316 - Decibels to power;
+#X text 234 363 - power to Decibels;
+#X text 21 412 Please note: I have no idea why it's necessary for Pd
to measure decibels \, rms \, or power. It seems to me that RMS and
Power are extremely important in the analog world (so that an engineer
doesn't blow up a transistor)...but in Pd \, these things are just
@@ -569,15 +565,57 @@ I would really appreciate if somebody could help me understand these
concepts and finish this document. Why are these objects present in
Pd? WHY should they be used and what benefits to they produce in a
digital process?;
-#X connect 0 0 1 0;
-#X connect 1 0 2 0;
+#X obj 1 548 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 323 229 494 344 META 0;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 KEYWORDS conversion;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 NAME mtof ftom dbtorms rmstodb dbtopow powtodb;
+#X text 12 65 DESCRIPTION examples of objects that do conversions between
+acoustic units;
+#X restore 392 550 pd META;
+#N canvas 12 355 428 212 Related_objects 0;
+#X obj 23 42 dbtopow~;
+#X obj 77 42 dbtorms~;
+#X obj 132 42 rmstodb~;
+#X obj 187 42 powtodb~;
+#X obj 242 42 mtof~;
+#X obj 279 42 ftom~;
+#X obj 23 69 expr;
+#X obj 58 69 expr~;
+#X obj 98 69 sig~;
+#X obj 132 69 snapshot~;
+#X text 150 99 [rmstopow~];
+#X text 230 99 [powtorms~];
+#X text 150 120 [b2db];
+#X text 193 120 [tmtof];
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Acoustic Objects- Related Objects;
+#X obj 21 122 pddp/helplink iemlib/db2v;
+#X obj 21 142 pddp/helplink iemlib/f2note;
+#X obj 21 162 pddp/helplink iemlib/t3_sig~;
+#X obj 21 182 pddp/helplink iemlib/m2f~;
+#X obj 21 103 pddp/pddplink all_about_externals.pd -text _________
+;
+#X obj 21 103 pddp/pddplink all_about_externals.pd -text Externals
+;
+#X text 152 135 Which library for these four?;
+#X restore 103 550 pd Related_objects;
+#X obj 6 550 pddp/pddplink pddp/help.pd -text help;
#X connect 2 0 3 0;
-#X connect 8 0 0 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 8 0 2 0;
#X connect 9 0 13 0;
#X connect 11 0 12 0;
#X connect 12 0 9 0;
#X connect 13 0 10 0;
-#X connect 17 0 21 0;
-#X connect 19 0 20 0;
-#X connect 20 0 17 0;
-#X connect 21 0 18 0;
+#X connect 15 0 19 0;
+#X connect 17 0 18 0;
+#X connect 18 0 15 0;
+#X connect 19 0 16 0;
diff --git a/doc/pddp/all_about_arrays.pd b/doc/pddp/all_about_arrays.pd
index d44033cb..e4892920 100644
--- a/doc/pddp/all_about_arrays.pd
+++ b/doc/pddp/all_about_arrays.pd
@@ -1,158 +1,340 @@
-#N canvas 299 68 516 572 10;
-#N canvas 132 22 591 609 What_is_an_array_in_PD 0;
-#X text 27 17 WHAT IS AN ARRAY IN PURE DATA?;
-#X text 45 42 Arrays \, in most programming environments \, are considered
+#N struct ds-array-ex float x float y array circles circle;
+#N struct circle float y symbol a;
+#N canvas 0 0 448 312 10;
+#N canvas 12 67 428 377 Common_uses_for_arrays_in_PD 0;
+#X text 20 37 Arrays are versatile. Their simple structure make them
+useful in countless situations. This page discusses perhaps the most
+common applications.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Common Uses for Arrays in Pd;
+#X text 20 81 1) Audio sample data: when an array's values are limited
+to a range between -1 and 1 \, the numbers are suitable for conversion
+to analog audio signal. These arrays are typically many thousands of
+elements and stored on hard disk in the form of aiff \, wav or pure
+text.;
+#X text 20 149 2) MIDI Sequencers: array values limited to a range
+between 0 and 127 are suitable for MIDI output to be used as pitch
+\, velocity \, or controller numbers. Some MIDI information requires
+a much larger range \, such as pitch benders.;
+#X text 20 207 3) Envelopes: an array with four elements can be used
+effectively as an ADSR enveloper. There are numerous examples of this
+in other Pd help documents.;
+#X text 20 253 4) Math and conversion tables: arrays are an excellent
+visual tool when performing Fourier analysis and other higher mathematic
+functions.;
+#X text 20 300 5) Wave editing: with proper manipulation of array data
+\, Pd can be a fully functional wave editor \, complete with mouse-clickable
+cut-n-paste \, pitch-shift \, time expansion \, down/upsampling \,
+and other tools typically found in commercial wave editors.;
+#X restore 43 135 pd Common_uses_for_arrays_in_PD;
+#X text 40 180 This document is meant to supplement the help documentation
+for [table] \, [tabread] \, [tabwrite] \, [soundfiler] \, [tabsend~]
+\, [tabreceive~] \, [tabplay~] \, etc.;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header arrays 20 10 1 18
+-261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 290 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 284 META 0;
+#X text 12 95 LIBRARY PDDP;
+#X text 12 115 HELP_PATCH_AUTHORS Updated for Pd 0.38-2. Jonathan Wilkes
+revised the patch to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 KEYWORDS array storage;
+#X text 12 25 NAME table struct;
+#X text 12 65 DESCRIPTION description of arrays and related objects
+for creating and managing them;
+#X restore 392 292 pd META;
+#N canvas 13 162 428 183 Related_objects 0;
+#X obj 22 41 struct;
+#X obj 76 41 plot;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Arrays- Related Objects;
+#X obj 121 41 list;
+#X obj 20 120 pddplink all_about_expr_functions.pd;
+#X text 20 76 The [expr] family objects have some limited functionality
+for dealing with arrays. See heading "Array/Table Functions" in:;
+#X restore 103 292 pd Related_objects;
+#X obj 6 292 pddp/pddplink pddp/help.pd -text help;
+#N canvas 14 48 428 287 What_is_an_array_in_PD 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 What is an Array in Pure Data?;
+#X text 19 36 Arrays \, in most programming environments \, are considered
to be "a sequence of objects all of which have the same variable type"
wherein each object is called an element and the elements are numbered
-in a row 0 \, 1 \, 2 \, 3 \, etc. These numbers are called indices.
+in a row: 0 \, 1 \, 2 \, 3 \, etc. These numbers are called indices.
Each index holds a corresponding value.;
-#X text 46 222 Arrays in Pd look like this:;
-#N canvas 0 22 450 300 graph18 0;
-#X array example_array 100 float 0;
-#X coords 0 1 99 -1 200 140 1;
-#X restore 277 225 graph;
-#X text 63 486 1 Right-click on the array and select "Properties" from
-the menu. Two dialogue boxes will open - one called "graph" and one
-called "array".;
-#X text 64 543 2 Then right-click again on the array and select "Help"
-from the menu. The window that opens is the table.pd help document.
+#X text 19 119 All of this is true in Pd \, although the word "array"
+is often used loosely to refer to three different concepts:;
+#X text 19 228 3) an array defined (and possibly represented graphically)
+as part of a data structure.;
+#X text 19 146 1) an array as defined above.;
+#X text 19 161 2) a graphical representation of an array \, or "garray"
+\, created by:;
+#X text 37 186 a) choosing "Array" from the "Put" menu \, or;
+#X text 37 201 b) creating a [table] object (in which case it's hidden
+inside a subpatch).;
+#X restore 43 42 pd What_is_an_array_in_PD;
+#N canvas 0 0 428 403 The_Put_menu_array 0;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-pddp-garray-ex1 100 float 2;
+#X coords 0 1 99 -1 200 140 1 0 0;
+#X restore 22 73 graph;
+#X text 233 149 the black line to change;
+#X text 227 134 (You can click-drag the;
+#X text 233 164 the values of the array);
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 19 331 An explanation of how to create a "Put" menu garray
+\, as well as what all the properties mean \, is outlined below:;
+#X text 7 1 The Put Menu Graphical Array;
+#X text 19 288 Right-click on the graph and select "Properties" from
+the menu. Two dialogue boxes will open-- one for the graph (titled
+"canvas") and one for the array (titled "array").;
+#X text 19 37 Below is a graphical array created with the "Put" menu:
+;
+#X text 19 222 The array above is actually only the horizontal line!
+The rectangle surrounding it is called a "graph". By default \, Pd
+automatically creates a new graph to house a garray when you choose
+"Array" from the "Put" menu \, although you can put several arrays
+in one graph. (See subpatch below.);
+#N canvas 4 71 428 439 How_to_create_a_Put_menu_array 0;
+#X text 19 272 4) If you want Pd to create a new graph for this array
+\, then select "in new graph". If you have another location in mind
+-- for example if you want to overlap two arrays in a single graph
+\, then select "in last graph".;
+#X text 19 366 6) Note: if you do not want to see the graph in this
+window \, then you can use the [table] object instead...the array will
+then be created inside the [table] object and will be seen only if
+you manually open the table.;
+#X text 19 178 3) The "Save contents" checkbox will inform Pure Data
+that you want the array saved within the source code of this patch.
+This way \, you can ensure that the array will maintain its values
+each time you open this patch. This is recommended only for relatively
+small arrays-- larger arrays should be saved to either a text file
+\, or an audio file.;
+#X text 19 330 5) Click "OK" and place the new array anywhere in this
+window.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 How to Create a Garray in PD;
+#X text 20 37 1) In a new/existing patch window \, select "Array" from
+the "Put" menu.;
+#X text 20 72 2) A dialogue window will pop up \; type a name for the
+array and the desired size. If you want a localized array \, then name
+it something like \$0-dave (the "\$0" indicates that part of the name
+is a variable which is unique to this patch). The size of the array
+can be anything greater than 0 (zero). At a sample rate of 441000 khz
+\, an array of 882000 will provide you with 2 seconds of audio data.
;
-#X text 45 148 All of this is true in Pd \, except that arrays in Pd
-can only hold floating point data. (other data types in Pd are called
-"lists" or "anythings" and require different tools to manipulate them.)
+#X restore 22 366 pd How_to_create_a_Put_menu_array;
+#X restore 63 64 pd The_Put_menu_array;
+#N canvas 0 0 428 388 The_[table]_object 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 The [table] object;
+#X text 19 37 The [table] object is another way to create a graphical
+array.;
+#X obj 22 73 table myTable;
+#X text 19 96 If you click the [table] object in runmode you can see
+it's just a subcanvas \, inside which is a graph containing an array.
;
-#X text 45 378 The array above is actually only the horizontal line!
-The rectangle surrounding the array is called a "graph". These two
-objects are separate \, but Pd creates both simoultaneously for purposes
-of convenience. These two objects together are called a "table". To
-see what I mean by all of this:;
-#X restore 43 42 pd What_is_an_array_in_PD;
-#N canvas 148 160 612 619 How_to_manipulate_arrays_in_PD 0;
-#X text 13 5 HOW TO MANIPULATE ARRAYS IN Pd;
-#N canvas 0 22 452 302 graph28 0;
-#X array exampleArray 67 float 0;
-#X coords 0 2 67 -2 200 140 1;
-#X restore 369 451 graph;
-#N canvas 2 29 722 269 Setting_the_size_of_an_array 0;
-#X msg 44 88 \; exampleArray resize \$1;
-#X floatatom 44 66 5 0 0 0 - - -;
-#X text 16 18 1 The size of an array can be set using the array's dialogue
-box. Or with a [send] message like below.;
-#X text 15 65 2;
-#X text 231 91 same as;
-#X floatatom 305 66 5 0 0 0 - - -;
-#X obj 305 114 s exampleArray;
-#X msg 305 88 resize \$1;
-#X text 19 158 Note that new elements always have a default value of
-zero when you make an array larger. Also note that if you make arrays
+#X text 19 209 * when using the [table] object \, you can't save any
+changes you make to the properites of the garray \, graph \, or the
+[table] subpatch itself.;
+#X text 19 140 At first glance \, this might look strikingly similar
+to the "Put" menu array. There are \, however \, some important differences:
+;
+#X text 19 179 * with the [table] object \, you can use the arguments
+to set the name and size of the array.;
+#X text 19 249 * with the [table] object \, you cannot save the contents
+of the array with the patch. (Note: this is true even if you open [table]
+and check "save contents" in the garray properties.);
+#X text 19 309 If you're not interested in seeing the array data within
+your PD patch \, you can use the [table] object to store the array
+and corresponding table in a sub-window. Note that [table]s are more
+CPU friendly than their graphical counterpart.;
+#X restore 63 86 pd The_[table]_object;
+#X obj 201 87 pddp/pddplink table-help.pd;
+#X obj 201 65 pddp/pddplink array-help.pd;
+#N canvas 0 0 428 410 Data_structure_arrays 0;
+#X scalar ds-array-ex 26 195 \; 5 Jan \; 3 Feb \; 6 Mar \; 13 Apr \;
+23 May \; 36 Jun \; 52 Jul \; 68 Aug \; 74 Sep \; 75 Oct \; 76 Nov
+\; 76 Dec \; \;;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Arrays in Data Structures;
+#X text 20 137 For more about using arrays with data structures \,
+see the help patches in doc/4.data.structures/ \, especially 05.array.pd.
+;
+#N canvas 19 76 425 300 ds-array-ex 0;
+#N canvas 15 209 450 300 circle 0;
+#X obj 25 56 filledcurve 800 509 1 -5 5 5 5 5 -5 -5 -5;
+#X obj 25 29 struct circle float y symbol a;
+#X text 283 83 (hack to anchor labels;
+#X text 284 99 at the bottom of x-axis);
+#X obj 25 83 drawsymbol a -10 y(-1000:1000)(1105:-895) 0;
+#X restore 55 111 pd circle;
+#X obj 171 215 pointer;
+#X obj 55 20 struct ds-array-ex float x float y array circles circle
+;
+#X obj 12 242 setsize ds-array-ex circles;
+#X floatatom 35 216 5 0 0 0 - - -;
+#X msg 171 188 traverse pd-Data_structure_arrays \, next;
+#X obj 55 47 plot circles 759 3 15 0 25;
+#X obj 55 74 drawpolygon 666 1 0 0 0 100 310 100;
+#X text 121 111 <- template for array elements;
+#X obj 171 161 loadbang;
+#X obj 12 190 inlet;
+#X connect 1 0 3 1;
+#X connect 5 0 1 0;
+#X connect 9 0 5 0;
+#X connect 10 0 3 0;
+#X connect 10 0 4 0;
+#X restore 305 371 pd ds-array-ex;
+#X text 20 91 However \, data structure arrays have a big drawback--
+their array data cannot currently be accessed directly by objects like
+[tabread] or [soundfiler].;
+#X text 20 36 Arrays can be used in data structures \, with or without
+graphical representation. They provide more flexibility than "Put"
+menu arrays (both graphically and in their structure).;
+#X text 90 371 see subpatch for ds definition ->;
+#X text 20 343 click here to change the size of the array ->;
+#X floatatom 305 345 5 0 0 0 - - -;
+#X connect 9 0 4 0;
+#X restore 63 108 pd Data_structure_arrays;
+#X obj 216 109 pddp/pddplink struct-help.pd;
+#N canvas 14 32 428 532 How_to_manipulate_arrays_in_PD 0;
+#N canvas 0 22 452 302 (subpatch) 0;
+#X array exampleArray 14 float 0;
+#X coords 0 2 13 -2 200 140 1 0 0;
+#X restore 214 378 graph;
+#N canvas 9 24 434 213 Setting_the_size_of_an_array 0;
+#X msg 214 88 \; exampleArray resize \$1;
+#X floatatom 214 66 5 0 0 0 - - -;
+#X text 151 100 same as;
+#X floatatom 48 66 5 0 0 0 - - -;
+#X obj 48 114 s exampleArray;
+#X msg 48 88 resize \$1;
+#X text 15 8 For "Put" menu arrays \, you can right-click and use the
+"Properties" menu to change the size. For both "Put" menu arrays and
+[table] objects \, you can also send messages to the array by name:
+;
+#X text 15 145 Note that when you make an array larger \, new elements
+always have a default value of zero. Also note that if you make arrays
smaller \, you may lose data as each element is deleted from the end
of the array.;
#X connect 1 0 0 0;
-#X connect 5 0 7 0;
-#X connect 7 0 6 0;
-#X restore 24 270 pd Setting_the_size_of_an_array;
-#N canvas 4 30 720 447 Concatenate_two_arrays 0;
+#X connect 3 0 5 0;
+#X connect 5 0 4 0;
+#X restore 23 206 pd Setting_the_size_of_an_array;
+#N canvas 4 16 720 375 Concatenate_two_arrays 0;
#X text 19 10 This example assumes that we already know the size of
the two arrays which will be concatenated. This process will fill NewArray
with the contents of exampleArray and concatArray.;
-#N canvas 0 22 450 300 graph33 0;
+#N canvas 0 22 450 300 (subpatch) 0;
#X array concatArray 15 float 1;
#A 0 -0.700355 -0.371783 -0.443212 -0.700355 -0.714641 -0.386069 0.0425035
0.399647 0.513933 0.399647 0.128218 -0.128925 -0.21464 -0.0289252 -0.700355
;
-#X coords 0 1 14 -1 200 140 1;
+#X coords 0 1 14 -1 200 120 1;
#X restore 492 25 graph;
-#N canvas 0 22 450 300 graph34 0;
-#X array NewArray 82 float 0;
-#X coords 0 1 81 -1 300 140 1;
-#X restore 389 267 graph;
-#X obj 125 66 bng 15 250 50 0 empty empty Bang_me 18 7 0 8 -262144
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array NewArray 29 float 0;
+#X coords 0 1 28 -1 300 140 1;
+#X restore 389 225 graph;
+#X obj 125 57 bng 15 250 50 0 empty empty Bang_me 18 7 0 8 -262144
-1 -1;
-#X obj 28 96 until;
-#X obj 28 171 f;
-#X obj 58 171 + 1;
-#X obj 28 286 tabread exampleArray;
-#X obj 28 340 tabwrite NewArray;
-#X obj 141 311 tabread concatArray;
-#X text 372 194 This example is much more interesting if;
-#X text 373 212 you draw new values into each array with;
-#X text 373 230 your mouse - then reset and bang again.;
-#X obj 150 134 arraysize exampleArray;
-#X obj 125 163 arraysize concatArray;
-#X obj 125 188 +;
-#X msg 178 241 \; NewArray resize \$1;
-#X text 28 75 loop;
-#X obj 28 219 moses;
-#X obj 141 254 -;
-#X obj 125 85 t b b b;
-#X obj 125 212 t f f;
-#X msg 47 144 0;
-#X obj 176 109 s clr1;
-#X obj 47 119 r clr1;
-#X connect 3 0 20 0;
+#X obj 28 87 until;
+#X obj 28 162 f;
+#X obj 58 162 + 1;
+#X obj 28 277 tabread exampleArray;
+#X obj 28 331 tabwrite NewArray;
+#X obj 141 302 tabread concatArray;
+#X text 372 152 This example is much more interesting if;
+#X text 373 170 you draw new values into each array with;
+#X text 373 188 your mouse - then reset and bang again.;
+#X obj 125 179 +;
+#X msg 178 232 \; NewArray resize \$1;
+#X text 28 66 loop;
+#X obj 28 210 moses;
+#X obj 141 245 -;
+#X obj 125 76 t b b b;
+#X obj 125 203 t f f;
+#X msg 47 135 0;
+#X obj 176 100 s clr1;
+#X obj 47 110 r clr1;
+#X obj 125 154 expr size("concatArray");
+#X obj 150 125 expr size("exampleArray");
+#X connect 3 0 18 0;
#X connect 4 0 5 0;
#X connect 5 0 6 0;
-#X connect 5 0 18 0;
+#X connect 5 0 16 0;
#X connect 5 0 8 1;
#X connect 6 0 5 1;
#X connect 7 0 8 0;
#X connect 9 0 8 0;
-#X connect 13 0 15 1;
-#X connect 13 0 19 1;
-#X connect 13 0 18 1;
-#X connect 14 0 15 0;
-#X connect 15 0 21 0;
-#X connect 18 0 7 0;
-#X connect 18 1 19 0;
-#X connect 19 0 9 0;
-#X connect 20 0 14 0;
-#X connect 20 1 13 0;
-#X connect 20 2 23 0;
-#X connect 21 0 4 0;
-#X connect 21 1 16 0;
-#X connect 22 0 5 1;
-#X connect 24 0 22 0;
-#X restore 24 371 pd Concatenate_two_arrays;
-#N canvas 4 30 735 395 Join_array_elements_into_a_list 0;
+#X connect 13 0 19 0;
+#X connect 16 0 7 0;
+#X connect 16 1 17 0;
+#X connect 17 0 9 0;
+#X connect 18 0 23 0;
+#X connect 18 1 24 0;
+#X connect 18 2 21 0;
+#X connect 19 0 4 0;
+#X connect 19 1 14 0;
+#X connect 20 0 5 1;
+#X connect 22 0 20 0;
+#X connect 23 0 13 0;
+#X connect 24 0 13 1;
+#X connect 24 0 17 1;
+#X connect 24 0 16 1;
+#X restore 23 316 pd Concatenate_two_arrays;
+#N canvas 4 23 678 354 Join_array_elements_into_a_list 0;
#X text 16 12 JOIN ARRAY ELEMENTS INTO A LIST;
-#X obj 22 163 bng 15 250 50 0 empty empty Bang_me 18 7 0 8 -24198 -1
+#X obj 23 133 bng 15 250 50 0 empty empty Bang_me 18 7 0 8 -24198 -1
-1;
-#X obj 23 241 until;
-#X obj 24 320 tabread exampleArray;
-#X obj 216 235 pack s f;
-#X obj 216 183 t b f;
-#X obj 24 292 f;
-#X obj 58 292 + 1;
-#X obj 24 348 s \$1-value;
-#X obj 216 157 r \$1-value;
-#X obj 216 261 route list;
-#X obj 519 210 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+#X obj 23 211 until;
+#X obj 23 284 tabread exampleArray;
+#X obj 216 205 pack s f;
+#X obj 216 153 t b f;
+#X obj 23 256 f;
+#X obj 57 256 + 1;
+#X obj 23 312 s \$1-value;
+#X obj 216 127 r \$1-value;
+#X obj 216 231 route list;
+#X obj 509 170 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
-#X obj 519 229 savepanel;
-#X msg 519 252 \; exampleArray write \$1;
-#X obj 283 353 print;
-#X text 289 330 store the list;
-#X obj 283 312 textfile;
-#X msg 345 285 rewind;
-#X obj 216 209 symbol add2;
-#X obj 310 240 bng 15 250 50 0 empty empty THEN_Print_the_list 18 7
+#X obj 509 189 savepanel;
+#X msg 509 212 \; exampleArray write \$1;
+#X obj 283 323 print;
+#X text 289 300 store the list;
+#X obj 283 282 textfile;
+#X msg 345 255 rewind;
+#X obj 216 179 symbol add2;
+#X obj 310 210 bng 15 250 50 0 empty empty THEN_Print_the_list 18 7
0 8 -24198 -1 -1;
-#X text 451 308 can be achieved by saving the;
-#X text 451 324 array elements to a text file;
-#X text 452 341 using the savepanel and write;
-#X text 453 357 message.;
-#X text 452 292 Alternatively \, a similar result;
-#X obj 22 183 arraysize exampleArray;
-#X msg 129 261 clear;
-#X obj 310 261 t b b;
-#X msg 74 260 0;
-#X text 29 37 In some other programming environments \, including Visual
+#X text 441 268 can be achieved by saving the;
+#X text 441 284 array elements to a text file;
+#X text 442 301 using the savepanel and write;
+#X text 443 317 message.;
+#X text 442 252 Alternatively \, a similar result;
+#X obj 23 153 arraysize exampleArray;
+#X msg 129 231 clear;
+#X obj 310 231 t b b;
+#X msg 74 230 0;
+#X text 20 37 In some other programming environments \, including Visual
Basic and Java (among others) \, there are functions which join all
elements of an array into a list. This example shows how this functionality
can be duplicated in Pd. This example uses the elements of exampleArray
from the previous help window. The list can either be printed to the
terminal window \, or it can be saved to a text file.;
-#X obj 23 214 t f b;
+#X obj 23 184 t f b;
#X connect 1 0 25 0;
#X connect 2 0 6 0;
#X connect 3 0 8 0;
@@ -178,69 +360,84 @@ terminal window \, or it can be saved to a text file.;
#X connect 30 0 2 0;
#X connect 30 1 28 0;
#X connect 30 1 26 0;
-#X restore 24 397 pd Join_array_elements_into_a_list;
-#N canvas 2 29 719 337 Getting_the_size_of_an_array 0;
-#X text 15 11 GETTING THE SIZE OF AN ARRAY;
-#X text 34 34 If you deal with arrays often \, you will want to download
-the [arraysize] external written by PIX. Pd lacks a native object for
-this purpose and I'm afraid that without this external this functionality
-is impossible in Pd.;
-#X obj 38 127 arraysize exampleArray;
-#X obj 38 107 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+#X restore 23 338 pd Join_array_elements_into_a_list;
+#N canvas 1 2 418 389 Getting_the_size_of_an_array 0;
+#X obj 18 69 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
-#X floatatom 38 152 5 0 0 0 - - -;
-#X text 35 183 Having said that...PD arrays accept a "print" command
-which will output important array information to the terminal window.
-Like below:;
-#X msg 40 258 \; exampleArray print;
-#X connect 2 0 4 0;
-#X connect 3 0 2 0;
-#X restore 24 320 pd Getting_the_size_of_an_array;
-#N canvas 0 31 721 390 Reversing_an_array 0;
+#X floatatom 18 114 5 0 0 0 - - -;
+#X msg 148 336 \; exampleArray print;
+#X text 15 11 If you deal with arrays often \, you will want have a
+look at the [expr] object \, which offers several functions for manipulating
+arrays. The [expr] \, [expr~] \, and [fexpr~] objects are included
+in most Pd distributions.;
+#X obj 18 89 expr size("exampleArray");
+#X text 182 89 (Notice the quotes around the;
+#X text 185 104 array name.);
+#X floatatom 18 244 5 0 0 0 - - -;
+#X text 15 138 You can use the special dollarsign variables of [expr]
+to dynamically change the array name:;
+#X obj 18 219 expr size("$s1");
+#X msg 18 172 symbol exampleArray;
+#X msg 36 194 symbol someOtherArray;
+#X text 15 300 Arrays accept a "print" command which will output important
+array information to the terminal window. Like below:;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array someOtherArray 4 float 2;
+#X coords 0 1 4 -1 75 50 1;
+#X restore 235 201 graph;
+#X text 15 266 See the [expr] help patch for other array functions.
+;
+#X connect 0 0 4 0;
+#X connect 4 0 1 0;
+#X connect 9 0 7 0;
+#X connect 10 0 9 0;
+#X connect 11 0 9 0;
+#X restore 23 250 pd Getting_the_size_of_an_array;
+#N canvas 0 31 721 355 Reversing_an_array 0;
#X text 20 15 REVERSING AN ARRAY;
#X text 23 35 When an array is reversed \, as the name implies the
first element becomes the last and the last becomes the first. When
viewing this example \, please be sure you can see the "exampleArray"
in the previous window.;
-#X obj 110 109 bng 15 250 50 0 empty empty Reverse_me 18 7 0 8 -262144
+#X obj 110 99 bng 15 250 50 0 empty empty Reverse_me 18 7 0 8 -262144
-1 -1;
-#X obj 110 128 arraysize exampleArray;
-#X obj 110 200 until;
-#X obj 176 228 + 1;
-#X obj 144 228 f;
-#X obj 135 176 s \$1-length;
-#X obj 169 281 tabread exampleArray;
-#X obj 313 342 table tempArray;
-#X obj 110 152 t f f f;
-#X obj 234 196 s tempArray;
-#X msg 234 172 resize \$1;
-#X obj 65 308 tabwrite tempArray;
+#X obj 110 118 arraysize exampleArray;
+#X obj 110 190 until;
+#X obj 176 218 + 1;
+#X obj 144 218 f;
+#X obj 135 166 s \$1-length;
+#X obj 169 271 tabread exampleArray;
+#X obj 313 325 table tempArray;
+#X obj 110 142 t f f f;
+#X obj 234 186 s tempArray;
+#X msg 234 162 resize \$1;
+#X obj 65 298 tabwrite tempArray;
#X obj 510 41 sel;
#X obj 586 31 - 1;
#X obj 586 7 r \$1-length;
-#X obj 144 254 t f f f;
-#X obj 57 278 s \$1-eof;
+#X obj 144 244 t f f f;
+#X obj 57 268 s \$1-eof;
#X obj 510 8 r \$1-eof;
#X obj 510 113 until;
#X obj 510 88 f;
-#X obj 510 161 f;
-#X obj 542 161 - 1;
-#X obj 561 108 r \$1-length;
+#X obj 510 146 f;
+#X obj 542 146 - 1;
+#X obj 561 93 r \$1-length;
#X obj 529 64 r \$1-length;
-#X obj 510 213 tabread tempArray;
-#X obj 510 345 tabwrite exampleArray;
-#X obj 574 265 f;
-#X obj 593 241 r \$1-length;
-#X obj 574 314 mod;
-#X obj 593 289 r \$1-length;
-#X obj 604 265 + 1;
-#X obj 510 186 t f b;
-#X obj 561 131 - 1;
-#X text 13 346 Copies array to a temporary location.;
-#X msg 327 124 0;
-#X obj 327 148 s clr2;
-#X obj 443 150 r clr2;
-#X obj 163 200 r clr2;
+#X obj 510 198 tabread tempArray;
+#X obj 510 325 tabwrite exampleArray;
+#X obj 574 245 f;
+#X obj 593 221 r \$1-length;
+#X obj 574 294 mod;
+#X obj 593 269 r \$1-length;
+#X obj 604 245 + 1;
+#X obj 510 171 t f b;
+#X obj 561 116 - 1;
+#X text 43 325 Copies array to a temporary location.;
+#X msg 327 114 0;
+#X obj 327 138 s clr2;
+#X obj 453 100 r clr2;
+#X obj 163 190 r clr2;
#X connect 2 0 3 0;
#X connect 2 0 36 0;
#X connect 3 0 10 0;
@@ -280,19 +477,19 @@ in the previous window.;
#X connect 36 0 37 0;
#X connect 38 0 22 1;
#X connect 39 0 6 1;
-#X restore 24 474 pd Reversing_an_array;
-#N canvas 2 30 719 390 Popping_and_Pushing_arrays 0;
-#X obj 62 181 bng 15 250 50 0 empty empty Pop_me -18 -6 0 8 -262144
+#X restore 23 404 pd Reversing_an_array;
+#N canvas 2 30 522 357 Popping_and_Pushing_arrays 0;
+#X obj 53 151 bng 15 250 50 0 empty empty Pop_me -18 -6 0 8 -262144
-1 -1;
-#X obj 134 199 arraysize exampleArray;
-#X obj 134 294 tabread exampleArray;
-#X floatatom 134 318 0 0 0 0 - - -;
-#X obj 99 173 t b b;
-#X obj 51 320 - 1;
-#X msg 51 346 \; exampleArray resize \$1;
-#X floatatom 158 223 0 0 0 0 - - -;
-#X text 175 318 value of last element;
-#X obj 458 188 bng 15 250 50 0 empty empty Push_me 18 7 0 8 -262144
+#X obj 125 169 arraysize exampleArray;
+#X obj 125 264 tabread exampleArray;
+#X floatatom 125 288 0 0 0 0 - - -;
+#X obj 90 143 t b b;
+#X obj 42 290 - 1;
+#X msg 42 316 \; exampleArray resize \$1;
+#X floatatom 149 193 0 0 0 0 - - -;
+#X text 166 288 value of last element;
+#X obj 349 151 bng 15 250 50 0 empty empty Push_me 18 7 0 8 -262144
-1 -1;
#X text 31 33 I got this idea from Java \, which provides a method
to "pop" an array. The "pop" method will remove the last element in
@@ -302,16 +499,16 @@ PD is that we need to know the length of the array before we start
is the opposite effect and also a tool provided in Java. When an array
is pushed \, an element is added to the array and the new size is returned.
;
-#X obj 458 208 arraysize exampleArray;
-#X obj 458 232 + 1;
-#X msg 458 292 \; exampleArray resize \$1;
-#X floatatom 476 258 0 0 0 0 - - -;
-#X text 521 258 new size;
+#X obj 349 171 arraysize exampleArray;
+#X obj 349 195 + 1;
+#X msg 349 255 \; exampleArray resize \$1;
+#X floatatom 367 221 0 0 0 0 - - -;
+#X text 412 221 new size;
#X text 16 12 POPPING AND PUSHING AN ARRAY;
-#X obj 158 246 - 1;
-#X text 197 223 # of total elements;
-#X floatatom 158 271 0 0 0 0 - - -;
-#X text 198 273 new size;
+#X obj 149 216 - 1;
+#X text 188 193 # of total elements;
+#X floatatom 149 241 0 0 0 0 - - -;
+#X text 189 243 new size;
#X connect 0 0 4 0;
#X connect 1 0 2 0;
#X connect 1 0 5 0;
@@ -326,8 +523,8 @@ is pushed \, an element is added to the array and the new size is returned.
#X connect 12 0 13 0;
#X connect 12 0 14 0;
#X connect 17 0 19 0;
-#X restore 24 423 pd Popping_and_Pushing_arrays;
-#N canvas 2 30 722 391 Shifting_an_array 0;
+#X restore 23 360 pd Popping_and_Pushing_arrays;
+#N canvas 5 2 669 391 Shifting_an_array 0;
#X obj 30 90 bng 15 250 50 0 empty empty Shift_me 18 7 0 8 -24198 -1
-1;
#X text 16 12 SHIFTING AN ARRAY;
@@ -424,61 +621,47 @@ element of the array and return its value. This is opposite of the
#X connect 43 0 35 1;
#X connect 45 0 43 0;
#X connect 46 0 9 1;
-#X restore 24 449 pd Shifting_an_array;
-#X text 25 32 Arrays in Pd are different than the arrays in other languages
-primarily because \, in Pd \, they are designed to be displayed graphically
-on screen. This is due to the nature of audio synthesis - we want to
-see our wave forms and visually understand the data. That's why arrays
-in Pd are complicated by other objects like tables \, graphs and widgets.
-PD uses these objects to provide a graphic representation of the array
-data. If you're not interested in seeing the array data within your
-PD patch \, you can use the [table] object to store the array and corresponding
-table in a sub-window. Note that [table]s are more CPU friendly than
-their graphical counterpart.;
-#X text 26 230 Like all programming languages \, Pd provides numerous
-tools to manipulate arrays and their data.;
-#N canvas 3 32 718 310 Setting_a_constant_array_value 0;
-#X floatatom 26 151 0 0 0 0 - - -;
-#X obj 26 185 / 100;
-#X msg 26 215 \; exampleArray const \$1;
-#X text 18 16 SETTING A CONSTANT ARRAY VALUE;
-#X text 27 46 By default \, all array element values are zero. However
-\, Pd allows you to change that using the "CONST" message.;
-#X text 26 88 This feature is useful to reset all values in an array
+#X restore 23 382 pd Shifting_an_array;
+#N canvas 21 125 413 203 Setting_a_constant_array_value 0;
+#X floatatom 226 99 0 0 0 0 - - -;
+#X obj 226 123 / 100;
+#X msg 226 153 \; exampleArray const \$1;
+#X text 16 50 This feature is useful to reset all values in an array
\, or with a little creativity can be used to "delete" a slice \, or
create silence in audio samples.;
+#X text 17 13 By default \, all array element values are zero. However
+\, Pd allows you to change that using the "const" message.;
#X connect 0 0 1 0;
#X connect 1 0 2 0;
-#X restore 24 345 pd Setting_a_constant_array_value;
-#N canvas 3 26 727 395 Higher_math_using_arrays 0;
+#X restore 23 294 pd Setting_a_constant_array_value;
+#N canvas 3 26 727 298 Higher_math_using_arrays 0;
#X text -7 12 HIGHER MATH USING ARRAYS;
-#X text -3 226 Normalize;
-#X text 78 227 (arg: renormer...a number by which all array values
+#X text -3 176 Normalize;
+#X text 78 177 (arg: renormer...a number by which all array values
will be normalized);
-#X msg 6 278 \; exampleArray normalize \$1;
-#X floatatom 6 256 5 0 0 0 - - -;
-#N canvas 5 55 710 432 sine_waves 0;
-#X text 34 188 Sinesum;
-#X text 98 190 (arg 1: Number of Points - arg 2: list of partial strengths)
+#X msg 6 228 \; exampleArray normalize \$1;
+#X floatatom 6 206 5 0 0 0 - - -;
+#N canvas 9 28 710 366 sine_waves 0;
+#X text 34 160 Sinesum;
+#X text 98 162 (arg 1: Number of Points - arg 2: list of partial strengths)
;
-#X msg 40 293 \; exampleArray sinesum 64 1 0 0.5 0 0.2 0 0.15;
-#X msg 40 251 \; exampleArray sinesum 64 1 0.5 0.38 0.3 0.28 0.25 0.2
+#X msg 40 265 \; exampleArray sinesum 64 1 0 0.5 0 0.2 0 0.15;
+#X msg 40 223 \; exampleArray sinesum 64 1 0.5 0.38 0.3 0.28 0.25 0.2
;
-#X msg 40 210 \; exampleArray sinesum 64 1;
+#X msg 40 182 \; exampleArray sinesum 64 1;
#X text 26 7 SINE WAVES;
-#X text 29 30 comment;
-#X text 45 29 When the "sinesum" message is sent to the array \, Pd
+#X text 45 26 When the "sinesum" message is sent to the array \, Pd
will want to know two things:;
-#X text 58 65 1 How many samples (array elements) should be used? The
+#X text 58 57 1 How many samples (array elements) should be used? The
higher the number is \, the higher the resolution of the wave form.
;
-#X text 58 122 2 What is the relative strength of each "partial" or
+#X text 58 104 2 What is the relative strength of each "partial" or
"overtone" in the sound? For more info about this \, please lookup
"overtones" or "harmonics" or "partials" on the internet.;
-#X text 250 220 a pure sine wave!;
-#X text 479 259 a triangle wave;
-#X text 412 303 a square wave;
-#X text 33 346 Note that these waves aren't exactly triangular or square...instead
+#X text 250 192 a pure sine wave!;
+#X text 369 231 a triangle wave;
+#X text 331 274 a square wave;
+#X text 33 309 Note that these waves aren't exactly triangular or square...instead
they are "smoothed" by the sinesum function to more accurately produce
these wave forms as analog instruments do.;
#X restore 7 42 pd sine_waves;
@@ -491,7 +674,7 @@ similar to those of our electronic and mechanical predecessors. The
first and one of the most important mathematic functions in digital
synthesis is undoubtebly "sinesum". Pd provides an easy method for
us to integrate these higher math functions in our arrays.;
-#N canvas 0 195 750 302 cosine_waves 0;
+#N canvas 3 29 750 302 cosine_waves 0;
#X text 11 22 Cosinesum;
#X text 91 22 (arg 1: Number of Points - arg 2: list of partial strengths)
;
@@ -501,15 +684,15 @@ us to integrate these higher math functions in our arrays.;
#X msg 22 159 \; exampleArray cosinesum 64 -0.15 0.2 0.15 -0.15 0.1
0.1 0.2 -0.2 0.35 -0.25 -0.1 0.1 0.199;
#X restore 6 73 pd cosine_waves;
-#X text 222 257 To normalize an audio signal means to alter the average
+#X text 222 207 To normalize an audio signal means to alter the average
amplitude of the signal. For the sake of clear \, undistored sounds
\, Pd would like all of your audio signals to never exceed 1 or -1
The first step in achieving this is "normalization" \, but can be assisted
by more drastic tools like compressors \, limiters \, gain multipliers
\, etc.;
#X connect 4 0 3 0;
-#X restore 24 499 pd Higher_math_using_arrays;
-#N canvas 2 31 727 416 Files_and_arrays 0;
+#X restore 23 426 pd Higher_math_using_arrays;
+#N canvas 4 16 727 320 Files_and_arrays 0;
#X text 24 14 OTHER IMPORTANT STUFF;
#X obj 225 91 savepanel;
#X obj 225 70 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
@@ -529,198 +712,123 @@ of formats.;
#X obj 77 231 openpanel;
#X obj 52 232 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
-#X obj 4 280 symbol read;
-#X obj 54 380 soundfiler;
-#X obj 54 355 route list;
-#X obj 54 332 pack s s s s;
-#X obj 100 280 symbol -resize;
-#X obj 78 254 t b b s b;
-#X obj 145 305 symbol exampleArray;
+#X obj 77 285 soundfiler;
#X obj 373 231 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
-#X obj 375 378 soundfiler;
-#X obj 375 353 route list;
-#X obj 375 330 pack s s s s;
-#X obj 399 253 t b b s b;
-#X obj 466 303 symbol exampleArray;
+#X obj 398 284 soundfiler;
#X obj 398 230 savepanel;
-#X obj 317 278 symbol write;
-#X obj 421 278 symbol -aiff;
+#X msg 77 258 read -resize \$1 exampleArray;
+#X msg 398 257 write -aiff \$1 exampleArray;
#X connect 1 0 3 0;
#X connect 2 0 1 0;
#X connect 4 0 5 0;
#X connect 5 0 6 0;
-#X connect 9 0 16 0;
+#X connect 9 0 15 0;
#X connect 10 0 9 0;
-#X connect 11 0 14 0;
-#X connect 13 0 12 0;
-#X connect 14 0 13 0;
-#X connect 15 0 14 1;
-#X connect 16 0 11 0;
-#X connect 16 1 15 0;
-#X connect 16 2 14 2;
-#X connect 16 3 17 0;
-#X connect 17 0 14 3;
-#X connect 18 0 24 0;
-#X connect 20 0 19 0;
-#X connect 21 0 20 0;
-#X connect 22 0 25 0;
-#X connect 22 1 26 0;
-#X connect 22 2 21 2;
-#X connect 22 3 23 0;
-#X connect 23 0 21 3;
-#X connect 24 0 22 0;
-#X connect 25 0 21 0;
-#X connect 26 0 21 1;
-#X restore 24 526 pd Files_and_arrays;
-#N canvas 0 22 719 423 Additional_tools 0;
-#X text 18 14 ADDITIONAL TOOLS;
-#X text 29 38 The "array" object in Pd accepts special messages to
+#X connect 12 0 14 0;
+#X connect 14 0 16 0;
+#X connect 15 0 11 0;
+#X connect 16 0 13 0;
+#X restore 23 448 pd Files_and_arrays;
+#N canvas 0 22 719 367 Additional_tools 0;
+#X text 18 9 ADDITIONAL TOOLS;
+#X text 29 28 The "array" object in Pd accepts special messages to
alter the appearance of the array on screen.;
-#X text 19 81 Arrays can be renamed:;
-#X msg 203 78 \; exampleArray rename george;
-#X msg 431 78 \; george rename exampleArray;
-#X msg 303 173 \; exampleArray bounds 0 1 67 -1;
-#X text 20 129 You can set the bounds of the rectangle: (the arguments
+#X text 19 71 Arrays can be renamed:;
+#X msg 203 68 \; exampleArray rename george;
+#X msg 431 68 \; george rename exampleArray;
+#X msg 303 153 \; exampleArray bounds 0 1 67 -1;
+#X text 20 109 You can set the bounds of the rectangle: (the arguments
are:;
-#X text 353 146 low x \, high y \, high x \, low y);
-#X msg 58 173 \; exampleArray bounds 0 2 67 -2;
-#X text 18 219 Array graphs can be given "ticks" on both the x and
+#X text 353 126 low x \, high y \, high x \, low y);
+#X msg 58 153 \; exampleArray bounds 0 2 67 -2;
+#X text 18 199 Array graphs can be given "ticks" on both the x and
y axis to help you visually measure your data. The tick messages require
3 values: (the index or value of the FIRST large tick \, then the interval
between ticks \, then finally the number of ticks overall per large
tick).;
-#X msg 488 243 \; exampleArray xticks 0 5 3;
-#X msg 471 290 \; exampleArray yticks 0 0.5 4;
-#X msg 354 369 \; exampleArray ylabel -5 -2 -1.5 -1 1 1.5 2;
-#X msg 26 369 \; exampleArray xlabel 0 10 20 30 40 50 60;
-#X text 17 325 Arrays can be given labels to describe the x and y axis.
+#X msg 395 203 \; exampleArray xticks 0 5 3;
+#X msg 378 250 \; exampleArray yticks 0 0.5 4;
+#X msg 354 329 \; exampleArray ylabel -5 -2 -1.5 -1 1 1.5 2;
+#X msg 26 329 \; exampleArray xlabel 0 10 20 30 40 50 60;
+#X text 17 285 Arrays can be given labels to describe the x and y axis.
Give a y value and a bunch of x values or vice versa:;
-#X restore 24 553 pd Additional_tools;
-#N canvas 375 65 671 598 Populating_an_array 0;
-#X text 27 12 POPULATING AN ARRAY;
-#X text 41 37 An array in Pd is primarily a storage device for numbers.
+#X restore 23 470 pd Additional_tools;
+#N canvas 2 2 433 386 Populating_an_array 0;
+#X text 19 21 An array in Pd is primarily a storage device for numbers.
The result is a series of numbers that you can do with whatever you
wish...but how does one populate an array?;
-#X msg 39 333 \; exampleArray 0 -1 1 -1 0.5 -0.5 0.5 -0.2 0.2 -0.2
+#X msg 22 232 \; exampleArray 0 -1 1 -1 0.5 -0.5 0.5 -0.2 0.2 -0.2
0.1 -0.1 0;
-#X text 39 522 Note that if your array is larger than your list \,
+#X text 19 340 Note that if your array is larger than your list \,
then only the first elements will be effected. If your array is smaller
than your list \, then your list will be truncated.;
-#X msg 38 381 \; exampleArray 9 -1 1 -1 0.5 -0.5 0.5 -0.2 0.2 -0.2
+#X msg 22 267 \; exampleArray 9 -1 1 -1 0.5 -0.5 0.5 -0.2 0.2 -0.2
0.1 -0.1 0;
-#X msg 38 430 \; exampleArray 55 -1 1 -1 0.5 -0.5 0.5 -0.2 0.2 0.2
+#X msg 22 302 \; exampleArray 55 -1 1 -1 0.5 -0.5 0.5 -0.2 0.2 0.2
0.1 -0.1 0;
-#N canvas 225 194 487 361 clearExampleArray 0;
-#X obj 199 91 arraysize exampleArray;
-#X obj 153 189 moses;
-#X obj 124 149 +;
-#X obj 162 149 f;
-#X msg 162 123 0;
-#X msg 123 123 1;
-#X obj 153 220 t b b f;
-#X obj 184 276 tabwrite exampleArray;
-#X msg 184 248 0;
-#X obj 55 170 bang;
-#X msg 33 92 0;
-#X obj 33 67 trigger bang bang;
-#X obj 234 168 bang;
-#X obj 33 26 inlet;
-#X connect 0 0 1 1;
-#X connect 1 0 6 0;
-#X connect 1 1 12 0;
-#X connect 2 0 3 0;
-#X connect 2 0 1 0;
-#X connect 3 0 2 1;
-#X connect 4 0 3 0;
-#X connect 5 0 2 0;
-#X connect 6 0 9 0;
-#X connect 6 1 8 0;
-#X connect 6 2 7 1;
-#X connect 8 0 7 0;
-#X connect 9 0 5 0;
-#X connect 10 0 2 0;
-#X connect 11 0 10 0;
-#X connect 11 1 0 0;
-#X connect 12 0 4 0;
-#X connect 13 0 11 0;
-#X restore 441 483 pd clearExampleArray;
-#X obj 419 483 bng 19 250 50 0 empty empty empty 0 -6 0 8 -62784 -1
--1;
-#X text 39 94 Advanced techniques using text or audio files is described
+#X text 19 60 Advanced techniques using text or audio files is described
later \, but for now it's important to know that you can send an array
a list. Each element in the list will be assigned to the corresponding
element in the array. Note that the first position in an array is always
zero!;
-#X text 39 235 These messages below populate exampleArray on the parent
+#X text 19 164 These messages below populate exampleArray on the parent
patch with some values. The first element is the name of the array
to populate. The second element is the position to start at. The rest
of the elements are values to add to the array sequentially.;
-#X text 53 185 first position in array = array[0];
-#X text 53 201 second position in array = array[1];
-#X connect 7 0 6 0;
-#X restore 24 295 pd Populating_an_array;
-#X restore 41 173 pd How_to_manipulate_arrays_in_PD;
-#N canvas 132 22 587 609 How_to_create_an_array_in_PD 0;
-#X text 22 9 1 Select "array" from the "Put" menu above.;
-#X text 21 288 4 If you want Pd to create a new graph for this array
-\, then select "in new graph". If you have another location in mind
--- for example if you want to overlap two arrays in a single graph
-\, then select "in last graph".;
-#X text 19 361 5 Then click "OK" and place the new array anywhere in
-this window.;
-#X text 19 403 6 Note: if you do not want to see the graph in this
-window \, then you can use the [table] object instead...the array will
-then be created inside the [table] object and will be seen only if
-you manually open the table.;
-#X text 22 31 2 A dialogue box appears where you can type the name
-of the array and the desired size. Names can be anything you want -
-if you want a localized array \, then name it something like \$1-dave
-(the dollar sign indicates that part of the name is a variable which
-is unique to this patch). The size of the array can be anything greater
-than 0 (zero). At a sample rate of 441000 khz \, an array of 882000
-will provide you with 2 seconds of audio data.;
-#X text 21 167 3 The "Save contents" checkbox will inform Pure Data
-that you want the array saved within the source code of this patch.
-This way \, you can ensure that the array will maintain its values
-each time you open this patch. This is recommended only for relatively
-small arrays...larger arrays should be saved to either a text file
-\, or an audio file.;
-#X restore 42 106 pd How_to_create_an_array_in_PD;
-#N canvas 133 22 646 607 Common_uses_for_arrays_in_PD 0;
-#X text 27 26 COMMON USES FOR ARRAYS IN Pd;
-#X text 49 60 Arrays are versatile. Their simple structure make them
-useful in countless situations. This page discusses perhaps the most
-common applications.;
-#X text 50 225 2 MIDI Sequencers: array values limited to a range between
-0 and 127 are suitable for MIDI output to be used as pitch \, velocity
-\, or controller numbers. Some MIDI information requires a much larger
-range \, such as pitch benders.;
-#X text 50 306 3 Envelopes: an array with four elements can be used
-effectively as an ADSR enveloper. There are numerous examples of this
-in other Pd help documents.;
-#X text 53 377 4 Math and conversion tables: arrays are an excellent
-visual tool when performing fourier analysis and other higher mathematic
-functions.;
-#X text 54 450 5 Wave editing: with proper manipulation of array data
-\, Pd can be fully functional wave editor \, complete with mouse-clickable
-cut-n-paste \, pitch-shift \, time expansion \, down/upsampling \,
-and other tools typically found in commercial wave editors.;
-#X text 49 128 1 Audio sample data: when an array's values are limited
-to a range between -1 and 1 \, the numbers are suitable for conversion
-to analog audio signal. These arrays are typically many thousands of
-elements and stored on hard disk in the form of aiff \, wav or pure
-text.;
-#X restore 40 239 pd Common_uses_for_arrays_in_PD;
-#X text 39 309 NOTE: I strongly recommend that you download the [arraysize]
-external to your "pd/extra" folder before continuing. Some of these
-examples are impossible without it -- I personally feel that [arraysize]
-should be considered for permanent inclusion in future Pd distributions.
-Check the CVS Repository or Pure-data.org for [arraysize].;
-#X text 40 459 This document is meant to supplement the help documentation
-for [table] \, [tabread] \, [tabwrite] \, [soundfiler] \, [tabsend~]
-\, [tabreceive~] \, [tabplay~] \, etc.;
-#X obj 4 4 cnv 15 500 20 empty empty all_about_arrays 20 10 1 18 -233017
--66577 0;
-#X obj 471 5 pddp/pddplink http://puredata.info/dev/pddp -text pddp;
-#X text 316 528 updated for Pd 0.38-2;
+#X text 33 127 first position in array = array[0];
+#X text 33 143 second position in array = array[1];
+#X restore 23 228 pd Populating_an_array;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Manipulate Arrays in Pd;
+#X text 19 37 Arrays in Pd are different than the arrays in other languages
+primarily because \, in Pd \, they are designed to be displayed graphically
+on screen. This is due to the nature of audio synthesis - we want to
+see our wave forms and visually understand the data. That's why arrays
+in Pd are complicated by other objects like tables \, graphs and widgets.
+PD uses these objects to provide a graphic representation of the array
+data.;
+#X text 20 139 Like all programming languages \, Pd provides numerous
+tools to manipulate arrays and their data. The follow examples may
+be used with "Put" menu arrays and with the [table] object (but \,
+unfortunately \, not with data structure arrays):;
+#N canvas 1 41 433 307 Clearing_an_array 0;
+#X obj 38 209 tabwrite exampleArray;
+#X obj 38 69 expr size("exampleArray");
+#X obj 38 187 0;
+#X obj 38 143 f;
+#X obj 66 143 + 1;
+#X obj 38 113 until;
+#X obj 38 91 t float bang;
+#X obj 107 113 0;
+#X obj 38 165 t b f;
+#X msg 38 42 bang;
+#X text 242 17 The Easy Way;
+#X msg 261 42 const 0;
+#X obj 261 69 s exampleArray;
+#X text 52 17 The Long \, Didactic Way;
+#X text 35 239 There's no "clear" message for arrays \, but you can
+just set a constant value of 0;
+#X text 35 273 See the next subpatch for more on setting constants.
+;
+#X connect 1 0 6 0;
+#X connect 2 0 0 0;
+#X connect 3 0 4 0;
+#X connect 3 0 8 0;
+#X connect 4 0 3 1;
+#X connect 5 0 3 0;
+#X connect 6 0 5 0;
+#X connect 6 1 7 0;
+#X connect 7 0 3 1;
+#X connect 8 0 2 0;
+#X connect 8 1 0 1;
+#X connect 9 0 1 0;
+#X connect 11 0 12 0;
+#X restore 23 272 pd Clearing_an_array;
+#X restore 43 157 pd How_to_manipulate_arrays_in_PD;
+#X text 40 226 For more discussion about arrays and tables \, please
+see:;
+#X obj 40 241 pddp/pddplink ../2.control.examples/15.array.pd;
+#X obj 40 256 pddp/pddplink ../2.control.examples/16.more.arrays.pd
+;
diff --git a/doc/pddp/all_about_ascii_art.pd b/doc/pddp/all_about_ascii_art.pd
new file mode 100644
index 00000000..49842e0c
--- /dev/null
+++ b/doc/pddp/all_about_ascii_art.pd
@@ -0,0 +1,98 @@
+#N canvas 0 0 448 528 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header ascii_art 20 10
+1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 506 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 25 KEYWORDS;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 DESCRIPTION how to draw pd patches in a textfile;
+#X restore 392 508 pd META;
+#N canvas 10 418 428 105 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 ASCII Art- Related Objects;
+#X obj 31 37 pddp/pddplink ../manuals/0.Intro/typing_conventions.pd
+;
+#X restore 103 508 pd Related_objects;
+#X obj 6 508 pddp/pddplink pddp/help.pd -text help;
+#X text 180 36 Meaning;
+#X text 40 36 Text;
+#X text 270 36 Example;
+#X text 40 68 [];
+#X text 180 68 object box;
+#X obj 336 68 osc~;
+#X text 40 118 [(;
+#X text 180 118 message box;
+#X msg 336 118 foo;
+#X text 180 168 connection;
+#X text 270 183 |;
+#X text 270 198 [*~];
+#X obj 336 168 osc~;
+#X obj 336 198 *~;
+#X text 270 248 [f]X[+ 1];
+#X text 270 168 [osc~];
+#X text 270 118 [foo(;
+#X text 270 68 [osc~];
+#X obj 336 248 f;
+#X obj 368 248 + 1;
+#X text 100 36 ASCII Codes;
+#X text 100 68 91 \, 93;
+#X text 100 118 91 \, 40;
+#X text 100 168 124 \, 47 \, 92*;
+#X text 100 248 88 \, 120;
+#X text 180 248 crossed;
+#X text 180 263 connections;
+#X text 40 188 - or _;
+#X text 40 168 | or /;
+#X text 100 188 45 \, 95;
+#X text 40 208 +;
+#X text 40 248 x or X;
+#X text 40 43 ____________________________________________________________
+;
+#X text 100 208 43**;
+#X text 333 36 In Pd;
+#N canvas 10 249 428 252 segmented_patch_cord_rant 0;
+#X text 19 206 -Jonathan Wilkes;
+#X text 19 36 What's interesting is that while some people argue against
+segmented patch cords as a future feature in Pd \, on the grounds that
+it would lead to "sloppy" patching habits and unreadable patches \,
+I have yet to read a negative response to an email that used them in
+ASCII art. That is \, no one to my knowledge has said: "Excuse me but
+I can't ready your ASCII art \, could you please remove the 90-degree
+angles?" Evidently segmented connections are not themselves a problem--
+it's unclear to me then how their use on a Pd canvas would lead an
+otherwise lucid mind down a path of chaos and confusion.;
+#X text 19 186 Thank you for your time.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 ASCII Art- A Rant;
+#X restore 43 469 pd segmented_patch_cord_rant;
+#X text 39 377 [osc~];
+#X text 39 392 |;
+#X text 39 412 |;
+#X text 39 422 |;
+#X text 39 435 [dac~];
+#X text 39 402 +---------;
+#X text 94 412 |;
+#X text 94 422 |;
+#X obj 171 377 osc~;
+#X obj 170 435 dac~;
+#X text 93 435 [writesf~];
+#X obj 212 435 writesf~;
+#X text 40 325 ** People use + in Pd ASCII art to show a segmented
+connection (e.g. \, a connection with at least one 90-degree angle
+in it) \, which isn't currently possible in Pd.;
+#X text 40 295 * ASCII code 92 (backslash) cannot be displayed in Pd
+(at least not without a lot of trouble)!;
+#X connect 18 0 19 0;
+#X connect 24 0 25 0;
+#X connect 25 0 24 1;
+#X connect 50 0 51 0;
+#X connect 50 0 53 0;
diff --git a/doc/pddp/all_about_atom_conversion.pd b/doc/pddp/all_about_atom_conversion.pd
index ea1ec8fc..0daadcd5 100644
--- a/doc/pddp/all_about_atom_conversion.pd
+++ b/doc/pddp/all_about_atom_conversion.pd
@@ -1,88 +1,125 @@
-#N canvas 32 32 763 478 10;
-#X obj 4 2 cnv 15 750 20 empty empty all_about_atom_conversion 20 10
-1 18 -233017 -66577 0;
-#X obj 721 3 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+#N canvas 0 0 448 248 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header atom_conversion
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
;
-#X obj 27 354 list2int;
-#X obj 91 353 l2i;
-#X obj 93 379 a2l;
-#X obj 26 380 any2list;
-#X obj 26 330 lister;
-#X obj 26 406 list2symbol;
-#X obj 26 427 symbol2list;
-#X obj 115 406 l2s;
-#X obj 115 426 s2l;
-#X obj 159 407 tosymbol;
-#X obj 159 426 fromsymbol;
-#X obj 508 290 glue;
-#X obj 569 317 pack;
-#X obj 568 291 list2symbol;
-#X obj 678 290 tosymbol;
-#X text 485 264 making "lists" from untyped inputs:;
-#X obj 444 290 repack;
-#X obj 27 308 list;
-#X obj 26 283 any;
-#X obj 55 283 pipe;
-#X text 439 66 a set that is not a "list" has an undefined type:;
-#X text 17 39 SPECIAL CASES OF "LISTS".;
-#X obj 473 420 pddp/pddplink all_about_data_types.pd -text all_about_data_types
+#X obj 43 80 pddp/pddplink all_about_messages.pd;
+#X obj 1 226 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 65 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS needs_work;
+#X text 12 45 DESCRIPTION how to convert Pd atoms;
+#X restore 392 228 pd META;
+#N canvas 14 133 428 105 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Atoms- Related Objects;
+#X floatatom 22 43 5 0 0 0 - - -;
+#X symbolatom 22 67 10 0 0 0 - - -;
+#X obj 105 42 makefilename;
+#X obj 200 60 pddp/helplink cyclone/fromsymbol;
+#X obj 200 80 pddp/helplink zexy/symbol2list;
+#X obj 311 59 pddp/helplink zexy/list2symbol;
+#X obj 311 79 pddp/helplink cyclone/tosymbol;
+#X obj 200 40 pddp/pddplink all_about_externals.pd -text _________
;
-#X obj 473 397 pddp/pddplink all_about_lists_vs_anythings.pd -text
-all_about_lists_vs_anythings;
-#X obj 454 155 bng 15 250 50 0 empty empty bang 0 20 1 9 -262144 -1
--1;
-#X obj 503 155 bng 15 250 50 0 empty empty float 0 21 1 9 -262144 -1
--1;
-#X obj 552 155 bng 15 250 50 0 empty empty symbol 0 21 1 9 -262144
--1 -1;
-#X msg 456 93 list this is a set with a cast;
-#X msg 463 112 this is a set withOUT a cast;
-#X obj 651 155 bng 15 250 50 0 empty empty list 0 21 1 9 -262144 -1
--1;
-#X obj 701 155 bng 15 250 50 0 empty empty UNDEFINED 0 21 1 9 -262144
--1 -1;
-#X obj 454 135 route bang float symbol pointer list;
-#X obj 602 155 bng 15 250 50 0 empty empty pointer 0 21 1 9 -262144
--1 -1;
-#X msg 20 63 list;
-#X symbolatom 42 129 10 0 0 0 - - -;
-#X msg 27 83 list 25;
-#X msg 34 103 list foo;
-#X text 97 104 A "list" of one "symbol" is converted to a "symbol"
+#X obj 200 40 pddp/pddplink all_about_externals.pd -text Externals
;
-#X text 82 83 A "list" of one "float" is converted to a "float";
-#X text 60 63 An empty "list" is converted to a "bang";
-#X obj 21 169 bng 15 250 50 0 empty empty bang 0 20 1 9 -262144 -1
--1;
-#X obj 70 169 bng 15 250 50 0 empty empty float 0 21 1 9 -262144 -1
--1;
-#X obj 119 169 bng 15 250 50 0 empty empty symbol 0 21 1 9 -262144
--1 -1;
-#X obj 218 169 bng 15 250 50 0 empty empty list 0 21 1 9 -262144 -1
--1;
-#X obj 268 169 bng 15 250 50 0 empty empty UNDEFINED 0 21 1 9 -262144
--1 -1;
-#X obj 21 149 route bang float symbol pointer list;
-#X obj 169 169 bng 15 250 50 0 empty empty pointer 0 21 1 9 -262144
--1 -1;
-#X text 13 233 There are many ways to store \, manipulate. and convert
-atoms and lists. Here is a sampling;
-#X connect 15 0 14 0;
-#X connect 29 0 33 0;
-#X connect 30 0 33 0;
-#X connect 33 0 26 0;
-#X connect 33 1 27 0;
-#X connect 33 2 28 0;
-#X connect 33 3 34 0;
-#X connect 33 4 31 0;
-#X connect 33 5 32 0;
-#X connect 35 0 47 0;
-#X connect 37 0 47 0;
-#X connect 38 0 36 0;
-#X connect 38 0 47 0;
-#X connect 47 0 42 0;
-#X connect 47 1 43 0;
-#X connect 47 2 44 0;
-#X connect 47 3 48 0;
-#X connect 47 4 45 0;
-#X connect 47 5 46 0;
+#X restore 103 228 pd Related_objects;
+#X obj 6 228 pddp/pddplink pddp/help.pd -text help;
+#X text 208 106 <- give some links to the manual;
+#X obj 43 65 pddp/pddplink all_about_atoms.pd;
+#X text 42 36 Converting between atom types in Pd can be tricky. Make
+sure you have read the following help patches first:;
+#N canvas 9 155 428 140 symbol-atom_to_float 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 From a symbol-atom to a float;
+#X text 20 37 There are no standard objects to turn a symbol-atom into
+a float. There are two important externals for this \, however:;
+#X obj 20 70 pddp/helplink cyclone/fromsymbol;
+#X obj 20 90 pddp/helplink zexy/symbol2list;
+#X restore 43 149 pd symbol-atom_to_float;
+#N canvas 14 48 428 554 float_to_symbol-atom 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Changing a float to a symbol-atom;
+#X obj 45 163 hsl 128 15 0 127 0 0 empty 123 empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X text 19 79 For example \, you can enter a number for the "receive-symbol"
+of the so-called IEMGUIS like the slider below. Since receive-names
+need to be symbol-atoms \, the GUI automatically converts "123" to
+a symbol-atom after you click "Ok" or "Apply" in the "Properties" dialogue.
+;
+#X text 181 158 <- hslider with receive-symbol "123";
+#X msg 42 353 symbol 123;
+#X obj 42 375 print empty_symbol;
+#X msg 151 457 123;
+#X text 192 456 <- try it;
+#X obj 151 479 makefilename %d;
+#X text 255 479 <- outputs "symbol 123" \,;
+#X text 255 494 where "123" is a real;
+#X text 255 509 symbol-atom;
+#X obj 130 503 send;
+#X floatatom 93 479 5 0 0 0 - - -;
+#X text 19 395 The [makefilename] object will do the trick \, however.
+It always outputs a symbol message (remember that a symbol message
+must have a symbol-atom as an element) \, and so it can convert an
+incoming float to a symbol-atom:;
+#X text 19 494 Also see:;
+#X obj 20 514 pddp/helplink zexy/list2symbol;
+#X obj 20 529 pddp/helplink cyclone/tosymbol;
+#X text 19 36 Problem: some objects in Pd expect certain atom types
+and will complain with an error if they receive the wrong type. Other
+objects will silently make the conversion for you.;
+#X text 19 183 Note that there's no visible difference between the
+float "123" and the symbol-atom "123"-- the only difference is in how
+these character are understood by Pd. If I want to send a value to
+the slider using [send] \, there is a problem because [send] doesn't
+do any atom conversion-- if you try to create [send 123] you'll get
+an error.;
+#X text 19 267 However \, you can send a symbol message to the right
+inlet of [send] to specify the send-name. You might think that using
+a symbol message will convert the number to a symbol-atom. Unfortunately
+\, that doesn't work either-- the message box silently ignores the
+float and outputs an empty symbol:;
+#X connect 5 0 6 0;
+#X connect 7 0 9 0;
+#X connect 9 0 13 1;
+#X connect 14 0 13 0;
+#X restore 43 106 pd float_to_symbol-atom;
+#N canvas 22 133 428 426 multiple_atoms_to_one_symbol-atom 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Concatenate multiple atoms;
+#X msg 42 98 list one 2 3;
+#X msg 140 98 1 2 3;
+#X msg 42 131 symbol \$1\$2\$3;
+#X symbolatom 42 158 10 0 0 0 - - -;
+#X text 19 36 Dollarsign variables can be used to join several atoms
+together to form one atom. The result is always a symbol-atom.;
+#X text 139 131 \$1\$2\$3 is always a symbol-atom \,;
+#X text 139 148 so we can safely use it build a;
+#X text 139 165 symbol message.;
+#X obj 42 277 makefilename Program%cFiles;
+#X symbolatom 42 301 0 0 0 0 - - -;
+#X msg 42 250 32;
+#X obj 41 352 pddp/helplink zexy/list2symbol;
+#X obj 41 372 pddp/helplink cyclone/tosymbol;
+#X text 19 196 There are also times when you may need to create a symbol-atom
+that contains spaces in it. Use the %c argument with [makefilename].
+;
+#X text 19 335 For more complex constructions \, see:;
+#X connect 2 0 4 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 10 0 11 0;
+#X connect 12 0 10 0;
+#X restore 43 128 pd multiple_atoms_to_one_symbol-atom;
+#X text 42 171 See also:;
+#X obj 43 187 pddp/pddplink all_about_message_conversion.pd;
+#X obj 43 202 pddp/pddplink all_about_symbol_construction.pd;
diff --git a/doc/pddp/all_about_atoms.pd b/doc/pddp/all_about_atoms.pd
new file mode 100644
index 00000000..be01b8dd
--- /dev/null
+++ b/doc/pddp/all_about_atoms.pd
@@ -0,0 +1,181 @@
+#N canvas 0 0 448 238 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header atoms 20 10 1 18
+-261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#N canvas 14 48 428 166 What_is_an_atom? 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 What is an atom in Pd?;
+#X text 19 66 1) Basic atom types: float \, symbol \, and pointer atoms.
+;
+#X text 19 86 2) Special atom types: comma and semicolons.;
+#X text 19 136 See the other subpatches for more details.;
+#X text 19 106 3) Variables: dollar and dollsym atoms.;
+#X text 19 36 An atom is the the most basic unit of data in a message.
+Atoms can be divided into three groups:;
+#X restore 43 42 pd What_is_an_atom?;
+#N canvas 22 133 428 399 Basic_atoms 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 20 320 Pointer is a special type of atom used in connection
+with data-structures. It has no visible form and cannot be converted
+to one of the other atom types. See help for data structures for more
+info.;
+#X text 20 131 A symbol atom can be defined in two ways:;
+#X text 20 37 A float atom represents a single floating point number
+\, which can be used for mathematical computations in Pd.;
+#X obj 1 95 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X obj 1 285 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Float Atom;
+#X text 7 95 Symbol Atom;
+#X text 7 285 Pointer Atom;
+#X text 80 176 Five Examples: word pitch foo-bar 1.2.3 #x21;
+#X text 80 62 Five Examples: 12 -42 3.14 0.019 1e-16;
+#X text 30 146 a) a series of characters that does not contain whitespace
+\, semicolons or commas that cannot be interpreted as a float.;
+#X text 30 197 b) Any set of characters that is created and stored
+in Pd's memory as a symbol atom. For example \, some Pd objects can
+format a directory name like "Video Projects" as a single symbol atom
+for convenience \, (even though it has a space in it). Note that as
+of Pd version 0.42 such "exotic" symbol atoms will not be saved correctly
+in a Pd patch.;
+#X restore 43 69 pd Basic_atoms;
+#N canvas 9 155 428 464 Special_atoms 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Commas and Semicolons in Pd;
+#X text 20 37 Commas and Semicolons are also atoms.;
+#X text 20 58 They are normally used in message boxes \, where they
+separate multiple messages from each other. See message box help for
+more details on this.;
+#X msg 23 102 This is a message box. Right-click and choose "Help"
+;
+#X text 19 179 Commas and semicolons are special because they are not
+separated from other atoms by whitespace.;
+#X text 19 134 Commas and semicolons can also be used in object boxes.
+For example \, the [expr] object uses them in order to organize and
+separate complex mathematical expressions.;
+#X obj 1 226 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X obj 22 339 list append three atoms \,;
+#X obj 22 400 list length;
+#X floatatom 22 422 5 0 0 0 - - -;
+#X obj 22 319 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 55 380 print;
+#X text 19 259 At least for the standard "vanilla" objects \, when
+you enter commas and semicolons as arguments it seems they are converted
+to symbol atoms (and escaped):;
+#X msg 112 380 set \$3;
+#X text 160 433 it again. (I.e. \, you will lose data.);
+#X text 178 339 <- In object boxes \, commas/semicolons;
+#X text 196 354 are saved and loaded consistently;
+#X text 142 403 <- In message boxes \, commas/semicolons won't;
+#X text 160 418 get escaped if you save the patch and load;
+#X text 7 226 Conversion of Commas and Semicolons to Symbol Atoms;
+#X msg 115 404;
+#X connect 8 0 9 0;
+#X connect 8 0 12 0;
+#X connect 8 0 14 0;
+#X connect 9 0 10 0;
+#X connect 11 0 8 0;
+#X connect 14 0 21 0;
+#X restore 43 95 pd Special_atoms;
+#N canvas 7 69 428 561 Variable_atoms 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X obj 1 228 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X obj 1 298 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 298 In message boxes;
+#X obj 1 368 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X msg 22 462 symbol o;
+#X symbolatom 22 506 10 0 0 0 - - -;
+#X msg 22 484 symbol f\$1o;
+#X msg 127 462 1 2 3;
+#X obj 178 529 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 204 527 so this doesn't match;
+#X obj 127 506 route 123;
+#X text 209 505 [route] expects a float \,;
+#X text 169 484 <- this will always output a symbol-atom;
+#X obj 20 323 pddp/pddplink ../2.control.examples/10.more.messages.pd
+-text doc/2.control.examples/10.more.messages.pd;
+#X obj 127 529 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 19 266 pddp/pddplink ../2.control.examples/14.dollarsigns.pd
+-text doc/2.control.examples/14.dollarsigns.pd;
+#X obj 19 251 pddp/pddplink ../2.control.examples/13.locality.pd -text
+doc/2.control.examples/13.locality.pd;
+#X text 20 343 Also see help for message box:;
+#X msg 205 344 right-click me;
+#X text 7 368 Dollsym Atom Expansion;
+#X text 7 228 In object boxes and iemGUIs;
+#X text 20 37 Dollarsign atoms are variables \, used when the actual
+value will be filled in somewhere else. They have two separate behaviors:
+one in object boxes \, and the other in message boxes. In both cases
+\, there are two types of dollarsign variables:;
+#X text 7 1 Variable atoms \, aka Dollarsign Atoms or Dollarsign Variables
+;
+#X msg 127 484 \$1\$2\$3;
+#X text 20 107 1) dollar atoms- a dollar sign followed by an integer:
+"\$1" \, "\$2" \, and so on. These variables can expand to become float
+\, symbol \, or pointer atoms.;
+#X text 20 152 2) dollsym atoms- a dollar atom followed and/or preceded
+by a symbol atom \, with no whitespace in between. Examples are "\$1-something"
+\, "\$2.blah" \, and "pd-\$1-foo". They always expand to symbol atoms.
+;
+#X text 20 403 You can create a dollsym atom that consists only of
+dollar atoms ganged together with no white space in between. Just remember
+that the result will always be a symbol-atom-- even if each dollar
+atom is substituted with a float.;
+#X connect 5 0 7 0;
+#X connect 7 0 6 0;
+#X connect 8 0 24 0;
+#X connect 11 0 15 0;
+#X connect 11 1 9 0;
+#X connect 24 0 11 0;
+#X restore 43 120 pd Variable_atoms;
+#X text 42 162 Atoms are used to build messages in Pd. For more details
+on messages \, see the following:;
+#X obj 43 191 pddp/pddplink all_about_messages.pd;
+#X text 163 120 also see:;
+#X obj 223 120 pddp/pddplink all_about_dollarsign_zero.pd;
+#X obj 1 216 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS needs_work;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42. Some info was pulled from puredata.info;
+#X text 12 45 DESCRIPTION overview of Pd atoms;
+#X restore 392 218 pd META;
+#N canvas 14 133 428 105 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Atoms- Related Objects;
+#X floatatom 22 43 5 0 0 0 - - -;
+#X symbolatom 22 67 10 0 0 0 - - -;
+#X restore 103 218 pd Related_objects;
+#X obj 6 218 pddp/pddplink pddp/help.pd -text help;
+#X text 168 42 <- give some links to the manual;
+#N canvas 7 69 428 185 Custom_atoms 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 External atoms;
+#X text 20 37 External libraries may add atom types-- for example \,
+to support video or graphics \, or to add expressivity to the Pd language
+that would be difficult to achieve using only numbers or symbols.;
+#X text 20 97 The custom atom types may or may not work with Pd's built-in
+objects. Consult the documentation for the particular library for more
+information.;
+#X text 20 147 What else to say here?;
+#X restore 43 145 pd Custom_atoms;
+#X text 163 145 <-- work on this;
diff --git a/doc/pddp/all_about_canvas_properties.pd b/doc/pddp/all_about_canvas_properties.pd
new file mode 100644
index 00000000..b37292be
--- /dev/null
+++ b/doc/pddp/all_about_canvas_properties.pd
@@ -0,0 +1,157 @@
+#N struct xy-units float x float y;
+#N canvas 0 0 448 318 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header canvas_properties
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 296 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS GUI needs_work;
+#X text 12 45 DESCRIPTION settings for the visual appearance of a Pd
+canvas;
+#X restore 392 298 pd META;
+#N canvas 10 196 428 114 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Canvas Properties- Related Objects;
+#X obj 33 76 pddp/pddplink ../3.audio.examples/A05.output.subpatch.pd
+;
+#X text 33 45 The [output~] object used throughout the audio tutorials
+is a "gop" enabled abstraction. See:;
+#X restore 103 298 pd Related_objects;
+#X obj 6 298 pddp/pddplink pddp/help.pd -text help;
+#X text 21 37 You can access canvas properties by right-clicking on
+an empty area of a canvas and choosing "Properties". (You can also
+right-click on the object box of a subcanvas.);
+#X text 21 78 Most of the settings only make sense for subwindows \,
+but you can change them for a root canvas as well (for instance \,
+if you want to use it later as an abstraction).;
+#X text 21 197 hide object name and arguments: self-explanatory;
+#X text 21 252 X and Y size: width and height of the gop canvas;
+#X text 21 268 X and Y margins: which part of the gop canvas is shown
+;
+#X text 21 129 X units per pixel: scale data structures drawings;
+#X text 21 144 Y units per pixel:;
+#N canvas 12 79 428 253 gop 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Some examples of graph on parent (gop) subpatches;
+#N canvas 0 0 414 354 gop_subpatch 0;
+#X floatatom 105 126 5 0 0 1 count - -;
+#X obj 105 104 inlet;
+#X obj 105 171 + 1;
+#X msg 170 145 set \$1;
+#X obj 105 228 outlet;
+#X text 25 15 Here's the inside. Notice that wires \, object boxes
+\, and (unfortunately) message boxes don't show up on the parent patch.
+;
+#X obj 242 68 inlet;
+#X msg 242 95 set 0;
+#X text 24 257 The red box shows which area of this subpatch will be
+visible on the parent canvas. Use the x/y "size" and "margin" settings
+in the canvas properties menu to specify which portion of the subpatch
+will be visible. You can also check the box for "hide object name and
+arguments" (which can be useful for making GUI abstractions).;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 2 0 4 0;
+#X connect 3 0 0 0;
+#X connect 6 0 7 0;
+#X connect 7 0 0 0;
+#X coords 0 -1 1 1 120 65 1 100 100;
+#X restore 28 143 pd gop_subpatch;
+#X obj 28 118 bng 15 250 50 0 empty empty step 17 7 0 10 -4034 -1 -1
+;
+#X obj 28 218 print;
+#X obj 141 118 bng 15 250 50 0 empty empty reset 17 7 0 10 -232576
+-1 -1;
+#X text 154 165 <- right-click inside the rectangle;
+#X text 174 180 and choose "Open" to see the "innards"...;
+#X text 25 27 "Graph on parent" lets you see (and use) GUI objects
+that are inside a subpatch. Simply check the box next to "graph on
+parent" in the canvas properties menu to enable this feature.;
+#X connect 2 0 4 0;
+#X connect 3 0 2 0;
+#X connect 5 0 2 1;
+#X restore 332 184 pd gop;
+#X text 21 223 X range & Y range: for garrays and data structures;
+#N canvas 12 79 428 376 xy-range 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 X and Y Range;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-array 10 float 3;
+#A 0 1.25716 0.514292 0.814295 1.27144 1.44287 1.57145 1.35716 1.18573
+0.55715 1.28573;
+#X coords 0 1 10 -1 200 140 1;
+#X restore 102 212 graph;
+#X text 24 37 Similar to "Units per pixel" \, but you can use these
+settings to change how an array is displayed in a graph (as well as
+data structures in a "gop"-enabled subpatch).;
+#X text 24 87 For example: the Y-range for the array below is the default
+1 to -1 \, yet many of the values lie above this range. Try changing
+the Y-range to lie between 2 and 0 and you will see an improvement
+in the display of this array.;
+#X restore 332 224 pd xy-range;
+#N canvas 174 40 427 544 units 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 X and Y Units per Pixel;
+#X text 19 357 1) Right-click on an empty portion of this subpatch
+;
+#X floatatom 254 191 5 0 0 2 x #0-x -;
+#X floatatom 293 191 5 0 0 2 y #0-y -;
+#X obj 293 220 t b a;
+#X obj 274 243 set xy-units x y;
+#N canvas 0 0 450 300 xy-units 0;
+#X obj 42 146 filledpolygon 559 0 1 0 0 100 0 100 100 0 100;
+#X obj 42 173 drawnumber x 5 5 0 x=;
+#X obj 42 200 drawnumber y 5 35 0 y=;
+#X obj 234 241 pointer;
+#X obj 234 268 outlet;
+#X obj 42 53 route displace;
+#X obj 42 119 s \$0-x;
+#X obj 135 118 s \$0-y;
+#X msg 42 98 set \$1;
+#X msg 135 98 set \$1;
+#X obj 42 26 struct xy-units float x float y;
+#X obj 42 76 get xy-units x y;
+#X msg 234 214 traverse pd-units \, next;
+#X obj 234 187 loadbang;
+#X connect 3 0 4 0;
+#X connect 5 0 11 0;
+#X connect 8 0 6 0;
+#X connect 9 0 7 0;
+#X connect 10 0 5 0;
+#X connect 11 0 8 0;
+#X connect 11 1 9 0;
+#X connect 12 0 3 0;
+#X connect 13 0 12 0;
+#X restore 337 206 pd xy-units;
+#X scalar xy-units 130 209 \;;
+#X text 19 377 2) In the "Canvas Properties" dialogue \, change the
+values for the x/y units per pixel. For example \, changing x to 2
+and y to -2 will make the square half its original size.;
+#X text 19 427 3) Notice when you scroll the y value with the number
+box above \, the rectangle moves in the opposite direction from the
+mouse. This is because with the number box \, up = higher numbers \,
+while with the canvas coordinates up = lower numbers. To change this
+\, make the y units per pixel "1" instead of "-1" .;
+#X text 19 512 4) That's it \, as far as I can tell...;
+#X text 19 327 The square above is a scalar. You can use the "Units
+per pixel" settings to scale its units in the following ways:;
+#X connect 3 0 6 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 5 1 6 1;
+#X connect 7 0 6 2;
+#X restore 332 134 pd units;
+#X text 21 163 graph on parent (gop): reveal part of a subpatch's content
+;
diff --git a/doc/pddp/all_about_data_types.pd b/doc/pddp/all_about_data_types.pd
index ab1d6406..76f4a4fb 100644
--- a/doc/pddp/all_about_data_types.pd
+++ b/doc/pddp/all_about_data_types.pd
@@ -1,219 +1,52 @@
-#N canvas 30 22 763 615 10;
-#X obj 413 439 route;
-#X floatatom 93 115 5 0 0 1 "float" - -;
-#X symbolatom 184 115 10 0 0 1 "symbol" - -;
-#X obj 96 211 symbol;
-#X symbolatom 96 258 0 0 0 0 - - -;
-#X msg 105 235 word;
-#X msg 96 193 test;
-#X msg 79 171 symbol this;
-#X text 170 170 set type directly;
-#X text 137 235 does not work (check console messages);
-#X floatatom 15 233 5 0 0 0 - - -;
-#X msg 20 212 12;
-#X msg 3 192 float 83;
-#N canvas 770 126 490 340 Related_Objects 0;
-#X obj 32 54 ftos;
-#X obj 68 54 list2symbol;
-#X text 23 22 data type conversion;
-#X obj 155 55 tosymbol;
-#X obj 219 55 fromsymbol;
-#X obj 36 252 lister;
-#X obj 34 98 atoi;
-#X obj 30 138 list2int;
-#X obj 94 137 l2i;
-#X obj 96 163 a2l;
-#X obj 29 164 any2list;
-#X obj 158 138 list2symbol;
-#X obj 158 159 symbol2list;
-#X obj 247 138 l2s;
-#X obj 247 158 s2l;
-#X obj 123 252 list;
-#X restore 427 584 pd Related_Objects;
-#X text 387 225 Many objects cast the data they receive when they output
-it:;
-#X text 506 306 Some objects do not cast the data:;
-#X obj 404 277 trigger anything;
-#X msg 404 252 this is a list without a cast;
-#X obj 404 300 print;
-#X text 390 340 Some objects need to have the data explicitly declared
-in order to handle it. These are mostly symbol handling objects.;
-#X text 390 406 Objects which route data generally can handle explicitly
-or implicitly defined data.;
-#X obj 460 439 trigger;
-#X obj 518 439 niagara;
-#X obj 406 383 select;
-#X obj -5 -2 cnv 15 750 20 empty empty all_about_data_types 20 10 1
-18 -233017 -66577 0;
-#X obj 711 -1 pddp/pddplink http://puredata.info/dev/pddp -text pddp
-;
-#X text -9 291 "anything";
-#X text -9 407 "list";
-#X text -9 393 "float";
-#X text -9 434 "symbol";
-#X text -9 380 "bang";
-#X msg 91 339 anything 1 two three;
-#X msg 242 339 one 2 3;
-#X obj 147 422 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
--1;
-#X obj 151 396 t a b f l p s;
-#X obj 181 423 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
--1;
-#X msg 244 373 list one 2 3;
-#X msg 283 403 1 2 3;
-#X text -3 35 atoms (basic data types):;
-#X text -3 60 The basic data types are known as 'atoms' in Pd. "float"
-and "symbol" atoms have 'atom boxes' for realtime display and control
-from within a patch. "pointer" atoms are used for accessing data stored
-in graphical data structures.;
-#X obj 401 177 int;
-#X obj 409 157 / 5.23;
-#X floatatom 409 129 5 0 0 0 - - -;
-#X floatatom 442 197 5 0 0 0 - - -;
-#X floatatom 401 197 5 0 0 0 - - -;
-#X obj 491 127 tosymbol;
-#X obj 555 128 fromsymbol;
-#X obj 638 127 list2symbol;
-#X obj 642 169 ftos;
-#X obj 597 36 symbol;
-#X obj 560 80 int;
-#X obj 679 36 pointer;
-#X obj 420 80 bang;
-#X obj 458 81 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
--1;
-#X obj 479 36 float;
-#X text 1 527 There a number of objects which are used for storing
-messages \, or casting messages as a specific data type \, sometimes
-converting from one data type to another. The right inlet on these
-objects is stores that value \, which can be later output using a bang.
-;
-#X obj 588 80 lister;
-#X text 520 37 aka;
-#X obj 546 36 f;
-#X obj 450 511 pddp/pddplink all_about_lists_vs_anythings.pd -text
-all_about_lists_vs_anythings;
-#X obj 450 532 pddp/pddplink all_about_symbol_construction.pd -text
-all_about_symbol_construction;
-#X obj 450 553 pddp/pddplink all_about_data_structures.pd -text all_about_data_structures
-;
-#X text 475 81 (aka [bng]);
-#X text 3 304 "anything" allows anything to pass through unchanged.
-It is not a data type tho.;
-#X text -6 143 "symbols" need to be declared explicitly. "floats" do
-not need to be declared explicitly \, but can be:;
-#X text 153 212 casting as a "symbol";
-#X text 1 509 CASTING AND STORAGE OBJECTS;
-#X text 391 467 FOR MORE INFO:;
-#X text 390 107 EXAMPLES OF CASTING;
-#X text 385 36 atom objects:;
-#X text 392 58 other data types:;
-#X text -9 420 "pointer";
-#X obj 24 460 trigger anything bang float list pointer symbol;
-#X obj 24 480 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
--1;
-#X obj 78 480 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
--1;
-#X obj 134 479 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
--1;
-#X obj 191 480 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
--1;
-#X obj 247 479 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
--1;
-#X obj 303 480 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
--1;
-#X text 193 35 "float" \, "symbol" \, "pointer";
-#N canvas 0 22 505 381 float/list 0;
-#X msg 75 133 float 1 2 3;
-#X text 34 22 FLOAT CONVERSION;
-#X msg 95 187 list 1 2 3;
-#X text 92 164 A list with multiple elements remains a list.;
-#X text 43 59 A float with one element remains a float.;
-#X text 72 106 A float with multiple elements remains a float but is
-cut to one element.;
-#X text 99 218 A list with one float element is converted to a float.
-;
-#X obj 58 308 bng 15 250 50 0 empty empty bang 0 20 1 9 -262144 -1
--1;
-#X obj 105 308 bng 15 250 50 0 empty empty float 0 21 1 9 -262144 -1
--1;
-#X obj 152 308 bng 15 250 50 0 empty empty symbol 0 21 1 9 -262144
--1 -1;
-#X obj 200 308 bng 15 250 50 0 empty empty list 0 21 1 9 -262144 -1
--1;
-#X obj 248 308 bng 15 250 50 0 empty empty UNDEFINED 0 21 1 9 -262144
--1 -1;
-#X obj 57 286 route bang float symbol list;
-#X obj 92 349 print FLOAT;
-#X msg 50 81 float 3;
-#X msg 106 239 list 2;
-#X obj 188 349 print LIST;
-#X connect 0 0 12 0;
-#X connect 2 0 12 0;
-#X connect 12 0 7 0;
-#X connect 12 1 8 0;
-#X connect 12 1 13 0;
-#X connect 12 2 9 0;
-#X connect 12 3 10 0;
-#X connect 12 3 16 0;
-#X connect 12 4 11 0;
-#X connect 14 0 12 0;
-#X connect 15 0 12 0;
-#X restore 425 486 pd float/list conversion;
-#N canvas 0 22 479 361 empty 0;
-#X obj 78 268 bng 15 250 50 0 empty empty bang 0 20 1 9 -262144 -1
--1;
-#X obj 125 268 bng 15 250 50 0 empty empty float 0 21 1 9 -262144 -1
--1;
-#X obj 172 268 bng 15 250 50 0 empty empty symbol 0 21 1 9 -262144
--1 -1;
-#X obj 220 268 bng 15 250 50 0 empty empty list 0 21 1 9 -262144 -1
--1;
-#X obj 268 268 bng 15 250 50 0 empty empty UNDEFINED 0 21 1 9 -262144
--1 -1;
-#X msg 127 205 list;
-#X msg 50 75 float;
-#X msg 97 134 symbol;
-#X text 31 21 EMPTY DATA TYPES;
-#X obj 77 246 route bang float symbol list;
-#X obj 73 326 print FLOAT;
-#X obj 155 326 print SYMBOL;
-#X text 120 184 An empty list is converted to a bang;
-#X text 85 114 An empty "symbol" remains a empty "symbol".;
-#X text 46 55 An empty "float" remains a "float" and is initialized
-to 0;
-#X connect 5 0 9 0;
-#X connect 6 0 9 0;
-#X connect 7 0 9 0;
-#X connect 9 0 0 0;
-#X connect 9 1 1 0;
-#X connect 9 1 10 0;
-#X connect 9 2 2 0;
-#X connect 9 2 11 0;
-#X connect 9 3 3 0;
-#X connect 9 4 4 0;
-#X restore 616 486 pd empty data types;
-#X text 548 584 updated for Pd version 0.38.4;
-#X connect 3 0 4 0;
-#X connect 5 0 4 0;
-#X connect 6 0 3 0;
-#X connect 7 0 4 0;
-#X connect 11 0 10 0;
-#X connect 12 0 10 0;
-#X connect 16 0 18 0;
-#X connect 17 0 16 0;
-#X connect 31 0 34 0;
-#X connect 32 0 34 0;
-#X connect 34 0 33 0;
-#X connect 34 3 35 0;
-#X connect 36 0 34 0;
-#X connect 37 0 34 0;
-#X connect 40 0 44 0;
-#X connect 41 0 40 0;
-#X connect 41 0 43 0;
-#X connect 42 0 41 0;
-#X connect 72 0 73 0;
-#X connect 72 1 74 0;
-#X connect 72 2 75 0;
-#X connect 72 3 76 0;
-#X connect 72 4 77 0;
-#X connect 72 5 78 0;
+#N canvas 0 0 448 239 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header data_types 20 10
+1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 43 66 pddp/pddplink all_about_atoms.pd;
+#X obj 1 217 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 NAME;
+#X text 12 45 KEYWORDS;
+#X text 12 65 DESCRIPTION list of help patches related to Pd data types
+;
+#X restore 392 219 pd META;
+#X obj 6 219 pddp/pddplink pddp/help.pd -text help;
+#N canvas 24 124 428 150 Quick_Quiz! 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Messages- Related Objects;
+#X obj 22 99 bng 15 250 50 0 empty empty list 0 25 0 8 -262144 -1 -1
+;
+#X obj 59 99 bng 15 250 50 0 empty empty bang 0 25 0 8 -262144 -1 -1
+;
+#X obj 97 99 bng 15 250 50 0 empty empty float 0 25 0 8 -262144 -1
+-1;
+#X obj 135 99 bng 15 250 50 0 empty empty symbol 0 25 0 8 -262144 -1
+-1;
+#X obj 176 99 bng 15 250 50 0 empty empty pop 0 25 0 8 -262144 -1 -1
+;
+#X obj 211 99 bng 15 250 50 0 empty empty none_of_the_above 0 25 0
+8 -262144 -1 -1;
+#X text 276 42 <- Click to find out;
+#X msg 22 43 pop quiz: What type of message is this?;
+#X obj 22 70 route list bang float symbol pop;
+#X connect 9 0 10 0;
+#X connect 10 0 2 0;
+#X connect 10 1 3 0;
+#X connect 10 2 4 0;
+#X connect 10 3 5 0;
+#X connect 10 4 6 0;
+#X connect 10 5 7 0;
+#X restore 103 219 pd Quick_Quiz!;
+#X text 42 36 See:;
+#X obj 43 86 pddp/pddplink all_about_messages.pd;
+#X obj 43 106 pddp/pddplink all_about_message_conversion.pd;
+#X obj 43 126 pddp/pddplink all_about_atom_conversion.pd;
+#X obj 43 146 pddp/pddplink all_about_symbol_construction.pd;
diff --git a/doc/pddp/all_about_dollarsign_zero.pd b/doc/pddp/all_about_dollarsign_zero.pd
new file mode 100644
index 00000000..5a6c6acc
--- /dev/null
+++ b/doc/pddp/all_about_dollarsign_zero.pd
@@ -0,0 +1,57 @@
+#N canvas 0 0 448 462 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header dollarsign_zero
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X text 20 36 \$0 is a special variable that is guaranteed to be unique
+to each abstraction.;
+#X obj 43 89 float \$0;
+#X obj 43 69 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X floatatom 43 111 5 0 0 0 - - -;
+#X obj 43 343 s \$0-local-variable-ex;
+#X obj 196 321 r \$0-local-variable-ex;
+#X floatatom 43 321 5 0 0 0 - - -;
+#X floatatom 196 343 5 0 0 0 - - -;
+#X text 20 136 It can be used to make local variables in Pd. To test
+it:;
+#X obj 38 182 pddp/pddplink all_about_dollarsign_zero.pd;
+#X text 20 156 1) Open another instance of this help patch and move
+it next to this one so both are visible.;
+#X text 20 206 2) Compare the two send/receive pairs below:;
+#X text 39 227 -- Normal (global) send/receive pair --;
+#X text 39 301 -- Local send/receive pair --;
+#X floatatom 43 249 5 0 0 0 - - -;
+#X floatatom 196 271 5 0 0 0 - - -;
+#X obj 43 271 s normal-variable-ex;
+#X obj 196 249 r normal-variable-ex;
+#X text 35 377 see also: Manual 2.6.5;
+#X obj 1 440 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 25 KEYWORDS;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 DESCRIPTION how to use \$0 to simulate locality in Pd
+;
+#X restore 392 442 pd META;
+#N canvas 11 306 428 145 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 \$0- Related Objects;
+#X obj 20 38 pddp/helplink ggee/sendlocal;
+#X obj 20 58 pddp/helplink ggee/receivelocal;
+#X restore 103 442 pd Related_objects;
+#X obj 6 442 pddp/pddplink pddp/help.pd -text help;
+#X obj 35 392 pddp/pddplink ../2.control.examples/13.locality.pd -text
+doc/2.control.examples/13.locality.pd;
+#X obj 35 407 pddp/pddplink all_about_scope_and_locality.pd;
+#X connect 3 0 5 0;
+#X connect 4 0 3 0;
+#X connect 7 0 9 0;
+#X connect 8 0 6 0;
+#X connect 16 0 18 0;
+#X connect 19 0 17 0;
diff --git a/doc/pddp/all_about_expr_and_value.pd b/doc/pddp/all_about_expr_and_value.pd
new file mode 100644
index 00000000..87aa406c
--- /dev/null
+++ b/doc/pddp/all_about_expr_and_value.pd
@@ -0,0 +1,50 @@
+#N canvas 0 0 448 350 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header expr_and_value 20
+10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 176 268 v _\$0_foo;
+#X obj 24 268 expr $f1 + _\$0_foo;
+#X floatatom 24 246 5 0 0 0 - - -;
+#X floatatom 24 291 5 0 0 0 - - -;
+#X floatatom 176 248 5 0 0 0 - - -;
+#X floatatom 206 108 5 0 0 0 - - -;
+#X floatatom 23 108 5 0 0 0 - - -;
+#X floatatom 23 158 5 0 0 0 - - -;
+#X text 248 106 set variable "some_number";
+#X obj 206 131 value some_number;
+#X obj 23 131 expr $f1 + some_number;
+#X text 20 36 Access to variables within [expr] \, [expr~] \, and [fexpr~]
+is possible using the [value] object. These aren't the special dollarsign
+variables like $f3- rather \, they are global symbolic variables that
+aren't the names of functions or operators like some_number \, below:
+;
+#X text 21 184 Using Pd's dollar sign variables is tricky-- for example
+\, \$0-foo is interpretated as "\$0 minus foo". Additionally \, \$0
+cannot be at the beginning of the variable name (e.g. \, \$0foo). Underscores
+provide a workable \, if clunky \, solution:;
+#X obj 1 328 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 45 KEYWORDS nonlocal;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 NAME expr expr~ fexpr~ value;
+#X text 12 65 DESCRIPTION a touching tale of an unlikely romance between
+two Pd objects;
+#X restore 392 330 pd META;
+#N canvas 10 196 428 141 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 [expr] and [value]- Related Objects;
+#X restore 103 330 pd Related_objects;
+#X obj 6 330 pddp/pddplink pddp/help.pd -text help;
+#X connect 3 0 5 0;
+#X connect 4 0 3 0;
+#X connect 6 0 2 0;
+#X connect 7 0 11 0;
+#X connect 8 0 12 0;
+#X connect 12 0 9 0;
diff --git a/doc/pddp/all_about_expr_functions.pd b/doc/pddp/all_about_expr_functions.pd
new file mode 100644
index 00000000..d9b8e6bb
--- /dev/null
+++ b/doc/pddp/all_about_expr_functions.pd
@@ -0,0 +1,503 @@
+#N canvas 0 0 448 545 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header expr_operators_and_functions
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X floatatom 140 881 5 0 0 0 - - -;
+#X floatatom 188 880 5 0 0 0 - - -;
+#X obj 140 901 v a;
+#X obj 188 901 v b;
+#X obj 36 794 expr max(a \, b);
+#X obj 22 774 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 795 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 711 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 732 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 753 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X floatatom 36 880 0 0 0 0 - - -;
+#X obj 22 990 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 1010 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1030 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1050 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1070 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1090 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1110 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1130 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1150 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 816 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 1171 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 837 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 858 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X floatatom 36 1200 0 0 0 0 - - -;
+#X obj 36 773 expr min(a \, b);
+#X obj 36 710 expr int(a);
+#X obj 36 731 expr rint(a);
+#X obj 36 752 expr float(a);
+#X obj 36 1129 expr tanh(a);
+#X obj 36 1149 expr fact(a);
+#X obj 36 815 expr abs(a);
+#X obj 36 857 expr modf(a);
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array expr_array 11 float 3;
+#A 0 -0.707106 0 0.707106 1 0.707108 2.65359e-006 -0.707104 -1 -0.70711
+-5.30718e-006 0.707103;
+#X coords 0 1 11 -1 80 60 1;
+#X restore 22 1757 graph;
+#X obj 22 1844 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1864 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1884 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1904 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1924 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1944 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X floatatom 36 1971 0 0 0 0 - - -;
+#X text 185 1842 size of an array;
+#X text 24 1620 * Bug: floor and ceiling must take two values to initialize
+properly. You can just put a zero as the second value.;
+#X text 9 1171 *;
+#X text 9 837 *;
+#X text 185 1861 sum of all elements in an array;
+#X text 206 1903 average of all elements;
+#X text 138 772 minimum;
+#X text 138 793 maximum;
+#X text 138 709 convert to integer;
+#X text 138 730 round a float to a nearby integer;
+#X text 138 751 convert to float;
+#X text 4 753 **;
+#X text 24 1646 ** Bug: float(a) converts a to an integer;
+#X text 149 1127 hyperbolic tangent;
+#X text 149 1147 factorial;
+#X text 127 835 get signed integer value from floating point number
+;
+#X floatatom 120 504 5 0 0 0 - - -;
+#X floatatom 168 503 5 0 0 0 - - -;
+#X obj 120 524 v a;
+#X obj 168 524 v b;
+#X floatatom 36 503 0 0 0 0 - - -;
+#X text 117 123 One's complement;
+#X text 117 143 Multiply;
+#X text 117 183 Modulo;
+#X text 117 203 Add;
+#X text 117 223 Subtract;
+#X text 117 243 Shift Left;
+#X text 117 263 Shift Right;
+#X text 117 283 Less than (boolean);
+#X text 117 303 Less than or equal (boolean);
+#X text 117 323 Greater than (boolean);
+#X text 117 343 Greater than or equal (boolean);
+#X text 117 363 Equal (boolean);
+#X text 117 383 Not equal (boolean);
+#X text 117 403 Bitwise And;
+#X text 117 423 Exclusive Or;
+#X text 117 443 Bitwise Or;
+#X text 117 463 Logical And (boolean);
+#X text 117 483 Logical Or (boolean);
+#X text 117 163 Divide (division by zero detected);
+#X text 138 815 absolute value;
+#X obj 22 613 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 36 612 expr if(a \, b \, c);
+#X floatatom 238 880 5 0 0 0 - - -;
+#X obj 238 901 v c;
+#X text 147 637 (See expr-if subpatch for more details);
+#X text 117 855 get signed fractional value from floating point number
+;
+#X floatatom 152 1201 5 0 0 0 - - -;
+#X floatatom 200 1200 5 0 0 0 - - -;
+#X obj 152 1221 v a;
+#X obj 200 1221 v b;
+#X obj 22 664 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 36 663 expr random(a \, b);
+#X obj 36 989 expr pow(a \, b);
+#X text 149 987 raise a to the power of b;
+#X obj 36 1009 expr sqrt(a);
+#X text 149 1007 square root;
+#X obj 36 1029 expr exp(a);
+#X text 149 1027 e raised to the power of a;
+#X obj 36 1049 expr ln(a);
+#X text 149 1047 natural log;
+#X obj 36 1069 expr log(a);
+#X text 149 1067 natural log (same as above);
+#X obj 36 1089 expr log10(a);
+#X text 149 1087 log base 10;
+#X obj 36 1109 expr fact(a);
+#X text 149 1107 factorial;
+#X obj 36 1170 expr ldexp(a);
+#X obj 22 1310 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1330 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1350 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1370 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1390 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1410 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1430 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1450 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1470 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1491 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X floatatom 36 1575 0 0 0 0 - - -;
+#X text 9 1511 *;
+#X floatatom 152 1575 5 0 0 0 - - -;
+#X floatatom 200 1574 5 0 0 0 - - -;
+#X obj 152 1595 v a;
+#X obj 200 1595 v b;
+#X obj 36 1309 expr sin(a);
+#X text 149 1307 sine;
+#X obj 36 1329 expr cos(a);
+#X text 149 1327 cosine;
+#X obj 36 1349 expr tan(a);
+#X text 149 1347 tangent;
+#X obj 36 1369 expr asin(a);
+#X text 149 1367 arc sine;
+#X obj 36 1389 expr acos(a);
+#X text 149 1387 arc cosine;
+#X obj 36 1409 expr atan(a);
+#X text 149 1407 arc tangent;
+#X obj 36 1429 expr atan2(a \, b);
+#X text 149 1427 arc tangent of 2 variables;
+#X obj 36 1449 expr sinh(a);
+#X text 149 1447 hyperbolic sine;
+#X obj 36 1469 expr cosh(a);
+#X text 149 1467 hyperbolic cosine;
+#X obj 22 1512 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1532 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1552 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 36 1490 expr tanh(a);
+#X text 149 1487 hyperbolic tangent;
+#X obj 36 1511 expr floor(a \, 0);
+#X text 149 1509 largest integral value not greater than argument;
+#X obj 36 1531 expr ceil(a \, 0);
+#X text 149 1529 smallest integral value not less than argument;
+#X text 149 1549 floating-point remainder function;
+#X obj 36 1551 expr fmod(a \, b);
+#X text 9 1531 *;
+#X obj 22 144 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 164 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 184 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 204 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 224 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 244 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 264 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 284 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 304 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 324 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 344 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 364 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 384 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 404 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 424 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 36 143 expr a * b;
+#X obj 36 163 expr a / b;
+#X obj 36 183 expr a % b;
+#X obj 36 203 expr a + b;
+#X obj 36 223 expr a - b;
+#X obj 36 243 expr a << b;
+#X obj 36 263 expr a >> b;
+#X obj 36 283 expr a < b;
+#X obj 36 303 expr a <= b;
+#X obj 36 323 expr a > b;
+#X obj 36 343 expr a >= b;
+#X obj 36 363 expr a == b;
+#X obj 36 383 expr a != b;
+#X obj 36 403 expr a & b;
+#X obj 36 423 expr a ^ b;
+#X obj 22 444 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 36 443 expr a | b;
+#X obj 22 464 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 36 463 expr a && b;
+#X obj 22 484 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 36 483 expr a || b;
+#X obj 22 124 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 36 123 expr a ~ b;
+#X obj 36 836 expr imodf(a);
+#X floatatom 131 1971 5 0 0 0 - - -;
+#X floatatom 179 1970 5 0 0 0 - - -;
+#X obj 131 1991 v a;
+#X obj 179 1991 v b;
+#X text 18 2277 cbrt(a);
+#X text 18 2297 erf(a);
+#X text 18 2317 erfc(a);
+#X text 18 2357 loglp(a);
+#X text 18 2377 isinf(a);
+#X text 18 2397 finite(a);
+#X text 18 2417 isnan(a);
+#X text 18 2457 drem(a);
+#X text 18 2477 asinh(a);
+#X text 18 2497 acosh(a);
+#X text 18 2517 atanh(a);
+#X text 98 2277 cube root;
+#X text 98 2297 error function;
+#X text 98 2317 complementary error function;
+#X text 18 2337 expm1(a);
+#X text 98 2337 exponential minus 1;
+#X text 98 2357 logarithm of 1 plus;
+#X text 98 2377 is the value infinite;
+#X text 98 2397 is the value finite;
+#X text 98 2417 is the value not a number;
+#X text 98 2437 copy the sign of a number;
+#X text 98 2457 floating-point remainder function;
+#X text 98 2477 inverse hyperbolic sine;
+#X text 98 2497 inverse hyperbolic cosine;
+#X text 98 2517 inverse hyperbolic tangent;
+#X obj 36 1843 expr size("expr_array");
+#X text 242 524 ***Scroll Down for more***;
+#X obj 1 572 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -261106 -33289 0;
+#X obj 1 949 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -261106 -33289 0;
+#X obj 1 1269 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -261106 -33289 0;
+#X text 7 1269 Trigonometric Functions;
+#X text 7 949 Power Functions;
+#X text 7 572 General Purpose Functions;
+#X obj 1 1705 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -261106 -33289 0;
+#X text 7 1705 Array/Table Functions;
+#X obj 1 2241 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -261106 -33289 0;
+#X text 7 2241 Functions Not Available in Windows;
+#X text 148 612 conditional \; if (condition \, ifTrue-expr \, ifFalse-expr)
+;
+#X text 147 663 random number between a and b. The value will;
+#X text 148 676 be less than the upper boundary and greater;
+#X text 148 688 than or equal to the lower boundary.;
+#X text 149 1180 power of 2;
+#X text 149 1167 multiply floating-point number by integral;
+#X text 217 1882 sum of an array within boundaries;
+#X text 219 1922 average of elements within boundaries;
+#X text 239 1942 store a value in an array;
+#X text 239 1955 ("array_name" \, index \, value);
+#X text 19 2032 Note: the quotation marks inside the parentheses are
+also required when using a variable \, like "$s2". When using array/table
+names like "array-name" or "\$0-table" \, use a variable-- otherwise
+the dash and the \$0 will get interpreted as an operator and a value
+\, respectively.;
+#X obj 35 2131 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X floatatom 35 2195 5 0 0 0 - - -;
+#X obj 35 2150 symbol \$0-expr-array;
+#X obj 35 2172 expr size("$s1");
+#X obj 36 1863 expr sum("expr_array");
+#X text 19 2096 For a table name like "\$0-array2" \, send the array
+name as a message:;
+#X text 239 1981 than the size of the table \,;
+#X text 239 1968 If the index is greater;
+#X text 240 1994 a modulo the size of the;
+#X text 240 2007 table is made.;
+#X text 109 1790 Note: The array name in [expr] must be in quotes;
+#X text 146 1803 when using these functions.;
+#X text 109 1816 (even when for a variable like "$s2");
+#X obj 36 1883 expr Sum("expr_array" \, 6 \, 0);
+#X obj 36 1903 expr avg("expr_array");
+#X obj 36 1923 expr Avg("expr_array" \, 1 \, 3);
+#X obj 36 1943 expr store("expr_array" \, 0 \, 3);
+#X text 254 2439 ***;
+#X text 17 2540 *** bug: copysign is spelled "copysig" in the source
+;
+#X text 18 2437 copysign(a);
+#X obj 1 82 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -261106 -33289 0;
+#X text 19 37 The following operators and functions are available as
+arguments to the [expr] \, [expr~] \, and [fexpr~] objects.;
+#X text 7 82 Operators (from highest to lowest precedence);
+#X obj 1 2568 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 45 KEYWORDS;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 NAME expr expr~ fexpr~;
+#X text 12 65 DESCRIPTION complete list of functions and operators
+for expr family objects;
+#X restore 392 2570 pd META;
+#N canvas 10 380 428 140 Related_objects 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 6 1 [expr] Functions and Operators- Related Objects;
+#X restore 103 2570 pd Related_objects;
+#X obj 6 2570 pddp/pddplink pddp/help.pd -text help;
+#X connect 2 0 4 0;
+#X connect 3 0 5 0;
+#X connect 6 0 12 0;
+#X connect 7 0 27 0;
+#X connect 8 0 6 0;
+#X connect 9 0 28 0;
+#X connect 10 0 29 0;
+#X connect 11 0 30 0;
+#X connect 13 0 96 0;
+#X connect 14 0 98 0;
+#X connect 15 0 100 0;
+#X connect 16 0 102 0;
+#X connect 17 0 104 0;
+#X connect 18 0 106 0;
+#X connect 19 0 108 0;
+#X connect 20 0 31 0;
+#X connect 21 0 32 0;
+#X connect 22 0 33 0;
+#X connect 23 0 110 0;
+#X connect 24 0 195 0;
+#X connect 25 0 34 0;
+#X connect 27 0 12 0;
+#X connect 28 0 12 0;
+#X connect 29 0 12 0;
+#X connect 30 0 12 0;
+#X connect 31 0 26 0;
+#X connect 32 0 26 0;
+#X connect 33 0 12 0;
+#X connect 34 0 12 0;
+#X connect 36 0 225 0;
+#X connect 37 0 252 0;
+#X connect 38 0 261 0;
+#X connect 39 0 262 0;
+#X connect 40 0 263 0;
+#X connect 41 0 264 0;
+#X connect 59 0 61 0;
+#X connect 60 0 62 0;
+#X connect 84 0 85 0;
+#X connect 85 0 12 0;
+#X connect 86 0 87 0;
+#X connect 90 0 92 0;
+#X connect 91 0 93 0;
+#X connect 94 0 95 0;
+#X connect 96 0 26 0;
+#X connect 98 0 26 0;
+#X connect 100 0 26 0;
+#X connect 102 0 26 0;
+#X connect 104 0 26 0;
+#X connect 106 0 26 0;
+#X connect 108 0 26 0;
+#X connect 110 0 26 0;
+#X connect 111 0 127 0;
+#X connect 112 0 129 0;
+#X connect 113 0 131 0;
+#X connect 114 0 133 0;
+#X connect 115 0 135 0;
+#X connect 116 0 137 0;
+#X connect 117 0 139 0;
+#X connect 118 0 141 0;
+#X connect 119 0 143 0;
+#X connect 120 0 148 0;
+#X connect 123 0 125 0;
+#X connect 124 0 126 0;
+#X connect 127 0 121 0;
+#X connect 129 0 121 0;
+#X connect 131 0 121 0;
+#X connect 133 0 121 0;
+#X connect 135 0 121 0;
+#X connect 137 0 121 0;
+#X connect 139 0 121 0;
+#X connect 141 0 121 0;
+#X connect 143 0 121 0;
+#X connect 145 0 150 0;
+#X connect 146 0 152 0;
+#X connect 147 0 155 0;
+#X connect 148 0 121 0;
+#X connect 150 0 121 0;
+#X connect 152 0 121 0;
+#X connect 155 0 121 0;
+#X connect 157 0 172 0;
+#X connect 158 0 173 0;
+#X connect 159 0 174 0;
+#X connect 160 0 175 0;
+#X connect 161 0 176 0;
+#X connect 162 0 177 0;
+#X connect 163 0 178 0;
+#X connect 164 0 179 0;
+#X connect 165 0 180 0;
+#X connect 166 0 181 0;
+#X connect 167 0 182 0;
+#X connect 168 0 183 0;
+#X connect 169 0 184 0;
+#X connect 170 0 185 0;
+#X connect 171 0 186 0;
+#X connect 172 0 63 0;
+#X connect 173 0 63 0;
+#X connect 174 0 63 0;
+#X connect 175 0 63 0;
+#X connect 176 0 63 0;
+#X connect 177 0 63 0;
+#X connect 178 0 63 0;
+#X connect 179 0 63 0;
+#X connect 180 0 63 0;
+#X connect 181 0 63 0;
+#X connect 182 0 63 0;
+#X connect 183 0 63 0;
+#X connect 184 0 63 0;
+#X connect 185 0 63 0;
+#X connect 186 0 63 0;
+#X connect 187 0 188 0;
+#X connect 188 0 63 0;
+#X connect 189 0 190 0;
+#X connect 190 0 63 0;
+#X connect 191 0 192 0;
+#X connect 192 0 63 0;
+#X connect 193 0 194 0;
+#X connect 194 0 63 0;
+#X connect 195 0 12 0;
+#X connect 196 0 198 0;
+#X connect 197 0 199 0;
+#X connect 225 0 42 0;
+#X connect 248 0 250 0;
+#X connect 250 0 251 0;
+#X connect 251 0 249 0;
+#X connect 252 0 42 0;
+#X connect 261 0 42 0;
+#X connect 262 0 42 0;
+#X connect 263 0 42 0;
+#X connect 264 0 42 0;
diff --git a/doc/pddp/all_about_expr_if.pd b/doc/pddp/all_about_expr_if.pd
new file mode 100644
index 00000000..b1cd36c6
--- /dev/null
+++ b/doc/pddp/all_about_expr_if.pd
@@ -0,0 +1,64 @@
+#N canvas 0 0 448 500 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header expr_if 20 10 1
+18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X floatatom 23 315 5 0 0 0 - - -;
+#X floatatom 23 266 5 0 0 0 - - -;
+#X obj 374 374 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+10;
+#X floatatom 23 441 5 0 0 0 - - -;
+#X floatatom 23 376 5 0 0 0 - - -;
+#X obj 83 441 print;
+#X floatatom 374 353 5 0 0 0 - - -;
+#X obj 23 400 expr if($f2 != 0 \, if($f1 % 13 != 0 \, random($f1 -
+$f2 * 0.5 \, $f1 + $f2 * 0.5) \, $f1) \, $f1 % 60);
+#X text 20 93 b) an expression to evaluate if the condition is true
+\, and;
+#X text 20 78 a) the condition \,;
+#X text 20 37 The [expr] \, [expr~] \, and [fexpr~] objects allow you
+to build a conditional statement using the "expr if" syntax. It is
+made up of three parts \, enclosed in parentheses:;
+#X text 20 126 Each part is separated by a comma.;
+#X text 20 108 c) an expression to evaluate if the condition is false.
+;
+#X text 20 239 c) if the condition is false \, the number 20 is output.
+;
+#X text 20 340 You can nest other functions within the if function
+\, including the if function itself.;
+#X text 20 157 By scrolling the number box below you can see the [expr
+if] function in action. When a number is received at the inlet:;
+#X text 20 189 a) the condition "$f1 < 20" checks if the input is less
+than twenty.;
+#X text 20 219 b) if true \, the value is subtracted from twenty and
+output.;
+#X obj 1 478 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 45 KEYWORDS;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 NAME expr expr~ fexpr~;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 DESCRIPTION an explanation of the "if" function from
+sly and the expr family stone;
+#X restore 392 480 pd META;
+#N canvas 9 355 428 136 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 [expr] if- Related Objects;
+#X obj 22 42 moses;
+#X obj 72 42 select;
+#X obj 132 42 spigot;
+#X restore 103 480 pd Related_objects;
+#X obj 6 480 pddp/pddplink pddp/help.pd -text help;
+#X obj 23 290 expr if($f1 < 50 \, 50-$f1 \, 50);
+#X connect 3 0 24 0;
+#X connect 4 0 9 1;
+#X connect 6 0 9 0;
+#X connect 8 0 4 0;
+#X connect 9 0 5 0;
+#X connect 9 0 7 0;
+#X connect 24 0 2 0;
diff --git a/doc/pddp/all_about_expr_multiline.pd b/doc/pddp/all_about_expr_multiline.pd
new file mode 100644
index 00000000..310e8b88
--- /dev/null
+++ b/doc/pddp/all_about_expr_multiline.pd
@@ -0,0 +1,44 @@
+#N canvas 0 0 448 282 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header expr_multiline 20
+10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X floatatom 23 196 5 0 0 0 - - -;
+#X floatatom 102 196 5 0 0 0 - - -;
+#X floatatom 23 93 5 0 0 0 - - -;
+#X floatatom 181 196 0 0 0 0 - - -;
+#X floatatom 260 196 5 0 0 0 - - -;
+#X obj 23 119 expr $f1 \; $f1 * 2 \; pow($f1 \, 2) \; if($f1%128 <
+64 \, $f1%128 \, 128 - $f1%128);
+#X text 260 227 back down;
+#X text 259 213 count to 64 \, then;
+#X text 20 37 A semicolon can be used to enter multiple expressions
+in [expr] \, [expr~] \, and [fexpr~]. For each new statement \, an
+extra outlet is added to the object.;
+#X text 273 174 semicolon;
+#X text 272 165 doesn't require a;
+#X text 272 155 the last statement;
+#X obj 1 260 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 KEYWORDS conversion;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 NAME expr fexpr~ expr~;
+#X text 12 65 DESCRIPTION Like to enter multiple expressions inside
+expr? You can if you want \, and this patch tells you how...;
+#X restore 392 262 pd META;
+#N canvas 10 196 428 129 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 [expr] Multiline- Related Objects;
+#X restore 103 262 pd Related_objects;
+#X obj 6 262 pddp/pddplink pddp/help.pd -text help;
+#X connect 4 0 7 0;
+#X connect 7 0 2 0;
+#X connect 7 1 3 0;
+#X connect 7 2 5 0;
+#X connect 7 3 6 0;
diff --git a/doc/pddp/all_about_externals.pd b/doc/pddp/all_about_externals.pd
new file mode 100644
index 00000000..db1f2381
--- /dev/null
+++ b/doc/pddp/all_about_externals.pd
@@ -0,0 +1,34 @@
+#N canvas 0 0 448 395 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header externals 20 10
+1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 373 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 DESCRIPTION notions of scope in Pd;
+#X text 12 25 KEYWORDS needs_work;
+#X restore 392 375 pd META;
+#N canvas 11 243 428 121 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Externals - Related Objects;
+#X restore 103 375 pd Related_objects;
+#X obj 6 375 pddp/pddplink pddp/help.pd -text help;
+#X text 20 36 Externals are objects that can be used in addition to
+the core Pd objects \, or vanilla objects. Externals can be created
+with other programming languages like C \, C++ \, or Python \, as well
+as being programmed directly in Pd.;
+#X obj 59 347 pddp/pddplink all_about_libraries.pd;
+#N canvas 16 214 428 369 Subpatch 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Subpatch;
+#X text 18 23 Subpatch;
+#X restore 23 164 pd Subpatch;
+#X text 20 116 This help file is unfinished;
diff --git a/doc/pddp/all_about_haptics.pd b/doc/pddp/all_about_haptics.pd
index 080378a1..386211c7 100644
--- a/doc/pddp/all_about_haptics.pd
+++ b/doc/pddp/all_about_haptics.pd
@@ -1,41 +1,61 @@
-#N canvas 147 26 511 606 10;
-#X obj 12 346 ff-gain;
-#X obj 12 385 ff-autocenter;
-#X obj 12 425 ff-spring;
-#X obj 12 465 ff-friction;
-#X obj 13 506 ff-periodic;
-#X obj 13 547 ff-constant;
-#X obj 4 4 cnv 15 500 20 empty empty all_about_haptics 20 10 1 18 -233017
--66577 0;
-#X obj 471 5 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+#N canvas 0 0 448 374 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header haptics 20 10 1
+18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
;
-#X obj 12 304 ifeel;
-#X text 20 33 "Haptic" means relating to the sense of touch. Haptic
+#X obj 1 352 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS needs_work;
+#X text 12 45 DESCRIPTION definition of haptics;
+#X restore 392 354 pd META;
+#N canvas 10 196 428 359 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Haptic Objects in Pd;
+#X text 72 58 Control the pulses and vibrations of a TouchSense (aka
+iFeel) mouse;
+#X text 24 114 Set the overall gain for all force effects;
+#X text 24 153 Apply forces to automatically center the controller
+;
+#X text 24 193 Apply a spring force in a specified direction;
+#X text 24 233 Apply friction to the movement of the controller. Also
+known as damping.;
+#X text 25 280 Periodic effects are forces controlled by waveforms
+of various shape \, strength \, and frequency;
+#X text 25 329 Apply a constant force in a specified direction;
+#X obj 10 33 pddp/pddplink all_about_externals.pd -text _________;
+#X obj 10 33 pddp/pddplink all_about_externals.pd -text Externals;
+#X obj 10 58 pddp/helplink hcs/ifeel;
+#X obj 10 94 pddp/helplink flatspace/ff-gain;
+#X obj 10 134 pddp/helplink flatspace/ff-autocenter;
+#X obj 10 174 pddp/helplink flatspace/ff-spring;
+#X obj 10 214 pddp/helplink flatspace/ff-friction;
+#X obj 10 264 pddp/helplink flatspace/ff-periodic;
+#X obj 10 314 pddp/helplink flatspace/ff-constant;
+#X restore 103 354 pd Related_objects;
+#X obj 6 354 pddp/pddplink pddp/help.pd -text help;
+#X text 19 37 "Haptic" means relating to the sense of touch. Haptic
feedback relates to the sense of touch at the skin level \, and the
feeling of forces in the muscles and joints. Vibrations stimulate the
sense of touch while various forces stimulate the muscles.;
-#X text 20 110 There are many haptic devices available \, from a US\$35
+#X text 19 106 There are many haptic devices available \, from a US\$35
Logitech iFeel mouse \, to the massive \, extremely expensive haptic
devices used for remote control surgery. Immersion \, Inc. has almost
a monopoly on this technology due to a number of patents. These objects
all work with Immersion technology \, generally known as "TouchSense".
;
-#X text 15 576 updated for Pd version 0.37.1;
-#X text 107 301 Control the pulses and vibrations of a TouchSense (aka
-iFeel) mouse;
-#X text 110 349 Set the overall gain for all force effects;
-#X text 111 385 Apply forces to automatically center the controller
-;
-#X text 111 427 Apply a spring force in a specified direction;
-#X text 111 460 Apply friction to the movement of the controller. Also
-known as damping.;
-#X text 111 502 Periodic effects are forces controlled by waveforms
-of various shape \, strength \, and frequency;
-#X text 112 547 Apply a constant force in a specified direction;
-#X text 21 199 Numerous companies produce haptic game controllers:
+#X text 19 188 Numerous companies produce haptic game controllers:
mice \, joysticks \, gamepads \, steering wheels. These objects work
with game controllers. Belkin \, Logitech \, Microsoft \, Saitek \,
and others make TouchSense game controllers.;
-#X text 21 261 Currently \, these objects only work on GNU/Linux. For
+#X text 19 245 Currently \, these objects only work on GNU/Linux. For
info on how to get it working \, see: http://at.or.at/hans/haptics
;
+#X text 19 295 See also:;
+#X obj 19 315 pddp/pddplink all_about_hid.pd;
diff --git a/doc/pddp/all_about_help_patches.pd b/doc/pddp/all_about_help_patches.pd
new file mode 100644
index 00000000..24043c3c
--- /dev/null
+++ b/doc/pddp/all_about_help_patches.pd
@@ -0,0 +1,255 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#X obj 0 168 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 507 26 494 597 META 0;
+#X text 12 185 RELEASE_VERSION 0.41.4;
+#X text 158 186 Keywords:;
+#X text 12 25 KEYWORDS needs_work (mention how pd finds help files)
+;
+#X text 12 5 GENRE help;
+#X text 12 65 DESCRIPTION using help patches in Pure Data;
+#X text 117 201 control- control rate objects \; signal- audiorate
+objects \; data_structure- objects for creating and managing data structures
+\; nonlocal- objects that can make nonlocal connections to other objects
+(i.e. \, communicate with other objects without using wires) \; storage-
+objects whose main function is to store a value \; array- objects for
+creating and editing arrays \; GUI- objects that provide a graphical
+user interface \; MIDI- objects that provide MIDI functionality \;
+time- objects that measure time or which the user can use to manipulate
+time \; unfinished- help patches under construction \; orphan- help
+patches that can't get accessed by right clicking on the corresponding
+object (like [drawsymbol]) \; block-oriented- see Matju's definition
+\; analysis- object that does analysis \; conversion- convert from
+one set of units to another \; filter \; network \; trigonometry \;
+soundfile- object that can play \, manipulate \, and/or save a sound
+file (wav \, ogg \, mp3 \, etc.). \; random- object outputs a random
+value \, list \, or signal \; symbol_ops- object that manipulates or
+stores a symbol \; list_ops- object that manipulates or stores a list
+\; canvas_ops- object whose behavior only makes sense in terms of a
+canvas \; patchfile_ops- object whose behavior only makes sense in
+terms of a patchfile;
+#X restore 500 597 pd META;
+#X obj 0 390 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 427 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 503 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 78 483 428 109 Related_objects 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 6 1 Related Objects;
+#X obj 19 57 pddp/helplink pddp/pddplink;
+#X obj 19 83 pddp/helplink pddp/helplink;
+#X obj 21 33 pddp/pddplink all_about_externals.pd -text _________;
+#X obj 21 33 pddp/pddplink all_about_externals.pd -text Externals;
+#X restore 101 597 pd Related_objects;
+#X obj 78 177 cnv 17 3 42 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 399 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 298 cnv 17 3 35 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#N canvas 59 268 450 300 common_terminology 0;
+#X text 13 30 console - the main Pd window that includes the printout
+area;
+#X text 13 50 subwindow -;
+#X text 13 70 subpatch -;
+#X text 13 90 abstraction -;
+#X text 13 110 index -;
+#X text 13 180 editmode -;
+#X text 13 200 truncate -;
+#X text 13 220 argument;
+#X text 13 240 creation argument - see "argument";
+#X text 13 130 wire - aka connection \, patch cord \, line;
+#X restore 101 552 pd common_terminology;
+#X obj 78 344 cnv 17 3 35 empty \$0-pddp.cnv.let.r r 5 9 0 16 -228856
+-162280 0;
+#N canvas 117 160 428 384 More_about_creation_arguments 0;
+#X obj 110 143 float 6.5;
+#X obj 110 118 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X floatatom 110 175 5 0 0 0 - - -;
+#X obj 260 143 symbol foo;
+#X obj 260 118 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X symbolatom 260 175 10 0 0 0 - - -;
+#X text 40 143 Examples:;
+#X obj 22 292 delwrite~ help-delay 500;
+#X obj 0 210 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -204280 -1 0;
+#X text 7 211 Creation Argument Numbers;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 More About Creation Arguments;
+#X text 20 332 Arguments: 1 symbol atom "help-delay";
+#X text 86 347 2 float "500";
+#X text 19 246 For most objects in Pd \, the zeroth argument is the
+class name (i.e. \, the name of the object itself) \, so it isn't written
+explicitly.;
+#X text 80 317 (0 symbol atom "delwrite~");
+#X text 19 37 Creation arguments initialize an object's behavior. They
+can be numbers or symbols. Some objects \, like [route] \, can take
+an arbitrary number of arguments. In the example below \, the arguments
+"6.5" and "foo" specify initial values for [float] and [symbol] objects
+\, respectively.;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 3 0 5 0;
+#X connect 4 0 3 0;
+#X restore 101 527 pd More_about_creation_arguments;
+#N canvas 70 265 428 280 Message_types 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 Message types;
+#X text 19 108 float;
+#X text 19 128 list;
+#X text 69 108 - floating point number;
+#X text 19 78 bang;
+#X text 19 199 symbol;
+#X text 19 179 pointer;
+#X text 19 218 signal;
+#X text 19 35 anything;
+#X text 69 218 - audio signal;
+#X text 69 179 - the so-called "gpointer" (used with data-structures)
+;
+#X text 69 78 - the single selector "bang". Usually it is used to trigger
+the object to perform an action.;
+#X text 69 128 - message with the "list" selector plus two or more
+elements. Also includes implicit lists-- messages made up of two or
+more atoms in which the first atom is a float atom.;
+#X text 69 199 - selector "symbol" \, followed by a symbol atom;
+#X text 69 35 - any message (including messages with custom selectors)
+;
+#N canvas 95 140 428 253 about_custom_selectors 0;
+#X msg 24 90 set 20;
+#X msg 24 117 clear;
+#X text 111 61 Documented as:;
+#X text 19 61 Message:;
+#X text 112 90 "set" message or "set";
+#X text 111 117 "clear" message or "clear";
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -33289 0;
+#X msg 168 162 set 20;
+#X floatatom 131 196 5 0 0 0 - - -;
+#X obj 131 215 print OUTPUT;
+#X floatatom 131 164 5 0 0 0 - - -;
+#X text 19 37 Many objects accept custom messages like:;
+#X text 7 1 [help] Messages with Custom Selectors;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 10 0 8 0;
+#X restore 84 56 pd about_custom_selectors;
+#X text 19 238 (inactive);
+#X text 79 238 - some objects like [noise~] will draw an inlet that
+accepts no messages. These xlets are labeled (inactive).;
+#X restore 101 202 pd Message_types;
+#X text 98 507 mention how pd finds help files;
+#X text 98 176 message type;
+#X text 178 176 - description of behavior;
+#X msg 151 125 42;
+#X floatatom 151 147 5 0 0 0 - - -;
+#X text 180 125 <-- Click the message box;
+#X obj 455 51 pddp/dsp-reminder;
+#X obj -1 0 cnv 15 552 40 empty \$0-pddp.cnv.header help_patches 3
+12 0 18 -204280 -1 0;
+#X text 11 23 using help patches in Pure Data;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/help -text
+pdpedia: help;
+#X obj 426 119 cnv 15 122 44 empty empty empty 20 12 0 10 -191407 -1
+0;
+#X obj 423 116 cnv 15 122 44 empty empty empty 20 12 0 10 -1 -1 0;
+#X obj 424 117 cnv 15 120 42 empty empty empty 20 12 0 10 -261106 -1
+0;
+#X text 426 140 that produce sound.;
+#X text 426 128 appears in patches;
+#X text 426 117 The reminder above;
+#X obj 120 301 cnv 15 352 31 empty empty empty 20 12 0 10 -191407 -1
+0;
+#X obj 117 298 cnv 15 352 31 empty empty empty 20 12 0 10 -1 -1 0;
+#X obj 118 299 cnv 15 350 29 empty empty empty 20 12 0 10 -261106 -1
+0;
+#X obj 78 229 cnv 17 3 57 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 120 347 cnv 15 352 31 empty empty empty 20 12 0 10 -191407 -1
+0;
+#X obj 117 344 cnv 15 352 31 empty empty empty 20 12 0 10 -1 -1 0;
+#X obj 118 345 cnv 15 350 29 empty empty empty 20 12 0 10 -261106 -1
+0;
+#X text 120 346 Some objects have a final \, rightmost inlet that has
+a specific behavior. This is identified by the letter "r".;
+#X obj 120 231 cnv 15 355 54 empty empty empty 20 12 0 10 -191407 -1
+0;
+#X obj 117 228 cnv 15 355 54 empty empty empty 20 12 0 10 -1 -1 0;
+#X obj 118 229 cnv 15 353 52 empty empty empty 20 12 0 10 -261106 -1
+0;
+#X obj 44 64 cnv 15 356 55 empty empty empty 20 12 0 10 -191407 -1
+0;
+#X obj 41 61 cnv 15 356 55 empty empty empty 20 12 0 10 -1 -1 0;
+#X obj 42 62 cnv 15 354 53 empty empty empty 20 12 0 10 -261106 -1
+0;
+#X text 44 62 Help patches start with a short example that demonstrates
+the object being used. Most are interactive \, like the one below.
+Help patches are read-only by default \, so you can't accidentally
+overwrite anything in them.;
+#X text 98 398 message type;
+#X text 178 398 - description of behavior;
+#X obj 269 4 cnv 15 172 33 empty 411-cnv65 empty 20 12 0 10 -191407
+-1 0;
+#X obj 265 0 cnv 15 172 33 empty 411-cnv66 empty 20 12 0 10 -1 -1 0
+;
+#X obj 266 1 cnv 15 170 31 empty 411-cnv67 empty 20 12 0 10 -261106
+-1 0;
+#X text 268 12 it's shown at the right -->;
+#X text 269 1 If the object has an alias;
+#X obj 454 4 trigger;
+#X obj 523 4 t;
+#X text 502 4 or;
+#X text 80 445 1) atom type;
+#X text 167 445 - description of behavior;
+#X obj 336 439 cnv 15 198 53 empty empty empty 20 12 0 10 -191407 -1
+0;
+#X obj 333 436 cnv 15 198 53 empty empty empty 20 12 0 10 -1 -1 0;
+#X obj 334 437 cnv 15 196 51 empty empty empty 20 12 0 10 -261106 -1
+0;
+#X text 337 448 after the object name to define;
+#X text 337 470 initialize its value(s).;
+#X text 337 437 Many objects accept arguments;
+#N canvas 71 285 428 178 Argument_types 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 Argument types;
+#X text 19 35 float;
+#X text 89 35 - a float atom;
+#X text 19 55 symbol atom;
+#X text 89 55 - symbol atom;
+#X text 19 75 comma;
+#X text 19 95 semicolon;
+#X text 19 125 Note: dollar atoms ("\$1") and dollsym atoms ("\$1-foo")
+are automatically expanded by Pd. They therefore may be used in any
+object box.;
+#X text 89 75 - comma atom (used in objects like [expr] \, msg box)
+;
+#X text 89 95 - semicolon atom (also used in [expr] \, msg box);
+#X restore 101 467 pd Argument_types;
+#X obj 336 525 cnv 15 169 55 empty empty empty 20 12 0 10 -191407 -1
+0;
+#X obj 333 522 cnv 15 169 55 empty empty empty 20 12 0 10 -1 -1 0;
+#X obj 334 523 cnv 15 167 53 empty empty empty 20 12 0 10 -261106 -1
+0;
+#X text 336 534 as well as links to;
+#X text 336 546 tutorials or other help;
+#X text 336 557 patches \, may be found here.;
+#X text 336 523 Important object behavior \,;
+#X text 121 229 Inlet numbers are listed \, starting from zero and
+in left-to-right order. The same goes for the outlets. Additional information
+may sometimes appear in a subpatch \, like the one above-- click it
+with the mouse to open it.;
+#X obj 99 572 pddp/pddplink all_about_messages.pd;
+#X obj 5 597 pddp/pddplink help.pd -text help;
+#X text 337 459 the object's behavior or to;
+#X text 120 300 "n" means there is a variable number of inlets \, the
+exact number of which is determined by creation argument(s).;
+#X connect 17 0 18 0;
diff --git a/doc/pddp/all_about_hid.pd b/doc/pddp/all_about_hid.pd
index 6bfab2e2..570e53e8 100644
--- a/doc/pddp/all_about_hid.pd
+++ b/doc/pddp/all_about_hid.pd
@@ -1,8 +1,4 @@
-#N canvas 21 40 773 566 10;
-#X obj 5 2 cnv 15 750 20 empty empty all_about_hid 20 10 1 18 -233017
--66577 0;
-#X obj 725 3 pddp/pddplink http://puredata.info/dev/pddp -text pddp
-;
+#N canvas 0 26 773 596 10;
#X text 5 29 "HID" stands for "Human Interface Device". A HID is any
device that is meant to allow humans to interact with a computer. Usually
\, HIDs are mice \, keyboards \, joysticks \, tablets \, gamepads \,
@@ -91,7 +87,7 @@ The PHANTOM 6DOF device has six degrees of freedom: X \, Y \, Z movement
#X text 715 261 100;
#X text 385 275 PS/2 mice;
#X text 385 289 Serial mice;
-#X text 375 23 LATENCY AND POLLING;
+#X text 375 25 LATENCY AND POLLING;
#X text 375 156 REFRESH RATES OF VARIOUS DEVICES;
#X text 11 369 Basically any device that is supported by the various
HID layers on each OS is supported by the [hid] object. So any of those
@@ -123,3 +119,28 @@ to the 'printing' characters. [keyname] reports Shift \, Ctrl \, Alt
#X text 692 160 refresh rate;
#X text 12 527 [linuxhid];
#X obj 11 347 hid;
+#X obj 1 1 cnv 15 770 20 empty \$0-pddp.cnv.header hid 20 10 1 18 -261106
+-33289 0;
+#X obj 737 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 566 cnv 15 770 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS needs_work;
+#X text 12 45 DESCRIPTION definition of haptics;
+#X restore 722 568 pd META;
+#N canvas 151 430 428 155 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 hid - Related Objects;
+#X obj 19 38 key;
+#X obj 19 69 keyname;
+#X obj 19 99 keyup;
+#X restore 303 568 pd Related_objects;
+#X obj 6 568 pddp/pddplink pddp/help.pd -text help;
+#X obj 209 332 linuxhid;
diff --git a/doc/pddp/all_about_libraries.pd b/doc/pddp/all_about_libraries.pd
new file mode 100644
index 00000000..baef9fac
--- /dev/null
+++ b/doc/pddp/all_about_libraries.pd
@@ -0,0 +1,49 @@
+#N canvas 0 0 448 238 10;
+#X declare;
+#X declare;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header libraries 20 10
+1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 216 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 KEYWORDS needs_work;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42. Some info was pulled from puredata.info;
+#X text 12 65 DESCRIPTION how pure data libraries are loaded;
+#X text 12 25 NAME;
+#X restore 392 218 pd META;
+#N canvas 14 133 428 105 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Libraries - Related Objects;
+#X obj 22 42 declare;
+#X obj 22 72 import;
+#X restore 103 218 pd Related_objects;
+#X obj 6 218 pddp/pddplink pddp/help.pd -text help;
+#X text 20 37 Explain what libraries are \, how to load them \, and
+any missing features that are currently being worked on.;
+#N canvas 14 48 428 166 How_to_load_libraries 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 How to load libraries;
+#X text 19 36 Ways to load libraries: command line \, declare \, import
+\, any others?;
+#X restore 43 81 pd How_to_load_libraries;
+#N canvas 9 155 428 240 What_happens_when_you_load_a_library 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 What happens when you load a library?;
+#X text 19 37 Describe what happens \, and maybe give one or two examples...
+;
+#X restore 43 111 pd What_happens_when_you_load_a_library;
+#N canvas 7 69 428 112 Loading_libs_in_an_abstraction 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Loading libs in an abstraction;
+#X text 20 37 Info here...;
+#X restore 43 141 pd Loading_libs_in_an_abstraction;
diff --git a/doc/pddp/all_about_lists_vs_anythings.pd b/doc/pddp/all_about_lists_vs_anythings.pd
index 0579c050..d81f8e48 100644
--- a/doc/pddp/all_about_lists_vs_anythings.pd
+++ b/doc/pddp/all_about_lists_vs_anythings.pd
@@ -1,74 +1,75 @@
-#N canvas 63 22 763 581 10;
-#X msg 95 298 1 2 3;
-#X obj 125 329 route list;
-#X msg 62 278 list 1 2 3;
-#X msg 10 63 list;
-#X symbolatom 32 129 10 0 0 0 - - -;
+#N canvas 0 0 448 568 10;
+#N canvas 0 0 878 658 old 0;
+#X msg 95 368 1 2 3;
+#X obj 125 399 route list;
+#X msg 62 348 list 1 2 3;
+#X msg 10 93 list;
+#X symbolatom 32 159 10 0 0 0 - - -;
#X obj 4 2 cnv 15 750 20 empty empty all_about_lists_vs_anythings 20
10 1 18 -233017 -66577 0;
-#X text 7 39 SPECIAL CASES OF "LISTS".;
-#X obj 125 348 bng 15 250 50 0 empty empty list -20 7 1 10 -262144
+#X text 7 69 SPECIAL CASES OF "LISTS".;
+#X obj 125 418 bng 15 250 50 0 empty empty list -20 7 1 10 -262144
-1 -1;
-#X obj 189 349 bng 15 250 50 0 empty empty non-list 19 7 1 10 -262144
+#X obj 189 419 bng 15 250 50 0 empty empty non-list 19 7 1 10 -262144
-1 -1;
-#X msg 184 277 list this is a set with a cast;
-#X msg 191 296 this is a set withOUT a cast;
-#X obj 441 135 bng 15 250 50 0 empty empty bang 0 20 1 9 -262144 -1
+#X msg 184 347 list this is a set with a cast;
+#X msg 191 366 this is a set withOUT a cast;
+#X obj 441 195 bng 15 250 50 0 empty empty bang 0 20 1 9 -262144 -1
-1;
-#X obj 490 135 bng 15 250 50 0 empty empty float 0 21 1 9 -262144 -1
+#X obj 490 195 bng 15 250 50 0 empty empty float 0 21 1 9 -262144 -1
-1;
-#X obj 539 135 bng 15 250 50 0 empty empty symbol 0 21 1 9 -262144
+#X obj 539 195 bng 15 250 50 0 empty empty symbol 0 21 1 9 -262144
-1 -1;
-#X msg 443 73 list this is a set with a cast;
-#X msg 450 92 this is a set withOUT a cast;
-#X obj 638 135 bng 15 250 50 0 empty empty list 0 21 1 9 -262144 -1
+#X msg 443 133 list this is a set with a cast;
+#X msg 450 152 this is a set withOUT a cast;
+#X obj 638 195 bng 15 250 50 0 empty empty list 0 21 1 9 -262144 -1
-1;
-#X obj 120 527 route list;
-#X obj 120 546 bng 15 250 50 0 empty empty list -20 7 1 10 -262144
+#X obj 120 617 route list;
+#X obj 120 636 bng 15 250 50 0 empty empty list -20 7 1 10 -262144
-1 -1;
-#X obj 184 547 bng 15 250 50 0 empty empty non-list 19 7 1 10 -262144
+#X obj 184 637 bng 15 250 50 0 empty empty non-list 19 7 1 10 -262144
-1 -1;
-#X msg 189 491 one 2 three 4 five;
-#X msg 40 491 1 two 3 four 5;
-#X text 8 198 IMPLICIT LISTS;
-#X msg 40 471 list 1 two 3 four 5;
-#X msg 189 471 list one 2 three 4 five;
-#X msg 17 83 list 25;
-#X msg 24 103 list foo;
-#X text 87 104 A "list" of one "symbol" is converted to a "symbol"
+#X msg 189 581 one 2 three 4 five;
+#X msg 40 581 1 two 3 four 5;
+#X text 8 268 IMPLICIT LISTS;
+#X msg 40 561 list 1 two 3 four 5;
+#X msg 189 561 list one 2 three 4 five;
+#X msg 17 113 list 25;
+#X msg 24 133 list foo;
+#X text 87 134 A "list" of one "symbol" is converted to a "symbol"
;
-#X text 72 83 A "list" of one "float" is converted to a "float";
-#X text 50 63 An empty "list" is converted to a "bang";
-#X obj 477 514 pddp/pddplink all_about_atom_conversion.pd -text all_about_atom_conversion
+#X text 72 113 A "list" of one "float" is converted to a "float";
+#X text 50 93 An empty "list" is converted to a "bang";
+#X obj 477 594 pddp/pddplink all_about_atom_conversion.pd -text all_about_atom_conversion
;
#X obj 721 3 pddp/pddplink http://puredata.info/dev/pddp -text pddp
;
-#X text 11 400 Sets of mixed atoms are defined based on what the "selector"
+#X text 11 490 Sets of mixed atoms are defined based on what the "selector"
(the first element of a set). If the "selector" is a "float" \, then
the set is a "list". If the "selector" is the word "list" \, then the
set is a "list". If the "selector" is a "symbol" \, then the set is
NOT a "list":;
-#X text 600 551 updated for Pd 0.38-2;
-#X obj 688 135 bng 15 250 50 0 empty empty UNDEFINED 0 21 1 9 -262144
+#X text 570 631 updated for Pd 0.38-2;
+#X obj 688 195 bng 15 250 50 0 empty empty UNDEFINED 0 21 1 9 -262144
-1 -1;
-#X msg 459 286 1 1;
-#X obj 452 312 +;
-#X floatatom 452 334 5 0 0 0 - - -;
-#X msg 424 286 1 3;
-#X text 416 46 A set that is not a "list" has an undefined type:;
-#X msg 451 267 list 1 2;
-#X text 402 208 If you send a "list" of arguments to the first inlet
+#X msg 459 356 1 1;
+#X obj 452 382 +;
+#X floatatom 452 404 5 0 0 0 - - -;
+#X msg 424 356 1 3;
+#X text 416 106 A set that is not a "list" has an undefined type:;
+#X msg 451 337 list 1 2;
+#X text 402 278 If you send a "list" of arguments to the first inlet
of an object \, the elements of that "list" will be applied to the
respective inlet. This does not apply to sets that are NOT "lists".
;
-#X text 400 192 "LISTS" MAP TO INLETS;
-#X text 407 367 WORKING WITH MIXED SETS;
-#X text 11 381 SETS OF MIXED "ATOMS";
-#X text 9 218 A message having more than one atom starting with a "float"
+#X text 400 262 "LISTS" MAP TO INLETS;
+#X text 407 457 WORKING WITH MIXED SETS;
+#X text 11 471 SETS OF MIXED "ATOMS";
+#X text 9 288 A message having more than one atom starting with a "float"
is implicitly considered a list. A message having more than one atom
starting with a "symbol" is not \, unless that "symbol" is the selector
"list".;
-#N canvas 183 32 857 475 has 0;
+#N canvas 30 68 857 475 has 0;
#X obj 96 162 print;
#X msg 57 93 list one two three;
#X msg 42 54 1 2 3;
@@ -195,26 +196,32 @@ symbol] outputs a symbol from its left outlet.;
#X connect 53 0 54 0;
#X connect 54 0 48 0;
#X connect 54 1 49 0;
-#X restore 443 453 pd has some odd cases of list handling;
-#X text 407 389 When working with sets that might be either "lists"
+#X restore 443 543 pd has some odd cases of list handling;
+#X text 407 479 When working with sets that might be either "lists"
or undefined \, use [prepend]. Many of the "list" handling objects
in Pd have odd quirks which can make things difficult.;
-#X obj 441 115 route bang float symbol pointer list;
-#X obj 589 135 bng 15 250 50 0 empty empty pointer 0 21 1 9 -262144
+#X obj 441 175 route bang float symbol pointer list;
+#X obj 589 195 bng 15 250 50 0 empty empty pointer 0 21 1 9 -262144
-1 -1;
-#X obj 11 169 bng 15 250 50 0 empty empty bang 0 20 1 9 -262144 -1
+#X obj 11 199 bng 15 250 50 0 empty empty bang 0 20 1 9 -262144 -1
-1;
-#X obj 60 169 bng 15 250 50 0 empty empty float 0 21 1 9 -262144 -1
+#X obj 60 199 bng 15 250 50 0 empty empty float 0 21 1 9 -262144 -1
-1;
-#X obj 109 169 bng 15 250 50 0 empty empty symbol 0 21 1 9 -262144
+#X obj 109 199 bng 15 250 50 0 empty empty symbol 0 21 1 9 -262144
-1 -1;
-#X obj 208 169 bng 15 250 50 0 empty empty list 0 21 1 9 -262144 -1
+#X obj 208 199 bng 15 250 50 0 empty empty list 0 21 1 9 -262144 -1
-1;
-#X obj 258 169 bng 15 250 50 0 empty empty UNDEFINED 0 21 1 9 -262144
+#X obj 258 199 bng 15 250 50 0 empty empty UNDEFINED 0 21 1 9 -262144
-1 -1;
-#X obj 11 149 route bang float symbol pointer list;
-#X obj 159 169 bng 15 250 50 0 empty empty pointer 0 21 1 9 -262144
+#X obj 11 179 route bang float symbol pointer list;
+#X obj 159 199 bng 15 250 50 0 empty empty pointer 0 21 1 9 -262144
-1 -1;
+#X text 39 53 (this has nothing to do with lists vs. anythings);
+#X text 419 243 (this has nothing to do with lists vs. anythings);
+#X text 413 79 (this is misleading-- the anything below would match
+selector "this");
+#X text 424 440 (mention list trim here);
+#X text 16 455 (this is an anything \, which is never defined);
#X connect 0 0 1 0;
#X connect 1 0 7 0;
#X connect 1 1 8 0;
@@ -249,3 +256,92 @@ in Pd have odd quirks which can make things difficult.;
#X connect 55 3 56 0;
#X connect 55 4 53 0;
#X connect 55 5 54 0;
+#X restore 368 202 pd old;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header lists_vs_anythings
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 546 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 115 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 95 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 KEYWORDS needs_work;
+#X text 12 25 NAME list;
+#X text 12 65 DESCRIPTION definitions for list and anything in the
+context of Pd;
+#X restore 392 548 pd META;
+#X obj 6 548 pddp/pddplink pddp/help.pd -text help;
+#X obj 40 92 pddp/pddplink all_about_atoms.pd;
+#X obj 40 107 pddp/pddplink all_about_messages.pd;
+#X text 40 249 Anythings;
+#X text 40 182 Examples:;
+#X text 60 202 list one two three;
+#X text 60 217 0 1 60;
+#X text 60 232 list foo 121 bar;
+#X text 40 35 If you are familiar with messages in Pd then the difference
+between a list and an "anything" will be easy to understand. If not
+\, have a look at the following help patches:;
+#X text 199 201 move to all_about_route? ->;
+#X text 40 142 A list message consists of either a) the selector "list"
+followed by two or more atoms \, or b) a multi-element message beginning
+with a number ("implicit list").;
+#X text 40 269 1) The term "anything" in Pd generally means "any message"--
+to be specific \, any message in Pd that has a valid selector (or is
+an implicit float or list message). This includes the built-in message
+types float \, symbol \, list \, bang \, and pointer \, as well as
+custom messages like "set 87" \, print \, debug \, "receive972 a b
+d 3" \, etc.;
+#X text 40 349 2) The term "anything" is also used to mean messages
+with selectors other than those of Pd's built-in message types-- i.e
+\, "anything else." This use probably arises because there is not a
+name for the set of messages consisting of one or more atoms that aren't
+float \, symbol \, list \, pointer \, nor bang messages. (The word
+"meta-message" is synonymous with this meaning.);
+#N canvas 14 370 428 105 Fine_print 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Lists vs. Anythings - A few more details;
+#X text 22 43 What about messages with custom atoms? Are these included
+in "anything"?;
+#X restore 243 253 pd Fine_print;
+#X text 39 448 * (archaic) To confuse matters even more \, many externals
+were made before there was a built-in "list" message in Pd. Some external
+objects' help patches may refer to all messages that are not a symbol
+\, float \, pointer \, or bang as a "list.";
+#X text 40 127 Lists *;
+#N canvas 15 248 428 305 Related_objects_and_Quick_Quiz 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Lists vs. Anythings - Related Objects;
+#X obj 22 43 list;
+#X msg 77 43;
+#X obj 1 71 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -261106 -33289 0;
+#X text 7 72 Quick Quiz!;
+#X msg 35 105 list one two three;
+#X msg 65 156 one two three;
+#X msg 75 183 symbol one_two_three;
+#X msg 55 129 1 2 3;
+#X obj 35 215 route list symbol one;
+#X obj 153 242 bng 15 500 50 0 empty empty one 0 24 1 12 -262144 -1
+-1;
+#X obj 86 242 bng 15 500 50 0 empty empty symbol 0 24 1 12 -262144
+-1 -1;
+#X obj 35 242 bng 15 500 50 0 empty empty list 0 24 1 12 -262144 -1
+-1;
+#X obj 201 242 bng 15 500 50 0 empty empty None_of_the_above 0 24 1
+12 -262144 -1 -1;
+#X connect 6 0 10 0;
+#X connect 7 0 10 0;
+#X connect 8 0 10 0;
+#X connect 9 0 10 0;
+#X connect 10 0 13 0;
+#X connect 10 1 12 0;
+#X connect 10 2 11 0;
+#X connect 10 3 14 0;
+#X restore 103 548 pd Related_objects_and_Quick_Quiz;
+#X obj 40 517 pddp/pddplink all_about_message_conversion.pd;
diff --git a/doc/pddp/all_about_looping.pd b/doc/pddp/all_about_looping.pd
index 99b76d4a..c3ac569a 100644
--- a/doc/pddp/all_about_looping.pd
+++ b/doc/pddp/all_about_looping.pd
@@ -1,41 +1,113 @@
-#N canvas 35 22 757 548 10;
-#X text 440 49 looping objects:;
-#X obj 442 71 until;
-#X obj 500 71 loop;
-#X obj 417 474 susloop~;
-#X obj 486 474 loop~;
-#X text 414 453 for looping samples:;
-#X obj 0 2 cnv 15 750 20 empty empty all_about_looping 20 10 1 18 -233017
--66577 0;
-#X obj 716 3 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+#N canvas 0 0 448 570 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header looping 20 10 1
+18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
;
-#X obj 441 97 counter;
-#X obj 499 97 gem_counter;
-#X obj 584 97 cxc.counter;
-#X obj 422 521 pdp_loop;
-#X obj 493 521 pdp_qtloop~;
-#X obj 531 474 loopsampler;
-#X obj 675 96 for++;
-#X obj 82 167 +;
-#X floatatom 111 170 5 0 0 0 - - -;
-#X msg 81 138 1;
-#X obj 161 186 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+#X text 20 37 Programming with Pd is a different way of thinking than
+standard procedural or object-oriented programming. Looping illustrates
+this.;
+#X text 21 102 a) a chain of several object connect together;
+#X text 21 118 b) a wire (or nonlocal connection) from the outlet of
+an object at the end of the chain that goes to the inlet of an earlier
+object in the chain.;
+#X text 21 156 c) a condition to continue the loop \, and a condition
+that stops the loop. (Otherwise this is an infinite loop!);
+#N canvas 14 48 428 513 Recursive_vs_Iterative_Loops 0;
+#X obj 1 1 cnv 15 425 20 empty empty empty 20 10 1 18 -233017 -66577
+0;
+#X text 7 1 Recursive vs. Iterative Loops;
+#X obj 102 161 f;
+#X obj 102 115 t b b;
+#X obj 129 137 0;
+#X obj 129 254 print;
+#X obj 152 161 + 1;
+#X obj 102 187 t a a;
+#X obj 102 209 moses 100;
+#X obj 102 95 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X text 19 36 Recursive loops are [define it] \, while iterative loops
+are [define it];
+#X text 19 68 Below is an example of a recursive loop in Pd.;
+#X obj 59 353 t b b;
+#X obj 86 375 0;
+#X obj 59 476 print;
+#X obj 59 449 moses 100;
+#X obj 59 328 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X text 19 288 Here are two iterative loops \, both using [until] to
+perform the same task as above.;
+#X obj 59 399 until;
+#X obj 59 425 f;
+#X obj 93 425 + 1;
+#X obj 127 399 b;
+#X obj 59 169 b;
+#X obj 102 231 t a a;
+#X msg 229 328 100;
+#X obj 229 350 t a b;
+#X obj 276 373 0;
+#X obj 229 400 f;
+#X obj 259 400 + 1;
+#X obj 229 373 until;
+#X obj 229 427 print;
+#X text 157 353 or...;
+#X connect 2 0 7 0;
+#X connect 3 0 2 0;
+#X connect 3 1 4 0;
+#X connect 4 0 2 1;
+#X connect 6 0 2 1;
+#X connect 7 0 8 0;
+#X connect 7 1 6 0;
+#X connect 8 0 23 0;
+#X connect 9 0 3 0;
+#X connect 12 0 18 0;
+#X connect 12 1 13 0;
+#X connect 13 0 19 1;
+#X connect 15 0 14 0;
+#X connect 15 1 21 0;
+#X connect 16 0 12 0;
+#X connect 18 0 19 0;
+#X connect 19 0 15 0;
+#X connect 19 0 20 0;
+#X connect 20 0 19 1;
+#X connect 21 0 18 1;
+#X connect 22 0 2 0;
+#X connect 23 0 22 0;
+#X connect 23 1 5 0;
+#X connect 24 0 25 0;
+#X connect 25 0 29 0;
+#X connect 25 1 26 0;
+#X connect 26 0 27 1;
+#X connect 27 0 28 0;
+#X connect 27 0 30 0;
+#X connect 28 0 27 1;
+#X connect 29 0 27 0;
+#X restore 23 237 pd Recursive_vs_Iterative_Loops;
+#X text 21 82 A recursive loop in Pd consists of the following:;
+#X text 21 196 Additionally \, there are several Pd objects that can
+be used to create iterative loops.;
+#N canvas 22 133 428 498 A_more_complex_recursive_loop 0;
+#X obj 1 1 cnv 15 425 20 empty empty empty 20 10 1 18 -233017 -66577
+0;
+#X text 7 1 A more complex recursive loop;
+#X obj 91 123 +;
+#X floatatom 130 123 5 0 0 0 - - -;
+#X msg 91 94 1;
+#X obj 170 146 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
-#X msg 120 138 0;
-#X obj 82 209 t f f;
-#X text 206 302 X;
-#X text 68 306 Y;
-#X obj 52 289 t b f;
+#X msg 130 94 0;
+#X obj 91 169 t f f;
+#X text 189 255 X;
+#X text 99 256 Y;
+#X obj 61 249 t b f;
#N canvas 0 22 450 300 (subpatch) 0;
#X array \$0-array 100 float 1;
-#A 0 0 0.946674 0.967388 0.983095 0.993714 0.999191 0.999497 0.99463
-0.984615 0.969505 0.949378 0.924337 0.894513 0.860059 0.821154 0.778
-0.730819 0.679856 0.625375 0.567657 0.507002 0.443722 0.378147 0.310614
-0.241474 0.171084 0.0998083 0.0280163 0.000796274 0.000796274 0.000796274
-0.000796274 0.000796274 0.000796274 0.000796274 0.000796274 0.000796274
-0.000796274 0.000796274 0.000796274 0.000796274 0.000796274 0.000796274
-0.000796274 0.000796274 0.000796274 0.000796274 0.000796274 0.000796274
-0.000796274 0.000796274 0.000796274 0.000796274 0.000796274 0.000796274
+#A 0 0 0.935458 0.948449 0.960016 0.970142 0.978811 0.98601 0.991728
+0.995956 0.998689 0.999923 0.999654 0.997884 0.994616 0.989854 0.983606
+0.97588 0.966689 0.956046 0.943968 0.930471 0.915578 0.899309 0.88169
+0.862747 0.842508 0.821004 0.798267 0.774331 0.749233 0.723009 0.695699
+0.667345 0.637988 0.607673 0.576446 0.544353 0.511443 0.477764 0.443368
+0.408306 0.372631 0.336397 0.299657 0.262467 0.224883 0.186962 0.148759
+0.110333 0.0717417 0.0330423 0.000796274 0.000796274 0.000796274 0.000796274
0.000796274 0.000796274 0.000796274 0.000796274 0.000796274 0.000796274
0.000796274 0.000796274 0.000796274 0.000796274 0.000796274 0.000796274
0.000796274 0.000796274 0.000796274 0.000796274 0.000796274 0.000796274
@@ -45,74 +117,113 @@
0.000796274 0.000796274 0.000796274 0.000796274 0.000796274 0.000796274
0.000796274 0.000796274 0.000796274;
#X coords 0 1 99 -1 300 100 1;
-#X restore 82 405 graph;
-#X obj 82 314 tabwrite \$0-array;
-#X obj 82 186 moses 100;
-#X obj 81 111 bng 20 250 50 0 empty empty start 0 -6 1 10 -4033 -1
--1;
-#X text 158 166 <-- counter;
-#X text 180 186 <-- split at array size to stop;
-#X text 208 199 and reset counter to 0;
-#X text 49 336 ^--bang for next step;
-#X obj 52 249 expr abs(cos( min (1.57 \, ($f1 / $f2 - 0.4)) ) );
-#X obj 255 227 hsl 128 15 1 127 0 1 empty empty change_graph_shape
--130 8 1 12 -208896 -1 -1 1300 0;
-#X text 13 362 In this example \, the "bang" from [t b f] continues
+#X restore 24 375 graph;
+#X obj 88 274 tabwrite \$0-array;
+#X obj 91 146 moses 100;
+#X obj 91 67 bng 20 250 50 0 empty empty start 0 -6 1 10 -4033 -1 -1
+;
+#X text 177 119 <-- counter;
+#X text 189 146 <-- split at array size to stop;
+#X text 217 159 and reset counter to 0;
+#X text 61 296 ^--bang for next step;
+#X obj 61 209 expr abs(cos( min (1.57 \, ($f1 / $f2 - 0.4)) ) );
+#X obj 276 186 hsl 128 15 1 127 0 1 empty empty change_graph_shape
+-130 8 1 12 -208896 -1 -1 2500 0;
+#X text 21 322 In this example \, the "bang" from [t b f] continues
the loop. The [moses 100] ends the loop.;
-#X text 147 138 <-- stop;
-#X text 410 436 There are also specific loops for samples and video:
+#X text 157 94 <-- stop;
+#X obj 43 161 bang;
+#X text 9 95 continue -->;
+#X text 20 37 Here is a recursive loop with a little more complex behavior:
;
-#X text 417 500 video looping:;
-#X obj 619 474 xgroove~;
-#X obj 539 343 readsf~;
-#X obj 539 276 spigot;
-#X obj 576 254 tgl 15 0 empty empty allow_looping 17 7 0 10 -4033 -1
--1 0 1;
-#X text 409 181 For the most basic looping of samples \, you can use
+#X connect 2 0 3 0;
+#X connect 2 0 13 0;
+#X connect 3 0 2 1;
+#X connect 4 0 2 0;
+#X connect 5 0 6 0;
+#X connect 6 0 3 0;
+#X connect 6 0 2 1;
+#X connect 7 0 19 0;
+#X connect 7 1 12 1;
+#X connect 10 0 23 0;
+#X connect 10 1 12 0;
+#X connect 13 0 7 0;
+#X connect 13 1 5 0;
+#X connect 14 0 4 0;
+#X connect 19 0 10 0;
+#X connect 20 0 19 1;
+#X connect 23 0 4 0;
+#X restore 23 264 pd A_more_complex_recursive_loop;
+#N canvas 20 155 428 257 A_basic_sample_looper 0;
+#X obj 1 1 cnv 15 425 20 empty empty empty 20 10 1 18 -233017 -66577
+0;
+#X text 7 1 A basic sample looper using recursive looping;
+#X text 20 37 For the most basic looping of samples \, you can use
[readsf~]:;
-#X msg 548 320 open ../sound/voice.wav;
-#X text 584 363 ^- "bang"ed when complete;
-#X msg 512 320 1;
-#X obj 531 375 dac~;
-#X obj 512 298 t b b;
-#X obj 512 255 bng 20 250 50 0 empty empty start 0 -6 1 10 -4033 -1
--1;
-#X text 31 525 updated for Pd version 0.38.2;
-#X obj 30 201 bang;
-#X text 2 137 continue -->;
-#X text 7 29 Programming with Pd is a different way of thinking that
-standard procedural or object-oriented programming. Looping illustrates
-this. Instead of setting up a C-like [counter] or [for++] \, set up
-a condition to continue the loop \, and a condition that stops the
-loop.;
-#X obj 685 474 count~;
-#X obj 537 71 modulo_counter;
-#X obj 645 71 count;
-#X obj 689 71 countund;
-#X connect 15 0 16 0;
-#X connect 15 0 26 0;
-#X connect 16 0 15 1;
-#X connect 17 0 15 0;
-#X connect 18 0 19 0;
-#X connect 19 0 16 0;
-#X connect 19 0 15 1;
-#X connect 20 0 32 0;
-#X connect 20 1 25 1;
-#X connect 23 0 50 0;
-#X connect 23 1 25 0;
-#X connect 26 0 20 0;
-#X connect 26 1 18 0;
-#X connect 27 0 17 0;
-#X connect 32 0 23 0;
-#X connect 33 0 32 1;
-#X connect 39 0 46 0;
-#X connect 39 0 46 1;
-#X connect 39 1 40 0;
-#X connect 40 0 47 0;
-#X connect 41 0 40 1;
-#X connect 43 0 39 0;
-#X connect 45 0 39 0;
-#X connect 47 0 45 0;
-#X connect 47 1 43 0;
-#X connect 48 0 47 0;
-#X connect 50 0 17 0;
+#X obj 59 186 readsf~;
+#X obj 50 106 spigot;
+#X obj 83 84 tgl 15 0 empty empty allow_looping 17 7 0 10 -4033 -1
+-1 0 1;
+#X msg 59 160 open ../sound/voice.wav;
+#X text 104 206 ^- "bang"ed when complete;
+#X msg 23 160 1;
+#X obj 60 218 dac~;
+#X obj 23 133 t b b;
+#X obj 23 85 bng 20 250 50 0 empty empty start 0 -6 1 10 -4033 -1 -1
+;
+#X connect 3 0 9 0;
+#X connect 3 0 9 1;
+#X connect 3 1 4 0;
+#X connect 4 0 10 0;
+#X connect 5 0 4 1;
+#X connect 6 0 3 0;
+#X connect 8 0 3 0;
+#X connect 10 0 8 0;
+#X connect 10 1 6 0;
+#X connect 11 0 10 0;
+#X restore 23 290 pd A_basic_sample_looper;
+#X obj 1 548 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 KEYWORDS needs_work;
+#X text 12 25 NAME until;
+#X text 12 65 DESCRIPTION how to create loops in Pd;
+#X restore 392 550 pd META;
+#N canvas 9 223 428 342 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Looping- Related Objects;
+#X obj 22 42 until;
+#X obj 21 78 pddp/pddplink all_about_externals.pd -text _________;
+#X obj 21 78 pddp/pddplink all_about_externals.pd -text Externals;
+#X obj 20 99 pddp/helplink flatspace/loop;
+#X obj 20 139 pddp/helplink iemlib/modulo_counter;
+#X obj 20 179 pddp/helplink creb/count;
+#X obj 20 199 pddp/helplink creb/count;
+#X obj 20 219 pddp/helplink unauthorized/countund;
+#X obj 20 239 pddp/helplink ekext/cup;
+#X obj 20 259 pddp/helplink ekext/cupd;
+#X obj 20 279 pddp/helplink markex/counter;
+#X obj 20 299 pddp/helplink cyclone/counter;
+#X obj 20 119 pddp/helplink flatspace/gem_counter;
+#X obj 20 159 pddp/helplink iemlib/for++;
+#X text 186 78 Sample Looping;
+#X text 187 78 ______________;
+#X obj 185 98 pddp/helplink flatspace/susloop~;
+#X obj 82 42 loop~;
+#X obj 185 118 pddp/helplink cyclone/count~;
+#X text 186 198 Video Looping;
+#X text 187 198 _____________;
+#X obj 185 228 pddp/helplink pdp/pdp_loop;
+#X obj 185 248 pddp/helplink pdp/pdp_qtloop~;
+#X obj 185 138 pddp/helplink loopsampler;
+#X obj 185 158 pddp/helplink xgroove~;
+#X text 263 139 Which library for;
+#X text 263 159 loopsampler and xgroove~?;
+#X restore 103 550 pd Related_objects;
+#X obj 6 550 pddp/pddplink pddp/help.pd -text help;
diff --git a/doc/pddp/all_about_message_conversion.pd b/doc/pddp/all_about_message_conversion.pd
new file mode 100644
index 00000000..9f192dd3
--- /dev/null
+++ b/doc/pddp/all_about_message_conversion.pd
@@ -0,0 +1,119 @@
+#N canvas 0 0 448 238 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header message_conversion
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 43 150 pddp/pddplink all_about_messages.pd;
+#X obj 1 216 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 115 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 95 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 KEYWORDS needs_work;
+#X text 12 65 DESCRIPTION description of message conversion performed
+by Pd;
+#X text 12 25 NAME;
+#X restore 392 218 pd META;
+#N canvas 14 133 428 370 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Message Conversion - Related Objects;
+#X obj 22 82 makefilename;
+#X obj 22 127 pddp/helplink zexy/list2symbol;
+#X obj 22 147 pddp/helplink zexy/symbol2list;
+#X obj 22 167 pddp/helplink zexy/makesymbol;
+#X obj 22 307 pddp/helplink cyclone/tosymbol;
+#X obj 22 327 pddp/helplink cyclone/fromsymbol;
+#X obj 22 347 pddp/helplink cyclone/sprintf;
+#X obj 22 52 list;
+#X obj 62 52 route;
+#X obj 22 187 pddp/helplink zexy/lister;
+#X obj 22 207 pddp/helplink zexy/list2int;
+#X obj 22 227 pddp/helplink zexy/any2list;
+#X obj 22 247 pddp/helplink zexy/repack;
+#X obj 22 267 pddp/helplink zexy/glue;
+#X obj 112 52 pack;
+#X obj 152 52 pipe;
+#X obj 22 287 pddp/helplink iemlib/iem_any;
+#X msg 196 52;
+#X obj 21 108 pddp/pddplink all_about_externals.pd -text _________
+;
+#X obj 21 108 pddp/pddplink all_about_externals.pd -text Externals
+;
+#X restore 103 218 pd Related_objects;
+#X obj 6 218 pddp/pddplink pddp/help.pd -text help;
+#N canvas 20 56 428 587 anythings_and_lists 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X obj 1 190 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 20 27 All the list family objects-- [list append] \, [list
+prepend] [list length] \, [list split] \, and [list trim]-- convert
+the incoming message to a list before it is processed.;
+#X msg 25 76 this is an anything.;
+#X obj 25 98 list append;
+#X obj 25 120 route list;
+#X obj 35 142 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X text 103 98 <- convert this message to a list;
+#X text 7 190 Convert a List to an Anything;
+#X text 7 1 Convert an Anything to a List;
+#X msg 22 266 list one two three;
+#X obj 22 338 list trim;
+#X msg 45 313 one two three;
+#X obj 25 162 print any2list;
+#X obj 22 360 print list2any;
+#X text 20 216 Use the [list trim] object to remove the "list" or "symbol"
+selector \, which will convert a list or symbol message to an anything:
+;
+#X msg 40 289 symbol one;
+#X text 138 313 custom selectors are not "trimmed" \, so an;
+#X text 138 328 anything will remain an anything.;
+#X obj 1 388 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X msg 24 419 list;
+#X symbolatom 45 488 10 0 0 0 - - -;
+#X msg 30 443 list 25;
+#X msg 37 466 list foo;
+#X text 100 466 A "list" of one "symbol" is converted to a "symbol"
+;
+#X text 85 443 A "list" of one "float" is converted to a "float";
+#X text 64 419 An empty "list" is converted to a "bang";
+#X obj 24 541 bng 15 500 50 0 empty empty bang 0 24 1 12 -262144 -1
+-1;
+#X obj 73 541 bng 15 500 50 0 empty empty float 0 24 1 12 -262144 -1
+-1;
+#X obj 122 541 bng 15 500 50 0 empty empty symbol 0 24 1 12 -262144
+-1 -1;
+#X obj 241 541 bng 15 500 50 0 empty empty list 0 24 1 12 -262144 -1
+-1;
+#X obj 281 541 bng 15 500 50 0 empty empty OTHER 0 24 1 12 -262144
+-1 -1;
+#X obj 24 514 route bang float symbol pointer list;
+#X obj 182 541 bng 15 500 50 0 empty empty pointer 0 24 1 12 -262144
+-1 -1;
+#X text 7 388 Special Cases of Lists;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 5 0 13 0;
+#X connect 10 0 11 0;
+#X connect 11 0 14 0;
+#X connect 12 0 11 0;
+#X connect 16 0 11 0;
+#X connect 20 0 32 0;
+#X connect 22 0 32 0;
+#X connect 23 0 21 0;
+#X connect 23 0 32 0;
+#X connect 32 0 27 0;
+#X connect 32 1 28 0;
+#X connect 32 2 29 0;
+#X connect 32 3 33 0;
+#X connect 32 4 30 0;
+#X connect 32 5 31 0;
+#X restore 43 42 pd anythings_and_lists;
+#X obj 43 170 pddp/pddplink all_about_lists_vs_anythings.pd;
+#X obj 43 190 pddp/pddplink all_about_atom_conversion.pd;
diff --git a/doc/pddp/all_about_messages.pd b/doc/pddp/all_about_messages.pd
new file mode 100644
index 00000000..36395fe7
--- /dev/null
+++ b/doc/pddp/all_about_messages.pd
@@ -0,0 +1,382 @@
+#N canvas 0 0 448 248 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header messages 20 10 1
+18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#N canvas 14 48 428 289 What_is_a_message_in_Pd? 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 What is a message in Pd?;
+#X text 19 126 1) A selector \, which must be a symbol atom.[1];
+#X text 19 243 [1] The exceptions to this are implicit float and list
+messages. See the next subpatch for details.;
+#X text 19 146 2) Zero or more elements \, which may be any atom type
+that Pd can understand.;
+#X text 19 106 Messages in Pd are made up of the following components:
+;
+#X text 19 183 Messages divide into two groups: those with selectors
+that have a predefined meaning and behavior in Pd \, and everything
+else. See the other subpatches for more on how Pd processes messages.
+;
+#X text 19 36 Objects in Pd send each other various data in the form
+of messages. Messages can transport all kinds of information: float
+\, symbol \, and pointer atoms \, groups of floats and symbols \, etc.
+Understanding how to build and work with messages is a key to understanding
+Pd.;
+#X restore 43 42 pd What_is_a_message_in_Pd?;
+#N canvas 18 112 428 500 Predefined_messages_in_Pd 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Predefined messages in Pd;
+#X text 20 131 2) symbol message - the selector "symbol" \, followed
+by a single symbol atom.;
+#X obj 1 274 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 20 216 5) pointer message - the selector "pointer" \, followed
+by a pointer atom.;
+#X text 20 97 1) float message - this message has the selector "float"
+\, followed by a single float atom (e.g. \, "12" \, "-4" \, "1.8").
+;
+#X text 20 186 4) list - the selector "list" \, followed by two or
+more atoms of any type (these are the elements of the list).;
+#X text 20 166 3) bang message - the single selector "bang".;
+#X text 20 246 6) signal - an audio signal;
+#X text 7 274 Implicit float and list Messages;
+#X text 20 37 In Pd \, when an object receives a message to an inlet
+\, it looks at the selector to figure out what to do next. So that
+objects can easily communicate with one another \, Pd has several predefined
+messages:;
+#X text 20 309 Since numbers are used so often in Pd \, two shortcuts
+are provided to ease typing and reading them:;
+#X text 20 344 1) A single float atom has an implicit "float" selector.
+;
+#X msg 41 370 1;
+#X msg 181 370 float 1;
+#X text 71 370 is the same as...;
+#X text 20 394 1) a message that starts with a float atom and is followed
+by one or more atoms has an implicit "list" selector. Thus "1 2 3"
+or "1 4 63" \, and even "1 foo fee four" are list messages.;
+#X text 81 460 is the same as...;
+#X msg 41 460 2 3 4;
+#X msg 191 460 list 2 3 4;
+#X restore 43 69 pd Predefined_messages_in_Pd;
+#X obj 43 183 pddp/pddplink all_about_atoms.pd;
+#N canvas 19 160 428 264 User_defined_messages_in_Pd 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 User-defined messages in Pd;
+#X text 20 79 1) single selector messages - these are messages made
+up of a single symbol atom \, like "set" \, "clear" \, or "flush".
+;
+#X text 20 165 These messages are also referred to as meta-messages
+\, selector series \, anythings \, and named messages based on the
+selector (e.g. \, "foo 1 2 3" is a "foo message").;
+#X text 20 37 User defined messages \, also referred to as "anythings"
+\, are messages with selectors other than those predefined by Pd (listed
+in the previous subpatch). These include:;
+#X text 20 110 2) custom selector + 1 or more elements - messages with
+a custom selector followed by one or more atoms of any type. Examples
+include "set 3 4 5" \, "threshold 30 74" \, and "foo bar 3 four".;
+#X obj 20 231 pddp/pddplink all_about_lists_vs_anythings.pd;
+#X text 20 212 For more information about "anythings" \, see:;
+#X restore 43 94 pd User_defined_messages_in_Pd;
+#X obj 1 226 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 KEYWORDS needs_work;
+#X text 12 25 NAME list float symbol;
+#X text 12 65 DESCRIPTION message syntax in Pd;
+#X restore 392 228 pd META;
+#X obj 6 228 pddp/pddplink pddp/help.pd -text help;
+#X text 42 153 Messages are made up of atoms. Make sure you understand
+atoms before reading about messages.;
+#N canvas 20 104 428 468 Distinguishing_Message_Types 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X msg 23 72 foo;
+#X msg 23 140 symbol foo;
+#X symbolatom 22 378 10 0 0 0 - - -;
+#X msg 22 254 symbol clear;
+#X msg 46 310 clear;
+#X text 109 260 like this one and pass it to the outlet after;
+#X text 108 246 The [pipe] object will take a symbol message;
+#X text 91 297 On the other hand \, the "clear" message tells the;
+#X text 19 403 It's helpful to consider the following: if Pd didn't
+make a distinction between "symbol clear" and "clear" \, how would
+[pipe] know whether you want to send the word "clear" to the outlet
+\, or trigger the "clear" function described above?;
+#X text 90 312 [pipe] object to forget all stored message and;
+#X text 90 327 refrain from outputting anything.;
+#X obj 22 351 pipe s 3000;
+#X text 95 351 <-- wait 3 seconds \, then output the message;
+#X text 19 159 Above is a message with the selector "symbol". The first
+(and only) element of the message is "foo". This is a "symbol message"
+\, one of Pd's built-in message types.;
+#X text 19 93 Above is a message with the selector "foo". You might
+also refer to this as a custom message \, the symbol atom "foo" \,
+or even a "foo message". The message has no elements.;
+#X text 7 1 Understanding Message Types;
+#X text 20 35 Remember that messages in Pd can consist of a single
+symbol atom. Consider the following:;
+#X text 19 201 This distinction is important: some objects \, for example
+\, have one behavior for symbol messages \, and a different behavior
+for custom messages.;
+#X text 109 274 the specified duration (3 seconds).;
+#X connect 4 0 12 0;
+#X connect 5 0 12 0;
+#X connect 12 0 3 0;
+#X restore 43 120 pd Distinguishing_Message_Types;
+#N canvas 24 124 428 150 Quick_Quiz! 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Messages- Related Objects;
+#X msg 22 43 list quiz: What type of message is this?;
+#X obj 22 99 bng 15 250 50 0 empty empty list 0 25 0 8 -262144 -1 -1
+;
+#X obj 63 99 bng 15 250 50 0 empty empty bang 0 25 0 8 -262144 -1 -1
+;
+#X obj 104 99 bng 15 250 50 0 empty empty float 0 25 0 8 -262144 -1
+-1;
+#X obj 146 99 bng 15 250 50 0 empty empty symbol 0 25 0 8 -262144 -1
+-1;
+#X obj 187 99 bng 15 250 50 0 empty empty secret 0 25 0 8 -262144 -1
+-1;
+#X obj 229 99 bng 15 250 50 0 empty empty none_of_the_above 0 25 0
+8 -262144 -1 -1;
+#X obj 22 70 route list bang float symbol secret;
+#X text 276 42 <- Click to find out;
+#X connect 2 0 9 0;
+#X connect 9 0 3 0;
+#X connect 9 1 4 0;
+#X connect 9 2 5 0;
+#X connect 9 3 6 0;
+#X connect 9 4 7 0;
+#X connect 9 5 8 0;
+#X restore 103 228 pd Quick_Quiz!;
+#N canvas 0 0 878 627 old 0;
+#X obj 433 459 route;
+#X floatatom 113 135 5 0 0 1 "float" - -;
+#X symbolatom 204 135 10 0 0 1 "symbol" - -;
+#X obj 116 231 symbol;
+#X symbolatom 116 278 0 0 0 0 - - -;
+#X msg 125 255 word;
+#X msg 116 213 test;
+#X msg 99 191 symbol this;
+#X text 190 190 set type directly;
+#X text 157 255 does not work (check console messages);
+#X floatatom 35 253 5 0 0 0 - - -;
+#X msg 40 232 12;
+#X msg 23 212 float 83;
+#N canvas 534 126 490 340 Related_Objects 0;
+#X obj 32 54 ftos;
+#X obj 68 54 list2symbol;
+#X text 23 22 data type conversion;
+#X obj 155 55 tosymbol;
+#X obj 219 55 fromsymbol;
+#X obj 36 252 lister;
+#X obj 34 98 atoi;
+#X obj 30 138 list2int;
+#X obj 94 137 l2i;
+#X obj 96 163 a2l;
+#X obj 29 164 any2list;
+#X obj 158 138 list2symbol;
+#X obj 158 159 symbol2list;
+#X obj 247 138 l2s;
+#X obj 247 158 s2l;
+#X obj 123 252 list;
+#X restore 447 604 pd Related_Objects;
+#X text 407 245 Many objects cast the data they receive when they output
+it:;
+#X text 526 326 Some objects do not cast the data:;
+#X obj 424 297 trigger anything;
+#X msg 424 272 this is a list without a cast;
+#X obj 424 320 print;
+#X text 410 360 Some objects need to have the data explicitly declared
+in order to handle it. These are mostly symbol handling objects.;
+#X text 410 426 Objects which route data generally can handle explicitly
+or implicitly defined data.;
+#X obj 480 459 trigger;
+#X obj 538 459 niagara;
+#X obj 426 403 select;
+#X obj 15 18 cnv 15 750 20 empty empty all_about_data_types 20 10 1
+18 -233017 -66577 0;
+#X obj 731 19 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X text 11 311 "anything";
+#X text 11 427 "list";
+#X text 11 413 "float";
+#X text 11 454 "symbol";
+#X text 11 400 "bang";
+#X msg 111 359 anything 1 two three;
+#X msg 262 359 one 2 3;
+#X obj 167 442 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 171 416 t a b f l p s;
+#X obj 201 443 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 264 393 list one 2 3;
+#X msg 303 423 1 2 3;
+#X text 17 55 atoms (basic data types):;
+#X text 17 80 The basic data types are known as 'atoms' in Pd. "float"
+and "symbol" atoms have 'atom boxes' for realtime display and control
+from within a patch. "pointer" atoms are used for accessing data stored
+in graphical data structures.;
+#X obj 421 197 int;
+#X obj 429 177 / 5.23;
+#X floatatom 429 149 5 0 0 0 - - -;
+#X floatatom 462 217 5 0 0 0 - - -;
+#X floatatom 421 217 5 0 0 0 - - -;
+#X obj 511 147 tosymbol;
+#X obj 575 148 fromsymbol;
+#X obj 658 147 list2symbol;
+#X obj 662 189 ftos;
+#X obj 617 56 symbol;
+#X obj 580 100 int;
+#X obj 699 56 pointer;
+#X obj 440 100 bang;
+#X obj 478 101 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 499 56 float;
+#X text 21 547 There a number of objects which are used for storing
+messages \, or casting messages as a specific data type \, sometimes
+converting from one data type to another. The right inlet on these
+objects is stores that value \, which can be later output using a bang.
+;
+#X obj 608 100 lister;
+#X text 540 57 aka;
+#X obj 566 56 f;
+#X obj 470 531 pddp/pddplink all_about_lists_vs_anythings.pd -text
+all_about_lists_vs_anythings;
+#X obj 470 552 pddp/pddplink all_about_symbol_construction.pd -text
+all_about_symbol_construction;
+#X obj 470 573 pddp/pddplink all_about_data_structures.pd -text all_about_data_structures
+;
+#X text 495 101 (aka [bng]);
+#X text 23 324 "anything" allows anything to pass through unchanged.
+It is not a data type tho.;
+#X text 14 163 "symbols" need to be declared explicitly. "floats" do
+not need to be declared explicitly \, but can be:;
+#X text 173 232 casting as a "symbol";
+#X text 21 529 CASTING AND STORAGE OBJECTS;
+#X text 411 487 FOR MORE INFO:;
+#X text 410 127 EXAMPLES OF CASTING;
+#X text 405 56 atom objects:;
+#X text 412 78 other data types:;
+#X text 11 440 "pointer";
+#X obj 44 480 trigger anything bang float list pointer symbol;
+#X obj 44 500 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 98 500 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 154 499 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 211 500 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 267 499 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 323 500 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 213 55 "float" \, "symbol" \, "pointer";
+#N canvas 0 22 505 381 float/list 0;
+#X msg 75 133 float 1 2 3;
+#X text 34 22 FLOAT CONVERSION;
+#X msg 95 187 list 1 2 3;
+#X text 92 164 A list with multiple elements remains a list.;
+#X text 43 59 A float with one element remains a float.;
+#X text 72 106 A float with multiple elements remains a float but is
+cut to one element.;
+#X text 99 218 A list with one float element is converted to a float.
+;
+#X obj 58 308 bng 15 250 50 0 empty empty bang 0 20 1 9 -262144 -1
+-1;
+#X obj 105 308 bng 15 250 50 0 empty empty float 0 21 1 9 -262144 -1
+-1;
+#X obj 152 308 bng 15 250 50 0 empty empty symbol 0 21 1 9 -262144
+-1 -1;
+#X obj 200 308 bng 15 250 50 0 empty empty list 0 21 1 9 -262144 -1
+-1;
+#X obj 248 308 bng 15 250 50 0 empty empty UNDEFINED 0 21 1 9 -262144
+-1 -1;
+#X obj 57 286 route bang float symbol list;
+#X obj 92 349 print FLOAT;
+#X msg 50 81 float 3;
+#X msg 106 239 list 2;
+#X obj 188 349 print LIST;
+#X connect 0 0 12 0;
+#X connect 2 0 12 0;
+#X connect 12 0 7 0;
+#X connect 12 1 8 0;
+#X connect 12 1 13 0;
+#X connect 12 2 9 0;
+#X connect 12 3 10 0;
+#X connect 12 3 16 0;
+#X connect 12 4 11 0;
+#X connect 14 0 12 0;
+#X connect 15 0 12 0;
+#X restore 445 506 pd float/list conversion;
+#N canvas 0 22 479 361 empty 0;
+#X obj 78 268 bng 15 250 50 0 empty empty bang 0 20 1 9 -262144 -1
+-1;
+#X obj 125 268 bng 15 250 50 0 empty empty float 0 21 1 9 -262144 -1
+-1;
+#X obj 172 268 bng 15 250 50 0 empty empty symbol 0 21 1 9 -262144
+-1 -1;
+#X obj 220 268 bng 15 250 50 0 empty empty list 0 21 1 9 -262144 -1
+-1;
+#X obj 268 268 bng 15 250 50 0 empty empty UNDEFINED 0 21 1 9 -262144
+-1 -1;
+#X msg 127 205 list;
+#X msg 50 75 float;
+#X msg 97 134 symbol;
+#X text 31 21 EMPTY DATA TYPES;
+#X obj 77 246 route bang float symbol list;
+#X obj 73 326 print FLOAT;
+#X obj 155 326 print SYMBOL;
+#X text 120 184 An empty list is converted to a bang;
+#X text 85 114 An empty "symbol" remains a empty "symbol".;
+#X text 46 55 An empty "float" remains a "float" and is initialized
+to 0;
+#X connect 5 0 9 0;
+#X connect 6 0 9 0;
+#X connect 7 0 9 0;
+#X connect 9 0 0 0;
+#X connect 9 1 1 0;
+#X connect 9 1 10 0;
+#X connect 9 2 2 0;
+#X connect 9 2 11 0;
+#X connect 9 3 3 0;
+#X connect 9 4 4 0;
+#X restore 636 506 pd empty data types;
+#X text 568 604 updated for Pd version 0.38.4;
+#X connect 3 0 4 0;
+#X connect 5 0 4 0;
+#X connect 6 0 3 0;
+#X connect 7 0 4 0;
+#X connect 11 0 10 0;
+#X connect 12 0 10 0;
+#X connect 16 0 18 0;
+#X connect 17 0 16 0;
+#X connect 31 0 34 0;
+#X connect 32 0 34 0;
+#X connect 34 0 33 0;
+#X connect 34 3 35 0;
+#X connect 36 0 34 0;
+#X connect 37 0 34 0;
+#X connect 40 0 44 0;
+#X connect 41 0 40 0;
+#X connect 41 0 43 0;
+#X connect 42 0 41 0;
+#X connect 72 0 73 0;
+#X connect 72 1 74 0;
+#X connect 72 2 75 0;
+#X connect 72 3 76 0;
+#X connect 72 4 77 0;
+#X connect 72 5 78 0;
+#X restore 290 119 pd old;
+#X obj 43 203 pddp/pddplink ../1.manual/x2.htm#s3.1;
+#X text 194 202 <- fix this;
diff --git a/doc/pddp/all_about_midi_flags.pd b/doc/pddp/all_about_midi_flags.pd
index 0a71c8c2..4b21ecc5 100644
--- a/doc/pddp/all_about_midi_flags.pd
+++ b/doc/pddp/all_about_midi_flags.pd
@@ -1,47 +1,94 @@
-#N canvas 224 22 513 695 10;
-#X text 11 34 MIDI in Pd is handled through the 'raw' midi devices
-(such as /dev/midi*). One could specify which MIDI port Pd is supposed
-to use through a command line switch when starting Pd \, i.e.:;
-#X text 35 95 pd -midiindev 1 -midioutdev 2;
-#X text 43 236 pd -mididev 1;
-#X text 17 264 This will use the first port for both MIDI input and
-output.;
-#X text 17 346 There is also a little bit of confusion about OSS midi
-(which uses the raw midi - /dev/midi* - devices by default) and ALSA
-(which is becoming very popular). ALSA uses /dev/snd/midiC*D* as their
-raw midi devices. The C* (* = some number) is the device number while
-D* (* = some number) is the port number. Normally the ALSA driver links
-its raw devices to the corresponding /dev/midi* automatically (i.e.:
-/dev/snd/midiC0d0 -> /dev/midi00 \, /dev/snd/midiC0D1 -> /dev/midi01
-etc).;
-#X text 13 119 so \, the above will use the first MIDI device for MIDI
-input (it could be a MIDI controller such as a keyboard \, midi-guitar
-\, midi knob box etc) and the device #2 will be used for outputting
-the MIDI (re)generated or sent by Pd.;
-#X text 13 181 For using the same device for MIDI input AND output
-(i.e. when one uses a MIDI keyboard which is also a synthesizer) the
-following command line switch will do:;
-#X text 19 470 MIDI objects in Pd (the ones that read and write to
-MIDI ports) take a MIDI channel as an argument. Channels 1-16 use the
-first MIDI device \, 17-32 use the second MIDI device and so on. For
-this to work one must specify which devices Pd is supposed to use:
-;
-#X text 39 548 -midiindev 1 \, 2 -- use devices 1 and 2 for input;
-#X text 39 564 -midioutdev 1 \, 2 -- use devices 1 and 2 for output
-;
-#X text 39 580 -mididev 1 \, 2 -- use devices 1 and 2 for input and
-output;
-#X text 17 292 NOTE (Linux): Pd counts the MIDI devices starting from
-1 Usually \, the operating system counts them starting with 0 (zero)
-so if you want to use /dev/midi00 \, Pd has to be started with -mididev
-1 Always add 1 to the device number.;
-#X text 21 600 NOTE (Windows): -listdev command line option lists all
-available MIDI and audio devices.;
-#X text 19 627 A couple more useful command line options (related to
-MIDI):;
-#X text 21 643 -nomidiin -- do not listen to any midi input;
-#X text 21 655 -nomidiout -- do not send any midi output;
-#X text 21 667 -nomidi -- do not use any MIDI;
-#X obj 4 4 cnv 15 500 20 empty empty all_about_midi_flags 20 10 1 18
--233017 -66577 0;
-#X obj 471 5 pddp/pddplink http://puredata.info/dev/pddp -text pddp;
+#N canvas 0 0 448 643 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header midi_flags 20 10
+1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X text 40 79 pd -midiindev 1 -midioutdev 2;
+#X text 39 201 pd -mididev 1;
+#X text 19 223 This will use the first port for both MIDI input and
+output.;
+#X text 19 291 There is also a little bit of confusion about OSS midi
+(which uses the raw midi - /dev/midi* - devices by default) and ALSA
+(which is becoming very popular). ALSA uses /dev/snd/midiC*D* as their
+raw midi devices. The C* (* = some number) is the device number while
+D* (* = some number) is the port number. Normally the ALSA driver links
+its raw devices to the corresponding /dev/midi* automatically (i.e.:
+/dev/snd/midiC0d0 -> /dev/midi00 \, /dev/snd/midiC0D1 -> /dev/midi01
+etc).;
+#X text 19 411 MIDI objects in Pd (the ones that read and write to
+MIDI ports) take a MIDI channel as an argument. Channels 1-16 use the
+first MIDI device \, 17-32 use the second MIDI device and so on. For
+this to work one must specify which devices Pd is supposed to use:
+;
+#X text 38 478 -midiindev 1 \, 2 -- use devices 1 and 2 for input;
+#X text 38 493 -midioutdev 1 \, 2 -- use devices 1 and 2 for output
+;
+#X text 38 508 -mididev 1 \, 2 -- use devices 1 and 2 for input and
+output;
+#X text 19 526 NOTE (Windows): -listdev command line option lists all
+available MIDI and audio devices.;
+#X text 19 558 A couple more useful command line options (related to
+MIDI):;
+#X text 39 573 -nomidiin -- do not listen to any midi input;
+#X text 39 588 -nomidiout -- do not send any midi output;
+#X text 39 603 -nomidi -- do not use any MIDI;
+#X text 20 36 MIDI in Pd is handled through the 'raw' midi devices
+(such as /dev/midi*). Specify which MIDI port Pd is supposed to use
+through a command line switch when starting Pd \, i.e.:;
+#X text 19 101 The above will use the first MIDI device for MIDI input
+(it could be a MIDI controller such as a keyboard \, midi-guitar \,
+midi knob box \, etc.) and device #2 will be used for outputting the
+MIDI (re)generated or sent by Pd.;
+#X text 19 158 To use the same device for MIDI input AND output (e.g.
+\, a MIDI keyboard which is also a synthesizer) use the following command
+line switch:;
+#X text 19 238 NOTE (Linux): Pd counts the MIDI devices starting from
+one. Usually \, the operating system counts them starting with 0 (zero)
+so if you want to use /dev/midi00 \, start Pd with "-mididev 1". Always
+add 1 to the device number.;
+#X obj 1 621 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS MIDI;
+#X text 12 45 DESCRIPTION list of command line flags relating to MIDI
+;
+#X restore 392 623 pd META;
+#N canvas 10 196 428 342 Related_objects 0;
+#X obj 22 41 dbtopow~;
+#X obj 76 41 dbtorms~;
+#X obj 131 41 rmstodb~;
+#X obj 186 41 powtodb~;
+#X obj 241 41 mtof~;
+#X obj 278 41 ftom~;
+#X obj 22 68 expr;
+#X obj 57 68 expr~;
+#X obj 97 68 sig~;
+#X obj 131 68 snapshot~;
+#X text 19 98 [rmstopow~];
+#X text 99 98 [powtorms~];
+#X obj 22 169 db2v;
+#X obj 60 169 f2note;
+#X obj 108 169 t3_sig~;
+#X obj 164 169 m2f~;
+#X text 19 226 These objects are offered in Pd only if you have downloaded
+and properly installed the appropriate library. These objects may or
+may not exist in a single library.;
+#X text 19 266 The best places to find information about Pd's libraries
+is:;
+#X text 20 286 www.puredata.org and click on "Downloads" then "Software"
+;
+#X text 20 301 or;
+#X text 19 316 iem.kug.ac.at/pdb/;
+#X text 18 198 [b2db];
+#X text 61 198 [tmtof];
+#X text 20 142 Externals;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 MIDI flags- Related Objects;
+#X restore 103 623 pd Related_objects;
+#X obj 6 623 pddp/pddplink pddp/help.pd -text help;
diff --git a/doc/pddp/all_about_pd_META.pd b/doc/pddp/all_about_pd_META.pd
new file mode 100644
index 00000000..25287f55
--- /dev/null
+++ b/doc/pddp/all_about_pd_META.pd
@@ -0,0 +1,79 @@
+#N canvas 0 0 448 238 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header pd_META 20 10 1
+18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 216 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS needs_work;
+#X text 12 45 DESCRIPTION description of the pd META tags;
+#X restore 392 218 pd META;
+#N canvas 10 196 428 105 Related_objects 0;
+#X text 31 37 Hm...what to put here?;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Atoms- Related Objects;
+#X restore 103 218 pd Related_objects;
+#X obj 6 218 pddp/pddplink pddp/help.pd -text help;
+#X text 70 54 tags \, keywords \, defaults if some tags are left out
+;
+#N canvas 256 0 428 658 TAGS 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 pd META - TAGS;
+#X text 31 37 Each pd META entry is a comment that begins with a tag
+in uppercase \, followed by values for that tag.;
+#X text 31 77 GENRE - describes what type of help patch this is. Possible
+values are help (for an object's help patch) \, tutorial \, or all_about_pd
+(in-depth help for a pd concept). If GENRE is omitted \, the value
+"help" is assumed.;
+#X text 31 137 NAME - name of the object. If more than one value is
+present \, it is assumed that the help patch covers multiple objects.
+This tag may also be used for tutorials and all_about_pd patches to
+show the relevant object(s) being discussed.;
+#X text 31 207 ALIAS - for an object's help patch \, any additional
+creator names for the object. For [trigger] \, this would be: ALIAS
+t;
+#X text 31 247 LICENSE - the license used for the object (not relevant
+for tutorials or all_about_pd patches). Some common values are:;
+#X text 51 277 SIBSD: three-clause BSD license;
+#X text 51 297 GPL v2: GNU/GPL license version 2;
+#X text 51 317 GPL v3: GNU/GPL license version 3;
+#X text 31 337 DESCRIPTION - short (one-line) description of an object's
+behavior. May also be used for tutorials or all_about_pd patches to
+describe the concept being discussed.;
+#X obj 1 551 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -261106 -33289 0;
+#X text 7 552 TAGS for an object's inlets/outlets;
+#X text 31 587 Tags to show which messages are accepted by the inlets/outlets
+of an object. The tag starts with the word INLET or OUTLET \, followed
+by an underscore and a digit showing the xlet number:;
+#X text 31 670 There are two special designations:;
+#X text 31 647 INLET_0 - left-most inlet;
+#X text 31 690 INLET_N or OUTLET_N - variable number of xlets \, the
+exact number of which is determined by the creation arguments.;
+#X text 31 730 For objects with variable xlets \, the following may
+apply:;
+#X text 31 753 INLET_R or OUTLET_R - a right-most xlet which always
+has the same function regardless of the total number of xlets.;
+#X text 31 387 LIBRARY - name of the library to which the object belongs.
+;
+#X text 31 441 WEBSITE - website of the author or group that made the
+object/tutorial.;
+#X text 31 471 RELEASE_DATE - date when the object was made available
+to Pd users. Format = YEAR-MONTH-DAY;
+#X text 31 511 HELP_PATCH_AUTHORS - persons or groups who made/edited
+this help patch.;
+#X text 31 407 AUTHOR - multiple authors can be specified \, as well
+as additional text explaining each author's role.;
+#X text 31 793 The values may be float \, list \, bang \, symbol \,
+pointer \, anything \, as well as specific custom selectors such as
+set \, clear \, etc.;
+#X restore 144 145 pd TAGS;
+#X text 79 87 This help file is unfinished.;
diff --git a/doc/pddp/all_about_scope_and_locality.pd b/doc/pddp/all_about_scope_and_locality.pd
index 03e93858..9d482551 100644
--- a/doc/pddp/all_about_scope_and_locality.pd
+++ b/doc/pddp/all_about_scope_and_locality.pd
@@ -1,48 +1,51 @@
-#N canvas 166 111 516 471 10;
-#X text 9 34 WHAT IS THIS ALL ABOUT?;
-#X text 21 60 Depending on the complexity of your patches \, you may
+#N canvas 0 0 448 395 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header scope_and_locality
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X text 20 36 Depending on the complexity of your patches \, you may
need to control whether or not messages will be used by only ONE patch
\, or throughout all open patches. The scope of a message is considered
either 'local' or 'global'.;
-#N canvas 146 223 606 389 GLOBAL_SCOPE 0;
-#N canvas 0 22 254 169 example_a 0;
-#X obj 18 9 r foo;
-#X floatatom 18 34 5 0 0 0 - - -;
-#X obj 24 96 r a-foo;
-#X floatatom 24 116 5 0 0 0 - - -;
+#N canvas 16 214 428 369 Global_scope 0;
+#N canvas 1 1 254 169 example_a 0;
+#X obj 18 19 r foo;
+#X floatatom 18 44 5 0 0 0 - - -;
+#X obj 18 96 r a-foo;
+#X floatatom 18 116 5 0 0 0 - - -;
#X connect 0 0 1 0;
#X connect 2 0 3 0;
-#X restore 34 56 pd example_a;
-#N canvas 2 238 256 163 example_b 0;
-#X obj 12 9 r foo;
-#X floatatom 12 28 5 0 0 0 - - -;
-#X obj 15 74 r b-foo;
-#X floatatom 15 93 5 0 0 0 - - -;
+#X restore 14 56 pd example_a;
+#N canvas 121 2 256 168 example_b 0;
+#X obj 18 19 r foo;
+#X floatatom 18 44 5 0 0 0 - - -;
+#X obj 18 96 r a-foo;
+#X floatatom 18 116 5 0 0 0 - - -;
#X connect 0 0 1 0;
#X connect 2 0 3 0;
-#X restore 155 57 pd example_b;
-#N canvas 0 473 231 169 example_c 0;
-#X obj 12 8 r foo;
-#X floatatom 12 30 5 0 0 0 - - -;
-#X obj 12 65 r c-foo;
-#X floatatom 12 86 5 0 0 0 - - -;
+#X restore 14 81 pd example_b;
+#N canvas 215 2 263 169 example_c 0;
+#X obj 18 19 r foo;
+#X floatatom 18 44 5 0 0 0 - - -;
+#X obj 18 96 r a-foo;
+#X floatatom 18 116 5 0 0 0 - - -;
#X connect 0 0 1 0;
#X connect 2 0 3 0;
-#X restore 269 57 pd example_c;
-#X text 377 58 Open these subpatches.;
-#X obj 43 142 s foo;
-#X floatatom 43 126 5 0 0 0 - - -;
-#X text 33 85 Click-n-drag these number boxes and notice the appropriate
+#X restore 14 106 pd example_c;
+#X text 17 38 Open these subpatches.;
+#X obj 23 187 s foo;
+#X floatatom 23 166 5 0 0 0 - - -;
+#X text 13 125 Click-n-drag these number boxes and notice the appropriate
receive objects in each open sub-patch.;
-#X floatatom 102 126 5 0 0 0 - - -;
-#X floatatom 179 126 5 0 0 0 - - -;
-#X floatatom 252 126 5 0 0 0 - - -;
-#X obj 102 142 s a-foo;
-#X obj 179 142 s b-foo;
-#X obj 252 142 s c-foo;
+#X floatatom 82 166 5 0 0 0 - - -;
+#X floatatom 159 166 5 0 0 0 - - -;
+#X floatatom 232 166 5 0 0 0 - - -;
+#X obj 82 187 s a-foo;
+#X obj 159 187 s b-foo;
+#X obj 232 187 s c-foo;
#X text 18 23 GLOBAL SCOPE - send and receive messages in ALL OPEN
PATCHES;
-#X text 35 177 Send objects simply post their information to the cyberspace
+#X text 15 217 Send objects simply post their information to the cyberspace
within your computer (that's one way to look at it!) Receive objects
simply keep their ears open for all messages floating through that
cyberspace from send objects of the same name! Hence \, if you name
@@ -51,12 +54,15 @@ patches named "foo" will 'hear' those messages. Also note that the
term 'open patches' includes all sub-patches \, abstractions and patches
that are currently open in Pd - they don't have to be VISIBLE...they
only have to be active.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Global Scope;
#X connect 5 0 4 0;
#X connect 7 0 10 0;
#X connect 8 0 11 0;
#X connect 9 0 12 0;
-#X restore 11 157 pd GLOBAL_SCOPE;
-#N canvas 146 22 618 662 LOCAL_SCOPE 0;
+#X restore 23 94 pd Global_scope;
+#N canvas 146 22 618 662 Local_scope 0;
#X text 4 9 LOCAL SCOPE -send and receive messages within a SINGLE
PATCH;
#X text 13 37 There are many cases where you may want messages to be
@@ -82,7 +88,7 @@ I used when I created the abstraction called "all_about_scope_and_locality".
These two agruments are now available in this patch by using \$1 or
\$2 variables. There's more information about this in the section called
'Inheritance'.;
-#X text 13 267 In the examples above I have used a variable ($1) to
+#X text 13 267 In the examples above I have used a variable (\$1) to
name these [send] and [receive] objects. The value of this variable
is assigned either by Pd (randomly for each abstraction or patch) \,
or by me with the use of arguments.;
@@ -105,8 +111,8 @@ you should see:;
#X connect 8 0 7 0;
#X connect 10 0 14 0;
#X connect 13 0 11 0;
-#X restore 11 186 pd LOCAL_SCOPE;
-#N canvas 145 31 610 615 INHERITANCE 0;
+#X restore 23 119 pd Local_scope;
+#N canvas 145 31 610 615 Inheritance 0;
#X text 20 18 The word "Inherit" means to "receive a characteristic
from one's parent".;
#X text 19 59 In Pd \, all abstracions and subpatches have 'parents'
@@ -126,7 +132,7 @@ this abstraction and all of its subpatches!;
8 -262144 -1 -1;
#X symbolatom 146 356 0 0 0 0 - - -;
#X obj 146 327 symbol \$2;
-#X text 24 388 So \, if a [send] object is named "$1-foo" or "$2-foo"
+#X text 24 388 So \, if a [send] object is named "\$1-foo" or "\$2-foo"
inside this abstraction \, Pd identifies that [send] object as "and-foo"
or "inheritance-foo".;
#X obj 47 466 s and-foo;
@@ -157,17 +163,26 @@ or "inheritance-foo".;
#X connect 15 0 18 0;
#X connect 16 0 20 0;
#X connect 19 0 17 0;
-#X restore 11 217 pd INHERITANCE;
-#X text 16 285 From section 2.6.5 of the Pd manual \, Miller Puckette
-says:;
-#X text 39 316 "Note that the expansion of variables such as \$0 and
-\$1 only works at the beginning of the symbol. So \, for instance \,
-[rats-$1] will not be expanded. Occasionally you may want to have double
-or triple sustitutions. This can be done one stage at a time by nesting
-abstractions (with each subpatch adding its own $-variable to the begining
-of a symbol and passing that on as agrument to a further abstraction."
-;
-#X text 7 261 MILLER'S WISDOM;
-#X obj 4 4 cnv 15 500 20 empty empty all_about_scope_and_locality 20
-10 1 18 -233017 -66577 0;
-#X obj 471 5 pddp/pddplink http://puredata.info/dev/pddp -text pddp;
+#X restore 23 144 pd Inheritance;
+#X text 115 119 <- confusing \, clean it up;
+#X obj 1 373 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS nonlocal needs_work;
+#X text 12 45 DESCRIPTION notions of scope in Pd;
+#X restore 392 375 pd META;
+#N canvas 11 243 428 121 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Scope and Locality- Related Objects;
+#X restore 103 375 pd Related_objects;
+#X obj 6 375 pddp/pddplink pddp/help.pd -text help;
+#X obj 59 349 pddp/pddplink ../2.control.examples/14.dollarsigns.pd
+-text doc/2.control.examples/14.dollarsigns.pd;
+#X obj 59 334 pddp/pddplink all_about_dollarsign_zero.pd;
+#X text 52 209 This help file is unfinished.;
diff --git a/doc/pddp/all_about_send_n_receive.pd b/doc/pddp/all_about_send_n_receive.pd
index 20801416..48f6bdc6 100644
--- a/doc/pddp/all_about_send_n_receive.pd
+++ b/doc/pddp/all_about_send_n_receive.pd
@@ -1,30 +1,82 @@
-#N canvas 281 92 863 548 10;
-#X text 9 28 GETTING YOUR MESSAGE ACROSS;
-#X text 10 43 The [send] and [receive] objects are useful for linking
+#N canvas 0 0 448 523 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header send_and_receive
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 501 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 KEYWORDS nonlocal;
+#X text 12 25 NAME send receive vsl hsl vradio hradio;
+#X text 12 65 DESCRIPTION additional information for send and receive
+;
+#X restore 392 503 pd META;
+#N canvas 14 368 428 126 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X obj 22 42 pddp/helplink cyclone/universal;
+#X text 7 2 send and receive - Related objects;
+#X obj 22 62 pddp/helplink ext13/send13;
+#X obj 22 82 pddp/helplink ext13/receive13;
+#X obj 21 23 pddp/pddplink all_about_externals.pd -text _________;
+#X obj 21 23 pddp/pddplink all_about_externals.pd -text Externals;
+#X restore 103 503 pd Related_objects;
+#X obj 6 503 pddp/pddplink pddp/help.pd -text help;
+#X text 19 27 The [send] and [receive] objects are useful for linking
objects and subroutines together in a single canvas or throughout multiple
patches. Understanding these objects will help 'clean up' your patches
and allow you to communicate messages between various modules that
you build or between objects where patch cords are not possible.;
-#X text 10 175 In the [send] and [receive] help files \, you will see
+#X text 18 162 In the [send] and [receive] help files \, you will see
message sent within a single patch - from a [send] object to a [receive]
object in the same patch. But the functionality of these objects goes
far beyond the scope of a single patch.;
-#X text 10 385 A [send] object is a little like a radio station...it
-broadcasts information throughout Pd \, for all the [receives] to hear!
-A [receive] object is a little like your own AM/FM tuner...it will
-receive messages from all the [send] objects that it is 'tuned' to.
-Hence \, naming your [send] and [receive] objects becomes very important.
-A [receive] object named "dave" (as in [receive dave]) will pick up
-all messages from [send dave] \, regardless of which patch it is in.
-In this manner \, you can get messages across multiple patches \, or
-into abstractions or subpatches -- without patch cords.;
-#X text 439 42 However \, controlling the 'scope' of a [send] or [receive]
+#X floatatom 42 110 5 0 0 0 - - -;
+#X floatatom 96 136 5 0 0 0 - - -;
+#X obj 42 136 s aNum;
+#X obj 96 110 r aNum;
+#X obj 170 135 s aSymbol;
+#X msg 170 110 symbol hello;
+#X obj 267 110 r aSymbol;
+#X symbolatom 267 137 10 0 0 0 - - -;
+#X obj 16 262 send one_send;
+#X obj 16 306 receive one_send;
+#X obj 19 244 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 0;
+#X obj 153 262 send one_send;
+#X obj 156 244 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 0;
+#X obj 291 262 send one_send;
+#X obj 294 244 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 0;
+#X obj 19 327 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X obj 153 306 receive one_send;
+#X obj 156 327 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X obj 291 306 receive one_send;
+#X obj 294 327 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X text 17 289 All [receive]s of the same name will receive the "messages":
+;
+#X text 17 224 You can have multiple [send]s with the same name:;
+#N canvas 7 324 428 153 scope_and_inheritance 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Send and receive - scope and inheritance;
+#X obj 85 107 pddp/pddplink all_about_scope_and_locality.pd;
+#X text 20 107 See also:;
+#X text 19 36 However \, controlling the 'scope' of a [send] or [receive]
object is important if you want to ensure that a message is only transmitted
within a single patch \, or within a single abstraction. Check out
the following information about 'scope' and 'locality'.;
-#X obj 466 121 all_about_scope_and_locality and inheritance;
-#X text 530 471 hmm...also see;
-#N canvas 0 123 827 456 special-send-and-receives 0;
+#X restore 21 483 pd scope_and_inheritance;
+#N canvas 0 123 684 434 special-send-and-receives 0;
#X text 19 10 SPECIAL OBJECTS;
#X obj 28 41 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
@@ -36,94 +88,66 @@ the following information about 'scope' and 'locality'.;
-1 -1 0 1;
#X obj 21 386 hdl 15 1 0 8 empty empty empty 0 -6 0 8 -262144 -1 -1
0;
-#X obj 154 119 vdl 15 1 0 8 empty empty empty 0 -6 0 8 -262144 -1 -1
+#X obj 162 119 vdl 15 1 0 8 empty empty empty 0 -6 0 8 -262144 -1 -1
0;
#X obj 24 343 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
-1 -1 0 1;
#X obj 59 208 vu 15 120 empty empty -1 -8 0 8 -66577 -1 1 0;
-#X obj 175 20 cnv 15 100 60 empty empty empty 20 12 0 14 -233017 -66577
+#X obj 135 20 cnv 15 100 60 empty empty empty 20 12 0 14 -233017 -66577
0;
#X text 46 40 bng;
#X text 46 65 toggle;
#X text 85 89 number 2;
-#X text 15 167 Vertical Slider;
-#X text 147 166 Vertical Dial;
+#X text 45 167 Vertical Slider;
+#X text 177 166 Vertical Dial;
#X text 40 356 Horizontal Slider;
#X text 42 401 Horizontal Dial;
#X text 101 260 VU Meter;
-#X text 202 39 canvas;
-#X text 296 55 The objects in this patch \, and likely many more which
+#X text 162 39 canvas;
+#X text 256 55 The objects in this patch \, and likely many more which
I have not included \, include their own send and receive functionality.
This functionality can be accessed by right-clicking on the object
and choosing "Properties" from the menu that appears.;
-#X text 289 149 EXAMPLE;
-#X text 303 170 In other words \, these objects can send and/or receive
+#X text 269 149 EXAMPLE;
+#X text 283 170 In other words \, these objects can send and/or receive
messages without attaching a separate [send] or [receive] object to
them with a patch cord.;
-#X text 290 232 THE OL'FASHION WAY;
-#X floatatom 296 256 5 0 0 0 - - -;
-#X floatatom 350 283 5 0 0 0 - - -;
-#X obj 296 280 s a;
-#X obj 350 255 r a;
-#X text 290 315 USING THESE OBJECTS' INTERNAL SEND AND RECEIVE FUNCTIONALITY
+#X text 230 242 THE OL'FASHION WAY;
+#X floatatom 236 266 5 0 0 0 - - -;
+#X floatatom 290 293 5 0 0 0 - - -;
+#X obj 236 290 s a;
+#X obj 290 265 r a;
+#X text 230 325 USING THESE OBJECTS' INTERNAL SEND AND RECEIVE FUNCTIONALITY
;
-#X text 405 259 As you see here \, these number boxes are linked together
+#X text 335 269 As you see here \, these number boxes are linked together
with send and receives objects.;
-#X obj 301 337 nbx 5 14 -1e+37 1e+37 0 0 b empty empty 0 -6 0 10 -262144
+#X obj 241 347 nbx 5 14 -1e+37 1e+37 0 0 b empty empty 0 -6 0 10 -262144
-1 -1 0 256;
-#X obj 363 337 nbx 5 14 -1e+37 1e+37 0 0 empty b empty 0 -6 0 10 -262144
+#X obj 303 347 nbx 5 14 -1e+37 1e+37 0 0 empty b empty 0 -6 0 10 -262144
-1 -1 0 256;
-#X text 310 360 These number boxes are linked together via their 'send'
+#X text 250 370 These number boxes are linked together via their 'send'
or 'receive' property.;
-#X text 298 8 Some objects in Pd contain their own internal send and
+#X text 258 8 Some objects in Pd contain their own internal send and
receive functionality.;
#X connect 23 0 25 0;
#X connect 26 0 24 0;
-#X restore 639 471 pd special-send-and-receives;
-#X obj 4 4 cnv 15 850 20 empty empty all_about_send_n_receive 20 10
-1 18 -233017 -66577 0;
-#X obj 821 5 pddp/pddplink http://puredata.info/dev/pddp -text pddp;
-#X obj 16 290 send one_send;
-#X obj 16 334 receive one_send;
-#X obj 19 272 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
--1 -1 0 0;
-#X obj 153 290 send one_send;
-#X obj 156 272 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
--1 -1 0 0;
-#X obj 291 290 send one_send;
-#X obj 294 272 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
--1 -1 0 0;
-#X obj 19 355 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
--1 -1 0 1;
-#X obj 153 334 receive one_send;
-#X obj 156 355 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
--1 -1 0 1;
-#X obj 291 334 receive one_send;
-#X obj 294 355 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
--1 -1 0 1;
-#X text 7 317 All [receive]s of the same name will receive the "messages":
-;
-#X text 9 252 You can have multiple [send]s with the same name:;
-#N canvas 0 22 454 304 Related 0;
-#X obj 16 39 universal;
-#X obj 17 76 send13;
-#X obj 66 76 receive13;
-#X restore 639 497 pd Related Objects;
-#X floatatom 45 132 5 0 0 0 - - -;
-#X floatatom 99 152 5 0 0 0 - - -;
-#X obj 45 149 s aNum;
-#X obj 99 131 r aNum;
-#X obj 213 150 s aSymbol;
-#X msg 213 130 symbol hello;
-#X obj 310 130 r aSymbol;
-#X symbolatom 310 152 10 0 0 0 - - -;
-#X connect 11 0 17 0;
-#X connect 12 0 10 0;
-#X connect 14 0 13 0;
-#X connect 16 0 15 0;
-#X connect 18 0 19 0;
-#X connect 20 0 21 0;
-#X connect 25 0 27 0;
-#X connect 28 0 26 0;
-#X connect 30 0 29 0;
-#X connect 31 0 32 0;
+#X restore 204 483 pd special-send-and-receives;
+#X text 18 348 A [send] object is a bit like a radio station-- it broadcasts
+information throughout Pd for all the [receive]s to hear! A [receive]
+object is a little like your own AM/FM tuner-- it will receive messages
+from all the [send] objects that it is 'tuned' to. Hence \, naming
+your [send] and [receive] objects becomes very important. A [receive]
+object named "dave" (as in [receive dave]) will pick up all messages
+from [send dave] \, regardless of which patch it is in. Thus \, you
+can get messages across multiple patches \, or into abstractions or
+subpatches \, without patch cords.;
+#X connect 8 0 10 0;
+#X connect 11 0 9 0;
+#X connect 13 0 12 0;
+#X connect 14 0 15 0;
+#X connect 17 0 23 0;
+#X connect 18 0 16 0;
+#X connect 20 0 19 0;
+#X connect 22 0 21 0;
+#X connect 24 0 25 0;
+#X connect 26 0 27 0;
diff --git a/doc/pddp/all_about_submitting_bugs.pd b/doc/pddp/all_about_submitting_bugs.pd
new file mode 100644
index 00000000..f12f25bf
--- /dev/null
+++ b/doc/pddp/all_about_submitting_bugs.pd
@@ -0,0 +1,38 @@
+#N canvas 0 0 448 245 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header submitting_bugs
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 223 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS needs_work;
+#X text 12 45 DESCRIPTION prerequisites for submitting a bug on Sourceforge
+;
+#X restore 392 225 pd META;
+#N canvas 11 113 428 117 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 All About Submitting Bugs- Related Objects;
+#X obj 22 42 print;
+#X text 19 70 Also \, have a look in the "Find" Menu for the entry
+"Find last error.";
+#X restore 103 225 pd Related_objects;
+#X obj 6 225 pddp/pddplink pddp/help.pd -text help;
+#X text 20 62 1) Make sure you can reproduce the bug consistently.
+Include a brief example patch to demonstrate the bug \, using the minimum
+number of objects needed to reproduce it.;
+#X obj 83 194 pddplink http://sourceforge.net/tracker/?func=add&group_id=55736&atid=478070
+-text Beam me up to the Sourceforge bug tracker...;
+#X text 20 32 0) Search the Sourceforge bug tracker to make sure the
+bug hasn't already been reported (click "Browse" to search).;
+#X text 20 106 2) Make a note of the operating system (and OS version)
+you are using \, as well as any hardware that might be relevant to
+the bug (sound card \, camera \, etc).;
+#X text 20 149 3) Specify the version of Pd you are using. You can
+find it under the "Help" menu by choosing "About Pd".;
diff --git a/doc/pddp/all_about_symbol_construction.pd b/doc/pddp/all_about_symbol_construction.pd
index a50c85ca..cac6e635 100644
--- a/doc/pddp/all_about_symbol_construction.pd
+++ b/doc/pddp/all_about_symbol_construction.pd
@@ -1,50 +1,56 @@
-#N canvas 86 22 759 427 10;
-#X obj 0 2 cnv 15 750 20 empty empty all_about_symbol_construction
-20 10 1 18 -233017 -66577 0;
-#X obj 716 3 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+#N canvas 0 0 448 503 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header symbol_construction
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
;
-#X text 23 389 updated for Pd version 0.37.1;
-#X obj 372 390 sprintf;
-#X obj 671 390 makesymbol;
-#X obj 579 390 makefilename;
-#X obj 494 390 list2symbol;
-#X symbolatom 396 177 55 0 0 0 - - -;
-#X obj 396 151 list2symbol;
-#X symbolatom 468 129 6 0 0 0 - - -;
-#X msg 468 103 symbol -;
-#X msg 396 73 make these into one symbol with no spaces;
-#X text 385 35 By setting a symbol on the right inlet of [list2symbol]
-\, you can create symbols without spaces:;
-#X text 532 102 <- click here to use "-";
-#X text 553 115 instead of spaces;
-#X text 9 85 There are many different ways of constructing symbols
-from various parts. You can turn lists into symbols by replacing the
-spaces with other characters or you can use objects with "format strings"
-that allow you to create symbols with more flexibility;
-#X obj 430 390 tosymbol;
-#X text 382 211 [tosymbol] works in a very similar way:;
-#X text 9 40 Many times you need to dynamically create different symbols.
+#X text 20 36 Many times you need to dynamically create different symbols.
For example \, if you are working with many files \, you might want
to name them with a sequential number.;
-#X symbolatom 395 316 55 0 0 0 - - -;
-#X msg 395 232 make these into one symbol with no spaces;
-#X text 578 274 instead of spaces;
-#X obj 395 292 tosymbol;
-#X text 486 144 ^-- or type here and hit enter;
-#X text 366 363 Related objects:;
-#X msg 457 260 separator -|-;
-#X text 556 261 <- click here to use "-|-";
-#X msg 18 258 list you can have up to ten members in your list.;
-#X obj 18 282 makesymbol 1%s_2%s_3%s_4%s_5%s_6%s_7%s_8%s_9%s_10%s;
-#X symbolatom 18 305 55 0 0 0 - - -;
-#X text 16 211 Using zexy's makesymbol \, you can build symbols by
-plugging lists into printf-style patterns:;
-#X connect 8 0 7 0;
-#X connect 9 0 8 1;
-#X connect 10 0 9 0;
-#X connect 11 0 8 0;
-#X connect 20 0 22 0;
-#X connect 22 0 19 0;
-#X connect 25 0 22 0;
-#X connect 27 0 28 0;
-#X connect 28 0 29 0;
+#X text 20 75 Below are some of the most common ways to build a symbol
+from various parts. Additionally \, there are externals which can perform
+more advanced functions \, which are listed below.;
+#X text 20 127 1) Using the [makefilename] object;
+#X floatatom 41 149 5 0 0 0 - - -;
+#X symbolatom 41 192 10 0 0 0 - - -;
+#X obj 41 170 makefilename file%d.wav;
+#X text 193 170 see help patch for more details;
+#X text 20 219 2) Using variable-substitution in a message box;
+#X symbolatom 41 351 12 0 0 0 - - -;
+#X msg 41 328 symbol \$1-\$2.wav;
+#X obj 41 306 pack;
+#X floatatom 41 241 5 1 12 1 month - -;
+#X floatatom 62 262 5 2000 2020 1 year - -;
+#X obj 62 283 t b a;
+#X text 20 379 3) Using externals;
+#X obj 1 481 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 KEYWORDS conversion;
+#X text 12 25 NAME makefilename gatom;
+#X text 12 65 DESCRIPTION how to handle symbols in Pd;
+#X restore 392 483 pd META;
+#N canvas 14 368 428 126 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Symbol Construction- Related Objects;
+#X obj 22 43 makefilename;
+#X msg 114 44;
+#X restore 103 483 pd Related_objects;
+#X obj 6 483 pddp/pddplink pddp/help.pd -text help;
+#X obj 38 399 pddp/helplink zexy/list2symbol;
+#X obj 38 419 pddp/helplink cyclone/sprintf;
+#X obj 38 459 pddp/helplink zexy/makesymbol;
+#X obj 38 439 pddp/helplink cyclone/tosymbol;
+#X connect 5 0 7 0;
+#X connect 7 0 6 0;
+#X connect 11 0 10 0;
+#X connect 12 0 11 0;
+#X connect 13 0 12 0;
+#X connect 14 0 15 0;
+#X connect 15 0 12 0;
+#X connect 15 1 12 1;
diff --git a/doc/pddp/all_about_writing_help_patches.pd b/doc/pddp/all_about_writing_help_patches.pd
new file mode 100644
index 00000000..64ec2c39
--- /dev/null
+++ b/doc/pddp/all_about_writing_help_patches.pd
@@ -0,0 +1,26 @@
+#N canvas 0 0 448 238 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header writing_help_patches
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 216 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS needs_work;
+#X text 12 45 DESCRIPTION guidelines for writing help patches;
+#X restore 392 218 pd META;
+#N canvas 10 196 428 105 Related_objects 0;
+#X text 31 37 Hm...what to put here?;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Atoms- Related Objects;
+#X restore 103 218 pd Related_objects;
+#X obj 6 218 pddp/pddplink pddp/help.pd -text help;
+#X text 55 36 * pddplink and helplink;
+#X text 60 66 * pd META;
+#X text 75 114 This help file is unfinished.;
diff --git a/doc/pddp/all_about_z_order.pd b/doc/pddp/all_about_z_order.pd
new file mode 100644
index 00000000..93a22cfa
--- /dev/null
+++ b/doc/pddp/all_about_z_order.pd
@@ -0,0 +1,30 @@
+#N canvas 0 0 448 189 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header z_order 20 10 1
+18 -261106 -33289 0;
+#X obj 1 167 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 95 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 75 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS GUI needs_work;
+#X text 12 45 DESCRIPTION description of how objects are presented
+graphically in Pd;
+#X restore 392 169 pd META;
+#N canvas 10 196 428 107 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Z Order- Related Objects;
+#X restore 103 169 pd Related_objects;
+#X obj 6 169 pddp/pddplink pddp/help.pd -text help;
+#X obj 255 89 cnv 15 100 60 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 78 107 This comment was created after the grey [cnv] behind
+it. If you cut and paste the canvas (or delete it then choose "Undo"
+from the "Edit" menu) \, it will cover this comment.;
+#X obj 407 2 pddp/pddplink all_about_upside_down.pd -text dppd;
+#X text 19 36 Z-order refers to the way in which overlapping objects
+are displayed. Pd currently determines z-ordering in the following
+way: The last object created will get put in front.;